diff --git a/.gitignore b/.gitignore index 70d02f0..848adb6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ build-* compile_commands.json cachegrind.out.* callgrind.out.* +.cache +*.miov diff --git a/Makefile b/Makefile index 5af3dc3..4582b4f 100644 --- a/Makefile +++ b/Makefile @@ -3,15 +3,24 @@ CC = gcc SHELL = /bin/bash # This is where (g)make looks for the source files for implicit rules -VPATH := src src/format src/drivers nuklear contrib +VPATH := src src/format src/drivers contrib +VPATH += ui_gl CPPFLAGS += -Isrc -Isrc/format -Isrc/roms -Isrc/drivers -CPPFLAGS += -Icontrib -Inuklear +CPPFLAGS += -Icontrib CPPFLAGS += -Ilibmish/src -CFLAGS += --std=gnu99 -Wall -Wextra -O2 -g +CPPFLAGS += -Ilibmui/mui + +OPTIMIZE ?= -O2 -march=native +CFLAGS += --std=gnu99 -Wall -Wextra -g +CFLAGS += -fno-omit-frame-pointer +CFLAGS += $(OPTIMIZE) CFLAGS += -Wno-unused-parameter -Wno-unused-function -LDLIBS += -lX11 -lm -lGL -lGLU -LDLIBS += -lpthread -lutil +LDLIBS += -lX11 -lGL -lGLU +LDLIBS += -lpthread -lutil -lm + +VERSION := ${shell git log -1 --date=short --pretty="%h %cd"} +CPPFLAGS += -DMII_VERSION="\"$(VERSION)\"" HAS_ALSA := $(shell pkg-config --exists alsa && echo 1) ifeq ($(HAS_ALSA),1) @@ -26,21 +35,35 @@ BIN := $(O)/bin LIB := $(O)/lib OBJ := $(O)/obj -all : $(BIN)/mii_emu +all : $(BIN)/mii_emu_gl MII_SRC := $(wildcard src/*.c src/format/*.c \ src/drivers/*.c contrib/*.c) -UI_SRC := $(wildcard nuklear/*.c) +UI_SRC := $(wildcard ui_gl/*.c) + SRC := $(MII_SRC) $(UI_SRC) ALL_OBJ := ${patsubst %, ${OBJ}/%, ${notdir ${SRC:.c=.o}}} -$(BIN)/mii_emu : $(ALL_OBJ) -$(BIN)/mii_emu : $(LIB)/libmish.a +CPPFLAGS += ${shell pkg-config --cflags pixman-1} +LDLIBS += ${shell pkg-config --libs pixman-1} -libmish : $(LIB)/libmish.a +$(BIN)/mii_emu_gl : $(ALL_OBJ) | mui mish +$(BIN)/mii_emu_gl : $(LIB)/libmish.a +$(BIN)/mii_emu_gl : $(LIB)/libmui.a + +.PHONY : mish mui +mish : $(LIB)/libmish.a LDLIBS += $(LIB)/libmish.a -$(LIB)/libmish.a : | $(LIB) $(OBJ) $(BIN) - make -j -C libmish O="../" CC="$(CC)" V="$(V)" +$(LIB)/libmish.a : ${wildcard libmish/src/*} | $(LIB) $(OBJ) $(BIN) + mkdir -p $(OBJ)/libmish && \ + make -j -C libmish O="../" CC="$(CC)" V="$(V)" static + +LDLIBS += $(LIB)/libmui.a +mui : $(LIB)/libmui.a +$(LIB)/libmui.a : ${wildcard libmui/mui/*} | $(LIB) $(OBJ) $(BIN) + mkdir -p $(OBJ)/libmui && \ + make -j -C libmui BUILD_DIR="../" CC="$(CC)" \ + V="$(V)" OPTIMIZE="$(OPTIMIZE)" static # Smartport firmware needs the assembler first test/asm/%.bin : test/asm/%.asm | $(BIN)/mii_asm @@ -48,17 +71,16 @@ test/asm/%.bin : test/asm/%.asm | $(BIN)/mii_asm # And it also INCBIN the firmware driver $(OBJ)/mii_smarport.o : test/asm/mii_smartport_driver.bin -$(OBJ)/libsofd.o : CPPFLAGS += -DHAVE_X11 - clean : - rm -rf $(O) + rm -rf $(O); make -C libmui clean; make -C libmish clean # This is for development purpose. This will recompile the project # everytime a file is modified. watch : while true; do \ clear; $(MAKE) -j all tests; \ - inotifywait -qre close_write src src/format nuklear test; \ + inotifywait -qre close_write src src/format ui_gl test \ + libmui libmui/mui; \ done tests : $(BIN)/mii_test $(BIN)/mii_cpu_test $(BIN)/mii_asm @@ -82,8 +104,8 @@ else Q := @ endif -$(OBJ)/%.o : %.c | $(OBJ) - @echo " CC $<" +$(OBJ)/%.o : %.c | $(OBJ) + @echo " CC " ${filter -O%, $(CPPFLAGS) $(CFLAGS)} " $<" $(Q)$(CC) -MMD $(CPPFLAGS) $(CFLAGS) -c -o $@ $< $(BIN)/% : | $(BIN) @@ -95,12 +117,19 @@ $(OBJ) $(BIN) $(LIB) : # Generates the necessary file to help clangd index the files properly. # This currently has to be done manually, but helps a lot if you use 'kate' -# editor or anthing else that is compatible with the LSP protocol +# editor or anthing else that is compatible with the LSP protocol (vscode too) compile_commands.json: lsp lsp: { $$(which gmake) CC=gcc V=1 --always-make --dry-run all tests; \ - $$(which gmake) CC=gcc V=1 --always-make --dry-run -C libmish ; } | \ + $$(which gmake) CC=gcc V=1 --always-make --dry-run -C libmish ; \ + $$(which gmake) CC=gcc V=1 --always-make --dry-run -C libmui ; } | \ sh utils/clangd_gen.sh >compile_commands.json -include $(O)/*.d -include $(O)/obj/*.d + + +install: + mkdir -p $(DESTDIR)/bin + mkdir -p $(DESTDIR)/share/games/mii/ + cp $(BIN)/mii_emu_gl $(DESTDIR)/bin/ diff --git a/README.md b/README.md index 3059e4c..81a866b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,21 @@ +# MII Version Changelog +## 1.5 + * BIG update, loads of changes, fixes, improvements. + * New super UI, using home-made libmui, channeling both GS/OS and MacOS 7.x! + * New emulation fixes, way more accurate. Video redone, audio redone. + * New front-end program using XLib and OpenGL 'low level'. + * New Icon. +## 1.0 + * Fixed a few graphics rendering bugs/color swapped + * Fixed a few Makefile issues involving pathnamed with 'spaces' in them. + * More tweaks to the emulation, added a few cycles here and there. + ## 0.9 + * Added a 'debugger' shell, accessible via telnet. + * Added a mini-assembler, used to compile the drivers and the CPU unit tests. + * Added a 'Titan Accelerator IIe' simulation, to turn on/off fast mode. +## 0.5 + * Initial release + # MII Apple //e Emulator I know there are many out there, but none of them were ticking my fancy, so I decide to write my own. To start with it was "How hard can it be really?" then it snowballed as more and more things were fixed & added. It's been shelved for a while because well, it lacked documentation, headers, licence and stuff, so I spent some time cleaning it up for release. @@ -5,8 +23,8 @@ I know there are many out there, but none of them were ticking my fancy, so I de One primary reason for this project was that linapple (or -pie) codebase is really horrible. It dates back from 2000's or before, with loads of Windows crud leftover, some SDL crud added, the audio just doesn't really work, and overall if you want to hack around the codebase, it's pretty dreadful. -![Monochrome Double-Hi res](docs/screen_main.png) -*Double hires in monochrome* +![Quick how to load and boot](docs/video_main.webm) +*Quick Howto Load & Boot* I wanted something: @@ -32,12 +50,14 @@ I wanted something: * Adds a small 'attack' filter when playing back to soften the often annoying 'click' of typical audio effects from the apple II. * Mouse Card -- mouse isn't captured like in some other emulators. * No Slot Clock - * Joystick (in a limited way...) + * Joystick Support * Smartport DMA 'hard drive' card * "Titan Accelerator //e" simulation, to turn on/off fast mode. * Terence's J Boldt [1MB ROM card](https://github.com/tjboldt/ProDOS-ROM-Drive), also because I own a couple! * Floppy Drive [more on that later] - * No dependencies (X11) OpenGL rendering, using Nuklear backend for UI + * No dependencies (X11) OpenGL rendering + * Built-in debugger (using telnet access) + * Super cool looking UI! ![Phosphorescent Green](docs/screen_green.png) *Good old green monitor style. Theres Amber too.* @@ -48,13 +68,24 @@ I wanted something: * libgl-dev * libglu-dev * libx11-dev + * libpixman-1-dev * Many of them will probably be installed already. * For more details on development, see [Compiling](docs/Compiling.md) * Then just type `make` and it should compile. - * To run it, just type `build-x86_64-linux-gnu/bin/bin/mii_emu` and it should start. - * `mii_emu --help` will display: + * To run it, just type `build-x86_64-linux-gnu/bin/mii_emu_gl` and it should start. - Usage: ./build-x86_64-linux-gnu/bin/mii_emu [options] +## Command line options +If you run it with no options, and there are no config file, it will present +you with a dialog to select the ROMs and the drives. + +![Config dialog](docs/screen_config.png) +*Main slot configuration dialog* + +You can also use the command line to specify them, and other options. + + * `mii_emu_gl --help` will display: + + Usage: ./build-x86_64-linux-gnu/bin/mii_emu_gl [options] Options: -h, --help This help -v, --verbose Verbose output @@ -89,16 +120,17 @@ I wanted something: disk2 - Apple Disk ][ ## Key Bindings -There are just a few keys that are mapped for anything useful. +There are just a few keys that are mapped for anything useful. List is not exausive, but here are the main ones: * **Control-F12** is Control-Reset on the IIe. (**Shift-Control-F12** is **Open Apple-Reset**) * **'Super'** left and **'Super'** right are **Open** and **Close Apple** keys. These keys are mapped to the left and right 'Windows' keys on a PC keyboard, and they might want to open the start menu (I know it's the case with Cinnamon), so you might want to disable that. * **F5** sets the CPU speed to 1MHz * **F6** to 4MHz. * These keys control the built-in debugger: - * **Control-F11** Stops the emulator; see the command prompt/telnet for how to proceed, dump state, disassembly etc. - * **Control-F10** 'steps' the emulator, ie one instruction at a time. - * **Control-F9** is 'continue' -- resumes the emulator. + * **Control-F4** Stops the emulator; see the command prompt/telnet for how to proceed, dump state, disassembly etc. + * **Control-F5** is 'continue' -- resumes the emulator. + * **Control-F6** 'steps' the emulator, ie one instruction at a time. + * **Control-F7** 'next' instruction, ie step over a JSR instruction. ![Telnet into mii_emu](docs/screen_mish.png) @@ -124,20 +156,15 @@ There are just a few keys that are mapped for anything useful. + This allows you to make sure your disk images aren't corrupted when 'hard rebooting' the emulator, if you are in the process of testing/developing a program for example. ## What it cannot do - * MouseCalc crashes (VBL IRQ, or a mouse mode I don't support yet) * A2Desktop PT3 player doesn't see keypresses. - * Sometimes the emulator goes in 'slow mode', ie 0.2MHz. Likely the frame scheduler playing up. * Thats' about it really, all the other things I tried work - * Joystick support is a bit limited, no 'mapping' I used a (USB) 8bitdo NES30 Pro, and it works, but it's not perfect. But, I can play choplifter with it, so it's good enough for now... + * Joystick support is a bit limited, no 'mapping' I used a (USB) 8bitdo NES30 Pro, and it works, but it's not perfect. But, I can play choplifter with it, so it's good enough for now... *NOTE* Soon will have it's own config dialog to do mapping. ## What it could do with - * Not sure about keeping Nuklear, it does a lot bit it's hard work customizing anything - * Add a memory extension 'card' -- not sure why, but hey, why not. - * Joystick support. As soon as I find a USB joystick that vaguely looks retro, I'll get one. * The main window is 1280x720 on purpose, so it could do Full Screen. * Port it to Raspbery Pi. I don't expect compiling issues, just video issues with GLes * Make a tool to 'flatten' overlay files back into the primary image. - * Some sort of UI to select/eject disks. + * Make a UI for the debugger, instead of telnet. ![Total Replay](docs/screen_total.png) diff --git a/contrib/libsofd.c b/contrib/libsofd.c deleted file mode 100644 index f475b67..0000000 --- a/contrib/libsofd.c +++ /dev/null @@ -1,2413 +0,0 @@ -/* libSOFD - Simple Open File Dialog [for X11 without toolkit] - * - * Copyright (C) 2014 Robin Gareus - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in 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: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the 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 - * AUTHORS 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 IN - * THE SOFTWARE. - */ - -/* Test and example: - * gcc -Wall -D SOFD_TEST -g -o sofd libsofd.c -lX11 - * - * public API documentation and example code at the bottom of this file - * - * This small lib may one day include openGL rendering and - * wayland window support, but not today. Today we celebrate - * 30 years of X11. - */ - -#ifdef SOFD_TEST -#define HAVE_X11 -#include "libsofd.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// shared 'recently used' implementation -// sadly, xbel does not qualify as simple. -// hence we use a simple format alike the -// gtk-bookmark list (one file per line) - -#define MAX_RECENT_ENTRIES 24 -#define MAX_RECENT_AGE (15552000) // 180 days (in sec) - -typedef struct { - char path[1024]; - time_t atime; -} FibRecentFile; - -static FibRecentFile *_recentlist = NULL; -static unsigned int _recentcnt = 0; -static uint8_t _recentlock = 0; - -static int fib_isxdigit (const char x) { - if ( - (x >= '0' && x <= '9') - || - (x >= 'a' && x <= 'f') - || - (x >= 'A' && x <= 'F') - ) return 1; - return 0; -} - -static void decode_3986 (char *str) { - int len = strlen (str); - int idx = 0; - while (idx + 2 < len) { - char *in = &str[idx]; - if (('%' == *in) && fib_isxdigit (in[1]) && fib_isxdigit (in[2])) { - char hexstr[3]; - hexstr[0] = in[1]; - hexstr[1] = in[2]; - hexstr[2] = 0; - long hex = strtol (hexstr, NULL, 16); - *in = hex; - memmove (&str[idx+1], &str[idx + 3], len - idx - 2); - len -= 2; - } - ++idx; - } -} - -static char *encode_3986 (const char *str) { - size_t alloc, newlen; - char *ns = NULL; - unsigned char in; - size_t i = 0; - size_t length; - - if (!str) return strdup (""); - - alloc = strlen (str) + 1; - newlen = alloc; - - ns = (char*) malloc (alloc); - - length = alloc; - while (--length) { - in = *str; - - switch (in) { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - case 'a': case 'b': case 'c': case 'd': case 'e': - case 'f': case 'g': case 'h': case 'i': case 'j': - case 'k': case 'l': case 'm': case 'n': case 'o': - case 'p': case 'q': case 'r': case 's': case 't': - case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': - case 'A': case 'B': case 'C': case 'D': case 'E': - case 'F': case 'G': case 'H': case 'I': case 'J': - case 'K': case 'L': case 'M': case 'N': case 'O': - case 'P': case 'Q': case 'R': case 'S': case 'T': - case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': - case '_': case '~': case '.': case '-': - case '/': case ',': // XXX not in RFC3986 - ns[i++] = in; - break; - default: - newlen += 2; /* this'll become a %XX */ - if (newlen > alloc) { - alloc *= 2; - ns = (char*) realloc (ns, alloc); - } - snprintf (&ns[i], 4, "%%%02X", in); - i += 3; - break; - } - ++str; - } - ns[i] = 0; - return ns; -} - -void x_fib_free_recent () { - free (_recentlist); - _recentlist = NULL; - _recentcnt = 0; -} - -static int cmp_recent (const void *p1, const void *p2) { - FibRecentFile *a = (FibRecentFile*) p1; - FibRecentFile *b = (FibRecentFile*) p2; - if (a->atime == b->atime) return 0; - return a->atime < b->atime; -} - -int x_fib_add_recent (const char *path, time_t atime) { - unsigned int i; - struct stat fs; - if (_recentlock) { return -1; } - if (access (path, R_OK)) { - return -1; - } - if (stat (path, &fs)) { - return -1; - } - if (!S_ISREG (fs.st_mode)) { - return -1; - } - if (atime == 0) atime = time (NULL); - if (MAX_RECENT_AGE > 0 && atime + MAX_RECENT_AGE < time (NULL)) { - return -1; - } - - for (i = 0; i < _recentcnt; ++i) { - if (!strcmp (_recentlist[i].path, path)) { - if (_recentlist[i].atime < atime) { - _recentlist[i].atime = atime; - } - qsort (_recentlist, _recentcnt, sizeof(FibRecentFile), cmp_recent); - return _recentcnt; - } - } - _recentlist = (FibRecentFile*)realloc (_recentlist, (_recentcnt + 1) * sizeof(FibRecentFile)); - _recentlist[_recentcnt].atime = atime; - strcpy (_recentlist[_recentcnt].path, path); - qsort (_recentlist, _recentcnt + 1, sizeof(FibRecentFile), cmp_recent); - - if (_recentcnt >= MAX_RECENT_ENTRIES) { - return (_recentcnt); - } - return (++_recentcnt); -} - -#ifdef PATHSEP -#undef PATHSEP -#endif - -#ifdef PLATFORM_WINDOWS -#define DIRSEP '\\' -#else -#define DIRSEP '/' -#endif - -static void mkpath(const char *dir) { - char tmp[1024]; - char *p; - size_t len; - - snprintf (tmp, sizeof(tmp), "%s", dir); - len = strlen(tmp); - if (tmp[len - 1] == '/') - tmp[len - 1] = 0; - for (p = tmp + 1; *p; ++p) - if(*p == DIRSEP) { - *p = 0; -#ifdef PLATFORM_WINDOWS - mkdir(tmp); -#else - mkdir(tmp, 0755); -#endif - *p = DIRSEP; - } -#ifdef PLATFORM_WINDOWS - mkdir(tmp); -#else - mkdir(tmp, 0755); -#endif -} - -int x_fib_save_recent (const char *fn) { - if (_recentlock) { return -1; } - if (!fn) { return -1; } - if (_recentcnt < 1 || !_recentlist) { return -1; } - unsigned int i; - char *dn = strdup (fn); - mkpath (dirname (dn)); - free (dn); - - FILE *rf = fopen (fn, "w"); - if (!rf) return -1; - - qsort (_recentlist, _recentcnt, sizeof(FibRecentFile), cmp_recent); - for (i = 0; i < _recentcnt; ++i) { - char *n = encode_3986 (_recentlist[i].path); - fprintf (rf, "%s %lu\n", n, _recentlist[i].atime); - free (n); - } - fclose (rf); - return 0; -} - -int x_fib_load_recent (const char *fn) { - char tmp[1024]; - if (_recentlock) { return -1; } - if (!fn) { return -1; } - x_fib_free_recent (); - if (access (fn, R_OK)) { - return -1; - } - FILE *rf = fopen (fn, "r"); - if (!rf) return -1; - while (fgets (tmp, sizeof(tmp), rf) - && strlen (tmp) > 1 - && strlen (tmp) < sizeof(tmp)) - { - char *s; - tmp[strlen (tmp) - 1] = '\0'; // strip newline - if (!(s = strchr (tmp, ' '))) { // find name <> atime sep - continue; - } - *s = '\0'; - time_t t = atol (++s); - decode_3986 (tmp); - x_fib_add_recent (tmp, t); - } - fclose (rf); - return 0; -} - -unsigned int x_fib_recent_count () { - return _recentcnt; -} - -const char *x_fib_recent_at (unsigned int i) { - if (i >= _recentcnt) - return NULL; - return _recentlist[i].path; -} - -#ifdef PLATFORM_WINDOWS -#define PATHSEP "\\" -#else -#define PATHSEP "/" -#endif - -const char *x_fib_recent_file(const char *appname) { - static char recent_file[1024]; - assert(!strchr(appname, '/')); - const char *xdg = getenv("XDG_DATA_HOME"); - if (xdg && (strlen(xdg) + strlen(appname) + 10) < sizeof(recent_file)) { - sprintf(recent_file, "%s" PATHSEP "%s" PATHSEP "recent", xdg, appname); - return recent_file; - } -#ifdef PLATFORM_WINDOWS - const char * homedrive = getenv("HOMEDRIVE"); - const char * homepath = getenv("HOMEPATH"); - if (homedrive && homepath && (strlen(homedrive) + strlen(homepath) + strlen(appname) + 29) < PATH_MAX) { - sprintf(recent_file, "%s%s" PATHSEP "Application Data" PATHSEP "%s" PATHSEP "recent.txt", homedrive, homepath, appname); - return recent_file; - } -#elif defined PLATFORM_OSX - const char *home = getenv("HOME"); - if (home && (strlen(home) + strlen(appname) + 29) < sizeof(recent_file)) { - sprintf(recent_file, "%s/Library/Preferences/%s/recent", home, appname); - return recent_file; - } -#else - const char *home = getenv("HOME"); - if (home && (strlen(home) + strlen(appname) + 22) < sizeof(recent_file)) { - sprintf(recent_file, "%s/.local/share/%s/recent", home, appname); - return recent_file; - } -#endif - return NULL; -} - -#ifdef HAVE_X11 -#include -#include - -#include -#include -#include -#include -#include - -#ifndef MIN -#define MIN(A,B) ( (A) < (B) ? (A) : (B) ) -#endif - -#ifndef MAX -#define MAX(A,B) ( (A) < (B) ? (B) : (A) ) -#endif - -static Window _fib_win = 0; -static GC _fib_gc = 0; -static XColor _c_gray0, _c_gray1, _c_gray2, _c_gray3, _c_gray4, _c_gray5, _c_gray6; -static Font _fibfont = 0; -static Pixmap _pixbuffer = None; - -static int _fib_width = 100; -static int _fib_height = 100; -static int _btn_w = 0; -static int _btn_span = 0; - -static int _fib_font_height = 0; -static int _fib_dir_indent = 0; -static int _fib_spc_norm = 0; -static int _fib_font_ascent = 0; -static int _fib_font_vsep = 0; -static int _fib_font_size_width = 0; -static int _fib_font_time_width = 0; -static int _fib_place_width = 0; - -static int _scrl_f = 0; -static int _scrl_y0 = -1; -static int _scrl_y1 = -1; -static int _scrl_my = -1; -static int _scrl_mf = -1; -static int _view_p = -1; - -static int _fsel = -1; -static int _hov_b = -1; -static int _hov_f = -1; -static int _hov_p = -1; -static int _hov_h = -1; -static int _hov_l = -1; -static int _hov_s = -1; -static int _sort = 0; -static int _columns = 0; -static int _fib_filter_fn = 1; -static int _fib_hidden_fn = 0; -static int _fib_show_places = 0; - -static uint8_t _fib_mapped = 0; -static uint8_t _fib_resized = 0; -static unsigned long _dblclk = 0; - -static int _status = -2; -static char _rv_open[1024] = ""; - -static char _fib_cfg_custom_places[1024] = ""; -static char _fib_cfg_custom_font[256] = ""; -static char _fib_cfg_title[128] = "xjadeo - Open Video File"; - -typedef struct { - char name[256]; - int x0; - int xw; -} FibPathButton; - -typedef struct { - char name[256]; - char strtime[32]; - char strsize[32]; - int ssizew; - off_t size; - time_t mtime; - uint8_t flags; // 2: selected, 4: isdir 8: recent-entry - FibRecentFile *rfp; -} FibFileEntry; - -typedef struct { - char text[24]; - uint8_t flags; // 2: selected, 4: toggle, 8 disable - int x0; - int tw; - int xw; - void (*callback)(Display*); -} FibButton; - -typedef struct { - char name[256]; - char path[1024]; - uint8_t flags; // 1: hover, 2: selected, 4:add sep -} FibPlace; - -static char _cur_path[1024] = ""; -static FibFileEntry *_dirlist = NULL; -static FibPathButton *_pathbtn = NULL; -static FibPlace *_placelist = NULL; -static int _dircount = 0; -static int _pathparts = 0; -static int _placecnt = 0; - -static FibButton _btn_ok; -static FibButton _btn_cancel; -static FibButton _btn_filter; -static FibButton _btn_places; -static FibButton _btn_hidden; -static FibButton *_btns[] = {&_btn_places, &_btn_filter, &_btn_hidden, &_btn_cancel, &_btn_ok}; - -static int (*_fib_filter_function)(const char *filename); - -/* hardcoded layout */ -#define DSEP 6 // px; horiz space beween elements, also l+r margin for file-list -#define PSEP 4 // px; horiz space beween paths -#define FILECOLUMN (17 * _fib_dir_indent) //px; min width of file-column -#define LISTTOP 2.7 //em; top of the file-browser list -#define LISTBOT 4.75 //em; bottom of the file-browers list -#define BTNBTMMARGIN 0.75 //em; height/margin of the button row -#define BTNPADDING 2 // px - only used for open/cancel buttons -#define SCROLLBARW (3 + (_fib_spc_norm&~1)) //px; - should be SCROLLBARW = (N * 2 + 3) -#define SCROLLBOXH 10 //px; arrow box top+bottom -#define PLACESW _fib_place_width //px; -#define PLACESWMAX (15 *_fib_spc_norm) //px; -#define PATHBTNTOP _fib_font_vsep //px; offset by (_fib_font_ascent); -#define FAREAMRGB 3 //px; base L+R margin -#define FAREAMRGR (FAREAMRGB + 1) //px; right margin of file-area + 1 (line width) -#define FAREAMRGL (_fib_show_places ? PLACESW + FAREAMRGB : FAREAMRGB) //px; left margin of file-area -#define TEXTSEP 4 //px; -#define FAREATEXTL (FAREAMRGL + TEXTSEP) //px; filename text-left FAREAMRGL + TEXTSEP -#define SORTBTNOFF -10 //px; - -#ifndef DBLCLKTME -#define DBLCLKTME 200 //msec; double click time -#endif - -#define DRAW_OUTLINE -#define DOUBLE_BUFFER - -static int query_font_geometry (Display *dpy, GC gc, const char *txt, int *w, int *h, int *a, int *d) { - XCharStruct text_structure; - int font_direction, font_ascent, font_descent; - XFontStruct *fontinfo = XQueryFont (dpy, XGContextFromGC (gc)); - - if (!fontinfo) { return -1; } - XTextExtents (fontinfo, txt, strlen (txt), &font_direction, &font_ascent, &font_descent, &text_structure); - if (w) *w = XTextWidth (fontinfo, txt, strlen (txt)); - if (h) *h = text_structure.ascent + text_structure.descent; - if (a) *a = text_structure.ascent; - if (d) *d = text_structure.descent; - XFreeFontInfo (NULL, fontinfo, 1); - return 0; -} - -static void VDrawRectangle (Display *dpy, Drawable d, GC gc, int x, int y, unsigned int w, unsigned int h) { - const unsigned long blackColor = BlackPixel (dpy, DefaultScreen (dpy)); -#ifdef DRAW_OUTLINE - XSetForeground (dpy, gc, _c_gray5.pixel); - XDrawLine (dpy, d, gc, x + 1, y + h, x + w, y + h); - XDrawLine (dpy, d, gc, x + w, y + 1, x + w, y + h); - - XSetForeground (dpy, gc, blackColor); - XDrawLine (dpy, d, gc, x + 1, y, x + w, y); - XDrawLine (dpy, d, gc, x, y + 1, x, y + h); -#else - XSetForeground (dpy, _fib_gc, blackColor); - XDrawRectangle (dpy, d, gc, x, y, w, h); -#endif -} - -static void fib_expose (Display *dpy, Window realwin) { - int i; - XID win; - const unsigned long whiteColor = WhitePixel (dpy, DefaultScreen (dpy)); - const unsigned long blackColor = BlackPixel (dpy, DefaultScreen (dpy)); - if (!_fib_mapped) return; - - if (_fib_resized -#ifdef DOUBLE_BUFFER - || !_pixbuffer -#endif - ) - { -#ifdef DOUBLE_BUFFER - unsigned int w = 0, h = 0; - if (_pixbuffer != None) { - Window ignored_w; - int ignored_i; - unsigned int ignored_u; - XGetGeometry(dpy, _pixbuffer, &ignored_w, &ignored_i, &ignored_i, &w, &h, &ignored_u, &ignored_u); - if (_fib_width != (int)w || _fib_height != (int)h) { - XFreePixmap (dpy, _pixbuffer); - _pixbuffer = None; - } - } - if (_pixbuffer == None) { - XWindowAttributes wa; - XGetWindowAttributes (dpy, realwin, &wa); - _pixbuffer = XCreatePixmap (dpy, realwin, _fib_width, _fib_height, wa.depth); - } -#endif - if (_pixbuffer != None) { - XSetForeground (dpy, _fib_gc, _c_gray1.pixel); - XFillRectangle (dpy, _pixbuffer, _fib_gc, 0, 0, _fib_width, _fib_height); - } else { - XSetForeground (dpy, _fib_gc, _c_gray1.pixel); - XFillRectangle (dpy, realwin, _fib_gc, 0, 0, _fib_width, _fib_height); - } - _fib_resized = 0; - } - - if (_pixbuffer == None) { - win = realwin; - } else { - win = _pixbuffer; - } - - // Top Row: dirs and up navigation - - int ppw = 0; - int ppx = FAREAMRGB; - - for (i = _pathparts - 1; i >= 0; --i) { - ppw += _pathbtn[i].xw + PSEP; - if (ppw >= _fib_width - PSEP - _pathbtn[0].xw - FAREAMRGB) break; // XXX, first change is from "/" to "<", NOOP - } - ++i; - // border-less "<" parent/up, IFF space is limited - if (i > 0) { - if (0 == _hov_p || (_hov_p > 0 && _hov_p < _pathparts - 1)) { - XSetForeground (dpy, _fib_gc, _c_gray4.pixel); - } else { - XSetForeground (dpy, _fib_gc, blackColor); - } - XDrawString (dpy, win, _fib_gc, ppx, PATHBTNTOP, "<", 1); - ppx += _pathbtn[0].xw + PSEP; - if (i == _pathparts) --i; - } - - _view_p = i; - - while (i < _pathparts) { - if (i == _hov_p) { - XSetForeground (dpy, _fib_gc, _c_gray0.pixel); - } else { - XSetForeground (dpy, _fib_gc, _c_gray2.pixel); - } - XFillRectangle (dpy, win, _fib_gc, - ppx + 1, PATHBTNTOP - _fib_font_ascent, - _pathbtn[i].xw - 1, _fib_font_height); - VDrawRectangle (dpy, win, _fib_gc, - ppx, PATHBTNTOP - _fib_font_ascent, - _pathbtn[i].xw, _fib_font_height); - XDrawString (dpy, win, _fib_gc, ppx + 1 + BTNPADDING, PATHBTNTOP, - _pathbtn[i].name, strlen (_pathbtn[i].name)); - _pathbtn[i].x0 = ppx; // current position - ppx += _pathbtn[i].xw + PSEP; - ++i; - } - - // middle, scroll list of file names - const int ltop = LISTTOP * _fib_font_vsep; - const int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; - const int fsel_height = 4 + llen * _fib_font_vsep; - const int fsel_width = _fib_width - FAREAMRGL - FAREAMRGR - (llen < _dircount ? SCROLLBARW : 0); - const int t_x = FAREATEXTL; - int t_s = FAREATEXTL + fsel_width; - int t_t = FAREATEXTL + fsel_width; - - // check which colums can be visible - // depending on available width of window. - _columns = 0; - if (fsel_width > FILECOLUMN + _fib_font_size_width + _fib_font_time_width) { - _columns |= 2; - t_s = FAREAMRGL + fsel_width - _fib_font_time_width - TEXTSEP; - } - if (fsel_width > FILECOLUMN + _fib_font_size_width) { - _columns |= 1; - t_t = t_s - _fib_font_size_width - TEXTSEP; - } - - int fstop = _scrl_f; // first entry in scroll position - const int ttop = ltop - _fib_font_height + _fib_font_ascent; - - if (fstop > 0 && fstop + llen > _dircount) { - fstop = MAX (0, _dircount - llen); - _scrl_f = fstop; - } - - // list header - XSetForeground (dpy, _fib_gc, _c_gray3.pixel); - XFillRectangle (dpy, win, _fib_gc, FAREAMRGL, ltop - _fib_font_vsep, fsel_width, _fib_font_vsep); - - // draw background of file list - XSetForeground (dpy, _fib_gc, _c_gray2.pixel); - XFillRectangle (dpy, win, _fib_gc, FAREAMRGL, ltop, fsel_width, fsel_height); - -#ifdef DRAW_OUTLINE - VDrawRectangle (dpy, win, _fib_gc, FAREAMRGL, ltop - _fib_font_vsep -1, _fib_width - FAREAMRGL - FAREAMRGR, fsel_height + _fib_font_vsep + 1); -#endif - - switch (_hov_h) { - case 1: - XSetForeground (dpy, _fib_gc, _c_gray0.pixel); - XFillRectangle (dpy, win, _fib_gc, t_x + _fib_dir_indent - TEXTSEP + 1, ltop - _fib_font_vsep, t_t - t_x - _fib_dir_indent - 1, _fib_font_vsep); - break; - case 2: - XSetForeground (dpy, _fib_gc, _c_gray0.pixel); - XFillRectangle (dpy, win, _fib_gc, t_t - TEXTSEP + 1, ltop - _fib_font_vsep, _fib_font_size_width + TEXTSEP - 1, _fib_font_vsep); - break; - case 3: - XSetForeground (dpy, _fib_gc, _c_gray0.pixel); - XFillRectangle (dpy, win, _fib_gc, t_s - TEXTSEP + 1, ltop - _fib_font_vsep, TEXTSEP + TEXTSEP + _fib_font_time_width - 1, _fib_font_vsep); - break; - default: - break; - } - - // column headings and sort order - int arp = MAX (2, _fib_font_height / 5); // arrow scale - const int trioff = _fib_font_height - _fib_font_ascent - arp + 1; - XPoint ptri[4] = { {0, ttop - trioff }, {arp, -arp - arp - 1}, {-arp - arp, 0}, {arp, arp + arp + 1}}; - if (_sort & 1) { - ptri[0].y = ttop -arp - arp - 1; - ptri[1].y *= -1; - ptri[3].y *= -1; - } - switch (_sort) { - case 0: - case 1: - ptri[0].x = t_t + SORTBTNOFF + 2 - arp; - XSetForeground (dpy, _fib_gc, _c_gray6.pixel); - XFillPolygon (dpy, win, _fib_gc, ptri, 3, Convex, CoordModePrevious); - XDrawLines (dpy, win, _fib_gc, ptri, 4, CoordModePrevious); - break; - case 2: - case 3: - if (_columns & 1) { - ptri[0].x = t_s + SORTBTNOFF + 2 - arp; - XSetForeground (dpy, _fib_gc, _c_gray6.pixel); - XFillPolygon (dpy, win, _fib_gc, ptri, 3, Convex, CoordModePrevious); - XDrawLines (dpy, win, _fib_gc, ptri, 4, CoordModePrevious); - } - break; - case 4: - case 5: - if (_columns & 2) { - ptri[0].x = FAREATEXTL + fsel_width + SORTBTNOFF + 2 - arp; - XSetForeground (dpy, _fib_gc, _c_gray6.pixel); - XFillPolygon (dpy, win, _fib_gc, ptri, 3, Convex, CoordModePrevious); - XDrawLines (dpy, win, _fib_gc, ptri, 4, CoordModePrevious); - } - break; - } - -#if 0 // bottom header bottom border - XSetForeground (dpy, _fib_gc, _c_gray5.pixel); - XSetLineAttributes (dpy, _fib_gc, 1, LineOnOffDash, CapButt, JoinMiter); - XDrawLine (dpy, win, _fib_gc, - FAREAMRGL + 1, ltop, - FAREAMRGL + fsel_width, ltop); - XSetLineAttributes (dpy, _fib_gc, 1, LineSolid, CapButt, JoinMiter); -#endif - - XSetForeground (dpy, _fib_gc, _c_gray4.pixel); - XDrawLine (dpy, win, _fib_gc, - t_x + _fib_dir_indent - TEXTSEP, ltop - _fib_font_vsep + 3, - t_x + _fib_dir_indent - TEXTSEP, ltop - 3); - - XSetForeground (dpy, _fib_gc, blackColor); - XDrawString (dpy, win, _fib_gc, t_x + _fib_dir_indent, ttop, "Name", 4); - - if (_columns & 1) { - XSetForeground (dpy, _fib_gc, _c_gray4.pixel); - XDrawLine (dpy, win, _fib_gc, - t_t - TEXTSEP, ltop - _fib_font_vsep + 3, - t_t - TEXTSEP, ltop - 3); - XSetForeground (dpy, _fib_gc, blackColor); - XDrawString (dpy, win, _fib_gc, t_t, ttop, "Size", 4); - } - - if (_columns & 2) { - XSetForeground (dpy, _fib_gc, _c_gray4.pixel); - XDrawLine (dpy, win, _fib_gc, - t_s - TEXTSEP, ltop - _fib_font_vsep + 3, - t_s - TEXTSEP, ltop - 3); - XSetForeground (dpy, _fib_gc, blackColor); - if (_pathparts > 0) - XDrawString (dpy, win, _fib_gc, t_s, ttop, "Last Modified", 13); - else - XDrawString (dpy, win, _fib_gc, t_s, ttop, "Last Used", 9); - } - - // scrollbar sep - if (llen < _dircount) { - const int sx0 = _fib_width - SCROLLBARW - FAREAMRGR; - XSetForeground (dpy, _fib_gc, _c_gray4.pixel); - XDrawLine (dpy, win, _fib_gc, - sx0 - 1, ltop - _fib_font_vsep, -#ifdef DRAW_OUTLINE - sx0 - 1, ltop + fsel_height -#else - sx0 - 1, ltop - 1 -#endif - ); - } - - // clip area for file-name - XRectangle clp = {FAREAMRGL + 1, ltop, t_t - FAREAMRGL - TEXTSEP - TEXTSEP - 1, fsel_height}; - - // list files in view - for (i = 0; i < llen; ++i) { - const int j = i + fstop; - if (j >= _dircount) break; - - const int t_y = ltop + (i+1) * _fib_font_vsep - 4; - - XSetForeground (dpy, _fib_gc, blackColor); - if (_dirlist[j].flags & 2) { - XSetForeground (dpy, _fib_gc, blackColor); - XFillRectangle (dpy, win, _fib_gc, - FAREAMRGL, t_y - _fib_font_ascent, fsel_width, _fib_font_height); - XSetForeground (dpy, _fib_gc, whiteColor); - } - if (_hov_f == j && !(_dirlist[j].flags & 2)) { - XSetForeground (dpy, _fib_gc, _c_gray4.pixel); - } - if (_dirlist[j].flags & 4) { - XDrawString (dpy, win, _fib_gc, t_x, t_y, "D", 1); - } - XSetClipRectangles (dpy, _fib_gc, 0, 0, &clp, 1, Unsorted); - XDrawString (dpy, win, _fib_gc, - t_x + _fib_dir_indent, t_y, - _dirlist[j].name, strlen (_dirlist[j].name)); - XSetClipMask (dpy, _fib_gc, None); - - if (_columns & 1) // right-aligned 'size' - XDrawString (dpy, win, _fib_gc, - t_s - TEXTSEP - 2 - _dirlist[j].ssizew, t_y, - _dirlist[j].strsize, strlen (_dirlist[j].strsize)); - if (_columns & 2) - XDrawString (dpy, win, _fib_gc, - t_s, t_y, - _dirlist[j].strtime, strlen (_dirlist[j].strtime)); - } - - // scrollbar - if (llen < _dircount) { - float sl = (fsel_height + _fib_font_vsep - (SCROLLBOXH + SCROLLBOXH)) / (float) _dircount; - sl = MAX ((8. / llen), sl); // 8px min height of scroller - const int sy1 = llen * sl; - const float mx = (fsel_height + _fib_font_vsep - (SCROLLBOXH + SCROLLBOXH) - sy1) / (float)(_dircount - llen); - const int sy0 = fstop * mx; - const int sx0 = _fib_width - SCROLLBARW - FAREAMRGR; - const int stop = ltop - _fib_font_vsep; - - _scrl_y0 = stop + SCROLLBOXH + sy0; - _scrl_y1 = _scrl_y0 + sy1; - - assert (fstop + llen <= _dircount); - // scroll-bar background - XSetForeground (dpy, _fib_gc, _c_gray3.pixel); - XFillRectangle (dpy, win, _fib_gc, sx0, stop, SCROLLBARW, fsel_height + _fib_font_vsep); - - // scroller - if (_hov_s == 0) { - XSetForeground (dpy, _fib_gc, _c_gray0.pixel); - } else { - XSetForeground (dpy, _fib_gc, _c_gray1.pixel); - } - XFillRectangle (dpy, win, _fib_gc, sx0 + 1, stop + SCROLLBOXH + sy0, SCROLLBARW - 2, sy1); - - int scrw = (SCROLLBARW -3) / 2; - // arrows top and bottom - if (_hov_s == 1) { - XSetForeground (dpy, _fib_gc, _c_gray0.pixel); - } else { - XSetForeground (dpy, _fib_gc, _c_gray1.pixel); - } - XPoint ptst[4] = { {sx0 + 1, stop + 8}, {scrw, -7}, {scrw, 7}, {-2 * scrw, 0}}; - XFillPolygon (dpy, win, _fib_gc, ptst, 3, Convex, CoordModePrevious); - XDrawLines (dpy, win, _fib_gc, ptst, 4, CoordModePrevious); - - if (_hov_s == 2) { - XSetForeground (dpy, _fib_gc, _c_gray0.pixel); - } else { - XSetForeground (dpy, _fib_gc, _c_gray1.pixel); - } - XPoint ptsb[4] = { {sx0 + 1, ltop + fsel_height - 9}, {2*scrw, 0}, {-scrw, 7}, {-scrw, -7}}; - XFillPolygon (dpy, win, _fib_gc, ptsb, 3, Convex, CoordModePrevious); - XDrawLines (dpy, win, _fib_gc, ptsb, 4, CoordModePrevious); - } else { - _scrl_y0 = _scrl_y1 = -1; - } - - if (_fib_show_places) { - assert (_placecnt > 0); - - // heading - XSetForeground (dpy, _fib_gc, _c_gray3.pixel); - XFillRectangle (dpy, win, _fib_gc, FAREAMRGB, ltop - _fib_font_vsep, PLACESW - TEXTSEP, _fib_font_vsep); - - // body - XSetForeground (dpy, _fib_gc, _c_gray2.pixel); - XFillRectangle (dpy, win, _fib_gc, FAREAMRGB, ltop, PLACESW - TEXTSEP, fsel_height); - -#ifdef DRAW_OUTLINE - VDrawRectangle (dpy, win, _fib_gc, FAREAMRGB, ltop - _fib_font_vsep -1, PLACESW - TEXTSEP, fsel_height + _fib_font_vsep + 1); -#endif - - XSetForeground (dpy, _fib_gc, blackColor); - XDrawString (dpy, win, _fib_gc, FAREAMRGB + TEXTSEP, ttop, "Places", 6); - - XRectangle pclip = {FAREAMRGB + 1, ltop, PLACESW - TEXTSEP -1, fsel_height}; - XSetClipRectangles (dpy, _fib_gc, 0, 0, &pclip, 1, Unsorted); - const int plx = FAREAMRGB + TEXTSEP; - for (i = 0; i < llen && i < _placecnt; ++i) { - const int ply = ltop + (i+1) * _fib_font_vsep - 4; - if (i == _hov_l) { - XSetForeground (dpy, _fib_gc, _c_gray4.pixel); - } else { - XSetForeground (dpy, _fib_gc, blackColor); - } - XDrawString (dpy, win, _fib_gc, - plx, ply, - _placelist[i].name, strlen (_placelist[i].name)); - if (_placelist[i].flags & 4) { - XSetForeground (dpy, _fib_gc, _c_gray3.pixel); - const int plly = ply - _fib_font_ascent + _fib_font_height; - const int pllx0 = FAREAMRGB; - const int pllx1 = FAREAMRGB + (PLACESW - TEXTSEP); - XDrawLine (dpy, win, _fib_gc, pllx0, plly, pllx1, plly); - } - } - XSetClipMask (dpy, _fib_gc, None); - - if (_placecnt > llen) { - const int plly = ltop + fsel_height - _fib_font_height + _fib_font_ascent; - const int pllx0 = FAREAMRGB + (PLACESW - TEXTSEP) * .75; - const int pllx1 = FAREAMRGB + (PLACESW - TEXTSEP - TEXTSEP); - - XSetForeground (dpy, _fib_gc, blackColor); - XSetLineAttributes (dpy, _fib_gc, 1, LineOnOffDash, CapButt, JoinMiter); - XDrawLine (dpy, win, _fib_gc, pllx0, plly, pllx1, plly); - XSetLineAttributes (dpy, _fib_gc, 1, LineSolid, CapButt, JoinMiter); - } - } - - // Bottom Buttons - const int numb = sizeof(_btns) / sizeof(FibButton*); - int xtra = _fib_width - _btn_span; - const int cbox = _fib_font_ascent - 2; - const int bbase = _fib_height - BTNBTMMARGIN * _fib_font_vsep - BTNPADDING; - const int cblw = cbox > 20 ? 5 : ( cbox > 9 ? 3 : 1); - - int bx = FAREAMRGB; - for (i = 0; i < numb; ++i) { - if (_btns[i]->flags & 8) { continue; } - if (_btns[i]->flags & 4) { - // checkbutton - const int cby0 = bbase - cbox + 1 + BTNPADDING; - if (i == _hov_b) { - XSetForeground (dpy, _fib_gc, _c_gray4.pixel); - } else { - XSetForeground (dpy, _fib_gc, blackColor); - } - XDrawRectangle (dpy, win, _fib_gc, - bx, cby0 - 1, cbox + 1, cbox + 1); - - if (i == _hov_b) { - XSetForeground (dpy, _fib_gc, _c_gray5.pixel); - } else { - XSetForeground (dpy, _fib_gc, blackColor); - } - XDrawString (dpy, win, _fib_gc, BTNPADDING + bx + _fib_font_ascent, 1 + bbase + BTNPADDING, - _btns[i]->text, strlen (_btns[i]->text)); - - if (i == _hov_b) { - XSetForeground (dpy, _fib_gc, _c_gray0.pixel); - } else { - if (_btns[i]->flags & 2) { - XSetForeground (dpy, _fib_gc, _c_gray1.pixel); - } else { - XSetForeground (dpy, _fib_gc, _c_gray2.pixel); - } - } - XFillRectangle (dpy, win, _fib_gc, - bx+1, cby0, cbox, cbox); - - if (_btns[i]->flags & 2) { - XSetLineAttributes (dpy, _fib_gc, cblw, LineSolid, CapRound, JoinMiter); - XSetForeground (dpy, _fib_gc, _c_gray6.pixel); - XDrawLine (dpy, win, _fib_gc, - bx + 2, cby0 + 1, - bx + cbox - 1, cby0 + cbox - 2); - XDrawLine (dpy, win, _fib_gc, - bx + cbox - 1, cby0 + 1, - bx + 2, cby0 + cbox - 2); - XSetLineAttributes (dpy, _fib_gc, 1, LineSolid, CapButt, JoinMiter); - } - } else { - if (xtra > 0) { - bx += xtra; - xtra = 0; - } - // pushbutton - - uint8_t can_hover = 1; // special case - if (_btns[i] == &_btn_ok) { - if (_fsel < 0 || _fsel >= _dircount) { - can_hover = 0; - } - } - - if (can_hover && i == _hov_b) { - XSetForeground (dpy, _fib_gc, _c_gray0.pixel); - } else { - XSetForeground (dpy, _fib_gc, _c_gray2.pixel); - } - XFillRectangle (dpy, win, _fib_gc, - bx + 1, bbase - _fib_font_ascent, - _btn_w - 1, _fib_font_height + BTNPADDING + BTNPADDING); - VDrawRectangle (dpy, win, _fib_gc, - bx, bbase - _fib_font_ascent, - _btn_w, _fib_font_height + BTNPADDING + BTNPADDING); - XDrawString (dpy, win, _fib_gc, bx + (_btn_w - _btns[i]->tw) * .5, 1 + bbase + BTNPADDING, - _btns[i]->text, strlen (_btns[i]->text)); - } - _btns[i]->x0 = bx; - bx += _btns[i]->xw + DSEP; - } - - if (_pixbuffer != None) { - XCopyArea(dpy, _pixbuffer, realwin, _fib_gc, 0, 0, _fib_width, _fib_height, 0, 0); - } - XFlush (dpy); -} - -static void fib_reset () { - _hov_p = _hov_f = _hov_h = _hov_l = -1; - _scrl_f = 0; - _fib_resized = 1; -} - -static int cmp_n_up (const void *p1, const void *p2) { - FibFileEntry *a = (FibFileEntry*) p1; - FibFileEntry *b = (FibFileEntry*) p2; - if ((a->flags & 4) && !(b->flags & 4)) return -1; - if (!(a->flags & 4) && (b->flags & 4)) return 1; - return strcmp (a->name, b->name); -} - -static int cmp_n_down (const void *p1, const void *p2) { - FibFileEntry *a = (FibFileEntry*) p1; - FibFileEntry *b = (FibFileEntry*) p2; - if ((a->flags & 4) && !(b->flags & 4)) return -1; - if (!(a->flags & 4) && (b->flags & 4)) return 1; - return strcmp (b->name, a->name); -} - -static int cmp_t_up (const void *p1, const void *p2) { - FibFileEntry *a = (FibFileEntry*) p1; - FibFileEntry *b = (FibFileEntry*) p2; - if ((a->flags & 4) && !(b->flags & 4)) return -1; - if (!(a->flags & 4) && (b->flags & 4)) return 1; - if (a->mtime == b->mtime) return 0; - return a->mtime > b->mtime ? -1 : 1; -} - -static int cmp_t_down (const void *p1, const void *p2) { - FibFileEntry *a = (FibFileEntry*) p1; - FibFileEntry *b = (FibFileEntry*) p2; - if ((a->flags & 4) && !(b->flags & 4)) return -1; - if (!(a->flags & 4) && (b->flags & 4)) return 1; - if (a->mtime == b->mtime) return 0; - return a->mtime > b->mtime ? 1 : -1; -} - -static int cmp_s_up (const void *p1, const void *p2) { - FibFileEntry *a = (FibFileEntry*) p1; - FibFileEntry *b = (FibFileEntry*) p2; - if ((a->flags & 4) && (b->flags & 4)) return 0; // dir, no size, retain order - if ((a->flags & 4) && !(b->flags & 4)) return -1; - if (!(a->flags & 4) && (b->flags & 4)) return 1; - if (a->size == b->size) return 0; - return a->size > b->size ? -1 : 1; -} - -static int cmp_s_down (const void *p1, const void *p2) { - FibFileEntry *a = (FibFileEntry*) p1; - FibFileEntry *b = (FibFileEntry*) p2; - if ((a->flags & 4) && (b->flags & 4)) return 0; // dir, no size, retain order - if ((a->flags & 4) && !(b->flags & 4)) return -1; - if (!(a->flags & 4) && (b->flags & 4)) return 1; - if (a->size == b->size) return 0; - return a->size > b->size ? 1 : -1; -} - -static void fmt_size (Display *dpy, FibFileEntry *f) { - if (f->size > 10995116277760) { - sprintf (f->strsize, "%.0f TB", f->size / 1099511627776.f); - } - if (f->size > 1099511627776) { - sprintf (f->strsize, "%.1f TB", f->size / 1099511627776.f); - } - else if (f->size > 10737418240) { - sprintf (f->strsize, "%.0f GB", f->size / 1073741824.f); - } - else if (f->size > 1073741824) { - sprintf (f->strsize, "%.1f GB", f->size / 1073741824.f); - } - else if (f->size > 10485760) { - sprintf (f->strsize, "%.0f MB", f->size / 1048576.f); - } - else if (f->size > 1048576) { - sprintf (f->strsize, "%.1f MB", f->size / 1048576.f); - } - else if (f->size > 10240) { - sprintf (f->strsize, "%.0f KB", f->size / 1024.f); - } - else if (f->size >= 1000) { - sprintf (f->strsize, "%.1f KB", f->size / 1024.f); - } - else { - sprintf (f->strsize, "%.0f B", f->size / 1.f); - } - int sw = 0; - query_font_geometry (dpy, _fib_gc, f->strsize, &sw, NULL, NULL, NULL); - if (sw > _fib_font_size_width) { - _fib_font_size_width = sw; - } - f->ssizew = sw; -} - -static void fmt_time (Display *dpy, FibFileEntry *f) { - struct tm *tmp; - tmp = localtime (&f->mtime); - if (!tmp) { - return; - } - strftime (f->strtime, sizeof(f->strtime), "%F %H:%M", tmp); - - int tw = 0; - query_font_geometry (dpy, _fib_gc, f->strtime, &tw, NULL, NULL, NULL); - if (tw > _fib_font_time_width) { - _fib_font_time_width = tw; - } -} - -static void fib_resort (const char * sel) { - if (_dircount < 1) { return; } - int (*sortfn)(const void *p1, const void *p2); - switch (_sort) { - case 1: sortfn = &cmp_n_down; break; - case 2: sortfn = &cmp_s_down; break; - case 3: sortfn = &cmp_s_up; break; - case 4: sortfn = &cmp_t_down; break; - case 5: sortfn = &cmp_t_up; break; - default: - sortfn = &cmp_n_up; - break; - } - qsort (_dirlist, _dircount, sizeof(_dirlist[0]), sortfn); - int i; - for (i = 0; i < _dircount && sel; ++i) { - if (!strcmp (_dirlist[i].name, sel)) { - _fsel = i; - break; - } - } -} - -static void fib_select (Display *dpy, int item) { - if (_fsel >= 0) { - _dirlist[_fsel].flags &= ~2; - } - _fsel = item; - if (_fsel >= 0 && _fsel < _dircount) { - _dirlist[_fsel].flags |= 2; - const int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; - if (_fsel < _scrl_f) { - _scrl_f = _fsel; - } - else if (_fsel >= _scrl_f + llen) { - _scrl_f = 1 + _fsel - llen; - } - } else { - _fsel = -1; - } - - fib_expose (dpy, _fib_win); -} - -static inline int fib_filter (const char *name) { - if (_fib_filter_function) { - return _fib_filter_function (name); - } else { - return 1; - } -} - -static void fib_pre_opendir (Display *dpy) { - if (_dirlist) free (_dirlist); - if (_pathbtn) free (_pathbtn); - _dirlist = NULL; - _pathbtn = NULL; - _dircount = 0; - _pathparts = 0; - query_font_geometry (dpy, _fib_gc, "Size ", &_fib_font_size_width, NULL, NULL, NULL); - fib_reset (); - _fsel = -1; -} - -static void fib_post_opendir (Display *dpy, const char *sel) { - if (_dircount > 0) - _fsel = 0; // select first - else - _fsel = -1; - fib_resort (sel); - - if (_dircount > 0 && _fsel >= 0) { - fib_select (dpy, _fsel); - } else { - fib_expose (dpy, _fib_win); - } -} - -static int fib_dirlistadd (Display *dpy, const int i, const char* path, const char *name, time_t mtime) { - char tp[1024]; - struct stat fs; - if (!_fib_hidden_fn && name[0] == '.') return -1; - if (!strcmp (name, ".")) return -1; - if (!strcmp (name, "..")) return -1; - strcpy (tp, path); - strcat (tp, name); - if (access (tp, R_OK)) { - return -1; - } - if (stat (tp, &fs)) { - return -1; - } - assert (i < _dircount); // could happen if dir changes while we're reading. - if (i >= _dircount) return -1; - if (S_ISDIR (fs.st_mode)) { - _dirlist[i].flags |= 4; - } - else if (S_ISREG (fs.st_mode)) { - if (!fib_filter (name)) return -1; - } -#if 0 // only needed with lstat() - else if (S_ISLNK (fs.st_mode)) { - if (!fib_filter (name)) return -1; - } -#endif - else { - return -1; - } - strcpy (_dirlist[i].name, name); - _dirlist[i].mtime = mtime > 0 ? mtime : fs.st_mtime; - _dirlist[i].size = fs.st_size; - if (!(_dirlist[i].flags & 4)) - fmt_size (dpy, &_dirlist[i]); - fmt_time (dpy, &_dirlist[i]); - return 0; -} - -static int fib_openrecent (Display *dpy, const char *sel) { - int i; - unsigned int j; - assert (_recentcnt > 0); - fib_pre_opendir (dpy); - query_font_geometry (dpy, _fib_gc, "Last Used", &_fib_font_time_width, NULL, NULL, NULL); - _dirlist = (FibFileEntry*) calloc (_recentcnt, sizeof(FibFileEntry)); - _dircount = _recentcnt; - for (j = 0, i = 0; j < _recentcnt; ++j) { - char base[1024]; - char *s = strrchr (_recentlist[j].path, '/'); - if (!s || !*++s) continue; - size_t len = (s - _recentlist[j].path); - strncpy (base, _recentlist[j].path, len); - base[len] = '\0'; - if (!fib_dirlistadd (dpy, i, base, s, _recentlist[j].atime)) { - _dirlist[i].rfp = &_recentlist[j]; - _dirlist[i].flags |= 8; - ++i; - } - } - _dircount = i; - fib_post_opendir (dpy, sel); - return _dircount; -} - -static int fib_opendir (Display *dpy, const char* path, const char *sel) { - char *t0, *t1; - int i; - - assert (path); - - if (strlen (path) == 0 && _recentcnt > 0) { // XXX we should use a better indication for this - strcpy (_cur_path, ""); - return fib_openrecent (dpy, sel); - } - - assert (strlen (path) < sizeof(_cur_path) -1); - assert (strlen (path) > 0); - assert (strstr (path, "//") == NULL); - assert (path[0] == '/'); - - fib_pre_opendir (dpy); - - query_font_geometry (dpy, _fib_gc, "Last Modified", &_fib_font_time_width, NULL, NULL, NULL); - DIR *dir = opendir (path); - if (!dir) { - strcpy (_cur_path, "/"); - } else { - int i; - struct dirent *de; - if (path != _cur_path) - strcpy (_cur_path, path); - - if (_cur_path[strlen (_cur_path) -1] != '/') - strcat (_cur_path, "/"); - - while ((de = readdir (dir))) { - if (!_fib_hidden_fn && de->d_name[0] == '.') continue; - ++_dircount; - } - - if (_dircount > 0) - _dirlist = (FibFileEntry*) calloc (_dircount, sizeof(FibFileEntry)); - - rewinddir (dir); - - i = 0; - while ((de = readdir (dir))) { - if (!fib_dirlistadd (dpy, i, _cur_path, de->d_name, 0)) - ++i; - } - _dircount = i; - closedir (dir); - } - - t0 = _cur_path; - while (*t0 && (t0 = strchr (t0, '/'))) { - ++_pathparts; - ++t0; - } - assert (_pathparts > 0); - _pathbtn = (FibPathButton*) calloc (_pathparts + 1, sizeof(FibPathButton)); - - t1 = _cur_path; - i = 0; - while (*t1 && (t0 = strchr (t1, '/'))) { - if (i == 0) { - strcpy (_pathbtn[i].name, "/"); - } else { - *t0 = 0; - strcpy (_pathbtn[i].name, t1); - } - query_font_geometry (dpy, _fib_gc, _pathbtn[i].name, &_pathbtn[i].xw, NULL, NULL, NULL); - _pathbtn[i].xw += BTNPADDING + BTNPADDING; - *t0 = '/'; - t1 = t0 + 1; - ++i; - } - fib_post_opendir (dpy, sel); - return _dircount; -} - -static int fib_open (Display *dpy, int item) { - char tp[1024]; - if (_dirlist[item].flags & 8) { - assert (_dirlist[item].rfp); - strcpy (_rv_open, _dirlist[item].rfp->path); - _status = 1; - return 0; - } - strcpy (tp, _cur_path); - strcat (tp, _dirlist[item].name); - if (_dirlist[item].flags & 4) { - fib_opendir (dpy, tp, NULL); - return 0; - } else { - _status = 1; - strcpy (_rv_open, tp); - } - return 0; -} - -static void cb_cancel (Display *dpy) { - _status = -1; -} - -static void cb_open (Display *dpy) { - if (_fsel >= 0 && _fsel < _dircount) { - fib_open (dpy, _fsel); - } -} - -static void sync_button_states () { - if (_fib_show_places) - _btn_places.flags |= 2; - else - _btn_places.flags &= ~2; - if (_fib_filter_fn) // inverse -> show all - _btn_filter.flags &= ~2; - else - _btn_filter.flags |= 2; - if (_fib_hidden_fn) - _btn_hidden.flags |= 2; - else - _btn_hidden.flags &= ~2; -} - -static void cb_places (Display *dpy) { - _fib_show_places = ! _fib_show_places; - if (_placecnt < 1) - _fib_show_places = 0; - sync_button_states (); - _fib_resized = 1; - fib_expose (dpy, _fib_win); -} - -static void cb_filter (Display *dpy) { - _fib_filter_fn = ! _fib_filter_fn; - sync_button_states (); - char *sel = _fsel >= 0 ? strdup (_dirlist[_fsel].name) : NULL; - fib_opendir (dpy, _cur_path, sel); - free (sel); -} - -static void cb_hidden (Display *dpy) { - _fib_hidden_fn = ! _fib_hidden_fn; - sync_button_states (); - char *sel = _fsel >= 0 ? strdup (_dirlist[_fsel].name) : NULL; - fib_opendir (dpy, _cur_path, sel); - free (sel); -} - -static int fib_widget_at_pos (Display *dpy, int x, int y, int *it) { - const int btop = _fib_height - BTNBTMMARGIN * _fib_font_vsep - _fib_font_ascent - BTNPADDING; - const int bbot = btop + _fib_font_height + BTNPADDING + BTNPADDING; - const int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; - const int ltop = LISTTOP * _fib_font_vsep; - const int fbot = ltop + 4 + llen * _fib_font_vsep; - const int ptop = PATHBTNTOP - _fib_font_ascent; - assert (it); - - // paths at top - if (y > ptop && y < ptop + _fib_font_height && _view_p >= 0 && _pathparts > 0) { - int i = _view_p; - *it = -1; - if (i > 0) { // special case '<' - if (x > FAREAMRGB && x <= FAREAMRGB + _pathbtn[0].xw) { - *it = _view_p - 1; - i = _pathparts; - } - } - while (i < _pathparts) { - if (x >= _pathbtn[i].x0 && x <= _pathbtn[i].x0 + _pathbtn[i].xw) { - *it = i; - break; - } - ++i; - } - assert (*it < _pathparts); - if (*it >= 0) return 1; - else return 0; - } - - // buttons at bottom - if (y > btop && y < bbot) { - size_t i; - *it = -1; - for (i = 0; i < sizeof(_btns) / sizeof(FibButton*); ++i) { - const int bx = _btns[i]->x0; - if (_btns[i]->flags & 8) { continue; } - if (x > bx && x < bx + _btns[i]->xw) { - *it = i; - } - } - if (*it >= 0) return 3; - else return 0; - } - - // main file area - if (y >= ltop - _fib_font_vsep && y < fbot && x > FAREAMRGL && x < _fib_width - FAREAMRGR) { - // scrollbar - if (_scrl_y0 > 0 && x >= _fib_width - (FAREAMRGR + SCROLLBARW) && x <= _fib_width - FAREAMRGR) { - if (y >= _scrl_y0 && y < _scrl_y1) { - *it = 0; - } else if (y >= _scrl_y1) { - *it = 2; - } else { - *it = 1; - } - return 4; - } - // file-list - else if (y >= ltop) { - const int item = (y - ltop) / _fib_font_vsep + _scrl_f; - *it = -1; - if (item >= 0 && item < _dircount) { - *it = item; - } - if (*it >= 0) return 2; - else return 0; - } - else { - *it = -1; - const int fsel_width = _fib_width - FAREAMRGL - FAREAMRGR - (llen < _dircount ? SCROLLBARW : 0); - const int t_s = FAREAMRGL + fsel_width - _fib_font_time_width - TEXTSEP - TEXTSEP; - const int t_t = FAREAMRGL + fsel_width - TEXTSEP - _fib_font_size_width - ((_columns & 2) ? ( _fib_font_time_width + TEXTSEP + TEXTSEP) : 0); - if (x >= fsel_width + FAREAMRGL) ; - else if ((_columns & 2) && x >= t_s) *it = 3; - else if ((_columns & 1) && x >= t_t) *it = 2; - else if (x >= FAREATEXTL + _fib_dir_indent - TEXTSEP) *it = 1; - if (*it >= 0) return 5; - else return 0; - } - } - - // places list - if (_fib_show_places && y >= ltop && y < fbot && x > FAREAMRGB && x < FAREAMRGL - FAREAMRGB) { - const int item = (y - ltop) / _fib_font_vsep; - *it = -1; - if (item >= 0 && item < _placecnt) { - *it = item; - } - if (*it >= 0) return 6; - else return 0; - } - - return 0; -} - -static void fib_update_hover (Display *dpy, int need_expose, const int type, const int item) { - int hov_p = -1; - int hov_b = -1; - int hov_h = -1; - int hov_s = -1; -#ifdef LIST_ENTRY_HOVER - int hov_f = -1; - int hov_l = -1; -#endif - - switch (type) { - case 1: hov_p = item; break; - case 3: hov_b = item; break; - case 4: hov_s = item; break; - case 5: hov_h = item; break; -#ifdef LIST_ENTRY_HOVER - case 6: hov_l = item; break; - case 2: hov_f = item; break; -#endif - default: break; - } -#ifdef LIST_ENTRY_HOVER - if (hov_f != _hov_f) { _hov_f = hov_f; need_expose = 1; } - if (hov_l != _hov_l) { _hov_l = hov_l; need_expose = 1; } -#endif - if (hov_b != _hov_b) { _hov_b = hov_b; need_expose = 1; } - if (hov_p != _hov_p) { _hov_p = hov_p; need_expose = 1; } - if (hov_h != _hov_h) { _hov_h = hov_h; need_expose = 1; } - if (hov_s != _hov_s) { _hov_s = hov_s; need_expose = 1; } - - if (need_expose) { - fib_expose (dpy, _fib_win); - } -} - -static void fib_motion (Display *dpy, int x, int y) { - int it = -1; - - if (_scrl_my >= 0) { - const int sdiff = y - _scrl_my; - const int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; - const int fsel_height = 4 + llen * _fib_font_vsep; - const float sl = (fsel_height + _fib_font_vsep - (SCROLLBOXH + SCROLLBOXH)) / (float) _dircount; - - int news = _scrl_mf + sdiff / sl; - if (news < 0) news = 0; - if (news >= (_dircount - llen)) news = _dircount - llen; - if (news != _scrl_f) { - _scrl_f = news; - fib_expose (dpy, _fib_win); - } - return; - } - - const int type = fib_widget_at_pos (dpy, x, y, &it); - fib_update_hover (dpy, 0, type, it); -} - -static void fib_mousedown (Display *dpy, int x, int y, int btn, unsigned long time) { - int it; - switch (fib_widget_at_pos (dpy, x, y, &it)) { - case 4: // scrollbar - if (btn == 1) { - _dblclk = 0; - if (it == 0) { - _scrl_my = y; - _scrl_mf = _scrl_f; - } else { - int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; - if (llen < 2) llen = 2; - int news = _scrl_f; - if (it == 1) { - news -= llen - 1; - } else { - news += llen - 1; - } - if (news < 0) news = 0; - if (news >= (_dircount - llen)) news = _dircount - llen; - if (news != _scrl_f && _scrl_y0 >= 0) { - assert (news >=0); - _scrl_f = news; - fib_update_hover (dpy, 1, 4, it); - } - } - } - break; - case 2: // file-list - if (btn == 4 || btn == 5) { - const int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; - int news = _scrl_f + ((btn == 4) ? - 1 : 1); - if (news < 0) news = 0; - if (news >= (_dircount - llen)) news = _dircount - llen; - if (news != _scrl_f && _scrl_y0 >= 0) { - assert (news >=0); - _scrl_f = news; - fib_update_hover (dpy, 1, 0, 0); - } - _dblclk = 0; - } - else if (btn == 1 && it >= 0 && it < _dircount) { - if (_fsel == it) { - if (time - _dblclk < DBLCLKTME) { - fib_open (dpy, it); - _dblclk = 0; - } - _dblclk = time; - } else { - fib_select (dpy, it); - _dblclk = time; - } - if (_fsel >= 0) { - if (!(_dirlist[_fsel].flags & 4)) { - } - } - } - break; - case 1: // paths - assert (_fsel < _dircount); - assert (it >= 0 && it < _pathparts); - { - int i = 0; - char path[1024] = "/"; - while (++i <= it) { - strcat (path, _pathbtn[i].name); - strcat (path, "/"); - } - char *sel = NULL; - if (i < _pathparts) - sel = strdup (_pathbtn[i].name); - else if (i == _pathparts && _fsel >= 0) - sel = strdup (_dirlist[_fsel].name); - fib_opendir (dpy, path, sel); - free (sel); - } - break; - case 3: // btn - if (btn == 1 && _btns[it]->callback) { - _btns[it]->callback (dpy); - } - break; - case 5: // sort - if (btn == 1) { - switch (it) { - case 1: if (_sort == 0) _sort = 1; else _sort = 0; break; - case 2: if (_sort == 2) _sort = 3; else _sort = 2; break; - case 3: if (_sort == 4) _sort = 5; else _sort = 4; break; - } - if (_fsel >= 0) { - assert (_dirlist && _dircount >= _fsel); - _dirlist[_fsel].flags &= ~2; - char *sel = strdup (_dirlist[_fsel].name); - fib_resort (sel); - free (sel); - } else { - fib_resort (NULL); - _fsel = -1; - } - fib_reset (); - _hov_h = it; - fib_select (dpy, _fsel); - } - break; - case 6: - if (btn == 1 && it >= 0 && it < _placecnt) { - fib_opendir (dpy, _placelist[it].path, NULL); - } - break; - default: - break; - } -} - -static void fib_mouseup (Display *dpy, int x, int y, int btn, unsigned long time) { - _scrl_my = -1; -} - -static void add_place_raw (Display *dpy, const char *name, const char *path) { - _placelist = (FibPlace*) realloc (_placelist, (_placecnt + 1) * sizeof(FibPlace)); - strcpy (_placelist[_placecnt].path, path); - strcpy (_placelist[_placecnt].name, name); - _placelist[_placecnt].flags = 0; - - int sw; - query_font_geometry (dpy, _fib_gc, name, &sw, NULL, NULL, NULL); - if (sw > _fib_place_width) { - _fib_place_width = sw; - } - ++_placecnt; -} - -static int add_place_places (Display *dpy, const char *name, const char *url) { - char const * path; - struct stat fs; - int i; - if (!url || strlen (url) < 1) return -1; - if (!name || strlen (name) < 1) return -1; - if (url[0] == '/') { - path = url; - } - else if (!strncmp (url, "file:///", 8)) { - path = &url[7]; - } - else { - return -1; - } - - if (access (path, R_OK)) { - return -1; - } - if (stat (path, &fs)) { - return -1; - } - if (!S_ISDIR (fs.st_mode)) { - return -1; - } - - for (i = 0; i < _placecnt; ++i) { - if (!strcmp (path, _placelist[i].path)) { - return -1; - } - } - add_place_raw (dpy, name, path); - return 0; -} - -static int parse_gtk_bookmarks (Display *dpy, const char *fn) { - char tmp[1024]; - if (access (fn, R_OK)) { - return -1; - } - FILE *bm = fopen (fn, "r"); - if (!bm) return -1; - int found = 0; - while (fgets (tmp, sizeof(tmp), bm) - && strlen (tmp) > 1 - && strlen (tmp) < sizeof(tmp)) - { - char *s, *n; - tmp[strlen (tmp) - 1] = '\0'; // strip newline - if ((s = strchr (tmp, ' '))) { - *s = '\0'; - n = strdup (++s); - decode_3986 (tmp); - if (!add_place_places (dpy, n, tmp)) { - ++found; - } - free (n); - } else if ((s = strrchr (tmp, '/'))) { - n = strdup (++s); - decode_3986 (tmp); - if (!add_place_places (dpy, n, tmp)) { - ++found; - } - free (n); - } - } - fclose (bm); - return found; -} - -static const char *ignore_mountpoints[] = { - "/bin", "/boot", "/dev", "/etc", - "/lib", "/live", "/mnt", "/opt", - "/root", "/sbin", "/srv", "/tmp", - "/usr", "/var", "/proc", "/sbin", - "/net", "/sys" -}; - -static const char *ignore_fs[] = { - "auto", "autofs", - "debugfs", "devfs", - "devpts", "ecryptfs", - "fusectl", "kernfs", - "linprocfs", "proc", - "ptyfs", "rootfs", - "selinuxfs", "sysfs", - "tmpfs", "usbfs", - "nfsd", "rpc_pipefs", -}; - -static const char *ignore_devices[] = { - "binfmt_", "devpts", - "gvfs", "none", - "nfsd", "sunrpc", - "/dev/loop", "/dev/vn" -}; - -static int check_mount (const char *mountpoint, const char *fs, const char *device) { - size_t i; - if (!mountpoint || !fs || !device) return -1; - //printf("%s %s %s\n", mountpoint, fs, device); - for (i = 0 ; i < sizeof(ignore_mountpoints) / sizeof(char*); ++i) { - if (!strncmp (mountpoint, ignore_mountpoints[i], strlen (ignore_mountpoints[i]))) { - return 1; - } - } - if (!strncmp (mountpoint, "/home", 5)) { - return 1; - } - for (i = 0 ; i < sizeof(ignore_fs) / sizeof(char*); ++i) { - if (!strncmp (fs, ignore_fs[i], strlen (ignore_fs[i]))) { - return 1; - } - } - for (i = 0 ; i < sizeof(ignore_devices) / sizeof(char*); ++i) { - if (!strncmp (device, ignore_devices[i], strlen (ignore_devices[i]))) { - return 1; - } - } - return 0; -} - -static int read_mtab (Display *dpy, const char *mtab) { - FILE *mt = fopen (mtab, "r"); - if (!mt) return -1; - int found = 0; - struct mntent *mntent; - while ((mntent = getmntent (mt)) != NULL) { - char *s; - if (check_mount (mntent->mnt_dir, mntent->mnt_type, mntent->mnt_fsname)) - continue; - - if ((s = strrchr (mntent->mnt_dir, '/'))) { - ++s; - } else { - s = mntent->mnt_dir; - } - if (!add_place_places (dpy, s, mntent->mnt_dir)) { - ++found; - } - } - fclose (mt); - return found; -} - -static void populate_places (Display *dpy) { - char tmp[1024]; - int spacer = -1; - if (_placecnt > 0) return; - _fib_place_width = 0; - - if (_recentcnt > 0) { - add_place_raw (dpy, "Recently Used", ""); - _placelist[0].flags |= 4; - } - - add_place_places (dpy, "Home", getenv ("HOME")); - - if (getenv ("HOME")) { - strcpy (tmp, getenv ("HOME")); - strcat (tmp, "/Desktop"); - add_place_places (dpy, "Desktop", tmp); - } - - add_place_places (dpy, "Filesystem", "/"); - - if (_placecnt > 0) spacer = _placecnt -1; - - if (strlen (_fib_cfg_custom_places) > 0) { - parse_gtk_bookmarks (dpy, _fib_cfg_custom_places); - } - - if (read_mtab (dpy, "/proc/mounts") < 1) { - read_mtab (dpy, "/etc/mtab"); - } - - int parsed_bookmarks = 0; - if (!parsed_bookmarks && getenv ("HOME")) { - strcpy (tmp, getenv ("HOME")); - strcat (tmp, "/.gtk-bookmarks"); - if (parse_gtk_bookmarks (dpy, tmp) > 0) { - parsed_bookmarks = 1; - } - } - if (!parsed_bookmarks && getenv ("XDG_CONFIG_HOME")) { - strcpy (tmp, getenv ("XDG_CONFIG_HOME")); - strcat (tmp, "/gtk-3.0/bookmarks"); - if (parse_gtk_bookmarks (dpy, tmp) > 0) { - parsed_bookmarks = 1; - } - } - if (!parsed_bookmarks && getenv ("HOME")) { - strcpy (tmp, getenv ("HOME")); - strcat (tmp, "/.config/gtk-3.0/bookmarks"); - if (parse_gtk_bookmarks (dpy, tmp) > 0) { - parsed_bookmarks = 1; - } - } - if (_fib_place_width > 0) { - _fib_place_width = MIN (_fib_place_width + TEXTSEP + _fib_dir_indent /*extra*/ , PLACESWMAX); - } - if (spacer > 0 && spacer < _placecnt -1) { - _placelist[ spacer ].flags |= 4; - } -} - -static uint8_t font_err = 0; -static int x_error_handler (Display *d, XErrorEvent *e) { - font_err = 1; - return 0; -} - -int x_fib_show (Display *dpy, Window parent, int x, int y) { - if (_fib_win) { - XSetInputFocus (dpy, _fib_win, RevertToParent, CurrentTime); - return -1; - } - - _status = 0; - _rv_open[0] = '\0'; - - Colormap colormap = DefaultColormap (dpy, DefaultScreen (dpy)); - _c_gray1.flags= DoRed | DoGreen | DoBlue; - _c_gray0.red = _c_gray0.green = _c_gray0.blue = 61710; // 95% hover prelight - _c_gray1.red = _c_gray1.green = _c_gray1.blue = 60416; // 93% window bg, scrollbar-fg - _c_gray2.red = _c_gray2.green = _c_gray2.blue = 54016; // 83% button & list bg - _c_gray3.red = _c_gray3.green = _c_gray3.blue = 48640; // 75% heading + scrollbar-bg - _c_gray4.red = _c_gray4.green = _c_gray4.blue = 26112; // 40% prelight text, sep lines - _c_gray5.red = _c_gray5.green = _c_gray5.blue = 12800; // 20% 3D border - _c_gray6.red = _c_gray6.green = _c_gray6.blue = 6400; // 10% checkbox cross, sort triangles - - if (!XAllocColor (dpy, colormap, &_c_gray0)) return -1; - if (!XAllocColor (dpy, colormap, &_c_gray1)) return -1; - if (!XAllocColor (dpy, colormap, &_c_gray2)) return -1; - if (!XAllocColor (dpy, colormap, &_c_gray3)) return -1; - if (!XAllocColor (dpy, colormap, &_c_gray4)) return -1; - if (!XAllocColor (dpy, colormap, &_c_gray5)) return -1; - if (!XAllocColor (dpy, colormap, &_c_gray6)) return -1; - - XSetWindowAttributes attr; - memset (&attr, 0, sizeof(XSetWindowAttributes)); - attr.border_pixel = _c_gray2.pixel; - - attr.event_mask = ExposureMask | KeyPressMask - | ButtonPressMask | ButtonReleaseMask - | ConfigureNotify | StructureNotifyMask - | PointerMotionMask | LeaveWindowMask; - - _fib_win = XCreateWindow ( - dpy, DefaultRootWindow (dpy), - x, y, _fib_width, _fib_height, - 1, CopyFromParent, InputOutput, CopyFromParent, - CWEventMask | CWBorderPixel, &attr); - - if (!_fib_win) { return 1; } - - if (parent) - XSetTransientForHint (dpy, _fib_win, parent); - - XStoreName (dpy, _fib_win, "Select File"); - - Atom wmDelete = XInternAtom (dpy, "WM_DELETE_WINDOW", True); - XSetWMProtocols (dpy, _fib_win, &wmDelete, 1); - - _fib_gc = XCreateGC (dpy, _fib_win, 0, NULL); - XSetLineAttributes (dpy, _fib_gc, 1, LineSolid, CapButt, JoinMiter); - const char dl[1] = {1}; - XSetDashes (dpy, _fib_gc, 0, dl, 1); - - int (*handler)(Display *, XErrorEvent *) = XSetErrorHandler (&x_error_handler); - -#define _XTESTFONT(FN) \ - { \ - font_err = 0; \ - _fibfont = XLoadFont (dpy, FN); \ - XSetFont (dpy, _fib_gc, _fibfont); \ - XSync (dpy, False); \ - } - - font_err = 1; - if (getenv ("XJFONT")) _XTESTFONT (getenv ("XJFONT")); - if (font_err && strlen (_fib_cfg_custom_font) > 0) _XTESTFONT (_fib_cfg_custom_font); - if (font_err) _XTESTFONT ("-*-helvetica-medium-r-normal-*-24-*-*-*-*-*-*-*"); - if (font_err) _XTESTFONT ("-*-verdana-medium-r-normal-*-24-*-*-*-*-*-*-*"); - if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-24-*-*-*-*-*-*-*"); - if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-20-*-*-*-*-*-*-*"); - if (font_err) _fibfont = None; - XSync (dpy, False); - XSetErrorHandler (handler); - - if (_fib_font_height == 0) { // 1st time only - query_font_geometry (dpy, _fib_gc, "D ", &_fib_dir_indent, NULL, NULL, NULL); - query_font_geometry (dpy, _fib_gc, "_", &_fib_spc_norm, NULL, NULL, NULL); - if (query_font_geometry (dpy, _fib_gc, "|0Yy", NULL, &_fib_font_height, &_fib_font_ascent, NULL)) { - XFreeGC (dpy, _fib_gc); - XDestroyWindow (dpy, _fib_win); - _fib_win = 0; - return -1; - } - _fib_font_height += 3; - _fib_font_ascent += 2; - _fib_font_vsep = _fib_font_height + 2; - } - - populate_places (dpy); - - strcpy (_btn_ok.text, "Open"); - strcpy (_btn_cancel.text, "Cancel"); - strcpy (_btn_filter.text, "List All Files"); - strcpy (_btn_places.text, "Show Places"); - strcpy (_btn_hidden.text, "Show Hidden"); - - _btn_ok.callback = &cb_open; - _btn_cancel.callback = &cb_cancel; - _btn_filter.callback = &cb_filter; - _btn_places.callback = &cb_places; - _btn_hidden.callback = &cb_hidden; - _btn_filter.flags |= 4; - _btn_places.flags |= 4; - _btn_hidden.flags |= 4; - - if (!_fib_filter_function) { - _btn_filter.flags |= 8; - } - - size_t i; - int btncnt = 0; - _btn_w = 0; - _btn_span = 0; - for (i = 0; i < sizeof(_btns) / sizeof(FibButton*); ++i) { - if (_btns[i]->flags & 8) { continue; } - query_font_geometry (dpy, _fib_gc, _btns[i]->text, &_btns[i]->tw, NULL, NULL, NULL); - if (_btns[i]->flags & 4) { - _btn_span += _btns[i]->tw + _fib_font_ascent + TEXTSEP; - } else { - ++btncnt; - if (_btns[i]->tw > _btn_w) - _btn_w = _btns[i]->tw; - } - } - - _btn_w += BTNPADDING + BTNPADDING + TEXTSEP + TEXTSEP + TEXTSEP; - _btn_span += _btn_w * btncnt + DSEP * (i - 1) + FAREAMRGR + FAREAMRGB; - - for (i = 0; i < sizeof(_btns) / sizeof(FibButton*); ++i) { - if (_btns[i]->flags & 8) { continue; } - if (_btns[i]->flags & 4) { - _btns[i]->xw = _btns[i]->tw + _fib_font_ascent + TEXTSEP; - } else { - _btns[i]->xw = _btn_w; - } - } - - sync_button_states () ; - - _fib_height = _fib_font_vsep * (15.8); - _fib_width = MAX (_btn_span, 440); - - XResizeWindow (dpy, _fib_win, _fib_width, _fib_height); - - XTextProperty x_wname, x_iname; - XSizeHints hints; - XWMHints wmhints; - - hints.flags = PSize | PMinSize; - hints.min_width = _btn_span; - hints.min_height = 8 * _fib_font_vsep; - - char *w_name = & _fib_cfg_title[0]; - - wmhints.input = True; - wmhints.flags = InputHint; - if (XStringListToTextProperty (&w_name, 1, &x_wname) && - XStringListToTextProperty (&w_name, 1, &x_iname)) - { - XSetWMProperties (dpy, _fib_win, &x_wname, &x_iname, NULL, 0, &hints, &wmhints, NULL); - XFree (x_wname.value); - XFree (x_iname.value); - } - - XSetWindowBackground (dpy, _fib_win, _c_gray1.pixel); - - _fib_mapped = 0; - XMapRaised (dpy, _fib_win); - - if (!strlen (_cur_path) || !fib_opendir (dpy, _cur_path, NULL)) { - fib_opendir (dpy, getenv ("HOME") ? getenv ("HOME") : "/", NULL); - } - -#if 0 - XGrabPointer (dpy, _fib_win, True, - ButtonReleaseMask | ButtonPressMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | StructureNotifyMask, - GrabModeAsync, GrabModeAsync, None, None, CurrentTime); - XGrabKeyboard (dpy, _fib_win, True, GrabModeAsync, GrabModeAsync, CurrentTime); - //XSetInputFocus (dpy, parent, RevertToNone, CurrentTime); -#endif - _recentlock = 1; - return 0; -} - -void x_fib_close (Display *dpy) { - if (!_fib_win) return; - XFreeGC (dpy, _fib_gc); - XDestroyWindow (dpy, _fib_win); - _fib_win = 0; - free (_dirlist); - _dirlist = NULL; - free (_pathbtn); - _pathbtn = NULL; - if (_fibfont != None) XUnloadFont (dpy, _fibfont); - _fibfont = None; - free (_placelist); - _placelist = NULL; - _dircount = 0; - _pathparts = 0; - _placecnt = 0; - if (_pixbuffer != None) XFreePixmap (dpy, _pixbuffer); - _pixbuffer = None; - Colormap colormap = DefaultColormap (dpy, DefaultScreen (dpy)); - XFreeColors (dpy, colormap, &_c_gray0.pixel, 1, 0); - XFreeColors (dpy, colormap, &_c_gray1.pixel, 1, 0); - XFreeColors (dpy, colormap, &_c_gray2.pixel, 1, 0); - XFreeColors (dpy, colormap, &_c_gray3.pixel, 1, 0); - XFreeColors (dpy, colormap, &_c_gray4.pixel, 1, 0); - XFreeColors (dpy, colormap, &_c_gray5.pixel, 1, 0); - XFreeColors (dpy, colormap, &_c_gray6.pixel, 1, 0); - _recentlock = 0; -} - -int x_fib_handle_events (Display *dpy, XEvent *event) { - if (!_fib_win) return 0; - if (_status) return 0; - if (event->xany.window != _fib_win) { - return 0; - } - - switch (event->type) { - case MapNotify: - _fib_mapped = 1; - break; - case UnmapNotify: - _fib_mapped = 0; - break; - case LeaveNotify: - fib_update_hover (dpy, 1, 0, 0); - break; - case ClientMessage: - if (!strcmp (XGetAtomName (dpy, event->xclient.message_type), "WM_PROTOCOLS")) { - _status = -1; - } - break; - case ConfigureNotify: - if ( - (event->xconfigure.width > 1 && event->xconfigure.height > 1) - && - (event->xconfigure.width != _fib_width || event->xconfigure.height != _fib_height) - ) - { - _fib_width = event->xconfigure.width; - _fib_height = event->xconfigure.height; - _fib_resized = 1; - } - break; - case Expose: - if (event->xexpose.count == 0) { - fib_expose (dpy, event->xany.window); - } - break; - case MotionNotify: - fib_motion (dpy, event->xmotion.x, event->xmotion.y); - if (event->xmotion.is_hint == NotifyHint) { - XGetMotionEvents (dpy, event->xany.window, CurrentTime, CurrentTime, NULL); - } - break; - case ButtonPress: - fib_mousedown (dpy, event->xbutton.x, event->xbutton.y, event->xbutton.button, event->xbutton.time); - break; - case ButtonRelease: - fib_mouseup (dpy, event->xbutton.x, event->xbutton.y, event->xbutton.button, event->xbutton.time); - break; - case KeyRelease: - break; - case KeyPress: - { - KeySym key; - char buf[100]; - static XComposeStatus stat; - XLookupString (&event->xkey, buf, sizeof(buf), &key, &stat); - switch (key) { - case XK_Escape: - _status = -1; - break; - case XK_Up: - if (_fsel > 0) { - fib_select (dpy, _fsel - 1); - } - break; - case XK_Down: - if (_fsel < _dircount -1) { - fib_select ( dpy, _fsel + 1); - } - break; - case XK_Page_Up: - if (_fsel > 0) { - int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; - if (llen < 1) llen = 1; else --llen; - int fs = MAX (0, _fsel - llen); - fib_select ( dpy, fs); - } - break; - case XK_Page_Down: - if (_fsel < _dircount) { - int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; - if (llen < 1) llen = 1; else --llen; - int fs = MIN (_dircount - 1, _fsel + llen); - fib_select ( dpy, fs); - } - break; - case XK_Left: - if (_pathparts > 1) { - int i = 0; - char path[1024] = "/"; - while (++i < _pathparts - 1) { - strcat (path, _pathbtn[i].name); - strcat (path, "/"); - } - char *sel = strdup (_pathbtn[_pathparts-1].name); - fib_opendir (dpy, path, sel); - free (sel); - } - break; - case XK_Right: - if (_fsel >= 0 && _fsel < _dircount) { - if (_dirlist[_fsel].flags & 4) { - cb_open (dpy); - } - } - break; - case XK_Return: - cb_open (dpy); - break; - default: - if ((key >= XK_a && key <= XK_z) || (key >= XK_0 && key <= XK_9)) { - int i; - for (i = 0; i < _dircount; ++i) { - int j = (_fsel + i + 1) % _dircount; - char kcmp = _dirlist[j].name[0]; - if (kcmp > 0x40 && kcmp <= 0x5A) kcmp |= 0x20; - if (kcmp == (char)key) { - fib_select ( dpy, j); - break; - } - } - } - break; - } - } - break; - } - - if (_status) { - x_fib_close (dpy); - } - return _status; -} - -int x_fib_status () { - return _status; -} - -int x_fib_configure (int k, const char *v) { - if (_fib_win) { return -1; } - switch (k) { - case 0: - if (strlen (v) >= sizeof(_cur_path) -1) return -2; - if (strlen (v) < 1) return -2; - if (v[0] != '/') return -2; - if (strstr (v, "//")) return -2; - strncpy (_cur_path, v, sizeof(_cur_path)); - break; - case 1: - if (strlen (v) >= sizeof(_fib_cfg_title) -1) return -2; - strncpy (_fib_cfg_title, v, sizeof(_fib_cfg_title)); - break; - case 2: - if (strlen (v) >= sizeof(_fib_cfg_custom_font) -1) return -2; - strncpy (_fib_cfg_custom_font, v, sizeof(_fib_cfg_custom_font)); - break; - case 3: - if (strlen (v) >= sizeof(_fib_cfg_custom_places) -1) return -2; - strncpy (_fib_cfg_custom_places, v, sizeof(_fib_cfg_custom_places)); - break; - default: - return -2; - } - return 0; -} - -int x_fib_cfg_buttons (int k, int v) { - if (_fib_win) { return -1; } - switch (k) { - case 1: - if (v < 0) { - _btn_hidden.flags |= 8; - } else { - _btn_hidden.flags &= ~8; - } - if (v == 1) { - _btn_hidden.flags |= 2; - _fib_hidden_fn = 1; - } else if (v == 0) { - _btn_hidden.flags &= 2; - _fib_hidden_fn = 0; - } - break; - case 2: - if (v < 0) { - _btn_places.flags |= 8; - } else { - _btn_places.flags &= ~8; - } - if (v == 1) { - _btn_places.flags |= 2; - _fib_show_places = 1; - } else if (v == 0) { - _btn_places.flags &= ~2; - _fib_show_places = 0; - } - break; - case 3: - // NB. filter button is automatically hidden - // IFF the filter-function is NULL. - if (v < 0) { - _btn_filter.flags |= 8; - } else { - _btn_filter.flags &= ~8; - } - if (v == 1) { - _btn_filter.flags &= ~2; // inverse - 'show all' = !filter - _fib_filter_fn = 1; - } else if (v == 0) { - _btn_filter.flags |= 2; - _fib_filter_fn = 0; - } - break; - default: - return -2; - } - return 0; -} - -int x_fib_cfg_filter_callback (int (*cb)(const char*)) { - if (_fib_win) { return -1; } - _fib_filter_function = cb; - return 0; -} - -char *x_fib_filename () { - if (_status > 0 && !_fib_win) - return strdup (_rv_open); - else - return NULL; -} -#endif // HAVE_X11 - - -/* example usage */ -#ifdef SOFD_TEST - -static int fib_filter_movie_filename (const char *name) { - if (!_fib_filter_fn) return 1; - const int l3 = strlen (name) - 3; - const int l4 = l3 - 1; - const int l5 = l4 - 1; - const int l6 = l5 - 1; - const int l9 = l6 - 3; - if ( - (l4 > 0 && ( - !strcasecmp (&name[l4], ".avi") - || !strcasecmp (&name[l4], ".mov") - || !strcasecmp (&name[l4], ".ogg") - || !strcasecmp (&name[l4], ".ogv") - || !strcasecmp (&name[l4], ".mpg") - || !strcasecmp (&name[l4], ".mov") - || !strcasecmp (&name[l4], ".mp4") - || !strcasecmp (&name[l4], ".mkv") - || !strcasecmp (&name[l4], ".vob") - || !strcasecmp (&name[l4], ".asf") - || !strcasecmp (&name[l4], ".avs") - || !strcasecmp (&name[l4], ".dts") - || !strcasecmp (&name[l4], ".flv") - || !strcasecmp (&name[l4], ".m4v") - )) || - (l5 > 0 && ( - !strcasecmp (&name[l5], ".h264") - || !strcasecmp (&name[l5], ".webm") - )) || - (l6 > 0 && ( - !strcasecmp (&name[l6], ".dirac") - )) || - (l9 > 0 && ( - !strcasecmp (&name[l9], ".matroska") - )) || - (l3 > 0 && ( - !strcasecmp (&name[l3], ".dv") - || !strcasecmp (&name[l3], ".ts") - )) - ) - { - return 1; - } - return 0; -} - -int main (int argc, char **argv) { - Display* dpy = XOpenDisplay (0); - if (!dpy) return -1; - - x_fib_cfg_filter_callback (fib_filter_movie_filename); - x_fib_configure (1, "Open Movie File"); - x_fib_load_recent ("/tmp/sofd.recent"); - x_fib_show (dpy, 0, 300, 300); - - while (1) { - XEvent event; - while (XPending (dpy) > 0) { - XNextEvent (dpy, &event); - if (x_fib_handle_events (dpy, &event)) { - if (x_fib_status () > 0) { - char *fn = x_fib_filename (); - printf ("OPEN '%s'\n", fn); - x_fib_add_recent (fn, time (NULL)); - free (fn); - } - } - } - if (x_fib_status ()) { - break; - } - usleep (80000); - } - x_fib_close (dpy); - - x_fib_save_recent ("/tmp/sofd.recent"); - - x_fib_free_recent (); - XCloseDisplay (dpy); - return 0; -} -#endif diff --git a/contrib/libsofd.h b/contrib/libsofd.h deleted file mode 100644 index 2abf788..0000000 --- a/contrib/libsofd.h +++ /dev/null @@ -1,194 +0,0 @@ -/* libSOFD - Simple Open File Dialog [for X11 without toolkit] - * - * Copyright (C) 2014 Robin Gareus - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in 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: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the 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 - * AUTHORS 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 IN - * THE SOFTWARE. - */ - -#ifndef LIBSOFD_H -#define LIBSOFD_H 1 - -#ifdef HAVE_X11 -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/////////////////////////////////////////////////////////////////////////////// -/* public API */ - -/** open a file select dialog - * @param dpy X Display connection - * @param parent (optional) if not NULL, become transient for given window - * @param x if >0 set explict initial width of the window - * @param y if >0 set explict initial height of the window - * @return 0 on success - */ -int x_fib_show (Display *dpy, Window parent, int x, int y); - -/** force close the dialog. - * This is normally not needed, the dialog closes itself - * when a file is selected or the user cancels selection. - * @param dpy X Display connection - */ -void x_fib_close (Display *dpy); - -/** non-blocking X11 event handler. - * It is safe to run this function even if the dialog is - * closed or was not initialized. - * - * @param dpy X Display connection - * @param event the XEvent to process - * @return status - * 0: the event was not for this window, or file-dialog still - * active, or the dialog window is not displayed. - * >0: file was selected, dialog closed - * <0: file selection was cancelled. - */ -int x_fib_handle_events (Display *dpy, XEvent *event); - -/** last status of the dialog - * @return >0: file was selected, <0: canceled or inactive. 0: active - */ -int x_fib_status (); - -/** query the selected filename - * @return NULL if none set, or allocated string to be free()ed by the called - */ -char *x_fib_filename (); - -/** customize/configure the dialog before calling \ref x_fib_show - * changes only have any effect if the dialog is not visible. - * @param k key to change - * 0: set current dir to display (must end with slash) - * 1: set title of dialog window - * 2: specify a custom X11 font to use - * 3: specify a custom 'places' file to include - * (following gtk-bookmark convention) - * @param v value - * @return 0 on success. - */ -int x_fib_configure (int k, const char *v); - -/** customize/configure the dialog before calling \ref x_fib_show - * changes only have any effect if the dialog is not visible. - * - * @param k button to change: - * 1: show hidden files - * 2: show places - * 3: show filter/list all (automatically hidden if there is no - * filter function) - * @param v <0 to hide the button >=0 show button, - * 0: set button-state to not-checked - * 1: set button-state to checked - * >1: retain current state - * @return 0 on success. - */ -int x_fib_cfg_buttons (int k, int v); - -/** set custom callback to filter file-names. - * NULL will disable the filter and hide the 'show all' button. - * changes only have any effect if the dialog is not visible. - * - * @param cb callback function to check file - * the callback function is called with the file name (basename only) - * and is expected to return 1 if the file passes the filter - * and 0 if the file should not be listed by default. - * @return 0 on success. - */ -int x_fib_cfg_filter_callback (int (*cb)(const char*)); - -#ifdef __cplusplus -} -#endif - -#endif /* END X11 specific functions */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* 'recently used' API. x-platform - * NOTE: all functions use a static cache and are not reentrant. - * It is expected that none of these functions are called in - * parallel from different threads. - */ - -/** release static resources of 'recently used files' - */ -void x_fib_free_recent (); - -/** add an entry to the recently used list - * - * The dialog does not add files automatically on open, - * if the application succeeds to open a selected file, - * this function should be called. - * - * @param path complete path to file - * @param atime time of last use, 0: NOW - * @return -1 on error, number of current entries otherwise - */ -int x_fib_add_recent (const char *path, time_t atime); - -/** get a platform specific path to a good location for - * saving the recently used file list. - * (follows XDG_DATA_HOME on Unix, and CSIDL_LOCAL_APPDATA spec) - * - * @param application-name to use to include in file - * @return pointer to static path or NULL - */ -const char *x_fib_recent_file(const char *appname); - -/** save the current list of recently used files to the given filename - * (the format is one file per line, filename URL encoded and space separated - * with last-used timestamp) - * - * This function tries to creates the containing directory if it does - * not exist. - * - * @param fn file to save the list to - * @return 0: on success - */ -int x_fib_save_recent (const char *fn); - -/** load a recently used file list. - * - * @param fn file to load the list from - * @return 0: on success - */ -int x_fib_load_recent (const char *fn); - -/** get number of entries in the current list - * @return number of entries in the recently used list - */ -unsigned int x_fib_recent_count (); - -/** get recently used entry at given position - * - * @param i entry to query - * @return pointer to static string - */ -const char *x_fib_recent_at (unsigned int i); - -#ifdef __cplusplus -} -#endif - -#endif // header guard diff --git a/contrib/mii-icon-64.h b/contrib/mii-icon-64.h new file mode 100644 index 0000000..7af920c --- /dev/null +++ b/contrib/mii-icon-64.h @@ -0,0 +1,580 @@ +/* this file is auto-generated by icon-convert-tcc.c */ +static const unsigned long mii_icon64[] = { + 64,64, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x01000000, + 0x01000000, 0x039e9ea1, 0x04bebfc1, 0x04c9cacd, 0x04c9cacd, 0x05ccced0, 0x05ccced0, 0x05cfcfd1, + 0x05d0d1d3, 0x06d2d3d6, 0x06d3d4d6, 0x06d2d3d6, 0x06d4d5d7, 0x0778a88e, 0x07499b67, 0x07499b67, + 0x07499b67, 0x07499b67, 0x07499b67, 0x074a9b67, 0x06499b65, 0x064a9c65, 0x064a9c64, 0x064a9c63, + 0x064a9b61, 0x064a9c5f, 0x064b9d5e, 0x054b9c5d, 0x054b9c5c, 0x054c9c55, 0x044d9a48, 0x01000000, + 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x2ff1f3f7, 0x7bf4f6fa, 0xaff4f7fb, 0xd0f4f7fb, 0xf2f5f7fb, + 0xfdf5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, + 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xffc2ddc8, 0xff5fba4f, 0xff60ba4e, + 0xff60ba4e, 0xff60ba4e, 0xff60ba4e, 0xff60ba4e, 0xff60ba4e, 0xff60ba4e, 0xff60ba4e, 0xff60ba4e, + 0xff60ba4e, 0xff60ba4e, 0xff60ba4e, 0xff60ba4e, 0xff60ba4e, 0xff60ba4e, 0xff60ba4f, 0xfe5fba52, + 0xf65fba53, 0xd35fba52, 0xb15eb955, 0x7c5db85c, 0x315ab663, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x51f3f5f9, 0xcef5f7fb, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, + 0xfff5f7fb, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f7fb, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, + 0xfff5f8fc, 0xfff5f7fb, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f7fb, 0xfff1f5f7, 0xff70be68, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff60bb4b, 0xcd5eb954, 0x515bb75f, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x13edeff3, + 0xb4f4f7fb, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, + 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, + 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f8fc, 0xffbad9be, 0xff61bb47, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff60bb49, 0xb25db959, + 0x1358b361, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x20eef1f4, 0xdff5f7fb, + 0xfff5f8fc, 0xfff5f8fc, 0xfff5f7fb, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f7fb, 0xfff5f8fc, 0xfff5f8fc, + 0xfff5f7fb, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f7fb, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f7fb, 0xfff5f8fc, + 0xfff5f8fc, 0xfff5f7fb, 0xfff5f8fc, 0xfff5f8fc, 0xfff5f7fb, 0xfff5f8fc, 0xffecf3f2, 0xff61ba52, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xdd5eb953, 0x1f59b465, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x14eaecf0, 0xdff5f7fb, 0xfff5f7fb, + 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, + 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, + 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f8fb, 0xffa2cfa3, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xdd5eb954, 0x1256b062, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x01000000, 0xb4f4f6fa, 0xfff5f7fb, 0xfff5f7fb, + 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, + 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, + 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xfff5f7fb, 0xffd6e6dc, + 0xff60bb48, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xb05db858, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x4feff1f5, 0xfff5f7fa, 0xfff5f7fb, 0xfff4f7fa, + 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fb, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fb, 0xfff5f7fa, 0xfff5f7fb, + 0xfff4f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fb, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fb, 0xfff5f7fa, + 0xfff5f7fb, 0xfff4f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fb, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, + 0xff75bf6e, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff60bb4a, 0x4959b460, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x01000000, 0xccf3f5f9, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, + 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f6fa, 0xfff5f7fa, 0xfff5f7fa, + 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f6fa, 0xfff5f7fa, + 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, 0xfff5f7fa, + 0xffb3d6b5, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xff61bb46, + 0xff61bb46, 0xff61bb46, 0xff61bb46, 0xc85db854, 0x01000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x2ce8e9ed, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff4f6fa, + 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, + 0xfff4f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, + 0xfff5f6fa, 0xfff4f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, 0xfff5f6fa, + 0xffdbe9e1, 0xff60ba49, 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, + 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, + 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff61bb47, + 0xff61bb47, 0xff61bb47, 0xff61bb47, 0xff60ba4c, 0x2854ae62, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x76f0f1f4, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, + 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, + 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, + 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, + 0xfff5f6f9, 0xffc8b863, 0xffcbb440, 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, + 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, + 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb540, + 0xffccb540, 0xffccb540, 0xffccb540, 0xffccb541, 0x70cdaf48, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x01000000, 0xa7f1f2f5, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, + 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, + 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, + 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, 0xfff5f6f9, + 0xfff5f6f9, 0xfffad0a0, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xa2f9b325, 0x01000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x02000000, 0xcef2f3f6, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f8, + 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, + 0xfff4f5f8, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, + 0xfff4f5f9, 0xfff4f5f8, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, 0xfff4f5f9, + 0xfff4f5f9, 0xfff8e3d0, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xcafbb425, 0x02000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x04000000, 0xdef2f3f6, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff6f2f0, 0xfffcb625, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xd7fab425, 0x03000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x05000000, 0xeff2f3f6, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff5f5f8, 0xfffbc376, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xe6fbb526, 0x05000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x07000000, 0xf8f3f4f7, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, 0xfff4f5f8, + 0xfff4f5f8, 0xfff4f5f8, 0xfff9d4ad, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xf3fcb525, 0x06000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x07000000, 0xfdf3f5f7, 0xfff3f4f7, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f4f7, + 0xfff4f5f8, 0xfff3f5f8, 0xfff3f4f7, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f4f7, 0xfff3f5f8, 0xfff3f5f8, + 0xfff3f4f7, 0xfff4f5f8, 0xfff3f5f8, 0xfff3f4f7, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f4f7, 0xfff3f5f8, + 0xfff3f5f8, 0xfff3f4f7, 0xfff4f5f8, 0xfff3f5f8, 0xfff3f4f7, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f4f7, + 0xfff3f5f8, 0xfff3f5f8, 0xfff7e2cf, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb726, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xf9fcb526, 0x06000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f5f7, + 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f5f8, + 0xfff3f5f7, 0xfff3f5f7, 0xffe7e8eb, 0xff88898a, 0xff939496, 0xffeeeff2, 0xfff3f5f8, 0xfff3f5f8, + 0xfff3f5f8, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f5f8, 0xfff3f5f8, + 0xfff3f5f8, 0xfff3f5f8, 0xfff5efea, 0xfffcb726, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xffc58919, 0xff82540b, 0xffd7981d, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfcfdb626, 0x07000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff3f5f8, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, + 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, + 0xfff3f5f7, 0xfff3f5f7, 0xffc9cbcd, 0xff616162, 0xff616162, 0xffd9dbdd, 0xfff3f5f7, 0xfff3f5f7, + 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, 0xfff3f5f7, + 0xfff3f5f7, 0xfff3f5f7, 0xfff4f6f8, 0xfffbbb53, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb726, 0xff784a0b, 0xff653b08, 0xff9d6912, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, + 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb827, 0xfffdb626, 0x07000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, + 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, + 0xfff3f4f7, 0xfff3f4f7, 0xffc9cbcd, 0xff616162, 0xff616162, 0xffd7d9db, 0xfff3f4f7, 0xfff3f4f7, + 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, + 0xfff3f4f7, 0xfff3f4f7, 0xfff3f4f7, 0xfff9c88d, 0xfffdb626, 0xfffdb626, 0xfffdb626, 0xfffdb626, + 0xfffdb626, 0xfffdb626, 0xfffdb626, 0xfffdb425, 0xfe76460f, 0xfe65370d, 0xfe9a6414, 0xfffdb525, + 0xfffdb626, 0xfffdb626, 0xfffdb626, 0xfffdb626, 0xfffdb626, 0xfffdb626, 0xfffdb626, 0xfffdb626, + 0xfffdb626, 0xfffdb626, 0xfffdb626, 0xfffdb626, 0xfffdb424, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff3f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, + 0xfff3f4f7, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, + 0xfff2f4f6, 0xfff3f4f7, 0xffc9cacc, 0xff606162, 0xff606162, 0xffd7d9db, 0xfff2f4f6, 0xfff2f4f6, + 0xfff2f4f6, 0xfff2f4f6, 0xfff3f4f7, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, + 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2bcb3, 0xfff86c3f, 0xfffd6e41, 0xfffe6e42, 0xfffe6e42, + 0xfffe6e42, 0xfffe6e42, 0xfffe6e42, 0xfffe6e42, 0xfe723618, 0xfe653113, 0xfe974425, 0xfffe6e42, + 0xfffe6e42, 0xfffe6e42, 0xfffe6e42, 0xfffe6e42, 0xfffe6e42, 0xfffe6e42, 0xfffe6e42, 0xfffe6e42, + 0xfffe6e42, 0xfffe6e42, 0xfffe6e42, 0xfffe6e42, 0xfffe6e43, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, + 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, + 0xfff2f4f6, 0xfff2f4f6, 0xffc9cacc, 0xff606162, 0xff606162, 0xffd7d8da, 0xfff2f4f6, 0xfff2f4f6, + 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, + 0xfff2f4f6, 0xfff2f4f6, 0xfff2f4f6, 0xfff2cdcb, 0xfff56240, 0xfffd6542, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6744, 0xff72311c, 0xff652c17, 0xff973f27, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6745, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff2f3f6, 0xfff2f3f6, 0xfff2f3f6, 0xfff2f3f6, 0xfff2f3f6, + 0xfff2f4f6, 0xfff2f3f6, 0xfff2f3f6, 0xfff2f4f6, 0xfff2f3f6, 0xfff2f3f6, 0xfff2f3f6, 0xfff2f3f6, + 0xfff2f3f6, 0xfff2f4f6, 0xffd1d2d4, 0xff606162, 0xff606162, 0xffe1e3e5, 0xfff2f3f6, 0xfff2f3f6, + 0xfff2f3f6, 0xfff2f3f6, 0xfff2f4f6, 0xfff2f3f6, 0xfff2f3f6, 0xfff2f4f6, 0xfff2f3f6, 0xfff2f3f6, + 0xfff2f3f6, 0xfff2f3f6, 0xfff2f3f6, 0xfff3e0e0, 0xfff36140, 0xfffc6542, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xff8d3c27, 0xff65291a, 0xffac4931, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6745, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, + 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, + 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xffd2d3d5, 0xffd8d9db, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, + 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, + 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff4eff0, 0xfff0603f, 0xfffb6442, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfff16646, 0xffd35d42, 0xfff86847, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6745, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff2f3f5, 0xfff1f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, + 0xfff2f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff1f3f5, 0xfff1f3f5, 0xfff2f3f5, + 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff1f3f5, 0xfff1f3f5, + 0xfff2f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff2f3f5, 0xfff1f3f5, + 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, 0xfff3f5f6, 0xffef6b51, 0xfffa6441, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6745, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff2f3f5, 0xfff1f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, + 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, 0xfff1f3f5, 0xfff2f3f5, + 0xfff1f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, 0xfff1f3f5, + 0xfff2f3f5, 0xfff1f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, + 0xfff1f3f5, 0xfff2f3f5, 0xfff1f3f5, 0xfff2f3f5, 0xfff08f82, 0xfff96441, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6745, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff1f2f5, 0xfff1f2f4, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f4, + 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f4, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f4, 0xfff1f2f5, 0xfff1f2f5, + 0xfff1f2f4, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f4, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f4, 0xfff1f2f5, + 0xfff1f2f5, 0xfff1f2f4, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f4, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f4, + 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f4, 0xfff2f3f5, 0xffef9f95, 0xfff86341, 0xfffd6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6745, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, + 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, + 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, + 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, + 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff1f2f5, 0xfff0b1ab, 0xfff66340, 0xfffd6542, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6745, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, + 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, + 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, + 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, + 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xffefbab5, 0xfff56240, 0xfffd6542, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, + 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6643, 0xfffe6745, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff1f2f4, 0xfff1f1f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f1f4, + 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f1f4, 0xfff1f2f4, 0xfff1f2f4, + 0xfff1f1f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f1f4, 0xfff1f2f4, + 0xfff1f2f4, 0xfff1f1f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f2f4, 0xfff1f1f4, + 0xfff1f2f4, 0xfff1f2f4, 0xfff1f1f4, 0xfff1f2f4, 0xfeedc8c6, 0xfdeb5a41, 0xfdf35e43, 0xfdf55f44, + 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, + 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, + 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfdf55f44, 0xfef56046, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff1f1f4, 0xfff1f1f3, 0xfff1f1f4, 0xfff1f1f3, 0xfff1f1f4, + 0xfff1f1f4, 0xfff1f1f4, 0xfff1f1f3, 0xfff1f1f4, 0xfff1f1f4, 0xfff1f1f3, 0xfff1f1f4, 0xfff1f1f3, + 0xfff1f1f4, 0xfff1f1f4, 0xfff1f1f4, 0xfff1f1f3, 0xfff1f1f4, 0xfff1f1f4, 0xfff1f1f3, 0xfff1f1f4, + 0xfff1f1f3, 0xfff1f1f4, 0xfff1f1f4, 0xfff1f1f4, 0xfff1f1f3, 0xfff1f1f4, 0xfff1f1f4, 0xfff1f1f3, + 0xfff1f1f4, 0xfff1f1f3, 0xfff1f1f4, 0xfff1f1f4, 0xffe0c5c8, 0xffc6313f, 0xffce3341, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03644, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, + 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, + 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, + 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, + 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xffe5cfd1, 0xffc5313e, 0xffcd3341, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03644, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff0f1f3, 0xfff1f1f3, + 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff0f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff0f1f3, + 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff0f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, + 0xfff0f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xfff0f1f3, 0xfff1f1f3, 0xfff1f1f3, + 0xfff1f1f3, 0xfff0f1f3, 0xfff1f1f3, 0xfff1f1f3, 0xffe5d0d2, 0xffc4313e, 0xffcd3341, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03644, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, + 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, + 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, + 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, + 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff1f2f3, 0xffd09da0, 0xffc4313e, 0xffcd3341, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xfed03644, 0x08000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, + 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, + 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, + 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff1f2f3, 0xffc9a8aa, 0xffbb898c, 0xffb98587, 0xffb88386, + 0xffb88386, 0xffb88285, 0xffb87e81, 0xffb6696e, 0xffb62d39, 0xffc5313e, 0xffcd3341, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xfcd03644, 0x07000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, + 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, + 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, + 0xfff0f1f2, 0xfff0f1f2, 0xfff0f1f2, 0xfff2f1f2, 0xffa42934, 0xffa72935, 0xffa82a35, 0xffa82a35, + 0xffa82a35, 0xffa82a35, 0xffaa2a36, 0xffb12c38, 0xffbc2f3b, 0xffc8313f, 0xffce3341, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xfbd03644, 0x07000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfff0f0f1, 0xffeff0f1, 0xffeff0f1, 0xfff0f0f1, 0xffeff0f1, + 0xfff0f0f1, 0xffeff0f1, 0xfff0f0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xfff0f0f1, + 0xffeff0f1, 0xfff0f0f1, 0xffeff0f1, 0xfff0f0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, + 0xfff0f0f1, 0xffeff0f1, 0xfff0f0f1, 0xfff2f2f3, 0xffae2b37, 0xffb52d39, 0xffb82e3a, 0xffb82e3a, + 0xffb82e3a, 0xffb82e3a, 0xffba2e3b, 0xffbe2f3c, 0xffc5313e, 0xffcb3240, 0xffcf3341, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xfad03644, 0x07000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, + 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffe4e5e6, + 0xffedeeef, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, + 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xfff2f3f4, 0xffb92f3b, 0xffc3303d, 0xffc6313f, 0xffc7313f, + 0xffc7313f, 0xffc7313f, 0xffc8313f, 0xffca323f, 0xffcc3340, 0xffce3341, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffcf3442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, + 0xffd03442, 0xffd03442, 0xffd03442, 0xffd03442, 0xf8d03643, 0x07000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, + 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffdadbdc, 0xff626363, + 0xff919292, 0xffebeced, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, + 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xfff2f2f4, 0xffbe3241, 0xffc83245, 0xffcc3347, 0xffcc3347, + 0xffcc3347, 0xffcc3347, 0xffcd3348, 0xffcd3448, 0xffcd3448, 0xffce3448, 0xffce3448, 0xffce3448, + 0xffce3448, 0xffce3448, 0xffce3448, 0xffce3448, 0xffce3448, 0xffce3448, 0xffce3448, 0xffce3446, + 0xfe892439, 0xfe461832, 0xffb83145, 0xffce3549, 0xffce3549, 0xffce3549, 0xffce3549, 0xffce3549, + 0xffce3549, 0xffce3549, 0xffce3549, 0xffce3549, 0xf7cd384c, 0x07000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffefeff1, + 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, 0xffefeff1, 0xffeff0f1, 0xffeff0f1, 0xffe3e3e5, 0xff6a6b6b, + 0xff5f5f60, 0xff949495, 0xffeaebec, 0xffeff0f1, 0xffefeff1, 0xffeff0f1, 0xffeff0f1, 0xffeff0f1, + 0xffeff0f1, 0xffefeff1, 0xffeff0f1, 0xfff2f2f3, 0xff933e9a, 0xff953d98, 0xff953d98, 0xff953d98, + 0xff953d98, 0xff953d98, 0xff953d98, 0xff953d98, 0xff953d98, 0xff953d98, 0xff953d98, 0xff953d98, + 0xff953d98, 0xff953d98, 0xff953d98, 0xff953d98, 0xff953d98, 0xff953d98, 0xff943d99, 0xfe672d75, + 0xfe36193d, 0xfe391c41, 0xff823f8f, 0xff953f99, 0xff953f99, 0xff953f99, 0xff953f99, 0xff953f99, + 0xff953f99, 0xff953f99, 0xff953f99, 0xff953f99, 0xfd92449d, 0x07000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xffefeff1, 0xffeeeff0, 0xffefeff1, 0xffefeff1, 0xffefeff1, + 0xffefeff1, 0xffefeff1, 0xffefeff1, 0xffefeff1, 0xffefeff1, 0xffeeeff0, 0xffefeff1, 0xffd6d6d7, + 0xff686969, 0xff5f5f60, 0xff878788, 0xffe2e2e4, 0xffefeff1, 0xffefeff1, 0xffeeeff0, 0xffefeff1, + 0xffefeff1, 0xffefeff1, 0xffefeff1, 0xfff2f2f3, 0xff953d98, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff933c96, 0xff632b70, 0xfe2e1b49, + 0xfe321e4c, 0xff783a85, 0xff963e98, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xfe944099, 0x07000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, + 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, + 0xffd6d7d8, 0xff6d6e6e, 0xff5f5f60, 0xff6c6c6d, 0xffc4c4c5, 0xffeeeef0, 0xffeeeff0, 0xffeeeff0, + 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xfff0eff1, 0xff953d98, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff86388e, 0xff4d2564, 0xff281c4f, 0xff332055, + 0xff7a3b89, 0xff963e98, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xfe944099, 0x07000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x08000000, 0xfdeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, + 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, + 0xffeeeff0, 0xffe0e1e2, 0xff868787, 0xff5f5f60, 0xff5f5f60, 0xff888889, 0xffcdcdce, 0xffedeeef, + 0xffeeeff0, 0xffeeeff0, 0xffeeeff0, 0xffeae8ed, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff8a3991, 0xff632c74, 0xff2e1d54, 0xff261c51, 0xff442863, 0xff843e90, + 0xff963e97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xfd953f99, 0x07000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x07000000, 0xf9edeeef, 0xffeeeeef, 0xffeeeef0, 0xffeeeef0, 0xffeeeeef, + 0xffeeeef0, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeef0, 0xffeeeef0, + 0xffeeeeef, 0xffeeeef0, 0xffebeced, 0xffb7b7b8, 0xff666667, 0xff5f5f5f, 0xff5f5f5f, 0xff7a7a7a, + 0xffb4b5b6, 0xffd6d6d8, 0xffededef, 0xffe2dde5, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff953d98, 0xff8e3b93, + 0xff7a3485, 0xff58296d, 0xff2e1d55, 0xff261c52, 0xff302057, 0xff67357c, 0xff904097, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xfb93429a, 0x06000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x07000000, 0xf0ececed, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, + 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, + 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffe2e2e3, 0xffababab, 0xff676767, 0xff5f5f5f, + 0xff5e5e5f, 0xff5a5a5e, 0xff5b5a64, 0xff7f7888, 0xff71377d, 0xff7a3584, 0xff7f3688, 0xff82368a, + 0xff85378b, 0xff83378a, 0xff803688, 0xff7a3485, 0xff70307d, 0xff612b73, 0xff492464, 0xff2f1e56, + 0xff261c52, 0xff261c52, 0xff332159, 0xff623378, 0xff893f93, 0xff963e98, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xe7934199, 0x06000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x06000000, 0xdfebebec, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, + 0xffeeeeef, 0xffeeeeef, 0xffedeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, + 0xffeeeeef, 0xffeeeeef, 0xffeeeeef, 0xffedeeef, 0xffeeeeef, 0xffeeeeef, 0xffe7e7e7, 0xffc0c0c1, + 0xff939394, 0xff5b5b5f, 0xff514f5b, 0xff444057, 0xff362f54, 0xff2c2352, 0xff281e51, 0xff271c52, + 0xff281c53, 0xff271c53, 0xff271c52, 0xff261c52, 0xff261c52, 0xff261c52, 0xff281d53, 0xff35225a, + 0xff552e6f, 0xff753985, 0xff8e4096, 0xff963e98, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xdb924098, 0x05000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x04000000, 0xd0eaeaeb, 0xffeeeeee, 0xffededee, 0xffeeeeee, 0xffededee, + 0xffeeeeee, 0xffededee, 0xffeeeeee, 0xffededee, 0xffededee, 0xffeeeeee, 0xffededee, 0xffeeeeee, + 0xffededee, 0xffeeeeee, 0xffededee, 0xffeeeeee, 0xffededee, 0xffededee, 0xffeeeeee, 0xffededee, + 0xffeeeeee, 0xffe8e8e9, 0xffd1d1d3, 0xffa196ad, 0xff6f3d80, 0xff623577, 0xff583071, 0xff532f70, + 0xff4f2b6b, 0xff532e6f, 0xff572f71, 0xff5e3175, 0xff6a357e, 0xff773986, 0xff853d8f, 0xff914098, + 0xff953e98, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, + 0xff963d97, 0xff963d97, 0xff963d97, 0xff963d97, 0xcf914199, 0x04000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x03000000, 0xace7e7e8, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, + 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, + 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, + 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffbfa8c6, 0xff953f98, 0xff953f98, 0xff954098, 0xff954099, + 0xff954099, 0xff954099, 0xff954098, 0xff954098, 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, + 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, + 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, + 0xff953f98, 0xff953f98, 0xff953f98, 0xff953f98, 0xa78e4398, 0x02000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x01000000, 0x7ee2e2e3, 0xffeeeeee, 0xffededee, 0xffeeeeee, 0xffededed, + 0xffeeeeee, 0xffeeeeee, 0xffededed, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffededee, 0xffeeeeee, + 0xffededed, 0xffeeeeee, 0xffeeeeee, 0xffededed, 0xffeeeeee, 0xffeeeeee, 0xffeeeeee, 0xffededee, + 0xffeeeeee, 0xffededed, 0xffeeeeee, 0xff8aacd9, 0xff4f8bcd, 0xff518acc, 0xff5289cc, 0xff5289cc, + 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, + 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, + 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, + 0xff5289cc, 0xff5289cc, 0xff5289cc, 0xff5289cc, 0x7a5b7abd, 0x01000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x38cbcbcb, 0xffedeeee, 0xffedeeee, 0xffeeeeee, 0xffedeeee, + 0xffeeeeee, 0xffedeeee, 0xffedeeee, 0xffedeeee, 0xffedeeee, 0xffedeeee, 0xffedeeee, 0xffeeeeee, + 0xffedeeee, 0xffeeeeee, 0xffedeeee, 0xffedeeee, 0xffedeeee, 0xffedeeee, 0xffedeeee, 0xffedeeee, + 0xffeeeeee, 0xffedeeee, 0xfff0f0f0, 0xff3da2dc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff129bdb, 0x343579b4, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x0b000000, 0xd3e9e9e9, 0xffededee, 0xffededee, 0xffededee, + 0xffededee, 0xffededee, 0xffededee, 0xffededee, 0xffededee, 0xffededee, 0xffededee, 0xffededee, + 0xffededee, 0xffededee, 0xffededee, 0xffededee, 0xffededee, 0xffededee, 0xffededee, 0xffededee, + 0xffededee, 0xffededee, 0xffe1e7ed, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xcf2295d4, 0x0a000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x03000000, 0x62d5d5d5, 0xffededed, 0xffededed, 0xffededed, + 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, + 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, + 0xffededed, 0xffededed, 0xffc7d8ea, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff099cdb, 0x5c2884c0, 0x02000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0e000000, 0xc0e5e5e6, 0xffededed, 0xffededed, + 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, + 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, 0xffededed, + 0xffededed, 0xffededed, 0xffa5c6e5, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff019ddc, 0xbd2093d2, 0x0d000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02000000, 0x2ca4a4a4, 0xe5eaeaea, 0xffececec, + 0xffededed, 0xffededed, 0xffececec, 0xffeceded, 0xffececed, 0xffececec, 0xffececed, 0xffeceded, + 0xffececec, 0xffededed, 0xffededed, 0xffececec, 0xffeceded, 0xffececed, 0xffececec, 0xffececed, + 0xffeceded, 0xffeeeeee, 0xff66acdf, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xe41798d8, 0x29216392, 0x02000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x06000000, 0x3cb1b1b1, 0xe6eaeaea, + 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, + 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, + 0xffececec, 0xffe3e8ed, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xe51598d8, 0x391d6ea2, 0x05000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x07000000, 0x339f9f9f, + 0xc4e4e4e4, 0xffededed, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, + 0xffececec, 0xffececec, 0xffededed, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, + 0xffececec, 0xffbbd1e7, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff039ddc, 0xc31994d3, + 0x301e6290, 0x06000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x05000000, + 0x19020202, 0x73d0d0d0, 0xdce8e8e8, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, + 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, 0xffececec, + 0xffededed, 0xff84b7e1, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, + 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff009ddc, 0xff069cdc, 0xdc1697d6, 0x712084be, 0x18000101, + 0x04000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000000, 0x0b000000, 0x1d000000, 0x55bdbdbd, 0x97dbdbdb, 0xc4e3e3e3, 0xdee7e7e7, 0xfaececec, + 0xffececec, 0xffededed, 0xffededed, 0xffececec, 0xffececec, 0xffededed, 0xffececec, 0xffededed, + 0xffe4e7ec, 0xff069cdb, 0xff009ddc, 0xff019ddc, 0xff089cdb, 0xff0b9cdb, 0xff0b9cdb, 0xff0b9cdb, + 0xff0b9cdb, 0xff0b9cdb, 0xff0b9cdb, 0xff0b9cdb, 0xff0b9cdb, 0xff0b9cdb, 0xff0b9cdb, 0xff0b9cdb, + 0xff0b9cdb, 0xff0b9cdb, 0xff0b9cdb, 0xff0c9cdb, 0xff0d9cdb, 0xff0e9cdb, 0xff0e9bdb, 0xff119bdb, + 0xfc159ada, 0xe31598d7, 0xc61794d3, 0x971b8dc9, 0x572378af, 0x1c000000, 0x0b000000, 0x01000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x02000000, 0x07000000, 0x10000000, 0x18000000, 0x1e000000, 0x22000000, + 0x261c1c1c, 0x29424242, 0x2a4f4f4f, 0x2b555555, 0x2b565656, 0x2b575757, 0x2b575757, 0x2b575757, + 0x2b484c51, 0x2b06304a, 0x2b05324c, 0x2b07324c, 0x2b0a314c, 0x2b0b304b, 0x2b0b304b, 0x2b0b304b, + 0x2b0b304b, 0x2b0b304b, 0x2b0b304b, 0x2b0b304b, 0x2b0b304b, 0x2b0b304b, 0x2b0b304b, 0x2b0b304b, + 0x2b0b304b, 0x2b0b304b, 0x2b0b304b, 0x2b0c304b, 0x2b0c304b, 0x2b0c2f4a, 0x2a0c2e48, 0x27082134, + 0x22000000, 0x1e000000, 0x17000000, 0x0f000000, 0x07000000, 0x02000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x01000000, 0x01000000, 0x02000000, + 0x03000000, 0x03000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x03000000, 0x03000000, + 0x02000000, 0x01000000, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + +}; diff --git a/contrib/mii-icon-64.png b/contrib/mii-icon-64.png new file mode 100644 index 0000000..7ab865d Binary files /dev/null and b/contrib/mii-icon-64.png differ diff --git a/contrib/stb_image_write.h b/contrib/stb_image_write.h deleted file mode 100644 index e4b32ed..0000000 --- a/contrib/stb_image_write.h +++ /dev/null @@ -1,1724 +0,0 @@ -/* stb_image_write - v1.16 - public domain - http://nothings.org/stb - writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 - no warranty implied; use at your own risk - - Before #including, - - #define STB_IMAGE_WRITE_IMPLEMENTATION - - in the file that you want to have the implementation. - - Will probably not work correctly with strict-aliasing optimizations. - -ABOUT: - - This header file is a library for writing images to C stdio or a callback. - - The PNG output is not optimal; it is 20-50% larger than the file - written by a decent optimizing implementation; though providing a custom - zlib compress function (see STBIW_ZLIB_COMPRESS) can mitigate that. - This library is designed for source code compactness and simplicity, - not optimal image file size or run-time performance. - -BUILDING: - - You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h. - You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace - malloc,realloc,free. - You can #define STBIW_MEMMOVE() to replace memmove() - You can #define STBIW_ZLIB_COMPRESS to use a custom zlib-style compress function - for PNG compression (instead of the builtin one), it must have the following signature: - unsigned char * my_compress(unsigned char *data, int data_len, int *out_len, int quality); - The returned data will be freed with STBIW_FREE() (free() by default), - so it must be heap allocated with STBIW_MALLOC() (malloc() by default), - -UNICODE: - - If compiling for Windows and you wish to use Unicode filenames, compile - with - #define STBIW_WINDOWS_UTF8 - and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert - Windows wchar_t filenames to utf8. - -USAGE: - - There are five functions, one for each image file format: - - int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); - int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); - int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); - int stbi_write_jpg(char const *filename, int w, int h, int comp, const void *data, int quality); - int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); - - void stbi_flip_vertically_on_write(int flag); // flag is non-zero to flip data vertically - - There are also five equivalent functions that use an arbitrary write function. You are - expected to open/close your file-equivalent before and after calling these: - - int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); - int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); - int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); - int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); - int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); - - where the callback is: - void stbi_write_func(void *context, void *data, int size); - - You can configure it with these global variables: - int stbi_write_tga_with_rle; // defaults to true; set to 0 to disable RLE - int stbi_write_png_compression_level; // defaults to 8; set to higher for more compression - int stbi_write_force_png_filter; // defaults to -1; set to 0..5 to force a filter mode - - - You can define STBI_WRITE_NO_STDIO to disable the file variant of these - functions, so the library will not use stdio.h at all. However, this will - also disable HDR writing, because it requires stdio for formatted output. - - Each function returns 0 on failure and non-0 on success. - - The functions create an image file defined by the parameters. The image - is a rectangle of pixels stored from left-to-right, top-to-bottom. - Each pixel contains 'comp' channels of data stored interleaved with 8-bits - per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is - monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall. - The *data pointer points to the first byte of the top-left-most pixel. - For PNG, "stride_in_bytes" is the distance in bytes from the first byte of - a row of pixels to the first byte of the next row of pixels. - - PNG creates output files with the same number of components as the input. - The BMP format expands Y to RGB in the file format and does not - output alpha. - - PNG supports writing rectangles of data even when the bytes storing rows of - data are not consecutive in memory (e.g. sub-rectangles of a larger image), - by supplying the stride between the beginning of adjacent rows. The other - formats do not. (Thus you cannot write a native-format BMP through the BMP - writer, both because it is in BGR order and because it may have padding - at the end of the line.) - - PNG allows you to set the deflate compression level by setting the global - variable 'stbi_write_png_compression_level' (it defaults to 8). - - HDR expects linear float data. Since the format is always 32-bit rgb(e) - data, alpha (if provided) is discarded, and for monochrome data it is - replicated across all three channels. - - TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed - data, set the global variable 'stbi_write_tga_with_rle' to 0. - - JPEG does ignore alpha channels in input data; quality is between 1 and 100. - Higher quality looks better but results in a bigger image. - JPEG baseline (no JPEG progressive). - -CREDITS: - - - Sean Barrett - PNG/BMP/TGA - Baldur Karlsson - HDR - Jean-Sebastien Guay - TGA monochrome - Tim Kelsey - misc enhancements - Alan Hickman - TGA RLE - Emmanuel Julien - initial file IO callback implementation - Jon Olick - original jo_jpeg.cpp code - Daniel Gibson - integrate JPEG, allow external zlib - Aarni Koskela - allow choosing PNG filter - - bugfixes: - github:Chribba - Guillaume Chereau - github:jry2 - github:romigrou - Sergio Gonzalez - Jonas Karlsson - Filip Wasil - Thatcher Ulrich - github:poppolopoppo - Patrick Boettcher - github:xeekworx - Cap Petschulat - Simon Rodriguez - Ivan Tikhonov - github:ignotion - Adam Schackart - Andrew Kensler - -LICENSE - - See end of file for license information. - -*/ - -#ifndef INCLUDE_STB_IMAGE_WRITE_H -#define INCLUDE_STB_IMAGE_WRITE_H - -#include - -// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' -#ifndef STBIWDEF -#ifdef STB_IMAGE_WRITE_STATIC -#define STBIWDEF static -#else -#ifdef __cplusplus -#define STBIWDEF extern "C" -#else -#define STBIWDEF extern -#endif -#endif -#endif - -#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations -STBIWDEF int stbi_write_tga_with_rle; -STBIWDEF int stbi_write_png_compression_level; -STBIWDEF int stbi_write_force_png_filter; -#endif - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); -STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); -STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); - -#ifdef STBIW_WINDOWS_UTF8 -STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); -#endif -#endif - -typedef void stbi_write_func(void *context, void *data, int size); - -STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); -STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); -STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); - -STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); - -#endif//INCLUDE_STB_IMAGE_WRITE_H - -#ifdef STB_IMAGE_WRITE_IMPLEMENTATION - -#ifdef _WIN32 - #ifndef _CRT_SECURE_NO_WARNINGS - #define _CRT_SECURE_NO_WARNINGS - #endif - #ifndef _CRT_NONSTDC_NO_DEPRECATE - #define _CRT_NONSTDC_NO_DEPRECATE - #endif -#endif - -#ifndef STBI_WRITE_NO_STDIO -#include -#endif // STBI_WRITE_NO_STDIO - -#include -#include -#include -#include - -#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) -// ok -#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) -// ok -#else -#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." -#endif - -#ifndef STBIW_MALLOC -#define STBIW_MALLOC(sz) malloc(sz) -#define STBIW_REALLOC(p,newsz) realloc(p,newsz) -#define STBIW_FREE(p) free(p) -#endif - -#ifndef STBIW_REALLOC_SIZED -#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) -#endif - - -#ifndef STBIW_MEMMOVE -#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) -#endif - - -#ifndef STBIW_ASSERT -#include -#define STBIW_ASSERT(x) assert(x) -#endif - -#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) - -#ifdef STB_IMAGE_WRITE_STATIC -static int stbi_write_png_compression_level = 8; -static int stbi_write_tga_with_rle = 1; -static int stbi_write_force_png_filter = -1; -#else -int stbi_write_png_compression_level = 8; -int stbi_write_tga_with_rle = 1; -int stbi_write_force_png_filter = -1; -#endif - -static int stbi__flip_vertically_on_write = 0; - -STBIWDEF void stbi_flip_vertically_on_write(int flag) -{ - stbi__flip_vertically_on_write = flag; -} - -typedef struct -{ - stbi_write_func *func; - void *context; - unsigned char buffer[64]; - int buf_used; -} stbi__write_context; - -// initialize a callback-based context -static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) -{ - s->func = c; - s->context = context; -} - -#ifndef STBI_WRITE_NO_STDIO - -static void stbi__stdio_write(void *context, void *data, int size) -{ - fwrite(data,1,size,(FILE*) context); -} - -#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) -#ifdef __cplusplus -#define STBIW_EXTERN extern "C" -#else -#define STBIW_EXTERN extern -#endif -STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); -STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); - -STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) -{ - return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); -} -#endif - -static FILE *stbiw__fopen(char const *filename, char const *mode) -{ - FILE *f; -#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) - wchar_t wMode[64]; - wchar_t wFilename[1024]; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) - return 0; - - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) - return 0; - -#if defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != _wfopen_s(&f, wFilename, wMode)) - f = 0; -#else - f = _wfopen(wFilename, wMode); -#endif - -#elif defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != fopen_s(&f, filename, mode)) - f=0; -#else - f = fopen(filename, mode); -#endif - return f; -} - -static int stbi__start_write_file(stbi__write_context *s, const char *filename) -{ - FILE *f = stbiw__fopen(filename, "wb"); - stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); - return f != NULL; -} - -static void stbi__end_write_file(stbi__write_context *s) -{ - fclose((FILE *)s->context); -} - -#endif // !STBI_WRITE_NO_STDIO - -typedef unsigned int stbiw_uint32; -typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; - -static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) -{ - while (*fmt) { - switch (*fmt++) { - case ' ': break; - case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); - s->func(s->context,&x,1); - break; } - case '2': { int x = va_arg(v,int); - unsigned char b[2]; - b[0] = STBIW_UCHAR(x); - b[1] = STBIW_UCHAR(x>>8); - s->func(s->context,b,2); - break; } - case '4': { stbiw_uint32 x = va_arg(v,int); - unsigned char b[4]; - b[0]=STBIW_UCHAR(x); - b[1]=STBIW_UCHAR(x>>8); - b[2]=STBIW_UCHAR(x>>16); - b[3]=STBIW_UCHAR(x>>24); - s->func(s->context,b,4); - break; } - default: - STBIW_ASSERT(0); - return; - } - } -} - -static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) -{ - va_list v; - va_start(v, fmt); - stbiw__writefv(s, fmt, v); - va_end(v); -} - -static void stbiw__write_flush(stbi__write_context *s) -{ - if (s->buf_used) { - s->func(s->context, &s->buffer, s->buf_used); - s->buf_used = 0; - } -} - -static void stbiw__putc(stbi__write_context *s, unsigned char c) -{ - s->func(s->context, &c, 1); -} - -static void stbiw__write1(stbi__write_context *s, unsigned char a) -{ - if ((size_t)s->buf_used + 1 > sizeof(s->buffer)) - stbiw__write_flush(s); - s->buffer[s->buf_used++] = a; -} - -static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) -{ - int n; - if ((size_t)s->buf_used + 3 > sizeof(s->buffer)) - stbiw__write_flush(s); - n = s->buf_used; - s->buf_used = n+3; - s->buffer[n+0] = a; - s->buffer[n+1] = b; - s->buffer[n+2] = c; -} - -static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) -{ - unsigned char bg[3] = { 255, 0, 255}, px[3]; - int k; - - if (write_alpha < 0) - stbiw__write1(s, d[comp - 1]); - - switch (comp) { - case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case - case 1: - if (expand_mono) - stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp - else - stbiw__write1(s, d[0]); // monochrome TGA - break; - case 4: - if (!write_alpha) { - // composite against pink background - for (k = 0; k < 3; ++k) - px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; - stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); - break; - } - /* FALLTHROUGH */ - case 3: - stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); - break; - } - if (write_alpha > 0) - stbiw__write1(s, d[comp - 1]); -} - -static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) -{ - stbiw_uint32 zero = 0; - int i,j, j_end; - - if (y <= 0) - return; - - if (stbi__flip_vertically_on_write) - vdir *= -1; - - if (vdir < 0) { - j_end = -1; j = y-1; - } else { - j_end = y; j = 0; - } - - for (; j != j_end; j += vdir) { - for (i=0; i < x; ++i) { - unsigned char *d = (unsigned char *) data + (j*x+i)*comp; - stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); - } - stbiw__write_flush(s); - s->func(s->context, &zero, scanline_pad); - } -} - -static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) -{ - if (y < 0 || x < 0) { - return 0; - } else { - va_list v; - va_start(v, fmt); - stbiw__writefv(s, fmt, v); - va_end(v); - stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); - return 1; - } -} - -static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) -{ - if (comp != 4) { - // write RGB bitmap - int pad = (-x*3) & 3; - return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, - "11 4 22 4" "4 44 22 444444", - 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header - 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header - } else { - // RGBA bitmaps need a v4 header - // use BI_BITFIELDS mode with 32bpp and alpha mask - // (straight BI_RGB with alpha mask doesn't work in most readers) - return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *)data,1,0, - "11 4 22 4" "4 44 22 444444 4444 4 444 444 444 444", - 'B', 'M', 14+108+x*y*4, 0, 0, 14+108, // file header - 108, x,y, 1,32, 3,0,0,0,0,0, 0xff0000,0xff00,0xff,0xff000000u, 0, 0,0,0, 0,0,0, 0,0,0, 0,0,0); // bitmap V4 header - } -} - -STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) -{ - stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_bmp_core(&s, x, y, comp, data); -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) -{ - stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_bmp_core(&s, x, y, comp, data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif //!STBI_WRITE_NO_STDIO - -static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) -{ - int has_alpha = (comp == 2 || comp == 4); - int colorbytes = has_alpha ? comp-1 : comp; - int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 - - if (y < 0 || x < 0) - return 0; - - if (!stbi_write_tga_with_rle) { - return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, - "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); - } else { - int i,j,k; - int jend, jdir; - - stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); - - if (stbi__flip_vertically_on_write) { - j = 0; - jend = y; - jdir = 1; - } else { - j = y-1; - jend = -1; - jdir = -1; - } - for (; j != jend; j += jdir) { - unsigned char *row = (unsigned char *) data + j * x * comp; - int len; - - for (i = 0; i < x; i += len) { - unsigned char *begin = row + i * comp; - int diff = 1; - len = 1; - - if (i < x - 1) { - ++len; - diff = memcmp(begin, row + (i + 1) * comp, comp); - if (diff) { - const unsigned char *prev = begin; - for (k = i + 2; k < x && len < 128; ++k) { - if (memcmp(prev, row + k * comp, comp)) { - prev += comp; - ++len; - } else { - --len; - break; - } - } - } else { - for (k = i + 2; k < x && len < 128; ++k) { - if (!memcmp(begin, row + k * comp, comp)) { - ++len; - } else { - break; - } - } - } - } - - if (diff) { - unsigned char header = STBIW_UCHAR(len - 1); - stbiw__write1(s, header); - for (k = 0; k < len; ++k) { - stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); - } - } else { - unsigned char header = STBIW_UCHAR(len - 129); - stbiw__write1(s, header); - stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); - } - } - } - stbiw__write_flush(s); - } - return 1; -} - -STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) -{ - stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_tga_core(&s, x, y, comp, (void *) data); -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) -{ - stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif - -// ************************************************************************************************* -// Radiance RGBE HDR writer -// by Baldur Karlsson - -#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) - -#ifndef STBI_WRITE_NO_STDIO - -static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) -{ - int exponent; - float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); - - if (maxcomp < 1e-32f) { - rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; - } else { - float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; - - rgbe[0] = (unsigned char)(linear[0] * normalize); - rgbe[1] = (unsigned char)(linear[1] * normalize); - rgbe[2] = (unsigned char)(linear[2] * normalize); - rgbe[3] = (unsigned char)(exponent + 128); - } -} - -static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) -{ - unsigned char lengthbyte = STBIW_UCHAR(length+128); - STBIW_ASSERT(length+128 <= 255); - s->func(s->context, &lengthbyte, 1); - s->func(s->context, &databyte, 1); -} - -static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) -{ - unsigned char lengthbyte = STBIW_UCHAR(length); - STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code - s->func(s->context, &lengthbyte, 1); - s->func(s->context, data, length); -} - -static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) -{ - unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; - unsigned char rgbe[4]; - float linear[3]; - int x; - - scanlineheader[2] = (width&0xff00)>>8; - scanlineheader[3] = (width&0x00ff); - - /* skip RLE for images too small or large */ - if (width < 8 || width >= 32768) { - for (x=0; x < width; x++) { - switch (ncomp) { - case 4: /* fallthrough */ - case 3: linear[2] = scanline[x*ncomp + 2]; - linear[1] = scanline[x*ncomp + 1]; - linear[0] = scanline[x*ncomp + 0]; - break; - default: - linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; - break; - } - stbiw__linear_to_rgbe(rgbe, linear); - s->func(s->context, rgbe, 4); - } - } else { - int c,r; - /* encode into scratch buffer */ - for (x=0; x < width; x++) { - switch(ncomp) { - case 4: /* fallthrough */ - case 3: linear[2] = scanline[x*ncomp + 2]; - linear[1] = scanline[x*ncomp + 1]; - linear[0] = scanline[x*ncomp + 0]; - break; - default: - linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; - break; - } - stbiw__linear_to_rgbe(rgbe, linear); - scratch[x + width*0] = rgbe[0]; - scratch[x + width*1] = rgbe[1]; - scratch[x + width*2] = rgbe[2]; - scratch[x + width*3] = rgbe[3]; - } - - s->func(s->context, scanlineheader, 4); - - /* RLE each component separately */ - for (c=0; c < 4; c++) { - unsigned char *comp = &scratch[width*c]; - - x = 0; - while (x < width) { - // find first run - r = x; - while (r+2 < width) { - if (comp[r] == comp[r+1] && comp[r] == comp[r+2]) - break; - ++r; - } - if (r+2 >= width) - r = width; - // dump up to first run - while (x < r) { - int len = r-x; - if (len > 128) len = 128; - stbiw__write_dump_data(s, len, &comp[x]); - x += len; - } - // if there's a run, output it - if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd - // find next byte after run - while (r < width && comp[r] == comp[x]) - ++r; - // output run up to r - while (x < r) { - int len = r-x; - if (len > 127) len = 127; - stbiw__write_run_data(s, len, comp[x]); - x += len; - } - } - } - } - } -} - -static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) -{ - if (y <= 0 || x <= 0 || data == NULL) - return 0; - else { - // Each component is stored separately. Allocate scratch space for full output scanline. - unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); - int i, len; - char buffer[128]; - char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; - s->func(s->context, header, sizeof(header)-1); - -#ifdef __STDC_LIB_EXT1__ - len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); -#else - len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); -#endif - s->func(s->context, buffer, len); - - for(i=0; i < y; i++) - stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)); - STBIW_FREE(scratch); - return 1; - } -} - -STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) -{ - stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_hdr_core(&s, x, y, comp, (float *) data); -} - -STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) -{ - stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif // STBI_WRITE_NO_STDIO - - -////////////////////////////////////////////////////////////////////////////// -// -// PNG writer -// - -#ifndef STBIW_ZLIB_COMPRESS -// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() -#define stbiw__sbraw(a) ((int *) (void *) (a) - 2) -#define stbiw__sbm(a) stbiw__sbraw(a)[0] -#define stbiw__sbn(a) stbiw__sbraw(a)[1] - -#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a)) -#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0) -#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a))) - -#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v)) -#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0) -#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0) - -static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) -{ - int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; - void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); - STBIW_ASSERT(p); - if (p) { - if (!*arr) ((int *) p)[1] = 0; - *arr = (void *) ((int *) p + 2); - stbiw__sbm(*arr) = m; - } - return *arr; -} - -static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) -{ - while (*bitcount >= 8) { - stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); - *bitbuffer >>= 8; - *bitcount -= 8; - } - return data; -} - -static int stbiw__zlib_bitrev(int code, int codebits) -{ - int res=0; - while (codebits--) { - res = (res << 1) | (code & 1); - code >>= 1; - } - return res; -} - -static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit) -{ - int i; - for (i=0; i < limit && i < 258; ++i) - if (a[i] != b[i]) break; - return i; -} - -static unsigned int stbiw__zhash(unsigned char *data) -{ - stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); - hash ^= hash << 3; - hash += hash >> 5; - hash ^= hash << 4; - hash += hash >> 17; - hash ^= hash << 25; - hash += hash >> 6; - return hash; -} - -#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount)) -#define stbiw__zlib_add(code,codebits) \ - (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush()) -#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c) -// default huffman tables -#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8) -#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9) -#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7) -#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8) -#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n)) -#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n)) - -#define stbiw__ZHASH 16384 - -#endif // STBIW_ZLIB_COMPRESS - -STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) -{ -#ifdef STBIW_ZLIB_COMPRESS - // user provided a zlib compress implementation, use that - return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality); -#else // use builtin - static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; - static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; - static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; - static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; - unsigned int bitbuf=0; - int i,j, bitcount=0; - unsigned char *out = NULL; - unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(unsigned char**)); - if (hash_table == NULL) - return NULL; - if (quality < 5) quality = 5; - - stbiw__sbpush(out, 0x78); // DEFLATE 32K window - stbiw__sbpush(out, 0x5e); // FLEVEL = 1 - stbiw__zlib_add(1,1); // BFINAL = 1 - stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman - - for (i=0; i < stbiw__ZHASH; ++i) - hash_table[i] = NULL; - - i=0; - while (i < data_len-3) { - // hash next 3 bytes of data to be compressed - int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3; - unsigned char *bestloc = 0; - unsigned char **hlist = hash_table[h]; - int n = stbiw__sbcount(hlist); - for (j=0; j < n; ++j) { - if (hlist[j]-data > i-32768) { // if entry lies within window - int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); - if (d >= best) { best=d; bestloc=hlist[j]; } - } - } - // when hash table entry is too long, delete half the entries - if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) { - STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); - stbiw__sbn(hash_table[h]) = quality; - } - stbiw__sbpush(hash_table[h],data+i); - - if (bestloc) { - // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal - h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1); - hlist = hash_table[h]; - n = stbiw__sbcount(hlist); - for (j=0; j < n; ++j) { - if (hlist[j]-data > i-32767) { - int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1); - if (e > best) { // if next match is better, bail on current match - bestloc = NULL; - break; - } - } - } - } - - if (bestloc) { - int d = (int) (data+i - bestloc); // distance back - STBIW_ASSERT(d <= 32767 && best <= 258); - for (j=0; best > lengthc[j+1]-1; ++j); - stbiw__zlib_huff(j+257); - if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]); - for (j=0; d > distc[j+1]-1; ++j); - stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5); - if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]); - i += best; - } else { - stbiw__zlib_huffb(data[i]); - ++i; - } - } - // write out final bytes - for (;i < data_len; ++i) - stbiw__zlib_huffb(data[i]); - stbiw__zlib_huff(256); // end of block - // pad with 0 bits to byte boundary - while (bitcount) - stbiw__zlib_add(0,1); - - for (i=0; i < stbiw__ZHASH; ++i) - (void) stbiw__sbfree(hash_table[i]); - STBIW_FREE(hash_table); - - // store uncompressed instead if compression was worse - if (stbiw__sbn(out) > data_len + 2 + ((data_len+32766)/32767)*5) { - stbiw__sbn(out) = 2; // truncate to DEFLATE 32K window and FLEVEL = 1 - for (j = 0; j < data_len;) { - int blocklen = data_len - j; - if (blocklen > 32767) blocklen = 32767; - stbiw__sbpush(out, data_len - j == blocklen); // BFINAL = ?, BTYPE = 0 -- no compression - stbiw__sbpush(out, STBIW_UCHAR(blocklen)); // LEN - stbiw__sbpush(out, STBIW_UCHAR(blocklen >> 8)); - stbiw__sbpush(out, STBIW_UCHAR(~blocklen)); // NLEN - stbiw__sbpush(out, STBIW_UCHAR(~blocklen >> 8)); - memcpy(out+stbiw__sbn(out), data+j, blocklen); - stbiw__sbn(out) += blocklen; - j += blocklen; - } - } - - { - // compute adler32 on input - unsigned int s1=1, s2=0; - int blocklen = (int) (data_len % 5552); - j=0; - while (j < data_len) { - for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; } - s1 %= 65521; s2 %= 65521; - j += blocklen; - blocklen = 5552; - } - stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); - stbiw__sbpush(out, STBIW_UCHAR(s2)); - stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); - stbiw__sbpush(out, STBIW_UCHAR(s1)); - } - *out_len = stbiw__sbn(out); - // make returned pointer freeable - STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); - return (unsigned char *) stbiw__sbraw(out); -#endif // STBIW_ZLIB_COMPRESS -} - -static unsigned int stbiw__crc32(unsigned char *buffer, int len) -{ -#ifdef STBIW_CRC32 - return STBIW_CRC32(buffer, len); -#else - static unsigned int crc_table[256] = - { - 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 - }; - - unsigned int crc = ~0u; - int i; - for (i=0; i < len; ++i) - crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; - return ~crc; -#endif -} - -#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) -#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); -#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) - -static void stbiw__wpcrc(unsigned char **data, int len) -{ - unsigned int crc = stbiw__crc32(*data - len - 4, len+4); - stbiw__wp32(*data, crc); -} - -static unsigned char stbiw__paeth(int a, int b, int c) -{ - int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); - if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); - if (pb <= pc) return STBIW_UCHAR(b); - return STBIW_UCHAR(c); -} - -// @OPTIMIZE: provide an option that always forces left-predict or paeth predict -static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) -{ - static int mapping[] = { 0,1,2,3,4 }; - static int firstmap[] = { 0,1,0,5,6 }; - int *mymap = (y != 0) ? mapping : firstmap; - int i; - int type = mymap[filter_type]; - unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); - int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; - - if (type==0) { - memcpy(line_buffer, z, width*n); - return; - } - - // first loop isn't optimized since it's just one pixel - for (i = 0; i < n; ++i) { - switch (type) { - case 1: line_buffer[i] = z[i]; break; - case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; - case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; - case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; - case 5: line_buffer[i] = z[i]; break; - case 6: line_buffer[i] = z[i]; break; - } - } - switch (type) { - case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break; - case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break; - case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; - case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; - case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break; - case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; - } -} - -STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) -{ - int force_filter = stbi_write_force_png_filter; - int ctype[5] = { -1, 0, 4, 2, 6 }; - unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; - unsigned char *out,*o, *filt, *zlib; - signed char *line_buffer; - int j,zlen; - - if (stride_bytes == 0) - stride_bytes = x * n; - - if (force_filter >= 5) { - force_filter = -1; - } - - filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; - line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } - for (j=0; j < y; ++j) { - int filter_type; - if (force_filter > -1) { - filter_type = force_filter; - stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer); - } else { // Estimate the best filter by running through all of them: - int best_filter = 0, best_filter_val = 0x7fffffff, est, i; - for (filter_type = 0; filter_type < 5; filter_type++) { - stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer); - - // Estimate the entropy of the line using this filter; the less, the better. - est = 0; - for (i = 0; i < x*n; ++i) { - est += abs((signed char) line_buffer[i]); - } - if (est < best_filter_val) { - best_filter_val = est; - best_filter = filter_type; - } - } - if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it - stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer); - filter_type = best_filter; - } - } - // when we get here, filter_type contains the filter type, and line_buffer contains the data - filt[j*(x*n+1)] = (unsigned char) filter_type; - STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); - } - STBIW_FREE(line_buffer); - zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level); - STBIW_FREE(filt); - if (!zlib) return 0; - - // each tag requires 12 bytes of overhead - out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); - if (!out) return 0; - *out_len = 8 + 12+13 + 12+zlen + 12; - - o=out; - STBIW_MEMMOVE(o,sig,8); o+= 8; - stbiw__wp32(o, 13); // header length - stbiw__wptag(o, "IHDR"); - stbiw__wp32(o, x); - stbiw__wp32(o, y); - *o++ = 8; - *o++ = STBIW_UCHAR(ctype[n]); - *o++ = 0; - *o++ = 0; - *o++ = 0; - stbiw__wpcrc(&o,13); - - stbiw__wp32(o, zlen); - stbiw__wptag(o, "IDAT"); - STBIW_MEMMOVE(o, zlib, zlen); - o += zlen; - STBIW_FREE(zlib); - stbiw__wpcrc(&o, zlen); - - stbiw__wp32(o,0); - stbiw__wptag(o, "IEND"); - stbiw__wpcrc(&o,0); - - STBIW_ASSERT(o == out + *out_len); - - return out; -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) -{ - FILE *f; - int len; - unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); - if (png == NULL) return 0; - - f = stbiw__fopen(filename, "wb"); - if (!f) { STBIW_FREE(png); return 0; } - fwrite(png, 1, len, f); - fclose(f); - STBIW_FREE(png); - return 1; -} -#endif - -STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) -{ - int len; - unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); - if (png == NULL) return 0; - func(context, png, len); - STBIW_FREE(png); - return 1; -} - - -/* *************************************************************************** - * - * JPEG writer - * - * This is based on Jon Olick's jo_jpeg.cpp: - * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html - */ - -static const unsigned char stbiw__jpg_ZigZag[] = { 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 }; - -static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { - int bitBuf = *bitBufP, bitCnt = *bitCntP; - bitCnt += bs[1]; - bitBuf |= bs[0] << (24 - bitCnt); - while(bitCnt >= 8) { - unsigned char c = (bitBuf >> 16) & 255; - stbiw__putc(s, c); - if(c == 255) { - stbiw__putc(s, 0); - } - bitBuf <<= 8; - bitCnt -= 8; - } - *bitBufP = bitBuf; - *bitCntP = bitCnt; -} - -static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { - float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; - float z1, z2, z3, z4, z5, z11, z13; - - float tmp0 = d0 + d7; - float tmp7 = d0 - d7; - float tmp1 = d1 + d6; - float tmp6 = d1 - d6; - float tmp2 = d2 + d5; - float tmp5 = d2 - d5; - float tmp3 = d3 + d4; - float tmp4 = d3 - d4; - - // Even part - float tmp10 = tmp0 + tmp3; // phase 2 - float tmp13 = tmp0 - tmp3; - float tmp11 = tmp1 + tmp2; - float tmp12 = tmp1 - tmp2; - - d0 = tmp10 + tmp11; // phase 3 - d4 = tmp10 - tmp11; - - z1 = (tmp12 + tmp13) * 0.707106781f; // c4 - d2 = tmp13 + z1; // phase 5 - d6 = 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) * 0.382683433f; // c6 - z2 = tmp10 * 0.541196100f + z5; // c2-c6 - z4 = tmp12 * 1.306562965f + z5; // c2+c6 - z3 = tmp11 * 0.707106781f; // c4 - - z11 = tmp7 + z3; // phase 5 - z13 = tmp7 - z3; - - *d5p = z13 + z2; // phase 6 - *d3p = z13 - z2; - *d1p = z11 + z4; - *d7p = z11 - z4; - - *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; -} - -static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { - int tmp1 = val < 0 ? -val : val; - val = val < 0 ? val-1 : val; - bits[1] = 1; - while(tmp1 >>= 1) { - ++bits[1]; - } - bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { - } - // end0pos = first element in reverse order !=0 - if(end0pos == 0) { - stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); - return DU[0]; - } - for(i = 1; i <= end0pos; ++i) { - int startpos = i; - int nrzeroes; - unsigned short bits[2]; - for (; DU[i]==0 && i<=end0pos; ++i) { - } - nrzeroes = i-startpos; - if ( nrzeroes >= 16 ) { - int lng = nrzeroes>>4; - int nrmarker; - for (nrmarker=1; nrmarker <= lng; ++nrmarker) - stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); - nrzeroes &= 15; - } - stbiw__jpg_calcBits(DU[i], bits); - stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); - stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); - } - if(end0pos != 63) { - stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); - } - return DU[0]; -} - -static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { - // Constants that don't pollute global namespace - static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; - static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; - static const unsigned char std_ac_luminance_values[] = { - 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, - 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, - 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, - 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, - 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, - 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, - 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa - }; - static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; - static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; - static const unsigned char std_ac_chrominance_values[] = { - 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, - 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, - 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, - 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, - 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, - 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, - 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa - }; - // Huffman tables - static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; - static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; - static const unsigned short YAC_HT[256][2] = { - {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} - }; - static const unsigned short UVAC_HT[256][2] = { - {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} - }; - static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, - 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; - static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, - 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; - static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, - 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; - - int row, col, i, k, subsample; - float fdtbl_Y[64], fdtbl_UV[64]; - unsigned char YTable[64], UVTable[64]; - - if(!data || !width || !height || comp > 4 || comp < 1) { - return 0; - } - - quality = quality ? quality : 90; - subsample = quality <= 90 ? 1 : 0; - quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; - quality = quality < 50 ? 5000 / quality : 200 - quality * 2; - - for(i = 0; i < 64; ++i) { - int uvti, yti = (YQT[i]*quality+50)/100; - YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); - uvti = (UVQT[i]*quality+50)/100; - UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); - } - - for(row = 0, k = 0; row < 8; ++row) { - for(col = 0; col < 8; ++col, ++k) { - fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); - fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); - } - } - - // Write Headers - { - static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; - static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; - const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), - 3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; - s->func(s->context, (void*)head0, sizeof(head0)); - s->func(s->context, (void*)YTable, sizeof(YTable)); - stbiw__putc(s, 1); - s->func(s->context, UVTable, sizeof(UVTable)); - s->func(s->context, (void*)head1, sizeof(head1)); - s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); - s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); - stbiw__putc(s, 0x10); // HTYACinfo - s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); - s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); - stbiw__putc(s, 1); // HTUDCinfo - s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); - s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); - stbiw__putc(s, 0x11); // HTUACinfo - s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); - s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); - s->func(s->context, (void*)head2, sizeof(head2)); - } - - // Encode 8x8 macroblocks - { - static const unsigned short fillBits[] = {0x7F, 7}; - int DCY=0, DCU=0, DCV=0; - int bitBuf=0, bitCnt=0; - // comp == 2 is grey+alpha (alpha is ignored) - int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; - const unsigned char *dataR = (const unsigned char *)data; - const unsigned char *dataG = dataR + ofsG; - const unsigned char *dataB = dataR + ofsB; - int x, y, pos; - if(subsample) { - for(y = 0; y < height; y += 16) { - for(x = 0; x < width; x += 16) { - float Y[256], U[256], V[256]; - for(row = y, pos = 0; row < y+16; ++row) { - // row >= height => use last input row - int clamped_row = (row < height) ? row : height - 1; - int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; - for(col = x; col < x+16; ++col, ++pos) { - // if col >= width => use pixel from last input column - int p = base_p + ((col < width) ? col : (width-1))*comp; - float r = dataR[p], g = dataG[p], b = dataB[p]; - Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; - U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; - V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; - } - } - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); - - // subsample U,V - { - float subU[64], subV[64]; - int yy, xx; - for(yy = 0, pos = 0; yy < 8; ++yy) { - for(xx = 0; xx < 8; ++xx, ++pos) { - int j = yy*32+xx*2; - subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f; - subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f; - } - } - DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); - } - } - } - } else { - for(y = 0; y < height; y += 8) { - for(x = 0; x < width; x += 8) { - float Y[64], U[64], V[64]; - for(row = y, pos = 0; row < y+8; ++row) { - // row >= height => use last input row - int clamped_row = (row < height) ? row : height - 1; - int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; - for(col = x; col < x+8; ++col, ++pos) { - // if col >= width => use pixel from last input column - int p = base_p + ((col < width) ? col : (width-1))*comp; - float r = dataR[p], g = dataG[p], b = dataB[p]; - Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; - U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; - V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; - } - } - - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); - } - } - } - - // Do the bit alignment of the EOI marker - stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); - } - - // EOI - stbiw__putc(s, 0xFF); - stbiw__putc(s, 0xD9); - - return 1; -} - -STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) -{ - stbi__write_context s = { 0 }; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); -} - - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) -{ - stbi__write_context s = { 0 }; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif - -#endif // STB_IMAGE_WRITE_IMPLEMENTATION - -/* Revision history - 1.16 (2021-07-11) - make Deflate code emit uncompressed blocks when it would otherwise expand - support writing BMPs with alpha channel - 1.15 (2020-07-13) unknown - 1.14 (2020-02-02) updated JPEG writer to downsample chroma channels - 1.13 - 1.12 - 1.11 (2019-08-11) - - 1.10 (2019-02-07) - support utf8 filenames in Windows; fix warnings and platform ifdefs - 1.09 (2018-02-11) - fix typo in zlib quality API, improve STB_I_W_STATIC in C++ - 1.08 (2018-01-29) - add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter - 1.07 (2017-07-24) - doc fix - 1.06 (2017-07-23) - writing JPEG (using Jon Olick's code) - 1.05 ??? - 1.04 (2017-03-03) - monochrome BMP expansion - 1.03 ??? - 1.02 (2016-04-02) - avoid allocating large structures on the stack - 1.01 (2016-01-16) - STBIW_REALLOC_SIZED: support allocators with no realloc support - avoid race-condition in crc initialization - minor compile issues - 1.00 (2015-09-14) - installable file IO function - 0.99 (2015-09-13) - warning fixes; TGA rle support - 0.98 (2015-04-08) - added STBIW_MALLOC, STBIW_ASSERT etc - 0.97 (2015-01-18) - fixed HDR asserts, rewrote HDR rle logic - 0.96 (2015-01-17) - add HDR output - fix monochrome BMP - 0.95 (2014-08-17) - add monochrome TGA output - 0.94 (2014-05-31) - rename private functions to avoid conflicts with stb_image.h - 0.93 (2014-05-27) - warning fixes - 0.92 (2010-08-01) - casts to unsigned char to fix warnings - 0.91 (2010-07-17) - first public release - 0.90 first internal release -*/ - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -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: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the 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 -AUTHORS 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 IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -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 -AUTHORS 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 IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ diff --git a/disks/Games1MB.po b/disks/GamesWithFirmware.po similarity index 100% rename from disks/Games1MB.po rename to disks/GamesWithFirmware.po diff --git a/docs/screen_config.png b/docs/screen_config.png new file mode 100644 index 0000000..a488392 Binary files /dev/null and b/docs/screen_config.png differ diff --git a/docs/video_main.webm b/docs/video_main.webm new file mode 100644 index 0000000..3e1e354 Binary files /dev/null and b/docs/video_main.webm differ diff --git a/fonts/DroidSans.ttf b/fonts/DroidSans.ttf deleted file mode 100644 index 767c63a..0000000 Binary files a/fonts/DroidSans.ttf and /dev/null differ diff --git a/fonts/FreeLicense.txt b/fonts/FreeLicense.txt deleted file mode 100644 index e48a09b..0000000 --- a/fonts/FreeLicense.txt +++ /dev/null @@ -1,20 +0,0 @@ -KREATIVE SOFTWARE RELAY FONTS FREE USE LICENSE -version 1.2f - -Permission is hereby granted, free of charge, to any person or entity (the "User") obtaining a copy of the included font files (the "Software") produced by Kreative Software, to utilize, display, embed, or redistribute the Software, subject to the following conditions: - -1. The User may not sell copies of the Software for a fee. - -1a. The User may give away copies of the Software free of charge provided this license and any documentation is included verbatim and credit is given to Kreative Korporation or Kreative Software. - -2. The User may not modify, reverse-engineer, or create any derivative works of the Software. - -3. Any Software carrying the following font names or variations thereof is not covered by this license and may not be used under the terms of this license: Jewel Hill, Miss Diode n Friends, This is Beckie's font! - -3a. Any Software carrying a font name ending with the string "Pro CE" is not covered by this license and may not be used under the terms of this license. - -4. This license becomes null and void if any of the above conditions are not met. - -5. Kreative Software reserves the right to change this license at any time without notice. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE SOFTWARE OR FROM OTHER DEALINGS IN THE SOFTWARE. diff --git a/fonts/PRNumber3.ttf b/fonts/PRNumber3.ttf deleted file mode 100644 index 4843041..0000000 Binary files a/fonts/PRNumber3.ttf and /dev/null differ diff --git a/fonts/PrintChar21.ttf b/fonts/PrintChar21.ttf deleted file mode 100644 index 7204e97..0000000 Binary files a/fonts/PrintChar21.ttf and /dev/null differ diff --git a/fonts/ProggyClean.ttf b/fonts/ProggyClean.ttf deleted file mode 100644 index 0270cdf..0000000 Binary files a/fonts/ProggyClean.ttf and /dev/null differ diff --git a/libmish/Makefile b/libmish/Makefile index 7a50281..0cea5e8 100644 --- a/libmish/Makefile +++ b/libmish/Makefile @@ -23,8 +23,10 @@ EXTRA_LDFLAGS = $(BASE_LDFLAGS) LIBSRC := ${notdir ${wildcard src/*.c}} # Tell make/gcc to find the files in VPATH -VPATH = src -VPATH += tests +SRC_VPATH = src +SRC_VPATH += tests +vpath %.c $(SRC_VPATH) + IPATH = src include ./Makefile.common @@ -47,6 +49,7 @@ tools: $(TOOLS) tests: $(TESTS) LIBOBJ := ${patsubst %, ${OBJ}/%, ${notdir ${LIBSRC:.c=.o}}} +$(LIBOBJ) : | $(OBJ) $(LIB)/$(TARGET).a : $(LIBOBJ) | $(LIB) $(LIB)/$(TARGET).so.$(SOV) : $(LIBOBJ) | $(LIB)/$(TARGET).a diff --git a/libmish/src/mish_capture_select.c b/libmish/src/mish_capture_select.c index cdde25a..98ebc4b 100644 --- a/libmish/src/mish_capture_select.c +++ b/libmish/src/mish_capture_select.c @@ -69,7 +69,40 @@ _mish_capture_select( if (c->input.fd == -1 || (c->flags & MISH_CLIENT_DELETE)) mish_client_delete(m, c); } + + unsigned int max_lines = m->backlog.max_lines; + if (m->flags & MISH_CLEAR_BACKLOG) { + max_lines = 1; // zero is unlimited, we don't want that + m->flags &= ~MISH_CLEAR_BACKLOG; + printf("Clearing backlog has %d lines\n", m->backlog.size); + } + /* + * It is not enough just to remove the top lines from the backlog, + * We also need to check all the current clients in case they have + * a line we are going to remove in their display... We just have to + * check the top line in this case, and 'scroll' their display to the + * next line, if applicable + */ + if (max_lines && m->backlog.size > max_lines) { + mish_line_p l; + while ((l = TAILQ_FIRST(&m->backlog.log)) != NULL) { + TAILQ_REMOVE(&m->backlog.log, l, self); + m->backlog.size--; + m->backlog.alloc -= sizeof(*l) + l->size; + // now check the clients for this line + TAILQ_FOREACH_SAFE(c, &m->clients, self, safe) { + if (c->bottom == l) + c->bottom = TAILQ_NEXT(l, self); + if (c->sending == l) + c->sending = TAILQ_NEXT(l, self); + } + free(l); + if (m->backlog.size <= max_lines) + break; + } + } } + if ((m->flags & MISH_CONSOLE_TTY) && tcsetattr(0, TCSAFLUSH, &m->orig_termios)) perror("thread tcsetattr"); diff --git a/libmish/src/mish_cmd.c b/libmish/src/mish_cmd.c index ad0ddc2..e5d07b6 100644 --- a/libmish/src/mish_cmd.c +++ b/libmish/src/mish_cmd.c @@ -166,9 +166,10 @@ mish_argv_make( state = s_copy; break; case s_copyquote: - if (*dup == '\\') + if (*dup == '\\') { state = s_skip; - else if (*dup == quote) { + dup++; + } else if (*dup == quote) { state = s_newarg; dup++; if (*dup) *dup++ = 0; diff --git a/libmish/src/mish_input.c b/libmish/src/mish_input.c index 964c1d5..a25021e 100644 --- a/libmish/src/mish_input.c +++ b/libmish/src/mish_input.c @@ -37,7 +37,7 @@ _mish_input_init( int flags = fcntl(fd, F_GETFL, NULL); if (flags == 1) { - perror("mish: input F_GETFL"); + // perror("mish: input F_GETFL"); flags = 0; } if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) diff --git a/libmish/src/mish_priv.h b/libmish/src/mish_priv.h index 1509ae3..c12d236 100644 --- a/libmish/src/mish_priv.h +++ b/libmish/src/mish_priv.h @@ -134,6 +134,8 @@ enum { MISH_QUIT = (1 << 31), // the process console we started was a tty, so has terminal settings MISH_CONSOLE_TTY = (1 << 30), + // request to clear the backlog + MISH_CLEAR_BACKLOG = (1 << 29), }; typedef struct mish_t { @@ -151,6 +153,7 @@ typedef struct mish_t { pthread_t main; // todo: allow pause/stop/resume? struct { + unsigned int max_lines; // max lines in backlog (0 = unlimited) mish_line_queue_t log; unsigned int size; // number of lines in backlog size_t alloc; // number of bytes in the backlog diff --git a/libmish/src/mish_session.c b/libmish/src/mish_session.c index 47228ae..b321990 100644 --- a/libmish/src/mish_session.c +++ b/libmish/src/mish_session.c @@ -11,7 +11,7 @@ #include #include #include // for isatty etc - +#include // for isdigit #ifdef __MACH__ #include #include @@ -106,12 +106,12 @@ mish_prepare( if (tty) m->flags |= MISH_CONSOLE_TTY; if (tcgetattr(0, &m->orig_termios)) - perror("tcgetattr"); + ;//perror("tcgetattr"); struct termios raw = m->orig_termios; raw.c_iflag &= ~(ICRNL | IXON); raw.c_lflag &= ~(ECHO | ICANON | IEXTEN); // ISIG if (tcsetattr(0, TCSAFLUSH, &raw)) - perror("tcsetattr"); + ;//perror("tcsetattr"); } #endif if (!(caps & MISH_CAP_NO_TELNET)) { @@ -271,12 +271,36 @@ _mish_cmd_mish( printf(" max sizes: vector: %d input: %d\n", c->output.size, c->input.line ? c->input.line->size : 0); } - + if (argv[1] && !strcmp(argv[1], "clear")) { + printf("Clearing backlog\n"); + m->flags |= MISH_CLEAR_BACKLOG; + } + if (argv[1] && !strcmp(argv[1], "backlog")) { + if (argv[2]) { + if (!strcmp(argv[2], "clear")) { + m->flags |= MISH_CLEAR_BACKLOG; + } else if (!strcmp(argv[2], "max") && argv[3] && isdigit(argv[3][0])) { + m->backlog.max_lines = atoi(argv[3]); + printf("Backlog max lines set to %d\n", m->backlog.max_lines); + } else if (isdigit(argv[2][0])) { + m->backlog.max_lines = atoi(argv[2]); + printf("Backlog max lines set to %d\n", m->backlog.max_lines); + } else + fprintf(stderr, "Unknown backlog command '%s'\n", argv[2]); + } else { + printf("Backlog: %6d/%6d lines (%5dKB)\n", + m->backlog.size, m->backlog.max_lines, + (int)m->backlog.alloc / 1024); + } + } } MISH_CMD_NAMES(mish, "mish"); MISH_CMD_HELP(mish, - "Displays mish status.", + "[cmd...] Displays mish status.", + "backlog [clear] [max ] - show backlog status\n" + " also set the maximum lines in the backlog\n" + " (0 = unlimited)\n" "Show status and a few bits of internals."); MISH_CMD_REGISTER(mish, _mish_cmd_mish); diff --git a/libmish/src/mish_telnet.c b/libmish/src/mish_telnet.c index febd93c..d9d6fe3 100644 --- a/libmish/src/mish_telnet.c +++ b/libmish/src/mish_telnet.c @@ -176,11 +176,12 @@ mish_telnet_prepare( port = port & 0x3fff; } - int tries = 5; + int tries = 10; do { b.sin_port = htons(port); if (bind(m->telnet.listen, (struct sockaddr *)&b, sizeof(b)) == -1) { fprintf(stderr, "%s can't bind %d\n", __func__, ntohs(b.sin_port)); + perror("bind"); port = port + (random() & 0x3ff); continue; } diff --git a/libmish/tests/mish_argv_make_test.c b/libmish/tests/mish_argv_make_test.c index 3fabd23..903f1f0 100644 --- a/libmish/tests/mish_argv_make_test.c +++ b/libmish/tests/mish_argv_make_test.c @@ -47,9 +47,10 @@ mish_argv_make( state = s_copy; break; case s_copyquote: - if (*dup == '\\') + if (*dup == '\\') { state = s_skip; - else if (*dup == quote) { + dup++; + } else if (*dup == quote) { state = s_newarg; dup++; if (*dup) *dup++ = 0; diff --git a/libmish/tests/mish_cmd_test.c b/libmish/tests/mish_cmd_test.c index d48de73..dd2c9ef 100644 --- a/libmish/tests/mish_cmd_test.c +++ b/libmish/tests/mish_cmd_test.c @@ -5,7 +5,7 @@ * * SPDX-License-Identifier: Apache-2.0 */ - +#define MISH_DEBUG 1 #include "mish_cmd.c" int main() diff --git a/libmui/Makefile b/libmui/Makefile new file mode 100644 index 0000000..0a6bb9c --- /dev/null +++ b/libmui/Makefile @@ -0,0 +1,101 @@ + +CC = gcc +CPPFLAGS += -Imui +# for bsd_queue.h +CPPFLAGS += -I../libmish/src +CPPFLAGS += -DUI_HAS_XCB=1 -DUI_HAS_XKB=1 +OPTIMIZE ?= -O0 -g +CFLAGS += --std=gnu99 -Wall -Wextra +CFLAGS += $(OPTIMIZE) +CFLAGS += -Wno-unused-parameter -Wno-unused-function +# PIC is necessary for the shared library/plugin to work +CFLAGS += -fPIC + +CPPFLAGS += ${shell pkg-config --cflags pixman-1} +LDLIBS += ${shell pkg-config --libs pixman-1} +LDLIBS += $(shell pkg-config --libs \ + xcb xcb-shm xcb-randr \ + xkbcommon-x11) +LDLIBS += -lm -ldl + +O := $(BUILD_DIR)build-$(shell $(CC) -dumpmachine) +BIN := $(O)/bin +OBJ := $(O)/obj/libmui +LIB := $(O)/lib + +MUI_SRC := $(wildcard mui/*.c) +SRC := $(MUI_SRC) +MUI_OBJ := ${patsubst %, $(OBJ)/%, ${notdir ${SRC:.c=.o}}} + +SRC_VPATH := mui tests +SRC_VPATH += ../ui_gl +vpath %.c $(SRC_VPATH) + +CPPFLAGS += -I../contrib + +VERSION := ${shell git log -1 --date=short --pretty="%h %cd"} +CPPFLAGS += -DUI_VERSION="\"$(VERSION)\"" + +TARGET_LIB := $(LIB)/libmui.a + +all : $(BIN)/mui_playground $(LIB)/ui_tests.so + +.PHONY : static + +static : $(TARGET_LIB) + +ifeq ($(V),1) +Q := +else +Q := @ +endif + +$(TARGET_LIB) : $(MUI_OBJ) | $(LIB) + @echo " AR $@" + $(Q)$(AR) rcs $@ $^ + +$(OBJ)/ui_tests.o : CPPFLAGS += -Itests -I../ui_gl +$(LIB)/ui_tests.so : $(OBJ)/mii_mui_slots.o +$(LIB)/ui_tests.so : $(OBJ)/mii_mui_loadbin.o +$(LIB)/ui_tests.so : $(OBJ)/mii_mui_1mb.o +$(LIB)/ui_tests.so : $(OBJ)/mii_mui_2dsk.o + +# use a .temp file, otherwise the playground tries to reload before the file +# is fully written, and it fails. +# the ${filter} are there to make the sure object files are linked before the .a +$(LIB)/ui_tests.so : $(OBJ)/ui_tests.o $(LIB)/libmui.a | $(O) + @echo " LDSO $@" + $(Q)$(CC) $(CPPFLAGS) $(CFLAGS) -shared -fPIC -o $@.temp \ + ${filter %.o, $^} ${filter %.a, $^} $(LDLIBS) && \ + mv $@.temp $@ + +$(BIN)/mui_playground : $(OBJ)/mui_playground.o $(LIB)/libmui.a + +$(OBJ)/%.o : %.c | $(OBJ) + @echo " CC " ${filter -O%, $(CPPFLAGS) $(CFLAGS)} " $<" + $(Q)$(CC) -MMD $(CPPFLAGS) $(CFLAGS) -c -o $@ $< + +$(BIN)/% : | $(BIN) + @echo " LD $@" + $(Q)$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) + +$(O) $(OBJ) $(BIN) $(LIB): + @mkdir -p $@ + +clean : + rm -rf $(O) + +# This is for development purpose. This will recompile the project +# everytime a file is modified. +watch : + while true; do \ + clear; $(MAKE) -j all; \ + inotifywait -qre close_write mui tests ../ui_gl; \ + done + +compile_commands.json: lsp +lsp: + { $$(which gmake) CC=gcc V=1 --always-make --dry-run all ; } | \ + sh ../utils/clangd_gen.sh >compile_commands.json + +-include $(OBJ)/*.d diff --git a/libmui/README.md b/libmui/README.md new file mode 100644 index 0000000..941461c --- /dev/null +++ b/libmui/README.md @@ -0,0 +1,132 @@ + +# What is this? +This is a contender for the World Record for Feature Creep Side Project. It is pretty high in the contender list as it's a bolt on to *another* contender for the World Record for Feature Creep Side Project (the MII Apple //e emulator). + +It is a library that duplicate a lot of a Macintosh Classic "Toolbox" APIs. It is not a complete implementation, but it is enough to make a few simple applications, also, all the bits I needed for the MII emulator. + +# Why? +Well I wanted a UI library for MII -- something without tons of dependencies, and I didn't want the typical 'game like' style with "Arrow Keys + Return + Escape" sort of menus. + +I started with Nuklear immediate mode UI, but it both look super ugly, AND is very limited as soon as you want to do something 'custom', and I didn't see myself hacking into that codebase. One thing I particularly dislike is the 'layout' engine that decide to put stuff where it wants, and it's *never* in the 'right' place, like a hard case of 'computer say so' -- typicaly result into +something like Programmer's Art. That's why Linux On The Deskop is famous for it's Pixel Perfection polished UIs. *Cough*. + +The other things I don't like with the trendy IM UIs is that they promise you that you don't have to keep a separate state around blah blah, however they forget to mention that there IS a state kept for you, based on hash values, and if you are unlucky enough to have a hash clash, you are screwed. I've seen that happen in real life, and it's not pretty to debug. + +Also, I realized I had quite a few bits that I could use to make my own library anyway, so I started to do that. + +Also, I like making my own toys. There, happy now? + +# What can it do? +Well, it has a few of the classic 'managers' that the Macintosh Toolbox had. Or the later GS/OS. However it behaves more like a modern system, it's not 'synchronous' like the old toolbox. Stuff gets redrawn even if you are clicking/dragging etc without having to 'do it yourself'. + +It is designed to draw into a 'screen' that is an ARGB buffer. You can then copy that to wherever you fancy. + * In the case of MII, it's an OpenGL texture that gets overlayed; + * In the 'example' folder, the playground demo copies it to an X11 window via a XCB 'shared' pixmap, so works great even via remote X11. +The library is 'smart', like the old OSes, it keeps track of 'invalid' regions, and only redraws what is needed, so theres very very little overdraw. + +One small drawback is that the output *has* to be ARGB -- so if you want to render say on a 16 bit framebuffer, you'll have to do the conversion yourself, +luckily, you only have to draw/convert the 'dirty' regions, so it's not too bad. + +It could be possible to 'vectorize' the rendering to vertice buffers and stuff, but really, it's not needed, it's fast enough as it is and it would fall back the 'lets redraw everything' behaviour of the IMmediate UI libraries. + +# How does it differ from the original? +Well, in terms of looks, it's kinda like I started with MacOS8/9, but removed all the grayscale bits. +Bizarelly, I think System 7 'flat' looks has aged better than the 'grayscale' look of 8/9, so I went with that. Most of the 'visible' difference are really related to the dialog's popup menus, which are a lot more 'OS8' than 'OS7'. + +In terms of of the API, one massive change is that it is fully asynchronous, and +you *can't* just spinloop and draw things in a window or GrafPort whenever you feel like it, like on the original. Instead, you change the state of the UI, and it will redraw itself when it needs to. This is a lot more like modern UI libraries in that respect. + +Many things will look familiar, if like me you were a developer back then, +I tried to use most of the names of things as is; and I even have all the +elements drawn by WDEF, CDEF, LDEF functions, which is fun. Also pretty easy +to customize. by adding your own, like in the old days. + +Also, for the API, it's all 'callback' based. No more polling. You don't have +to 'ask' the UI if something happened, it will tell you when it does. This is +also a lot more like modern UI libraries. + +It is also a lot simpler than the original in concept; everything is either a *mui_window* (Well, windows, menubars and menus) OR a *mui_control* (Menu titles, menu items, everything in windows, even separator lines). + +## Window Manager +It can create windows, and it can draw into them. Has up to 15 'layers', and can do clipping and stuff. Got the typical 'BringToFront' behaviour, and you can drag windows around. + +I deliberately limited the number of coordinate systems to 2 -- like the old one; so you get the 'screen coordinates' and the 'window content coordinates'. I was half tempted to create a fully hierarchical system, but realized it was really not neeeded, and would just make things more complicated. + +It's a 'smart' window manager, it keeps track of an 'invalid' list of rectangles, and clips to that when redrawing, so it doesn't redraw the whole window every time, yeah, like the original. None of that 'lets redraw absolutely everything every frame' stuff. + - It's missing bits like 'zooming' (TODO), and 'resizing' (TODO). + - It doesn't do transparent windows. It is by design, it draws windows 'top down' to optimize clipping -- adding transparency wouldn't be hard, but I'd have to draw the windows 'bottom up' to handle blending, and we'd revert back to drawing a lot of stuff for very little return. + - Also, you can always alpha blend the whole *ui* 'screen' to wherever you want, so it's not like you can't have transparency. + +## Menu Manager +Menubar, menus, checkmarks, keyboard shortcuts, all that stuff. Made to looks like System 7/8, or GS/OS. This was the most complicated bit to do, and it's still not perfect -- turns out the original had quite a few features that are not obvious at first glance. + - It has hierarchical menus, they don't behave *perfectly* like the original yet, I'll have to revisit that for a better match. + - It's missing displaying and scrolling super large popups (TODO). + + It will call your 'action' callback when you click on a menu item, or when you press the key of a keyboard shortcut. Easy, peasy. + + There is half baked support for sticky menus, but it's disabled for now as it's not quite right yet. + +## Control Manager +Buttons, checkboxes, radio buttons, scrollbars (vertical), wrapping textboxes, all that stuff. + - It's missing bits like Edit Field (TODO), and a Slider. +## List Manager +More or less hard coded to display filenames so far, but plain lists are actually easier than this so. Handle arrow keys/page up/down, scroll wheel, etc. + - It's missing a way to 'compress' the font and/or use ellipsis abreviations (TODO) when the item text is too long. +## Alerts +It has the typical 'Cancel'+'OK' alert. + - Could do with more types of alerts (TODO). +## Standard File +It has the classic 'Open' a file dialog. Haven't needed the other one. yet. + - Could do with a 'Save' dialog (TODO). + - Maybe a 'period correct' way to handle previously visited folders... +## Resource Manager +Nope! Not there; I'd need some sort of ResEdit and stuff -- and now that is *ONE* Feature Creep Too Far thank you very much. +I have a vague idea of making some sort of MessagePack format for resources, but that's for another day. + +# So, what *are* the dependencies? +Well, *external* dependencies are just *libpixman* -- that's it. It's a library that does pixel pushing, it's used everywhere, it's massively optimized, and it has 'regions' which are super useful for clipping -- they aren't *as good* as the regions in QuickDraw, but they are good enough. + +Other bits I used to make it are rolled into the source code anyway, so it's not like you need to install them. +* libpixman: as mentioned, you'll need libpixman-dev installed. +* [libcg](https://github.com/xboot/libcg): a small antialiased renderer that looks vaguely like *cairo* but comes in just 2 files, with a nice licence. It's likely far from being the most optimized, but it's largely good enough. +* [stb_truetype.h](https://github.com/nothings/stb): a small library to load truetype fonts, it's used to load the system fonts. +* stb_ttc.h: my own extension to stb_truetype.h, makes up a font/glyph dictionary with hash tables, font textures etc. + +That's it, all the other bits I already had 'in stock' -- the 2D geometry bits I made 25+ years ago, they were rolled in [libc3](https://github.com/buserror/simreprap) as well. + +# How do I build it? +It's a simple Makefile, so you just need to do a 'make' in the root directory. It will build the library, and the tests/demos/samples. +To build the tests/demos/samples, you'll need: +* xcb xcb-shm xcb-randr xkbcommon-x11 -- this is just to run the 'playground' demo, which is a simple window with a few buttons and stuff. +## Nvidia Driver gotcha +* *Note* that if you use the nvidia binary driver (I do), you will need to add a flag to your config, otherwise the playground won't work. + - Add: 'Option \"AllowSHMPixmaps\" \"1\"' to the "Device" In your /etc/X11/xorg.conf file. + +# How do I use it? +Well the best way is to hack around *mui_playground.c* and *ui_tests.c*. It's a simple window with a few buttons and stuff, and it's a good place to start. + +The cool thing about ui_playground is that it loads ui_test.so as a *plugin* and auto-reload it if it detects a change. So you can hack around ui_test.c, and it will reload it and run it again! You can code a new dialog insanely fast with that, pretty must as fast as you would with a resource editor. + +A good trick is to use 'make watch' on the *libmui* directory in a terminal tab, and it will rebuild the library and the playground automatically when you change something, that with the 'auto save' of your editor, and you will have a constantly building/running playground as you hack around. + +Have fun! + +# FAQ! + * Ok so, is there a dark mode? + - nope + * Fine, but at least it is themable, right? + - nope + * Tranparent Windows and a Cube Effect ?!@?! + - nope + * What, menu aren't sticky? They don't stay up when you release the mouse button? Common throw us a bone here man, it's 2023! + - nope + * But, is it at least using the super trendy tools? cmake? meson? ninja? + - nope + * What about autotools, seriously? + - nope + * Are there any bindings for any of the fancy new languages? Rust? Go? Python? + - nope + * Is it using any of the super trendy framerworks? GTK? QT? + - nope + * What about SDL? It's cross Platform, it is Ugly Everywhere Equally! + - nope + * And Wayland then? Wayland is The Future after all! + - nope diff --git a/libmui/fonts/Cairo.ttf b/libmui/fonts/Cairo.ttf new file mode 100644 index 0000000..7e7213c Binary files /dev/null and b/libmui/fonts/Cairo.ttf differ diff --git a/libmui/fonts/Charcoal_mui.sfd b/libmui/fonts/Charcoal_mui.sfd new file mode 100644 index 0000000..bbe6733 --- /dev/null +++ b/libmui/fonts/Charcoal_mui.sfd @@ -0,0 +1,31701 @@ +SplineFontDB: 3.2 +FontName: Charcoal +FullName: Charcoal +FamilyName: Charcoal +Weight: Book +Copyright: (c)1995-1997 The Font Bureau, Inc. All Rights Reserved.\n* 2023 Michel Pollet -- Added some glyphs for libmui +Version: 3.2 +ItalicAngle: 0 +UnderlinePosition: 0 +UnderlineWidth: 0 +Ascent: 1536 +Descent: 512 +InvalidEm: 0 +sfntRevision: 0x00010000 +LayerCount: 2 +Layer: 0 1 "Back" 1 +Layer: 1 1 "Fore" 0 +XUID: [1021 220 -731427345 9134032] +StyleMap: 0x0040 +FSType: 0 +OS2Version: 0 +OS2_WeightWidthSlopeOnly: 0 +OS2_UseTypoMetrics: 0 +CreationTime: 830956166 +ModificationTime: 1700234837 +PfmFamily: 81 +TTFWeight: 400 +TTFWidth: 5 +LineGap: 171 +VLineGap: 0 +Panose: 0 0 0 0 0 0 0 0 0 0 +OS2TypoAscent: 1536 +OS2TypoAOffset: 0 +OS2TypoDescent: -512 +OS2TypoDOffset: 0 +OS2TypoLinegap: 171 +OS2WinAscent: 2048 +OS2WinAOffset: 0 +OS2WinDescent: 512 +OS2WinDOffset: 0 +HheadAscent: 2048 +HheadAOffset: 0 +HheadDescent: -512 +HheadDOffset: 0 +OS2SubXSize: 1434 +OS2SubYSize: 1331 +OS2SubXOff: 0 +OS2SubYOff: 293 +OS2SupXSize: 1434 +OS2SupYSize: 1331 +OS2SupXOff: 0 +OS2SupYOff: 928 +OS2StrikeYSize: 102 +OS2StrikeYPos: 530 +OS2Vendor: 'Alts' +OS2UnicodeRanges: 00000000.00000000.00000000.00000000 +MarkAttachClasses: 1 +DEI: 91125 +TtTable: prep +NPUSHB + 98 + 63 + 37 + 63 + 38 + 79 + 37 + 3 + 39 + 37 + 38 + 31 + 39 + 37 + 38 + 31 + 38 + 37 + 38 + 31 + 36 + 37 + 38 + 31 + 15 + 37 + 47 + 37 + 95 + 37 + 143 + 37 + 191 + 37 + 208 + 37 + 6 + 208 + 72 + 1 + 116 + 117 + 160 + 15 + 16 + 86 + 1 + 115 + 34 + 224 + 15 + 26 + 42 + 160 + 15 + 97 + 42 + 160 + 15 + 64 + 51 + 80 + 51 + 96 + 51 + 112 + 51 + 128 + 51 + 144 + 51 + 6 + 45 + 47 + 160 + 15 + 95 + 47 + 1 + 80 + 58 + 1 + 208 + 58 + 1 + 58 + 42 + 224 + 15 + 42 + 30 + 200 + 15 + 43 + 35 + 160 + 15 + 34 + 35 +PUSHW_1 + 416 +NPUSHB + 20 + 15 + 127 + 46 + 1 + 144 + 46 + 1 + 16 + 62 + 32 + 62 + 48 + 62 + 3 + 33 + 31 + 224 + 15 + 35 + 31 +PUSHW_1 + 352 +NPUSHB + 51 + 15 + 30 + 31 + 224 + 15 + 41 + 31 + 224 + 15 + 63 + 211 + 1 + 204 + 205 + 224 + 15 + 16 + 90 + 80 + 90 + 96 + 90 + 112 + 87 + 144 + 89 + 144 + 90 + 6 + 110 + 111 + 160 + 15 + 113 + 114 + 18 + 31 + 76 + 75 + 224 + 15 + 15 + 74 + 31 + 74 + 2 + 48 + 95 + 1 + 68 + 69 +PUSHW_1 + 288 +NPUSHB + 12 + 15 + 63 + 69 + 79 + 69 + 2 + 73 + 89 + 224 + 15 + 65 + 22 +PUSHW_1 + 416 +PUSHB_3 + 15 + 71 + 22 +PUSHW_1 + 288 +PUSHB_7 + 15 + 84 + 22 + 160 + 15 + 27 + 25 +PUSHW_1 + 352 +PUSHB_3 + 15 + 25 + 23 +PUSHW_1 + 352 +PUSHB_3 + 15 + 24 + 22 +PUSHW_1 + 288 +NPUSHB + 17 + 15 + 48 + 49 + 224 + 15 + 80 + 59 + 208 + 59 + 2 + 112 + 59 + 128 + 59 + 2 + 63 + 22 +PUSHW_1 + 416 +PUSHB_3 + 15 + 60 + 45 +PUSHW_1 + 288 +PUSHB_3 + 15 + 23 + 22 +PUSHW_1 + 416 +PUSHB_3 + 15 + 22 + 20 +PUSHW_1 + 352 +PUSHB_7 + 15 + 57 + 20 + 224 + 15 + 28 + 21 +PUSHW_1 + 288 +NPUSHB + 74 + 15 + 21 + 20 + 224 + 15 + 20 + 22 + 224 + 15 + 16 + 22 + 1 + 48 + 103 + 1 + 78 + 77 + 15 + 31 + 63 + 77 + 1 + 15 + 112 + 31 + 112 + 2 + 15 + 11 + 55 + 31 + 13 + 12 + 46 + 31 + 16 + 12 + 1 + 95 + 11 + 159 + 11 + 223 + 11 + 3 + 11 + 10 + 38 + 31 + 82 + 81 + 38 + 31 + 63 + 81 + 1 + 78 + 77 + 46 + 31 + 5 + 4 + 46 + 31 + 3 + 2 + 46 + 31 + 1 + 0 + 38 + 31 + 50 + 1 +PUSHW_1 + 511 +SCANCTRL +SCANTYPE +MPPEM +GTEQ +IF +PUSHB_1 + 128 +SCVTCI +EIF +SVTCA[y-axis] +CALL +CALL +CALL +CALL +DELTAC1 +CALL +CALL +DELTAC3 +DELTAC1 +CALL +CALL +DELTAC1 +DELTAC1 +CALL +DELTAC1 +SVTCA[x-axis] +DELTAC1 +CALL +CALL +CALL +CALL +CALL +CALL +CALL +CALL +DELTAC2 +DELTAC3 +CALL +CALL +CALL +CALL +CALL +CALL +CALL +CALL +DELTAC1 +CALL +DELTAC1 +DELTAC1 +CALL +CALL +CALL +DELTAC1 +CALL +DELTAC1 +SVTCA[y-axis] +CALL +CALL +CALL +CALL +DELTAC1 +DELTAC3 +DELTAC1 +CALL +CALL +CALL +CALL +DELTAC2 +DELTAC3 +DELTAC1 +CALL +DELTAC1 +CALL +CALL +CALL +DELTAC1 +CALL +DELTAC1 +DELTAC1 +CALL +CALL +CALL +CALL +DELTAC1 +EndTTInstrs +TtTable: fpgm +PUSHB_3 + 16 + 31 + 15 +FDEF +SWAP +DUP +ROLL +ROLL +RCVT +LT +IF +POP +POP +ELSE +RCVT +WCVTP +EIF +ENDF +FDEF +MPPEM +GT +IF +RCVT +WCVTP +ELSE +POP +POP +EIF +ENDF +FDEF +SWAP +DUP +ROLL +ROLL +RCVT +LT +IF +POP +POP +ELSE +RCVT +PUSHB_1 + 64 +SUB +WCVTP +EIF +ENDF +EndTTInstrs +ShortTable: cvt 229 + 0 + -25 + 0 + -25 + 0 + -25 + -1 + -1 + -1 + -1 + 1509 + 1530 + 1151 + 1180 + 1509 + 1532 + 1509 + 1530 + -342 + -362 + 340 + 342 + 319 + 332 + 309 + 338 + 235 + 322 + 355 + -1 + 232 + 213 + 174 + 191 + 225 + 230 + 1323 + 1354 + 1317 + 1335 + 57 + 186 + 252 + 255 + -1 + 244 + 185 + 217 + 245 + 285 + -1 + 82 + 213 + 60 + 31 + 308 + 307 + 294 + 245 + 292 + 235 + 295 + 338 + 336 + 45 + 319 + 319 + 23 + 238 + 226 + 799 + 326 + 326 + 184 + 1327 + 144 + 158 + 580 + 562 + 463 + 66 + 590 + 569 + 738 + 340 + 340 + 336 + 707 + 258 + 170 + 518 + 354 + 202 + 209 + 164 + 619 + 272 + 223 + 242 + 227 + 209 + 349 + 152 + -178 + 363 + 186 + 279 + 263 + 279 + 291 + 188 + 169 + 696 + 209 + 175 + 197 + 195 + 143 + 160 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 268 + 208 + 168 + 168 + 172 + 170 + 108 + 106 + 180 + 570 + 131 + 1690 + 120 + 140 + 137 + 156 + 163 + 189 + -171 + 288 + 912 + 280 + 598 + 226 + 244 + 220 + 250 + 130 + 48 +EndShort +ShortTable: maxp 16 + 1 + 0 + 456 + 96 + 7 + 70 + 4 + 2 + 16 + 22 + 32 + 0 + 326 + 450 + 3 + 1 +EndShort +LangName: 1033 "+AKkA-1995-1997 The Font Bureau, Inc. All Rights Reserved." "" "Regular" "Charcoal" "" "3.2" "" "Charcoal+AKoA is a trademark of Apple Computer, Inc." +Encoding: Custom +UnicodeInterp: none +NameList: AGL For New Fonts +DisplaySize: -96 +AntiAlias: 1 +FitToEm: 1 +WinInfo: 323 19 9 +BeginPrivate: 0 +EndPrivate +BeginChars: 488 470 + +StartChar: .notdef +Encoding: 409 -1 0 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 6 + 2 + 7 + 1 + 0 + 4 + 0 + 9 + 7 + 1 + 8 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +877 0 m 1,0,-1 + 147 0 l 1,1,-1 + 147 1552 l 1,2,-1 + 877 1552 l 1,3,-1 + 877 0 l 1,0,-1 +727 150 m 1,4,-1 + 727 1403 l 1,5,-1 + 297 1403 l 1,6,-1 + 297 150 l 1,7,-1 + 727 150 l 1,4,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: .null +Encoding: 5 8 1 +AltUni2: 00001d.ffffffff.0 002400.ffffffff.0 00001d.ffffffff.0 002400.ffffffff.0 +Width: 0 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Validated: 1 +EndChar + +StartChar: nonmarkingreturn +Encoding: 10 13 2 +Width: 510 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Validated: 1 +EndChar + +StartChar: space +Encoding: 6 9 3 +AltUni2: 000020.ffffffff.0 000020.ffffffff.0 +Width: 510 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Validated: 1 +EndChar + +StartChar: exclam +Encoding: 24 33 4 +Width: 709 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 28 + 3 + 10 + 2 + 116 + 6 + 66 + 5 + 0 + 63 + 9 + 1 + 1 + 2 + 0 + 3 + 0 + 67 + 7 + 65 + 6 + 67 + 63 + 3 + 144 + 3 + 2 + 3 + 8 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rnd,black] +SRP1 +SRP2 +IP +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,white] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +537 1509 m 1,0,-1 + 498 514 l 1,1,-1 + 211 514 l 1,2,-1 + 172 1509 l 1,3,-1 + 537 1509 l 1,0,-1 +514 0 m 1,4,-1 + 195 0 l 1,5,-1 + 195 319 l 1,6,-1 + 514 319 l 1,7,-1 + 514 0 l 1,4,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: quotedbl +Encoding: 25 34 5 +Width: 1020 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 34 + 2 + 6 + 3 + 7 + 16 + 1 + 53 + 0 + 2 + 53 + 3 + 5 + 53 + 4 + 6 + 53 + 7 + 0 + 84 + 16 + 3 + 144 + 3 + 2 + 3 + 4 + 84 + 15 + 7 + 31 + 7 + 2 + 7 + 8 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rnd,black] +SRP0 +MIRP[rnd,black] +SRP0 +MIRP[rnd,black] +SRP0 +MIRP[rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +938 1509 m 1,0,-1 + 872 1024 l 1,1,-1 + 649 1024 l 1,2,-1 + 596 1509 l 1,3,-1 + 938 1509 l 1,0,-1 +426 1509 m 1,4,-1 + 360 1024 l 1,5,-1 + 137 1024 l 1,6,-1 + 84 1509 l 1,7,-1 + 426 1509 l 1,4,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: numbersign +Encoding: 26 35 6 +Width: 1528 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 5 + 4 + 1 + 0 + 9 + 31 + 28 + 24 + 25 + 27 + 2 + 3 + 6 + 7 + 10 + 26 + 8 + 12 + 19 + 18 + 15 + 14 + 12 + 13 + 16 + 17 + 20 + 21 + 23 + 29 + 30 + 10 + 11 + 10 + 22 + 12 + 12 + 33 + 32 + 10 + 9 + 6 + 3 + 13 + 68 + 30 + 31 + 3 + 3 + 79 + 16 + 1 + 16 + 20 + 29 + 28 + 2 + 3 + 17 + 68 + 23 + 24 + 27 + 3 + 20 + 12 + 22 + 25 + 26 + 3 + 21 + 10 + 11 + 8 + 7 + 3 + 12 + 0 +SVTCA[y-axis] +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +MIRP[rp0,min,rnd,black] +SLOOP +ALIGNRP +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +SLOOP +ALIGNRP +MIRP[rp0,min,rnd,black] +SLOOP +ALIGNRP +SVTCA[x-axis] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,min,rnd,black] +SLOOP +IP +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,black] +SLOOP +IP +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1528 1151 m 1,0,-1 + 1466 911 l 1,1,-1 + 1090 911 l 1,2,-1 + 1016 598 l 1,3,-1 + 1405 598 l 1,4,-1 + 1348 358 l 1,5,-1 + 961 358 l 1,6,-1 + 872 0 l 1,7,-1 + 700 0 l 1,8,-1 + 786 358 l 1,9,-1 + 553 358 l 1,10,-1 + 467 0 l 1,11,-1 + 295 0 l 1,12,-1 + 379 358 l 1,13,-1 + 0 358 l 1,14,-1 + 53 598 l 1,15,-1 + 436 598 l 1,16,-1 + 510 911 l 1,17,-1 + 123 911 l 1,18,-1 + 176 1151 l 1,19,-1 + 567 1151 l 1,20,-1 + 651 1509 l 1,21,-1 + 829 1509 l 1,22,-1 + 743 1151 l 1,23,-1 + 973 1151 l 1,24,-1 + 1057 1509 l 1,25,-1 + 1233 1509 l 1,26,-1 + 1147 1151 l 1,27,-1 + 1528 1151 l 1,0,-1 +915 911 m 1,28,-1 + 686 911 l 1,29,-1 + 610 598 l 1,30,-1 + 842 598 l 1,31,-1 + 915 911 l 1,28,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: dollar +Encoding: 27 36 7 +Width: 1195 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 160 + 54 + 14 + 56 + 47 + 85 + 35 + 101 + 18 + 101 + 22 + 119 + 47 + 217 + 13 + 231 + 48 + 247 + 48 + 9 + 5 + 48 + 1 + 43 + 34 + 36 + 47 + 88 + 47 + 3 + 26 + 33 + 34 + 47 + 48 + 3 + 6 + 25 + 117 + 4 + 1 + 4 + 43 + 43 + 71 + 43 + 2 + 23 + 37 + 43 + 14 + 13 + 6 + 6 + 24 + 117 + 5 + 1 + 5 + 25 + 24 + 4 + 32 + 5 + 1 + 5 + 5 + 24 + 6 + 34 + 6 + 43 + 22 + 34 + 22 + 43 + 4 + 34 + 43 + 0 + 40 + 57 + 47 + 1 + 47 + 14 + 44 + 17 + 17 + 40 + 44 + 0 + 4 + 6 + 23 + 10 + 70 + 48 + 13 + 30 + 9 + 3 + 4 + 6 + 5 + 30 + 70 + 33 + 37 + 30 + 29 + 26 + 24 + 23 + 15 + 9 + 44 + 73 + 44 + 2 + 6 + 13 + 14 + 43 + 37 + 23 + 24 + 26 + 33 + 34 + 47 + 48 + 3 + 4 + 14 + 25 + 5 + 5 + 0 + 20 + 79 + 30 + 95 + 30 + 111 + 30 + 3 + 30 + 0 + 23 + 32 + 44 + 80 + 44 + 2 + 44 + 40 + 23 + 9 + 20 + 51 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,min,rnd,black] +SLOOP +IP +DELTAP2 +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MDRP[grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SROUND +MDRP[rnd,grey] +RTG +MIAP[rnd] +MDRP[min,rnd,grey] +MDRP[grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +IP +DELTAP1 +SRP1 +SRP2 +IP +IP +DELTAP1 +SVTCA[x-axis] +SPVTL[orthog] +SRP0 +DELTAP1 +MDRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,black] +SPVTCA[x-axis] +SRP1 +DELTAP1 +SRP2 +SLOOP +IP +DELTAP1 +SRP1 +DELTAP1 +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1115 451 m 0,0,1 + 1115 252 1115 252 981 126 c 128,-1,2 + 847 0 847 0 613 -16 c 1,3,-1 + 597 -170 l 1,4,-1 + 452 -170 l 1,5,-1 + 468 -20 l 1,6,7 + 341 -18 341 -18 257 -4 c 128,-1,8 + 173 10 173 10 95 33 c 1,9,-1 + 97 279 l 1,10,11 + 148 256 148 256 237.5 228.5 c 128,-1,12 + 327 201 327 201 490 199 c 1,13,-1 + 544 668 l 1,14,15 + 533 672 533 672 520 677 c 128,-1,16 + 507 682 507 682 492 688 c 0,17,18 + 337 750 337 750 230.5 849 c 128,-1,19 + 124 948 124 948 124 1114 c 0,20,21 + 124 1307 124 1307 269.5 1413.5 c 128,-1,22 + 415 1520 415 1520 638 1528 c 1,23,-1 + 656 1700 l 1,24,-1 + 804 1700 l 1,25,-1 + 783 1524 l 1,26,27 + 855 1518 855 1518 919.5 1506.5 c 128,-1,28 + 984 1495 984 1495 1033 1481 c 1,29,-1 + 1033 1253 l 1,30,31 + 959 1282 959 1282 898 1292.5 c 128,-1,32 + 837 1303 837 1303 759 1307 c 1,33,-1 + 716 911 l 1,34,35 + 955 811 955 811 1035 698.5 c 128,-1,36 + 1115 586 1115 586 1115 451 c 0,0,1 +613 1309 m 1,37,38 + 527 1294 527 1294 465.5 1262.5 c 128,-1,39 + 404 1231 404 1231 404 1165 c 0,40,41 + 404 1100 404 1100 434 1060 c 128,-1,42 + 464 1020 464 1020 576 971 c 1,43,-1 + 613 1309 l 1,37,38 +814 391 m 0,44,45 + 814 451 814 451 787.5 502 c 128,-1,46 + 761 553 761 553 681 600 c 1,47,-1 + 638 203 l 1,48,49 + 710 217 710 217 762 259 c 128,-1,50 + 814 301 814 301 814 391 c 0,44,45 +EndSplineSet +Validated: 1 +EndChar + +StartChar: percent +Encoding: 28 37 8 +Width: 1877 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 129 + 4 + 1 + 11 + 5 + 11 + 8 + 4 + 12 + 7 + 15 + 4 + 19 + 11 + 23 + 11 + 26 + 4 + 30 + 20 + 1 + 27 + 5 + 27 + 8 + 20 + 12 + 21 + 15 + 20 + 19 + 27 + 23 + 27 + 26 + 20 + 30 + 37 + 15 + 42 + 17 + 53 + 15 + 54 + 16 + 56 + 17 + 23 + 14 + 14 + 16 + 4 + 43 + 89 + 3 + 87 + 36 + 89 + 10 + 15 + 50 + 89 + 28 + 87 + 57 + 89 + 21 + 5 + 63 + 17 + 1 + 17 + 1 + 14 + 18 + 14 + 52 + 14 + 112 + 14 + 128 + 14 + 5 + 48 + 14 + 1 + 48 + 14 + 1 + 14 + 49 + 15 + 1 + 15 + 63 + 16 + 1 + 63 + 16 + 1 + 16 + 6 + 18 + 88 + 46 + 90 + 54 + 88 + 63 + 24 + 159 + 24 + 2 + 24 + 6 + 0 + 88 + 32 + 90 + 40 + 88 + 31 + 6 + 48 + 6 + 176 + 6 + 3 + 6 + 60 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP1 +MDRP[min,grey] +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP1 +DELTAP1 +MDRP[rp0,min,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +863 1153 m 2,0,1 + 863 1006 863 1006 758.5 915.5 c 128,-1,2 + 654 825 654 825 482 825 c 0,3,4 + 312 825 312 825 200.5 919.5 c 128,-1,5 + 89 1014 89 1014 89 1151 c 2,6,-1 + 89 1206 l 2,7,8 + 89 1333 89 1333 190.5 1432.5 c 128,-1,9 + 292 1532 292 1532 482 1532 c 0,10,11 + 662 1532 662 1532 762.5 1439 c 128,-1,12 + 863 1346 863 1346 863 1206 c 2,13,-1 + 863 1153 l 2,0,1 +1580 1509 m 1,14,-1 + 545 0 l 1,15,-1 + 289 0 l 1,16,-1 + 1324 1509 l 1,17,-1 + 1580 1509 l 1,14,-1 +1778 305 m 2,18,19 + 1778 139 1778 139 1672.5 58 c 128,-1,20 + 1567 -23 1567 -23 1400 -23 c 0,21,22 + 1219 -23 1219 -23 1112.5 69.5 c 128,-1,23 + 1006 162 1006 162 1006 303 c 2,24,-1 + 1006 358 l 2,25,26 + 1006 481 1006 481 1108.5 582.5 c 128,-1,27 + 1211 684 1211 684 1400 684 c 0,28,29 + 1580 684 1580 684 1679 592 c 128,-1,30 + 1778 500 1778 500 1778 358 c 2,31,-1 + 1778 305 l 2,18,19 +607 1163 m 2,32,-1 + 607 1180 l 2,33,34 + 607 1262 607 1262 583.5 1312 c 128,-1,35 + 560 1362 560 1362 482 1362 c 0,36,37 + 406 1362 406 1362 376.5 1314 c 128,-1,38 + 347 1266 347 1266 347 1180 c 2,39,-1 + 347 1163 l 2,40,41 + 347 1094 347 1094 375.5 1037.5 c 128,-1,42 + 404 981 404 981 484 981 c 0,43,44 + 556 981 556 981 581.5 1033 c 128,-1,45 + 607 1085 607 1085 607 1163 c 2,32,-1 +1524 315 m 2,46,-1 + 1524 332 l 2,47,48 + 1524 414 1524 414 1500.5 464 c 128,-1,49 + 1477 514 1477 514 1400 514 c 0,50,51 + 1324 514 1324 514 1294 466 c 128,-1,52 + 1264 418 1264 418 1264 332 c 2,53,-1 + 1264 315 l 2,54,55 + 1264 246 1264 246 1293 189.5 c 128,-1,56 + 1322 133 1322 133 1402 133 c 0,57,58 + 1473 133 1473 133 1498.5 185.5 c 128,-1,59 + 1524 238 1524 238 1524 315 c 2,46,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: ampersand +Encoding: 29 38 9 +Width: 1450 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 143 + 6 + 7 + 9 + 10 + 11 + 16 + 10 + 19 + 5 + 23 + 5 + 26 + 8 + 30 + 25 + 11 + 26 + 16 + 27 + 19 + 21 + 23 + 21 + 26 + 22 + 35 + 29 + 52 + 37 + 23 + 153 + 11 + 234 + 14 + 17 + 36 + 49 + 68 + 49 + 84 + 49 + 102 + 49 + 4 + 49 + 27 + 30 + 37 + 4 + 0 + 46 + 37 + 52 + 41 + 55 + 58 + 55 + 74 + 55 + 90 + 55 + 185 + 6 + 6 + 15 + 55 + 52 + 6 + 4 + 0 + 18 + 34 + 33 + 33 + 18 + 46 + 3 + 9 + 43 + 31 + 21 + 11 + 61 + 31 + 9 + 1 + 0 + 0 + 47 + 30 + 1 + 49 + 27 + 30 + 37 + 4 + 0 + 46 + 29 + 6 + 41 + 52 + 37 + 55 + 3 + 15 + 55 + 52 + 6 + 4 + 18 + 40 + 88 + 32 + 24 + 1 + 128 + 24 + 208 + 24 + 2 + 24 + 46 + 88 + 18 + 24 + 18 + 34 + 12 + 33 + 34 + 31 + 3 + 43 + 3 + 2 + 3 + 0 + 65 + 58 + 24 + 12 + 64 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,rnd,white] +MDRP[min,grey] +DELTAP1 +MDRP[rp0,rnd,grey] +MDRP[rp0,min,grey] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SRP1 +SLOOP +IP +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[min,rnd,black] +SRP2 +SLOOP +IP +MDAP[rnd] +MDRP[grey] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1436 0 m 1,0,1 + 1354 0 1354 0 1276 0 c 128,-1,2 + 1198 0 1198 0 1120 0 c 1,3,4 + 1071 49 1071 49 1041.5 82 c 128,-1,5 + 1012 115 1012 115 963 168 c 1,6,7 + 864 59 864 59 748.5 17 c 128,-1,8 + 633 -25 633 -25 518 -25 c 0,9,10 + 293 -25 293 -25 178 79.5 c 128,-1,11 + 63 184 63 184 63 358 c 0,12,13 + 63 512 63 512 146 620.5 c 128,-1,14 + 229 729 229 729 408 848 c 1,15,16 + 287 991 287 991 261.5 1060.5 c 128,-1,17 + 236 1130 236 1130 236 1190 c 0,18,19 + 236 1339 236 1339 340 1434.5 c 128,-1,20 + 444 1530 444 1530 612 1530 c 0,21,22 + 811 1530 811 1530 909.5 1435.5 c 128,-1,23 + 1008 1341 1008 1341 1008 1206 c 0,24,25 + 1008 1085 1008 1085 947.5 1001.5 c 128,-1,26 + 887 918 887 918 729 805 c 1,27,28 + 782 733 782 733 832.5 675.5 c 128,-1,29 + 883 618 883 618 963 518 c 1,30,31 + 1044 608 1044 608 1087 683 c 128,-1,32 + 1130 758 1130 758 1178 885 c 1,33,-1 + 1403 762 l 1,34,35 + 1364 645 1364 645 1287 521 c 128,-1,36 + 1210 397 1210 397 1141 328 c 1,37,38 + 1266 190 1266 190 1326 122.5 c 128,-1,39 + 1386 55 1386 55 1436 0 c 1,0,1 +743 1176 m 0,40,41 + 743 1235 743 1235 715.5 1274 c 128,-1,42 + 688 1313 688 1313 616 1313 c 0,43,44 + 549 1313 549 1313 523.5 1269 c 128,-1,45 + 498 1225 498 1225 498 1182 c 0,46,47 + 498 1159 498 1159 517.5 1119 c 128,-1,48 + 537 1079 537 1079 600 993 c 1,49,50 + 672 1051 672 1051 707.5 1092 c 128,-1,51 + 743 1133 743 1133 743 1176 c 0,40,41 +795 360 m 1,52,53 + 713 455 713 455 667 510 c 128,-1,54 + 621 565 621 565 549 657 c 1,55,56 + 453 573 453 573 410 509.5 c 128,-1,57 + 367 446 367 446 367 381 c 0,58,59 + 367 311 367 311 409 271 c 128,-1,60 + 451 231 451 231 537 231 c 0,61,62 + 602 231 602 231 665.5 259 c 128,-1,63 + 729 287 729 287 795 360 c 1,52,53 +EndSplineSet +Validated: 1 +EndChar + +StartChar: quotesingle +Encoding: 30 39 10 +Width: 512 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 17 + 2 + 3 + 16 + 1 + 53 + 0 + 2 + 53 + 0 + 84 + 15 + 3 + 31 + 3 + 2 + 3 + 4 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rnd,black] +SRP0 +MIRP[rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +417 1509 m 1,0,-1 + 380 1020 l 1,1,-1 + 132 1020 l 1,2,-1 + 96 1509 l 1,3,-1 + 417 1509 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: parenleft +Encoding: 31 40 11 +Width: 850 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 26 + 87 + 5 + 1 + 13 + 75 + 0 + 103 + 7 + 75 + 6 + 7 + 0 + 23 + 10 + 39 + 10 + 119 + 10 + 3 + 10 + 22 + 239 + 3 + 1 + 3 + 14 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +741 -178 m 1,0,1 + 479 -170 479 -170 281.5 61.5 c 128,-1,2 + 84 293 84 293 84 688 c 0,3,4 + 84 1022 84 1022 281.5 1285 c 128,-1,5 + 479 1548 479 1548 741 1556 c 1,6,-1 + 741 1407 l 1,7,8 + 616 1358 616 1358 509.5 1141 c 128,-1,9 + 403 924 403 924 403 688 c 0,10,11 + 403 434 403 434 509.5 227 c 128,-1,12 + 616 20 616 20 741 -29 c 1,13,-1 + 741 -178 l 1,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: parenright +Encoding: 32 41 12 +Width: 850 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 21 + 54 + 6 + 1 + 4 + 75 + 3 + 103 + 10 + 75 + 11 + 11 + 3 + 7 + 22 + 47 + 0 + 63 + 0 + 2 + 0 + 15 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +766 688 m 0,0,1 + 766 303 766 303 572.5 69.5 c 128,-1,2 + 379 -164 379 -164 109 -178 c 1,3,-1 + 109 -29 l 1,4,5 + 270 27 270 27 358 214 c 128,-1,6 + 446 401 446 401 446 688 c 0,7,8 + 446 924 446 924 348 1141 c 128,-1,9 + 250 1358 250 1358 109 1407 c 1,10,-1 + 109 1556 l 1,11,12 + 373 1556 373 1556 569.5 1309.5 c 128,-1,13 + 766 1063 766 1063 766 688 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: asterisk +Encoding: 33 42 13 +Width: 1102 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 50 + 63 + 0 + 54 + 4 + 48 + 8 + 48 + 9 + 58 + 13 + 63 + 17 + 122 + 11 + 117 + 15 + 8 + 4 + 1 + 7 + 89 + 13 + 16 + 10 + 63 + 19 + 1 + 52 + 0 + 1 + 0 + 59 + 9 + 1 + 9 + 4 + 47 + 13 + 59 + 13 + 239 + 13 + 3 + 63 + 13 + 1 + 13 + 13 + 19 + 18 +SRP1 +SRP2 +IP +RTHG +MDAP[rnd] +DELTAP1 +DELTAP1 +ALIGNRP +MDRP[min,rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +RTG +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1016 850 m 1,0,-1 + 750 850 l 1,1,-1 + 975 625 l 1,2,-1 + 852 502 l 1,3,-1 + 549 805 l 1,4,-1 + 246 502 l 1,5,-1 + 123 625 l 1,6,-1 + 348 850 l 1,7,-1 + 82 850 l 1,8,-1 + 82 1020 l 1,9,-1 + 334 1020 l 1,10,-1 + 123 1231 l 1,11,-1 + 246 1354 l 1,12,-1 + 549 1051 l 1,13,-1 + 852 1354 l 1,14,-1 + 975 1231 l 1,15,-1 + 764 1020 l 1,16,-1 + 1016 1020 l 1,17,-1 + 1016 850 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: plus +Encoding: 34 43 14 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 3 + 104 + 1 + 4 + 69 + 8 + 104 + 10 + 7 + 70 + 0 + 104 + 10 + 1 + 69 + 5 + 104 + 7 + 47 + 4 + 1 + 4 + 4 + 13 + 12 +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1075 582 m 1,0,-1 + 707 582 l 1,1,-1 + 707 225 l 1,2,-1 + 481 225 l 1,3,-1 + 481 582 l 1,4,-1 + 113 582 l 1,5,-1 + 113 799 l 1,6,-1 + 481 799 l 1,7,-1 + 481 1155 l 1,8,-1 + 707 1155 l 1,9,-1 + 707 799 l 1,10,-1 + 1075 799 l 1,11,-1 + 1075 582 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: comma +Encoding: 35 44 15 +Width: 584 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 24 + 5 + 1 + 22 + 1 + 2 + 4 + 3 + 86 + 9 + 85 + 7 + 0 + 7 + 102 + 0 + 71 + 0 + 4 + 16 + 4 + 2 + 4 + 8 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +465 0 m 2,0,1 + 465 -178 465 -178 361.5 -257 c 128,-1,2 + 258 -336 258 -336 125 -336 c 1,3,-1 + 125 -209 l 1,4,5 + 209 -209 209 -209 259 -174 c 128,-1,6 + 309 -139 309 -139 309 0 c 1,7,-1 + 125 0 l 1,8,-1 + 125 340 l 1,9,-1 + 465 340 l 1,10,-1 + 465 0 l 2,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: hyphen +Encoding: 36 45 16 +AltUni2: 0000ad.ffffffff.0 002010.ffffffff.0 0000ad.ffffffff.0 002010.ffffffff.0 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 1 + 68 + 2 + 70 + 48 + 0 + 80 + 0 + 144 + 0 + 3 + 0 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1083 561 m 1,0,-1 + 102 561 l 1,1,-1 + 102 799 l 1,2,-1 + 1083 799 l 1,3,-1 + 1083 561 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: period +Encoding: 37 46 17 +Width: 584 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 2 + 72 + 1 + 0 + 0 + 71 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +459 0 m 1,0,-1 + 133 0 l 1,1,-1 + 133 326 l 1,2,-1 + 459 326 l 1,3,-1 + 459 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: slash +Encoding: 38 47 18 +Width: 948 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 36 + 41 + 3 + 70 + 1 + 86 + 1 + 121 + 3 + 153 + 3 + 5 + 0 + 100 + 3 + 1 + 100 + 2 + 2 + 3 + 51 + 3 + 1 + 3 + 61 + 2 + 1 + 2 + 4 + 1 + 63 + 2 + 1 + 2 + 0 + 3 + 10 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1008 1509 m 1,0,-1 + 180 -170 l 1,1,-1 + -45 -170 l 1,2,-1 + 782 1509 l 1,3,-1 + 1008 1509 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: zero +Encoding: 39 48 19 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 134 + 26 + 150 + 26 + 2 + 18 + 35 + 10 + 15 + 25 + 35 + 3 + 5 + 0 + 25 + 47 + 14 + 48 + 14 + 127 + 14 + 3 + 32 + 14 + 59 + 14 + 79 + 14 + 112 + 14 + 160 + 14 + 5 + 14 + 70 + 22 + 25 + 54 + 6 + 1 + 223 + 6 + 1 + 159 + 6 + 1 + 6 + 28 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP3 +DELTAP2 +DELTAP1 +MIRP[min,rnd,black] +SROUND +MDRP[rp0,min,rnd,grey] +RTG +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1131 688 m 2,0,1 + 1131 328 1131 328 987.5 151.5 c 128,-1,2 + 844 -25 844 -25 594 -25 c 256,3,4 + 344 -25 344 -25 200.5 151.5 c 128,-1,5 + 57 328 57 328 57 688 c 2,6,-1 + 57 811 l 2,7,8 + 57 1155 57 1155 193.5 1343.5 c 128,-1,9 + 330 1532 330 1532 594 1532 c 256,10,11 + 858 1532 858 1532 994.5 1343.5 c 128,-1,12 + 1131 1155 1131 1155 1131 811 c 2,13,-1 + 1131 688 l 2,0,1 +794 729 m 2,14,-1 + 794 770 l 2,15,16 + 794 1075 794 1075 753.5 1189 c 128,-1,17 + 713 1303 713 1303 594 1303 c 256,18,19 + 475 1303 475 1303 435 1189 c 128,-1,20 + 395 1075 395 1075 395 770 c 2,21,-1 + 395 729 l 2,22,23 + 395 424 395 424 436 314.5 c 128,-1,24 + 477 205 477 205 594 205 c 0,25,26 + 713 205 713 205 753.5 314.5 c 128,-1,27 + 794 424 794 424 794 729 c 2,14,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: one +Encoding: 40 49 20 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 15 + 3 + 46 + 4 + 7 + 14 + 1 + 4 + 0 + 24 + 7 + 3 + 1 + 1 + 10 + 9 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +837 0 m 1,0,-1 + 528 0 l 1,1,-1 + 528 1149 l 1,2,-1 + 317 1149 l 1,3,-1 + 317 1331 l 1,4,5 + 460 1343 460 1343 536 1408 c 128,-1,6 + 612 1473 612 1473 634 1509 c 1,7,-1 + 837 1509 l 1,8,-1 + 837 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: two +Encoding: 41 50 21 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 50 + 52 + 20 + 213 + 20 + 2 + 22 + 20 + 1 + 12 + 8 + 35 + 15 + 15 + 57 + 2 + 217 + 2 + 2 + 2 + 21 + 34 + 1 + 4 + 5 + 21 + 107 + 21 + 118 + 21 + 3 + 21 + 0 + 18 + 25 + 32 + 5 + 81 + 5 + 128 + 5 + 226 + 5 + 4 + 5 + 2 + 11 + 49 + 12 + 2 + 23 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1110 0 m 1,0,-1 + 82 0 l 1,1,-1 + 82 254 l 1,2,3 + 471 590 471 590 615.5 756 c 128,-1,4 + 760 922 760 922 760 1055 c 0,5,6 + 760 1155 760 1155 713 1227.5 c 128,-1,7 + 666 1300 666 1300 565 1300 c 0,8,9 + 453 1300 453 1300 417 1258.5 c 128,-1,10 + 381 1217 381 1217 362 1159 c 1,11,-1 + 72 1159 l 1,12,13 + 117 1352 117 1352 256 1441 c 128,-1,14 + 395 1530 395 1530 612 1530 c 0,15,16 + 846 1530 846 1530 972 1406 c 128,-1,17 + 1098 1282 1098 1282 1098 1098 c 0,18,19 + 1098 901 1098 901 925 697.5 c 128,-1,20 + 752 494 752 494 362 225 c 1,21,-1 + 1110 225 l 1,22,-1 + 1110 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: three +Encoding: 42 51 22 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 60 + 38 + 17 + 52 + 18 + 18 + 3 + 32 + 29 + 25 + 35 + 32 + 15 + 7 + 10 + 35 + 6 + 3 + 5 + 38 + 18 + 18 + 0 + 6 + 35 + 22 + 22 + 0 + 25 + 80 + 13 + 1 + 16 + 13 + 32 + 13 + 112 + 13 + 240 + 13 + 4 + 13 + 6 + 28 + 49 + 29 + 71 + 7 + 15 + 6 + 31 + 6 + 47 + 6 + 63 + 6 + 111 + 6 + 5 + 6 + 41 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[grey] +SROUND +MDRP[rp0,rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1106 438 m 0,0,1 + 1106 229 1106 229 960.5 102 c 128,-1,2 + 815 -25 815 -25 579 -25 c 0,3,4 + 372 -25 372 -25 240 53 c 128,-1,5 + 108 131 108 131 43 252 c 1,6,-1 + 250 379 l 1,7,8 + 278 311 278 311 358 260 c 128,-1,9 + 438 209 438 209 549 209 c 0,10,11 + 659 209 659 209 723.5 275.5 c 128,-1,12 + 788 342 788 342 788 465 c 0,13,14 + 788 561 788 561 729.5 623.5 c 128,-1,15 + 671 686 671 686 553 686 c 2,16,-1 + 401 686 l 1,17,-1 + 401 899 l 1,18,-1 + 561 899 l 2,19,20 + 665 899 665 899 717.5 948 c 128,-1,21 + 770 997 770 997 770 1096 c 0,22,23 + 770 1192 770 1192 729 1247.5 c 128,-1,24 + 688 1303 688 1303 594 1303 c 0,25,26 + 508 1303 508 1303 461.5 1273 c 128,-1,27 + 415 1243 415 1243 391 1190 c 1,28,-1 + 120 1190 l 1,29,30 + 149 1329 149 1329 267 1430.5 c 128,-1,31 + 385 1532 385 1532 594 1532 c 0,32,33 + 841 1532 841 1532 962 1417.5 c 128,-1,34 + 1083 1303 1083 1303 1083 1139 c 0,35,36 + 1083 991 1083 991 1009.5 912.5 c 128,-1,37 + 936 834 936 834 850 811 c 1,38,39 + 956 772 956 772 1031 680 c 128,-1,40 + 1106 588 1106 588 1106 438 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: four +Encoding: 43 52 23 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 150 + 13 + 1 + 12 + 16 + 13 +PUSHW_1 + -16 +NPUSHB + 48 + 13 + 33 + 6 + 12 + 33 + 7 + 6 + 7 + 6 + 9 + 13 + 34 + 1 + 4 + 4 + 3 + 12 + 7 + 14 + 3 + 4 + 0 + 9 + 2 + 24 + 7 + 12 + 3 + 13 + 43 + 6 + 59 + 6 + 2 + 6 + 31 + 5 + 79 + 5 + 143 + 5 + 144 + 5 + 240 + 5 + 5 + 5 + 14 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MDRP[grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[grey] +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +SFVTCA[x-axis] +MIRP[rp0,min,rnd,black] +SVTCA[x-axis] +SHPIX +SVTCA[y-axis] +SHPIX +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP3 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1133 438 m 1,0,-1 + 1026 438 l 1,1,-1 + 1026 0 l 1,2,-1 + 719 0 l 1,3,-1 + 719 438 l 1,4,-1 + 58 438 l 1,5,-1 + 41 729 l 1,6,-1 + 822 1509 l 1,7,-1 + 1026 1509 l 1,8,-1 + 1026 657 l 1,9,-1 + 1133 657 l 1,10,-1 + 1133 438 l 1,0,-1 +723 657 m 1,11,-1 + 723 1116 l 1,12,-1 + 264 657 l 1,13,-1 + 723 657 l 1,11,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: five +Encoding: 44 53 24 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 83 + 87 + 1 + 87 + 15 + 2 + 63 + 24 + 79 + 24 + 2 + 24 + 43 + 21 + 19 + 63 + 25 + 79 + 25 + 2 + 25 + 43 + 20 + 20 + 21 + 20 + 19 + 70 + 16 + 35 + 25 + 28 + 28 + 3 + 24 + 34 + 21 + 14 + 7 + 10 + 35 + 6 + 3 + 5 + 23 + 68 + 0 + 25 + 47 + 13 + 1 + 16 + 13 + 32 + 13 + 48 + 13 + 224 + 13 + 4 + 13 + 6 + 24 + 19 + 25 + 21 + 20 + 71 + 7 + 15 + 6 + 31 + 6 + 47 + 6 + 63 + 6 + 79 + 6 + 95 + 6 + 6 + 6 + 31 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[grey] +SROUND +MDRP[rp0,rnd,grey] +RTG +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MIRP[min,rnd,black] +SRP2 +IP +MDAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +MDRP[grey] +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[min,rnd,black] +DELTAP1 +MDRP[grey] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1135 551 m 0,0,1 + 1135 246 1135 246 972 109.5 c 128,-1,2 + 809 -27 809 -27 551 -27 c 0,3,4 + 358 -27 358 -27 225 51 c 128,-1,5 + 92 129 92 129 12 297 c 1,6,-1 + 236 426 l 1,7,8 + 283 311 283 311 359.5 259 c 128,-1,9 + 436 207 436 207 535 207 c 0,10,11 + 662 207 662 207 726.5 286 c 128,-1,12 + 791 365 791 365 791 520 c 0,13,14 + 791 668 791 668 726.5 743.5 c 128,-1,15 + 662 819 662 819 543 819 c 0,16,17 + 483 819 483 819 419.5 795.5 c 128,-1,18 + 356 772 356 772 295 721 c 1,19,-1 + 98 834 l 1,20,-1 + 127 1509 l 1,21,-1 + 985 1509 l 1,22,-1 + 985 1284 l 1,23,-1 + 375 1284 l 1,24,-1 + 362 1004 l 1,25,26 + 418 1044 418 1044 506 1057.5 c 128,-1,27 + 594 1071 594 1071 631 1071 c 0,28,29 + 852 1071 852 1071 993.5 923.5 c 128,-1,30 + 1135 776 1135 776 1135 551 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: six +Encoding: 45 54 25 +Width: 1188 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1168 539 m 0,0,1 + 1168 281 1168 281 1021.5 128 c 128,-1,2 + 875 -25 875 -25 615 -25 c 0,3,4 + 337 -25 337 -25 200 122 c 0,5,6 + 60 270 60 270 44 573 c 0,7,8 + 43 592 43 592 43 619 c 0,9,10 + 43 627 43 627 43 647 c 0,11,12 + 44 692 44 692 44 705 c 0,13,14 + 62 1067 62 1067 228 1296.5 c 128,-1,15 + 394 1526 394 1526 697 1526 c 0,16,17 + 777 1526 777 1526 837.5 1515.5 c 128,-1,18 + 898 1505 898 1505 949 1495 c 1,19,-1 + 949 1235 l 1,20,21 + 881 1251 881 1251 818.5 1261.5 c 128,-1,22 + 756 1272 756 1272 697 1272 c 0,23,24 + 556 1272 556 1272 480 1178.5 c 128,-1,25 + 404 1085 404 1085 390 926 c 1,26,27 + 419 977 419 977 508 1018 c 128,-1,28 + 597 1059 597 1059 675 1059 c 0,29,30 + 908 1059 908 1059 1038 923.5 c 128,-1,31 + 1168 788 1168 788 1168 539 c 0,0,1 +828 514 m 0,32,33 + 828 674 828 674 766.5 749.5 c 128,-1,34 + 705 825 705 825 601 825 c 0,35,36 + 509 825 509 825 441 750.5 c 128,-1,37 + 373 676 373 676 373 514 c 0,38,39 + 373 348 373 348 433.5 276.5 c 128,-1,40 + 494 205 494 205 601 205 c 0,41,42 + 705 205 705 205 766.5 275.5 c 128,-1,43 + 828 346 828 346 828 514 c 0,32,33 +EndSplineSet +Validated: 1 +EndChar + +StartChar: seven +Encoding: 46 55 26 +Width: 1188 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1111 1253 m 1,0,1 + 872 1103 872 1103 722 802 c 0,2,3 + 590 537 590 537 590 119 c 0,4,5 + 590 60 590 60 593 0 c 1,6,-1 + 263 0 l 1,7,8 + 263 346 263 346 410.5 712.5 c 128,-1,9 + 558 1079 558 1079 855 1284 c 1,10,-1 + 64 1284 l 1,11,-1 + 64 1509 l 1,12,-1 + 1111 1509 l 1,13,-1 + 1111 1253 l 1,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: eight +Encoding: 47 56 27 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 45 + 104 + 2 + 121 + 2 + 2 + 22 + 10 + 41 + 52 + 35 + 29 + 35 + 35 + 3 + 16 + 15 + 47 + 35 + 3 + 5 + 26 + 57 + 19 + 64 + 38 + 57 + 22 + 10 + 16 + 0 + 79 + 0 + 143 + 0 + 3 + 0 + 6 + 32 + 57 + 13 + 64 + 44 + 57 + 6 + 50 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +IP +IP +MIRP[min,rnd,black] +MIRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +SRP2 +IP +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1100 446 m 0,0,1 + 1100 227 1100 227 960.5 101 c 128,-1,2 + 821 -25 821 -25 594 -25 c 0,3,4 + 350 -25 350 -25 221 90 c 128,-1,5 + 92 205 92 205 92 421 c 0,6,7 + 92 534 92 534 157.5 640 c 128,-1,8 + 223 746 223 746 344 791 c 1,9,-1 + 344 813 l 1,10,11 + 240 848 240 848 185.5 932 c 128,-1,12 + 131 1016 131 1016 131 1139 c 0,13,14 + 131 1300 131 1300 253 1415 c 128,-1,15 + 375 1530 375 1530 594 1530 c 0,16,17 + 817 1530 817 1530 933 1416.5 c 128,-1,18 + 1049 1303 1049 1303 1049 1126 c 0,19,20 + 1049 1012 1049 1012 996.5 929 c 128,-1,21 + 944 846 944 846 852 813 c 1,22,-1 + 852 791 l 1,23,24 + 965 756 965 756 1032.5 672 c 128,-1,25 + 1100 588 1100 588 1100 446 c 0,0,1 +760 1100 m 0,26,27 + 760 1202 760 1202 718 1251 c 128,-1,28 + 676 1300 676 1300 594 1300 c 256,29,30 + 512 1300 512 1300 471 1250 c 128,-1,31 + 430 1200 430 1200 430 1100 c 0,32,33 + 430 993 430 993 473 946 c 128,-1,34 + 516 899 516 899 594 899 c 0,35,36 + 662 899 662 899 711 944 c 128,-1,37 + 760 989 760 989 760 1100 c 0,26,27 +801 438 m 0,38,39 + 801 567 801 567 747.5 626.5 c 128,-1,40 + 694 686 694 686 594 686 c 0,41,42 + 497 686 497 686 443 629.5 c 128,-1,43 + 389 573 389 573 389 438 c 0,44,45 + 389 315 389 315 442.5 260 c 128,-1,46 + 496 205 496 205 594 205 c 0,47,48 + 684 205 684 205 742.5 260 c 128,-1,49 + 801 315 801 315 801 438 c 0,38,39 +EndSplineSet +Validated: 1 +EndChar + +StartChar: nine +Encoding: 48 57 28 +Width: 1188 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1152 801 m 0,0,1 + 1122 413 1122 413 970 204 c 0,2,3 + 808 -20 808 -20 499 -20 c 0,4,5 + 419 -20 419 -20 358.5 -9.5 c 128,-1,6 + 298 1 298 1 247 11 c 1,7,-1 + 247 271 l 1,8,9 + 315 255 315 255 377.5 244.5 c 128,-1,10 + 440 234 440 234 499 234 c 0,11,12 + 644 234 644 234 722 327 c 128,-1,13 + 800 420 800 420 806 580 c 1,14,15 + 777 529 777 529 688 488 c 128,-1,16 + 599 447 599 447 521 447 c 0,17,18 + 288 447 288 447 159.5 582.5 c 128,-1,19 + 31 718 31 718 31 967 c 0,20,21 + 31 1225 31 1225 176 1378 c 128,-1,22 + 321 1531 321 1531 581 1531 c 0,23,24 + 859 1531 859 1531 996 1384 c 0,25,26 + 1125 1248 1125 1248 1152 933 c 0,27,28 + 1154 910 1154 910 1154 876 c 0,29,30 + 1154 868 1154 868 1154 859 c 0,31,32 + 1153 814 1153 814 1152 801 c 0,0,1 +823 989 m 0,33,34 + 823 1155 823 1155 762.5 1226.5 c 128,-1,35 + 702 1298 702 1298 595 1298 c 0,36,37 + 491 1298 491 1298 431 1227.5 c 128,-1,38 + 371 1157 371 1157 371 989 c 0,39,40 + 371 829 371 829 431 753.5 c 128,-1,41 + 491 678 491 678 595 678 c 0,42,43 + 687 678 687 678 755 752.5 c 128,-1,44 + 823 827 823 827 823 989 c 0,33,34 +EndSplineSet +Validated: 1 +EndChar + +StartChar: colon +Encoding: 49 58 29 +Width: 510 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 1 + 71 + 2 + 12 + 6 + 71 + 5 + 0 + 4 + 0 + 71 + 5 + 144 + 1 + 160 + 1 + 2 + 1 + 8 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +424 823 m 1,0,-1 + 98 823 l 1,1,-1 + 98 1149 l 1,2,-1 + 424 1149 l 1,3,-1 + 424 823 l 1,0,-1 +424 0 m 1,4,-1 + 98 0 l 1,5,-1 + 98 326 l 1,6,-1 + 424 326 l 1,7,-1 + 424 0 l 1,4,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: semicolon +Encoding: 50 59 30 +AltUni2: 00037e.ffffffff.0 00037e.ffffffff.0 +Width: 510 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 6 + 6 + 22 + 6 + 2 + 1 + 72 + 2 + 12 + 8 + 7 + 86 + 15 + 13 + 1 + 13 + 72 + 12 + 0 + 11 + 102 + 4 + 0 + 71 + 0 + 8 + 16 + 8 + 2 + 8 + 13 + 144 + 1 + 160 + 1 + 2 + 1 + 15 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +424 823 m 1,0,-1 + 98 823 l 1,1,-1 + 98 1149 l 1,2,-1 + 424 1149 l 1,3,-1 + 424 823 l 1,0,-1 +424 27 m 2,4,5 + 424 -152 424 -152 327.5 -244 c 128,-1,6 + 231 -336 231 -336 98 -336 c 1,7,-1 + 98 -209 l 1,8,9 + 182 -209 182 -209 227 -174 c 128,-1,10 + 272 -139 272 -139 272 0 c 1,11,-1 + 98 0 l 1,12,-1 + 98 326 l 1,13,-1 + 424 326 l 1,14,-1 + 424 27 l 2,4,5 +EndSplineSet +Validated: 1 +EndChar + +StartChar: less +Encoding: 51 60 31 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 44 + 48 + 0 + 48 + 3 + 2 + 59 + 4 + 53 + 6 + 2 + 4 + 3 + 2 + 6 + 0 + 1 + 14 + 0 + 30 + 0 + 2 + 0 + 1 + 1 + 3 + 17 + 3 + 2 + 3 + 5 + 48 + 1 + 1 + 1 + 92 + 2 + 5 + 0 + 1 + 4 + 0 + 8 + 1 + 7 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +DELTAP1 +IP +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +925 94 m 1,0,-1 + 75 496 l 1,1,-1 + 75 698 l 1,2,-1 + 925 1100 l 1,3,-1 + 925 852 l 1,4,-1 + 394 594 l 1,5,-1 + 925 342 l 1,6,-1 + 925 94 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: equal +Encoding: 52 61 32 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 5 + 68 + 6 + 1 + 68 + 2 + 0 + 4 + 9 + 1 + 5 + 8 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1065 715 m 1,0,-1 + 125 715 l 1,1,-1 + 125 952 l 1,2,-1 + 1065 952 l 1,3,-1 + 1065 715 l 1,0,-1 +1065 236 m 1,4,-1 + 125 236 l 1,5,-1 + 125 473 l 1,6,-1 + 1065 473 l 1,7,-1 + 1065 236 l 1,4,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: greater +Encoding: 53 62 33 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +99 94 m 1,0,-1 + 99 342 l 1,1,-1 + 630 594 l 1,2,-1 + 99 852 l 1,3,-1 + 99 1100 l 1,4,-1 + 949 698 l 1,5,-1 + 949 496 l 1,6,-1 + 99 94 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: question +Encoding: 54 63 34 +Width: 918 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 53 + 5 + 2 + 5 + 31 + 20 + 31 + 134 + 2 + 149 + 2 + 170 + 16 + 234 + 16 + 7 + 25 + 69 + 22 + 34 + 26 + 69 + 29 + 15 + 10 + 117 + 34 + 72 + 33 + 0 + 63 + 37 + 1 + 0 + 22 + 112 + 19 + 224 + 19 + 2 + 19 + 33 + 9 + 32 + 65 + 10 + 33 + 63 + 25 + 79 + 25 + 2 + 25 + 36 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,white] +MIAP[rnd] +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +911 1208 m 0,0,1 + 911 1114 911 1114 876.5 1035 c 128,-1,2 + 842 956 842 956 727 889 c 0,3,4 + 637 836 637 836 590 765 c 128,-1,5 + 543 694 543 694 543 612 c 0,6,7 + 543 567 543 567 543 516 c 128,-1,8 + 543 465 543 465 543 465 c 1,9,-1 + 270 465 l 1,10,11 + 270 465 270 465 270 534.5 c 128,-1,12 + 270 604 270 604 270 653 c 0,13,14 + 270 743 270 743 318.5 825 c 128,-1,15 + 367 907 367 907 438 956 c 0,16,17 + 532 1022 532 1022 562 1061 c 128,-1,18 + 592 1100 592 1100 592 1174 c 0,19,20 + 592 1235 592 1235 548 1272 c 128,-1,21 + 504 1309 504 1309 389 1309 c 0,22,23 + 287 1309 287 1309 187.5 1266 c 128,-1,24 + 88 1223 88 1223 27 1176 c 1,25,-1 + 27 1399 l 1,26,27 + 106 1456 106 1456 209.5 1493 c 128,-1,28 + 313 1530 313 1530 471 1530 c 0,29,30 + 711 1530 711 1530 811 1431.5 c 128,-1,31 + 911 1333 911 1333 911 1208 c 0,0,1 +565 0 m 1,32,-1 + 252 0 l 1,33,-1 + 252 322 l 1,34,-1 + 565 322 l 1,35,-1 + 565 0 l 1,32,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: at +Encoding: 55 64 35 +Width: 1870 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 115 + 42 + 10 + 44 + 48 + 44 + 52 + 54 + 52 + 54 + 54 + 86 + 55 + 119 + 33 + 135 + 13 + 8 + 6 + 28 + 68 + 94 + 3 + 9 + 62 + 94 + 18 + 21 + 15 + 9 + 15 + 47 + 53 + 34 + 46 + 53 + 15 + 43 + 40 + 46 + 64 + 44 + 1 + 44 + 47 + 18 + 22 + 63 + 25 + 1 + 25 + 73 + 60 + 18 + 1 + 18 + 59 + 6 + 91 + 6 + 107 + 6 + 123 + 6 + 139 + 6 + 155 + 6 + 6 + 6 + 64 + 56 + 128 + 56 + 2 + 56 + 63 + 65 + 1 + 65 + 73 + 9 + 12 + 48 + 12 + 192 + 12 + 3 + 12 + 44 + 12 + 44 + 0 + 50 + 0 + 93 + 96 + 31 + 127 + 31 + 2 + 31 + 23 + 37 + 71 + 37 + 87 + 37 + 3 + 37 + 93 + 40 + 50 + 1 + 50 + 71 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1780 688 m 0,0,1 + 1780 494 1780 494 1679.5 332 c 128,-1,2 + 1579 170 1579 170 1413 170 c 0,3,4 + 1290 170 1290 170 1229.5 213 c 128,-1,5 + 1169 256 1169 256 1151 362 c 1,6,7 + 1122 260 1122 260 1063 214 c 128,-1,8 + 1004 168 1004 168 885 168 c 0,9,10 + 754 168 754 168 663.5 265 c 128,-1,11 + 573 362 573 362 573 588 c 0,12,13 + 573 778 573 778 668.5 902 c 128,-1,14 + 764 1026 764 1026 942 1026 c 0,15,16 + 1010 1026 1010 1026 1058 998.5 c 128,-1,17 + 1106 971 1106 971 1128 928 c 1,18,19 + 1128 956 1128 956 1128 988 c 128,-1,20 + 1128 1020 1128 1020 1128 1020 c 1,21,-1 + 1319 1020 l 1,22,23 + 1319 1020 1319 1020 1318 825.5 c 128,-1,24 + 1317 631 1317 631 1317 494 c 0,25,26 + 1317 412 1317 412 1337.5 382 c 128,-1,27 + 1358 352 1358 352 1403 352 c 0,28,29 + 1507 352 1507 352 1548 465 c 128,-1,30 + 1589 578 1589 578 1589 668 c 0,31,32 + 1589 995 1589 995 1418 1177.5 c 128,-1,33 + 1247 1360 1247 1360 967 1360 c 0,34,35 + 713 1360 713 1360 525.5 1144 c 128,-1,36 + 338 928 338 928 338 594 c 0,37,38 + 338 233 338 233 515 35.5 c 128,-1,39 + 692 -162 692 -162 971 -162 c 0,40,41 + 1057 -162 1057 -162 1163.5 -142.5 c 128,-1,42 + 1270 -123 1270 -123 1339 -86 c 1,43,-1 + 1339 -262 l 1,44,45 + 1276 -295 1276 -295 1184 -319.5 c 128,-1,46 + 1092 -344 1092 -344 971 -344 c 0,47,48 + 586 -344 586 -344 357.5 -89 c 128,-1,49 + 129 166 129 166 129 594 c 0,50,51 + 129 1004 129 1004 368.5 1272 c 128,-1,52 + 608 1540 608 1540 969 1540 c 0,53,54 + 1331 1540 1331 1540 1555.5 1319 c 128,-1,55 + 1780 1098 1780 1098 1780 688 c 0,0,1 +1128 584 m 0,56,57 + 1128 623 1128 623 1128 623 c 129,-1,58 + 1128 623 1128 623 1128 666 c 0,59,60 + 1128 756 1128 756 1083 809 c 128,-1,61 + 1038 862 1038 862 942 862 c 0,62,63 + 860 862 860 862 815 794.5 c 128,-1,64 + 770 727 770 727 770 582 c 0,65,66 + 770 500 770 500 804 422 c 128,-1,67 + 838 344 838 344 930 344 c 0,68,69 + 1018 344 1018 344 1073 412.5 c 128,-1,70 + 1128 481 1128 481 1128 584 c 0,56,57 +EndSplineSet +Validated: 1 +EndChar + +StartChar: A +Encoding: 56 65 36 +Width: 1358 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 111 + 24 + 6 + 40 + 6 + 55 + 5 + 57 + 6 + 135 + 7 + 150 + 7 + 6 + 8 + 9 + 123 + 9 + 137 + 9 + 169 + 9 + 186 + 9 + 5 + 9 + 57 + 4 + 9 + 7 + 57 + 8 + 1 + 8 + 2 + 8 + 1 + 1 + 1 + 57 + 42 + 0 + 57 + 0 + 2 + 0 + 0 + 7 + 61 + 9 + 183 + 9 + 2 + 9 + 58 + 6 + 10 + 3 + 6 + 4 + 38 + 4 + 59 + 4 + 203 + 4 + 219 + 4 + 237 + 4 + 6 + 4 + 58 + 5 + 5 + 6 + 6 + 7 + 9 + 4 + 1 + 3 + 2 + 10 + 8 + 9 + 0 + 5 + 235 + 0 + 1 + 0 + 12 + 5 + 11 + 2 + 3 + 30 + 8 + 10 + 9 + 10 + 4 + 6 + 7 + 6 + 10 + 1 + 4 + 0 + 5 + 0 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +MDRP[grey] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +MDRP[grey] +DELTAP1 +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1352 0 m 1,0,-1 + 1004 0 l 1,1,-1 + 893 362 l 1,2,-1 + 395 362 l 1,3,-1 + 281 0 l 1,4,-1 + 4 0 l 1,5,-1 + 512 1509 l 1,6,-1 + 829 1509 l 1,7,-1 + 1352 0 l 1,0,-1 +821 580 m 1,8,-1 + 635 1135 l 1,9,-1 + 461 580 l 1,10,-1 + 821 580 l 1,8,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: B +Encoding: 57 66 37 +Width: 1298 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 63 + 5 + 8 + 22 + 8 + 69 + 14 + 73 + 31 + 87 + 14 + 117 + 10 + 150 + 10 + 184 + 2 + 182 + 10 + 215 + 13 + 10 + 6 + 12 + 22 + 12 + 2 + 12 + 28 + 33 + 20 + 20 + 5 + 4 + 19 + 31 + 5 + 10 + 29 + 31 + 4 + 0 + 215 + 9 + 1 + 9 + 65 + 15 + 0 + 23 + 61 + 24 + 111 + 24 + 240 + 24 + 3 + 24 + 4 + 20 + 28 + 20 + 4 + 33 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1210 479 m 0,0,1 + 1210 250 1210 250 1067 125 c 128,-1,2 + 924 0 924 0 672 0 c 2,3,-1 + 147 0 l 1,4,-1 + 147 1509 l 1,5,-1 + 682 1509 l 2,6,7 + 911 1509 911 1509 1007.5 1428.5 c 128,-1,8 + 1104 1348 1104 1348 1104 1204 c 0,9,10 + 1104 1077 1104 1077 1044.5 1003.5 c 128,-1,11 + 985 930 985 930 862 907 c 1,12,13 + 1014 887 1014 887 1112 776.5 c 128,-1,14 + 1210 666 1210 666 1210 479 c 0,0,1 +784 1122 m 0,15,16 + 784 1212 784 1212 736 1252 c 128,-1,17 + 688 1292 688 1292 592 1292 c 2,18,-1 + 475 1292 l 1,19,-1 + 475 958 l 1,20,-1 + 594 958 l 2,21,22 + 698 958 698 958 741 1002.5 c 128,-1,23 + 784 1047 784 1047 784 1122 c 0,15,16 +874 496 m 0,24,25 + 874 618 874 618 807.5 688 c 128,-1,26 + 741 758 741 758 590 758 c 2,27,-1 + 475 758 l 1,28,-1 + 475 217 l 1,29,-1 + 608 217 l 2,30,31 + 752 217 752 217 813 288.5 c 128,-1,32 + 874 360 874 360 874 496 c 0,24,25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: C +Encoding: 58 67 38 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 55 + 21 + 9 + 21 + 18 + 53 + 15 + 182 + 9 + 198 + 9 + 5 + 48 + 14 + 1 + 14 + 40 + 17 + 30 + 13 + 40 + 10 + 11 + 27 + 40 + 24 + 30 + 0 + 40 + 3 + 1 + 14 + 0 + 0 + 32 + 0 + 64 + 0 + 160 + 0 + 192 + 0 + 5 + 0 + 6 + 21 + 21 + 21 + 2 + 21 + 21 + 223 + 6 + 1 + 6 + 28 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP2 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1108 41 m 1,0,1 + 1073 18 1073 18 981 -3.5 c 128,-1,2 + 889 -25 889 -25 768 -25 c 0,3,4 + 463 -25 463 -25 270.5 163.5 c 128,-1,5 + 78 352 78 352 78 717 c 2,6,-1 + 78 778 l 2,7,8 + 78 1118 78 1118 273.5 1324 c 128,-1,9 + 469 1530 469 1530 764 1530 c 0,10,11 + 891 1530 891 1530 976 1515.5 c 128,-1,12 + 1061 1501 1061 1501 1108 1477 c 1,13,-1 + 1108 1237 l 1,14,15 + 1065 1260 1065 1260 991.5 1278 c 128,-1,16 + 918 1296 918 1296 819 1296 c 0,17,18 + 635 1296 635 1296 531.5 1153 c 128,-1,19 + 428 1010 428 1010 428 758 c 2,20,-1 + 428 737 l 2,21,22 + 428 467 428 467 524.5 338 c 128,-1,23 + 621 209 621 209 788 209 c 0,24,25 + 901 209 901 209 981 231.5 c 128,-1,26 + 1061 254 1061 254 1108 274 c 1,27,-1 + 1108 41 l 1,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: D +Encoding: 59 68 39 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 136 + 12 + 153 + 12 + 2 + 15 + 30 + 5 + 11 + 16 + 30 + 4 + 1 + 0 + 21 + 26 + 10 + 40 + 10 + 2 + 10 + 16 + 20 + 4 + 20 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1276 723 m 2,0,1 + 1276 356 1276 356 1130.5 178 c 128,-1,2 + 985 0 985 0 700 0 c 2,3,-1 + 147 0 l 1,4,-1 + 147 1509 l 1,5,-1 + 643 1509 l 2,6,7 + 983 1509 983 1509 1129.5 1314.5 c 128,-1,8 + 1276 1120 1276 1120 1276 784 c 2,9,-1 + 1276 723 l 2,0,1 +934 733 m 2,10,-1 + 934 774 l 2,11,12 + 934 1022 934 1022 848 1153 c 128,-1,13 + 762 1284 762 1284 614 1284 c 2,14,-1 + 487 1284 l 1,15,-1 + 487 225 l 1,16,-1 + 643 225 l 2,17,18 + 788 225 788 225 861 330.5 c 128,-1,19 + 934 436 934 436 934 733 c 2,10,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: E +Encoding: 60 69 40 +Width: 1167 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 27 + 9 + 30 + 6 + 73 + 6 + 2 + 1 + 5 + 30 + 2 + 10 + 10 + 30 + 1 + 0 + 8 + 4 + 192 + 0 + 1 + 0 + 1 + 6 + 10 + 20 + 1 + 12 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1106 0 m 1,0,-1 + 147 0 l 1,1,-1 + 147 1509 l 1,2,-1 + 1065 1509 l 1,3,-1 + 1065 1284 l 1,4,-1 + 487 1284 l 1,5,-1 + 487 879 l 1,6,-1 + 936 879 l 1,7,-1 + 936 651 l 1,8,-1 + 487 651 l 1,9,-1 + 487 225 l 1,10,-1 + 1106 225 l 1,11,-1 + 1106 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F +Encoding: 61 70 41 +Width: 1110 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 24 + 5 + 30 + 2 + 73 + 2 + 7 + 8 + 1 + 30 + 8 + 10 + 7 + 0 + 48 + 11 + 1 + 4 + 0 + 7 + 2 + 6 + 20 + 7 + 10 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1065 1284 m 1,0,-1 + 487 1284 l 1,1,-1 + 487 879 l 1,2,-1 + 936 879 l 1,3,-1 + 936 651 l 1,4,-1 + 487 651 l 1,5,-1 + 487 0 l 1,6,-1 + 147 0 l 1,7,-1 + 147 1509 l 1,8,-1 + 1065 1509 l 1,9,-1 + 1065 1284 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: G +Encoding: 62 71 42 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 21 + 9 + 21 + 18 + 39 + 5 + 38 + 9 + 37 + 18 + 148 + 19 + 6 + 29 + 33 + 30 + 30 + 24 + 17 + 48 + 14 + 1 + 14 + 17 + 31 + 13 + 10 + 11 + 24 + 31 + 3 + 1 + 29 + 29 + 31 + 6 + 14 + 70 + 31 + 49 + 15 + 27 + 1 + 0 + 27 + 32 + 27 + 64 + 27 + 96 + 27 + 144 + 27 + 176 + 27 + 6 + 27 + 6 + 21 + 22 + 21 + 2 + 21 + 21 + 6 + 32 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +RTG +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +IP +MDAP[rnd] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1274 227 m 1,0,1 + 1204 117 1204 117 1070 46 c 128,-1,2 + 936 -25 936 -25 721 -25 c 0,3,4 + 424 -25 424 -25 254 164.5 c 128,-1,5 + 84 354 84 354 84 717 c 2,6,-1 + 84 799 l 2,7,8 + 84 1122 84 1122 271.5 1326 c 128,-1,9 + 459 1530 459 1530 797 1530 c 0,10,11 + 924 1530 924 1530 1011 1506.5 c 128,-1,12 + 1098 1483 1098 1483 1139 1460 c 1,13,-1 + 1139 1217 l 1,14,15 + 1087 1241 1087 1241 1008.5 1268.5 c 128,-1,16 + 930 1296 930 1296 827 1296 c 0,17,18 + 645 1296 645 1296 534.5 1171.5 c 128,-1,19 + 424 1047 424 1047 424 758 c 2,20,-1 + 424 737 l 2,21,22 + 424 436 424 436 510 320.5 c 128,-1,23 + 596 205 596 205 748 205 c 0,24,25 + 831 205 831 205 899 233.5 c 128,-1,26 + 967 262 967 262 989 299 c 1,27,-1 + 989 608 l 1,28,-1 + 758 608 l 1,29,-1 + 758 809 l 1,30,-1 + 1274 809 l 1,31,-1 + 1274 227 l 1,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: H +Encoding: 63 72 43 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 31 + 3 + 30 + 8 + 73 + 8 + 5 + 6 + 10 + 6 + 10 + 1 + 5 + 0 + 0 + 20 + 9 + 127 + 2 + 1 + 63 + 2 + 111 + 2 + 2 + 2 + 5 + 8 + 3 + 20 + 5 + 12 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1212 0 m 1,0,-1 + 872 0 l 1,1,-1 + 872 649 l 1,2,-1 + 487 649 l 1,3,-1 + 487 0 l 1,4,-1 + 147 0 l 1,5,-1 + 147 1509 l 1,6,-1 + 487 1509 l 1,7,-1 + 487 881 l 1,8,-1 + 872 881 l 1,9,-1 + 872 1509 l 1,10,-1 + 1212 1509 l 1,11,-1 + 1212 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: I +Encoding: 64 73 44 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 2 + 10 + 1 + 0 + 63 + 5 + 1 + 0 + 20 + 63 + 1 + 255 + 1 + 2 + 1 + 4 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +545 0 m 1,0,-1 + 205 0 l 1,1,-1 + 205 1509 l 1,2,-1 + 545 1509 l 1,3,-1 + 545 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: J +Encoding: 65 74 45 +Width: 954 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 30 + 5 + 2 + 21 + 2 + 2 + 7 + 40 + 10 + 31 + 6 + 40 + 3 + 1 + 14 + 10 + 15 + 20 + 31 + 14 + 112 + 14 + 2 + 14 + 63 + 6 + 112 + 6 + 2 + 6 + 16 +SRP0 +MDRP[rnd,white] +DELTAP1 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +795 350 m 2,0,1 + 795 197 795 197 693.5 91.5 c 128,-1,2 + 592 -14 592 -14 385 -14 c 0,3,4 + 264 -14 264 -14 190.5 2 c 128,-1,5 + 117 18 117 18 70 45 c 1,6,-1 + 70 276 l 1,7,8 + 109 260 109 260 173.5 245.5 c 128,-1,9 + 238 231 238 231 303 231 c 0,10,11 + 365 231 365 231 410 265 c 128,-1,12 + 455 299 455 299 455 379 c 2,13,-1 + 455 1509 l 1,14,-1 + 795 1509 l 1,15,-1 + 795 350 l 2,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: K +Encoding: 66 75 46 +Width: 1339 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 82 + 25 + 2 + 45 + 2 + 123 + 2 + 3 + 2 + 57 + 3 + 10 + 11 + 9 + 1 + 27 + 1 + 43 + 1 + 123 + 1 + 4 + 1 + 57 + 140 + 0 + 1 + 0 + 0 + 11 + 9 + 9 + 41 + 9 + 2 + 9 + 58 + 10 + 52 + 8 + 70 + 8 + 86 + 8 + 3 + 8 + 58 + 3 + 3 + 10 + 8 + 3 + 11 + 2 + 4 + 5 + 6 + 0 + 1 + 5 + 0 + 10 + 9 + 6 + 10 + 2 + 11 + 1 + 9 + 4 + 0 + 3 + 10 + 62 + 0 + 1 + 0 + 13 + 8 + 3 + 20 + 5 + 12 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +SFVTCA[x-axis] +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1378 0 m 1,0,-1 + 979 0 l 1,1,-1 + 537 555 l 1,2,-1 + 487 492 l 1,3,-1 + 487 0 l 1,4,-1 + 147 0 l 1,5,-1 + 147 1509 l 1,6,-1 + 487 1509 l 1,7,-1 + 487 874 l 1,8,-1 + 958 1509 l 1,9,-1 + 1296 1509 l 1,10,-1 + 725 803 l 1,11,-1 + 1378 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: L +Encoding: 67 76 47 +Width: 1126 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 2 + 10 + 4 + 30 + 1 + 0 + 95 + 5 + 1 + 5 + 7 + 48 + 7 + 1 + 4 + 20 + 1 + 6 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +SRP0 +MDRP[rnd,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1047 0 m 1,0,-1 + 147 0 l 1,1,-1 + 147 1509 l 1,2,-1 + 487 1509 l 1,3,-1 + 487 225 l 1,4,-1 + 1047 225 l 1,5,-1 + 1047 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: M +Encoding: 68 77 48 +Width: 1880 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 86 + 58 + 2 + 57 + 5 + 218 + 5 + 3 + 11 + 4 + 54 + 3 + 2 + 25 + 10 + 237 + 10 + 2 + 10 + 31 + 9 + 10 + 3 + 52 + 11 + 120 + 11 + 235 + 11 + 3 + 11 + 31 + 2 + 3 + 2 + 10 + 57 + 4 + 8 + 9 + 52 + 9 + 180 + 9 + 196 + 9 + 4 + 9 + 57 + 5 + 5 + 4 + 5 + 2 + 10 + 3 + 9 + 7 + 1 + 3 + 4 + 7 + 0 + 11 + 9 + 10 + 9 + 11 + 10 + 4 + 3 + 5 + 0 + 7 + 0 + 24 + 6 + 2 + 1 + 2 + 10 + 5 + 1 + 5 + 26 + 7 + 13 +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SRP0 +SFVTCA[x-axis] +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1745 0 m 1,0,-1 + 1434 0 l 1,1,-1 + 1434 866 l 1,2,-1 + 971 0 l 1,3,-1 + 795 0 l 1,4,-1 + 362 866 l 1,5,-1 + 362 0 l 1,6,-1 + 127 0 l 1,7,-1 + 127 1509 l 1,8,-1 + 379 1509 l 1,9,-1 + 946 410 l 1,10,-1 + 1522 1509 l 1,11,-1 + 1745 1509 l 1,12,-1 + 1745 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: N +Encoding: 69 78 49 +Width: 1397 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 22 + 7 + 69 + 6 + 88 + 2 + 201 + 1 + 198 + 7 + 5 + 88 + 1 + 87 + 6 + 2 + 7 + 24 + 1 + 1 + 2 + 2 + 24 + 6 + 6 + 7 + 7 + 2 + 4 + 6 + 8 + 6 + 10 + 1 + 4 + 0 + 1 + 7 + 74 + 0 + 0 + 16 + 0 + 143 + 0 + 160 + 0 + 192 + 0 + 5 + 0 + 4 + 6 + 2 + 74 + 207 + 4 + 223 + 4 + 239 + 4 + 255 + 4 + 4 + 4 + 10 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SFVTCA[y-axis] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1270 0 m 1,0,-1 + 1124 0 l 1,1,-1 + 369 948 l 1,2,-1 + 369 0 l 1,3,-1 + 127 0 l 1,4,-1 + 127 1509 l 1,5,-1 + 309 1509 l 1,6,-1 + 1028 616 l 1,7,-1 + 1028 1509 l 1,8,-1 + 1270 1509 l 1,9,-1 + 1270 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: O +Encoding: 70 79 50 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 98 + 38 + 5 + 39 + 8 + 39 + 9 + 40 + 12 + 71 + 19 + 72 + 26 + 86 + 19 + 89 + 26 + 104 + 24 + 121 + 26 + 134 + 9 + 167 + 8 + 168 + 12 + 201 + 27 + 216 + 27 + 231 + 8 + 233 + 12 + 250 + 16 + 250 + 27 + 19 + 54 + 18 + 1 + 18 + 31 + 10 + 11 + 57 + 25 + 1 + 25 + 31 + 3 + 1 + 231 + 0 + 1 + 0 + 21 + 80 + 14 + 112 + 14 + 2 + 32 + 14 + 1 + 0 + 14 + 32 + 14 + 80 + 14 + 112 + 14 + 145 + 14 + 208 + 14 + 6 + 14 + 70 + 247 + 22 + 1 + 22 + 21 + 191 + 6 + 223 + 6 + 2 + 151 + 6 + 223 + 6 + 2 + 6 + 28 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +DELTAP1 +SROUND +MDRP[rp0,min,rnd,grey] +RTG +DELTAP1 +DELTAP2 +DELTAP3 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1306 707 m 2,0,1 + 1306 350 1306 350 1136 162.5 c 128,-1,2 + 966 -25 966 -25 687 -25 c 0,3,4 + 411 -25 411 -25 240 162.5 c 128,-1,5 + 69 350 69 350 69 702 c 2,6,-1 + 69 788 l 2,7,8 + 69 1116 69 1116 228.5 1323 c 128,-1,9 + 388 1530 388 1530 696 1530 c 0,10,11 + 997 1530 997 1530 1151.5 1320 c 128,-1,12 + 1306 1110 1306 1110 1306 788 c 2,13,-1 + 1306 707 l 2,0,1 +964 727 m 2,14,-1 + 964 768 l 2,15,16 + 964 1047 964 1047 916 1182 c 128,-1,17 + 868 1317 868 1317 687 1317 c 0,18,19 + 520 1317 520 1317 465.5 1197 c 128,-1,20 + 411 1077 411 1077 411 768 c 2,21,-1 + 411 731 l 2,22,23 + 411 420 411 420 460 304 c 128,-1,24 + 509 188 509 188 687 188 c 0,25,26 + 833 188 833 188 898.5 313 c 128,-1,27 + 964 438 964 438 964 727 c 2,14,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: P +Encoding: 71 80 51 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 40 + 217 + 20 + 232 + 20 + 2 + 18 + 31 + 4 + 4 + 6 + 7 + 17 + 31 + 7 + 10 + 6 + 0 + 151 + 0 + 167 + 0 + 246 + 0 + 3 + 0 + 21 + 6 + 12 + 22 + 12 + 32 + 12 + 3 + 12 + 6 + 18 + 4 + 20 + 6 + 22 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1147 999 m 2,0,1 + 1147 807 1147 807 1030 709.5 c 128,-1,2 + 913 612 913 612 692 612 c 2,3,-1 + 487 612 l 1,4,-1 + 487 0 l 1,5,-1 + 147 0 l 1,6,-1 + 147 1509 l 1,7,-1 + 713 1509 l 2,8,9 + 956 1509 956 1509 1051.5 1391.5 c 128,-1,10 + 1147 1274 1147 1274 1147 1118 c 2,11,-1 + 1147 999 l 2,0,1 +799 977 m 2,12,-1 + 799 1122 l 2,13,14 + 799 1208 799 1208 751 1249 c 128,-1,15 + 703 1290 703 1290 593 1290 c 2,16,-1 + 487 1290 l 1,17,-1 + 487 819 l 1,18,-1 + 611 819 l 2,19,20 + 691 819 691 819 745 860 c 128,-1,21 + 799 901 799 901 799 977 c 2,12,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Q +Encoding: 72 81 52 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 93 + 11 + 12 + 27 + 12 + 39 + 19 + 73 + 37 + 89 + 37 + 122 + 37 + 135 + 20 + 218 + 37 + 250 + 38 + 9 + 9 + 32 + 10 + 18 + 54 + 29 + 249 + 29 + 2 + 29 + 31 + 21 + 11 + 57 + 36 + 247 + 36 + 2 + 36 + 41 + 3 + 14 + 0 + 9 + 5 + 3 + 1 + 3 + 57 + 14 + 14 + 3 + 9 + 3 + 0 + 17 + 0 + 21 + 32 + 25 + 64 + 25 + 2 + 0 + 25 + 32 + 25 + 64 + 25 + 80 + 25 + 96 + 25 + 112 + 25 + 136 + 25 + 145 + 25 + 176 + 25 + 208 + 25 + 10 + 25 + 33 + 21 + 135 + 17 + 151 + 17 + 2 + 17 + 39 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP2 +MDAP[rnd] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1301 707 m 2,0,1 + 1301 401 1301 401 1168 212 c 128,-1,2 + 1035 23 1035 23 828 2 c 1,3,4 + 834 -86 834 -86 872 -125 c 128,-1,5 + 910 -164 910 -164 1014 -164 c 0,6,7 + 1070 -164 1070 -164 1131 -164 c 128,-1,8 + 1192 -164 1192 -164 1192 -164 c 1,9,-1 + 1192 -340 l 1,10,-1 + 893 -340 l 2,11,12 + 715 -340 715 -340 622 -236.5 c 128,-1,13 + 529 -133 529 -133 523 2 c 1,14,15 + 271 78 271 78 167.5 261 c 128,-1,16 + 64 444 64 444 64 707 c 2,17,-1 + 64 788 l 2,18,19 + 64 1126 64 1126 231 1328 c 128,-1,20 + 398 1530 398 1530 682 1530 c 0,21,22 + 984 1530 984 1530 1142.5 1331.5 c 128,-1,23 + 1301 1133 1301 1133 1301 788 c 2,24,-1 + 1301 707 l 2,0,1 +959 727 m 2,25,-1 + 959 768 l 2,26,27 + 959 1090 959 1090 900.5 1203.5 c 128,-1,28 + 842 1317 842 1317 682 1317 c 0,29,30 + 523 1317 523 1317 464.5 1206.5 c 128,-1,31 + 406 1096 406 1096 406 768 c 2,32,-1 + 406 727 l 2,33,34 + 406 424 406 424 456 306 c 128,-1,35 + 506 188 506 188 682 188 c 0,36,37 + 824 188 824 188 891.5 310 c 128,-1,38 + 959 432 959 432 959 727 c 2,25,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: R +Encoding: 73 82 53 +Width: 1251 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 60 + 9 + 3 + 28 + 3 + 2 + 3 + 11 + 20 + 11 + 39 + 11 + 3 + 25 + 16 + 1 + 16 + 5 + 31 + 25 + 25 + 7 + 8 + 24 + 31 + 8 + 10 + 0 + 7 + 0 + 59 + 16 + 1 + 16 + 20 + 13 + 0 + 23 + 1 + 182 + 13 + 198 + 13 + 2 + 13 + 23 + 95 + 20 + 191 + 20 + 2 + 20 + 7 + 25 + 5 + 20 + 208 + 7 + 1 + 7 + 29 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1180 0 m 1,0,-1 + 844 0 l 1,1,2 + 840 365 840 365 774.5 521.5 c 128,-1,3 + 709 678 709 678 567 678 c 2,4,-1 + 487 678 l 1,5,-1 + 487 0 l 1,6,-1 + 147 0 l 1,7,-1 + 147 1509 l 1,8,-1 + 741 1509 l 2,9,10 + 958 1509 958 1509 1048.5 1415 c 128,-1,11 + 1139 1321 1139 1321 1139 1184 c 2,12,-1 + 1139 1102 l 2,13,14 + 1139 973 1139 973 1060 895 c 128,-1,15 + 981 817 981 817 823 803 c 1,16,17 + 1001 750 1001 750 1090.5 567.5 c 128,-1,18 + 1180 385 1180 385 1180 0 c 1,0,-1 +804 1071 m 2,19,-1 + 804 1112 l 2,20,21 + 804 1210 804 1210 752 1252 c 128,-1,22 + 700 1294 700 1294 598 1294 c 2,23,-1 + 487 1294 l 1,24,-1 + 487 895 l 1,25,-1 + 579 895 l 2,26,27 + 700 895 700 895 752 939 c 128,-1,28 + 804 983 804 983 804 1071 c 2,19,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: S +Encoding: 74 83 54 +Width: 1155 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 104 + 43 + 18 + 36 + 37 + 82 + 15 + 82 + 36 + 103 + 1 + 104 + 20 + 117 + 36 + 133 + 34 + 169 + 2 + 186 + 16 + 177 + 36 + 226 + 36 + 12 + 6 + 35 + 22 + 35 + 37 + 35 + 3 + 35 + 0 + 32 + 11 + 16 + 1 + 169 + 16 + 1 + 16 + 13 + 19 + 19 + 32 + 13 + 0 + 4 + 3 + 22 + 26 + 40 + 29 + 30 + 25 + 40 + 22 + 11 + 7 + 40 + 10 + 30 + 6 + 40 + 3 + 1 + 35 + 0 + 32 + 74 + 16 + 1 + 16 + 13 + 19 + 112 + 25 + 1 + 25 + 71 + 0 + 28 + 31 + 13 + 32 + 13 + 2 + 32 + 13 + 48 + 13 + 64 + 13 + 144 + 13 + 4 + 13 + 32 + 27 + 6 + 71 + 19 + 38 +SRP0 +MDRP[rp0,min,rnd,white] +SROUND +MDRP[rnd,grey] +RTG +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +DELTAP1 +SRP1 +SRP2 +IP +DELTAP1 +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +DELTAP1 +DELTAP2 +SRP1 +SRP2 +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1092 449 m 0,0,1 + 1092 209 1092 209 932 94.5 c 128,-1,2 + 772 -20 772 -20 487 -20 c 0,3,4 + 324 -20 324 -20 212 -1 c 128,-1,5 + 100 18 100 18 27 47 c 1,6,-1 + 27 307 l 1,7,8 + 84 272 84 272 206 242.5 c 128,-1,9 + 328 213 328 213 446 213 c 0,10,11 + 612 213 612 213 674.5 257 c 128,-1,12 + 737 301 737 301 737 403 c 0,13,14 + 737 469 737 469 692 520 c 128,-1,15 + 647 571 647 571 436 655 c 0,16,17 + 268 723 268 723 176 828.5 c 128,-1,18 + 84 934 84 934 84 1116 c 0,19,20 + 84 1290 84 1290 232.5 1410 c 128,-1,21 + 381 1530 381 1530 643 1530 c 0,22,23 + 770 1530 770 1530 871.5 1509.5 c 128,-1,24 + 973 1489 973 1489 1014 1473 c 1,25,-1 + 1014 1243 l 1,26,27 + 928 1264 928 1264 843 1280 c 128,-1,28 + 758 1296 758 1296 662 1296 c 0,29,30 + 526 1296 526 1296 466 1254 c 128,-1,31 + 406 1212 406 1212 406 1149 c 0,32,33 + 406 1069 406 1069 451 1028 c 128,-1,34 + 496 987 496 987 715 907 c 0,35,36 + 919 833 919 833 1005.5 719.5 c 128,-1,37 + 1092 606 1092 606 1092 449 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: T +Encoding: 75 84 55 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 1 + 5 + 30 + 6 + 10 + 3 + 0 + 0 + 2 + 20 + 5 + 112 + 3 + 1 + 3 + 3 + 9 + 8 +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1014 1284 m 1,0,-1 + 686 1284 l 1,1,-1 + 686 0 l 1,2,-1 + 346 0 l 1,3,-1 + 346 1284 l 1,4,-1 + 10 1284 l 1,5,-1 + 10 1509 l 1,6,-1 + 1014 1509 l 1,7,-1 + 1014 1284 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: U +Encoding: 76 85 56 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 50 + 1 + 50 + 2 + 60 + 4 + 60 + 5 + 60 + 10 + 49 + 14 + 6 + 16 + 7 + 10 + 12 + 30 + 3 + 1 + 103 + 0 + 1 + 0 + 42 + 0 + 15 + 63 + 15 + 79 + 15 + 3 + 15 + 89 + 9 + 105 + 9 + 120 + 9 + 136 + 9 + 152 + 9 + 5 + 9 + 20 + 6 + 18 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1225 436 m 2,0,1 + 1225 223 1225 223 1094 102.5 c 128,-1,2 + 963 -18 963 -18 688 -18 c 0,3,4 + 393 -18 393 -18 264 111 c 128,-1,5 + 135 240 135 240 135 494 c 2,6,-1 + 135 1509 l 1,7,-1 + 475 1509 l 1,8,-1 + 475 453 l 2,9,10 + 475 330 475 330 530.5 268.5 c 128,-1,11 + 586 207 586 207 723 207 c 0,12,13 + 850 207 850 207 911.5 262 c 128,-1,14 + 973 317 973 317 973 459 c 2,15,-1 + 973 1509 l 1,16,-1 + 1225 1509 l 1,17,-1 + 1225 436 l 2,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: V +Encoding: 77 86 57 +Width: 1247 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 91 + 57 + 5 + 117 + 5 + 144 + 5 + 3 + 40 + 3 + 57 + 1 + 54 + 2 + 51 + 5 + 55 + 6 + 71 + 1 + 105 + 2 + 7 + 0 + 58 + 6 + 1 + 58 + 5 + 5 + 6 + 153 + 3 + 1 + 3 + 22 + 4 + 2 + 22 + 5 + 5 + 4 + 5 + 2 + 3 + 1 + 2 + 0 + 6 + 4 + 0 + 3 + 10 + 63 + 8 + 1 + 1 + 6 + 0 + 2 + 4 + 3 + 156 + 5 + 1 + 5 + 5 + 0 + 3 + 60 + 0 + 1 + 63 + 0 + 1 + 0 + 32 + 3 + 1 + 0 + 3 + 47 + 3 + 51 + 3 + 180 + 3 + 208 + 3 + 5 + 3 + 7 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP1 +SRP1 +SRP2 +IP +RTHG +MDAP[rnd] +RTG +DELTAP1 +SRP2 +IP +IP +SRP2 +IP +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1270 1509 m 1,0,-1 + 758 0 l 1,1,-1 + 473 0 l 1,2,-1 + -23 1509 l 1,3,-1 + 344 1509 l 1,4,-1 + 668 467 l 1,5,-1 + 991 1509 l 1,6,-1 + 1270 1509 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: W +Encoding: 78 87 58 +Width: 1931 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 142 + 63 + 14 + 1 + 22 + 10 + 39 + 1 + 56 + 0 + 51 + 1 + 54 + 4 + 57 + 5 + 54 + 7 + 7 + 15 + 3 + 22 + 8 + 22 + 11 + 52 + 3 + 57 + 8 + 57 + 11 + 6 + 3 + 58 + 3 + 2 + 9 + 8 + 9 + 1 + 73 + 0 + 89 + 0 + 2 + 0 + 58 + 60 + 12 + 1 + 12 + 11 + 12 + 9 + 2 + 132 + 3 + 150 + 3 + 228 + 3 + 3 + 3 + 22 + 10 + 10 + 11 + 5 + 6 + 22 + 7 + 8 + 7 + 3 + 10 + 9 + 1 + 12 + 0 + 2 + 10 + 9 + 11 + 11 + 3 + 0 + 1 + 0 + 16 + 9 + 32 + 9 + 48 + 9 + 3 + 9 + 4 + 10 + 5 + 7 + 6 + 16 + 8 + 1 + 8 + 9 + 8 + 10 + 8 + 6 + 18 + 6 + 95 + 6 + 127 + 6 + 143 + 6 + 148 + 6 + 6 + 6 + 13 + 8 + 3 + 11 + 3 + 5 + 6 + 7 + 9 + 10 + 12 + 0 + 5 + 6 + 10 + 4 + 2 + 1 + 3 + 5 + 0 +SVTCA[y-axis] +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +SRP1 +SRP2 +SLOOP +IP +SVTCA[x-axis] +SRP0 +MDRP[rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,black] +IP +IP +RTHG +MDAP[rnd] +DELTAP1 +SRP2 +IP +IP +SRP2 +IP +RTG +MDAP[rnd] +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +IP +RTHG +MDAP[rnd] +SRP2 +IP +IP +SRP2 +IP +IP +RTG +SRP1 +SRP2 +IP +SPVTL[orthog] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +MDRP[rnd,grey] +SPVTL[orthog] +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +SPVTL[orthog] +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1948 1509 m 1,0,-1 + 1530 0 l 1,1,-1 + 1284 0 l 1,2,-1 + 967 983 l 1,3,-1 + 643 0 l 1,4,-1 + 397 0 l 1,5,-1 + -20 1509 l 1,6,-1 + 324 1509 l 1,7,-1 + 586 553 l 1,8,-1 + 885 1509 l 1,9,-1 + 1126 1509 l 1,10,-1 + 1427 553 l 1,11,-1 + 1673 1509 l 1,12,-1 + 1948 1509 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: X +Encoding: 79 88 59 +Width: 1251 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 111 + 89 + 2 + 83 + 8 + 146 + 8 + 3 + 40 + 5 + 59 + 3 + 89 + 3 + 88 + 11 + 4 + 89 + 5 + 1 + 6 + 8 + 22 + 8 + 54 + 8 + 3 + 11 + 8 + 0 + 7 + 7 + 0 + 2 + 5 + 1 + 6 + 6 + 9 + 6 + 1 + 1 + 22 + 0 + 7 + 0 + 7 + 22 + 6 + 6 + 1 + 11 + 2 + 10 + 3 + 3 + 10 + 8 + 5 + 9 + 4 + 4 + 9 + 9 + 58 + 10 + 3 + 10 + 3 + 58 + 4 + 4 + 9 + 5 + 8 + 2 + 11 + 4 + 4 + 6 + 7 + 9 + 10 + 3 + 6 + 10 + 3 + 1 + 0 + 3 + 4 + 0 + 3 + 1 + 2 + 5 + 8 + 11 + 7 + 9 + 8 + 0 + 12 + 10 + 0 + 63 + 13 + 1 + 13 + 6 + 4 + 12 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +SRP0 +DELTAP1 +MDRP[rp0,rnd,white] +MDRP[rp0,rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[min,rnd,black] +SPVTL[orthog] +SFVTCA[x-axis] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SFVTL[parallel] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP1 +SRP2 +IP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1262 0 m 1,0,-1 + 877 0 l 1,1,-1 + 590 518 l 1,2,-1 + 276 0 l 1,3,-1 + -8 0 l 1,4,-1 + 457 754 l 1,5,-1 + 41 1509 l 1,6,-1 + 426 1509 l 1,7,-1 + 684 1044 l 1,8,-1 + 965 1509 l 1,9,-1 + 1249 1509 l 1,10,-1 + 815 809 l 1,11,-1 + 1262 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Y +Encoding: 80 89 60 +Width: 1327 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 74 + 54 + 7 + 1 + 53 + 1 + 54 + 4 + 54 + 7 + 102 + 7 + 4 + 7 + 58 + 6 + 7 + 1 + 8 + 58 + 0 + 0 + 1 + 72 + 7 + 88 + 7 + 2 + 7 + 22 + 4 + 6 + 22 + 5 + 5 + 4 + 8 + 6 + 0 + 5 + 7 + 1 + 4 + 55 + 0 + 1 + 0 + 1 + 20 + 5 + 15 + 4 + 31 + 4 + 144 + 4 + 160 + 4 + 4 + 4 + 4 + 10 + 9 + 0 + 8 + 6 + 7 + 4 + 1 + 3 + 3 + 5 + 10 + 3 + 0 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SRP2 +SLOOP +IP +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SVTCA[x-axis] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1341 1509 m 1,0,-1 + 840 639 l 1,1,-1 + 840 0 l 1,2,-1 + 500 0 l 1,3,-1 + 500 606 l 1,4,-1 + -10 1509 l 1,5,-1 + 387 1509 l 1,6,-1 + 719 903 l 1,7,-1 + 1071 1509 l 1,8,-1 + 1341 1509 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Z +Encoding: 81 90 61 +Width: 1108 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHW_2 + 8 + -20 +NPUSHB + 43 + 3 + 20 + 8 + 22 + 2 + 2 + 3 + 3 + 22 + 7 + 7 + 8 + 7 + 3 + 6 + 3 + 30 + 6 + 10 + 2 + 8 + 1 + 8 + 30 + 1 + 0 + 3 + 7 + 0 + 0 + 11 + 10 + 4 + 8 + 47 + 2 + 63 + 2 + 95 + 2 + 3 + 2 + 10 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,rnd,grey] +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SVTCA[x-axis] +SHPIX +SHPIX +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1077 0 m 1,0,-1 + 37 0 l 1,1,-1 + 37 205 l 1,2,-1 + 700 1284 l 1,3,-1 + 66 1284 l 1,4,-1 + 66 1509 l 1,5,-1 + 1077 1509 l 1,6,-1 + 1077 1309 l 1,7,-1 + 412 225 l 1,8,-1 + 1077 225 l 1,9,-1 + 1077 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: bracketleft +Encoding: 82 91 62 +Width: 809 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 5 + 73 + 2 + 16 + 7 + 73 + 48 + 1 + 1 + 1 + 4 + 0 + 6 + 24 + 239 + 1 + 1 + 1 + 8 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +707 -223 m 1,0,-1 + 129 -223 l 1,1,-1 + 129 1509 l 1,2,-1 + 707 1509 l 1,3,-1 + 707 1325 l 1,4,-1 + 428 1325 l 1,5,-1 + 428 -25 l 1,6,-1 + 707 -25 l 1,7,-1 + 707 -223 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: backslash +Encoding: 83 92 63 +Width: 948 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 40 + 1 + 55 + 1 + 89 + 1 + 152 + 1 + 201 + 1 + 5 + 0 + 100 + 1 + 3 + 100 + 2 + 2 + 1 + 0 + 52 + 2 + 1 + 2 + 4 + 0 + 63 + 1 + 1 + 1 + 2 + 3 + 10 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1008 -170 m 1,0,-1 + 782 -170 l 1,1,-1 + -45 1509 l 1,2,-1 + 180 1509 l 1,3,-1 + 1008 -170 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: bracketright +Encoding: 84 93 64 +Width: 809 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 5 + 73 + 6 + 10 + 2 + 73 + 48 + 1 + 1 + 1 + 5 + 1 + 4 + 24 + 0 + 8 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +686 -223 m 1,0,-1 + 109 -223 l 1,1,-1 + 109 -25 l 1,2,-1 + 387 -25 l 1,3,-1 + 387 1325 l 1,4,-1 + 109 1325 l 1,5,-1 + 109 1509 l 1,6,-1 + 686 1509 l 1,7,-1 + 686 -223 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: asciicircum +Encoding: 85 94 65 +Width: 1126 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 42 + 10 + 1 + 6 + 3 + 26 + 1 + 22 + 3 + 53 + 5 + 58 + 6 + 6 + 1 + 3 + 15 + 2 + 31 + 2 + 2 + 2 + 5 + 10 + 50 + 0 + 1 + 144 + 0 + 1 + 0 + 8 + 31 + 4 + 47 + 4 + 61 + 4 + 95 + 4 + 4 + 4 + 7 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +PUSHB_2 + 4 + 0 +MD[grid] +EVEN +IF +PUSHB_2 + 0 + 64 +SHPIX +EIF +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDAP[rnd] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1126 657 m 1,0,-1 + 811 657 l 1,1,-1 + 553 1122 l 1,2,-1 + 315 657 l 1,3,-1 + 0 657 l 1,4,-1 + 442 1509 l 1,5,-1 + 686 1509 l 1,6,-1 + 1126 657 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: underscore +Encoding: 86 95 66 +Width: 1020 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 1 + 201 + 2 + 0 + 5 + 63 + 1 + 1 + 1 + 4 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1020 -360 m 1,0,-1 + 0 -360 l 1,1,-1 + 0 -150 l 1,2,-1 + 1020 -150 l 1,3,-1 + 1020 -360 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: grave +Encoding: 87 96 67 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 2 + 91 + 1 + 36 + 3 + 1 + 0 + 2 + 0 + 63 + 2 + 79 + 2 + 80 + 2 + 3 + 2 + 4 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +770 1323 m 1,0,-1 + 553 1323 l 1,1,-1 + 225 1677 l 1,2,-1 + 520 1677 l 1,3,-1 + 770 1323 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: a +Encoding: 88 97 68 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 89 + 11 + 7 + 11 + 10 + 4 + 28 + 25 + 6 + 25 + 7 + 25 + 10 + 20 + 28 + 51 + 43 + 186 + 7 + 9 + 34 + 32 + 15 + 12 + 12 + 5 + 26 + 0 + 2 + 41 + 33 + 59 + 2 + 1 + 2 + 5 + 3 + 22 + 51 + 255 + 19 + 1 + 19 + 33 + 23 + 51 + 26 + 13 + 16 + 45 + 63 + 45 + 192 + 45 + 240 + 45 + 4 + 22 + 22 + 0 + 8 + 0 + 22 + 1 + 2 + 15 + 0 + 30 + 1 + 64 + 30 + 80 + 30 + 112 + 30 + 128 + 30 + 160 + 30 + 5 + 30 + 38 + 23 + 47 + 8 + 63 + 8 + 2 + 8 + 44 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIRP[rp0,rnd,grey] +MIAP[rnd] +MDRP[min,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIAP[rnd] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1102 0 m 1,0,-1 + 803 0 l 1,1,-1 + 797 150 l 1,2,3 + 760 78 760 78 673 32 c 128,-1,4 + 586 -14 586 -14 470 -14 c 0,5,6 + 279 -14 279 -14 181 82 c 128,-1,7 + 83 178 83 178 83 373 c 2,8,-1 + 83 393 l 2,9,10 + 83 586 83 586 214 690.5 c 128,-1,11 + 345 795 345 795 566 795 c 0,12,13 + 633 795 633 795 698 775.5 c 128,-1,14 + 763 756 763 756 793 727 c 1,15,-1 + 793 840 l 2,16,17 + 793 899 793 899 739 940 c 128,-1,18 + 685 981 685 981 586 981 c 0,19,20 + 480 981 480 981 397 957.5 c 128,-1,21 + 314 934 314 934 253 899 c 1,22,-1 + 253 1096 l 1,23,24 + 332 1128 332 1128 429.5 1151 c 128,-1,25 + 527 1174 527 1174 666 1174 c 0,26,27 + 889 1174 889 1174 995.5 1073.5 c 128,-1,28 + 1102 973 1102 973 1102 752 c 2,29,-1 + 1102 0 l 1,0,-1 +795 385 m 2,30,-1 + 795 416 l 2,31,32 + 795 520 795 520 746 574.5 c 128,-1,33 + 697 629 697 629 601 629 c 0,34,35 + 511 629 511 629 458.5 577.5 c 128,-1,36 + 406 526 406 526 406 414 c 2,37,-1 + 406 383 l 2,38,39 + 406 266 406 266 461.5 227 c 128,-1,40 + 517 188 517 188 603 188 c 0,41,42 + 677 188 677 188 736 235.5 c 128,-1,43 + 795 283 795 283 795 385 c 2,30,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: b +Encoding: 89 98 69 +Width: 1298 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 63 + 7 + 15 + 23 + 15 + 89 + 30 + 152 + 30 + 4 + 9 + 16 + 26 + 25 + 6 + 3 + 3 + 14 + 64 + 11 + 96 + 14 + 22 + 47 + 14 + 13 + 29 + 32 + 3 + 3 + 8 + 2 + 96 + 33 + 1 + 0 + 23 + 47 + 18 + 48 + 18 + 64 + 18 + 160 + 18 + 4 + 64 + 18 + 113 + 18 + 144 + 18 + 223 + 18 + 224 + 18 + 5 + 18 + 11 + 26 + 6 + 22 + 8 + 32 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[min,rnd,black] +SRP0 +SMD +MDRP[min,grey] +SMD +SRP1 +SRP2 +SLOOP +IP +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1200 526 m 2,0,1 + 1200 281 1200 281 1077 132.5 c 128,-1,2 + 954 -16 954 -16 719 -16 c 0,3,4 + 659 -16 659 -16 585.5 3.5 c 128,-1,5 + 512 23 512 23 463 66 c 1,6,-1 + 459 0 l 1,7,-1 + 150 0 l 1,8,-1 + 150 1509 l 1,9,-1 + 469 1509 l 1,10,-1 + 469 989 l 1,11,12 + 545 1104 545 1104 628 1139 c 128,-1,13 + 711 1174 711 1174 803 1174 c 0,14,15 + 981 1174 981 1174 1090.5 1043.5 c 128,-1,16 + 1200 913 1200 913 1200 657 c 2,17,-1 + 1200 526 l 2,0,1 +870 553 m 2,18,-1 + 870 637 l 2,19,20 + 870 823 870 823 816 885.5 c 128,-1,21 + 762 948 762 948 676 948 c 0,22,23 + 614 948 614 948 553 908 c 128,-1,24 + 492 868 492 868 469 813 c 1,25,-1 + 469 264 l 1,26,27 + 479 223 479 223 531.5 188.5 c 128,-1,28 + 584 154 584 154 664 154 c 0,29,30 + 752 154 752 154 811 232.5 c 128,-1,31 + 870 311 870 311 870 553 c 2,18,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: c +Encoding: 90 99 70 +Width: 1124 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 53 + 15 + 70 + 18 + 2 + 48 + 14 + 1 + 14 + 51 + 17 + 33 + 13 + 51 + 10 + 13 + 27 + 51 + 24 + 33 + 0 + 51 + 3 + 3 + 14 + 128 + 0 + 1 + 64 + 0 + 96 + 0 + 2 + 0 + 55 + 21 + 117 + 21 + 198 + 21 + 3 + 21 + 23 + 15 + 6 + 79 + 6 + 96 + 6 + 3 + 15 + 6 + 207 + 6 + 239 + 6 + 3 + 6 + 28 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1020 61 m 1,0,1 + 1001 45 1001 45 907 10 c 128,-1,2 + 813 -25 813 -25 711 -25 c 0,3,4 + 432 -25 432 -25 267 119.5 c 128,-1,5 + 102 264 102 264 102 553 c 2,6,-1 + 102 602 l 2,7,8 + 102 864 102 864 264 1022 c 128,-1,9 + 426 1180 426 1180 702 1180 c 0,10,11 + 811 1180 811 1180 899 1152 c 128,-1,12 + 987 1124 987 1124 1020 1092 c 1,13,-1 + 1020 889 l 1,14,15 + 977 928 977 928 905.5 954.5 c 128,-1,16 + 834 981 834 981 750 981 c 0,17,18 + 604 981 604 981 526.5 876.5 c 128,-1,19 + 449 772 449 772 449 590 c 2,20,-1 + 449 569 l 2,21,22 + 449 365 449 365 512 280 c 128,-1,23 + 575 195 575 195 715 195 c 0,24,25 + 809 195 809 195 898 223.5 c 128,-1,26 + 987 252 987 252 1020 281 c 1,27,-1 + 1020 61 l 1,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: d +Encoding: 91 100 71 +Width: 1298 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 60 + 9 + 6 + 25 + 6 + 118 + 10 + 3 + 16 + 16 + 18 + 19 + 15 + 3 + 5 + 12 + 22 + 32 + 12 + 13 + 29 + 47 + 64 + 2 + 96 + 5 + 3 + 1 + 2 + 96 + 33 + 1 + 0 + 22 + 15 + 63 + 2 + 1 + 2 + 16 + 18 + 64 + 18 + 112 + 18 + 3 + 18 + 26 + 23 + 15 + 8 + 31 + 8 + 2 + 15 + 8 + 239 + 8 + 2 + 8 + 32 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SMD +MDRP[min,rnd,grey] +SMD +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1153 0 m 1,0,-1 + 846 0 l 1,1,-1 + 838 158 l 1,2,3 + 766 63 766 63 691 23.5 c 128,-1,4 + 616 -16 616 -16 504 -16 c 0,5,6 + 332 -16 332 -16 217 97.5 c 128,-1,7 + 102 211 102 211 102 494 c 2,8,-1 + 102 614 l 2,9,10 + 102 874 102 874 225 1019.5 c 128,-1,11 + 348 1165 348 1165 588 1165 c 0,12,13 + 647 1165 647 1165 715.5 1149 c 128,-1,14 + 784 1133 784 1133 834 1083 c 1,15,-1 + 834 1509 l 1,16,-1 + 1153 1509 l 1,17,-1 + 1153 0 l 1,0,-1 +834 326 m 1,18,-1 + 834 899 l 1,19,20 + 811 940 811 940 767 967.5 c 128,-1,21 + 723 995 723 995 651 995 c 0,22,23 + 551 995 551 995 491.5 911 c 128,-1,24 + 432 827 432 827 432 604 c 2,25,-1 + 432 524 l 2,26,27 + 432 346 432 346 479 273.5 c 128,-1,28 + 526 201 526 201 625 201 c 0,29,30 + 692 201 692 201 749.5 237.5 c 128,-1,31 + 807 274 807 274 834 326 c 1,18,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: e +Encoding: 92 101 72 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 90 + 12 + 84 + 20 + 2 + 1 + 46 + 127 + 30 + 1 + 30 + 73 + 30 + 11 + 18 + 80 + 7 + 96 + 7 + 2 + 7 + 71 + 4 + 33 + 8 + 70 + 11 + 3 + 169 + 27 + 1 + 27 + 33 + 152 + 18 + 1 + 18 + 13 + 8 + 0 + 23 + 80 + 24 + 96 + 24 + 112 + 24 + 3 + 0 + 24 + 16 + 24 + 48 + 24 + 64 + 24 + 80 + 24 + 144 + 24 + 200 + 24 + 7 + 24 + 14 + 30 + 1 + 23 + 31 + 14 + 1 + 15 + 14 + 199 + 14 + 2 + 14 + 31 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +DELTAP1 +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +DELTAP1 +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1206 514 m 1,0,-1 + 424 514 l 1,1,2 + 424 322 424 322 511 247 c 128,-1,3 + 598 172 598 172 737 172 c 0,4,5 + 829 172 829 172 925.5 195.5 c 128,-1,6 + 1022 219 1022 219 1124 266 c 1,7,-1 + 1124 74 l 1,8,9 + 1036 25 1036 25 929.5 0 c 128,-1,10 + 823 -25 823 -25 684 -25 c 0,11,12 + 418 -25 418 -25 260 116.5 c 128,-1,13 + 102 258 102 258 102 530 c 2,14,-1 + 102 612 l 2,15,16 + 102 850 102 850 246.5 1015 c 128,-1,17 + 391 1180 391 1180 666 1180 c 0,18,19 + 928 1180 928 1180 1067 1025 c 128,-1,20 + 1206 870 1206 870 1206 621 c 2,21,22 + 1206 621 1206 621 1206 573.5 c 128,-1,23 + 1206 526 1206 526 1206 514 c 1,0,-1 +909 678 m 1,24,25 + 899 848 899 848 834.5 921.5 c 128,-1,26 + 770 995 770 995 666 995 c 0,27,28 + 575 995 575 995 503.5 922.5 c 128,-1,29 + 432 850 432 850 426 678 c 1,30,-1 + 909 678 l 1,24,25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: f +Encoding: 93 102 73 +Width: 680 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 41 + 9 + 20 + 25 + 20 + 185 + 20 + 3 + 11 + 14 + 32 + 8 + 17 + 12 + 13 + 2 + 1 + 4 + 33 + 0 + 21 + 17 + 0 + 25 + 10 + 8 + 12 + 22 + 17 + 15 + 31 + 13 + 95 + 13 + 144 + 13 + 3 + 144 + 13 + 1 + 13 + 24 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP0 +MDRP[rp0,rnd,white] +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +829 1454 m 1,0,-1 + 745 1284 l 1,1,2 + 715 1307 715 1307 685 1320 c 128,-1,3 + 655 1333 655 1333 608 1333 c 0,4,5 + 539 1333 539 1333 515.5 1293 c 128,-1,6 + 492 1253 492 1253 492 1171 c 2,7,-1 + 492 1128 l 1,8,-1 + 707 1128 l 1,9,-1 + 707 952 l 1,10,-1 + 489 952 l 1,11,-1 + 489 0 l 1,12,-1 + 170 0 l 1,13,-1 + 170 954 l 1,14,-1 + 18 954 l 1,15,-1 + 18 1128 l 1,16,-1 + 176 1128 l 1,17,-1 + 176 1161 l 2,18,19 + 176 1333 176 1333 274.5 1431.5 c 128,-1,20 + 373 1530 373 1530 545 1530 c 0,21,22 + 625 1530 625 1530 700.5 1509.5 c 128,-1,23 + 776 1489 776 1489 829 1454 c 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: g +Encoding: 94 103 74 +Width: 1337 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 99 + 9 + 18 + 52 + 42 + 107 + 18 + 123 + 18 + 123 + 23 + 138 + 11 + 154 + 11 + 170 + 11 + 185 + 11 + 9 + 134 + 41 + 1 + 41 + 47 + 17 + 17 + 24 + 10 + 59 + 14 + 52 + 27 + 2 + 27 + 14 + 17 + 24 + 7 + 51 + 80 + 10 + 240 + 10 + 2 + 10 + 47 + 6 + 51 + 3 + 19 + 28 + 12 + 34 + 32 + 24 + 13 + 0 + 22 + 63 + 27 + 1 + 27 + 31 + 48 + 14 + 144 + 14 + 2 + 48 + 14 + 64 + 14 + 112 + 14 + 176 + 14 + 224 + 14 + 5 + 14 + 38 + 23 + 7 + 31 + 20 + 47 + 20 + 63 + 20 + 3 + 207 + 20 + 239 + 20 + 255 + 20 + 3 + 20 + 44 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIRP[rnd,grey] +SRP1 +SRP2 +IP +IP +DELTAP1 +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1182 158 m 2,0,1 + 1182 -88 1182 -88 1023 -228.5 c 128,-1,2 + 864 -369 864 -369 586 -369 c 0,3,4 + 504 -369 504 -369 395.5 -352.5 c 128,-1,5 + 287 -336 287 -336 203 -295 c 1,6,-1 + 203 -74 l 1,7,8 + 289 -113 289 -113 384 -128 c 128,-1,9 + 479 -143 479 -143 549 -143 c 0,10,11 + 741 -143 741 -143 810 -77.5 c 128,-1,12 + 879 -12 879 -12 879 94 c 2,13,-1 + 879 207 l 1,14,15 + 852 147 852 147 766 80.5 c 128,-1,16 + 680 14 680 14 516 14 c 0,17,18 + 330 14 330 14 216 142 c 128,-1,19 + 102 270 102 270 102 567 c 2,20,-1 + 102 600 l 2,21,22 + 102 885 102 885 232 1025 c 128,-1,23 + 362 1165 362 1165 592 1165 c 0,24,25 + 682 1165 682 1165 760 1136.5 c 128,-1,26 + 838 1108 838 1108 883 1051 c 1,27,-1 + 883 1151 l 1,28,-1 + 1182 1151 l 1,29,-1 + 1182 158 l 2,0,1 +862 602 m 2,30,-1 + 862 674 l 2,31,32 + 862 846 862 846 813 916.5 c 128,-1,33 + 764 987 764 987 655 987 c 0,34,35 + 551 987 551 987 491.5 905 c 128,-1,36 + 432 823 432 823 432 633 c 2,37,-1 + 432 602 l 2,38,39 + 432 385 432 385 486.5 309 c 128,-1,40 + 541 233 541 233 647 233 c 0,41,42 + 752 233 752 233 807 317 c 128,-1,43 + 862 401 862 401 862 602 c 2,30,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: h +Encoding: 95 104 75 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 37 + 18 + 70 + 17 + 231 + 17 + 246 + 17 + 4 + 5 + 17 + 1 + 8 + 13 + 96 + 16 + 1 + 10 + 2 + 11 + 16 + 5 + 45 + 55 + 16 + 1 + 16 + 13 + 96 + 21 + 1 + 0 + 22 + 64 + 1 + 160 + 1 + 2 + 175 + 1 + 1 + 1 + 10 + 13 + 9 + 22 + 10 + 20 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +SRP0 +SMD +MDRP[rp0,min,grey] +MDRP[min,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1149 0 m 1,0,-1 + 829 0 l 1,1,-1 + 829 807 l 2,2,3 + 829 860 829 860 797.5 895 c 128,-1,4 + 766 930 766 930 698 930 c 0,5,6 + 629 930 629 930 568.5 902 c 128,-1,7 + 508 874 508 874 469 827 c 1,8,-1 + 469 0 l 1,9,-1 + 150 0 l 1,10,-1 + 150 1509 l 1,11,-1 + 469 1509 l 1,12,-1 + 469 975 l 1,13,14 + 522 1051 522 1051 618.5 1112.5 c 128,-1,15 + 715 1174 715 1174 860 1174 c 0,16,17 + 1004 1174 1004 1174 1076.5 1083.5 c 128,-1,18 + 1149 993 1149 993 1149 807 c 2,19,-1 + 1149 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: i +Encoding: 96 105 76 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 22 + 214 + 1 + 214 + 11 + 2 + 9 + 62 + 3 + 14 + 12 + 13 + 2 + 0 + 63 + 6 + 12 + 22 + 207 + 13 + 1 + 13 + 16 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +473 1407 m 0,0,1 + 473 1335 473 1335 424 1286 c 128,-1,2 + 375 1237 375 1237 305 1237 c 0,3,4 + 236 1237 236 1237 186.5 1286 c 128,-1,5 + 137 1335 137 1335 137 1407 c 0,6,7 + 137 1477 137 1477 186.5 1526 c 128,-1,8 + 236 1575 236 1575 305 1575 c 0,9,10 + 375 1575 375 1575 424 1526 c 128,-1,11 + 473 1477 473 1477 473 1407 c 0,0,1 +465 0 m 1,12,-1 + 145 0 l 1,13,-1 + 145 1151 l 1,14,-1 + 465 1151 l 1,15,-1 + 465 0 l 1,12,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: j +Encoding: 97 106 77 +Width: 633 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 39 + 6 + 14 + 22 + 14 + 216 + 5 + 216 + 7 + 4 + 9 + 62 + 3 + 26 + 12 + 19 + 22 + 34 + 18 + 15 + 19 + 0 + 63 + 6 + 12 + 22 + 15 + 25 + 1 + 80 + 25 + 96 + 25 + 2 + 111 + 25 + 1 + 25 + 19 + 28 +SRP0 +MDRP[min,rnd,white] +MDRP[rp0,min,rnd,white] +DELTAP1 +DELTAP2 +DELTAP3 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +500 1407 m 0,0,1 + 500 1335 500 1335 450.5 1286 c 128,-1,2 + 401 1237 401 1237 332 1237 c 0,3,4 + 262 1237 262 1237 213 1286 c 128,-1,5 + 164 1335 164 1335 164 1407 c 0,6,7 + 164 1477 164 1477 213 1526 c 128,-1,8 + 262 1575 262 1575 332 1575 c 0,9,10 + 401 1575 401 1575 450.5 1526 c 128,-1,11 + 500 1477 500 1477 500 1407 c 0,0,1 +492 76 m 2,12,13 + 492 -131 492 -131 388.5 -243.5 c 128,-1,14 + 285 -356 285 -356 117 -356 c 0,15,16 + 45 -356 45 -356 -34 -348 c 128,-1,17 + -113 -340 -113 -340 -170 -324 c 1,18,-1 + -170 -106 l 1,19,20 + -137 -117 -137 -117 -88 -124 c 128,-1,21 + -39 -131 -39 -131 16 -131 c 0,22,23 + 94 -131 94 -131 133 -93 c 128,-1,24 + 172 -55 172 -55 172 33 c 2,25,-1 + 172 1151 l 1,26,-1 + 492 1151 l 1,27,-1 + 492 76 l 2,12,13 +EndSplineSet +Validated: 1 +EndChar + +StartChar: k +Encoding: 98 107 78 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 43 + 13 + 1 + 11 + 8 + 28 + 1 + 27 + 8 + 4 + 5 + 16 + 7 + 2 + 10 + 3 + 4 + 9 + 8 + 12 + 0 + 1 + 4 + 2 + 54 + 10 + 1 + 1 + 0 + 10 + 8 + 9 + 2 + 9 + 16 + 0 + 1 + 0 + 12 + 7 + 2 + 22 + 4 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +SRP2 +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP2 +SLOOP +IP +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1212 0 m 1,0,-1 + 836 0 l 1,1,-1 + 469 469 l 1,2,-1 + 469 0 l 1,3,-1 + 150 0 l 1,4,-1 + 150 1509 l 1,5,-1 + 469 1509 l 1,6,-1 + 469 684 l 1,7,-1 + 854 1151 l 1,8,-1 + 1149 1151 l 1,9,-1 + 705 639 l 1,10,-1 + 1212 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: l +Encoding: 99 108 79 +Width: 635 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 2 + 16 + 1 + 2 + 0 + 22 + 176 + 1 + 1 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +477 0 m 1,0,-1 + 158 0 l 1,1,-1 + 158 1509 l 1,2,-1 + 477 1509 l 1,3,-1 + 477 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: m +Encoding: 100 109 80 +Width: 1954 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1538 1174 m 0,0,1 + 1650 1173 1650 1173 1736 1076 c 0,2,3 + 1829 971 1829 971 1829 813 c 2,4,-1 + 1829 0 l 1,5,-1 + 1509 0 l 1,6,-1 + 1509 807 l 2,7,8 + 1509 854 1509 854 1466.5 892 c 128,-1,9 + 1424 930 1424 930 1366 930 c 0,10,11 + 1289 930 1289 930 1235.5 895 c 128,-1,12 + 1182 860 1182 860 1149 807 c 1,13,-1 + 1149 0 l 1,14,-1 + 829 0 l 1,15,-1 + 829 807 l 2,16,17 + 829 856 829 856 790.5 893 c 128,-1,18 + 752 930 752 930 684 930 c 0,19,20 + 607 930 607 930 555.5 901.5 c 128,-1,21 + 504 873 504 873 469 827 c 1,22,-1 + 469 0 l 1,23,-1 + 150 0 l 1,24,-1 + 150 1151 l 1,25,-1 + 457 1151 l 1,26,-1 + 463 969 l 1,27,28 + 514 1063 514 1063 608 1118.5 c 128,-1,29 + 702 1174 702 1174 836 1174 c 0,30,31 + 956 1174 956 1174 1026.5 1116.5 c 128,-1,32 + 1097 1059 1097 1059 1130 958 c 1,33,34 + 1187 1076 1187 1076 1282.5 1125.5 c 0,35,36 + 1376.10891089 1174.01980198 1376.10891089 1174.01980198 1531.68865797 1174.01980198 c 0,37,38 + 1534.83168317 1174.01980198 1534.83168317 1174.01980198 1538 1174 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: n +Encoding: 101 110 81 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 40 + 37 + 17 + 1 + 8 + 13 + 96 + 16 + 1 + 10 + 2 + 11 + 12 + 5 + 45 + 16 + 13 + 96 + 21 + 1 + 0 + 22 + 112 + 1 + 1 + 64 + 1 + 160 + 1 + 2 + 175 + 1 + 1 + 1 + 10 + 12 + 13 + 9 + 22 + 10 + 20 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +DELTAP3 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +SRP0 +SMD +MDRP[rp0,min,grey] +MDRP[min,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1149 0 m 1,0,-1 + 829 0 l 1,1,-1 + 829 807 l 2,2,3 + 829 852 829 852 790.5 891 c 128,-1,4 + 752 930 752 930 680 930 c 0,5,6 + 611 930 611 930 558.5 901 c 128,-1,7 + 506 872 506 872 469 827 c 1,8,-1 + 469 0 l 1,9,-1 + 150 0 l 1,10,-1 + 150 1151 l 1,11,-1 + 457 1151 l 1,12,-1 + 463 967 l 1,13,14 + 498 1049 498 1049 597.5 1111.5 c 128,-1,15 + 697 1174 697 1174 840 1174 c 0,16,17 + 984 1174 984 1174 1066.5 1083.5 c 128,-1,18 + 1149 993 1149 993 1149 807 c 2,19,-1 + 1149 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: o +Encoding: 102 111 82 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 88 + 24 + 150 + 4 + 150 + 9 + 198 + 2 + 247 + 8 + 5 + 104 + 18 + 1 + 18 + 33 + 10 + 13 + 103 + 25 + 1 + 25 + 33 + 3 + 3 + 0 + 23 + 96 + 14 + 112 + 14 + 144 + 14 + 3 + 0 + 14 + 48 + 14 + 80 + 14 + 129 + 14 + 208 + 14 + 224 + 14 + 240 + 14 + 7 + 14 + 134 + 22 + 1 + 22 + 23 + 159 + 6 + 1 + 15 + 6 + 31 + 6 + 63 + 6 + 3 + 15 + 6 + 207 + 6 + 223 + 6 + 239 + 6 + 255 + 6 + 5 + 6 + 28 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +DELTAP3 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1257 541 m 2,0,1 + 1257 274 1257 274 1103.5 124.5 c 128,-1,2 + 950 -25 950 -25 682 -25 c 0,3,4 + 416 -25 416 -25 259 128 c 128,-1,5 + 102 281 102 281 102 541 c 2,6,-1 + 102 614 l 2,7,8 + 102 868 102 868 257 1024 c 128,-1,9 + 412 1180 412 1180 680 1180 c 0,10,11 + 950 1180 950 1180 1103.5 1023 c 128,-1,12 + 1257 866 1257 866 1257 614 c 2,13,-1 + 1257 541 l 2,0,1 +928 569 m 2,14,-1 + 928 586 l 2,15,16 + 928 819 928 819 856 904 c 128,-1,17 + 784 989 784 989 680 989 c 0,18,19 + 571 989 571 989 502.5 898 c 128,-1,20 + 434 807 434 807 434 586 c 2,21,-1 + 434 569 l 2,22,23 + 434 326 434 326 500.5 246 c 128,-1,24 + 567 166 567 166 680 166 c 0,25,26 + 782 166 782 166 855 244 c 128,-1,27 + 928 322 928 322 928 569 c 2,14,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: p +Encoding: 103 112 83 +Width: 1298 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 50 + 6 + 16 + 22 + 16 + 121 + 1 + 3 + 9 + 12 + 26 + 25 + 6 + 3 + 3 + 14 + 64 + 11 + 96 + 14 + 22 + 47 + 14 + 13 + 29 + 32 + 3 + 3 + 8 + 18 + 96 + 33 + 1 + 0 + 23 + 16 + 18 + 64 + 18 + 112 + 18 + 3 + 18 + 8 + 10 + 11 + 26 + 6 + 22 + 8 + 32 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[min,rnd,black] +SRP0 +SMD +MDRP[min,grey] +SMD +SRP1 +SRP2 +SLOOP +IP +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1200 532 m 2,0,1 + 1200 270 1200 270 1073 128 c 128,-1,2 + 946 -14 946 -14 719 -14 c 0,3,4 + 659 -14 659 -14 588.5 2 c 128,-1,5 + 518 18 518 18 469 61 c 1,6,-1 + 469 -342 l 1,7,-1 + 150 -342 l 1,8,-1 + 150 1151 l 1,9,-1 + 457 1151 l 1,10,-1 + 465 981 l 1,11,12 + 503 1069 503 1069 599.5 1121.5 c 128,-1,13 + 696 1174 696 1174 811 1174 c 0,14,15 + 969 1174 969 1174 1084.5 1058 c 128,-1,16 + 1200 942 1200 942 1200 666 c 2,17,-1 + 1200 532 l 2,0,1 +870 549 m 2,18,-1 + 870 625 l 2,19,20 + 870 811 870 811 820 879.5 c 128,-1,21 + 770 948 770 948 684 948 c 0,22,23 + 616 948 616 948 556 909 c 128,-1,24 + 496 870 496 870 469 825 c 1,25,-1 + 469 268 l 1,26,27 + 477 229 477 229 530.5 192.5 c 128,-1,28 + 584 156 584 156 664 156 c 0,29,30 + 735 156 735 156 802.5 228.5 c 128,-1,31 + 870 301 870 301 870 549 c 2,18,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: q +Encoding: 104 113 84 +Width: 1298 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 65 + 9 + 6 + 24 + 6 + 121 + 11 + 137 + 6 + 155 + 6 + 5 + 16 + 12 + 52 + 15 + 1 + 18 + 19 + 15 + 3 + 5 + 12 + 22 + 32 + 12 + 13 + 29 + 47 + 64 + 2 + 96 + 5 + 3 + 1 + 18 + 96 + 33 + 1 + 0 + 22 + 16 + 15 + 2 + 16 + 18 + 64 + 18 + 112 + 18 + 3 + 18 + 26 + 23 + 15 + 8 + 31 + 8 + 2 + 15 + 8 + 239 + 8 + 2 + 8 + 32 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SMD +MDRP[min,rnd,grey] +SMD +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1153 -342 m 1,0,-1 + 834 -342 l 1,1,-1 + 834 152 l 1,2,3 + 805 100 805 100 720 42 c 128,-1,4 + 635 -16 635 -16 512 -16 c 0,5,6 + 322 -16 322 -16 212 100.5 c 128,-1,7 + 102 217 102 217 102 506 c 2,8,-1 + 102 657 l 2,9,10 + 102 872 102 872 228 1018.5 c 128,-1,11 + 354 1165 354 1165 586 1165 c 0,12,13 + 680 1165 680 1165 748.5 1138.5 c 128,-1,14 + 817 1112 817 1112 858 1051 c 1,15,-1 + 924 1151 l 1,16,-1 + 1153 1151 l 1,17,-1 + 1153 -342 l 1,0,-1 +834 326 m 1,18,-1 + 834 905 l 1,19,20 + 795 958 795 958 747.5 976.5 c 128,-1,21 + 700 995 700 995 653 995 c 0,22,23 + 549 995 549 995 490.5 908 c 128,-1,24 + 432 821 432 821 432 616 c 2,25,-1 + 432 543 l 2,26,27 + 432 356 432 356 477 278.5 c 128,-1,28 + 522 201 522 201 625 201 c 0,29,30 + 696 201 696 201 748.5 234.5 c 128,-1,31 + 801 268 801 268 834 326 c 1,18,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: r +Encoding: 105 114 85 +Width: 1020 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1012 801 m 1,0,-1 + 717 801 l 1,1,2 + 717 850 717 850 696.5 885 c 128,-1,3 + 676 920 676 920 616 920 c 0,4,5 + 559 920 559 920 520 889 c 128,-1,6 + 481 858 481 858 469 823 c 1,7,-1 + 469 0 l 1,8,-1 + 150 0 l 1,9,-1 + 150 1151 l 1,10,-1 + 457 1151 l 1,11,-1 + 463 969 l 1,12,13 + 508 1067 508 1067 579.5 1120.5 c 128,-1,14 + 651 1174 651 1174 748 1174 c 0,15,16 + 893 1174 893 1174 964 1078 c 0,17,18 + 1018.03143146 1006.95867346 1018.03143146 1006.95867346 1018.03143146 886.877101929 c 0,19,20 + 1018.03143146 847.240974498 1018.03143146 847.240974498 1012 801 c 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: s +Encoding: 106 115 86 +Width: 932 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 146 + 4 + 1 + 11 + 17 + 11 + 20 + 2 + 37 + 20 + 1 + 27 + 17 + 27 + 20 + 18 + 37 + 52 + 15 + 52 + 37 + 70 + 36 + 119 + 37 + 139 + 17 + 152 + 2 + 155 + 17 + 166 + 35 + 184 + 20 + 181 + 35 + 235 + 17 + 19 + 70 + 35 + 166 + 35 + 182 + 35 + 214 + 35 + 232 + 35 + 248 + 35 + 6 + 35 + 0 + 32 + 103 + 16 + 233 + 16 + 246 + 16 + 3 + 16 + 13 + 19 + 19 + 32 + 13 + 0 + 4 + 3 + 22 + 143 + 26 + 159 + 26 + 175 + 26 + 3 + 26 + 29 + 46 + 143 + 25 + 159 + 25 + 175 + 25 + 3 + 25 + 22 + 13 + 160 + 7 + 1 + 7 + 51 + 10 + 46 + 6 + 71 + 3 + 3 + 63 + 39 + 1 + 63 + 39 + 1 + 35 + 0 + 32 + 16 + 13 + 19 + 143 + 25 + 1 + 25 + 0 + 49 + 127 + 13 + 144 + 13 + 2 + 32 + 13 + 80 + 13 + 144 + 13 + 207 + 13 + 4 + 13 + 32 + 48 + 6 + 47 + 19 + 63 + 19 + 2 + 19 + 38 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +DELTAP1 +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +DELTAP1 +MIAP[rnd] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +DELTAP1 +SRP1 +SRP2 +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +877 350 m 0,0,1 + 877 190 877 190 761 82.5 c 128,-1,2 + 645 -25 645 -25 379 -25 c 0,3,4 + 268 -25 268 -25 177 -6.5 c 128,-1,5 + 86 12 86 12 45 39 c 1,6,-1 + 45 242 l 1,7,8 + 92 215 92 215 178 187.5 c 128,-1,9 + 264 160 264 160 354 160 c 0,10,11 + 469 160 469 160 530.5 199 c 128,-1,12 + 592 238 592 238 592 299 c 0,13,14 + 592 358 592 358 551 395 c 128,-1,15 + 510 432 510 432 342 483 c 0,16,17 + 184 530 184 530 127 616 c 128,-1,18 + 70 702 70 702 70 838 c 0,19,20 + 70 977 70 977 172 1073 c 128,-1,21 + 274 1169 274 1169 494 1169 c 0,22,23 + 596 1169 596 1169 666.5 1153.5 c 128,-1,24 + 737 1138 737 1138 799 1109 c 1,25,-1 + 799 924 l 1,26,27 + 754 950 754 950 671 967.5 c 128,-1,28 + 588 985 588 985 512 985 c 0,29,30 + 424 985 424 985 369.5 954.5 c 128,-1,31 + 315 924 315 924 315 872 c 0,32,33 + 315 813 315 813 357 789.5 c 128,-1,34 + 399 766 399 766 545 723 c 0,35,36 + 731 668 731 668 804 579 c 128,-1,37 + 877 490 877 490 877 350 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: t +Encoding: 107 116 87 +Width: 850 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 51 + 10 + 14 + 26 + 14 + 185 + 13 + 3 + 16 + 1 + 32 + 18 + 19 + 22 + 12 + 20 + 16 + 8 + 5 + 33 + 9 + 12 + 3 + 20 + 20 + 2 + 15 + 0 + 47 + 9 + 1 + 9 + 15 + 22 + 2 + 22 + 19 + 17 + 31 + 15 + 63 + 15 + 95 + 15 + 3 + 239 + 15 + 255 + 15 + 2 + 15 + 24 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +DELTAP2 +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +793 952 m 1,0,-1 + 489 952 l 1,1,-1 + 489 362 l 2,2,3 + 489 272 489 272 519 230 c 128,-1,4 + 549 188 549 188 635 188 c 0,5,6 + 676 188 676 188 714 194.5 c 128,-1,7 + 752 201 752 201 784 211 c 1,8,-1 + 784 31 l 1,9,10 + 733 10 733 10 658.5 0 c 128,-1,11 + 584 -10 584 -10 512 -10 c 0,12,13 + 354 -10 354 -10 262 91.5 c 128,-1,14 + 170 193 170 193 170 383 c 2,15,-1 + 170 954 l 1,16,-1 + 33 954 l 1,17,-1 + 33 1118 l 1,18,-1 + 182 1126 l 1,19,-1 + 289 1509 l 1,20,-1 + 489 1509 l 1,21,-1 + 489 1128 l 1,22,-1 + 793 1128 l 1,23,-1 + 793 952 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: u +Encoding: 108 117 88 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 54 + 43 + 6 + 235 + 6 + 251 + 6 + 3 + 10 + 6 + 140 + 6 + 154 + 6 + 172 + 6 + 4 + 17 + 2 + 96 + 5 + 0 + 2 + 14 + 45 + 57 + 5 + 72 + 5 + 2 + 5 + 3 + 18 + 9 + 12 + 96 + 21 + 1 + 19 + 22 + 1 + 2 + 64 + 18 + 160 + 18 + 2 + 175 + 18 + 1 + 18 + 10 + 22 + 9 + 20 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIAP[rnd] +SRP0 +SMD +MDRP[rp0,min,grey] +MDRP[min,rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1149 0 m 1,0,-1 + 842 0 l 1,1,-1 + 836 180 l 1,2,3 + 780 104 780 104 682 40.5 c 128,-1,4 + 584 -23 584 -23 440 -23 c 0,5,6 + 305 -23 305 -23 227.5 58 c 128,-1,7 + 150 139 150 139 150 346 c 2,8,-1 + 150 1151 l 1,9,-1 + 469 1151 l 1,10,-1 + 469 375 l 2,11,12 + 469 285 469 285 507 254 c 128,-1,13 + 545 223 545 223 600 223 c 0,14,15 + 670 223 670 223 729 248.5 c 128,-1,16 + 788 274 788 274 829 328 c 1,17,-1 + 829 1151 l 1,18,-1 + 1149 1151 l 1,19,-1 + 1149 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: v +Encoding: 109 118 89 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 112 + 25 + 5 + 56 + 5 + 59 + 6 + 84 + 1 + 89 + 6 + 106 + 2 + 118 + 1 + 121 + 6 + 150 + 1 + 156 + 2 + 169 + 2 + 184 + 2 + 12 + 16 + 8 + 1 + 21 + 5 + 85 + 5 + 154 + 5 + 3 + 63 + 0 + 140 + 0 + 2 + 0 + 60 + 22 + 6 + 1 + 6 + 59 + 1 + 1 + 1 + 60 + 5 + 5 + 6 + 116 + 3 + 132 + 3 + 2 + 3 + 59 + 123 + 4 + 1 + 4 + 25 + 2 + 60 + 2 + 2 + 2 + 59 + 121 + 5 + 1 + 5 + 5 + 4 + 5 + 2 + 3 + 1 + 2 + 0 + 6 + 4 + 0 + 3 + 12 + 1 + 6 + 0 + 2 + 4 + 3 + 106 + 5 + 1 + 5 + 5 + 0 + 3 + 0 + 0 + 1 + 0 + 8 + 18 + 3 + 1 + 3 + 7 +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP1 +SRP2 +IP +RTHG +MDAP[rnd] +RTG +DELTAP1 +SRP2 +IP +IP +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1188 1151 m 1,0,-1 + 692 0 l 1,1,-1 + 459 0 l 1,2,-1 + -6 1151 l 1,3,-1 + 319 1151 l 1,4,-1 + 612 371 l 1,5,-1 + 934 1151 l 1,6,-1 + 1188 1151 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: w +Encoding: 110 119 90 +Width: 1774 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 199 + 11 + 3 + 31 + 8 + 70 + 8 + 68 + 11 + 80 + 8 + 80 + 11 + 111 + 3 + 103 + 11 + 159 + 3 + 9 + 12 + 2 + 8 + 5 + 6 + 9 + 26 + 2 + 20 + 4 + 41 + 8 + 57 + 2 + 57 + 4 + 56 + 5 + 54 + 7 + 51 + 10 + 74 + 2 + 70 + 10 + 87 + 1 + 88 + 2 + 88 + 5 + 86 + 8 + 88 + 9 + 87 + 10 + 88 + 11 + 136 + 12 + 151 + 4 + 22 + 63 + 14 + 1 + 8 + 60 + 7 + 8 + 4 + 48 + 9 + 1 + 9 + 60 + 3 + 4 + 3 + 132 + 11 + 1 + 11 + 59 + 11 + 12 + 2 + 116 + 10 + 132 + 10 + 2 + 10 + 59 + 3 + 3 + 2 + 246 + 11 + 1 + 11 + 60 + 23 + 1 + 1 + 1 + 59 + 12 + 68 + 12 + 246 + 12 + 3 + 12 + 60 + 5 + 0 + 53 + 0 + 2 + 0 + 0 + 1 + 118 + 8 + 134 + 8 + 2 + 8 + 59 + 5 + 116 + 7 + 132 + 7 + 2 + 7 + 59 + 5 + 6 + 6 + 5 + 1 + 12 + 0 + 2 + 9 + 11 + 4 + 10 + 5 + 7 + 6 + 8 + 3 + 11 + 8 + 0 + 6 + 11 + 0 + 63 + 0 + 176 + 0 + 3 + 0 + 9 + 10 + 8 + 6 + 47 + 6 + 55 + 6 + 3 + 6 + 13 + 8 + 3 + 11 + 3 + 5 + 6 + 7 + 9 + 10 + 12 + 0 + 5 + 6 + 12 + 4 + 2 + 1 + 3 + 5 + 0 +SVTCA[y-axis] +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +SRP1 +SRP2 +SLOOP +IP +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +IP +IP +RTHG +MDAP[rnd] +SRP2 +IP +IP +SRP2 +IP +MDAP[rnd] +SRP2 +IP +SRP2 +IP +IP +RTG +SPVTL[orthog] +SRP0 +MDRP[grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[no-rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[no-rnd] +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +SFVTCA[x-axis] +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[no-rnd] +SFVTL[parallel] +MIRP[rp0,min,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1776 1151 m 1,0,-1 + 1307 0 l 1,1,-1 + 1110 0 l 1,2,-1 + 883 590 l 1,3,-1 + 641 0 l 1,4,-1 + 444 0 l 1,5,-1 + -4 1151 l 1,6,-1 + 315 1151 l 1,7,-1 + 588 442 l 1,8,-1 + 848 1151 l 1,9,-1 + 995 1151 l 1,10,-1 + 1247 442 l 1,11,-1 + 1522 1151 l 1,12,-1 + 1776 1151 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: x +Encoding: 111 120 91 +Width: 1217 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 160 + 54 + 2 + 67 + 8 + 86 + 8 + 102 + 8 + 118 + 8 + 149 + 8 + 6 + 11 + 1 + 5 + 3 + 5 + 7 + 11 + 9 + 25 + 1 + 21 + 3 + 21 + 7 + 38 + 11 + 91 + 5 + 85 + 11 + 154 + 1 + 154 + 2 + 167 + 11 + 198 + 11 + 215 + 11 + 15 + 11 + 8 + 0 + 7 + 8 + 9 + 7 + 0 + 137 + 5 + 1 + 2 + 5 + 1 + 6 + 6 + 5 + 6 + 1 + 116 + 1 + 128 + 1 + 2 + 1 + 59 + 0 + 0 + 7 + 116 + 7 + 132 + 7 + 2 + 7 + 59 + 6 + 6 + 1 + 11 + 2 + 10 + 3 + 3 + 10 + 8 + 5 + 9 + 4 + 4 + 9 + 9 + 60 + 10 + 3 + 10 + 3 + 60 + 4 + 4 + 9 + 8 + 5 + 11 + 2 + 4 + 4 + 6 + 7 + 8 + 10 + 3 + 6 + 12 + 3 + 1 + 0 + 3 + 4 + 2 + 9 + 3 + 4 + 10 + 10 + 7 + 1 + 3 + 0 + 159 + 6 + 1 + 6 + 5 + 8 + 2 + 11 + 6 + 5 + 16 + 0 + 32 + 0 + 112 + 0 + 144 + 0 + 4 + 0 + 31 + 4 + 47 + 4 + 2 + 4 + 12 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +SLOOP +IP +MDAP[rnd] +DELTAP1 +SRP2 +SLOOP +IP +MDAP[rnd] +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SFVTCA[x-axis] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[parallel] +SFVTL[parallel] +SRP1 +SRP2 +IP +IP +DELTAP1 +SPVTL[orthog] +SFVTL[parallel] +SRP1 +SRP2 +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1227 0 m 1,0,-1 + 856 0 l 1,1,-1 + 586 395 l 1,2,-1 + 295 0 l 1,3,-1 + -4 0 l 1,4,-1 + 459 592 l 1,5,-1 + 53 1151 l 1,6,-1 + 424 1151 l 1,7,-1 + 639 827 l 1,8,-1 + 879 1151 l 1,9,-1 + 1178 1151 l 1,10,-1 + 770 631 l 1,11,-1 + 1227 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: y +Encoding: 112 121 92 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 115 + 84 + 6 + 1 + 21 + 6 + 56 + 6 + 90 + 3 + 109 + 3 + 153 + 3 + 152 + 4 + 6 + 62 + 2 + 1 + 2 + 60 + 8 + 1 + 18 + 1 + 38 + 1 + 60 + 1 + 4 + 1 + 4 + 3 + 1 + 3 + 4 + 3 + 4 + 6 + 20 + 6 + 38 + 6 + 169 + 6 + 4 + 6 + 5 + 6 + 61 + 7 + 1 + 7 + 60 + 11 + 0 + 52 + 0 + 2 + 0 + 0 + 1 + 13 + 3 + 1 + 60 + 3 + 173 + 3 + 2 + 3 + 59 + 6 + 115 + 4 + 132 + 4 + 2 + 4 + 59 + 120 + 5 + 1 + 5 + 6 + 5 + 3 + 2 + 7 + 0 + 2 + 5 + 4 + 6 + 1 + 6 + 0 + 4 + 90 + 0 + 1 + 0 + 9 + 4 + 8 + 3 + 2 + 0 + 7 + 5 + 4 + 12 + 1 + 2 + 18 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP2 +IP +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP1 +SRP2 +IP +IP +RTHG +MDAP[rnd] +RTG +SRP2 +IP +IP +SRP2 +IP +MDAP[rnd] +IP +SPVTL[orthog] +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +DELTAP2 +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SFVTL[parallel] +MDRP[grey] +DELTAP1 +SFVTL[parallel] +MDRP[grey] +DELTAP1 +SFVTCA[x-axis] +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1188 1151 m 1,0,-1 + 524 -342 l 1,1,-1 + 260 -342 l 1,2,-1 + 442 43 l 1,3,-1 + -8 1151 l 1,4,-1 + 317 1151 l 1,5,-1 + 610 377 l 1,6,-1 + 928 1151 l 1,7,-1 + 1188 1151 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: z +Encoding: 113 122 93 +Width: 1020 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 56 + 7 + 136 + 3 + 134 + 8 + 3 + 96 + 8 + 1 + 8 +PUSHW_1 + -16 +NPUSHB + 43 + 3 + 16 + 8 + 59 + 2 + 2 + 3 + 3 + 59 + 7 + 7 + 8 + 7 + 3 + 6 + 3 + 33 + 6 + 12 + 2 + 8 + 1 + 8 + 33 + 1 + 0 + 63 + 11 + 1 + 3 + 7 + 16 + 0 + 1 + 0 + 11 + 4 + 8 + 128 + 2 + 1 + 2 + 10 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,rnd,grey] +MDRP[grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SVTCA[x-axis] +SHPIX +SHPIX +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +999 0 m 1,0,-1 + 41 0 l 1,1,-1 + 41 213 l 1,2,-1 + 629 946 l 1,3,-1 + 51 946 l 1,4,-1 + 51 1151 l 1,5,-1 + 973 1151 l 1,6,-1 + 973 938 l 1,7,-1 + 367 205 l 1,8,-1 + 999 205 l 1,9,-1 + 999 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: braceleft +Encoding: 114 123 94 +Width: 809 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 63 + 11 + 3 + 11 + 18 + 27 + 3 + 27 + 18 + 246 + 32 + 5 + 6 + 32 + 1 + 31 + 10 + 45 + 11 + 74 + 11 + 21 + 0 + 40 + 73 + 0 + 18 + 22 + 73 + 21 + 16 + 4 + 31 + 1 + 22 + 31 + 1 + 31 + 10 + 22 + 0 + 4 + 28 + 34 + 24 + 10 + 14 + 17 + 9 + 4 + 1 + 40 + 4 + 56 + 4 + 72 + 4 + 88 + 4 + 249 + 4 + 5 + 4 + 41 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[grey] +DELTAP1 +DELTAP2 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +737 -344 m 1,0,-1 + 532 -344 l 2,1,2 + 408 -344 408 -344 333 -265 c 128,-1,3 + 258 -186 258 -186 258 -86 c 0,4,5 + 258 35 258 35 257 139.5 c 128,-1,6 + 256 244 256 244 256 373 c 0,7,8 + 256 434 256 434 221 461.5 c 128,-1,9 + 186 489 186 489 82 489 c 1,10,-1 + 82 731 l 1,11,12 + 190 731 190 731 225 747.5 c 128,-1,13 + 260 764 260 764 260 825 c 0,14,15 + 260 956 260 956 259 1043 c 128,-1,16 + 258 1130 258 1130 258 1251 c 0,17,18 + 258 1352 258 1352 337 1430.5 c 128,-1,19 + 416 1509 416 1509 532 1509 c 2,20,-1 + 737 1509 l 1,21,-1 + 737 1317 l 1,22,23 + 737 1317 737 1317 702.5 1317 c 128,-1,24 + 668 1317 668 1317 631 1317 c 0,25,26 + 580 1317 580 1317 572.5 1270 c 128,-1,27 + 565 1223 565 1223 565 1110 c 0,28,29 + 565 870 565 870 536.5 755.5 c 128,-1,30 + 508 641 508 641 385 612 c 1,31,32 + 510 575 510 575 537.5 498.5 c 128,-1,33 + 565 422 565 422 565 197 c 0,34,35 + 565 -33 565 -33 572.5 -92.5 c 128,-1,36 + 580 -152 580 -152 631 -152 c 0,37,38 + 668 -152 668 -152 702.5 -152 c 128,-1,39 + 737 -152 737 -152 737 -152 c 1,40,-1 + 737 -344 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: bar +Encoding: 115 124 95 +Width: 850 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 1 + 2 + 16 + 63 + 0 + 1 + 0 + 58 + 1 + 4 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +555 -410 m 1,0,-1 + 297 -410 l 1,1,-1 + 297 1511 l 1,2,-1 + 555 1511 l 1,3,-1 + 555 -410 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: braceright +Encoding: 116 125 96 +Width: 809 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 70 + 9 + 19 + 1 + 3 + 7 + 3 + 33 + 19 + 7 + 19 + 33 + 249 + 19 + 5 + 20 + 0 + 45 + 0 + 40 + 16 + 40 + 96 + 40 + 3 + 40 + 74 + 40 + 11 + 30 + 11 + 73 + 10 + 18 + 29 + 73 + 30 + 16 + 11 + 20 + 1 + 25 + 20 + 1 + 20 + 0 + 29 + 12 + 6 + 23 + 17 + 24 + 0 + 37 + 34 + 6 + 6 + 1 + 39 + 6 + 55 + 6 + 71 + 6 + 87 + 6 + 246 + 6 + 5 + 6 + 42 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[grey] +DELTAP1 +DELTAP2 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +DELTAP1 +MIRP[rp0,min,rnd,black] +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +DELTAP2 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +727 489 m 1,0,1 + 623 489 623 489 588 461.5 c 128,-1,2 + 553 434 553 434 553 373 c 0,3,4 + 553 244 553 244 552 139.5 c 128,-1,5 + 551 35 551 35 551 -86 c 0,6,7 + 551 -186 551 -186 476 -265 c 128,-1,8 + 401 -344 401 -344 276 -344 c 2,9,-1 + 72 -344 l 1,10,-1 + 72 -152 l 1,11,12 + 72 -152 72 -152 106.5 -152 c 128,-1,13 + 141 -152 141 -152 178 -152 c 0,14,15 + 229 -152 229 -152 236.5 -92.5 c 128,-1,16 + 244 -33 244 -33 244 197 c 0,17,18 + 244 422 244 422 271.5 498.5 c 128,-1,19 + 299 575 299 575 424 612 c 1,20,21 + 301 641 301 641 272.5 755.5 c 128,-1,22 + 244 870 244 870 244 1110 c 0,23,24 + 244 1223 244 1223 236.5 1270 c 128,-1,25 + 229 1317 229 1317 178 1317 c 0,26,27 + 141 1317 141 1317 106.5 1317 c 128,-1,28 + 72 1317 72 1317 72 1317 c 1,29,-1 + 72 1509 l 1,30,-1 + 276 1509 l 2,31,32 + 393 1509 393 1509 472 1430.5 c 128,-1,33 + 551 1352 551 1352 551 1251 c 0,34,35 + 551 1130 551 1130 550 1043 c 128,-1,36 + 549 956 549 956 549 825 c 0,37,38 + 549 764 549 764 583.5 747.5 c 128,-1,39 + 618 731 618 731 727 731 c 1,40,-1 + 727 489 l 1,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: asciitilde +Encoding: 117 126 97 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 54 + 2 + 63 + 14 + 48 + 36 + 69 + 2 + 4 + 6 + 9 + 3 + 12 + 31 + 28 + 34 + 25 + 34 + 34 + 3 + 18 + 12 + 34 + 25 + 40 + 6 + 52 + 9 + 1 + 9 + 3 + 12 + 59 + 31 + 1 + 31 + 28 + 34 + 25 + 25 + 34 + 12 + 3 + 4 + 0 + 22 + 18 + 15 + 41 + 0 + 34 + 40 + 112 + 37 + 1 + 0 + 37 + 16 + 37 + 144 + 37 + 3 + 37 + 70 + 15 + 34 + 19 + 15 + 22 + 47 + 22 + 63 + 22 + 239 + 22 + 4 + 22 + 44 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +SROUND +MDRP[rp0,min,rnd,grey] +RTG +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +IP +DELTAP1 +SRP1 +SRP2 +IP +DELTAP1 +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +SRP1 +SRP2 +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1274 731 m 0,0,1 + 1274 616 1274 616 1192 531 c 128,-1,2 + 1110 446 1110 446 954 446 c 0,3,4 + 862 446 862 446 771 492.5 c 128,-1,5 + 680 539 680 539 606 596 c 0,6,7 + 596 604 596 604 590 607 c 128,-1,8 + 584 610 584 610 573 618 c 0,9,10 + 520 664 520 664 470 699.5 c 128,-1,11 + 420 735 420 735 369 735 c 0,12,13 + 301 735 301 735 272.5 699.5 c 128,-1,14 + 244 664 244 664 244 621 c 0,15,16 + 244 571 244 571 261.5 530 c 128,-1,17 + 279 489 279 489 311 449 c 1,18,-1 + 121 449 l 1,19,20 + 82 489 82 489 59.5 537.5 c 128,-1,21 + 37 586 37 586 37 672 c 0,22,23 + 37 782 37 782 125 869 c 128,-1,24 + 213 956 213 956 356 956 c 0,25,26 + 449 956 449 956 539 911 c 128,-1,27 + 629 866 629 866 702 809 c 0,28,29 + 717 797 717 797 720 795 c 128,-1,30 + 723 793 723 793 733 782 c 0,31,32 + 786 737 786 737 838.5 702.5 c 128,-1,33 + 891 668 891 668 942 668 c 0,34,35 + 1010 668 1010 668 1038.5 703.5 c 128,-1,36 + 1067 739 1067 739 1067 782 c 0,37,38 + 1067 831 1067 831 1049.5 872 c 128,-1,39 + 1032 913 1032 913 999 954 c 1,40,-1 + 1190 954 l 1,41,42 + 1229 913 1229 913 1251.5 865 c 128,-1,43 + 1274 817 1274 817 1274 731 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Adieresis +Encoding: 154 196 98 +Width: 1358 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 140 247 2 +Validated: 1 +EndChar + +StartChar: Aring +Encoding: 155 197 99 +Width: 1358 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 161 + 58 + 6 + 55 + 18 + 102 + 4 + 218 + 13 + 233 + 13 + 248 + 6 + 6 + 9 + 32 + 202 + 32 + 218 + 32 + 235 + 32 + 4 + 32 + 57 + 4 + 32 + 18 + 31 + 2 + 40 + 1 + 1 + 1 + 57 + 56 + 0 + 1 + 0 + 0 + 18 + 100 + 32 + 1 + 59 + 32 + 1 + 32 + 58 + 6 + 33 + 3 + 100 + 4 + 1 + 39 + 4 + 63 + 4 + 203 + 4 + 219 + 4 + 237 + 4 + 5 + 4 + 58 + 5 + 5 + 6 + 15 + 75 + 47 + 19 + 127 + 19 + 2 + 15 + 19 + 63 + 19 + 64 + 19 + 80 + 19 + 127 + 19 + 143 + 19 + 159 + 19 + 207 + 19 + 223 + 19 + 240 + 19 + 10 + 19 + 25 + 75 + 0 + 9 + 1 + 9 + 6 + 18 + 32 + 33 + 31 + 3 + 2 + 4 + 1 + 9 + 15 + 11 + 0 + 5 + 0 + 35 + 55 + 5 + 1 + 5 + 34 + 2 + 3 + 30 + 31 + 48 + 33 + 1 + 33 + 33 + 5 + 6 + 18 + 63 + 6 + 1 + 6 + 22 + 210 + 7 + 12 + 55 + 12 + 71 + 12 + 87 + 12 + 4 + 12 + 28 + 4 + 1 + 0 + 3 + 5 + 0 +SVTCA[y-axis] +MIAP[rnd] +SLOOP +IP +MDAP[rnd] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +DELTAP2 +MDRP[grey] +MDRP[grey] +SRP0 +MIRP[rp0,min,black] +DELTAP1 +DELTAP2 +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +MDRP[grey] +SRP0 +SFVTL[parallel] +MIRP[rp0,min,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1352 0 m 1,0,-1 + 1004 0 l 1,1,-1 + 893 362 l 1,2,-1 + 395 362 l 1,3,-1 + 281 0 l 1,4,-1 + 4 0 l 1,5,-1 + 471 1386 l 1,6,7 + 432 1419 432 1419 408.5 1470.5 c 128,-1,8 + 385 1522 385 1522 385 1581 c 0,9,10 + 385 1692 385 1692 465 1768.5 c 128,-1,11 + 545 1845 545 1845 662 1845 c 0,12,13 + 780 1845 780 1845 859 1768.5 c 128,-1,14 + 938 1692 938 1692 938 1581 c 0,15,16 + 938 1528 938 1528 919.5 1481 c 128,-1,17 + 901 1434 901 1434 868 1401 c 1,18,-1 + 1352 0 l 1,0,-1 +793 1581 m 0,19,20 + 793 1632 793 1632 754 1672 c 128,-1,21 + 715 1712 715 1712 662 1712 c 0,22,23 + 610 1712 610 1712 570 1672 c 128,-1,24 + 530 1632 530 1632 530 1581 c 0,25,26 + 530 1528 530 1528 570 1489 c 128,-1,27 + 610 1450 610 1450 662 1450 c 0,28,29 + 715 1450 715 1450 754 1489 c 128,-1,30 + 793 1528 793 1528 793 1581 c 0,19,20 +821 580 m 1,31,-1 + 635 1135 l 1,32,-1 + 461 580 l 1,33,-1 + 821 580 l 1,31,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Ccedilla +Encoding: 157 199 100 +Width: 1190 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 38 67 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 246 10 2 +Validated: 5 +EndChar + +StartChar: Eacute +Encoding: 159 201 101 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 156 260 2 +Validated: 1 +EndChar + +StartChar: Ntilde +Encoding: 167 209 102 +Width: 1397 +GlyphClass: 1 +Flags: W +TtInstrs: +SVTCA[y-axis] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 49 78 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 194 232 2 +Validated: 1 +EndChar + +StartChar: Odieresis +Encoding: 172 214 103 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 63 + 34 + 63 + 46 + 2 + 63 + 53 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 142 168 N 1 0 0 1 189 247 2 +Validated: 1 +EndChar + +StartChar: Udieresis +Encoding: 178 220 104 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 63 + 24 + 63 + 36 + 2 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 198 247 2 +Validated: 1 +EndChar + +StartChar: aacute +Encoding: 183 225 105 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 29 + 0 + 46 + 16 + 46 + 2 + 143 + 46 + 159 + 46 + 175 + 46 + 191 + 46 + 4 + 16 + 49 + 63 + 49 + 159 + 46 + 175 + 46 + 191 + 46 + 192 + 49 + 240 + 49 + 7 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 122 -75 2 +Validated: 1 +EndChar + +StartChar: agrave +Encoding: 182 224 106 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 0 + 46 + 16 + 46 + 2 + 47 + 46 + 63 + 46 + 2 + 16 + 49 + 63 + 49 + 192 + 49 + 240 + 49 + 4 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 75 -75 2 +Validated: 1 +EndChar + +StartChar: acircumflex +Encoding: 184 226 107 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 0 + 46 + 16 + 46 + 2 + 16 + 52 + 63 + 52 + 192 + 52 + 240 + 52 + 4 + 0 + 48 + 16 + 48 + 2 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 118 -75 2 +Validated: 1 +EndChar + +StartChar: adieresis +Encoding: 186 228 108 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 29 + 16 + 47 + 16 + 59 + 2 + 0 + 47 + 0 + 59 + 2 + 48 + 47 + 48 + 59 + 2 + 16 + 50 + 16 + 62 + 2 + 16 + 69 + 63 + 69 + 192 + 69 + 240 + 69 + 4 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 110 -73 2 +Validated: 1 +EndChar + +StartChar: atilde +Encoding: 185 227 109 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 21 + 0 + 47 + 16 + 47 + 2 + 0 + 57 + 16 + 57 + 47 + 57 + 3 + 16 + 71 + 63 + 71 + 192 + 71 + 240 + 71 + 4 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 120 -90 2 +Validated: 1 +EndChar + +StartChar: aring +Encoding: 187 229 110 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 61 + 0 + 47 + 0 + 66 + 16 + 47 + 16 + 66 + 4 + 16 + 50 + 16 + 62 + 95 + 50 + 95 + 62 + 4 + 223 + 50 + 223 + 62 + 2 + 0 + 50 + 0 + 62 + 16 + 50 + 16 + 62 + 159 + 50 + 159 + 62 + 175 + 50 + 175 + 62 + 191 + 50 + 191 + 62 + 207 + 50 + 207 + 62 + 239 + 50 + 239 + 62 + 14 + 16 + 69 + 63 + 69 + 192 + 69 + 240 + 69 + 4 +DELTAP1 +DELTAP1 +DELTAP2 +DELTAP3 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 221 730 N 1 0 0 1 122 -82 2 +Validated: 1 +EndChar + +StartChar: ccedilla +Encoding: 189 231 111 +Width: 1124 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 0 + 46 + 16 + 46 + 215 + 4 + 3 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 70 99 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 141 10 2 +Validated: 5 +EndChar + +StartChar: eacute +Encoding: 191 233 112 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 33 + 16 + 33 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 134 -75 2 +Validated: 1 +EndChar + +StartChar: egrave +Encoding: 190 232 113 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 32 + 16 + 32 + 2 + 48 + 33 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 89 -75 2 +Validated: 1 +EndChar + +StartChar: ecircumflex +Encoding: 192 234 114 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 33 + 16 + 35 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 132 -75 2 +Validated: 1 +EndChar + +StartChar: edieresis +Encoding: 193 235 115 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 0 + 35 + 0 + 47 + 16 + 35 + 16 + 47 + 4 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 140 -88 2 +Validated: 1 +EndChar + +StartChar: iacute +Encoding: 195 237 116 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 6 + 16 + 6 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 -112 -75 2 +Validated: 1 +EndChar + +StartChar: igrave +Encoding: 194 236 117 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 5 + 16 + 5 + 2 + 48 + 6 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 -243 -75 2 +Validated: 1 +EndChar + +StartChar: icircumflex +Encoding: 196 238 118 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 5 + 16 + 5 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 -201 -75 2 +Validated: 1 +EndChar + +StartChar: idieresis +Encoding: 197 239 119 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 0 + 7 + 0 + 19 + 16 + 7 + 16 + 19 + 4 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 -207 -88 2 +Validated: 1 +EndChar + +StartChar: ntilde +Encoding: 199 241 120 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 22 + 16 + 22 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 133 -88 2 +Validated: 1 +EndChar + +StartChar: oacute +Encoding: 201 243 121 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 30 + 16 + 30 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 200 -75 2 +Validated: 1 +EndChar + +StartChar: ograve +Encoding: 200 242 122 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 30 + 16 + 30 + 2 + 48 + 30 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 121 -75 2 +Validated: 1 +EndChar + +StartChar: ocircumflex +Encoding: 202 244 123 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 32 + 16 + 32 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 182 -75 2 +Validated: 1 +EndChar + +StartChar: odieresis +Encoding: 204 246 124 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 0 + 31 + 0 + 43 + 16 + 31 + 16 + 43 + 4 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 171 -89 2 +Validated: 1 +EndChar + +StartChar: otilde +Encoding: 203 245 125 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 31 + 16 + 31 + 2 + 48 + 41 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 163 -89 2 +Validated: 1 +EndChar + +StartChar: uacute +Encoding: 208 250 126 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 22 + 16 + 22 + 2 + 96 + 25 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 174 -75 2 +Validated: 1 +EndChar + +StartChar: ugrave +Encoding: 207 249 127 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 0 + 21 + 16 + 21 + 2 + 48 + 22 + 96 + 25 + 2 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 91 -75 2 +Validated: 1 +EndChar + +StartChar: ucircumflex +Encoding: 209 251 128 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 23 + 16 + 23 + 2 + 96 + 28 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 133 -75 2 +Validated: 1 +EndChar + +StartChar: udieresis +Encoding: 210 252 129 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 0 + 23 + 0 + 35 + 16 + 23 + 16 + 35 + 4 + 96 + 45 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 131 -88 2 +Validated: 1 +EndChar + +StartChar: dagger +Encoding: 356 8224 130 +Width: 1049 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 1 + 5 + 73 + 10 + 6 + 12 + 3 + 18 + 8 + 16 + 48 + 13 + 1 + 2 + 64 + 1 + 48 + 0 + 1 + 0 + 101 + 9 + 22 + 3 + 64 + 4 + 63 + 5 + 1 + 5 + 101 + 8 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1034 952 m 1,0,-1 + 676 952 l 1,1,-1 + 635 -342 l 1,2,-1 + 395 -342 l 1,3,-1 + 354 952 l 1,4,-1 + 14 952 l 1,5,-1 + 14 1149 l 1,6,-1 + 354 1149 l 1,7,-1 + 354 1509 l 1,8,-1 + 676 1509 l 1,9,-1 + 676 1149 l 1,10,-1 + 1034 1149 l 1,11,-1 + 1034 952 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: degree +Encoding: 134 176 131 +Width: 823 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 32 + 5 + 1 + 9 + 5 + 9 + 7 + 5 + 11 + 4 + 3 + 73 + 21 + 15 + 73 + 9 + 15 + 0 + 73 + 12 + 18 + 73 + 63 + 6 + 143 + 6 + 160 + 6 + 176 + 6 + 4 + 6 + 24 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +793 1163 m 0,0,1 + 793 1012 793 1012 684 903.5 c 128,-1,2 + 575 795 575 795 424 795 c 0,3,4 + 272 795 272 795 163.5 903.5 c 128,-1,5 + 55 1012 55 1012 55 1163 c 0,6,7 + 55 1315 55 1315 163.5 1423.5 c 128,-1,8 + 272 1532 272 1532 424 1532 c 0,9,10 + 575 1532 575 1532 684 1423.5 c 128,-1,11 + 793 1315 793 1315 793 1163 c 0,0,1 +584 1163 m 0,12,13 + 584 1231 584 1231 538 1277 c 128,-1,14 + 492 1323 492 1323 424 1323 c 256,15,16 + 356 1323 356 1323 310 1277 c 128,-1,17 + 264 1231 264 1231 264 1163 c 0,18,19 + 264 1096 264 1096 310 1050 c 128,-1,20 + 356 1004 356 1004 424 1004 c 256,21,22 + 492 1004 492 1004 538 1050 c 128,-1,23 + 584 1096 584 1096 584 1163 c 0,12,13 +EndSplineSet +Validated: 1 +EndChar + +StartChar: cent +Encoding: 120 162 132 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 22 + 51 + 25 + 34 + 21 + 51 + 16 + 18 + 15 + 35 + 51 + 32 + 35 + 0 + 51 + 3 + 5 + 6 + 3 + 18 + 3 + 32 + 15 + 6 + 6 + 0 + 9 + 22 + 0 + 39 + 29 + 55 + 29 + 2 + 29 + 23 + 8 + 36 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +MDAP[rnd] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1038 43 m 1,0,1 + 1028 31 1028 31 975 18.5 c 128,-1,2 + 922 6 922 6 850 2 c 1,3,-1 + 850 -143 l 1,4,-1 + 680 -143 l 1,5,-1 + 680 0 l 1,6,7 + 428 16 428 16 284.5 173 c 128,-1,8 + 141 330 141 330 141 616 c 0,9,10 + 141 627 141 627 141 639 c 128,-1,11 + 141 651 141 651 141 666 c 0,12,13 + 141 922 141 922 293.5 1067 c 128,-1,14 + 446 1212 446 1212 680 1229 c 1,15,-1 + 680 1389 l 1,16,-1 + 850 1389 l 1,17,-1 + 850 1227 l 1,18,19 + 915 1221 915 1221 962.5 1208.5 c 128,-1,20 + 1010 1196 1010 1196 1036 1184 c 1,21,-1 + 1036 969 l 1,22,23 + 993 987 993 987 932.5 1003.5 c 128,-1,24 + 872 1020 872 1020 788 1020 c 0,25,26 + 641 1020 641 1020 557 924.5 c 128,-1,27 + 473 829 473 829 473 651 c 2,28,-1 + 473 631 l 2,29,30 + 473 444 473 444 540.5 336.5 c 128,-1,31 + 608 229 608 229 754 229 c 0,32,33 + 848 229 848 229 922.5 239.5 c 128,-1,34 + 997 250 997 250 1038 262 c 1,35,-1 + 1038 43 l 1,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: sterling +Encoding: 121 163 133 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 23 + 2 + 73 + 20 + 5 + 5 + 1 + 9 + 192 + 13 + 1 + 13 + 16 + 35 + 12 + 9 + 15 + 24 + 34 + 1 + 4 + 48 + 13 + 1 + 13 + 22 + 0 + 1 + 20 + 24 + 20 + 3 + 5 + 143 + 1 + 1 + 1 + 26 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +IP +MDRP[rnd,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1128 0 m 1,0,-1 + 170 0 l 1,1,-1 + 170 631 l 1,2,-1 + 23 631 l 1,3,-1 + 23 831 l 1,4,-1 + 170 831 l 1,5,-1 + 170 1020 l 2,6,7 + 170 1241 170 1241 332 1385.5 c 128,-1,8 + 494 1530 494 1530 723 1530 c 0,9,10 + 850 1530 850 1530 917.5 1517.5 c 128,-1,11 + 985 1505 985 1505 1073 1481 c 1,12,-1 + 1073 1253 l 1,13,14 + 985 1280 985 1280 918.5 1290 c 128,-1,15 + 852 1300 852 1300 776 1300 c 0,16,17 + 635 1300 635 1300 572.5 1231.5 c 128,-1,18 + 510 1163 510 1163 510 993 c 2,19,-1 + 510 831 l 1,20,-1 + 801 831 l 1,21,-1 + 801 631 l 1,22,-1 + 510 631 l 1,23,-1 + 510 225 l 1,24,-1 + 1128 225 l 1,25,-1 + 1128 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: section +Encoding: 125 167 134 +Width: 907 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 99 + 5 + 7 + 9 + 32 + 20 + 7 + 26 + 32 + 37 + 7 + 41 + 32 + 70 + 3 + 70 + 46 + 86 + 3 + 85 + 21 + 87 + 48 + 100 + 4 + 105 + 24 + 117 + 3 + 121 + 28 + 15 + 53 + 28 + 59 + 3 + 28 + 3 + 28 + 9 + 34 + 38 + 70 + 41 + 46 + 127 + 37 + 1 + 37 + 34 + 15 + 13 + 71 + 16 + 46 + 12 + 9 + 5 + 22 + 19 + 25 + 166 + 3 + 1 + 3 + 59 + 6 + 56 + 53 + 28 + 50 + 31 + 53 + 47 + 167 + 47 + 215 + 47 + 3 + 47 + 0 + 44 + 38 + 71 + 0 + 6 + 42 + 19 + 0 + 42 + 50 + 25 + 44 + 26 + 31 + 56 + 97 + 13 + 25 + 62 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +IP +DELTAP1 +SRP1 +SRP2 +IP +IP +SRP1 +SRP1 +IP +IP +DELTAP1 +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +MIAP[rnd] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rp0,rnd,grey] +RTG +SRP1 +SRP2 +IP +IP +RTDG +MDAP[rnd] +MDAP[rnd] +RTG +MDRP[grey] +SRP0 +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +838 772 m 0,0,1 + 838 684 838 684 806 617.5 c 128,-1,2 + 774 551 774 551 715 508 c 1,3,4 + 756 483 756 483 790.5 431 c 128,-1,5 + 825 379 825 379 825 289 c 0,6,7 + 825 143 825 143 706.5 59 c 128,-1,8 + 588 -25 588 -25 399 -25 c 0,9,10 + 297 -25 297 -25 203 -2.5 c 128,-1,11 + 109 20 109 20 72 37 c 1,12,-1 + 72 240 l 1,13,14 + 115 219 115 219 200 190.5 c 128,-1,15 + 285 162 285 162 360 162 c 0,16,17 + 465 162 465 162 515 199 c 128,-1,18 + 565 236 565 236 565 289 c 0,19,20 + 565 330 565 330 530.5 371 c 128,-1,21 + 496 412 496 412 356 475 c 0,22,23 + 250 524 250 524 171 586.5 c 128,-1,24 + 92 649 92 649 92 776 c 0,25,26 + 92 840 92 840 127 903.5 c 128,-1,27 + 162 967 162 967 207 1001 c 1,28,29 + 147 1032 147 1032 117.5 1086.5 c 128,-1,30 + 88 1141 88 1141 88 1214 c 0,31,32 + 88 1343 88 1343 184.5 1436.5 c 128,-1,33 + 281 1530 281 1530 467 1530 c 0,34,35 + 571 1530 571 1530 653 1507.5 c 128,-1,36 + 735 1485 735 1485 770 1466 c 1,37,-1 + 770 1253 l 1,38,39 + 721 1286 721 1286 639 1314.5 c 128,-1,40 + 557 1343 557 1343 469 1343 c 0,41,42 + 391 1343 391 1343 355 1316.5 c 128,-1,43 + 319 1290 319 1290 319 1241 c 0,44,45 + 319 1171 319 1171 388 1134.5 c 128,-1,46 + 457 1098 457 1098 541 1063 c 0,47,48 + 700 997 700 997 769 921.5 c 128,-1,49 + 838 846 838 846 838 772 c 0,0,1 +588 725 m 0,50,51 + 588 758 588 758 542 803 c 128,-1,52 + 496 848 496 848 369 905 c 1,53,54 + 344 891 344 891 328.5 859 c 128,-1,55 + 313 827 313 827 313 807 c 0,56,57 + 313 735 313 735 370.5 703.5 c 128,-1,58 + 428 672 428 672 547 616 c 1,59,60 + 567 633 567 633 577.5 664.5 c 128,-1,61 + 588 696 588 696 588 725 c 0,50,51 +EndSplineSet +Validated: 1 +EndChar + +StartChar: bullet +Encoding: 358 8226 135 +Width: 1195 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 3 + 9 + 0 + 6 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +171 768 m 0,0,1 + 171 944 171 944 297.5 1069.5 c 128,-1,2 + 424 1195 424 1195 598 1195 c 256,3,4 + 772 1195 772 1195 898 1069 c 128,-1,5 + 1024 943 1024 943 1024 768 c 0,6,7 + 1024 595 1024 595 899.5 468 c 128,-1,8 + 775 341 775 341 598 341 c 256,9,10 + 421 341 421 341 296 467.5 c 128,-1,11 + 171 594 171 594 171 768 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: paragraph +Encoding: 140 182 136 +Width: 1192 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 54 + 8 + 7 + 24 + 7 + 105 + 8 + 121 + 8 + 4 + 15 + 35 + 6 + 6 + 5 + 13 + 16 + 3 + 34 + 13 + 10 + 1 + 5 + 0 + 0 + 115 + 111 + 1 + 127 + 1 + 2 + 1 + 4 + 34 + 15 + 224 + 5 + 1 + 5 + 63 + 19 + 78 + 19 + 86 + 19 + 3 + 19 + 42 + 79 + 9 + 95 + 9 + 2 + 9 + 22 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1071 0 m 1,0,-1 + 874 0 l 1,1,-1 + 874 1284 l 1,2,-1 + 774 1284 l 1,3,-1 + 774 0 l 1,4,-1 + 559 0 l 1,5,-1 + 559 616 l 1,6,7 + 328 616 328 616 190.5 715.5 c 128,-1,8 + 53 815 53 815 53 1034 c 2,9,-1 + 53 1085 l 2,10,11 + 53 1274 53 1274 192.5 1391.5 c 128,-1,12 + 332 1509 332 1509 584 1509 c 2,13,-1 + 1071 1509 l 1,14,-1 + 1071 0 l 1,0,-1 +553 852 m 1,15,-1 + 553 1280 l 1,16,17 + 442 1280 442 1280 375.5 1223.5 c 128,-1,18 + 309 1167 309 1167 309 1071 c 0,19,20 + 309 971 309 971 366.5 911.5 c 128,-1,21 + 424 852 424 852 553 852 c 1,15,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: germandbls +Encoding: 181 223 137 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 130 + 9 + 29 + 3 + 33 + 23 + 1 + 20 + 33 + 36 + 33 + 54 + 33 + 89 + 14 + 90 + 39 + 121 + 14 + 169 + 14 + 213 + 11 + 213 + 41 + 215 + 42 + 232 + 18 + 232 + 36 + 248 + 13 + 246 + 14 + 17 + 22 + 41 + 137 + 14 + 2 + 40 + 37 + 0 + 34 + 13 + 16 + 10 + 19 + 19 + 34 + 10 + 0 + 4 + 3 + 31 + 7 + 47 + 6 + 3 + 3 + 27 + 2 + 22 + 47 + 31 + 10 + 16 + 40 + 133 + 40 + 182 + 40 + 3 + 40 + 0 + 37 + 123 + 13 + 1 + 13 + 10 + 16 + 16 + 6 + 32 + 6 + 2 + 6 + 6 + 0 + 16 + 32 + 37 + 48 + 37 + 64 + 37 + 3 + 37 + 49 + 14 + 16 + 1 + 16 + 16 + 34 + 26 + 19 + 49 + 47 + 34 + 1 + 34 + 34 + 0 + 27 + 10 + 23 + 6 + 0 + 32 + 0 + 224 + 0 + 3 + 0 + 26 + 22 + 27 + 43 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +SRP1 +SRP2 +IP +DELTAP1 +SRP1 +SRP2 +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +IP +SRP1 +SRP2 +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1327 326 m 0,0,1 + 1327 147 1327 147 1220.5 62 c 128,-1,2 + 1114 -23 1114 -23 895 -23 c 0,3,4 + 879 -23 879 -23 839 -20.5 c 128,-1,5 + 799 -18 799 -18 799 -18 c 1,6,-1 + 799 199 l 1,7,8 + 924 199 924 199 959.5 226.5 c 128,-1,9 + 995 254 995 254 995 313 c 0,10,11 + 995 383 995 383 930.5 437.5 c 128,-1,12 + 866 492 866 492 809 528 c 0,13,14 + 672 614 672 614 623.5 686 c 128,-1,15 + 575 758 575 758 575 887 c 0,16,17 + 575 975 575 975 645 1060 c 128,-1,18 + 715 1145 715 1145 715 1198 c 0,19,20 + 715 1241 715 1241 690.5 1266.5 c 128,-1,21 + 666 1292 666 1292 608 1292 c 0,22,23 + 551 1292 551 1292 510 1250 c 128,-1,24 + 469 1208 469 1208 469 1130 c 2,25,-1 + 469 0 l 1,26,-1 + 150 0 l 1,27,-1 + 150 1102 l 2,28,29 + 150 1264 150 1264 272.5 1386.5 c 128,-1,30 + 395 1509 395 1509 592 1509 c 0,31,32 + 813 1509 813 1509 911.5 1435.5 c 128,-1,33 + 1010 1362 1010 1362 1010 1225 c 0,34,35 + 1010 1126 1010 1126 933 1056.5 c 128,-1,36 + 856 987 856 987 856 938 c 0,37,38 + 856 881 856 881 891 839 c 128,-1,39 + 926 797 926 797 1059 709 c 0,40,41 + 1182 627 1182 627 1254.5 533.5 c 128,-1,42 + 1327 440 1327 440 1327 326 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: registered +Encoding: 132 174 138 +Width: 1524 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 4 + 16 + 4 + 20 + 50 + 46 + 94 + 14 + 82 + 16 + 82 + 20 + 94 + 22 + 101 + 46 + 117 + 46 + 148 + 46 + 10 + 53 + 34 + 69 + 69 + 40 + 41 + 68 + 212 + 41 + 25 + 40 + 40 + 41 + 3 + 9 + 21 + 75 + 3 + 74 + 15 + 75 + 15 + 9 + 1 + 9 + 24 + 114 + 25 + 50 + 114 + 53 + 63 + 59 + 1 + 59 + 40 + 69 + 37 + 114 + 48 + 40 + 1 + 40 + 40 + 0 + 6 + 12 + 76 + 0 + 74 + 18 + 76 + 6 + 75 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rnd,grey] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,min,rnd,black] +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1425 690 m 0,0,1 + 1425 414 1425 414 1230.5 220.5 c 128,-1,2 + 1036 27 1036 27 762 27 c 0,3,4 + 487 27 487 27 292.5 220.5 c 128,-1,5 + 98 414 98 414 98 690 c 0,6,7 + 98 967 98 967 292.5 1162.5 c 128,-1,8 + 487 1358 487 1358 762 1358 c 0,9,10 + 1036 1358 1036 1358 1230.5 1162.5 c 128,-1,11 + 1425 967 1425 967 1425 690 c 0,0,1 +1268 690 m 256,12,13 + 1268 899 1268 899 1119.5 1056.5 c 128,-1,14 + 971 1214 971 1214 762 1214 c 256,15,16 + 553 1214 553 1214 405.5 1056.5 c 128,-1,17 + 258 899 258 899 258 690 c 256,18,19 + 258 481 258 481 405.5 323.5 c 128,-1,20 + 553 166 553 166 762 166 c 256,21,22 + 971 166 971 166 1119.5 323.5 c 128,-1,23 + 1268 481 1268 481 1268 690 c 256,12,13 +1036 342 m 1,24,-1 + 846 342 l 1,25,26 + 846 342 846 342 846 371.5 c 128,-1,27 + 846 401 846 401 846 469 c 0,28,29 + 846 545 846 545 817 599 c 128,-1,30 + 788 653 788 653 739 653 c 0,31,32 + 727 653 727 653 708.5 653 c 128,-1,33 + 690 653 690 653 690 653 c 257,34,35 + 690 653 690 653 690 559 c 128,-1,36 + 690 465 690 465 690 342 c 1,37,38 + 655 342 655 342 606 342 c 128,-1,39 + 557 342 557 342 520 342 c 1,40,-1 + 520 1053 l 1,41,42 + 520 1053 520 1053 629.5 1053 c 128,-1,43 + 739 1053 739 1053 797 1053 c 0,44,45 + 909 1053 909 1053 964.5 1010 c 128,-1,46 + 1020 967 1020 967 1020 899 c 0,47,48 + 1020 891 1020 891 1020 867.5 c 128,-1,49 + 1020 844 1020 844 1020 838 c 0,50,51 + 1020 780 1020 780 988 742.5 c 128,-1,52 + 956 705 956 705 907 694 c 1,53,54 + 981 655 981 655 1008.5 587.5 c 128,-1,55 + 1036 520 1036 520 1036 459 c 0,56,57 + 1036 442 1036 442 1036 342 c 1,58,-1 + 1036 342 l 1,24,-1 +862 831 m 0,59,60 + 862 838 862 838 862 844 c 128,-1,61 + 862 850 862 850 862 858 c 0,62,63 + 862 891 862 891 842.5 914.5 c 128,-1,64 + 823 938 823 938 793 938 c 0,65,66 + 784 938 784 938 745.5 938 c 128,-1,67 + 707 938 707 938 690 938 c 1,68,-1 + 690 748 l 1,69,70 + 690 748 690 748 728 748 c 128,-1,71 + 766 748 766 748 793 748 c 0,72,73 + 829 748 829 748 845.5 768 c 128,-1,74 + 862 788 862 788 862 831 c 0,59,60 +EndSplineSet +Validated: 5 +EndChar + +StartChar: copyright +Encoding: 127 169 139 +Width: 1524 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 84 + 4 + 16 + 4 + 20 + 58 + 28 + 94 + 14 + 82 + 16 + 82 + 20 + 94 + 22 + 187 + 28 + 186 + 29 + 202 + 28 + 217 + 29 + 233 + 29 + 12 + 51 + 48 + 212 + 24 + 27 + 48 + 38 + 1 + 38 + 41 + 212 + 48 + 37 + 1 + 37 + 34 + 27 + 34 + 3 + 9 + 21 + 75 + 3 + 74 + 15 + 75 + 15 + 9 + 1 + 9 + 61 + 38 + 1 + 38 + 15 + 24 + 1 + 24 + 44 + 113 + 9 + 30 + 25 + 30 + 41 + 30 + 3 + 30 + 30 + 0 + 6 + 12 + 76 + 0 + 74 + 18 + 76 + 6 + 52 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1425 690 m 0,0,1 + 1425 414 1425 414 1230.5 220.5 c 128,-1,2 + 1036 27 1036 27 762 27 c 0,3,4 + 487 27 487 27 292.5 220.5 c 128,-1,5 + 98 414 98 414 98 690 c 0,6,7 + 98 967 98 967 292.5 1162.5 c 128,-1,8 + 487 1358 487 1358 762 1358 c 0,9,10 + 1036 1358 1036 1358 1230.5 1162.5 c 128,-1,11 + 1425 967 1425 967 1425 690 c 0,0,1 +1268 690 m 256,12,13 + 1268 899 1268 899 1119.5 1056.5 c 128,-1,14 + 971 1214 971 1214 762 1214 c 256,15,16 + 553 1214 553 1214 405.5 1056.5 c 128,-1,17 + 258 899 258 899 258 690 c 256,18,19 + 258 481 258 481 405.5 323.5 c 128,-1,20 + 553 166 553 166 762 166 c 256,21,22 + 971 166 971 166 1119.5 323.5 c 128,-1,23 + 1268 481 1268 481 1268 690 c 256,12,13 +1010 379 m 1,24,25 + 979 360 979 360 920.5 344 c 128,-1,26 + 862 328 862 328 797 328 c 0,27,28 + 627 328 627 328 535.5 404.5 c 128,-1,29 + 444 481 444 481 444 657 c 2,30,-1 + 444 692 l 2,31,32 + 444 850 444 850 543.5 938 c 128,-1,33 + 643 1026 643 1026 801 1026 c 0,34,35 + 881 1026 881 1026 931 1009.5 c 128,-1,36 + 981 993 981 993 1010 977 c 1,37,-1 + 1010 850 l 1,38,39 + 981 870 981 870 931 886.5 c 128,-1,40 + 881 903 881 903 831 903 c 0,41,42 + 743 903 743 903 698 854 c 128,-1,43 + 653 805 653 805 653 682 c 2,44,-1 + 653 668 l 2,45,46 + 653 541 653 541 693 502 c 128,-1,47 + 733 463 733 463 821 463 c 0,48,49 + 883 463 883 463 933 479.5 c 128,-1,50 + 983 496 983 496 1010 514 c 1,51,-1 + 1010 379 l 1,24,25 +EndSplineSet +Validated: 1 +EndChar + +StartChar: trademark +Encoding: 369 8482 140 +Width: 1442 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 69 + 169 + 5 + 185 + 5 + 200 + 5 + 217 + 5 + 4 + 63 + 2 + 63 + 5 + 2 + 5 + 10 + 2 + 3 + 9 + 3 + 51 + 4 + 1 + 4 + 4 + 7 + 9 + 1 + 7 + 16 + 19 + 14 + 17 + 11 + 9 + 19 + 10 + 3 + 4 + 4 + 3 + 10 + 3 + 2 + 5 + 11 + 0 + 63 + 2 + 144 + 2 + 2 + 2 + 7 + 9 + 5 + 48 + 7 + 1 + 7 + 16 + 13 + 15 + 18 + 47 + 16 + 1 + 16 + 21 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[min,rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[grey] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +MDRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1399 885 m 1,0,-1 + 1225 885 l 1,1,-1 + 1225 1208 l 1,2,-1 + 1032 1016 l 1,3,-1 + 985 1016 l 1,4,-1 + 795 1206 l 1,5,-1 + 795 885 l 1,6,-1 + 659 885 l 1,7,-1 + 659 1493 l 1,8,-1 + 756 1493 l 1,9,-1 + 1047 1202 l 1,10,-1 + 1335 1493 l 1,11,-1 + 1399 1493 l 1,12,-1 + 1399 885 l 1,0,-1 +578 1372 m 1,13,-1 + 379 1372 l 1,14,-1 + 379 885 l 1,15,-1 + 223 885 l 1,16,-1 + 223 1372 l 1,17,-1 + 25 1372 l 1,18,-1 + 25 1493 l 1,19,-1 + 578 1493 l 1,20,-1 + 578 1372 l 1,13,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: acute +Encoding: 138 180 141 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 3 + 91 + 1 + 36 + 3 + 1 + 0 + 2 + 0 + 47 + 2 + 63 + 2 + 2 + 2 + 4 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +791 1677 m 1,0,-1 + 463 1323 l 1,1,-1 + 246 1323 l 1,2,-1 + 496 1677 l 1,3,-1 + 791 1677 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: dieresis +Encoding: 126 168 142 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 9 + 21 + 96 + 3 + 63 + 15 + 1 + 15 + 39 + 48 + 0 + 1 + 0 + 96 + 6 + 48 + 12 + 1 + 12 + 96 + 47 + 18 + 1 + 18 + 24 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +883 1479 m 0,0,1 + 883 1421 883 1421 843 1380 c 128,-1,2 + 803 1339 803 1339 745 1339 c 0,3,4 + 690 1339 690 1339 650 1380 c 128,-1,5 + 610 1421 610 1421 610 1479 c 0,6,7 + 610 1534 610 1534 650 1575 c 128,-1,8 + 690 1616 690 1616 745 1616 c 0,9,10 + 803 1616 803 1616 843 1575 c 128,-1,11 + 883 1534 883 1534 883 1479 c 0,0,1 +424 1479 m 0,12,13 + 424 1421 424 1421 384 1380 c 128,-1,14 + 344 1339 344 1339 287 1339 c 0,15,16 + 231 1339 231 1339 191.5 1380 c 128,-1,17 + 152 1421 152 1421 152 1479 c 0,18,19 + 152 1534 152 1534 191.5 1575 c 128,-1,20 + 231 1616 231 1616 287 1616 c 0,21,22 + 344 1616 344 1616 384 1575 c 128,-1,23 + 424 1534 424 1534 424 1479 c 0,12,13 +EndSplineSet +Validated: 1 +EndChar + +StartChar: notequal +Encoding: 397 8800 143 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 89 + 83 + 1 + 89 + 12 + 129 + 2 + 144 + 2 + 150 + 11 + 200 + 4 + 6 + 37 + 18 + 1 + 1 + 18 + 17 + 14 + 4 + 99 + 2 + 115 + 2 + 2 + 13 + 2 + 4 + 7 + 8 + 11 + 4 + 12 + 3 + 13 + 6 + 12 + 22 + 12 + 54 + 12 + 3 + 12 + 2 + 71 + 3 + 1 + 3 + 3 + 12 + 1 + 4 + 69 + 18 + 7 + 11 + 17 + 8 + 69 + 14 + 11 + 4 + 7 + 8 + 11 + 12 + 14 + 17 + 18 + 1 + 2 + 10 + 13 + 3 + 48 + 13 + 1 + 13 + 15 + 0 + 21 + 63 + 3 + 1 + 3 + 9 + 5 + 20 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +DELTAP1 +MDRP[rp0,min,black] +MDAP[rnd] +DELTAP1 +MDRP[rp0,min,black] +SPVTCA[x-axis] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +DELTAP1 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1065 236 m 1,0,-1 + 469 236 l 1,1,-1 + 334 25 l 1,2,-1 + 184 117 l 1,3,-1 + 260 236 l 1,4,-1 + 125 236 l 1,5,-1 + 125 473 l 1,6,-1 + 412 473 l 1,7,-1 + 567 715 l 1,8,-1 + 125 715 l 1,9,-1 + 125 952 l 1,10,-1 + 721 952 l 1,11,-1 + 870 1186 l 1,12,-1 + 1022 1094 l 1,13,-1 + 930 952 l 1,14,-1 + 1065 952 l 1,15,-1 + 1065 715 l 1,16,-1 + 778 715 l 1,17,-1 + 623 473 l 1,18,-1 + 1065 473 l 1,19,-1 + 1065 236 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: AE +Encoding: 156 198 144 +Width: 1786 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 70 + 39 + 18 + 1 + 59 + 17 + 1 + 17 + 42 + 6 + 18 + 3 + 59 + 4 + 1 + 4 + 42 + 54 + 5 + 1 + 5 + 5 + 6 + 6 + 4 + 3 + 18 + 4 + 1 + 5 + 8 + 12 + 0 + 1 + 10 + 14 + 23 + 17 + 1 + 47 + 5 + 1 + 47 + 5 + 239 + 5 + 2 + 5 + 19 + 13 + 30 + 10 + 73 + 3 + 30 + 18 + 18 + 10 + 1 + 6 + 17 + 9 + 30 + 6 + 1 + 14 + 30 + 1 + 4 + 5 + 0 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +SFVTCA[y-axis] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1712 0 m 1,0,-1 + 778 0 l 1,1,-1 + 778 362 l 1,2,-1 + 401 362 l 1,3,-1 + 240 0 l 1,4,-1 + -55 0 l 1,5,-1 + 637 1509 l 1,6,-1 + 1673 1509 l 1,7,-1 + 1673 1284 l 1,8,-1 + 1110 1284 l 1,9,-1 + 1110 879 l 1,10,-1 + 1544 879 l 1,11,-1 + 1544 651 l 1,12,-1 + 1110 651 l 1,13,-1 + 1110 225 l 1,14,-1 + 1712 225 l 1,15,-1 + 1712 0 l 1,0,-1 +778 580 m 1,16,-1 + 778 1223 l 1,17,-1 + 500 580 l 1,18,-1 + 778 580 l 1,16,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Oslash +Encoding: 174 216 145 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 0 + 0 + 22 + 0 + 24 + 3 + 32 + 0 + 40 + 2 + 5 + 63 + 33 + 1 +SVTCA[x-axis] +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 381 -1 N 1 0 0 1 -12 -36 3 +Refer: 50 79 N 1 0 0 1 0 0 2 +Validated: 5 +EndChar + +StartChar: infinity +Encoding: 394 8734 146 +Width: 1544 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 86 + 4 + 1 + 10 + 11 + 10 + 13 + 4 + 23 + 20 + 1 + 27 + 11 + 27 + 13 + 20 + 23 + 36 + 1 + 42 + 11 + 42 + 13 + 36 + 23 + 58 + 31 + 54 + 37 + 71 + 7 + 71 + 17 + 81 + 7 + 93 + 19 + 101 + 29 + 106 + 47 + 118 + 29 + 120 + 47 + 22 + 30 + 18 + 33 + 15 + 6 + 36 + 3 + 39 + 33 + 45 + 32 + 3 + 0 + 9 + 1 + 9 + 27 + 39 + 32 + 21 + 15 + 36 + 30 + 6 + 18 + 18 + 0 + 12 + 24 + 105 + 31 + 0 + 47 + 0 + 2 + 0 + 49 + 42 + 105 + 12 + 48 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +RTDG +MDAP[rnd] +RTG +MDRP[rnd,grey] +MDRP[grey] +MDRP[grey] +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +SRP1 +SRP2 +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1460 682 m 0,0,1 + 1460 512 1460 512 1360 425 c 128,-1,2 + 1260 338 1260 338 1100 338 c 0,3,4 + 987 338 987 338 906 385 c 128,-1,5 + 825 432 825 432 766 512 c 1,6,7 + 707 426 707 426 634 384 c 128,-1,8 + 561 342 561 342 440 342 c 0,9,10 + 281 342 281 342 178.5 428 c 128,-1,11 + 76 514 76 514 76 682 c 256,12,13 + 76 850 76 850 180.5 936 c 128,-1,14 + 285 1022 285 1022 436 1022 c 0,15,16 + 553 1022 553 1022 634 973 c 128,-1,17 + 715 924 715 924 770 842 c 1,18,19 + 827 922 827 922 906 970 c 128,-1,20 + 985 1018 985 1018 1094 1018 c 0,21,22 + 1262 1018 1262 1018 1361 928 c 128,-1,23 + 1460 838 1460 838 1460 682 c 0,0,1 +1274 682 m 0,24,25 + 1274 758 1274 758 1220.5 805 c 128,-1,26 + 1167 852 1167 852 1096 852 c 0,27,28 + 1038 852 1038 852 991 820 c 128,-1,29 + 944 788 944 788 877 684 c 1,30,31 + 934 586 934 586 983 549 c 128,-1,32 + 1032 512 1032 512 1100 512 c 0,33,34 + 1169 512 1169 512 1221.5 560 c 128,-1,35 + 1274 608 1274 608 1274 682 c 0,24,25 +657 676 m 1,36,37 + 606 770 606 770 556 809 c 128,-1,38 + 506 848 506 848 436 848 c 0,39,40 + 369 848 369 848 315.5 799 c 128,-1,41 + 262 750 262 750 262 680 c 0,42,43 + 262 602 262 602 314.5 555 c 128,-1,44 + 367 508 367 508 436 508 c 0,45,46 + 506 508 506 508 557 546 c 128,-1,47 + 608 584 608 584 657 676 c 1,36,37 +EndSplineSet +Validated: 1 +EndChar + +StartChar: plusminus +Encoding: 135 177 147 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 14 + 69 + 48 + 13 + 1 + 13 + 0 + 3 + 106 + 1 + 4 + 68 + 10 + 7 + 106 + 63 + 8 + 1 + 8 + 12 + 12 + 0 + 106 + 10 + 1 + 69 + 4 + 13 + 5 + 106 + 7 + 47 + 4 + 1 + 4 + 4 + 17 + 16 +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[min,rnd,grey] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +995 647 m 1,0,-1 + 707 647 l 1,1,-1 + 707 375 l 1,2,-1 + 481 375 l 1,3,-1 + 481 647 l 1,4,-1 + 195 647 l 1,5,-1 + 195 883 l 1,6,-1 + 481 883 l 1,7,-1 + 481 1155 l 1,8,-1 + 707 1155 l 1,9,-1 + 707 883 l 1,10,-1 + 995 883 l 1,11,-1 + 995 647 l 1,0,-1 +1006 0 m 1,12,-1 + 195 0 l 1,13,-1 + 195 217 l 1,14,-1 + 1006 217 l 1,15,-1 + 1006 0 l 1,12,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: lessequal +Encoding: 398 8804 148 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 65 + 6 + 5 + 50 + 0 + 50 + 3 + 54 + 5 + 118 + 5 + 5 + 60 + 4 + 51 + 6 + 2 + 9 + 69 + 48 + 8 + 1 + 8 + 0 + 4 + 3 + 2 + 6 + 0 + 1 + 14 + 0 + 30 + 0 + 2 + 0 + 1 + 1 + 3 + 17 + 3 + 2 + 3 + 5 + 48 + 1 + 1 + 1 + 92 + 63 + 2 + 1 + 2 + 5 + 0 + 1 + 63 + 7 + 1 + 7 + 4 + 0 + 12 + 9 + 1 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +IP +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +925 311 m 1,0,-1 + 75 657 l 1,1,-1 + 75 866 l 1,2,-1 + 925 1214 l 1,3,-1 + 925 950 l 1,4,-1 + 450 766 l 1,5,-1 + 925 573 l 1,6,-1 + 925 311 l 1,0,-1 +925 0 m 1,7,-1 + 75 0 l 1,8,-1 + 75 221 l 1,9,-1 + 925 221 l 1,10,-1 + 925 0 l 1,7,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: greaterequal +Encoding: 399 8805 149 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 121 + 5 + 1 + 63 + 1 + 63 + 8 + 2 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +Refer: 148 8804 N -1 0 0 1 1024 0 2 +Validated: 25 +EndChar + +StartChar: yen +Encoding: 123 165 150 +Width: 1319 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 108 + 54 + 24 + 71 + 0 + 2 + 100 + 23 + 1 + 23 + 31 + 22 + 23 + 1 + 24 + 31 + 0 + 0 + 1 + 55 + 23 + 88 + 23 + 2 + 23 + 22 + 20 + 22 + 22 + 21 + 21 + 20 + 24 + 22 + 0 + 21 + 23 + 1 + 20 + 16 + 0 + 80 + 0 + 2 + 0 + 9 + 5 + 8 + 4 + 1 + 20 + 21 + 12 + 16 + 13 + 17 + 80 + 20 + 1 + 15 + 20 + 31 + 20 + 144 + 20 + 3 + 20 + 20 + 26 + 25 + 9 + 12 + 89 + 6 + 15 + 15 + 31 + 15 + 32 + 15 + 3 + 15 + 19 + 5 + 16 + 89 + 2 + 19 + 1 + 20 + 0 + 24 + 22 + 53 + 1 + 54 + 20 + 51 + 23 + 3 + 20 + 1 + 23 + 3 + 11 + 21 + 10 + 11 + 0 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SRP2 +SLOOP +IP +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rp0,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[x-axis] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +DELTAP3 +MDRP[min,rnd,grey] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[min,rnd,grey] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1327 1509 m 1,0,-1 + 805 725 l 1,1,-1 + 805 643 l 1,2,-1 + 1126 643 l 1,3,-1 + 1126 471 l 1,4,-1 + 805 471 l 1,5,-1 + 805 373 l 1,6,-1 + 1126 373 l 1,7,-1 + 1126 201 l 1,8,-1 + 805 201 l 1,9,-1 + 805 0 l 1,10,-1 + 506 0 l 1,11,-1 + 506 201 l 1,12,-1 + 184 201 l 1,13,-1 + 184 373 l 1,14,-1 + 506 373 l 1,15,-1 + 506 471 l 1,16,-1 + 184 471 l 1,17,-1 + 184 643 l 1,18,-1 + 506 643 l 1,19,-1 + 506 690 l 1,20,-1 + -4 1509 l 1,21,-1 + 373 1509 l 1,22,-1 + 709 969 l 1,23,-1 + 1057 1509 l 1,24,-1 + 1327 1509 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: mu +Encoding: 139 181 151 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 45 + 6 + 3 + 22 + 3 + 38 + 3 + 3 + 19 + 2 + 96 + 5 + 10 + 18 + 16 + 34 + 1 + 57 + 5 + 72 + 5 + 2 + 5 + 2 + 20 + 11 + 12 + 0 + 22 + 2 + 1 + 64 + 19 + 160 + 19 + 2 + 175 + 19 + 1 + 19 + 10 + 13 + 8 + 22 + 10 + 22 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +SRP0 +SMD +MDRP[rp0,min,grey] +MDRP[min,rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1149 0 m 1,0,-1 + 846 0 l 1,1,-1 + 829 168 l 1,2,3 + 793 86 793 86 725 43 c 128,-1,4 + 657 0 657 0 557 0 c 0,5,6 + 524 0 524 0 497.5 0 c 128,-1,7 + 471 0 471 0 442 8 c 1,8,-1 + 442 -342 l 1,9,-1 + 150 -342 l 1,10,-1 + 150 1151 l 1,11,-1 + 469 1151 l 1,12,-1 + 469 391 l 2,13,14 + 469 281 469 281 510 253 c 128,-1,15 + 551 225 551 225 604 225 c 0,16,17 + 674 225 674 225 738.5 253 c 128,-1,18 + 803 281 803 281 829 336 c 1,19,-1 + 829 1151 l 1,20,-1 + 1149 1151 l 1,21,-1 + 1149 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: partialdiff +Encoding: 386 8706 152 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 38 + 23 + 71 + 5 + 86 + 5 + 104 + 8 + 121 + 8 + 5 + 72 + 31 + 88 + 31 + 2 + 31 + 34 + 12 + 9 + 9 + 3 + 22 + 18 + 40 + 15 + 34 + 19 + 40 + 22 + 15 + 70 + 37 + 86 + 37 + 2 + 37 + 46 + 3 + 5 + 63 + 41 + 1 + 0 + 25 + 12 + 16 + 28 + 32 + 28 + 112 + 28 + 3 + 28 + 18 + 34 + 25 + 6 + 40 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1114 573 m 0,0,1 + 1096 287 1096 287 955.5 131 c 128,-1,2 + 815 -25 815 -25 543 -25 c 0,3,4 + 315 -25 315 -25 189 137 c 128,-1,5 + 63 299 63 299 63 528 c 0,6,7 + 63 778 63 778 186 924.5 c 128,-1,8 + 309 1071 309 1071 543 1071 c 0,9,10 + 621 1071 621 1071 686.5 1033 c 128,-1,11 + 752 995 752 995 788 954 c 1,12,13 + 770 1137 770 1137 686 1231 c 128,-1,14 + 602 1325 602 1325 461 1325 c 0,15,16 + 401 1325 401 1325 348 1312.5 c 128,-1,17 + 295 1300 295 1300 231 1268 c 1,18,-1 + 231 1499 l 1,19,20 + 266 1513 266 1513 323.5 1529.5 c 128,-1,21 + 381 1546 381 1546 461 1546 c 0,22,23 + 764 1546 764 1546 930 1306.5 c 128,-1,24 + 1096 1067 1096 1067 1114 705 c 0,25,26 + 1114 692 1114 692 1115 647 c 128,-1,27 + 1116 602 1116 602 1114 573 c 0,0,1 +780 532 m 0,28,29 + 780 657 780 657 734 756.5 c 128,-1,30 + 688 856 688 856 584 856 c 0,31,32 + 496 856 496 856 446.5 788.5 c 128,-1,33 + 397 721 397 721 397 528 c 0,34,35 + 397 369 397 369 440 266.5 c 128,-1,36 + 483 164 483 164 584 164 c 0,37,38 + 682 164 682 164 731 266.5 c 128,-1,39 + 780 369 780 369 780 532 c 0,28,29 +EndSplineSet +Validated: 33 +EndChar + +StartChar: summation +Encoding: 389 8721 153 +Width: 1276 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 76 + 40 + 3 + 73 + 3 + 87 + 9 + 184 + 3 + 4 + 10 + 2 + 55 + 10 + 2 + 9 + 10 + 9 + 134 + 8 + 1 + 8 + 4 + 4 + 3 + 23 + 9 + 1 + 9 + 8 + 3 + 1 + 3 + 71 + 10 + 84 + 10 + 2 + 10 + 2 + 2 + 3 + 9 + 3 + 10 + 8 + 4 + 8 + 34 + 5 + 14 + 2 + 10 + 68 + 1 + 0 + 9 + 3 + 8 + 10 + 4 + 0 + 2 + 7 + 48 + 0 + 1 + 0 + 54 + 4 + 1 + 4 + 47 + 2 + 1 + 2 + 12 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IP +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IP +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +DELTAP1 +MDRP[grey] +DELTAP1 +SPVTL[orthog] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +SFVTL[parallel] +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1214 0 m 1,0,-1 + 86 0 l 1,1,-1 + 86 199 l 1,2,-1 + 651 770 l 1,3,-1 + 106 1315 l 1,4,-1 + 106 1509 l 1,5,-1 + 1133 1509 l 1,6,-1 + 1133 1284 l 1,7,-1 + 545 1284 l 1,8,-1 + 1042 786 l 1,9,-1 + 516 264 l 1,10,-1 + 1214 264 l 1,11,-1 + 1214 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: product +Encoding: 388 8719 154 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 31 + 1 + 4 + 8 + 34 + 10 + 14 + 3 + 7 + 4 + 0 + 2 + 25 + 32 + 3 + 1 + 3 + 6 + 25 + 176 + 9 + 1 + 9 + 31 + 7 + 79 + 7 + 144 + 7 + 3 + 7 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1335 1284 m 1,0,-1 + 1182 1284 l 1,1,-1 + 1182 0 l 1,2,-1 + 844 0 l 1,3,-1 + 844 1284 l 1,4,-1 + 516 1284 l 1,5,-1 + 516 0 l 1,6,-1 + 178 0 l 1,7,-1 + 178 1284 l 1,8,-1 + 27 1284 l 1,9,-1 + 27 1509 l 1,10,-1 + 1335 1509 l 1,11,-1 + 1335 1284 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: pi +Encoding: 346 960 155 +Width: 1362 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 1 + 4 + 8 + 33 + 10 + 12 + 3 + 7 + 0 + 0 + 2 + 22 + 3 + 6 + 22 + 9 + 31 + 7 + 79 + 7 + 2 + 7 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[min,rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1315 952 m 1,0,-1 + 1163 952 l 1,1,-1 + 1163 0 l 1,2,-1 + 844 0 l 1,3,-1 + 844 952 l 1,4,-1 + 516 952 l 1,5,-1 + 516 0 l 1,6,-1 + 197 0 l 1,7,-1 + 197 952 l 1,8,-1 + 45 952 l 1,9,-1 + 45 1151 l 1,10,-1 + 1315 1151 l 1,11,-1 + 1315 952 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: integral +Encoding: 395 8747 156 +Width: 967 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 32 + 5 + 9 + 9 + 23 + 22 + 9 + 25 + 23 + 4 + 1 + 4 + 52 + 0 + 25 + 15 + 15 + 18 + 52 + 14 + 11 + 19 + 1 + 0 + 8 + 25 + 21 + 15 + 14 + 21 + 21 + 29 + 28 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,min,grey] +MDRP[grey] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,grey] +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +995 1460 m 1,0,-1 + 895 1251 l 1,1,2 + 870 1272 870 1272 837.5 1290.5 c 128,-1,3 + 805 1309 805 1309 758 1309 c 0,4,5 + 700 1309 700 1309 674.5 1269 c 128,-1,6 + 649 1229 649 1229 649 1151 c 2,7,-1 + 649 57 l 2,8,9 + 649 -127 649 -127 534.5 -240.5 c 128,-1,10 + 420 -354 420 -354 254 -354 c 0,11,12 + 137 -354 137 -354 74.5 -335.5 c 128,-1,13 + 12 -317 12 -317 -37 -285 c 1,14,-1 + 57 -86 l 1,15,16 + 82 -106 82 -106 118 -123.5 c 128,-1,17 + 154 -141 154 -141 201 -141 c 0,18,19 + 258 -141 258 -141 283.5 -97 c 128,-1,20 + 309 -53 309 -53 309 25 c 2,21,-1 + 309 1118 l 2,22,23 + 309 1303 309 1303 424 1416.5 c 128,-1,24 + 539 1530 539 1530 705 1530 c 0,25,26 + 821 1530 821 1530 883.5 1511.5 c 128,-1,27 + 946 1493 946 1493 995 1460 c 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: ordfeminine +Encoding: 128 170 157 +Width: 969 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 82 + 11 + 7 + 11 + 10 + 26 + 7 + 26 + 10 + 42 + 7 + 42 + 10 + 36 + 28 + 59 + 7 + 59 + 10 + 52 + 28 + 74 + 7 + 70 + 27 + 173 + 10 + 201 + 10 + 14 + 31 + 110 + 32 + 79 + 38 + 111 + 15 + 12 + 12 + 5 + 26 + 1 + 77 + 45 + 110 + 2 + 5 + 78 + 15 + 22 + 1 + 22 + 69 + 19 + 111 + 15 + 23 + 1 + 23 + 70 + 26 + 11 + 22 + 22 + 0 + 8 + 30 + 0 + 107 + 2 + 15 + 64 + 34 + 128 + 34 + 2 + 34 + 42 + 108 + 31 + 67 + 8 + 48 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +SVTCA[y-axis] +MIAP[rnd] +SROUND +MDRP[rnd,grey] +RTG +DELTAP2 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +DELTAP2 +MIAP[rnd] +MDRP[min,grey] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +881 580 m 1,0,-1 + 618 580 l 1,1,-1 + 616 680 l 1,2,3 + 586 627 586 627 524.5 597 c 128,-1,4 + 463 567 463 567 369 567 c 0,5,6 + 213 567 213 567 134 646 c 128,-1,7 + 55 725 55 725 55 881 c 2,8,-1 + 55 897 l 2,9,10 + 55 1055 55 1055 160.5 1145 c 128,-1,11 + 266 1235 266 1235 446 1235 c 0,12,13 + 502 1235 502 1235 543 1218.5 c 128,-1,14 + 584 1202 584 1202 610 1180 c 1,15,-1 + 610 1260 l 2,16,17 + 610 1309 610 1309 576.5 1332.5 c 128,-1,18 + 543 1356 543 1356 463 1356 c 0,19,20 + 377 1356 377 1356 309.5 1334.5 c 128,-1,21 + 242 1313 242 1313 193 1284 c 1,22,-1 + 193 1468 l 1,23,24 + 256 1493 256 1493 335 1511.5 c 128,-1,25 + 414 1530 414 1530 526 1530 c 0,26,27 + 709 1530 709 1530 795 1455 c 128,-1,28 + 881 1380 881 1380 881 1202 c 2,29,-1 + 881 580 l 1,0,-1 +879 272 m 1,30,-1 + 74 272 l 1,31,-1 + 74 463 l 1,32,-1 + 879 463 l 1,33,-1 + 879 272 l 1,30,-1 +616 895 m 2,34,-1 + 616 913 l 2,35,36 + 616 991 616 991 580.5 1031 c 128,-1,37 + 545 1071 545 1071 473 1071 c 0,38,39 + 410 1071 410 1071 372 1034 c 128,-1,40 + 334 997 334 997 334 913 c 2,41,-1 + 334 893 l 2,42,43 + 334 805 334 805 373 777.5 c 128,-1,44 + 412 750 412 750 475 750 c 0,45,46 + 530 750 530 750 573 784.5 c 128,-1,47 + 616 819 616 819 616 895 c 2,34,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: ordmasculine +Encoding: 144 186 158 +Width: 1102 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 30 + 15 + 110 + 16 + 79 + 22 + 110 + 10 + 15 + 29 + 110 + 3 + 78 + 17 + 67 + 0 + 109 + 48 + 18 + 96 + 18 + 144 + 18 + 3 + 18 + 25 + 109 + 15 + 67 + 6 + 32 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1026 1014 m 2,0,1 + 1026 799 1026 799 902 678 c 128,-1,2 + 778 557 778 557 561 557 c 256,3,4 + 344 557 344 557 217 681 c 128,-1,5 + 90 805 90 805 90 1014 c 2,6,-1 + 90 1075 l 2,7,8 + 90 1280 90 1280 216 1406 c 128,-1,9 + 342 1532 342 1532 559 1532 c 0,10,11 + 778 1532 778 1532 902 1405 c 128,-1,12 + 1026 1278 1026 1278 1026 1075 c 2,13,-1 + 1026 1014 l 2,0,1 +985 272 m 1,14,-1 + 111 272 l 1,15,-1 + 111 463 l 1,16,-1 + 985 463 l 1,17,-1 + 985 272 l 1,14,-1 +739 1038 m 2,18,-1 + 739 1051 l 2,19,20 + 739 1221 739 1221 687 1282 c 128,-1,21 + 635 1343 635 1343 559 1343 c 0,22,23 + 479 1343 479 1343 430 1276.5 c 128,-1,24 + 381 1210 381 1210 381 1051 c 2,25,-1 + 381 1038 l 2,26,27 + 381 862 381 862 429 803.5 c 128,-1,28 + 477 745 477 745 559 745 c 0,29,30 + 633 745 633 745 686 801.5 c 128,-1,31 + 739 858 739 858 739 1038 c 2,18,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Omega +Encoding: 345 937 159 +AltUni2: 002126.ffffffff.0 002126.ffffffff.0 +Width: 1532 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 50 + 15 + 46 + 38 + 34 + 1 + 34 + 15 + 8 + 22 + 3 + 8 + 27 + 24 + 27 + 2 + 27 + 4 + 25 + 30 + 7 + 24 + 0 + 3 + 30 + 8 + 27 + 30 + 22 + 8 + 22 + 11 + 19 + 5 + 0 + 28 + 11 + 19 + 28 + 25 + 15 + 30 + 31 + 30 + 63 + 30 + 79 + 30 + 4 + 30 + 38 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1456 831 m 2,0,1 + 1456 657 1456 657 1359 535.5 c 128,-1,2 + 1262 414 1262 414 1116 354 c 1,3,-1 + 1116 225 l 1,4,-1 + 1444 225 l 1,5,-1 + 1444 0 l 1,6,-1 + 885 0 l 1,7,-1 + 885 453 l 1,8,9 + 1008 494 1008 494 1056 613.5 c 128,-1,10 + 1104 733 1104 733 1104 870 c 2,11,-1 + 1104 911 l 2,12,13 + 1104 1141 1104 1141 1018 1241 c 128,-1,14 + 932 1341 932 1341 766 1341 c 0,15,16 + 604 1341 604 1341 516 1243 c 128,-1,17 + 428 1145 428 1145 428 911 c 2,18,-1 + 428 870 l 2,19,20 + 428 711 428 711 482.5 598 c 128,-1,21 + 537 485 537 485 647 453 c 1,22,-1 + 647 0 l 1,23,-1 + 88 0 l 1,24,-1 + 88 225 l 1,25,-1 + 416 225 l 1,26,-1 + 416 354 l 1,27,28 + 297 391 297 391 186.5 513 c 128,-1,29 + 76 635 76 635 76 850 c 2,30,-1 + 76 946 l 2,31,32 + 76 1186 76 1186 247 1358 c 128,-1,33 + 418 1530 418 1530 774 1530 c 0,34,35 + 1102 1530 1102 1530 1279 1368 c 128,-1,36 + 1456 1206 1456 1206 1456 946 c 2,37,-1 + 1456 831 l 2,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: ae +Encoding: 188 230 160 +Width: 1868 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 122 + 11 + 19 + 11 + 22 + 26 + 19 + 26 + 22 + 48 + 15 + 50 + 70 + 82 + 45 + 100 + 45 + 153 + 46 + 185 + 19 + 10 + 1 + 32 + 56 + 73 + 61 + 32 + 27 + 24 + 56 + 24 + 17 + 38 + 38 + 41 + 54 + 41 + 70 + 41 + 3 + 41 + 53 + 33 + 44 + 38 + 34 + 51 + 255 + 31 + 1 + 31 + 33 + 35 + 51 + 38 + 13 + 64 + 7 + 80 + 7 + 96 + 7 + 3 + 7 + 58 + 14 + 1 + 14 + 4 + 68 + 33 + 96 + 8 + 1 + 8 + 71 + 11 + 17 + 3 + 63 + 72 + 1 + 34 + 34 + 1 + 20 + 8 + 0 + 49 + 64 + 50 + 1 + 16 + 50 + 64 + 50 + 2 + 50 + 57 + 41 + 14 + 1 + 57 + 56 + 1 + 49 + 27 + 80 + 57 + 1 + 57 + 65 + 22 + 32 + 20 + 144 + 20 + 176 + 20 + 3 + 20 + 71 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +SROUND +MDRP[rnd,grey] +RTG +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,grey] +MIRP[min,rnd,black] +MDRP[grey] +DELTAP1 +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1776 514 m 1,0,-1 + 1032 514 l 1,1,2 + 1032 322 1032 322 1115 247 c 128,-1,3 + 1198 172 1198 172 1331 172 c 0,4,5 + 1419 172 1419 172 1510.5 195.5 c 128,-1,6 + 1602 219 1602 219 1698 266 c 1,7,-1 + 1698 74 l 1,8,9 + 1614 25 1614 25 1513.5 0 c 128,-1,10 + 1413 -25 1413 -25 1280 -25 c 0,11,12 + 1130 -25 1130 -25 1022.5 21.5 c 128,-1,13 + 915 68 915 68 829 174 c 1,14,15 + 778 78 778 78 691 32 c 128,-1,16 + 604 -14 604 -14 461 -14 c 0,17,18 + 281 -14 281 -14 172 82 c 128,-1,19 + 63 178 63 178 63 373 c 2,20,-1 + 63 393 l 2,21,22 + 63 586 63 586 188 690.5 c 128,-1,23 + 313 795 313 795 524 795 c 0,24,25 + 588 795 588 795 649.5 775.5 c 128,-1,26 + 711 756 711 756 739 727 c 1,27,-1 + 739 840 l 2,28,29 + 739 899 739 899 688 940 c 128,-1,30 + 637 981 637 981 543 981 c 0,31,32 + 442 981 442 981 363.5 957.5 c 128,-1,33 + 285 934 285 934 225 899 c 1,34,-1 + 225 1096 l 1,35,36 + 301 1128 301 1128 393 1151 c 128,-1,37 + 485 1174 485 1174 618 1174 c 0,38,39 + 729 1174 729 1174 800.5 1149 c 128,-1,40 + 872 1124 872 1124 926 1077 c 1,41,42 + 971 1108 971 1108 1052 1144 c 128,-1,43 + 1133 1180 1133 1180 1264 1180 c 0,44,45 + 1511 1180 1511 1180 1643.5 1025 c 128,-1,46 + 1776 870 1776 870 1776 621 c 2,47,48 + 1776 621 1776 621 1776 573.5 c 128,-1,49 + 1776 526 1776 526 1776 514 c 1,0,-1 +1485 678 m 1,50,51 + 1475 848 1475 848 1418.5 921.5 c 128,-1,52 + 1362 995 1362 995 1264 995 c 0,53,54 + 1178 995 1178 995 1109 922.5 c 128,-1,55 + 1040 850 1040 850 1034 678 c 1,56,-1 + 1485 678 l 1,50,51 +741 385 m 2,57,-1 + 741 416 l 2,58,59 + 741 520 741 520 694 574.5 c 128,-1,60 + 647 629 647 629 557 629 c 0,61,62 + 471 629 471 629 426 577.5 c 128,-1,63 + 381 526 381 526 381 414 c 2,64,-1 + 381 383 l 2,65,66 + 381 266 381 266 429 227 c 128,-1,67 + 477 188 477 188 559 188 c 0,68,69 + 629 188 629 188 685 235.5 c 128,-1,70 + 741 283 741 283 741 385 c 2,57,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: oslash +Encoding: 206 248 161 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 382 -1 N 1 0 0 1 0 0 2 +Refer: 82 111 N 1 0 0 1 0 0 2 +Validated: 5 +EndChar + +StartChar: questiondown +Encoding: 149 191 162 +Width: 918 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 51 + 10 + 9 + 10 + 12 + 26 + 9 + 165 + 25 + 165 + 26 + 230 + 25 + 230 + 26 + 7 + 35 + 69 + 32 + 34 + 4 + 69 + 7 + 15 + 19 + 117 + 1 + 72 + 2 + 10 + 63 + 37 + 1 + 10 + 22 + 127 + 29 + 239 + 29 + 2 + 29 + 3 + 19 + 2 + 65 + 20 + 3 + 63 + 35 + 1 + 35 + 37 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,white] +MIAP[rnd] +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +674 1190 m 1,0,-1 + 360 1190 l 1,1,-1 + 360 1511 l 1,2,-1 + 674 1511 l 1,3,-1 + 674 1190 l 1,0,-1 +899 113 m 1,4,5 + 819 55 819 55 715.5 18.5 c 128,-1,6 + 612 -18 612 -18 455 -18 c 0,7,8 + 215 -18 215 -18 114.5 80 c 128,-1,9 + 14 178 14 178 14 303 c 0,10,11 + 14 410 14 410 59 484.5 c 128,-1,12 + 104 559 104 559 199 623 c 0,13,14 + 287 682 287 682 335 749.5 c 128,-1,15 + 383 817 383 817 383 899 c 0,16,17 + 383 944 383 944 383 995.5 c 128,-1,18 + 383 1047 383 1047 383 1047 c 1,19,-1 + 655 1047 l 1,20,21 + 655 1047 655 1047 655 977 c 128,-1,22 + 655 907 655 907 655 858 c 0,23,24 + 655 768 655 768 607 686 c 128,-1,25 + 559 604 559 604 487 555 c 0,26,27 + 393 489 393 489 363.5 444 c 128,-1,28 + 334 399 334 399 334 338 c 0,29,30 + 334 276 334 276 378 239.5 c 128,-1,31 + 422 203 422 203 537 203 c 0,32,33 + 639 203 639 203 738.5 246 c 128,-1,34 + 838 289 838 289 899 336 c 1,35,-1 + 899 113 l 1,4,5 +EndSplineSet +Validated: 1 +EndChar + +StartChar: exclamdown +Encoding: 119 161 163 +Width: 709 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 32 + 5 + 0 + 6 + 116 + 1 + 66 + 2 + 10 + 63 + 9 + 1 + 7 + 6 + 4 + 5 + 4 + 67 + 3 + 65 + 2 + 67 + 63 + 5 + 79 + 5 + 128 + 5 + 144 + 5 + 4 + 5 + 8 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rnd,black] +SRP1 +SRP2 +IP +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,white] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +522 1190 m 1,0,-1 + 203 1190 l 1,1,-1 + 203 1509 l 1,2,-1 + 522 1509 l 1,3,-1 + 522 1190 l 1,0,-1 +545 0 m 1,4,-1 + 180 0 l 1,5,-1 + 219 995 l 1,6,-1 + 506 995 l 1,7,-1 + 545 0 l 1,4,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: logicalnot +Encoding: 130 172 164 +Width: 1195 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 20 + 2 + 68 + 1 + 4 + 70 + 48 + 5 + 64 + 5 + 2 + 5 + 69 + 16 + 1 + 112 + 1 + 2 + 1 + 3 + 6 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1068 358 m 1,0,-1 + 847 358 l 1,1,-1 + 847 580 l 1,2,-1 + 106 580 l 1,3,-1 + 106 797 l 1,4,-1 + 1068 797 l 1,5,-1 + 1068 358 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: radical +Encoding: 393 8730 165 +Width: 1251 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 65 + 59 + 4 + 1 + 59 + 5 + 1 + 5 + 42 + 4 + 5 + 51 + 1 + 1 + 1 + 57 + 6 + 87 + 6 + 101 + 6 + 3 + 6 + 42 + 0 + 0 + 1 + 48 + 5 + 1 + 5 + 42 + 2 + 53 + 4 + 1 + 4 + 42 + 3 + 3 + 2 + 4 + 4 + 3 + 5 + 3 + 2 + 6 + 10 + 2 + 6 + 0 + 1 + 4 + 2 + 3 + 59 + 0 + 1 + 0 + 5 + 1 + 33 + 2 + 3 + 7 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IP +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +SVTCA[y-axis] +MDAP[rnd] +MIAP[rnd] +SRP2 +SLOOP +IP +MDAP[rnd] +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +DELTAP1 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1350 1509 m 1,0,-1 + 580 -49 l 1,1,-1 + 381 -49 l 1,2,-1 + 41 414 l 1,3,-1 + 287 569 l 1,4,-1 + 475 283 l 1,5,-1 + 1051 1509 l 1,6,-1 + 1350 1509 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: florin +Encoding: 334 402 166 +Width: 946 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 49 + 9 + 32 + 233 + 31 + 248 + 31 + 3 + 8 + 31 + 1 + 11 + 26 + 32 + 8 + 29 + 29 + 15 + 33 + 1 + 4 + 52 + 0 + 33 + 15 + 19 + 22 + 52 + 18 + 15 + 19 + 1 + 0 + 32 + 10 + 48 + 10 + 2 + 10 + 12 + 22 + 25 + 15 + 14 + 27 + 29 + 25 + 25 + 37 + 36 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MDRP[rp0,min,grey] +MDRP[grey] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +MDRP[rp0,min,grey] +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +995 1460 m 1,0,-1 + 895 1251 l 1,1,2 + 874 1270 874 1270 839.5 1289.5 c 128,-1,3 + 805 1309 805 1309 758 1309 c 0,4,5 + 702 1309 702 1309 665.5 1276 c 128,-1,6 + 629 1243 629 1243 629 1151 c 2,7,-1 + 629 903 l 1,8,-1 + 913 903 l 1,9,-1 + 913 727 l 1,10,-1 + 629 727 l 1,11,-1 + 629 57 l 2,12,13 + 629 -127 629 -127 524.5 -240.5 c 128,-1,14 + 420 -354 420 -354 254 -354 c 0,15,16 + 141 -354 141 -354 76.5 -335.5 c 128,-1,17 + 12 -317 12 -317 -37 -285 c 1,18,-1 + 57 -86 l 1,19,20 + 82 -106 82 -106 119 -123.5 c 128,-1,21 + 156 -141 156 -141 201 -141 c 0,22,23 + 258 -141 258 -141 283.5 -97 c 128,-1,24 + 309 -53 309 -53 309 25 c 2,25,-1 + 309 729 l 1,26,-1 + 160 729 l 1,27,-1 + 160 903 l 1,28,-1 + 309 903 l 1,29,-1 + 309 1118 l 2,30,31 + 309 1298 309 1298 426 1414 c 128,-1,32 + 543 1530 543 1530 705 1530 c 0,33,34 + 821 1530 821 1530 885.5 1510.5 c 128,-1,35 + 950 1491 950 1491 995 1460 c 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: approxequal +Encoding: 396 8776 167 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 67 + 24 + 1 + 24 + 9 + 106 + 1 + 106 + 9 + 4 + 8 + 11 + 70 + 9 + 43 + 8 + 14 + 110 + 14 + 126 + 14 + 3 + 14 + 10 + 43 + 15 + 70 + 12 + 13 + 5 + 3 + 70 + 0 + 1 + 43 + 8 + 6 + 110 + 6 + 126 + 6 + 3 + 6 + 2 + 43 + 7 + 70 + 4 + 5 + 5 + 2 + 6 + 1 + 13 + 10 + 14 + 9 + 8 + 8 + 11 + 0 + 48 + 8 + 1 + 8 + 3 + 11 + 16 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +SROUND +MDRP[rnd,grey] +RTG +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SROUND +MDRP[rnd,grey] +RTG +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SROUND +MDRP[rnd,grey] +RTG +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1065 715 m 1,0,-1 + 819 602 l 1,1,-1 + 348 807 l 1,2,-1 + 125 715 l 1,3,-1 + 125 952 l 1,4,-1 + 369 1065 l 1,5,-1 + 840 860 l 1,6,-1 + 1065 952 l 1,7,-1 + 1065 715 l 1,0,-1 +1065 236 m 1,8,-1 + 819 123 l 1,9,-1 + 348 328 l 1,10,-1 + 125 236 l 1,11,-1 + 125 473 l 1,12,-1 + 369 586 l 1,13,-1 + 840 381 l 1,14,-1 + 1065 473 l 1,15,-1 + 1065 236 l 1,8,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Delta +Encoding: 387 8710 168 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 5 + 6 + 4 + 5 + 2 + 3 + 5 + 1 + 0 + 55 + 1 + 1 + 1 + 4 + 6 + 45 + 0 + 1 + 0 + 5 + 3 + 2 + 10 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[x-axis] +MDAP[rnd] +DELTAP1 +MDAP[rnd] +SRP0 +SLOOP +IP +RTHG +MDAP[rnd] +RTG +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1346 0 m 1,0,-1 + -2 0 l 1,1,-1 + 559 1509 l 1,2,-1 + 772 1509 l 1,3,-1 + 1346 0 l 1,0,-1 +891 246 m 1,4,-1 + 618 1008 l 1,5,-1 + 342 246 l 1,6,-1 + 891 246 l 1,4,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: guillemotleft +Encoding: 129 171 169 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 47 + 11 + 4 + 3 + 2 + 13 + 6 + 0 + 1 + 7 + 0 + 1 + 10 + 3 + 12 + 5 + 8 + 48 + 1 + 1 + 1 + 52 + 9 + 2 + 5 + 0 + 1 + 4 + 0 + 95 + 48 + 1 + 1 + 1 + 8 + 12 + 7 + 8 + 11 + 7 + 95 + 63 + 8 + 159 + 8 + 2 + 8 + 14 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[min,rnd,black] +DELTAP1 +SHP[rp2] +IP +IP +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +SRP1 +SRP2 +IP +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1292 123 m 1,0,-1 + 674 496 l 1,1,-1 + 674 709 l 1,2,-1 + 1292 1090 l 1,3,-1 + 1292 815 l 1,4,-1 + 946 602 l 1,5,-1 + 1292 397 l 1,6,-1 + 1292 123 l 1,0,-1 +674 123 m 1,7,-1 + 55 496 l 1,8,-1 + 55 709 l 1,9,-1 + 674 1090 l 1,10,-1 + 674 815 l 1,11,-1 + 328 602 l 1,12,-1 + 674 397 l 1,13,-1 + 674 123 l 1,7,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: guillemotright +Encoding: 145 187 170 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 169 171 N -1 0 0 1 1360 0 2 +Validated: 25 +EndChar + +StartChar: ellipsis +Encoding: 359 8230 171 +Width: 1749 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 24 + 2 + 6 + 10 + 72 + 128 + 1 + 5 + 9 + 0 + 0 + 71 + 1 + 4 + 71 + 5 + 8 + 71 + 223 + 9 + 224 + 9 + 2 + 9 + 12 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +SMD +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1622 0 m 1,0,-1 + 1296 0 l 1,1,-1 + 1296 326 l 1,2,-1 + 1622 326 l 1,3,-1 + 1622 0 l 1,0,-1 +1040 0 m 1,4,-1 + 715 0 l 1,5,-1 + 715 326 l 1,6,-1 + 1040 326 l 1,7,-1 + 1040 0 l 1,4,-1 +459 0 m 1,8,-1 + 133 0 l 1,9,-1 + 133 326 l 1,10,-1 + 459 326 l 1,11,-1 + 459 0 l 1,8,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: nonbreakingspace +Encoding: 118 160 172 +Width: 1365 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Validated: 1 +EndChar + +StartChar: Agrave +Encoding: 150 192 173 +Width: 1358 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 13 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 153 264 2 +Validated: 1 +EndChar + +StartChar: Atilde +Encoding: 153 195 174 +Width: 1358 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 24 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 151 246 2 +Validated: 1 +EndChar + +StartChar: Otilde +Encoding: 171 213 175 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 41 + 1 + 63 + 55 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 217 732 N 1 0 0 1 195 246 2 +Validated: 1 +EndChar + +StartChar: OE +Encoding: 289 338 176 +Width: 1877 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 23 + 30 + 233 + 5 + 228 + 36 + 3 + 23 + 30 + 20 + 73 + 20 + 1 + 16 + 29 + 31 + 13 + 11 + 26 + 19 + 30 + 16 + 10 + 38 + 31 + 4 + 1 + 41 + 24 + 30 + 1 + 0 + 18 + 22 + 63 + 0 + 1 + 0 + 20 + 24 + 23 + 16 + 1 + 26 + 0 + 41 + 80 + 41 + 160 + 41 + 3 + 41 + 35 + 21 + 48 + 7 + 1 + 7 + 44 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1816 0 m 1,0,-1 + 944 0 l 1,1,2 + 895 -16 895 -16 861 -20.5 c 128,-1,3 + 827 -25 827 -25 739 -25 c 0,4,5 + 399 -25 399 -25 234 156.5 c 128,-1,6 + 69 338 69 338 69 702 c 0,7,8 + 69 719 69 719 69 740.5 c 128,-1,9 + 69 762 69 762 69 788 c 0,10,11 + 69 1139 69 1139 248.5 1334.5 c 128,-1,12 + 428 1530 428 1530 739 1530 c 0,13,14 + 819 1530 819 1530 875 1519.5 c 128,-1,15 + 931 1509 931 1509 972 1509 c 2,16,-1 + 1775 1509 l 1,17,-1 + 1775 1284 l 1,18,-1 + 1228 1284 l 1,19,-1 + 1228 879 l 1,20,-1 + 1657 879 l 1,21,-1 + 1657 651 l 1,22,-1 + 1228 651 l 1,23,-1 + 1228 225 l 1,24,-1 + 1816 225 l 1,25,-1 + 1816 0 l 1,0,-1 +899 1296 m 1,26,27 + 860 1305 860 1305 816.5 1310 c 128,-1,28 + 773 1315 773 1315 718 1315 c 0,29,30 + 560 1315 560 1315 485.5 1192 c 128,-1,31 + 411 1069 411 1069 411 768 c 0,32,33 + 411 752 411 752 411 746.5 c 128,-1,34 + 411 741 411 741 411 727 c 0,35,36 + 411 445 411 445 476 316.5 c 128,-1,37 + 541 188 541 188 726 188 c 0,38,39 + 791 188 791 188 829.5 198.5 c 128,-1,40 + 868 209 868 209 897 223 c 1,41,42 + 897 223 897 223 898 747.5 c 128,-1,43 + 899 1272 899 1272 899 1296 c 1,26,27 +EndSplineSet +Validated: 1 +EndChar + +StartChar: oe +Encoding: 290 339 177 +Width: 2042 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 103 + 70 + 18 + 70 + 25 + 73 + 50 + 89 + 13 + 86 + 28 + 86 + 33 + 89 + 50 + 105 + 13 + 101 + 33 + 105 + 50 + 121 + 50 + 150 + 18 + 150 + 25 + 154 + 33 + 14 + 1 + 46 + 127 + 44 + 1 + 44 + 44 + 29 + 14 + 3 + 11 + 32 + 29 + 41 + 51 + 33 + 32 + 26 + 13 + 7 + 70 + 14 + 4 + 60 + 33 + 8 + 70 + 11 + 17 + 3 + 8 + 0 + 49 + 16 + 38 + 64 + 38 + 96 + 38 + 3 + 38 + 45 + 57 + 14 + 57 + 29 + 2 + 14 + 29 + 1 + 45 + 44 + 1 + 49 + 48 + 45 + 1 + 45 + 57 + 23 + 15 + 20 + 96 + 20 + 128 + 20 + 144 + 20 + 4 + 255 + 20 + 1 + 20 + 63 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +SROUND +MDRP[rnd,grey] +RTG +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1946 514 m 1,0,-1 + 1163 514 l 1,1,2 + 1163 322 1163 322 1250 247 c 128,-1,3 + 1337 172 1337 172 1477 172 c 0,4,5 + 1569 172 1569 172 1665 195.5 c 128,-1,6 + 1761 219 1761 219 1864 266 c 1,7,-1 + 1864 74 l 1,8,9 + 1776 25 1776 25 1669.5 0 c 128,-1,10 + 1563 -25 1563 -25 1423 -25 c 0,11,12 + 1313 -25 1313 -25 1203.5 7 c 128,-1,13 + 1094 39 1094 39 1010 129 c 1,14,15 + 950 63 950 63 859 19 c 128,-1,16 + 768 -25 768 -25 647 -25 c 0,17,18 + 410 -25 410 -25 256 128 c 128,-1,19 + 102 281 102 281 102 543 c 0,20,21 + 102 563 102 563 102 584.5 c 128,-1,22 + 102 606 102 606 102 625 c 0,23,24 + 102 874 102 874 259 1027 c 128,-1,25 + 416 1180 416 1180 645 1180 c 0,26,27 + 799 1180 799 1180 886 1145 c 128,-1,28 + 973 1110 973 1110 1024 1044 c 1,29,30 + 1092 1110 1092 1110 1190 1145 c 128,-1,31 + 1288 1180 1288 1180 1405 1180 c 0,32,33 + 1667 1180 1667 1180 1806.5 1025 c 128,-1,34 + 1946 870 1946 870 1946 621 c 2,35,36 + 1946 621 1946 621 1946 573.5 c 128,-1,37 + 1946 526 1946 526 1946 514 c 1,0,-1 +1649 678 m 1,38,39 + 1638 848 1638 848 1573.5 921.5 c 128,-1,40 + 1509 995 1509 995 1405 995 c 0,41,42 + 1315 995 1315 995 1243 922.5 c 128,-1,43 + 1171 850 1171 850 1165 678 c 1,44,-1 + 1649 678 l 1,38,39 +889 559 m 0,45,46 + 889 578 889 578 889 585 c 128,-1,47 + 889 592 889 592 889 608 c 0,48,49 + 889 774 889 774 833.5 881.5 c 128,-1,50 + 778 989 778 989 662 989 c 0,51,52 + 543 989 543 989 488.5 895 c 128,-1,53 + 434 801 434 801 434 608 c 0,54,55 + 434 592 434 592 434 581.5 c 128,-1,56 + 434 571 434 571 434 559 c 0,57,58 + 434 360 434 360 489.5 264 c 128,-1,59 + 545 168 545 168 662 168 c 0,60,61 + 778 168 778 168 833.5 261 c 128,-1,62 + 889 354 889 354 889 559 c 0,45,46 +EndSplineSet +Validated: 1 +EndChar + +StartChar: endash +Encoding: 348 8211 178 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 1 + 68 + 2 + 70 + 48 + 0 + 1 + 0 + 47 + 1 + 63 + 1 + 2 + 1 + 73 + 4 +SRP0 +SROUND +MDRP[rp0,rnd,white] +RTG +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +964 561 m 1,0,-1 + 60 561 l 1,1,-1 + 60 799 l 1,2,-1 + 964 799 l 1,3,-1 + 964 561 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: emdash +Encoding: 349 8212 179 +Width: 1707 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 1 + 68 + 2 + 70 + 48 + 0 + 1 + 0 + 1 + 73 + 4 +SRP0 +SROUND +MDRP[rp0,rnd,white] +RTG +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1627 561 m 1,0,-1 + 80 561 l 1,1,-1 + 80 799 l 1,2,-1 + 1627 799 l 1,3,-1 + 1627 561 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: quotedblleft +Encoding: 353 8220 180 +Width: 1100 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 49 + 11 + 3 + 11 + 14 + 26 + 3 + 26 + 14 + 4 + 11 + 1 + 85 + 20 + 9 + 86 + 5 + 17 + 6 + 75 + 16 + 5 + 11 + 63 + 23 + 1 + 15 + 6 + 31 + 6 + 2 + 6 + 10 + 84 + 9 + 89 + 1 + 12 + 15 + 16 + 31 + 16 + 2 + 16 + 21 + 84 + 20 + 89 + 12 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MIRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +975 854 m 1,0,-1 + 635 854 l 1,1,-1 + 635 1194 l 2,2,3 + 635 1372 635 1372 738.5 1451 c 128,-1,4 + 842 1530 842 1530 975 1530 c 1,5,-1 + 975 1382 l 1,6,7 + 891 1382 891 1382 851 1343.5 c 128,-1,8 + 811 1305 811 1305 811 1194 c 1,9,-1 + 975 1194 l 1,10,-1 + 975 854 l 1,0,-1 +473 854 m 1,11,-1 + 133 854 l 1,12,-1 + 133 1194 l 2,13,14 + 133 1372 133 1372 236.5 1451 c 128,-1,15 + 340 1530 340 1530 473 1530 c 1,16,-1 + 473 1382 l 1,17,18 + 389 1382 389 1382 349 1343.5 c 128,-1,19 + 309 1305 309 1305 309 1194 c 1,20,-1 + 473 1194 l 1,21,-1 + 473 854 l 1,11,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: quotedblright +Encoding: 354 8221 181 +Width: 1100 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 5 + 1 + 5 + 12 + 20 + 1 + 20 + 12 + 4 + 4 + 15 + 75 + 3 + 14 + 86 + 7 + 18 + 85 + 9 + 20 + 10 + 63 + 23 + 1 + 7 + 89 + 10 + 84 + 0 + 4 + 16 + 4 + 2 + 4 + 9 + 20 + 18 + 89 + 21 + 84 + 0 + 15 + 16 + 15 + 2 + 15 + 20 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +979 1169 m 2,0,1 + 979 991 979 991 875.5 912.5 c 128,-1,2 + 772 834 772 834 639 834 c 1,3,-1 + 639 981 l 1,4,5 + 723 981 723 981 763 1020 c 128,-1,6 + 803 1059 803 1059 803 1169 c 1,7,-1 + 639 1169 l 1,8,-1 + 639 1509 l 1,9,-1 + 979 1509 l 1,10,-1 + 979 1169 l 2,0,1 +477 1169 m 2,11,12 + 477 991 477 991 373.5 912.5 c 128,-1,13 + 270 834 270 834 137 834 c 1,14,-1 + 137 981 l 1,15,16 + 221 981 221 981 261 1020 c 128,-1,17 + 301 1059 301 1059 301 1169 c 1,18,-1 + 137 1169 l 1,19,-1 + 137 1509 l 1,20,-1 + 477 1509 l 1,21,-1 + 477 1169 l 2,11,12 +EndSplineSet +Validated: 1 +EndChar + +StartChar: quoteleft +Encoding: 350 8216 182 +Width: 680 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 10 + 3 + 25 + 3 + 2 + 1 + 85 + 9 + 86 + 6 + 75 + 5 + 11 + 15 + 6 + 31 + 6 + 2 + 6 + 10 + 84 + 9 + 89 + 1 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +514 854 m 1,0,-1 + 174 854 l 1,1,-1 + 174 1194 l 2,2,3 + 174 1372 174 1372 277.5 1451 c 128,-1,4 + 381 1530 381 1530 514 1530 c 1,5,-1 + 514 1382 l 1,6,7 + 430 1382 430 1382 390 1343.5 c 128,-1,8 + 350 1305 350 1305 350 1194 c 1,9,-1 + 514 1194 l 1,10,-1 + 514 854 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: quoteright +Encoding: 351 8217 183 +Width: 680 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 6 + 1 + 21 + 1 + 2 + 4 + 75 + 3 + 86 + 7 + 85 + 9 + 10 + 7 + 89 + 10 + 84 + 0 + 4 + 16 + 4 + 2 + 4 + 9 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +518 1169 m 2,0,1 + 518 991 518 991 414.5 912.5 c 128,-1,2 + 311 834 311 834 178 834 c 1,3,-1 + 178 981 l 1,4,5 + 262 981 262 981 302 1020 c 128,-1,6 + 342 1059 342 1059 342 1169 c 1,7,-1 + 178 1169 l 1,8,-1 + 178 1509 l 1,9,-1 + 518 1509 l 1,10,-1 + 518 1169 l 2,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: divide +Encoding: 205 247 184 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 24 + 19 + 56 + 25 + 13 + 69 + 14 + 9 + 56 + 3 + 14 + 70 + 48 + 12 + 1 + 12 + 0 + 16 + 55 + 13 + 6 + 22 + 22 + 29 + 28 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP2 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +748 1036 m 0,0,1 + 748 973 748 973 702.5 928 c 128,-1,2 + 657 883 657 883 594 883 c 0,3,4 + 530 883 530 883 485 928 c 128,-1,5 + 440 973 440 973 440 1036 c 0,6,7 + 440 1100 440 1100 485 1145 c 128,-1,8 + 530 1190 530 1190 594 1190 c 0,9,10 + 657 1190 657 1190 702.5 1145 c 128,-1,11 + 748 1100 748 1100 748 1036 c 0,0,1 +1077 582 m 1,12,-1 + 113 582 l 1,13,-1 + 113 799 l 1,14,-1 + 1077 799 l 1,15,-1 + 1077 582 l 1,12,-1 +748 332 m 0,16,17 + 748 268 748 268 702.5 223 c 128,-1,18 + 657 178 657 178 594 178 c 0,19,20 + 530 178 530 178 485 223 c 128,-1,21 + 440 268 440 268 440 332 c 0,22,23 + 440 395 440 395 485 440 c 128,-1,24 + 530 485 530 485 594 485 c 0,25,26 + 657 485 657 485 702.5 440 c 128,-1,27 + 748 395 748 395 748 332 c 0,16,17 +EndSplineSet +Validated: 1 +EndChar + +StartChar: lozenge +Encoding: 403 9674 185 +Width: 1372 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 65 + 42 + 1 + 37 + 3 + 59 + 5 + 52 + 7 + 89 + 1 + 86 + 3 + 202 + 1 + 198 + 3 + 8 + 105 + 1 + 170 + 5 + 165 + 7 + 3 + 37 + 0 + 42 + 2 + 59 + 4 + 52 + 6 + 86 + 0 + 89 + 2 + 198 + 0 + 201 + 2 + 8 + 105 + 2 + 170 + 4 + 166 + 6 + 3 + 7 + 5 + 6 + 4 + 0 + 3 + 48 + 2 + 1 + 2 + 4 + 6 + 5 + 7 + 1 + 3 + 3 +RTHG +MDAP[rnd] +SLOOP +ALIGNRP +MDRP[grey] +MDRP[grey] +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +SLOOP +ALIGNRP +MDRP[grey] +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1280 682 m 1,0,-1 + 686 88 l 1,1,-1 + 92 682 l 1,2,-1 + 686 1276 l 1,3,-1 + 1280 682 l 1,0,-1 +973 682 m 1,4,-1 + 686 969 l 1,5,-1 + 399 682 l 1,6,-1 + 686 395 l 1,7,-1 + 973 682 l 1,4,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: ydieresis +Encoding: 213 255 186 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 0 + 11 + 0 + 23 + 16 + 11 + 16 + 23 + 4 + 31 + 14 + 31 + 26 + 63 + 14 + 3 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 92 121 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 81 -88 2 +Validated: 1 +EndChar + +StartChar: Ydieresis +Encoding: 327 376 187 +Width: 1327 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 15 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 60 89 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 204 247 2 +Validated: 1 +EndChar + +StartChar: fraction +Encoding: 363 8260 188 +AltUni2: 002215.ffffffff.0 002215.ffffffff.0 +Width: 512 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 45 + 6 + 1 + 22 + 1 + 24 + 3 + 39 + 1 + 40 + 3 + 53 + 0 + 57 + 1 + 57 + 2 + 72 + 3 + 88 + 3 + 10 + 0 + 57 + 3 + 1 + 3 + 55 + 1 + 1 + 1 + 2 + 2 + 3 + 3 + 57 + 2 + 1 + 2 + 4 + 1 + 2 + 0 + 0 + 3 + 10 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +SPVTL[orthog] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +DELTAP1 +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +837 1509 m 1,0,-1 + -108 0 l 1,1,-1 + -325 0 l 1,2,-1 + 620 1509 l 1,3,-1 + 837 1509 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Euro +Encoding: 368 8364 189 +Width: 1524 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 41 + 5 + 227 + 6 + 227 + 1 + 227 + 2 + 16 + 18 + 227 + 19 + 21 + 227 + 16 + 8 + 29 + 27 + 227 + 10 + 4 + 228 + 7 + 228 + 0 + 228 + 3 + 29 + 18 + 228 + 19 + 29 + 24 + 2 + 6 + 228 + 1 + 5 + 24 + 227 + 13 + 30 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +ALIGNRP +MIRP[rp0,rnd,black] +ALIGNRP +SRP0 +MDRP[rp0,min,rnd,black] +ALIGNRP +MIRP[rp0,rnd,black] +SRP0 +MDRP[rp0,rnd,black] +MIRP[rp0,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,rnd,black] +MDRP[rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,rnd,black] +MIRP[min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,rnd,black] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1239 715 m 1,0,-1 + 98 715 l 1,1,-1 + 146 825 l 1,2,-1 + 1285 825 l 1,3,-1 + 1239 715 l 1,0,-1 +1145 495 m 1,4,-1 + 98 495 l 1,5,-1 + 146 605 l 1,6,-1 + 1193 605 l 1,7,-1 + 1145 495 l 1,4,-1 +1364 149 m 1,8,9 + 1191 0 1191 0 936 0 c 0,10,11 + 656 0 656 0 466 190 c 128,-1,12 + 276 380 276 380 276 660 c 256,13,14 + 276 940 276 940 466 1130 c 128,-1,15 + 656 1320 656 1320 936 1320 c 256,16,17 + 1216 1320 1216 1320 1412 1124 c 1,18,-1 + 1364 1013 l 1,19,20 + 1181 1210 1181 1210 936 1210 c 0,21,22 + 706 1210 706 1210 546 1050 c 128,-1,23 + 386 890 386 890 386 660 c 256,24,25 + 386 430 386 430 546 270 c 128,-1,26 + 706 110 706 110 936 110 c 0,27,28 + 1186 110 1186 110 1364 311 c 1,29,-1 + 1364 149 l 1,8,9 +EndSplineSet +Validated: 5 +EndChar + +StartChar: guilsinglleft +Encoding: 361 8249 190 +Width: 743 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 27 + 4 + 3 + 2 + 6 + 0 + 1 + 0 + 1 + 3 + 5 + 48 + 1 + 1 + 1 + 52 + 2 + 63 + 8 + 1 + 5 + 0 + 1 + 4 + 0 + 95 + 1 + 7 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +DELTAP1 +IP +MDRP[rp0,min,rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +676 123 m 1,0,-1 + 57 496 l 1,1,-1 + 57 709 l 1,2,-1 + 676 1090 l 1,3,-1 + 676 815 l 1,4,-1 + 330 602 l 1,5,-1 + 676 397 l 1,6,-1 + 676 123 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: guilsinglright +Encoding: 362 8250 191 +Width: 743 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 190 8249 N -1 0 0 1 744 0 2 +Validated: 25 +EndChar + +StartChar: fi +Encoding: 407 64257 192 +Width: 1294 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 9 + 11 + 26 + 11 + 2 + 3 + 6 + 32 + 24 + 9 + 12 + 1 + 5 + 2 + 17 + 20 + 33 + 16 + 13 + 17 + 0 + 22 + 143 + 1 + 1 + 1 + 16 + 5 + 24 + 4 + 22 + 9 + 7 + 144 + 5 + 1 + 5 + 26 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[min,rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1149 0 m 1,0,-1 + 829 0 l 1,1,-1 + 829 961 l 1,2,-1 + 489 961 l 1,3,-1 + 489 0 l 1,4,-1 + 170 0 l 1,5,-1 + 170 963 l 1,6,-1 + 18 963 l 1,7,-1 + 18 1151 l 1,8,-1 + 176 1151 l 1,9,-1 + 176 1194 l 2,10,11 + 176 1362 176 1362 276.5 1462.5 c 128,-1,12 + 377 1563 377 1563 545 1563 c 0,13,14 + 625 1563 625 1563 701.5 1541.5 c 128,-1,15 + 778 1520 778 1520 829 1487 c 1,16,-1 + 745 1317 l 1,17,18 + 719 1337 719 1337 687 1351.5 c 128,-1,19 + 655 1366 655 1366 608 1366 c 0,20,21 + 541 1366 541 1366 516.5 1325 c 128,-1,22 + 492 1284 492 1284 492 1204 c 2,23,-1 + 492 1151 l 1,24,-1 + 1149 1151 l 1,25,-1 + 1149 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: fl +Encoding: 408 64258 193 +Width: 1276 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 9 + 20 + 25 + 20 + 40 + 20 + 3 + 12 + 15 + 32 + 9 + 18 + 12 + 1 + 14 + 2 + 2 + 5 + 33 + 22 + 17 + 25 + 16 + 11 + 1 + 13 + 0 + 22 + 25 + 47 + 1 + 95 + 1 + 143 + 1 + 3 + 1 + 14 + 9 + 13 + 22 + 18 + 16 + 144 + 14 + 1 + 14 + 27 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1135 0 m 1,0,-1 + 815 0 l 1,1,-1 + 815 1290 l 1,2,3 + 786 1331 786 1331 742 1348.5 c 128,-1,4 + 698 1366 698 1366 653 1366 c 0,5,6 + 561 1366 561 1366 526.5 1315 c 128,-1,7 + 492 1264 492 1264 492 1184 c 2,8,-1 + 492 1151 l 1,9,-1 + 707 1151 l 1,10,-1 + 707 961 l 1,11,-1 + 489 961 l 1,12,-1 + 489 0 l 1,13,-1 + 170 0 l 1,14,-1 + 170 963 l 1,15,-1 + 18 963 l 1,16,-1 + 18 1151 l 1,17,-1 + 176 1151 l 1,18,-1 + 176 1161 l 2,19,20 + 176 1333 176 1333 271.5 1448 c 128,-1,21 + 367 1563 367 1563 545 1563 c 0,22,23 + 627 1563 627 1563 699.5 1549.5 c 128,-1,24 + 772 1536 772 1536 815 1509 c 1,25,-1 + 1135 1509 l 1,26,-1 + 1135 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: daggerdbl +Encoding: 357 8225 194 +Width: 1049 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 49 + 1 + 4 + 89 + 18 + 64 + 7 + 128 + 11 + 17 + 8 + 89 + 14 + 11 + 12 + 3 + 18 + 12 + 16 + 48 + 21 + 1 + 2 + 64 + 18 + 1 + 17 + 14 + 19 + 48 + 15 + 1 + 15 + 101 + 13 + 22 + 4 + 7 + 8 + 11 + 3 + 64 + 6 + 63 + 10 + 1 + 10 + 101 + 12 + 20 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,grey] +DELTAP1 +SHP[rp2] +MIRP[rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[min,rnd,grey] +DELTAP1 +SHP[rp2] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[grey] +MIRP[rp0,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +SMD +MDRP[rp0,min,rnd,grey] +SMD +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1038 672 m 1,0,-1 + 647 672 l 1,1,-1 + 639 -342 l 1,2,-1 + 399 -342 l 1,3,-1 + 391 672 l 1,4,-1 + 18 672 l 1,5,-1 + 18 848 l 1,6,-1 + 383 848 l 1,7,-1 + 379 975 l 1,8,-1 + 18 975 l 1,9,-1 + 18 1151 l 1,10,-1 + 371 1151 l 1,11,-1 + 358 1509 l 1,12,-1 + 680 1509 l 1,13,-1 + 668 1151 l 1,14,-1 + 1038 1151 l 1,15,-1 + 1038 975 l 1,16,-1 + 659 975 l 1,17,-1 + 655 848 l 1,18,-1 + 1038 848 l 1,19,-1 + 1038 672 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: periodcentered +Encoding: 141 183 195 +AltUni2: 002219.ffffffff.0 002219.ffffffff.0 +Width: 680 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 1 + 71 + 2 + 0 + 71 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +504 524 m 1,0,-1 + 178 524 l 1,1,-1 + 178 850 l 1,2,-1 + 504 850 l 1,3,-1 + 504 524 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: quotesinglbase +Encoding: 352 8218 196 +Width: 680 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 5 + 1 + 22 + 1 + 2 + 4 + 3 + 86 + 9 + 85 + 7 + 0 + 7 + 0 + 84 + 0 + 4 + 16 + 4 + 2 + 4 + 8 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +518 0 m 2,0,1 + 518 -178 518 -178 414.5 -257 c 128,-1,2 + 311 -336 311 -336 178 -336 c 1,3,-1 + 178 -188 l 1,4,5 + 262 -188 262 -188 302 -149.5 c 128,-1,6 + 342 -111 342 -111 342 0 c 1,7,-1 + 178 0 l 1,8,-1 + 178 340 l 1,9,-1 + 518 340 l 1,10,-1 + 518 0 l 2,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: quotedblbase +Encoding: 355 8222 197 +Width: 1100 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 45 + 5 + 1 + 5 + 12 + 21 + 1 + 21 + 12 + 4 + 15 + 4 + 14 + 3 + 86 + 21 + 9 + 85 + 18 + 7 + 0 + 63 + 23 + 1 + 7 + 0 + 84 + 0 + 4 + 16 + 4 + 2 + 4 + 8 + 19 + 18 + 11 + 84 + 0 + 14 + 16 + 14 + 2 + 14 + 19 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[min,rnd,black] +SHP[rp2] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +979 0 m 2,0,1 + 979 -178 979 -178 875.5 -257 c 128,-1,2 + 772 -336 772 -336 639 -336 c 1,3,-1 + 639 -188 l 1,4,5 + 723 -188 723 -188 763 -149.5 c 128,-1,6 + 803 -111 803 -111 803 0 c 1,7,-1 + 639 0 l 1,8,-1 + 639 340 l 1,9,-1 + 979 340 l 1,10,-1 + 979 0 l 2,0,1 +477 0 m 2,11,12 + 477 -178 477 -178 373.5 -257 c 128,-1,13 + 270 -336 270 -336 137 -336 c 1,14,-1 + 137 -188 l 1,15,16 + 221 -188 221 -188 261 -149.5 c 128,-1,17 + 301 -111 301 -111 301 0 c 1,18,-1 + 137 0 l 1,19,-1 + 137 340 l 1,20,-1 + 477 340 l 1,21,-1 + 477 0 l 2,11,12 +EndSplineSet +Validated: 1 +EndChar + +StartChar: perthousand +Encoding: 360 8240 198 +Width: 2560 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 129 + 4 + 1 + 11 + 5 + 11 + 8 + 4 + 12 + 4 + 19 + 11 + 23 + 11 + 26 + 4 + 30 + 4 + 33 + 11 + 37 + 11 + 40 + 4 + 44 + 20 + 1 + 27 + 5 + 27 + 8 + 20 + 12 + 20 + 19 + 27 + 23 + 27 + 26 + 20 + 30 + 20 + 33 + 27 + 37 + 27 + 40 + 20 + 44 + 55 + 15 + 25 + 14 + 14 + 16 + 4 + 57 + 89 + 3 + 87 + 50 + 89 + 10 + 15 + 78 + 64 + 89 + 42 + 28 + 87 + 21 + 85 + 71 + 89 + 35 + 21 + 5 + 17 + 53 + 14 + 1 + 48 + 14 + 1 + 14 + 15 + 61 + 16 + 1 + 63 + 16 + 1 + 16 + 6 + 18 + 88 + 60 + 90 + 68 + 88 + 24 + 38 + 32 + 88 + 74 + 90 + 81 + 88 + 15 + 38 + 1 + 38 + 6 + 0 + 88 + 46 + 90 + 54 + 88 + 0 + 6 + 48 + 6 + 64 + 6 + 176 + 6 + 4 + 6 + 88 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP1 +MDRP[min,rnd,grey] +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP1 +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +843 1153 m 2,0,1 + 843 1006 843 1006 738.5 915.5 c 128,-1,2 + 634 825 634 825 462 825 c 0,3,4 + 292 825 292 825 180.5 919.5 c 128,-1,5 + 69 1014 69 1014 69 1151 c 2,6,-1 + 69 1206 l 2,7,8 + 69 1333 69 1333 170.5 1432.5 c 128,-1,9 + 272 1532 272 1532 462 1532 c 0,10,11 + 642 1532 642 1532 742.5 1439 c 128,-1,12 + 843 1346 843 1346 843 1206 c 2,13,-1 + 843 1153 l 2,0,1 +1440 1509 m 1,14,-1 + 405 0 l 1,15,-1 + 229 0 l 1,16,-1 + 1264 1509 l 1,17,-1 + 1440 1509 l 1,14,-1 +2490 305 m 2,18,19 + 2490 139 2490 139 2384.5 58 c 128,-1,20 + 2279 -23 2279 -23 2111 -23 c 0,21,22 + 1930 -23 1930 -23 1823.5 69.5 c 128,-1,23 + 1717 162 1717 162 1717 303 c 2,24,-1 + 1717 358 l 2,25,26 + 1717 481 1717 481 1819.5 582.5 c 128,-1,27 + 1922 684 1922 684 2111 684 c 0,28,29 + 2291 684 2291 684 2390.5 592 c 128,-1,30 + 2490 500 2490 500 2490 358 c 2,31,-1 + 2490 305 l 2,18,19 +1618 305 m 2,32,33 + 1618 139 1618 139 1512.5 58 c 128,-1,34 + 1407 -23 1407 -23 1240 -23 c 0,35,36 + 1059 -23 1059 -23 952.5 69.5 c 128,-1,37 + 846 162 846 162 846 303 c 2,38,-1 + 846 358 l 2,39,40 + 846 481 846 481 948.5 582.5 c 128,-1,41 + 1051 684 1051 684 1240 684 c 0,42,43 + 1420 684 1420 684 1519 592 c 128,-1,44 + 1618 500 1618 500 1618 358 c 2,45,-1 + 1618 305 l 2,32,33 +587 1163 m 2,46,-1 + 587 1180 l 2,47,48 + 587 1262 587 1262 563.5 1312 c 128,-1,49 + 540 1362 540 1362 462 1362 c 0,50,51 + 386 1362 386 1362 356.5 1314 c 128,-1,52 + 327 1266 327 1266 327 1180 c 2,53,-1 + 327 1163 l 2,54,55 + 327 1094 327 1094 355.5 1037.5 c 128,-1,56 + 384 981 384 981 464 981 c 0,57,58 + 536 981 536 981 561.5 1033 c 128,-1,59 + 587 1085 587 1085 587 1163 c 2,46,-1 +2236 315 m 2,60,-1 + 2236 332 l 2,61,62 + 2236 414 2236 414 2212 464 c 128,-1,63 + 2188 514 2188 514 2111 514 c 0,64,65 + 2035 514 2035 514 2005 466 c 128,-1,66 + 1975 418 1975 418 1975 332 c 2,67,-1 + 1975 315 l 2,68,69 + 1975 246 1975 246 2004 189.5 c 128,-1,70 + 2033 133 2033 133 2113 133 c 0,71,72 + 2184 133 2184 133 2210 185.5 c 128,-1,73 + 2236 238 2236 238 2236 315 c 2,60,-1 +1364 315 m 2,74,-1 + 1364 332 l 2,75,76 + 1364 414 1364 414 1340.5 464 c 128,-1,77 + 1317 514 1317 514 1240 514 c 0,78,79 + 1164 514 1164 514 1134 466 c 128,-1,80 + 1104 418 1104 418 1104 332 c 2,81,-1 + 1104 315 l 2,82,83 + 1104 246 1104 246 1133 189.5 c 128,-1,84 + 1162 133 1162 133 1242 133 c 0,85,86 + 1313 133 1313 133 1338.5 185.5 c 128,-1,87 + 1364 238 1364 238 1364 315 c 2,74,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Acircumflex +Encoding: 152 194 199 +Width: 1358 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 152 260 2 +Validated: 1 +EndChar + +StartChar: Ecircumflex +Encoding: 160 202 200 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 114 260 2 +Validated: 1 +EndChar + +StartChar: Aacute +Encoding: 151 193 201 +Width: 1358 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 242 260 2 +Validated: 1 +EndChar + +StartChar: Edieresis +Encoding: 161 203 202 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 142 168 N 1 0 0 1 119 246 2 +Refer: 40 69 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: Egrave +Encoding: 158 200 203 +Width: 1167 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 14 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 106 260 2 +Validated: 1 +EndChar + +StartChar: Iacute +Encoding: 163 205 204 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 9 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 -58 260 2 +Validated: 1 +EndChar + +StartChar: Icircumflex +Encoding: 164 206 205 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 8 + 1 + 63 + 12 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 -127 260 2 +Validated: 1 +EndChar + +StartChar: Idieresis +Encoding: 165 207 206 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 63 + 10 + 63 + 22 + 2 + 63 + 29 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 -137 247 2 +Validated: 1 +EndChar + +StartChar: Igrave +Encoding: 162 204 207 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 9 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 -189 260 2 +Validated: 1 +EndChar + +StartChar: Oacute +Encoding: 169 211 208 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 30 + 1 + 63 + 33 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 141 180 N 1 0 0 1 232 260 2 +Validated: 1 +EndChar + +StartChar: Ocircumflex +Encoding: 170 212 209 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 32 + 1 + 63 + 36 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 216 710 N 1 0 0 1 190 260 2 +Validated: 1 +EndChar + +StartChar: uniF8FF +Encoding: 406 63743 210 +Width: 1585 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 48 + 3 + 1 + 3 + 9 + 57 + 0 + 1 + 0 + 62 + 6 + 1 + 6 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MDRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1346 762 m 0,0,1 + 1346 532 1346 532 1184 370.5 c 128,-1,2 + 1022 209 1022 209 793 209 c 0,3,4 + 563 209 563 209 401.5 370.5 c 128,-1,5 + 240 532 240 532 240 762 c 0,6,7 + 240 991 240 991 401.5 1153 c 128,-1,8 + 563 1315 563 1315 793 1315 c 0,9,10 + 1022 1315 1022 1315 1184 1153 c 128,-1,11 + 1346 991 1346 991 1346 762 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Ograve +Encoding: 168 210 211 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 33 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 67 96 N 1 0 0 1 106 260 2 +Validated: 1 +EndChar + +StartChar: Uacute +Encoding: 176 218 212 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 20 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 219 260 2 +Validated: 1 +EndChar + +StartChar: Ucircumflex +Encoding: 177 219 213 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 22 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 167 260 2 +Validated: 1 +EndChar + +StartChar: Ugrave +Encoding: 175 217 214 +Width: 1343 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 133 260 2 +Validated: 1 +EndChar + +StartChar: dotlessi +Encoding: 261 305 215 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 2 + 12 + 1 + 0 + 0 + 22 + 160 + 1 + 1 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP2 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +467 0 m 1,0,-1 + 147 0 l 1,1,-1 + 147 1151 l 1,2,-1 + 467 1151 l 1,3,-1 + 467 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: circumflex +Encoding: 335 710 216 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 2 + 5 + 91 + 0 + 4 + 36 + 52 + 0 + 1 + 0 + 8 + 59 + 4 + 1 + 4 + 7 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +PUSHB_2 + 4 + 0 +MD[grid] +EVEN +IF +PUSHB_2 + 0 + 64 +SHPIX +EIF +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +981 1323 m 1,0,-1 + 764 1323 l 1,1,-1 + 512 1516 l 1,2,-1 + 260 1323 l 1,3,-1 + 43 1323 l 1,4,-1 + 395 1677 l 1,5,-1 + 629 1677 l 1,6,-1 + 981 1323 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: tilde +Encoding: 342 732 217 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 36 + 137 + 25 + 153 + 25 + 169 + 25 + 185 + 25 + 199 + 12 + 201 + 25 + 214 + 12 + 7 + 9 + 46 + 25 + 16 + 22 + 46 + 12 + 3 + 37 + 16 + 22 + 9 + 3 + 4 + 0 + 13 + 25 + 0 + 12 + 13 + 26 +SRP0 +MDRP[rp0,rnd,white] +MDRP[min,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,grey] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +944 1520 m 1,0,1 + 915 1456 915 1456 840.5 1397.5 c 128,-1,2 + 766 1339 766 1339 668 1339 c 0,3,4 + 602 1339 602 1339 568.5 1355.5 c 128,-1,5 + 535 1372 535 1372 489 1397 c 0,6,7 + 444 1421 444 1421 411.5 1435.5 c 128,-1,8 + 379 1450 379 1450 336 1450 c 256,9,10 + 293 1450 293 1450 259 1435.5 c 128,-1,11 + 225 1421 225 1421 186 1368 c 1,12,-1 + 84 1452 l 1,13,14 + 113 1507 113 1507 182.5 1568.5 c 128,-1,15 + 252 1630 252 1630 373 1630 c 0,16,17 + 428 1630 428 1630 465 1612.5 c 128,-1,18 + 502 1595 502 1595 537 1573 c 0,19,20 + 573 1550 573 1550 608 1534 c 128,-1,21 + 643 1518 643 1518 700 1518 c 0,22,23 + 752 1518 752 1518 780.5 1543.5 c 128,-1,24 + 809 1569 809 1569 834 1612 c 1,25,-1 + 944 1520 l 1,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: macron +Encoding: 133 175 218 +AltUni2: 0002c9.ffffffff.0 0002c9.ffffffff.0 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 2 + 46 + 1 + 39 + 0 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +870 1335 m 1,0,-1 + 152 1335 l 1,1,-1 + 152 1518 l 1,2,-1 + 870 1518 l 1,3,-1 + 870 1335 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: breve +Encoding: 338 728 219 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 8 + 4 + 24 + 4 + 2 + 0 + 6 + 10 + 94 + 167 + 3 + 183 + 3 + 199 + 3 + 3 + 3 + 38 + 13 + 76 + 0 + 7 + 76 + 6 + 14 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +864 1657 m 1,0,1 + 864 1509 864 1509 751.5 1413 c 128,-1,2 + 639 1317 639 1317 512 1317 c 0,3,4 + 367 1317 367 1317 263.5 1413 c 128,-1,5 + 160 1509 160 1509 160 1657 c 1,6,-1 + 328 1657 l 1,7,8 + 336 1579 336 1579 385 1530 c 128,-1,9 + 434 1481 434 1481 512 1481 c 256,10,11 + 590 1481 590 1481 639 1530 c 128,-1,12 + 688 1579 688 1579 696 1657 c 1,13,-1 + 864 1657 l 1,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: dotaccent +Encoding: 339 729 220 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 9 + 56 + 3 + 38 + 0 + 55 + 6 + 12 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +666 1483 m 0,0,1 + 666 1419 666 1419 620.5 1374 c 128,-1,2 + 575 1329 575 1329 512 1329 c 256,3,4 + 449 1329 449 1329 403.5 1374 c 128,-1,5 + 358 1419 358 1419 358 1483 c 0,6,7 + 358 1546 358 1546 403.5 1591 c 128,-1,8 + 449 1636 449 1636 512 1636 c 256,9,10 + 575 1636 575 1636 620.5 1591 c 128,-1,11 + 666 1546 666 1546 666 1483 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: ring +Encoding: 340 730 221 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 61 + 4 + 1 + 11 + 5 + 11 + 7 + 4 + 11 + 20 + 1 + 27 + 5 + 27 + 7 + 20 + 11 + 37 + 1 + 42 + 5 + 42 + 7 + 37 + 11 + 12 + 9 + 210 + 15 + 21 + 210 + 3 + 38 + 0 + 75 + 112 + 12 + 1 + 48 + 12 + 128 + 12 + 208 + 12 + 3 + 61 + 12 + 144 + 12 + 224 + 12 + 3 + 12 + 18 + 75 + 47 + 6 + 56 + 6 + 2 + 6 + 24 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +DELTAP3 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +788 1581 m 256,0,1 + 788 1468 788 1468 709.5 1392.5 c 128,-1,2 + 631 1317 631 1317 512 1317 c 256,3,4 + 393 1317 393 1317 314.5 1392.5 c 128,-1,5 + 236 1468 236 1468 236 1581 c 256,6,7 + 236 1694 236 1694 314.5 1769.5 c 128,-1,8 + 393 1845 393 1845 512 1845 c 256,9,10 + 631 1845 631 1845 709.5 1769.5 c 128,-1,11 + 788 1694 788 1694 788 1581 c 256,0,1 +643 1581 m 256,12,13 + 643 1634 643 1634 604 1673 c 128,-1,14 + 565 1712 565 1712 512 1712 c 256,15,16 + 459 1712 459 1712 420 1673 c 128,-1,17 + 381 1634 381 1634 381 1581 c 256,18,19 + 381 1528 381 1528 420 1489 c 128,-1,20 + 459 1450 459 1450 512 1450 c 256,21,22 + 565 1450 565 1450 604 1489 c 128,-1,23 + 643 1528 643 1528 643 1581 c 256,12,13 +EndSplineSet +Validated: 1 +EndChar + +StartChar: cedilla +Encoding: 142 184 222 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 47 + 35 + 1 + 35 + 22 + 51 + 22 + 67 + 1 + 67 + 22 + 83 + 1 + 83 + 22 + 99 + 1 + 99 + 22 + 9 + 19 + 20 + 17 + 73 + 3 + 7 + 70 + 10 + 210 + 6 + 3 + 0 + 92 + 111 + 13 + 1 + 13 + 19 + 76 + 48 + 6 + 1 + 6 + 63 + 18 + 1 + 18 + 23 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SRP0 +SROUND +MDRP[rp0,min,rnd,grey] +RTG +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +807 -256 m 0,0,1 + 807 -371 807 -371 722 -431.5 c 128,-1,2 + 637 -492 637 -492 537 -492 c 0,3,4 + 463 -492 463 -492 441.5 -486.5 c 128,-1,5 + 420 -481 420 -481 389 -469 c 1,6,-1 + 389 -336 l 1,7,8 + 416 -350 416 -350 444.5 -356 c 128,-1,9 + 473 -362 473 -362 510 -362 c 0,10,11 + 551 -362 551 -362 579.5 -337.5 c 128,-1,12 + 608 -313 608 -313 608 -270 c 0,13,14 + 608 -215 608 -215 580.5 -192.5 c 128,-1,15 + 553 -170 553 -170 506 -170 c 2,16,-1 + 412 -170 l 1,17,-1 + 412 25 l 1,18,-1 + 573 25 l 1,19,-1 + 573 -57 l 1,20,21 + 680 -57 680 -57 743.5 -108.5 c 128,-1,22 + 807 -160 807 -160 807 -256 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: hungarumlaut +Encoding: 343 733 223 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 3 + 7 + 91 + 2 + 6 + 36 + 0 + 2 + 4 + 6 + 8 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1042 1677 m 1,0,-1 + 735 1323 l 1,1,-1 + 539 1323 l 1,2,-1 + 788 1677 l 1,3,-1 + 1042 1677 l 1,0,-1 +623 1677 m 1,4,-1 + 315 1323 l 1,5,-1 + 119 1323 l 1,6,-1 + 369 1677 l 1,7,-1 + 623 1677 l 1,4,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: ogonek +Encoding: 341 731 224 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 26 + 10 + 7 + 26 + 7 + 42 + 7 + 58 + 7 + 74 + 7 + 91 + 7 + 6 + 0 + 3 + 18 + 11 + 10 + 0 + 0 + 21 + 11 + 15 + 89 + 6 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +659 -471 m 1,0,1 + 616 -483 616 -483 591.5 -487.5 c 128,-1,2 + 567 -492 567 -492 543 -492 c 0,3,4 + 422 -492 422 -492 350.5 -435.5 c 128,-1,5 + 279 -379 279 -379 279 -246 c 0,6,7 + 279 -135 279 -135 358.5 -67.5 c 128,-1,8 + 438 0 438 0 553 0 c 2,9,-1 + 639 0 l 1,10,-1 + 639 -150 l 1,11,-1 + 553 -150 l 2,12,13 + 506 -150 506 -150 477.5 -175.5 c 128,-1,14 + 449 -201 449 -201 449 -246 c 0,15,16 + 449 -295 449 -295 478.5 -318.5 c 128,-1,17 + 508 -342 508 -342 549 -342 c 0,18,19 + 557 -342 557 -342 577.5 -339 c 128,-1,20 + 598 -336 598 -336 614 -332 c 1,21,-1 + 659 -471 l 1,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: caron +Encoding: 336 711 225 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 0 + 3 + 91 + 5 + 2 + 36 + 52 + 0 + 1 + 0 + 8 + 59 + 3 + 1 + 3 + 7 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +PUSHB_2 + 3 + 0 +MD[grid] +EVEN +IF +PUSHB_2 + 0 + 64 +SHPIX +EIF +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +981 1677 m 1,0,-1 + 629 1323 l 1,1,-1 + 395 1323 l 1,2,-1 + 43 1677 l 1,3,-1 + 260 1677 l 1,4,-1 + 512 1485 l 1,5,-1 + 764 1677 l 1,6,-1 + 981 1677 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Lslash +Encoding: 274 321 226 +Width: 1126 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 11 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 375 -1 N 1 0 0 1 0 0 2 +Validated: 5 +EndChar + +StartChar: lslash +Encoding: 275 322 227 +Width: 635 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 376 -1 N 1 0 0 1 -18 0 2 +Validated: 5 +EndChar + +StartChar: Scaron +Encoding: 303 352 228 +Width: 1155 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 41 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 54 83 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 89 260 2 +Validated: 1 +EndChar + +StartChar: scaron +Encoding: 304 353 229 +Width: 932 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 0 + 40 + 16 + 40 + 2 + 0 + 41 + 63 + 41 + 64 + 41 + 3 + 63 + 46 + 1 + 63 + 46 + 1 +DELTAP1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 86 115 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 -27 -75 2 +Validated: 1 +EndChar + +StartChar: Zcaron +Encoding: 332 381 230 +Width: 1108 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 13 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 61 90 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 39 260 2 +Validated: 1 +EndChar + +StartChar: zcaron +Encoding: 333 382 231 +Width: 1020 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 0 + 12 + 16 + 12 + 2 + 63 + 13 + 1 + 63 + 18 + 1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 93 122 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 4 -75 2 +Validated: 1 +EndChar + +StartChar: brokenbar +Encoding: 124 166 232 +Width: 850 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 6 + 5 + 1 + 2 + 16 + 7 + 63 + 0 + 1 + 0 + 58 + 5 + 1 + 8 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +557 690 m 1,0,-1 + 299 690 l 1,1,-1 + 299 1509 l 1,2,-1 + 557 1509 l 1,3,-1 + 557 690 l 1,0,-1 +557 -408 m 1,4,-1 + 299 -408 l 1,5,-1 + 299 412 l 1,6,-1 + 557 412 l 1,7,-1 + 557 -408 l 1,4,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Eth +Encoding: 166 208 233 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 377 -1 N 1 0 0 1 0 0 2 +Refer: 39 68 N 1 0 0 1 0 0 2 +Validated: 5 +EndChar + +StartChar: eth +Encoding: 198 240 234 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 56 + 52 + 31 + 1 + 17 + 16 + 18 + 15 + 31 + 34 + 33 + 7 + 9 + 32 + 43 + 31 + 12 + 9 + 9 + 3 + 28 + 24 + 21 + 34 + 25 + 32 + 28 + 17 + 49 + 33 + 3 + 3 + 61 + 31 + 63 + 33 + 2 + 17 + 16 + 18 + 15 + 31 + 34 + 32 + 33 + 8 + 0 + 24 + 0 + 23 + 12 + 40 + 46 + 23 + 24 + 6 + 52 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1114 573 m 0,0,1 + 1100 287 1100 287 957.5 131 c 128,-1,2 + 815 -25 815 -25 543 -25 c 0,3,4 + 319 -25 319 -25 191 137 c 128,-1,5 + 63 299 63 299 63 528 c 0,6,7 + 63 776 63 776 188 923.5 c 128,-1,8 + 313 1071 313 1071 543 1071 c 0,9,10 + 621 1071 621 1071 688.5 1032 c 128,-1,11 + 756 993 756 993 788 954 c 1,12,13 + 782 1034 782 1034 759.5 1099.5 c 128,-1,14 + 737 1165 737 1165 700 1212 c 1,15,-1 + 600 1104 l 1,16,-1 + 494 1206 l 1,17,-1 + 584 1303 l 1,18,19 + 559 1315 559 1315 527.5 1320 c 128,-1,20 + 496 1325 496 1325 461 1325 c 0,21,22 + 403 1325 403 1325 349 1311.5 c 128,-1,23 + 295 1298 295 1298 231 1268 c 1,24,-1 + 231 1499 l 1,25,26 + 274 1518 274 1518 329.5 1532 c 128,-1,27 + 385 1546 385 1546 461 1546 c 0,28,29 + 545 1546 545 1546 620.5 1528.5 c 128,-1,30 + 696 1511 696 1511 748 1479 c 1,31,-1 + 862 1599 l 1,32,-1 + 981 1509 l 1,33,-1 + 868 1391 l 1,34,35 + 975 1286 975 1286 1039.5 1107 c 128,-1,36 + 1104 928 1104 928 1114 705 c 0,37,38 + 1114 692 1114 692 1114 646 c 128,-1,39 + 1114 600 1114 600 1114 573 c 0,0,1 +780 532 m 0,40,41 + 780 655 780 655 734 755.5 c 128,-1,42 + 688 856 688 856 584 856 c 0,43,44 + 498 856 498 856 447.5 787.5 c 128,-1,45 + 397 719 397 719 397 528 c 0,46,47 + 397 369 397 369 441 266.5 c 128,-1,48 + 485 164 485 164 584 164 c 0,49,50 + 682 164 682 164 731 266.5 c 128,-1,51 + 780 369 780 369 780 532 c 0,40,41 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Yacute +Encoding: 179 221 235 +Width: 1327 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 60 89 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 251 260 2 +Validated: 1 +EndChar + +StartChar: yacute +Encoding: 211 253 236 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 10 + 16 + 10 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 92 121 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 167 -71 2 +Validated: 1 +EndChar + +StartChar: Thorn +Encoding: 180 222 237 +Width: 1192 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 40 + 170 + 17 + 1 + 0 + 19 + 31 + 9 + 20 + 31 + 4 + 9 + 4 + 6 + 7 + 7 + 10 + 6 + 0 + 151 + 0 + 167 + 0 + 246 + 0 + 3 + 0 + 21 + 32 + 14 + 80 + 14 + 2 + 14 + 6 + 9 + 19 + 4 + 20 + 6 + 24 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1147 705 m 2,0,1 + 1147 528 1147 528 1019 421.5 c 128,-1,2 + 891 315 891 315 686 315 c 2,3,-1 + 487 315 l 1,4,-1 + 487 0 l 1,5,-1 + 147 0 l 1,6,-1 + 147 1509 l 1,7,-1 + 487 1509 l 1,8,-1 + 487 1194 l 1,9,-1 + 659 1194 l 2,10,11 + 891 1194 891 1194 1019 1090.5 c 128,-1,12 + 1147 987 1147 987 1147 768 c 2,13,-1 + 1147 705 l 2,0,1 +809 713 m 2,14,-1 + 809 776 l 2,15,16 + 809 877 809 877 754.5 936 c 128,-1,17 + 700 995 700 995 565 995 c 2,18,-1 + 487 995 l 1,19,-1 + 487 522 l 1,20,-1 + 565 522 l 2,21,22 + 680 522 680 522 744.5 565 c 128,-1,23 + 809 608 809 608 809 713 c 2,14,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: thorn +Encoding: 212 254 238 +Width: 1298 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 49 + 6 + 16 + 22 + 16 + 122 + 1 + 3 + 9 + 16 + 26 + 25 + 6 + 3 + 3 + 14 + 64 + 11 + 96 + 14 + 22 + 47 + 14 + 13 + 29 + 32 + 3 + 3 + 8 + 18 + 96 + 33 + 1 + 0 + 23 + 16 + 18 + 64 + 18 + 112 + 18 + 3 + 18 + 8 + 11 + 26 + 6 + 22 + 8 + 32 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[min,rnd,black] +SRP0 +SMD +MDRP[min,grey] +SMD +SRP1 +SRP2 +SLOOP +IP +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1200 547 m 2,0,1 + 1200 279 1200 279 1076 131.5 c 128,-1,2 + 952 -16 952 -16 719 -16 c 0,3,4 + 659 -16 659 -16 588.5 0 c 128,-1,5 + 518 16 518 16 469 59 c 1,6,-1 + 469 -342 l 1,7,-1 + 150 -342 l 1,8,-1 + 150 1511 l 1,9,-1 + 469 1511 l 1,10,-1 + 469 991 l 1,11,12 + 541 1100 541 1100 626 1137 c 128,-1,13 + 711 1174 711 1174 803 1174 c 0,14,15 + 991 1174 991 1174 1095.5 1040.5 c 128,-1,16 + 1200 907 1200 907 1200 678 c 2,17,-1 + 1200 547 l 2,0,1 +870 563 m 2,18,-1 + 870 637 l 2,19,20 + 870 823 870 823 815 885.5 c 128,-1,21 + 760 948 760 948 688 948 c 0,22,23 + 612 948 612 948 552 908 c 128,-1,24 + 492 868 492 868 469 813 c 1,25,-1 + 469 266 l 1,26,27 + 477 227 477 227 530.5 190.5 c 128,-1,28 + 584 154 584 154 664 154 c 0,29,30 + 743 154 743 154 806.5 227.5 c 128,-1,31 + 870 301 870 301 870 563 c 2,18,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: minus +Encoding: 390 8722 239 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 1 + 68 + 2 + 70 + 48 + 0 + 1 + 0 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1085 569 m 1,0,-1 + 104 569 l 1,1,-1 + 104 807 l 1,2,-1 + 1085 807 l 1,3,-1 + 1085 569 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: multiply +Encoding: 173 215 240 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 80 + 2 + 1 + 2 + 8 + 11 + 5 + 11 + 5 + 2 + 8 +RTHG +MDAP[rnd] +ALIGNRP +MDRP[rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +ALIGNRP +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +991 438 m 1,0,-1 + 846 293 l 1,1,-1 + 594 545 l 1,2,-1 + 342 293 l 1,3,-1 + 197 438 l 1,4,-1 + 449 690 l 1,5,-1 + 197 942 l 1,6,-1 + 342 1087 l 1,7,-1 + 594 836 l 1,8,-1 + 846 1087 l 1,9,-1 + 991 942 l 1,10,-1 + 739 690 l 1,11,-1 + 991 438 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: onesuperior +Encoding: 143 185 241 +Width: 758 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 3 + 210 + 4 + 7 + 14 + 1 + 81 + 0 + 99 + 7 + 3 + 144 + 1 + 1 + 1 + 1 + 10 + 9 +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +518 590 m 1,0,-1 + 291 590 l 1,1,-1 + 291 1251 l 1,2,-1 + 129 1251 l 1,3,-1 + 129 1380 l 1,4,5 + 250 1393 250 1393 300 1438 c 128,-1,6 + 350 1483 350 1483 356 1511 c 1,7,-1 + 518 1511 l 1,8,-1 + 518 590 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: twosuperior +Encoding: 136 178 242 +Width: 918 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 51 + 17 + 70 + 16 + 102 + 20 + 136 + 4 + 153 + 4 + 5 + 2 +PUSHW_1 + -16 +NPUSHB + 20 + 12 + 8 + 111 + 15 + 15 + 2 + 21 + 111 + 1 + 81 + 21 + 0 + 18 + 99 + 5 + 2 + 11 + 12 + 2 + 23 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,rnd,grey] +SHPIX +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +809 590 m 1,0,-1 + 143 590 l 1,1,-1 + 143 770 l 1,2,3 + 375 989 375 989 474 1075 c 128,-1,4 + 573 1161 573 1161 573 1247 c 0,5,6 + 573 1305 573 1305 543.5 1329.5 c 128,-1,7 + 514 1354 514 1354 459 1354 c 0,8,9 + 391 1354 391 1354 363.5 1325 c 128,-1,10 + 336 1296 336 1296 328 1268 c 1,11,-1 + 121 1268 l 1,12,13 + 143 1391 143 1391 245.5 1459.5 c 128,-1,14 + 348 1528 348 1528 473 1528 c 0,15,16 + 647 1528 647 1528 725 1455 c 128,-1,17 + 803 1382 803 1382 803 1270 c 0,18,19 + 803 1124 803 1124 616.5 962.5 c 128,-1,20 + 430 801 430 801 367 760 c 1,21,-1 + 809 760 l 1,22,-1 + 809 590 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: threesuperior +Encoding: 137 179 243 +Width: 918 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 72 + 36 + 1 + 36 + 34 + 51 + 1 + 51 + 34 + 68 + 34 + 86 + 34 + 169 + 31 + 7 + 38 + 17 + 75 + 15 + 18 + 31 + 18 + 2 + 18 + 73 + 18 + 3 + 32 + 29 + 71 + 25 + 94 + 32 + 15 + 64 + 7 + 1 + 7 + 71 + 10 + 94 + 6 + 3 + 82 + 36 + 38 + 52 + 38 + 2 + 38 + 18 + 18 + 0 + 6 + 35 + 93 + 95 + 22 + 1 + 22 + 0 + 99 + 48 + 13 + 1 + 13 + 6 + 28 + 29 + 7 + 6 + 41 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[grey] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +DELTAP1 +MIRP[rp0,min,rnd,black] +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +807 856 m 0,0,1 + 807 731 807 731 715 650 c 128,-1,2 + 623 569 623 569 463 569 c 0,3,4 + 365 569 365 569 275.5 608 c 128,-1,5 + 186 647 186 647 125 733 c 1,6,-1 + 264 827 l 1,7,8 + 307 772 307 772 353 748.5 c 128,-1,9 + 399 725 399 725 432 725 c 0,10,11 + 514 725 514 725 551 761 c 128,-1,12 + 588 797 588 797 588 866 c 0,13,14 + 588 942 588 942 535.5 965.5 c 128,-1,15 + 483 989 483 989 426 989 c 2,16,-1 + 332 989 l 1,17,-1 + 332 1133 l 1,18,-1 + 432 1133 l 2,19,20 + 512 1133 512 1133 548 1163.5 c 128,-1,21 + 584 1194 584 1194 584 1253 c 0,22,23 + 584 1305 584 1305 550 1334.5 c 128,-1,24 + 516 1364 516 1364 461 1364 c 0,25,26 + 391 1364 391 1364 363.5 1335.5 c 128,-1,27 + 336 1307 336 1307 324 1268 c 1,28,-1 + 125 1268 l 1,29,30 + 150 1395 150 1395 248 1461.5 c 128,-1,31 + 346 1528 346 1528 469 1528 c 0,32,33 + 623 1528 623 1528 702.5 1460.5 c 128,-1,34 + 782 1393 782 1393 782 1286 c 0,35,36 + 782 1194 782 1194 744.5 1146 c 128,-1,37 + 707 1098 707 1098 662 1075 c 1,38,39 + 737 1044 737 1044 772 989 c 128,-1,40 + 807 934 807 934 807 856 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: onehalf +Encoding: 147 189 244 +Width: 1647 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 1 + 1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 242 178 N 1 0 0 1 821 -591 2 +Refer: 241 185 N 1 0 0 1 -67 0 2 +Refer: 188 8260 N 1 0 0 1 476 0 2 +Validated: 1 +EndChar + +StartChar: onequarter +Encoding: 146 188 245 +Width: 1647 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 48 + 3 + 48 + 13 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 374 8308 N 1 0 0 1 774 -590 2 +Refer: 241 185 N 1 0 0 1 -67 0 2 +Refer: 188 8260 N 1 0 0 1 518 0 2 +Validated: 1 +EndChar + +StartChar: threequarters +Encoding: 148 190 246 +Width: 1764 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 48 + 3 + 48 + 13 + 2 + 63 + 20 + 48 + 57 + 2 +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 374 8308 N 1 0 0 1 875 -593 2 +Refer: 243 179 N 1 0 0 1 -108 0 2 +Refer: 188 8260 N 1 0 0 1 628 0 2 +Validated: 1 +EndChar + +StartChar: franc +Encoding: 366 8355 247 +Width: 1110 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 80 + 12 + 1 + 0 + 12 + 1 + 48 + 15 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 41 70 N 1 0 0 1 0 0 2 +Refer: 377 -1 N 1 0 0 1 0 -360 2 +Validated: 5 +EndChar + +StartChar: Gbreve +Encoding: 244 286 248 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 38 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 42 71 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 224 254 2 +Validated: 1 +EndChar + +StartChar: gbreve +Encoding: 245 287 249 +Width: 1337 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 0 + 47 + 16 + 47 + 32 + 47 + 48 + 47 + 4 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 129 -71 2 +Validated: 1 +EndChar + +StartChar: Idotaccent +Encoding: 260 304 250 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 48 + 7 + 1 + 63 + 17 + 1 + 63 + 10 + 1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 -132 256 2 +Validated: 1 +EndChar + +StartChar: Scedilla +Encoding: 301 350 251 +Width: 1155 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 54 83 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 24 -3 2 +Validated: 5 +EndChar + +StartChar: scedilla +Encoding: 302 351 252 +Width: 932 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 0 + 44 + 63 + 44 + 2 + 63 + 62 + 1 + 63 + 62 + 1 +DELTAP1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 86 115 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -119 9 2 +Validated: 5 +EndChar + +StartChar: Cacute +Encoding: 220 262 253 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 30 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 38 67 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 243 260 2 +Validated: 1 +EndChar + +StartChar: cacute +Encoding: 221 263 254 +Width: 1124 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 30 + 16 + 30 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 70 99 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 148 -71 2 +Validated: 1 +EndChar + +StartChar: Ccaron +Encoding: 226 268 255 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 31 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 38 67 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 141 260 2 +Validated: 1 +EndChar + +StartChar: ccaron +Encoding: 227 269 256 +Width: 1124 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 30 + 16 + 30 + 2 + 63 + 31 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 70 99 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 82 -71 2 +Validated: 1 +EndChar + +StartChar: dcroat +Encoding: 231 273 257 +Width: 1298 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 17 + 63 + 34 + 111 + 34 + 143 + 34 + 175 + 34 + 224 + 34 + 5 + 96 + 37 + 1 + 224 + 34 + 1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 71 100 N 1 0 0 1 0 0 2 +Refer: 377 -1 N 1 0 0 1 585 579 2 +Validated: 5 +EndChar + +StartChar: Amacron +Encoding: 214 256 258 +Width: 1358 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 147 248 2 +Validated: 1 +EndChar + +StartChar: amacron +Encoding: 215 257 259 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 0 + 45 + 16 + 45 + 2 + 16 + 49 + 63 + 49 + 192 + 49 + 240 + 49 + 4 + 0 + 45 + 16 + 45 + 2 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 114 -65 2 +Validated: 1 +EndChar + +StartChar: Abreve +Encoding: 216 258 260 +Width: 1358 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 151 247 2 +Validated: 1 +EndChar + +StartChar: abreve +Encoding: 217 259 261 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 0 + 47 + 16 + 47 + 32 + 47 + 48 + 47 + 4 + 0 + 50 + 16 + 50 + 2 + 16 + 59 + 63 + 59 + 192 + 59 + 240 + 59 + 4 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 118 -72 2 +Validated: 1 +EndChar + +StartChar: Aogonek +Encoding: 218 260 262 +Width: 1358 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 17 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 387 149 2 +Validated: 5 +EndChar + +StartChar: aogonek +Encoding: 219 261 263 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 47 + 50 + 1 + 16 + 67 + 63 + 67 + 192 + 67 + 240 + 67 + 4 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 447 148 2 +Validated: 5 +EndChar + +StartChar: Dcaron +Encoding: 228 270 264 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 39 68 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 87 261 2 +Validated: 1 +EndChar + +StartChar: dcaron +Encoding: 229 271 265 +Width: 1546 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 44 + 1 + 63 + 41 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 71 100 N 1 0 0 1 0 0 2 +Refer: 183 8217 N 1 0 0 1 1029 0 2 +Validated: 1 +EndChar + +StartChar: Dcroat +Encoding: 230 272 266 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 377 -1 N 1 0 0 1 0 0 2 +Refer: 39 68 N 1 0 0 1 0 0 2 +Validated: 5 +EndChar + +StartChar: Emacron +Encoding: 232 274 267 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 105 250 2 +Validated: 1 +EndChar + +StartChar: emacron +Encoding: 233 275 268 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 32 + 16 + 32 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 156 -54 2 +Validated: 1 +EndChar + +StartChar: Edotaccent +Encoding: 236 278 269 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 111 231 2 +Validated: 1 +EndChar + +StartChar: edotaccent +Encoding: 237 279 270 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 34 + 16 + 34 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 132 -90 2 +Validated: 1 +EndChar + +StartChar: Eogonek +Encoding: 238 280 271 +Width: 1167 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 18 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 364 151 2 +Validated: 5 +EndChar + +StartChar: eogonek +Encoding: 239 281 272 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 140 129 2 +Validated: 5 +EndChar + +StartChar: Ecaron +Encoding: 240 282 273 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 98 260 2 +Validated: 1 +EndChar + +StartChar: ecaron +Encoding: 241 283 274 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 32 + 16 + 32 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 134 -71 2 +Validated: 1 +EndChar + +StartChar: Gcedilla +Encoding: 248 290 275 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 0 + 38 + 1 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 42 71 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 241 -6 2 +Validated: 5 +EndChar + +StartChar: gcedilla +Encoding: 249 291 276 +Width: 1337 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 15 + 45 + 31 + 45 + 111 + 45 + 127 + 45 + 143 + 45 + 207 + 45 + 239 + 45 + 255 + 45 + 8 + 47 + 45 + 63 + 45 + 64 + 45 + 127 + 45 + 143 + 45 + 223 + 45 + 6 + 15 + 45 + 1 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 182 8216 N 1 0 0 1 286 414 2 +Validated: 1 +EndChar + +StartChar: Imacron +Encoding: 256 298 277 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 6 + 1 + 63 + 9 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 -136 250 2 +Validated: 1 +EndChar + +StartChar: imacron +Encoding: 257 299 278 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 5 + 16 + 5 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 -216 -53 2 +Validated: 1 +EndChar + +StartChar: logonek +Encoding: 410 -1 279 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 27 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 -94 150 2 +Validated: 5 +EndChar + +StartChar: iogonek +Encoding: 259 303 280 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 22 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 76 105 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 -174 150 2 +Validated: 5 +EndChar + +StartChar: IJ +Encoding: 262 306 281 +Width: 1536 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 45 74 N 1 0 0 1 562 0 2 +Validated: 1 +EndChar + +StartChar: ij +Encoding: 263 307 282 +Width: 1249 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 22 + 0 + 41 + 2 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 76 105 N 1 0 0 1 0 0 2 +Refer: 77 106 N 1 0 0 1 570 0 2 +Validated: 1 +EndChar + +StartChar: Inodot +Encoding: 411 -1 283 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 5 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: idot +Encoding: 412 -1 284 +Width: 610 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 76 105 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: Kcedilla +Encoding: 266 310 285 +Width: 1339 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 0 + 18 + 16 + 18 + 48 + 18 + 3 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 46 75 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -86 15 2 +Validated: 5 +EndChar + +StartChar: kcedilla +Encoding: 267 311 286 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 17 + 16 + 17 + 2 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 78 107 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -104 53 2 +Validated: 5 +EndChar + +StartChar: Lacute +Encoding: 268 313 287 +Width: 1126 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 11 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 21 260 2 +Validated: 1 +EndChar + +StartChar: lacute +Encoding: 269 314 288 +Width: 635 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 -126 261 2 +Validated: 1 +EndChar + +StartChar: Lcedilla +Encoding: 270 315 289 +Width: 1126 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 30 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -147 15 2 +Validated: 5 +EndChar + +StartChar: lcedilla +Encoding: 271 316 290 +Width: 635 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -186 9 2 +Validated: 5 +EndChar + +StartChar: Lcaron +Encoding: 272 317 291 +Width: 1126 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 18 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 183 8217 N 1 0 0 1 441 0 2 +Validated: 1 +EndChar + +StartChar: lcaron +Encoding: 273 318 292 +Width: 946 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 13 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 183 8217 N 1 0 0 1 378 0 2 +Validated: 1 +EndChar + +StartChar: Ldotaccent +Encoding: 413 -1 293 +Width: 1126 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 19 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 297 -726 2 +Validated: 1 +EndChar + +StartChar: ldotaccent +Encoding: 414 -1 294 +Width: 940 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 10 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 204 -777 2 +Validated: 1 +EndChar + +StartChar: Nacute +Encoding: 276 323 295 +Width: 1397 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 12 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 49 78 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 277 260 2 +Validated: 1 +EndChar + +StartChar: nacute +Encoding: 277 324 296 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 22 + 16 + 22 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 186 -71 2 +Validated: 1 +EndChar + +StartChar: Ncedilla +Encoding: 278 325 297 +Width: 1397 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 15 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 49 78 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -242 2 2 +Validated: 5 +EndChar + +StartChar: ncedilla +Encoding: 279 326 298 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -188 11 2 +Validated: 5 +EndChar + +StartChar: Ncaron +Encoding: 280 327 299 +Width: 1397 +GlyphClass: 1 +Flags: W +TtInstrs: +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 49 78 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 186 260 2 +Validated: 1 +EndChar + +StartChar: ncaron +Encoding: 281 328 300 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 20 + 16 + 20 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 138 -72 2 +Validated: 1 +EndChar + +StartChar: napostrophe +Encoding: 282 329 301 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 183 8217 N 1 0 0 1 295 332 2 +Validated: 1 +EndChar + +StartChar: Omacron +Encoding: 283 332 302 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 30 + 1 + 63 + 33 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 218 175 N 1 0 0 1 211 267 2 +Validated: 1 +EndChar + +StartChar: omacron +Encoding: 284 333 303 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 29 + 16 + 29 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 192 -65 2 +Validated: 1 +EndChar + +StartChar: Ohungarumlaut +Encoding: 287 336 304 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 37 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 223 733 N 1 0 0 1 250 260 2 +Validated: 1 +EndChar + +StartChar: ohungarumlaut +Encoding: 288 337 305 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 0 + 30 + 0 + 34 + 16 + 30 + 16 + 34 + 4 + 48 + 30 + 48 + 34 + 2 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 223 733 N 1 0 0 1 193 -71 2 +Validated: 1 +EndChar + +StartChar: Racute +Encoding: 291 340 306 +Width: 1251 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 53 82 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 161 260 2 +Validated: 1 +EndChar + +StartChar: racute +Encoding: 292 341 307 +Width: 1020 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 85 114 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 58 -71 2 +Validated: 1 +EndChar + +StartChar: Rcedilla +Encoding: 293 342 308 +Width: 1251 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 53 82 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -175 -1 2 +Validated: 5 +EndChar + +StartChar: rcedilla +Encoding: 294 343 309 +Width: 1020 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 85 114 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -192 23 2 +Validated: 5 +EndChar + +StartChar: Rcircumflex +Encoding: 415 -1 310 +Width: 1251 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 53 82 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 107 260 2 +Validated: 1 +EndChar + +StartChar: rcircumflex +Encoding: 416 -1 311 +Width: 1020 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 85 114 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 49 -71 2 +Validated: 1 +EndChar + +StartChar: Sacute +Encoding: 297 346 312 +Width: 1155 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 54 83 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 123 260 2 +Validated: 1 +EndChar + +StartChar: sacute +Encoding: 298 347 313 +Width: 932 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 0 + 40 + 16 + 40 + 2 + 63 + 40 + 1 + 63 + 43 + 1 + 63 + 43 + 1 +DELTAP1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 86 115 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 41 -72 2 +Validated: 1 +EndChar + +StartChar: Tcedilla +Encoding: 305 354 314 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 55 84 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 16 17 2 +Validated: 5 +EndChar + +StartChar: tcedilla +Encoding: 306 355 315 +Width: 850 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 30 + 16 + 30 + 2 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 87 116 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -13 13 2 +Validated: 5 +EndChar + +StartChar: Tcaron +Encoding: 307 356 316 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 55 84 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 22 260 2 +Validated: 1 +EndChar + +StartChar: tcaronaltone +Encoding: 417 -1 317 +Width: 850 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 26 + 1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 87 116 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 -90 251 2 +Validated: 1 +EndChar + +StartChar: Umacron +Encoding: 313 362 318 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 20 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 206 266 2 +Validated: 1 +EndChar + +StartChar: umacron +Encoding: 314 363 319 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 20 + 16 + 20 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 121 -56 2 +Validated: 1 +EndChar + +StartChar: Uring +Encoding: 317 366 320 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 31 + 223 + 24 + 223 + 37 + 2 + 144 + 24 + 144 + 37 + 2 + 63 + 24 + 63 + 37 + 80 + 24 + 80 + 37 + 96 + 24 + 96 + 37 + 208 + 24 + 208 + 37 + 224 + 24 + 224 + 37 + 10 +DELTAP1 +DELTAP3 +DELTAP2 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 221 730 N 1 0 0 1 225 223 2 +Validated: 1 +EndChar + +StartChar: uring +Encoding: 318 367 321 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 22 + 0 + 23 + 0 + 41 + 16 + 23 + 16 + 41 + 4 + 191 + 20 + 191 + 38 + 2 + 207 + 20 + 207 + 38 + 2 + 96 + 45 + 1 +DELTAP1 +DELTAP1 +DELTAP2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 221 730 N 1 0 0 1 138 -89 2 +Validated: 1 +EndChar + +StartChar: Uhungarumlaut +Encoding: 319 368 322 +Width: 1343 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 223 733 N 1 0 0 1 225 260 2 +Validated: 1 +EndChar + +StartChar: uhungarumlaut +Encoding: 320 369 323 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 0 + 22 + 0 + 26 + 16 + 22 + 16 + 26 + 4 + 96 + 29 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 223 733 N 1 0 0 1 106 -71 2 +Validated: 1 +EndChar + +StartChar: Ucedilla +Encoding: 418 -1 324 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 0 + 24 + 1 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 186 8 2 +Validated: 5 +EndChar + +StartChar: ucedilla +Encoding: 419 -1 325 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 48 + 25 + 96 + 44 + 2 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 470 14 2 +Validated: 5 +EndChar + +StartChar: Zacute +Encoding: 328 377 326 +Width: 1108 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 61 90 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 127 260 2 +Validated: 1 +EndChar + +StartChar: zacute +Encoding: 329 378 327 +Width: 1020 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 0 + 12 + 16 + 12 + 2 + 63 + 12 + 1 + 63 + 15 + 1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 93 122 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 33 -71 2 +Validated: 1 +EndChar + +StartChar: Zdotaccent +Encoding: 330 379 328 +Width: 1108 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 16 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 61 90 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 69 245 2 +Validated: 1 +EndChar + +StartChar: zdotaccent +Encoding: 331 380 329 +Width: 1020 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 0 + 13 + 16 + 13 + 2 + 63 + 16 + 1 + 63 + 23 + 1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 93 122 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 18 -101 2 +Validated: 1 +EndChar + +StartChar: coloncur +Encoding: 420 -1 330 +Width: 1292 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 53 + 15 + 1 + 28 + 31 + 35 + 35 + 10 + 29 + 30 + 33 + 34 + 3 + 14 + 40 + 17 + 30 + 13 + 40 + 10 + 11 + 27 + 40 + 24 + 30 + 0 + 40 + 3 + 1 + 29 + 31 + 28 + 16 + 30 + 1 + 0 + 30 + 16 + 30 + 2 + 30 + 34 + 33 + 35 + 32 + 15 + 34 + 31 + 34 + 2 + 34 + 6 + 14 + 0 + 0 + 16 + 0 + 160 + 0 + 192 + 0 + 4 + 0 + 7 + 21 + 21 + 21 + 2 + 21 + 21 + 223 + 6 + 1 + 6 + 36 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP2 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,black] +IP +IP +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP1 +MDRP[rp0,min,rnd,black] +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1229 90 m 1,0,1 + 1153 39 1153 39 1049.5 7 c 128,-1,2 + 946 -25 946 -25 801 -25 c 0,3,4 + 430 -25 430 -25 254 165.5 c 128,-1,5 + 78 356 78 356 78 717 c 2,6,-1 + 78 778 l 2,7,8 + 78 1118 78 1118 267.5 1324 c 128,-1,9 + 457 1530 457 1530 829 1530 c 0,10,11 + 956 1530 956 1530 1054.5 1495 c 128,-1,12 + 1153 1460 1153 1460 1229 1407 c 1,13,-1 + 1229 1135 l 1,14,15 + 1149 1210 1149 1210 1064 1249 c 128,-1,16 + 979 1288 979 1288 881 1288 c 0,17,18 + 627 1288 627 1288 527.5 1149 c 128,-1,19 + 428 1010 428 1010 428 758 c 2,20,-1 + 428 737 l 2,21,22 + 428 467 428 467 532.5 344 c 128,-1,23 + 637 221 637 221 834 221 c 0,24,25 + 967 221 967 221 1070.5 266 c 128,-1,26 + 1174 311 1174 311 1229 360 c 1,27,-1 + 1229 90 l 1,0,1 +1178 1731 m 1,28,-1 + 854 -188 l 1,29,-1 + 698 -188 l 1,30,-1 + 1022 1731 l 1,31,-1 + 1178 1731 l 1,28,-1 +858 1731 m 1,32,-1 + 535 -188 l 1,33,-1 + 379 -188 l 1,34,-1 + 702 1731 l 1,35,-1 + 858 1731 l 1,32,-1 +EndSplineSet +Validated: 5 +EndChar + +StartChar: cruzeiro +Encoding: 365 8354 331 +Width: 1389 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 378 -1 N 1 0 0 1 0 0 2 +Refer: 38 67 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: pesetas +Encoding: 367 8359 332 +Width: 1749 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 104 + 23 + 38 + 89 + 41 + 44 + 42 + 68 + 30 + 70 + 27 + 33 + 31 + 34 + 3 + 81 + 46 + 78 + 62 + 59 + 65 + 65 + 78 + 59 + 46 + 4 + 49 + 68 + 72 + 75 + 94 + 71 + 68 + 112 + 53 + 70 + 56 + 89 + 52 + 49 + 3 + 18 + 31 + 4 + 4 + 6 + 7 + 17 + 31 + 7 + 10 + 6 + 0 + 81 + 46 + 78 + 62 + 59 + 65 + 72 + 70 + 46 + 93 + 59 + 78 + 93 + 53 + 65 + 37 + 22 + 30 + 37 + 44 + 24 + 88 + 42 + 41 + 39 + 37 + 6 + 6 + 0 + 22 + 0 + 39 + 0 + 3 + 0 + 21 + 16 + 12 + 32 + 12 + 64 + 12 + 112 + 12 + 4 + 12 + 6 + 18 + 4 + 20 + 6 + 84 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +SRP0 +MDRP[min,rnd,grey] +MDRP[rp0,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1184 1040 m 2,0,1 + 1184 877 1184 877 1076.5 785.5 c 128,-1,2 + 969 694 969 694 729 694 c 2,3,-1 + 487 694 l 1,4,-1 + 487 0 l 1,5,-1 + 147 0 l 1,6,-1 + 147 1509 l 1,7,-1 + 750 1509 l 2,8,9 + 969 1509 969 1509 1076.5 1415 c 128,-1,10 + 1184 1321 1184 1321 1184 1180 c 2,11,-1 + 1184 1040 l 2,0,1 +866 1059 m 2,12,-1 + 866 1143 l 2,13,14 + 866 1229 866 1229 818 1259.5 c 128,-1,15 + 770 1290 770 1290 659 1290 c 2,16,-1 + 487 1290 l 1,17,-1 + 487 901 l 1,18,-1 + 678 901 l 2,19,20 + 758 901 758 901 812 942 c 128,-1,21 + 866 983 866 983 866 1059 c 2,12,-1 +1153 444 m 1,22,-1 + 952 444 l 1,23,-1 + 952 362 l 2,24,25 + 952 264 952 264 970.5 226 c 128,-1,26 + 989 188 989 188 1036 188 c 0,27,28 + 1063 188 1063 188 1087.5 192.5 c 128,-1,29 + 1112 197 1112 197 1145 211 c 1,30,-1 + 1145 31 l 1,31,32 + 1112 6 1112 6 1073 -2 c 128,-1,33 + 1034 -10 1034 -10 975 -10 c 0,34,35 + 817 -10 817 -10 755.5 91.5 c 128,-1,36 + 694 193 694 193 694 383 c 2,37,-1 + 694 446 l 1,38,-1 + 557 446 l 1,39,-1 + 557 610 l 1,40,-1 + 713 618 l 1,41,-1 + 764 872 l 1,42,-1 + 952 872 l 1,43,-1 + 952 621 l 1,44,-1 + 1153 621 l 1,45,-1 + 1153 444 l 1,22,-1 +1698 205 m 0,46,47 + 1698 109 1698 109 1630.5 50.5 c 128,-1,48 + 1563 -8 1563 -8 1403 -8 c 0,49,50 + 1335 -8 1335 -8 1281 3 c 128,-1,51 + 1227 14 1227 14 1202 31 c 1,52,-1 + 1202 211 l 1,53,54 + 1231 197 1231 197 1282 179.5 c 128,-1,55 + 1333 162 1333 162 1386 162 c 0,56,57 + 1427 162 1427 162 1455 171 c 128,-1,58 + 1483 180 1483 180 1483 207 c 0,59,60 + 1483 236 1483 236 1442 251 c 128,-1,61 + 1401 266 1401 266 1376 274 c 0,62,63 + 1282 303 1282 303 1249.5 362.5 c 128,-1,64 + 1217 422 1217 422 1217 504 c 0,65,66 + 1217 588 1217 588 1278 645 c 128,-1,67 + 1339 702 1339 702 1470 702 c 0,68,69 + 1532 702 1532 702 1579 691 c 128,-1,70 + 1626 680 1626 680 1655 666 c 1,71,-1 + 1655 506 l 1,72,73 + 1626 522 1626 522 1577 532.5 c 128,-1,74 + 1528 543 1528 543 1483 543 c 0,75,76 + 1452 543 1452 543 1429.5 533.5 c 128,-1,77 + 1407 524 1407 524 1407 494 c 0,78,79 + 1407 467 1407 467 1427.5 456.5 c 128,-1,80 + 1448 446 1448 446 1499 430 c 0,81,82 + 1622 393 1622 393 1660 336 c 128,-1,83 + 1698 279 1698 279 1698 205 c 0,46,47 +EndSplineSet +Validated: 5 +EndChar + +StartChar: rupees +Encoding: 421 -1 333 +Width: 1729 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 81 + 3 + 11 + 20 + 11 + 37 + 11 + 3 + 64 + 29 + 61 + 45 + 42 + 48 + 48 + 61 + 42 + 29 + 4 + 32 + 51 + 55 + 58 + 94 + 54 + 51 + 112 + 36 + 70 + 39 + 89 + 35 + 32 + 3 + 16 + 5 + 31 + 25 + 25 + 7 + 8 + 24 + 31 + 8 + 10 + 0 + 7 + 0 + 64 + 29 + 61 + 45 + 42 + 48 + 55 + 70 + 29 + 93 + 42 + 61 + 93 + 36 + 48 + 7 + 16 + 20 + 13 + 0 + 25 + 1 + 13 + 24 + 32 + 20 + 1 + 20 + 7 + 25 + 5 + 20 + 7 + 67 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1180 0 m 1,0,-1 + 844 0 l 1,1,2 + 840 365 840 365 774.5 521.5 c 128,-1,3 + 709 678 709 678 567 678 c 2,4,-1 + 487 678 l 1,5,-1 + 487 0 l 1,6,-1 + 147 0 l 1,7,-1 + 147 1509 l 1,8,-1 + 741 1509 l 2,9,10 + 958 1509 958 1509 1048.5 1415 c 128,-1,11 + 1139 1321 1139 1321 1139 1184 c 2,12,-1 + 1139 1102 l 2,13,14 + 1139 973 1139 973 1060 895 c 128,-1,15 + 981 817 981 817 823 803 c 1,16,17 + 1001 750 1001 750 1090.5 567.5 c 128,-1,18 + 1180 385 1180 385 1180 0 c 1,0,-1 +829 1071 m 2,19,-1 + 829 1112 l 2,20,21 + 829 1210 829 1210 777 1252 c 128,-1,22 + 725 1294 725 1294 623 1294 c 2,23,-1 + 487 1294 l 1,24,-1 + 487 895 l 1,25,-1 + 604 895 l 2,26,27 + 725 895 725 895 777 939 c 128,-1,28 + 829 983 829 983 829 1071 c 2,19,-1 +1698 199 m 0,29,30 + 1698 102 1698 102 1630.5 44 c 128,-1,31 + 1563 -14 1563 -14 1403 -14 c 0,32,33 + 1335 -14 1335 -14 1281 -3 c 128,-1,34 + 1227 8 1227 8 1202 25 c 1,35,-1 + 1202 205 l 1,36,37 + 1231 190 1231 190 1282 173 c 128,-1,38 + 1333 156 1333 156 1386 156 c 0,39,40 + 1427 156 1427 156 1455 165 c 128,-1,41 + 1483 174 1483 174 1483 201 c 0,42,43 + 1483 229 1483 229 1442 244.5 c 128,-1,44 + 1401 260 1401 260 1376 268 c 0,45,46 + 1282 297 1282 297 1249.5 356.5 c 128,-1,47 + 1217 416 1217 416 1217 498 c 0,48,49 + 1217 582 1217 582 1278 639 c 128,-1,50 + 1339 696 1339 696 1470 696 c 0,51,52 + 1532 696 1532 696 1579 685 c 128,-1,53 + 1626 674 1626 674 1655 659 c 1,54,-1 + 1655 500 l 1,55,56 + 1626 516 1626 516 1577 526.5 c 128,-1,57 + 1528 537 1528 537 1483 537 c 0,58,59 + 1452 537 1452 537 1429.5 527.5 c 128,-1,60 + 1407 518 1407 518 1407 487 c 0,61,62 + 1407 461 1407 461 1427.5 450.5 c 128,-1,63 + 1448 440 1448 440 1499 424 c 0,64,65 + 1622 387 1622 387 1660 329.5 c 128,-1,66 + 1698 272 1698 272 1698 199 c 0,29,30 +EndSplineSet +Validated: 1 +EndChar + +StartChar: pesoph +Encoding: 422 -1 334 +Width: 1374 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 43 + 217 + 20 + 249 + 20 + 2 + 24 + 32 + 23 + 23 + 7 + 18 + 31 + 4 + 4 + 6 + 7 + 17 + 31 + 7 + 10 + 6 + 0 + 22 + 39 + 0 + 1 + 0 + 21 + 6 + 12 + 22 + 12 + 32 + 12 + 3 + 12 + 6 + 18 + 4 + 20 + 23 + 6 + 26 +SRP0 +MDRP[rp0,rnd,white] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[min,rnd,black] +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1188 877 m 2,0,1 + 1188 713 1188 713 1080.5 621.5 c 128,-1,2 + 973 530 973 530 733 530 c 2,3,-1 + 487 530 l 1,4,-1 + 487 0 l 1,5,-1 + 147 0 l 1,6,-1 + 147 1509 l 1,7,-1 + 754 1509 l 2,8,9 + 973 1509 973 1509 1080.5 1417 c 128,-1,10 + 1188 1325 1188 1325 1188 1159 c 2,11,-1 + 1188 877 l 2,0,1 +870 895 m 2,12,-1 + 870 1122 l 2,13,14 + 870 1208 870 1208 822 1249 c 128,-1,15 + 774 1290 774 1290 664 1290 c 2,16,-1 + 487 1290 l 1,17,-1 + 487 737 l 1,18,-1 + 682 737 l 2,19,20 + 762 737 762 737 816 778 c 128,-1,21 + 870 819 870 819 870 895 c 2,12,-1 +1307 924 m 1,22,-1 + 94 924 l 1,23,-1 + 94 1100 l 1,24,-1 + 1307 1100 l 1,25,-1 + 1307 924 l 1,22,-1 +EndSplineSet +Validated: 5 +EndChar + +StartChar: rupiah +Encoding: 405 63197 335 +Width: 2183 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 77 + 3 + 11 + 5 + 45 + 20 + 11 + 22 + 45 + 37 + 11 + 5 + 54 + 55 + 35 + 3 + 32 + 43 + 64 + 40 + 96 + 43 + 51 + 34 + 43 + 38 + 38 + 7 + 8 + 58 + 33 + 32 + 3 + 37 + 18 + 16 + 5 + 31 + 25 + 25 + 7 + 8 + 24 + 31 + 8 + 10 + 0 + 7 + 0 + 29 + 23 + 47 + 37 + 39 + 40 + 55 + 35 + 24 + 192 + 37 + 1 + 37 + 7 + 16 + 20 + 13 + 0 + 25 + 1 + 13 + 24 + 20 + 7 + 25 + 5 + 20 + 7 + 61 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,rnd,grey] +MIRP[min,rnd,black] +SRP0 +SMD +MDRP[min,grey] +SMD +SRP1 +SRP2 +SLOOP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1118 0 m 1,0,-1 + 782 0 l 1,1,2 + 778 365 778 365 723 521.5 c 128,-1,3 + 668 678 668 678 526 678 c 2,4,-1 + 487 678 l 1,5,-1 + 487 0 l 1,6,-1 + 147 0 l 1,7,-1 + 147 1509 l 1,8,-1 + 700 1509 l 2,9,10 + 868 1509 868 1509 972.5 1422 c 128,-1,11 + 1077 1335 1077 1335 1077 1184 c 2,12,-1 + 1077 1102 l 2,13,14 + 1077 973 1077 973 998.5 895 c 128,-1,15 + 920 817 920 817 762 803 c 1,16,17 + 940 750 940 750 1029 567.5 c 128,-1,18 + 1118 385 1118 385 1118 0 c 1,0,-1 +768 1071 m 2,19,-1 + 768 1112 l 2,20,21 + 768 1210 768 1210 726 1252 c 128,-1,22 + 684 1294 684 1294 582 1294 c 2,23,-1 + 487 1294 l 1,24,-1 + 487 895 l 1,25,-1 + 563 895 l 2,26,27 + 684 895 684 895 726 939 c 128,-1,28 + 768 983 768 983 768 1071 c 2,19,-1 +2142 434 m 2,29,30 + 2142 207 2142 207 2018 96.5 c 128,-1,31 + 1894 -14 1894 -14 1722 -14 c 0,32,33 + 1663 -14 1663 -14 1592.5 2 c 128,-1,34 + 1522 18 1522 18 1473 61 c 1,35,-1 + 1473 -342 l 1,36,-1 + 1174 -342 l 1,37,-1 + 1174 926 l 1,38,-1 + 1460 926 l 1,39,-1 + 1468 813 l 1,40,41 + 1513 874 1513 874 1575.5 911 c 128,-1,42 + 1638 948 1638 948 1753 948 c 0,43,44 + 1939 948 1939 948 2040.5 824 c 128,-1,45 + 2142 700 2142 700 2142 526 c 2,46,-1 + 2142 434 l 2,29,30 +1812 446 m 2,47,-1 + 1812 481 l 2,48,49 + 1812 608 1812 608 1766 665.5 c 128,-1,50 + 1720 723 1720 723 1626 723 c 0,51,52 + 1559 723 1559 723 1529 696.5 c 128,-1,53 + 1499 670 1499 670 1473 625 c 1,54,-1 + 1473 248 l 1,55,56 + 1489 221 1489 221 1526 198.5 c 128,-1,57 + 1563 176 1563 176 1606 176 c 0,58,59 + 1704 176 1704 176 1758 233.5 c 128,-1,60 + 1812 291 1812 291 1812 446 c 2,47,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: blank +Encoding: 423 -1 336 +Width: 1364 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 15 + 4 + 217 + 1 + 18 + 6 + 2 + 0 + 5 + 217 + 0 + 9 + 3 + 217 + 1 + 8 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1206 -350 m 1,0,-1 + 162 -350 l 1,1,-1 + 162 0 l 1,2,-1 + 352 0 l 1,3,-1 + 352 -162 l 1,4,-1 + 1014 -162 l 1,5,-1 + 1014 0 l 1,6,-1 + 1206 0 l 1,7,-1 + 1206 -350 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: pageup +Encoding: 377 8670 337 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 40 + 9 + 12 + 201 + 6 + 15 + 19 + 5 + 16 + 201 + 2 + 19 + 19 + 11 + 20 + 1 + 20 + 22 + 15 + 11 + 218 + 22 + 10 + 11 + 3 + 8 + 2 + 6 + 0 + 10 + 200 + 11 + 17 + 13 + 21 + 19 + 15 + 11 + 11 + 24 + 23 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1259 1043 m 1,0,-1 + 904 1043 l 1,1,-1 + 904 822 l 1,2,-1 + 1199 822 l 1,3,-1 + 1199 614 l 1,4,-1 + 904 614 l 1,5,-1 + 904 442 l 1,6,-1 + 1199 442 l 1,7,-1 + 1199 234 l 1,8,-1 + 904 234 l 1,9,-1 + 904 -171 l 1,10,-1 + 636 -171 l 1,11,-1 + 636 234 l 1,12,-1 + 341 234 l 1,13,-1 + 341 442 l 1,14,-1 + 636 442 l 1,15,-1 + 636 614 l 1,16,-1 + 341 614 l 1,17,-1 + 341 822 l 1,18,-1 + 636 822 l 1,19,-1 + 636 1043 l 1,20,-1 + 281 1043 l 1,21,-1 + 770 1536 l 1,22,-1 + 1259 1043 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: capslock +Encoding: 385 8682 338 +Width: 2388 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 56 + 6 + 88 + 6 + 200 + 6 + 249 + 6 + 4 + 73 + 6 + 185 + 6 + 2 + 55 + 5 + 1 + 7 + 9 + 204 + 1 + 4 + 70 + 4 + 6 + 11 + 204 + 3 + 16 + 25 + 8 + 221 + 8 + 2 + 8 + 6 + 15 + 15 + 204 + 21 + 20 + 204 + 16 + 0 + 8 + 6 + 12 + 11 + 7 + 0 + 2 + 19 + 12 + 202 + 17 + 2 + 23 + 9 + 5 + 3 + 20 + 11 + 202 + 16 + 3 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[grey] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2220 512 m 1,0,-1 + 1708 512 l 1,1,-1 + 1708 172 l 1,2,-1 + 684 172 l 1,3,-1 + 684 512 l 1,4,-1 + 172 512 l 1,5,-1 + 1196 1536 l 1,6,-1 + 2220 512 l 1,0,-1 +1806 684 m 1,7,-1 + 1196 1294 l 1,8,-1 + 584 683 l 1,9,-1 + 852 684 l 1,10,-1 + 852 340 l 1,11,-1 + 1536 340 l 1,12,-1 + 1536 684 l 1,13,-1 + 1806 684 l 1,7,-1 +1708 -512 m 1,14,-1 + 684 -512 l 1,15,-1 + 684 0 l 1,16,-1 + 1708 0 l 1,17,-1 + 1708 -512 l 1,14,-1 +1536 -340 m 1,18,-1 + 1536 -172 l 1,19,-1 + 852 -172 l 1,20,-1 + 852 -340 l 1,21,-1 + 1536 -340 l 1,18,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowupwhite +Encoding: 2 5 339 +Width: 2188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 54 + 56 + 6 + 88 + 6 + 170 + 8 + 200 + 6 + 249 + 6 + 5 + 73 + 6 + 185 + 6 + 2 + 55 + 5 + 1 + 7 + 9 + 204 + 1 + 4 + 4 + 6 + 11 + 204 + 3 + 0 + 25 + 8 + 221 + 8 + 2 + 8 + 6 + 15 + 8 + 6 + 12 + 11 + 7 + 0 + 12 + 202 + 2 + 15 + 9 + 5 + 11 + 202 + 3 + 14 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +DELTAP1 +MIAP[rnd] +MIRP[min,rnd,black] +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2118 512 m 1,0,-1 + 1606 512 l 1,1,-1 + 1606 0 l 1,2,-1 + 582 0 l 1,3,-1 + 582 512 l 1,4,-1 + 70 512 l 1,5,-1 + 1094 1536 l 1,6,-1 + 2118 512 l 1,0,-1 +1704 684 m 1,7,-1 + 1094 1294 l 1,8,-1 + 482 683 l 1,9,-1 + 750 684 l 1,10,-1 + 750 172 l 1,11,-1 + 1434 172 l 1,12,-1 + 1434 684 l 1,13,-1 + 1704 684 l 1,7,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: propellor +Encoding: 12 17 340 +Width: 1876 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 55 + 31 + 59 + 204 + 43 + 72 + 47 + 20 + 95 + 20 + 2 + 20 + 27 + 51 + 63 + 204 + 36 + 27 + 15 + 78 + 8 + 86 + 204 + 44 + 73 + 32 + 19 + 80 + 19 + 2 + 19 + 12 + 82 + 93 + 204 + 3 + 12 + 0 + 55 + 44 + 78 + 205 + 32 + 70 + 47 + 7 + 1 + 7 + 0 + 48 + 74 + 205 + 39 + 15 + 0 + 1 + 0 + 97 + 59 + 19 + 86 + 205 + 31 + 73 + 32 + 8 + 1 + 8 + 15 + 66 + 90 + 205 + 24 + 176 + 15 + 1 + 15 + 96 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1708 340 m 0,0,1 + 1708 203 1708 203 1607.5 101.5 c 128,-1,2 + 1507 0 1507 0 1366 0 c 0,3,4 + 1227 0 1227 0 1125.5 100.5 c 128,-1,5 + 1024 201 1024 201 1024 340 c 2,6,-1 + 1024 512 l 1,7,-1 + 854 512 l 1,8,-1 + 854 340 l 2,9,10 + 854 203 854 203 753.5 101.5 c 128,-1,11 + 653 0 653 0 512 0 c 0,12,13 + 373 0 373 0 272.5 100.5 c 128,-1,14 + 172 201 172 201 172 340 c 0,15,16 + 172 483 172 483 272.5 583.5 c 128,-1,17 + 373 684 373 684 512 684 c 2,18,-1 + 684 684 l 1,19,-1 + 684 852 l 1,20,-1 + 512 852 l 2,21,22 + 371 852 371 852 271.5 954.5 c 128,-1,23 + 172 1057 172 1057 172 1194 c 0,24,25 + 172 1335 172 1335 272.5 1435.5 c 128,-1,26 + 373 1536 373 1536 512 1536 c 256,27,28 + 651 1536 651 1536 752.5 1435.5 c 128,-1,29 + 854 1335 854 1335 854 1196 c 2,30,-1 + 854 1024 l 1,31,-1 + 1024 1024 l 1,32,-1 + 1024 1196 l 2,33,34 + 1024 1335 1024 1335 1125.5 1435.5 c 128,-1,35 + 1227 1536 1227 1536 1364 1536 c 0,36,37 + 1505 1536 1505 1536 1606.5 1435.5 c 128,-1,38 + 1708 1335 1708 1335 1708 1196 c 256,39,40 + 1708 1057 1708 1057 1607.5 954.5 c 128,-1,41 + 1507 852 1507 852 1364 852 c 2,42,-1 + 1196 852 l 1,43,-1 + 1196 684 l 1,44,-1 + 1366 684 l 2,45,46 + 1505 684 1505 684 1606.5 582.5 c 128,-1,47 + 1708 481 1708 481 1708 340 c 0,0,1 +1536 1196 m 256,48,49 + 1536 1266 1536 1266 1486 1315 c 128,-1,50 + 1436 1364 1436 1364 1366 1364 c 256,51,52 + 1296 1364 1296 1364 1246 1315 c 128,-1,53 + 1196 1266 1196 1266 1196 1196 c 2,54,-1 + 1196 1024 l 1,55,-1 + 1366 1024 l 2,56,57 + 1438 1024 1438 1024 1487 1075 c 128,-1,58 + 1536 1126 1536 1126 1536 1196 c 256,48,49 +684 1024 m 1,59,-1 + 684 1196 l 2,60,61 + 684 1266 684 1266 633 1315 c 128,-1,62 + 582 1364 582 1364 512 1364 c 256,63,64 + 442 1364 442 1364 392 1315 c 128,-1,65 + 342 1266 342 1266 342 1196 c 0,66,67 + 342 1124 342 1124 392 1074 c 128,-1,68 + 442 1024 442 1024 512 1024 c 2,69,-1 + 684 1024 l 1,59,-1 +1024 684 m 1,70,-1 + 1024 852 l 1,71,-1 + 854 852 l 1,72,-1 + 854 684 l 1,73,-1 + 1024 684 l 1,70,-1 +1536 340 m 0,74,75 + 1536 412 1536 412 1486 462 c 128,-1,76 + 1436 512 1436 512 1366 512 c 2,77,-1 + 1196 512 l 1,78,-1 + 1196 340 l 2,79,80 + 1196 270 1196 270 1246 221 c 128,-1,81 + 1296 172 1296 172 1366 172 c 256,82,83 + 1436 172 1436 172 1486 222 c 128,-1,84 + 1536 272 1536 272 1536 340 c 0,74,75 +684 340 m 2,85,-1 + 684 512 l 1,86,-1 + 512 512 l 2,87,88 + 440 512 440 512 391 461 c 128,-1,89 + 342 410 342 410 342 340 c 256,90,91 + 342 270 342 270 392 221 c 128,-1,92 + 442 172 442 172 512 172 c 256,93,94 + 582 172 582 172 633 221 c 128,-1,95 + 684 270 684 270 684 340 c 2,85,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: clear +Encoding: 21 28 341 +Width: 2220 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 93 + 38 + 22 + 41 + 34 + 2 + 28 + 22 + 34 + 26 + 4 + 32 + 29 + 17 + 12 + 16 + 13 + 11 + 25 + 20 + 21 + 29 + 204 + 18 + 15 + 14 + 11 + 15 + 2 + 7 + 3 + 6 + 18 + 27 + 33 + 35 + 32 + 204 + 1 + 4 + 5 + 8 + 0 + 11 + 14 + 15 + 18 + 1 + 4 + 5 + 8 + 29 + 21 + 20 + 25 + 27 + 33 + 35 + 32 + 16 + 12 + 13 + 16 + 17 + 3 + 6 + 28 + 22 + 26 + 34 + 10 + 7 + 6 + 2 + 22 + 2 + 2 + 2 + 11 + 7 + 25 + 7 + 2 + 7 + 0 + 9 + 23 + 205 + 0 + 37 + 31 + 205 + 9 + 36 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +MDAP[rnd] +DELTAP1 +MDAP[rnd] +DELTAP1 +SRP2 +SLOOP +IP +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[grey] +MDRP[grey] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[grey] +MDRP[grey] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2048 0 m 1,0,-1 + 1694 0 l 1,1,-1 + 1851 -252 l 1,2,-1 + 1708 -340 l 1,3,-1 + 1493 0 l 1,4,-1 + 727 0 l 1,5,-1 + 512 -340 l 1,6,-1 + 367 -252 l 1,7,-1 + 524 0 l 1,8,-1 + 172 0 l 1,9,-1 + 172 1536 l 1,10,-1 + 524 1536 l 1,11,-1 + 367 1788 l 1,12,-1 + 512 1876 l 1,13,-1 + 727 1536 l 1,14,-1 + 1493 1536 l 1,15,-1 + 1708 1876 l 1,16,-1 + 1851 1788 l 1,17,-1 + 1694 1536 l 1,18,-1 + 2048 1536 l 1,19,-1 + 2048 0 l 1,0,-1 +1384 1364 m 1,20,-1 + 834 1364 l 1,21,-1 + 1110 928 l 1,22,-1 + 1384 1364 l 1,20,-1 +1878 172 m 1,23,-1 + 1878 1364 l 1,24,-1 + 1587 1364 l 1,25,-1 + 1210 768 l 1,26,-1 + 1587 172 l 1,27,-1 + 1878 172 l 1,23,-1 +1010 768 m 1,28,-1 + 633 1364 l 1,29,-1 + 342 1364 l 1,30,-1 + 342 172 l 1,31,-1 + 633 172 l 1,32,-1 + 1010 768 l 1,28,-1 +1384 172 m 1,33,-1 + 1110 608 l 1,34,-1 + 834 172 l 1,35,-1 + 1384 172 l 1,33,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowleft +Encoding: 371 8592 342 +Width: 2048 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 15 + 3 + 1 + 5 + 2 + 1 + 219 + 4 + 5 + 220 + 0 + 8 + 5 + 1 + 3 + 7 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1880 624 m 1,0,-1 + 668 624 l 1,1,-1 + 668 270 l 1,2,-1 + 172 768 l 1,3,-1 + 668 1266 l 1,4,-1 + 668 912 l 1,5,-1 + 1880 912 l 1,6,-1 + 1880 624 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowright +Encoding: 373 8594 343 +Width: 2048 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 342 8592 N -1 0 0 1 2051 0 2 +Validated: 25 +EndChar + +StartChar: enter +Encoding: 424 -1 344 +Width: 2220 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 37 + 57 + 5 + 54 + 7 + 73 + 5 + 70 + 7 + 4 + 4 + 8 + 5 + 7 + 43 + 6 + 1 + 6 + 9 + 9 + 1 + 9 + 1 + 221 + 2 + 10 + 6 + 9 + 4 + 8 + 5 + 4 + 0 + 11 + 7 + 8 + 1 + 10 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,rnd,grey] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,rnd,grey] +MDRP[grey] +SRP1 +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,grey] +DELTAP1 +MDRP[grey] +DELTAP1 +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rp0,min,grey] +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2048 1234 m 1,0,-1 + 172 1234 l 1,1,-1 + 172 1506 l 1,2,-1 + 2048 1506 l 1,3,-1 + 2048 1234 l 1,0,-1 +1922 424 m 1,4,-1 + 1725 227 l 1,5,-1 + 1110 844 l 1,6,-1 + 495 227 l 1,7,-1 + 296 424 l 1,8,-1 + 1110 1234 l 1,9,-1 + 1922 424 l 1,4,-1 +EndSplineSet +Validated: 5 +EndChar + +StartChar: arrowupleft +Encoding: 375 8624 345 +Width: 1876 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 88 + 2 + 1 + 6 + 2 + 4 + 3 + 3 + 1 + 5 + 0 + 87 + 1 + 103 + 1 + 119 + 1 + 3 + 1 + 5 + 10 + 6 + 2 + 3 + 5 + 5 + 0 + 3 + 1 + 0 + 8 + 3 + 7 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,white] +RTDG +MDRP[min,grey] +RTG +SRP1 +SRP2 +IP +RTDG +MDAP[rnd] +SRP2 +IP +IP +RTG +SVTCA[y-axis] +MIAP[rnd] +MDAP[no-rnd] +DELTAP1 +MDRP[grey] +SRP1 +SRP2 +IP +RTDG +MDAP[rnd] +SRP2 +IP +IP +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1681 207 m 1,0,-1 + 1473 -1 l 1,1,-1 + 420 1050 l 1,2,-1 + 172 802 l 1,3,-1 + 172 1506 l 1,4,-1 + 876 1506 l 1,5,-1 + 628 1258 l 1,6,-1 + 1681 207 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowtableft +Encoding: 1 3 346 +AltUni2: 0021e4.ffffffff.0 0021e4.ffffffff.0 +Width: 2048 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 20 + 3 + 1 + 5 + 8 + 2 + 1 + 219 + 9 + 4 + 5 + 220 + 0 + 12 + 5 + 1 + 3 + 7 + 221 + 8 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[min,rnd,grey] +MDRP[min,rnd,grey] +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1956 624 m 1,0,-1 + 1002 624 l 1,1,-1 + 1002 270 l 1,2,-1 + 506 768 l 1,3,-1 + 1002 1266 l 1,4,-1 + 1002 912 l 1,5,-1 + 1956 912 l 1,6,-1 + 1956 624 l 1,0,-1 +451 172 m 1,7,-1 + 171 172 l 1,8,-1 + 171 1364 l 1,9,-1 + 451 1364 l 1,10,-1 + 451 172 l 1,7,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowtabright +Encoding: 0 2 347 +AltUni2: 0021e5.ffffffff.0 0021e5.ffffffff.0 +Width: 2048 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +92 624 m 1,0,-1 + 92 912 l 1,1,-1 + 1046 912 l 1,2,-1 + 1046 1266 l 1,3,-1 + 1542 768 l 1,4,-1 + 1046 270 l 1,5,-1 + 1046 624 l 1,6,-1 + 92 624 l 1,0,-1 +1597 172 m 1,7,-1 + 1597 1364 l 1,8,-1 + 1877 1364 l 1,9,-1 + 1877 172 l 1,10,-1 + 1597 172 l 1,7,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: help +Encoding: 425 -1 348 +Width: 1734 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 84 + 44 + 14 + 34 + 16 + 34 + 20 + 44 + 22 + 58 + 35 + 53 + 49 + 102 + 49 + 7 + 95 + 43 + 1 + 43 + 70 + 40 + 203 + 44 + 70 + 63 + 47 + 1 + 47 + 31 + 52 + 217 + 0 + 51 + 16 + 51 + 48 + 51 + 3 + 51 + 47 + 51 + 3 + 9 + 21 + 201 + 3 + 211 + 15 + 201 + 9 + 24 + 201 + 94 + 37 + 143 + 37 + 2 + 37 + 51 + 112 + 30 + 1 + 30 + 31 + 50 + 201 + 43 + 16 + 51 + 144 + 51 + 2 + 51 + 51 + 0 + 6 + 12 + 201 + 0 + 211 + 18 + 201 + 6 + 54 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[min,rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,white] +MDAP[rnd] +DELTAP1 +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1717 765 m 256,0,1 + 1717 415 1717 415 1469.5 167.5 c 128,-1,2 + 1222 -80 1222 -80 872 -80 c 256,3,4 + 522 -80 522 -80 274.5 167.5 c 128,-1,5 + 27 415 27 415 27 765 c 256,6,7 + 27 1115 27 1115 274.5 1362.5 c 128,-1,8 + 522 1610 522 1610 872 1610 c 256,9,10 + 1222 1610 1222 1610 1469.5 1362.5 c 128,-1,11 + 1717 1115 1717 1115 1717 765 c 256,0,1 +1505 765 m 0,12,13 + 1505 1030 1505 1030 1319 1217 c 128,-1,14 + 1133 1404 1133 1404 872 1404 c 0,15,16 + 603 1404 603 1404 421 1219 c 128,-1,17 + 239 1034 239 1034 239 765 c 0,18,19 + 239 497 239 497 421 312 c 128,-1,20 + 603 127 603 127 872 127 c 0,21,22 + 1149 127 1149 127 1327 310.5 c 128,-1,23 + 1505 494 1505 494 1505 765 c 0,12,13 +1160 982 m 0,24,25 + 1160 894 1160 894 1059 824.5 c 128,-1,26 + 958 755 958 755 958 704 c 0,27,28 + 958 647 958 647 958 624 c 128,-1,29 + 958 601 958 601 958 601 c 1,30,-1 + 766 601 l 1,31,32 + 766 601 766 601 767 629 c 128,-1,33 + 768 657 768 657 768 710 c 0,34,35 + 768 771 768 771 857 841.5 c 128,-1,36 + 946 912 946 912 946 967 c 0,37,38 + 946 1025 946 1025 918 1038.5 c 128,-1,39 + 890 1052 890 1052 847 1052 c 0,40,41 + 778 1052 778 1052 704.5 1013 c 128,-1,42 + 631 974 631 974 587 930 c 1,43,-1 + 587 1106 l 1,44,45 + 631 1148 631 1148 702.5 1183.5 c 128,-1,46 + 774 1219 774 1219 868 1219 c 0,47,48 + 989 1219 989 1219 1074.5 1157 c 128,-1,49 + 1160 1095 1160 1095 1160 982 c 0,24,25 +982 304 m 1,50,-1 + 774 304 l 1,51,-1 + 774 497 l 1,52,-1 + 982 497 l 1,53,-1 + 982 304 l 1,50,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowup +Encoding: 372 8593 349 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 17 + 1 + 4 + 6 + 15 + 3 + 218 + 6 + 2 + 3 + 0 + 2 + 219 + 5 + 3 + 3 + 8 + 7 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[min,rnd,grey] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1266 1040 m 1,0,-1 + 912 1040 l 1,1,-1 + 912 -171 l 1,2,-1 + 624 -171 l 1,3,-1 + 624 1040 l 1,4,-1 + 270 1040 l 1,5,-1 + 768 1536 l 1,6,-1 + 1266 1040 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowdownright +Encoding: 376 8627 350 +Width: 1876 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 30 + 41 + 6 + 1 + 5 + 2 + 1 + 6 + 6 + 4 + 1 + 3 + 4 + 10 + 5 + 2 + 0 + 1 + 1 + 0 + 3 + 4 + 121 + 3 + 140 + 3 + 2 + 3 + 7 + 0 + 8 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,white] +DELTAP1 +RTDG +MDRP[min,grey] +RTG +SRP1 +SRP2 +IP +RTDG +MDAP[rnd] +SRP2 +IP +IP +RTG +SVTCA[y-axis] +MIAP[no-rnd] +MDRP[grey] +MDAP[rnd] +SRP2 +IP +RTDG +MDAP[rnd] +SRP2 +IP +IP +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1710 0 m 1,0,-1 + 1006 0 l 1,1,-1 + 1254 248 l 1,2,-1 + 201 1299 l 1,3,-1 + 409 1507 l 1,4,-1 + 1462 456 l 1,5,-1 + 1710 704 l 1,6,-1 + 1710 0 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowdown +Encoding: 374 8595 351 +Width: 1536 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1267 323 m 1,0,-1 + 769 -173 l 1,1,-1 + 271 323 l 1,2,-1 + 625 323 l 1,3,-1 + 625 1534 l 1,4,-1 + 913 1534 l 1,5,-1 + 913 323 l 1,6,-1 + 1267 323 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: control +Encoding: 3 6 352 +Width: 1558 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 21 + 4 + 2 + 0 + 3 + 5 + 1 + 3 + 5 + 15 + 48 + 0 + 96 + 0 + 2 + 0 + 7 + 47 + 4 + 1 + 4 + 6 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +PUSHB_2 + 4 + 0 +MD[grid] +EVEN +IF +PUSHB_2 + 0 + 64 +SHPIX +EIF +RTG +SVTCA[y-axis] +MIAP[rnd] +MDAP[rnd] +MDRP[rnd,grey] +SRP2 +SLOOP +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1456 852 m 1,0,-1 + 1238 634 l 1,1,-1 + 772 1100 l 1,2,-1 + 306 634 l 1,3,-1 + 88 852 l 1,4,-1 + 772 1536 l 1,5,-1 + 1456 852 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: deleteleft +Encoding: 16 23 353 +Width: 2644 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 99 + 9 + 14 + 9 + 16 + 70 + 8 + 72 + 16 + 84 + 8 + 135 + 10 + 136 + 14 + 136 + 15 + 136 + 16 + 135 + 20 + 135 + 21 + 11 + 10 + 11 + 10 + 13 + 5 + 17 + 5 + 19 + 71 + 17 + 71 + 19 + 85 + 17 + 85 + 19 + 136 + 11 + 136 + 12 + 136 + 13 + 135 + 17 + 135 + 18 + 135 + 19 + 14 + 21 + 18 + 8 + 15 + 21 + 3 + 2 + 2 + 1 + 3 + 7 + 203 + 47 + 3 + 79 + 3 + 95 + 3 + 127 + 3 + 4 + 3 + 15 + 9 + 203 + 1 + 0 + 21 + 15 + 12 + 18 + 8 + 2 + 9 + 7 + 1 + 3 + 18 + 3 + 0 + 2 + 5 + 205 + 0 + 23 + 2 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[grey] +MDRP[grey] +SRP2 +IP +RTHG +MDAP[rnd] +ALIGNRP +MDRP[grey] +MDRP[grey] +RTG +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +RTHG +MDAP[rnd] +SLOOP +ALIGNRP +MDRP[grey] +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2476 0 m 1,0,-1 + 940 0 l 1,1,-1 + 172 768 l 1,2,-1 + 940 1536 l 1,3,-1 + 2476 1536 l 1,4,-1 + 2476 0 l 1,0,-1 +2304 167 m 1,5,-1 + 2304 1369 l 1,6,-1 + 1024 1369 l 1,7,-1 + 423 768 l 1,8,-1 + 1024 167 l 1,9,-1 + 2304 167 l 1,5,-1 +2019 406 m 1,10,-1 + 1898 285 l 1,11,-1 + 1536 647 l 1,12,-1 + 1176 285 l 1,13,-1 + 1055 406 l 1,14,-1 + 1415 768 l 1,15,-1 + 1055 1130 l 1,16,-1 + 1176 1251 l 1,17,-1 + 1536 889 l 1,18,-1 + 1898 1251 l 1,19,-1 + 2019 1130 l 1,20,-1 + 1657 768 l 1,21,-1 + 2019 406 l 1,10,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: deleteright +Encoding: 7 10 354 +Width: 2644 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +172 0 m 1,0,-1 + 172 1536 l 1,1,-1 + 1708 1536 l 1,2,-1 + 2476 768 l 1,3,-1 + 1708 0 l 1,4,-1 + 172 0 l 1,0,-1 +344 167 m 1,5,-1 + 1624 167 l 1,6,-1 + 2225 768 l 1,7,-1 + 1624 1369 l 1,8,-1 + 344 1369 l 1,9,-1 + 344 167 l 1,5,-1 +629 406 m 1,10,-1 + 991 768 l 1,11,-1 + 629 1130 l 1,12,-1 + 750 1251 l 1,13,-1 + 1112 889 l 1,14,-1 + 1472 1251 l 1,15,-1 + 1593 1130 l 1,16,-1 + 1233 768 l 1,17,-1 + 1593 406 l 1,18,-1 + 1472 285 l 1,19,-1 + 1112 647 l 1,20,-1 + 750 285 l 1,21,-1 + 629 406 l 1,10,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: option +Encoding: 4 7 355 +Width: 2328 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 1 + 6 + 200 + 2 + 8 + 10 + 200 + 5 + 0 + 1 + 1 + 9 + 6 + 5 + 10 + 5 + 4 + 7 + 0 + 4 + 13 + 7 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2188 1204 m 1,0,-1 + 1334 1204 l 1,1,-1 + 1334 1476 l 1,2,-1 + 2188 1476 l 1,3,-1 + 2188 1204 l 1,0,-1 +2188 0 m 1,4,-1 + 1375 0 l 1,5,-1 + 695 1204 l 1,6,-1 + 140 1204 l 1,7,-1 + 140 1476 l 1,8,-1 + 845 1476 l 1,9,-1 + 1525 272 l 1,10,-1 + 2188 272 l 1,11,-1 + 2188 0 l 1,4,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: escape +Encoding: 20 27 356 +AltUni2: 00241b.ffffffff.0 00241b.ffffffff.0 +Width: 1876 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 77 + 8 + 5 + 6 + 25 + 40 + 5 + 51 + 1 + 56 + 3 + 72 + 3 + 88 + 3 + 105 + 3 + 120 + 5 + 136 + 5 + 152 + 3 + 11 + 6 + 2 + 3 + 3 + 0 + 4 + 1 + 1 + 13 + 48 + 13 + 2 + 13 + 1 + 13 + 10 + 24 + 54 + 17 + 1 + 17 + 223 + 10 + 23 + 223 + 4 + 24 + 15 + 1 + 6 + 2 + 5 + 5 + 4 + 0 + 24 + 0 + 24 + 7 + 13 + 57 + 20 + 1 + 20 + 223 + 7 + 14 + 223 + 4 + 144 + 13 + 1 + 13 + 27 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDAP[rnd] +SRP2 +IP +MDAP[rnd] +IP +IP +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP1 +SRP2 +IP +IP +MDAP[rnd] +DELTAP1 +MDAP[rnd] +SRP2 +IP +IP +MDAP[rnd] +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1029 857 m 1,0,-1 + 849 677 l 1,1,-1 + 382 1144 l 1,2,-1 + 172 932 l 1,3,-1 + 172 1536 l 1,4,-1 + 774 1536 l 1,5,-1 + 562 1324 l 1,6,-1 + 1029 857 l 1,0,-1 +1708 768 m 0,7,8 + 1708 453 1708 453 1485.5 226.5 c 128,-1,9 + 1263 0 1263 0 940 0 c 0,10,11 + 637 0 637 0 414 203.5 c 128,-1,12 + 191 407 191 407 172 768 c 1,13,-1 + 402 768 l 1,14,15 + 415 512 415 512 574 371 c 128,-1,16 + 733 230 733 230 940 230 c 0,17,18 + 1153 230 1153 230 1314.5 379.5 c 128,-1,19 + 1476 529 1476 529 1476 768 c 0,20,21 + 1476 979 1476 979 1333 1135.5 c 128,-1,22 + 1190 1292 1190 1292 940 1305 c 1,23,-1 + 940 1536 l 1,24,25 + 1300 1526 1300 1526 1504 1288 c 128,-1,26 + 1708 1050 1708 1050 1708 768 c 0,7,8 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph357 +Encoding: 426 -1 357 +Width: 2220 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 64 + 55 + 4 + 71 + 4 + 87 + 4 + 103 + 4 + 119 + 4 + 135 + 4 + 151 + 4 + 166 + 4 + 8 + 39 + 4 + 55 + 4 + 71 + 4 + 86 + 4 + 118 + 4 + 134 + 4 + 6 + 0 + 7 + 98 + 1 + 8 + 98 + 0 + 0 + 1 + 4 + 2 + 6 + 3 + 2 + 200 + 5 + 6 + 8 + 200 + 10 + 10 + 7 + 1 + 8 + 10 + 4 + 0 + 4 + 0 + 12 + 2 + 6 + 4 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +DELTAP1 +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2147 1416 m 1,0,-1 + 1343 382 l 1,1,-1 + 628 382 l 1,2,-1 + 628 22 l 1,3,-1 + 132 516 l 1,4,-1 + 628 1014 l 1,5,-1 + 628 654 l 1,6,-1 + 1229 654 l 1,7,-1 + 1604 1152 l 1,8,-1 + 1062 1152 l 1,9,-1 + 1062 1416 l 1,10,-1 + 2147 1416 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph358 +Encoding: 427 -1 358 +Width: 2220 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +99 1416 m 1,0,-1 + 1184 1416 l 1,1,-1 + 1184 1152 l 1,2,-1 + 642 1152 l 1,3,-1 + 1017 654 l 1,4,-1 + 1618 654 l 1,5,-1 + 1618 1014 l 1,6,-1 + 2114 516 l 1,7,-1 + 1618 22 l 1,8,-1 + 1618 382 l 1,9,-1 + 903 382 l 1,10,-1 + 99 1416 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: apple +Encoding: 15 20 359 +Width: 1810 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 44 + 22 + 30 + 56 + 18 + 69 + 19 + 70 + 30 + 4 + 15 + 48 + 54 + 48 + 87 + 48 + 2 + 15 + 48 + 27 + 36 + 12 + 9 + 39 + 42 + 36 + 24 + 21 + 27 + 1 + 0 + 9 + 9 + 54 + 33 + 54 + 48 + 15 + 86 + 33 + 102 + 33 + 2 + 33 + 57 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IP +DELTAP1 +RTHG +MDAP[rnd] +MDAP[rnd] +RTG +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1217 1642 m 0,0,1 + 1217 1579 1217 1579 1187 1503 c 128,-1,2 + 1157 1427 1157 1427 1092 1362 c 0,3,4 + 1065 1335 1065 1335 1037.5 1316.5 c 128,-1,5 + 1010 1298 1010 1298 981 1288 c 0,6,7 + 965 1282 965 1282 938 1278 c 128,-1,8 + 911 1274 911 1274 874 1272 c 1,9,10 + 877 1423 877 1423 954.5 1535 c 128,-1,11 + 1032 1647 1032 1647 1210 1688 c 1,12,13 + 1214 1673 1214 1673 1215.5 1664 c 128,-1,14 + 1217 1655 1217 1655 1217 1642 c 0,0,1 +1604 440 m 1,15,16 + 1585 379 1585 379 1552.5 314.5 c 128,-1,17 + 1520 250 1520 250 1477 184 c 0,18,19 + 1411 82 1411 82 1344.5 33 c 128,-1,20 + 1278 -16 1278 -16 1212 -16 c 0,21,22 + 1161 -16 1161 -16 1070 16.5 c 128,-1,23 + 979 49 979 49 915 49 c 0,24,25 + 852 49 852 49 769 14.5 c 128,-1,26 + 686 -20 686 -20 633 -20 c 0,27,28 + 555 -20 555 -20 478 46.5 c 128,-1,29 + 401 113 401 113 326 246 c 0,30,31 + 250 377 250 377 212 506 c 128,-1,32 + 174 635 174 635 174 762 c 0,33,34 + 174 997 174 997 290 1144.5 c 128,-1,35 + 406 1292 406 1292 582 1292 c 0,36,37 + 657 1292 657 1292 762.5 1261.5 c 128,-1,38 + 868 1231 868 1231 905 1231 c 0,39,40 + 950 1231 950 1231 1051.5 1265.5 c 128,-1,41 + 1153 1300 1153 1300 1229 1300 c 0,42,43 + 1290 1300 1290 1300 1344.5 1284 c 128,-1,44 + 1399 1268 1399 1268 1446 1235 c 0,45,46 + 1470 1217 1470 1217 1499 1190 c 128,-1,47 + 1528 1163 1528 1163 1554 1130 c 1,48,49 + 1513 1098 1513 1098 1484.5 1066 c 128,-1,50 + 1456 1034 1456 1034 1438 1010 c 0,51,52 + 1405 963 1405 963 1387.5 909.5 c 128,-1,53 + 1370 856 1370 856 1370 799 c 0,54,55 + 1370 672 1370 672 1441.5 569.5 c 128,-1,56 + 1513 467 1513 467 1604 440 c 1,15,16 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph360 +Encoding: 428 -1 360 +Width: 1708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 89 + 27 + 15 + 85 + 16 + 121 + 6 + 136 + 6 + 152 + 6 + 168 + 6 + 6 + 20 + 17 + 17 + 15 + 18 + 15 + 18 + 15 + 13 + 4 + 5 + 217 + 10 + 10 + 1 + 2 + 6 + 11 + 225 + 3 + 13 + 225 + 1 + 3 + 8 + 6 + 24 + 6 + 40 + 6 + 56 + 6 + 88 + 6 + 5 + 6 + 217 + 10 + 14 + 32 + 20 + 48 + 20 + 2 + 20 + 15 + 16 + 15 + 17 + 31 + 17 + 47 + 17 + 63 + 17 + 4 + 17 + 4 + 15 + 20 + 15 + 2 + 15 + 10 + 15 + 0 + 1 + 5 + 8 + 225 + 0 + 22 + 13 + 225 + 1 + 21 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +RTHG +MDAP[rnd] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +RTG +MDRP[rp0,min,rnd,grey] +RTHG +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +RTG +MDRP[rp0,min,rnd,grey] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[min,rnd,black] +SHP[rp2] +SRP2 +IP +IP +MDAP[rnd] +MDAP[rnd] +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1586 -50 m 1,0,-1 + 122 -50 l 1,1,-1 + 122 1586 l 1,2,-1 + 1110 1586 l 1,3,-1 + 1586 1108 l 1,4,-1 + 1586 -50 l 1,0,-1 +1300 1108 m 1,5,-1 + 1024 1384 l 1,6,-1 + 1024 1108 l 1,7,-1 + 1300 1108 l 1,5,-1 +1366 170 m 1,8,-1 + 1366 915 l 1,9,-1 + 819 915 l 1,10,-1 + 819 1364 l 1,11,-1 + 342 1364 l 1,12,-1 + 342 170 l 1,13,-1 + 1366 170 l 1,8,-1 +1216 599 m 1,14,-1 + 854 239 l 1,15,-1 + 492 599 l 1,16,-1 + 664 599 l 1,17,-1 + 664 771 l 1,18,-1 + 1044 771 l 1,19,-1 + 1044 599 l 1,20,-1 + 1216 599 l 1,14,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: pagedown +Encoding: 378 8671 361 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 32 + 55 + 22 + 71 + 22 + 87 + 22 + 103 + 22 + 119 + 22 + 135 + 22 + 151 + 22 + 7 + 39 + 22 + 54 + 22 + 71 + 22 + 86 + 22 + 103 + 22 + 119 + 22 + 134 + 22 + 151 + 22 + 8 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 337 8670 N 1 0 0 -1 0 1325 2 +Validated: 25 +EndChar + +StartChar: checkmark +Encoding: 13 18 362 +Width: 1886 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 138 + 0 + 185 + 5 + 2 + 52 + 4 + 1 + 4 + 200 + 3 + 4 + 1 + 50 + 5 + 134 + 5 + 2 + 5 + 200 + 183 + 0 + 1 + 0 + 0 + 1 + 4 + 200 + 1 + 7 + 3 + 1 + 3 + 200 + 2 + 2 + 1 + 3 + 2 + 4 + 0 + 4 + 1 + 5 + 1 + 0 + 5 + 0 + 3 + 2 + 1 + 4 + 4 + 0 + 2 + 0 + 7 + 2 + 6 +SRP0 +MDRP[rp0,rnd,white] +SRP0 +MDRP[rp0,rnd,white] +SRP1 +SRP2 +IP +RTHG +MDAP[rnd] +ALIGNRP +RTG +SRP2 +IP +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MDAP[rnd] +SRP2 +SLOOP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1792 1196 m 1,0,-1 + 596 0 l 1,1,-1 + 84 512 l 1,2,-1 + 279 707 l 1,3,-1 + 596 394 l 1,4,-1 + 1596 1389 l 1,5,-1 + 1792 1196 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph363 +Encoding: 429 -1 363 +Width: 2220 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 44 + 7 + 5 + 9 + 9 + 0 + 8 + 176 + 8 + 2 + 8 + 17 + 200 + 5 + 6 + 16 + 12 + 1 + 200 + 13 + 2 + 0 + 15 + 32 + 15 + 2 + 15 + 15 + 7 + 16 + 7 + 5 + 9 + 0 + 0 + 4 + 16 + 12 + 10 + 226 + 4 + 20 + 1 + 16 + 19 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDAP[rnd] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1115 1214 m 1,0,-1 + 91 1214 l 1,1,-1 + 91 1476 l 1,2,-1 + 1115 1476 l 1,3,-1 + 1115 1214 l 1,0,-1 +2050 385 m 1,4,-1 + 1119 385 l 1,5,-1 + 1119 26 l 1,6,-1 + 632 516 l 1,7,-1 + 1119 1006 l 1,8,-1 + 1119 647 l 1,9,-1 + 1800 647 l 1,10,-1 + 1800 1214 l 1,11,-1 + 1456 1214 l 1,12,-1 + 1456 1476 l 1,13,-1 + 2050 1476 l 1,14,-1 + 2050 385 l 1,4,-1 +517 385 m 1,15,-1 + 91 385 l 1,16,-1 + 91 647 l 1,17,-1 + 517 647 l 1,18,-1 + 517 385 l 1,15,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph364 +Encoding: 430 -1 364 +Width: 2220 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 17 + 56 + 7 + 72 + 7 + 88 + 7 + 105 + 7 + 120 + 7 + 136 + 7 + 152 + 7 + 168 + 7 + 8 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +Refer: 363 -1 N -1 0 0 1 2221 0 2 +Validated: 25 +EndChar + +StartChar: glyph365 +Encoding: 431 -1 365 +Width: 1364 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 3 + 224 + 4 + 1 + 9 + 10 + 7 + 0 + 9 + 223 + 1 + 0 + 12 + 8 + 223 + 4 + 5 + 12 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,rnd,white] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1366 -241 m 1,0,-1 + 1196 -241 l 1,1,-1 + 1196 -485 l 1,2,-1 + 172 -485 l 1,3,-1 + 172 -241 l 1,4,-1 + 0 -241 l 1,5,-1 + 0 0 l 1,6,-1 + 398 0 l 1,7,-1 + 398 -241 l 1,8,-1 + 970 -241 l 1,9,-1 + 970 0 l 1,10,-1 + 1366 0 l 1,11,-1 + 1366 -241 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: blackdiamond +Encoding: 14 19 366 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 1 + 222 + 3 + 222 + 0 + 2 + 0 + 222 + 2 + 222 + 1 + 3 +RTHG +MDAP[rnd] +ALIGNRP +MIRP[rnd,grey] +MIRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +ALIGNRP +MIRP[rnd,grey] +MIRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1366 596 m 1,0,-1 + 768 0 l 1,1,-1 + 172 596 l 1,2,-1 + 768 1196 l 1,3,-1 + 1366 596 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE12E +Encoding: 432 57646 367 +Width: 1836 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 99 + 5 + 8 + 22 + 8 + 20 + 52 + 20 + 56 + 37 + 16 + 37 + 17 + 41 + 20 + 42 + 26 + 36 + 55 + 37 + 56 + 58 + 16 + 73 + 37 + 70 + 55 + 85 + 17 + 84 + 55 + 118 + 34 + 16 + 0 + 3 + 30 + 42 + 36 + 6 + 4 + 15 + 21 + 48 + 204 + 38 + 24 + 1 + 24 + 21 + 45 + 51 + 204 + 3 + 27 + 21 + 55 + 60 + 1 + 60 + 204 + 12 + 15 + 63 + 57 + 204 + 9 + 15 + 1 + 0 + 3 + 3 + 33 + 18 + 36 + 205 + 7 + 6 + 1 + 6 + 42 + 205 + 30 + 39 + 205 + 73 + 33 + 103 + 33 + 2 + 33 + 30 + 6 + 102 + 54 + 1 + 54 + 205 + 18 + 66 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,grey] +SRP0 +DELTAP1 +MIRP[rp0,min,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +SRP0 +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1250.87011719 1690.28027344 m 1,0,1 + 1264.63964844 1529.89941406 1264.63964844 1529.89941406 1155.29003906 1399.48925781 c 128,-1,2 + 1045.93945312 1269.08007812 1045.93945312 1269.08007812 894.469726562 1275.56054688 c 1,3,4 + 883.129882812 1428.64941406 883.129882812 1428.64941406 986 1548.53027344 c 128,-1,5 + 1088.87011719 1668.41015625 1088.87011719 1668.41015625 1250.87011719 1690.28027344 c 1,0,1 +1642.09960938 435.58984375 m 1,6,7 + 1574.87011719 250.91015625 1574.87011719 250.91015625 1456.20507812 113.614257812 c 128,-1,8 + 1337.54003906 -23.6806640625 1337.54003906 -23.6806640625 1237.09960938 -23.6806640625 c 0,9,10 + 1187.68945312 -23.6806640625 1187.68945312 -23.6806640625 1091.70507812 13.1748046875 c 128,-1,11 + 995.719726562 50.0302734375 995.719726562 50.0302734375 936.58984375 50.0302734375 c 0,12,13 + 878.26953125 50.0302734375 878.26953125 50.0302734375 782.28515625 13.1748046875 c 128,-1,14 + 686.299804688 -23.6806640625 686.299804688 -23.6806640625 636.889648438 -23.6806640625 c 0,15,16 + 488.66015625 -23.6806640625 488.66015625 -23.6806640625 328.280273438 235.51953125 c 128,-1,17 + 167.900390625 494.719726562 167.900390625 494.719726562 167.900390625 781.459960938 c 0,18,19 + 167.900390625 1000.96972656 167.900390625 1000.96972656 295.474609375 1149.20019531 c 128,-1,20 + 423.049804688 1297.4296875 423.049804688 1297.4296875 624.739257812 1297.4296875 c 0,21,22 + 718.700195312 1297.4296875 718.700195312 1297.4296875 798.485351562 1260.16992188 c 128,-1,23 + 878.26953125 1222.91015625 878.26953125 1222.91015625 936.58984375 1222.91015625 c 0,24,25 + 970.610351562 1222.91015625 970.610351562 1222.91015625 1065.37988281 1260.16992188 c 128,-1,26 + 1160.15039062 1297.4296875 1160.15039062 1297.4296875 1249.25 1297.4296875 c 0,27,28 + 1358.59960938 1297.4296875 1358.59960938 1297.4296875 1448.10546875 1251.25976562 c 128,-1,29 + 1537.61035156 1205.08984375 1537.61035156 1205.08984375 1598.36035156 1124.89941406 c 1,30,31 + 1496.29980469 1062.53027344 1496.29980469 1062.53027344 1450.53515625 971.810546875 c 128,-1,32 + 1404.76953125 881.08984375 1404.76953125 881.08984375 1404.76953125 781.459960938 c 0,33,34 + 1404.76953125 667.25 1404.76953125 667.25 1478.88574219 572.075195312 c 128,-1,35 + 1553 476.899414062 1553 476.899414062 1642.09960938 435.58984375 c 1,6,7 +1468.76074219 379.700195312 m 1,36,37 + 1377.23046875 444.5 1377.23046875 444.5 1320.93554688 559.924804688 c 128,-1,38 + 1264.63964844 675.349609375 1264.63964844 675.349609375 1264.63964844 781.459960938 c 0,39,40 + 1264.63964844 900.530273438 1264.63964844 900.530273438 1300.28027344 983.5546875 c 128,-1,41 + 1335.91992188 1066.58007812 1335.91992188 1066.58007812 1384.51953125 1127.33007812 c 1,42,43 + 1355.36035156 1141.91015625 1355.36035156 1141.91015625 1320.53027344 1149.60546875 c 128,-1,44 + 1285.70019531 1157.29980469 1285.70019531 1157.29980469 1247.62988281 1157.29980469 c 0,45,46 + 1172.29980469 1157.29980469 1172.29980469 1157.29980469 1080.36425781 1120.0390625 c 128,-1,47 + 988.4296875 1082.78027344 988.4296875 1082.78027344 936.58984375 1082.78027344 c 0,48,49 + 856.400390625 1082.78027344 856.400390625 1082.78027344 778.639648438 1120.0390625 c 128,-1,50 + 700.879882812 1157.29980469 700.879882812 1157.29980469 625.549804688 1157.29980469 c 0,51,52 + 473.26953125 1157.29980469 473.26953125 1157.29980469 389.83984375 1049.1640625 c 128,-1,53 + 306.41015625 941.030273438 306.41015625 941.030273438 306.41015625 781.459960938 c 0,54,55 + 306.41015625 530.360351562 306.41015625 530.360351562 438.439453125 322.594726562 c 128,-1,56 + 570.469726562 114.830078125 570.469726562 114.830078125 635.26953125 114.830078125 c 0,57,58 + 669.290039062 114.830078125 669.290039062 114.830078125 757.174804688 151.280273438 c 128,-1,59 + 845.060546875 187.73046875 845.060546875 187.73046875 936.58984375 187.73046875 c 0,60,61 + 1028.9296875 187.73046875 1028.9296875 187.73046875 1116.41015625 151.280273438 c 128,-1,62 + 1203.88964844 114.830078125 1203.88964844 114.830078125 1237.91015625 114.830078125 c 0,63,64 + 1274.36035156 114.830078125 1274.36035156 114.830078125 1344.01953125 194.614257812 c 128,-1,65 + 1413.6796875 274.399414062 1413.6796875 274.399414062 1468.76074219 379.700195312 c 1,36,37 +EndSplineSet +Validated: 33 +EndChar + +StartChar: carriagereturn +Encoding: 8 11 368 +AltUni2: 00240d.ffffffff.0 00240d.ffffffff.0 +Width: 2388 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 23 + 21 + 55 + 7 + 71 + 7 + 86 + 7 + 103 + 7 + 119 + 7 + 135 + 7 + 151 + 7 + 8 + 39 + 6 + 55 + 6 + 71 + 6 + 134 + 6 + 150 + 6 + 5 + 6 + 4 + 8 + 5 + 4 + 200 + 7 + 8 + 17 + 200 + 18 + 17 + 12 + 219 + 0 + 24 + 8 + 4 + 6 + 23 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MDAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2182 726 m 2,0,1 + 2182 587 2182 587 2081.5 481.5 c 128,-1,2 + 1981 376 1981 376 1838 376 c 2,3,-1 + 630 376 l 1,4,-1 + 630 16 l 1,5,-1 + 134 510 l 1,6,-1 + 630 1008 l 1,7,-1 + 630 648 l 1,8,-1 + 1722 648 l 2,9,10 + 1792 648 1792 648 1842 692 c 128,-1,11 + 1892 736 1892 736 1892 806 c 2,12,-1 + 1892 1030 l 2,13,14 + 1892 1100 1892 1100 1842 1139 c 128,-1,15 + 1792 1178 1792 1178 1722 1178 c 2,16,-1 + 1408 1178 l 1,17,-1 + 1408 1450 l 1,18,-1 + 1840 1450 l 2,19,20 + 1981 1450 1981 1450 2081.5 1349.5 c 128,-1,21 + 2182 1249 2182 1249 2182 1110 c 2,22,-1 + 2182 726 l 2,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowdashleft +Encoding: 17 24 369 +AltUni2: 0021e0.ffffffff.0 0021e0.ffffffff.0 +Width: 2048 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 10 + 1 + 5 + 9 + 219 + 12 + 2 + 6 + 13 + 220 + 4 + 15 + 1 + 1 + 1 + 0 + 16 + 5 + 8 + 13 + 9 + 11 + 15 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,white] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1899 624 m 1,0,-1 + 1559 624 l 1,1,-1 + 1559 912 l 1,2,-1 + 1899 912 l 1,3,-1 + 1899 624 l 1,0,-1 +1387 624 m 1,4,-1 + 1047 624 l 1,5,-1 + 1047 912 l 1,6,-1 + 1387 912 l 1,7,-1 + 1387 624 l 1,4,-1 +875 624 m 1,8,-1 + 619 624 l 1,9,-1 + 619 270 l 1,10,-1 + 121 768 l 1,11,-1 + 619 1266 l 1,12,-1 + 619 912 l 1,13,-1 + 875 912 l 1,14,-1 + 875 624 l 1,8,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowdashup +Encoding: 18 25 370 +AltUni2: 0021e1.ffffffff.0 0021e1.ffffffff.0 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 26 + 8 + 0 + 13 + 1 + 13 + 12 + 9 + 3 + 1 + 4 + 6 + 6 + 1 + 4 + 0 + 14 + 10 + 1 + 219 + 5 + 13 + 9 + 4 + 4 + 16 + 15 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,white] +MDAP[rnd] +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,white] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1267 1168 m 1,0,-1 + 913 1168 l 1,1,-1 + 913 912 l 1,2,-1 + 625 912 l 1,3,-1 + 625 1168 l 1,4,-1 + 271 1168 l 1,5,-1 + 769 1666 l 1,6,-1 + 1267 1168 l 1,0,-1 +913 400 m 1,7,-1 + 625 400 l 1,8,-1 + 625 740 l 1,9,-1 + 913 740 l 1,10,-1 + 913 400 l 1,7,-1 +913 -112 m 1,11,-1 + 625 -112 l 1,12,-1 + 625 228 l 1,13,-1 + 913 228 l 1,14,-1 + 913 -112 l 1,11,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowdashright +Encoding: 19 26 371 +AltUni2: 0021e2.ffffffff.0 0021e2.ffffffff.0 +Width: 2048 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +159 624 m 1,0,-1 + 159 912 l 1,1,-1 + 499 912 l 1,2,-1 + 499 624 l 1,3,-1 + 159 624 l 1,0,-1 +671 624 m 1,4,-1 + 671 912 l 1,5,-1 + 1011 912 l 1,6,-1 + 1011 624 l 1,7,-1 + 671 624 l 1,4,-1 +1183 624 m 1,8,-1 + 1183 912 l 1,9,-1 + 1439 912 l 1,10,-1 + 1439 1266 l 1,11,-1 + 1937 768 l 1,12,-1 + 1439 270 l 1,13,-1 + 1439 624 l 1,14,-1 + 1183 624 l 1,8,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: arrowdashdown +Encoding: 11 16 372 +AltUni2: 0021e3.ffffffff.0 0021e3.ffffffff.0 +Width: 1536 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1267 256 m 1,0,-1 + 769 -242 l 1,1,-1 + 271 256 l 1,2,-1 + 625 256 l 1,3,-1 + 625 512 l 1,4,-1 + 913 512 l 1,5,-1 + 913 256 l 1,6,-1 + 1267 256 l 1,0,-1 +913 1024 m 1,7,-1 + 913 684 l 1,8,-1 + 625 684 l 1,9,-1 + 625 1024 l 1,10,-1 + 913 1024 l 1,7,-1 +913 1536 m 1,11,-1 + 913 1196 l 1,12,-1 + 625 1196 l 1,13,-1 + 625 1536 l 1,14,-1 + 913 1536 l 1,11,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph373 +Encoding: 433 -1 373 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 5 + 36 + 1 + 1 + 1 + 1 + 4 + 3 + 3 + 2 + 0 + 0 + 2 + 15 + 38 + 5 + 1 + 5 + 3 + 1 + 3 + 0 + 7 + 1 + 6 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SRP2 +SLOOP +IP +RTHG +MDAP[rnd] +DELTAP1 +ALIGNRP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1386 0 m 1,0,-1 + 152 768 l 1,1,-1 + 1386 1536 l 1,2,-1 + 1386 0 l 1,0,-1 +1196 353 m 1,3,-1 + 1196 1183 l 1,4,-1 + 527 768 l 1,5,-1 + 1196 353 l 1,3,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: foursuperior +Encoding: 364 8308 374 +Width: 915 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 39 + 6 + 9 + 13 + 110 + 1 + 4 + 4 + 3 + 137 + 12 + 1 + 9 + 12 + 29 + 12 + 121 + 12 + 3 + 12 + 7 + 14 + 3 + 81 + 0 + 9 + 2 + 99 + 7 + 12 + 3 + 13 + 6 + 6 + 22 + 6 + 2 + 6 + 5 + 14 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +DELTAP1 +MDRP[grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[grey] +DELTAP1 +DELTAP2 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +852 840 m 1,0,-1 + 696 840 l 1,1,-1 + 696 590 l 1,2,-1 + 479 590 l 1,3,-1 + 479 840 l 1,4,-1 + 31 840 l 1,5,-1 + 31 1026 l 1,6,-1 + 547 1538 l 1,7,-1 + 696 1538 l 1,8,-1 + 696 1030 l 1,9,-1 + 852 1030 l 1,10,-1 + 852 840 l 1,0,-1 +479 1030 m 1,11,-1 + 479 1268 l 1,12,-1 + 238 1030 l 1,13,-1 + 479 1030 l 1,11,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph375 +Encoding: 434 -1 375 +Width: 730 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 61 + 0 + 1 + 0 + 2 + 1 + 63 + 3 + 1 + 3 + 61 + 1 + 1 + 1 + 63 + 0 + 1 + 0 + 1 +MDAP[rnd] +MDAP[rnd] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MDAP[rnd] +DELTAP1 +SRP2 +IP +IP +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +721 823 m 1,0,-1 + 4 401 l 1,1,-1 + 4 602 l 1,2,-1 + 721 1026 l 1,3,-1 + 721 823 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph376 +Encoding: 435 -1 376 +Width: 631 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 0 + 2 + 1 + 3 + 1 + 47 + 0 + 1 + 0 + 1 +MDAP[rnd] +MDAP[rnd] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MDAP[rnd] +SRP2 +IP +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +635 805 m 1,0,-1 + 29 346 l 1,1,-1 + 29 526 l 1,2,-1 + 635 987 l 1,3,-1 + 635 805 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph377 +Encoding: 436 -1 377 +Width: 735 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 13 + 1 + 31 + 2 + 47 + 0 + 1 + 0 + 207 + 1 + 1 + 1 + 71 + 4 +SRP0 +SROUND +MDRP[rp0,rnd,white] +RTG +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +663 648 m 1,0,-1 + 60 648 l 1,1,-1 + 60 861 l 1,2,-1 + 663 861 l 1,3,-1 + 663 648 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph378 +Encoding: 437 -1 378 +Width: 1389 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 52 + 7 + 36 + 12 + 53 + 12 + 2 + 64 + 12 + 96 + 15 + 15 + 9 + 95 + 9 + 111 + 9 + 223 + 9 + 4 + 9 + 15 + 1 + 31 + 1 + 2 + 1 + 4 + 10 + 71 + 15 + 87 + 15 + 103 + 15 + 3 + 15 + 12 + 0 + 32 + 17 + 1 + 17 + 1 + 9 + 11 + 12 + 8 + 47 + 9 + 1 + 9 + 18 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[grey] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +MDAP[rnd] +DELTAP1 +SRP0 +SMD +MDRP[rp0,min,grey] +SMD +DELTAP1 +MDRP[min,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1341 776 m 1,0,-1 + 1087 776 l 1,1,2 + 1085 834 1085 834 1067 864.5 c 128,-1,3 + 1049 895 1049 895 1004 895 c 0,4,5 + 967 895 967 895 940 876.5 c 128,-1,6 + 913 858 913 858 899 829 c 1,7,-1 + 899 324 l 1,8,-1 + 621 324 l 1,9,-1 + 621 1126 l 1,10,-1 + 887 1126 l 1,11,-1 + 893 975 l 1,12,13 + 930 1071 930 1071 990.5 1110 c 128,-1,14 + 1051 1149 1051 1149 1147 1149 c 0,15,16 + 1264 1149 1264 1149 1315 1053.5 c 128,-1,17 + 1366 958 1366 958 1341 776 c 1,0,-1 +EndSplineSet +Validated: 33 +EndChar + +StartChar: contextmenu +Encoding: 438 -1 379 +Width: 1881 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 147 + 25 + 22 + 25 + 23 + 39 + 11 + 70 + 10 + 85 + 8 + 82 + 10 + 84 + 28 + 117 + 8 + 8 + 103 + 4 + 121 + 11 + 2 + 10 + 7 + 10 + 11 + 4 + 28 + 6 + 29 + 59 + 27 + 58 + 30 + 6 + 27 + 30 + 9 + 8 + 6 + 5 + 6 + 25 + 1 + 57 + 24 + 1 + 21 + 24 + 20 + 3 + 26 + 48 + 25 + 1 + 25 + 25 + 23 + 32 + 26 + 57 + 26 + 2 + 26 + 13 + 16 + 204 + 19 + 15 + 73 + 121 + 28 + 1 + 11 + 7 + 4 + 15 + 28 + 29 + 10 + 26 + 8 + 2 + 23 + 1 + 2 + 9 + 8 + 6 + 5 + 30 + 27 + 6 + 13 + 16 + 28 + 29 + 4 + 7 + 10 + 11 + 6 + 12 + 17 + 61 + 21 + 63 + 22 + 63 + 23 + 61 + 24 + 4 + 24 + 21 + 23 + 22 + 4 + 20 + 26 + 20 + 26 + 0 + 205 + 1 + 16 + 26 + 1 + 26 + 26 + 12 + 17 + 13 + 15 + 12 + 31 + 12 + 47 + 12 + 159 + 12 + 4 + 12 + 32 + 16 + 17 + 31 +SRP0 +MDRP[rp0,rnd,white] +MDRP[min,rnd,black] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[grey] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rp0,min,rnd,grey] +MDAP[rnd] +SRP2 +SLOOP +IP +DELTAP1 +SROUND +MDAP[rnd] +RTG +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDAP[rnd] +DELTAP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +SRP2 +SLOOP +IP +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1026 1170 m 1,0,-1 + 855 1170 l 1,1,-1 + 855 1476 l 1,2,-1 + 1026 1476 l 1,3,-1 + 1026 1170 l 1,0,-1 +1546 1246 m 1,4,-1 + 1304 1003 l 1,5,-1 + 1183 1124 l 1,6,-1 + 1426 1366 l 1,7,-1 + 1546 1246 l 1,4,-1 +715 1107 m 1,8,-1 + 594 986 l 1,9,-1 + 379 1201 l 1,10,-1 + 500 1322 l 1,11,-1 + 715 1107 l 1,8,-1 +1710 681 m 1,12,-1 + 1368 681 l 1,13,-1 + 1368 852 l 1,14,-1 + 1710 852 l 1,15,-1 + 1710 681 l 1,12,-1 +513 681 m 1,16,-1 + 171 681 l 1,17,-1 + 171 852 l 1,18,-1 + 513 852 l 1,19,-1 + 513 681 l 1,16,-1 +1347 519 m 1,20,-1 + 1180 450 l 1,21,-1 + 1344 57 l 1,22,-1 + 1186 -8 l 1,23,-1 + 1023 386 l 1,24,-1 + 856 317 l 1,25,-1 + 855 1013 l 1,26,-1 + 1347 519 l 1,20,-1 +700 399 m 1,27,-1 + 457 157 l 1,28,-1 + 337 277 l 1,29,-1 + 580 520 l 1,30,-1 + 700 399 l 1,27,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: power +Encoding: 439 -1 380 +Width: 1704 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 45 + 14 + 34 + 16 + 34 + 20 + 45 + 22 + 4 + 25 + 26 + 25 + 26 + 3 + 9 + 21 + 201 + 3 + 211 + 15 + 201 + 9 + 24 + 25 + 25 + 0 + 6 + 12 + 201 + 0 + 211 + 18 + 201 + 48 + 6 + 1 + 6 + 28 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1717 765 m 256,0,1 + 1717 415 1717 415 1469.5 167.5 c 128,-1,2 + 1222 -80 1222 -80 872 -80 c 256,3,4 + 522 -80 522 -80 274.5 167.5 c 128,-1,5 + 27 415 27 415 27 765 c 256,6,7 + 27 1115 27 1115 274.5 1362.5 c 128,-1,8 + 522 1610 522 1610 872 1610 c 256,9,10 + 1222 1610 1222 1610 1469.5 1362.5 c 128,-1,11 + 1717 1115 1717 1115 1717 765 c 256,0,1 +1505 765 m 0,12,13 + 1505 1030 1505 1030 1319 1217 c 128,-1,14 + 1133 1404 1133 1404 872 1404 c 0,15,16 + 603 1404 603 1404 421 1219 c 128,-1,17 + 239 1034 239 1034 239 765 c 0,18,19 + 239 497 239 497 421 312 c 128,-1,20 + 603 127 603 127 872 127 c 0,21,22 + 1149 127 1149 127 1327 310.5 c 128,-1,23 + 1505 494 1505 494 1505 765 c 0,12,13 +992 358 m 1,24,-1 + 752 358 l 1,25,-1 + 752 1172 l 1,26,-1 + 992 1172 l 1,27,-1 + 992 358 l 1,24,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph381 +Encoding: 440 -1 381 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 35 + 51 + 0 + 1 + 0 + 100 + 63 + 3 + 1 + 3 + 54 + 1 + 1 + 1 + 100 + 2 + 2 + 3 + 0 + 3 + 1 + 56 + 2 + 1 + 2 + 4 + 2 + 63 + 1 + 1 + 1 + 0 + 48 + 3 + 1 + 3 +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MDRP[grey] +MDAP[rnd] +DELTAP1 +MDRP[grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,black] +DELTAP1 +SRP0 +DELTAP1 +MIRP[rp0,min,black] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1341 1569 m 1,0,-1 + 281 -168 l 1,1,-1 + 117 -45 l 1,2,-1 + 1165 1669 l 1,3,-1 + 1341 1569 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph382 +Encoding: 441 -1 382 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 30 + 7 + 0 + 22 + 0 + 2 + 0 + 118 + 8 + 3 + 50 + 3 + 2 + 3 + 55 + 1 + 1 + 1 + 118 + 2 + 2 + 3 + 0 + 3 + 1 + 2 + 4 + 2 + 1 + 0 + 3 +SVTCA[y-axis] +MDAP[rnd] +MDRP[grey] +MDAP[rnd] +MDRP[grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,black] +DELTAP1 +SRP0 +DELTAP1 +MIRP[rp0,min,black] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1235 1239 m 1,0,-1 + 252 -135 l 1,1,-1 + 141 -45 l 1,2,-1 + 1126 1323 l 1,3,-1 + 1235 1239 l 1,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: glyph383 +Encoding: 442 -1 383 +Width: 0 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +24 2048 m 1,0,-1 + 24 -512 l 1,1,-1 + 24 0 l 1,2,-1 + 1048 0 l 1,3,-1 + -1000 0 l 1,4,-1 + 24 2048 l 1,0,-1 +EndSplineSet +Validated: 5 +EndChar + +StartChar: Ccircumflex +Encoding: 222 264 384 +Width: 1190 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 38 67 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 81 309 2 +Validated: 1 +EndChar + +StartChar: ccircumflex +Encoding: 223 265 385 +Width: 1124 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 70 99 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 49 -41 2 +Validated: 1 +EndChar + +StartChar: Cdotaccent +Encoding: 224 266 386 +Width: 1190 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 38 67 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 181 303 2 +Validated: 1 +EndChar + +StartChar: cdotaccent +Encoding: 225 267 387 +Width: 1124 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 70 99 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 139 -47 2 +Validated: 1 +EndChar + +StartChar: Ebreve +Encoding: 234 276 388 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 114 294 2 +Validated: 1 +EndChar + +StartChar: ebreve +Encoding: 235 277 389 +Width: 1303 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 142 -35 2 +Validated: 1 +EndChar + +StartChar: Gcircumflex +Encoding: 242 284 390 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 42 71 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 167 309 2 +Validated: 1 +EndChar + +StartChar: gcircumflex +Encoding: 243 285 391 +Width: 1337 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 130 -56 2 +Validated: 1 +EndChar + +StartChar: Gdotaccent +Encoding: 246 288 392 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 42 71 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 247 303 2 +Validated: 1 +EndChar + +StartChar: gdotaccent +Encoding: 247 289 393 +Width: 1337 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 130 -62 2 +Validated: 1 +EndChar + +StartChar: gacute +Encoding: 443 -1 394 +Width: 1337 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 257 -56 2 +Validated: 1 +EndChar + +StartChar: Hcircumflex +Encoding: 250 292 395 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 43 72 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 167 288 2 +Validated: 1 +EndChar + +StartChar: hcircumflex +Encoding: 251 293 396 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 75 104 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 122 288 2 +Validated: 1 +EndChar + +StartChar: Hbar +Encoding: 252 294 397 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 43 72 N 1 0 0 1 0 0 2 +Refer: 178 8211 N 1 0 0 1 167 392 2 +Validated: 5 +EndChar + +StartChar: hbar +Encoding: 253 295 398 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 75 104 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 -193 -165 2 +Validated: 5 +EndChar + +StartChar: Itilde +Encoding: 254 296 399 +Width: 750 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 -139 272 2 +Validated: 1 +EndChar + +StartChar: itilde +Encoding: 255 297 400 +Width: 610 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 -207 -86 2 +Validated: 1 +EndChar + +StartChar: Iogonek +Encoding: 258 302 401 +Width: 750 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 -94 0 2 +Validated: 5 +EndChar + +StartChar: Jcircumflex +Encoding: 264 308 402 +Width: 954 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 45 74 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 87 288 2 +Validated: 1 +EndChar + +StartChar: jcircumflex +Encoding: 265 309 403 +Width: 633 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 77 106 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 -188 -102 2 +Validated: 5 +EndChar + +StartChar: ncommaaccentaltone +Encoding: 444 -1 404 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 25 1612 2 +Validated: 1 +EndChar + +StartChar: Obreve +Encoding: 285 334 405 +Width: 1365 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 175 315 2 +Validated: 1 +EndChar + +StartChar: obreve +Encoding: 286 335 406 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 167 -35 2 +Validated: 1 +EndChar + +StartChar: Rcaron +Encoding: 295 344 407 +Width: 1251 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 53 82 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 127 288 2 +Validated: 1 +EndChar + +StartChar: rcaron +Encoding: 296 345 408 +Width: 1020 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 85 114 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 81 -47 2 +Validated: 1 +EndChar + +StartChar: Scircumflex +Encoding: 299 348 409 +Width: 1155 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 54 83 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 47 309 2 +Validated: 1 +EndChar + +StartChar: scircumflex +Encoding: 300 349 410 +Width: 932 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 86 115 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 -51 -52 2 +Validated: 1 +EndChar + +StartChar: Tbar +Encoding: 309 358 411 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 55 84 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 1 -672 2 +Validated: 5 +EndChar + +StartChar: tbar +Encoding: 310 359 412 +Width: 850 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 87 116 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 -98 -677 2 +Validated: 5 +EndChar + +StartChar: Utilde +Encoding: 311 360 413 +Width: 1343 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 166 272 2 +Validated: 1 +EndChar + +StartChar: utilde +Encoding: 312 361 414 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 135 -86 2 +Validated: 1 +EndChar + +StartChar: Ubreve +Encoding: 315 364 415 +Width: 1343 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 168 294 2 +Validated: 1 +EndChar + +StartChar: ubreve +Encoding: 316 365 416 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 137 -64 2 +Validated: 1 +EndChar + +StartChar: Uogonek +Encoding: 321 370 417 +Width: 1343 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 211 -18 2 +Validated: 1 +EndChar + +StartChar: uogonek +Encoding: 322 371 418 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 490 10 2 +Validated: 5 +EndChar + +StartChar: Wcircumflex +Encoding: 323 372 419 +Width: 1931 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 58 87 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 452 288 2 +Validated: 1 +EndChar + +StartChar: wcircumflex +Encoding: 324 373 420 +Width: 1774 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 90 119 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 374 -70 2 +Validated: 1 +EndChar + +StartChar: Ycircumflex +Encoding: 325 374 421 +Width: 1327 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 60 89 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 153 288 2 +Validated: 1 +EndChar + +StartChar: ycircumflex +Encoding: 326 375 422 +Width: 1190 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 92 121 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 78 -70 2 +Validated: 1 +EndChar + +StartChar: Scommaaccent +Encoding: 445 -1 423 +Width: 1155 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 54 83 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 264 -462 2 +Validated: 1 +EndChar + +StartChar: scommaaccent +Encoding: 446 -1 424 +Width: 932 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 86 115 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 166 -467 2 +Validated: 1 +EndChar + +StartChar: Tcommaaccent +Encoding: 447 -1 425 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 55 84 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 217 -442 2 +Validated: 1 +EndChar + +StartChar: tcommaaccent +Encoding: 448 -1 426 +Width: 850 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 87 116 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 118 -452 2 +Validated: 1 +EndChar + +StartChar: Gcommaaccent +Encoding: 449 -1 427 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 42 71 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 384 -467 2 +Validated: 1 +EndChar + +StartChar: gcommaaccent +Encoding: 450 -1 428 +Width: 1337 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 182 8216 N 1 0 0 1 298 413 2 +Validated: 1 +EndChar + +StartChar: Lcommaaccent +Encoding: 451 -1 429 +Width: 1126 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 302 -442 2 +Validated: 1 +EndChar + +StartChar: lcommaaccent +Encoding: 452 -1 430 +Width: 635 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 22 -442 2 +Validated: 1 +EndChar + +StartChar: Kcommaaccent +Encoding: 453 -1 431 +Width: 1339 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 46 75 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 467 -442 2 +Validated: 1 +EndChar + +StartChar: kcommaaccent +Encoding: 454 -1 432 +Width: 1190 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 78 107 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 386 -442 2 +Validated: 1 +EndChar + +StartChar: Ncommaaccent +Encoding: 455 -1 433 +Width: 1397 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 49 78 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 403 -442 2 +Validated: 1 +EndChar + +StartChar: Rcommaaccent +Encoding: 456 -1 434 +Width: 1251 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 53 82 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 368 -442 2 +Validated: 1 +EndChar + +StartChar: rcommaaccent +Encoding: 457 -1 435 +Width: 1020 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 85 114 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 23 -442 2 +Validated: 1 +EndChar + +StartChar: commaaccent +Encoding: 404 61444 436 +Width: 584 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 15 44 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: carriagereturnleft +Encoding: 9 12 437 +Width: 2388 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 35 + 16 + 14 + 18 + 17 + 18 + 200 + 56 + 15 + 72 + 15 + 88 + 15 + 104 + 15 + 120 + 15 + 136 + 15 + 152 + 15 + 7 + 15 + 14 + 5 + 200 + 4 + 4 + 10 + 219 + 0 + 23 + 18 + 15 + 16 + 24 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MDAP[rnd] +MDRP[min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +206 1110 m 2,0,1 + 206 1249 206 1249 306.5 1349.5 c 128,-1,2 + 407 1450 407 1450 550 1450 c 2,3,-1 + 980 1450 l 1,4,-1 + 980 1178 l 1,5,-1 + 666 1178 l 2,6,7 + 596 1178 596 1178 546 1139 c 128,-1,8 + 496 1100 496 1100 496 1030 c 2,9,-1 + 496 806 l 2,10,11 + 496 736 496 736 546 692 c 128,-1,12 + 596 648 596 648 666 648 c 2,13,-1 + 1758 648 l 1,14,-1 + 1758 1008 l 1,15,-1 + 2254 510 l 1,16,-1 + 1758 16 l 1,17,-1 + 1758 376 l 1,18,-1 + 550 376 l 2,19,20 + 407 376 407 376 306.5 481.5 c 128,-1,21 + 206 587 206 587 206 726 c 2,22,-1 + 206 1110 l 2,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: tcaron +Encoding: 308 357 438 +Width: 850 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 87 116 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 737 1174 2 +Validated: 1 +EndChar + +StartChar: currency +Encoding: 122 164 439 +Width: 1327 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 54 + 57 + 0 + 57 + 10 + 53 + 28 + 3 + 53 + 1 + 58 + 9 + 54 + 18 + 57 + 19 + 53 + 27 + 5 + 14 + 23 + 92 + 39 + 45 + 92 + 5 + 32 + 98 + 153 + 36 + 175 + 36 + 217 + 36 + 3 + 36 + 150 + 42 + 214 + 42 + 2 + 42 + 98 + 80 + 14 + 1 + 47 + 14 + 64 + 14 + 176 + 14 + 3 + 14 + 48 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +MPPEM +GTEQ +IF +NPUSHB + 24 + 0 + 63 + 28 + 1 + 28 + 32 + 10 + 48 + 18 + 1 + 18 + 14 + 1 + 48 + 9 + 1 + 9 + 5 + 27 + 63 + 19 + 1 + 19 + 23 +SVTCA[y-axis] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +EIF +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1241 236 m 1,0,-1 + 1100 94 l 1,1,-1 + 874 319 l 1,2,3 + 834 295 834 295 772.5 282.5 c 128,-1,4 + 711 270 711 270 668 270 c 0,5,6 + 623 270 623 270 562.5 282.5 c 128,-1,7 + 502 295 502 295 461 319 c 1,8,-1 + 236 94 l 1,9,-1 + 94 236 l 1,10,-1 + 319 461 l 1,11,12 + 289 508 289 508 272.5 566.5 c 128,-1,13 + 256 625 256 625 256 688 c 0,14,15 + 256 752 256 752 272.5 810 c 128,-1,16 + 289 868 289 868 319 915 c 1,17,-1 + 94 1141 l 1,18,-1 + 236 1282 l 1,19,-1 + 461 1057 l 1,20,21 + 502 1081 502 1081 562.5 1093.5 c 128,-1,22 + 623 1106 623 1106 668 1106 c 0,23,24 + 711 1106 711 1106 772.5 1093.5 c 128,-1,25 + 834 1081 834 1081 874 1057 c 1,26,-1 + 1100 1282 l 1,27,-1 + 1241 1141 l 1,28,-1 + 1016 915 l 1,29,30 + 1047 868 1047 868 1063 804.5 c 128,-1,31 + 1079 741 1079 741 1079 688 c 0,32,33 + 1079 625 1079 625 1063 566.5 c 128,-1,34 + 1047 508 1047 508 1016 461 c 1,35,-1 + 1241 236 l 1,0,-1 +838 698 m 0,36,37 + 838 782 838 782 795 842.5 c 128,-1,38 + 752 903 752 903 668 903 c 0,39,40 + 588 903 588 903 543 842.5 c 128,-1,41 + 498 782 498 782 498 698 c 256,42,43 + 498 614 498 614 543 554 c 128,-1,44 + 588 494 588 494 668 494 c 0,45,46 + 752 494 752 494 795 550 c 128,-1,47 + 838 606 838 606 838 698 c 0,36,37 +EndSplineSet +Validated: 1 +EndChar + +StartChar: gravecmb +Encoding: 458 -1 440 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 67 96 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: acutecmb +Encoding: 459 -1 441 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 141 180 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: circumflexcmb +Encoding: 460 -1 442 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 216 710 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: tildecmb +Encoding: 461 -1 443 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 217 732 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: macroncmb +Encoding: 462 -1 444 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 218 175 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: brevecmb +Encoding: 463 -1 445 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 219 728 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: dotaccentcmb +Encoding: 464 -1 446 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 220 729 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: dieresiscmb +Encoding: 465 -1 447 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 142 168 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: ringcmb +Encoding: 466 -1 448 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 221 730 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: hungarumlautcmb +Encoding: 467 -1 449 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 223 733 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: caroncmb +Encoding: 468 -1 450 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 225 711 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: cedillacmb +Encoding: 469 -1 451 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 222 184 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: ogonekcmb +Encoding: 470 -1 452 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 224 731 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: soliduslongoverlaycmb +Encoding: 471 -1 453 +Width: 510 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 3 9 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: Omegagreek +Encoding: 472 -1 454 +Width: 510 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 3 9 N 1 0 0 1 0 0 2 +Validated: 1 +EndChar + +StartChar: ncommaaccent +Encoding: 473 -1 455 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 350 -451 2 +Validated: 1 +EndChar + +StartChar: uniE0B0 +Encoding: 474 57520 456 +Width: 1051 +VWidth: 1000 +Flags: W +LayerCount: 2 +Fore +SplineSet +354.5 59 m 0,0,1 + 294.5 -1 294.5 -1 206.900390625 -2.2001953125 c 0,2,3 + 122.900390625 -2.2001953125 122.900390625 -2.2001953125 61.7001953125 59 c 128,-1,4 + 0.5 120.200195312 0.5 120.200195312 0.5 207.799804688 c 2,5,-1 + 0.5 1242.20019531 l 2,6,7 + 0.5 1328.59960938 0.5 1328.59960938 61.7001953125 1390.40039062 c 128,-1,8 + 122.900390625 1452.20019531 122.900390625 1452.20019531 206.900390625 1452.20019531 c 0,9,10 + 294.5 1452.20019531 294.5 1452.20019531 354.5 1391 c 2,11,-1 + 1038.5 725 l 1,12,13 + 628.099609375 325.400390625 628.099609375 325.400390625 354.5 59 c 0,0,1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F12 +Encoding: 475 59916 457 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1778 405 m 1,0,-1 + 1264 405 l 1,1,-1 + 1264 532 l 1,2,3 + 1458.5 700 1458.5 700 1530.75 783 c 128,-1,4 + 1603 866 1603 866 1603 932.5 c 0,5,6 + 1603 982.5 1603 982.5 1579.5 1018.75 c 128,-1,7 + 1556 1055 1556 1055 1505.5 1055 c 0,8,9 + 1449.5 1055 1449.5 1055 1431.5 1034.25 c 128,-1,10 + 1413.5 1013.5 1413.5 1013.5 1404 984.5 c 1,11,-1 + 1259 984.5 l 1,12,13 + 1281.5 1081 1281.5 1081 1351 1125.5 c 128,-1,14 + 1420.5 1170 1420.5 1170 1529 1170 c 0,15,16 + 1646 1170 1646 1170 1709 1108 c 128,-1,17 + 1772 1046 1772 1046 1772 954 c 0,18,19 + 1772 855.5 1772 855.5 1685.5 753.75 c 128,-1,20 + 1599 652 1599 652 1404 517.5 c 1,21,-1 + 1778 517.5 l 1,22,-1 + 1778 405 l 1,0,-1 +1214.5 404 m 1,23,-1 + 1060 404 l 1,24,-1 + 1060 978.5 l 1,25,-1 + 954.5 978.5 l 1,26,-1 + 954.5 1069.5 l 1,27,28 + 1026 1075.5 1026 1075.5 1064 1108 c 128,-1,29 + 1102 1140.5 1102 1140.5 1113 1158.5 c 1,30,-1 + 1214.5 1158.5 l 1,31,-1 + 1214.5 404 l 1,23,-1 +911 1046.5 m 1,32,-1 + 622 1046.5 l 1,33,-1 + 622 844 l 1,34,-1 + 846.5 844 l 1,35,-1 + 846.5 730 l 1,36,-1 + 622 730 l 1,37,-1 + 622 404.5 l 1,38,-1 + 452 404.5 l 1,39,-1 + 452 1159 l 1,40,-1 + 911 1159 l 1,41,-1 + 911 1046.5 l 1,32,-1 +1694 1536 m 1,42,-1 + 2048 1536 l 1,43,-1 + 2048 0 l 1,44,-1 + 1694 0 l 1,45,-1 + 1493 0 l 1,46,-1 + 727 0 l 1,47,-1 + 524 0 l 1,48,-1 + 172 0 l 1,49,-1 + 172 1536 l 1,50,-1 + 524 1536 l 1,51,-1 + 727 1536 l 1,52,-1 + 1493 1536 l 1,53,-1 + 1694 1536 l 1,42,-1 +1384 1364 m 1,54,-1 + 834 1364 l 1,55,-1 + 633 1364 l 1,56,-1 + 342 1364 l 1,57,-1 + 342 172 l 1,58,-1 + 633 172 l 1,59,-1 + 834 172 l 1,60,-1 + 1384 172 l 1,61,-1 + 1587 172 l 1,62,-1 + 1878 172 l 1,63,-1 + 1878 1364 l 1,64,-1 + 1587 1364 l 1,65,-1 + 1384 1364 l 1,54,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F11 +Encoding: 476 59915 458 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1685 404 m 5,0,-1 + 1530.5 404 l 5,1,-1 + 1530.5 978.5 l 5,2,-1 + 1425 978.5 l 5,3,-1 + 1425 1069.5 l 5,4,5 + 1496.5 1075.5 1496.5 1075.5 1534.5 1108 c 132,-1,6 + 1572.5 1140.5 1572.5 1140.5 1583.5 1158.5 c 5,7,-1 + 1685 1158.5 l 5,8,-1 + 1685 404 l 5,0,-1 +1298.5 404 m 5,9,-1 + 1144 404 l 5,10,-1 + 1144 978.5 l 5,11,-1 + 1038.5 978.5 l 5,12,-1 + 1038.5 1069.5 l 5,13,14 + 1110 1075.5 1110 1075.5 1148 1108 c 132,-1,15 + 1186 1140.5 1186 1140.5 1197 1158.5 c 5,16,-1 + 1298.5 1158.5 l 5,17,-1 + 1298.5 404 l 5,9,-1 +945 1046.5 m 5,18,-1 + 656 1046.5 l 5,19,-1 + 656 844 l 5,20,-1 + 880.5 844 l 5,21,-1 + 880.5 730 l 5,22,-1 + 656 730 l 5,23,-1 + 656 404.5 l 5,24,-1 + 486 404.5 l 5,25,-1 + 486 1159 l 5,26,-1 + 945 1159 l 5,27,-1 + 945 1046.5 l 5,18,-1 +1694 1536 m 1,28,-1 + 2048 1536 l 1,29,-1 + 2048 0 l 1,30,-1 + 1694 0 l 1,31,-1 + 1493 0 l 1,32,-1 + 727 0 l 1,33,-1 + 524 0 l 1,34,-1 + 172 0 l 1,35,-1 + 172 1536 l 1,36,-1 + 524 1536 l 1,37,-1 + 727 1536 l 1,38,-1 + 1493 1536 l 1,39,-1 + 1694 1536 l 1,28,-1 +1384 1364 m 1,40,-1 + 834 1364 l 1,41,-1 + 633 1364 l 1,42,-1 + 342 1364 l 1,43,-1 + 342 172 l 1,44,-1 + 633 172 l 1,45,-1 + 834 172 l 1,46,-1 + 1384 172 l 1,47,-1 + 1587 172 l 1,48,-1 + 1878 172 l 1,49,-1 + 1878 1364 l 1,50,-1 + 1587 1364 l 1,51,-1 + 1384 1364 l 1,40,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F10 +Encoding: 477 59914 459 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1799.5 756.5 m 2,0,1 + 1799.5 576.5 1799.5 576.5 1727.75 488.25 c 128,-1,2 + 1656 400 1656 400 1531 400 c 256,3,4 + 1406 400 1406 400 1334.25 488.25 c 128,-1,5 + 1262.5 576.5 1262.5 576.5 1262.5 756.5 c 2,6,-1 + 1262.5 818 l 2,7,8 + 1262.5 990 1262.5 990 1330.75 1084.25 c 128,-1,9 + 1399 1178.5 1399 1178.5 1531 1178.5 c 256,10,11 + 1663 1178.5 1663 1178.5 1731.25 1084.25 c 128,-1,12 + 1799.5 990 1799.5 990 1799.5 818 c 2,13,-1 + 1799.5 756.5 l 2,0,1 +1631 777 m 2,14,-1 + 1631 797.5 l 2,15,16 + 1631 950 1631 950 1610.75 1007 c 128,-1,17 + 1590.5 1064 1590.5 1064 1531 1064 c 256,18,19 + 1471.5 1064 1471.5 1064 1451.5 1007 c 128,-1,20 + 1431.5 950 1431.5 950 1431.5 797.5 c 2,21,-1 + 1431.5 777 l 2,22,23 + 1431.5 624.5 1431.5 624.5 1452 569.75 c 128,-1,24 + 1472.5 515 1472.5 515 1531 515 c 0,25,26 + 1590.5 515 1590.5 515 1610.75 569.75 c 128,-1,27 + 1631 624.5 1631 624.5 1631 777 c 2,14,-1 +1214.5 404 m 1,28,-1 + 1060 404 l 1,29,-1 + 1060 978.5 l 1,30,-1 + 954.5 978.5 l 1,31,-1 + 954.5 1069.5 l 1,32,33 + 1026 1075.5 1026 1075.5 1064 1108 c 128,-1,34 + 1102 1140.5 1102 1140.5 1113 1158.5 c 1,35,-1 + 1214.5 1158.5 l 1,36,-1 + 1214.5 404 l 1,28,-1 +911 1046.5 m 1,37,-1 + 622 1046.5 l 1,38,-1 + 622 844 l 1,39,-1 + 846.5 844 l 1,40,-1 + 846.5 730 l 1,41,-1 + 622 730 l 1,42,-1 + 622 404.5 l 1,43,-1 + 452 404.5 l 1,44,-1 + 452 1159 l 1,45,-1 + 911 1159 l 1,46,-1 + 911 1046.5 l 1,37,-1 +1694 1536 m 1,47,-1 + 2048 1536 l 1,48,-1 + 2048 0 l 1,49,-1 + 1694 0 l 1,50,-1 + 1493 0 l 1,51,-1 + 727 0 l 1,52,-1 + 524 0 l 1,53,-1 + 172 0 l 1,54,-1 + 172 1536 l 1,55,-1 + 524 1536 l 1,56,-1 + 727 1536 l 1,57,-1 + 1493 1536 l 1,58,-1 + 1694 1536 l 1,47,-1 +1384 1364 m 1,59,-1 + 834 1364 l 1,60,-1 + 633 1364 l 1,61,-1 + 342 1364 l 1,62,-1 + 342 172 l 1,63,-1 + 633 172 l 1,64,-1 + 834 172 l 1,65,-1 + 1384 172 l 1,66,-1 + 1587 172 l 1,67,-1 + 1878 172 l 1,68,-1 + 1878 1364 l 1,69,-1 + 1587 1364 l 1,70,-1 + 1384 1364 l 1,59,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F9 +Encoding: 478 59913 460 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1693.5 806.5 m 0,0,1 + 1678.5 612.5 1678.5 612.5 1602.5 508 c 0,2,3 + 1521.5 396 1521.5 396 1367 396 c 0,4,5 + 1327 396 1327 396 1296.75 401.25 c 128,-1,6 + 1266.5 406.5 1266.5 406.5 1241 411.5 c 1,7,-1 + 1241 541.5 l 1,8,9 + 1275 533.5 1275 533.5 1306.25 528.25 c 128,-1,10 + 1337.5 523 1337.5 523 1367 523 c 0,11,12 + 1439.5 523 1439.5 523 1478.5 569.5 c 128,-1,13 + 1517.5 616 1517.5 616 1520.5 696 c 1,14,15 + 1506 670.5 1506 670.5 1461.5 650 c 128,-1,16 + 1417 629.5 1417 629.5 1378 629.5 c 0,17,18 + 1261.5 629.5 1261.5 629.5 1197.25 697.25 c 128,-1,19 + 1133 765 1133 765 1133 889.5 c 0,20,21 + 1133 1018.5 1133 1018.5 1205.5 1095 c 128,-1,22 + 1278 1171.5 1278 1171.5 1408 1171.5 c 0,23,24 + 1547 1171.5 1547 1171.5 1615.5 1098 c 0,25,26 + 1680 1030 1680 1030 1693.5 872.5 c 0,27,28 + 1694.5 861 1694.5 861 1694.5 844 c 0,29,30 + 1694.5 840 1694.5 840 1694.5 835.5 c 0,31,32 + 1694 813 1694 813 1693.5 806.5 c 0,0,1 +1529 900.5 m 0,33,34 + 1529 983.5 1529 983.5 1498.75 1019.25 c 128,-1,35 + 1468.5 1055 1468.5 1055 1415 1055 c 0,36,37 + 1363 1055 1363 1055 1333 1019.75 c 128,-1,38 + 1303 984.5 1303 984.5 1303 900.5 c 0,39,40 + 1303 820.5 1303 820.5 1333 782.75 c 128,-1,41 + 1363 745 1363 745 1415 745 c 0,42,43 + 1461 745 1461 745 1495 782.25 c 128,-1,44 + 1529 819.5 1529 819.5 1529 900.5 c 0,33,34 +1015 1046.5 m 1,45,-1 + 726 1046.5 l 1,46,-1 + 726 844 l 1,47,-1 + 950.5 844 l 1,48,-1 + 950.5 730 l 1,49,-1 + 726 730 l 1,50,-1 + 726 404.5 l 1,51,-1 + 556 404.5 l 1,52,-1 + 556 1159 l 1,53,-1 + 1015 1159 l 1,54,-1 + 1015 1046.5 l 1,45,-1 +1694 1536 m 1,55,-1 + 2048 1536 l 1,56,-1 + 2048 0 l 1,57,-1 + 1694 0 l 1,58,-1 + 1493 0 l 1,59,-1 + 727 0 l 1,60,-1 + 524 0 l 1,61,-1 + 172 0 l 1,62,-1 + 172 1536 l 1,63,-1 + 524 1536 l 1,64,-1 + 727 1536 l 1,65,-1 + 1493 1536 l 1,66,-1 + 1694 1536 l 1,55,-1 +1384 1364 m 1,67,-1 + 834 1364 l 1,68,-1 + 633 1364 l 1,69,-1 + 342 1364 l 1,70,-1 + 342 172 l 1,71,-1 + 633 172 l 1,72,-1 + 834 172 l 1,73,-1 + 1384 172 l 1,74,-1 + 1587 172 l 1,75,-1 + 1878 172 l 1,76,-1 + 1878 1364 l 1,77,-1 + 1587 1364 l 1,78,-1 + 1384 1364 l 1,67,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F8 +Encoding: 479 59912 461 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1626 627.5 m 0,0,1 + 1626 518 1626 518 1556.25 455 c 128,-1,2 + 1486.5 392 1486.5 392 1373 392 c 0,3,4 + 1251 392 1251 392 1186.5 449.5 c 128,-1,5 + 1122 507 1122 507 1122 615 c 0,6,7 + 1122 671.5 1122 671.5 1154.75 724.5 c 128,-1,8 + 1187.5 777.5 1187.5 777.5 1248 800 c 1,9,-1 + 1248 811 l 1,10,11 + 1196 828.5 1196 828.5 1168.75 870.5 c 128,-1,12 + 1141.5 912.5 1141.5 912.5 1141.5 974 c 0,13,14 + 1141.5 1054.5 1141.5 1054.5 1202.5 1112 c 128,-1,15 + 1263.5 1169.5 1263.5 1169.5 1373 1169.5 c 0,16,17 + 1484.5 1169.5 1484.5 1169.5 1542.5 1112.75 c 128,-1,18 + 1600.5 1056 1600.5 1056 1600.5 967.5 c 0,19,20 + 1600.5 910.5 1600.5 910.5 1574.25 869 c 128,-1,21 + 1548 827.5 1548 827.5 1502 811 c 1,22,-1 + 1502 800 l 1,23,24 + 1558.5 782.5 1558.5 782.5 1592.25 740.5 c 128,-1,25 + 1626 698.5 1626 698.5 1626 627.5 c 0,0,1 +1456 954.5 m 0,26,27 + 1456 1005.5 1456 1005.5 1435 1030 c 128,-1,28 + 1414 1054.5 1414 1054.5 1373 1054.5 c 256,29,30 + 1332 1054.5 1332 1054.5 1311.5 1029.5 c 128,-1,31 + 1291 1004.5 1291 1004.5 1291 954.5 c 0,32,33 + 1291 901 1291 901 1312.5 877.5 c 128,-1,34 + 1334 854 1334 854 1373 854 c 0,35,36 + 1407 854 1407 854 1431.5 876.5 c 128,-1,37 + 1456 899 1456 899 1456 954.5 c 0,26,27 +1476.5 623.5 m 0,38,39 + 1476.5 688 1476.5 688 1449.75 717.75 c 128,-1,40 + 1423 747.5 1423 747.5 1373 747.5 c 0,41,42 + 1324.5 747.5 1324.5 747.5 1297.5 719.25 c 128,-1,43 + 1270.5 691 1270.5 691 1270.5 623.5 c 0,44,45 + 1270.5 562 1270.5 562 1297.25 534.5 c 128,-1,46 + 1324 507 1324 507 1373 507 c 0,47,48 + 1418 507 1418 507 1447.25 534.5 c 128,-1,49 + 1476.5 562 1476.5 562 1476.5 623.5 c 0,38,39 +1041 1046.5 m 1,50,-1 + 752 1046.5 l 1,51,-1 + 752 844 l 1,52,-1 + 976.5 844 l 1,53,-1 + 976.5 730 l 1,54,-1 + 752 730 l 1,55,-1 + 752 404.5 l 1,56,-1 + 582 404.5 l 1,57,-1 + 582 1159 l 1,58,-1 + 1041 1159 l 1,59,-1 + 1041 1046.5 l 1,50,-1 +1694 1536 m 1,60,-1 + 2048 1536 l 1,61,-1 + 2048 0 l 1,62,-1 + 1694 0 l 1,63,-1 + 1493 0 l 1,64,-1 + 727 0 l 1,65,-1 + 524 0 l 1,66,-1 + 172 0 l 1,67,-1 + 172 1536 l 1,68,-1 + 524 1536 l 1,69,-1 + 727 1536 l 1,70,-1 + 1493 1536 l 1,71,-1 + 1694 1536 l 1,60,-1 +1384 1364 m 1,72,-1 + 834 1364 l 1,73,-1 + 633 1364 l 1,74,-1 + 342 1364 l 1,75,-1 + 342 172 l 1,76,-1 + 633 172 l 1,77,-1 + 834 172 l 1,78,-1 + 1384 172 l 1,79,-1 + 1587 172 l 1,80,-1 + 1878 172 l 1,81,-1 + 1878 1364 l 1,82,-1 + 1587 1364 l 1,83,-1 + 1384 1364 l 1,72,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F7 +Encoding: 480 59911 462 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1665 1030 m 1,0,1 + 1545 956 1545 956 1470 805 c 0,2,3 + 1404 673 1404 673 1404 464 c 0,4,5 + 1405 433 1405 433 1406 404 c 1,6,-1 + 1241 404 l 1,7,8 + 1241 577 1241 577 1315 760 c 0,9,10 + 1388 944 1388 944 1537 1046 c 1,11,-1 + 1142 1046 l 1,12,-1 + 1142 1158 l 1,13,-1 + 1665 1158 l 1,14,-1 + 1665 1030 l 1,0,1 +1041 1046 m 1,15,-1 + 752 1046 l 1,16,-1 + 752 844 l 1,17,-1 + 976 844 l 1,18,-1 + 976 730 l 1,19,-1 + 752 730 l 1,20,-1 + 752 404 l 1,21,-1 + 582 404 l 1,22,-1 + 582 1159 l 1,23,-1 + 1041 1159 l 1,24,-1 + 1041 1046 l 1,15,-1 +1694 1536 m 1,25,-1 + 2048 1536 l 1,26,-1 + 2048 0 l 1,27,-1 + 1694 0 l 1,28,-1 + 1493 0 l 1,29,-1 + 727 0 l 1,30,-1 + 524 0 l 1,31,-1 + 172 0 l 1,32,-1 + 172 1536 l 1,33,-1 + 524 1536 l 1,34,-1 + 727 1536 l 1,35,-1 + 1493 1536 l 1,36,-1 + 1694 1536 l 1,25,-1 +1384 1364 m 1,37,-1 + 834 1364 l 1,38,-1 + 633 1364 l 1,39,-1 + 342 1364 l 1,40,-1 + 342 172 l 1,41,-1 + 633 172 l 1,42,-1 + 834 172 l 1,43,-1 + 1384 172 l 1,44,-1 + 1587 172 l 1,45,-1 + 1878 172 l 1,46,-1 + 1878 1364 l 1,47,-1 + 1587 1364 l 1,48,-1 + 1384 1364 l 1,37,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F6 +Encoding: 481 59910 463 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1694 676 m 0,0,1 + 1694 547 1694 547 1620 470 c 0,2,3 + 1547 394 1547 394 1417 394 c 0,4,5 + 1280 394 1280 394 1210 468 c 128,-1,6 + 1140 542 1140 542 1132 693 c 0,7,8 + 1131 702 1131 702 1131 716 c 128,-1,9 + 1131 730 1131 730 1131 730 c 0,10,11 + 1132 759 1132 759 1132 759 c 0,12,13 + 1131 772 1131 772 1131 788 c 0,14,15 + 1131 790 1131 790 1131 791 c 128,-1,16 + 1131 792 1131 792 1131 794 c 0,17,18 + 1130.98947368 795.378947368 1130.98947368 795.378947368 1130.98947368 796.757783934 c 0,19,20 + 1130.98947368 926.368421053 1130.98947368 926.368421053 1224 1055 c 0,21,22 + 1307 1170 1307 1170 1448 1170 c 0,23,24 + 1453 1170 1453 1170 1458 1170 c 0,25,26 + 1493 1170 1493 1170 1528 1164 c 0,27,28 + 1548 1161 1548 1161 1584 1154 c 1,29,-1 + 1584 1024 l 1,30,31 + 1549 1032 1549 1032 1519 1037 c 0,32,33 + 1488 1042 1488 1042 1458 1042 c 0,34,35 + 1456 1042 1456 1042 1453 1042 c 128,-1,36 + 1450 1042 1450 1042 1448 1042 c 128,-1,37 + 1446 1042 1446 1042 1443 1042 c 0,38,39 + 1440.84 1042.08 1440.84 1042.08 1438.704 1042.08 c 0,40,41 + 1387.44 1042.08 1387.44 1042.08 1350 996 c 0,42,43 + 1311 948 1311 948 1304 870 c 1,44,45 + 1319 895 1319 895 1363.5 915.5 c 128,-1,46 + 1408 936 1408 936 1447 936 c 0,47,48 + 1564 936 1564 936 1629 868 c 128,-1,49 + 1694 800 1694 800 1694 676 c 0,0,1 +1524 664 m 0,50,51 + 1524 744 1524 744 1493 781.5 c 128,-1,52 + 1462 819 1462 819 1410 819 c 0,53,54 + 1363 819 1363 819 1330 782 c 0,55,56 + 1296 744 1296 744 1296 664 c 0,57,58 + 1296 580 1296 580 1326 544 c 0,59,60 + 1356 509 1356 509 1410 509 c 0,61,62 + 1462 509 1462 509 1493 544.5 c 128,-1,63 + 1524 580 1524 580 1524 664 c 0,50,51 +1041 1046 m 1,64,-1 + 752 1046 l 1,65,-1 + 752 844 l 1,66,-1 + 976 844 l 1,67,-1 + 976 730 l 1,68,-1 + 752 730 l 1,69,-1 + 752 404 l 1,70,-1 + 582 404 l 1,71,-1 + 582 1159 l 1,72,-1 + 1041 1159 l 1,73,-1 + 1041 1046 l 1,64,-1 +1694 1536 m 1,74,-1 + 2048 1536 l 1,75,-1 + 2048 0 l 1,76,-1 + 1694 0 l 1,77,-1 + 1493 0 l 1,78,-1 + 727 0 l 1,79,-1 + 524 0 l 1,80,-1 + 172 0 l 1,81,-1 + 172 1536 l 1,82,-1 + 524 1536 l 1,83,-1 + 727 1536 l 1,84,-1 + 1493 1536 l 1,85,-1 + 1694 1536 l 1,74,-1 +1384 1364 m 1,86,-1 + 834 1364 l 1,87,-1 + 633 1364 l 1,88,-1 + 342 1364 l 1,89,-1 + 342 172 l 1,90,-1 + 633 172 l 1,91,-1 + 834 172 l 1,92,-1 + 1384 172 l 1,93,-1 + 1587 172 l 1,94,-1 + 1878 172 l 1,95,-1 + 1878 1364 l 1,96,-1 + 1587 1364 l 1,97,-1 + 1384 1364 l 1,86,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F5 +Encoding: 482 59909 464 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1661 683 m 0,0,1 + 1661 530 1661 530 1579.5 462 c 128,-1,2 + 1498 394 1498 394 1369 394 c 0,3,4 + 1272 394 1272 394 1206 433 c 128,-1,5 + 1140 472 1140 472 1100 556 c 1,6,-1 + 1212 620 l 1,7,8 + 1235 562 1235 562 1273 537 c 0,9,10 + 1312 511 1312 511 1361 511 c 0,11,12 + 1424 511 1424 511 1456.5 550.5 c 128,-1,13 + 1489 590 1489 590 1489 668 c 0,14,15 + 1489 742 1489 742 1457 780 c 0,16,17 + 1424 817 1424 817 1365 817 c 0,18,19 + 1335 817 1335 817 1303 805 c 0,20,21 + 1272 794 1272 794 1241 768 c 1,22,-1 + 1142 824 l 1,23,-1 + 1157 1162 l 1,24,-1 + 1586 1162 l 1,25,-1 + 1586 1050 l 1,26,-1 + 1281 1050 l 1,27,-1 + 1274 910 l 1,28,29 + 1300 929 1300 929 1346 936 c 0,30,31 + 1390 943 1390 943 1409 943 c 0,32,33 + 1520 943 1520 943 1590.5 869.5 c 128,-1,34 + 1661 796 1661 796 1661 683 c 0,0,1 +1041 1046 m 1,35,-1 + 752 1046 l 1,36,-1 + 752 844 l 1,37,-1 + 976 844 l 1,38,-1 + 976 730 l 1,39,-1 + 752 730 l 1,40,-1 + 752 404 l 1,41,-1 + 582 404 l 1,42,-1 + 582 1159 l 1,43,-1 + 1041 1159 l 1,44,-1 + 1041 1046 l 1,35,-1 +1694 1536 m 1,45,-1 + 2048 1536 l 1,46,-1 + 2048 0 l 1,47,-1 + 1694 0 l 1,48,-1 + 1493 0 l 1,49,-1 + 727 0 l 1,50,-1 + 524 0 l 1,51,-1 + 172 0 l 1,52,-1 + 172 1536 l 1,53,-1 + 524 1536 l 1,54,-1 + 727 1536 l 1,55,-1 + 1493 1536 l 1,56,-1 + 1694 1536 l 1,45,-1 +1384 1364 m 1,57,-1 + 834 1364 l 1,58,-1 + 633 1364 l 1,59,-1 + 342 1364 l 1,60,-1 + 342 172 l 1,61,-1 + 633 172 l 1,62,-1 + 834 172 l 1,63,-1 + 1384 172 l 1,64,-1 + 1587 172 l 1,65,-1 + 1878 172 l 1,66,-1 + 1878 1364 l 1,67,-1 + 1587 1364 l 1,68,-1 + 1384 1364 l 1,57,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F4 +Encoding: 483 59908 465 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1620 625 m 1,0,-1 + 1566 625 l 1,1,-1 + 1566 406 l 1,2,-1 + 1413 406 l 1,3,-1 + 1413 625 l 1,4,-1 + 1082 625 l 1,5,-1 + 1074 770 l 1,6,-1 + 1464 1160 l 1,7,-1 + 1566 1160 l 1,8,-1 + 1566 734 l 1,9,-1 + 1620 734 l 1,10,-1 + 1620 625 l 1,0,-1 +1415 734 m 1,11,-1 + 1415 964 l 1,12,-1 + 1186 734 l 1,13,-1 + 1415 734 l 1,11,-1 +1041 1046 m 1,14,-1 + 752 1046 l 1,15,-1 + 752 844 l 1,16,-1 + 976 844 l 1,17,-1 + 976 730 l 1,18,-1 + 752 730 l 1,19,-1 + 752 404 l 1,20,-1 + 582 404 l 1,21,-1 + 582 1159 l 1,22,-1 + 1041 1159 l 1,23,-1 + 1041 1046 l 1,14,-1 +1694 1536 m 1,24,-1 + 2048 1536 l 1,25,-1 + 2048 0 l 1,26,-1 + 1694 0 l 1,27,-1 + 1493 0 l 1,28,-1 + 727 0 l 1,29,-1 + 524 0 l 1,30,-1 + 172 0 l 1,31,-1 + 172 1536 l 1,32,-1 + 524 1536 l 1,33,-1 + 727 1536 l 1,34,-1 + 1493 1536 l 1,35,-1 + 1694 1536 l 1,24,-1 +1384 1364 m 1,36,-1 + 834 1364 l 1,37,-1 + 633 1364 l 1,38,-1 + 342 1364 l 1,39,-1 + 342 172 l 1,40,-1 + 633 172 l 1,41,-1 + 834 172 l 1,42,-1 + 1384 172 l 1,43,-1 + 1587 172 l 1,44,-1 + 1878 172 l 1,45,-1 + 1878 1364 l 1,46,-1 + 1587 1364 l 1,47,-1 + 1384 1364 l 1,36,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F3 +Encoding: 484 59907 466 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1640 624 m 0,0,1 + 1640 519 1640 519 1567.5 455.5 c 128,-1,2 + 1495 392 1495 392 1377 392 c 0,3,4 + 1274 392 1274 392 1208 431 c 128,-1,5 + 1142 470 1142 470 1109 530 c 1,6,-1 + 1212 594 l 1,7,8 + 1226 560 1226 560 1266 534 c 0,9,10 + 1306 509 1306 509 1362 509 c 0,11,12 + 1417 509 1417 509 1449 542 c 0,13,14 + 1482 576 1482 576 1482 634 c 0,15,16 + 1482 635 1482 635 1482 637 c 0,17,18 + 1482 682 1482 682 1452 716 c 0,19,20 + 1424 748 1424 748 1364 748 c 2,21,-1 + 1288 748 l 1,22,-1 + 1288 854 l 1,23,-1 + 1368 854 l 2,24,25 + 1421 854 1421 854 1446 878 c 0,26,27 + 1472 903 1472 903 1472 952 c 0,28,29 + 1472 954 1472 954 1472 956 c 128,-1,30 + 1472 958 1472 958 1472 960 c 128,-1,31 + 1472 962 1472 962 1472 964 c 0,32,33 + 1472.04545455 965.636363636 1472.04545455 965.636363636 1472.04545455 967.256198347 c 0,34,35 + 1472.04545455 1001.27272727 1472.04545455 1001.27272727 1452 1028 c 0,36,37 + 1431 1056 1431 1056 1384 1056 c 0,38,39 + 1342 1056 1342 1056 1318.5 1041 c 128,-1,40 + 1295 1026 1295 1026 1283 1000 c 1,41,-1 + 1148 1000 l 1,42,43 + 1162 1070 1162 1070 1221 1120 c 128,-1,44 + 1280 1170 1280 1170 1384 1170 c 0,45,46 + 1386 1170 1386 1170 1388 1170 c 128,-1,47 + 1390 1170 1390 1170 1392 1170 c 128,-1,48 + 1394 1170 1394 1170 1396 1170 c 128,-1,49 + 1397.88135593 1170.01694915 1397.88135593 1170.01694915 1399.74834818 1170.01694915 c 0,50,51 + 1508.03389831 1170.01694915 1508.03389831 1170.01694915 1568 1113 c 0,52,53 + 1629 1055 1629 1055 1629 974 c 0,54,55 + 1629 901 1629 901 1592 861 c 0,56,57 + 1556 822 1556 822 1512 810 c 1,58,59 + 1566 790 1566 790 1603 744 c 128,-1,60 + 1640 698 1640 698 1640 624 c 0,0,1 +1041 1046 m 1,61,-1 + 752 1046 l 1,62,-1 + 752 844 l 1,63,-1 + 976 844 l 1,64,-1 + 976 730 l 1,65,-1 + 752 730 l 1,66,-1 + 752 404 l 1,67,-1 + 582 404 l 1,68,-1 + 582 1159 l 1,69,-1 + 1041 1159 l 1,70,-1 + 1041 1046 l 1,61,-1 +1694 1536 m 1,71,-1 + 2048 1536 l 1,72,-1 + 2048 0 l 1,73,-1 + 1694 0 l 1,74,-1 + 1493 0 l 1,75,-1 + 727 0 l 1,76,-1 + 524 0 l 1,77,-1 + 172 0 l 1,78,-1 + 172 1536 l 1,79,-1 + 524 1536 l 1,80,-1 + 727 1536 l 1,81,-1 + 1493 1536 l 1,82,-1 + 1694 1536 l 1,71,-1 +1384 1364 m 1,83,-1 + 834 1364 l 1,84,-1 + 633 1364 l 1,85,-1 + 342 1364 l 1,86,-1 + 342 172 l 1,87,-1 + 633 172 l 1,88,-1 + 834 172 l 1,89,-1 + 1384 172 l 1,90,-1 + 1587 172 l 1,91,-1 + 1878 172 l 1,92,-1 + 1878 1364 l 1,93,-1 + 1587 1364 l 1,94,-1 + 1384 1364 l 1,83,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F2 +Encoding: 485 59906 467 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1661 404 m 1,0,-1 + 1147 404 l 1,1,-1 + 1147 531 l 1,2,3 + 1342 699 1342 699 1414 782 c 128,-1,4 + 1486 865 1486 865 1486 932 c 0,5,6 + 1486 982 1486 982 1462.5 1018 c 128,-1,7 + 1439 1054 1439 1054 1388 1054 c 0,8,9 + 1332 1054 1332 1054 1314 1033 c 128,-1,10 + 1296 1012 1296 1012 1287 984 c 1,11,-1 + 1142 984 l 1,12,13 + 1164 1080 1164 1080 1234 1124 c 0,14,15 + 1304 1169 1304 1169 1412 1169 c 0,16,17 + 1529 1169 1529 1169 1592 1107 c 128,-1,18 + 1655 1045 1655 1045 1655 953 c 0,19,20 + 1655 854 1655 854 1568.5 752.5 c 128,-1,21 + 1482 651 1482 651 1287 516 c 1,22,-1 + 1661 516 l 1,23,-1 + 1661 404 l 1,0,-1 +1041 1046 m 1,24,-1 + 752 1046 l 1,25,-1 + 752 844 l 1,26,-1 + 976 844 l 1,27,-1 + 976 730 l 1,28,-1 + 752 730 l 1,29,-1 + 752 404 l 1,30,-1 + 582 404 l 1,31,-1 + 582 1159 l 1,32,-1 + 1041 1159 l 1,33,-1 + 1041 1046 l 1,24,-1 +1694 1536 m 1,34,-1 + 2048 1536 l 1,35,-1 + 2048 0 l 1,36,-1 + 1694 0 l 1,37,-1 + 1493 0 l 1,38,-1 + 727 0 l 1,39,-1 + 524 0 l 1,40,-1 + 172 0 l 1,41,-1 + 172 1536 l 1,42,-1 + 524 1536 l 1,43,-1 + 727 1536 l 1,44,-1 + 1493 1536 l 1,45,-1 + 1694 1536 l 1,34,-1 +1384 1364 m 1,46,-1 + 834 1364 l 1,47,-1 + 633 1364 l 1,48,-1 + 342 1364 l 1,49,-1 + 342 172 l 1,50,-1 + 633 172 l 1,51,-1 + 834 172 l 1,52,-1 + 1384 172 l 1,53,-1 + 1587 172 l 1,54,-1 + 1878 172 l 1,55,-1 + 1878 1364 l 1,56,-1 + 1587 1364 l 1,57,-1 + 1384 1364 l 1,46,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: F1 +Encoding: 486 59905 468 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1534 404 m 1,0,-1 + 1379 404 l 1,1,-1 + 1379 978 l 1,2,-1 + 1274 978 l 1,3,-1 + 1274 1070 l 1,4,5 + 1345 1076 1345 1076 1383 1108 c 128,-1,6 + 1421 1140 1421 1140 1432 1158 c 1,7,-1 + 1534 1158 l 1,8,-1 + 1534 404 l 1,0,-1 +1081 1046 m 1,9,-1 + 792 1046 l 1,10,-1 + 792 844 l 1,11,-1 + 1016 844 l 1,12,-1 + 1016 730 l 1,13,-1 + 792 730 l 1,14,-1 + 792 404 l 1,15,-1 + 622 404 l 1,16,-1 + 622 1159 l 1,17,-1 + 1081 1159 l 1,18,-1 + 1081 1046 l 1,9,-1 +1694 1536 m 1,19,-1 + 2048 1536 l 1,20,-1 + 2048 0 l 1,21,-1 + 1694 0 l 1,22,-1 + 1493 0 l 1,23,-1 + 727 0 l 1,24,-1 + 524 0 l 1,25,-1 + 172 0 l 1,26,-1 + 172 1536 l 1,27,-1 + 524 1536 l 1,28,-1 + 727 1536 l 1,29,-1 + 1493 1536 l 1,30,-1 + 1694 1536 l 1,19,-1 +1384 1364 m 1,31,-1 + 834 1364 l 1,32,-1 + 633 1364 l 1,33,-1 + 342 1364 l 1,34,-1 + 342 172 l 1,35,-1 + 633 172 l 1,36,-1 + 834 172 l 1,37,-1 + 1384 172 l 1,38,-1 + 1587 172 l 1,39,-1 + 1878 172 l 1,40,-1 + 1878 1364 l 1,41,-1 + 1587 1364 l 1,42,-1 + 1384 1364 l 1,31,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uniE0B1 +Encoding: 487 57521 469 +Width: 2331 +VWidth: 1000 +Flags: WO +LayerCount: 2 +Fore +SplineSet +2408.40039062 72 m 1,0,-1 + 2408.40039062 -162 l 1,1,-1 + 1948.79980469 -162 l 2,2,3 + 1765.20019531 -162 1765.20019531 -162 1632 -51 c 128,-1,4 + 1498.79980469 60 1498.79980469 60 1498.79980469 241.200195312 c 0,5,6 + 1498.79980469 397.200195312 1498.79980469 397.200195312 1633.79980469 517.799804688 c 128,-1,7 + 1768.79980469 638.400390625 1768.79980469 638.400390625 1950 638.400390625 c 2,8,-1 + 2408.40039062 638.400390625 l 1,9,-1 + 2408.40039062 404.400390625 l 1,10,-1 + 2227.20019531 139.200195312 l 1,11,-1 + 1918.79980469 139.200195312 l 1,12,-1 + 2110.79980469 404.400390625 l 1,13,-1 + 1970.40039062 404.400390625 l 2,14,15 + 1892.40039062 404.400390625 1892.40039062 404.400390625 1844.40039062 359.400390625 c 128,-1,16 + 1796.40039062 314.400390625 1796.40039062 314.400390625 1796.40039062 244.799804688 c 0,17,18 + 1796.40039062 170.400390625 1796.40039062 170.400390625 1847.40039062 121.200195312 c 128,-1,19 + 1898.40039062 72 1898.40039062 72 1970.40039062 72 c 2,20,-1 + 2408.40039062 72 l 1,0,-1 +1244.40039062 1554 m 1,21,-1 + 1777.20019531 1554 l 1,22,-1 + 1185.60058594 -168 l 1,23,24 + 1184.40039062 -168 1184.40039062 -168 654 -168 c 1,25,-1 + 1244.40039062 1554 l 1,21,-1 +505.200195312 1554 m 1,26,-1 + 1039.20019531 1554 l 1,27,-1 + 447.600585938 -168 l 1,28,-1 + -84 -168 l 1,29,-1 + 505.200195312 1554 l 1,26,-1 +EndSplineSet +EndChar +EndChars +EndSplineFont diff --git a/libmui/fonts/Charcoal_mui.ttf b/libmui/fonts/Charcoal_mui.ttf new file mode 100644 index 0000000..db3ce89 Binary files /dev/null and b/libmui/fonts/Charcoal_mui.ttf differ diff --git a/libmui/fonts/Charcoal_mui_italic.sfd b/libmui/fonts/Charcoal_mui_italic.sfd new file mode 100644 index 0000000..8c6d33a --- /dev/null +++ b/libmui/fonts/Charcoal_mui_italic.sfd @@ -0,0 +1,31334 @@ +SplineFontDB: 3.2 +FontName: Charcoal +FullName: Charcoal +FamilyName: Charcoal +Weight: Book +Copyright: (c)1995-1997 The Font Bureau, Inc. All Rights Reserved.\n* 2023 Michel Pollet -- Added some glyphs for libmui +Version: 3.2 +ItalicAngle: 0 +UnderlinePosition: 0 +UnderlineWidth: 0 +Ascent: 1536 +Descent: 512 +InvalidEm: 0 +sfntRevision: 0x00010000 +LayerCount: 2 +Layer: 0 1 "Back" 1 +Layer: 1 1 "Fore" 0 +XUID: [1021 220 -731427345 9134032] +StyleMap: 0x0040 +FSType: 0 +OS2Version: 0 +OS2_WeightWidthSlopeOnly: 0 +OS2_UseTypoMetrics: 0 +CreationTime: 830956166 +ModificationTime: 1699771305 +PfmFamily: 81 +TTFWeight: 400 +TTFWidth: 5 +LineGap: 171 +VLineGap: 0 +Panose: 0 0 0 0 0 0 0 0 0 0 +OS2TypoAscent: 1536 +OS2TypoAOffset: 0 +OS2TypoDescent: -512 +OS2TypoDOffset: 0 +OS2TypoLinegap: 171 +OS2WinAscent: 2048 +OS2WinAOffset: 0 +OS2WinDescent: 512 +OS2WinDOffset: 0 +HheadAscent: 2048 +HheadAOffset: 0 +HheadDescent: -512 +HheadDOffset: 0 +OS2SubXSize: 1434 +OS2SubYSize: 1331 +OS2SubXOff: 0 +OS2SubYOff: 293 +OS2SupXSize: 1434 +OS2SupYSize: 1331 +OS2SupXOff: 0 +OS2SupYOff: 928 +OS2StrikeYSize: 102 +OS2StrikeYPos: 530 +OS2Vendor: 'Alts' +OS2UnicodeRanges: 00000000.00000000.00000000.00000000 +MarkAttachClasses: 1 +DEI: 91125 +TtTable: prep +NPUSHB + 98 + 63 + 37 + 63 + 38 + 79 + 37 + 3 + 39 + 37 + 38 + 31 + 39 + 37 + 38 + 31 + 38 + 37 + 38 + 31 + 36 + 37 + 38 + 31 + 15 + 37 + 47 + 37 + 95 + 37 + 143 + 37 + 191 + 37 + 208 + 37 + 6 + 208 + 72 + 1 + 116 + 117 + 160 + 15 + 16 + 86 + 1 + 115 + 34 + 224 + 15 + 26 + 42 + 160 + 15 + 97 + 42 + 160 + 15 + 64 + 51 + 80 + 51 + 96 + 51 + 112 + 51 + 128 + 51 + 144 + 51 + 6 + 45 + 47 + 160 + 15 + 95 + 47 + 1 + 80 + 58 + 1 + 208 + 58 + 1 + 58 + 42 + 224 + 15 + 42 + 30 + 200 + 15 + 43 + 35 + 160 + 15 + 34 + 35 +PUSHW_1 + 416 +NPUSHB + 20 + 15 + 127 + 46 + 1 + 144 + 46 + 1 + 16 + 62 + 32 + 62 + 48 + 62 + 3 + 33 + 31 + 224 + 15 + 35 + 31 +PUSHW_1 + 352 +NPUSHB + 51 + 15 + 30 + 31 + 224 + 15 + 41 + 31 + 224 + 15 + 63 + 211 + 1 + 204 + 205 + 224 + 15 + 16 + 90 + 80 + 90 + 96 + 90 + 112 + 87 + 144 + 89 + 144 + 90 + 6 + 110 + 111 + 160 + 15 + 113 + 114 + 18 + 31 + 76 + 75 + 224 + 15 + 15 + 74 + 31 + 74 + 2 + 48 + 95 + 1 + 68 + 69 +PUSHW_1 + 288 +NPUSHB + 12 + 15 + 63 + 69 + 79 + 69 + 2 + 73 + 89 + 224 + 15 + 65 + 22 +PUSHW_1 + 416 +PUSHB_3 + 15 + 71 + 22 +PUSHW_1 + 288 +PUSHB_7 + 15 + 84 + 22 + 160 + 15 + 27 + 25 +PUSHW_1 + 352 +PUSHB_3 + 15 + 25 + 23 +PUSHW_1 + 352 +PUSHB_3 + 15 + 24 + 22 +PUSHW_1 + 288 +NPUSHB + 17 + 15 + 48 + 49 + 224 + 15 + 80 + 59 + 208 + 59 + 2 + 112 + 59 + 128 + 59 + 2 + 63 + 22 +PUSHW_1 + 416 +PUSHB_3 + 15 + 60 + 45 +PUSHW_1 + 288 +PUSHB_3 + 15 + 23 + 22 +PUSHW_1 + 416 +PUSHB_3 + 15 + 22 + 20 +PUSHW_1 + 352 +PUSHB_7 + 15 + 57 + 20 + 224 + 15 + 28 + 21 +PUSHW_1 + 288 +NPUSHB + 74 + 15 + 21 + 20 + 224 + 15 + 20 + 22 + 224 + 15 + 16 + 22 + 1 + 48 + 103 + 1 + 78 + 77 + 15 + 31 + 63 + 77 + 1 + 15 + 112 + 31 + 112 + 2 + 15 + 11 + 55 + 31 + 13 + 12 + 46 + 31 + 16 + 12 + 1 + 95 + 11 + 159 + 11 + 223 + 11 + 3 + 11 + 10 + 38 + 31 + 82 + 81 + 38 + 31 + 63 + 81 + 1 + 78 + 77 + 46 + 31 + 5 + 4 + 46 + 31 + 3 + 2 + 46 + 31 + 1 + 0 + 38 + 31 + 50 + 1 +PUSHW_1 + 511 +SCANCTRL +SCANTYPE +MPPEM +GTEQ +IF +PUSHB_1 + 128 +SCVTCI +EIF +SVTCA[y-axis] +CALL +CALL +CALL +CALL +DELTAC1 +CALL +CALL +DELTAC3 +DELTAC1 +CALL +CALL +DELTAC1 +DELTAC1 +CALL +DELTAC1 +SVTCA[x-axis] +DELTAC1 +CALL +CALL +CALL +CALL +CALL +CALL +CALL +CALL +DELTAC2 +DELTAC3 +CALL +CALL +CALL +CALL +CALL +CALL +CALL +CALL +DELTAC1 +CALL +DELTAC1 +DELTAC1 +CALL +CALL +CALL +DELTAC1 +CALL +DELTAC1 +SVTCA[y-axis] +CALL +CALL +CALL +CALL +DELTAC1 +DELTAC3 +DELTAC1 +CALL +CALL +CALL +CALL +DELTAC2 +DELTAC3 +DELTAC1 +CALL +DELTAC1 +CALL +CALL +CALL +DELTAC1 +CALL +DELTAC1 +DELTAC1 +CALL +CALL +CALL +CALL +DELTAC1 +EndTTInstrs +TtTable: fpgm +PUSHB_3 + 16 + 31 + 15 +FDEF +SWAP +DUP +ROLL +ROLL +RCVT +LT +IF +POP +POP +ELSE +RCVT +WCVTP +EIF +ENDF +FDEF +MPPEM +GT +IF +RCVT +WCVTP +ELSE +POP +POP +EIF +ENDF +FDEF +SWAP +DUP +ROLL +ROLL +RCVT +LT +IF +POP +POP +ELSE +RCVT +PUSHB_1 + 64 +SUB +WCVTP +EIF +ENDF +EndTTInstrs +ShortTable: cvt 229 + 0 + -25 + 0 + -25 + 0 + -25 + -1 + -1 + -1 + -1 + 1509 + 1530 + 1151 + 1180 + 1509 + 1532 + 1509 + 1530 + -342 + -362 + 340 + 342 + 319 + 332 + 309 + 338 + 235 + 322 + 355 + -1 + 232 + 213 + 174 + 191 + 225 + 230 + 1323 + 1354 + 1317 + 1335 + 57 + 186 + 252 + 255 + -1 + 244 + 185 + 217 + 245 + 285 + -1 + 82 + 213 + 60 + 31 + 308 + 307 + 294 + 245 + 292 + 235 + 295 + 338 + 336 + 45 + 319 + 319 + 23 + 238 + 226 + 799 + 326 + 326 + 184 + 1327 + 144 + 158 + 580 + 562 + 463 + 66 + 590 + 569 + 738 + 340 + 340 + 336 + 707 + 258 + 170 + 518 + 354 + 202 + 209 + 164 + 619 + 272 + 223 + 242 + 227 + 209 + 349 + 152 + -178 + 363 + 186 + 279 + 263 + 279 + 291 + 188 + 169 + 696 + 209 + 175 + 197 + 195 + 143 + 160 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 268 + 208 + 168 + 168 + 172 + 170 + 108 + 106 + 180 + 570 + 131 + 1690 + 120 + 140 + 137 + 156 + 163 + 189 + -171 + 288 + 912 + 280 + 598 + 226 + 244 + 220 + 250 + 130 + 48 +EndShort +ShortTable: maxp 16 + 1 + 0 + 456 + 96 + 7 + 70 + 4 + 2 + 16 + 22 + 32 + 0 + 326 + 450 + 3 + 1 +EndShort +LangName: 1033 "+AKkA-1995-1997 The Font Bureau, Inc. All Rights Reserved." "" "Regular" "Charcoal" "" "3.2" "" "Charcoal+AKoA is a trademark of Apple Computer, Inc." +Encoding: Custom +UnicodeInterp: none +NameList: AGL For New Fonts +DisplaySize: -96 +AntiAlias: 1 +FitToEm: 1 +WinInfo: 247 19 9 +BeginPrivate: 0 +EndPrivate +BeginChars: 487 469 + +StartChar: .notdef +Encoding: 409 -1 0 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 6 + 2 + 7 + 1 + 0 + 4 + 0 + 9 + 7 + 1 + 8 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +877 0 m 1,0,-1 + 147 0 l 1,1,-1 + 147 1552 l 1,2,-1 + 877 1552 l 1,3,-1 + 877 0 l 1,0,-1 +727 150 m 1,4,-1 + 727 1403 l 1,5,-1 + 297 1403 l 1,6,-1 + 297 150 l 1,7,-1 + 727 150 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: .null +Encoding: 5 8 1 +AltUni2: 002400.ffffffff.0 00001d.ffffffff.0 002400.ffffffff.0 00001d.ffffffff.0 +Width: 0 +GlyphClass: 1 +Flags: W +LayerCount: 2 +EndChar + +StartChar: nonmarkingreturn +Encoding: 10 13 2 +Width: 510 +GlyphClass: 1 +Flags: W +LayerCount: 2 +EndChar + +StartChar: space +Encoding: 6 9 3 +AltUni2: 000020.ffffffff.0 000020.ffffffff.0 +Width: 510 +GlyphClass: 1 +Flags: W +LayerCount: 2 +EndChar + +StartChar: exclam +Encoding: 24 33 4 +Width: 652 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 28 + 3 + 10 + 2 + 116 + 6 + 66 + 5 + 0 + 63 + 9 + 1 + 1 + 2 + 0 + 3 + 0 + 67 + 7 + 65 + 6 + 67 + 63 + 3 + 144 + 3 + 2 + 3 + 8 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rnd,black] +SRP1 +SRP2 +IP +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,white] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +844 1509 m 1,0,-1 + 578 514 l 1,1,-1 + 311 514 l 1,2,-1 + 505 1509 l 1,3,-1 + 844 1509 l 1,0,-1 +475 0 m 1,4,-1 + 178 0 l 1,5,-1 + 252 319 l 1,6,-1 + 548 319 l 1,7,-1 + 475 0 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: quotedbl +Encoding: 25 34 5 +Width: 945 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 34 + 2 + 6 + 3 + 7 + 16 + 1 + 53 + 0 + 2 + 53 + 3 + 5 + 53 + 4 + 6 + 53 + 7 + 0 + 84 + 16 + 3 + 144 + 3 + 2 + 3 + 4 + 84 + 15 + 7 + 31 + 7 + 2 + 7 + 8 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rnd,black] +SRP0 +MIRP[rnd,black] +SRP0 +MIRP[rnd,black] +SRP0 +MIRP[rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1219 1509 m 1,0,-1 + 1046 1024 l 1,1,-1 + 838 1024 l 1,2,-1 + 901 1509 l 1,3,-1 + 1219 1509 l 1,0,-1 +743 1509 m 1,4,-1 + 570 1024 l 1,5,-1 + 362 1024 l 1,6,-1 + 425 1509 l 1,7,-1 + 743 1509 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: numbersign +Encoding: 26 35 6 +Width: 1421 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 5 + 4 + 1 + 0 + 9 + 31 + 28 + 24 + 25 + 27 + 2 + 3 + 6 + 7 + 10 + 26 + 8 + 12 + 19 + 18 + 15 + 14 + 12 + 13 + 16 + 17 + 20 + 21 + 23 + 29 + 30 + 10 + 11 + 10 + 22 + 12 + 12 + 33 + 32 + 10 + 9 + 6 + 3 + 13 + 68 + 30 + 31 + 3 + 3 + 79 + 16 + 1 + 16 + 20 + 29 + 28 + 2 + 3 + 17 + 68 + 23 + 24 + 27 + 3 + 20 + 12 + 22 + 25 + 26 + 3 + 21 + 10 + 11 + 8 + 7 + 3 + 12 + 0 +SVTCA[y-axis] +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +MIRP[rp0,min,rnd,black] +SLOOP +ALIGNRP +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +SLOOP +ALIGNRP +MIRP[rp0,min,rnd,black] +SLOOP +ALIGNRP +SVTCA[x-axis] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,min,rnd,black] +SLOOP +IP +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,black] +SLOOP +IP +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1687 1151 m 1,0,-1 + 1574 911 l 1,1,-1 + 1224 911 l 1,2,-1 + 1083 598 l 1,3,-1 + 1445 598 l 1,4,-1 + 1336 358 l 1,5,-1 + 976 358 l 1,6,-1 + 811 0 l 1,7,-1 + 651 0 l 1,8,-1 + 814 358 l 1,9,-1 + 597 358 l 1,10,-1 + 434 0 l 1,11,-1 + 274 0 l 1,12,-1 + 435 358 l 1,13,-1 + 83 358 l 1,14,-1 + 187 598 l 1,15,-1 + 544 598 l 1,16,-1 + 685 911 l 1,17,-1 + 325 911 l 1,18,-1 + 429 1151 l 1,19,-1 + 793 1151 l 1,20,-1 + 954 1509 l 1,21,-1 + 1119 1509 l 1,22,-1 + 957 1151 l 1,23,-1 + 1171 1151 l 1,24,-1 + 1331 1509 l 1,25,-1 + 1495 1509 l 1,26,-1 + 1332 1151 l 1,27,-1 + 1687 1151 l 1,0,-1 +1061 911 m 1,28,-1 + 848 911 l 1,29,-1 + 705 598 l 1,30,-1 + 921 598 l 1,31,-1 + 1061 911 l 1,28,-1 +EndSplineSet +EndChar + +StartChar: dollar +Encoding: 27 36 7 +Width: 1107 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 160 + 54 + 14 + 56 + 47 + 85 + 35 + 101 + 18 + 101 + 22 + 119 + 47 + 217 + 13 + 231 + 48 + 247 + 48 + 9 + 5 + 48 + 1 + 43 + 34 + 36 + 47 + 88 + 47 + 3 + 26 + 33 + 34 + 47 + 48 + 3 + 6 + 25 + 117 + 4 + 1 + 4 + 43 + 43 + 71 + 43 + 2 + 23 + 37 + 43 + 14 + 13 + 6 + 6 + 24 + 117 + 5 + 1 + 5 + 25 + 24 + 4 + 32 + 5 + 1 + 5 + 5 + 24 + 6 + 34 + 6 + 43 + 22 + 34 + 22 + 43 + 4 + 34 + 43 + 0 + 40 + 57 + 47 + 1 + 47 + 14 + 44 + 17 + 17 + 40 + 44 + 0 + 4 + 6 + 23 + 10 + 70 + 48 + 13 + 30 + 9 + 3 + 4 + 6 + 5 + 30 + 70 + 33 + 37 + 30 + 29 + 26 + 24 + 23 + 15 + 9 + 44 + 73 + 44 + 2 + 6 + 13 + 14 + 43 + 37 + 23 + 24 + 26 + 33 + 34 + 47 + 48 + 3 + 4 + 14 + 25 + 5 + 5 + 0 + 20 + 79 + 30 + 95 + 30 + 111 + 30 + 3 + 30 + 0 + 23 + 32 + 44 + 80 + 44 + 2 + 44 + 40 + 23 + 9 + 20 + 51 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,min,rnd,black] +SLOOP +IP +DELTAP2 +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MDRP[grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SROUND +MDRP[rnd,grey] +RTG +MIAP[rnd] +MDRP[min,rnd,grey] +MDRP[grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +IP +DELTAP1 +SRP1 +SRP2 +IP +IP +DELTAP1 +SVTCA[x-axis] +SPVTL[orthog] +SRP0 +DELTAP1 +MDRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,black] +SPVTCA[x-axis] +SRP1 +DELTAP1 +SRP2 +SLOOP +IP +DELTAP1 +SRP1 +DELTAP1 +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1139 451 m 0,0,1 + 1093 252 1093 252 939.5 126 c 128,-1,2 + 786 0 786 0 564 -16 c 1,3,-1 + 514 -170 l 1,4,-1 + 379 -170 l 1,5,-1 + 429 -20 l 1,6,7 + 311 -18 311 -18 236 -4 c 128,-1,8 + 161 10 161 10 94 33 c 1,9,-1 + 153 279 l 1,10,11 + 195 256 195 256 272 228.5 c 128,-1,12 + 349 201 349 201 500 199 c 1,13,-1 + 658 668 l 1,14,15 + 649 672 649 672 638 677 c 128,-1,16 + 627 682 627 682 614 688 c 0,17,18 + 484 750 484 750 408 849 c 128,-1,19 + 332 948 332 948 371 1114 c 0,20,21 + 416 1307 416 1307 575.5 1413.5 c 128,-1,22 + 735 1520 735 1520 944 1528 c 1,23,-1 + 1001 1700 l 1,24,-1 + 1138 1700 l 1,25,-1 + 1078 1524 l 1,26,27 + 1144 1518 1144 1518 1201 1506.5 c 128,-1,28 + 1258 1495 1258 1495 1301 1481 c 1,29,-1 + 1248 1253 l 1,30,31 + 1186 1282 1186 1282 1131.5 1292.5 c 128,-1,32 + 1077 1303 1077 1303 1006 1307 c 1,33,-1 + 874 911 l 1,34,35 + 1073 811 1073 811 1121.5 698.5 c 128,-1,36 + 1170 586 1170 586 1139 451 c 0,0,1 +870 1309 m 1,37,38 + 787 1294 787 1294 722.5 1262.5 c 128,-1,39 + 658 1231 658 1231 643 1165 c 0,40,41 + 628 1100 628 1100 646.5 1060 c 128,-1,42 + 665 1020 665 1020 758 971 c 1,43,-1 + 870 1309 l 1,37,38 +845 391 m 0,44,45 + 859 451 859 451 846.5 502 c 128,-1,46 + 834 553 834 553 770 600 c 1,47,-1 + 638 203 l 1,48,49 + 708 217 708 217 766 259 c 128,-1,50 + 824 301 824 301 845 391 c 0,44,45 +EndSplineSet +EndChar + +StartChar: percent +Encoding: 28 37 8 +Width: 1741 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 129 + 4 + 1 + 11 + 5 + 11 + 8 + 4 + 12 + 7 + 15 + 4 + 19 + 11 + 23 + 11 + 26 + 4 + 30 + 20 + 1 + 27 + 5 + 27 + 8 + 20 + 12 + 21 + 15 + 20 + 19 + 27 + 23 + 27 + 26 + 20 + 30 + 37 + 15 + 42 + 17 + 53 + 15 + 54 + 16 + 56 + 17 + 23 + 14 + 14 + 16 + 4 + 43 + 89 + 3 + 87 + 36 + 89 + 10 + 15 + 50 + 89 + 28 + 87 + 57 + 89 + 21 + 5 + 63 + 17 + 1 + 17 + 1 + 14 + 18 + 14 + 52 + 14 + 112 + 14 + 128 + 14 + 5 + 48 + 14 + 1 + 48 + 14 + 1 + 14 + 49 + 15 + 1 + 15 + 63 + 16 + 1 + 63 + 16 + 1 + 16 + 6 + 18 + 88 + 46 + 90 + 54 + 88 + 63 + 24 + 159 + 24 + 2 + 24 + 6 + 0 + 88 + 32 + 90 + 40 + 88 + 31 + 6 + 48 + 6 + 176 + 6 + 3 + 6 + 60 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP1 +MDRP[min,grey] +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP1 +DELTAP1 +MDRP[rp0,min,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1067 1153 m 2,0,1 + 1033 1006 1033 1006 915 915.5 c 128,-1,2 + 797 825 797 825 637 825 c 0,3,4 + 479 825 479 825 397 919.5 c 128,-1,5 + 315 1014 315 1014 347 1151 c 2,6,-1 + 359 1206 l 2,7,8 + 388 1333 388 1333 505.5 1432.5 c 128,-1,9 + 623 1532 623 1532 800 1532 c 0,10,11 + 967 1532 967 1532 1039.5 1439 c 128,-1,12 + 1112 1346 1112 1346 1079 1206 c 2,13,-1 + 1067 1153 l 2,0,1 +1816 1509 m 1,14,-1 + 505 0 l 1,15,-1 + 267 0 l 1,16,-1 + 1578 1509 l 1,17,-1 + 1816 1509 l 1,14,-1 +1722 305 m 2,18,19 + 1684 139 1684 139 1567 58 c 128,-1,20 + 1450 -23 1450 -23 1295 -23 c 0,21,22 + 1127 -23 1127 -23 1049 69.5 c 128,-1,23 + 971 162 971 162 1004 303 c 2,24,-1 + 1016 358 l 2,25,26 + 1044 481 1044 481 1163 582.5 c 128,-1,27 + 1282 684 1282 684 1458 684 c 0,28,29 + 1625 684 1625 684 1696 592 c 128,-1,30 + 1767 500 1767 500 1734 358 c 2,31,-1 + 1722 305 l 2,18,19 +831 1163 m 2,32,-1 + 835 1180 l 2,33,34 + 854 1262 854 1262 843.5 1312 c 128,-1,35 + 833 1362 833 1362 761 1362 c 0,36,37 + 690 1362 690 1362 651.5 1314 c 128,-1,38 + 613 1266 613 1266 593 1180 c 2,39,-1 + 589 1163 l 2,40,41 + 573 1094 573 1094 586.5 1037.5 c 128,-1,42 + 600 981 600 981 675 981 c 0,43,44 + 742 981 742 981 777.5 1033 c 128,-1,45 + 813 1085 813 1085 831 1163 c 2,32,-1 +1488 315 m 2,46,-1 + 1492 332 l 2,47,48 + 1511 414 1511 414 1500.5 464 c 128,-1,49 + 1490 514 1490 514 1419 514 c 0,50,51 + 1348 514 1348 514 1309 466 c 128,-1,52 + 1270 418 1270 418 1250 332 c 2,53,-1 + 1246 315 l 2,54,55 + 1230 246 1230 246 1244 189.5 c 128,-1,56 + 1258 133 1258 133 1333 133 c 0,57,58 + 1399 133 1399 133 1434.5 185.5 c 128,-1,59 + 1470 238 1470 238 1488 315 c 2,46,-1 +EndSplineSet +EndChar + +StartChar: ampersand +Encoding: 29 38 9 +Width: 1346 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 143 + 6 + 7 + 9 + 10 + 11 + 16 + 10 + 19 + 5 + 23 + 5 + 26 + 8 + 30 + 25 + 11 + 26 + 16 + 27 + 19 + 21 + 23 + 21 + 26 + 22 + 35 + 29 + 52 + 37 + 23 + 153 + 11 + 234 + 14 + 17 + 36 + 49 + 68 + 49 + 84 + 49 + 102 + 49 + 4 + 49 + 27 + 30 + 37 + 4 + 0 + 46 + 37 + 52 + 41 + 55 + 58 + 55 + 74 + 55 + 90 + 55 + 185 + 6 + 6 + 15 + 55 + 52 + 6 + 4 + 0 + 18 + 34 + 33 + 33 + 18 + 46 + 3 + 9 + 43 + 31 + 21 + 11 + 61 + 31 + 9 + 1 + 0 + 0 + 47 + 30 + 1 + 49 + 27 + 30 + 37 + 4 + 0 + 46 + 29 + 6 + 41 + 52 + 37 + 55 + 3 + 15 + 55 + 52 + 6 + 4 + 18 + 40 + 88 + 32 + 24 + 1 + 128 + 24 + 208 + 24 + 2 + 24 + 46 + 88 + 18 + 24 + 18 + 34 + 12 + 33 + 34 + 31 + 3 + 43 + 3 + 2 + 3 + 0 + 65 + 58 + 24 + 12 + 64 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,rnd,white] +MDRP[min,grey] +DELTAP1 +MDRP[rp0,rnd,grey] +MDRP[rp0,min,grey] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SRP1 +SLOOP +IP +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[min,rnd,black] +SRP2 +SLOOP +IP +MDAP[rnd] +MDRP[grey] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1334 0 m 1,0,1 + 1258 0 1258 0 1185.5 0 c 128,-1,2 + 1113 0 1113 0 1040 0 c 1,3,4 + 1006 49 1006 49 986 82 c 128,-1,5 + 966 115 966 115 933 168 c 1,6,7 + 816 59 816 59 699 17 c 128,-1,8 + 582 -25 582 -25 475 -25 c 0,9,10 + 266 -25 266 -25 183 79.5 c 128,-1,11 + 100 184 100 184 140 358 c 0,12,13 + 176 512 176 512 278 620.5 c 128,-1,14 + 380 729 380 729 574 848 c 1,15,16 + 494 991 494 991 486.5 1060.5 c 128,-1,17 + 479 1130 479 1130 493 1190 c 0,18,19 + 527 1339 527 1339 646 1434.5 c 128,-1,20 + 765 1530 765 1530 921 1530 c 0,21,22 + 1106 1530 1106 1530 1176 1435.5 c 128,-1,23 + 1246 1341 1246 1341 1215 1206 c 0,24,25 + 1187 1085 1187 1085 1111.5 1001.5 c 128,-1,26 + 1036 918 1036 918 863 805 c 1,27,28 + 896 733 896 733 929.5 675.5 c 128,-1,29 + 963 618 963 618 1014 518 c 1,30,31 + 1110 608 1110 608 1167.5 683 c 128,-1,32 + 1225 758 1225 758 1299 885 c 1,33,-1 + 1479 762 l 1,34,35 + 1416 645 1416 645 1316 521 c 128,-1,36 + 1216 397 1216 397 1136 328 c 1,37,38 + 1220 190 1220 190 1260 122.5 c 128,-1,39 + 1300 55 1300 55 1334 0 c 1,0,1 +961 1176 m 0,40,41 + 975 1235 975 1235 958.5 1274 c 128,-1,42 + 942 1313 942 1313 875 1313 c 0,43,44 + 813 1313 813 1313 779 1269 c 128,-1,45 + 745 1225 745 1225 735 1182 c 0,46,47 + 730 1159 730 1159 738.5 1119 c 128,-1,48 + 747 1079 747 1079 786 993 c 1,49,50 + 866 1051 866 1051 908.5 1092 c 128,-1,51 + 951 1133 951 1133 961 1176 c 0,40,41 +821 360 m 1,52,53 + 767 455 767 455 737 510 c 128,-1,54 + 707 565 707 565 661 657 c 1,55,56 + 552 573 552 573 497.5 509.5 c 128,-1,57 + 443 446 443 446 428 381 c 0,58,59 + 412 311 412 311 442 271 c 128,-1,60 + 472 231 472 231 551 231 c 0,61,62 + 611 231 611 231 677 259 c 128,-1,63 + 743 287 743 287 821 360 c 1,52,53 +EndSplineSet +EndChar + +StartChar: quotesingle +Encoding: 30 39 10 +Width: 472 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 17 + 2 + 3 + 16 + 1 + 53 + 0 + 2 + 53 + 0 + 84 + 15 + 3 + 31 + 3 + 2 + 3 + 4 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rnd,black] +SRP0 +MIRP[rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +734 1509 m 1,0,-1 + 587 1020 l 1,1,-1 + 356 1020 l 1,2,-1 + 436 1509 l 1,3,-1 + 734 1509 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: parenleft +Encoding: 31 40 11 +Width: 786 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 26 + 87 + 5 + 1 + 13 + 75 + 0 + 103 + 7 + 75 + 6 + 7 + 0 + 23 + 10 + 39 + 10 + 119 + 10 + 3 + 10 + 22 + 239 + 3 + 1 + 3 + 14 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +646 -178 m 1,0,1 + 404 -170 404 -170 274 61.5 c 128,-1,2 + 144 293 144 293 235 688 c 0,3,4 + 312 1022 312 1022 556.5 1285 c 128,-1,5 + 801 1548 801 1548 1047 1556 c 1,6,-1 + 1012 1407 l 1,7,8 + 884 1358 884 1358 735 1141 c 128,-1,9 + 586 924 586 924 532 688 c 0,10,11 + 473 434 473 434 524.5 227 c 128,-1,12 + 576 20 576 20 681 -29 c 1,13,-1 + 646 -178 l 1,0,1 +EndSplineSet +EndChar + +StartChar: parenright +Encoding: 32 41 12 +Width: 786 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 21 + 54 + 6 + 1 + 4 + 75 + 3 + 103 + 10 + 75 + 11 + 11 + 3 + 7 + 22 + 47 + 0 + 63 + 0 + 2 + 0 + 15 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +869 688 m 0,0,1 + 780 303 780 303 546 69.5 c 128,-1,2 + 312 -164 312 -164 58 -178 c 1,3,-1 + 92 -29 l 1,4,5 + 255 27 255 27 380 214 c 128,-1,6 + 505 401 505 401 571 688 c 0,7,8 + 625 924 625 924 584.5 1141 c 128,-1,9 + 544 1358 544 1358 424 1407 c 1,10,-1 + 458 1556 l 1,11,12 + 704 1556 704 1556 830 1309.5 c 128,-1,13 + 956 1063 956 1063 869 688 c 0,0,1 +EndSplineSet +EndChar + +StartChar: asterisk +Encoding: 33 42 13 +Width: 1021 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 50 + 63 + 0 + 54 + 4 + 48 + 8 + 48 + 9 + 58 + 13 + 63 + 17 + 122 + 11 + 117 + 15 + 8 + 4 + 1 + 7 + 89 + 13 + 16 + 10 + 63 + 19 + 1 + 52 + 0 + 1 + 0 + 59 + 9 + 1 + 9 + 4 + 47 + 13 + 59 + 13 + 239 + 13 + 3 + 63 + 13 + 1 + 13 + 13 + 19 + 18 +SRP1 +SRP2 +IP +RTHG +MDAP[rnd] +DELTAP1 +DELTAP1 +ALIGNRP +MDRP[min,rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +RTG +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1139 850 m 1,0,-1 + 892 850 l 1,1,-1 + 1049 625 l 1,2,-1 + 907 502 l 1,3,-1 + 695 805 l 1,4,-1 + 343 502 l 1,5,-1 + 257 625 l 1,6,-1 + 518 850 l 1,7,-1 + 271 850 l 1,8,-1 + 310 1020 l 1,9,-1 + 544 1020 l 1,10,-1 + 397 1231 l 1,11,-1 + 540 1354 l 1,12,-1 + 752 1051 l 1,13,-1 + 1103 1354 l 1,14,-1 + 1189 1231 l 1,15,-1 + 944 1020 l 1,16,-1 + 1179 1020 l 1,17,-1 + 1139 850 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: plus +Encoding: 34 43 14 +Width: 1100 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 3 + 104 + 1 + 4 + 69 + 8 + 104 + 10 + 7 + 70 + 0 + 104 + 10 + 1 + 69 + 5 + 104 + 7 + 47 + 4 + 1 + 4 + 4 + 13 + 12 +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1132 582 m 1,0,-1 + 790 582 l 1,1,-1 + 707 225 l 1,2,-1 + 497 225 l 1,3,-1 + 579 582 l 1,4,-1 + 237 582 l 1,5,-1 + 287 799 l 1,6,-1 + 630 799 l 1,7,-1 + 712 1155 l 1,8,-1 + 922 1155 l 1,9,-1 + 840 799 l 1,10,-1 + 1182 799 l 1,11,-1 + 1132 582 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: comma +Encoding: 35 44 15 +Width: 538 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 24 + 5 + 1 + 22 + 1 + 2 + 4 + 3 + 86 + 9 + 85 + 7 + 0 + 7 + 102 + 0 + 71 + 0 + 4 + 16 + 4 + 2 + 4 + 8 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +430 0 m 2,0,1 + 389 -178 389 -178 274.5 -257 c 128,-1,2 + 160 -336 160 -336 36 -336 c 1,3,-1 + 65 -209 l 1,4,5 + 143 -209 143 -209 198 -174 c 128,-1,6 + 253 -139 253 -139 285 0 c 1,7,-1 + 114 0 l 1,8,-1 + 192 340 l 1,9,-1 + 508 340 l 1,10,-1 + 430 0 l 2,0,1 +EndSplineSet +EndChar + +StartChar: hyphen +Encoding: 36 45 16 +AltUni2: 002010.ffffffff.0 0000ad.ffffffff.0 002010.ffffffff.0 0000ad.ffffffff.0 +Width: 1102 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 1 + 68 + 2 + 70 + 48 + 0 + 80 + 0 + 144 + 0 + 3 + 0 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1135 561 m 1,0,-1 + 222 561 l 1,1,-1 + 277 799 l 1,2,-1 + 1190 799 l 1,3,-1 + 1135 561 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: period +Encoding: 37 46 17 +Width: 537 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 2 + 72 + 1 + 0 + 0 + 71 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +424 0 m 1,0,-1 + 121 0 l 1,1,-1 + 196 326 l 1,2,-1 + 499 326 l 1,3,-1 + 424 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: slash +Encoding: 38 47 18 +Width: 883 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 36 + 41 + 3 + 70 + 1 + 86 + 1 + 121 + 3 + 153 + 3 + 5 + 0 + 100 + 3 + 1 + 100 + 2 + 2 + 3 + 51 + 3 + 1 + 3 + 61 + 2 + 1 + 2 + 4 + 1 + 63 + 2 + 1 + 2 + 0 + 3 + 10 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1287 1509 m 1,0,-1 + 129 -170 l 1,1,-1 + -80 -170 l 1,2,-1 + 1077 1509 l 1,3,-1 + 1287 1509 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: zero +Encoding: 39 48 19 +Width: 1102 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 134 + 26 + 150 + 26 + 2 + 18 + 35 + 10 + 15 + 25 + 35 + 3 + 5 + 0 + 25 + 47 + 14 + 48 + 14 + 127 + 14 + 3 + 32 + 14 + 59 + 14 + 79 + 14 + 112 + 14 + 160 + 14 + 5 + 14 + 70 + 22 + 25 + 54 + 6 + 1 + 223 + 6 + 1 + 159 + 6 + 1 + 6 + 28 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP3 +DELTAP2 +DELTAP1 +MIRP[min,rnd,black] +SROUND +MDRP[rp0,min,rnd,grey] +RTG +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1210 688 m 2,0,1 + 1127 328 1127 328 952.5 151.5 c 128,-1,2 + 778 -25 778 -25 546 -25 c 256,3,4 + 314 -25 314 -25 221 151.5 c 128,-1,5 + 128 328 128 328 211 688 c 2,6,-1 + 239 811 l 2,7,8 + 318 1155 318 1155 488.5 1343.5 c 128,-1,9 + 659 1532 659 1532 905 1532 c 256,10,11 + 1151 1532 1151 1532 1234 1343.5 c 128,-1,12 + 1317 1155 1317 1155 1238 811 c 2,13,-1 + 1210 688 l 2,0,1 +906 729 m 2,14,-1 + 915 770 l 2,15,16 + 985 1075 985 1075 974 1189 c 128,-1,17 + 963 1303 963 1303 852 1303 c 256,18,19 + 741 1303 741 1303 677.5 1189 c 128,-1,20 + 614 1075 614 1075 544 770 c 2,21,-1 + 535 729 l 2,22,23 + 465 424 465 424 477.5 314.5 c 128,-1,24 + 490 205 490 205 599 205 c 0,25,26 + 710 205 710 205 773 314.5 c 128,-1,27 + 836 424 836 424 906 729 c 2,14,-1 +EndSplineSet +EndChar + +StartChar: one +Encoding: 40 49 20 +Width: 1091 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 15 + 3 + 46 + 4 + 7 + 14 + 1 + 4 + 0 + 24 + 7 + 3 + 1 + 1 + 10 + 9 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +772 0 m 1,0,-1 + 485 0 l 1,1,-1 + 750 1149 l 1,2,-1 + 554 1149 l 1,3,-1 + 596 1331 l 1,4,5 + 732 1343 732 1343 817.5 1408 c 128,-1,6 + 903 1473 903 1473 932 1509 c 1,7,-1 + 1120 1509 l 1,8,-1 + 772 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: two +Encoding: 41 50 21 +Width: 1101 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 50 + 52 + 20 + 213 + 20 + 2 + 22 + 20 + 1 + 12 + 8 + 35 + 15 + 15 + 57 + 2 + 217 + 2 + 2 + 2 + 21 + 34 + 1 + 4 + 5 + 21 + 107 + 21 + 118 + 21 + 3 + 21 + 0 + 18 + 25 + 32 + 5 + 81 + 5 + 128 + 5 + 226 + 5 + 4 + 5 + 2 + 11 + 49 + 12 + 2 + 23 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1031 0 m 1,0,-1 + 75 0 l 1,1,-1 + 133 254 l 1,2,3 + 572 590 572 590 745 756 c 128,-1,4 + 918 922 918 922 949 1055 c 0,5,6 + 972 1155 972 1155 945 1227.5 c 128,-1,7 + 918 1300 918 1300 824 1300 c 0,8,9 + 720 1300 720 1300 677 1258.5 c 128,-1,10 + 634 1217 634 1217 603 1159 c 1,11,-1 + 333 1159 l 1,12,13 + 419 1352 419 1352 569 1441 c 128,-1,14 + 719 1530 719 1530 921 1530 c 0,15,16 + 1139 1530 1139 1530 1227.5 1406 c 128,-1,17 + 1316 1282 1316 1282 1273 1098 c 0,18,19 + 1228 901 1228 901 1020 697.5 c 128,-1,20 + 812 494 812 494 387 225 c 1,21,-1 + 1083 225 l 1,22,-1 + 1031 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: three +Encoding: 42 51 22 +Width: 1102 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 60 + 38 + 17 + 52 + 18 + 18 + 3 + 32 + 29 + 25 + 35 + 32 + 15 + 7 + 10 + 35 + 6 + 3 + 5 + 38 + 18 + 18 + 0 + 6 + 35 + 22 + 22 + 0 + 25 + 80 + 13 + 1 + 16 + 13 + 32 + 13 + 112 + 13 + 240 + 13 + 4 + 13 + 6 + 28 + 49 + 29 + 71 + 7 + 15 + 6 + 31 + 6 + 47 + 6 + 63 + 6 + 111 + 6 + 5 + 6 + 41 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[grey] +SROUND +MDRP[rp0,rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1129 438 m 0,0,1 + 1081 229 1081 229 916 102 c 128,-1,2 + 751 -25 751 -25 532 -25 c 0,3,4 + 339 -25 339 -25 234.5 53 c 128,-1,5 + 130 131 130 131 97 252 c 1,6,-1 + 319 379 l 1,7,8 + 329 311 329 311 392 260 c 128,-1,9 + 455 209 455 209 558 209 c 0,10,11 + 660 209 660 209 735.5 275.5 c 128,-1,12 + 811 342 811 342 839 465 c 0,13,14 + 861 561 861 561 821.5 623.5 c 128,-1,15 + 782 686 782 686 672 686 c 2,16,-1 + 530 686 l 1,17,-1 + 580 899 l 1,18,-1 + 728 899 l 2,19,20 + 825 899 825 899 885 948 c 128,-1,21 + 945 997 945 997 968 1096 c 0,22,23 + 990 1192 990 1192 965 1247.5 c 128,-1,24 + 940 1303 940 1303 852 1303 c 0,25,26 + 772 1303 772 1303 722 1273 c 128,-1,27 + 672 1243 672 1243 638 1190 c 1,28,-1 + 385 1190 l 1,29,30 + 444 1329 444 1329 577.5 1430.5 c 128,-1,31 + 711 1532 711 1532 905 1532 c 0,32,33 + 1135 1532 1135 1532 1221 1417.5 c 128,-1,34 + 1307 1303 1307 1303 1269 1139 c 0,35,36 + 1235 991 1235 991 1148.5 912.5 c 128,-1,37 + 1062 834 1062 834 977 811 c 1,38,39 + 1067 772 1067 772 1115.5 680 c 128,-1,40 + 1164 588 1164 588 1129 438 c 0,0,1 +EndSplineSet +EndChar + +StartChar: four +Encoding: 43 52 23 +Width: 1102 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 150 + 13 + 1 + 12 + 16 + 13 +PUSHW_1 + -16 +NPUSHB + 48 + 13 + 33 + 6 + 12 + 33 + 7 + 6 + 7 + 6 + 9 + 13 + 34 + 1 + 4 + 4 + 3 + 12 + 7 + 14 + 3 + 4 + 0 + 9 + 2 + 24 + 7 + 12 + 3 + 13 + 43 + 6 + 59 + 6 + 2 + 6 + 31 + 5 + 79 + 5 + 143 + 5 + 144 + 5 + 240 + 5 + 5 + 5 + 14 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MDRP[grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[grey] +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +SFVTCA[x-axis] +MIRP[rp0,min,rnd,black] +SVTCA[x-axis] +SHPIX +SVTCA[y-axis] +SHPIX +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP3 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1154 438 m 1,0,-1 + 1054 438 l 1,1,-1 + 953 0 l 1,2,-1 + 668 0 l 1,3,-1 + 769 438 l 1,4,-1 + 154 438 l 1,5,-1 + 206 729 l 1,6,-1 + 1112 1509 l 1,7,-1 + 1302 1509 l 1,8,-1 + 1105 657 l 1,9,-1 + 1205 657 l 1,10,-1 + 1154 438 l 1,0,-1 +823 657 m 1,11,-1 + 929 1116 l 1,12,-1 + 396 657 l 1,13,-1 + 823 657 l 1,11,-1 +EndSplineSet +EndChar + +StartChar: five +Encoding: 44 53 24 +Width: 1103 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 83 + 87 + 1 + 87 + 15 + 2 + 63 + 24 + 79 + 24 + 2 + 24 + 43 + 21 + 19 + 63 + 25 + 79 + 25 + 2 + 25 + 43 + 20 + 20 + 21 + 20 + 19 + 70 + 16 + 35 + 25 + 28 + 28 + 3 + 24 + 34 + 21 + 14 + 7 + 10 + 35 + 6 + 3 + 5 + 23 + 68 + 0 + 25 + 47 + 13 + 1 + 16 + 13 + 32 + 13 + 48 + 13 + 224 + 13 + 4 + 13 + 6 + 24 + 19 + 25 + 21 + 20 + 71 + 7 + 15 + 6 + 31 + 6 + 47 + 6 + 63 + 6 + 79 + 6 + 95 + 6 + 6 + 6 + 31 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[grey] +SROUND +MDRP[rp0,rnd,grey] +RTG +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MIRP[min,rnd,black] +SRP2 +IP +MDAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +MDRP[grey] +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[min,rnd,black] +DELTAP1 +MDRP[grey] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1183 551 m 0,0,1 + 1113 246 1113 246 929.5 109.5 c 128,-1,2 + 746 -27 746 -27 506 -27 c 0,3,4 + 327 -27 327 -27 221 51 c 128,-1,5 + 115 129 115 129 79 297 c 1,6,-1 + 318 426 l 1,7,8 + 335 311 335 311 394 259 c 128,-1,9 + 453 207 453 207 545 207 c 0,10,11 + 663 207 663 207 741.5 286 c 128,-1,12 + 820 365 820 365 855 520 c 0,13,14 + 889 668 889 668 847 743.5 c 128,-1,15 + 805 819 805 819 694 819 c 0,16,17 + 638 819 638 819 573.5 795.5 c 128,-1,18 + 509 772 509 772 441 721 c 1,19,-1 + 283 834 l 1,20,-1 + 466 1509 l 1,21,-1 + 1264 1509 l 1,22,-1 + 1212 1284 l 1,23,-1 + 645 1284 l 1,24,-1 + 568 1004 l 1,25,26 + 629 1044 629 1044 714 1057.5 c 128,-1,27 + 799 1071 799 1071 834 1071 c 0,28,29 + 1040 1071 1040 1071 1137.5 923.5 c 128,-1,30 + 1235 776 1235 776 1183 551 c 0,0,1 +EndSplineSet +EndChar + +StartChar: six +Encoding: 45 54 25 +Width: 1103 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1210 539 m 0,0,1 + 1150 281 1150 281 978.5 128 c 128,-1,2 + 807 -25 807 -25 565 -25 c 0,3,4 + 306 -25 306 -25 213 122 c 0,5,6 + 117 270 117 270 172 573 c 0,7,8 + 175 592 175 592 182 619 c 0,9,10 + 184 627 184 627 189 647 c 0,11,12 + 200 692 200 692 203 705 c 0,13,14 + 303 1067 303 1067 510.5 1296.5 c 128,-1,15 + 718 1526 718 1526 1000 1526 c 0,16,17 + 1074 1526 1074 1526 1128 1515.5 c 128,-1,18 + 1182 1505 1182 1505 1227 1495 c 1,19,-1 + 1167 1235 l 1,20,21 + 1107 1251 1107 1251 1051.5 1261.5 c 128,-1,22 + 996 1272 996 1272 941 1272 c 0,23,24 + 810 1272 810 1272 717.5 1178.5 c 128,-1,25 + 625 1085 625 1085 576 926 c 1,26,27 + 615 977 615 977 707 1018 c 128,-1,28 + 799 1059 799 1059 871 1059 c 0,29,30 + 1088 1059 1088 1059 1177.5 923.5 c 128,-1,31 + 1267 788 1267 788 1210 539 c 0,0,1 +888 514 m 0,32,33 + 925 674 925 674 885 749.5 c 128,-1,34 + 845 825 845 825 749 825 c 0,35,36 + 663 825 663 825 582.5 750.5 c 128,-1,37 + 502 676 502 676 465 514 c 0,38,39 + 427 348 427 348 466.5 276.5 c 128,-1,40 + 506 205 506 205 605 205 c 0,41,42 + 702 205 702 205 775.5 275.5 c 128,-1,43 + 849 346 849 346 888 514 c 0,32,33 +EndSplineSet +EndChar + +StartChar: seven +Encoding: 46 55 26 +Width: 1102 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1321 1253 m 1,0,1 + 1064 1103 1064 1103 855 802 c 0,2,3 + 671 537 671 537 575 119 c 0,4,5 + 561 60 561 60 550 0 c 1,6,-1 + 243 0 l 1,7,8 + 323 346 323 346 545 712.5 c 128,-1,9 + 767 1079 767 1079 1090 1284 c 1,10,-1 + 355 1284 l 1,11,-1 + 407 1509 l 1,12,-1 + 1380 1509 l 1,13,-1 + 1321 1253 l 1,0,1 +EndSplineSet +EndChar + +StartChar: eight +Encoding: 47 56 27 +Width: 1101 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 45 + 104 + 2 + 121 + 2 + 2 + 22 + 10 + 41 + 52 + 35 + 29 + 35 + 35 + 3 + 16 + 15 + 47 + 35 + 3 + 5 + 26 + 57 + 19 + 64 + 38 + 57 + 22 + 10 + 16 + 0 + 79 + 0 + 143 + 0 + 3 + 0 + 6 + 32 + 57 + 13 + 64 + 44 + 57 + 6 + 50 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +IP +IP +MIRP[min,rnd,black] +MIRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +SRP2 +IP +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1124 446 m 0,0,1 + 1073 227 1073 227 914.5 101 c 128,-1,2 + 756 -25 756 -25 545 -25 c 0,3,4 + 318 -25 318 -25 224.5 90 c 128,-1,5 + 131 205 131 205 181 421 c 0,6,7 + 207 534 207 534 292.5 640 c 128,-1,8 + 378 746 378 746 501 791 c 1,9,-1 + 506 813 l 1,10,11 + 417 848 417 848 386 932 c 128,-1,12 + 355 1016 355 1016 383 1139 c 0,13,14 + 420 1300 420 1300 560 1415 c 128,-1,15 + 700 1530 700 1530 904 1530 c 0,16,17 + 1111 1530 1111 1530 1193 1416.5 c 128,-1,18 + 1275 1303 1275 1303 1234 1126 c 0,19,20 + 1208 1012 1208 1012 1139.5 929 c 128,-1,21 + 1071 846 1071 846 978 813 c 1,22,-1 + 973 791 l 1,23,24 + 1070 756 1070 756 1113.5 672 c 128,-1,25 + 1157 588 1157 588 1124 446 c 0,0,1 +959 1100 m 0,26,27 + 983 1202 983 1202 955 1251 c 128,-1,28 + 927 1300 927 1300 851 1300 c 256,29,30 + 775 1300 775 1300 725 1250 c 128,-1,31 + 675 1200 675 1200 652 1100 c 0,32,33 + 627 993 627 993 656.5 946 c 128,-1,34 + 686 899 686 899 758 899 c 0,35,36 + 821 899 821 899 877 944 c 128,-1,37 + 933 989 933 989 959 1100 c 0,26,27 +844 438 m 0,38,39 + 874 567 874 567 838 626.5 c 128,-1,40 + 802 686 802 686 709 686 c 0,41,42 + 619 686 619 686 555.5 629.5 c 128,-1,43 + 492 573 492 573 461 438 c 0,44,45 + 433 315 433 315 470 260 c 128,-1,46 + 507 205 507 205 598 205 c 0,47,48 + 682 205 682 205 749 260 c 128,-1,49 + 816 315 816 315 844 438 c 0,38,39 +EndSplineSet +EndChar + +StartChar: nine +Encoding: 48 57 28 +Width: 1103 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1256 801 m 0,0,1 + 1139 413 1139 413 949 204 c 0,2,3 + 747 -20 747 -20 459 -20 c 0,4,5 + 385 -20 385 -20 331 -9.5 c 128,-1,6 + 277 1 277 1 232 11 c 1,7,-1 + 292 271 l 1,8,9 + 352 255 352 255 407.5 244.5 c 128,-1,10 + 463 234 463 234 517 234 c 0,11,12 + 652 234 652 234 746 327 c 128,-1,13 + 840 420 840 420 883 580 c 1,14,15 + 844 529 844 529 752 488 c 128,-1,16 + 660 447 660 447 587 447 c 0,17,18 + 370 447 370 447 282 582.5 c 128,-1,19 + 194 718 194 718 251 967 c 0,20,21 + 311 1225 311 1225 481 1378 c 128,-1,22 + 651 1531 651 1531 893 1531 c 0,23,24 + 1152 1531 1152 1531 1245 1384 c 0,25,26 + 1334 1248 1334 1248 1286 933 c 0,27,28 + 1283 910 1283 910 1275 876 c 0,29,30 + 1273 868 1273 868 1271 859 c 0,31,32 + 1260 814 1260 814 1256 801 c 0,0,1 +993 989 m 0,33,34 + 1031 1155 1031 1155 991.5 1226.5 c 128,-1,35 + 952 1298 952 1298 852 1298 c 0,36,37 + 755 1298 755 1298 683.5 1227.5 c 128,-1,38 + 612 1157 612 1157 573 989 c 0,39,40 + 536 829 536 829 574.5 753.5 c 128,-1,41 + 613 678 613 678 709 678 c 0,42,43 + 795 678 795 678 875.5 752.5 c 128,-1,44 + 956 827 956 827 993 989 c 0,33,34 +EndSplineSet +EndChar + +StartChar: colon +Encoding: 49 58 29 +Width: 470 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 1 + 71 + 2 + 12 + 6 + 71 + 5 + 0 + 4 + 0 + 71 + 5 + 144 + 1 + 160 + 1 + 2 + 1 + 8 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +582 823 m 1,0,-1 + 279 823 l 1,1,-1 + 354 1149 l 1,2,-1 + 658 1149 l 1,3,-1 + 582 823 l 1,0,-1 +392 0 m 1,4,-1 + 89 0 l 1,5,-1 + 164 326 l 1,6,-1 + 468 326 l 1,7,-1 + 392 0 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: semicolon +Encoding: 50 59 30 +AltUni2: 00037e.ffffffff.0 00037e.ffffffff.0 +Width: 470 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 6 + 6 + 22 + 6 + 2 + 1 + 72 + 2 + 12 + 8 + 7 + 86 + 15 + 13 + 1 + 13 + 72 + 12 + 0 + 11 + 102 + 4 + 0 + 71 + 0 + 8 + 16 + 8 + 2 + 8 + 13 + 144 + 1 + 160 + 1 + 2 + 1 + 15 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +582 823 m 1,0,-1 + 279 823 l 1,1,-1 + 354 1149 l 1,2,-1 + 658 1149 l 1,3,-1 + 582 823 l 1,0,-1 +399 27 m 2,4,5 + 358 -152 358 -152 246.5 -244 c 128,-1,6 + 135 -336 135 -336 12 -336 c 1,7,-1 + 41 -209 l 1,8,9 + 119 -209 119 -209 169 -174 c 128,-1,10 + 219 -139 219 -139 251 0 c 1,11,-1 + 89 0 l 1,12,-1 + 164 326 l 1,13,-1 + 468 326 l 1,14,-1 + 399 27 l 2,4,5 +EndSplineSet +EndChar + +StartChar: less +Encoding: 51 60 31 +Width: 948 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 44 + 48 + 0 + 48 + 3 + 2 + 59 + 4 + 53 + 6 + 2 + 4 + 3 + 2 + 6 + 0 + 1 + 14 + 0 + 30 + 0 + 2 + 0 + 1 + 1 + 3 + 17 + 3 + 2 + 3 + 5 + 48 + 1 + 1 + 1 + 92 + 2 + 5 + 0 + 1 + 4 + 0 + 8 + 1 + 7 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +DELTAP1 +IP +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +880 94 m 1,0,-1 + 183 496 l 1,1,-1 + 229 698 l 1,2,-1 + 1113 1100 l 1,3,-1 + 1055 852 l 1,4,-1 + 502 594 l 1,5,-1 + 938 342 l 1,6,-1 + 880 94 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: equal +Encoding: 52 61 32 +Width: 1099 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 5 + 68 + 6 + 1 + 68 + 2 + 0 + 4 + 9 + 1 + 5 + 8 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1153 715 m 1,0,-1 + 279 715 l 1,1,-1 + 334 952 l 1,2,-1 + 1208 952 l 1,3,-1 + 1153 715 l 1,0,-1 +1042 236 m 1,4,-1 + 168 236 l 1,5,-1 + 223 473 l 1,6,-1 + 1097 473 l 1,7,-1 + 1042 236 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: greater +Encoding: 53 62 33 +Width: 948 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +112 94 m 1,0,-1 + 169 342 l 1,1,-1 + 721 594 l 1,2,-1 + 287 852 l 1,3,-1 + 344 1100 l 1,4,-1 + 1042 698 l 1,5,-1 + 995 496 l 1,6,-1 + 112 94 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: question +Encoding: 54 63 34 +Width: 853 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 53 + 5 + 2 + 5 + 31 + 20 + 31 + 134 + 2 + 149 + 2 + 170 + 16 + 234 + 16 + 7 + 25 + 69 + 22 + 34 + 26 + 69 + 29 + 15 + 10 + 117 + 34 + 72 + 33 + 0 + 63 + 37 + 1 + 0 + 22 + 112 + 19 + 224 + 19 + 2 + 19 + 33 + 9 + 32 + 65 + 10 + 33 + 63 + 25 + 79 + 25 + 2 + 25 + 36 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,white] +MIAP[rnd] +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1126 1208 m 0,0,1 + 1104 1114 1104 1114 1053.5 1035 c 128,-1,2 + 1003 956 1003 956 881 889 c 0,3,4 + 785 836 785 836 725 765 c 128,-1,5 + 665 694 665 694 646 612 c 0,6,7 + 636 567 636 567 630 541.5 c 128,-1,8 + 624 516 624 516 612 465 c 1,9,-1 + 358 465 l 1,10,11 + 358 465 358 465 374 534.5 c 128,-1,12 + 390 604 390 604 401 653 c 0,13,14 + 422 743 422 743 486 825 c 128,-1,15 + 550 907 550 907 628 956 c 0,16,17 + 731 1022 731 1022 767.5 1061 c 128,-1,18 + 804 1100 804 1100 821 1174 c 0,19,20 + 835 1235 835 1235 802.5 1272 c 128,-1,21 + 770 1309 770 1309 663 1309 c 0,22,23 + 568 1309 568 1309 466 1266 c 128,-1,24 + 364 1223 364 1223 296 1176 c 1,25,-1 + 348 1399 l 1,26,27 + 435 1456 435 1456 539.5 1493 c 128,-1,28 + 644 1530 644 1530 791 1530 c 0,29,30 + 1014 1530 1014 1530 1084.5 1431.5 c 128,-1,31 + 1155 1333 1155 1333 1126 1208 c 0,0,1 +525 0 m 1,32,-1 + 234 0 l 1,33,-1 + 308 322 l 1,34,-1 + 599 322 l 1,35,-1 + 525 0 l 1,32,-1 +EndSplineSet +EndChar + +StartChar: at +Encoding: 55 64 35 +Width: 1734 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 115 + 42 + 10 + 44 + 48 + 44 + 52 + 54 + 52 + 54 + 54 + 86 + 55 + 119 + 33 + 135 + 13 + 8 + 6 + 28 + 68 + 94 + 3 + 9 + 62 + 94 + 18 + 21 + 15 + 9 + 15 + 47 + 53 + 34 + 46 + 53 + 15 + 43 + 40 + 46 + 64 + 44 + 1 + 44 + 47 + 18 + 22 + 63 + 25 + 1 + 25 + 73 + 60 + 18 + 1 + 18 + 59 + 6 + 91 + 6 + 107 + 6 + 123 + 6 + 139 + 6 + 155 + 6 + 6 + 6 + 64 + 56 + 128 + 56 + 2 + 56 + 63 + 65 + 1 + 65 + 73 + 9 + 12 + 48 + 12 + 192 + 12 + 3 + 12 + 44 + 12 + 44 + 0 + 50 + 0 + 93 + 96 + 31 + 127 + 31 + 2 + 31 + 23 + 37 + 71 + 37 + 87 + 37 + 3 + 37 + 93 + 40 + 50 + 1 + 50 + 71 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1812 688 m 0,0,1 + 1767 494 1767 494 1636 332 c 128,-1,2 + 1505 170 1505 170 1351 170 c 0,3,4 + 1237 170 1237 170 1190.5 213 c 128,-1,5 + 1144 256 1144 256 1151 362 c 1,6,7 + 1100 260 1100 260 1035 214 c 128,-1,8 + 970 168 970 168 859 168 c 0,9,10 + 737 168 737 168 675.5 265 c 128,-1,11 + 614 362 614 362 666 588 c 0,12,13 + 710 778 710 778 827.5 902 c 128,-1,14 + 945 1026 945 1026 1110 1026 c 0,15,16 + 1173 1026 1173 1026 1211.5 998.5 c 128,-1,17 + 1250 971 1250 971 1261 928 c 1,18,19 + 1267 956 1267 956 1274.5 988 c 128,-1,20 + 1282 1020 1282 1020 1282 1020 c 1,21,-1 + 1460 1020 l 1,22,23 + 1460 1020 1460 1020 1414 825.5 c 128,-1,24 + 1368 631 1368 631 1336 494 c 0,25,26 + 1317 412 1317 412 1329.5 382 c 128,-1,27 + 1342 352 1342 352 1383 352 c 0,28,29 + 1480 352 1480 352 1544.5 465 c 128,-1,30 + 1609 578 1609 578 1629 668 c 0,31,32 + 1704 995 1704 995 1587.5 1177.5 c 128,-1,33 + 1471 1360 1471 1360 1211 1360 c 0,34,35 + 975 1360 975 1360 750.5 1144 c 128,-1,36 + 526 928 526 928 449 594 c 0,37,38 + 366 233 366 233 485 35.5 c 128,-1,39 + 604 -162 604 -162 863 -162 c 0,40,41 + 943 -162 943 -162 1046.5 -142.5 c 128,-1,42 + 1150 -123 1150 -123 1223 -86 c 1,43,-1 + 1182 -262 l 1,44,45 + 1116 -295 1116 -295 1025 -319.5 c 128,-1,46 + 934 -344 934 -344 821 -344 c 0,47,48 + 463 -344 463 -344 309.5 -89 c 128,-1,49 + 156 166 156 166 255 594 c 0,50,51 + 350 1004 350 1004 634 1272 c 128,-1,52 + 918 1540 918 1540 1254 1540 c 0,53,54 + 1591 1540 1591 1540 1749 1319 c 128,-1,55 + 1907 1098 1907 1098 1812 688 c 0,0,1 +1181 584 m 0,56,57 + 1190 623 1190 623 1190 623 c 129,-1,58 + 1190 623 1190 623 1200 666 c 0,59,60 + 1221 756 1221 756 1191.5 809 c 128,-1,61 + 1162 862 1162 862 1072 862 c 0,62,63 + 996 862 996 862 938.5 794.5 c 128,-1,64 + 881 727 881 727 848 582 c 0,65,66 + 829 500 829 500 842.5 422 c 128,-1,67 + 856 344 856 344 942 344 c 0,68,69 + 1024 344 1024 344 1090.5 412.5 c 128,-1,70 + 1157 481 1157 481 1181 584 c 0,56,57 +EndSplineSet +EndChar + +StartChar: A +Encoding: 56 65 36 +Width: 1262 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 111 + 24 + 6 + 40 + 6 + 55 + 5 + 57 + 6 + 135 + 7 + 150 + 7 + 6 + 8 + 9 + 123 + 9 + 137 + 9 + 169 + 9 + 186 + 9 + 5 + 9 + 57 + 4 + 9 + 7 + 57 + 8 + 1 + 8 + 2 + 8 + 1 + 1 + 1 + 57 + 42 + 0 + 57 + 0 + 2 + 0 + 0 + 7 + 61 + 9 + 183 + 9 + 2 + 9 + 58 + 6 + 10 + 3 + 6 + 4 + 38 + 4 + 59 + 4 + 203 + 4 + 219 + 4 + 237 + 4 + 6 + 4 + 58 + 5 + 5 + 6 + 6 + 7 + 9 + 4 + 1 + 3 + 2 + 10 + 8 + 9 + 0 + 5 + 235 + 0 + 1 + 0 + 12 + 5 + 11 + 2 + 3 + 30 + 8 + 10 + 9 + 10 + 4 + 6 + 7 + 6 + 10 + 1 + 4 + 0 + 5 + 0 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +MDRP[grey] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +MDRP[grey] +DELTAP1 +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1257 0 m 1,0,-1 + 934 0 l 1,1,-1 + 914 362 l 1,2,-1 + 451 362 l 1,3,-1 + 261 0 l 1,4,-1 + 4 0 l 1,5,-1 + 824 1509 l 1,6,-1 + 1119 1509 l 1,7,-1 + 1257 0 l 1,0,-1 +897 580 m 1,8,-1 + 853 1135 l 1,9,-1 + 563 580 l 1,10,-1 + 897 580 l 1,8,-1 +EndSplineSet +EndChar + +StartChar: B +Encoding: 57 66 37 +Width: 1202 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 63 + 5 + 8 + 22 + 8 + 69 + 14 + 73 + 31 + 87 + 14 + 117 + 10 + 150 + 10 + 184 + 2 + 182 + 10 + 215 + 13 + 10 + 6 + 12 + 22 + 12 + 2 + 12 + 28 + 33 + 20 + 20 + 5 + 4 + 19 + 31 + 5 + 10 + 29 + 31 + 4 + 0 + 215 + 9 + 1 + 9 + 65 + 15 + 0 + 23 + 61 + 24 + 111 + 24 + 240 + 24 + 3 + 24 + 4 + 20 + 28 + 20 + 4 + 33 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1233 479 m 0,0,1 + 1180 250 1180 250 1018 125 c 128,-1,2 + 856 0 856 0 622 0 c 2,3,-1 + 134 0 l 1,4,-1 + 482 1509 l 1,5,-1 + 980 1509 l 2,6,7 + 1193 1509 1193 1509 1264 1428.5 c 128,-1,8 + 1335 1348 1335 1348 1302 1204 c 0,9,10 + 1273 1077 1273 1077 1200.5 1003.5 c 128,-1,11 + 1128 930 1128 930 1008 907 c 1,12,13 + 1145 887 1145 887 1210.5 776.5 c 128,-1,14 + 1276 666 1276 666 1233 479 c 0,0,1 +985 1122 m 0,15,16 + 1006 1212 1006 1212 970.5 1252 c 128,-1,17 + 935 1292 935 1292 846 1292 c 2,18,-1 + 737 1292 l 1,19,-1 + 660 958 l 1,20,-1 + 771 958 l 2,21,22 + 868 958 868 958 918 1002.5 c 128,-1,23 + 968 1047 968 1047 985 1122 c 0,15,16 +924 496 m 0,24,25 + 952 618 952 618 906.5 688 c 128,-1,26 + 861 758 861 758 721 758 c 2,27,-1 + 614 758 l 1,28,-1 + 489 217 l 1,29,-1 + 613 217 l 2,30,31 + 747 217 747 217 820 288.5 c 128,-1,32 + 893 360 893 360 924 496 c 0,24,25 +EndSplineSet +EndChar + +StartChar: C +Encoding: 58 67 38 +Width: 1103 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 55 + 21 + 9 + 21 + 18 + 53 + 15 + 182 + 9 + 198 + 9 + 5 + 48 + 14 + 1 + 14 + 40 + 17 + 30 + 13 + 40 + 10 + 11 + 27 + 40 + 24 + 30 + 0 + 40 + 3 + 1 + 14 + 0 + 0 + 32 + 0 + 64 + 0 + 160 + 0 + 192 + 0 + 5 + 0 + 6 + 21 + 21 + 21 + 2 + 21 + 21 + 223 + 6 + 1 + 6 + 28 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP2 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1038 41 m 1,0,1 + 1000 18 1000 18 909.5 -3.5 c 128,-1,2 + 819 -25 819 -25 707 -25 c 0,3,4 + 423 -25 423 -25 287.5 163.5 c 128,-1,5 + 152 352 152 352 237 717 c 2,6,-1 + 251 778 l 2,7,8 + 329 1118 329 1118 558.5 1324 c 128,-1,9 + 788 1530 788 1530 1062 1530 c 0,10,11 + 1180 1530 1180 1530 1256 1515.5 c 128,-1,12 + 1332 1501 1332 1501 1370 1477 c 1,13,-1 + 1314 1237 l 1,14,15 + 1279 1260 1279 1260 1215 1278 c 128,-1,16 + 1151 1296 1151 1296 1059 1296 c 0,17,18 + 888 1296 888 1296 759 1153 c 128,-1,19 + 630 1010 630 1010 571 758 c 2,20,-1 + 567 737 l 2,21,22 + 505 467 505 467 564.5 338 c 128,-1,23 + 624 209 624 209 780 209 c 0,24,25 + 885 209 885 209 964.5 231.5 c 128,-1,26 + 1044 254 1044 254 1092 274 c 1,27,-1 + 1038 41 l 1,0,1 +EndSplineSet +EndChar + +StartChar: D +Encoding: 59 68 39 +Width: 1260 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 136 + 12 + 153 + 12 + 2 + 15 + 30 + 5 + 11 + 16 + 30 + 4 + 1 + 0 + 21 + 26 + 10 + 40 + 10 + 2 + 10 + 16 + 20 + 4 + 20 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1351 723 m 2,0,1 + 1266 356 1266 356 1089.5 178 c 128,-1,2 + 913 0 913 0 648 0 c 2,3,-1 + 134 0 l 1,4,-1 + 482 1509 l 1,5,-1 + 943 1509 l 2,6,7 + 1259 1509 1259 1509 1350.5 1314.5 c 128,-1,8 + 1442 1120 1442 1120 1365 784 c 2,9,-1 + 1351 723 l 2,0,1 +1035 733 m 2,10,-1 + 1044 774 l 2,11,12 + 1101 1022 1101 1022 1051.5 1153 c 128,-1,13 + 1002 1284 1002 1284 865 1284 c 2,14,-1 + 746 1284 l 1,15,-1 + 502 225 l 1,16,-1 + 647 225 l 2,17,18 + 782 225 782 225 874 330.5 c 128,-1,19 + 966 436 966 436 1035 733 c 2,10,-1 +EndSplineSet +EndChar + +StartChar: E +Encoding: 60 69 40 +Width: 1081 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 27 + 9 + 30 + 6 + 73 + 6 + 2 + 1 + 5 + 30 + 2 + 10 + 10 + 30 + 1 + 0 + 8 + 4 + 192 + 0 + 1 + 0 + 1 + 6 + 10 + 20 + 1 + 12 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1026 0 m 1,0,-1 + 134 0 l 1,1,-1 + 482 1509 l 1,2,-1 + 1336 1509 l 1,3,-1 + 1284 1284 l 1,4,-1 + 746 1284 l 1,5,-1 + 653 879 l 1,6,-1 + 1070 879 l 1,7,-1 + 1018 651 l 1,8,-1 + 600 651 l 1,9,-1 + 502 225 l 1,10,-1 + 1078 225 l 1,11,-1 + 1026 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: F +Encoding: 61 70 41 +Width: 1028 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 24 + 5 + 30 + 2 + 73 + 2 + 7 + 8 + 1 + 30 + 8 + 10 + 7 + 0 + 48 + 11 + 1 + 4 + 0 + 7 + 2 + 6 + 20 + 7 + 10 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1284 1284 m 1,0,-1 + 746 1284 l 1,1,-1 + 653 879 l 1,2,-1 + 1070 879 l 1,3,-1 + 1018 651 l 1,4,-1 + 600 651 l 1,5,-1 + 450 0 l 1,6,-1 + 134 0 l 1,7,-1 + 482 1509 l 1,8,-1 + 1336 1509 l 1,9,-1 + 1284 1284 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: G +Encoding: 62 71 42 +Width: 1261 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 21 + 9 + 21 + 18 + 39 + 5 + 38 + 9 + 37 + 18 + 148 + 19 + 6 + 29 + 33 + 30 + 30 + 24 + 17 + 48 + 14 + 1 + 14 + 17 + 31 + 13 + 10 + 11 + 24 + 31 + 3 + 1 + 29 + 29 + 31 + 6 + 14 + 70 + 31 + 49 + 15 + 27 + 1 + 0 + 27 + 32 + 27 + 64 + 27 + 96 + 27 + 144 + 27 + 176 + 27 + 6 + 27 + 6 + 21 + 22 + 21 + 2 + 21 + 21 + 6 + 32 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +RTG +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +IP +MDAP[rnd] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1236 227 m 1,0,1 + 1146 117 1146 117 1004.5 46 c 128,-1,2 + 863 -25 863 -25 663 -25 c 0,3,4 + 387 -25 387 -25 272.5 164.5 c 128,-1,5 + 158 354 158 354 242 717 c 2,6,-1 + 261 799 l 2,7,8 + 336 1122 336 1122 557 1326 c 128,-1,9 + 778 1530 778 1530 1093 1530 c 0,10,11 + 1211 1530 1211 1530 1286.5 1506.5 c 128,-1,12 + 1362 1483 1362 1483 1395 1460 c 1,13,-1 + 1339 1217 l 1,14,15 + 1296 1241 1296 1241 1229 1268.5 c 128,-1,16 + 1162 1296 1162 1296 1067 1296 c 0,17,18 + 898 1296 898 1296 766 1171.5 c 128,-1,19 + 634 1047 634 1047 568 758 c 2,20,-1 + 563 737 l 2,21,22 + 494 436 494 436 547 320.5 c 128,-1,23 + 600 205 600 205 741 205 c 0,24,25 + 818 205 818 205 888 233.5 c 128,-1,26 + 958 262 958 262 987 299 c 1,27,-1 + 1058 608 l 1,28,-1 + 844 608 l 1,29,-1 + 890 809 l 1,30,-1 + 1370 809 l 1,31,-1 + 1236 227 l 1,0,1 +EndSplineSet +EndChar + +StartChar: H +Encoding: 63 72 43 +Width: 1258 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 31 + 3 + 30 + 8 + 73 + 8 + 5 + 6 + 10 + 6 + 10 + 1 + 5 + 0 + 0 + 20 + 9 + 127 + 2 + 1 + 63 + 2 + 111 + 2 + 2 + 2 + 5 + 8 + 3 + 20 + 5 + 12 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1124 0 m 1,0,-1 + 808 0 l 1,1,-1 + 958 649 l 1,2,-1 + 600 649 l 1,3,-1 + 450 0 l 1,4,-1 + 134 0 l 1,5,-1 + 482 1509 l 1,6,-1 + 798 1509 l 1,7,-1 + 653 881 l 1,8,-1 + 1011 881 l 1,9,-1 + 1156 1509 l 1,10,-1 + 1473 1509 l 1,11,-1 + 1124 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: I +Encoding: 64 73 44 +Width: 689 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 2 + 10 + 1 + 0 + 63 + 5 + 1 + 0 + 20 + 63 + 1 + 255 + 1 + 2 + 1 + 4 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +503 0 m 1,0,-1 + 187 0 l 1,1,-1 + 535 1509 l 1,2,-1 + 851 1509 l 1,3,-1 + 503 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: J +Encoding: 65 74 45 +Width: 882 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 30 + 5 + 2 + 21 + 2 + 2 + 7 + 40 + 10 + 31 + 6 + 40 + 3 + 1 + 14 + 10 + 15 + 20 + 31 + 14 + 112 + 14 + 2 + 14 + 63 + 6 + 112 + 6 + 2 + 6 + 16 +SRP0 +MDRP[rnd,white] +DELTAP1 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +819 350 m 2,0,1 + 784 197 784 197 665 91.5 c 128,-1,2 + 546 -14 546 -14 353 -14 c 0,3,4 + 240 -14 240 -14 176 2 c 128,-1,5 + 112 18 112 18 74 45 c 1,6,-1 + 127 276 l 1,7,8 + 160 260 160 260 216.5 245.5 c 128,-1,9 + 273 231 273 231 334 231 c 0,10,11 + 392 231 392 231 441.5 265 c 128,-1,12 + 491 299 491 299 509 379 c 2,13,-1 + 770 1509 l 1,14,-1 + 1086 1509 l 1,15,-1 + 819 350 l 2,0,1 +EndSplineSet +EndChar + +StartChar: K +Encoding: 66 75 46 +Width: 1243 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 82 + 25 + 2 + 45 + 2 + 123 + 2 + 3 + 2 + 57 + 3 + 10 + 11 + 9 + 1 + 27 + 1 + 43 + 1 + 123 + 1 + 4 + 1 + 57 + 140 + 0 + 1 + 0 + 0 + 11 + 9 + 9 + 41 + 9 + 2 + 9 + 58 + 10 + 52 + 8 + 70 + 8 + 86 + 8 + 3 + 8 + 58 + 3 + 3 + 10 + 8 + 3 + 11 + 2 + 4 + 5 + 6 + 0 + 1 + 5 + 0 + 10 + 9 + 6 + 10 + 2 + 11 + 1 + 9 + 4 + 0 + 3 + 10 + 62 + 0 + 1 + 0 + 13 + 8 + 3 + 20 + 5 + 12 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +SFVTCA[x-axis] +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1279 0 m 1,0,-1 + 908 0 l 1,1,-1 + 625 555 l 1,2,-1 + 564 492 l 1,3,-1 + 450 0 l 1,4,-1 + 134 0 l 1,5,-1 + 482 1509 l 1,6,-1 + 798 1509 l 1,7,-1 + 652 874 l 1,8,-1 + 1236 1509 l 1,9,-1 + 1551 1509 l 1,10,-1 + 857 803 l 1,11,-1 + 1279 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: L +Encoding: 67 76 47 +Width: 1042 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 2 + 10 + 4 + 30 + 1 + 0 + 95 + 5 + 1 + 5 + 7 + 48 + 7 + 1 + 4 + 20 + 1 + 6 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +SRP0 +MDRP[rnd,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +971 0 m 1,0,-1 + 134 0 l 1,1,-1 + 482 1509 l 1,2,-1 + 798 1509 l 1,3,-1 + 502 225 l 1,4,-1 + 1023 225 l 1,5,-1 + 971 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: M +Encoding: 68 77 48 +Width: 1743 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 86 + 58 + 2 + 57 + 5 + 218 + 5 + 3 + 11 + 4 + 54 + 3 + 2 + 25 + 10 + 237 + 10 + 2 + 10 + 31 + 9 + 10 + 3 + 52 + 11 + 120 + 11 + 235 + 11 + 3 + 11 + 31 + 2 + 3 + 2 + 10 + 57 + 4 + 8 + 9 + 52 + 9 + 180 + 9 + 196 + 9 + 4 + 9 + 57 + 5 + 5 + 4 + 5 + 2 + 10 + 3 + 9 + 7 + 1 + 3 + 4 + 7 + 0 + 11 + 9 + 10 + 9 + 11 + 10 + 4 + 3 + 5 + 0 + 7 + 0 + 24 + 6 + 2 + 1 + 2 + 10 + 5 + 1 + 5 + 26 + 7 + 13 +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SRP0 +SFVTCA[x-axis] +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1620 0 m 1,0,-1 + 1331 0 l 1,1,-1 + 1531 866 l 1,2,-1 + 900 0 l 1,3,-1 + 737 0 l 1,4,-1 + 534 866 l 1,5,-1 + 334 0 l 1,6,-1 + 116 0 l 1,7,-1 + 464 1509 l 1,8,-1 + 698 1509 l 1,9,-1 + 972 410 l 1,10,-1 + 1761 1509 l 1,11,-1 + 1969 1509 l 1,12,-1 + 1620 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: N +Encoding: 69 78 49 +Width: 1294 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 22 + 7 + 69 + 6 + 88 + 2 + 201 + 1 + 198 + 7 + 5 + 88 + 1 + 87 + 6 + 2 + 7 + 24 + 1 + 1 + 2 + 2 + 24 + 6 + 6 + 7 + 7 + 2 + 4 + 6 + 8 + 6 + 10 + 1 + 4 + 0 + 1 + 7 + 74 + 0 + 0 + 16 + 0 + 143 + 0 + 160 + 0 + 192 + 0 + 5 + 0 + 4 + 6 + 2 + 74 + 207 + 4 + 223 + 4 + 239 + 4 + 255 + 4 + 4 + 4 + 10 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SFVTCA[y-axis] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1179 0 m 1,0,-1 + 1043 0 l 1,1,-1 + 559 948 l 1,2,-1 + 341 0 l 1,3,-1 + 116 0 l 1,4,-1 + 464 1509 l 1,5,-1 + 633 1509 l 1,6,-1 + 1096 616 l 1,7,-1 + 1302 1509 l 1,8,-1 + 1527 1509 l 1,9,-1 + 1179 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: O +Encoding: 70 79 50 +Width: 1266 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 98 + 38 + 5 + 39 + 8 + 39 + 9 + 40 + 12 + 71 + 19 + 72 + 26 + 86 + 19 + 89 + 26 + 104 + 24 + 121 + 26 + 134 + 9 + 167 + 8 + 168 + 12 + 201 + 27 + 216 + 27 + 231 + 8 + 233 + 12 + 250 + 16 + 250 + 27 + 19 + 54 + 18 + 1 + 18 + 31 + 10 + 11 + 57 + 25 + 1 + 25 + 31 + 3 + 1 + 231 + 0 + 1 + 0 + 21 + 80 + 14 + 112 + 14 + 2 + 32 + 14 + 1 + 0 + 14 + 32 + 14 + 80 + 14 + 112 + 14 + 145 + 14 + 208 + 14 + 6 + 14 + 70 + 247 + 22 + 1 + 22 + 21 + 191 + 6 + 223 + 6 + 2 + 151 + 6 + 223 + 6 + 2 + 6 + 28 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +DELTAP1 +SROUND +MDRP[rp0,min,rnd,grey] +RTG +DELTAP1 +DELTAP2 +DELTAP3 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1376 707 m 2,0,1 + 1294 350 1294 350 1092.5 162.5 c 128,-1,2 + 891 -25 891 -25 632 -25 c 0,3,4 + 375 -25 375 -25 259.5 162.5 c 128,-1,5 + 144 350 144 350 225 702 c 2,6,-1 + 245 788 l 2,7,8 + 321 1116 321 1116 517 1323 c 128,-1,9 + 713 1530 713 1530 999 1530 c 0,10,11 + 1279 1530 1279 1530 1374 1320 c 128,-1,12 + 1469 1110 1469 1110 1395 788 c 2,13,-1 + 1376 707 l 2,0,1 +1063 727 m 2,14,-1 + 1072 768 l 2,15,16 + 1136 1047 1136 1047 1123 1182 c 128,-1,17 + 1110 1317 1110 1317 942 1317 c 0,18,19 + 787 1317 787 1317 708 1197 c 128,-1,20 + 629 1077 629 1077 558 768 c 2,21,-1 + 550 731 l 2,22,23 + 478 420 478 420 496.5 304 c 128,-1,24 + 515 188 515 188 681 188 c 0,25,26 + 817 188 817 188 906.5 313 c 128,-1,27 + 996 438 996 438 1063 727 c 2,14,-1 +EndSplineSet +EndChar + +StartChar: P +Encoding: 71 80 51 +Width: 1102 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 40 + 217 + 20 + 232 + 20 + 2 + 18 + 31 + 4 + 4 + 6 + 7 + 17 + 31 + 7 + 10 + 6 + 0 + 151 + 0 + 167 + 0 + 246 + 0 + 3 + 0 + 21 + 6 + 12 + 22 + 12 + 32 + 12 + 3 + 12 + 6 + 18 + 4 + 20 + 6 + 22 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1294 999 m 2,0,1 + 1250 807 1250 807 1118.5 709.5 c 128,-1,2 + 987 612 987 612 782 612 c 2,3,-1 + 591 612 l 1,4,-1 + 450 0 l 1,5,-1 + 134 0 l 1,6,-1 + 482 1509 l 1,7,-1 + 1009 1509 l 2,8,9 + 1235 1509 1235 1509 1296.5 1391.5 c 128,-1,10 + 1358 1274 1358 1274 1322 1118 c 2,11,-1 + 1294 999 l 2,0,1 +966 977 m 2,12,-1 + 999 1122 l 2,13,14 + 1019 1208 1019 1208 984 1249 c 128,-1,15 + 949 1290 949 1290 846 1290 c 2,16,-1 + 748 1290 l 1,17,-1 + 639 819 l 1,18,-1 + 754 819 l 2,19,20 + 828 819 828 819 888 860 c 128,-1,21 + 948 901 948 901 966 977 c 2,12,-1 +EndSplineSet +EndChar + +StartChar: Q +Encoding: 72 81 52 +Width: 1266 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 93 + 11 + 12 + 27 + 12 + 39 + 19 + 73 + 37 + 89 + 37 + 122 + 37 + 135 + 20 + 218 + 37 + 250 + 38 + 9 + 9 + 32 + 10 + 18 + 54 + 29 + 249 + 29 + 2 + 29 + 31 + 21 + 11 + 57 + 36 + 247 + 36 + 2 + 36 + 41 + 3 + 14 + 0 + 9 + 5 + 3 + 1 + 3 + 57 + 14 + 14 + 3 + 9 + 3 + 0 + 17 + 0 + 21 + 32 + 25 + 64 + 25 + 2 + 0 + 25 + 32 + 25 + 64 + 25 + 80 + 25 + 96 + 25 + 112 + 25 + 136 + 25 + 145 + 25 + 176 + 25 + 208 + 25 + 10 + 25 + 33 + 21 + 135 + 17 + 151 + 17 + 2 + 17 + 39 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP2 +MDAP[rnd] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1372 707 m 2,0,1 + 1301 401 1301 401 1134 212 c 128,-1,2 + 967 23 967 23 769 2 c 1,3,4 + 754 -86 754 -86 780.5 -125 c 128,-1,5 + 807 -164 807 -164 904 -164 c 0,6,7 + 956 -164 956 -164 1012.5 -164 c 128,-1,8 + 1069 -164 1069 -164 1069 -164 c 1,9,-1 + 1029 -340 l 1,10,-1 + 751 -340 l 2,11,12 + 585 -340 585 -340 522.5 -236.5 c 128,-1,13 + 460 -133 460 -133 486 2 c 1,14,15 + 269 78 269 78 215 261 c 128,-1,16 + 161 444 161 444 221 707 c 2,17,-1 + 240 788 l 2,18,19 + 318 1126 318 1126 520 1328 c 128,-1,20 + 722 1530 722 1530 986 1530 c 0,21,22 + 1267 1530 1267 1530 1368.5 1331.5 c 128,-1,23 + 1470 1133 1470 1133 1391 788 c 2,24,-1 + 1372 707 l 2,0,1 +1058 727 m 2,25,-1 + 1068 768 l 2,26,27 + 1142 1090 1142 1090 1114 1203.5 c 128,-1,28 + 1086 1317 1086 1317 937 1317 c 0,29,30 + 789 1317 789 1317 709 1206.5 c 128,-1,31 + 629 1096 629 1096 554 768 c 2,32,-1 + 544 727 l 2,33,34 + 474 424 474 424 493.5 306 c 128,-1,35 + 513 188 513 188 676 188 c 0,36,37 + 808 188 808 188 899 310 c 128,-1,38 + 990 432 990 432 1058 727 c 2,25,-1 +EndSplineSet +EndChar + +StartChar: R +Encoding: 73 82 53 +Width: 1159 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 60 + 9 + 3 + 28 + 3 + 2 + 3 + 11 + 20 + 11 + 39 + 11 + 3 + 25 + 16 + 1 + 16 + 5 + 31 + 25 + 25 + 7 + 8 + 24 + 31 + 8 + 10 + 0 + 7 + 0 + 59 + 16 + 1 + 16 + 20 + 13 + 0 + 23 + 1 + 182 + 13 + 198 + 13 + 2 + 13 + 23 + 95 + 20 + 191 + 20 + 2 + 20 + 7 + 25 + 5 + 20 + 208 + 7 + 1 + 7 + 29 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1094 0 m 1,0,-1 + 782 0 l 1,1,2 + 863 365 863 365 838 521.5 c 128,-1,3 + 813 678 813 678 681 678 c 2,4,-1 + 606 678 l 1,5,-1 + 450 0 l 1,6,-1 + 134 0 l 1,7,-1 + 482 1509 l 1,8,-1 + 1035 1509 l 2,9,10 + 1237 1509 1237 1509 1299 1415 c 128,-1,11 + 1361 1321 1361 1321 1330 1184 c 2,12,-1 + 1311 1102 l 2,13,14 + 1281 973 1281 973 1189.5 895 c 128,-1,15 + 1098 817 1098 817 948 803 c 1,16,17 + 1101 750 1101 750 1142 567.5 c 128,-1,18 + 1183 385 1183 385 1094 0 c 1,0,-1 +992 1071 m 2,19,-1 + 1002 1112 l 2,20,21 + 1025 1210 1025 1210 986 1252 c 128,-1,22 + 947 1294 947 1294 852 1294 c 2,23,-1 + 749 1294 l 1,24,-1 + 657 895 l 1,25,-1 + 742 895 l 2,26,27 + 855 895 855 895 913.5 939 c 128,-1,28 + 972 983 972 983 992 1071 c 2,19,-1 +EndSplineSet +EndChar + +StartChar: S +Encoding: 74 83 54 +Width: 1072 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 104 + 43 + 18 + 36 + 37 + 82 + 15 + 82 + 36 + 103 + 1 + 104 + 20 + 117 + 36 + 133 + 34 + 169 + 2 + 186 + 16 + 177 + 36 + 226 + 36 + 12 + 6 + 35 + 22 + 35 + 37 + 35 + 3 + 35 + 0 + 32 + 11 + 16 + 1 + 169 + 16 + 1 + 16 + 13 + 19 + 19 + 32 + 13 + 0 + 4 + 3 + 22 + 26 + 40 + 29 + 30 + 25 + 40 + 22 + 11 + 7 + 40 + 10 + 30 + 6 + 40 + 3 + 1 + 35 + 0 + 32 + 74 + 16 + 1 + 16 + 13 + 19 + 112 + 25 + 1 + 25 + 71 + 0 + 28 + 31 + 13 + 32 + 13 + 2 + 32 + 13 + 48 + 13 + 64 + 13 + 144 + 13 + 4 + 13 + 32 + 27 + 6 + 71 + 19 + 38 +SRP0 +MDRP[rp0,min,rnd,white] +SROUND +MDRP[rnd,grey] +RTG +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +DELTAP1 +SRP1 +SRP2 +IP +DELTAP1 +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +DELTAP1 +DELTAP2 +SRP1 +SRP2 +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1119 449 m 0,0,1 + 1064 209 1064 209 888.5 94.5 c 128,-1,2 + 713 -20 713 -20 448 -20 c 0,3,4 + 296 -20 296 -20 196.5 -1 c 128,-1,5 + 97 18 97 18 35 47 c 1,6,-1 + 95 307 l 1,7,8 + 140 272 140 272 247 242.5 c 128,-1,9 + 354 213 354 213 463 213 c 0,10,11 + 617 213 617 213 685.5 257 c 128,-1,12 + 754 301 754 301 778 403 c 0,13,14 + 793 469 793 469 763 520 c 128,-1,15 + 733 571 733 571 556 655 c 0,16,17 + 415 723 415 723 354 828.5 c 128,-1,18 + 293 934 293 934 335 1116 c 0,19,20 + 375 1290 375 1290 541 1410 c 128,-1,21 + 707 1530 707 1530 951 1530 c 0,22,23 + 1069 1530 1069 1530 1158.5 1509.5 c 128,-1,24 + 1248 1489 1248 1489 1283 1473 c 1,25,-1 + 1229 1243 l 1,26,27 + 1154 1264 1154 1264 1079 1280 c 128,-1,28 + 1004 1296 1004 1296 914 1296 c 0,29,30 + 788 1296 788 1296 722.5 1254 c 128,-1,31 + 657 1212 657 1212 642 1149 c 0,32,33 + 624 1069 624 1069 656.5 1028 c 128,-1,34 + 689 987 689 987 874 907 c 0,35,36 + 1047 833 1047 833 1101 719.5 c 128,-1,37 + 1155 606 1155 606 1119 449 c 0,0,1 +EndSplineSet +EndChar + +StartChar: T +Encoding: 75 84 55 +Width: 951 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 1 + 5 + 30 + 6 + 10 + 3 + 0 + 0 + 2 + 20 + 5 + 112 + 3 + 1 + 3 + 3 + 9 + 8 +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1239 1284 m 1,0,-1 + 934 1284 l 1,1,-1 + 638 0 l 1,2,-1 + 322 0 l 1,3,-1 + 618 1284 l 1,4,-1 + 306 1284 l 1,5,-1 + 357 1509 l 1,6,-1 + 1291 1509 l 1,7,-1 + 1239 1284 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: U +Encoding: 76 85 56 +Width: 1243 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 50 + 1 + 50 + 2 + 60 + 4 + 60 + 5 + 60 + 10 + 49 + 14 + 6 + 16 + 7 + 10 + 12 + 30 + 3 + 1 + 103 + 0 + 1 + 0 + 42 + 0 + 15 + 63 + 15 + 79 + 15 + 3 + 15 + 89 + 9 + 105 + 9 + 120 + 9 + 136 + 9 + 152 + 9 + 5 + 9 + 20 + 6 + 18 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1237 436 m 2,0,1 + 1188 223 1188 223 1038.5 102.5 c 128,-1,2 + 889 -18 889 -18 633 -18 c 0,3,4 + 359 -18 359 -18 268.5 111 c 128,-1,5 + 178 240 178 240 237 494 c 2,6,-1 + 471 1509 l 1,7,-1 + 787 1509 l 1,8,-1 + 544 453 l 2,9,10 + 516 330 516 330 553 268.5 c 128,-1,11 + 590 207 590 207 717 207 c 0,12,13 + 835 207 835 207 905 262 c 128,-1,14 + 975 317 975 317 1008 459 c 2,15,-1 + 1251 1509 l 1,16,-1 + 1485 1509 l 1,17,-1 + 1237 436 l 2,0,1 +EndSplineSet +EndChar + +StartChar: V +Encoding: 77 86 57 +Width: 1160 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 91 + 57 + 5 + 117 + 5 + 144 + 5 + 3 + 40 + 3 + 57 + 1 + 54 + 2 + 51 + 5 + 55 + 6 + 71 + 1 + 105 + 2 + 7 + 0 + 58 + 6 + 1 + 58 + 5 + 5 + 6 + 153 + 3 + 1 + 3 + 22 + 4 + 2 + 22 + 5 + 5 + 4 + 5 + 2 + 3 + 1 + 2 + 0 + 6 + 4 + 0 + 3 + 10 + 63 + 8 + 1 + 1 + 6 + 0 + 2 + 4 + 3 + 156 + 5 + 1 + 5 + 5 + 0 + 3 + 60 + 0 + 1 + 63 + 0 + 1 + 0 + 32 + 3 + 1 + 0 + 3 + 47 + 3 + 51 + 3 + 180 + 3 + 208 + 3 + 5 + 3 + 7 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP1 +SRP1 +SRP2 +IP +RTHG +MDAP[rnd] +RTG +DELTAP1 +SRP2 +IP +IP +SRP2 +IP +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1530 1509 m 1,0,-1 + 705 0 l 1,1,-1 + 440 0 l 1,2,-1 + 327 1509 l 1,3,-1 + 669 1509 l 1,4,-1 + 730 467 l 1,5,-1 + 1270 1509 l 1,6,-1 + 1530 1509 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: W +Encoding: 78 87 58 +Width: 1796 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 142 + 63 + 14 + 1 + 22 + 10 + 39 + 1 + 56 + 0 + 51 + 1 + 54 + 4 + 57 + 5 + 54 + 7 + 7 + 15 + 3 + 22 + 8 + 22 + 11 + 52 + 3 + 57 + 8 + 57 + 11 + 6 + 3 + 58 + 3 + 2 + 9 + 8 + 9 + 1 + 73 + 0 + 89 + 0 + 2 + 0 + 58 + 60 + 12 + 1 + 12 + 11 + 12 + 9 + 2 + 132 + 3 + 150 + 3 + 228 + 3 + 3 + 3 + 22 + 10 + 10 + 11 + 5 + 6 + 22 + 7 + 8 + 7 + 3 + 10 + 9 + 1 + 12 + 0 + 2 + 10 + 9 + 11 + 11 + 3 + 0 + 1 + 0 + 16 + 9 + 32 + 9 + 48 + 9 + 3 + 9 + 4 + 10 + 5 + 7 + 6 + 16 + 8 + 1 + 8 + 9 + 8 + 10 + 8 + 6 + 18 + 6 + 95 + 6 + 127 + 6 + 143 + 6 + 148 + 6 + 6 + 6 + 13 + 8 + 3 + 11 + 3 + 5 + 6 + 7 + 9 + 10 + 12 + 0 + 5 + 6 + 10 + 4 + 2 + 1 + 3 + 5 + 0 +SVTCA[y-axis] +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +SRP1 +SRP2 +SLOOP +IP +SVTCA[x-axis] +SRP0 +MDRP[rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,black] +IP +IP +RTHG +MDAP[rnd] +DELTAP1 +SRP2 +IP +IP +SRP2 +IP +RTG +MDAP[rnd] +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +IP +RTHG +MDAP[rnd] +SRP2 +IP +IP +SRP2 +IP +IP +RTG +SRP1 +SRP2 +IP +SPVTL[orthog] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +MDRP[rnd,grey] +SPVTL[orthog] +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +SPVTL[orthog] +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2160 1509 m 1,0,-1 + 1423 0 l 1,1,-1 + 1195 0 l 1,2,-1 + 1127 983 l 1,3,-1 + 598 0 l 1,4,-1 + 370 0 l 1,5,-1 + 330 1509 l 1,6,-1 + 650 1509 l 1,7,-1 + 673 553 l 1,8,-1 + 1172 1509 l 1,9,-1 + 1396 1509 l 1,10,-1 + 1455 553 l 1,11,-1 + 1905 1509 l 1,12,-1 + 2160 1509 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: X +Encoding: 79 88 59 +Width: 1163 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 111 + 89 + 2 + 83 + 8 + 146 + 8 + 3 + 40 + 5 + 59 + 3 + 89 + 3 + 88 + 11 + 4 + 89 + 5 + 1 + 6 + 8 + 22 + 8 + 54 + 8 + 3 + 11 + 8 + 0 + 7 + 7 + 0 + 2 + 5 + 1 + 6 + 6 + 9 + 6 + 1 + 1 + 22 + 0 + 7 + 0 + 7 + 22 + 6 + 6 + 1 + 11 + 2 + 10 + 3 + 3 + 10 + 8 + 5 + 9 + 4 + 4 + 9 + 9 + 58 + 10 + 3 + 10 + 3 + 58 + 4 + 4 + 9 + 5 + 8 + 2 + 11 + 4 + 4 + 6 + 7 + 9 + 10 + 3 + 6 + 10 + 3 + 1 + 0 + 3 + 4 + 0 + 3 + 1 + 2 + 5 + 8 + 11 + 7 + 9 + 8 + 0 + 12 + 10 + 0 + 63 + 13 + 1 + 13 + 6 + 4 + 12 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +SRP0 +DELTAP1 +MDRP[rp0,rnd,white] +MDRP[rp0,rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[min,rnd,black] +SPVTL[orthog] +SFVTCA[x-axis] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SFVTL[parallel] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP1 +SRP2 +IP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1174 0 m 1,0,-1 + 816 0 l 1,1,-1 + 668 518 l 1,2,-1 + 257 0 l 1,3,-1 + -7 0 l 1,4,-1 + 599 754 l 1,5,-1 + 387 1509 l 1,6,-1 + 745 1509 l 1,7,-1 + 877 1044 l 1,8,-1 + 1246 1509 l 1,9,-1 + 1510 1509 l 1,10,-1 + 945 809 l 1,11,-1 + 1174 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: Y +Encoding: 80 89 60 +Width: 1234 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 74 + 54 + 7 + 1 + 53 + 1 + 54 + 4 + 54 + 7 + 102 + 7 + 4 + 7 + 58 + 6 + 7 + 1 + 8 + 58 + 0 + 0 + 1 + 72 + 7 + 88 + 7 + 2 + 7 + 22 + 4 + 6 + 22 + 5 + 5 + 4 + 8 + 6 + 0 + 5 + 7 + 1 + 4 + 55 + 0 + 1 + 0 + 1 + 20 + 5 + 15 + 4 + 31 + 4 + 144 + 4 + 160 + 4 + 4 + 4 + 4 + 10 + 9 + 0 + 8 + 6 + 7 + 4 + 1 + 3 + 3 + 5 + 10 + 3 + 0 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SRP2 +SLOOP +IP +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SVTCA[x-axis] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1596 1509 m 1,0,-1 + 929 639 l 1,1,-1 + 781 0 l 1,2,-1 + 465 0 l 1,3,-1 + 605 606 l 1,4,-1 + 339 1509 l 1,5,-1 + 708 1509 l 1,6,-1 + 877 903 l 1,7,-1 + 1345 1509 l 1,8,-1 + 1596 1509 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: Z +Encoding: 81 90 61 +Width: 1029 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHW_2 + 8 + -20 +NPUSHB + 43 + 3 + 20 + 8 + 22 + 2 + 2 + 3 + 3 + 22 + 7 + 7 + 8 + 7 + 3 + 6 + 3 + 30 + 6 + 10 + 2 + 8 + 1 + 8 + 30 + 1 + 0 + 3 + 7 + 0 + 0 + 11 + 10 + 4 + 8 + 47 + 2 + 63 + 2 + 95 + 2 + 3 + 2 + 10 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,rnd,grey] +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SVTCA[x-axis] +SHPIX +SHPIX +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1001 0 m 1,0,-1 + 34 0 l 1,1,-1 + 81 205 l 1,2,-1 + 947 1284 l 1,3,-1 + 357 1284 l 1,4,-1 + 409 1509 l 1,5,-1 + 1349 1509 l 1,6,-1 + 1303 1309 l 1,7,-1 + 434 225 l 1,8,-1 + 1053 225 l 1,9,-1 + 1001 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: bracketleft +Encoding: 82 91 62 +Width: 747 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 5 + 73 + 2 + 16 + 7 + 73 + 48 + 1 + 1 + 1 + 4 + 0 + 6 + 24 + 239 + 1 + 1 + 1 + 8 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +603 -223 m 1,0,-1 + 66 -223 l 1,1,-1 + 466 1509 l 1,2,-1 + 1003 1509 l 1,3,-1 + 961 1325 l 1,4,-1 + 701 1325 l 1,5,-1 + 390 -25 l 1,6,-1 + 649 -25 l 1,7,-1 + 603 -223 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: backslash +Encoding: 83 92 63 +Width: 883 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 40 + 1 + 55 + 1 + 89 + 1 + 152 + 1 + 201 + 1 + 5 + 0 + 100 + 1 + 3 + 100 + 2 + 2 + 1 + 0 + 52 + 2 + 1 + 2 + 4 + 0 + 63 + 1 + 1 + 1 + 2 + 3 + 10 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +899 -170 m 1,0,-1 + 689 -170 l 1,1,-1 + 307 1509 l 1,2,-1 + 517 1509 l 1,3,-1 + 899 -170 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: bracketright +Encoding: 84 93 64 +Width: 747 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 5 + 73 + 6 + 10 + 2 + 73 + 48 + 1 + 1 + 1 + 5 + 1 + 4 + 24 + 0 + 8 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +584 -223 m 1,0,-1 + 48 -223 l 1,1,-1 + 93 -25 l 1,2,-1 + 352 -25 l 1,3,-1 + 664 1325 l 1,4,-1 + 405 1325 l 1,5,-1 + 448 1509 l 1,6,-1 + 984 1509 l 1,7,-1 + 584 -223 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: asciicircum +Encoding: 85 94 65 +Width: 1047 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 42 + 10 + 1 + 6 + 3 + 26 + 1 + 22 + 3 + 53 + 5 + 58 + 6 + 6 + 1 + 3 + 15 + 2 + 31 + 2 + 2 + 2 + 5 + 10 + 50 + 0 + 1 + 144 + 0 + 1 + 0 + 8 + 31 + 4 + 47 + 4 + 61 + 4 + 95 + 4 + 4 + 4 + 7 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +PUSHB_2 + 4 + 0 +MD[grid] +EVEN +IF +PUSHB_2 + 0 + 64 +SHPIX +EIF +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDAP[rnd] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1199 657 m 1,0,-1 + 906 657 l 1,1,-1 + 773 1122 l 1,2,-1 + 445 657 l 1,3,-1 + 152 657 l 1,4,-1 + 759 1509 l 1,5,-1 + 986 1509 l 1,6,-1 + 1199 657 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: underscore +Encoding: 86 95 66 +Width: 948 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 1 + 201 + 2 + 0 + 5 + 63 + 1 + 1 + 1 + 4 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +865 -360 m 1,0,-1 + -83 -360 l 1,1,-1 + -35 -150 l 1,2,-1 + 914 -150 l 1,3,-1 + 865 -360 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: grave +Encoding: 87 96 67 +Width: 942 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 2 + 91 + 1 + 36 + 3 + 1 + 0 + 2 + 0 + 63 + 2 + 79 + 2 + 80 + 2 + 3 + 2 + 4 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1017 1323 m 1,0,-1 + 815 1323 l 1,1,-1 + 592 1677 l 1,2,-1 + 866 1677 l 1,3,-1 + 1017 1323 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: a +Encoding: 88 97 68 +Width: 1145 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 89 + 11 + 7 + 11 + 10 + 4 + 28 + 25 + 6 + 25 + 7 + 25 + 10 + 20 + 28 + 51 + 43 + 186 + 7 + 9 + 34 + 32 + 15 + 12 + 12 + 5 + 26 + 0 + 2 + 41 + 33 + 59 + 2 + 1 + 2 + 5 + 3 + 22 + 51 + 255 + 19 + 1 + 19 + 33 + 23 + 51 + 26 + 13 + 16 + 45 + 63 + 45 + 192 + 45 + 240 + 45 + 4 + 22 + 22 + 0 + 8 + 0 + 22 + 1 + 2 + 15 + 0 + 30 + 1 + 64 + 30 + 80 + 30 + 112 + 30 + 128 + 30 + 160 + 30 + 5 + 30 + 38 + 23 + 47 + 8 + 63 + 8 + 2 + 8 + 44 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIRP[rp0,rnd,grey] +MIAP[rnd] +MDRP[min,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIAP[rnd] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1009 0 m 1,0,-1 + 737 0 l 1,1,-1 + 766 158 l 1,2,3 + 683 63 683 63 609.5 23.5 c 128,-1,4 + 536 -16 536 -16 441 -16 c 0,5,6 + 289 -16 289 -16 211.5 92 c 128,-1,7 + 134 200 134 200 197 469 c 2,8,-1 + 223 583 l 2,9,10 + 280 830 280 830 421 968.5 c 128,-1,11 + 562 1107 562 1107 772 1107 c 0,12,13 + 822 1107 822 1107 877 1091 c 128,-1,14 + 932 1075 932 1075 963 1025 c 1,15,-1 + 1262 1093 l 0,16,17 + 1261 1093 1261 1093 1009 0 c 1,0,-1 +799 317 m 1,18,-1 + 922 848 l 1,19,20 + 911 886 911 886 879 911.5 c 128,-1,21 + 847 937 847 937 786 937 c 0,22,23 + 700 937 700 937 631 859.5 c 128,-1,24 + 562 782 562 782 515 575 c 2,25,-1 + 497 501 l 2,26,27 + 459 336 459 336 484 268.5 c 128,-1,28 + 509 201 509 201 593 201 c 0,29,30 + 650 201 650 201 707.5 235 c 128,-1,31 + 765 269 765 269 799 317 c 1,18,-1 +EndSplineSet +EndChar + +StartChar: b +Encoding: 89 98 69 +Width: 1145 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 63 + 7 + 15 + 23 + 15 + 89 + 30 + 152 + 30 + 4 + 9 + 16 + 26 + 25 + 6 + 3 + 3 + 14 + 64 + 11 + 96 + 14 + 22 + 47 + 14 + 13 + 29 + 32 + 3 + 3 + 8 + 2 + 96 + 33 + 1 + 0 + 23 + 47 + 18 + 48 + 18 + 64 + 18 + 160 + 18 + 4 + 64 + 18 + 113 + 18 + 144 + 18 + 223 + 18 + 224 + 18 + 5 + 18 + 11 + 26 + 6 + 22 + 8 + 32 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[min,rnd,black] +SRP0 +SMD +MDRP[min,grey] +SMD +SRP1 +SRP2 +SLOOP +IP +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1166 500 m 2,0,1 + 1112 267 1112 267 970.5 125.5 c 128,-1,2 + 829 -16 829 -16 623 -16 c 0,3,4 + 572 -16 572 -16 513.5 3.5 c 128,-1,5 + 455 23 455 23 424 66 c 1,6,-1 + 405 0 l 1,7,-1 + 130 0 l 1,8,-1 + 478 1509 l 1,9,-1 + 762 1509 l 1,10,-1 + 629 931 l 1,11,12 + 720 1046 720 1046 798.5 1081 c 128,-1,13 + 877 1116 877 1116 955 1116 c 0,14,15 + 1113 1116 1113 1116 1182 992 c 128,-1,16 + 1251 868 1251 868 1194 624 c 2,17,-1 + 1166 500 l 2,0,1 +878 524 m 2,18,-1 + 896 602 l 2,19,20 + 936 775 936 775 903 832.5 c 128,-1,21 + 870 890 870 890 796 890 c 0,22,23 + 743 890 743 890 682.5 853 c 128,-1,24 + 622 816 622 816 590 765 c 1,25,-1 + 473 256 l 1,26,27 + 473 218 473 218 510 186 c 128,-1,28 + 547 154 547 154 616 154 c 0,29,30 + 691 154 691 154 758.5 227 c 128,-1,31 + 826 300 826 300 878 524 c 2,18,-1 +EndSplineSet +EndChar + +StartChar: c +Encoding: 90 99 70 +Width: 984 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 53 + 15 + 70 + 18 + 2 + 48 + 14 + 1 + 14 + 51 + 17 + 33 + 13 + 51 + 10 + 13 + 27 + 51 + 24 + 33 + 0 + 51 + 3 + 3 + 14 + 128 + 0 + 1 + 64 + 0 + 96 + 0 + 2 + 0 + 55 + 21 + 117 + 21 + 198 + 21 + 3 + 21 + 23 + 15 + 6 + 79 + 6 + 96 + 6 + 3 + 15 + 6 + 207 + 6 + 239 + 6 + 3 + 6 + 28 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +899 61 m 1,0,1 + 879 45 879 45 791 10 c 128,-1,2 + 703 -25 703 -25 616 -25 c 0,3,4 + 373 -25 373 -25 259.5 112.5 c 128,-1,5 + 146 250 146 250 210 525 c 2,6,-1 + 220 572 l 2,7,8 + 278 821 278 821 456 971.5 c 128,-1,9 + 634 1122 634 1122 874 1122 c 0,10,11 + 967 1122 967 1122 1035 1094 c 128,-1,12 + 1103 1066 1103 1066 1124 1034 c 1,13,-1 + 1079 838 l 1,14,15 + 1051 874 1051 874 995 898.5 c 128,-1,16 + 939 923 939 923 868 923 c 0,17,18 + 743 923 743 923 654 826.5 c 128,-1,19 + 565 730 565 730 527 561 c 2,20,-1 + 522 542 l 2,21,22 + 478 353 478 353 514 274 c 128,-1,23 + 550 195 550 195 669 195 c 0,24,25 + 749 195 749 195 831.5 221.5 c 128,-1,26 + 914 248 914 248 949 275 c 1,27,-1 + 899 61 l 1,0,1 +EndSplineSet +EndChar + +StartChar: d +Encoding: 91 100 71 +Width: 1145 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 60 + 9 + 6 + 25 + 6 + 118 + 10 + 3 + 16 + 16 + 18 + 19 + 15 + 3 + 5 + 12 + 22 + 32 + 12 + 13 + 29 + 47 + 64 + 2 + 96 + 5 + 3 + 1 + 2 + 96 + 33 + 1 + 0 + 22 + 15 + 63 + 2 + 1 + 2 + 16 + 18 + 64 + 18 + 112 + 18 + 3 + 18 + 26 + 23 + 15 + 8 + 31 + 8 + 2 + 15 + 8 + 239 + 8 + 2 + 8 + 32 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SMD +MDRP[min,rnd,grey] +SMD +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1009 0 m 1,0,-1 + 737 0 l 1,1,-1 + 766 158 l 1,2,3 + 683 63 683 63 609.5 23.5 c 128,-1,4 + 536 -16 536 -16 441 -16 c 0,5,6 + 289 -16 289 -16 211.5 92 c 128,-1,7 + 134 200 134 200 197 469 c 2,8,-1 + 223 583 l 2,9,10 + 280 830 280 830 421 968.5 c 128,-1,11 + 562 1107 562 1107 772 1107 c 0,12,13 + 822 1107 822 1107 877 1091 c 128,-1,14 + 932 1075 932 1075 963 1025 c 1,15,-1 + 1074 1509 l 1,16,-1 + 1358 1509 l 1,17,-1 + 1009 0 l 1,0,-1 +799 317 m 1,18,-1 + 922 848 l 1,19,20 + 911 886 911 886 879 911.5 c 128,-1,21 + 847 937 847 937 786 937 c 0,22,23 + 700 937 700 937 631 859.5 c 128,-1,24 + 562 782 562 782 515 575 c 2,25,-1 + 497 501 l 2,26,27 + 459 336 459 336 484 268.5 c 128,-1,28 + 509 201 509 201 593 201 c 0,29,30 + 650 201 650 201 707.5 235 c 128,-1,31 + 765 269 765 269 799 317 c 1,18,-1 +EndSplineSet +EndChar + +StartChar: e +Encoding: 92 101 72 +Width: 1135 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 90 + 12 + 84 + 20 + 2 + 1 + 46 + 127 + 30 + 1 + 30 + 73 + 30 + 11 + 18 + 80 + 7 + 96 + 7 + 2 + 7 + 71 + 4 + 33 + 8 + 70 + 11 + 3 + 169 + 27 + 1 + 27 + 33 + 152 + 18 + 1 + 18 + 13 + 8 + 0 + 23 + 80 + 24 + 96 + 24 + 112 + 24 + 3 + 0 + 24 + 16 + 24 + 48 + 24 + 64 + 24 + 80 + 24 + 144 + 24 + 200 + 24 + 7 + 24 + 14 + 30 + 1 + 23 + 31 + 14 + 1 + 15 + 14 + 199 + 14 + 2 + 14 + 31 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +DELTAP1 +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +DELTAP1 +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1155 484 m 1,0,-1 + 487 484 l 1,1,2 + 447 309 447 309 505 240.5 c 128,-1,3 + 563 172 563 172 682 172 c 0,4,5 + 761 172 761 172 848.5 193.5 c 128,-1,6 + 936 215 936 215 1033 258 c 1,7,-1 + 990 74 l 1,8,9 + 904 25 904 25 807.5 0 c 128,-1,10 + 711 -25 711 -25 593 -25 c 0,11,12 + 362 -25 362 -25 253.5 109.5 c 128,-1,13 + 145 244 145 244 205 503 c 2,14,-1 + 223 582 l 2,15,16 + 275 809 275 809 439 965.5 c 128,-1,17 + 603 1122 603 1122 842 1122 c 0,18,19 + 1065 1122 1065 1122 1149.5 973.5 c 128,-1,20 + 1234 825 1234 825 1179 587 c 2,21,22 + 1179 587 1179 587 1168.5 541.5 c 128,-1,23 + 1158 496 1158 496 1155 484 c 1,0,-1 +939 648 m 1,24,25 + 966 803 966 803 926.5 870 c 128,-1,26 + 887 937 887 937 798 937 c 0,27,28 + 720 937 720 937 643.5 871 c 128,-1,29 + 567 805 567 805 526 648 c 1,30,-1 + 939 648 l 1,24,25 +EndSplineSet +EndChar + +StartChar: f +Encoding: 93 102 73 +Width: 584 +GlyphClass: 1 +Flags: W +HStem: 0 21G<146 433.622> 952 176<276 366 692 836> 1333 197<750.335 973.598> +DStem2: 146 0 429 0 0.227046 0.973884<64.2539 979.035 1222.51 1395.05> +TtInstrs: +NPUSHB + 41 + 9 + 20 + 25 + 20 + 185 + 20 + 3 + 11 + 14 + 32 + 8 + 17 + 12 + 13 + 2 + 1 + 4 + 33 + 0 + 21 + 17 + 0 + 25 + 10 + 8 + 12 + 22 + 17 + 15 + 31 + 13 + 95 + 13 + 144 + 13 + 3 + 144 + 13 + 1 + 13 + 24 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP0 +MDRP[rp0,rnd,white] +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1056 1454 m 1,0,-1 + 945 1284 l 1,1,2 + 925 1307 925 1307 902 1320 c 128,-1,3 + 879 1333 879 1333 839 1333 c 0,4,5 + 780 1333 780 1333 750.5 1293 c 128,-1,6 + 721 1253 721 1253 702 1171 c 2,7,-1 + 692 1128 l 1,8,-1 + 876 1128 l 1,9,-1 + 836 952 l 1,10,-1 + 649 952 l 1,11,-1 + 429 0 l 1,12,-1 + 146 0 l 1,13,-1 + 366 954 l 1,14,-1 + 236 954 l 1,15,-1 + 276 1128 l 1,16,-1 + 411 1128 l 1,17,-1 + 419 1161 l 2,18,19 + 459 1333 459 1333 567.5 1431.5 c 128,-1,20 + 676 1530 676 1530 826 1530 c 0,21,22 + 896 1530 896 1530 957 1509.5 c 128,-1,23 + 1018 1489 1018 1489 1056 1454 c 1,0,-1 +EndSplineSet +EndChar + +StartChar: g +Encoding: 94 103 74 +Width: 1179 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 99 + 9 + 18 + 52 + 42 + 107 + 18 + 123 + 18 + 123 + 23 + 138 + 11 + 154 + 11 + 170 + 11 + 185 + 11 + 9 + 134 + 41 + 1 + 41 + 47 + 17 + 17 + 24 + 10 + 59 + 14 + 52 + 27 + 2 + 27 + 14 + 17 + 24 + 7 + 51 + 80 + 10 + 240 + 10 + 2 + 10 + 47 + 6 + 51 + 3 + 19 + 28 + 12 + 34 + 32 + 24 + 13 + 0 + 22 + 63 + 27 + 1 + 27 + 31 + 48 + 14 + 144 + 14 + 2 + 48 + 14 + 64 + 14 + 112 + 14 + 176 + 14 + 224 + 14 + 5 + 14 + 38 + 23 + 7 + 31 + 20 + 47 + 20 + 63 + 20 + 3 + 207 + 20 + 239 + 20 + 255 + 20 + 3 + 20 + 44 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIRP[rnd,grey] +SRP1 +SRP2 +IP +IP +DELTAP1 +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1066 138 m 2,0,1 + 1011 -99 1011 -99 841 -234 c 128,-1,2 + 671 -369 671 -369 428 -369 c 0,3,4 + 356 -369 356 -369 265 -352.5 c 128,-1,5 + 174 -336 174 -336 110 -295 c 1,6,-1 + 160 -78 l 1,7,8 + 226 -115 226 -115 305.5 -129 c 128,-1,9 + 385 -143 385 -143 446 -143 c 0,10,11 + 613 -143 613 -143 687 -79.5 c 128,-1,12 + 761 -16 761 -16 785 87 c 2,13,-1 + 810 197 l 1,14,15 + 773 137 773 137 684.5 70.5 c 128,-1,16 + 596 4 596 4 456 4 c 0,17,18 + 292 4 292 4 219 126.5 c 128,-1,19 + 146 249 146 249 212 534 c 2,20,-1 + 219 566 l 2,21,22 + 282 839 282 839 428 973 c 128,-1,23 + 574 1107 574 1107 775 1107 c 0,24,25 + 852 1107 852 1107 912 1078.5 c 128,-1,26 + 972 1050 972 1050 998 993 c 1,27,-1 + 1021 1093 l 1,28,-1 + 1287 1093 l 1,29,-1 + 1066 138 l 2,0,1 +881 569 m 2,30,-1 + 897 636 l 2,31,32 + 934 797 934 797 907 863 c 128,-1,33 + 880 929 880 929 787 929 c 0,34,35 + 698 929 698 929 629.5 852.5 c 128,-1,36 + 561 776 561 776 520 598 c 2,37,-1 + 513 569 l 2,38,39 + 466 366 466 366 496.5 294.5 c 128,-1,40 + 527 223 527 223 617 223 c 0,41,42 + 707 223 707 223 772.5 302 c 128,-1,43 + 838 381 838 381 881 569 c 2,30,-1 +EndSplineSet +EndChar + +StartChar: h +Encoding: 95 104 75 +Width: 1131 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 37 + 18 + 70 + 17 + 231 + 17 + 246 + 17 + 4 + 5 + 17 + 1 + 8 + 13 + 96 + 16 + 1 + 10 + 2 + 11 + 16 + 5 + 45 + 55 + 16 + 1 + 16 + 13 + 96 + 21 + 1 + 0 + 22 + 64 + 1 + 160 + 1 + 2 + 175 + 1 + 1 + 1 + 10 + 13 + 9 + 22 + 10 + 20 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +SRP0 +SMD +MDRP[rp0,min,grey] +MDRP[min,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1079 328 m 1,0,1 + 1075 310 1075 310 1069 265 c 128,-1,2 + 1063 220 1063 220 1065 212 c 0,3,4 + 1065 197 1065 197 1075 186.5 c 128,-1,5 + 1085 176 1085 176 1099 176 c 0,6,7 + 1150 176 1150 176 1252 342 c 1,8,-1 + 1265 366 l 1,9,-1 + 1319 331 l 1,10,11 + 1198 124 1198 124 1120.5 51.5 c 128,-1,12 + 1043 -21 1043 -21 938 -21 c 0,13,14 + 902 -21 902 -21 874 -12 c 128,-1,15 + 846 -3 846 -3 828 9 c 128,-1,16 + 810 21 810 21 798.5 43.5 c 128,-1,17 + 787 66 787 66 780.5 83.5 c 128,-1,18 + 774 101 774 101 774 131 c 128,-1,19 + 774 161 774 161 774.5 176.5 c 128,-1,20 + 775 192 775 192 780.5 223.5 c 128,-1,21 + 786 255 786 255 787.5 262.5 c 128,-1,22 + 789 270 789 270 795 295 c 1,23,-1 + 902 757 l 2,24,25 + 913 807 913 807 893 839.5 c 128,-1,26 + 873 872 873 872 814 872 c 0,27,28 + 754 872 754 872 695.5 846.5 c 128,-1,29 + 637 821 637 821 593 777 c 1,30,-1 + 414 0 l 1,31,-1 + 130 0 l 1,32,-1 + 478 1509 l 1,33,-1 + 762 1509 l 1,34,-1 + 625 917 l 1,35,36 + 688 993 688 993 786.5 1054.5 c 128,-1,37 + 885 1116 885 1116 1010 1116 c 0,38,39 + 1135 1116 1135 1116 1178 1031 c 128,-1,40 + 1221 946 1221 946 1181 771 c 2,41,-1 + 1079 328 l 1,0,1 +EndSplineSet +EndChar + +StartChar: i +Encoding: 96 105 76 +Width: 532 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 22 + 214 + 1 + 214 + 11 + 2 + 9 + 62 + 3 + 14 + 12 + 13 + 2 + 0 + 63 + 6 + 12 + 22 + 207 + 13 + 1 + 13 + 16 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +742 1407 m 0,0,1 + 725 1335 725 1335 670 1286 c 128,-1,2 + 615 1237 615 1237 553 1237 c 0,3,4 + 492 1237 492 1237 459.5 1286 c 128,-1,5 + 427 1335 427 1335 443 1407 c 0,6,7 + 459 1477 459 1477 514.5 1526 c 128,-1,8 + 570 1575 570 1575 631 1575 c 0,9,10 + 693 1575 693 1575 725.5 1526 c 128,-1,11 + 758 1477 758 1477 742 1407 c 0,0,1 +488 337 m 1,12,13 + 484 318 484 318 477.5 270.5 c 128,-1,14 + 471 223 471 223 472 214 c 0,15,16 + 472 198 472 198 482 187 c 128,-1,17 + 492 176 492 176 505 176 c 0,18,19 + 555 176 555 176 659 356 c 1,20,-1 + 673 382 l 1,21,-1 + 725 344 l 1,22,23 + 602 129 602 129 523.5 54 c 128,-1,24 + 445 -21 445 -21 339 -21 c 0,25,26 + 302 -21 302 -21 274 -11.5 c 128,-1,27 + 246 -2 246 -2 228 11 c 128,-1,28 + 210 24 210 24 198.5 48 c 128,-1,29 + 187 72 187 72 181 90.5 c 128,-1,30 + 175 109 175 109 175 141 c 128,-1,31 + 175 173 175 173 175.5 189.5 c 128,-1,32 + 176 206 176 206 182 239.5 c 128,-1,33 + 188 273 188 273 190 281 c 128,-1,34 + 192 289 192 289 198 315 c 1,35,-1 + 391 1151 l 1,36,-1 + 676 1151 l 1,37,-1 + 488 337 l 1,12,13 +EndSplineSet +EndChar + +StartChar: j +Encoding: 97 106 77 +Width: 549 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 39 + 6 + 14 + 22 + 14 + 216 + 5 + 216 + 7 + 4 + 9 + 62 + 3 + 26 + 12 + 19 + 22 + 34 + 18 + 15 + 19 + 0 + 63 + 6 + 12 + 22 + 15 + 25 + 1 + 80 + 25 + 96 + 25 + 2 + 111 + 25 + 1 + 25 + 19 + 28 +SRP0 +MDRP[min,rnd,white] +MDRP[rp0,min,rnd,white] +DELTAP1 +DELTAP2 +DELTAP3 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +762 1407 m 0,0,1 + 745 1335 745 1335 690 1286 c 128,-1,2 + 635 1237 635 1237 574 1237 c 0,3,4 + 512 1237 512 1237 479.5 1286 c 128,-1,5 + 447 1335 447 1335 463 1407 c 0,6,7 + 479 1477 479 1477 534 1526 c 128,-1,8 + 589 1575 589 1575 652 1575 c 0,9,10 + 713 1575 713 1575 745.5 1526 c 128,-1,11 + 778 1477 778 1477 762 1407 c 0,0,1 +448 76 m 2,12,13 + 400 -131 400 -131 284 -243.5 c 128,-1,14 + 168 -356 168 -356 21 -356 c 0,15,16 + -42 -356 -42 -356 -109 -348 c 128,-1,17 + -176 -340 -176 -340 -222 -324 c 1,18,-1 + -171 -106 l 1,19,20 + -145 -117 -145 -117 -105 -124 c 128,-1,21 + -65 -131 -65 -131 -18 -131 c 0,22,23 + 49 -131 49 -131 91 -93 c 128,-1,24 + 133 -55 133 -55 153 33 c 2,25,-1 + 411 1151 l 1,26,-1 + 696 1151 l 1,27,-1 + 448 76 l 2,12,13 +EndSplineSet +EndChar + +StartChar: k +Encoding: 98 107 78 +Width: 1030 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 43 + 13 + 1 + 11 + 8 + 28 + 1 + 27 + 8 + 4 + 5 + 16 + 7 + 2 + 10 + 3 + 4 + 9 + 8 + 12 + 0 + 1 + 4 + 2 + 54 + 10 + 1 + 1 + 0 + 10 + 8 + 9 + 2 + 9 + 16 + 0 + 1 + 0 + 12 + 7 + 2 + 22 + 4 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +SRP2 +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP2 +SLOOP +IP +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +967 182 m 1,0,1 + 978 159 978 159 992 159 c 0,2,3 + 1040 159 1040 159 1131 317 c 2,4,-1 + 1158 364 l 1,5,-1 + 1205 328 l 1,6,7 + 1091 124 1091 124 1016.5 50.5 c 128,-1,8 + 942 -23 942 -23 846 -23 c 0,9,10 + 740 -23 740 -23 708 44 c 1,11,-1 + 522 469 l 1,12,-1 + 414 0 l 1,13,-1 + 130 0 l 1,14,-1 + 478 1509 l 1,15,-1 + 762 1509 l 1,16,-1 + 571 684 l 1,17,-1 + 1008 1151 l 1,18,-1 + 1261 1151 l 1,19,-1 + 763 639 l 1,20,-1 + 967 182 l 1,0,1 +EndSplineSet +EndChar + +StartChar: l +Encoding: 99 108 79 +Width: 555 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 2 + 16 + 1 + 2 + 0 + 22 + 176 + 1 + 1 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +498 337 m 1,0,1 + 494 318 494 318 487.5 270.5 c 128,-1,2 + 481 223 481 223 483 214 c 0,3,4 + 483 198 483 198 492.5 187 c 128,-1,5 + 502 176 502 176 515 176 c 0,6,7 + 565 176 565 176 668 355 c 1,8,-1 + 683 382 l 1,9,-1 + 736 344 l 1,10,11 + 613 129 613 129 534 54 c 128,-1,12 + 455 -21 455 -21 349 -21 c 0,13,14 + 304 -21 304 -21 272 -7 c 128,-1,15 + 240 7 240 7 222.5 27.5 c 128,-1,16 + 205 48 205 48 196.5 81 c 128,-1,17 + 188 114 188 114 186 139.5 c 128,-1,18 + 184 165 184 165 188.5 203.5 c 128,-1,19 + 193 242 193 242 197 260 c 128,-1,20 + 201 278 201 278 208 308 c 0,21,22 + 209 313 209 313 209 315 c 1,23,-1 + 485 1509 l 1,24,-1 + 769 1509 l 1,25,-1 + 498 337 l 1,0,1 +EndSplineSet +EndChar + +StartChar: m +Encoding: 100 109 80 +Width: 1704 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1601 1116 m 0,0,1 + 1698 1115 1698 1115 1751 1024 c 0,2,3 + 1809 925 1809 925 1775 776 c 2,4,-1 + 1671 328 l 1,5,6 + 1667 310 1667 310 1661.5 265 c 128,-1,7 + 1656 220 1656 220 1658 212 c 0,8,9 + 1658 197 1658 197 1668 186.5 c 128,-1,10 + 1678 176 1678 176 1691 176 c 0,11,12 + 1742 176 1742 176 1845 342 c 1,13,-1 + 1858 366 l 1,14,-1 + 1911 331 l 1,15,16 + 1790 124 1790 124 1712.5 51.5 c 128,-1,17 + 1635 -21 1635 -21 1531 -21 c 0,18,19 + 1495 -21 1495 -21 1467 -12 c 128,-1,20 + 1439 -3 1439 -3 1420.5 9 c 128,-1,21 + 1402 21 1402 21 1391 43.5 c 128,-1,22 + 1380 66 1380 66 1373.5 83.5 c 128,-1,23 + 1367 101 1367 101 1366.5 131 c 128,-1,24 + 1366 161 1366 161 1366.5 176.5 c 128,-1,25 + 1367 192 1367 192 1372.5 223.5 c 128,-1,26 + 1378 255 1378 255 1380 262.5 c 128,-1,27 + 1382 270 1382 270 1387 295 c 1,28,-1 + 1494 757 l 2,29,30 + 1504 801 1504 801 1475.5 836.5 c 128,-1,31 + 1447 872 1447 872 1396 872 c 0,32,33 + 1329 872 1329 872 1275 840 c 128,-1,34 + 1221 808 1221 808 1181 759 c 1,35,-1 + 1006 0 l 1,36,-1 + 722 0 l 1,37,-1 + 896 757 l 2,38,39 + 907 803 907 803 882 837.5 c 128,-1,40 + 857 872 857 872 799 872 c 0,41,42 + 733 872 733 872 683 846 c 128,-1,43 + 633 820 633 820 593 777 c 1,44,-1 + 414 0 l 1,45,-1 + 130 0 l 1,46,-1 + 382 1093 l 1,47,-1 + 655 1093 l 1,48,-1 + 619 911 l 1,49,50 + 685 1005 685 1005 779.5 1060.5 c 128,-1,51 + 874 1116 874 1116 991 1116 c 0,52,53 + 1096 1116 1096 1116 1144 1058.5 c 128,-1,54 + 1192 1001 1192 1001 1197 900 c 1,55,56 + 1281 1049 1281 1049 1379 1113 c 0,57,58 + 1474 1174 1474 1174 1609 1174 c 0,59,60 + 1612 1174 1612 1174 1601 1116 c 0,0,1 +EndSplineSet +EndChar + +StartChar: n +Encoding: 101 110 81 +Width: 1131 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 40 + 37 + 17 + 1 + 8 + 13 + 96 + 16 + 1 + 10 + 2 + 11 + 12 + 5 + 45 + 16 + 13 + 96 + 21 + 1 + 0 + 22 + 112 + 1 + 1 + 64 + 1 + 160 + 1 + 2 + 175 + 1 + 1 + 1 + 10 + 12 + 13 + 9 + 22 + 10 + 20 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +DELTAP3 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +SRP0 +SMD +MDRP[rp0,min,grey] +MDRP[min,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1079 328 m 1,0,1 + 1075 310 1075 310 1069 265 c 128,-1,2 + 1063 220 1063 220 1065 212 c 0,3,4 + 1065 197 1065 197 1075 186.5 c 128,-1,5 + 1085 176 1085 176 1099 176 c 0,6,7 + 1150 176 1150 176 1252 342 c 1,8,-1 + 1265 366 l 1,9,-1 + 1319 331 l 1,10,11 + 1198 124 1198 124 1120.5 51.5 c 128,-1,12 + 1043 -21 1043 -21 938 -21 c 0,13,14 + 902 -21 902 -21 874 -12 c 128,-1,15 + 846 -3 846 -3 828 9 c 128,-1,16 + 810 21 810 21 798.5 43.5 c 128,-1,17 + 787 66 787 66 780.5 83.5 c 128,-1,18 + 774 101 774 101 774 131 c 128,-1,19 + 774 161 774 161 774.5 176.5 c 128,-1,20 + 775 192 775 192 780.5 223.5 c 128,-1,21 + 786 255 786 255 787.5 262.5 c 128,-1,22 + 789 270 789 270 795 295 c 1,23,-1 + 902 757 l 2,24,25 + 912 799 912 799 886.5 835.5 c 128,-1,26 + 861 872 861 872 799 872 c 0,27,28 + 739 872 739 872 687 845.5 c 128,-1,29 + 635 819 635 819 593 777 c 1,30,-1 + 414 0 l 1,31,-1 + 130 0 l 1,32,-1 + 382 1093 l 1,33,-1 + 655 1093 l 1,34,-1 + 618 909 l 1,35,36 + 667 991 667 991 768 1053.5 c 128,-1,37 + 869 1116 869 1116 993 1116 c 0,38,39 + 1118 1116 1118 1116 1169.5 1031 c 128,-1,40 + 1221 946 1221 946 1181 771 c 2,41,-1 + 1079 328 l 1,0,1 +EndSplineSet +EndChar + +StartChar: o +Encoding: 102 111 82 +Width: 1196 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 88 + 24 + 150 + 4 + 150 + 9 + 198 + 2 + 247 + 8 + 5 + 104 + 18 + 1 + 18 + 33 + 10 + 13 + 103 + 25 + 1 + 25 + 33 + 3 + 3 + 0 + 23 + 96 + 14 + 112 + 14 + 144 + 14 + 3 + 0 + 14 + 48 + 14 + 80 + 14 + 129 + 14 + 208 + 14 + 224 + 14 + 240 + 14 + 7 + 14 + 134 + 22 + 1 + 22 + 23 + 159 + 6 + 1 + 15 + 6 + 31 + 6 + 63 + 6 + 3 + 15 + 6 + 207 + 6 + 223 + 6 + 239 + 6 + 255 + 6 + 5 + 6 + 28 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +DELTAP3 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1217 514 m 2,0,1 + 1158 260 1158 260 990.5 117.5 c 128,-1,2 + 823 -25 823 -25 590 -25 c 0,3,4 + 359 -25 359 -25 254.5 120.5 c 128,-1,5 + 150 266 150 266 207 514 c 2,6,-1 + 223 583 l 2,7,8 + 279 825 279 825 450 973.5 c 128,-1,9 + 621 1122 621 1122 853 1122 c 0,10,11 + 1088 1122 1088 1122 1188.5 972.5 c 128,-1,12 + 1289 823 1289 823 1234 583 c 2,13,-1 + 1217 514 l 2,0,1 +931 541 m 2,14,-1 + 935 557 l 2,15,16 + 985 774 985 774 941.5 852.5 c 128,-1,17 + 898 931 898 931 807 931 c 0,18,19 + 716 931 716 931 638 846.5 c 128,-1,20 + 560 762 560 762 512 557 c 2,21,-1 + 509 541 l 2,22,23 + 457 315 457 315 496.5 240.5 c 128,-1,24 + 536 166 536 166 632 166 c 0,25,26 + 719 166 719 166 798.5 238.5 c 128,-1,27 + 878 311 878 311 931 541 c 2,14,-1 +EndSplineSet +EndChar + +StartChar: p +Encoding: 103 112 83 +Width: 1145 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 50 + 6 + 16 + 22 + 16 + 121 + 1 + 3 + 9 + 12 + 26 + 25 + 6 + 3 + 3 + 14 + 64 + 11 + 96 + 14 + 22 + 47 + 14 + 13 + 29 + 32 + 3 + 3 + 8 + 18 + 96 + 33 + 1 + 0 + 23 + 16 + 18 + 64 + 18 + 112 + 18 + 3 + 18 + 8 + 10 + 11 + 26 + 6 + 22 + 8 + 32 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[min,rnd,black] +SRP0 +SMD +MDRP[min,grey] +SMD +SRP1 +SRP2 +SLOOP +IP +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1167 506 m 2,0,1 + 1109 257 1109 257 965.5 121.5 c 128,-1,2 + 822 -14 822 -14 623 -14 c 0,3,4 + 572 -14 572 -14 515.5 2 c 128,-1,5 + 459 18 459 18 428 61 c 1,6,-1 + 335 -342 l 1,7,-1 + 51 -342 l 1,8,-1 + 382 1093 l 1,9,-1 + 655 1093 l 1,10,-1 + 623 923 l 1,11,12 + 676 1011 676 1011 770 1063.5 c 128,-1,13 + 864 1116 864 1116 962 1116 c 0,14,15 + 1102 1116 1102 1116 1179.5 1006 c 128,-1,16 + 1257 896 1257 896 1196 633 c 2,17,-1 + 1167 506 l 2,0,1 +877 520 m 2,18,-1 + 893 591 l 2,19,20 + 933 763 933 763 905 826.5 c 128,-1,21 + 877 890 877 890 803 890 c 0,22,23 + 745 890 745 890 685.5 854 c 128,-1,24 + 626 818 626 818 593 776 c 1,25,-1 + 474 260 l 1,26,27 + 472 224 472 224 510 190 c 128,-1,28 + 548 156 548 156 616 156 c 0,29,30 + 677 156 677 156 750.5 223 c 128,-1,31 + 824 290 824 290 877 520 c 2,18,-1 +EndSplineSet +EndChar + +StartChar: q +Encoding: 104 113 84 +Width: 1145 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 65 + 9 + 6 + 24 + 6 + 121 + 11 + 137 + 6 + 155 + 6 + 5 + 16 + 12 + 52 + 15 + 1 + 18 + 19 + 15 + 3 + 5 + 12 + 22 + 32 + 12 + 13 + 29 + 47 + 64 + 2 + 96 + 5 + 3 + 1 + 18 + 96 + 33 + 1 + 0 + 22 + 16 + 15 + 2 + 16 + 18 + 64 + 18 + 112 + 18 + 3 + 18 + 26 + 23 + 15 + 8 + 31 + 8 + 2 + 15 + 8 + 239 + 8 + 2 + 8 + 32 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SMD +MDRP[min,rnd,grey] +SMD +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +931 -342 m 1,0,-1 + 647 -342 l 1,1,-1 + 761 152 l 1,2,3 + 724 100 724 100 638.5 42 c 128,-1,4 + 553 -16 553 -16 448 -16 c 0,5,6 + 280 -16 280 -16 208 95 c 128,-1,7 + 136 206 136 206 199 481 c 2,8,-1 + 232 624 l 2,9,10 + 279 829 279 829 423 968 c 128,-1,11 + 567 1107 567 1107 770 1107 c 0,12,13 + 850 1107 850 1107 902.5 1080.5 c 128,-1,14 + 955 1054 955 1054 977 993 c 1,15,-1 + 1058 1093 l 1,16,-1 + 1262 1093 l 1,17,-1 + 931 -342 l 1,0,-1 +799 317 m 1,18,-1 + 923 854 l 1,19,20 + 901 903 901 903 864 920 c 128,-1,21 + 827 937 827 937 787 937 c 0,22,23 + 698 937 698 937 629.5 856.5 c 128,-1,24 + 561 776 561 776 517 586 c 2,25,-1 + 502 518 l 2,26,27 + 462 345 462 345 483.5 273 c 128,-1,28 + 505 201 505 201 593 201 c 0,29,30 + 654 201 654 201 706 232 c 128,-1,31 + 758 263 758 263 799 317 c 1,18,-1 +EndSplineSet +EndChar + +StartChar: r +Encoding: 105 114 85 +Width: 891 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1051 751 m 1,0,-1 + 799 751 l 1,1,2 + 810 797 810 797 800 829.5 c 128,-1,3 + 790 862 790 862 738 862 c 0,4,5 + 689 862 689 862 649.5 833 c 128,-1,6 + 610 804 610 804 592 772 c 1,7,-1 + 414 0 l 1,8,-1 + 130 0 l 1,9,-1 + 382 1093 l 1,10,-1 + 655 1093 l 1,11,-1 + 619 911 l 1,12,13 + 680 1009 680 1009 753.5 1062.5 c 128,-1,14 + 827 1116 827 1116 910 1116 c 0,15,16 + 1034 1116 1034 1116 1073 1022 c 0,17,18 + 1103 952 1103 952 1076 835 c 0,19,20 + 1067 796 1067 796 1051 751 c 1,0,-1 +EndSplineSet +EndChar + +StartChar: s +Encoding: 106 115 86 +Width: 820 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 146 + 4 + 1 + 11 + 17 + 11 + 20 + 2 + 37 + 20 + 1 + 27 + 17 + 27 + 20 + 18 + 37 + 52 + 15 + 52 + 37 + 70 + 36 + 119 + 37 + 139 + 17 + 152 + 2 + 155 + 17 + 166 + 35 + 184 + 20 + 181 + 35 + 235 + 17 + 19 + 70 + 35 + 166 + 35 + 182 + 35 + 214 + 35 + 232 + 35 + 248 + 35 + 6 + 35 + 0 + 32 + 103 + 16 + 233 + 16 + 246 + 16 + 3 + 16 + 13 + 19 + 19 + 32 + 13 + 0 + 4 + 3 + 22 + 143 + 26 + 159 + 26 + 175 + 26 + 3 + 26 + 29 + 46 + 143 + 25 + 159 + 25 + 175 + 25 + 3 + 25 + 22 + 13 + 160 + 7 + 1 + 7 + 51 + 10 + 46 + 6 + 71 + 3 + 3 + 63 + 39 + 1 + 63 + 39 + 1 + 35 + 0 + 32 + 16 + 13 + 19 + 143 + 25 + 1 + 25 + 0 + 49 + 127 + 13 + 144 + 13 + 2 + 32 + 13 + 80 + 13 + 144 + 13 + 207 + 13 + 4 + 13 + 32 + 48 + 6 + 47 + 19 + 63 + 19 + 2 + 19 + 38 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +DELTAP1 +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +DELTAP1 +MIAP[rnd] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +DELTAP1 +SRP1 +SRP2 +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +845 329 m 0,0,1 + 810 178 810 178 685 76.5 c 128,-1,2 + 560 -25 560 -25 326 -25 c 0,3,4 + 229 -25 229 -25 153.5 -6.5 c 128,-1,5 + 78 12 78 12 48 39 c 1,6,-1 + 93 236 l 1,7,8 + 128 211 128 211 197.5 185.5 c 128,-1,9 + 267 160 267 160 345 160 c 0,10,11 + 445 160 445 160 507 197 c 128,-1,12 + 569 234 569 234 583 291 c 0,13,14 + 596 347 596 347 568 381.5 c 128,-1,15 + 540 416 540 416 405 465 c 0,16,17 + 278 509 278 509 246.5 590 c 128,-1,18 + 215 671 215 671 245 799 c 0,19,20 + 275 930 275 930 385.5 1020.5 c 128,-1,21 + 496 1111 496 1111 689 1111 c 0,22,23 + 778 1111 778 1111 836.5 1095.5 c 128,-1,24 + 895 1080 895 1080 942 1051 c 1,25,-1 + 901 871 l 1,26,27 + 867 895 867 895 798.5 911 c 128,-1,28 + 730 927 730 927 664 927 c 0,29,30 + 587 927 587 927 533 898.5 c 128,-1,31 + 479 870 479 870 468 821 c 0,32,33 + 455 765 455 765 486.5 743 c 128,-1,34 + 518 721 518 721 636 680 c 0,35,36 + 786 628 786 628 830.5 544.5 c 128,-1,37 + 875 461 875 461 845 329 c 0,0,1 +EndSplineSet +EndChar + +StartChar: t +Encoding: 107 116 87 +Width: 742 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 51 + 10 + 14 + 26 + 14 + 185 + 13 + 3 + 16 + 1 + 32 + 18 + 19 + 22 + 12 + 20 + 16 + 8 + 5 + 33 + 9 + 12 + 3 + 20 + 20 + 2 + 15 + 0 + 47 + 9 + 1 + 9 + 15 + 22 + 2 + 22 + 19 + 17 + 31 + 15 + 63 + 15 + 95 + 15 + 3 + 239 + 15 + 255 + 15 + 2 + 15 + 24 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +DELTAP2 +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +909 952 m 1,0,-1 + 649 952 l 1,1,-1 + 513 362 l 2,2,3 + 492 272 492 272 508 230 c 128,-1,4 + 524 188 524 188 598 188 c 0,5,6 + 633 188 633 188 667 194.5 c 128,-1,7 + 701 201 701 201 731 211 c 1,8,-1 + 689 31 l 1,9,10 + 640 10 640 10 572.5 0 c 128,-1,11 + 505 -10 505 -10 442 -10 c 0,12,13 + 304 -10 304 -10 247 91.5 c 128,-1,14 + 190 193 190 193 234 383 c 2,15,-1 + 366 954 l 1,16,-1 + 249 954 l 1,17,-1 + 287 1118 l 1,18,-1 + 416 1126 l 1,19,-1 + 600 1509 l 1,20,-1 + 778 1509 l 1,21,-1 + 690 1128 l 1,22,-1 + 950 1128 l 1,23,-1 + 909 952 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: u +Encoding: 108 117 88 +Width: 1145 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 54 + 43 + 6 + 235 + 6 + 251 + 6 + 3 + 10 + 6 + 140 + 6 + 154 + 6 + 172 + 6 + 4 + 17 + 2 + 96 + 5 + 0 + 2 + 14 + 45 + 57 + 5 + 72 + 5 + 2 + 5 + 3 + 18 + 9 + 12 + 96 + 21 + 1 + 19 + 22 + 1 + 2 + 64 + 18 + 160 + 18 + 2 + 175 + 18 + 1 + 18 + 10 + 22 + 9 + 20 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIAP[rnd] +SRP0 +SMD +MDRP[rp0,min,grey] +MDRP[min,rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1006 0 m 1,0,-1 + 733 0 l 1,1,-1 + 770 180 l 1,2,3 + 704 104 704 104 603.5 40.5 c 128,-1,4 + 503 -23 503 -23 377 -23 c 0,5,6 + 259 -23 259 -23 209.5 54 c 128,-1,7 + 160 131 160 131 206 328 c 2,8,-1 + 382 1093 l 1,9,-1 + 666 1093 l 1,10,-1 + 498 366 l 2,11,12 + 479 282 479 282 504.5 252.5 c 128,-1,13 + 530 223 530 223 577 223 c 0,14,15 + 637 223 637 223 693 247 c 128,-1,16 + 749 271 749 271 796 321 c 1,17,-1 + 974 1093 l 1,18,-1 + 1259 1093 l 1,19,-1 + 1006 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: v +Encoding: 109 118 89 +Width: 998 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 112 + 25 + 5 + 56 + 5 + 59 + 6 + 84 + 1 + 89 + 6 + 106 + 2 + 118 + 1 + 121 + 6 + 150 + 1 + 156 + 2 + 169 + 2 + 184 + 2 + 12 + 16 + 8 + 1 + 21 + 5 + 85 + 5 + 154 + 5 + 3 + 63 + 0 + 140 + 0 + 2 + 0 + 60 + 22 + 6 + 1 + 6 + 59 + 1 + 1 + 1 + 60 + 5 + 5 + 6 + 116 + 3 + 132 + 3 + 2 + 3 + 59 + 123 + 4 + 1 + 4 + 25 + 2 + 60 + 2 + 2 + 2 + 59 + 121 + 5 + 1 + 5 + 5 + 4 + 5 + 2 + 3 + 1 + 2 + 0 + 6 + 4 + 0 + 3 + 12 + 1 + 6 + 0 + 2 + 4 + 3 + 106 + 5 + 1 + 5 + 5 + 0 + 3 + 0 + 0 + 1 + 0 + 8 + 18 + 3 + 1 + 3 + 7 +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP1 +SRP2 +IP +RTHG +MDAP[rnd] +RTG +DELTAP1 +SRP2 +IP +IP +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1266 1093 m 1,0,-1 + 590 0 l 1,1,-1 + 391 0 l 1,2,-1 + 246 1093 l 1,3,-1 + 269 896 l 0,4,5 + 268 909 268 909 258.5 918.5 c 128,-1,6 + 249 928 249 928 237 928 c 0,7,8 + 189 928 189 928 95 772 c 2,9,-1 + 73 734 l 1,10,-1 + 24 769 l 1,11,12 + 139 972 139 972 213.5 1043.5 c 128,-1,13 + 288 1115 288 1115 388 1115 c 0,14,15 + 522 1115 522 1115 536 983 c 0,16,-1 + 523 1093 l 1,17,-1 + 602 349 l 1,18,-1 + 1018 1024 l 0,19,20 + 1077 1120 1077 1120 1170 1119 c 0,21,22 + 1247 1119 1247 1119 1282 1052.5 c 128,-1,23 + 1317 986 1317 986 1332 811 c 1,24,-1 + 1285 782 l 1,25,-1 + 1270 873 l 2,26,27 + 1263 921 1263 921 1247.5 947.5 c 128,-1,28 + 1232 974 1232 974 1214 974 c 0,29,30 + 1194 974 1194 974 1174 939 c 0,31,-1 + 1266 1093 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: w +Encoding: 110 119 90 +Width: 1497 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 199 + 11 + 3 + 31 + 8 + 70 + 8 + 68 + 11 + 80 + 8 + 80 + 11 + 111 + 3 + 103 + 11 + 159 + 3 + 9 + 12 + 2 + 8 + 5 + 6 + 9 + 26 + 2 + 20 + 4 + 41 + 8 + 57 + 2 + 57 + 4 + 56 + 5 + 54 + 7 + 51 + 10 + 74 + 2 + 70 + 10 + 87 + 1 + 88 + 2 + 88 + 5 + 86 + 8 + 88 + 9 + 87 + 10 + 88 + 11 + 136 + 12 + 151 + 4 + 22 + 63 + 14 + 1 + 8 + 60 + 7 + 8 + 4 + 48 + 9 + 1 + 9 + 60 + 3 + 4 + 3 + 132 + 11 + 1 + 11 + 59 + 11 + 12 + 2 + 116 + 10 + 132 + 10 + 2 + 10 + 59 + 3 + 3 + 2 + 246 + 11 + 1 + 11 + 60 + 23 + 1 + 1 + 1 + 59 + 12 + 68 + 12 + 246 + 12 + 3 + 12 + 60 + 5 + 0 + 53 + 0 + 2 + 0 + 0 + 1 + 118 + 8 + 134 + 8 + 2 + 8 + 59 + 5 + 116 + 7 + 132 + 7 + 2 + 7 + 59 + 5 + 6 + 6 + 5 + 1 + 12 + 0 + 2 + 9 + 11 + 4 + 10 + 5 + 7 + 6 + 8 + 3 + 11 + 8 + 0 + 6 + 11 + 0 + 63 + 0 + 176 + 0 + 3 + 0 + 9 + 10 + 8 + 6 + 47 + 6 + 55 + 6 + 3 + 6 + 13 + 8 + 3 + 11 + 3 + 5 + 6 + 7 + 9 + 10 + 12 + 0 + 5 + 6 + 12 + 4 + 2 + 1 + 3 + 5 + 0 +SVTCA[y-axis] +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +SRP1 +SRP2 +SLOOP +IP +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +IP +IP +RTHG +MDAP[rnd] +SRP2 +IP +IP +SRP2 +IP +MDAP[rnd] +SRP2 +IP +SRP2 +IP +IP +RTG +SPVTL[orthog] +SRP0 +MDRP[grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[no-rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[no-rnd] +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +SFVTCA[x-axis] +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[no-rnd] +SFVTL[parallel] +MIRP[rp0,min,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1769 1093 m 1,0,-1 + 1116 0 l 1,1,-1 + 947 0 l 1,2,-1 + 882 556 l 1,3,-1 + 546 0 l 1,4,-1 + 378 0 l 1,5,-1 + 247 1093 l 1,6,-1 + 268 898 l 0,7,8 + 267 911 267 911 257.5 920.5 c 128,-1,9 + 248 930 248 930 236 930 c 0,10,11 + 190 930 190 930 96 777 c 2,12,-1 + 73 737 l 1,13,-1 + 23 771 l 1,14,15 + 137 972 137 972 212 1043.5 c 128,-1,16 + 287 1115 287 1115 385 1115 c 0,17,18 + 517 1115 517 1115 531 981 c 0,19,-1 + 520 1093 l 1,20,-1 + 597 416 l 1,21,-1 + 976 1093 l 1,22,-1 + 1101 1093 l 1,23,-1 + 1161 416 l 1,24,-1 + 1531 1068 l 0,25,26 + 1593 1177 1593 1177 1688 1177 c 0,27,28 + 1765 1177 1765 1177 1798 1097.5 c 128,-1,29 + 1831 1018 1831 1018 1838 810 c 1,30,-1 + 1790 781 l 1,31,-1 + 1775 871 l 2,32,33 + 1768 919 1768 919 1752.5 945.5 c 128,-1,34 + 1737 972 1737 972 1719 972 c 0,35,36 + 1699 972 1699 972 1679 937 c 0,37,-1 + 1769 1093 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: x +Encoding: 111 120 91 +Width: 1028 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 160 + 54 + 2 + 67 + 8 + 86 + 8 + 102 + 8 + 118 + 8 + 149 + 8 + 6 + 11 + 1 + 5 + 3 + 5 + 7 + 11 + 9 + 25 + 1 + 21 + 3 + 21 + 7 + 38 + 11 + 91 + 5 + 85 + 11 + 154 + 1 + 154 + 2 + 167 + 11 + 198 + 11 + 215 + 11 + 15 + 11 + 8 + 0 + 7 + 8 + 9 + 7 + 0 + 137 + 5 + 1 + 2 + 5 + 1 + 6 + 6 + 5 + 6 + 1 + 116 + 1 + 128 + 1 + 2 + 1 + 59 + 0 + 0 + 7 + 116 + 7 + 132 + 7 + 2 + 7 + 59 + 6 + 6 + 1 + 11 + 2 + 10 + 3 + 3 + 10 + 8 + 5 + 9 + 4 + 4 + 9 + 9 + 60 + 10 + 3 + 10 + 3 + 60 + 4 + 4 + 9 + 8 + 5 + 11 + 2 + 4 + 4 + 6 + 7 + 8 + 10 + 3 + 6 + 12 + 3 + 1 + 0 + 3 + 4 + 2 + 9 + 3 + 4 + 10 + 10 + 7 + 1 + 3 + 0 + 159 + 6 + 1 + 6 + 5 + 8 + 2 + 11 + 6 + 5 + 16 + 0 + 32 + 0 + 112 + 0 + 144 + 0 + 4 + 0 + 31 + 4 + 47 + 4 + 2 + 4 + 12 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +SLOOP +IP +MDAP[rnd] +DELTAP1 +SRP2 +SLOOP +IP +MDAP[rnd] +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +SLOOP +ALIGNRP +MIAP[rnd] +SLOOP +ALIGNRP +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SFVTCA[x-axis] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[parallel] +SFVTL[parallel] +SRP1 +SRP2 +IP +IP +DELTAP1 +SPVTL[orthog] +SFVTL[parallel] +SRP1 +SRP2 +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +978 191 m 1,0,1 + 986 167 986 167 1005 167 c 0,2,3 + 1053 167 1053 167 1148 325 c 2,4,-1 + 1169 361 l 1,5,-1 + 1219 326 l 1,6,7 + 1103 122 1103 122 1027.5 50 c 128,-1,8 + 952 -22 952 -22 852 -22 c 0,9,10 + 738 -22 738 -22 709 60 c 1,11,-1 + 588 382 l 1,12,-1 + 281 34 l 1,13,14 + 229 -25 229 -25 148 -25 c 0,15,16 + 67 -25 67 -25 31.5 43 c 128,-1,17 + -4 111 -4 111 -21 291 c 1,18,-1 + 30 322 l 1,19,-1 + 43 241 l 2,20,21 + 51 188 51 188 66.5 158.5 c 128,-1,22 + 82 129 82 129 101 129 c 0,23,24 + 104 129 104 129 107 130 c 128,-1,25 + 110 131 110 131 112.5 132.5 c 128,-1,26 + 115 134 115 134 118 137 c 128,-1,27 + 121 140 121 140 122.5 142 c 128,-1,28 + 124 144 124 144 127.5 148 c 128,-1,29 + 131 152 131 152 133 154 c 1,30,-1 + 522 567 l 1,31,-1 + 297 1093 l 1,32,-1 + 614 1093 l 1,33,-1 + 727 788 l 1,34,-1 + 1003 1093 l 1,35,-1 + 1259 1093 l 1,36,-1 + 797 604 l 1,37,-1 + 978 191 l 1,0,1 +EndSplineSet +EndChar + +StartChar: y +Encoding: 112 121 92 +Width: 998 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 115 + 84 + 6 + 1 + 21 + 6 + 56 + 6 + 90 + 3 + 109 + 3 + 153 + 3 + 152 + 4 + 6 + 62 + 2 + 1 + 2 + 60 + 8 + 1 + 18 + 1 + 38 + 1 + 60 + 1 + 4 + 1 + 4 + 3 + 1 + 3 + 4 + 3 + 4 + 6 + 20 + 6 + 38 + 6 + 169 + 6 + 4 + 6 + 5 + 6 + 61 + 7 + 1 + 7 + 60 + 11 + 0 + 52 + 0 + 2 + 0 + 0 + 1 + 13 + 3 + 1 + 60 + 3 + 173 + 3 + 2 + 3 + 59 + 6 + 115 + 4 + 132 + 4 + 2 + 4 + 59 + 120 + 5 + 1 + 5 + 6 + 5 + 3 + 2 + 7 + 0 + 2 + 5 + 4 + 6 + 1 + 6 + 0 + 4 + 90 + 0 + 1 + 0 + 9 + 4 + 8 + 3 + 2 + 0 + 7 + 5 + 4 + 12 + 1 + 2 + 18 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP2 +IP +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP1 +SRP2 +IP +IP +RTHG +MDAP[rnd] +RTG +SRP2 +IP +IP +SRP2 +IP +MDAP[rnd] +IP +SPVTL[orthog] +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +DELTAP2 +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SFVTL[parallel] +MDRP[grey] +DELTAP1 +SFVTL[parallel] +MDRP[grey] +DELTAP1 +SFVTCA[x-axis] +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1266 1093 m 1,0,-1 + 367 -342 l 1,1,-1 + 142 -342 l 1,2,-1 + 382 27 l 1,3,-1 + 244 1093 l 1,4,-1 + 268 897 l 0,5,6 + 267 910 267 910 257 920 c 128,-1,7 + 247 930 247 930 236 930 c 0,8,9 + 188 930 188 930 93 771 c 1,10,-1 + 72 733 l 1,11,-1 + 22 768 l 1,12,13 + 137 971 137 971 212 1043 c 128,-1,14 + 287 1115 287 1115 386 1115 c 0,15,16 + 520 1115 520 1115 535 983 c 0,17,-1 + 522 1093 l 1,18,-1 + 600 347 l 1,19,-1 + 1044 1093 l 1,20,-1 + 996 1014 l 0,21,22 + 1058 1118 1058 1118 1158 1118 c 0,23,24 + 1241 1118 1241 1118 1277.5 1050 c 128,-1,25 + 1314 982 1314 982 1330 800 c 1,26,-1 + 1278 768 l 1,27,-1 + 1266 847 l 2,28,29 + 1258 903 1258 903 1242 932.5 c 128,-1,30 + 1226 962 1226 962 1206 962 c 0,31,32 + 1187 962 1187 962 1166 930 c 0,33,-1 + 1266 1093 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: z +Encoding: 113 122 93 +Width: 874 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 56 + 7 + 136 + 3 + 134 + 8 + 3 + 96 + 8 + 1 + 8 +PUSHW_1 + -16 +NPUSHB + 43 + 3 + 16 + 8 + 59 + 2 + 2 + 3 + 3 + 59 + 7 + 7 + 8 + 7 + 3 + 6 + 3 + 33 + 6 + 12 + 2 + 8 + 1 + 8 + 33 + 1 + 0 + 63 + 11 + 1 + 3 + 7 + 16 + 0 + 1 + 0 + 11 + 4 + 8 + 128 + 2 + 1 + 2 + 10 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,rnd,grey] +MDRP[grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SVTCA[x-axis] +SHPIX +SHPIX +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +855 0 m 1,0,-1 + 35 0 l 1,1,-1 + 84 212 l 1,2,-1 + 743 888 l 1,3,-1 + 249 888 l 1,4,-1 + 296 1093 l 1,5,-1 + 1085 1093 l 1,6,-1 + 1036 881 l 1,7,-1 + 362 205 l 1,8,-1 + 902 205 l 1,9,-1 + 855 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: braceleft +Encoding: 114 123 94 +Width: 749 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 63 + 11 + 3 + 11 + 18 + 27 + 3 + 27 + 18 + 246 + 32 + 5 + 6 + 32 + 1 + 31 + 10 + 45 + 11 + 74 + 11 + 21 + 0 + 40 + 73 + 0 + 18 + 22 + 73 + 21 + 16 + 4 + 31 + 1 + 22 + 31 + 1 + 31 + 10 + 22 + 0 + 4 + 28 + 34 + 24 + 10 + 14 + 17 + 9 + 4 + 1 + 40 + 4 + 56 + 4 + 72 + 4 + 88 + 4 + 249 + 4 + 5 + 4 + 41 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[grey] +DELTAP1 +DELTAP2 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +604 -344 m 1,0,-1 + 414 -344 l 2,1,2 + 299 -344 299 -344 247 -265 c 128,-1,3 + 195 -186 195 -186 218 -86 c 0,4,5 + 246 35 246 35 269.5 139.5 c 128,-1,6 + 293 244 293 244 323 373 c 0,7,8 + 337 434 337 434 310.5 461.5 c 128,-1,9 + 284 489 284 489 188 489 c 1,10,-1 + 243 731 l 1,11,12 + 343 731 343 731 380 747.5 c 128,-1,13 + 417 764 417 764 431 825 c 0,14,15 + 461 956 461 956 480 1043 c 128,-1,16 + 499 1130 499 1130 527 1251 c 0,17,18 + 550 1352 550 1352 642 1430.5 c 128,-1,19 + 734 1509 734 1509 842 1509 c 2,20,-1 + 1032 1509 l 1,21,-1 + 988 1317 l 1,22,23 + 988 1317 988 1317 956 1317 c 128,-1,24 + 924 1317 924 1317 889 1317 c 0,25,26 + 842 1317 842 1317 824 1270 c 128,-1,27 + 806 1223 806 1223 780 1110 c 0,28,29 + 725 870 725 870 672 755.5 c 128,-1,30 + 619 641 619 641 498 612 c 1,31,32 + 606 575 606 575 613.5 498.5 c 128,-1,33 + 621 422 621 422 569 197 c 0,34,35 + 516 -33 516 -33 509.5 -92.5 c 128,-1,36 + 503 -152 503 -152 550 -152 c 0,37,38 + 584 -152 584 -152 616.5 -152 c 128,-1,39 + 649 -152 649 -152 649 -152 c 1,40,-1 + 604 -344 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: bar +Encoding: 115 124 95 +Width: 778 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 1 + 2 + 16 + 63 + 0 + 1 + 0 + 58 + 1 + 4 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +416 -410 m 1,0,-1 + 176 -410 l 1,1,-1 + 619 1511 l 1,2,-1 + 859 1511 l 1,3,-1 + 416 -410 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: braceright +Encoding: 116 125 96 +Width: 749 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 70 + 9 + 19 + 1 + 3 + 7 + 3 + 33 + 19 + 7 + 19 + 33 + 249 + 19 + 5 + 20 + 0 + 45 + 0 + 40 + 16 + 40 + 96 + 40 + 3 + 40 + 74 + 40 + 11 + 30 + 11 + 73 + 10 + 18 + 29 + 73 + 30 + 16 + 11 + 20 + 1 + 25 + 20 + 1 + 20 + 0 + 29 + 12 + 6 + 23 + 17 + 24 + 0 + 37 + 34 + 6 + 6 + 1 + 39 + 6 + 55 + 6 + 71 + 6 + 87 + 6 + 246 + 6 + 5 + 6 + 42 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[grey] +DELTAP1 +DELTAP2 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +DELTAP1 +MIRP[rp0,min,rnd,black] +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +DELTAP2 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +788 489 m 1,0,1 + 691 489 691 489 652 461.5 c 128,-1,2 + 613 434 613 434 599 373 c 0,3,4 + 569 244 569 244 544 139.5 c 128,-1,5 + 519 35 519 35 491 -86 c 0,6,7 + 468 -186 468 -186 380 -265 c 128,-1,8 + 292 -344 292 -344 176 -344 c 2,9,-1 + -14 -344 l 1,10,-1 + 30 -152 l 1,11,12 + 30 -152 30 -152 62.5 -152 c 128,-1,13 + 95 -152 95 -152 129 -152 c 0,14,15 + 176 -152 176 -152 197 -92.5 c 128,-1,16 + 218 -33 218 -33 271 197 c 0,17,18 + 323 422 323 422 366 498.5 c 128,-1,19 + 409 575 409 575 534 612 c 1,20,21 + 426 641 426 641 426 755.5 c 128,-1,22 + 426 870 426 870 482 1110 c 0,23,24 + 508 1223 508 1223 512 1270 c 128,-1,25 + 516 1317 516 1317 468 1317 c 0,26,27 + 434 1317 434 1317 402 1317 c 128,-1,28 + 370 1317 370 1317 370 1317 c 1,29,-1 + 414 1509 l 1,30,-1 + 604 1509 l 2,31,32 + 713 1509 713 1509 768 1430.5 c 128,-1,33 + 823 1352 823 1352 800 1251 c 0,34,35 + 772 1130 772 1130 751 1043 c 128,-1,36 + 730 956 730 956 700 825 c 0,37,38 + 686 764 686 764 714 747.5 c 128,-1,39 + 742 731 742 731 843 731 c 1,40,-1 + 788 489 l 1,0,1 +EndSplineSet +EndChar + +StartChar: asciitilde +Encoding: 117 126 97 +Width: 1210 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 54 + 2 + 63 + 14 + 48 + 36 + 69 + 2 + 4 + 6 + 9 + 3 + 12 + 31 + 28 + 34 + 25 + 34 + 34 + 3 + 18 + 12 + 34 + 25 + 40 + 6 + 52 + 9 + 1 + 9 + 3 + 12 + 59 + 31 + 1 + 31 + 28 + 34 + 25 + 25 + 34 + 12 + 3 + 4 + 0 + 22 + 18 + 15 + 41 + 0 + 34 + 40 + 112 + 37 + 1 + 0 + 37 + 16 + 37 + 144 + 37 + 3 + 37 + 70 + 15 + 34 + 19 + 15 + 22 + 47 + 22 + 63 + 22 + 239 + 22 + 4 + 22 + 44 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +SROUND +MDRP[rp0,min,rnd,grey] +RTG +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +IP +DELTAP1 +SRP1 +SRP2 +IP +DELTAP1 +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +SRP1 +SRP2 +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1353 731 m 0,0,1 + 1326 616 1326 616 1230.5 531 c 128,-1,2 + 1135 446 1135 446 989 446 c 0,3,4 + 903 446 903 446 829.5 492.5 c 128,-1,5 + 756 539 756 539 700 596 c 0,6,7 + 693 604 693 604 688 607 c 128,-1,8 + 683 610 683 610 675 618 c 0,9,10 + 636 664 636 664 598 699.5 c 128,-1,11 + 560 735 560 735 512 735 c 0,12,13 + 449 735 449 735 414 699.5 c 128,-1,14 + 379 664 379 664 370 621 c 0,15,16 + 358 571 358 571 365 530 c 128,-1,17 + 372 489 372 489 392 449 c 1,18,-1 + 215 449 l 1,19,20 + 188 489 188 489 178.5 537.5 c 128,-1,21 + 169 586 169 586 189 672 c 0,22,23 + 214 782 214 782 316 869 c 128,-1,24 + 418 956 418 956 551 956 c 0,25,26 + 637 956 637 956 710.5 911 c 128,-1,27 + 784 866 784 866 839 809 c 0,28,29 + 850 797 850 797 852.5 795 c 128,-1,30 + 855 793 855 793 861 782 c 0,31,32 + 900 737 900 737 941 702.5 c 128,-1,33 + 982 668 982 668 1030 668 c 0,34,35 + 1093 668 1093 668 1127.5 703.5 c 128,-1,36 + 1162 739 1162 739 1172 782 c 0,37,38 + 1183 831 1183 831 1176.5 872 c 128,-1,39 + 1170 913 1170 913 1149 954 c 1,40,-1 + 1326 954 l 1,41,42 + 1353 913 1353 913 1363 865 c 128,-1,43 + 1373 817 1373 817 1353 731 c 0,0,1 +EndSplineSet +EndChar + +StartChar: Adieresis +Encoding: 154 196 98 +Width: 1358 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 197 247 2 +EndChar + +StartChar: Aring +Encoding: 155 197 99 +Width: 1262 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 161 + 58 + 6 + 55 + 18 + 102 + 4 + 218 + 13 + 233 + 13 + 248 + 6 + 6 + 9 + 32 + 202 + 32 + 218 + 32 + 235 + 32 + 4 + 32 + 57 + 4 + 32 + 18 + 31 + 2 + 40 + 1 + 1 + 1 + 57 + 56 + 0 + 1 + 0 + 0 + 18 + 100 + 32 + 1 + 59 + 32 + 1 + 32 + 58 + 6 + 33 + 3 + 100 + 4 + 1 + 39 + 4 + 63 + 4 + 203 + 4 + 219 + 4 + 237 + 4 + 5 + 4 + 58 + 5 + 5 + 6 + 15 + 75 + 47 + 19 + 127 + 19 + 2 + 15 + 19 + 63 + 19 + 64 + 19 + 80 + 19 + 127 + 19 + 143 + 19 + 159 + 19 + 207 + 19 + 223 + 19 + 240 + 19 + 10 + 19 + 25 + 75 + 0 + 9 + 1 + 9 + 6 + 18 + 32 + 33 + 31 + 3 + 2 + 4 + 1 + 9 + 15 + 11 + 0 + 5 + 0 + 35 + 55 + 5 + 1 + 5 + 34 + 2 + 3 + 30 + 31 + 48 + 33 + 1 + 33 + 33 + 5 + 6 + 18 + 63 + 6 + 1 + 6 + 22 + 210 + 7 + 12 + 55 + 12 + 71 + 12 + 87 + 12 + 4 + 12 + 28 + 4 + 1 + 0 + 3 + 5 + 0 +SVTCA[y-axis] +MIAP[rnd] +SLOOP +IP +MDAP[rnd] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +DELTAP2 +MDRP[grey] +MDRP[grey] +SRP0 +MIRP[rp0,min,black] +DELTAP1 +DELTAP2 +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +MDRP[grey] +SRP0 +SFVTL[parallel] +MIRP[rp0,min,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1257 0 m 1,0,-1 + 934 0 l 1,1,-1 + 914 362 l 1,2,-1 + 451 362 l 1,3,-1 + 261 0 l 1,4,-1 + 4 0 l 1,5,-1 + 758 1386 l 1,6,7 + 729 1419 729 1419 719 1470.5 c 128,-1,8 + 709 1522 709 1522 723 1581 c 0,9,10 + 749 1692 749 1692 841 1768.5 c 128,-1,11 + 933 1845 933 1845 1042 1845 c 0,12,13 + 1152 1845 1152 1845 1207.5 1768.5 c 128,-1,14 + 1263 1692 1263 1692 1237 1581 c 0,15,16 + 1225 1528 1225 1528 1197 1481 c 128,-1,17 + 1169 1434 1169 1434 1131 1401 c 1,18,-1 + 1257 0 l 1,0,-1 +1102 1581 m 0,19,20 + 1114 1632 1114 1632 1087 1672 c 128,-1,21 + 1060 1712 1060 1712 1011 1712 c 0,22,23 + 963 1712 963 1712 916.5 1672 c 128,-1,24 + 870 1632 870 1632 858 1581 c 0,25,26 + 846 1528 846 1528 874 1489 c 128,-1,27 + 902 1450 902 1450 950 1450 c 0,28,29 + 999 1450 999 1450 1044.5 1489 c 128,-1,30 + 1090 1528 1090 1528 1102 1581 c 0,19,20 +897 580 m 1,31,-1 + 853 1135 l 1,32,-1 + 563 580 l 1,33,-1 + 897 580 l 1,31,-1 +EndSplineSet +EndChar + +StartChar: Ccedilla +Encoding: 157 199 100 +Width: 1190 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 38 67 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 248 10 2 +EndChar + +StartChar: Eacute +Encoding: 159 201 101 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 216 260 2 +EndChar + +StartChar: Ntilde +Encoding: 167 209 102 +Width: 1397 +GlyphClass: 1 +Flags: W +TtInstrs: +SVTCA[y-axis] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 49 78 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 248 232 2 +EndChar + +StartChar: Odieresis +Encoding: 172 214 103 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 63 + 34 + 63 + 46 + 2 + 63 + 53 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 142 168 N 1 0 0 1 246 247 2 +EndChar + +StartChar: Udieresis +Encoding: 178 220 104 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 63 + 24 + 63 + 36 + 2 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 255 247 2 +EndChar + +StartChar: aacute +Encoding: 183 225 105 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 29 + 0 + 46 + 16 + 46 + 2 + 143 + 46 + 159 + 46 + 175 + 46 + 191 + 46 + 4 + 16 + 49 + 63 + 49 + 159 + 46 + 175 + 46 + 191 + 46 + 192 + 49 + 240 + 49 + 7 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 105 -75 2 +EndChar + +StartChar: agrave +Encoding: 182 224 106 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 0 + 46 + 16 + 46 + 2 + 47 + 46 + 63 + 46 + 2 + 16 + 49 + 63 + 49 + 192 + 49 + 240 + 49 + 4 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 58 -75 2 +EndChar + +StartChar: acircumflex +Encoding: 184 226 107 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 0 + 46 + 16 + 46 + 2 + 16 + 52 + 63 + 52 + 192 + 52 + 240 + 52 + 4 + 0 + 48 + 16 + 48 + 2 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 101 -75 2 +EndChar + +StartChar: adieresis +Encoding: 186 228 108 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 29 + 16 + 47 + 16 + 59 + 2 + 0 + 47 + 0 + 59 + 2 + 48 + 47 + 48 + 59 + 2 + 16 + 50 + 16 + 62 + 2 + 16 + 69 + 63 + 69 + 192 + 69 + 240 + 69 + 4 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 93 -73 2 +EndChar + +StartChar: atilde +Encoding: 185 227 109 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 21 + 0 + 47 + 16 + 47 + 2 + 0 + 57 + 16 + 57 + 47 + 57 + 3 + 16 + 71 + 63 + 71 + 192 + 71 + 240 + 71 + 4 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 99 -90 2 +EndChar + +StartChar: aring +Encoding: 187 229 110 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 61 + 0 + 47 + 0 + 66 + 16 + 47 + 16 + 66 + 4 + 16 + 50 + 16 + 62 + 95 + 50 + 95 + 62 + 4 + 223 + 50 + 223 + 62 + 2 + 0 + 50 + 0 + 62 + 16 + 50 + 16 + 62 + 159 + 50 + 159 + 62 + 175 + 50 + 175 + 62 + 191 + 50 + 191 + 62 + 207 + 50 + 207 + 62 + 239 + 50 + 239 + 62 + 14 + 16 + 69 + 63 + 69 + 192 + 69 + 240 + 69 + 4 +DELTAP1 +DELTAP1 +DELTAP2 +DELTAP3 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 221 730 N 1 0 0 1 103 -82 2 +EndChar + +StartChar: ccedilla +Encoding: 189 231 111 +Width: 1124 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 0 + 46 + 16 + 46 + 215 + 4 + 3 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 70 99 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 143 10 2 +EndChar + +StartChar: eacute +Encoding: 191 233 112 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 33 + 16 + 33 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 117 -75 2 +EndChar + +StartChar: egrave +Encoding: 190 232 113 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 32 + 16 + 32 + 2 + 48 + 33 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 72 -75 2 +EndChar + +StartChar: ecircumflex +Encoding: 192 234 114 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 33 + 16 + 35 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 115 -75 2 +EndChar + +StartChar: edieresis +Encoding: 193 235 115 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 0 + 35 + 0 + 47 + 16 + 35 + 16 + 47 + 4 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 120 -88 2 +EndChar + +StartChar: iacute +Encoding: 195 237 116 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 6 + 16 + 6 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 -129 -75 2 +EndChar + +StartChar: igrave +Encoding: 194 236 117 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 5 + 16 + 5 + 2 + 48 + 6 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 -260 -75 2 +EndChar + +StartChar: icircumflex +Encoding: 196 238 118 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 5 + 16 + 5 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 -218 -75 2 +EndChar + +StartChar: idieresis +Encoding: 197 239 119 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 0 + 7 + 0 + 19 + 16 + 7 + 16 + 19 + 4 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 -227 -88 2 +EndChar + +StartChar: ntilde +Encoding: 199 241 120 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 22 + 16 + 22 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 113 -88 2 +EndChar + +StartChar: oacute +Encoding: 201 243 121 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 30 + 16 + 30 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 183 -75 2 +EndChar + +StartChar: ograve +Encoding: 200 242 122 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 30 + 16 + 30 + 2 + 48 + 30 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 104 -75 2 +EndChar + +StartChar: ocircumflex +Encoding: 202 244 123 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 32 + 16 + 32 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 165 -75 2 +EndChar + +StartChar: odieresis +Encoding: 204 246 124 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 0 + 31 + 0 + 43 + 16 + 31 + 16 + 43 + 4 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 150 -89 2 +EndChar + +StartChar: otilde +Encoding: 203 245 125 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 31 + 16 + 31 + 2 + 48 + 41 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 142 -89 2 +EndChar + +StartChar: uacute +Encoding: 208 250 126 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 22 + 16 + 22 + 2 + 96 + 25 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 157 -75 2 +EndChar + +StartChar: ugrave +Encoding: 207 249 127 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 0 + 21 + 16 + 21 + 2 + 48 + 22 + 96 + 25 + 2 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 74 -75 2 +EndChar + +StartChar: ucircumflex +Encoding: 209 251 128 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 23 + 16 + 23 + 2 + 96 + 28 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 116 -75 2 +EndChar + +StartChar: udieresis +Encoding: 210 252 129 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 0 + 23 + 0 + 35 + 16 + 23 + 16 + 35 + 4 + 96 + 45 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 111 -88 2 +EndChar + +StartChar: dagger +Encoding: 356 8224 130 +Width: 974 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 1 + 5 + 73 + 10 + 6 + 12 + 3 + 18 + 8 + 16 + 48 + 13 + 1 + 2 + 64 + 1 + 48 + 0 + 1 + 0 + 101 + 9 + 22 + 3 + 64 + 4 + 63 + 5 + 1 + 5 + 101 + 8 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1181 952 m 1,0,-1 + 848 952 l 1,1,-1 + 511 -342 l 1,2,-1 + 288 -342 l 1,3,-1 + 549 952 l 1,4,-1 + 233 952 l 1,5,-1 + 278 1149 l 1,6,-1 + 594 1149 l 1,7,-1 + 677 1509 l 1,8,-1 + 977 1509 l 1,9,-1 + 894 1149 l 1,10,-1 + 1227 1149 l 1,11,-1 + 1181 952 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: degree +Encoding: 134 176 131 +Width: 763 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 32 + 5 + 1 + 9 + 5 + 9 + 7 + 5 + 11 + 4 + 3 + 73 + 21 + 15 + 73 + 9 + 15 + 0 + 73 + 12 + 18 + 73 + 63 + 6 + 143 + 6 + 160 + 6 + 176 + 6 + 4 + 6 + 24 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1005 1163 m 0,0,1 + 970 1012 970 1012 843.5 903.5 c 128,-1,2 + 717 795 717 795 577 795 c 0,3,4 + 436 795 436 795 360 903.5 c 128,-1,5 + 284 1012 284 1012 319 1163 c 0,6,7 + 354 1315 354 1315 480 1423.5 c 128,-1,8 + 606 1532 606 1532 747 1532 c 0,9,10 + 887 1532 887 1532 963.5 1423.5 c 128,-1,11 + 1040 1315 1040 1315 1005 1163 c 0,0,1 +811 1163 m 0,12,13 + 827 1231 827 1231 794.5 1277 c 128,-1,14 + 762 1323 762 1323 699 1323 c 256,15,16 + 636 1323 636 1323 582.5 1277 c 128,-1,17 + 529 1231 529 1231 513 1163 c 0,18,19 + 498 1096 498 1096 530 1050 c 128,-1,20 + 562 1004 562 1004 625 1004 c 256,21,22 + 688 1004 688 1004 742 1050 c 128,-1,23 + 796 1096 796 1096 811 1163 c 0,12,13 +EndSplineSet +EndChar + +StartChar: cent +Encoding: 120 162 132 +Width: 1100 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 22 + 51 + 25 + 34 + 21 + 51 + 16 + 18 + 15 + 35 + 51 + 32 + 35 + 0 + 51 + 3 + 5 + 6 + 3 + 18 + 3 + 32 + 15 + 6 + 6 + 0 + 9 + 22 + 0 + 39 + 29 + 55 + 29 + 2 + 29 + 23 + 8 + 36 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +MDAP[rnd] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +972 43 m 1,0,1 + 960 31 960 31 908 18.5 c 128,-1,2 + 856 6 856 6 788 2 c 1,3,-1 + 755 -143 l 1,4,-1 + 597 -143 l 1,5,-1 + 630 0 l 1,6,7 + 399 16 399 16 301.5 173 c 128,-1,8 + 204 330 204 330 271 616 c 0,9,10 + 274 627 274 627 276.5 639 c 128,-1,11 + 279 651 279 651 282 666 c 0,12,13 + 341 922 341 922 516.5 1067 c 128,-1,14 + 692 1212 692 1212 913 1229 c 1,15,-1 + 950 1389 l 1,16,-1 + 1108 1389 l 1,17,-1 + 1071 1227 l 1,18,19 + 1130 1221 1130 1221 1171.5 1208.5 c 128,-1,20 + 1213 1196 1213 1196 1234 1184 c 1,21,-1 + 1184 969 l 1,22,23 + 1148 987 1148 987 1096 1003.5 c 128,-1,24 + 1044 1020 1044 1020 966 1020 c 0,25,26 + 829 1020 829 1020 728.5 924.5 c 128,-1,27 + 628 829 628 829 587 651 c 2,28,-1 + 583 631 l 2,29,30 + 540 444 540 444 577.5 336.5 c 128,-1,31 + 615 229 615 229 751 229 c 0,32,33 + 838 229 838 229 910 239.5 c 128,-1,34 + 982 250 982 250 1023 262 c 1,35,-1 + 972 43 l 1,0,1 +EndSplineSet +EndChar + +StartChar: sterling +Encoding: 121 163 133 +Width: 1105 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 23 + 2 + 73 + 20 + 5 + 5 + 1 + 9 + 192 + 13 + 1 + 13 + 16 + 35 + 12 + 9 + 15 + 24 + 34 + 1 + 4 + 48 + 13 + 1 + 13 + 22 + 0 + 1 + 20 + 24 + 20 + 3 + 5 + 143 + 1 + 1 + 1 + 26 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +IP +MDRP[rnd,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1049 0 m 1,0,-1 + 158 0 l 1,1,-1 + 303 631 l 1,2,-1 + 167 631 l 1,3,-1 + 213 831 l 1,4,-1 + 349 831 l 1,5,-1 + 393 1020 l 2,6,7 + 444 1241 444 1241 628 1385.5 c 128,-1,8 + 812 1530 812 1530 1025 1530 c 0,9,10 + 1143 1530 1143 1530 1203 1517.5 c 128,-1,11 + 1263 1505 1263 1505 1339 1481 c 1,12,-1 + 1287 1253 l 1,13,14 + 1211 1280 1211 1280 1151.5 1290 c 128,-1,15 + 1092 1300 1092 1300 1021 1300 c 0,16,17 + 890 1300 890 1300 816 1231.5 c 128,-1,18 + 742 1163 742 1163 703 993 c 2,19,-1 + 666 831 l 1,20,-1 + 936 831 l 1,21,-1 + 890 631 l 1,22,-1 + 620 631 l 1,23,-1 + 526 225 l 1,24,-1 + 1101 225 l 1,25,-1 + 1049 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: section +Encoding: 125 167 134 +Width: 840 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 99 + 5 + 7 + 9 + 32 + 20 + 7 + 26 + 32 + 37 + 7 + 41 + 32 + 70 + 3 + 70 + 46 + 86 + 3 + 85 + 21 + 87 + 48 + 100 + 4 + 105 + 24 + 117 + 3 + 121 + 28 + 15 + 53 + 28 + 59 + 3 + 28 + 3 + 28 + 9 + 34 + 38 + 70 + 41 + 46 + 127 + 37 + 1 + 37 + 34 + 15 + 13 + 71 + 16 + 46 + 12 + 9 + 5 + 22 + 19 + 25 + 166 + 3 + 1 + 3 + 59 + 6 + 56 + 53 + 28 + 50 + 31 + 53 + 47 + 167 + 47 + 215 + 47 + 3 + 47 + 0 + 44 + 38 + 71 + 0 + 6 + 42 + 19 + 0 + 42 + 50 + 25 + 44 + 26 + 31 + 56 + 97 + 13 + 25 + 62 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +IP +DELTAP1 +SRP1 +SRP2 +IP +IP +SRP1 +SRP1 +IP +IP +DELTAP1 +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +MIAP[rnd] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rp0,rnd,grey] +RTG +SRP1 +SRP2 +IP +IP +RTDG +MDAP[rnd] +MDAP[rnd] +RTG +MDRP[grey] +SRP0 +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +956 772 m 0,0,1 + 936 684 936 684 891 617.5 c 128,-1,2 + 846 551 846 551 781 508 c 1,3,4 + 813 483 813 483 833 431 c 128,-1,5 + 853 379 853 379 833 289 c 0,6,7 + 799 143 799 143 669.5 59 c 128,-1,8 + 540 -25 540 -25 364 -25 c 0,9,10 + 269 -25 269 -25 187 -2.5 c 128,-1,11 + 105 20 105 20 74 37 c 1,12,-1 + 121 240 l 1,13,14 + 156 219 156 219 228.5 190.5 c 128,-1,15 + 301 162 301 162 371 162 c 0,16,17 + 469 162 469 162 523.5 199 c 128,-1,18 + 578 236 578 236 591 289 c 0,19,20 + 600 330 600 330 577.5 371 c 128,-1,21 + 555 412 555 412 439 475 c 0,22,23 + 352 524 352 524 293 586.5 c 128,-1,24 + 234 649 234 649 263 776 c 0,25,26 + 278 840 278 840 325 903.5 c 128,-1,27 + 372 967 372 967 422 1001 c 1,28,29 + 373 1032 373 1032 358.5 1086.5 c 128,-1,30 + 344 1141 344 1141 361 1214 c 0,31,32 + 391 1343 391 1343 502 1436.5 c 128,-1,33 + 613 1530 613 1530 786 1530 c 0,34,35 + 883 1530 883 1530 954 1507.5 c 128,-1,36 + 1025 1485 1025 1485 1053 1466 c 1,37,-1 + 1004 1253 l 1,38,39 + 966 1286 966 1286 896.5 1314.5 c 128,-1,40 + 827 1343 827 1343 745 1343 c 0,41,42 + 672 1343 672 1343 632.5 1316.5 c 128,-1,43 + 593 1290 593 1290 582 1241 c 0,44,45 + 566 1171 566 1171 621.5 1134.5 c 128,-1,46 + 677 1098 677 1098 747 1063 c 0,47,48 + 880 997 880 997 926.5 921.5 c 128,-1,49 + 973 846 973 846 956 772 c 0,0,1 +713 725 m 0,50,51 + 721 758 721 758 688.5 803 c 128,-1,52 + 656 848 656 848 551 905 c 1,53,54 + 525 891 525 891 503 859 c 128,-1,55 + 481 827 481 827 476 807 c 0,56,57 + 459 735 459 735 505.5 703.5 c 128,-1,58 + 552 672 552 672 649 616 c 1,59,60 + 672 633 672 633 689 664.5 c 128,-1,61 + 706 696 706 696 713 725 c 0,50,51 +EndSplineSet +EndChar + +StartChar: bullet +Encoding: 358 8226 135 +Width: 1104 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 3 + 9 + 0 + 6 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 768 m 0,0,1 + 374 944 374 944 520.5 1069.5 c 128,-1,2 + 667 1195 667 1195 829 1195 c 256,3,4 + 991 1195 991 1195 1079 1069 c 128,-1,5 + 1167 943 1167 943 1126 768 c 0,6,7 + 1086 595 1086 595 941 468 c 128,-1,8 + 796 341 796 341 631 341 c 256,9,10 + 466 341 466 341 379.5 467.5 c 128,-1,11 + 293 594 293 594 333 768 c 0,0,1 +EndSplineSet +EndChar + +StartChar: paragraph +Encoding: 140 182 136 +Width: 1105 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 54 + 8 + 7 + 24 + 7 + 105 + 8 + 121 + 8 + 4 + 15 + 35 + 6 + 6 + 5 + 13 + 16 + 3 + 34 + 13 + 10 + 1 + 5 + 0 + 0 + 115 + 111 + 1 + 127 + 1 + 2 + 1 + 4 + 34 + 15 + 224 + 5 + 1 + 5 + 63 + 19 + 78 + 19 + 86 + 19 + 3 + 19 + 42 + 79 + 9 + 95 + 9 + 2 + 9 + 22 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +995 0 m 1,0,-1 + 812 0 l 1,1,-1 + 1108 1284 l 1,2,-1 + 1015 1284 l 1,3,-1 + 719 0 l 1,4,-1 + 519 0 l 1,5,-1 + 661 616 l 1,6,7 + 446 616 446 616 341 715.5 c 128,-1,8 + 236 815 236 815 287 1034 c 2,9,-1 + 299 1085 l 2,10,11 + 343 1274 343 1274 499.5 1391.5 c 128,-1,12 + 656 1509 656 1509 890 1509 c 2,13,-1 + 1343 1509 l 1,14,-1 + 995 0 l 1,0,-1 +710 852 m 1,15,-1 + 809 1280 l 1,16,17 + 706 1280 706 1280 631 1223.5 c 128,-1,18 + 556 1167 556 1167 534 1071 c 0,19,20 + 511 971 511 971 550.5 911.5 c 128,-1,21 + 590 852 590 852 710 852 c 1,15,-1 +EndSplineSet +EndChar + +StartChar: germandbls +Encoding: 181 223 137 +Width: 1214 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 130 + 9 + 29 + 3 + 33 + 23 + 1 + 20 + 33 + 36 + 33 + 54 + 33 + 89 + 14 + 90 + 39 + 121 + 14 + 169 + 14 + 213 + 11 + 213 + 41 + 215 + 42 + 232 + 18 + 232 + 36 + 248 + 13 + 246 + 14 + 17 + 22 + 41 + 137 + 14 + 2 + 40 + 37 + 0 + 34 + 13 + 16 + 10 + 19 + 19 + 34 + 10 + 0 + 4 + 3 + 31 + 7 + 47 + 6 + 3 + 3 + 27 + 2 + 22 + 47 + 31 + 10 + 16 + 40 + 133 + 40 + 182 + 40 + 3 + 40 + 0 + 37 + 123 + 13 + 1 + 13 + 10 + 16 + 16 + 6 + 32 + 6 + 2 + 6 + 6 + 0 + 16 + 32 + 37 + 48 + 37 + 64 + 37 + 3 + 37 + 49 + 14 + 16 + 1 + 16 + 16 + 34 + 26 + 19 + 49 + 47 + 34 + 1 + 34 + 34 + 0 + 27 + 10 + 23 + 6 + 0 + 32 + 0 + 224 + 0 + 3 + 0 + 26 + 22 + 27 + 43 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +SRP1 +SRP2 +IP +DELTAP1 +SRP1 +SRP2 +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +IP +SRP1 +SRP2 +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1249 326 m 0,0,1 + 1208 147 1208 147 1093.5 62 c 128,-1,2 + 979 -23 979 -23 784 -23 c 0,3,4 + 770 -22 770 -22 735 -20 c 0,5,6 + 735 -20 735 -20 700 -18 c 1,7,-1 + 750 199 l 1,8,9 + 861 199 861 199 899 226.5 c 128,-1,10 + 937 254 937 254 950 313 c 0,11,12 + 966 383 966 383 921.5 437.5 c 128,-1,13 + 877 492 877 492 835 528 c 0,14,15 + 733 614 733 614 706 686 c 128,-1,16 + 679 758 679 758 709 887 c 0,17,18 + 729 975 729 975 811 1060 c 128,-1,19 + 893 1145 893 1145 906 1198 c 0,20,21 + 916 1241 916 1241 900 1266.5 c 128,-1,22 + 884 1292 884 1292 834 1292 c 0,23,24 + 784 1292 784 1292 738 1250 c 128,-1,25 + 692 1208 692 1208 674 1130 c 2,26,-1 + 414 0 l 1,27,-1 + 130 0 l 1,28,-1 + 384 1102 l 2,29,30 + 421 1264 421 1264 558 1386.5 c 128,-1,31 + 695 1509 695 1509 870 1509 c 0,32,33 + 1066 1509 1066 1509 1136 1435.5 c 128,-1,34 + 1206 1362 1206 1362 1174 1225 c 0,35,36 + 1151 1126 1151 1126 1066.5 1056.5 c 128,-1,37 + 982 987 982 987 971 938 c 0,38,39 + 958 881 958 881 979.5 839 c 128,-1,40 + 1001 797 1001 797 1099 709 c 0,41,42 + 1189 627 1189 627 1232 533.5 c 128,-1,43 + 1275 440 1275 440 1249 326 c 0,0,1 +EndSplineSet +EndChar + +StartChar: registered +Encoding: 132 174 138 +Width: 1413 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 4 + 16 + 4 + 20 + 50 + 46 + 94 + 14 + 82 + 16 + 82 + 20 + 94 + 22 + 101 + 46 + 117 + 46 + 148 + 46 + 10 + 53 + 34 + 69 + 69 + 40 + 41 + 68 + 212 + 41 + 25 + 40 + 40 + 41 + 3 + 9 + 21 + 75 + 3 + 74 + 15 + 75 + 15 + 9 + 1 + 9 + 24 + 114 + 25 + 50 + 114 + 53 + 63 + 59 + 1 + 59 + 40 + 69 + 37 + 114 + 48 + 40 + 1 + 40 + 40 + 0 + 6 + 12 + 76 + 0 + 74 + 18 + 76 + 6 + 75 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rnd,grey] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,min,rnd,black] +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1483 690 m 0,0,1 + 1419 414 1419 414 1193.5 220.5 c 128,-1,2 + 968 27 968 27 713 27 c 0,3,4 + 457 27 457 27 321 220.5 c 128,-1,5 + 185 414 185 414 248 690 c 0,6,7 + 312 967 312 967 538 1162.5 c 128,-1,8 + 764 1358 764 1358 1020 1358 c 0,9,10 + 1275 1358 1275 1358 1411 1162.5 c 128,-1,11 + 1547 967 1547 967 1483 690 c 0,0,1 +1337 690 m 256,12,13 + 1385 899 1385 899 1283 1056.5 c 128,-1,14 + 1181 1214 1181 1214 987 1214 c 256,15,16 + 793 1214 793 1214 619.5 1056.5 c 128,-1,17 + 446 899 446 899 397 690 c 256,18,19 + 349 481 349 481 450 323.5 c 128,-1,20 + 551 166 551 166 745 166 c 256,21,22 + 939 166 939 166 1114 323.5 c 128,-1,23 + 1289 481 1289 481 1337 690 c 256,12,13 +1040 342 m 1,24,-1 + 864 342 l 1,25,26 + 864 342 864 342 870.5 371.5 c 128,-1,27 + 877 401 877 401 893 469 c 0,28,29 + 911 545 911 545 896.5 599 c 128,-1,30 + 882 653 882 653 836 653 c 0,31,32 + 825 653 825 653 807.5 653 c 128,-1,33 + 790 653 790 653 790 653 c 257,34,35 + 790 653 790 653 768.5 559 c 128,-1,36 + 747 465 747 465 719 342 c 1,37,38 + 686 342 686 342 640.5 342 c 128,-1,39 + 595 342 595 342 561 342 c 1,40,-1 + 725 1053 l 1,41,42 + 725 1053 725 1053 826.5 1053 c 128,-1,43 + 928 1053 928 1053 982 1053 c 0,44,45 + 1086 1053 1086 1053 1128 1010 c 128,-1,46 + 1170 967 1170 967 1154 899 c 0,47,48 + 1152 891 1152 891 1146.5 867.5 c 128,-1,49 + 1141 844 1141 844 1140 838 c 0,50,51 + 1127 780 1127 780 1088.5 742.5 c 128,-1,52 + 1050 705 1050 705 1002 694 c 1,53,54 + 1062 655 1062 655 1072 587.5 c 128,-1,55 + 1082 520 1082 520 1067 459 c 0,56,57 + 1063 442 1063 442 1040 342 c 1,24,-1 +992 831 m 0,58,59 + 994 838 994 838 995 844 c 128,-1,60 + 996 850 996 850 998 858 c 0,61,62 + 1006 891 1006 891 993 914.5 c 128,-1,63 + 980 938 980 938 952 938 c 0,64,65 + 944 938 944 938 908 938 c 128,-1,66 + 872 938 872 938 856 938 c 1,67,-1 + 812 748 l 1,68,69 + 812 748 812 748 847.5 748 c 128,-1,70 + 883 748 883 748 908 748 c 0,71,72 + 941 748 941 748 961.5 768 c 128,-1,73 + 982 788 982 788 992 831 c 0,58,59 +EndSplineSet +EndChar + +StartChar: copyright +Encoding: 127 169 139 +Width: 1413 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 84 + 4 + 16 + 4 + 20 + 58 + 28 + 94 + 14 + 82 + 16 + 82 + 20 + 94 + 22 + 187 + 28 + 186 + 29 + 202 + 28 + 217 + 29 + 233 + 29 + 12 + 51 + 48 + 212 + 24 + 27 + 48 + 38 + 1 + 38 + 41 + 212 + 48 + 37 + 1 + 37 + 34 + 27 + 34 + 3 + 9 + 21 + 75 + 3 + 74 + 15 + 75 + 15 + 9 + 1 + 9 + 61 + 38 + 1 + 38 + 15 + 24 + 1 + 24 + 44 + 113 + 9 + 30 + 25 + 30 + 41 + 30 + 3 + 30 + 30 + 0 + 6 + 12 + 76 + 0 + 74 + 18 + 76 + 6 + 52 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1483 690 m 0,0,1 + 1419 414 1419 414 1193.5 220.5 c 128,-1,2 + 968 27 968 27 713 27 c 0,3,4 + 457 27 457 27 321 220.5 c 128,-1,5 + 185 414 185 414 248 690 c 0,6,7 + 312 967 312 967 538 1162.5 c 128,-1,8 + 764 1358 764 1358 1020 1358 c 0,9,10 + 1275 1358 1275 1358 1411 1162.5 c 128,-1,11 + 1547 967 1547 967 1483 690 c 0,0,1 +1337 690 m 256,12,13 + 1385 899 1385 899 1283 1056.5 c 128,-1,14 + 1181 1214 1181 1214 987 1214 c 256,15,16 + 793 1214 793 1214 619.5 1056.5 c 128,-1,17 + 446 899 446 899 397 690 c 256,18,19 + 349 481 349 481 450 323.5 c 128,-1,20 + 551 166 551 166 745 166 c 256,21,22 + 939 166 939 166 1114 323.5 c 128,-1,23 + 1289 481 1289 481 1337 690 c 256,12,13 +1025 379 m 1,24,25 + 992 360 992 360 933.5 344 c 128,-1,26 + 875 328 875 328 815 328 c 0,27,28 + 657 328 657 328 589.5 404.5 c 128,-1,29 + 522 481 522 481 563 657 c 2,30,-1 + 571 692 l 2,31,32 + 607 850 607 850 720 938 c 128,-1,33 + 833 1026 833 1026 980 1026 c 0,34,35 + 1054 1026 1054 1026 1097 1009.5 c 128,-1,36 + 1140 993 1140 993 1163 977 c 1,37,-1 + 1134 850 l 1,38,39 + 1112 870 1112 870 1069 886.5 c 128,-1,40 + 1026 903 1026 903 979 903 c 0,41,42 + 897 903 897 903 844 854 c 128,-1,43 + 791 805 791 805 763 682 c 2,44,-1 + 760 668 l 2,45,46 + 731 541 731 541 759 502 c 128,-1,47 + 787 463 787 463 868 463 c 0,48,49 + 926 463 926 463 976.5 479.5 c 128,-1,50 + 1027 496 1027 496 1056 514 c 1,51,-1 + 1025 379 l 1,24,25 +EndSplineSet +EndChar + +StartChar: trademark +Encoding: 369 8482 140 +Width: 1339 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 69 + 169 + 5 + 185 + 5 + 200 + 5 + 217 + 5 + 4 + 63 + 2 + 63 + 5 + 2 + 5 + 10 + 2 + 3 + 9 + 3 + 51 + 4 + 1 + 4 + 4 + 7 + 9 + 1 + 7 + 16 + 19 + 14 + 17 + 11 + 9 + 19 + 10 + 3 + 4 + 4 + 3 + 10 + 3 + 2 + 5 + 11 + 0 + 63 + 2 + 144 + 2 + 2 + 2 + 7 + 9 + 5 + 48 + 7 + 1 + 7 + 16 + 13 + 15 + 18 + 47 + 16 + 1 + 16 + 21 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[min,rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[grey] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +MDRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1505 885 m 1,0,-1 + 1343 885 l 1,1,-1 + 1418 1208 l 1,2,-1 + 1194 1016 l 1,3,-1 + 1150 1016 l 1,4,-1 + 1017 1206 l 1,5,-1 + 943 885 l 1,6,-1 + 817 885 l 1,7,-1 + 957 1493 l 1,8,-1 + 1047 1493 l 1,9,-1 + 1251 1202 l 1,10,-1 + 1586 1493 l 1,11,-1 + 1645 1493 l 1,12,-1 + 1505 885 l 1,0,-1 +854 1372 m 1,13,-1 + 669 1372 l 1,14,-1 + 556 885 l 1,15,-1 + 411 885 l 1,16,-1 + 524 1372 l 1,17,-1 + 340 1372 l 1,18,-1 + 367 1493 l 1,19,-1 + 882 1493 l 1,20,-1 + 854 1372 l 1,13,-1 +EndSplineSet +EndChar + +StartChar: acute +Encoding: 138 180 141 +Width: 942 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 3 + 91 + 1 + 36 + 3 + 1 + 0 + 2 + 0 + 47 + 2 + 63 + 2 + 2 + 2 + 4 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1118 1677 m 1,0,-1 + 731 1323 l 1,1,-1 + 529 1323 l 1,2,-1 + 844 1677 l 1,3,-1 + 1118 1677 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: dieresis +Encoding: 126 168 142 +Width: 946 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 9 + 21 + 96 + 3 + 63 + 15 + 1 + 15 + 39 + 48 + 0 + 1 + 0 + 96 + 6 + 48 + 12 + 1 + 12 + 96 + 47 + 18 + 1 + 18 + 24 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1160 1479 m 0,0,1 + 1147 1421 1147 1421 1100 1380 c 128,-1,2 + 1053 1339 1053 1339 999 1339 c 0,3,4 + 948 1339 948 1339 920 1380 c 128,-1,5 + 892 1421 892 1421 906 1479 c 0,6,7 + 919 1534 919 1534 965.5 1575 c 128,-1,8 + 1012 1616 1012 1616 1063 1616 c 0,9,10 + 1117 1616 1117 1616 1145 1575 c 128,-1,11 + 1173 1534 1173 1534 1160 1479 c 0,0,1 +733 1479 m 0,12,13 + 720 1421 720 1421 673 1380 c 128,-1,14 + 626 1339 626 1339 573 1339 c 0,15,16 + 521 1339 521 1339 493.5 1380 c 128,-1,17 + 466 1421 466 1421 480 1479 c 0,18,19 + 493 1534 493 1534 539 1575 c 128,-1,20 + 585 1616 585 1616 637 1616 c 0,21,22 + 690 1616 690 1616 718 1575 c 128,-1,23 + 746 1534 746 1534 733 1479 c 0,12,13 +EndSplineSet +EndChar + +StartChar: notequal +Encoding: 397 8800 143 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 89 + 83 + 1 + 89 + 12 + 129 + 2 + 144 + 2 + 150 + 11 + 200 + 4 + 6 + 37 + 18 + 1 + 1 + 18 + 17 + 14 + 4 + 99 + 2 + 115 + 2 + 2 + 13 + 2 + 4 + 7 + 8 + 11 + 4 + 12 + 3 + 13 + 6 + 12 + 22 + 12 + 54 + 12 + 3 + 12 + 2 + 71 + 3 + 1 + 3 + 3 + 12 + 1 + 4 + 69 + 18 + 7 + 11 + 17 + 8 + 69 + 14 + 11 + 4 + 7 + 8 + 11 + 12 + 14 + 17 + 18 + 1 + 2 + 10 + 13 + 3 + 48 + 13 + 1 + 13 + 15 + 0 + 21 + 63 + 3 + 1 + 3 + 9 + 5 + 20 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +DELTAP1 +MDRP[rp0,min,black] +MDAP[rnd] +DELTAP1 +MDRP[rp0,min,black] +SPVTCA[x-axis] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +DELTAP1 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1065 236 m 1,0,-1 + 469 236 l 1,1,-1 + 334 25 l 1,2,-1 + 184 117 l 1,3,-1 + 260 236 l 1,4,-1 + 125 236 l 1,5,-1 + 125 473 l 1,6,-1 + 412 473 l 1,7,-1 + 567 715 l 1,8,-1 + 125 715 l 1,9,-1 + 125 952 l 1,10,-1 + 721 952 l 1,11,-1 + 870 1186 l 1,12,-1 + 1022 1094 l 1,13,-1 + 930 952 l 1,14,-1 + 1065 952 l 1,15,-1 + 1065 715 l 1,16,-1 + 778 715 l 1,17,-1 + 623 473 l 1,18,-1 + 1065 473 l 1,19,-1 + 1065 236 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: AE +Encoding: 156 198 144 +Width: 1660 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 70 + 39 + 18 + 1 + 59 + 17 + 1 + 17 + 42 + 6 + 18 + 3 + 59 + 4 + 1 + 4 + 42 + 54 + 5 + 1 + 5 + 5 + 6 + 6 + 4 + 3 + 18 + 4 + 1 + 5 + 8 + 12 + 0 + 1 + 10 + 14 + 23 + 17 + 1 + 47 + 5 + 1 + 47 + 5 + 239 + 5 + 2 + 5 + 19 + 13 + 30 + 10 + 73 + 3 + 30 + 18 + 18 + 10 + 1 + 6 + 17 + 9 + 30 + 6 + 1 + 14 + 30 + 1 + 4 + 5 + 0 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SPVTL[orthog] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +SFVTCA[y-axis] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1593 0 m 1,0,-1 + 725 0 l 1,1,-1 + 808 362 l 1,2,-1 + 458 362 l 1,3,-1 + 224 0 l 1,4,-1 + -50 0 l 1,5,-1 + 942 1509 l 1,6,-1 + 1905 1509 l 1,7,-1 + 1853 1284 l 1,8,-1 + 1330 1284 l 1,9,-1 + 1236 879 l 1,10,-1 + 1640 879 l 1,11,-1 + 1587 651 l 1,12,-1 + 1184 651 l 1,13,-1 + 1085 225 l 1,14,-1 + 1645 225 l 1,15,-1 + 1593 0 l 1,0,-1 +859 580 m 1,16,-1 + 1007 1223 l 1,17,-1 + 600 580 l 1,18,-1 + 859 580 l 1,16,-1 +EndSplineSet +EndChar + +StartChar: Oslash +Encoding: 174 216 145 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 0 + 0 + 22 + 0 + 24 + 3 + 32 + 0 + 40 + 2 + 5 + 63 + 33 + 1 +SVTCA[x-axis] +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 381 -1 N 1 0 0 1 -20 -36 3 +Refer: 50 79 N 1 0 0 1 0 0 2 +EndChar + +StartChar: infinity +Encoding: 394 8734 146 +Width: 1544 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 86 + 4 + 1 + 10 + 11 + 10 + 13 + 4 + 23 + 20 + 1 + 27 + 11 + 27 + 13 + 20 + 23 + 36 + 1 + 42 + 11 + 42 + 13 + 36 + 23 + 58 + 31 + 54 + 37 + 71 + 7 + 71 + 17 + 81 + 7 + 93 + 19 + 101 + 29 + 106 + 47 + 118 + 29 + 120 + 47 + 22 + 30 + 18 + 33 + 15 + 6 + 36 + 3 + 39 + 33 + 45 + 32 + 3 + 0 + 9 + 1 + 9 + 27 + 39 + 32 + 21 + 15 + 36 + 30 + 6 + 18 + 18 + 0 + 12 + 24 + 105 + 31 + 0 + 47 + 0 + 2 + 0 + 49 + 42 + 105 + 12 + 48 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +RTDG +MDAP[rnd] +RTG +MDRP[rnd,grey] +MDRP[grey] +MDRP[grey] +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +SRP1 +SRP2 +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1460 682 m 0,0,1 + 1460 512 1460 512 1360 425 c 128,-1,2 + 1260 338 1260 338 1100 338 c 0,3,4 + 987 338 987 338 906 385 c 128,-1,5 + 825 432 825 432 766 512 c 1,6,7 + 707 426 707 426 634 384 c 128,-1,8 + 561 342 561 342 440 342 c 0,9,10 + 281 342 281 342 178.5 428 c 128,-1,11 + 76 514 76 514 76 682 c 256,12,13 + 76 850 76 850 180.5 936 c 128,-1,14 + 285 1022 285 1022 436 1022 c 0,15,16 + 553 1022 553 1022 634 973 c 128,-1,17 + 715 924 715 924 770 842 c 1,18,19 + 827 922 827 922 906 970 c 128,-1,20 + 985 1018 985 1018 1094 1018 c 0,21,22 + 1262 1018 1262 1018 1361 928 c 128,-1,23 + 1460 838 1460 838 1460 682 c 0,0,1 +1274 682 m 0,24,25 + 1274 758 1274 758 1220.5 805 c 128,-1,26 + 1167 852 1167 852 1096 852 c 0,27,28 + 1038 852 1038 852 991 820 c 128,-1,29 + 944 788 944 788 877 684 c 1,30,31 + 934 586 934 586 983 549 c 128,-1,32 + 1032 512 1032 512 1100 512 c 0,33,34 + 1169 512 1169 512 1221.5 560 c 128,-1,35 + 1274 608 1274 608 1274 682 c 0,24,25 +657 676 m 1,36,37 + 606 770 606 770 556 809 c 128,-1,38 + 506 848 506 848 436 848 c 0,39,40 + 369 848 369 848 315.5 799 c 128,-1,41 + 262 750 262 750 262 680 c 0,42,43 + 262 602 262 602 314.5 555 c 128,-1,44 + 367 508 367 508 436 508 c 0,45,46 + 506 508 506 508 557 546 c 128,-1,47 + 608 584 608 584 657 676 c 1,36,37 +EndSplineSet +EndChar + +StartChar: plusminus +Encoding: 135 177 147 +Width: 1097 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 14 + 69 + 48 + 13 + 1 + 13 + 0 + 3 + 106 + 1 + 4 + 68 + 10 + 7 + 106 + 63 + 8 + 1 + 8 + 12 + 12 + 0 + 106 + 10 + 1 + 69 + 4 + 13 + 5 + 106 + 7 + 47 + 4 + 1 + 4 + 4 + 17 + 16 +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[min,rnd,grey] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1071 647 m 1,0,-1 + 803 647 l 1,1,-1 + 740 375 l 1,2,-1 + 530 375 l 1,3,-1 + 593 647 l 1,4,-1 + 327 647 l 1,5,-1 + 381 883 l 1,6,-1 + 647 883 l 1,7,-1 + 710 1155 l 1,8,-1 + 920 1155 l 1,9,-1 + 857 883 l 1,10,-1 + 1125 883 l 1,11,-1 + 1071 647 l 1,0,-1 +932 0 m 1,12,-1 + 177 0 l 1,13,-1 + 228 217 l 1,14,-1 + 982 217 l 1,15,-1 + 932 0 l 1,12,-1 +EndSplineSet +EndChar + +StartChar: lessequal +Encoding: 398 8804 148 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 65 + 6 + 5 + 50 + 0 + 50 + 3 + 54 + 5 + 118 + 5 + 5 + 60 + 4 + 51 + 6 + 2 + 9 + 69 + 48 + 8 + 1 + 8 + 0 + 4 + 3 + 2 + 6 + 0 + 1 + 14 + 0 + 30 + 0 + 2 + 0 + 1 + 1 + 3 + 17 + 3 + 2 + 3 + 5 + 48 + 1 + 1 + 1 + 92 + 63 + 2 + 1 + 2 + 5 + 0 + 1 + 63 + 7 + 1 + 7 + 4 + 0 + 12 + 9 + 1 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +IP +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +925 311 m 1,0,-1 + 75 657 l 1,1,-1 + 75 866 l 1,2,-1 + 925 1214 l 1,3,-1 + 925 950 l 1,4,-1 + 450 766 l 1,5,-1 + 925 573 l 1,6,-1 + 925 311 l 1,0,-1 +925 0 m 1,7,-1 + 75 0 l 1,8,-1 + 75 221 l 1,9,-1 + 925 221 l 1,10,-1 + 925 0 l 1,7,-1 +EndSplineSet +EndChar + +StartChar: greaterequal +Encoding: 399 8805 149 +Width: 1024 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 121 + 5 + 1 + 63 + 1 + 63 + 8 + 2 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +Refer: 148 8804 N -1 0 0 1 1024 0 2 +EndChar + +StartChar: yen +Encoding: 123 165 150 +Width: 1226 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 108 + 54 + 24 + 71 + 0 + 2 + 100 + 23 + 1 + 23 + 31 + 22 + 23 + 1 + 24 + 31 + 0 + 0 + 1 + 55 + 23 + 88 + 23 + 2 + 23 + 22 + 20 + 22 + 22 + 21 + 21 + 20 + 24 + 22 + 0 + 21 + 23 + 1 + 20 + 16 + 0 + 80 + 0 + 2 + 0 + 9 + 5 + 8 + 4 + 1 + 20 + 21 + 12 + 16 + 13 + 17 + 80 + 20 + 1 + 15 + 20 + 31 + 20 + 144 + 20 + 3 + 20 + 20 + 26 + 25 + 9 + 12 + 89 + 6 + 15 + 15 + 31 + 15 + 32 + 15 + 3 + 15 + 19 + 5 + 16 + 89 + 2 + 19 + 1 + 20 + 0 + 24 + 22 + 53 + 1 + 54 + 20 + 51 + 23 + 3 + 20 + 1 + 23 + 3 + 11 + 21 + 10 + 11 + 0 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SRP2 +SLOOP +IP +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rp0,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[x-axis] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +DELTAP3 +MDRP[min,rnd,grey] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[min,rnd,grey] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1583 1509 m 1,0,-1 + 916 725 l 1,1,-1 + 897 643 l 1,2,-1 + 1196 643 l 1,3,-1 + 1156 471 l 1,4,-1 + 857 471 l 1,5,-1 + 835 373 l 1,6,-1 + 1133 373 l 1,7,-1 + 1094 201 l 1,8,-1 + 795 201 l 1,9,-1 + 749 0 l 1,10,-1 + 471 0 l 1,11,-1 + 517 201 l 1,12,-1 + 218 201 l 1,13,-1 + 257 373 l 1,14,-1 + 557 373 l 1,15,-1 + 579 471 l 1,16,-1 + 280 471 l 1,17,-1 + 320 643 l 1,18,-1 + 619 643 l 1,19,-1 + 630 690 l 1,20,-1 + 345 1509 l 1,21,-1 + 695 1509 l 1,22,-1 + 883 969 l 1,23,-1 + 1331 1509 l 1,24,-1 + 1583 1509 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: mu +Encoding: 139 181 151 +Width: 1131 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 45 + 6 + 3 + 22 + 3 + 38 + 3 + 3 + 19 + 2 + 96 + 5 + 10 + 18 + 16 + 34 + 1 + 57 + 5 + 72 + 5 + 2 + 5 + 2 + 20 + 11 + 12 + 0 + 22 + 2 + 1 + 64 + 19 + 160 + 19 + 2 + 175 + 19 + 1 + 19 + 10 + 13 + 8 + 22 + 10 + 22 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +MDRP[rnd,grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +SRP0 +SMD +MDRP[rp0,min,grey] +MDRP[min,rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1082 327 m 1,0,1 + 1078 309 1078 309 1072 264.5 c 128,-1,2 + 1066 220 1066 220 1068 212 c 0,3,4 + 1068 197 1068 197 1078 186.5 c 128,-1,5 + 1088 176 1088 176 1101 176 c 0,6,7 + 1151 176 1151 176 1253 348 c 1,8,-1 + 1267 372 l 1,9,-1 + 1320 337 l 1,10,11 + 1198 126 1198 126 1119.5 52.5 c 128,-1,12 + 1041 -21 1041 -21 935 -21 c 0,13,14 + 898 -21 898 -21 870.5 -11.5 c 128,-1,15 + 843 -2 843 -2 824.5 10.5 c 128,-1,16 + 806 23 806 23 794.5 46.5 c 128,-1,17 + 783 70 783 70 777 88.5 c 128,-1,18 + 771 107 771 107 771 138.5 c 128,-1,19 + 771 170 771 170 771.5 186 c 128,-1,20 + 772 202 772 202 778 235 c 128,-1,21 + 784 268 784 268 785.5 276 c 128,-1,22 + 787 284 787 284 793 309 c 1,23,24 + 744 228 744 228 642 42 c 0,25,26 + 574 0 574 0 488 0 c 0,27,28 + 460 0 460 0 437.5 0 c 128,-1,29 + 415 0 415 0 392 8 c 1,30,-1 + 311 -342 l 1,31,-1 + 51 -342 l 1,32,-1 + 382 1093 l 1,33,-1 + 666 1093 l 1,34,-1 + 501 381 l 2,35,36 + 477 278 477 278 506.5 251.5 c 128,-1,37 + 536 225 536 225 581 225 c 0,38,39 + 641 225 641 225 702.5 251.5 c 128,-1,40 + 764 278 764 278 798 329 c 1,41,-1 + 974 1093 l 1,42,-1 + 1259 1093 l 1,43,-1 + 1082 327 l 1,0,1 +EndSplineSet +EndChar + +StartChar: partialdiff +Encoding: 386 8706 152 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 38 + 23 + 71 + 5 + 86 + 5 + 104 + 8 + 121 + 8 + 5 + 72 + 31 + 88 + 31 + 2 + 31 + 34 + 12 + 9 + 9 + 3 + 22 + 18 + 40 + 15 + 34 + 19 + 40 + 22 + 15 + 70 + 37 + 86 + 37 + 2 + 37 + 46 + 3 + 5 + 63 + 41 + 1 + 0 + 25 + 12 + 16 + 28 + 32 + 28 + 112 + 28 + 3 + 28 + 18 + 34 + 25 + 6 + 40 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1114 573 m 0,0,1 + 1096 287 1096 287 955.5 131 c 128,-1,2 + 815 -25 815 -25 543 -25 c 0,3,4 + 315 -25 315 -25 189 137 c 128,-1,5 + 63 299 63 299 63 528 c 0,6,7 + 63 778 63 778 186 924.5 c 128,-1,8 + 309 1071 309 1071 543 1071 c 0,9,10 + 621 1071 621 1071 686.5 1033 c 128,-1,11 + 752 995 752 995 788 954 c 1,12,13 + 770 1137 770 1137 686 1231 c 128,-1,14 + 602 1325 602 1325 461 1325 c 0,15,16 + 401 1325 401 1325 348 1312.5 c 128,-1,17 + 295 1300 295 1300 231 1268 c 1,18,-1 + 231 1499 l 1,19,20 + 266 1513 266 1513 323.5 1529.5 c 128,-1,21 + 381 1546 381 1546 461 1546 c 0,22,23 + 764 1546 764 1546 930 1306.5 c 128,-1,24 + 1096 1067 1096 1067 1114 705 c 0,25,26 + 1114 692 1114 692 1115 647 c 128,-1,27 + 1116 602 1116 602 1114 573 c 0,0,1 +780 532 m 0,28,29 + 780 657 780 657 734 756.5 c 128,-1,30 + 688 856 688 856 584 856 c 0,31,32 + 496 856 496 856 446.5 788.5 c 128,-1,33 + 397 721 397 721 397 528 c 0,34,35 + 397 369 397 369 440 266.5 c 128,-1,36 + 483 164 483 164 584 164 c 0,37,38 + 682 164 682 164 731 266.5 c 128,-1,39 + 780 369 780 369 780 532 c 0,28,29 +EndSplineSet +EndChar + +StartChar: summation +Encoding: 389 8721 153 +Width: 1276 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 76 + 40 + 3 + 73 + 3 + 87 + 9 + 184 + 3 + 4 + 10 + 2 + 55 + 10 + 2 + 9 + 10 + 9 + 134 + 8 + 1 + 8 + 4 + 4 + 3 + 23 + 9 + 1 + 9 + 8 + 3 + 1 + 3 + 71 + 10 + 84 + 10 + 2 + 10 + 2 + 2 + 3 + 9 + 3 + 10 + 8 + 4 + 8 + 34 + 5 + 14 + 2 + 10 + 68 + 1 + 0 + 9 + 3 + 8 + 10 + 4 + 0 + 2 + 7 + 48 + 0 + 1 + 0 + 54 + 4 + 1 + 4 + 47 + 2 + 1 + 2 + 12 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IP +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IP +SRP1 +SRP2 +IP +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +DELTAP1 +MDRP[grey] +DELTAP1 +SPVTL[orthog] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +SFVTL[parallel] +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1214 0 m 1,0,-1 + 86 0 l 1,1,-1 + 86 199 l 1,2,-1 + 651 770 l 1,3,-1 + 106 1315 l 1,4,-1 + 106 1509 l 1,5,-1 + 1133 1509 l 1,6,-1 + 1133 1284 l 1,7,-1 + 545 1284 l 1,8,-1 + 1042 786 l 1,9,-1 + 516 264 l 1,10,-1 + 1214 264 l 1,11,-1 + 1214 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: product +Encoding: 388 8719 154 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 31 + 1 + 4 + 8 + 34 + 10 + 14 + 3 + 7 + 4 + 0 + 2 + 25 + 32 + 3 + 1 + 3 + 6 + 25 + 176 + 9 + 1 + 9 + 31 + 7 + 79 + 7 + 144 + 7 + 3 + 7 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1335 1284 m 1,0,-1 + 1182 1284 l 1,1,-1 + 1182 0 l 1,2,-1 + 844 0 l 1,3,-1 + 844 1284 l 1,4,-1 + 516 1284 l 1,5,-1 + 516 0 l 1,6,-1 + 178 0 l 1,7,-1 + 178 1284 l 1,8,-1 + 27 1284 l 1,9,-1 + 27 1509 l 1,10,-1 + 1335 1509 l 1,11,-1 + 1335 1284 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: pi +Encoding: 346 960 155 +Width: 1191 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 1 + 4 + 8 + 33 + 10 + 12 + 3 + 7 + 0 + 0 + 2 + 22 + 3 + 6 + 22 + 9 + 31 + 7 + 79 + 7 + 2 + 7 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[min,rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1354 894 m 1,0,-1 + 1224 894 l 1,1,-1 + 1017 0 l 1,2,-1 + 733 0 l 1,3,-1 + 940 894 l 1,4,-1 + 659 894 l 1,5,-1 + 453 0 l 1,6,-1 + 169 0 l 1,7,-1 + 375 894 l 1,8,-1 + 245 894 l 1,9,-1 + 291 1093 l 1,10,-1 + 1400 1093 l 1,11,-1 + 1354 894 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: integral +Encoding: 395 8747 156 +Width: 967 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 32 + 5 + 9 + 9 + 23 + 22 + 9 + 25 + 23 + 4 + 1 + 4 + 52 + 0 + 25 + 15 + 15 + 18 + 52 + 14 + 11 + 19 + 1 + 0 + 8 + 25 + 21 + 15 + 14 + 21 + 21 + 29 + 28 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,min,grey] +MDRP[grey] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,grey] +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +995 1460 m 1,0,-1 + 895 1251 l 1,1,2 + 870 1272 870 1272 837.5 1290.5 c 128,-1,3 + 805 1309 805 1309 758 1309 c 0,4,5 + 700 1309 700 1309 674.5 1269 c 128,-1,6 + 649 1229 649 1229 649 1151 c 2,7,-1 + 649 57 l 2,8,9 + 649 -127 649 -127 534.5 -240.5 c 128,-1,10 + 420 -354 420 -354 254 -354 c 0,11,12 + 137 -354 137 -354 74.5 -335.5 c 128,-1,13 + 12 -317 12 -317 -37 -285 c 1,14,-1 + 57 -86 l 1,15,16 + 82 -106 82 -106 118 -123.5 c 128,-1,17 + 154 -141 154 -141 201 -141 c 0,18,19 + 258 -141 258 -141 283.5 -97 c 128,-1,20 + 309 -53 309 -53 309 25 c 2,21,-1 + 309 1118 l 2,22,23 + 309 1303 309 1303 424 1416.5 c 128,-1,24 + 539 1530 539 1530 705 1530 c 0,25,26 + 821 1530 821 1530 883.5 1511.5 c 128,-1,27 + 946 1493 946 1493 995 1460 c 1,0,-1 +EndSplineSet +EndChar + +StartChar: ordfeminine +Encoding: 128 170 157 +Width: 855 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 82 + 11 + 7 + 11 + 10 + 26 + 7 + 26 + 10 + 42 + 7 + 42 + 10 + 36 + 28 + 59 + 7 + 59 + 10 + 52 + 28 + 74 + 7 + 70 + 27 + 173 + 10 + 201 + 10 + 14 + 31 + 110 + 32 + 79 + 38 + 111 + 15 + 12 + 12 + 5 + 26 + 1 + 77 + 45 + 110 + 2 + 5 + 78 + 15 + 22 + 1 + 22 + 69 + 19 + 111 + 15 + 23 + 1 + 23 + 70 + 26 + 11 + 22 + 22 + 0 + 8 + 30 + 0 + 107 + 2 + 15 + 64 + 34 + 128 + 34 + 2 + 34 + 42 + 108 + 31 + 67 + 8 + 48 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +SVTCA[y-axis] +MIAP[rnd] +SROUND +MDRP[rnd,grey] +RTG +DELTAP2 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +DELTAP2 +MIAP[rnd] +MDRP[min,grey] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +903 566 m 1,0,-1 + 670 566 l 1,1,-1 + 691 666 l 1,2,3 + 653 613 653 613 594 583 c 128,-1,4 + 535 553 535 553 455 553 c 0,5,6 + 316 553 316 553 262.5 627 c 128,-1,7 + 209 701 209 701 243 846 c 2,8,-1 + 246 861 l 2,9,10 + 280 1009 280 1009 393 1093 c 128,-1,11 + 506 1177 506 1177 664 1177 c 0,12,13 + 712 1177 712 1177 743 1160.5 c 128,-1,14 + 774 1144 774 1144 791 1122 c 1,15,-1 + 815 1229 l 2,16,17 + 830 1294 830 1294 808.5 1325 c 128,-1,18 + 787 1356 787 1356 717 1356 c 0,19,20 + 642 1356 642 1356 576.5 1324.5 c 128,-1,21 + 511 1293 511 1293 459 1250 c 1,22,-1 + 509 1468 l 1,23,24 + 570 1493 570 1493 643.5 1511.5 c 128,-1,25 + 717 1530 717 1530 815 1530 c 0,26,27 + 975 1530 975 1530 1033 1454 c 128,-1,28 + 1091 1378 1091 1378 1049 1197 c 2,29,-1 + 903 566 l 1,0,-1 +834 272 m 1,30,-1 + 127 272 l 1,31,-1 + 171 463 l 1,32,-1 + 878 463 l 1,33,-1 + 834 272 l 1,30,-1 +736 861 m 2,34,-1 + 740 877 l 2,35,36 + 756 944 756 944 733 978.5 c 128,-1,37 + 710 1013 710 1013 649 1013 c 0,38,39 + 595 1013 595 1013 555 981 c 128,-1,40 + 515 949 515 949 498 877 c 2,41,-1 + 494 860 l 2,42,43 + 476 784 476 784 504 760 c 128,-1,44 + 532 736 532 736 586 736 c 0,45,46 + 633 736 633 736 677 765.5 c 128,-1,47 + 721 795 721 795 736 861 c 2,34,-1 +EndSplineSet +EndChar + +StartChar: ordmasculine +Encoding: 144 186 158 +Width: 970 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 30 + 15 + 110 + 16 + 79 + 22 + 110 + 10 + 15 + 29 + 110 + 3 + 78 + 17 + 67 + 0 + 109 + 48 + 18 + 96 + 18 + 144 + 18 + 3 + 18 + 25 + 109 + 15 + 67 + 6 + 32 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1132 1014 m 2,0,1 + 1082 799 1082 799 945 678 c 128,-1,2 + 808 557 808 557 619 557 c 256,3,4 + 430 557 430 557 347 681 c 128,-1,5 + 264 805 264 805 312 1014 c 2,6,-1 + 326 1075 l 2,7,8 + 373 1280 373 1280 513.5 1406 c 128,-1,9 + 654 1532 654 1532 843 1532 c 0,10,11 + 1034 1532 1034 1532 1113.5 1405 c 128,-1,12 + 1193 1278 1193 1278 1146 1075 c 2,13,-1 + 1132 1014 l 2,0,1 +925 272 m 1,14,-1 + 159 272 l 1,15,-1 + 203 463 l 1,16,-1 + 969 463 l 1,17,-1 + 925 272 l 1,14,-1 +883 1038 m 2,18,-1 + 886 1051 l 2,19,20 + 925 1221 925 1221 894.5 1282 c 128,-1,21 + 864 1343 864 1343 797 1343 c 0,22,23 + 730 1343 730 1343 673 1276.5 c 128,-1,24 + 616 1210 616 1210 579 1051 c 2,25,-1 + 576 1038 l 2,26,27 + 535 862 535 862 563 803.5 c 128,-1,28 + 591 745 591 745 661 745 c 0,29,30 + 724 745 724 745 782.5 801.5 c 128,-1,31 + 841 858 841 858 883 1038 c 2,18,-1 +EndSplineSet +EndChar + +StartChar: Omega +Encoding: 345 937 159 +AltUni2: 002126.ffffffff.0 002126.ffffffff.0 +Width: 1421 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 50 + 15 + 46 + 38 + 34 + 1 + 34 + 15 + 8 + 22 + 3 + 8 + 27 + 24 + 27 + 2 + 27 + 4 + 25 + 30 + 7 + 24 + 0 + 3 + 30 + 8 + 27 + 30 + 22 + 8 + 22 + 11 + 19 + 5 + 0 + 28 + 11 + 19 + 28 + 25 + 15 + 30 + 31 + 30 + 63 + 30 + 79 + 30 + 4 + 30 + 38 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1544 831 m 2,0,1 + 1504 657 1504 657 1386 535.5 c 128,-1,2 + 1268 414 1268 414 1118 354 c 1,3,-1 + 1088 225 l 1,4,-1 + 1393 225 l 1,5,-1 + 1341 0 l 1,6,-1 + 822 0 l 1,7,-1 + 926 453 l 1,8,9 + 1050 494 1050 494 1122 613.5 c 128,-1,10 + 1194 733 1194 733 1226 870 c 2,11,-1 + 1236 911 l 2,12,13 + 1289 1141 1289 1141 1232 1241 c 128,-1,14 + 1175 1341 1175 1341 1020 1341 c 0,15,16 + 869 1341 869 1341 765 1243 c 128,-1,17 + 661 1145 661 1145 607 911 c 2,18,-1 + 597 870 l 2,19,20 + 560 711 560 711 585 598 c 128,-1,21 + 610 485 610 485 705 453 c 1,22,-1 + 600 0 l 1,23,-1 + 80 0 l 1,24,-1 + 132 225 l 1,25,-1 + 437 225 l 1,26,-1 + 467 354 l 1,27,28 + 365 391 365 391 290.5 513 c 128,-1,29 + 216 635 216 635 265 850 c 2,30,-1 + 288 946 l 2,31,32 + 343 1186 343 1186 541.5 1358 c 128,-1,33 + 740 1530 740 1530 1072 1530 c 0,34,35 + 1377 1530 1377 1530 1504 1368 c 128,-1,36 + 1631 1206 1631 1206 1571 946 c 2,37,-1 + 1544 831 l 2,0,1 +EndSplineSet +EndChar + +StartChar: ae +Encoding: 188 230 160 +Width: 1626 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 122 + 11 + 19 + 11 + 22 + 26 + 19 + 26 + 22 + 48 + 15 + 50 + 70 + 82 + 45 + 100 + 45 + 153 + 46 + 185 + 19 + 10 + 1 + 32 + 56 + 73 + 61 + 32 + 27 + 24 + 56 + 24 + 17 + 38 + 38 + 41 + 54 + 41 + 70 + 41 + 3 + 41 + 53 + 33 + 44 + 38 + 34 + 51 + 255 + 31 + 1 + 31 + 33 + 35 + 51 + 38 + 13 + 64 + 7 + 80 + 7 + 96 + 7 + 3 + 7 + 58 + 14 + 1 + 14 + 4 + 68 + 33 + 96 + 8 + 1 + 8 + 71 + 11 + 17 + 3 + 63 + 72 + 1 + 34 + 34 + 1 + 20 + 8 + 0 + 49 + 64 + 50 + 1 + 16 + 50 + 64 + 50 + 2 + 50 + 57 + 41 + 14 + 1 + 57 + 56 + 1 + 49 + 27 + 80 + 57 + 1 + 57 + 65 + 22 + 32 + 20 + 144 + 20 + 176 + 20 + 3 + 20 + 71 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP2 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +SROUND +MDRP[rnd,grey] +RTG +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MIRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,grey] +MIRP[min,rnd,black] +MDRP[grey] +DELTAP1 +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1651 477 m 1,0,-1 + 1015 477 l 1,1,2 + 975 306 975 306 1030.5 239 c 128,-1,3 + 1086 172 1086 172 1200 172 c 0,4,5 + 1275 172 1275 172 1358 193.5 c 128,-1,6 + 1441 215 1441 215 1533 257 c 1,7,-1 + 1491 74 l 1,8,9 + 1407 25 1407 25 1314.5 0 c 128,-1,10 + 1222 -25 1222 -25 1107 -25 c 0,11,12 + 978 -25 978 -25 896 21.5 c 128,-1,13 + 814 68 814 68 764 174 c 1,14,15 + 697 78 697 78 611 32 c 128,-1,16 + 525 -14 525 -14 404 -14 c 0,17,18 + 245 -14 245 -14 169.5 77.5 c 128,-1,19 + 94 169 94 169 137 355 c 2,20,-1 + 141 375 l 2,21,22 + 184 559 184 559 317.5 658.5 c 128,-1,23 + 451 758 451 758 636 758 c 0,24,25 + 690 758 690 758 738 738.5 c 128,-1,26 + 786 719 786 719 803 690 c 1,27,-1 + 827 794 l 2,28,29 + 839 848 839 848 804 885.5 c 128,-1,30 + 769 923 769 923 687 923 c 0,31,32 + 600 923 600 923 527 902.5 c 128,-1,33 + 454 882 454 882 395 851 c 1,34,-1 + 438 1038 l 1,35,36 + 512 1070 512 1070 597.5 1093 c 128,-1,37 + 683 1116 683 1116 799 1116 c 0,38,39 + 896 1116 896 1116 952.5 1091 c 128,-1,40 + 1009 1066 1009 1066 1046 1019 c 1,41,42 + 1096 1067 1096 1067 1178.5 1123.5 c 128,-1,43 + 1261 1180 1261 1180 1373 1180 c 0,44,45 + 1585 1180 1585 1180 1661 1016.5 c 128,-1,46 + 1737 853 1737 853 1677 590 c 2,47,48 + 1677 590 1677 590 1665.5 540 c 128,-1,49 + 1654 490 1654 490 1651 477 c 1,0,-1 +1440 641 m 1,50,51 + 1468 800 1468 800 1435.5 868.5 c 128,-1,52 + 1403 937 1403 937 1319 937 c 0,53,54 + 1245 937 1245 937 1170.5 869.5 c 128,-1,55 + 1096 802 1096 802 1054 641 c 1,56,-1 + 1440 641 l 1,50,51 +731 369 m 2,57,-1 + 737 397 l 2,58,59 + 759 492 759 492 730.5 542 c 128,-1,60 + 702 592 702 592 625 592 c 0,61,62 + 551 592 551 592 501.5 545 c 128,-1,63 + 452 498 452 498 429 395 c 2,64,-1 + 422 367 l 2,65,66 + 397 260 397 260 430 224 c 128,-1,67 + 463 188 463 188 533 188 c 0,68,69 + 593 188 593 188 651 231.5 c 128,-1,70 + 709 275 709 275 731 369 c 2,57,-1 +EndSplineSet +EndChar + +StartChar: oslash +Encoding: 206 248 161 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 382 -1 N 1 0 0 1 0 0 2 +Refer: 82 111 N 1 0 0 1 0 0 2 +EndChar + +StartChar: questiondown +Encoding: 149 191 162 +Width: 853 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 51 + 10 + 9 + 10 + 12 + 26 + 9 + 165 + 25 + 165 + 26 + 230 + 25 + 230 + 26 + 7 + 35 + 69 + 32 + 34 + 4 + 69 + 7 + 15 + 19 + 117 + 1 + 72 + 2 + 10 + 63 + 37 + 1 + 10 + 22 + 127 + 29 + 239 + 29 + 2 + 29 + 3 + 19 + 2 + 65 + 20 + 3 + 63 + 35 + 1 + 35 + 37 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,white] +MIAP[rnd] +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +901 1190 m 1,0,-1 + 609 1190 l 1,1,-1 + 683 1511 l 1,2,-1 + 975 1511 l 1,3,-1 + 901 1190 l 1,0,-1 +862 113 m 1,4,5 + 774 55 774 55 669.5 18.5 c 128,-1,6 + 565 -18 565 -18 419 -18 c 0,7,8 + 196 -18 196 -18 125 80 c 128,-1,9 + 54 178 54 178 83 303 c 0,10,11 + 108 410 108 410 166.5 484.5 c 128,-1,12 + 225 559 225 559 329 623 c 0,13,14 + 424 682 424 682 484.5 749.5 c 128,-1,15 + 545 817 545 817 563 899 c 0,16,17 + 573 944 573 944 579.5 970 c 128,-1,18 + 586 996 586 996 598 1047 c 1,19,-1 + 851 1047 l 1,20,21 + 851 1047 851 1047 834.5 977 c 128,-1,22 + 818 907 818 907 807 858 c 0,23,24 + 786 768 786 768 722.5 686 c 128,-1,25 + 659 604 659 604 581 555 c 0,26,27 + 478 489 478 489 440 444 c 128,-1,28 + 402 399 402 399 388 338 c 0,29,30 + 374 276 374 276 406.5 239.5 c 128,-1,31 + 439 203 439 203 546 203 c 0,32,33 + 641 203 641 203 743.5 246 c 128,-1,34 + 846 289 846 289 913 336 c 1,35,-1 + 862 113 l 1,4,5 +EndSplineSet +EndChar + +StartChar: exclamdown +Encoding: 119 161 163 +Width: 652 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 32 + 5 + 0 + 6 + 116 + 1 + 66 + 2 + 10 + 63 + 9 + 1 + 7 + 6 + 4 + 5 + 4 + 67 + 3 + 65 + 2 + 67 + 63 + 5 + 79 + 5 + 128 + 5 + 144 + 5 + 4 + 5 + 8 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rnd,black] +SRP1 +SRP2 +IP +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,white] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +757 1190 m 1,0,-1 + 460 1190 l 1,1,-1 + 534 1509 l 1,2,-1 + 830 1509 l 1,3,-1 + 757 1190 l 1,0,-1 +503 0 m 1,4,-1 + 164 0 l 1,5,-1 + 430 995 l 1,6,-1 + 697 995 l 1,7,-1 + 503 0 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: logicalnot +Encoding: 130 172 164 +Width: 1106 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 20 + 2 + 68 + 1 + 4 + 70 + 48 + 5 + 64 + 5 + 2 + 5 + 69 + 16 + 1 + 112 + 1 + 2 + 1 + 3 + 6 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1074 358 m 1,0,-1 + 868 358 l 1,1,-1 + 919 580 l 1,2,-1 + 230 580 l 1,3,-1 + 280 797 l 1,4,-1 + 1175 797 l 1,5,-1 + 1074 358 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: radical +Encoding: 393 8730 165 +Width: 1251 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 65 + 59 + 4 + 1 + 59 + 5 + 1 + 5 + 42 + 4 + 5 + 51 + 1 + 1 + 1 + 57 + 6 + 87 + 6 + 101 + 6 + 3 + 6 + 42 + 0 + 0 + 1 + 48 + 5 + 1 + 5 + 42 + 2 + 53 + 4 + 1 + 4 + 42 + 3 + 3 + 2 + 4 + 4 + 3 + 5 + 3 + 2 + 6 + 10 + 2 + 6 + 0 + 1 + 4 + 2 + 3 + 59 + 0 + 1 + 0 + 5 + 1 + 33 + 2 + 3 + 7 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IP +MDRP[rp0,min,rnd,grey] +DELTAP1 +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +SVTCA[y-axis] +MDAP[rnd] +MIAP[rnd] +SRP2 +SLOOP +IP +MDAP[rnd] +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +DELTAP1 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1350 1509 m 1,0,-1 + 580 -49 l 1,1,-1 + 381 -49 l 1,2,-1 + 41 414 l 1,3,-1 + 287 569 l 1,4,-1 + 475 283 l 1,5,-1 + 1051 1509 l 1,6,-1 + 1350 1509 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: florin +Encoding: 334 402 166 +Width: 814 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 49 + 9 + 32 + 233 + 31 + 248 + 31 + 3 + 8 + 31 + 1 + 11 + 26 + 32 + 8 + 29 + 29 + 15 + 33 + 1 + 4 + 52 + 0 + 33 + 15 + 19 + 22 + 52 + 18 + 15 + 19 + 1 + 0 + 32 + 10 + 48 + 10 + 2 + 10 + 12 + 22 + 25 + 15 + 14 + 27 + 29 + 25 + 25 + 37 + 36 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MDRP[rp0,min,grey] +MDRP[grey] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +MDRP[rp0,min,grey] +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1199 1460 m 1,0,-1 + 1065 1251 l 1,1,2 + 1051 1270 1051 1270 1026 1289.5 c 128,-1,3 + 1001 1309 1001 1309 961 1309 c 0,4,5 + 913 1309 913 1309 874.5 1276 c 128,-1,6 + 836 1243 836 1243 814 1151 c 2,7,-1 + 757 903 l 1,8,-1 + 1000 903 l 1,9,-1 + 959 727 l 1,10,-1 + 716 727 l 1,11,-1 + 562 57 l 2,12,13 + 520 -127 520 -127 402.5 -240.5 c 128,-1,14 + 285 -354 285 -354 140 -354 c 0,15,16 + 41 -354 41 -354 -10.5 -335.5 c 128,-1,17 + -62 -317 -62 -317 -98 -285 c 1,18,-1 + 29 -86 l 1,19,20 + 46 -106 46 -106 73.5 -123.5 c 128,-1,21 + 101 -141 101 -141 139 -141 c 0,22,23 + 188 -141 188 -141 220 -97 c 128,-1,24 + 252 -53 252 -53 270 25 c 2,25,-1 + 432 729 l 1,26,-1 + 305 729 l 1,27,-1 + 345 903 l 1,28,-1 + 472 903 l 1,29,-1 + 522 1118 l 2,30,31 + 564 1298 564 1298 692.5 1414 c 128,-1,32 + 821 1530 821 1530 962 1530 c 0,33,34 + 1063 1530 1063 1530 1115 1510.5 c 128,-1,35 + 1167 1491 1167 1491 1199 1460 c 1,0,-1 +EndSplineSet +EndChar + +StartChar: approxequal +Encoding: 396 8776 167 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 67 + 24 + 1 + 24 + 9 + 106 + 1 + 106 + 9 + 4 + 8 + 11 + 70 + 9 + 43 + 8 + 14 + 110 + 14 + 126 + 14 + 3 + 14 + 10 + 43 + 15 + 70 + 12 + 13 + 5 + 3 + 70 + 0 + 1 + 43 + 8 + 6 + 110 + 6 + 126 + 6 + 3 + 6 + 2 + 43 + 7 + 70 + 4 + 5 + 5 + 2 + 6 + 1 + 13 + 10 + 14 + 9 + 8 + 8 + 11 + 0 + 48 + 8 + 1 + 8 + 3 + 11 + 16 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +SROUND +MDRP[rnd,grey] +RTG +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SROUND +MDRP[rnd,grey] +RTG +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SROUND +MDRP[rnd,grey] +RTG +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1065 715 m 1,0,-1 + 819 602 l 1,1,-1 + 348 807 l 1,2,-1 + 125 715 l 1,3,-1 + 125 952 l 1,4,-1 + 369 1065 l 1,5,-1 + 840 860 l 1,6,-1 + 1065 952 l 1,7,-1 + 1065 715 l 1,0,-1 +1065 236 m 1,8,-1 + 819 123 l 1,9,-1 + 348 328 l 1,10,-1 + 125 236 l 1,11,-1 + 125 473 l 1,12,-1 + 369 586 l 1,13,-1 + 840 381 l 1,14,-1 + 1065 473 l 1,15,-1 + 1065 236 l 1,8,-1 +EndSplineSet +EndChar + +StartChar: Delta +Encoding: 387 8710 168 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 5 + 6 + 4 + 5 + 2 + 3 + 5 + 1 + 0 + 55 + 1 + 1 + 1 + 4 + 6 + 45 + 0 + 1 + 0 + 5 + 3 + 2 + 10 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[x-axis] +MDAP[rnd] +DELTAP1 +MDAP[rnd] +SRP0 +SLOOP +IP +RTHG +MDAP[rnd] +RTG +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1346 0 m 1,0,-1 + -2 0 l 1,1,-1 + 559 1509 l 1,2,-1 + 772 1509 l 1,3,-1 + 1346 0 l 1,0,-1 +891 246 m 1,4,-1 + 618 1008 l 1,5,-1 + 342 246 l 1,6,-1 + 891 246 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: guillemotleft +Encoding: 129 171 169 +Width: 1262 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 47 + 11 + 4 + 3 + 2 + 13 + 6 + 0 + 1 + 7 + 0 + 1 + 10 + 3 + 12 + 5 + 8 + 48 + 1 + 1 + 1 + 52 + 9 + 2 + 5 + 0 + 1 + 4 + 0 + 95 + 48 + 1 + 1 + 1 + 8 + 12 + 7 + 8 + 11 + 7 + 95 + 63 + 8 + 159 + 8 + 2 + 8 + 14 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[min,rnd,black] +DELTAP1 +SHP[rp2] +IP +IP +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +SRP1 +SRP2 +IP +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1229 123 m 1,0,-1 + 740 496 l 1,1,-1 + 789 709 l 1,2,-1 + 1452 1090 l 1,3,-1 + 1389 815 l 1,4,-1 + 1018 602 l 1,5,-1 + 1292 397 l 1,6,-1 + 1229 123 l 1,0,-1 +654 123 m 1,7,-1 + 165 496 l 1,8,-1 + 214 709 l 1,9,-1 + 877 1090 l 1,10,-1 + 814 815 l 1,11,-1 + 443 602 l 1,12,-1 + 717 397 l 1,13,-1 + 654 123 l 1,7,-1 +EndSplineSet +EndChar + +StartChar: guillemotright +Encoding: 145 187 170 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 169 171 N -1 0 0 1 1360 0 2 +EndChar + +StartChar: ellipsis +Encoding: 359 8230 171 +Width: 1621 +GlyphClass: 1 +Flags: W +CounterMasks: 1 70 +TtInstrs: +NPUSHB + 24 + 2 + 6 + 10 + 72 + 128 + 1 + 5 + 9 + 0 + 0 + 71 + 1 + 4 + 71 + 5 + 8 + 71 + 223 + 9 + 224 + 9 + 2 + 9 + 12 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +SMD +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1506 0 m 1,0,-1 + 1203 0 l 1,1,-1 + 1278 326 l 1,2,-1 + 1581 326 l 1,3,-1 + 1506 0 l 1,0,-1 +965 0 m 1,4,-1 + 662 0 l 1,5,-1 + 738 326 l 1,6,-1 + 1040 326 l 1,7,-1 + 965 0 l 1,4,-1 +424 0 m 1,8,-1 + 121 0 l 1,9,-1 + 196 326 l 1,10,-1 + 499 326 l 1,11,-1 + 424 0 l 1,8,-1 +EndSplineSet +EndChar + +StartChar: nonbreakingspace +Encoding: 118 160 172 +Width: 1242 +GlyphClass: 1 +Flags: W +LayerCount: 2 +EndChar + +StartChar: Agrave +Encoding: 150 192 173 +Width: 1358 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 13 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 214 264 2 +EndChar + +StartChar: Atilde +Encoding: 153 195 174 +Width: 1358 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 24 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 208 246 2 +EndChar + +StartChar: Otilde +Encoding: 171 213 175 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 41 + 1 + 63 + 55 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 217 732 N 1 0 0 1 252 246 2 +EndChar + +StartChar: OE +Encoding: 289 338 176 +Width: 1743 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 23 + 30 + 233 + 5 + 228 + 36 + 3 + 23 + 30 + 20 + 73 + 20 + 1 + 16 + 29 + 31 + 13 + 11 + 26 + 19 + 30 + 16 + 10 + 38 + 31 + 4 + 1 + 41 + 24 + 30 + 1 + 0 + 18 + 22 + 63 + 0 + 1 + 0 + 20 + 24 + 23 + 16 + 1 + 26 + 0 + 41 + 80 + 41 + 160 + 41 + 3 + 41 + 35 + 21 + 48 + 7 + 1 + 7 + 44 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1688 0 m 1,0,-1 + 877 0 l 1,1,2 + 828 -16 828 -16 795 -20.5 c 128,-1,3 + 762 -25 762 -25 680 -25 c 0,4,5 + 364 -25 364 -25 252.5 156.5 c 128,-1,6 + 141 338 141 338 225 702 c 0,7,8 + 229 719 229 719 234 740.5 c 128,-1,9 + 239 762 239 762 245 788 c 0,10,11 + 326 1139 326 1139 538 1334.5 c 128,-1,12 + 750 1530 750 1530 1039 1530 c 0,13,14 + 1113 1530 1113 1530 1163 1519.5 c 128,-1,15 + 1213 1509 1213 1509 1251 1509 c 2,16,-1 + 1998 1509 l 1,17,-1 + 1946 1284 l 1,18,-1 + 1437 1284 l 1,19,-1 + 1344 879 l 1,20,-1 + 1743 879 l 1,21,-1 + 1690 651 l 1,22,-1 + 1291 651 l 1,23,-1 + 1193 225 l 1,24,-1 + 1739 225 l 1,25,-1 + 1688 0 l 1,0,-1 +1134 1296 m 1,26,27 + 1100 1305 1100 1305 1060.5 1310 c 128,-1,28 + 1021 1315 1021 1315 970 1315 c 0,29,30 + 823 1315 823 1315 725.5 1192 c 128,-1,31 + 628 1069 628 1069 558 768 c 0,32,33 + 554 752 554 752 553 746.5 c 128,-1,34 + 552 741 552 741 549 727 c 0,35,36 + 484 445 484 445 514.5 316.5 c 128,-1,37 + 545 188 545 188 717 188 c 0,38,39 + 777 188 777 188 815.5 198.5 c 128,-1,40 + 854 209 854 209 884 223 c 1,41,42 + 884 223 884 223 1006 747.5 c 128,-1,43 + 1128 1272 1128 1272 1134 1296 c 1,26,27 +EndSplineSet +EndChar + +StartChar: oe +Encoding: 290 339 177 +Width: 1777 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 103 + 70 + 18 + 70 + 25 + 73 + 50 + 89 + 13 + 86 + 28 + 86 + 33 + 89 + 50 + 105 + 13 + 101 + 33 + 105 + 50 + 121 + 50 + 150 + 18 + 150 + 25 + 154 + 33 + 14 + 1 + 46 + 127 + 44 + 1 + 44 + 44 + 29 + 14 + 3 + 11 + 32 + 29 + 41 + 51 + 33 + 32 + 26 + 13 + 7 + 70 + 14 + 4 + 60 + 33 + 8 + 70 + 11 + 17 + 3 + 8 + 0 + 49 + 16 + 38 + 64 + 38 + 96 + 38 + 3 + 38 + 45 + 57 + 14 + 57 + 29 + 2 + 14 + 29 + 1 + 45 + 44 + 1 + 49 + 48 + 45 + 1 + 45 + 57 + 23 + 15 + 20 + 96 + 20 + 128 + 20 + 144 + 20 + 4 + 255 + 20 + 1 + 20 + 63 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +SROUND +MDRP[rnd,grey] +RTG +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1798 484 m 1,0,-1 + 1128 484 l 1,1,2 + 1088 309 1088 309 1146.5 240.5 c 128,-1,3 + 1205 172 1205 172 1325 172 c 0,4,5 + 1404 172 1404 172 1490.5 193.5 c 128,-1,6 + 1577 215 1577 215 1675 258 c 1,7,-1 + 1633 74 l 1,8,9 + 1546 25 1546 25 1448.5 0 c 128,-1,10 + 1351 -25 1351 -25 1230 -25 c 0,11,12 + 1135 -25 1135 -25 1048.5 7 c 128,-1,13 + 962 39 962 39 910 129 c 1,14,15 + 841 63 841 63 752 19 c 128,-1,16 + 663 -25 663 -25 561 -25 c 0,17,18 + 355 -25 355 -25 252.5 120.5 c 128,-1,19 + 150 266 150 266 207 516 c 0,20,21 + 211 535 211 535 216 555.5 c 128,-1,22 + 221 576 221 576 225 594 c 0,23,24 + 280 831 280 831 452.5 976.5 c 128,-1,25 + 625 1122 625 1122 824 1122 c 0,26,27 + 955 1122 955 1122 1022.5 1087 c 128,-1,28 + 1090 1052 1090 1052 1121 986 c 1,29,30 + 1195 1052 1195 1052 1287 1087 c 128,-1,31 + 1379 1122 1379 1122 1480 1122 c 0,32,33 + 1705 1122 1705 1122 1791 973.5 c 128,-1,34 + 1877 825 1877 825 1821 586 c 2,35,36 + 1821 586 1821 586 1811 541 c 128,-1,37 + 1801 496 1801 496 1798 484 c 1,0,-1 +1582 648 m 1,38,39 + 1608 803 1608 803 1568.5 870 c 128,-1,40 + 1529 937 1529 937 1440 937 c 0,41,42 + 1363 937 1363 937 1286 871 c 128,-1,43 + 1209 805 1209 805 1168 648 c 1,44,-1 + 1582 648 l 1,38,39 +896 532 m 0,45,46 + 900 550 900 550 901.5 556 c 128,-1,47 + 903 562 903 562 906 577 c 0,48,49 + 942 731 942 731 917.5 831 c 128,-1,50 + 893 931 893 931 794 931 c 0,51,52 + 692 931 692 931 625 844 c 128,-1,53 + 558 757 558 757 517 577 c 0,54,55 + 514 562 514 562 511.5 552.5 c 128,-1,56 + 509 543 509 543 506 532 c 0,57,58 + 463 347 463 347 490 257.5 c 128,-1,59 + 517 168 517 168 617 168 c 0,60,61 + 716 168 716 168 784 254.5 c 128,-1,62 + 852 341 852 341 896 532 c 0,45,46 +EndSplineSet +EndChar + +StartChar: endash +Encoding: 348 8211 178 +Width: 949 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 1 + 68 + 2 + 70 + 48 + 0 + 1 + 0 + 47 + 1 + 63 + 1 + 2 + 1 + 73 + 4 +SRP0 +SROUND +MDRP[rp0,rnd,white] +RTG +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1025 561 m 1,0,-1 + 184 561 l 1,1,-1 + 239 799 l 1,2,-1 + 1080 799 l 1,3,-1 + 1025 561 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: emdash +Encoding: 349 8212 179 +Width: 1584 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 1 + 68 + 2 + 70 + 48 + 0 + 1 + 0 + 1 + 73 + 4 +SRP0 +SROUND +MDRP[rp0,rnd,white] +RTG +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1641 561 m 1,0,-1 + 202 561 l 1,1,-1 + 257 799 l 1,2,-1 + 1696 799 l 1,3,-1 + 1641 561 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: quotedblleft +Encoding: 353 8220 180 +Width: 1017 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 49 + 11 + 3 + 11 + 14 + 26 + 3 + 26 + 14 + 4 + 11 + 1 + 85 + 20 + 9 + 86 + 5 + 17 + 6 + 75 + 16 + 5 + 11 + 63 + 23 + 1 + 15 + 6 + 31 + 6 + 2 + 6 + 10 + 84 + 9 + 89 + 1 + 12 + 15 + 16 + 31 + 16 + 2 + 16 + 21 + 84 + 20 + 89 + 12 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MIRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1101 854 m 1,0,-1 + 785 854 l 1,1,-1 + 864 1194 l 2,2,3 + 905 1372 905 1372 1019.5 1451 c 128,-1,4 + 1134 1530 1134 1530 1257 1530 c 1,5,-1 + 1223 1382 l 1,6,7 + 1145 1382 1145 1382 1099 1343.5 c 128,-1,8 + 1053 1305 1053 1305 1027 1194 c 1,9,-1 + 1180 1194 l 1,10,-1 + 1101 854 l 1,0,-1 +634 854 m 1,11,-1 + 318 854 l 1,12,-1 + 397 1194 l 2,13,14 + 438 1372 438 1372 552.5 1451 c 128,-1,15 + 667 1530 667 1530 790 1530 c 1,16,-1 + 756 1382 l 1,17,18 + 678 1382 678 1382 632 1343.5 c 128,-1,19 + 586 1305 586 1305 560 1194 c 1,20,-1 + 713 1194 l 1,21,-1 + 634 854 l 1,11,-1 +EndSplineSet +EndChar + +StartChar: quotedblright +Encoding: 354 8221 181 +Width: 1017 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 5 + 1 + 5 + 12 + 20 + 1 + 20 + 12 + 4 + 4 + 15 + 75 + 3 + 14 + 86 + 7 + 18 + 85 + 9 + 20 + 10 + 63 + 23 + 1 + 7 + 89 + 10 + 84 + 0 + 4 + 16 + 4 + 2 + 4 + 9 + 20 + 18 + 89 + 21 + 84 + 0 + 15 + 16 + 15 + 2 + 15 + 20 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1178 1169 m 2,0,1 + 1137 991 1137 991 1022.5 912.5 c 128,-1,2 + 908 834 908 834 784 834 c 1,3,-1 + 818 981 l 1,4,5 + 896 981 896 981 942.5 1020 c 128,-1,6 + 989 1059 989 1059 1014 1169 c 1,7,-1 + 861 1169 l 1,8,-1 + 940 1509 l 1,9,-1 + 1256 1509 l 1,10,-1 + 1178 1169 l 2,0,1 +711 1169 m 2,11,12 + 670 991 670 991 555.5 912.5 c 128,-1,13 + 441 834 441 834 317 834 c 1,14,-1 + 351 981 l 1,15,16 + 429 981 429 981 475.5 1020 c 128,-1,17 + 522 1059 522 1059 547 1169 c 1,18,-1 + 395 1169 l 1,19,-1 + 473 1509 l 1,20,-1 + 789 1509 l 1,21,-1 + 711 1169 l 2,11,12 +EndSplineSet +EndChar + +StartChar: quoteleft +Encoding: 350 8216 182 +Width: 625 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 10 + 3 + 25 + 3 + 2 + 1 + 85 + 9 + 86 + 6 + 75 + 5 + 11 + 15 + 6 + 31 + 6 + 2 + 6 + 10 + 84 + 9 + 89 + 1 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +672 854 m 1,0,-1 + 356 854 l 1,1,-1 + 434 1194 l 2,2,3 + 475 1372 475 1372 589.5 1451 c 128,-1,4 + 704 1530 704 1530 828 1530 c 1,5,-1 + 794 1382 l 1,6,7 + 716 1382 716 1382 669.5 1343.5 c 128,-1,8 + 623 1305 623 1305 598 1194 c 1,9,-1 + 750 1194 l 1,10,-1 + 672 854 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: quoteright +Encoding: 351 8217 183 +Width: 625 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 6 + 1 + 21 + 1 + 2 + 4 + 75 + 3 + 86 + 7 + 85 + 9 + 10 + 7 + 89 + 10 + 84 + 0 + 4 + 16 + 4 + 2 + 4 + 9 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +748 1169 m 2,0,1 + 707 991 707 991 592.5 912.5 c 128,-1,2 + 478 834 478 834 355 834 c 1,3,-1 + 388 981 l 1,4,5 + 466 981 466 981 512.5 1020 c 128,-1,6 + 559 1059 559 1059 584 1169 c 1,7,-1 + 432 1169 l 1,8,-1 + 510 1509 l 1,9,-1 + 827 1509 l 1,10,-1 + 748 1169 l 2,0,1 +EndSplineSet +EndChar + +StartChar: divide +Encoding: 205 247 184 +Width: 1100 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 24 + 19 + 56 + 25 + 13 + 69 + 14 + 9 + 56 + 3 + 14 + 70 + 48 + 12 + 1 + 12 + 0 + 16 + 55 + 13 + 6 + 22 + 22 + 29 + 28 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP2 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +933 1036 m 0,0,1 + 918 973 918 973 865.5 928 c 128,-1,2 + 813 883 813 883 754 883 c 0,3,4 + 694 883 694 883 663 928 c 128,-1,5 + 632 973 632 973 646 1036 c 0,6,7 + 661 1100 661 1100 713 1145 c 128,-1,8 + 765 1190 765 1190 825 1190 c 0,9,10 + 884 1190 884 1190 916 1145 c 128,-1,11 + 948 1100 948 1100 933 1036 c 0,0,1 +1134 582 m 1,12,-1 + 237 582 l 1,13,-1 + 287 799 l 1,14,-1 + 1184 799 l 1,15,-1 + 1134 582 l 1,12,-1 +770 332 m 0,16,17 + 755 268 755 268 702.5 223 c 128,-1,18 + 650 178 650 178 591 178 c 0,19,20 + 531 178 531 178 500 223 c 128,-1,21 + 469 268 469 268 484 332 c 0,22,23 + 499 395 499 395 551 440 c 128,-1,24 + 603 485 603 485 662 485 c 0,25,26 + 721 485 721 485 753 440 c 128,-1,27 + 785 395 785 395 770 332 c 0,16,17 +EndSplineSet +EndChar + +StartChar: lozenge +Encoding: 403 9674 185 +Width: 1372 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 65 + 42 + 1 + 37 + 3 + 59 + 5 + 52 + 7 + 89 + 1 + 86 + 3 + 202 + 1 + 198 + 3 + 8 + 105 + 1 + 170 + 5 + 165 + 7 + 3 + 37 + 0 + 42 + 2 + 59 + 4 + 52 + 6 + 86 + 0 + 89 + 2 + 198 + 0 + 201 + 2 + 8 + 105 + 2 + 170 + 4 + 166 + 6 + 3 + 7 + 5 + 6 + 4 + 0 + 3 + 48 + 2 + 1 + 2 + 4 + 6 + 5 + 7 + 1 + 3 + 3 +RTHG +MDAP[rnd] +SLOOP +ALIGNRP +MDRP[grey] +MDRP[grey] +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +SLOOP +ALIGNRP +MDRP[grey] +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1280 682 m 1,0,-1 + 686 88 l 1,1,-1 + 92 682 l 1,2,-1 + 686 1276 l 1,3,-1 + 1280 682 l 1,0,-1 +973 682 m 1,4,-1 + 686 969 l 1,5,-1 + 399 682 l 1,6,-1 + 686 395 l 1,7,-1 + 973 682 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: ydieresis +Encoding: 213 255 186 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 0 + 11 + 0 + 23 + 16 + 11 + 16 + 23 + 4 + 31 + 14 + 31 + 26 + 63 + 14 + 3 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 92 121 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 61 -88 2 +EndChar + +StartChar: Ydieresis +Encoding: 327 376 187 +Width: 1327 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 15 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 60 89 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 261 247 2 +EndChar + +StartChar: fraction +Encoding: 363 8260 188 +AltUni2: 002215.ffffffff.0 002215.ffffffff.0 +Width: 489 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 45 + 6 + 1 + 22 + 1 + 24 + 3 + 39 + 1 + 40 + 3 + 53 + 0 + 57 + 1 + 57 + 2 + 72 + 3 + 88 + 3 + 10 + 0 + 57 + 3 + 1 + 3 + 55 + 1 + 1 + 1 + 2 + 2 + 3 + 3 + 57 + 2 + 1 + 2 + 4 + 1 + 2 + 0 + 0 + 3 + 10 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,grey] +SPVTL[orthog] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +DELTAP1 +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1133 1509 m 1,0,-1 + -94 0 l 1,1,-1 + -296 0 l 1,2,-1 + 931 1509 l 1,3,-1 + 1133 1509 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: Euro +Encoding: 368 8364 189 +Width: 1413 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 41 + 5 + 227 + 6 + 227 + 1 + 227 + 2 + 16 + 18 + 227 + 19 + 21 + 227 + 16 + 8 + 29 + 27 + 227 + 10 + 4 + 228 + 7 + 228 + 0 + 228 + 3 + 29 + 18 + 228 + 19 + 29 + 24 + 2 + 6 + 228 + 1 + 5 + 24 + 227 + 13 + 30 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +ALIGNRP +MIRP[rp0,rnd,black] +ALIGNRP +SRP0 +MDRP[rp0,min,rnd,black] +ALIGNRP +MIRP[rp0,rnd,black] +SRP0 +MDRP[rp0,rnd,black] +MIRP[rp0,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,rnd,black] +MDRP[rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,rnd,black] +MIRP[min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,rnd,black] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1315 715 m 1,0,-1 + 254 715 l 1,1,-1 + 324 825 l 1,2,-1 + 1384 825 l 1,3,-1 + 1315 715 l 1,0,-1 +1177 495 m 1,4,-1 + 203 495 l 1,5,-1 + 273 605 l 1,6,-1 + 1247 605 l 1,7,-1 + 1177 495 l 1,4,-1 +1301 149 m 1,8,9 + 1106 0 1106 0 869 0 c 0,10,11 + 609 0 609 0 475.5 190 c 128,-1,12 + 342 380 342 380 407 660 c 256,13,14 + 472 940 472 940 692.5 1130 c 128,-1,15 + 913 1320 913 1320 1173 1320 c 256,16,17 + 1433 1320 1433 1320 1571 1124 c 1,18,-1 + 1500 1013 l 1,19,20 + 1375 1210 1375 1210 1148 1210 c 0,21,22 + 934 1210 934 1210 748 1050 c 128,-1,23 + 562 890 562 890 509 660 c 256,24,25 + 456 430 456 430 568 270 c 128,-1,26 + 680 110 680 110 894 110 c 0,27,28 + 1126 110 1126 110 1338 311 c 1,29,-1 + 1301 149 l 1,8,9 +EndSplineSet +EndChar + +StartChar: guilsinglleft +Encoding: 361 8249 190 +Width: 688 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 27 + 4 + 3 + 2 + 6 + 0 + 1 + 0 + 1 + 3 + 5 + 48 + 1 + 1 + 1 + 52 + 2 + 63 + 8 + 1 + 5 + 0 + 1 + 4 + 0 + 95 + 1 + 7 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +DELTAP1 +IP +MDRP[rp0,min,rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +656 123 m 1,0,-1 + 166 496 l 1,1,-1 + 216 709 l 1,2,-1 + 879 1090 l 1,3,-1 + 816 815 l 1,4,-1 + 445 602 l 1,5,-1 + 719 397 l 1,6,-1 + 656 123 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: guilsinglright +Encoding: 362 8250 191 +Width: 743 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 190 8249 N -1 0 0 1 744 0 2 +EndChar + +StartChar: fi +Encoding: 407 64257 192 +Width: 1294 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 9 + 11 + 26 + 11 + 2 + 3 + 6 + 32 + 24 + 9 + 12 + 1 + 5 + 2 + 17 + 20 + 33 + 16 + 13 + 17 + 0 + 22 + 143 + 1 + 1 + 1 + 16 + 5 + 24 + 4 + 22 + 9 + 7 + 144 + 5 + 1 + 5 + 26 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[min,rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1149 0 m 1,0,-1 + 829 0 l 1,1,-1 + 829 961 l 1,2,-1 + 489 961 l 1,3,-1 + 489 0 l 1,4,-1 + 170 0 l 1,5,-1 + 170 963 l 1,6,-1 + 18 963 l 1,7,-1 + 18 1151 l 1,8,-1 + 176 1151 l 1,9,-1 + 176 1194 l 2,10,11 + 176 1362 176 1362 276.5 1462.5 c 128,-1,12 + 377 1563 377 1563 545 1563 c 0,13,14 + 625 1563 625 1563 701.5 1541.5 c 128,-1,15 + 778 1520 778 1520 829 1487 c 1,16,-1 + 745 1317 l 1,17,18 + 719 1337 719 1337 687 1351.5 c 128,-1,19 + 655 1366 655 1366 608 1366 c 0,20,21 + 541 1366 541 1366 516.5 1325 c 128,-1,22 + 492 1284 492 1284 492 1204 c 2,23,-1 + 492 1151 l 1,24,-1 + 1149 1151 l 1,25,-1 + 1149 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: fl +Encoding: 408 64258 193 +Width: 1276 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 9 + 20 + 25 + 20 + 40 + 20 + 3 + 12 + 15 + 32 + 9 + 18 + 12 + 1 + 14 + 2 + 2 + 5 + 33 + 22 + 17 + 25 + 16 + 11 + 1 + 13 + 0 + 22 + 25 + 47 + 1 + 95 + 1 + 143 + 1 + 3 + 1 + 14 + 9 + 13 + 22 + 18 + 16 + 144 + 14 + 1 + 14 + 27 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1135 0 m 1,0,-1 + 815 0 l 1,1,-1 + 815 1290 l 1,2,3 + 786 1331 786 1331 742 1348.5 c 128,-1,4 + 698 1366 698 1366 653 1366 c 0,5,6 + 561 1366 561 1366 526.5 1315 c 128,-1,7 + 492 1264 492 1264 492 1184 c 2,8,-1 + 492 1151 l 1,9,-1 + 707 1151 l 1,10,-1 + 707 961 l 1,11,-1 + 489 961 l 1,12,-1 + 489 0 l 1,13,-1 + 170 0 l 1,14,-1 + 170 963 l 1,15,-1 + 18 963 l 1,16,-1 + 18 1151 l 1,17,-1 + 176 1151 l 1,18,-1 + 176 1161 l 2,19,20 + 176 1333 176 1333 271.5 1448 c 128,-1,21 + 367 1563 367 1563 545 1563 c 0,22,23 + 627 1563 627 1563 699.5 1549.5 c 128,-1,24 + 772 1536 772 1536 815 1509 c 1,25,-1 + 1135 1509 l 1,26,-1 + 1135 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: daggerdbl +Encoding: 357 8225 194 +Width: 974 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 49 + 1 + 4 + 89 + 18 + 64 + 7 + 128 + 11 + 17 + 8 + 89 + 14 + 11 + 12 + 3 + 18 + 12 + 16 + 48 + 21 + 1 + 2 + 64 + 18 + 1 + 17 + 14 + 19 + 48 + 15 + 1 + 15 + 101 + 13 + 22 + 4 + 7 + 8 + 11 + 3 + 64 + 6 + 63 + 10 + 1 + 10 + 101 + 12 + 20 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,grey] +DELTAP1 +SHP[rp2] +MIRP[rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[min,rnd,grey] +DELTAP1 +SHP[rp2] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[grey] +MIRP[rp0,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +SMD +MDRP[rp0,min,rnd,grey] +SMD +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1120 672 m 1,0,-1 + 756 672 l 1,1,-1 + 515 -342 l 1,2,-1 + 292 -342 l 1,3,-1 + 518 672 l 1,4,-1 + 172 672 l 1,5,-1 + 212 848 l 1,6,-1 + 552 848 l 1,7,-1 + 577 975 l 1,8,-1 + 241 975 l 1,9,-1 + 282 1151 l 1,10,-1 + 610 1151 l 1,11,-1 + 681 1509 l 1,12,-1 + 980 1509 l 1,13,-1 + 887 1151 l 1,14,-1 + 1231 1151 l 1,15,-1 + 1190 975 l 1,16,-1 + 838 975 l 1,17,-1 + 805 848 l 1,18,-1 + 1161 848 l 1,19,-1 + 1120 672 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: periodcentered +Encoding: 141 183 195 +AltUni2: 002219.ffffffff.0 002219.ffffffff.0 +Width: 625 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 1 + 71 + 2 + 0 + 71 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +586 524 m 1,0,-1 + 283 524 l 1,1,-1 + 358 850 l 1,2,-1 + 661 850 l 1,3,-1 + 586 524 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: quotesinglbase +Encoding: 352 8218 196 +Width: 625 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +478 0 m 2,0,1 + 437 -178 437 -178 322.5 -257 c 128,-1,2 + 208 -336 208 -336 84 -336 c 1,3,-1 + 119 -188 l 1,4,5 + 197 -188 197 -188 243 -149.5 c 0,6,7 + 288 -111 288 -111 314 0 c 1,8,-1 + 162 0 l 1,9,-1 + 240 340 l 1,10,-1 + 557 340 l 1,11,-1 + 478 0 l 2,0,1 +EndSplineSet +EndChar + +StartChar: quotedblbase +Encoding: 355 8222 197 +Width: 1017 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 45 + 5 + 1 + 5 + 12 + 21 + 1 + 21 + 12 + 4 + 15 + 4 + 14 + 3 + 86 + 21 + 9 + 85 + 18 + 7 + 0 + 63 + 23 + 1 + 7 + 0 + 84 + 0 + 4 + 16 + 4 + 2 + 4 + 8 + 19 + 18 + 11 + 84 + 0 + 14 + 16 + 14 + 2 + 14 + 19 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[min,rnd,black] +SHP[rp2] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +908 0 m 2,0,1 + 867 -178 867 -178 752.5 -257 c 128,-1,2 + 638 -336 638 -336 514 -336 c 1,3,-1 + 548 -188 l 1,4,5 + 626 -188 626 -188 672 -149.5 c 128,-1,6 + 718 -111 718 -111 744 0 c 1,7,-1 + 592 0 l 1,8,-1 + 670 340 l 1,9,-1 + 986 340 l 1,10,-1 + 908 0 l 2,0,1 +441 0 m 2,11,12 + 400 -178 400 -178 285.5 -257 c 128,-1,13 + 171 -336 171 -336 47 -336 c 1,14,-1 + 81 -188 l 1,15,16 + 159 -188 159 -188 205.5 -149.5 c 128,-1,17 + 252 -111 252 -111 277 0 c 1,18,-1 + 125 0 l 1,19,-1 + 203 340 l 1,20,-1 + 519 340 l 1,21,-1 + 441 0 l 2,11,12 +EndSplineSet +EndChar + +StartChar: perthousand +Encoding: 360 8240 198 +Width: 2378 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 129 + 4 + 1 + 11 + 5 + 11 + 8 + 4 + 12 + 4 + 19 + 11 + 23 + 11 + 26 + 4 + 30 + 4 + 33 + 11 + 37 + 11 + 40 + 4 + 44 + 20 + 1 + 27 + 5 + 27 + 8 + 20 + 12 + 20 + 19 + 27 + 23 + 27 + 26 + 20 + 30 + 20 + 33 + 27 + 37 + 27 + 40 + 20 + 44 + 55 + 15 + 25 + 14 + 14 + 16 + 4 + 57 + 89 + 3 + 87 + 50 + 89 + 10 + 15 + 78 + 64 + 89 + 42 + 28 + 87 + 21 + 85 + 71 + 89 + 35 + 21 + 5 + 17 + 53 + 14 + 1 + 48 + 14 + 1 + 14 + 15 + 61 + 16 + 1 + 63 + 16 + 1 + 16 + 6 + 18 + 88 + 60 + 90 + 68 + 88 + 24 + 38 + 32 + 88 + 74 + 90 + 81 + 88 + 15 + 38 + 1 + 38 + 6 + 0 + 88 + 46 + 90 + 54 + 88 + 0 + 6 + 48 + 6 + 64 + 6 + 176 + 6 + 4 + 6 + 88 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP1 +MDRP[min,rnd,grey] +MDRP[rp0,min,rnd,black] +DELTAP1 +DELTAP1 +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1049 1153 m 2,0,1 + 1015 1006 1015 1006 897 915.5 c 128,-1,2 + 779 825 779 825 619 825 c 0,3,4 + 461 825 461 825 379 919.5 c 128,-1,5 + 297 1014 297 1014 329 1151 c 2,6,-1 + 341 1206 l 2,7,8 + 370 1333 370 1333 487.5 1432.5 c 128,-1,9 + 605 1532 605 1532 782 1532 c 0,10,11 + 949 1532 949 1532 1021 1439 c 128,-1,12 + 1093 1346 1093 1346 1061 1206 c 2,13,-1 + 1049 1153 l 2,0,1 +1686 1509 m 1,14,-1 + 375 0 l 1,15,-1 + 212 0 l 1,16,-1 + 1523 1509 l 1,17,-1 + 1686 1509 l 1,14,-1 +2385 305 m 2,18,19 + 2347 139 2347 139 2230 58 c 128,-1,20 + 2113 -23 2113 -23 1957 -23 c 0,21,22 + 1789 -23 1789 -23 1711 69.5 c 128,-1,23 + 1633 162 1633 162 1665 303 c 2,24,-1 + 1678 358 l 2,25,26 + 1706 481 1706 481 1825 582.5 c 128,-1,27 + 1944 684 1944 684 2120 684 c 0,28,29 + 2287 684 2287 684 2358.5 592 c 128,-1,30 + 2430 500 2430 500 2397 358 c 2,31,-1 + 2385 305 l 2,18,19 +1574 305 m 2,32,33 + 1536 139 1536 139 1419 58 c 128,-1,34 + 1302 -23 1302 -23 1147 -23 c 0,35,36 + 979 -23 979 -23 901 69.5 c 128,-1,37 + 823 162 823 162 855 303 c 2,38,-1 + 868 358 l 2,39,40 + 896 481 896 481 1015 582.5 c 128,-1,41 + 1134 684 1134 684 1310 684 c 0,42,43 + 1477 684 1477 684 1548 592 c 128,-1,44 + 1619 500 1619 500 1586 358 c 2,45,-1 + 1574 305 l 2,32,33 +813 1163 m 2,46,-1 + 817 1180 l 2,47,48 + 836 1262 836 1262 825.5 1312 c 128,-1,49 + 815 1362 815 1362 743 1362 c 0,50,51 + 672 1362 672 1362 633.5 1314 c 128,-1,52 + 595 1266 595 1266 575 1180 c 2,53,-1 + 571 1163 l 2,54,55 + 555 1094 555 1094 568.5 1037.5 c 128,-1,56 + 582 981 582 981 657 981 c 0,57,58 + 724 981 724 981 759.5 1033 c 128,-1,59 + 795 1085 795 1085 813 1163 c 2,46,-1 +2151 315 m 2,60,-1 + 2155 332 l 2,61,62 + 2174 414 2174 414 2163 464 c 128,-1,63 + 2152 514 2152 514 2081 514 c 0,64,65 + 2010 514 2010 514 1971 466 c 128,-1,66 + 1932 418 1932 418 1912 332 c 2,67,-1 + 1908 315 l 2,68,69 + 1892 246 1892 246 1906 189.5 c 128,-1,70 + 1920 133 1920 133 1994 133 c 0,71,72 + 2060 133 2060 133 2096.5 185.5 c 128,-1,73 + 2133 238 2133 238 2151 315 c 2,60,-1 +1340 315 m 2,74,-1 + 1344 332 l 2,75,76 + 1363 414 1363 414 1352.5 464 c 128,-1,77 + 1342 514 1342 514 1270 514 c 0,78,79 + 1199 514 1199 514 1160.5 466 c 128,-1,80 + 1122 418 1122 418 1102 332 c 2,81,-1 + 1098 315 l 2,82,83 + 1082 246 1082 246 1096 189.5 c 128,-1,84 + 1110 133 1110 133 1184 133 c 0,85,86 + 1250 133 1250 133 1286 185.5 c 128,-1,87 + 1322 238 1322 238 1340 315 c 2,74,-1 +EndSplineSet +EndChar + +StartChar: Acircumflex +Encoding: 152 194 199 +Width: 1358 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 212 260 2 +EndChar + +StartChar: Ecircumflex +Encoding: 160 202 200 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 174 260 2 +EndChar + +StartChar: Aacute +Encoding: 151 193 201 +Width: 1358 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 302 260 2 +EndChar + +StartChar: Edieresis +Encoding: 161 203 202 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 142 168 N 1 0 0 1 176 246 2 +Refer: 40 69 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Egrave +Encoding: 158 200 203 +Width: 1167 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 14 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 166 260 2 +EndChar + +StartChar: Iacute +Encoding: 163 205 204 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 9 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 2 260 2 +EndChar + +StartChar: Icircumflex +Encoding: 164 206 205 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 8 + 1 + 63 + 12 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 -67 260 2 +EndChar + +StartChar: Idieresis +Encoding: 165 207 206 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 63 + 10 + 63 + 22 + 2 + 63 + 29 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 142 168 N 1 0 0 1 -80 247 2 +EndChar + +StartChar: Igrave +Encoding: 162 204 207 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 9 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 -129 260 2 +EndChar + +StartChar: Oacute +Encoding: 169 211 208 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 30 + 1 + 63 + 33 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 141 180 N 1 0 0 1 292 260 2 +EndChar + +StartChar: Ocircumflex +Encoding: 170 212 209 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 32 + 1 + 63 + 36 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 216 710 N 1 0 0 1 250 260 2 +EndChar + +StartChar: uniF8FF +Encoding: 406 63743 210 +Width: 1585 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 48 + 3 + 1 + 3 + 9 + 57 + 0 + 1 + 0 + 62 + 6 + 1 + 6 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MDRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1346 762 m 0,0,1 + 1346 532 1346 532 1184 370.5 c 128,-1,2 + 1022 209 1022 209 793 209 c 0,3,4 + 563 209 563 209 401.5 370.5 c 128,-1,5 + 240 532 240 532 240 762 c 0,6,7 + 240 991 240 991 401.5 1153 c 128,-1,8 + 563 1315 563 1315 793 1315 c 0,9,10 + 1022 1315 1022 1315 1184 1153 c 128,-1,11 + 1346 991 1346 991 1346 762 c 0,0,1 +EndSplineSet +EndChar + +StartChar: Ograve +Encoding: 168 210 211 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 33 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 67 96 N 1 0 0 1 166 260 2 +EndChar + +StartChar: Uacute +Encoding: 176 218 212 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 20 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 279 260 2 +EndChar + +StartChar: Ucircumflex +Encoding: 177 219 213 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 22 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 227 260 2 +EndChar + +StartChar: Ugrave +Encoding: 175 217 214 +Width: 1343 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 67 96 N 1 0 0 1 193 260 2 +EndChar + +StartChar: dotlessi +Encoding: 261 305 215 +Width: 532 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 2 + 12 + 1 + 0 + 0 + 22 + 160 + 1 + 1 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP2 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +487 327 m 1,0,1 + 483 309 483 309 477.5 264.5 c 128,-1,2 + 472 220 472 220 474 212 c 0,3,4 + 474 197 474 197 484 186.5 c 128,-1,5 + 494 176 494 176 506 176 c 0,6,7 + 556 176 556 176 658 345 c 1,8,-1 + 672 370 l 1,9,-1 + 725 334 l 1,10,11 + 603 125 603 125 524.5 52 c 128,-1,12 + 446 -21 446 -21 341 -21 c 0,13,14 + 304 -21 304 -21 276 -12 c 128,-1,15 + 248 -3 248 -3 229.5 9.5 c 128,-1,16 + 211 22 211 22 199.5 44.5 c 128,-1,17 + 188 67 188 67 181.5 85 c 128,-1,18 + 175 103 175 103 175 133 c 128,-1,19 + 175 163 175 163 175.5 179 c 128,-1,20 + 176 195 176 195 181.5 227 c 128,-1,21 + 187 259 187 259 188.5 266.5 c 128,-1,22 + 190 274 190 274 196 299 c 1,23,-1 + 380 1093 l 1,24,-1 + 664 1093 l 1,25,-1 + 487 327 l 1,0,1 +EndSplineSet +EndChar + +StartChar: circumflex +Encoding: 335 710 216 +Width: 950 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 2 + 5 + 91 + 0 + 4 + 36 + 52 + 0 + 1 + 0 + 8 + 59 + 4 + 1 + 4 + 7 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +PUSHB_2 + 4 + 0 +MD[grid] +EVEN +IF +PUSHB_2 + 0 + 64 +SHPIX +EIF +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1217 1323 m 1,0,-1 + 1015 1323 l 1,1,-1 + 825 1516 l 1,2,-1 + 546 1323 l 1,3,-1 + 345 1323 l 1,4,-1 + 754 1677 l 1,5,-1 + 971 1677 l 1,6,-1 + 1217 1323 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: tilde +Encoding: 342 732 217 +Width: 949 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 36 + 137 + 25 + 153 + 25 + 169 + 25 + 185 + 25 + 199 + 12 + 201 + 25 + 214 + 12 + 7 + 9 + 46 + 25 + 16 + 22 + 46 + 12 + 3 + 37 + 16 + 22 + 9 + 3 + 4 + 0 + 13 + 25 + 0 + 12 + 13 + 26 +SRP0 +MDRP[rp0,rnd,white] +MDRP[min,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,grey] +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1227 1520 m 1,0,1 + 1185 1456 1185 1456 1102.5 1397.5 c 128,-1,2 + 1020 1339 1020 1339 929 1339 c 0,3,4 + 868 1339 868 1339 840.5 1355.5 c 128,-1,5 + 813 1372 813 1372 776 1397 c 0,6,7 + 740 1421 740 1421 713 1435.5 c 128,-1,8 + 686 1450 686 1450 646 1450 c 256,9,10 + 606 1450 606 1450 571 1435.5 c 128,-1,11 + 536 1421 536 1421 487 1368 c 1,12,-1 + 412 1452 l 1,13,14 + 452 1507 452 1507 530.5 1568.5 c 128,-1,15 + 609 1630 609 1630 722 1630 c 0,16,17 + 773 1630 773 1630 803 1612.5 c 128,-1,18 + 833 1595 833 1595 861 1573 c 0,19,20 + 889 1550 889 1550 918 1534 c 128,-1,21 + 947 1518 947 1518 1000 1518 c 0,22,23 + 1048 1518 1048 1518 1080.5 1543.5 c 128,-1,24 + 1113 1569 1113 1569 1146 1612 c 1,25,-1 + 1227 1520 l 1,0,1 +EndSplineSet +EndChar + +StartChar: macron +Encoding: 133 175 218 +AltUni2: 0002c9.ffffffff.0 0002c9.ffffffff.0 +Width: 946 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 2 + 46 + 1 + 39 + 0 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1114 1335 m 1,0,-1 + 447 1335 l 1,1,-1 + 489 1518 l 1,2,-1 + 1157 1518 l 1,3,-1 + 1114 1335 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: breve +Encoding: 338 728 219 +Width: 945 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 8 + 4 + 24 + 4 + 2 + 0 + 6 + 10 + 94 + 167 + 3 + 183 + 3 + 199 + 3 + 3 + 3 + 38 + 13 + 76 + 0 + 7 + 76 + 6 + 14 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1183 1657 m 1,0,1 + 1149 1509 1149 1509 1022 1413 c 128,-1,2 + 895 1317 895 1317 777 1317 c 0,3,4 + 642 1317 642 1317 568 1413 c 128,-1,5 + 494 1509 494 1509 528 1657 c 1,6,-1 + 684 1657 l 1,7,8 + 673 1579 673 1579 707.5 1530 c 128,-1,9 + 742 1481 742 1481 815 1481 c 256,10,11 + 888 1481 888 1481 944.5 1530 c 128,-1,12 + 1001 1579 1001 1579 1027 1657 c 1,13,-1 + 1183 1657 l 1,0,1 +EndSplineSet +EndChar + +StartChar: dotaccent +Encoding: 339 729 220 +Width: 937 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 9 + 56 + 3 + 38 + 0 + 55 + 6 + 12 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +955 1483 m 0,0,1 + 940 1419 940 1419 887 1374 c 128,-1,2 + 834 1329 834 1329 776 1329 c 256,3,4 + 717 1329 717 1329 685 1374 c 128,-1,5 + 653 1419 653 1419 668 1483 c 0,6,7 + 683 1546 683 1546 735.5 1591 c 128,-1,8 + 788 1636 788 1636 847 1636 c 256,9,10 + 906 1636 906 1636 938 1591 c 128,-1,11 + 970 1546 970 1546 955 1483 c 0,0,1 +EndSplineSet +EndChar + +StartChar: ring +Encoding: 340 730 221 +Width: 942 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 61 + 4 + 1 + 11 + 5 + 11 + 7 + 4 + 11 + 20 + 1 + 27 + 5 + 27 + 7 + 20 + 11 + 37 + 1 + 42 + 5 + 42 + 7 + 37 + 11 + 12 + 9 + 210 + 15 + 21 + 210 + 3 + 38 + 0 + 75 + 112 + 12 + 1 + 48 + 12 + 128 + 12 + 208 + 12 + 3 + 61 + 12 + 144 + 12 + 224 + 12 + 3 + 12 + 18 + 75 + 47 + 6 + 56 + 6 + 2 + 6 + 24 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP2 +DELTAP3 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1093 1581 m 256,0,1 + 1067 1468 1067 1468 976.5 1392.5 c 128,-1,2 + 886 1317 886 1317 775 1317 c 256,3,4 + 664 1317 664 1317 609 1392.5 c 128,-1,5 + 554 1468 554 1468 580 1581 c 256,6,7 + 606 1694 606 1694 696.5 1769.5 c 128,-1,8 + 787 1845 787 1845 897 1845 c 256,9,10 + 1008 1845 1008 1845 1063.5 1769.5 c 128,-1,11 + 1119 1694 1119 1694 1093 1581 c 256,0,1 +958 1581 m 256,12,13 + 970 1634 970 1634 943 1673 c 128,-1,14 + 916 1712 916 1712 867 1712 c 256,15,16 + 818 1712 818 1712 772.5 1673 c 128,-1,17 + 727 1634 727 1634 715 1581 c 256,18,19 + 703 1528 703 1528 730 1489 c 128,-1,20 + 757 1450 757 1450 806 1450 c 256,21,22 + 855 1450 855 1450 900.5 1489 c 128,-1,23 + 946 1528 946 1528 958 1581 c 256,12,13 +EndSplineSet +EndChar + +StartChar: cedilla +Encoding: 142 184 222 +Width: 940 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 47 + 35 + 1 + 35 + 22 + 51 + 22 + 67 + 1 + 67 + 22 + 83 + 1 + 83 + 22 + 99 + 1 + 99 + 22 + 9 + 19 + 20 + 17 + 73 + 3 + 7 + 70 + 10 + 210 + 6 + 3 + 0 + 92 + 111 + 13 + 1 + 13 + 19 + 76 + 48 + 6 + 1 + 6 + 63 + 18 + 1 + 18 + 23 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SRP0 +SROUND +MDRP[rp0,min,rnd,grey] +RTG +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +684 -256 m 0,0,1 + 657 -371 657 -371 564 -431.5 c 128,-1,2 + 471 -492 471 -492 378 -492 c 0,3,4 + 309 -492 309 -492 290.5 -486.5 c 128,-1,5 + 272 -481 272 -481 246 -469 c 1,6,-1 + 276 -336 l 1,7,8 + 298 -350 298 -350 323.5 -356 c 128,-1,9 + 349 -362 349 -362 383 -362 c 0,10,11 + 421 -362 421 -362 453 -337.5 c 128,-1,12 + 485 -313 485 -313 495 -270 c 0,13,14 + 508 -215 508 -215 487.5 -192.5 c 128,-1,15 + 467 -170 467 -170 424 -170 c 2,16,-1 + 336 -170 l 1,17,-1 + 381 25 l 1,18,-1 + 531 25 l 1,19,-1 + 512 -57 l 1,20,21 + 612 -57 612 -57 659 -108.5 c 128,-1,22 + 706 -160 706 -160 684 -256 c 0,0,1 +EndSplineSet +EndChar + +StartChar: hungarumlaut +Encoding: 343 733 223 +Width: 950 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 3 + 7 + 91 + 2 + 6 + 36 + 0 + 2 + 4 + 6 + 8 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1354 1677 m 1,0,-1 + 987 1323 l 1,1,-1 + 804 1323 l 1,2,-1 + 1118 1677 l 1,3,-1 + 1354 1677 l 1,0,-1 +964 1677 m 1,4,-1 + 596 1323 l 1,5,-1 + 414 1323 l 1,6,-1 + 728 1677 l 1,7,-1 + 964 1677 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: ogonek +Encoding: 341 731 224 +Width: 939 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 26 + 10 + 7 + 26 + 7 + 42 + 7 + 58 + 7 + 74 + 7 + 91 + 7 + 6 + 0 + 3 + 18 + 11 + 10 + 0 + 0 + 21 + 11 + 15 + 89 + 6 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +499 -471 m 1,0,1 + 456 -483 456 -483 432 -487.5 c 128,-1,2 + 408 -492 408 -492 386 -492 c 0,3,4 + 273 -492 273 -492 219.5 -435.5 c 128,-1,5 + 166 -379 166 -379 197 -246 c 0,6,7 + 223 -135 223 -135 312.5 -67.5 c 128,-1,8 + 402 0 402 0 509 0 c 2,9,-1 + 589 0 l 1,10,-1 + 554 -150 l 1,11,-1 + 474 -150 l 2,12,13 + 430 -150 430 -150 398 -175.5 c 128,-1,14 + 366 -201 366 -201 355 -246 c 0,15,16 + 344 -295 344 -295 366 -318.5 c 128,-1,17 + 388 -342 388 -342 426 -342 c 0,18,19 + 433 -342 433 -342 453 -339 c 128,-1,20 + 473 -336 473 -336 489 -332 c 1,21,-1 + 499 -471 l 1,0,1 +EndSplineSet +EndChar + +StartChar: caron +Encoding: 336 711 225 +Width: 950 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 0 + 3 + 91 + 5 + 2 + 36 + 52 + 0 + 1 + 0 + 8 + 59 + 3 + 1 + 3 + 7 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +PUSHB_2 + 3 + 0 +MD[grid] +EVEN +IF +PUSHB_2 + 0 + 64 +SHPIX +EIF +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1299 1677 m 1,0,-1 + 890 1323 l 1,1,-1 + 672 1323 l 1,2,-1 + 426 1677 l 1,3,-1 + 628 1677 l 1,4,-1 + 818 1485 l 1,5,-1 + 1097 1677 l 1,6,-1 + 1299 1677 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: Lslash +Encoding: 274 321 226 +Width: 1126 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 11 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 375 -1 N 1 0 0 1 0 0 2 +EndChar + +StartChar: lslash +Encoding: 275 322 227 +Width: 635 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 376 -1 N 1 0 0 1 -18 0 2 +EndChar + +StartChar: Scaron +Encoding: 303 352 228 +Width: 1155 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 41 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 54 83 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 149 260 2 +EndChar + +StartChar: scaron +Encoding: 304 353 229 +Width: 932 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 0 + 40 + 16 + 40 + 2 + 0 + 41 + 63 + 41 + 64 + 41 + 3 + 63 + 46 + 1 + 63 + 46 + 1 +DELTAP1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 86 115 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 -44 -75 2 +EndChar + +StartChar: Zcaron +Encoding: 332 381 230 +Width: 1108 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 13 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 61 90 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 99 260 2 +EndChar + +StartChar: zcaron +Encoding: 333 382 231 +Width: 1020 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 0 + 12 + 16 + 12 + 2 + 63 + 13 + 1 + 63 + 18 + 1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 93 122 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 -13 -75 2 +EndChar + +StartChar: brokenbar +Encoding: 124 166 232 +Width: 778 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 6 + 5 + 1 + 2 + 16 + 7 + 63 + 0 + 1 + 0 + 58 + 5 + 1 + 8 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +671 690 m 1,0,-1 + 431 690 l 1,1,-1 + 620 1509 l 1,2,-1 + 860 1509 l 1,3,-1 + 671 690 l 1,0,-1 +418 -408 m 1,4,-1 + 178 -408 l 1,5,-1 + 367 412 l 1,6,-1 + 607 412 l 1,7,-1 + 418 -408 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: Eth +Encoding: 166 208 233 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 377 -1 N 1 0 0 1 0 0 2 +Refer: 39 68 N 1 0 0 1 0 0 2 +EndChar + +StartChar: eth +Encoding: 198 240 234 +Width: 1047 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 56 + 52 + 31 + 1 + 17 + 16 + 18 + 15 + 31 + 34 + 33 + 7 + 9 + 32 + 43 + 31 + 12 + 9 + 9 + 3 + 28 + 24 + 21 + 34 + 25 + 32 + 28 + 17 + 49 + 33 + 3 + 3 + 61 + 31 + 63 + 33 + 2 + 17 + 16 + 18 + 15 + 31 + 34 + 32 + 33 + 8 + 0 + 24 + 0 + 23 + 12 + 40 + 46 + 23 + 24 + 6 + 52 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1109 573 m 0,0,1 + 1030 287 1030 287 868.5 131 c 128,-1,2 + 707 -25 707 -25 471 -25 c 0,3,4 + 275 -25 275 -25 199.5 137 c 128,-1,5 + 124 299 124 299 176 528 c 0,6,7 + 233 776 233 776 376.5 923.5 c 128,-1,8 + 520 1071 520 1071 720 1071 c 0,9,10 + 788 1071 788 1071 838 1032 c 128,-1,11 + 888 993 888 993 907 954 c 1,12,13 + 920 1034 920 1034 916 1099.5 c 128,-1,14 + 912 1165 912 1165 891 1212 c 1,15,-1 + 780 1104 l 1,16,-1 + 713 1206 l 1,17,-1 + 812 1303 l 1,18,19 + 793 1315 793 1315 767 1320 c 128,-1,20 + 741 1325 741 1325 710 1325 c 0,21,22 + 659 1325 659 1325 609 1311.5 c 128,-1,23 + 559 1298 559 1298 497 1268 c 1,24,-1 + 550 1499 l 1,25,26 + 592 1518 592 1518 643 1532 c 128,-1,27 + 694 1546 694 1546 760 1546 c 0,28,29 + 833 1546 833 1546 894.5 1528.5 c 128,-1,30 + 956 1511 956 1511 993 1479 c 1,31,-1 + 1122 1599 l 1,32,-1 + 1207 1509 l 1,33,-1 + 1079 1391 l 1,34,35 + 1150 1286 1150 1286 1166 1107 c 128,-1,36 + 1182 928 1182 928 1139 705 c 0,37,38 + 1136 692 1136 692 1125.5 646 c 128,-1,39 + 1115 600 1115 600 1109 573 c 0,0,1 +802 532 m 0,40,41 + 830 655 830 655 814 755.5 c 128,-1,42 + 798 856 798 856 709 856 c 0,43,44 + 635 856 635 856 576.5 787.5 c 128,-1,45 + 518 719 518 719 474 528 c 0,46,47 + 437 369 437 369 451 266.5 c 128,-1,48 + 465 164 465 164 550 164 c 0,49,50 + 634 164 634 164 699 266.5 c 128,-1,51 + 764 369 764 369 802 532 c 0,40,41 +EndSplineSet +EndChar + +StartChar: Yacute +Encoding: 179 221 235 +Width: 1327 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 60 89 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 311 260 2 +EndChar + +StartChar: yacute +Encoding: 211 253 236 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 10 + 16 + 10 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 92 121 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 151 -71 2 +EndChar + +StartChar: Thorn +Encoding: 180 222 237 +Width: 1104 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 40 + 170 + 17 + 1 + 0 + 19 + 31 + 9 + 20 + 31 + 4 + 9 + 4 + 6 + 7 + 7 + 10 + 6 + 0 + 151 + 0 + 167 + 0 + 246 + 0 + 3 + 0 + 21 + 32 + 14 + 80 + 14 + 2 + 14 + 6 + 9 + 19 + 4 + 20 + 6 + 24 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1227 705 m 2,0,1 + 1186 528 1186 528 1042 421.5 c 128,-1,2 + 898 315 898 315 708 315 c 2,3,-1 + 523 315 l 1,4,-1 + 450 0 l 1,5,-1 + 134 0 l 1,6,-1 + 482 1509 l 1,7,-1 + 798 1509 l 1,8,-1 + 726 1194 l 1,9,-1 + 886 1194 l 2,10,11 + 1102 1194 1102 1194 1197 1090.5 c 128,-1,12 + 1292 987 1292 987 1241 768 c 2,13,-1 + 1227 705 l 2,0,1 +914 713 m 2,14,-1 + 929 776 l 2,15,16 + 952 877 952 877 915 936 c 128,-1,17 + 878 995 878 995 752 995 c 2,18,-1 + 680 995 l 1,19,-1 + 570 522 l 1,20,-1 + 643 522 l 2,21,22 + 750 522 750 522 820 565 c 128,-1,23 + 890 608 890 608 914 713 c 2,14,-1 +EndSplineSet +EndChar + +StartChar: thorn +Encoding: 212 254 238 +Width: 1145 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 49 + 6 + 16 + 22 + 16 + 122 + 1 + 3 + 9 + 16 + 26 + 25 + 6 + 3 + 3 + 14 + 64 + 11 + 96 + 14 + 22 + 47 + 14 + 13 + 29 + 32 + 3 + 3 + 8 + 18 + 96 + 33 + 1 + 0 + 23 + 16 + 18 + 64 + 18 + 112 + 18 + 3 + 18 + 8 + 11 + 26 + 6 + 22 + 8 + 32 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MIRP[min,rnd,black] +SRP0 +SMD +MDRP[min,grey] +SMD +SRP1 +SRP2 +SLOOP +IP +MIAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1170 520 m 2,0,1 + 1111 265 1111 265 969 124.5 c 128,-1,2 + 827 -16 827 -16 623 -16 c 0,3,4 + 572 -16 572 -16 515.5 0 c 128,-1,5 + 459 16 459 16 427 59 c 1,6,-1 + 335 -342 l 1,7,-1 + 51 -342 l 1,8,-1 + 479 1511 l 1,9,-1 + 762 1511 l 1,10,-1 + 629 933 l 1,11,12 + 715 1042 715 1042 796 1079 c 128,-1,13 + 877 1116 877 1116 955 1116 c 0,14,15 + 1122 1116 1122 1116 1185.5 989 c 128,-1,16 + 1249 862 1249 862 1199 644 c 2,17,-1 + 1170 520 l 2,0,1 +880 533 m 2,18,-1 + 896 602 l 2,19,20 + 936 775 936 775 902 832.5 c 128,-1,21 + 868 890 868 890 806 890 c 0,22,23 + 741 890 741 890 681.5 853 c 128,-1,24 + 622 816 622 816 590 765 c 1,25,-1 + 473 258 l 1,26,27 + 471 222 471 222 509 188 c 128,-1,28 + 547 154 547 154 616 154 c 0,29,30 + 684 154 684 154 754 222 c 128,-1,31 + 824 290 824 290 880 533 c 2,18,-1 +EndSplineSet +EndChar + +StartChar: minus +Encoding: 390 8722 239 +Width: 1188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 1 + 68 + 2 + 70 + 48 + 0 + 1 + 0 + 1 + 4 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1085 569 m 1,0,-1 + 104 569 l 1,1,-1 + 104 807 l 1,2,-1 + 1085 807 l 1,3,-1 + 1085 569 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: multiply +Encoding: 173 215 240 +Width: 1096 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 80 + 2 + 1 + 2 + 8 + 11 + 5 + 11 + 5 + 2 + 8 +RTHG +MDAP[rnd] +ALIGNRP +MDRP[rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +ALIGNRP +MDRP[rnd,grey] +MDRP[rnd,grey] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1019 438 m 1,0,-1 + 850 293 l 1,1,-1 + 674 545 l 1,2,-1 + 382 293 l 1,3,-1 + 280 438 l 1,4,-1 + 573 690 l 1,5,-1 + 397 942 l 1,6,-1 + 565 1087 l 1,7,-1 + 741 836 l 1,8,-1 + 1034 1087 l 1,9,-1 + 1135 942 l 1,10,-1 + 843 690 l 1,11,-1 + 1019 438 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: onesuperior +Encoding: 143 185 241 +Width: 697 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 3 + 210 + 4 + 7 + 14 + 1 + 81 + 0 + 99 + 7 + 3 + 144 + 1 + 1 + 1 + 1 + 10 + 9 +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +615 590 m 1,0,-1 + 404 590 l 1,1,-1 + 557 1251 l 1,2,-1 + 406 1251 l 1,3,-1 + 436 1380 l 1,4,5 + 552 1393 552 1393 608.5 1438 c 128,-1,6 + 665 1483 665 1483 677 1511 c 1,7,-1 + 828 1511 l 1,8,-1 + 615 590 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: twosuperior +Encoding: 136 178 242 +Width: 849 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 51 + 17 + 70 + 16 + 102 + 20 + 136 + 4 + 153 + 4 + 5 + 2 +PUSHW_1 + -16 +NPUSHB + 20 + 12 + 8 + 111 + 15 + 15 + 2 + 21 + 111 + 1 + 81 + 21 + 0 + 18 + 99 + 5 + 2 + 11 + 12 + 2 + 23 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,rnd,grey] +SHPIX +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +886 590 m 1,0,-1 + 267 590 l 1,1,-1 + 308 770 l 1,2,3 + 574 989 574 989 686.5 1075 c 128,-1,4 + 799 1161 799 1161 818 1247 c 0,5,6 + 831 1305 831 1305 809.5 1329.5 c 128,-1,7 + 788 1354 788 1354 737 1354 c 0,8,9 + 674 1354 674 1354 641.5 1325 c 128,-1,10 + 609 1296 609 1296 595 1268 c 1,11,-1 + 403 1268 l 1,12,13 + 452 1391 452 1391 563 1459.5 c 128,-1,14 + 674 1528 674 1528 790 1528 c 0,15,16 + 952 1528 952 1528 1007.5 1455 c 128,-1,17 + 1063 1382 1063 1382 1038 1270 c 0,18,19 + 1004 1124 1004 1124 793 962.5 c 128,-1,20 + 582 801 582 801 514 760 c 1,21,-1 + 925 760 l 1,22,-1 + 886 590 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: threesuperior +Encoding: 137 179 243 +Width: 849 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 72 + 36 + 1 + 36 + 34 + 51 + 1 + 51 + 34 + 68 + 34 + 86 + 34 + 169 + 31 + 7 + 38 + 17 + 75 + 15 + 18 + 31 + 18 + 2 + 18 + 73 + 18 + 3 + 32 + 29 + 71 + 25 + 94 + 32 + 15 + 64 + 7 + 1 + 7 + 71 + 10 + 94 + 6 + 3 + 82 + 36 + 38 + 52 + 38 + 2 + 38 + 18 + 18 + 0 + 6 + 35 + 93 + 95 + 22 + 1 + 22 + 0 + 99 + 48 + 13 + 1 + 13 + 6 + 28 + 29 + 7 + 6 + 41 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[grey] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +DELTAP1 +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +IP +SROUND +MDAP[rnd] +RTG +DELTAP1 +MIRP[rp0,min,rnd,black] +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +946 856 m 0,0,1 + 917 731 917 731 812.5 650 c 128,-1,2 + 708 569 708 569 559 569 c 0,3,4 + 468 569 468 569 394 608 c 128,-1,5 + 320 647 320 647 283 733 c 1,6,-1 + 434 827 l 1,7,8 + 461 772 461 772 498.5 748.5 c 128,-1,9 + 536 725 536 725 567 725 c 0,10,11 + 643 725 643 725 685.5 761 c 128,-1,12 + 728 797 728 797 744 866 c 0,13,14 + 762 942 762 942 718.5 965.5 c 128,-1,15 + 675 989 675 989 622 989 c 2,16,-1 + 535 989 l 1,17,-1 + 568 1133 l 1,18,-1 + 661 1133 l 2,19,20 + 735 1133 735 1133 775.5 1163.5 c 128,-1,21 + 816 1194 816 1194 830 1253 c 0,22,23 + 842 1305 842 1305 817 1334.5 c 128,-1,24 + 792 1364 792 1364 741 1364 c 0,25,26 + 676 1364 676 1364 644 1335.5 c 128,-1,27 + 612 1307 612 1307 592 1268 c 1,28,-1 + 406 1268 l 1,29,30 + 459 1395 459 1395 565.5 1461.5 c 128,-1,31 + 672 1528 672 1528 786 1528 c 0,32,33 + 929 1528 929 1528 987.5 1460.5 c 128,-1,34 + 1046 1393 1046 1393 1022 1286 c 0,35,36 + 1001 1194 1001 1194 955 1146 c 128,-1,37 + 909 1098 909 1098 861 1075 c 1,38,39 + 924 1044 924 1044 944 989 c 128,-1,40 + 964 934 964 934 946 856 c 0,0,1 +EndSplineSet +EndChar + +StartChar: onehalf +Encoding: 147 189 244 +Width: 1647 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 1 + 1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 242 178 N 1 0 0 1 685 -591 2 +Refer: 241 185 N 1 0 0 1 -67 0 2 +Refer: 188 8260 N 1 0 0 1 476 0 2 +EndChar + +StartChar: onequarter +Encoding: 146 188 245 +Width: 1647 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 48 + 3 + 48 + 13 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 374 8308 N 1 0 0 1 638 -590 2 +Refer: 241 185 N 1 0 0 1 -67 0 2 +Refer: 188 8260 N 1 0 0 1 518 0 2 +EndChar + +StartChar: threequarters +Encoding: 148 190 246 +Width: 1764 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 48 + 3 + 48 + 13 + 2 + 63 + 20 + 48 + 57 + 2 +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 374 8308 N 1 0 0 1 738 -593 2 +Refer: 243 179 N 1 0 0 1 -108 0 2 +Refer: 188 8260 N 1 0 0 1 628 0 2 +EndChar + +StartChar: franc +Encoding: 366 8355 247 +Width: 1110 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 80 + 12 + 1 + 0 + 12 + 1 + 48 + 15 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 41 70 N 1 0 0 1 0 0 2 +Refer: 377 -1 N 1 0 0 1 -83 -360 2 +EndChar + +StartChar: Gbreve +Encoding: 244 286 248 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 38 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 42 71 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 283 254 2 +EndChar + +StartChar: gbreve +Encoding: 245 287 249 +Width: 1337 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 0 + 47 + 16 + 47 + 32 + 47 + 48 + 47 + 4 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 113 -71 2 +EndChar + +StartChar: Idotaccent +Encoding: 260 304 250 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 9 + 48 + 7 + 1 + 63 + 17 + 1 + 63 + 10 + 1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 -73 256 2 +EndChar + +StartChar: Scedilla +Encoding: 301 350 251 +Width: 1155 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 54 83 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 23 -3 2 +EndChar + +StartChar: scedilla +Encoding: 302 351 252 +Width: 932 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 0 + 44 + 63 + 44 + 2 + 63 + 62 + 1 + 63 + 62 + 1 +DELTAP1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 86 115 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -117 9 2 +EndChar + +StartChar: Cacute +Encoding: 220 262 253 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 30 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 38 67 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 303 260 2 +EndChar + +StartChar: cacute +Encoding: 221 263 254 +Width: 1124 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 30 + 16 + 30 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 70 99 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 132 -71 2 +EndChar + +StartChar: Ccaron +Encoding: 226 268 255 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 31 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 38 67 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 201 260 2 +EndChar + +StartChar: ccaron +Encoding: 227 269 256 +Width: 1124 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 0 + 30 + 16 + 30 + 2 + 63 + 31 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 70 99 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 66 -71 2 +EndChar + +StartChar: dcroat +Encoding: 231 273 257 +Width: 1298 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 17 + 63 + 34 + 111 + 34 + 143 + 34 + 175 + 34 + 224 + 34 + 5 + 96 + 37 + 1 + 224 + 34 + 1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 71 100 N 1 0 0 1 0 0 2 +Refer: 377 -1 N 1 0 0 1 719 579 2 +EndChar + +StartChar: Amacron +Encoding: 214 256 258 +Width: 1358 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 204 248 2 +EndChar + +StartChar: amacron +Encoding: 215 257 259 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 0 + 45 + 16 + 45 + 2 + 16 + 49 + 63 + 49 + 192 + 49 + 240 + 49 + 4 + 0 + 45 + 16 + 45 + 2 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 99 -65 2 +EndChar + +StartChar: Abreve +Encoding: 216 258 260 +Width: 1358 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 208 247 2 +EndChar + +StartChar: abreve +Encoding: 217 259 261 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 0 + 47 + 16 + 47 + 32 + 47 + 48 + 47 + 4 + 0 + 50 + 16 + 50 + 2 + 16 + 59 + 63 + 59 + 192 + 59 + 240 + 59 + 4 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 101 -72 2 +EndChar + +StartChar: Aogonek +Encoding: 218 260 262 +Width: 1358 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 17 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 36 65 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 421 149 2 +EndChar + +StartChar: aogonek +Encoding: 219 261 263 +Width: 1238 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 47 + 50 + 1 + 16 + 67 + 63 + 67 + 192 + 67 + 240 + 67 + 4 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 68 97 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 481 148 2 +EndChar + +StartChar: Dcaron +Encoding: 228 270 264 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 39 68 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 147 261 2 +EndChar + +StartChar: dcaron +Encoding: 229 271 265 +Width: 1546 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 44 + 1 + 63 + 41 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 71 100 N 1 0 0 1 0 0 2 +Refer: 183 8217 N 1 0 0 1 1029 0 2 +EndChar + +StartChar: Dcroat +Encoding: 230 272 266 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 377 -1 N 1 0 0 1 0 0 2 +Refer: 39 68 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Emacron +Encoding: 232 274 267 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 163 250 2 +EndChar + +StartChar: emacron +Encoding: 233 275 268 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 32 + 16 + 32 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 144 -54 2 +EndChar + +StartChar: Edotaccent +Encoding: 236 278 269 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 164 231 2 +EndChar + +StartChar: edotaccent +Encoding: 237 279 270 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 34 + 16 + 34 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 111 -90 2 +EndChar + +StartChar: Eogonek +Encoding: 238 280 271 +Width: 1167 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 18 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 399 151 2 +EndChar + +StartChar: eogonek +Encoding: 239 281 272 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 170 129 2 +EndChar + +StartChar: Ecaron +Encoding: 240 282 273 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 158 260 2 +EndChar + +StartChar: ecaron +Encoding: 241 283 274 +Width: 1303 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 32 + 16 + 32 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 118 -71 2 +EndChar + +StartChar: Gcedilla +Encoding: 248 290 275 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 0 + 38 + 1 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 42 71 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 240 -6 2 +EndChar + +StartChar: gcedilla +Encoding: 249 291 276 +Width: 1337 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 15 + 45 + 31 + 45 + 111 + 45 + 127 + 45 + 143 + 45 + 207 + 45 + 239 + 45 + 255 + 45 + 8 + 47 + 45 + 63 + 45 + 64 + 45 + 127 + 45 + 143 + 45 + 223 + 45 + 6 + 15 + 45 + 1 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 182 8216 N 1 0 0 1 382 414 2 +EndChar + +StartChar: Imacron +Encoding: 256 298 277 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 6 + 1 + 63 + 9 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 -78 250 2 +EndChar + +StartChar: imacron +Encoding: 257 299 278 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 5 + 16 + 5 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 -228 -53 2 +EndChar + +StartChar: logonek +Encoding: 410 -1 279 +Width: 750 +GlyphClass: 1 +Flags: HW +TtInstrs: +PUSHB_3 + 63 + 27 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 -94 150 2 +EndChar + +StartChar: iogonek +Encoding: 259 303 280 +Width: 610 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 22 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 76 105 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 -139 150 2 +EndChar + +StartChar: IJ +Encoding: 262 306 281 +Width: 1536 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 45 74 N 1 0 0 1 562 0 2 +EndChar + +StartChar: ij +Encoding: 263 307 282 +Width: 1249 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 22 + 0 + 41 + 2 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 76 105 N 1 0 0 1 0 0 2 +Refer: 77 106 N 1 0 0 1 570 0 2 +EndChar + +StartChar: Inodot +Encoding: 411 -1 283 +Width: 750 +GlyphClass: 1 +Flags: HW +TtInstrs: +PUSHB_3 + 63 + 5 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +EndChar + +StartChar: idot +Encoding: 412 -1 284 +Width: 610 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 76 105 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Kcedilla +Encoding: 266 310 285 +Width: 1339 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 0 + 18 + 16 + 18 + 48 + 18 + 3 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 46 75 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -83 15 2 +EndChar + +StartChar: kcedilla +Encoding: 267 311 286 +Width: 1190 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 17 + 16 + 17 + 2 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 78 107 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -92 53 2 +EndChar + +StartChar: Lacute +Encoding: 268 313 287 +Width: 1126 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 11 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 81 260 2 +EndChar + +StartChar: lacute +Encoding: 269 314 288 +Width: 635 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 -66 261 2 +EndChar + +StartChar: Lcedilla +Encoding: 270 315 289 +Width: 1126 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 30 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -144 15 2 +EndChar + +StartChar: lcedilla +Encoding: 271 316 290 +Width: 635 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -184 9 2 +EndChar + +StartChar: Lcaron +Encoding: 272 317 291 +Width: 1126 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 18 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 183 8217 N 1 0 0 1 441 0 2 +EndChar + +StartChar: lcaron +Encoding: 273 318 292 +Width: 946 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 13 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 183 8217 N 1 0 0 1 378 0 2 +EndChar + +StartChar: Ldotaccent +Encoding: 413 -1 293 +Width: 1126 +GlyphClass: 1 +Flags: HW +TtInstrs: +PUSHB_3 + 48 + 19 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 297 -726 2 +EndChar + +StartChar: ldotaccent +Encoding: 414 -1 294 +Width: 940 +GlyphClass: 1 +Flags: HW +TtInstrs: +PUSHB_3 + 63 + 10 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 204 -777 2 +EndChar + +StartChar: Nacute +Encoding: 276 323 295 +Width: 1397 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 12 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 49 78 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 337 260 2 +EndChar + +StartChar: nacute +Encoding: 277 324 296 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 22 + 16 + 22 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 170 -71 2 +EndChar + +StartChar: Ncedilla +Encoding: 278 325 297 +Width: 1397 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 48 + 15 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 49 78 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -242 2 2 +EndChar + +StartChar: ncedilla +Encoding: 279 326 298 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -185 11 2 +EndChar + +StartChar: Ncaron +Encoding: 280 327 299 +Width: 1397 +GlyphClass: 1 +Flags: W +TtInstrs: +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 49 78 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 246 260 2 +EndChar + +StartChar: ncaron +Encoding: 281 328 300 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 20 + 16 + 20 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 121 -72 2 +EndChar + +StartChar: napostrophe +Encoding: 282 329 301 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 183 8217 N 1 0 0 1 372 332 2 +EndChar + +StartChar: Omacron +Encoding: 283 332 302 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 63 + 30 + 1 + 63 + 33 + 1 +DELTAP1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 218 175 N 1 0 0 1 273 267 2 +EndChar + +StartChar: omacron +Encoding: 284 333 303 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 29 + 16 + 29 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 177 -65 2 +EndChar + +StartChar: Ohungarumlaut +Encoding: 287 336 304 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 37 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 3 +Refer: 223 733 N 1 0 0 1 310 260 2 +EndChar + +StartChar: ohungarumlaut +Encoding: 288 337 305 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 0 + 30 + 0 + 34 + 16 + 30 + 16 + 34 + 4 + 48 + 30 + 48 + 34 + 2 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 223 733 N 1 0 0 1 177 -71 2 +EndChar + +StartChar: Racute +Encoding: 291 340 306 +Width: 1251 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 53 82 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 221 260 2 +EndChar + +StartChar: racute +Encoding: 292 341 307 +Width: 1020 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 85 114 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 42 -71 2 +EndChar + +StartChar: Rcedilla +Encoding: 293 342 308 +Width: 1251 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 53 82 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -175 -1 2 +EndChar + +StartChar: rcedilla +Encoding: 294 343 309 +Width: 1020 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 85 114 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -187 23 2 +EndChar + +StartChar: Rcircumflex +Encoding: 415 -1 310 +Width: 1251 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 53 82 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 107 260 2 +EndChar + +StartChar: rcircumflex +Encoding: 416 -1 311 +Width: 1020 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 85 114 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 49 -71 2 +EndChar + +StartChar: Sacute +Encoding: 297 346 312 +Width: 1155 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 54 83 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 183 260 2 +EndChar + +StartChar: sacute +Encoding: 298 347 313 +Width: 932 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 0 + 40 + 16 + 40 + 2 + 63 + 40 + 1 + 63 + 43 + 1 + 63 + 43 + 1 +DELTAP1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 86 115 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 24 -72 2 +EndChar + +StartChar: Tcedilla +Encoding: 305 354 314 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 55 84 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 20 17 2 +EndChar + +StartChar: tcedilla +Encoding: 306 355 315 +Width: 850 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 30 + 16 + 30 + 2 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 87 116 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 -10 13 2 +EndChar + +StartChar: Tcaron +Encoding: 307 356 316 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 55 84 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 82 260 2 +EndChar + +StartChar: tcaronaltone +Encoding: 417 -1 317 +Width: 850 +GlyphClass: 1 +Flags: HW +TtInstrs: +PUSHB_3 + 63 + 26 + 1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 87 116 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 -90 251 2 +EndChar + +StartChar: Umacron +Encoding: 313 362 318 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 20 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 267 266 2 +EndChar + +StartChar: umacron +Encoding: 314 363 319 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_5 + 0 + 20 + 16 + 20 + 2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 108 -56 2 +EndChar + +StartChar: Uring +Encoding: 317 366 320 +Width: 1343 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 31 + 223 + 24 + 223 + 37 + 2 + 144 + 24 + 144 + 37 + 2 + 63 + 24 + 63 + 37 + 80 + 24 + 80 + 37 + 96 + 24 + 96 + 37 + 208 + 24 + 208 + 37 + 224 + 24 + 224 + 37 + 10 +DELTAP1 +DELTAP3 +DELTAP2 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 221 730 N 1 0 0 1 276 223 2 +EndChar + +StartChar: uring +Encoding: 318 367 321 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 22 + 0 + 23 + 0 + 41 + 16 + 23 + 16 + 41 + 4 + 191 + 20 + 191 + 38 + 2 + 207 + 20 + 207 + 38 + 2 + 96 + 45 + 1 +DELTAP1 +DELTAP1 +DELTAP2 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 221 730 N 1 0 0 1 117 -89 2 +EndChar + +StartChar: Uhungarumlaut +Encoding: 319 368 322 +Width: 1343 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 223 733 N 1 0 0 1 285 260 2 +EndChar + +StartChar: uhungarumlaut +Encoding: 320 369 323 +Width: 1296 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 0 + 22 + 0 + 26 + 16 + 22 + 16 + 26 + 4 + 96 + 29 + 1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 223 733 N 1 0 0 1 90 -71 2 +EndChar + +StartChar: Ucedilla +Encoding: 418 -1 324 +Width: 1343 +GlyphClass: 1 +Flags: HW +TtInstrs: +PUSHB_3 + 0 + 24 + 1 +SVTCA[x-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 186 8 2 +EndChar + +StartChar: ucedilla +Encoding: 419 -1 325 +Width: 1296 +GlyphClass: 1 +Flags: HW +TtInstrs: +PUSHB_5 + 48 + 25 + 96 + 44 + 2 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 222 184 N 1 0 0 1 470 14 2 +EndChar + +StartChar: Zacute +Encoding: 328 377 326 +Width: 1108 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 61 90 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 187 260 2 +EndChar + +StartChar: zacute +Encoding: 329 378 327 +Width: 1020 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 0 + 12 + 16 + 12 + 2 + 63 + 12 + 1 + 63 + 15 + 1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 93 122 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 17 -71 2 +EndChar + +StartChar: Zdotaccent +Encoding: 330 379 328 +Width: 1108 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_3 + 63 + 16 + 1 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 61 90 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 126 245 2 +EndChar + +StartChar: zdotaccent +Encoding: 331 380 329 +Width: 1020 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 0 + 13 + 16 + 13 + 2 + 63 + 16 + 1 + 63 + 23 + 1 +DELTAP1 +DELTAP1 +SVTCA[y-axis] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 93 122 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 -5 -101 2 +EndChar + +StartChar: coloncur +Encoding: 420 -1 330 +Width: 1292 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 53 + 15 + 1 + 28 + 31 + 35 + 35 + 10 + 29 + 30 + 33 + 34 + 3 + 14 + 40 + 17 + 30 + 13 + 40 + 10 + 11 + 27 + 40 + 24 + 30 + 0 + 40 + 3 + 1 + 29 + 31 + 28 + 16 + 30 + 1 + 0 + 30 + 16 + 30 + 2 + 30 + 34 + 33 + 35 + 32 + 15 + 34 + 31 + 34 + 2 + 34 + 6 + 14 + 0 + 0 + 16 + 0 + 160 + 0 + 192 + 0 + 4 + 0 + 7 + 21 + 21 + 21 + 2 + 21 + 21 + 223 + 6 + 1 + 6 + 36 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP2 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,grey] +DELTAP1 +MDRP[rp0,min,rnd,black] +IP +IP +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +DELTAP1 +MDRP[rp0,min,rnd,black] +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +MIAP[rnd] +MIRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MIRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1229 90 m 1,0,1 + 1153 39 1153 39 1049.5 7 c 128,-1,2 + 946 -25 946 -25 801 -25 c 0,3,4 + 430 -25 430 -25 254 165.5 c 128,-1,5 + 78 356 78 356 78 717 c 2,6,-1 + 78 778 l 2,7,8 + 78 1118 78 1118 267.5 1324 c 128,-1,9 + 457 1530 457 1530 829 1530 c 0,10,11 + 956 1530 956 1530 1054.5 1495 c 128,-1,12 + 1153 1460 1153 1460 1229 1407 c 1,13,-1 + 1229 1135 l 1,14,15 + 1149 1210 1149 1210 1064 1249 c 128,-1,16 + 979 1288 979 1288 881 1288 c 0,17,18 + 627 1288 627 1288 527.5 1149 c 128,-1,19 + 428 1010 428 1010 428 758 c 2,20,-1 + 428 737 l 2,21,22 + 428 467 428 467 532.5 344 c 128,-1,23 + 637 221 637 221 834 221 c 0,24,25 + 967 221 967 221 1070.5 266 c 128,-1,26 + 1174 311 1174 311 1229 360 c 1,27,-1 + 1229 90 l 1,0,1 +1178 1731 m 1,28,-1 + 854 -188 l 1,29,-1 + 698 -188 l 1,30,-1 + 1022 1731 l 1,31,-1 + 1178 1731 l 1,28,-1 +858 1731 m 1,32,-1 + 535 -188 l 1,33,-1 + 379 -188 l 1,34,-1 + 702 1731 l 1,35,-1 + 858 1731 l 1,32,-1 +EndSplineSet +EndChar + +StartChar: cruzeiro +Encoding: 365 8354 331 +Width: 1389 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 378 -1 N 1 0 0 1 0 0 2 +Refer: 38 67 N 1 0 0 1 0 0 2 +EndChar + +StartChar: pesetas +Encoding: 367 8359 332 +Width: 1622 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 104 + 23 + 38 + 89 + 41 + 44 + 42 + 68 + 30 + 70 + 27 + 33 + 31 + 34 + 3 + 81 + 46 + 78 + 62 + 59 + 65 + 65 + 78 + 59 + 46 + 4 + 49 + 68 + 72 + 75 + 94 + 71 + 68 + 112 + 53 + 70 + 56 + 89 + 52 + 49 + 3 + 18 + 31 + 4 + 4 + 6 + 7 + 17 + 31 + 7 + 10 + 6 + 0 + 81 + 46 + 78 + 62 + 59 + 65 + 72 + 70 + 46 + 93 + 59 + 78 + 93 + 53 + 65 + 37 + 22 + 30 + 37 + 44 + 24 + 88 + 42 + 41 + 39 + 37 + 6 + 6 + 0 + 22 + 0 + 39 + 0 + 3 + 0 + 21 + 16 + 12 + 32 + 12 + 64 + 12 + 112 + 12 + 4 + 12 + 6 + 18 + 4 + 20 + 6 + 84 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +SRP0 +MDRP[min,rnd,grey] +MDRP[rp0,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1338 1040 m 2,0,1 + 1300 877 1300 877 1179 785.5 c 128,-1,2 + 1058 694 1058 694 835 694 c 2,3,-1 + 610 694 l 1,4,-1 + 450 0 l 1,5,-1 + 134 0 l 1,6,-1 + 482 1509 l 1,7,-1 + 1043 1509 l 2,8,9 + 1247 1509 1247 1509 1325 1415 c 128,-1,10 + 1403 1321 1403 1321 1371 1180 c 2,11,-1 + 1338 1040 l 2,0,1 +1047 1059 m 2,12,-1 + 1066 1143 l 2,13,14 + 1086 1229 1086 1229 1048.5 1259.5 c 128,-1,15 + 1011 1290 1011 1290 908 1290 c 2,16,-1 + 748 1290 l 1,17,-1 + 658 901 l 1,18,-1 + 836 901 l 2,19,20 + 910 901 910 901 969.5 942 c 128,-1,21 + 1029 983 1029 983 1047 1059 c 2,12,-1 +1172 444 m 1,22,-1 + 985 444 l 1,23,-1 + 966 362 l 2,24,25 + 943 264 943 264 951.5 226 c 128,-1,26 + 960 188 960 188 1004 188 c 0,27,28 + 1029 188 1029 188 1053 192.5 c 128,-1,29 + 1077 197 1077 197 1111 211 c 1,30,-1 + 1069 31 l 1,31,32 + 1033 6 1033 6 994.5 -2 c 128,-1,33 + 956 -10 956 -10 902 -10 c 0,34,35 + 755 -10 755 -10 721 91.5 c 128,-1,36 + 687 193 687 193 731 383 c 2,37,-1 + 745 446 l 1,38,-1 + 618 446 l 1,39,-1 + 656 610 l 1,40,-1 + 803 618 l 1,41,-1 + 909 872 l 1,42,-1 + 1084 872 l 1,43,-1 + 1026 621 l 1,44,-1 + 1213 621 l 1,45,-1 + 1172 444 l 1,22,-1 +1624 205 m 0,46,47 + 1602 109 1602 109 1525.5 50.5 c 128,-1,48 + 1449 -8 1449 -8 1300 -8 c 0,49,50 + 1237 -8 1237 -8 1189 3 c 128,-1,51 + 1141 14 1141 14 1122 31 c 1,52,-1 + 1164 211 l 1,53,54 + 1188 197 1188 197 1231 179.5 c 128,-1,55 + 1274 162 1274 162 1323 162 c 0,56,57 + 1361 162 1361 162 1389.5 171 c 128,-1,58 + 1418 180 1418 180 1424 207 c 0,59,60 + 1431 236 1431 236 1396 251 c 128,-1,61 + 1361 266 1361 266 1340 274 c 0,62,63 + 1259 303 1259 303 1242.5 362.5 c 128,-1,64 + 1226 422 1226 422 1245 504 c 0,65,66 + 1264 588 1264 588 1334 645 c 128,-1,67 + 1404 702 1404 702 1526 702 c 0,68,69 + 1584 702 1584 702 1625 691 c 128,-1,70 + 1666 680 1666 680 1690 666 c 1,71,-1 + 1653 506 l 1,72,73 + 1630 522 1630 522 1586.5 532.5 c 128,-1,74 + 1543 543 1543 543 1502 543 c 0,75,76 + 1473 543 1473 543 1450 533.5 c 128,-1,77 + 1427 524 1427 524 1420 494 c 0,78,79 + 1414 467 1414 467 1430.5 456.5 c 128,-1,80 + 1447 446 1447 446 1490 430 c 0,81,82 + 1596 393 1596 393 1618.5 336 c 128,-1,83 + 1641 279 1641 279 1624 205 c 0,46,47 +EndSplineSet +EndChar + +StartChar: rupees +Encoding: 421 -1 333 +Width: 1729 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 81 + 3 + 11 + 20 + 11 + 37 + 11 + 3 + 64 + 29 + 61 + 45 + 42 + 48 + 48 + 61 + 42 + 29 + 4 + 32 + 51 + 55 + 58 + 94 + 54 + 51 + 112 + 36 + 70 + 39 + 89 + 35 + 32 + 3 + 16 + 5 + 31 + 25 + 25 + 7 + 8 + 24 + 31 + 8 + 10 + 0 + 7 + 0 + 64 + 29 + 61 + 45 + 42 + 48 + 55 + 70 + 29 + 93 + 42 + 61 + 93 + 36 + 48 + 7 + 16 + 20 + 13 + 0 + 25 + 1 + 13 + 24 + 32 + 20 + 1 + 20 + 7 + 25 + 5 + 20 + 7 + 67 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +IP +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1180 0 m 1,0,-1 + 844 0 l 1,1,2 + 840 365 840 365 774.5 521.5 c 128,-1,3 + 709 678 709 678 567 678 c 2,4,-1 + 487 678 l 1,5,-1 + 487 0 l 1,6,-1 + 147 0 l 1,7,-1 + 147 1509 l 1,8,-1 + 741 1509 l 2,9,10 + 958 1509 958 1509 1048.5 1415 c 128,-1,11 + 1139 1321 1139 1321 1139 1184 c 2,12,-1 + 1139 1102 l 2,13,14 + 1139 973 1139 973 1060 895 c 128,-1,15 + 981 817 981 817 823 803 c 1,16,17 + 1001 750 1001 750 1090.5 567.5 c 128,-1,18 + 1180 385 1180 385 1180 0 c 1,0,-1 +829 1071 m 2,19,-1 + 829 1112 l 2,20,21 + 829 1210 829 1210 777 1252 c 128,-1,22 + 725 1294 725 1294 623 1294 c 2,23,-1 + 487 1294 l 1,24,-1 + 487 895 l 1,25,-1 + 604 895 l 2,26,27 + 725 895 725 895 777 939 c 128,-1,28 + 829 983 829 983 829 1071 c 2,19,-1 +1698 199 m 0,29,30 + 1698 102 1698 102 1630.5 44 c 128,-1,31 + 1563 -14 1563 -14 1403 -14 c 0,32,33 + 1335 -14 1335 -14 1281 -3 c 128,-1,34 + 1227 8 1227 8 1202 25 c 1,35,-1 + 1202 205 l 1,36,37 + 1231 190 1231 190 1282 173 c 128,-1,38 + 1333 156 1333 156 1386 156 c 0,39,40 + 1427 156 1427 156 1455 165 c 128,-1,41 + 1483 174 1483 174 1483 201 c 0,42,43 + 1483 229 1483 229 1442 244.5 c 128,-1,44 + 1401 260 1401 260 1376 268 c 0,45,46 + 1282 297 1282 297 1249.5 356.5 c 128,-1,47 + 1217 416 1217 416 1217 498 c 0,48,49 + 1217 582 1217 582 1278 639 c 128,-1,50 + 1339 696 1339 696 1470 696 c 0,51,52 + 1532 696 1532 696 1579 685 c 128,-1,53 + 1626 674 1626 674 1655 659 c 1,54,-1 + 1655 500 l 1,55,56 + 1626 516 1626 516 1577 526.5 c 128,-1,57 + 1528 537 1528 537 1483 537 c 0,58,59 + 1452 537 1452 537 1429.5 527.5 c 128,-1,60 + 1407 518 1407 518 1407 487 c 0,61,62 + 1407 461 1407 461 1427.5 450.5 c 128,-1,63 + 1448 440 1448 440 1499 424 c 0,64,65 + 1622 387 1622 387 1660 329.5 c 128,-1,66 + 1698 272 1698 272 1698 199 c 0,29,30 +EndSplineSet +EndChar + +StartChar: pesoph +Encoding: 422 -1 334 +Width: 1374 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 43 + 217 + 20 + 249 + 20 + 2 + 24 + 32 + 23 + 23 + 7 + 18 + 31 + 4 + 4 + 6 + 7 + 17 + 31 + 7 + 10 + 6 + 0 + 22 + 39 + 0 + 1 + 0 + 21 + 6 + 12 + 22 + 12 + 32 + 12 + 3 + 12 + 6 + 18 + 4 + 20 + 23 + 6 + 26 +SRP0 +MDRP[rp0,rnd,white] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[min,rnd,black] +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1188 877 m 2,0,1 + 1188 713 1188 713 1080.5 621.5 c 128,-1,2 + 973 530 973 530 733 530 c 2,3,-1 + 487 530 l 1,4,-1 + 487 0 l 1,5,-1 + 147 0 l 1,6,-1 + 147 1509 l 1,7,-1 + 754 1509 l 2,8,9 + 973 1509 973 1509 1080.5 1417 c 128,-1,10 + 1188 1325 1188 1325 1188 1159 c 2,11,-1 + 1188 877 l 2,0,1 +870 895 m 2,12,-1 + 870 1122 l 2,13,14 + 870 1208 870 1208 822 1249 c 128,-1,15 + 774 1290 774 1290 664 1290 c 2,16,-1 + 487 1290 l 1,17,-1 + 487 737 l 1,18,-1 + 682 737 l 2,19,20 + 762 737 762 737 816 778 c 128,-1,21 + 870 819 870 819 870 895 c 2,12,-1 +1307 924 m 1,22,-1 + 94 924 l 1,23,-1 + 94 1100 l 1,24,-1 + 1307 1100 l 1,25,-1 + 1307 924 l 1,22,-1 +EndSplineSet +EndChar + +StartChar: rupiah +Encoding: 405 63197 335 +Width: 2183 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 77 + 3 + 11 + 5 + 45 + 20 + 11 + 22 + 45 + 37 + 11 + 5 + 54 + 55 + 35 + 3 + 32 + 43 + 64 + 40 + 96 + 43 + 51 + 34 + 43 + 38 + 38 + 7 + 8 + 58 + 33 + 32 + 3 + 37 + 18 + 16 + 5 + 31 + 25 + 25 + 7 + 8 + 24 + 31 + 8 + 10 + 0 + 7 + 0 + 29 + 23 + 47 + 37 + 39 + 40 + 55 + 35 + 24 + 192 + 37 + 1 + 37 + 7 + 16 + 20 + 13 + 0 + 25 + 1 + 13 + 24 + 20 + 7 + 25 + 5 + 20 + 7 + 61 +SRP0 +MDRP[rp0,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IP +MIAP[rnd] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,rnd,grey] +MIRP[min,rnd,black] +SRP0 +SMD +MDRP[min,grey] +SMD +SRP1 +SRP2 +SLOOP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1118 0 m 1,0,-1 + 782 0 l 1,1,2 + 778 365 778 365 723 521.5 c 128,-1,3 + 668 678 668 678 526 678 c 2,4,-1 + 487 678 l 1,5,-1 + 487 0 l 1,6,-1 + 147 0 l 1,7,-1 + 147 1509 l 1,8,-1 + 700 1509 l 2,9,10 + 868 1509 868 1509 972.5 1422 c 128,-1,11 + 1077 1335 1077 1335 1077 1184 c 2,12,-1 + 1077 1102 l 2,13,14 + 1077 973 1077 973 998.5 895 c 128,-1,15 + 920 817 920 817 762 803 c 1,16,17 + 940 750 940 750 1029 567.5 c 128,-1,18 + 1118 385 1118 385 1118 0 c 1,0,-1 +768 1071 m 2,19,-1 + 768 1112 l 2,20,21 + 768 1210 768 1210 726 1252 c 128,-1,22 + 684 1294 684 1294 582 1294 c 2,23,-1 + 487 1294 l 1,24,-1 + 487 895 l 1,25,-1 + 563 895 l 2,26,27 + 684 895 684 895 726 939 c 128,-1,28 + 768 983 768 983 768 1071 c 2,19,-1 +2142 434 m 2,29,30 + 2142 207 2142 207 2018 96.5 c 128,-1,31 + 1894 -14 1894 -14 1722 -14 c 0,32,33 + 1663 -14 1663 -14 1592.5 2 c 128,-1,34 + 1522 18 1522 18 1473 61 c 1,35,-1 + 1473 -342 l 1,36,-1 + 1174 -342 l 1,37,-1 + 1174 926 l 1,38,-1 + 1460 926 l 1,39,-1 + 1468 813 l 1,40,41 + 1513 874 1513 874 1575.5 911 c 128,-1,42 + 1638 948 1638 948 1753 948 c 0,43,44 + 1939 948 1939 948 2040.5 824 c 128,-1,45 + 2142 700 2142 700 2142 526 c 2,46,-1 + 2142 434 l 2,29,30 +1812 446 m 2,47,-1 + 1812 481 l 2,48,49 + 1812 608 1812 608 1766 665.5 c 128,-1,50 + 1720 723 1720 723 1626 723 c 0,51,52 + 1559 723 1559 723 1529 696.5 c 128,-1,53 + 1499 670 1499 670 1473 625 c 1,54,-1 + 1473 248 l 1,55,56 + 1489 221 1489 221 1526 198.5 c 128,-1,57 + 1563 176 1563 176 1606 176 c 0,58,59 + 1704 176 1704 176 1758 233.5 c 128,-1,60 + 1812 291 1812 291 1812 446 c 2,47,-1 +EndSplineSet +EndChar + +StartChar: blank +Encoding: 423 -1 336 +Width: 1364 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 15 + 4 + 217 + 1 + 18 + 6 + 2 + 0 + 5 + 217 + 0 + 9 + 3 + 217 + 1 + 8 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1206 -350 m 1,0,-1 + 162 -350 l 1,1,-1 + 162 0 l 1,2,-1 + 352 0 l 1,3,-1 + 352 -162 l 1,4,-1 + 1014 -162 l 1,5,-1 + 1014 0 l 1,6,-1 + 1206 0 l 1,7,-1 + 1206 -350 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: pageup +Encoding: 377 8670 337 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 40 + 9 + 12 + 201 + 6 + 15 + 19 + 5 + 16 + 201 + 2 + 19 + 19 + 11 + 20 + 1 + 20 + 22 + 15 + 11 + 218 + 22 + 10 + 11 + 3 + 8 + 2 + 6 + 0 + 10 + 200 + 11 + 17 + 13 + 21 + 19 + 15 + 11 + 11 + 24 + 23 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MIRP[rp0,min,rnd,black] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1259 1043 m 1,0,-1 + 904 1043 l 1,1,-1 + 904 822 l 1,2,-1 + 1199 822 l 1,3,-1 + 1199 614 l 1,4,-1 + 904 614 l 1,5,-1 + 904 442 l 1,6,-1 + 1199 442 l 1,7,-1 + 1199 234 l 1,8,-1 + 904 234 l 1,9,-1 + 904 -171 l 1,10,-1 + 636 -171 l 1,11,-1 + 636 234 l 1,12,-1 + 341 234 l 1,13,-1 + 341 442 l 1,14,-1 + 636 442 l 1,15,-1 + 636 614 l 1,16,-1 + 341 614 l 1,17,-1 + 341 822 l 1,18,-1 + 636 822 l 1,19,-1 + 636 1043 l 1,20,-1 + 281 1043 l 1,21,-1 + 770 1536 l 1,22,-1 + 1259 1043 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: capslock +Encoding: 385 8682 338 +Width: 2388 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 56 + 6 + 88 + 6 + 200 + 6 + 249 + 6 + 4 + 73 + 6 + 185 + 6 + 2 + 55 + 5 + 1 + 7 + 9 + 204 + 1 + 4 + 70 + 4 + 6 + 11 + 204 + 3 + 16 + 25 + 8 + 221 + 8 + 2 + 8 + 6 + 15 + 15 + 204 + 21 + 20 + 204 + 16 + 0 + 8 + 6 + 12 + 11 + 7 + 0 + 2 + 19 + 12 + 202 + 17 + 2 + 23 + 9 + 5 + 3 + 20 + 11 + 202 + 16 + 3 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +MDRP[grey] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +SRP2 +IP +SROUND +MDAP[rnd] +RTG +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2220 512 m 1,0,-1 + 1708 512 l 1,1,-1 + 1708 172 l 1,2,-1 + 684 172 l 1,3,-1 + 684 512 l 1,4,-1 + 172 512 l 1,5,-1 + 1196 1536 l 1,6,-1 + 2220 512 l 1,0,-1 +1806 684 m 1,7,-1 + 1196 1294 l 1,8,-1 + 584 683 l 1,9,-1 + 852 684 l 1,10,-1 + 852 340 l 1,11,-1 + 1536 340 l 1,12,-1 + 1536 684 l 1,13,-1 + 1806 684 l 1,7,-1 +1708 -512 m 1,14,-1 + 684 -512 l 1,15,-1 + 684 0 l 1,16,-1 + 1708 0 l 1,17,-1 + 1708 -512 l 1,14,-1 +1536 -340 m 1,18,-1 + 1536 -172 l 1,19,-1 + 852 -172 l 1,20,-1 + 852 -340 l 1,21,-1 + 1536 -340 l 1,18,-1 +EndSplineSet +EndChar + +StartChar: arrowupwhite +Encoding: 2 5 339 +Width: 2188 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 54 + 56 + 6 + 88 + 6 + 170 + 8 + 200 + 6 + 249 + 6 + 5 + 73 + 6 + 185 + 6 + 2 + 55 + 5 + 1 + 7 + 9 + 204 + 1 + 4 + 4 + 6 + 11 + 204 + 3 + 0 + 25 + 8 + 221 + 8 + 2 + 8 + 6 + 15 + 8 + 6 + 12 + 11 + 7 + 0 + 12 + 202 + 2 + 15 + 9 + 5 + 11 + 202 + 3 + 14 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[grey] +DELTAP1 +MIAP[rnd] +MIRP[min,rnd,black] +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2118 512 m 1,0,-1 + 1606 512 l 1,1,-1 + 1606 0 l 1,2,-1 + 582 0 l 1,3,-1 + 582 512 l 1,4,-1 + 70 512 l 1,5,-1 + 1094 1536 l 1,6,-1 + 2118 512 l 1,0,-1 +1704 684 m 1,7,-1 + 1094 1294 l 1,8,-1 + 482 683 l 1,9,-1 + 750 684 l 1,10,-1 + 750 172 l 1,11,-1 + 1434 172 l 1,12,-1 + 1434 684 l 1,13,-1 + 1704 684 l 1,7,-1 +EndSplineSet +EndChar + +StartChar: propellor +Encoding: 12 17 340 +Width: 1876 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 55 + 31 + 59 + 204 + 43 + 72 + 47 + 20 + 95 + 20 + 2 + 20 + 27 + 51 + 63 + 204 + 36 + 27 + 15 + 78 + 8 + 86 + 204 + 44 + 73 + 32 + 19 + 80 + 19 + 2 + 19 + 12 + 82 + 93 + 204 + 3 + 12 + 0 + 55 + 44 + 78 + 205 + 32 + 70 + 47 + 7 + 1 + 7 + 0 + 48 + 74 + 205 + 39 + 15 + 0 + 1 + 0 + 97 + 59 + 19 + 86 + 205 + 31 + 73 + 32 + 8 + 1 + 8 + 15 + 66 + 90 + 205 + 24 + 176 + 15 + 1 + 15 + 96 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1708 340 m 0,0,1 + 1708 203 1708 203 1607.5 101.5 c 128,-1,2 + 1507 0 1507 0 1366 0 c 0,3,4 + 1227 0 1227 0 1125.5 100.5 c 128,-1,5 + 1024 201 1024 201 1024 340 c 2,6,-1 + 1024 512 l 1,7,-1 + 854 512 l 1,8,-1 + 854 340 l 2,9,10 + 854 203 854 203 753.5 101.5 c 128,-1,11 + 653 0 653 0 512 0 c 0,12,13 + 373 0 373 0 272.5 100.5 c 128,-1,14 + 172 201 172 201 172 340 c 0,15,16 + 172 483 172 483 272.5 583.5 c 128,-1,17 + 373 684 373 684 512 684 c 2,18,-1 + 684 684 l 1,19,-1 + 684 852 l 1,20,-1 + 512 852 l 2,21,22 + 371 852 371 852 271.5 954.5 c 128,-1,23 + 172 1057 172 1057 172 1194 c 0,24,25 + 172 1335 172 1335 272.5 1435.5 c 128,-1,26 + 373 1536 373 1536 512 1536 c 256,27,28 + 651 1536 651 1536 752.5 1435.5 c 128,-1,29 + 854 1335 854 1335 854 1196 c 2,30,-1 + 854 1024 l 1,31,-1 + 1024 1024 l 1,32,-1 + 1024 1196 l 2,33,34 + 1024 1335 1024 1335 1125.5 1435.5 c 128,-1,35 + 1227 1536 1227 1536 1364 1536 c 0,36,37 + 1505 1536 1505 1536 1606.5 1435.5 c 128,-1,38 + 1708 1335 1708 1335 1708 1196 c 256,39,40 + 1708 1057 1708 1057 1607.5 954.5 c 128,-1,41 + 1507 852 1507 852 1364 852 c 2,42,-1 + 1196 852 l 1,43,-1 + 1196 684 l 1,44,-1 + 1366 684 l 2,45,46 + 1505 684 1505 684 1606.5 582.5 c 128,-1,47 + 1708 481 1708 481 1708 340 c 0,0,1 +1536 1196 m 256,48,49 + 1536 1266 1536 1266 1486 1315 c 128,-1,50 + 1436 1364 1436 1364 1366 1364 c 256,51,52 + 1296 1364 1296 1364 1246 1315 c 128,-1,53 + 1196 1266 1196 1266 1196 1196 c 2,54,-1 + 1196 1024 l 1,55,-1 + 1366 1024 l 2,56,57 + 1438 1024 1438 1024 1487 1075 c 128,-1,58 + 1536 1126 1536 1126 1536 1196 c 256,48,49 +684 1024 m 1,59,-1 + 684 1196 l 2,60,61 + 684 1266 684 1266 633 1315 c 128,-1,62 + 582 1364 582 1364 512 1364 c 256,63,64 + 442 1364 442 1364 392 1315 c 128,-1,65 + 342 1266 342 1266 342 1196 c 0,66,67 + 342 1124 342 1124 392 1074 c 128,-1,68 + 442 1024 442 1024 512 1024 c 2,69,-1 + 684 1024 l 1,59,-1 +1024 684 m 1,70,-1 + 1024 852 l 1,71,-1 + 854 852 l 1,72,-1 + 854 684 l 1,73,-1 + 1024 684 l 1,70,-1 +1536 340 m 0,74,75 + 1536 412 1536 412 1486 462 c 128,-1,76 + 1436 512 1436 512 1366 512 c 2,77,-1 + 1196 512 l 1,78,-1 + 1196 340 l 2,79,80 + 1196 270 1196 270 1246 221 c 128,-1,81 + 1296 172 1296 172 1366 172 c 256,82,83 + 1436 172 1436 172 1486 222 c 128,-1,84 + 1536 272 1536 272 1536 340 c 0,74,75 +684 340 m 2,85,-1 + 684 512 l 1,86,-1 + 512 512 l 2,87,88 + 440 512 440 512 391 461 c 128,-1,89 + 342 410 342 410 342 340 c 256,90,91 + 342 270 342 270 392 221 c 128,-1,92 + 442 172 442 172 512 172 c 256,93,94 + 582 172 582 172 633 221 c 128,-1,95 + 684 270 684 270 684 340 c 2,85,-1 +EndSplineSet +EndChar + +StartChar: clear +Encoding: 21 28 341 +Width: 2220 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 93 + 38 + 22 + 41 + 34 + 2 + 28 + 22 + 34 + 26 + 4 + 32 + 29 + 17 + 12 + 16 + 13 + 11 + 25 + 20 + 21 + 29 + 204 + 18 + 15 + 14 + 11 + 15 + 2 + 7 + 3 + 6 + 18 + 27 + 33 + 35 + 32 + 204 + 1 + 4 + 5 + 8 + 0 + 11 + 14 + 15 + 18 + 1 + 4 + 5 + 8 + 29 + 21 + 20 + 25 + 27 + 33 + 35 + 32 + 16 + 12 + 13 + 16 + 17 + 3 + 6 + 28 + 22 + 26 + 34 + 10 + 7 + 6 + 2 + 22 + 2 + 2 + 2 + 11 + 7 + 25 + 7 + 2 + 7 + 0 + 9 + 23 + 205 + 0 + 37 + 31 + 205 + 9 + 36 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +MDAP[rnd] +DELTAP1 +MDAP[rnd] +DELTAP1 +SRP2 +SLOOP +IP +SLOOP +IP +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[grey] +MDRP[grey] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[grey] +MDRP[grey] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2048 0 m 1,0,-1 + 1694 0 l 1,1,-1 + 1851 -252 l 1,2,-1 + 1708 -340 l 1,3,-1 + 1493 0 l 1,4,-1 + 727 0 l 1,5,-1 + 512 -340 l 1,6,-1 + 367 -252 l 1,7,-1 + 524 0 l 1,8,-1 + 172 0 l 1,9,-1 + 172 1536 l 1,10,-1 + 524 1536 l 1,11,-1 + 367 1788 l 1,12,-1 + 512 1876 l 1,13,-1 + 727 1536 l 1,14,-1 + 1493 1536 l 1,15,-1 + 1708 1876 l 1,16,-1 + 1851 1788 l 1,17,-1 + 1694 1536 l 1,18,-1 + 2048 1536 l 1,19,-1 + 2048 0 l 1,0,-1 +1384 1364 m 1,20,-1 + 834 1364 l 1,21,-1 + 1110 928 l 1,22,-1 + 1384 1364 l 1,20,-1 +1878 172 m 1,23,-1 + 1878 1364 l 1,24,-1 + 1587 1364 l 1,25,-1 + 1210 768 l 1,26,-1 + 1587 172 l 1,27,-1 + 1878 172 l 1,23,-1 +1010 768 m 1,28,-1 + 633 1364 l 1,29,-1 + 342 1364 l 1,30,-1 + 342 172 l 1,31,-1 + 633 172 l 1,32,-1 + 1010 768 l 1,28,-1 +1384 172 m 1,33,-1 + 1110 608 l 1,34,-1 + 834 172 l 1,35,-1 + 1384 172 l 1,33,-1 +EndSplineSet +EndChar + +StartChar: arrowleft +Encoding: 371 8592 342 +Width: 2048 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 15 + 3 + 1 + 5 + 2 + 1 + 219 + 4 + 5 + 220 + 0 + 8 + 5 + 1 + 3 + 7 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1880 624 m 1,0,-1 + 668 624 l 1,1,-1 + 668 270 l 1,2,-1 + 172 768 l 1,3,-1 + 668 1266 l 1,4,-1 + 668 912 l 1,5,-1 + 1880 912 l 1,6,-1 + 1880 624 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: arrowright +Encoding: 373 8594 343 +Width: 2048 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 342 8592 N -1 0 0 1 2051 0 2 +EndChar + +StartChar: enter +Encoding: 424 -1 344 +Width: 2220 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 37 + 57 + 5 + 54 + 7 + 73 + 5 + 70 + 7 + 4 + 4 + 8 + 5 + 7 + 43 + 6 + 1 + 6 + 9 + 9 + 1 + 9 + 1 + 221 + 2 + 10 + 6 + 9 + 4 + 8 + 5 + 4 + 0 + 11 + 7 + 8 + 1 + 10 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,rnd,grey] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,rnd,grey] +MDRP[grey] +SRP1 +SRP2 +IP +IP +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rp0,grey] +DELTAP1 +MDRP[grey] +DELTAP1 +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rp0,min,grey] +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2048 1234 m 1,0,-1 + 172 1234 l 1,1,-1 + 172 1506 l 1,2,-1 + 2048 1506 l 1,3,-1 + 2048 1234 l 1,0,-1 +1922 424 m 1,4,-1 + 1725 227 l 1,5,-1 + 1110 844 l 1,6,-1 + 495 227 l 1,7,-1 + 296 424 l 1,8,-1 + 1110 1234 l 1,9,-1 + 1922 424 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: arrowupleft +Encoding: 375 8624 345 +Width: 1876 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 88 + 2 + 1 + 6 + 2 + 4 + 3 + 3 + 1 + 5 + 0 + 87 + 1 + 103 + 1 + 119 + 1 + 3 + 1 + 5 + 10 + 6 + 2 + 3 + 5 + 5 + 0 + 3 + 1 + 0 + 8 + 3 + 7 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,white] +RTDG +MDRP[min,grey] +RTG +SRP1 +SRP2 +IP +RTDG +MDAP[rnd] +SRP2 +IP +IP +RTG +SVTCA[y-axis] +MIAP[rnd] +MDAP[no-rnd] +DELTAP1 +MDRP[grey] +SRP1 +SRP2 +IP +RTDG +MDAP[rnd] +SRP2 +IP +IP +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1681 207 m 1,0,-1 + 1473 -1 l 1,1,-1 + 420 1050 l 1,2,-1 + 172 802 l 1,3,-1 + 172 1506 l 1,4,-1 + 876 1506 l 1,5,-1 + 628 1258 l 1,6,-1 + 1681 207 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: arrowtableft +Encoding: 1 3 346 +AltUni2: 0021e4.ffffffff.0 0021e4.ffffffff.0 +Width: 2048 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 20 + 3 + 1 + 5 + 8 + 2 + 1 + 219 + 9 + 4 + 5 + 220 + 0 + 12 + 5 + 1 + 3 + 7 + 221 + 8 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +SVTCA[y-axis] +MIAP[rnd] +MDRP[min,rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[min,rnd,grey] +MDRP[min,rnd,grey] +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1956 624 m 1,0,-1 + 1002 624 l 1,1,-1 + 1002 270 l 1,2,-1 + 506 768 l 1,3,-1 + 1002 1266 l 1,4,-1 + 1002 912 l 1,5,-1 + 1956 912 l 1,6,-1 + 1956 624 l 1,0,-1 +451 172 m 1,7,-1 + 171 172 l 1,8,-1 + 171 1364 l 1,9,-1 + 451 1364 l 1,10,-1 + 451 172 l 1,7,-1 +EndSplineSet +EndChar + +StartChar: arrowtabright +Encoding: 0 2 347 +AltUni2: 0021e5.ffffffff.0 0021e5.ffffffff.0 +Width: 2048 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +92 624 m 1,0,-1 + 92 912 l 1,1,-1 + 1046 912 l 1,2,-1 + 1046 1266 l 1,3,-1 + 1542 768 l 1,4,-1 + 1046 270 l 1,5,-1 + 1046 624 l 1,6,-1 + 92 624 l 1,0,-1 +1597 172 m 1,7,-1 + 1597 1364 l 1,8,-1 + 1877 1364 l 1,9,-1 + 1877 172 l 1,10,-1 + 1597 172 l 1,7,-1 +EndSplineSet +EndChar + +StartChar: help +Encoding: 425 -1 348 +Width: 1734 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 84 + 44 + 14 + 34 + 16 + 34 + 20 + 44 + 22 + 58 + 35 + 53 + 49 + 102 + 49 + 7 + 95 + 43 + 1 + 43 + 70 + 40 + 203 + 44 + 70 + 63 + 47 + 1 + 47 + 31 + 52 + 217 + 0 + 51 + 16 + 51 + 48 + 51 + 3 + 51 + 47 + 51 + 3 + 9 + 21 + 201 + 3 + 211 + 15 + 201 + 9 + 24 + 201 + 94 + 37 + 143 + 37 + 2 + 37 + 51 + 112 + 30 + 1 + 30 + 31 + 50 + 201 + 43 + 16 + 51 + 144 + 51 + 2 + 51 + 51 + 0 + 6 + 12 + 201 + 0 + 211 + 18 + 201 + 6 + 54 +SRP0 +MDRP[rp0,rnd,white] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[min,rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,white] +MDAP[rnd] +DELTAP1 +SROUND +MDRP[rnd,grey] +RTG +MIRP[rp0,min,rnd,black] +SROUND +MDRP[rnd,grey] +RTG +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1717 765 m 256,0,1 + 1717 415 1717 415 1469.5 167.5 c 128,-1,2 + 1222 -80 1222 -80 872 -80 c 256,3,4 + 522 -80 522 -80 274.5 167.5 c 128,-1,5 + 27 415 27 415 27 765 c 256,6,7 + 27 1115 27 1115 274.5 1362.5 c 128,-1,8 + 522 1610 522 1610 872 1610 c 256,9,10 + 1222 1610 1222 1610 1469.5 1362.5 c 128,-1,11 + 1717 1115 1717 1115 1717 765 c 256,0,1 +1505 765 m 0,12,13 + 1505 1030 1505 1030 1319 1217 c 128,-1,14 + 1133 1404 1133 1404 872 1404 c 0,15,16 + 603 1404 603 1404 421 1219 c 128,-1,17 + 239 1034 239 1034 239 765 c 0,18,19 + 239 497 239 497 421 312 c 128,-1,20 + 603 127 603 127 872 127 c 0,21,22 + 1149 127 1149 127 1327 310.5 c 128,-1,23 + 1505 494 1505 494 1505 765 c 0,12,13 +1160 982 m 0,24,25 + 1160 894 1160 894 1059 824.5 c 128,-1,26 + 958 755 958 755 958 704 c 0,27,28 + 958 647 958 647 958 624 c 128,-1,29 + 958 601 958 601 958 601 c 1,30,-1 + 766 601 l 1,31,32 + 766 601 766 601 767 629 c 128,-1,33 + 768 657 768 657 768 710 c 0,34,35 + 768 771 768 771 857 841.5 c 128,-1,36 + 946 912 946 912 946 967 c 0,37,38 + 946 1025 946 1025 918 1038.5 c 128,-1,39 + 890 1052 890 1052 847 1052 c 0,40,41 + 778 1052 778 1052 704.5 1013 c 128,-1,42 + 631 974 631 974 587 930 c 1,43,-1 + 587 1106 l 1,44,45 + 631 1148 631 1148 702.5 1183.5 c 128,-1,46 + 774 1219 774 1219 868 1219 c 0,47,48 + 989 1219 989 1219 1074.5 1157 c 128,-1,49 + 1160 1095 1160 1095 1160 982 c 0,24,25 +982 304 m 1,50,-1 + 774 304 l 1,51,-1 + 774 497 l 1,52,-1 + 982 497 l 1,53,-1 + 982 304 l 1,50,-1 +EndSplineSet +EndChar + +StartChar: arrowup +Encoding: 372 8593 349 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 17 + 1 + 4 + 6 + 15 + 3 + 218 + 6 + 2 + 3 + 0 + 2 + 219 + 5 + 3 + 3 + 8 + 7 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[min,rnd,grey] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1266 1040 m 1,0,-1 + 912 1040 l 1,1,-1 + 912 -171 l 1,2,-1 + 624 -171 l 1,3,-1 + 624 1040 l 1,4,-1 + 270 1040 l 1,5,-1 + 768 1536 l 1,6,-1 + 1266 1040 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: arrowdownright +Encoding: 376 8627 350 +Width: 1876 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 30 + 41 + 6 + 1 + 5 + 2 + 1 + 6 + 6 + 4 + 1 + 3 + 4 + 10 + 5 + 2 + 0 + 1 + 1 + 0 + 3 + 4 + 121 + 3 + 140 + 3 + 2 + 3 + 7 + 0 + 8 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,white] +DELTAP1 +RTDG +MDRP[min,grey] +RTG +SRP1 +SRP2 +IP +RTDG +MDAP[rnd] +SRP2 +IP +IP +RTG +SVTCA[y-axis] +MIAP[no-rnd] +MDRP[grey] +MDAP[rnd] +SRP2 +IP +RTDG +MDAP[rnd] +SRP2 +IP +IP +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1710 0 m 1,0,-1 + 1006 0 l 1,1,-1 + 1254 248 l 1,2,-1 + 201 1299 l 1,3,-1 + 409 1507 l 1,4,-1 + 1462 456 l 1,5,-1 + 1710 704 l 1,6,-1 + 1710 0 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: arrowdown +Encoding: 374 8595 351 +Width: 1536 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1267 323 m 1,0,-1 + 769 -173 l 1,1,-1 + 271 323 l 1,2,-1 + 625 323 l 1,3,-1 + 625 1534 l 1,4,-1 + 913 1534 l 1,5,-1 + 913 323 l 1,6,-1 + 1267 323 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: control +Encoding: 3 6 352 +Width: 1558 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 21 + 4 + 2 + 0 + 3 + 5 + 1 + 3 + 5 + 15 + 48 + 0 + 96 + 0 + 2 + 0 + 7 + 47 + 4 + 1 + 4 + 6 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +PUSHB_2 + 4 + 0 +MD[grid] +EVEN +IF +PUSHB_2 + 0 + 64 +SHPIX +EIF +RTG +SVTCA[y-axis] +MIAP[rnd] +MDAP[rnd] +MDRP[rnd,grey] +SRP2 +SLOOP +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1456 852 m 1,0,-1 + 1238 634 l 1,1,-1 + 772 1100 l 1,2,-1 + 306 634 l 1,3,-1 + 88 852 l 1,4,-1 + 772 1536 l 1,5,-1 + 1456 852 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: deleteleft +Encoding: 16 23 353 +Width: 2644 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 99 + 9 + 14 + 9 + 16 + 70 + 8 + 72 + 16 + 84 + 8 + 135 + 10 + 136 + 14 + 136 + 15 + 136 + 16 + 135 + 20 + 135 + 21 + 11 + 10 + 11 + 10 + 13 + 5 + 17 + 5 + 19 + 71 + 17 + 71 + 19 + 85 + 17 + 85 + 19 + 136 + 11 + 136 + 12 + 136 + 13 + 135 + 17 + 135 + 18 + 135 + 19 + 14 + 21 + 18 + 8 + 15 + 21 + 3 + 2 + 2 + 1 + 3 + 7 + 203 + 47 + 3 + 79 + 3 + 95 + 3 + 127 + 3 + 4 + 3 + 15 + 9 + 203 + 1 + 0 + 21 + 15 + 12 + 18 + 8 + 2 + 9 + 7 + 1 + 3 + 18 + 3 + 0 + 2 + 5 + 205 + 0 + 23 + 2 + 22 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[grey] +MDRP[grey] +SRP2 +IP +RTHG +MDAP[rnd] +ALIGNRP +MDRP[grey] +MDRP[grey] +RTG +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MIAP[rnd] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +RTHG +MDAP[rnd] +SLOOP +ALIGNRP +MDRP[grey] +MDRP[grey] +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2476 0 m 1,0,-1 + 940 0 l 1,1,-1 + 172 768 l 1,2,-1 + 940 1536 l 1,3,-1 + 2476 1536 l 1,4,-1 + 2476 0 l 1,0,-1 +2304 167 m 1,5,-1 + 2304 1369 l 1,6,-1 + 1024 1369 l 1,7,-1 + 423 768 l 1,8,-1 + 1024 167 l 1,9,-1 + 2304 167 l 1,5,-1 +2019 406 m 1,10,-1 + 1898 285 l 1,11,-1 + 1536 647 l 1,12,-1 + 1176 285 l 1,13,-1 + 1055 406 l 1,14,-1 + 1415 768 l 1,15,-1 + 1055 1130 l 1,16,-1 + 1176 1251 l 1,17,-1 + 1536 889 l 1,18,-1 + 1898 1251 l 1,19,-1 + 2019 1130 l 1,20,-1 + 1657 768 l 1,21,-1 + 2019 406 l 1,10,-1 +EndSplineSet +EndChar + +StartChar: deleteright +Encoding: 7 10 354 +Width: 2644 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +172 0 m 1,0,-1 + 172 1536 l 1,1,-1 + 1708 1536 l 1,2,-1 + 2476 768 l 1,3,-1 + 1708 0 l 1,4,-1 + 172 0 l 1,0,-1 +344 167 m 1,5,-1 + 1624 167 l 1,6,-1 + 2225 768 l 1,7,-1 + 1624 1369 l 1,8,-1 + 344 1369 l 1,9,-1 + 344 167 l 1,5,-1 +629 406 m 1,10,-1 + 991 768 l 1,11,-1 + 629 1130 l 1,12,-1 + 750 1251 l 1,13,-1 + 1112 889 l 1,14,-1 + 1472 1251 l 1,15,-1 + 1593 1130 l 1,16,-1 + 1233 768 l 1,17,-1 + 1593 406 l 1,18,-1 + 1472 285 l 1,19,-1 + 1112 647 l 1,20,-1 + 750 285 l 1,21,-1 + 629 406 l 1,10,-1 +EndSplineSet +EndChar + +StartChar: option +Encoding: 4 7 355 +Width: 2328 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 1 + 6 + 200 + 2 + 8 + 10 + 200 + 5 + 0 + 1 + 1 + 9 + 6 + 5 + 10 + 5 + 4 + 7 + 0 + 4 + 13 + 7 + 12 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +SVTCA[y-axis] +MIAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2188 1204 m 1,0,-1 + 1334 1204 l 1,1,-1 + 1334 1476 l 1,2,-1 + 2188 1476 l 1,3,-1 + 2188 1204 l 1,0,-1 +2188 0 m 1,4,-1 + 1375 0 l 1,5,-1 + 695 1204 l 1,6,-1 + 140 1204 l 1,7,-1 + 140 1476 l 1,8,-1 + 845 1476 l 1,9,-1 + 1525 272 l 1,10,-1 + 2188 272 l 1,11,-1 + 2188 0 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: escape +Encoding: 20 27 356 +AltUni2: 00241b.ffffffff.0 00241b.ffffffff.0 +Width: 1876 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 77 + 8 + 5 + 6 + 25 + 40 + 5 + 51 + 1 + 56 + 3 + 72 + 3 + 88 + 3 + 105 + 3 + 120 + 5 + 136 + 5 + 152 + 3 + 11 + 6 + 2 + 3 + 3 + 0 + 4 + 1 + 1 + 13 + 48 + 13 + 2 + 13 + 1 + 13 + 10 + 24 + 54 + 17 + 1 + 17 + 223 + 10 + 23 + 223 + 4 + 24 + 15 + 1 + 6 + 2 + 5 + 5 + 4 + 0 + 24 + 0 + 24 + 7 + 13 + 57 + 20 + 1 + 20 + 223 + 7 + 14 + 223 + 4 + 144 + 13 + 1 + 13 + 27 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDAP[rnd] +SRP2 +IP +MDAP[rnd] +IP +IP +MDRP[grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP1 +SRP2 +IP +IP +MDAP[rnd] +DELTAP1 +MDAP[rnd] +SRP2 +IP +IP +MDAP[rnd] +IP +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1029 857 m 1,0,-1 + 849 677 l 1,1,-1 + 382 1144 l 1,2,-1 + 172 932 l 1,3,-1 + 172 1536 l 1,4,-1 + 774 1536 l 1,5,-1 + 562 1324 l 1,6,-1 + 1029 857 l 1,0,-1 +1708 768 m 0,7,8 + 1708 453 1708 453 1485.5 226.5 c 128,-1,9 + 1263 0 1263 0 940 0 c 0,10,11 + 637 0 637 0 414 203.5 c 128,-1,12 + 191 407 191 407 172 768 c 1,13,-1 + 402 768 l 1,14,15 + 415 512 415 512 574 371 c 128,-1,16 + 733 230 733 230 940 230 c 0,17,18 + 1153 230 1153 230 1314.5 379.5 c 128,-1,19 + 1476 529 1476 529 1476 768 c 0,20,21 + 1476 979 1476 979 1333 1135.5 c 128,-1,22 + 1190 1292 1190 1292 940 1305 c 1,23,-1 + 940 1536 l 1,24,25 + 1300 1526 1300 1526 1504 1288 c 128,-1,26 + 1708 1050 1708 1050 1708 768 c 0,7,8 +EndSplineSet +EndChar + +StartChar: glyph357 +Encoding: 426 -1 357 +Width: 2220 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 64 + 55 + 4 + 71 + 4 + 87 + 4 + 103 + 4 + 119 + 4 + 135 + 4 + 151 + 4 + 166 + 4 + 8 + 39 + 4 + 55 + 4 + 71 + 4 + 86 + 4 + 118 + 4 + 134 + 4 + 6 + 0 + 7 + 98 + 1 + 8 + 98 + 0 + 0 + 1 + 4 + 2 + 6 + 3 + 2 + 200 + 5 + 6 + 8 + 200 + 10 + 10 + 7 + 1 + 8 + 10 + 4 + 0 + 4 + 0 + 12 + 2 + 6 + 4 + 11 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +SRP1 +SRP2 +SLOOP +IP +MDAP[rnd] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +DELTAP1 +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2147 1416 m 1,0,-1 + 1343 382 l 1,1,-1 + 628 382 l 1,2,-1 + 628 22 l 1,3,-1 + 132 516 l 1,4,-1 + 628 1014 l 1,5,-1 + 628 654 l 1,6,-1 + 1229 654 l 1,7,-1 + 1604 1152 l 1,8,-1 + 1062 1152 l 1,9,-1 + 1062 1416 l 1,10,-1 + 2147 1416 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph358 +Encoding: 427 -1 358 +Width: 2220 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +99 1416 m 1,0,-1 + 1184 1416 l 1,1,-1 + 1184 1152 l 1,2,-1 + 642 1152 l 1,3,-1 + 1017 654 l 1,4,-1 + 1618 654 l 1,5,-1 + 1618 1014 l 1,6,-1 + 2114 516 l 1,7,-1 + 1618 22 l 1,8,-1 + 1618 382 l 1,9,-1 + 903 382 l 1,10,-1 + 99 1416 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: apple +Encoding: 15 20 359 +Width: 1810 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 44 + 22 + 30 + 56 + 18 + 69 + 19 + 70 + 30 + 4 + 15 + 48 + 54 + 48 + 87 + 48 + 2 + 15 + 48 + 27 + 36 + 12 + 9 + 39 + 42 + 36 + 24 + 21 + 27 + 1 + 0 + 9 + 9 + 54 + 33 + 54 + 48 + 15 + 86 + 33 + 102 + 33 + 2 + 33 + 57 +SRP0 +MDRP[rp0,min,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IP +DELTAP1 +RTHG +MDAP[rnd] +MDAP[rnd] +RTG +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1217 1642 m 0,0,1 + 1217 1579 1217 1579 1187 1503 c 128,-1,2 + 1157 1427 1157 1427 1092 1362 c 0,3,4 + 1065 1335 1065 1335 1037.5 1316.5 c 128,-1,5 + 1010 1298 1010 1298 981 1288 c 0,6,7 + 965 1282 965 1282 938 1278 c 128,-1,8 + 911 1274 911 1274 874 1272 c 1,9,10 + 877 1423 877 1423 954.5 1535 c 128,-1,11 + 1032 1647 1032 1647 1210 1688 c 1,12,13 + 1214 1673 1214 1673 1215.5 1664 c 128,-1,14 + 1217 1655 1217 1655 1217 1642 c 0,0,1 +1604 440 m 1,15,16 + 1585 379 1585 379 1552.5 314.5 c 128,-1,17 + 1520 250 1520 250 1477 184 c 0,18,19 + 1411 82 1411 82 1344.5 33 c 128,-1,20 + 1278 -16 1278 -16 1212 -16 c 0,21,22 + 1161 -16 1161 -16 1070 16.5 c 128,-1,23 + 979 49 979 49 915 49 c 0,24,25 + 852 49 852 49 769 14.5 c 128,-1,26 + 686 -20 686 -20 633 -20 c 0,27,28 + 555 -20 555 -20 478 46.5 c 128,-1,29 + 401 113 401 113 326 246 c 0,30,31 + 250 377 250 377 212 506 c 128,-1,32 + 174 635 174 635 174 762 c 0,33,34 + 174 997 174 997 290 1144.5 c 128,-1,35 + 406 1292 406 1292 582 1292 c 0,36,37 + 657 1292 657 1292 762.5 1261.5 c 128,-1,38 + 868 1231 868 1231 905 1231 c 0,39,40 + 950 1231 950 1231 1051.5 1265.5 c 128,-1,41 + 1153 1300 1153 1300 1229 1300 c 0,42,43 + 1290 1300 1290 1300 1344.5 1284 c 128,-1,44 + 1399 1268 1399 1268 1446 1235 c 0,45,46 + 1470 1217 1470 1217 1499 1190 c 128,-1,47 + 1528 1163 1528 1163 1554 1130 c 1,48,49 + 1513 1098 1513 1098 1484.5 1066 c 128,-1,50 + 1456 1034 1456 1034 1438 1010 c 0,51,52 + 1405 963 1405 963 1387.5 909.5 c 128,-1,53 + 1370 856 1370 856 1370 799 c 0,54,55 + 1370 672 1370 672 1441.5 569.5 c 128,-1,56 + 1513 467 1513 467 1604 440 c 1,15,16 +EndSplineSet +EndChar + +StartChar: glyph360 +Encoding: 428 -1 360 +Width: 1708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 89 + 27 + 15 + 85 + 16 + 121 + 6 + 136 + 6 + 152 + 6 + 168 + 6 + 6 + 20 + 17 + 17 + 15 + 18 + 15 + 18 + 15 + 13 + 4 + 5 + 217 + 10 + 10 + 1 + 2 + 6 + 11 + 225 + 3 + 13 + 225 + 1 + 3 + 8 + 6 + 24 + 6 + 40 + 6 + 56 + 6 + 88 + 6 + 5 + 6 + 217 + 10 + 14 + 32 + 20 + 48 + 20 + 2 + 20 + 15 + 16 + 15 + 17 + 31 + 17 + 47 + 17 + 63 + 17 + 4 + 17 + 4 + 15 + 20 + 15 + 2 + 15 + 10 + 15 + 0 + 1 + 5 + 8 + 225 + 0 + 22 + 13 + 225 + 1 + 21 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IP +RTHG +MDAP[rnd] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +RTG +MDRP[rp0,min,rnd,grey] +RTHG +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +RTG +MDRP[rp0,min,rnd,grey] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +DELTAP1 +MDRP[grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MIRP[min,rnd,black] +SHP[rp2] +SRP2 +IP +IP +MDAP[rnd] +MDAP[rnd] +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1586 -50 m 1,0,-1 + 122 -50 l 1,1,-1 + 122 1586 l 1,2,-1 + 1110 1586 l 1,3,-1 + 1586 1108 l 1,4,-1 + 1586 -50 l 1,0,-1 +1300 1108 m 1,5,-1 + 1024 1384 l 1,6,-1 + 1024 1108 l 1,7,-1 + 1300 1108 l 1,5,-1 +1366 170 m 1,8,-1 + 1366 915 l 1,9,-1 + 819 915 l 1,10,-1 + 819 1364 l 1,11,-1 + 342 1364 l 1,12,-1 + 342 170 l 1,13,-1 + 1366 170 l 1,8,-1 +1216 599 m 1,14,-1 + 854 239 l 1,15,-1 + 492 599 l 1,16,-1 + 664 599 l 1,17,-1 + 664 771 l 1,18,-1 + 1044 771 l 1,19,-1 + 1044 599 l 1,20,-1 + 1216 599 l 1,14,-1 +EndSplineSet +EndChar + +StartChar: pagedown +Encoding: 378 8671 361 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 32 + 55 + 22 + 71 + 22 + 87 + 22 + 103 + 22 + 119 + 22 + 135 + 22 + 151 + 22 + 7 + 39 + 22 + 54 + 22 + 71 + 22 + 86 + 22 + 103 + 22 + 119 + 22 + 134 + 22 + 151 + 22 + 8 +SVTCA[y-axis] +DELTAP2 +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +Refer: 337 8670 N 1 0 0 -1 0 1325 2 +EndChar + +StartChar: checkmark +Encoding: 13 18 362 +Width: 1886 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 138 + 0 + 185 + 5 + 2 + 52 + 4 + 1 + 4 + 200 + 3 + 4 + 1 + 50 + 5 + 134 + 5 + 2 + 5 + 200 + 183 + 0 + 1 + 0 + 0 + 1 + 4 + 200 + 1 + 7 + 3 + 1 + 3 + 200 + 2 + 2 + 1 + 3 + 2 + 4 + 0 + 4 + 1 + 5 + 1 + 0 + 5 + 0 + 3 + 2 + 1 + 4 + 4 + 0 + 2 + 0 + 7 + 2 + 6 +SRP0 +MDRP[rp0,rnd,white] +SRP0 +MDRP[rp0,rnd,white] +SRP1 +SRP2 +IP +RTHG +MDAP[rnd] +ALIGNRP +RTG +SRP2 +IP +SRP2 +IP +SVTCA[y-axis] +MIAP[rnd] +MDAP[rnd] +SRP2 +SLOOP +IP +SPVTL[orthog] +SRP0 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +MIRP[rp0,min,rnd,black] +SPVTL[orthog] +SFVTCA[x-axis] +SRP0 +DELTAP1 +MIRP[rp0,min,rnd,black] +DELTAP1 +SRP0 +SFVTL[parallel] +MIRP[rp0,min,rnd,black] +DELTAP1 +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1792 1196 m 1,0,-1 + 596 0 l 1,1,-1 + 84 512 l 1,2,-1 + 279 707 l 1,3,-1 + 596 394 l 1,4,-1 + 1596 1389 l 1,5,-1 + 1792 1196 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph363 +Encoding: 429 -1 363 +Width: 2220 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 44 + 7 + 5 + 9 + 9 + 0 + 8 + 176 + 8 + 2 + 8 + 17 + 200 + 5 + 6 + 16 + 12 + 1 + 200 + 13 + 2 + 0 + 15 + 32 + 15 + 2 + 15 + 15 + 7 + 16 + 7 + 5 + 9 + 0 + 0 + 4 + 16 + 12 + 10 + 226 + 4 + 20 + 1 + 16 + 19 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDAP[rnd] +MDRP[min,rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1115 1214 m 1,0,-1 + 91 1214 l 1,1,-1 + 91 1476 l 1,2,-1 + 1115 1476 l 1,3,-1 + 1115 1214 l 1,0,-1 +2050 385 m 1,4,-1 + 1119 385 l 1,5,-1 + 1119 26 l 1,6,-1 + 632 516 l 1,7,-1 + 1119 1006 l 1,8,-1 + 1119 647 l 1,9,-1 + 1800 647 l 1,10,-1 + 1800 1214 l 1,11,-1 + 1456 1214 l 1,12,-1 + 1456 1476 l 1,13,-1 + 2050 1476 l 1,14,-1 + 2050 385 l 1,4,-1 +517 385 m 1,15,-1 + 91 385 l 1,16,-1 + 91 647 l 1,17,-1 + 517 647 l 1,18,-1 + 517 385 l 1,15,-1 +EndSplineSet +EndChar + +StartChar: glyph364 +Encoding: 430 -1 364 +Width: 2220 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 17 + 56 + 7 + 72 + 7 + 88 + 7 + 105 + 7 + 120 + 7 + 136 + 7 + 152 + 7 + 168 + 7 + 8 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +Refer: 363 -1 N -1 0 0 1 2221 0 2 +EndChar + +StartChar: glyph365 +Encoding: 431 -1 365 +Width: 1364 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 3 + 224 + 4 + 1 + 9 + 10 + 7 + 0 + 9 + 223 + 1 + 0 + 12 + 8 + 223 + 4 + 5 + 12 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[rp0,rnd,white] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1366 -241 m 1,0,-1 + 1196 -241 l 1,1,-1 + 1196 -485 l 1,2,-1 + 172 -485 l 1,3,-1 + 172 -241 l 1,4,-1 + 0 -241 l 1,5,-1 + 0 0 l 1,6,-1 + 398 0 l 1,7,-1 + 398 -241 l 1,8,-1 + 970 -241 l 1,9,-1 + 970 0 l 1,10,-1 + 1366 0 l 1,11,-1 + 1366 -241 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: blackdiamond +Encoding: 14 19 366 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 1 + 222 + 3 + 222 + 0 + 2 + 0 + 222 + 2 + 222 + 1 + 3 +RTHG +MDAP[rnd] +ALIGNRP +MIRP[rnd,grey] +MIRP[rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +ALIGNRP +MIRP[rnd,grey] +MIRP[rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1366 596 m 1,0,-1 + 768 0 l 1,1,-1 + 172 596 l 1,2,-1 + 768 1196 l 1,3,-1 + 1366 596 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: uniE12E +Encoding: 432 57646 367 +Width: 1836 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 99 + 5 + 8 + 22 + 8 + 20 + 52 + 20 + 56 + 37 + 16 + 37 + 17 + 41 + 20 + 42 + 26 + 36 + 55 + 37 + 56 + 58 + 16 + 73 + 37 + 70 + 55 + 85 + 17 + 84 + 55 + 118 + 34 + 16 + 0 + 3 + 30 + 42 + 36 + 6 + 4 + 15 + 21 + 48 + 204 + 38 + 24 + 1 + 24 + 21 + 45 + 51 + 204 + 3 + 27 + 21 + 55 + 60 + 1 + 60 + 204 + 12 + 15 + 63 + 57 + 204 + 9 + 15 + 1 + 0 + 3 + 3 + 33 + 18 + 36 + 205 + 7 + 6 + 1 + 6 + 42 + 205 + 30 + 39 + 205 + 73 + 33 + 103 + 33 + 2 + 33 + 30 + 6 + 102 + 54 + 1 + 54 + 205 + 18 + 66 +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP0 +MIRP[rp0,min,grey] +SRP0 +DELTAP1 +MIRP[rp0,min,grey] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +DELTAP1 +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +SLOOP +IP +SRP0 +MDRP[rnd,grey] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1250.87011719 1690.28027344 m 1,0,1 + 1264.63964844 1529.89941406 1264.63964844 1529.89941406 1155.29003906 1399.48925781 c 128,-1,2 + 1045.93945312 1269.08007812 1045.93945312 1269.08007812 894.469726562 1275.56054688 c 1,3,4 + 883.129882812 1428.64941406 883.129882812 1428.64941406 986 1548.53027344 c 128,-1,5 + 1088.87011719 1668.41015625 1088.87011719 1668.41015625 1250.87011719 1690.28027344 c 1,0,1 +1642.09960938 435.58984375 m 1,6,7 + 1574.87011719 250.91015625 1574.87011719 250.91015625 1456.20507812 113.614257812 c 128,-1,8 + 1337.54003906 -23.6806640625 1337.54003906 -23.6806640625 1237.09960938 -23.6806640625 c 0,9,10 + 1187.68945312 -23.6806640625 1187.68945312 -23.6806640625 1091.70507812 13.1748046875 c 128,-1,11 + 995.719726562 50.0302734375 995.719726562 50.0302734375 936.58984375 50.0302734375 c 0,12,13 + 878.26953125 50.0302734375 878.26953125 50.0302734375 782.28515625 13.1748046875 c 128,-1,14 + 686.299804688 -23.6806640625 686.299804688 -23.6806640625 636.889648438 -23.6806640625 c 0,15,16 + 488.66015625 -23.6806640625 488.66015625 -23.6806640625 328.280273438 235.51953125 c 128,-1,17 + 167.900390625 494.719726562 167.900390625 494.719726562 167.900390625 781.459960938 c 0,18,19 + 167.900390625 1000.96972656 167.900390625 1000.96972656 295.474609375 1149.20019531 c 128,-1,20 + 423.049804688 1297.4296875 423.049804688 1297.4296875 624.739257812 1297.4296875 c 0,21,22 + 718.700195312 1297.4296875 718.700195312 1297.4296875 798.485351562 1260.16992188 c 128,-1,23 + 878.26953125 1222.91015625 878.26953125 1222.91015625 936.58984375 1222.91015625 c 0,24,25 + 970.610351562 1222.91015625 970.610351562 1222.91015625 1065.37988281 1260.16992188 c 128,-1,26 + 1160.15039062 1297.4296875 1160.15039062 1297.4296875 1249.25 1297.4296875 c 0,27,28 + 1358.59960938 1297.4296875 1358.59960938 1297.4296875 1448.10546875 1251.25976562 c 128,-1,29 + 1537.61035156 1205.08984375 1537.61035156 1205.08984375 1598.36035156 1124.89941406 c 1,30,31 + 1496.29980469 1062.53027344 1496.29980469 1062.53027344 1450.53515625 971.810546875 c 128,-1,32 + 1404.76953125 881.08984375 1404.76953125 881.08984375 1404.76953125 781.459960938 c 0,33,34 + 1404.76953125 667.25 1404.76953125 667.25 1478.88574219 572.075195312 c 128,-1,35 + 1553 476.899414062 1553 476.899414062 1642.09960938 435.58984375 c 1,6,7 +1468.76074219 379.700195312 m 1,36,37 + 1377.23046875 444.5 1377.23046875 444.5 1320.93554688 559.924804688 c 128,-1,38 + 1264.63964844 675.349609375 1264.63964844 675.349609375 1264.63964844 781.459960938 c 0,39,40 + 1264.63964844 900.530273438 1264.63964844 900.530273438 1300.28027344 983.5546875 c 128,-1,41 + 1335.91992188 1066.58007812 1335.91992188 1066.58007812 1384.51953125 1127.33007812 c 1,42,43 + 1355.36035156 1141.91015625 1355.36035156 1141.91015625 1320.53027344 1149.60546875 c 128,-1,44 + 1285.70019531 1157.29980469 1285.70019531 1157.29980469 1247.62988281 1157.29980469 c 0,45,46 + 1172.29980469 1157.29980469 1172.29980469 1157.29980469 1080.36425781 1120.0390625 c 128,-1,47 + 988.4296875 1082.78027344 988.4296875 1082.78027344 936.58984375 1082.78027344 c 0,48,49 + 856.400390625 1082.78027344 856.400390625 1082.78027344 778.639648438 1120.0390625 c 128,-1,50 + 700.879882812 1157.29980469 700.879882812 1157.29980469 625.549804688 1157.29980469 c 0,51,52 + 473.26953125 1157.29980469 473.26953125 1157.29980469 389.83984375 1049.1640625 c 128,-1,53 + 306.41015625 941.030273438 306.41015625 941.030273438 306.41015625 781.459960938 c 0,54,55 + 306.41015625 530.360351562 306.41015625 530.360351562 438.439453125 322.594726562 c 128,-1,56 + 570.469726562 114.830078125 570.469726562 114.830078125 635.26953125 114.830078125 c 0,57,58 + 669.290039062 114.830078125 669.290039062 114.830078125 757.174804688 151.280273438 c 128,-1,59 + 845.060546875 187.73046875 845.060546875 187.73046875 936.58984375 187.73046875 c 0,60,61 + 1028.9296875 187.73046875 1028.9296875 187.73046875 1116.41015625 151.280273438 c 128,-1,62 + 1203.88964844 114.830078125 1203.88964844 114.830078125 1237.91015625 114.830078125 c 0,63,64 + 1274.36035156 114.830078125 1274.36035156 114.830078125 1344.01953125 194.614257812 c 128,-1,65 + 1413.6796875 274.399414062 1413.6796875 274.399414062 1468.76074219 379.700195312 c 1,36,37 +EndSplineSet +EndChar + +StartChar: carriagereturn +Encoding: 8 11 368 +AltUni2: 00240d.ffffffff.0 00240d.ffffffff.0 +Width: 2388 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 23 + 21 + 55 + 7 + 71 + 7 + 86 + 7 + 103 + 7 + 119 + 7 + 135 + 7 + 151 + 7 + 8 + 39 + 6 + 55 + 6 + 71 + 6 + 134 + 6 + 150 + 6 + 5 + 6 + 4 + 8 + 5 + 4 + 200 + 7 + 8 + 17 + 200 + 18 + 17 + 12 + 219 + 0 + 24 + 8 + 4 + 6 + 23 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MDAP[rnd] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP2 +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +2182 726 m 2,0,1 + 2182 587 2182 587 2081.5 481.5 c 128,-1,2 + 1981 376 1981 376 1838 376 c 2,3,-1 + 630 376 l 1,4,-1 + 630 16 l 1,5,-1 + 134 510 l 1,6,-1 + 630 1008 l 1,7,-1 + 630 648 l 1,8,-1 + 1722 648 l 2,9,10 + 1792 648 1792 648 1842 692 c 128,-1,11 + 1892 736 1892 736 1892 806 c 2,12,-1 + 1892 1030 l 2,13,14 + 1892 1100 1892 1100 1842 1139 c 128,-1,15 + 1792 1178 1792 1178 1722 1178 c 2,16,-1 + 1408 1178 l 1,17,-1 + 1408 1450 l 1,18,-1 + 1840 1450 l 2,19,20 + 1981 1450 1981 1450 2081.5 1349.5 c 128,-1,21 + 2182 1249 2182 1249 2182 1110 c 2,22,-1 + 2182 726 l 2,0,1 +EndSplineSet +EndChar + +StartChar: arrowdashleft +Encoding: 17 24 369 +AltUni2: 0021e0.ffffffff.0 0021e0.ffffffff.0 +Width: 2048 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 10 + 1 + 5 + 9 + 219 + 12 + 2 + 6 + 13 + 220 + 4 + 15 + 1 + 1 + 1 + 0 + 16 + 5 + 8 + 13 + 9 + 11 + 15 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,white] +SVTCA[y-axis] +MIAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1899 624 m 1,0,-1 + 1559 624 l 1,1,-1 + 1559 912 l 1,2,-1 + 1899 912 l 1,3,-1 + 1899 624 l 1,0,-1 +1387 624 m 1,4,-1 + 1047 624 l 1,5,-1 + 1047 912 l 1,6,-1 + 1387 912 l 1,7,-1 + 1387 624 l 1,4,-1 +875 624 m 1,8,-1 + 619 624 l 1,9,-1 + 619 270 l 1,10,-1 + 121 768 l 1,11,-1 + 619 1266 l 1,12,-1 + 619 912 l 1,13,-1 + 875 912 l 1,14,-1 + 875 624 l 1,8,-1 +EndSplineSet +EndChar + +StartChar: arrowdashup +Encoding: 18 25 370 +AltUni2: 0021e1.ffffffff.0 0021e1.ffffffff.0 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 26 + 8 + 0 + 13 + 1 + 13 + 12 + 9 + 3 + 1 + 4 + 6 + 6 + 1 + 4 + 0 + 14 + 10 + 1 + 219 + 5 + 13 + 9 + 4 + 4 + 16 + 15 +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[min,rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,white] +MDAP[rnd] +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,white] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1267 1168 m 1,0,-1 + 913 1168 l 1,1,-1 + 913 912 l 1,2,-1 + 625 912 l 1,3,-1 + 625 1168 l 1,4,-1 + 271 1168 l 1,5,-1 + 769 1666 l 1,6,-1 + 1267 1168 l 1,0,-1 +913 400 m 1,7,-1 + 625 400 l 1,8,-1 + 625 740 l 1,9,-1 + 913 740 l 1,10,-1 + 913 400 l 1,7,-1 +913 -112 m 1,11,-1 + 625 -112 l 1,12,-1 + 625 228 l 1,13,-1 + 913 228 l 1,14,-1 + 913 -112 l 1,11,-1 +EndSplineSet +EndChar + +StartChar: arrowdashright +Encoding: 19 26 371 +AltUni2: 0021e2.ffffffff.0 0021e2.ffffffff.0 +Width: 2048 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +159 624 m 1,0,-1 + 159 912 l 1,1,-1 + 499 912 l 1,2,-1 + 499 624 l 1,3,-1 + 159 624 l 1,0,-1 +671 624 m 1,4,-1 + 671 912 l 1,5,-1 + 1011 912 l 1,6,-1 + 1011 624 l 1,7,-1 + 671 624 l 1,4,-1 +1183 624 m 1,8,-1 + 1183 912 l 1,9,-1 + 1439 912 l 1,10,-1 + 1439 1266 l 1,11,-1 + 1937 768 l 1,12,-1 + 1439 270 l 1,13,-1 + 1439 624 l 1,14,-1 + 1183 624 l 1,8,-1 +EndSplineSet +EndChar + +StartChar: arrowdashdown +Encoding: 11 16 372 +AltUni2: 0021e3.ffffffff.0 0021e3.ffffffff.0 +Width: 1536 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +1267 256 m 1,0,-1 + 769 -242 l 1,1,-1 + 271 256 l 1,2,-1 + 625 256 l 1,3,-1 + 625 512 l 1,4,-1 + 913 512 l 1,5,-1 + 913 256 l 1,6,-1 + 1267 256 l 1,0,-1 +913 1024 m 1,7,-1 + 913 684 l 1,8,-1 + 625 684 l 1,9,-1 + 625 1024 l 1,10,-1 + 913 1024 l 1,7,-1 +913 1536 m 1,11,-1 + 913 1196 l 1,12,-1 + 625 1196 l 1,13,-1 + 625 1536 l 1,14,-1 + 913 1536 l 1,11,-1 +EndSplineSet +EndChar + +StartChar: glyph373 +Encoding: 433 -1 373 +Width: 1536 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 5 + 36 + 1 + 1 + 1 + 1 + 4 + 3 + 3 + 2 + 0 + 0 + 2 + 15 + 38 + 5 + 1 + 5 + 3 + 1 + 3 + 0 + 7 + 1 + 6 +SRP0 +MDRP[rp0,min,rnd,white] +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +DELTAP1 +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +SRP2 +SLOOP +IP +RTHG +MDAP[rnd] +DELTAP1 +ALIGNRP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1386 0 m 1,0,-1 + 152 768 l 1,1,-1 + 1386 1536 l 1,2,-1 + 1386 0 l 1,0,-1 +1196 353 m 1,3,-1 + 1196 1183 l 1,4,-1 + 527 768 l 1,5,-1 + 1196 353 l 1,3,-1 +EndSplineSet +EndChar + +StartChar: foursuperior +Encoding: 364 8308 374 +Width: 849 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 39 + 6 + 9 + 13 + 110 + 1 + 4 + 4 + 3 + 137 + 12 + 1 + 9 + 12 + 29 + 12 + 121 + 12 + 3 + 12 + 7 + 14 + 3 + 81 + 0 + 9 + 2 + 99 + 7 + 12 + 3 + 13 + 6 + 6 + 22 + 6 + 2 + 6 + 5 + 14 +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +DELTAP1 +MDRP[grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +MIAP[rnd] +MDRP[grey] +DELTAP1 +DELTAP2 +SRP2 +IP +MDAP[rnd] +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDRP[grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +986 840 m 1,0,-1 + 841 840 l 1,1,-1 + 783 590 l 1,2,-1 + 581 590 l 1,3,-1 + 639 840 l 1,4,-1 + 222 840 l 1,5,-1 + 265 1026 l 1,6,-1 + 863 1538 l 1,7,-1 + 1002 1538 l 1,8,-1 + 884 1030 l 1,9,-1 + 1030 1030 l 1,10,-1 + 986 840 l 1,0,-1 +683 1030 m 1,11,-1 + 738 1268 l 1,12,-1 + 459 1030 l 1,13,-1 + 683 1030 l 1,11,-1 +EndSplineSet +EndChar + +StartChar: glyph375 +Encoding: 434 -1 375 +Width: 730 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 61 + 0 + 1 + 0 + 2 + 1 + 63 + 3 + 1 + 3 + 61 + 1 + 1 + 1 + 63 + 0 + 1 + 0 + 1 +MDAP[rnd] +MDAP[rnd] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MDAP[rnd] +DELTAP1 +SRP2 +IP +IP +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +721 823 m 1,0,-1 + 4 401 l 1,1,-1 + 4 602 l 1,2,-1 + 721 1026 l 1,3,-1 + 721 823 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph376 +Encoding: 435 -1 376 +Width: 631 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 0 + 2 + 1 + 3 + 1 + 47 + 0 + 1 + 0 + 1 +MDAP[rnd] +MDAP[rnd] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MDAP[rnd] +SRP2 +IP +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +635 805 m 1,0,-1 + 29 346 l 1,1,-1 + 29 526 l 1,2,-1 + 635 987 l 1,3,-1 + 635 805 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph377 +Encoding: 436 -1 377 +Width: 735 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 13 + 1 + 31 + 2 + 47 + 0 + 1 + 0 + 207 + 1 + 1 + 1 + 71 + 4 +SRP0 +SROUND +MDRP[rp0,rnd,white] +RTG +DELTAP1 +MDRP[rp0,min,rnd,black] +DELTAP1 +SVTCA[y-axis] +MDAP[rnd] +MIRP[rp0,min,rnd,black] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +663 648 m 1,0,-1 + 60 648 l 1,1,-1 + 60 861 l 1,2,-1 + 663 861 l 1,3,-1 + 663 648 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph378 +Encoding: 437 -1 378 +Width: 1389 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 52 + 7 + 36 + 12 + 53 + 12 + 2 + 64 + 12 + 96 + 15 + 15 + 9 + 95 + 9 + 111 + 9 + 223 + 9 + 4 + 9 + 15 + 1 + 31 + 1 + 2 + 1 + 4 + 10 + 71 + 15 + 87 + 15 + 103 + 15 + 3 + 15 + 12 + 0 + 32 + 17 + 1 + 17 + 1 + 9 + 11 + 12 + 8 + 47 + 9 + 1 + 9 + 18 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rp0,min,rnd,black] +MDRP[grey] +MDRP[grey] +SRP0 +MDRP[rp0,min,rnd,grey] +MDRP[rp0,min,rnd,black] +DELTAP1 +MDRP[rnd,grey] +SVTCA[y-axis] +MIAP[rnd] +DELTAP1 +MDRP[rnd,grey] +MDRP[rp0,min,rnd,black] +MDRP[rnd,grey] +DELTAP1 +MDAP[rnd] +DELTAP1 +SRP0 +SMD +MDRP[rp0,min,grey] +SMD +DELTAP1 +MDRP[min,grey] +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1341 776 m 1,0,-1 + 1087 776 l 1,1,2 + 1085 834 1085 834 1067 864.5 c 128,-1,3 + 1049 895 1049 895 1004 895 c 0,4,5 + 967 895 967 895 940 876.5 c 128,-1,6 + 913 858 913 858 899 829 c 1,7,-1 + 899 324 l 1,8,-1 + 621 324 l 1,9,-1 + 621 1126 l 1,10,-1 + 887 1126 l 1,11,-1 + 893 975 l 1,12,13 + 930 1071 930 1071 990.5 1110 c 128,-1,14 + 1051 1149 1051 1149 1147 1149 c 0,15,16 + 1264 1149 1264 1149 1315 1053.5 c 128,-1,17 + 1366 958 1366 958 1341 776 c 1,0,-1 +EndSplineSet +EndChar + +StartChar: contextmenu +Encoding: 438 -1 379 +Width: 1881 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 147 + 25 + 22 + 25 + 23 + 39 + 11 + 70 + 10 + 85 + 8 + 82 + 10 + 84 + 28 + 117 + 8 + 8 + 103 + 4 + 121 + 11 + 2 + 10 + 7 + 10 + 11 + 4 + 28 + 6 + 29 + 59 + 27 + 58 + 30 + 6 + 27 + 30 + 9 + 8 + 6 + 5 + 6 + 25 + 1 + 57 + 24 + 1 + 21 + 24 + 20 + 3 + 26 + 48 + 25 + 1 + 25 + 25 + 23 + 32 + 26 + 57 + 26 + 2 + 26 + 13 + 16 + 204 + 19 + 15 + 73 + 121 + 28 + 1 + 11 + 7 + 4 + 15 + 28 + 29 + 10 + 26 + 8 + 2 + 23 + 1 + 2 + 9 + 8 + 6 + 5 + 30 + 27 + 6 + 13 + 16 + 28 + 29 + 4 + 7 + 10 + 11 + 6 + 12 + 17 + 61 + 21 + 63 + 22 + 63 + 23 + 61 + 24 + 4 + 24 + 21 + 23 + 22 + 4 + 20 + 26 + 20 + 26 + 0 + 205 + 1 + 16 + 26 + 1 + 26 + 26 + 12 + 17 + 13 + 15 + 12 + 31 + 12 + 47 + 12 + 159 + 12 + 4 + 12 + 32 + 16 + 17 + 31 +SRP0 +MDRP[rp0,rnd,white] +MDRP[min,rnd,black] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +MDRP[rp0,rnd,grey] +MIRP[rp0,min,rnd,black] +SRP0 +MDRP[grey] +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +SRP1 +SRP2 +SLOOP +IP +SVTCA[y-axis] +MDAP[rnd] +MDRP[rp0,min,rnd,grey] +MDAP[rnd] +SRP2 +SLOOP +IP +DELTAP1 +SROUND +MDAP[rnd] +RTG +MDRP[rnd,grey] +MIRP[rp0,min,rnd,black] +MDRP[rnd,grey] +MDAP[rnd] +DELTAP1 +SRP2 +IP +MDAP[rnd] +DELTAP1 +SRP2 +SLOOP +IP +DELTAP1 +SRP1 +SRP2 +SLOOP +IP +DELTAP1 +IUP[x] +IUP[y] +SVTCA[y-axis] +DELTAP1 +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1026 1170 m 1,0,-1 + 855 1170 l 1,1,-1 + 855 1476 l 1,2,-1 + 1026 1476 l 1,3,-1 + 1026 1170 l 1,0,-1 +1546 1246 m 1,4,-1 + 1304 1003 l 1,5,-1 + 1183 1124 l 1,6,-1 + 1426 1366 l 1,7,-1 + 1546 1246 l 1,4,-1 +715 1107 m 1,8,-1 + 594 986 l 1,9,-1 + 379 1201 l 1,10,-1 + 500 1322 l 1,11,-1 + 715 1107 l 1,8,-1 +1710 681 m 1,12,-1 + 1368 681 l 1,13,-1 + 1368 852 l 1,14,-1 + 1710 852 l 1,15,-1 + 1710 681 l 1,12,-1 +513 681 m 1,16,-1 + 171 681 l 1,17,-1 + 171 852 l 1,18,-1 + 513 852 l 1,19,-1 + 513 681 l 1,16,-1 +1347 519 m 1,20,-1 + 1180 450 l 1,21,-1 + 1344 57 l 1,22,-1 + 1186 -8 l 1,23,-1 + 1023 386 l 1,24,-1 + 856 317 l 1,25,-1 + 855 1013 l 1,26,-1 + 1347 519 l 1,20,-1 +700 399 m 1,27,-1 + 457 157 l 1,28,-1 + 337 277 l 1,29,-1 + 580 520 l 1,30,-1 + 700 399 l 1,27,-1 +EndSplineSet +EndChar + +StartChar: power +Encoding: 439 -1 380 +Width: 1704 +GlyphClass: 1 +Flags: W +CounterMasks: 1 1c +TtInstrs: +NPUSHB + 38 + 45 + 14 + 34 + 16 + 34 + 20 + 45 + 22 + 4 + 25 + 26 + 25 + 26 + 3 + 9 + 21 + 201 + 3 + 211 + 15 + 201 + 9 + 24 + 25 + 25 + 0 + 6 + 12 + 201 + 0 + 211 + 18 + 201 + 48 + 6 + 1 + 6 + 28 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +MDAP[rnd] +MDRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MIRP[rp0,min,rnd,black] +MIRP[rp0,min,rnd,black] +SRP1 +SRP2 +IP +IP +MDAP[rnd] +MDAP[rnd] +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1717 765 m 256,0,1 + 1717 415 1717 415 1469.5 167.5 c 128,-1,2 + 1222 -80 1222 -80 872 -80 c 256,3,4 + 522 -80 522 -80 274.5 167.5 c 128,-1,5 + 27 415 27 415 27 765 c 256,6,7 + 27 1115 27 1115 274.5 1362.5 c 128,-1,8 + 522 1610 522 1610 872 1610 c 256,9,10 + 1222 1610 1222 1610 1469.5 1362.5 c 128,-1,11 + 1717 1115 1717 1115 1717 765 c 256,0,1 +1505 765 m 0,12,13 + 1505 1030 1505 1030 1319 1217 c 128,-1,14 + 1133 1404 1133 1404 872 1404 c 0,15,16 + 603 1404 603 1404 421 1219 c 128,-1,17 + 239 1034 239 1034 239 765 c 0,18,19 + 239 497 239 497 421 312 c 128,-1,20 + 603 127 603 127 872 127 c 0,21,22 + 1149 127 1149 127 1327 310.5 c 128,-1,23 + 1505 494 1505 494 1505 765 c 0,12,13 +992 358 m 1,24,-1 + 752 358 l 1,25,-1 + 752 1172 l 1,26,-1 + 992 1172 l 1,27,-1 + 992 358 l 1,24,-1 +EndSplineSet +EndChar + +StartChar: glyph381 +Encoding: 440 -1 381 +Width: 1365 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 35 + 51 + 0 + 1 + 0 + 100 + 63 + 3 + 1 + 3 + 54 + 1 + 1 + 1 + 100 + 2 + 2 + 3 + 0 + 3 + 1 + 56 + 2 + 1 + 2 + 4 + 2 + 63 + 1 + 1 + 1 + 0 + 48 + 3 + 1 + 3 +SVTCA[y-axis] +MDAP[rnd] +DELTAP1 +MDRP[grey] +MDAP[rnd] +DELTAP1 +MDRP[grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,black] +DELTAP1 +SRP0 +DELTAP1 +MIRP[rp0,min,black] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1341 1569 m 1,0,-1 + 281 -168 l 1,1,-1 + 117 -45 l 1,2,-1 + 1165 1669 l 1,3,-1 + 1341 1569 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph382 +Encoding: 441 -1 382 +Width: 1360 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 30 + 7 + 0 + 22 + 0 + 2 + 0 + 118 + 8 + 3 + 50 + 3 + 2 + 3 + 55 + 1 + 1 + 1 + 118 + 2 + 2 + 3 + 0 + 3 + 1 + 2 + 4 + 2 + 1 + 0 + 3 +SVTCA[y-axis] +MDAP[rnd] +MDRP[grey] +MDAP[rnd] +MDRP[grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,rnd,white] +MDRP[rnd,grey] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SPVTL[orthog] +SRP0 +MIRP[rp0,min,black] +DELTAP1 +SRP0 +DELTAP1 +MIRP[rp0,min,black] +DELTAP1 +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1235 1239 m 1,0,-1 + 252 -135 l 1,1,-1 + 141 -45 l 1,2,-1 + 1126 1323 l 1,3,-1 + 1235 1239 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph383 +Encoding: 442 -1 383 +Width: 0 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +SplineSet +24 2048 m 1,0,-1 + 24 -512 l 1,1,-1 + 24 0 l 1,2,-1 + 1048 0 l 1,3,-1 + -1000 0 l 1,4,-1 + 24 2048 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: Ccircumflex +Encoding: 222 264 384 +Width: 1190 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 38 67 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 152 309 2 +EndChar + +StartChar: ccircumflex +Encoding: 223 265 385 +Width: 1124 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 70 99 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 40 -41 2 +EndChar + +StartChar: Cdotaccent +Encoding: 224 266 386 +Width: 1190 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 38 67 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 251 303 2 +EndChar + +StartChar: cdotaccent +Encoding: 225 267 387 +Width: 1124 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 70 99 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 128 -47 2 +EndChar + +StartChar: Ebreve +Encoding: 234 276 388 +Width: 1167 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 40 69 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 182 294 2 +EndChar + +StartChar: ebreve +Encoding: 235 277 389 +Width: 1303 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 72 101 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 134 -35 2 +EndChar + +StartChar: Gcircumflex +Encoding: 242 284 390 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 42 71 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 238 309 2 +EndChar + +StartChar: gcircumflex +Encoding: 243 285 391 +Width: 1337 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 117 -56 2 +EndChar + +StartChar: Gdotaccent +Encoding: 246 288 392 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 42 71 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 317 303 2 +EndChar + +StartChar: gdotaccent +Encoding: 247 289 393 +Width: 1337 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 220 729 N 1 0 0 1 116 -62 2 +EndChar + +StartChar: gacute +Encoding: 443 -1 394 +Width: 1337 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 141 180 N 1 0 0 1 257 -56 2 +EndChar + +StartChar: Hcircumflex +Encoding: 250 292 395 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 43 72 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 233 288 2 +EndChar + +StartChar: hcircumflex +Encoding: 251 293 396 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 75 104 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 188 288 2 +EndChar + +StartChar: Hbar +Encoding: 252 294 397 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 43 72 N 1 0 0 1 0 0 2 +Refer: 178 8211 N 1 0 0 1 258 392 2 +EndChar + +StartChar: hbar +Encoding: 253 295 398 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 75 104 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 -231 -165 2 +EndChar + +StartChar: Itilde +Encoding: 254 296 399 +Width: 750 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 -76 272 2 +EndChar + +StartChar: itilde +Encoding: 255 297 400 +Width: 610 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 215 305 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 -227 -86 2 +EndChar + +StartChar: Iogonek +Encoding: 258 302 401 +Width: 750 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 44 73 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 -94 0 2 +EndChar + +StartChar: Jcircumflex +Encoding: 264 308 402 +Width: 954 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 45 74 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 153 288 2 +EndChar + +StartChar: jcircumflex +Encoding: 265 309 403 +Width: 633 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 77 106 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 -212 -102 2 +EndChar + +StartChar: ncommaaccentaltone +Encoding: 444 -1 404 +Width: 1296 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 25 1612 2 +EndChar + +StartChar: Obreve +Encoding: 285 334 405 +Width: 1365 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 50 79 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 248 315 2 +EndChar + +StartChar: obreve +Encoding: 286 335 406 +Width: 1360 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 82 111 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 159 -35 2 +EndChar + +StartChar: Rcaron +Encoding: 295 344 407 +Width: 1251 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 53 82 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 193 288 2 +EndChar + +StartChar: rcaron +Encoding: 296 345 408 +Width: 1020 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 85 114 N 1 0 0 1 0 0 2 +Refer: 225 711 N 1 0 0 1 70 -47 2 +EndChar + +StartChar: Scircumflex +Encoding: 299 348 409 +Width: 1155 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 54 83 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 118 309 2 +EndChar + +StartChar: scircumflex +Encoding: 300 349 410 +Width: 932 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 86 115 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 -63 -52 2 +EndChar + +StartChar: Tbar +Encoding: 309 358 411 +Width: 1024 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 55 84 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 -154 -672 2 +EndChar + +StartChar: tbar +Encoding: 310 359 412 +Width: 850 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 87 116 N 1 0 0 1 0 0 2 +Refer: 218 175 N 1 0 0 1 -254 -677 2 +EndChar + +StartChar: Utilde +Encoding: 311 360 413 +Width: 1343 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 229 272 2 +EndChar + +StartChar: utilde +Encoding: 312 361 414 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 217 732 N 1 0 0 1 115 -86 2 +EndChar + +StartChar: Ubreve +Encoding: 315 364 415 +Width: 1343 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 236 294 2 +EndChar + +StartChar: ubreve +Encoding: 316 365 416 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 219 728 N 1 0 0 1 122 -64 2 +EndChar + +StartChar: Uogonek +Encoding: 321 370 417 +Width: 1343 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 56 85 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 207 -18 2 +EndChar + +StartChar: uogonek +Encoding: 322 371 418 +Width: 1296 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 88 117 N 1 0 0 1 0 0 2 +Refer: 224 731 N 1 0 0 1 492 10 2 +EndChar + +StartChar: Wcircumflex +Encoding: 323 372 419 +Width: 1931 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 58 87 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 518 288 2 +EndChar + +StartChar: wcircumflex +Encoding: 324 373 420 +Width: 1774 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 90 119 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 358 -70 2 +EndChar + +StartChar: Ycircumflex +Encoding: 325 374 421 +Width: 1327 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 60 89 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 219 288 2 +EndChar + +StartChar: ycircumflex +Encoding: 326 375 422 +Width: 1190 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 92 121 N 1 0 0 1 0 0 2 +Refer: 216 710 N 1 0 0 1 62 -70 2 +EndChar + +StartChar: Scommaaccent +Encoding: 445 -1 423 +Width: 1155 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 54 83 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 264 -462 2 +EndChar + +StartChar: scommaaccent +Encoding: 446 -1 424 +Width: 932 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 86 115 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 166 -467 2 +EndChar + +StartChar: Tcommaaccent +Encoding: 447 -1 425 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 55 84 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 217 -442 2 +EndChar + +StartChar: tcommaaccent +Encoding: 448 -1 426 +Width: 850 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 87 116 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 118 -452 2 +EndChar + +StartChar: Gcommaaccent +Encoding: 449 -1 427 +Width: 1360 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 42 71 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 384 -467 2 +EndChar + +StartChar: gcommaaccent +Encoding: 450 -1 428 +Width: 1337 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 74 103 N 1 0 0 1 0 0 2 +Refer: 182 8216 N 1 0 0 1 298 413 2 +EndChar + +StartChar: Lcommaaccent +Encoding: 451 -1 429 +Width: 1126 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 47 76 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 302 -442 2 +EndChar + +StartChar: lcommaaccent +Encoding: 452 -1 430 +Width: 635 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 79 108 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 22 -442 2 +EndChar + +StartChar: Kcommaaccent +Encoding: 453 -1 431 +Width: 1339 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 46 75 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 467 -442 2 +EndChar + +StartChar: kcommaaccent +Encoding: 454 -1 432 +Width: 1190 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 78 107 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 386 -442 2 +EndChar + +StartChar: Ncommaaccent +Encoding: 455 -1 433 +Width: 1397 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 49 78 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 403 -442 2 +EndChar + +StartChar: Rcommaaccent +Encoding: 456 -1 434 +Width: 1251 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 53 82 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 368 -442 2 +EndChar + +StartChar: rcommaaccent +Encoding: 457 -1 435 +Width: 1020 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 85 114 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 23 -442 2 +EndChar + +StartChar: commaaccent +Encoding: 404 61444 436 +Width: 584 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 15 44 N 1 0 0 1 0 0 2 +EndChar + +StartChar: carriagereturnleft +Encoding: 9 12 437 +Width: 2388 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 35 + 16 + 14 + 18 + 17 + 18 + 200 + 56 + 15 + 72 + 15 + 88 + 15 + 104 + 15 + 120 + 15 + 136 + 15 + 152 + 15 + 7 + 15 + 14 + 5 + 200 + 4 + 4 + 10 + 219 + 0 + 23 + 18 + 15 + 16 + 24 +SRP0 +MDRP[rp0,min,rnd,white] +MDRP[rp0,min,rnd,grey] +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,white] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MDAP[rnd] +MDRP[min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +MDRP[rp0,min,rnd,grey] +SRP1 +SRP2 +IP +IUP[x] +IUP[y] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +206 1110 m 2,0,1 + 206 1249 206 1249 306.5 1349.5 c 128,-1,2 + 407 1450 407 1450 550 1450 c 2,3,-1 + 980 1450 l 1,4,-1 + 980 1178 l 1,5,-1 + 666 1178 l 2,6,7 + 596 1178 596 1178 546 1139 c 128,-1,8 + 496 1100 496 1100 496 1030 c 2,9,-1 + 496 806 l 2,10,11 + 496 736 496 736 546 692 c 128,-1,12 + 596 648 596 648 666 648 c 2,13,-1 + 1758 648 l 1,14,-1 + 1758 1008 l 1,15,-1 + 2254 510 l 1,16,-1 + 1758 16 l 1,17,-1 + 1758 376 l 1,18,-1 + 550 376 l 2,19,20 + 407 376 407 376 306.5 481.5 c 128,-1,21 + 206 587 206 587 206 726 c 2,22,-1 + 206 1110 l 2,0,1 +EndSplineSet +EndChar + +StartChar: tcaron +Encoding: 308 357 438 +Width: 850 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 87 116 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 1008 1174 2 +EndChar + +StartChar: currency +Encoding: 122 164 439 +Width: 1230 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 54 + 57 + 0 + 57 + 10 + 53 + 28 + 3 + 53 + 1 + 58 + 9 + 54 + 18 + 57 + 19 + 53 + 27 + 5 + 14 + 23 + 92 + 39 + 45 + 92 + 5 + 32 + 98 + 153 + 36 + 175 + 36 + 217 + 36 + 3 + 36 + 150 + 42 + 214 + 42 + 2 + 42 + 98 + 80 + 14 + 1 + 47 + 14 + 64 + 14 + 176 + 14 + 3 + 14 + 48 +SRP0 +MDRP[rp0,rnd,white] +DELTAP1 +DELTAP2 +MIRP[min,rnd,black] +DELTAP1 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MIRP[rp0,min,rnd,black] +SVTCA[y-axis] +MDAP[rnd] +MIRP[min,rnd,black] +MDRP[rp0,min,rnd,grey] +MIRP[rp0,min,rnd,black] +MPPEM +GTEQ +IF +NPUSHB + 24 + 0 + 63 + 28 + 1 + 28 + 32 + 10 + 48 + 18 + 1 + 18 + 14 + 1 + 48 + 9 + 1 + 9 + 5 + 27 + 63 + 19 + 1 + 19 + 23 +SVTCA[y-axis] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SVTCA[x-axis] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +SRP0 +MDRP[rp0,min,rnd,grey] +DELTAP1 +MDRP[rnd,grey] +EIF +IUP[x] +IUP[y] +SVTCA[x-axis] +DELTAP1 +SVTCA[y-axis] +DELTAP1 +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +1207 236 m 1,0,-1 + 1043 94 l 1,1,-1 + 885 319 l 1,2,3 + 842 295 842 295 782 282.5 c 128,-1,4 + 722 270 722 270 682 270 c 0,5,6 + 640 270 640 270 586.5 282.5 c 128,-1,7 + 533 295 533 295 500 319 c 1,8,-1 + 239 94 l 1,9,-1 + 140 236 l 1,10,-1 + 401 461 l 1,11,12 + 384 508 384 508 382 566.5 c 128,-1,13 + 380 625 380 625 395 688 c 0,14,15 + 410 752 410 752 438.5 810 c 128,-1,16 + 467 868 467 868 506 915 c 1,17,-1 + 349 1141 l 1,18,-1 + 514 1282 l 1,19,-1 + 671 1057 l 1,20,21 + 715 1081 715 1081 774 1093.5 c 128,-1,22 + 833 1106 833 1106 875 1106 c 0,23,24 + 915 1106 915 1106 969 1093.5 c 128,-1,25 + 1023 1081 1023 1081 1055 1057 c 1,26,-1 + 1317 1282 l 1,27,-1 + 1416 1141 l 1,28,-1 + 1154 915 l 1,29,30 + 1172 868 1172 868 1172.5 804.5 c 128,-1,31 + 1173 741 1173 741 1160 688 c 0,32,33 + 1145 625 1145 625 1117 566.5 c 128,-1,34 + 1089 508 1089 508 1049 461 c 1,35,-1 + 1207 236 l 1,0,-1 +939 698 m 0,36,37 + 958 782 958 782 932 842.5 c 128,-1,38 + 906 903 906 903 828 903 c 0,39,40 + 754 903 754 903 698 842.5 c 128,-1,41 + 642 782 642 782 622 698 c 256,42,43 + 603 614 603 614 631 554 c 128,-1,44 + 659 494 659 494 733 494 c 0,45,46 + 811 494 811 494 864.5 550 c 128,-1,47 + 918 606 918 606 939 698 c 0,36,37 +EndSplineSet +EndChar + +StartChar: gravecmb +Encoding: 458 -1 440 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 67 96 N 1 0 0 1 0 0 2 +EndChar + +StartChar: acutecmb +Encoding: 459 -1 441 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 141 180 N 1 0 0 1 0 0 2 +EndChar + +StartChar: circumflexcmb +Encoding: 460 -1 442 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 216 710 N 1 0 0 1 0 0 2 +EndChar + +StartChar: tildecmb +Encoding: 461 -1 443 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 217 732 N 1 0 0 1 0 0 2 +EndChar + +StartChar: macroncmb +Encoding: 462 -1 444 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 218 175 N 1 0 0 1 0 0 2 +EndChar + +StartChar: brevecmb +Encoding: 463 -1 445 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 219 728 N 1 0 0 1 0 0 2 +EndChar + +StartChar: dotaccentcmb +Encoding: 464 -1 446 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 220 729 N 1 0 0 1 0 0 2 +EndChar + +StartChar: dieresiscmb +Encoding: 465 -1 447 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 142 168 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ringcmb +Encoding: 466 -1 448 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 221 730 N 1 0 0 1 0 0 2 +EndChar + +StartChar: hungarumlautcmb +Encoding: 467 -1 449 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 223 733 N 1 0 0 1 0 0 2 +EndChar + +StartChar: caroncmb +Encoding: 468 -1 450 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 225 711 N 1 0 0 1 0 0 2 +EndChar + +StartChar: cedillacmb +Encoding: 469 -1 451 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 222 184 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ogonekcmb +Encoding: 470 -1 452 +Width: 1024 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 224 731 N 1 0 0 1 0 0 2 +EndChar + +StartChar: soliduslongoverlaycmb +Encoding: 471 -1 453 +Width: 510 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 3 9 N 1 0 0 1 0 0 2 +EndChar + +StartChar: Omegagreek +Encoding: 472 -1 454 +Width: 510 +GlyphClass: 1 +Flags: W +LayerCount: 2 +Fore +Refer: 3 9 N 1 0 0 1 0 0 2 +EndChar + +StartChar: ncommaaccent +Encoding: 473 -1 455 +Width: 1296 +GlyphClass: 1 +Flags: HW +LayerCount: 2 +Fore +Refer: 81 110 N 1 0 0 1 0 0 2 +Refer: 15 44 N 1 0 0 1 350 -451 2 +EndChar + +StartChar: uniE0B0 +Encoding: 474 57520 456 +Width: 1051 +VWidth: 1000 +Flags: W +LayerCount: 2 +Fore +SplineSet +354.5 59 m 0,0,1 + 294.5 -1 294.5 -1 206.900390625 -2.2001953125 c 0,2,3 + 122.900390625 -2.2001953125 122.900390625 -2.2001953125 61.7001953125 59 c 128,-1,4 + 0.5 120.200195312 0.5 120.200195312 0.5 207.799804688 c 2,5,-1 + 0.5 1242.20019531 l 2,6,7 + 0.5 1328.59960938 0.5 1328.59960938 61.7001953125 1390.40039062 c 128,-1,8 + 122.900390625 1452.20019531 122.900390625 1452.20019531 206.900390625 1452.20019531 c 0,9,10 + 294.5 1452.20019531 294.5 1452.20019531 354.5 1391 c 2,11,-1 + 1038.5 725 l 1,12,13 + 628.099609375 325.400390625 628.099609375 325.400390625 354.5 59 c 0,0,1 +EndSplineSet +EndChar + +StartChar: F12 +Encoding: 475 59916 457 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1778 405 m 1,0,-1 + 1264 405 l 1,1,-1 + 1264 532 l 1,2,3 + 1458.5 700 1458.5 700 1530.75 783 c 128,-1,4 + 1603 866 1603 866 1603 932.5 c 0,5,6 + 1603 982.5 1603 982.5 1579.5 1018.75 c 128,-1,7 + 1556 1055 1556 1055 1505.5 1055 c 0,8,9 + 1449.5 1055 1449.5 1055 1431.5 1034.25 c 128,-1,10 + 1413.5 1013.5 1413.5 1013.5 1404 984.5 c 1,11,-1 + 1259 984.5 l 1,12,13 + 1281.5 1081 1281.5 1081 1351 1125.5 c 128,-1,14 + 1420.5 1170 1420.5 1170 1529 1170 c 0,15,16 + 1646 1170 1646 1170 1709 1108 c 128,-1,17 + 1772 1046 1772 1046 1772 954 c 0,18,19 + 1772 855.5 1772 855.5 1685.5 753.75 c 128,-1,20 + 1599 652 1599 652 1404 517.5 c 1,21,-1 + 1778 517.5 l 1,22,-1 + 1778 405 l 1,0,-1 +1214.5 404 m 1,23,-1 + 1060 404 l 1,24,-1 + 1060 978.5 l 1,25,-1 + 954.5 978.5 l 1,26,-1 + 954.5 1069.5 l 1,27,28 + 1026 1075.5 1026 1075.5 1064 1108 c 128,-1,29 + 1102 1140.5 1102 1140.5 1113 1158.5 c 1,30,-1 + 1214.5 1158.5 l 1,31,-1 + 1214.5 404 l 1,23,-1 +911 1046.5 m 1,32,-1 + 622 1046.5 l 1,33,-1 + 622 844 l 1,34,-1 + 846.5 844 l 1,35,-1 + 846.5 730 l 1,36,-1 + 622 730 l 1,37,-1 + 622 404.5 l 1,38,-1 + 452 404.5 l 1,39,-1 + 452 1159 l 1,40,-1 + 911 1159 l 1,41,-1 + 911 1046.5 l 1,32,-1 +1694 1536 m 1,42,-1 + 2048 1536 l 1,43,-1 + 2048 0 l 1,44,-1 + 1694 0 l 1,45,-1 + 1493 0 l 1,46,-1 + 727 0 l 1,47,-1 + 524 0 l 1,48,-1 + 172 0 l 1,49,-1 + 172 1536 l 1,50,-1 + 524 1536 l 1,51,-1 + 727 1536 l 1,52,-1 + 1493 1536 l 1,53,-1 + 1694 1536 l 1,42,-1 +1384 1364 m 1,54,-1 + 834 1364 l 1,55,-1 + 633 1364 l 1,56,-1 + 342 1364 l 1,57,-1 + 342 172 l 1,58,-1 + 633 172 l 1,59,-1 + 834 172 l 1,60,-1 + 1384 172 l 1,61,-1 + 1587 172 l 1,62,-1 + 1878 172 l 1,63,-1 + 1878 1364 l 1,64,-1 + 1587 1364 l 1,65,-1 + 1384 1364 l 1,54,-1 +EndSplineSet +EndChar + +StartChar: F11 +Encoding: 476 59915 458 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1685 404 m 5,0,-1 + 1530.5 404 l 5,1,-1 + 1530.5 978.5 l 5,2,-1 + 1425 978.5 l 5,3,-1 + 1425 1069.5 l 5,4,5 + 1496.5 1075.5 1496.5 1075.5 1534.5 1108 c 132,-1,6 + 1572.5 1140.5 1572.5 1140.5 1583.5 1158.5 c 5,7,-1 + 1685 1158.5 l 5,8,-1 + 1685 404 l 5,0,-1 +1298.5 404 m 5,9,-1 + 1144 404 l 5,10,-1 + 1144 978.5 l 5,11,-1 + 1038.5 978.5 l 5,12,-1 + 1038.5 1069.5 l 5,13,14 + 1110 1075.5 1110 1075.5 1148 1108 c 132,-1,15 + 1186 1140.5 1186 1140.5 1197 1158.5 c 5,16,-1 + 1298.5 1158.5 l 5,17,-1 + 1298.5 404 l 5,9,-1 +945 1046.5 m 5,18,-1 + 656 1046.5 l 5,19,-1 + 656 844 l 5,20,-1 + 880.5 844 l 5,21,-1 + 880.5 730 l 5,22,-1 + 656 730 l 5,23,-1 + 656 404.5 l 5,24,-1 + 486 404.5 l 5,25,-1 + 486 1159 l 5,26,-1 + 945 1159 l 5,27,-1 + 945 1046.5 l 5,18,-1 +1694 1536 m 1,28,-1 + 2048 1536 l 1,29,-1 + 2048 0 l 1,30,-1 + 1694 0 l 1,31,-1 + 1493 0 l 1,32,-1 + 727 0 l 1,33,-1 + 524 0 l 1,34,-1 + 172 0 l 1,35,-1 + 172 1536 l 1,36,-1 + 524 1536 l 1,37,-1 + 727 1536 l 1,38,-1 + 1493 1536 l 1,39,-1 + 1694 1536 l 1,28,-1 +1384 1364 m 1,40,-1 + 834 1364 l 1,41,-1 + 633 1364 l 1,42,-1 + 342 1364 l 1,43,-1 + 342 172 l 1,44,-1 + 633 172 l 1,45,-1 + 834 172 l 1,46,-1 + 1384 172 l 1,47,-1 + 1587 172 l 1,48,-1 + 1878 172 l 1,49,-1 + 1878 1364 l 1,50,-1 + 1587 1364 l 1,51,-1 + 1384 1364 l 1,40,-1 +EndSplineSet +EndChar + +StartChar: F10 +Encoding: 477 59914 459 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1799.5 756.5 m 2,0,1 + 1799.5 576.5 1799.5 576.5 1727.75 488.25 c 128,-1,2 + 1656 400 1656 400 1531 400 c 256,3,4 + 1406 400 1406 400 1334.25 488.25 c 128,-1,5 + 1262.5 576.5 1262.5 576.5 1262.5 756.5 c 2,6,-1 + 1262.5 818 l 2,7,8 + 1262.5 990 1262.5 990 1330.75 1084.25 c 128,-1,9 + 1399 1178.5 1399 1178.5 1531 1178.5 c 256,10,11 + 1663 1178.5 1663 1178.5 1731.25 1084.25 c 128,-1,12 + 1799.5 990 1799.5 990 1799.5 818 c 2,13,-1 + 1799.5 756.5 l 2,0,1 +1631 777 m 2,14,-1 + 1631 797.5 l 2,15,16 + 1631 950 1631 950 1610.75 1007 c 128,-1,17 + 1590.5 1064 1590.5 1064 1531 1064 c 256,18,19 + 1471.5 1064 1471.5 1064 1451.5 1007 c 128,-1,20 + 1431.5 950 1431.5 950 1431.5 797.5 c 2,21,-1 + 1431.5 777 l 2,22,23 + 1431.5 624.5 1431.5 624.5 1452 569.75 c 128,-1,24 + 1472.5 515 1472.5 515 1531 515 c 0,25,26 + 1590.5 515 1590.5 515 1610.75 569.75 c 128,-1,27 + 1631 624.5 1631 624.5 1631 777 c 2,14,-1 +1214.5 404 m 1,28,-1 + 1060 404 l 1,29,-1 + 1060 978.5 l 1,30,-1 + 954.5 978.5 l 1,31,-1 + 954.5 1069.5 l 1,32,33 + 1026 1075.5 1026 1075.5 1064 1108 c 128,-1,34 + 1102 1140.5 1102 1140.5 1113 1158.5 c 1,35,-1 + 1214.5 1158.5 l 1,36,-1 + 1214.5 404 l 1,28,-1 +911 1046.5 m 1,37,-1 + 622 1046.5 l 1,38,-1 + 622 844 l 1,39,-1 + 846.5 844 l 1,40,-1 + 846.5 730 l 1,41,-1 + 622 730 l 1,42,-1 + 622 404.5 l 1,43,-1 + 452 404.5 l 1,44,-1 + 452 1159 l 1,45,-1 + 911 1159 l 1,46,-1 + 911 1046.5 l 1,37,-1 +1694 1536 m 1,47,-1 + 2048 1536 l 1,48,-1 + 2048 0 l 1,49,-1 + 1694 0 l 1,50,-1 + 1493 0 l 1,51,-1 + 727 0 l 1,52,-1 + 524 0 l 1,53,-1 + 172 0 l 1,54,-1 + 172 1536 l 1,55,-1 + 524 1536 l 1,56,-1 + 727 1536 l 1,57,-1 + 1493 1536 l 1,58,-1 + 1694 1536 l 1,47,-1 +1384 1364 m 1,59,-1 + 834 1364 l 1,60,-1 + 633 1364 l 1,61,-1 + 342 1364 l 1,62,-1 + 342 172 l 1,63,-1 + 633 172 l 1,64,-1 + 834 172 l 1,65,-1 + 1384 172 l 1,66,-1 + 1587 172 l 1,67,-1 + 1878 172 l 1,68,-1 + 1878 1364 l 1,69,-1 + 1587 1364 l 1,70,-1 + 1384 1364 l 1,59,-1 +EndSplineSet +EndChar + +StartChar: F9 +Encoding: 478 59913 460 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1693.5 806.5 m 0,0,1 + 1678.5 612.5 1678.5 612.5 1602.5 508 c 0,2,3 + 1521.5 396 1521.5 396 1367 396 c 0,4,5 + 1327 396 1327 396 1296.75 401.25 c 128,-1,6 + 1266.5 406.5 1266.5 406.5 1241 411.5 c 1,7,-1 + 1241 541.5 l 1,8,9 + 1275 533.5 1275 533.5 1306.25 528.25 c 128,-1,10 + 1337.5 523 1337.5 523 1367 523 c 0,11,12 + 1439.5 523 1439.5 523 1478.5 569.5 c 128,-1,13 + 1517.5 616 1517.5 616 1520.5 696 c 1,14,15 + 1506 670.5 1506 670.5 1461.5 650 c 128,-1,16 + 1417 629.5 1417 629.5 1378 629.5 c 0,17,18 + 1261.5 629.5 1261.5 629.5 1197.25 697.25 c 128,-1,19 + 1133 765 1133 765 1133 889.5 c 0,20,21 + 1133 1018.5 1133 1018.5 1205.5 1095 c 128,-1,22 + 1278 1171.5 1278 1171.5 1408 1171.5 c 0,23,24 + 1547 1171.5 1547 1171.5 1615.5 1098 c 0,25,26 + 1680 1030 1680 1030 1693.5 872.5 c 0,27,28 + 1694.5 861 1694.5 861 1694.5 844 c 0,29,30 + 1694.5 840 1694.5 840 1694.5 835.5 c 0,31,32 + 1694 813 1694 813 1693.5 806.5 c 0,0,1 +1529 900.5 m 0,33,34 + 1529 983.5 1529 983.5 1498.75 1019.25 c 128,-1,35 + 1468.5 1055 1468.5 1055 1415 1055 c 0,36,37 + 1363 1055 1363 1055 1333 1019.75 c 128,-1,38 + 1303 984.5 1303 984.5 1303 900.5 c 0,39,40 + 1303 820.5 1303 820.5 1333 782.75 c 128,-1,41 + 1363 745 1363 745 1415 745 c 0,42,43 + 1461 745 1461 745 1495 782.25 c 128,-1,44 + 1529 819.5 1529 819.5 1529 900.5 c 0,33,34 +1015 1046.5 m 1,45,-1 + 726 1046.5 l 1,46,-1 + 726 844 l 1,47,-1 + 950.5 844 l 1,48,-1 + 950.5 730 l 1,49,-1 + 726 730 l 1,50,-1 + 726 404.5 l 1,51,-1 + 556 404.5 l 1,52,-1 + 556 1159 l 1,53,-1 + 1015 1159 l 1,54,-1 + 1015 1046.5 l 1,45,-1 +1694 1536 m 1,55,-1 + 2048 1536 l 1,56,-1 + 2048 0 l 1,57,-1 + 1694 0 l 1,58,-1 + 1493 0 l 1,59,-1 + 727 0 l 1,60,-1 + 524 0 l 1,61,-1 + 172 0 l 1,62,-1 + 172 1536 l 1,63,-1 + 524 1536 l 1,64,-1 + 727 1536 l 1,65,-1 + 1493 1536 l 1,66,-1 + 1694 1536 l 1,55,-1 +1384 1364 m 1,67,-1 + 834 1364 l 1,68,-1 + 633 1364 l 1,69,-1 + 342 1364 l 1,70,-1 + 342 172 l 1,71,-1 + 633 172 l 1,72,-1 + 834 172 l 1,73,-1 + 1384 172 l 1,74,-1 + 1587 172 l 1,75,-1 + 1878 172 l 1,76,-1 + 1878 1364 l 1,77,-1 + 1587 1364 l 1,78,-1 + 1384 1364 l 1,67,-1 +EndSplineSet +EndChar + +StartChar: F8 +Encoding: 479 59912 461 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1626 627.5 m 0,0,1 + 1626 518 1626 518 1556.25 455 c 128,-1,2 + 1486.5 392 1486.5 392 1373 392 c 0,3,4 + 1251 392 1251 392 1186.5 449.5 c 128,-1,5 + 1122 507 1122 507 1122 615 c 0,6,7 + 1122 671.5 1122 671.5 1154.75 724.5 c 128,-1,8 + 1187.5 777.5 1187.5 777.5 1248 800 c 1,9,-1 + 1248 811 l 1,10,11 + 1196 828.5 1196 828.5 1168.75 870.5 c 128,-1,12 + 1141.5 912.5 1141.5 912.5 1141.5 974 c 0,13,14 + 1141.5 1054.5 1141.5 1054.5 1202.5 1112 c 128,-1,15 + 1263.5 1169.5 1263.5 1169.5 1373 1169.5 c 0,16,17 + 1484.5 1169.5 1484.5 1169.5 1542.5 1112.75 c 128,-1,18 + 1600.5 1056 1600.5 1056 1600.5 967.5 c 0,19,20 + 1600.5 910.5 1600.5 910.5 1574.25 869 c 128,-1,21 + 1548 827.5 1548 827.5 1502 811 c 1,22,-1 + 1502 800 l 1,23,24 + 1558.5 782.5 1558.5 782.5 1592.25 740.5 c 128,-1,25 + 1626 698.5 1626 698.5 1626 627.5 c 0,0,1 +1456 954.5 m 0,26,27 + 1456 1005.5 1456 1005.5 1435 1030 c 128,-1,28 + 1414 1054.5 1414 1054.5 1373 1054.5 c 256,29,30 + 1332 1054.5 1332 1054.5 1311.5 1029.5 c 128,-1,31 + 1291 1004.5 1291 1004.5 1291 954.5 c 0,32,33 + 1291 901 1291 901 1312.5 877.5 c 128,-1,34 + 1334 854 1334 854 1373 854 c 0,35,36 + 1407 854 1407 854 1431.5 876.5 c 128,-1,37 + 1456 899 1456 899 1456 954.5 c 0,26,27 +1476.5 623.5 m 0,38,39 + 1476.5 688 1476.5 688 1449.75 717.75 c 128,-1,40 + 1423 747.5 1423 747.5 1373 747.5 c 0,41,42 + 1324.5 747.5 1324.5 747.5 1297.5 719.25 c 128,-1,43 + 1270.5 691 1270.5 691 1270.5 623.5 c 0,44,45 + 1270.5 562 1270.5 562 1297.25 534.5 c 128,-1,46 + 1324 507 1324 507 1373 507 c 0,47,48 + 1418 507 1418 507 1447.25 534.5 c 128,-1,49 + 1476.5 562 1476.5 562 1476.5 623.5 c 0,38,39 +1041 1046.5 m 1,50,-1 + 752 1046.5 l 1,51,-1 + 752 844 l 1,52,-1 + 976.5 844 l 1,53,-1 + 976.5 730 l 1,54,-1 + 752 730 l 1,55,-1 + 752 404.5 l 1,56,-1 + 582 404.5 l 1,57,-1 + 582 1159 l 1,58,-1 + 1041 1159 l 1,59,-1 + 1041 1046.5 l 1,50,-1 +1694 1536 m 1,60,-1 + 2048 1536 l 1,61,-1 + 2048 0 l 1,62,-1 + 1694 0 l 1,63,-1 + 1493 0 l 1,64,-1 + 727 0 l 1,65,-1 + 524 0 l 1,66,-1 + 172 0 l 1,67,-1 + 172 1536 l 1,68,-1 + 524 1536 l 1,69,-1 + 727 1536 l 1,70,-1 + 1493 1536 l 1,71,-1 + 1694 1536 l 1,60,-1 +1384 1364 m 1,72,-1 + 834 1364 l 1,73,-1 + 633 1364 l 1,74,-1 + 342 1364 l 1,75,-1 + 342 172 l 1,76,-1 + 633 172 l 1,77,-1 + 834 172 l 1,78,-1 + 1384 172 l 1,79,-1 + 1587 172 l 1,80,-1 + 1878 172 l 1,81,-1 + 1878 1364 l 1,82,-1 + 1587 1364 l 1,83,-1 + 1384 1364 l 1,72,-1 +EndSplineSet +EndChar + +StartChar: F7 +Encoding: 480 59911 462 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1665 1030 m 1,0,1 + 1545 956 1545 956 1470 805 c 0,2,3 + 1404 673 1404 673 1404 464 c 0,4,5 + 1405 433 1405 433 1406 404 c 1,6,-1 + 1241 404 l 1,7,8 + 1241 577 1241 577 1315 760 c 0,9,10 + 1388 944 1388 944 1537 1046 c 1,11,-1 + 1142 1046 l 1,12,-1 + 1142 1158 l 1,13,-1 + 1665 1158 l 1,14,-1 + 1665 1030 l 1,0,1 +1041 1046 m 1,15,-1 + 752 1046 l 1,16,-1 + 752 844 l 1,17,-1 + 976 844 l 1,18,-1 + 976 730 l 1,19,-1 + 752 730 l 1,20,-1 + 752 404 l 1,21,-1 + 582 404 l 1,22,-1 + 582 1159 l 1,23,-1 + 1041 1159 l 1,24,-1 + 1041 1046 l 1,15,-1 +1694 1536 m 1,25,-1 + 2048 1536 l 1,26,-1 + 2048 0 l 1,27,-1 + 1694 0 l 1,28,-1 + 1493 0 l 1,29,-1 + 727 0 l 1,30,-1 + 524 0 l 1,31,-1 + 172 0 l 1,32,-1 + 172 1536 l 1,33,-1 + 524 1536 l 1,34,-1 + 727 1536 l 1,35,-1 + 1493 1536 l 1,36,-1 + 1694 1536 l 1,25,-1 +1384 1364 m 1,37,-1 + 834 1364 l 1,38,-1 + 633 1364 l 1,39,-1 + 342 1364 l 1,40,-1 + 342 172 l 1,41,-1 + 633 172 l 1,42,-1 + 834 172 l 1,43,-1 + 1384 172 l 1,44,-1 + 1587 172 l 1,45,-1 + 1878 172 l 1,46,-1 + 1878 1364 l 1,47,-1 + 1587 1364 l 1,48,-1 + 1384 1364 l 1,37,-1 +EndSplineSet +EndChar + +StartChar: F6 +Encoding: 481 59910 463 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1694 676 m 0,0,1 + 1694 547 1694 547 1620 470 c 0,2,3 + 1547 394 1547 394 1417 394 c 0,4,5 + 1280 394 1280 394 1210 468 c 128,-1,6 + 1140 542 1140 542 1132 693 c 0,7,8 + 1131 702 1131 702 1131 716 c 128,-1,9 + 1131 730 1131 730 1131 730 c 0,10,11 + 1132 759 1132 759 1132 759 c 0,12,13 + 1131 772 1131 772 1131 788 c 0,14,15 + 1131 790 1131 790 1131 791 c 128,-1,16 + 1131 792 1131 792 1131 794 c 0,17,18 + 1130.98947368 795.378947368 1130.98947368 795.378947368 1130.98947368 796.757783934 c 0,19,20 + 1130.98947368 926.368421053 1130.98947368 926.368421053 1224 1055 c 0,21,22 + 1307 1170 1307 1170 1448 1170 c 0,23,24 + 1453 1170 1453 1170 1458 1170 c 0,25,26 + 1493 1170 1493 1170 1528 1164 c 0,27,28 + 1548 1161 1548 1161 1584 1154 c 1,29,-1 + 1584 1024 l 1,30,31 + 1549 1032 1549 1032 1519 1037 c 0,32,33 + 1488 1042 1488 1042 1458 1042 c 0,34,35 + 1456 1042 1456 1042 1453 1042 c 128,-1,36 + 1450 1042 1450 1042 1448 1042 c 128,-1,37 + 1446 1042 1446 1042 1443 1042 c 0,38,39 + 1440.84 1042.08 1440.84 1042.08 1438.704 1042.08 c 0,40,41 + 1387.44 1042.08 1387.44 1042.08 1350 996 c 0,42,43 + 1311 948 1311 948 1304 870 c 1,44,45 + 1319 895 1319 895 1363.5 915.5 c 128,-1,46 + 1408 936 1408 936 1447 936 c 0,47,48 + 1564 936 1564 936 1629 868 c 128,-1,49 + 1694 800 1694 800 1694 676 c 0,0,1 +1524 664 m 0,50,51 + 1524 744 1524 744 1493 781.5 c 128,-1,52 + 1462 819 1462 819 1410 819 c 0,53,54 + 1363 819 1363 819 1330 782 c 0,55,56 + 1296 744 1296 744 1296 664 c 0,57,58 + 1296 580 1296 580 1326 544 c 0,59,60 + 1356 509 1356 509 1410 509 c 0,61,62 + 1462 509 1462 509 1493 544.5 c 128,-1,63 + 1524 580 1524 580 1524 664 c 0,50,51 +1041 1046 m 1,64,-1 + 752 1046 l 1,65,-1 + 752 844 l 1,66,-1 + 976 844 l 1,67,-1 + 976 730 l 1,68,-1 + 752 730 l 1,69,-1 + 752 404 l 1,70,-1 + 582 404 l 1,71,-1 + 582 1159 l 1,72,-1 + 1041 1159 l 1,73,-1 + 1041 1046 l 1,64,-1 +1694 1536 m 1,74,-1 + 2048 1536 l 1,75,-1 + 2048 0 l 1,76,-1 + 1694 0 l 1,77,-1 + 1493 0 l 1,78,-1 + 727 0 l 1,79,-1 + 524 0 l 1,80,-1 + 172 0 l 1,81,-1 + 172 1536 l 1,82,-1 + 524 1536 l 1,83,-1 + 727 1536 l 1,84,-1 + 1493 1536 l 1,85,-1 + 1694 1536 l 1,74,-1 +1384 1364 m 1,86,-1 + 834 1364 l 1,87,-1 + 633 1364 l 1,88,-1 + 342 1364 l 1,89,-1 + 342 172 l 1,90,-1 + 633 172 l 1,91,-1 + 834 172 l 1,92,-1 + 1384 172 l 1,93,-1 + 1587 172 l 1,94,-1 + 1878 172 l 1,95,-1 + 1878 1364 l 1,96,-1 + 1587 1364 l 1,97,-1 + 1384 1364 l 1,86,-1 +EndSplineSet +EndChar + +StartChar: F5 +Encoding: 482 59909 464 +Width: 2220 +Flags: WO +LayerCount: 2 +Fore +SplineSet +1661 683 m 0,0,1 + 1661 530 1661 530 1579.5 462 c 128,-1,2 + 1498 394 1498 394 1369 394 c 0,3,4 + 1272 394 1272 394 1206 433 c 128,-1,5 + 1140 472 1140 472 1100 556 c 1,6,-1 + 1212 620 l 1,7,8 + 1235 562 1235 562 1273 537 c 0,9,10 + 1312 511 1312 511 1361 511 c 0,11,12 + 1424 511 1424 511 1456.5 550.5 c 128,-1,13 + 1489 590 1489 590 1489 668 c 0,14,15 + 1489 742 1489 742 1457 780 c 0,16,17 + 1424 817 1424 817 1365 817 c 0,18,19 + 1335 817 1335 817 1303 805 c 0,20,21 + 1272 794 1272 794 1241 768 c 1,22,-1 + 1142 824 l 1,23,-1 + 1157 1162 l 1,24,-1 + 1586 1162 l 1,25,-1 + 1586 1050 l 1,26,-1 + 1281 1050 l 1,27,-1 + 1274 910 l 1,28,29 + 1300 929 1300 929 1346 936 c 0,30,31 + 1390 943 1390 943 1409 943 c 0,32,33 + 1520 943 1520 943 1590.5 869.5 c 128,-1,34 + 1661 796 1661 796 1661 683 c 0,0,1 +1041 1046 m 1,35,-1 + 752 1046 l 1,36,-1 + 752 844 l 1,37,-1 + 976 844 l 1,38,-1 + 976 730 l 1,39,-1 + 752 730 l 1,40,-1 + 752 404 l 1,41,-1 + 582 404 l 1,42,-1 + 582 1159 l 1,43,-1 + 1041 1159 l 1,44,-1 + 1041 1046 l 1,35,-1 +1694 1536 m 1,45,-1 + 2048 1536 l 1,46,-1 + 2048 0 l 1,47,-1 + 1694 0 l 1,48,-1 + 1493 0 l 1,49,-1 + 727 0 l 1,50,-1 + 524 0 l 1,51,-1 + 172 0 l 1,52,-1 + 172 1536 l 1,53,-1 + 524 1536 l 1,54,-1 + 727 1536 l 1,55,-1 + 1493 1536 l 1,56,-1 + 1694 1536 l 1,45,-1 +1384 1364 m 1,57,-1 + 834 1364 l 1,58,-1 + 633 1364 l 1,59,-1 + 342 1364 l 1,60,-1 + 342 172 l 1,61,-1 + 633 172 l 1,62,-1 + 834 172 l 1,63,-1 + 1384 172 l 1,64,-1 + 1587 172 l 1,65,-1 + 1878 172 l 1,66,-1 + 1878 1364 l 1,67,-1 + 1587 1364 l 1,68,-1 + 1384 1364 l 1,57,-1 +EndSplineSet +EndChar + +StartChar: F4 +Encoding: 483 59908 465 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1620 625 m 1,0,-1 + 1566 625 l 1,1,-1 + 1566 406 l 1,2,-1 + 1413 406 l 1,3,-1 + 1413 625 l 1,4,-1 + 1082 625 l 1,5,-1 + 1074 770 l 1,6,-1 + 1464 1160 l 1,7,-1 + 1566 1160 l 1,8,-1 + 1566 734 l 1,9,-1 + 1620 734 l 1,10,-1 + 1620 625 l 1,0,-1 +1415 734 m 1,11,-1 + 1415 964 l 1,12,-1 + 1186 734 l 1,13,-1 + 1415 734 l 1,11,-1 +1041 1046 m 1,14,-1 + 752 1046 l 1,15,-1 + 752 844 l 1,16,-1 + 976 844 l 1,17,-1 + 976 730 l 1,18,-1 + 752 730 l 1,19,-1 + 752 404 l 1,20,-1 + 582 404 l 1,21,-1 + 582 1159 l 1,22,-1 + 1041 1159 l 1,23,-1 + 1041 1046 l 1,14,-1 +1694 1536 m 1,24,-1 + 2048 1536 l 1,25,-1 + 2048 0 l 1,26,-1 + 1694 0 l 1,27,-1 + 1493 0 l 1,28,-1 + 727 0 l 1,29,-1 + 524 0 l 1,30,-1 + 172 0 l 1,31,-1 + 172 1536 l 1,32,-1 + 524 1536 l 1,33,-1 + 727 1536 l 1,34,-1 + 1493 1536 l 1,35,-1 + 1694 1536 l 1,24,-1 +1384 1364 m 1,36,-1 + 834 1364 l 1,37,-1 + 633 1364 l 1,38,-1 + 342 1364 l 1,39,-1 + 342 172 l 1,40,-1 + 633 172 l 1,41,-1 + 834 172 l 1,42,-1 + 1384 172 l 1,43,-1 + 1587 172 l 1,44,-1 + 1878 172 l 1,45,-1 + 1878 1364 l 1,46,-1 + 1587 1364 l 1,47,-1 + 1384 1364 l 1,36,-1 +EndSplineSet +EndChar + +StartChar: F3 +Encoding: 484 59907 466 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1640 624 m 0,0,1 + 1640 519 1640 519 1567.5 455.5 c 128,-1,2 + 1495 392 1495 392 1377 392 c 0,3,4 + 1274 392 1274 392 1208 431 c 128,-1,5 + 1142 470 1142 470 1109 530 c 1,6,-1 + 1212 594 l 1,7,8 + 1226 560 1226 560 1266 534 c 0,9,10 + 1306 509 1306 509 1362 509 c 0,11,12 + 1417 509 1417 509 1449 542 c 0,13,14 + 1482 576 1482 576 1482 634 c 0,15,16 + 1482 635 1482 635 1482 637 c 0,17,18 + 1482 682 1482 682 1452 716 c 0,19,20 + 1424 748 1424 748 1364 748 c 2,21,-1 + 1288 748 l 1,22,-1 + 1288 854 l 1,23,-1 + 1368 854 l 2,24,25 + 1421 854 1421 854 1446 878 c 0,26,27 + 1472 903 1472 903 1472 952 c 0,28,29 + 1472 954 1472 954 1472 956 c 128,-1,30 + 1472 958 1472 958 1472 960 c 128,-1,31 + 1472 962 1472 962 1472 964 c 0,32,33 + 1472.04545455 965.636363636 1472.04545455 965.636363636 1472.04545455 967.256198347 c 0,34,35 + 1472.04545455 1001.27272727 1472.04545455 1001.27272727 1452 1028 c 0,36,37 + 1431 1056 1431 1056 1384 1056 c 0,38,39 + 1342 1056 1342 1056 1318.5 1041 c 128,-1,40 + 1295 1026 1295 1026 1283 1000 c 1,41,-1 + 1148 1000 l 1,42,43 + 1162 1070 1162 1070 1221 1120 c 128,-1,44 + 1280 1170 1280 1170 1384 1170 c 0,45,46 + 1386 1170 1386 1170 1388 1170 c 128,-1,47 + 1390 1170 1390 1170 1392 1170 c 128,-1,48 + 1394 1170 1394 1170 1396 1170 c 128,-1,49 + 1397.88135593 1170.01694915 1397.88135593 1170.01694915 1399.74834818 1170.01694915 c 0,50,51 + 1508.03389831 1170.01694915 1508.03389831 1170.01694915 1568 1113 c 0,52,53 + 1629 1055 1629 1055 1629 974 c 0,54,55 + 1629 901 1629 901 1592 861 c 0,56,57 + 1556 822 1556 822 1512 810 c 1,58,59 + 1566 790 1566 790 1603 744 c 128,-1,60 + 1640 698 1640 698 1640 624 c 0,0,1 +1041 1046 m 1,61,-1 + 752 1046 l 1,62,-1 + 752 844 l 1,63,-1 + 976 844 l 1,64,-1 + 976 730 l 1,65,-1 + 752 730 l 1,66,-1 + 752 404 l 1,67,-1 + 582 404 l 1,68,-1 + 582 1159 l 1,69,-1 + 1041 1159 l 1,70,-1 + 1041 1046 l 1,61,-1 +1694 1536 m 1,71,-1 + 2048 1536 l 1,72,-1 + 2048 0 l 1,73,-1 + 1694 0 l 1,74,-1 + 1493 0 l 1,75,-1 + 727 0 l 1,76,-1 + 524 0 l 1,77,-1 + 172 0 l 1,78,-1 + 172 1536 l 1,79,-1 + 524 1536 l 1,80,-1 + 727 1536 l 1,81,-1 + 1493 1536 l 1,82,-1 + 1694 1536 l 1,71,-1 +1384 1364 m 1,83,-1 + 834 1364 l 1,84,-1 + 633 1364 l 1,85,-1 + 342 1364 l 1,86,-1 + 342 172 l 1,87,-1 + 633 172 l 1,88,-1 + 834 172 l 1,89,-1 + 1384 172 l 1,90,-1 + 1587 172 l 1,91,-1 + 1878 172 l 1,92,-1 + 1878 1364 l 1,93,-1 + 1587 1364 l 1,94,-1 + 1384 1364 l 1,83,-1 +EndSplineSet +EndChar + +StartChar: F2 +Encoding: 485 59906 467 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1661 404 m 1,0,-1 + 1147 404 l 1,1,-1 + 1147 531 l 1,2,3 + 1342 699 1342 699 1414 782 c 128,-1,4 + 1486 865 1486 865 1486 932 c 0,5,6 + 1486 982 1486 982 1462.5 1018 c 128,-1,7 + 1439 1054 1439 1054 1388 1054 c 0,8,9 + 1332 1054 1332 1054 1314 1033 c 128,-1,10 + 1296 1012 1296 1012 1287 984 c 1,11,-1 + 1142 984 l 1,12,13 + 1164 1080 1164 1080 1234 1124 c 0,14,15 + 1304 1169 1304 1169 1412 1169 c 0,16,17 + 1529 1169 1529 1169 1592 1107 c 128,-1,18 + 1655 1045 1655 1045 1655 953 c 0,19,20 + 1655 854 1655 854 1568.5 752.5 c 128,-1,21 + 1482 651 1482 651 1287 516 c 1,22,-1 + 1661 516 l 1,23,-1 + 1661 404 l 1,0,-1 +1041 1046 m 1,24,-1 + 752 1046 l 1,25,-1 + 752 844 l 1,26,-1 + 976 844 l 1,27,-1 + 976 730 l 1,28,-1 + 752 730 l 1,29,-1 + 752 404 l 1,30,-1 + 582 404 l 1,31,-1 + 582 1159 l 1,32,-1 + 1041 1159 l 1,33,-1 + 1041 1046 l 1,24,-1 +1694 1536 m 1,34,-1 + 2048 1536 l 1,35,-1 + 2048 0 l 1,36,-1 + 1694 0 l 1,37,-1 + 1493 0 l 1,38,-1 + 727 0 l 1,39,-1 + 524 0 l 1,40,-1 + 172 0 l 1,41,-1 + 172 1536 l 1,42,-1 + 524 1536 l 1,43,-1 + 727 1536 l 1,44,-1 + 1493 1536 l 1,45,-1 + 1694 1536 l 1,34,-1 +1384 1364 m 1,46,-1 + 834 1364 l 1,47,-1 + 633 1364 l 1,48,-1 + 342 1364 l 1,49,-1 + 342 172 l 1,50,-1 + 633 172 l 1,51,-1 + 834 172 l 1,52,-1 + 1384 172 l 1,53,-1 + 1587 172 l 1,54,-1 + 1878 172 l 1,55,-1 + 1878 1364 l 1,56,-1 + 1587 1364 l 1,57,-1 + 1384 1364 l 1,46,-1 +EndSplineSet +EndChar + +StartChar: F1 +Encoding: 486 59905 468 +Width: 2220 +Flags: W +LayerCount: 2 +Fore +SplineSet +1534 404 m 1,0,-1 + 1379 404 l 1,1,-1 + 1379 978 l 1,2,-1 + 1274 978 l 1,3,-1 + 1274 1070 l 1,4,5 + 1345 1076 1345 1076 1383 1108 c 128,-1,6 + 1421 1140 1421 1140 1432 1158 c 1,7,-1 + 1534 1158 l 1,8,-1 + 1534 404 l 1,0,-1 +1081 1046 m 1,9,-1 + 792 1046 l 1,10,-1 + 792 844 l 1,11,-1 + 1016 844 l 1,12,-1 + 1016 730 l 1,13,-1 + 792 730 l 1,14,-1 + 792 404 l 1,15,-1 + 622 404 l 1,16,-1 + 622 1159 l 1,17,-1 + 1081 1159 l 1,18,-1 + 1081 1046 l 1,9,-1 +1694 1536 m 1,19,-1 + 2048 1536 l 1,20,-1 + 2048 0 l 1,21,-1 + 1694 0 l 1,22,-1 + 1493 0 l 1,23,-1 + 727 0 l 1,24,-1 + 524 0 l 1,25,-1 + 172 0 l 1,26,-1 + 172 1536 l 1,27,-1 + 524 1536 l 1,28,-1 + 727 1536 l 1,29,-1 + 1493 1536 l 1,30,-1 + 1694 1536 l 1,19,-1 +1384 1364 m 1,31,-1 + 834 1364 l 1,32,-1 + 633 1364 l 1,33,-1 + 342 1364 l 1,34,-1 + 342 172 l 1,35,-1 + 633 172 l 1,36,-1 + 834 172 l 1,37,-1 + 1384 172 l 1,38,-1 + 1587 172 l 1,39,-1 + 1878 172 l 1,40,-1 + 1878 1364 l 1,41,-1 + 1587 1364 l 1,42,-1 + 1384 1364 l 1,31,-1 +EndSplineSet +EndChar +EndChars +EndSplineFont diff --git a/libmui/fonts/Dingbat.ttf b/libmui/fonts/Dingbat.ttf new file mode 100644 index 0000000..8410129 Binary files /dev/null and b/libmui/fonts/Dingbat.ttf differ diff --git a/libmui/fonts/apple2e_original_font_MotterTekturaRetro.otf b/libmui/fonts/apple2e_original_font_MotterTekturaRetro.otf new file mode 100644 index 0000000..d94a9b6 Binary files /dev/null and b/libmui/fonts/apple2e_original_font_MotterTekturaRetro.otf differ diff --git a/libmui/fonts/typicon.ttf b/libmui/fonts/typicon.ttf new file mode 100644 index 0000000..f7df94b Binary files /dev/null and b/libmui/fonts/typicon.ttf differ diff --git a/libmui/fonts/typicons.sfd b/libmui/fonts/typicons.sfd new file mode 100644 index 0000000..1218eb6 --- /dev/null +++ b/libmui/fonts/typicons.sfd @@ -0,0 +1,53788 @@ +SplineFontDB: 3.2 +FontName: typicons +FullName: Typicons +FamilyName: Typicons +Weight: Book +Copyright: (c) Stephen Hutchings 2012 +Version: 2.0.3 ; ttfautohint (v0.95) -l 8 -r 50 -G 200 -x 14 -w "G" -f -s +ItalicAngle: 0 +UnderlinePosition: -150 +UnderlineWidth: 50 +Ascent: 800 +Descent: 200 +InvalidEm: 0 +sfntRevision: 0x00020000 +LayerCount: 2 +Layer: 0 1 "Back" 1 +Layer: 1 1 "Fore" 0 +XUID: [1021 220 -731427345 1949850] +StyleMap: 0x0040 +FSType: 0 +OS2Version: 4 +OS2_WeightWidthSlopeOnly: 0 +OS2_UseTypoMetrics: 1 +CreationTime: 1406487198 +ModificationTime: 1699820978 +PfmFamily: 17 +TTFWeight: 400 +TTFWidth: 5 +LineGap: 90 +VLineGap: 0 +Panose: 2 0 5 3 0 0 0 0 0 0 +OS2TypoAscent: 800 +OS2TypoAOffset: 0 +OS2TypoDescent: -200 +OS2TypoDOffset: 0 +OS2TypoLinegap: 90 +OS2WinAscent: 800 +OS2WinAOffset: 0 +OS2WinDescent: 242 +OS2WinDOffset: 0 +HheadAscent: 800 +HheadAOffset: 0 +HheadDescent: -242 +HheadDOffset: 0 +OS2SubXSize: 650 +OS2SubYSize: 700 +OS2SubXOff: 0 +OS2SubYOff: 140 +OS2SupXSize: 650 +OS2SupYSize: 700 +OS2SupXOff: 0 +OS2SupYOff: 480 +OS2StrikeYSize: 49 +OS2StrikeYPos: 258 +OS2Vendor: 'PfEd' +OS2CodePages: 00000001.00000000 +OS2UnicodeRanges: 00000000.10000000.00000000.00000000 +DEI: 91125 +TtTable: prep +MPPEM +PUSHW_1 + 200 +GT +IF +PUSHB_2 + 1 + 1 +INSTCTRL +EIF +PUSHW_2 + 2048 + 2048 +MUL +DUP +PUSHB_1 + 1 +SWAP +WCVTP +PUSHB_1 + 3 +SWAP +WCVTF +PUSHB_3 + 4 + 40 + 9 +RCVT +GT +WCVTP +PUSHB_3 + 10 + 2 + 7 +LOOPCALL +PUSHB_2 + 6 + 1 +WCVTP +PUSHB_2 + 36 + 1 +GETINFO +LTEQ +IF +PUSHB_1 + 64 +GETINFO +IF +PUSHB_2 + 6 + 3 +WCVTP +PUSHB_2 + 38 + 1 +GETINFO +LTEQ +IF +PUSHW_1 + 1024 +GETINFO +IF +PUSHB_2 + 6 + 1 +WCVTP +EIF +EIF +EIF +EIF +PUSHW_1 + 511 +SCANCTRL +PUSHB_1 + 4 +SCANTYPE +PUSHB_2 + 5 + 0 +WCVTP +EndTTInstrs +TtTable: fpgm +PUSHB_1 + 0 +FDEF +PUSHB_1 + 32 +ADD +FLOOR +ENDF +PUSHB_1 + 1 +FDEF +DUP +ABS +DUP +PUSHB_1 + 192 +LT +PUSHB_1 + 4 +MINDEX +AND +PUSHB_1 + 4 +RCVT +OR +IF +POP +SWAP +POP +ELSE +ROLL +IF +DUP +PUSHB_1 + 80 +LT +IF +POP +PUSHB_1 + 64 +EIF +ELSE +DUP +PUSHB_1 + 56 +LT +IF +POP +PUSHB_1 + 56 +EIF +EIF +DUP +PUSHB_1 + 10 +RCVT +SUB +ABS +PUSHB_1 + 40 +LT +IF +POP +PUSHB_1 + 10 +RCVT +DUP +PUSHB_1 + 48 +LT +IF +POP +PUSHB_1 + 48 +EIF +ELSE +DUP +PUSHB_1 + 192 +LT +IF +DUP +FLOOR +DUP +ROLL +ROLL +SUB +DUP +PUSHB_1 + 10 +LT +IF +ADD +ELSE +DUP +PUSHB_1 + 32 +LT +IF +POP +PUSHB_1 + 10 +ADD +ELSE +DUP +PUSHB_1 + 54 +LT +IF +POP +PUSHB_1 + 54 +ADD +ELSE +ADD +EIF +EIF +EIF +ELSE +PUSHB_1 + 0 +CALL +EIF +EIF +SWAP +PUSHB_1 + 0 +LT +IF +NEG +EIF +EIF +ENDF +PUSHB_1 + 2 +FDEF +DUP +RCVT +DUP +PUSHB_1 + 4 +CINDEX +SUB +ABS +DUP +PUSHB_1 + 5 +RS +LT +IF +PUSHB_1 + 5 +SWAP +WS +PUSHB_1 + 6 +SWAP +WS +ELSE +POP +POP +EIF +PUSHB_1 + 1 +ADD +ENDF +PUSHB_1 + 3 +FDEF +SWAP +POP +SWAP +POP +DUP +ABS +PUSHB_2 + 5 + 98 +WS +DUP +PUSHB_1 + 6 +SWAP +WS +PUSHB_3 + 10 + 0 + 2 +LOOPCALL +POP +DUP +PUSHB_1 + 6 +RS +DUP +ROLL +DUP +ROLL +PUSHB_1 + 0 +CALL +PUSHB_2 + 48 + 5 +CINDEX +ROLL +LTEQ +IF +ADD +LT +ELSE +SUB +GT +EIF +IF +SWAP +EIF +POP +DUP +PUSHB_1 + 64 +GTEQ +IF +PUSHB_1 + 0 +CALL +ELSE +POP +PUSHB_1 + 64 +EIF +SWAP +PUSHB_1 + 0 +LT +IF +NEG +EIF +ENDF +PUSHB_1 + 4 +FDEF +PUSHB_1 + 7 +RS +CALL +PUSHB_3 + 0 + 2 + 0 +RS +ADD +WS +ENDF +PUSHB_1 + 5 +FDEF +PUSHB_1 + 7 +SWAP +WS +SWAP +DUP +PUSHB_1 + 0 +SWAP +WS +SUB +PUSHB_1 + 128 +DIV +PUSHB_1 + 1 +ADD +PUSHB_1 + 4 +LOOPCALL +ENDF +PUSHB_1 + 6 +FDEF +DUP +DUP +RCVT +DUP +PUSHB_1 + 2 +RCVT +MUL +PUSHB_1 + 1 +RCVT +DIV +ADD +WCVTP +PUSHB_1 + 1 +ADD +ENDF +PUSHB_1 + 7 +FDEF +DUP +DUP +RCVT +DUP +PUSHB_1 + 0 +CALL +SWAP +PUSHB_2 + 2 + 4 +CINDEX +ADD +DUP +RCVT +ROLL +SWAP +SUB +DUP +ABS +DUP +PUSHB_1 + 32 +LT +IF +POP +PUSHB_1 + 0 +ELSE +PUSHB_1 + 48 +LT +IF +PUSHB_1 + 32 +ELSE +PUSHB_1 + 64 +EIF +EIF +SWAP +PUSHB_1 + 0 +LT +IF +NEG +EIF +PUSHB_1 + 3 +CINDEX +SWAP +SUB +WCVTP +WCVTP +PUSHB_1 + 1 +ADD +ENDF +PUSHB_1 + 8 +FDEF +PUSHB_2 + 5 + 5 +RCVT +PUSHB_1 + 1 +SUB +WCVTP +ENDF +PUSHB_1 + 9 +FDEF +PUSHB_1 + 1 +ADD +DUP +DUP +PUSHB_1 + 9 +RS +MD[orig] +PUSHB_1 + 0 +LT +IF +DUP +PUSHB_1 + 9 +SWAP +WS +EIF +PUSHB_1 + 10 +RS +MD[orig] +PUSHB_1 + 0 +GT +IF +DUP +PUSHB_1 + 10 +SWAP +WS +EIF +ENDF +PUSHB_1 + 10 +FDEF +DUP +PUSHW_1 + 1024 +DIV +DUP +PUSHW_1 + 1024 +MUL +ROLL +SWAP +SUB +PUSHB_1 + 11 +RS +ADD +DUP +ROLL +ADD +DUP +PUSHB_1 + 11 +SWAP +WS +SWAP +ENDF +PUSHB_1 + 11 +FDEF +MPPEM +EQ +IF +PUSHB_2 + 7 + 1 +WCVTP +EIF +DEPTH +PUSHB_1 + 13 +NEG +SWAP +JROT +ENDF +PUSHB_1 + 12 +FDEF +MPPEM +LTEQ +IF +MPPEM +GTEQ +IF +PUSHB_2 + 7 + 1 +WCVTP +EIF +ELSE +POP +EIF +DEPTH +PUSHB_1 + 19 +NEG +SWAP +JROT +ENDF +PUSHB_1 + 13 +FDEF +PUSHB_2 + 0 + 12 +RS +NEQ +IF +PUSHB_2 + 12 + 12 +RS +PUSHB_1 + 1 +SUB +WS +PUSHB_1 + 10 +CALL +EIF +PUSHB_1 + 0 +RS +PUSHB_1 + 2 +CINDEX +WS +PUSHB_2 + 9 + 2 +CINDEX +WS +PUSHB_2 + 10 + 2 +CINDEX +WS +PUSHB_1 + 1 +SZPS +SWAP +DUP +PUSHB_1 + 3 +CINDEX +LT +IF +PUSHB_2 + 1 + 0 +RS +ADD +PUSHB_1 + 4 +CINDEX +WS +ROLL +ROLL +DUP +ROLL +SWAP +SUB +PUSHB_1 + 9 +LOOPCALL +POP +SWAP +PUSHB_1 + 1 +SUB +DUP +ROLL +SWAP +SUB +PUSHB_1 + 9 +LOOPCALL +POP +ELSE +PUSHB_2 + 1 + 0 +RS +ADD +PUSHB_1 + 2 +CINDEX +WS +PUSHB_1 + 2 +CINDEX +SUB +PUSHB_1 + 9 +LOOPCALL +POP +EIF +PUSHB_1 + 9 +RS +GC[orig] +PUSHB_1 + 10 +RS +GC[orig] +ADD +PUSHB_1 + 128 +DIV +DUP +PUSHB_1 + 2 +RCVT +MUL +PUSHB_1 + 1 +RCVT +DIV +ADD +PUSHB_2 + 0 + 0 +SZP0 +SWAP +WCVTP +PUSHB_1 + 1 +RS +PUSHB_1 + 0 +MIAP[no-rnd] +PUSHB_3 + 1 + 1 + 1 +RS +ADD +WS +ENDF +PUSHB_1 + 14 +FDEF +PUSHB_2 + 0 + 5 +RCVT +EQ +IF +SVTCA[y-axis] +PUSHB_1 + 12 +SWAP +WS +DUP +ADD +PUSHB_1 + 1 +SUB +PUSHB_6 + 13 + 13 + 1 + 0 + 11 + 0 +WS +WS +ROLL +ADD +PUSHB_2 + 13 + 5 +CALL +PUSHB_1 + 109 +CALL +ELSE +CLEAR +EIF +ENDF +PUSHB_1 + 15 +FDEF +PUSHB_2 + 0 + 14 +CALL +ENDF +PUSHB_1 + 16 +FDEF +PUSHB_2 + 1 + 14 +CALL +ENDF +PUSHB_1 + 17 +FDEF +PUSHB_2 + 2 + 14 +CALL +ENDF +PUSHB_1 + 18 +FDEF +PUSHB_2 + 3 + 14 +CALL +ENDF +PUSHB_1 + 19 +FDEF +PUSHB_2 + 4 + 14 +CALL +ENDF +PUSHB_1 + 20 +FDEF +PUSHB_2 + 5 + 14 +CALL +ENDF +PUSHB_1 + 21 +FDEF +PUSHB_2 + 6 + 14 +CALL +ENDF +PUSHB_1 + 22 +FDEF +PUSHB_2 + 7 + 14 +CALL +ENDF +PUSHB_1 + 23 +FDEF +PUSHB_2 + 8 + 14 +CALL +ENDF +PUSHB_1 + 24 +FDEF +PUSHB_2 + 9 + 14 +CALL +ENDF +PUSHB_1 + 25 +FDEF +PUSHB_1 + 8 +CALL +PUSHB_2 + 0 + 5 +RCVT +EQ +IF +SVTCA[y-axis] +PUSHB_1 + 12 +SWAP +WS +DUP +ADD +PUSHB_1 + 1 +SUB +PUSHB_6 + 13 + 13 + 1 + 0 + 11 + 0 +WS +WS +ROLL +ADD +PUSHB_2 + 13 + 5 +CALL +PUSHB_1 + 109 +CALL +ELSE +CLEAR +EIF +ENDF +PUSHB_1 + 26 +FDEF +PUSHB_2 + 0 + 25 +CALL +ENDF +PUSHB_1 + 27 +FDEF +PUSHB_2 + 1 + 25 +CALL +ENDF +PUSHB_1 + 28 +FDEF +PUSHB_2 + 2 + 25 +CALL +ENDF +PUSHB_1 + 29 +FDEF +PUSHB_2 + 3 + 25 +CALL +ENDF +PUSHB_1 + 30 +FDEF +PUSHB_2 + 4 + 25 +CALL +ENDF +PUSHB_1 + 31 +FDEF +PUSHB_2 + 5 + 25 +CALL +ENDF +PUSHB_1 + 32 +FDEF +PUSHB_2 + 6 + 25 +CALL +ENDF +PUSHB_1 + 33 +FDEF +PUSHB_2 + 7 + 25 +CALL +ENDF +PUSHB_1 + 34 +FDEF +PUSHB_2 + 8 + 25 +CALL +ENDF +PUSHB_1 + 35 +FDEF +PUSHB_2 + 9 + 25 +CALL +ENDF +PUSHB_1 + 36 +FDEF +DUP +ALIGNRP +PUSHB_1 + 1 +ADD +ENDF +PUSHB_1 + 37 +FDEF +DUP +ADD +PUSHB_1 + 13 +ADD +DUP +RS +SWAP +PUSHB_1 + 1 +ADD +RS +PUSHB_1 + 2 +CINDEX +SUB +PUSHB_1 + 1 +ADD +PUSHB_1 + 36 +LOOPCALL +POP +ENDF +PUSHB_1 + 38 +FDEF +PUSHB_1 + 37 +CALL +PUSHB_1 + 37 +LOOPCALL +ENDF +PUSHB_1 + 39 +FDEF +DUP +DUP +GC[orig] +DUP +DUP +PUSHB_1 + 2 +RCVT +MUL +PUSHB_1 + 1 +RCVT +DIV +ADD +SWAP +SUB +SHPIX +SWAP +DUP +ROLL +NEQ +IF +DUP +GC[orig] +DUP +DUP +PUSHB_1 + 2 +RCVT +MUL +PUSHB_1 + 1 +RCVT +DIV +ADD +SWAP +SUB +SHPIX +ELSE +POP +EIF +ENDF +PUSHB_1 + 40 +FDEF +PUSHB_2 + 0 + 5 +RCVT +EQ +IF +SVTCA[y-axis] +PUSHB_1 + 1 +SZPS +PUSHB_1 + 39 +LOOPCALL +PUSHB_1 + 1 +SZP2 +IUP[y] +ELSE +CLEAR +EIF +ENDF +PUSHB_1 + 41 +FDEF +PUSHB_1 + 8 +CALL +PUSHB_2 + 0 + 5 +RCVT +EQ +IF +SVTCA[y-axis] +PUSHB_1 + 1 +SZPS +PUSHB_1 + 39 +LOOPCALL +PUSHB_1 + 1 +SZP2 +IUP[y] +ELSE +CLEAR +EIF +ENDF +PUSHB_1 + 42 +FDEF +DUP +SHC[rp1] +PUSHB_1 + 1 +ADD +ENDF +PUSHB_1 + 43 +FDEF +SVTCA[y-axis] +PUSHB_1 + 3 +RCVT +MUL +PUSHB_1 + 1 +RCVT +DIV +PUSHB_1 + 0 +CALL +PUSHB_1 + 2 +RCVT +MUL +PUSHB_1 + 1 +RCVT +DIV +PUSHB_1 + 0 +CALL +PUSHB_1 + 0 +SZPS +PUSHB_5 + 0 + 0 + 0 + 0 + 0 +WCVTP +MIAP[no-rnd] +SWAP +SHPIX +PUSHB_2 + 42 + 1 +SZP2 +LOOPCALL +ENDF +PUSHB_1 + 44 +FDEF +DUP +ALIGNRP +DUP +GC[orig] +DUP +PUSHB_1 + 2 +RCVT +MUL +PUSHB_1 + 1 +RCVT +DIV +ADD +PUSHB_1 + 0 +RS +SUB +SHPIX +ENDF +PUSHB_1 + 45 +FDEF +MDAP[no-rnd] +SLOOP +ALIGNRP +ENDF +PUSHB_1 + 46 +FDEF +DUP +ALIGNRP +DUP +GC[orig] +DUP +PUSHB_1 + 2 +RCVT +MUL +PUSHB_1 + 1 +RCVT +DIV +ADD +PUSHB_1 + 0 +RS +SUB +PUSHB_1 + 1 +RS +MUL +SHPIX +ENDF +PUSHB_1 + 47 +FDEF +PUSHB_2 + 2 + 0 +SZPS +CINDEX +DUP +MDAP[no-rnd] +DUP +GC[orig] +PUSHB_1 + 0 +SWAP +WS +PUSHB_1 + 2 +CINDEX +MD[grid] +ROLL +ROLL +GC[orig] +SWAP +GC[orig] +SWAP +SUB +DUP +IF +DIV +ELSE +POP +EIF +PUSHB_1 + 1 +SWAP +WS +PUSHB_3 + 46 + 1 + 1 +SZP2 +SZP1 +LOOPCALL +ENDF +PUSHB_1 + 48 +FDEF +PUSHB_1 + 0 +SZPS +PUSHB_1 + 4 +CINDEX +PUSHB_1 + 4 +CINDEX +GC[orig] +SWAP +GC[orig] +SWAP +SUB +PUSHB_1 + 6 +RCVT +CALL +NEG +ROLL +MDAP[no-rnd] +SWAP +DUP +DUP +ALIGNRP +ROLL +SHPIX +ENDF +PUSHB_1 + 49 +FDEF +PUSHB_1 + 0 +SZPS +PUSHB_1 + 4 +CINDEX +PUSHB_1 + 4 +CINDEX +DUP +MDAP[no-rnd] +GC[orig] +SWAP +GC[orig] +SWAP +SUB +DUP +PUSHB_1 + 4 +SWAP +WS +PUSHB_1 + 6 +RCVT +CALL +DUP +PUSHB_1 + 96 +LT +IF +DUP +PUSHB_1 + 64 +LTEQ +IF +PUSHB_4 + 2 + 32 + 3 + 32 +ELSE +PUSHB_4 + 2 + 38 + 3 + 26 +EIF +WS +WS +SWAP +DUP +PUSHB_1 + 8 +RS +DUP +ROLL +SWAP +GC[orig] +SWAP +GC[orig] +SWAP +SUB +SWAP +GC[cur] +ADD +PUSHB_1 + 4 +RS +PUSHB_1 + 128 +DIV +ADD +DUP +PUSHB_1 + 0 +CALL +DUP +ROLL +ROLL +SUB +DUP +PUSHB_1 + 2 +RS +ADD +ABS +SWAP +PUSHB_1 + 3 +RS +SUB +ABS +LT +IF +PUSHB_1 + 2 +RS +SUB +ELSE +PUSHB_1 + 3 +RS +ADD +EIF +PUSHB_1 + 3 +CINDEX +PUSHB_1 + 128 +DIV +SUB +SWAP +DUP +DUP +PUSHB_1 + 4 +MINDEX +SWAP +GC[cur] +SUB +SHPIX +ELSE +SWAP +PUSHB_1 + 8 +RS +GC[cur] +PUSHB_1 + 2 +CINDEX +PUSHB_1 + 8 +RS +GC[orig] +SWAP +GC[orig] +SWAP +SUB +ADD +DUP +PUSHB_1 + 4 +RS +PUSHB_1 + 128 +DIV +ADD +SWAP +DUP +PUSHB_1 + 0 +CALL +SWAP +PUSHB_1 + 4 +RS +ADD +PUSHB_1 + 0 +CALL +PUSHB_1 + 5 +CINDEX +SUB +PUSHB_1 + 5 +CINDEX +PUSHB_1 + 128 +DIV +PUSHB_1 + 4 +MINDEX +SUB +DUP +PUSHB_1 + 4 +CINDEX +ADD +ABS +SWAP +PUSHB_1 + 3 +CINDEX +ADD +ABS +LT +IF +POP +ELSE +SWAP +POP +EIF +SWAP +DUP +DUP +PUSHB_1 + 4 +MINDEX +SWAP +GC[cur] +SUB +SHPIX +EIF +ENDF +PUSHB_1 + 50 +FDEF +PUSHB_1 + 0 +SZPS +DUP +DUP +DUP +PUSHB_1 + 5 +MINDEX +DUP +MDAP[no-rnd] +GC[orig] +SWAP +GC[orig] +SWAP +SUB +SWAP +ALIGNRP +SHPIX +ENDF +PUSHB_1 + 51 +FDEF +PUSHB_1 + 0 +SZPS +DUP +PUSHB_1 + 8 +SWAP +WS +DUP +DUP +DUP +GC[cur] +SWAP +GC[orig] +PUSHB_1 + 0 +CALL +SWAP +SUB +SHPIX +ENDF +PUSHB_1 + 52 +FDEF +PUSHB_1 + 0 +SZPS +PUSHB_1 + 3 +CINDEX +PUSHB_1 + 2 +CINDEX +GC[orig] +SWAP +GC[orig] +SWAP +SUB +PUSHB_1 + 0 +EQ +IF +MDAP[no-rnd] +DUP +ALIGNRP +SWAP +POP +ELSE +PUSHB_1 + 2 +CINDEX +PUSHB_1 + 2 +CINDEX +GC[orig] +SWAP +GC[orig] +SWAP +SUB +DUP +PUSHB_1 + 5 +CINDEX +PUSHB_1 + 4 +CINDEX +GC[orig] +SWAP +GC[orig] +SWAP +SUB +PUSHB_1 + 6 +CINDEX +PUSHB_1 + 5 +CINDEX +MD[grid] +PUSHB_1 + 2 +CINDEX +SUB +PUSHB_1 + 1 +RCVT +MUL +SWAP +DUP +IF +DIV +ELSE +POP +EIF +MUL +PUSHB_1 + 1 +RCVT +DIV +ADD +SWAP +MDAP[no-rnd] +SWAP +DUP +DUP +ALIGNRP +ROLL +SHPIX +SWAP +POP +EIF +ENDF +PUSHB_1 + 53 +FDEF +PUSHB_1 + 0 +SZPS +DUP +PUSHB_1 + 8 +RS +DUP +MDAP[no-rnd] +GC[orig] +SWAP +GC[orig] +SWAP +SUB +DUP +ADD +PUSHB_1 + 32 +ADD +FLOOR +PUSHB_1 + 128 +DIV +SWAP +DUP +DUP +ALIGNRP +ROLL +SHPIX +ENDF +PUSHB_1 + 54 +FDEF +SWAP +DUP +MDAP[no-rnd] +GC[cur] +PUSHB_1 + 2 +CINDEX +GC[cur] +GT +IF +DUP +ALIGNRP +EIF +MDAP[no-rnd] +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 55 +FDEF +SWAP +DUP +MDAP[no-rnd] +GC[cur] +PUSHB_1 + 2 +CINDEX +GC[cur] +LT +IF +DUP +ALIGNRP +EIF +MDAP[no-rnd] +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 56 +FDEF +SWAP +DUP +MDAP[no-rnd] +GC[cur] +PUSHB_1 + 2 +CINDEX +GC[cur] +GT +IF +DUP +ALIGNRP +EIF +SWAP +DUP +MDAP[no-rnd] +GC[cur] +PUSHB_1 + 2 +CINDEX +GC[cur] +LT +IF +DUP +ALIGNRP +EIF +MDAP[no-rnd] +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 57 +FDEF +PUSHB_1 + 48 +CALL +SWAP +DUP +MDAP[no-rnd] +GC[cur] +PUSHB_1 + 2 +CINDEX +GC[cur] +GT +IF +DUP +ALIGNRP +EIF +MDAP[no-rnd] +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 58 +FDEF +PUSHB_1 + 49 +CALL +ROLL +DUP +DUP +ALIGNRP +PUSHB_1 + 4 +SWAP +WS +ROLL +SHPIX +SWAP +DUP +MDAP[no-rnd] +GC[cur] +PUSHB_1 + 2 +CINDEX +GC[cur] +GT +IF +DUP +ALIGNRP +EIF +MDAP[no-rnd] +PUSHB_2 + 38 + 1 +SZP1 +CALL +PUSHB_1 + 4 +RS +MDAP[no-rnd] +PUSHB_1 + 38 +CALL +ENDF +PUSHB_1 + 59 +FDEF +PUSHB_1 + 0 +SZPS +PUSHB_1 + 4 +CINDEX +PUSHB_1 + 4 +MINDEX +DUP +MDAP[no-rnd] +GC[orig] +SWAP +GC[orig] +SWAP +SUB +PUSHB_1 + 6 +RCVT +CALL +SWAP +DUP +ALIGNRP +DUP +MDAP[no-rnd] +SWAP +SHPIX +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 60 +FDEF +PUSHB_2 + 8 + 4 +CINDEX +WS +PUSHB_1 + 0 +SZPS +PUSHB_1 + 4 +CINDEX +PUSHB_1 + 4 +CINDEX +DUP +MDAP[no-rnd] +GC[orig] +SWAP +GC[orig] +SWAP +SUB +DUP +PUSHB_1 + 4 +SWAP +WS +PUSHB_1 + 6 +RCVT +CALL +DUP +PUSHB_1 + 96 +LT +IF +DUP +PUSHB_1 + 64 +LTEQ +IF +PUSHB_4 + 2 + 32 + 3 + 32 +ELSE +PUSHB_4 + 2 + 38 + 3 + 26 +EIF +WS +WS +SWAP +DUP +GC[orig] +PUSHB_1 + 4 +RS +PUSHB_1 + 128 +DIV +ADD +DUP +PUSHB_1 + 0 +CALL +DUP +ROLL +ROLL +SUB +DUP +PUSHB_1 + 2 +RS +ADD +ABS +SWAP +PUSHB_1 + 3 +RS +SUB +ABS +LT +IF +PUSHB_1 + 2 +RS +SUB +ELSE +PUSHB_1 + 3 +RS +ADD +EIF +PUSHB_1 + 3 +CINDEX +PUSHB_1 + 128 +DIV +SUB +PUSHB_1 + 2 +CINDEX +GC[cur] +SUB +SHPIX +SWAP +DUP +ALIGNRP +SWAP +SHPIX +ELSE +POP +DUP +DUP +GC[cur] +SWAP +GC[orig] +PUSHB_1 + 0 +CALL +SWAP +SUB +SHPIX +POP +EIF +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 61 +FDEF +PUSHB_1 + 48 +CALL +MDAP[no-rnd] +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 62 +FDEF +PUSHB_1 + 49 +CALL +POP +SWAP +DUP +DUP +ALIGNRP +PUSHB_1 + 4 +SWAP +WS +SWAP +SHPIX +PUSHB_2 + 38 + 1 +SZP1 +CALL +PUSHB_1 + 4 +RS +MDAP[no-rnd] +PUSHB_1 + 38 +CALL +ENDF +PUSHB_1 + 63 +FDEF +PUSHB_1 + 0 +SZP2 +DUP +GC[orig] +PUSHB_1 + 0 +SWAP +WS +PUSHB_3 + 0 + 1 + 1 +SZP2 +SZP1 +SZP0 +MDAP[no-rnd] +PUSHB_1 + 44 +LOOPCALL +ENDF +PUSHB_1 + 64 +FDEF +PUSHB_1 + 0 +SZP2 +DUP +GC[orig] +PUSHB_1 + 0 +SWAP +WS +PUSHB_3 + 0 + 1 + 1 +SZP2 +SZP1 +SZP0 +MDAP[no-rnd] +PUSHB_1 + 44 +LOOPCALL +ENDF +PUSHB_1 + 65 +FDEF +PUSHB_2 + 0 + 1 +SZP1 +SZP0 +PUSHB_1 + 45 +LOOPCALL +ENDF +PUSHB_1 + 66 +FDEF +PUSHB_1 + 47 +LOOPCALL +ENDF +PUSHB_1 + 67 +FDEF +PUSHB_1 + 0 +SZPS +RCVT +SWAP +DUP +MDAP[no-rnd] +DUP +GC[cur] +ROLL +SWAP +SUB +SHPIX +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 68 +FDEF +PUSHB_1 + 8 +SWAP +WS +PUSHB_1 + 67 +CALL +ENDF +PUSHB_1 + 69 +FDEF +PUSHB_3 + 0 + 0 + 60 +CALL +ENDF +PUSHB_1 + 70 +FDEF +PUSHB_3 + 0 + 1 + 60 +CALL +ENDF +PUSHB_1 + 71 +FDEF +PUSHB_3 + 1 + 0 + 60 +CALL +ENDF +PUSHB_1 + 72 +FDEF +PUSHB_3 + 1 + 1 + 60 +CALL +ENDF +PUSHB_1 + 73 +FDEF +PUSHB_3 + 0 + 0 + 61 +CALL +ENDF +PUSHB_1 + 74 +FDEF +PUSHB_3 + 0 + 1 + 61 +CALL +ENDF +PUSHB_1 + 75 +FDEF +PUSHB_3 + 1 + 0 + 61 +CALL +ENDF +PUSHB_1 + 76 +FDEF +PUSHB_3 + 1 + 1 + 61 +CALL +ENDF +PUSHB_1 + 77 +FDEF +PUSHB_3 + 0 + 0 + 57 +CALL +ENDF +PUSHB_1 + 78 +FDEF +PUSHB_3 + 0 + 1 + 57 +CALL +ENDF +PUSHB_1 + 79 +FDEF +PUSHB_3 + 1 + 0 + 57 +CALL +ENDF +PUSHB_1 + 80 +FDEF +PUSHB_3 + 1 + 1 + 57 +CALL +ENDF +PUSHB_1 + 81 +FDEF +PUSHB_3 + 0 + 0 + 59 +CALL +ENDF +PUSHB_1 + 82 +FDEF +PUSHB_3 + 0 + 1 + 59 +CALL +ENDF +PUSHB_1 + 83 +FDEF +PUSHB_3 + 1 + 0 + 59 +CALL +ENDF +PUSHB_1 + 84 +FDEF +PUSHB_3 + 1 + 1 + 59 +CALL +ENDF +PUSHB_1 + 85 +FDEF +PUSHB_3 + 0 + 0 + 62 +CALL +ENDF +PUSHB_1 + 86 +FDEF +PUSHB_3 + 0 + 1 + 62 +CALL +ENDF +PUSHB_1 + 87 +FDEF +PUSHB_3 + 1 + 0 + 62 +CALL +ENDF +PUSHB_1 + 88 +FDEF +PUSHB_3 + 1 + 1 + 62 +CALL +ENDF +PUSHB_1 + 89 +FDEF +PUSHB_3 + 0 + 0 + 58 +CALL +ENDF +PUSHB_1 + 90 +FDEF +PUSHB_3 + 0 + 1 + 58 +CALL +ENDF +PUSHB_1 + 91 +FDEF +PUSHB_3 + 1 + 0 + 58 +CALL +ENDF +PUSHB_1 + 92 +FDEF +PUSHB_3 + 1 + 1 + 58 +CALL +ENDF +PUSHB_1 + 93 +FDEF +PUSHB_1 + 50 +CALL +MDAP[no-rnd] +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 94 +FDEF +PUSHB_1 + 50 +CALL +PUSHB_1 + 54 +CALL +ENDF +PUSHB_1 + 95 +FDEF +PUSHB_1 + 50 +CALL +PUSHB_1 + 55 +CALL +ENDF +PUSHB_1 + 96 +FDEF +PUSHB_1 + 0 +SZPS +PUSHB_1 + 50 +CALL +PUSHB_1 + 56 +CALL +ENDF +PUSHB_1 + 97 +FDEF +PUSHB_1 + 51 +CALL +MDAP[no-rnd] +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 98 +FDEF +PUSHB_1 + 51 +CALL +PUSHB_1 + 54 +CALL +ENDF +PUSHB_1 + 99 +FDEF +PUSHB_1 + 51 +CALL +PUSHB_1 + 55 +CALL +ENDF +PUSHB_1 + 100 +FDEF +PUSHB_1 + 51 +CALL +PUSHB_1 + 56 +CALL +ENDF +PUSHB_1 + 101 +FDEF +PUSHB_1 + 52 +CALL +MDAP[no-rnd] +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 102 +FDEF +PUSHB_1 + 52 +CALL +PUSHB_1 + 54 +CALL +ENDF +PUSHB_1 + 103 +FDEF +PUSHB_1 + 52 +CALL +PUSHB_1 + 55 +CALL +ENDF +PUSHB_1 + 104 +FDEF +PUSHB_1 + 52 +CALL +PUSHB_1 + 56 +CALL +ENDF +PUSHB_1 + 105 +FDEF +PUSHB_1 + 53 +CALL +MDAP[no-rnd] +PUSHB_2 + 38 + 1 +SZP1 +CALL +ENDF +PUSHB_1 + 106 +FDEF +PUSHB_1 + 53 +CALL +PUSHB_1 + 54 +CALL +ENDF +PUSHB_1 + 107 +FDEF +PUSHB_1 + 53 +CALL +PUSHB_1 + 55 +CALL +ENDF +PUSHB_1 + 108 +FDEF +PUSHB_1 + 53 +CALL +PUSHB_1 + 56 +CALL +ENDF +PUSHB_1 + 109 +FDEF +CALL +PUSHB_1 + 8 +NEG +PUSHB_1 + 3 +DEPTH +LT +JROT +PUSHB_1 + 1 +SZP2 +IUP[y] +ENDF +EndTTInstrs +ShortTable: cvt 14 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 50 + 50 + 800 + -242 + 800 + -242 +EndShort +ShortTable: maxp 16 + 1 + 0 + 337 + 180 + 18 + 0 + 0 + 2 + 108 + 121 + 110 + 0 + 269 + 2449 + 0 + 0 +EndShort +LangName: 1033 "" "" "" "FontForge 2.0 : Typicons : 27-7-2014" "" "Version 2.0.3 ; ttfautohint (v0.95) -l 8 -r 50 -G 200 -x 14 -w +ACIA-G+ACIA -f -s" +GaspTable: 1 65535 15 1 +Encoding: Custom +UnicodeInterp: none +NameList: AGL For New Fonts +DisplaySize: -96 +AntiAlias: 1 +FitToEm: 0 +WinInfo: 224 14 9 +BeginChars: 338 338 + +StartChar: .notdef +Encoding: 336 -1 0 +Width: 364 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 0 + 0 + 0 + 3 + 2 + 0 + 3 + 89 + 0 + 2 + 1 + 1 + 2 + 77 + 0 + 2 + 2 + 1 + 81 + 4 + 1 + 1 + 2 + 1 + 69 + 0 + 0 + 7 + 6 + 5 + 4 + 0 + 3 + 0 + 3 + 17 + 5 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +33 0 m 1,0,-1 + 33 666 l 1,1,-1 + 298 666 l 1,2,-1 + 298 0 l 1,3,-1 + 33 0 l 1,0,-1 +66 33 m 1,4,-1 + 265 33 l 1,5,-1 + 265 633 l 1,6,-1 + 66 633 l 1,7,-1 + 66 33 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: glyph1 +Encoding: 1 57345 1 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 40 + 0 + 0 + 0 + 3 + 4 + 0 + 3 + 91 + 0 + 4 + 0 + 5 + 2 + 4 + 5 + 91 + 0 + 2 + 1 + 1 + 2 + 79 + 0 + 2 + 2 + 1 + 83 + 0 + 1 + 2 + 1 + 71 + 19 + 19 + 19 + 19 + 19 + 16 + 6 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 633 m 128,-1,1 + 471 633 471 633 569 535.5 c 128,-1,2 + 667 438 667 438 667 300 c 128,-1,3 + 667 162 667 162 569 64.5 c 128,-1,4 + 471 -33 471 -33 333 -33 c 128,-1,5 + 195 -33 195 -33 97.5 64.5 c 128,-1,6 + 0 162 0 162 0 300 c 128,-1,7 + 0 438 0 438 97.5 535.5 c 128,-1,0 + 195 633 195 633 333 633 c 128,-1,1 +333 50 m 128,-1,9 + 436 50 436 50 509.5 123 c 128,-1,10 + 583 196 583 196 583 300 c 128,-1,11 + 583 404 583 404 509.5 477 c 128,-1,12 + 436 550 436 550 333 550 c 128,-1,13 + 230 550 230 550 156.5 477 c 128,-1,14 + 83 404 83 404 83 300 c 128,-1,15 + 83 196 83 196 156.5 123 c 128,-1,8 + 230 50 230 50 333 50 c 128,-1,9 +333 508 m 1,16,17 + 419 508 419 508 480.5 447 c 128,-1,18 + 542 386 542 386 542 300 c 128,-1,19 + 542 214 542 214 480.5 153 c 128,-1,20 + 419 92 419 92 333 92 c 1,21,-1 + 333 508 l 1,16,17 +EndSplineSet +EndChar + +StartChar: glyph2 +Encoding: 2 57346 2 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 77 + 66 + 2 + 10 + 2 + 39 + 25 + 2 + 14 + 9 + 97 + 95 + 86 + 57 + 4 + 7 + 6 + 3 + 66 +MPPEM +PUSHB_1 + 9 +LT +IF +NPUSHB + 65 + 8 + 1 + 6 + 14 + 7 + 10 + 6 + 96 + 0 + 3 + 0 + 11 + 0 + 3 + 11 + 91 + 16 + 1 + 0 + 20 + 17 + 18 + 3 + 1 + 2 + 0 + 1 + 91 + 4 + 1 + 2 + 12 + 1 + 10 + 9 + 2 + 10 + 91 + 13 + 1 + 9 + 15 + 19 + 2 + 14 + 6 + 9 + 14 + 89 + 0 + 7 + 5 + 5 + 7 + 79 + 0 + 7 + 7 + 5 + 83 + 0 + 5 + 7 + 5 + 71 +ELSE +NPUSHB + 66 + 8 + 1 + 6 + 14 + 7 + 14 + 6 + 7 + 104 + 0 + 3 + 0 + 11 + 0 + 3 + 11 + 91 + 16 + 1 + 0 + 20 + 17 + 18 + 3 + 1 + 2 + 0 + 1 + 91 + 4 + 1 + 2 + 12 + 1 + 10 + 9 + 2 + 10 + 91 + 13 + 1 + 9 + 15 + 19 + 2 + 14 + 6 + 9 + 14 + 89 + 0 + 7 + 5 + 5 + 7 + 79 + 0 + 7 + 7 + 5 + 83 + 0 + 5 + 7 + 5 + 71 +EIF +NPUSHB + 49 + 104 + 104 + 91 + 91 + 0 + 0 + 104 + 107 + 104 + 107 + 106 + 105 + 103 + 102 + 91 + 96 + 91 + 96 + 85 + 83 + 80 + 78 + 72 + 71 + 65 + 63 + 60 + 58 + 52 + 51 + 47 + 46 + 42 + 41 + 33 + 31 + 19 + 17 + 13 + 12 + 8 + 6 + 0 + 3 + 0 + 3 + 17 + 21 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 550 m 128,-1,1 + 333 592 333 592 375 592 c 128,-1,2 + 417 592 417 592 417 550 c 128,-1,3 + 417 508 417 508 375 508 c 128,-1,0 + 333 508 333 508 333 550 c 128,-1,1 +42 342 m 0,4,5 + 42 393 42 393 79 430 c 128,-1,6 + 116 467 116 467 167 467 c 2,7,-1 + 184 467 l 1,8,9 + 167 505 167 505 167 550 c 0,10,11 + 167 636 167 636 228 697 c 128,-1,12 + 289 758 289 758 375 758 c 128,-1,13 + 461 758 461 758 522 697 c 128,-1,14 + 583 636 583 636 583 550 c 0,15,16 + 583 505 583 505 566 467 c 1,17,-1 + 583 467 l 2,18,19 + 619 467 619 467 647.5 449 c 128,-1,20 + 676 431 676 431 692 404 c 0,21,22 + 708 376 708 376 708 342 c 0,23,24 + 708 316 708 316 700 296 c 1,25,26 + 750 259 750 259 750 196 c 0,27,28 + 750 89 750 89 697 4 c 128,-1,29 + 644 -81 644 -81 563 -129 c 0,30,31 + 475 -179 475 -179 375 -179 c 0,32,33 + 296 -179 296 -179 227 -148 c 128,-1,34 + 158 -117 158 -117 110 -69 c 128,-1,35 + 62 -21 62 -21 31 48 c 128,-1,36 + 0 117 0 117 0 196 c 0,37,38 + 0 259 0 259 50 296 c 1,39,40 + 42 316 42 316 42 342 c 0,4,5 +125 238 m 128,-1,42 + 108 238 108 238 95.5 225.5 c 128,-1,43 + 83 213 83 213 83 196 c 0,44,45 + 83 76 83 76 169 -10 c 128,-1,46 + 255 -96 255 -96 375 -96 c 128,-1,47 + 495 -96 495 -96 581 -10 c 128,-1,48 + 667 76 667 76 667 196 c 0,49,50 + 667 213 667 213 654.5 225.5 c 128,-1,51 + 642 238 642 238 625 238 c 128,-1,52 + 608 238 608 238 595.5 225.5 c 128,-1,53 + 583 213 583 213 583 196 c 0,54,55 + 583 120 583 120 534.5 63 c 128,-1,56 + 486 6 486 6 417 -8 c 1,57,-1 + 417 300 l 1,58,-1 + 583 300 l 2,59,60 + 600 300 600 300 612.5 312.5 c 128,-1,61 + 625 325 625 325 625 342 c 128,-1,62 + 625 359 625 359 612.5 371 c 128,-1,63 + 600 383 600 383 583 383 c 2,64,-1 + 417 383 l 1,65,-1 + 417 433 l 1,66,67 + 453 446 453 446 476.5 477 c 128,-1,68 + 500 508 500 508 500 550 c 0,69,70 + 500 602 500 602 463.5 638.5 c 128,-1,71 + 427 675 427 675 375 675 c 128,-1,72 + 323 675 323 675 286.5 638.5 c 128,-1,73 + 250 602 250 602 250 550 c 0,74,75 + 250 509 250 509 274 477.5 c 128,-1,76 + 298 446 298 446 333 433 c 1,77,-1 + 333 383 l 1,78,-1 + 167 383 l 2,79,80 + 150 383 150 383 137.5 371 c 128,-1,81 + 125 359 125 359 125 342 c 128,-1,82 + 125 325 125 325 137.5 312.5 c 128,-1,83 + 150 300 150 300 167 300 c 2,84,-1 + 333 300 l 1,85,-1 + 333 -8 l 1,86,87 + 264 6 264 6 215.5 63 c 128,-1,88 + 167 120 167 120 167 196 c 0,89,90 + 167 213 167 213 154.5 225.5 c 128,-1,41 + 142 238 142 238 125 238 c 128,-1,42 +180 258 m 1,91,92 + 208 233 208 233 208 196 c 0,93,94 + 208 101 208 101 292 52 c 1,95,-1 + 292 258 l 1,96,-1 + 180 258 l 1,91,92 +458 52 m 1,97,98 + 494 73 494 73 518 110.5 c 128,-1,99 + 542 148 542 148 542 196 c 0,100,101 + 542 233 542 233 570 258 c 1,102,-1 + 458 258 l 1,103,-1 + 458 52 l 1,97,98 +333 550 m 128,-1,105 + 333 592 333 592 375 592 c 128,-1,106 + 417 592 417 592 417 550 c 128,-1,107 + 417 508 417 508 375 508 c 128,-1,104 + 333 508 333 508 333 550 c 128,-1,105 +EndSplineSet +EndChar + +StartChar: glyph0 +Encoding: 0 57344 3 +Width: 783 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 55 + 0 + 1 + 2 + 0 + 60 + 55 + 44 + 39 + 28 + 9 + 6 + 3 + 2 + 16 + 1 + 1 + 3 + 3 + 66 + 0 + 0 + 2 + 0 + 106 + 0 + 1 + 3 + 1 + 107 + 0 + 2 + 3 + 3 + 2 + 79 + 0 + 2 + 2 + 3 + 83 + 0 + 3 + 2 + 3 + 71 + 69 + 68 + 65 + 64 + 53 + 52 + 37 + 36 + 4 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +392 511 m 1,0,-1 + 350 633 l 2,1,2 + 344 650 344 650 352 666.5 c 128,-1,3 + 360 683 360 683 377 689 c 0,4,5 + 401 697 401 697 422 679.5 c 128,-1,6 + 443 662 443 662 433 633 c 2,7,-1 + 392 511 l 1,0,-1 +58 342 m 2,8,-1 + 181 300 l 1,9,-1 + 58 258 l 2,10,11 + 41 252 41 252 24.5 260.5 c 128,-1,12 + 8 269 8 269 2 286 c 0,13,14 + -6 310 -6 310 11.5 331 c 128,-1,15 + 29 352 29 352 58 342 c 2,8,-1 +392 89 m 1,16,-1 + 433 -33 l 2,17,18 + 439 -50 439 -50 431 -66.5 c 128,-1,19 + 423 -83 423 -83 406 -89 c 0,20,21 + 382 -97 382 -97 361 -79.5 c 128,-1,22 + 340 -62 340 -62 350 -33 c 2,23,-1 + 392 89 l 1,16,-1 +781 314 m 0,24,25 + 789 290 789 290 771.5 269 c 128,-1,26 + 754 248 754 248 725 258 c 2,27,-1 + 603 300 l 1,28,-1 + 725 342 l 2,29,30 + 742 348 742 348 758.5 339.5 c 128,-1,31 + 775 331 775 331 781 314 c 0,24,25 +126 506 m 2,32,33 + 109 514 109 514 103.5 531 c 128,-1,34 + 98 548 98 548 106 565 c 0,35,36 + 119 590 119 590 146 589 c 128,-1,37 + 173 588 173 588 185 565 c 2,38,-1 + 242 449 l 1,39,-1 + 126 506 l 2,32,33 +126 15 m 0,40,41 + 101 28 101 28 102 55 c 128,-1,42 + 103 82 103 82 126 94 c 2,43,-1 + 242 151 l 1,44,-1 + 185 35 l 2,45,46 + 177 18 177 18 160 12.5 c 128,-1,47 + 143 7 143 7 126 15 c 0,40,41 +657 94 m 2,48,49 + 674 86 674 86 679.5 69 c 128,-1,50 + 685 52 685 52 677 35 c 0,51,52 + 664 10 664 10 637 11 c 128,-1,53 + 610 12 610 12 598 35 c 2,54,-1 + 541 151 l 1,55,-1 + 657 94 l 2,48,49 +657 585 m 0,56,57 + 682 572 682 572 681 545 c 128,-1,58 + 680 518 680 518 657 506 c 2,59,-1 + 541 449 l 1,60,-1 + 598 565 l 2,61,62 + 606 582 606 582 623 587.5 c 128,-1,63 + 640 593 640 593 657 585 c 0,56,57 +392 488 m 128,-1,65 + 469 488 469 488 524 432.5 c 128,-1,66 + 579 377 579 377 579 300 c 128,-1,67 + 579 223 579 223 524 167.5 c 128,-1,68 + 469 112 469 112 392 112 c 128,-1,69 + 315 112 315 112 259.5 167.5 c 128,-1,70 + 204 223 204 223 204 300 c 128,-1,71 + 204 377 204 377 259.5 432.5 c 128,-1,64 + 315 488 315 488 392 488 c 128,-1,65 +EndSplineSet +EndChar + +StartChar: glyph3 +Encoding: 3 57347 4 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 73 + 36 + 25 + 2 + 4 + 9 + 45 + 16 + 2 + 1 + 0 + 2 + 66 + 0 + 9 + 8 + 4 + 8 + 9 + 4 + 104 + 2 + 1 + 0 + 3 + 1 + 3 + 0 + 1 + 104 + 0 + 1 + 1 + 105 + 0 + 5 + 0 + 8 + 9 + 5 + 8 + 91 + 6 + 1 + 4 + 3 + 3 + 4 + 79 + 6 + 1 + 4 + 4 + 3 + 83 + 7 + 1 + 3 + 4 + 3 + 71 + 55 + 54 + 22 + 35 + 38 + 22 + 35 + 38 + 20 + 20 + 16 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 238 m 128,-1,1 + 559 238 559 238 571 225.5 c 128,-1,2 + 583 213 583 213 583 196 c 0,3,4 + 583 75 583 75 498 -10.5 c 128,-1,5 + 413 -96 413 -96 292 -96 c 128,-1,6 + 171 -96 171 -96 85.5 -10.5 c 128,-1,7 + 0 75 0 75 0 196 c 0,8,9 + 0 213 0 213 12.5 225.5 c 128,-1,10 + 25 238 25 238 42 238 c 128,-1,11 + 59 238 59 238 71 225.5 c 128,-1,12 + 83 213 83 213 83 196 c 0,13,14 + 83 121 83 121 130.5 63.5 c 128,-1,15 + 178 6 178 6 250 -8 c 1,16,-1 + 250 300 l 1,17,-1 + 83 300 l 2,18,19 + 66 300 66 300 54 312.5 c 128,-1,20 + 42 325 42 325 42 342 c 128,-1,21 + 42 359 42 359 54 371 c 128,-1,22 + 66 383 66 383 83 383 c 2,23,-1 + 250 383 l 1,24,-1 + 250 433 l 1,25,26 + 213 446 213 446 190 478 c 128,-1,27 + 167 510 167 510 167 550 c 0,28,29 + 167 602 167 602 203.5 638.5 c 128,-1,30 + 240 675 240 675 292 675 c 128,-1,31 + 344 675 344 675 380.5 638.5 c 128,-1,32 + 417 602 417 602 417 550 c 0,33,34 + 417 510 417 510 393.5 478 c 128,-1,35 + 370 446 370 446 333 433 c 1,36,-1 + 333 383 l 1,37,-1 + 500 383 l 2,38,39 + 517 383 517 383 529.5 371 c 128,-1,40 + 542 359 542 359 542 342 c 128,-1,41 + 542 325 542 325 529.5 312.5 c 128,-1,42 + 517 300 517 300 500 300 c 2,43,-1 + 333 300 l 1,44,-1 + 333 -8 l 1,45,46 + 405 6 405 6 452.5 63.5 c 128,-1,47 + 500 121 500 121 500 196 c 0,48,49 + 500 213 500 213 512.5 225.5 c 128,-1,0 + 525 238 525 238 542 238 c 128,-1,1 +292 592 m 128,-1,51 + 275 592 275 592 262.5 579.5 c 128,-1,52 + 250 567 250 567 250 550 c 128,-1,53 + 250 533 250 533 262.5 520.5 c 128,-1,54 + 275 508 275 508 292 508 c 128,-1,55 + 309 508 309 508 321 520.5 c 128,-1,56 + 333 533 333 533 333 550 c 128,-1,57 + 333 567 333 567 321 579.5 c 128,-1,50 + 309 592 309 592 292 592 c 128,-1,51 +EndSplineSet +EndChar + +StartChar: glyph4 +Encoding: 4 57348 5 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 79 + 9 + 1 + 2 + 0 + 3 + 4 + 2 + 3 + 91 + 10 + 1 + 4 + 0 + 7 + 0 + 4 + 7 + 89 + 8 + 1 + 0 + 0 + 1 + 6 + 0 + 1 + 91 + 11 + 1 + 6 + 5 + 5 + 6 + 79 + 11 + 1 + 6 + 6 + 5 + 83 + 0 + 5 + 6 + 5 + 71 + 41 + 40 + 25 + 24 + 13 + 12 + 1 + 0 + 45 + 44 + 40 + 49 + 41 + 48 + 33 + 30 + 24 + 39 + 25 + 38 + 19 + 16 + 12 + 23 + 13 + 22 + 7 + 4 + 0 + 11 + 1 + 10 + 12 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +458 300 m 2,0,1 + 467 300 467 300 473 294 c 128,-1,2 + 479 288 479 288 479 279 c 128,-1,3 + 479 270 479 270 473 264 c 128,-1,4 + 467 258 467 258 458 258 c 2,5,-1 + 333 258 l 2,6,7 + 324 258 324 258 318 264 c 128,-1,8 + 312 270 312 270 312 279 c 128,-1,9 + 312 288 312 288 318 294 c 128,-1,10 + 324 300 324 300 333 300 c 2,11,-1 + 458 300 l 2,0,1 +750 592 m 2,12,13 + 767 592 767 592 779.5 579.5 c 128,-1,14 + 792 567 792 567 792 550 c 128,-1,15 + 792 533 792 533 779.5 520.5 c 128,-1,16 + 767 508 767 508 750 508 c 2,17,-1 + 42 508 l 2,18,19 + 25 508 25 508 12.5 520.5 c 128,-1,20 + 0 533 0 533 0 550 c 128,-1,21 + 0 567 0 567 12.5 579.5 c 128,-1,22 + 25 592 25 592 42 592 c 2,23,-1 + 750 592 l 2,12,13 +667 467 m 2,24,25 + 684 467 684 467 696 454.5 c 128,-1,26 + 708 442 708 442 708 425 c 2,27,-1 + 708 92 l 2,28,29 + 708 40 708 40 671.5 3.5 c 128,-1,30 + 635 -33 635 -33 583 -33 c 2,31,-1 + 208 -33 l 2,32,33 + 156 -33 156 -33 119.5 3.5 c 128,-1,34 + 83 40 83 40 83 92 c 2,35,-1 + 83 425 l 2,36,37 + 83 442 83 442 95.5 454.5 c 128,-1,38 + 108 467 108 467 125 467 c 2,39,-1 + 667 467 l 2,24,25 +583 50 m 2,40,41 + 600 50 600 50 612.5 62.5 c 128,-1,42 + 625 75 625 75 625 92 c 2,43,-1 + 625 383 l 1,44,-1 + 167 383 l 1,45,-1 + 167 92 l 2,46,47 + 167 75 167 75 179 62.5 c 128,-1,48 + 191 50 191 50 208 50 c 2,49,-1 + 583 50 l 2,40,41 +EndSplineSet +EndChar + +StartChar: glyph5 +Encoding: 5 57349 6 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 61 + 36 + 25 + 2 + 4 + 2 + 37 + 1 + 3 + 4 + 38 + 31 + 8 + 3 + 1 + 3 + 3 + 66 + 0 + 0 + 1 + 0 + 107 + 0 + 2 + 0 + 4 + 3 + 2 + 4 + 89 + 5 + 1 + 3 + 1 + 1 + 3 + 79 + 5 + 1 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 + 30 + 29 + 35 + 34 + 29 + 39 + 30 + 39 + 23 + 24 + 34 + 6 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +750 8 m 2,0,1 + 750 -9 750 -9 738 -21 c 128,-1,2 + 726 -33 726 -33 708 -33 c 0,3,4 + 687 -33 687 -33 674 -14 c 0,5,6 + 626 60 626 60 563.5 92.5 c 128,-1,7 + 501 125 501 125 417 131 c 1,8,-1 + 417 71 l 2,9,10 + 417 37 417 37 392 12 c 0,11,12 + 368 -12 368 -12 333 -11.5 c 128,-1,13 + 298 -11 298 -11 275 12 c 2,14,-1 + 12 270 l 2,15,16 + 0 282 0 282 0 300 c 128,-1,17 + 0 318 0 318 12 330 c 2,18,-1 + 274 588 l 2,19,20 + 297 611 297 611 332.5 611.5 c 128,-1,21 + 368 612 368 612 392 588 c 0,22,23 + 417 563 417 563 417 529 c 2,24,-1 + 417 458 l 1,25,26 + 562 429 562 429 656 314 c 128,-1,27 + 750 199 750 199 750 50 c 2,28,-1 + 750 8 l 2,0,1 +376 216 m 2,29,30 + 555 212 555 212 658 128 c 1,31,32 + 634 229 634 229 555 299 c 128,-1,33 + 476 369 476 369 370 381 c 1,34,-1 + 333 383 l 1,35,-1 + 333 529 l 1,36,-1 + 101 300 l 1,37,-1 + 333 71 l 1,38,-1 + 333 217 l 1,39,-1 + 376 216 l 2,29,30 +EndSplineSet +EndChar + +StartChar: glyph6 +Encoding: 6 57350 7 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 49 + 18 + 4 + 2 + 1 + 0 + 1 + 66 + 8 + 1 + 2 + 63 + 0 + 1 + 0 + 2 + 0 + 1 + 2 + 104 + 3 + 1 + 0 + 1 + 2 + 0 + 79 + 3 + 1 + 0 + 0 + 2 + 83 + 0 + 2 + 0 + 2 + 71 + 1 + 0 + 16 + 14 + 11 + 10 + 0 + 20 + 1 + 20 + 4 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 571 m 0,0,1 + 308 571 308 571 320.5 558.5 c 128,-1,2 + 333 546 333 546 333 529 c 2,3,-1 + 333 423 l 1,4,5 + 475 407 475 407 571 300.5 c 128,-1,6 + 667 194 667 194 667 50 c 2,7,-1 + 667 8 l 1,8,9 + 603 105 603 105 521 138.5 c 128,-1,10 + 439 172 439 172 333 175 c 1,11,-1 + 333 71 l 2,12,13 + 333 54 333 54 320.5 41.5 c 128,-1,14 + 308 29 308 29 292 29 c 0,15,16 + 274 29 274 29 262 41 c 2,17,-1 + 0 300 l 1,18,-1 + 262 559 l 2,19,20 + 274 571 274 571 292 571 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph7 +Encoding: 7 57351 8 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 57 + 14 + 7 + 2 + 3 + 0 + 1 + 66 + 40 + 33 + 26 + 0 + 4 + 3 + 63 + 0 + 1 + 0 + 5 + 0 + 1 + 5 + 91 + 2 + 1 + 0 + 3 + 3 + 0 + 79 + 2 + 1 + 0 + 0 + 3 + 83 + 4 + 6 + 2 + 3 + 0 + 3 + 71 + 22 + 21 + 37 + 36 + 31 + 30 + 21 + 42 + 22 + 42 + 20 + 20 + 21 + 7 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 -88 m 1,0,-1 + 37 209 l 2,1,2 + 0 246 0 246 0 297 c 128,-1,3 + 0 348 0 348 37 385 c 0,4,5 + 71 419 71 419 121.5 420.5 c 128,-1,6 + 172 422 172 422 208 390 c 1,7,-1 + 208 592 l 2,8,9 + 208 644 208 644 244.5 680.5 c 128,-1,10 + 281 717 281 717 333 717 c 128,-1,11 + 385 717 385 717 421.5 680.5 c 128,-1,12 + 458 644 458 644 458 592 c 2,13,-1 + 458 390 l 1,14,15 + 494 422 494 422 545 420.5 c 128,-1,16 + 596 419 596 419 630 385 c 0,17,18 + 667 348 667 348 667 297 c 128,-1,19 + 667 246 667 246 630 209 c 2,20,-1 + 333 -88 l 1,0,-1 +125 339 m 0,21,22 + 107 339 107 339 95 327 c 128,-1,23 + 83 315 83 315 83 297.5 c 128,-1,24 + 83 280 83 280 95 268 c 2,25,-1 + 333 30 l 1,26,-1 + 571 268 l 2,27,28 + 583 280 583 280 583 297.5 c 128,-1,29 + 583 315 583 315 571 327 c 128,-1,30 + 559 339 559 339 541.5 339 c 128,-1,31 + 524 339 524 339 512 327 c 2,32,-1 + 375 189 l 1,33,-1 + 375 592 l 2,34,35 + 375 609 375 609 362.5 621 c 128,-1,36 + 350 633 350 633 333 633 c 128,-1,37 + 316 633 316 633 304 621 c 128,-1,38 + 292 609 292 609 292 592 c 2,39,-1 + 292 189 l 1,40,-1 + 154 327 l 2,41,42 + 142 339 142 339 125 339 c 0,21,22 +EndSplineSet +EndChar + +StartChar: glyph8 +Encoding: 8 57352 9 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 27 + 19 + 11 + 4 + 3 + 0 + 63 + 0 + 1 + 0 + 1 + 106 + 3 + 2 + 2 + 0 + 0 + 97 + 0 + 0 + 0 + 21 + 0 + 21 + 37 + 24 + 4 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +559 356 m 128,-1,1 + 584 331 584 331 584 297 c 128,-1,2 + 584 263 584 263 559 238 c 2,3,-1 + 292 -29 l 1,4,-1 + 24 238 l 2,5,6 + -1 263 -1 263 -1 297 c 128,-1,7 + -1 331 -1 331 24 356 c 128,-1,8 + 49 381 49 381 83 381 c 128,-1,9 + 117 381 117 381 142 356 c 2,10,-1 + 208 290 l 1,11,-1 + 208 592 l 2,12,13 + 208 626 208 626 232.5 650.5 c 128,-1,14 + 257 675 257 675 292 675 c 0,15,16 + 326 675 326 675 350.5 650.5 c 128,-1,17 + 375 626 375 626 375 592 c 2,18,-1 + 375 290 l 1,19,-1 + 441 356 l 2,20,21 + 466 381 466 381 500 381 c 128,-1,0 + 534 381 534 381 559 356 c 128,-1,1 +EndSplineSet +EndChar + +StartChar: glyph9 +Encoding: 9 57353 10 +Width: 417 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 27 + 18 + 11 + 4 + 3 + 0 + 63 + 0 + 1 + 0 + 1 + 106 + 3 + 2 + 2 + 0 + 0 + 97 + 0 + 0 + 0 + 20 + 0 + 20 + 21 + 24 + 4 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +404 246 m 128,-1,1 + 416 234 416 234 416 216.5 c 128,-1,2 + 416 199 416 199 404 187 c 2,3,-1 + 208 -9 l 1,4,-1 + 12 187 l 2,5,6 + 0 199 0 199 0 216.5 c 128,-1,7 + 0 234 0 234 12 246 c 128,-1,8 + 24 258 24 258 41.5 258 c 128,-1,9 + 59 258 59 258 71 246 c 2,10,-1 + 167 151 l 1,11,-1 + 167 467 l 2,12,13 + 167 484 167 484 179 496 c 128,-1,14 + 191 508 191 508 208 508 c 128,-1,15 + 225 508 225 508 237.5 496 c 128,-1,16 + 250 484 250 484 250 467 c 2,17,-1 + 250 151 l 1,18,-1 + 346 246 l 2,19,20 + 358 258 358 258 375 258 c 128,-1,0 + 392 258 392 258 404 246 c 128,-1,1 +EndSplineSet +EndChar + +StartChar: glyph10 +Encoding: 10 57354 11 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 69 + 33 + 7 + 2 + 4 + 1 + 32 + 1 + 3 + 4 + 39 + 31 + 24 + 3 + 2 + 3 + 3 + 66 + 5 + 1 + 0 + 2 + 0 + 107 + 0 + 1 + 0 + 4 + 3 + 1 + 4 + 91 + 6 + 1 + 3 + 2 + 2 + 3 + 79 + 6 + 1 + 3 + 3 + 2 + 83 + 0 + 2 + 3 + 2 + 71 + 30 + 29 + 1 + 0 + 35 + 34 + 29 + 40 + 30 + 40 + 20 + 19 + 12 + 11 + 0 + 28 + 1 + 28 + 7 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +42 -33 m 0,0,1 + 24 -33 24 -33 12 -20.5 c 128,-1,2 + 0 -8 0 -8 0 8 c 2,3,-1 + 0 50 l 2,4,5 + 0 199 0 199 94 314 c 128,-1,6 + 188 429 188 429 333 458 c 1,7,-1 + 333 529 l 2,8,9 + 333 563 333 563 358 588 c 0,10,11 + 382 612 382 612 417.5 611.5 c 128,-1,12 + 453 611 453 611 476 588 c 2,13,-1 + 738 330 l 2,14,15 + 750 318 750 318 750 300 c 128,-1,16 + 750 282 750 282 738 270 c 2,17,-1 + 475 12 l 2,18,19 + 452 -11 452 -11 417 -11.5 c 128,-1,20 + 382 -12 382 -12 358 12 c 0,21,22 + 333 37 333 37 333 71 c 2,23,-1 + 333 131 l 1,24,25 + 249 125 249 125 186.5 92.5 c 128,-1,26 + 124 60 124 60 76 -14 c 0,27,28 + 63 -33 63 -33 42 -33 c 0,0,1 +375 216 m 2,29,-1 + 417 217 l 1,30,-1 + 417 71 l 1,31,-1 + 649 300 l 1,32,-1 + 417 529 l 1,33,-1 + 417 383 l 1,34,35 + 401 383 401 383 380 381 c 0,36,37 + 274 369 274 369 195 299 c 128,-1,38 + 116 229 116 229 92 128 c 1,39,40 + 195 212 195 212 375 216 c 2,29,-1 +EndSplineSet +EndChar + +StartChar: glyph11 +Encoding: 11 57355 12 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 40 + 18 + 5 + 2 + 2 + 0 + 1 + 66 + 14 + 1 + 1 + 63 + 0 + 2 + 0 + 1 + 0 + 2 + 1 + 104 + 0 + 0 + 2 + 1 + 0 + 79 + 0 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 + 19 + 20 + 18 + 3 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 529 m 2,0,1 + 333 546 333 546 345.5 558.5 c 128,-1,2 + 358 571 358 571 375 571 c 128,-1,3 + 392 571 392 571 404 559 c 2,4,-1 + 667 300 l 1,5,-1 + 404 41 l 2,6,7 + 392 29 392 29 375 29 c 128,-1,8 + 358 29 358 29 345.5 41.5 c 128,-1,9 + 333 54 333 54 333 71 c 2,10,-1 + 333 175 l 1,11,12 + 227 172 227 172 145.5 138.5 c 128,-1,13 + 64 105 64 105 0 8 c 1,14,-1 + 0 50 l 2,15,16 + 0 194 0 194 95.5 300.5 c 128,-1,17 + 191 407 191 407 333 423 c 1,18,-1 + 333 529 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph12 +Encoding: 12 57356 13 +Width: 805 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 57 + 22 + 5 + 2 + 5 + 6 + 1 + 66 + 0 + 1 + 0 + 7 + 2 + 1 + 7 + 91 + 0 + 2 + 0 + 6 + 5 + 2 + 6 + 91 + 0 + 5 + 0 + 3 + 4 + 5 + 3 + 91 + 0 + 4 + 0 + 0 + 4 + 79 + 0 + 4 + 4 + 0 + 83 + 0 + 0 + 4 + 0 + 71 + 21 + 35 + 36 + 20 + 35 + 37 + 20 + 18 + 8 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +510 50 m 0,0,1 + 510 -1 510 -1 473 -38 c 128,-1,2 + 436 -75 436 -75 385 -75 c 128,-1,3 + 334 -75 334 -75 297 -38 c 2,4,-1 + 0 258 l 1,5,-1 + 297 555 l 2,6,7 + 332 590 332 590 385 590 c 128,-1,8 + 438 590 438 590 473 555 c 0,9,10 + 510 518 510 518 510 467 c 0,11,12 + 510 418 510 418 478 383 c 1,13,-1 + 680 383 l 2,14,15 + 732 383 732 383 768.5 346.5 c 128,-1,16 + 805 310 805 310 805 258 c 128,-1,17 + 805 206 805 206 768.5 169.5 c 128,-1,18 + 732 133 732 133 680 133 c 2,19,-1 + 478 133 l 1,20,21 + 510 98 510 98 510 50 c 0,0,1 +118 258 m 1,22,-1 + 356 21 l 2,23,24 + 368 9 368 9 385.5 9 c 128,-1,25 + 403 9 403 9 415 21 c 128,-1,26 + 427 33 427 33 427 50 c 128,-1,27 + 427 67 427 67 415 79 c 2,28,-1 + 277 217 l 1,29,-1 + 680 217 l 2,30,31 + 697 217 697 217 709 229 c 128,-1,32 + 721 241 721 241 721 258 c 128,-1,33 + 721 275 721 275 709 287.5 c 128,-1,34 + 697 300 697 300 680 300 c 2,35,-1 + 277 300 l 1,36,-1 + 415 437 l 2,37,38 + 427 449 427 449 427 467 c 0,39,40 + 427 484 427 484 415 496 c 128,-1,41 + 403 508 403 508 385.5 508 c 128,-1,42 + 368 508 368 508 356 496 c 2,43,-1 + 118 258 l 1,22,-1 +EndSplineSet +EndChar + +StartChar: glyph13 +Encoding: 13 57357 14 +Width: 704 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 15 + 1 + 1 + 0 + 1 + 66 + 0 + 3 + 0 + 3 + 106 + 0 + 2 + 1 + 2 + 107 + 4 + 1 + 0 + 1 + 1 + 0 + 79 + 4 + 1 + 0 + 0 + 1 + 84 + 0 + 1 + 0 + 1 + 72 + 1 + 0 + 18 + 17 + 13 + 12 + 7 + 5 + 0 + 23 + 1 + 23 + 5 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +621 342 m 2,0,1 + 655 342 655 342 679.5 317.5 c 128,-1,2 + 704 293 704 293 704 258 c 0,3,4 + 704 224 704 224 680 199.5 c 128,-1,5 + 656 175 656 175 621 175 c 2,6,-1 + 319 175 l 1,7,-1 + 385 109 l 2,8,9 + 410 85 410 85 410 50.5 c 128,-1,10 + 410 16 410 16 385 -9 c 0,11,12 + 361 -33 361 -33 326 -33 c 128,-1,13 + 291 -33 291 -33 267 -9 c 2,14,-1 + 0 258 l 1,15,-1 + 267 526 l 2,16,17 + 292 551 292 551 326 551 c 128,-1,18 + 360 551 360 551 385 526 c 0,19,20 + 410 502 410 502 410 467.5 c 128,-1,21 + 410 433 410 433 385 408 c 2,22,-1 + 319 342 l 1,23,-1 + 621 342 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph14 +Encoding: 14 57358 15 +Width: 517 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 14 + 1 + 1 + 0 + 1 + 66 + 0 + 3 + 0 + 3 + 106 + 0 + 2 + 1 + 2 + 107 + 4 + 1 + 0 + 1 + 1 + 0 + 79 + 4 + 1 + 0 + 0 + 1 + 84 + 0 + 1 + 0 + 1 + 72 + 1 + 0 + 17 + 16 + 12 + 10 + 6 + 4 + 0 + 21 + 1 + 21 + 5 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +476 342 m 2,0,1 + 493 342 493 342 505 329.5 c 128,-1,2 + 517 317 517 317 517 300 c 128,-1,3 + 517 283 517 283 505 270.5 c 128,-1,4 + 493 258 493 258 476 258 c 2,5,-1 + 160 258 l 1,6,-1 + 255 163 l 2,7,8 + 267 151 267 151 267 133.5 c 128,-1,9 + 267 116 267 116 255 104 c 128,-1,10 + 243 92 243 92 226 92 c 0,11,12 + 208 92 208 92 196 104 c 2,13,-1 + 0 300 l 1,14,-1 + 196 496 l 2,15,16 + 208 508 208 508 225.5 508 c 128,-1,17 + 243 508 243 508 255 496 c 128,-1,18 + 267 484 267 484 267 466.5 c 128,-1,19 + 267 449 267 449 255 437 c 2,20,-1 + 160 342 l 1,21,-1 + 476 342 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph15 +Encoding: 15 57359 16 +Width: 958 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 115 + 19 + 4 + 2 + 4 + 2 + 73 + 35 + 2 + 7 + 4 + 90 + 1 + 6 + 12 + 3 + 66 + 14 + 1 + 0 + 0 + 5 + 2 + 0 + 5 + 91 + 0 + 2 + 10 + 1 + 4 + 7 + 2 + 4 + 91 + 9 + 1 + 7 + 0 + 12 + 6 + 7 + 12 + 91 + 0 + 6 + 0 + 11 + 13 + 6 + 11 + 92 + 0 + 13 + 0 + 8 + 3 + 13 + 8 + 91 + 15 + 1 + 3 + 1 + 1 + 3 + 79 + 15 + 1 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 + 23 + 22 + 1 + 0 + 85 + 82 + 78 + 75 + 71 + 69 + 62 + 59 + 56 + 53 + 50 + 47 + 44 + 42 + 38 + 37 + 33 + 32 + 28 + 26 + 22 + 66 + 23 + 65 + 18 + 15 + 12 + 9 + 0 + 21 + 1 + 21 + 16 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 633 m 0,0,1 + 676 633 676 633 713 596 c 128,-1,2 + 750 559 750 559 750 508 c 2,3,-1 + 750 501 l 1,4,5 + 840 478 840 478 899 399 c 128,-1,6 + 958 320 958 320 958 217 c 0,7,8 + 958 96 958 96 873 10.5 c 128,-1,9 + 788 -75 788 -75 667 -75 c 2,10,-1 + 292 -75 l 2,11,12 + 171 -75 171 -75 85.5 10.5 c 128,-1,13 + 0 96 0 96 0 217 c 128,-1,14 + 0 338 0 338 85.5 423 c 128,-1,15 + 171 508 171 508 292 508 c 2,16,-1 + 333 508 l 2,17,18 + 382 508 382 508 416 477 c 1,19,-1 + 537 597 l 2,20,21 + 573 633 573 633 625 633 c 0,0,1 +667 8 m 2,22,23 + 753 8 753 8 814 69.5 c 128,-1,24 + 875 131 875 131 875 217 c 128,-1,25 + 875 303 875 303 820 364 c 128,-1,26 + 765 425 765 425 688 425 c 2,27,-1 + 601 425 l 1,28,-1 + 654 479 l 2,29,30 + 666 491 666 491 666 508.5 c 128,-1,31 + 666 526 666 526 654 538 c 128,-1,32 + 642 550 642 550 625 550 c 128,-1,33 + 608 550 608 550 596 538 c 2,34,-1 + 441 383 l 1,35,-1 + 596 229 l 2,36,37 + 608 217 608 217 625 217 c 128,-1,38 + 642 217 642 217 654 229 c 128,-1,39 + 666 241 666 241 666 258.5 c 128,-1,40 + 666 276 666 276 654 288 c 2,41,-1 + 601 342 l 1,42,-1 + 688 342 l 2,43,44 + 731 342 731 342 761.5 305.5 c 128,-1,45 + 792 269 792 269 792 217 c 128,-1,46 + 792 165 792 165 755.5 128.5 c 128,-1,47 + 719 92 719 92 667 92 c 2,48,-1 + 292 92 l 2,49,50 + 240 92 240 92 203.5 128.5 c 128,-1,51 + 167 165 167 165 167 217 c 128,-1,52 + 167 269 167 269 203.5 305.5 c 128,-1,53 + 240 342 240 342 292 342 c 2,54,-1 + 333 342 l 2,55,56 + 350 342 350 342 362.5 354 c 128,-1,57 + 375 366 375 366 375 383 c 128,-1,58 + 375 400 375 400 362.5 412.5 c 128,-1,59 + 350 425 350 425 333 425 c 2,60,-1 + 292 425 l 2,61,62 + 206 425 206 425 144.5 364 c 128,-1,63 + 83 303 83 303 83 217 c 128,-1,64 + 83 131 83 131 144.5 69.5 c 128,-1,65 + 206 8 206 8 292 8 c 2,66,-1 + 667 8 l 2,22,23 +708 258 m 0,67,68 + 708 224 708 224 683.5 199.5 c 128,-1,69 + 659 175 659 175 625 175 c 0,70,71 + 590 175 590 175 566 199 c 2,72,-1 + 411 354 l 1,73,74 + 402 330 402 330 381 315 c 128,-1,75 + 360 300 360 300 333 300 c 2,76,-1 + 292 300 l 2,77,78 + 257 300 257 300 232.5 275.5 c 128,-1,79 + 208 251 208 251 208 217 c 0,80,81 + 208 182 208 182 233 157.5 c 128,-1,82 + 258 133 258 133 292 133 c 2,83,-1 + 667 133 l 2,84,85 + 701 133 701 133 725.5 157.5 c 128,-1,86 + 750 182 750 182 750 217 c 0,87,88 + 750 247 750 247 735 270.5 c 128,-1,89 + 720 294 720 294 698 299 c 1,90,91 + 708 282 708 282 708 258 c 0,67,68 +EndSplineSet +EndChar + +StartChar: glyph16 +Encoding: 16 57360 17 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_6 + 36 + 1 + 3 + 0 + 1 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 40 + 0 + 7 + 0 + 0 + 7 + 94 + 0 + 6 + 3 + 4 + 3 + 6 + 96 + 2 + 8 + 2 + 0 + 5 + 1 + 3 + 6 + 0 + 3 + 92 + 0 + 4 + 1 + 1 + 4 + 79 + 0 + 4 + 4 + 1 + 83 + 0 + 1 + 4 + 1 + 71 +ELSE +MPPEM +PUSHB_1 + 11 +LT +IF +NPUSHB + 41 + 0 + 7 + 0 + 0 + 7 + 94 + 0 + 6 + 3 + 4 + 3 + 6 + 4 + 104 + 2 + 8 + 2 + 0 + 5 + 1 + 3 + 6 + 0 + 3 + 92 + 0 + 4 + 1 + 1 + 4 + 79 + 0 + 4 + 4 + 1 + 83 + 0 + 1 + 4 + 1 + 71 +ELSE +NPUSHB + 40 + 0 + 7 + 0 + 7 + 106 + 0 + 6 + 3 + 4 + 3 + 6 + 4 + 104 + 2 + 8 + 2 + 0 + 5 + 1 + 3 + 6 + 0 + 3 + 92 + 0 + 4 + 1 + 1 + 4 + 79 + 0 + 4 + 4 + 1 + 83 + 0 + 1 + 4 + 1 + 71 +EIF +EIF +NPUSHB + 22 + 1 + 0 + 39 + 38 + 34 + 33 + 28 + 26 + 23 + 20 + 17 + 15 + 12 + 10 + 7 + 4 + 0 + 43 + 1 + 43 + 9 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +562 467 m 2,0,1 + 639 467 639 467 694.5 405.5 c 128,-1,2 + 750 344 750 344 750 258 c 128,-1,3 + 750 172 750 172 689 111 c 128,-1,4 + 628 50 628 50 542 50 c 2,5,-1 + 208 50 l 2,6,7 + 122 50 122 50 61 111 c 128,-1,8 + 0 172 0 172 0 258 c 128,-1,9 + 0 344 0 344 61 405.5 c 128,-1,10 + 122 467 122 467 208 467 c 0,11,12 + 225 467 225 467 237.5 454.5 c 128,-1,13 + 250 442 250 442 250 425 c 128,-1,14 + 250 408 250 408 237.5 395.5 c 128,-1,15 + 225 383 225 383 208 383 c 0,16,17 + 156 383 156 383 119.5 346.5 c 128,-1,18 + 83 310 83 310 83 258 c 128,-1,19 + 83 206 83 206 119.5 169.5 c 128,-1,20 + 156 133 156 133 208 133 c 2,21,-1 + 542 133 l 2,22,23 + 594 133 594 133 630.5 169.5 c 128,-1,24 + 667 206 667 206 667 258 c 128,-1,25 + 667 310 667 310 636 346.5 c 128,-1,26 + 605 383 605 383 562 383 c 2,27,-1 + 476 383 l 1,28,-1 + 529 329 l 2,29,30 + 541 317 541 317 541 300 c 128,-1,31 + 541 283 541 283 529 271 c 0,32,33 + 516 258 516 258 500 258 c 128,-1,34 + 484 258 484 258 471 271 c 2,35,-1 + 316 425 l 1,36,-1 + 471 579 l 2,37,38 + 483 591 483 591 500 591 c 128,-1,39 + 517 591 517 591 529 579 c 128,-1,40 + 541 567 541 567 541 550 c 128,-1,41 + 541 533 541 533 529 521 c 2,42,-1 + 476 467 l 1,43,-1 + 562 467 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph17 +Encoding: 17 57361 18 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 211 + 66 + 1 + 8 + 11 + 111 + 1 + 21 + 8 + 115 + 114 + 104 + 103 + 17 + 5 + 6 + 16 + 12 + 99 + 1 + 5 + 19 + 86 + 1 + 15 + 5 + 5 + 66 + 0 + 11 + 9 + 8 + 9 + 11 + 8 + 104 + 0 + 13 + 21 + 4 + 21 + 13 + 4 + 104 + 0 + 4 + 12 + 21 + 4 + 12 + 102 + 0 + 7 + 16 + 17 + 16 + 7 + 17 + 104 + 0 + 17 + 19 + 16 + 17 + 19 + 102 + 0 + 15 + 5 + 6 + 5 + 15 + 6 + 104 + 22 + 1 + 0 + 0 + 10 + 3 + 0 + 10 + 91 + 0 + 3 + 24 + 1 + 9 + 11 + 3 + 9 + 91 + 0 + 8 + 0 + 21 + 13 + 8 + 21 + 89 + 26 + 18 + 2 + 12 + 20 + 1 + 16 + 7 + 12 + 16 + 91 + 0 + 19 + 0 + 5 + 15 + 19 + 5 + 92 + 23 + 1 + 6 + 0 + 1 + 14 + 6 + 1 + 90 + 25 + 1 + 14 + 2 + 2 + 14 + 79 + 25 + 1 + 14 + 14 + 2 + 84 + 0 + 2 + 14 + 2 + 72 + 95 + 94 + 73 + 72 + 36 + 36 + 22 + 22 + 1 + 0 + 113 + 112 + 107 + 105 + 102 + 100 + 94 + 116 + 95 + 116 + 90 + 89 + 84 + 82 + 78 + 76 + 72 + 93 + 73 + 93 + 70 + 69 + 64 + 62 + 58 + 56 + 53 + 51 + 36 + 49 + 36 + 48 + 45 + 43 + 40 + 39 + 22 + 35 + 22 + 34 + 31 + 29 + 26 + 25 + 19 + 18 + 12 + 10 + 8 + 7 + 0 + 21 + 1 + 21 + 27 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +490 675 m 2,0,-1 + 792 675 l 1,1,-1 + 792 383 l 2,2,3 + 792 343 792 343 768.5 311 c 128,-1,4 + 745 279 745 279 708 266 c 1,5,-1 + 708 261 l 1,6,-1 + 708 -33 l 1,7,-1 + 417 -33 l 1,8,9 + 404 -70 404 -70 368.5 -93.5 c 128,-1,10 + 333 -117 333 -117 292 -117 c 2,11,-1 + 0 -117 l 1,12,-1 + 0 175 l 2,13,14 + 0 215 0 215 23.5 247 c 128,-1,15 + 47 279 47 279 84 292 c 1,16,-1 + 83 297 l 1,17,-1 + 83 592 l 1,18,-1 + 373 592 l 1,19,20 + 386 629 386 629 418 652 c 128,-1,21 + 450 675 450 675 490 675 c 2,0,-1 +625 50 m 1,22,-1 + 625 261 l 2,23,24 + 625 278 625 278 612.5 290.5 c 128,-1,25 + 600 303 600 303 583 303 c 128,-1,26 + 566 303 566 303 554 290.5 c 128,-1,27 + 542 278 542 278 542 261 c 2,28,-1 + 542 133 l 1,29,-1 + 417 133 l 2,30,31 + 400 133 400 133 387.5 121 c 128,-1,32 + 375 109 375 109 375 92 c 128,-1,33 + 375 75 375 75 387.5 62.5 c 128,-1,34 + 400 50 400 50 417 50 c 2,35,-1 + 625 50 l 1,22,-1 +167 508 m 1,36,-1 + 167 297 l 2,37,38 + 167 280 167 280 179 268 c 128,-1,39 + 191 256 191 256 208 256 c 128,-1,40 + 225 256 225 256 237.5 268 c 128,-1,41 + 250 280 250 280 250 297 c 2,42,-1 + 250 425 l 1,43,-1 + 378 425 l 2,44,45 + 395 425 395 425 407 437.5 c 128,-1,46 + 419 450 419 450 419 467 c 128,-1,47 + 419 484 419 484 407 496 c 128,-1,48 + 395 508 395 508 378 508 c 2,49,-1 + 167 508 l 1,36,-1 +708 383 m 2,50,-1 + 708 592 l 1,51,-1 + 500 592 l 2,52,53 + 483 592 483 592 470.5 579.5 c 128,-1,54 + 458 567 458 567 458 550 c 128,-1,55 + 458 533 458 533 470.5 520.5 c 128,-1,56 + 483 508 483 508 500 508 c 2,57,-1 + 566 508 l 1,58,-1 + 429 371 l 2,59,60 + 417 359 417 359 417 341.5 c 128,-1,61 + 417 324 417 324 429 312 c 128,-1,62 + 441 300 441 300 458 300 c 0,63,64 + 476 300 476 300 488 312 c 2,65,-1 + 625 449 l 1,66,-1 + 625 383 l 2,67,68 + 625 366 625 366 637.5 354 c 128,-1,69 + 650 342 650 342 667 342 c 128,-1,70 + 684 342 684 342 696 354 c 128,-1,71 + 708 366 708 366 708 383 c 2,50,-1 +292 -33 m 2,72,73 + 309 -33 309 -33 321 -21 c 128,-1,74 + 333 -9 333 -9 333 8 c 128,-1,75 + 333 25 333 25 321 37.5 c 128,-1,76 + 309 50 309 50 292 50 c 2,77,-1 + 226 50 l 1,78,-1 + 363 187 l 2,79,80 + 375 199 375 199 375 216.5 c 128,-1,81 + 375 234 375 234 363 246 c 128,-1,82 + 351 258 351 258 333 258 c 0,83,84 + 316 258 316 258 304 246 c 2,85,-1 + 167 109 l 1,86,-1 + 167 175 l 2,87,88 + 167 192 167 192 154.5 204.5 c 128,-1,89 + 142 217 142 217 125 217 c 128,-1,90 + 108 217 108 217 95.5 204.5 c 128,-1,91 + 83 192 83 192 83 175 c 2,92,-1 + 83 -33 l 1,93,-1 + 292 -33 l 2,72,73 +333 300 m 0,94,95 + 367 300 367 300 392 275.5 c 128,-1,96 + 417 251 417 251 417 217 c 0,97,98 + 417 195 417 195 404 174 c 1,99,100 + 409 175 409 175 419 175 c 2,101,-1 + 500 175 l 1,102,-1 + 500 261 l 1,103,-1 + 501 270 l 1,104,105 + 482 258 482 258 458 258 c 0,106,107 + 424 258 424 258 399.5 283 c 128,-1,108 + 375 308 375 308 375 342 c 0,109,110 + 375 364 375 364 387 384 c 1,111,-1 + 378 383 l 1,112,-1 + 292 383 l 1,113,-1 + 292 297 l 1,114,-1 + 291 288 l 1,115,116 + 310 300 310 300 333 300 c 0,94,95 +EndSplineSet +EndChar + +StartChar: glyph18 +Encoding: 18 57362 19 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 128 + 8 + 1 + 10 + 9 + 43 + 1 + 12 + 13 + 2 + 66 + 0 + 1 + 10 + 2 + 10 + 1 + 2 + 104 + 0 + 2 + 8 + 10 + 2 + 8 + 102 + 0 + 8 + 11 + 10 + 8 + 11 + 102 + 0 + 11 + 4 + 10 + 11 + 4 + 102 + 0 + 4 + 7 + 10 + 4 + 7 + 102 + 0 + 7 + 13 + 10 + 7 + 13 + 102 + 14 + 1 + 0 + 0 + 3 + 9 + 0 + 3 + 91 + 0 + 9 + 0 + 10 + 1 + 9 + 10 + 91 + 0 + 13 + 0 + 12 + 5 + 13 + 12 + 92 + 0 + 5 + 6 + 6 + 5 + 79 + 0 + 5 + 5 + 6 + 84 + 0 + 6 + 5 + 6 + 72 + 1 + 0 + 69 + 67 + 64 + 62 + 59 + 58 + 55 + 53 + 50 + 48 + 45 + 44 + 40 + 39 + 36 + 33 + 30 + 28 + 24 + 23 + 18 + 16 + 12 + 10 + 5 + 4 + 0 + 21 + 1 + 21 + 15 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +458 633 m 2,0,-1 + 667 633 l 1,1,-1 + 667 425 l 2,2,3 + 667 408 667 408 654.5 395.5 c 128,-1,4 + 642 383 642 383 625 383 c 128,-1,5 + 608 383 608 383 595.5 395.5 c 128,-1,6 + 583 408 583 408 583 425 c 2,7,-1 + 583 491 l 1,8,-1 + 446 354 l 2,9,10 + 434 342 434 342 417 342 c 0,11,12 + 399 342 399 342 387 354 c 128,-1,13 + 375 366 375 366 375 383.5 c 128,-1,14 + 375 401 375 401 387 413 c 2,15,-1 + 524 550 l 1,16,-1 + 458 550 l 2,17,18 + 441 550 441 550 429 562.5 c 128,-1,19 + 417 575 417 575 417 592 c 128,-1,20 + 417 609 417 609 429 621 c 128,-1,21 + 441 633 441 633 458 633 c 2,0,-1 +221 246 m 2,22,23 + 233 258 233 258 250 258 c 128,-1,24 + 267 258 267 258 279 246 c 128,-1,25 + 291 234 291 234 291 216.5 c 128,-1,26 + 291 199 291 199 279 187 c 2,27,-1 + 142 50 l 1,28,-1 + 208 50 l 2,29,30 + 225 50 225 50 237.5 37.5 c 128,-1,31 + 250 25 250 25 250 8 c 128,-1,32 + 250 -9 250 -9 237.5 -21 c 128,-1,33 + 225 -33 225 -33 208 -33 c 2,34,-1 + 42 -33 l 1,35,-1 + 0 -33 l 1,36,-1 + 0 175 l 2,37,38 + 0 192 0 192 12.5 204.5 c 128,-1,39 + 25 217 25 217 42 217 c 128,-1,40 + 59 217 59 217 71 204.5 c 128,-1,41 + 83 192 83 192 83 175 c 2,42,-1 + 83 109 l 1,43,-1 + 221 246 l 2,22,23 +125 300 m 128,-1,45 + 108 300 108 300 95.5 312.5 c 128,-1,46 + 83 325 83 325 83 342 c 2,47,-1 + 83 550 l 1,48,-1 + 292 550 l 2,49,50 + 309 550 309 550 321 537.5 c 128,-1,51 + 333 525 333 525 333 508 c 128,-1,52 + 333 491 333 491 321 479 c 128,-1,53 + 309 467 309 467 292 467 c 2,54,-1 + 167 467 l 1,55,-1 + 167 342 l 2,56,57 + 167 325 167 325 154.5 312.5 c 128,-1,44 + 142 300 142 300 125 300 c 128,-1,45 +542 300 m 128,-1,59 + 559 300 559 300 571 287.5 c 128,-1,60 + 583 275 583 275 583 258 c 2,61,-1 + 583 50 l 1,62,-1 + 375 50 l 2,63,64 + 358 50 358 50 345.5 62.5 c 128,-1,65 + 333 75 333 75 333 92 c 128,-1,66 + 333 109 333 109 345.5 121 c 128,-1,67 + 358 133 358 133 375 133 c 2,68,-1 + 500 133 l 1,69,-1 + 500 258 l 2,70,71 + 500 275 500 275 512.5 287.5 c 128,-1,58 + 525 300 525 300 542 300 c 128,-1,59 +EndSplineSet +EndChar + +StartChar: glyph19 +Encoding: 19 57363 20 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 204 + 42 + 1 + 9 + 5 + 38 + 1 + 10 + 4 + 67 + 1 + 7 + 8 + 105 + 1 + 12 + 7 + 32 + 1 + 6 + 12 + 9 + 1 + 14 + 13 + 113 + 28 + 2 + 23 + 14 + 98 + 1 + 21 + 23 + 15 + 1 + 1 + 16 + 19 + 1 + 2 + 15 + 10 + 66 + 5 + 1 + 7 + 1 + 65 + 24 + 1 + 0 + 0 + 9 + 4 + 0 + 9 + 91 + 0 + 5 + 0 + 10 + 8 + 5 + 10 + 91 + 0 + 4 + 25 + 1 + 8 + 7 + 4 + 8 + 91 + 0 + 7 + 17 + 1 + 12 + 6 + 7 + 12 + 91 + 26 + 18 + 11 + 3 + 6 + 22 + 27 + 20 + 3 + 13 + 14 + 6 + 13 + 91 + 19 + 1 + 14 + 0 + 23 + 21 + 14 + 23 + 91 + 0 + 21 + 0 + 1 + 15 + 21 + 1 + 91 + 0 + 15 + 2 + 3 + 15 + 79 + 0 + 16 + 0 + 2 + 3 + 16 + 2 + 91 + 0 + 15 + 15 + 3 + 84 + 0 + 3 + 15 + 3 + 72 + 112 + 112 + 104 + 104 + 45 + 45 + 1 + 0 + 133 + 131 + 128 + 127 + 124 + 122 + 112 + 119 + 112 + 119 + 116 + 114 + 104 + 111 + 104 + 111 + 108 + 106 + 102 + 101 + 96 + 94 + 90 + 88 + 85 + 83 + 81 + 79 + 76 + 74 + 71 + 70 + 65 + 63 + 45 + 58 + 45 + 57 + 54 + 52 + 49 + 48 + 41 + 39 + 37 + 35 + 23 + 21 + 18 + 16 + 14 + 12 + 0 + 44 + 1 + 44 + 28 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +667 675 m 0,0,1 + 718 675 718 675 755 638 c 128,-1,2 + 792 601 792 601 792 550 c 128,-1,3 + 792 499 792 499 755 462 c 2,4,-1 + 718 425 l 1,5,6 + 750 390 750 390 750 342 c 0,7,8 + 750 285 750 285 705 247 c 1,9,10 + 708 234 708 234 708 219 c 2,11,-1 + 708 -33 l 1,12,-1 + 461 -33 l 2,13,14 + 443 -33 443 -33 430 -29 c 1,15,16 + 392 -75 392 -75 333 -75 c 0,17,18 + 283 -75 283 -75 248 -42 c 1,19,-1 + 211 -80 l 2,20,21 + 174 -117 174 -117 125 -117 c 0,22,23 + 74 -117 74 -117 37 -80 c 128,-1,24 + 0 -43 0 -43 0 8 c 0,25,26 + 0 60 0 60 37 97 c 2,27,-1 + 76 136 l 1,28,29 + 47 171 47 171 47 217 c 0,30,31 + 47 270 47 270 88 308 c 1,32,33 + 83 333 83 333 83 339 c 2,34,-1 + 83 592 l 1,35,-1 + 336 592 l 2,36,37 + 345 592 345 592 363 588 c 1,38,39 + 401 633 401 633 458 633 c 0,40,41 + 508 633 508 633 542 602 c 1,42,-1 + 578 638 l 2,43,44 + 615 675 615 675 667 675 c 0,0,1 +167 508 m 1,45,-1 + 167 342 l 2,46,47 + 167 325 167 325 179 312.5 c 128,-1,48 + 191 300 191 300 208 300 c 128,-1,49 + 225 300 225 300 237.5 312.5 c 128,-1,50 + 250 325 250 325 250 342 c 2,51,-1 + 250 425 l 1,52,-1 + 333 425 l 2,53,54 + 350 425 350 425 362.5 437.5 c 128,-1,55 + 375 450 375 450 375 467 c 128,-1,56 + 375 484 375 484 362.5 496 c 128,-1,57 + 350 508 350 508 333 508 c 2,58,-1 + 167 508 l 1,45,-1 +696 521 m 2,59,60 + 708 533 708 533 708 550 c 128,-1,61 + 708 567 708 567 696 579 c 0,62,63 + 683 592 683 592 667 592 c 0,64,65 + 650 592 650 592 637 579 c 2,66,-1 + 500 442 l 1,67,-1 + 500 508 l 2,68,69 + 500 525 500 525 487.5 537.5 c 128,-1,70 + 475 550 475 550 458 550 c 128,-1,71 + 441 550 441 550 429 537.5 c 128,-1,72 + 417 525 417 525 417 508 c 2,73,-1 + 417 300 l 1,74,-1 + 625 300 l 2,75,76 + 642 300 642 300 654.5 312.5 c 128,-1,77 + 667 325 667 325 667 342 c 128,-1,78 + 667 359 667 359 654.5 371 c 128,-1,79 + 642 383 642 383 625 383 c 2,80,-1 + 559 383 l 1,81,-1 + 696 521 l 2,59,60 +375 50 m 2,82,-1 + 375 258 l 1,83,-1 + 172 258 l 2,84,85 + 155 258 155 258 142.5 246 c 128,-1,86 + 130 234 130 234 130 217 c 128,-1,87 + 130 200 130 200 142.5 187.5 c 128,-1,88 + 155 175 155 175 172 175 c 2,89,-1 + 233 175 l 1,90,-1 + 96 38 l 2,91,92 + 84 26 84 26 84 8.5 c 128,-1,93 + 84 -9 84 -9 96 -21 c 128,-1,94 + 108 -33 108 -33 125 -33 c 0,95,96 + 140 -33 140 -33 152 -21 c 2,97,-1 + 292 121 l 1,98,-1 + 292 50 l 2,99,100 + 292 33 292 33 304 20.5 c 128,-1,101 + 316 8 316 8 333 8 c 128,-1,102 + 350 8 350 8 362.5 20.5 c 128,-1,103 + 375 33 375 33 375 50 c 2,82,-1 +375 300 m 1,104,-1 + 375 394 l 1,105,106 + 353 383 353 383 336 383 c 2,107,-1 + 292 383 l 1,108,-1 + 292 342 l 2,109,110 + 292 321 292 321 280 300 c 1,111,-1 + 375 300 l 1,104,-1 +417 258 m 1,112,-1 + 417 162 l 1,113,114 + 438 175 438 175 461 175 c 2,115,-1 + 500 175 l 1,116,-1 + 500 219 l 2,117,118 + 500 251 500 251 530 258 c 1,119,-1 + 417 258 l 1,112,-1 +419 92 m 128,-1,121 + 419 75 419 75 431.5 62.5 c 128,-1,122 + 444 50 444 50 461 50 c 2,123,-1 + 625 50 l 1,124,-1 + 625 217 l 2,125,126 + 625 234 625 234 612.5 246 c 128,-1,127 + 600 258 600 258 583 258 c 128,-1,128 + 566 258 566 258 554 246 c 128,-1,129 + 542 234 542 234 542 217 c 2,130,-1 + 542 133 l 1,131,-1 + 461 133 l 2,132,133 + 444 133 444 133 431.5 121 c 128,-1,120 + 419 109 419 109 419 92 c 128,-1,121 +EndSplineSet +EndChar + +StartChar: glyph20 +Encoding: 20 57364 21 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 109 + 70 + 1 + 6 + 5 + 8 + 1 + 8 + 9 + 2 + 66 + 0 + 10 + 13 + 10 + 106 + 0 + 13 + 5 + 13 + 106 + 0 + 1 + 8 + 2 + 8 + 1 + 2 + 104 + 0 + 2 + 2 + 105 + 0 + 5 + 0 + 6 + 11 + 5 + 6 + 91 + 0 + 11 + 12 + 1 + 4 + 0 + 11 + 4 + 92 + 7 + 14 + 2 + 0 + 0 + 3 + 9 + 0 + 3 + 91 + 0 + 9 + 8 + 8 + 9 + 79 + 0 + 9 + 9 + 8 + 84 + 0 + 8 + 9 + 8 + 72 + 1 + 0 + 67 + 66 + 63 + 61 + 58 + 56 + 52 + 51 + 47 + 45 + 42 + 40 + 37 + 36 + 33 + 31 + 28 + 26 + 23 + 22 + 18 + 16 + 12 + 10 + 5 + 4 + 0 + 21 + 1 + 21 + 15 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +88 258 m 2,0,-1 + 292 258 l 1,1,-1 + 292 50 l 2,2,3 + 292 32 292 32 282 20 c 128,-1,4 + 272 8 272 8 255 8 c 128,-1,5 + 238 8 238 8 225.5 20.5 c 128,-1,6 + 213 33 213 33 213 50 c 2,7,-1 + 213 121 l 1,8,-1 + 71 -21 l 2,9,10 + 59 -33 59 -33 42 -33 c 0,11,12 + 24 -33 24 -33 12 -21 c 128,-1,13 + 0 -9 0 -9 0 8.5 c 128,-1,14 + 0 26 0 26 12 38 c 2,15,-1 + 149 175 l 1,16,-1 + 88 175 l 2,17,18 + 71 175 71 175 59 187.5 c 128,-1,19 + 47 200 47 200 47 217 c 128,-1,20 + 47 234 47 234 59 246 c 128,-1,21 + 71 258 71 258 88 258 c 2,0,-1 +125 342 m 128,-1,23 + 108 342 108 342 95.5 354 c 128,-1,24 + 83 366 83 366 83 383 c 2,25,-1 + 83 550 l 1,26,-1 + 250 550 l 2,27,28 + 267 550 267 550 279.5 537.5 c 128,-1,29 + 292 525 292 525 292 508 c 128,-1,30 + 292 491 292 491 279.5 479 c 128,-1,31 + 267 467 267 467 250 467 c 2,32,-1 + 167 467 l 1,33,-1 + 167 383 l 2,34,35 + 167 366 167 366 154.5 354 c 128,-1,22 + 142 342 142 342 125 342 c 128,-1,23 +542 258 m 128,-1,37 + 559 258 559 258 571 246 c 128,-1,38 + 583 234 583 234 583 217 c 2,39,-1 + 583 50 l 1,40,-1 + 417 50 l 2,41,42 + 400 50 400 50 387.5 62.5 c 128,-1,43 + 375 75 375 75 375 92 c 128,-1,44 + 375 109 375 109 387.5 121 c 128,-1,45 + 400 133 400 133 417 133 c 2,46,-1 + 500 133 l 1,47,-1 + 500 217 l 2,48,49 + 500 234 500 234 512.5 246 c 128,-1,36 + 525 258 525 258 542 258 c 128,-1,37 +596 621 m 2,50,51 + 608 633 608 633 625 633 c 128,-1,52 + 642 633 642 633 654 621 c 128,-1,53 + 666 609 666 609 666 591.5 c 128,-1,54 + 666 574 666 574 654 562 c 2,55,-1 + 517 425 l 1,56,-1 + 583 425 l 2,57,58 + 600 425 600 425 612.5 412.5 c 128,-1,59 + 625 400 625 400 625 383 c 128,-1,60 + 625 366 625 366 612.5 354 c 128,-1,61 + 600 342 600 342 583 342 c 2,62,-1 + 375 342 l 1,63,-1 + 375 550 l 2,64,65 + 375 567 375 567 387.5 579.5 c 128,-1,66 + 400 592 400 592 417 592 c 128,-1,67 + 434 592 434 592 446 579.5 c 128,-1,68 + 458 567 458 567 458 550 c 2,69,-1 + 458 484 l 1,70,-1 + 596 621 l 2,50,51 +EndSplineSet +EndChar + +StartChar: glyph21 +Encoding: 21 57365 22 +Width: 951 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 162 + 48 + 40 + 32 + 3 + 3 + 1 + 116 + 108 + 2 + 19 + 5 + 59 + 21 + 2 + 10 + 4 + 104 + 96 + 2 + 11 + 15 + 86 + 78 + 70 + 3 + 0 + 2 + 5 + 66 + 8 + 1 + 3 + 1 + 5 + 1 + 3 + 5 + 104 + 9 + 22 + 2 + 2 + 11 + 0 + 11 + 2 + 0 + 104 + 0 + 1 + 3 + 0 + 1 + 79 + 6 + 1 + 5 + 20 + 1 + 19 + 18 + 5 + 19 + 91 + 24 + 21 + 2 + 18 + 7 + 1 + 4 + 10 + 18 + 4 + 90 + 13 + 1 + 10 + 23 + 17 + 2 + 14 + 15 + 10 + 14 + 89 + 16 + 1 + 15 + 12 + 1 + 11 + 2 + 15 + 11 + 91 + 0 + 1 + 1 + 0 + 83 + 0 + 0 + 1 + 0 + 71 + 112 + 112 + 100 + 100 + 19 + 18 + 112 + 117 + 112 + 117 + 115 + 114 + 110 + 109 + 107 + 106 + 100 + 105 + 100 + 105 + 103 + 102 + 98 + 97 + 95 + 94 + 88 + 87 + 84 + 82 + 74 + 72 + 69 + 68 + 63 + 61 + 57 + 55 + 50 + 49 + 46 + 44 + 36 + 34 + 31 + 30 + 25 + 23 + 18 + 93 + 19 + 93 + 39 + 37 + 25 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +927 359 m 2,0,1 + 952 335 952 335 952 300.5 c 128,-1,2 + 952 266 952 266 927 241 c 2,3,-1 + 534 -151 l 2,4,5 + 509 -176 509 -176 476 -176 c 0,6,7 + 442 -176 442 -176 417 -151 c 2,8,-1 + 24 241 l 2,9,10 + -1 266 -1 266 -1 300.5 c 128,-1,11 + -1 335 -1 335 24 359 c 2,12,-1 + 417 751 l 2,13,14 + 442 776 442 776 476 776 c 0,15,16 + 509 776 509 776 534 751 c 2,17,-1 + 927 359 l 2,0,1 +684 133 m 0,18,19 + 700 133 700 133 713 146 c 2,20,-1 + 868 300 l 1,21,-1 + 713 454 l 2,22,23 + 700 467 700 467 684 467 c 0,24,25 + 667 467 667 467 654 454 c 0,26,27 + 642 442 642 442 642 425 c 128,-1,28 + 642 408 642 408 654 396 c 2,29,-1 + 708 342 l 1,30,-1 + 517 342 l 1,31,-1 + 517 533 l 1,32,-1 + 571 479 l 2,33,34 + 583 467 583 467 601 467 c 0,35,36 + 618 467 618 467 630 479 c 128,-1,37 + 642 491 642 491 642 508.5 c 128,-1,38 + 642 526 642 526 630 538 c 2,39,-1 + 476 692 l 1,40,-1 + 321 538 l 2,41,42 + 309 526 309 526 309 508.5 c 128,-1,43 + 309 491 309 491 321 479 c 128,-1,44 + 333 467 333 467 351 467 c 0,45,46 + 368 467 368 467 380 479 c 2,47,-1 + 434 533 l 1,48,-1 + 434 342 l 1,49,-1 + 243 342 l 1,50,-1 + 297 396 l 2,51,52 + 309 408 309 408 309 425 c 128,-1,53 + 309 442 309 442 297 454 c 0,54,55 + 284 467 284 467 267 467 c 0,56,57 + 251 467 251 467 238 454 c 2,58,-1 + 83 300 l 1,59,-1 + 238 146 l 2,60,61 + 251 133 251 133 267 133 c 0,62,63 + 284 133 284 133 297 146 c 0,64,65 + 309 158 309 158 309 175 c 128,-1,66 + 309 192 309 192 297 204 c 2,67,-1 + 243 258 l 1,68,-1 + 434 258 l 1,69,-1 + 434 67 l 1,70,-1 + 380 121 l 2,71,72 + 368 133 368 133 351 133 c 0,73,74 + 333 133 333 133 321 121 c 128,-1,75 + 309 109 309 109 309 91.5 c 128,-1,76 + 309 74 309 74 321 62 c 2,77,-1 + 476 -92 l 1,78,-1 + 630 62 l 2,79,80 + 642 74 642 74 642 91.5 c 128,-1,81 + 642 109 642 109 630 121 c 128,-1,82 + 618 133 618 133 601 133 c 0,83,84 + 583 133 583 133 571 121 c 2,85,-1 + 517 67 l 1,86,-1 + 517 258 l 1,87,-1 + 708 258 l 1,88,-1 + 654 204 l 2,89,90 + 642 192 642 192 642 175 c 128,-1,91 + 642 158 642 158 654 146 c 0,92,93 + 667 133 667 133 684 133 c 0,18,19 +612 217 m 1,94,-1 + 559 217 l 1,95,-1 + 559 164 l 1,96,97 + 579 175 579 175 601 175 c 1,98,99 + 601 197 601 197 612 217 c 1,94,-1 +339 217 m 1,100,101 + 351 195 351 195 351 175 c 1,102,103 + 372 175 372 175 392 164 c 1,104,-1 + 392 217 l 1,105,-1 + 339 217 l 1,100,101 +339 383 m 1,106,-1 + 392 383 l 1,107,-1 + 392 436 l 1,108,109 + 372 425 372 425 351 425 c 1,110,111 + 351 405 351 405 339 383 c 1,106,-1 +612 383 m 1,112,113 + 601 403 601 403 601 425 c 1,114,115 + 579 425 579 425 559 436 c 1,116,-1 + 559 383 l 1,117,-1 + 612 383 l 1,112,113 +EndSplineSet +EndChar + +StartChar: glyph22 +Encoding: 22 57366 23 +Width: 784 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 37 + 1 + 2 + 1 + 7 + 1 + 66 + 61 + 53 + 46 + 3 + 8 + 64 + 26 + 19 + 12 + 3 + 2 + 63 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 45 + 9 + 1 + 8 + 6 + 8 + 106 + 11 + 1 + 6 + 7 + 7 + 6 + 94 + 5 + 1 + 0 + 1 + 2 + 1 + 0 + 96 + 3 + 1 + 2 + 2 + 105 + 10 + 1 + 7 + 1 + 1 + 7 + 77 + 10 + 1 + 7 + 7 + 1 + 82 + 4 + 1 + 1 + 7 + 1 + 70 +ELSE +MPPEM +PUSHB_1 + 11 +LT +IF +NPUSHB + 46 + 9 + 1 + 8 + 6 + 8 + 106 + 11 + 1 + 6 + 7 + 7 + 6 + 94 + 5 + 1 + 0 + 1 + 2 + 1 + 0 + 2 + 104 + 3 + 1 + 2 + 2 + 105 + 10 + 1 + 7 + 1 + 1 + 7 + 77 + 10 + 1 + 7 + 7 + 1 + 82 + 4 + 1 + 1 + 7 + 1 + 70 +ELSE +NPUSHB + 45 + 9 + 1 + 8 + 6 + 8 + 106 + 11 + 1 + 6 + 7 + 6 + 106 + 5 + 1 + 0 + 1 + 2 + 1 + 0 + 2 + 104 + 3 + 1 + 2 + 2 + 105 + 10 + 1 + 7 + 1 + 1 + 7 + 77 + 10 + 1 + 7 + 7 + 1 + 82 + 4 + 1 + 1 + 7 + 1 + 70 +EIF +EIF +NPUSHB + 17 + 68 + 67 + 63 + 62 + 59 + 57 + 19 + 20 + 20 + 37 + 19 + 24 + 19 + 21 + 35 + 12 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +630 454 m 2,0,-1 + 784 300 l 1,1,-1 + 630 146 l 2,2,3 + 617 133 617 133 601 133 c 0,4,5 + 584 133 584 133 571 146 c 0,6,7 + 559 158 559 158 559 175 c 128,-1,8 + 559 192 559 192 571 204 c 2,9,-1 + 625 258 l 1,10,-1 + 434 258 l 1,11,-1 + 434 67 l 1,12,-1 + 488 121 l 2,13,14 + 500 133 500 133 517.5 133 c 128,-1,15 + 535 133 535 133 547 121 c 128,-1,16 + 559 109 559 109 559 91.5 c 128,-1,17 + 559 74 559 74 547 62 c 2,18,-1 + 392 -92 l 1,19,-1 + 238 62 l 2,20,21 + 226 74 226 74 226 91.5 c 128,-1,22 + 226 109 226 109 238 121 c 128,-1,23 + 250 133 250 133 267.5 133 c 128,-1,24 + 285 133 285 133 297 121 c 2,25,-1 + 351 67 l 1,26,-1 + 351 258 l 1,27,-1 + 160 258 l 1,28,-1 + 213 204 l 2,29,30 + 225 192 225 192 225 175 c 128,-1,31 + 225 158 225 158 213 146 c 0,32,33 + 200 133 200 133 184 133 c 0,34,35 + 167 133 167 133 154 146 c 2,36,-1 + 0 300 l 1,37,-1 + 154 454 l 2,38,39 + 166 466 166 466 183.5 466 c 128,-1,40 + 201 466 201 466 213 454 c 128,-1,41 + 225 442 225 442 225 425 c 128,-1,42 + 225 408 225 408 213 396 c 2,43,-1 + 160 342 l 1,44,-1 + 351 342 l 1,45,-1 + 351 533 l 1,46,-1 + 297 479 l 2,47,48 + 285 467 285 467 267.5 467 c 128,-1,49 + 250 467 250 467 238 479 c 128,-1,50 + 226 491 226 491 226 508.5 c 128,-1,51 + 226 526 226 526 238 538 c 2,52,-1 + 392 692 l 1,53,-1 + 547 538 l 2,54,55 + 559 526 559 526 559 508.5 c 128,-1,56 + 559 491 559 491 547 479 c 128,-1,57 + 535 467 535 467 517 467 c 0,58,59 + 500 467 500 467 488 479 c 2,60,-1 + 434 533 l 1,61,-1 + 434 342 l 1,62,-1 + 625 342 l 1,63,-1 + 571 396 l 2,64,65 + 559 408 559 408 559 425 c 128,-1,66 + 559 442 559 442 571 454 c 128,-1,67 + 583 466 583 466 600.5 466 c 128,-1,68 + 618 466 618 466 630 454 c 2,0,-1 +EndSplineSet +EndChar + +StartChar: glyph23 +Encoding: 23 57367 24 +Width: 958 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 162 + 29 + 4 + 2 + 5 + 3 + 89 + 45 + 2 + 8 + 5 + 81 + 1 + 10 + 13 + 99 + 1 + 11 + 12 + 120 + 71 + 2 + 4 + 9 + 13 + 1 + 1 + 4 + 6 + 66 + 19 + 1 + 1 + 1 + 65 + 20 + 1 + 0 + 0 + 6 + 3 + 0 + 6 + 91 + 0 + 3 + 14 + 1 + 5 + 8 + 3 + 5 + 91 + 19 + 1 + 8 + 0 + 13 + 10 + 8 + 13 + 91 + 0 + 10 + 0 + 17 + 7 + 10 + 17 + 91 + 0 + 7 + 0 + 12 + 11 + 7 + 12 + 92 + 0 + 11 + 18 + 1 + 9 + 4 + 11 + 9 + 91 + 15 + 21 + 2 + 4 + 0 + 1 + 16 + 4 + 1 + 91 + 0 + 16 + 2 + 2 + 16 + 79 + 0 + 16 + 16 + 2 + 84 + 0 + 2 + 16 + 2 + 72 + 33 + 32 + 1 + 0 + 137 + 134 + 131 + 129 + 124 + 122 + 118 + 116 + 111 + 109 + 106 + 103 + 94 + 91 + 87 + 85 + 76 + 73 + 69 + 67 + 60 + 57 + 54 + 52 + 48 + 47 + 43 + 42 + 38 + 36 + 32 + 64 + 33 + 63 + 28 + 25 + 17 + 15 + 12 + 9 + 0 + 31 + 1 + 31 + 22 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 633 m 0,0,1 + 676 633 676 633 713 596 c 128,-1,2 + 750 559 750 559 750 508 c 2,3,-1 + 750 501 l 1,4,5 + 840 478 840 478 899 399 c 128,-1,6 + 958 320 958 320 958 217 c 0,7,8 + 958 96 958 96 873 10.5 c 128,-1,9 + 788 -75 788 -75 667 -75 c 2,10,-1 + 625 -75 l 2,11,12 + 577 -75 577 -75 542 -43 c 1,13,-1 + 422 -163 l 2,14,15 + 385 -200 385 -200 333 -200 c 0,16,17 + 282 -200 282 -200 245 -163 c 128,-1,18 + 208 -126 208 -126 208 -75 c 1,19,-1 + 209 -67 l 1,20,21 + 119 -44 119 -44 59.5 35.5 c 128,-1,22 + 0 115 0 115 0 217 c 0,23,24 + 0 338 0 338 85.5 423 c 128,-1,25 + 171 508 171 508 292 508 c 2,26,-1 + 333 508 l 2,27,28 + 381 508 381 508 416 476 c 1,29,-1 + 537 597 l 2,30,31 + 573 633 573 633 625 633 c 0,0,1 +667 8 m 2,32,33 + 753 8 753 8 814 69.5 c 128,-1,34 + 875 131 875 131 875 217 c 128,-1,35 + 875 303 875 303 820 364 c 128,-1,36 + 765 425 765 425 688 425 c 2,37,-1 + 601 425 l 1,38,-1 + 654 479 l 2,39,40 + 666 491 666 491 666 508.5 c 128,-1,41 + 666 526 666 526 654 538 c 128,-1,42 + 642 550 642 550 625 550 c 128,-1,43 + 608 550 608 550 596 538 c 2,44,-1 + 441 383 l 1,45,-1 + 596 229 l 2,46,47 + 608 217 608 217 625 217 c 128,-1,48 + 642 217 642 217 654 229 c 128,-1,49 + 666 241 666 241 666 258.5 c 128,-1,50 + 666 276 666 276 654 288 c 2,51,-1 + 601 342 l 1,52,-1 + 688 342 l 2,53,54 + 731 342 731 342 761.5 305.5 c 128,-1,55 + 792 269 792 269 792 217 c 128,-1,56 + 792 165 792 165 755.5 128.5 c 128,-1,57 + 719 92 719 92 667 92 c 2,58,-1 + 625 92 l 2,59,60 + 608 92 608 92 595.5 79.5 c 128,-1,61 + 583 67 583 67 583 50 c 128,-1,62 + 583 33 583 33 595.5 20.5 c 128,-1,63 + 608 8 608 8 625 8 c 2,64,-1 + 667 8 l 2,32,33 +250 175 m 0,65,66 + 250 209 250 209 274.5 233.5 c 128,-1,67 + 299 258 299 258 333 258 c 0,68,69 + 368 258 368 258 392 234 c 2,70,-1 + 547 79 l 1,71,72 + 556 103 556 103 577 118 c 128,-1,73 + 598 133 598 133 625 133 c 2,74,-1 + 667 133 l 2,75,76 + 701 133 701 133 725.5 157.5 c 128,-1,77 + 750 182 750 182 750 217 c 0,78,79 + 750 247 750 247 735 270.5 c 128,-1,80 + 720 294 720 294 698 299 c 1,81,82 + 708 282 708 282 708 258 c 0,83,84 + 708 224 708 224 683.5 199.5 c 128,-1,85 + 659 175 659 175 625 175 c 0,86,87 + 590 175 590 175 566 199 c 2,88,-1 + 411 354 l 1,89,90 + 402 330 402 330 381 315 c 128,-1,91 + 360 300 360 300 333 300 c 2,92,-1 + 292 300 l 2,93,94 + 257 300 257 300 232.5 275.5 c 128,-1,95 + 208 251 208 251 208 217 c 0,96,97 + 208 187 208 187 223 163.5 c 128,-1,98 + 238 140 238 140 260 135 c 1,99,100 + 250 152 250 152 250 175 c 0,65,66 +375 383 m 128,-1,102 + 375 400 375 400 362.5 412.5 c 128,-1,103 + 350 425 350 425 333 425 c 2,104,-1 + 292 425 l 2,105,106 + 206 425 206 425 144.5 364 c 128,-1,107 + 83 303 83 303 83 217 c 128,-1,108 + 83 131 83 131 138.5 69.5 c 128,-1,109 + 194 8 194 8 271 8 c 2,110,-1 + 358 8 l 1,111,-1 + 304 -46 l 2,112,113 + 292 -58 292 -58 292 -75 c 128,-1,114 + 292 -92 292 -92 304 -104 c 0,115,116 + 317 -117 317 -117 333 -117 c 0,117,118 + 350 -117 350 -117 363 -104 c 2,119,-1 + 517 50 l 1,120,-1 + 363 204 l 2,121,122 + 350 217 350 217 333 217 c 0,123,124 + 317 217 317 217 304 204 c 0,125,126 + 292 192 292 192 292 175 c 128,-1,127 + 292 158 292 158 304 146 c 2,128,-1 + 358 92 l 1,129,-1 + 271 92 l 2,130,131 + 228 92 228 92 197.5 128.5 c 128,-1,132 + 167 165 167 165 167 217 c 128,-1,133 + 167 269 167 269 203.5 305.5 c 128,-1,134 + 240 342 240 342 292 342 c 2,135,-1 + 333 342 l 2,136,137 + 350 342 350 342 362.5 354 c 128,-1,101 + 375 366 375 366 375 383 c 128,-1,102 +EndSplineSet +EndChar + +StartChar: glyph24 +Encoding: 24 57368 25 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 23 + 1 + 3 + 0 + 35 + 1 + 1 + 2 + 2 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 55 + 0 + 5 + 0 + 0 + 5 + 94 + 0 + 4 + 3 + 6 + 3 + 4 + 96 + 0 + 6 + 2 + 2 + 6 + 94 + 0 + 7 + 1 + 1 + 7 + 95 + 9 + 12 + 2 + 0 + 10 + 1 + 3 + 4 + 0 + 3 + 92 + 11 + 1 + 2 + 1 + 1 + 2 + 79 + 11 + 1 + 2 + 2 + 1 + 84 + 8 + 1 + 1 + 2 + 1 + 72 +ELSE +NPUSHB + 55 + 0 + 5 + 0 + 5 + 106 + 0 + 4 + 3 + 6 + 3 + 4 + 6 + 104 + 0 + 6 + 2 + 3 + 6 + 2 + 102 + 0 + 7 + 1 + 7 + 107 + 9 + 12 + 2 + 0 + 10 + 1 + 3 + 4 + 0 + 3 + 92 + 11 + 1 + 2 + 1 + 1 + 2 + 79 + 11 + 1 + 2 + 2 + 1 + 84 + 8 + 1 + 1 + 2 + 1 + 72 +EIF +NPUSHB + 30 + 1 + 0 + 59 + 57 + 54 + 52 + 49 + 47 + 44 + 42 + 38 + 37 + 33 + 32 + 26 + 25 + 21 + 20 + 16 + 14 + 11 + 9 + 6 + 4 + 0 + 30 + 1 + 30 + 13 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +562 508 m 2,0,1 + 639 508 639 508 694.5 447 c 128,-1,2 + 750 386 750 386 750 300 c 128,-1,3 + 750 214 750 214 689 153 c 128,-1,4 + 628 92 628 92 542 92 c 0,5,6 + 525 92 525 92 512.5 104 c 128,-1,7 + 500 116 500 116 500 133 c 128,-1,8 + 500 150 500 150 512.5 162.5 c 128,-1,9 + 525 175 525 175 542 175 c 0,10,11 + 594 175 594 175 630.5 211.5 c 128,-1,12 + 667 248 667 248 667 300 c 128,-1,13 + 667 352 667 352 636 388.5 c 128,-1,14 + 605 425 605 425 562 425 c 2,15,-1 + 476 425 l 1,16,-1 + 529 371 l 2,17,18 + 541 359 541 359 541 341.5 c 128,-1,19 + 541 324 541 324 529 312 c 128,-1,20 + 517 300 517 300 500 300 c 128,-1,21 + 483 300 483 300 471 312 c 2,22,-1 + 316 467 l 1,23,-1 + 471 621 l 2,24,25 + 483 633 483 633 500 633 c 128,-1,26 + 517 633 517 633 529 621 c 128,-1,27 + 541 609 541 609 541 591.5 c 128,-1,28 + 541 574 541 574 529 562 c 2,29,-1 + 476 508 l 1,30,-1 + 562 508 l 2,0,1 +221 288 m 128,-1,32 + 233 300 233 300 250 300 c 128,-1,33 + 267 300 267 300 279 288 c 2,34,-1 + 434 133 l 1,35,-1 + 279 -21 l 2,36,37 + 267 -33 267 -33 250 -33 c 128,-1,38 + 233 -33 233 -33 221 -21 c 128,-1,39 + 209 -9 209 -9 209 8.5 c 128,-1,40 + 209 26 209 26 221 38 c 2,41,-1 + 274 92 l 1,42,-1 + 188 92 l 2,43,44 + 111 92 111 92 55.5 153 c 128,-1,45 + 0 214 0 214 0 300 c 128,-1,46 + 0 386 0 386 61 447 c 128,-1,47 + 122 508 122 508 208 508 c 0,48,49 + 225 508 225 508 237.5 496 c 128,-1,50 + 250 484 250 484 250 467 c 128,-1,51 + 250 450 250 450 237.5 437.5 c 128,-1,52 + 225 425 225 425 208 425 c 0,53,54 + 156 425 156 425 119.5 388.5 c 128,-1,55 + 83 352 83 352 83 300 c 128,-1,56 + 83 248 83 248 114 211.5 c 128,-1,57 + 145 175 145 175 188 175 c 2,58,-1 + 274 175 l 1,59,-1 + 221 229 l 2,60,61 + 209 241 209 241 209 258.5 c 128,-1,31 + 209 276 209 276 221 288 c 128,-1,32 +EndSplineSet +EndChar + +StartChar: glyph25 +Encoding: 25 57369 26 +Width: 805 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 43 + 28 + 2 + 5 + 4 + 1 + 66 + 0 + 3 + 0 + 7 + 2 + 3 + 7 + 91 + 0 + 2 + 8 + 1 + 4 + 5 + 2 + 4 + 91 + 0 + 5 + 0 + 1 + 6 + 5 + 1 + 91 + 0 + 6 + 0 + 0 + 6 + 79 + 0 + 6 + 6 + 0 + 83 + 0 + 0 + 6 + 0 + 71 + 31 + 30 + 46 + 45 + 41 + 40 + 36 + 34 + 30 + 51 + 31 + 51 + 25 + 35 + 40 + 16 + 9 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +420 -75 m 128,-1,1 + 369 -75 369 -75 332 -38 c 128,-1,2 + 295 -1 295 -1 295 50 c 0,3,4 + 295 59 295 59 296 66 c 128,-1,5 + 297 73 297 73 300 81 c 128,-1,6 + 303 89 303 89 305.5 94 c 128,-1,7 + 308 99 308 99 314.5 111.5 c 128,-1,8 + 321 124 321 124 326 133 c 1,9,-1 + 125 133 l 2,10,11 + 73 133 73 133 36.5 169.5 c 128,-1,12 + 0 206 0 206 0 258 c 128,-1,13 + 0 310 0 310 36.5 346.5 c 128,-1,14 + 73 383 73 383 125 383 c 2,15,-1 + 326 383 l 1,16,17 + 322 392 322 392 315 404.5 c 128,-1,18 + 308 417 308 417 305.5 422 c 128,-1,19 + 303 427 303 427 300 435.5 c 128,-1,20 + 297 444 297 444 296 451 c 128,-1,21 + 295 458 295 458 295 467 c 0,22,23 + 295 519 295 519 331 555 c 0,24,25 + 366 590 366 590 419.5 590 c 128,-1,26 + 473 590 473 590 508 555 c 2,27,-1 + 805 258 l 1,28,-1 + 508 -38 l 2,29,0 + 471 -75 471 -75 420 -75 c 128,-1,1 +125 300 m 2,30,31 + 108 300 108 300 95.5 287.5 c 128,-1,32 + 83 275 83 275 83 258 c 128,-1,33 + 83 241 83 241 95.5 229 c 128,-1,34 + 108 217 108 217 125 217 c 2,35,-1 + 527 217 l 1,36,-1 + 390 79 l 2,37,38 + 378 67 378 67 378 50 c 128,-1,39 + 378 33 378 33 390 21 c 128,-1,40 + 402 9 402 9 419.5 9 c 128,-1,41 + 437 9 437 9 449 21 c 2,42,-1 + 687 258 l 1,43,-1 + 449 496 l 2,44,45 + 437 508 437 508 419.5 508 c 128,-1,46 + 402 508 402 508 390 496 c 128,-1,47 + 378 484 378 484 378 467 c 0,48,49 + 378 449 378 449 390 437 c 2,50,-1 + 527 300 l 1,51,-1 + 125 300 l 2,30,31 +EndSplineSet +EndChar + +StartChar: glyph26 +Encoding: 26 57370 27 +Width: 704 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 4 + 1 + 2 + 3 + 1 + 66 + 0 + 0 + 3 + 0 + 106 + 0 + 1 + 2 + 1 + 107 + 0 + 3 + 2 + 2 + 3 + 79 + 0 + 3 + 3 + 2 + 84 + 0 + 2 + 3 + 2 + 72 + 36 + 37 + 20 + 17 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +319 526 m 0,0,1 + 344 551 344 551 378 551 c 128,-1,2 + 412 551 412 551 437 526 c 2,3,-1 + 704 258 l 1,4,-1 + 437 -9 l 2,5,6 + 413 -33 413 -33 378 -33 c 128,-1,7 + 343 -33 343 -33 319 -9 c 0,8,9 + 294 16 294 16 294 50.5 c 128,-1,10 + 294 85 294 85 319 109 c 2,11,-1 + 385 175 l 1,12,-1 + 83 175 l 2,13,14 + 48 175 48 175 24 199.5 c 128,-1,15 + 0 224 0 224 0 258 c 0,16,17 + 0 293 0 293 24.5 317.5 c 128,-1,18 + 49 342 49 342 83 342 c 2,19,-1 + 385 342 l 1,20,-1 + 319 408 l 2,21,22 + 294 433 294 433 294 467.5 c 128,-1,23 + 294 502 294 502 319 526 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph27 +Encoding: 27 57371 28 +Width: 517 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 4 + 1 + 2 + 3 + 1 + 66 + 0 + 0 + 3 + 0 + 106 + 0 + 1 + 2 + 1 + 107 + 0 + 3 + 2 + 2 + 3 + 79 + 0 + 3 + 3 + 2 + 84 + 0 + 2 + 3 + 2 + 72 + 35 + 36 + 36 + 17 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +262 496 m 128,-1,1 + 274 508 274 508 291.5 508 c 128,-1,2 + 309 508 309 508 321 496 c 2,3,-1 + 517 300 l 1,4,-1 + 321 104 l 2,5,6 + 309 92 309 92 292 92 c 0,7,8 + 274 92 274 92 262 104 c 128,-1,9 + 250 116 250 116 250 133.5 c 128,-1,10 + 250 151 250 151 262 163 c 2,11,-1 + 358 258 l 1,12,-1 + 42 258 l 2,13,14 + 25 258 25 258 12.5 270.5 c 128,-1,15 + 0 283 0 283 0 300 c 128,-1,16 + 0 317 0 317 12.5 329.5 c 128,-1,17 + 25 342 25 342 42 342 c 2,18,-1 + 358 342 l 1,19,-1 + 262 437 l 2,20,21 + 250 449 250 449 250 466.5 c 128,-1,0 + 250 484 250 484 262 496 c 128,-1,1 +EndSplineSet +EndChar + +StartChar: glyph28 +Encoding: 28 57372 29 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 20 + 39 + 8 + 2 + 0 + 1 + 10 + 1 + 6 + 0 + 68 + 1 + 3 + 8 + 66 + 55 + 2 + 2 + 3 + 4 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 55 + 0 + 5 + 1 + 1 + 5 + 94 + 0 + 6 + 0 + 8 + 0 + 6 + 96 + 0 + 8 + 3 + 3 + 8 + 94 + 0 + 9 + 2 + 2 + 9 + 95 + 4 + 1 + 1 + 7 + 12 + 2 + 0 + 6 + 1 + 0 + 92 + 11 + 1 + 3 + 2 + 2 + 3 + 79 + 11 + 1 + 3 + 3 + 2 + 84 + 10 + 1 + 2 + 3 + 2 + 72 +ELSE +NPUSHB + 55 + 0 + 5 + 1 + 5 + 106 + 0 + 6 + 0 + 8 + 0 + 6 + 8 + 104 + 0 + 8 + 3 + 0 + 8 + 3 + 102 + 0 + 9 + 2 + 9 + 107 + 4 + 1 + 1 + 7 + 12 + 2 + 0 + 6 + 1 + 0 + 92 + 11 + 1 + 3 + 2 + 2 + 3 + 79 + 11 + 1 + 3 + 3 + 2 + 84 + 10 + 1 + 2 + 3 + 2 + 72 +EIF +NPUSHB + 30 + 1 + 0 + 72 + 70 + 65 + 63 + 59 + 57 + 53 + 52 + 49 + 47 + 43 + 41 + 37 + 36 + 32 + 30 + 25 + 22 + 19 + 16 + 7 + 4 + 0 + 12 + 1 + 11 + 13 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +42 425 m 2,0,1 + 25 425 25 425 12.5 437.5 c 128,-1,2 + 0 450 0 450 0 467 c 128,-1,3 + 0 484 0 484 12.5 496 c 128,-1,4 + 25 508 25 508 42 508 c 2,5,-1 + 188 508 l 2,6,7 + 261 508 261 508 314 453 c 1,8,9 + 288 425 288 425 265 383 c 1,10,11 + 233 425 233 425 188 425 c 2,12,-1 + 42 425 l 2,0,1 +362 295 m 2,13,-1 + 342 237 l 2,14,15 + 316 157 316 157 260 103.5 c 128,-1,16 + 204 50 204 50 146 50 c 2,17,-1 + 42 50 l 2,18,19 + 25 50 25 50 12.5 62.5 c 128,-1,20 + 0 75 0 75 0 92 c 128,-1,21 + 0 109 0 109 12.5 121 c 128,-1,22 + 25 133 25 133 42 133 c 2,23,-1 + 146 133 l 2,24,25 + 172 133 172 133 208 170 c 128,-1,26 + 244 207 244 207 263 263 c 2,27,-1 + 283 322 l 2,28,29 + 309 401 309 401 376 454.5 c 128,-1,30 + 443 508 443 508 514 508 c 2,31,-1 + 590 508 l 1,32,-1 + 537 562 l 2,33,34 + 525 574 525 574 525 591.5 c 128,-1,35 + 525 609 525 609 537 621 c 128,-1,36 + 549 633 549 633 566.5 633 c 128,-1,37 + 584 633 584 633 596 621 c 2,38,-1 + 750 467 l 1,39,-1 + 596 312 l 2,40,41 + 584 300 584 300 566 300 c 0,42,43 + 549 300 549 300 537 312 c 128,-1,44 + 525 324 525 324 525 341.5 c 128,-1,45 + 525 359 525 359 537 371 c 2,46,-1 + 590 425 l 1,47,-1 + 514 425 l 2,48,49 + 471 425 471 425 425 386 c 128,-1,50 + 379 347 379 347 362 295 c 2,13,-1 +537 246 m 128,-1,52 + 549 258 549 258 566.5 258 c 128,-1,53 + 584 258 584 258 596 246 c 2,54,-1 + 750 92 l 1,55,-1 + 596 -63 l 2,56,57 + 584 -75 584 -75 566 -75 c 0,58,59 + 549 -75 549 -75 537 -63 c 128,-1,60 + 525 -51 525 -51 525 -33.5 c 128,-1,61 + 525 -16 525 -16 537 -4 c 2,62,-1 + 590 50 l 1,63,-1 + 493 50 l 2,64,65 + 398 50 398 50 336 130 c 1,66,67 + 364 172 364 172 381 221 c 1,68,69 + 392 182 392 182 423 157.5 c 128,-1,70 + 454 133 454 133 493 133 c 2,71,-1 + 590 133 l 1,72,-1 + 537 187 l 2,73,74 + 525 199 525 199 525 216.5 c 128,-1,51 + 525 234 525 234 537 246 c 128,-1,52 +EndSplineSet +EndChar + +StartChar: glyph29 +Encoding: 29 57373 30 +Width: 542 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 17 + 5 + 1 + 0 + 63 + 1 + 1 + 0 + 0 + 97 + 1 + 0 + 0 + 10 + 1 + 9 + 2 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +500 467 m 2,0,1 + 517 467 517 467 529.5 454 c 128,-1,2 + 542 441 542 441 542 425 c 128,-1,3 + 542 409 542 409 529 396 c 2,4,-1 + 271 133 l 1,5,-1 + 12 396 l 2,6,7 + 0 408 0 408 0 425 c 128,-1,8 + 0 442 0 442 12.5 454.5 c 128,-1,9 + 25 467 25 467 42 467 c 2,10,-1 + 500 467 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph30 +Encoding: 30 57374 31 +Width: 542 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 17 + 6 + 1 + 0 + 64 + 1 + 1 + 0 + 0 + 97 + 1 + 0 + 0 + 11 + 1 + 10 + 2 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +42 175 m 2,0,1 + 25 175 25 175 12.5 188 c 128,-1,2 + 0 201 0 201 0 217 c 0,3,4 + 0 234 0 234 12 246 c 2,5,-1 + 271 508 l 1,6,-1 + 529 246 l 2,7,8 + 542 233 542 233 542 217 c 128,-1,9 + 542 201 542 201 529.5 188 c 128,-1,10 + 517 175 517 175 500 175 c 2,11,-1 + 42 175 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph31 +Encoding: 31 57375 32 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 30 + 30 + 1 + 6 + 9 + 95 + 86 + 2 + 3 + 6 + 128 + 107 + 2 + 8 + 3 + 121 + 115 + 2 + 7 + 4 + 59 + 51 + 2 + 2 + 7 + 14 + 1 + 5 + 2 + 6 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 69 + 0 + 6 + 9 + 3 + 9 + 6 + 96 + 0 + 3 + 8 + 9 + 3 + 8 + 102 + 0 + 7 + 4 + 2 + 4 + 7 + 2 + 104 + 0 + 2 + 5 + 5 + 2 + 94 + 0 + 0 + 0 + 9 + 6 + 0 + 9 + 91 + 0 + 8 + 12 + 1 + 10 + 11 + 8 + 10 + 91 + 0 + 11 + 0 + 4 + 7 + 11 + 4 + 91 + 0 + 5 + 1 + 1 + 5 + 79 + 0 + 5 + 5 + 1 + 84 + 0 + 1 + 5 + 1 + 72 +ELSE +NPUSHB + 71 + 0 + 6 + 9 + 3 + 9 + 6 + 3 + 104 + 0 + 3 + 8 + 9 + 3 + 8 + 102 + 0 + 7 + 4 + 2 + 4 + 7 + 2 + 104 + 0 + 2 + 5 + 4 + 2 + 5 + 102 + 0 + 0 + 0 + 9 + 6 + 0 + 9 + 91 + 0 + 8 + 12 + 1 + 10 + 11 + 8 + 10 + 91 + 0 + 11 + 0 + 4 + 7 + 11 + 4 + 91 + 0 + 5 + 1 + 1 + 5 + 79 + 0 + 5 + 5 + 1 + 84 + 0 + 1 + 5 + 1 + 72 +EIF +NPUSHB + 21 + 105 + 104 + 119 + 117 + 104 + 130 + 105 + 130 + 99 + 97 + 47 + 38 + 20 + 36 + 46 + 38 + 28 + 46 + 34 + 13 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +229 675 m 0,0,1 + 229 726 229 726 266 763 c 128,-1,2 + 303 800 303 800 354 800 c 0,3,4 + 406 800 406 800 443 763 c 2,5,-1 + 636 570 l 1,6,7 + 661 561 661 561 681 541 c 0,8,9 + 792 430 792 430 792 280 c 0,10,11 + 792 116 792 116 676 0 c 0,12,13 + 622 -53 622 -53 558 -82 c 1,14,15 + 562 -97 562 -97 562 -117 c 0,16,17 + 562 -168 562 -168 525.5 -205 c 128,-1,18 + 489 -242 489 -242 438 -242 c 0,19,20 + 386 -242 386 -242 349 -205 c 2,21,-1 + 154 -10 l 1,22,23 + 130 -1 130 -1 111 18 c 0,24,25 + 0 129 0 129 0 279 c 0,26,27 + 0 443 0 443 116 559 c 0,28,29 + 170 613 170 613 234 641 c 1,30,31 + 229 659 229 659 229 675 c 0,0,1 +411 -32 m 1,32,33 + 530 -28 530 -28 617 59 c 0,34,35 + 708 150 708 150 708 280 c 0,36,37 + 708 396 708 396 622 482 c 0,38,39 + 610 494 610 494 593 494 c 0,40,41 + 575 494 575 494 563 482 c 128,-1,42 + 551 470 551 470 551 452.5 c 128,-1,43 + 551 435 551 435 563 423 c 0,44,45 + 597 389 597 389 611 356.5 c 128,-1,46 + 625 324 625 324 625 280 c 0,47,48 + 625 185 625 185 558 118 c 0,49,50 + 498 58 498 58 415 52 c 1,51,-1 + 467 104 l 2,52,53 + 479 116 479 116 479 133.5 c 128,-1,54 + 479 151 479 151 467 163 c 128,-1,55 + 455 175 455 175 438 175 c 0,56,57 + 420 175 420 175 408 163 c 2,58,-1 + 254 8 l 1,59,-1 + 408 -146 l 2,60,61 + 420 -158 420 -158 438 -158 c 0,62,63 + 455 -158 455 -158 467 -146 c 128,-1,64 + 479 -134 479 -134 479 -116.5 c 128,-1,65 + 479 -99 479 -99 467 -87 c 2,66,-1 + 411 -32 l 1,32,33 +379 591 m 1,67,68 + 260 585 260 585 175 500 c 0,69,70 + 83 408 83 408 83 279 c 0,71,72 + 83 163 83 163 169 77 c 0,73,74 + 181 65 181 65 199 65 c 0,75,76 + 216 65 216 65 228 77 c 128,-1,77 + 240 89 240 89 240 106.5 c 128,-1,78 + 240 124 240 124 228 136 c 0,79,80 + 194 170 194 170 180.5 202 c 128,-1,81 + 167 234 167 234 167 279 c 0,82,83 + 167 374 167 374 234 441 c 0,84,85 + 295 502 295 502 378 508 c 1,86,-1 + 325 454 l 2,87,88 + 313 442 313 442 313 425 c 128,-1,89 + 313 408 313 408 325 396 c 0,90,91 + 338 383 338 383 354 383 c 0,92,93 + 371 383 371 383 384 396 c 2,94,-1 + 538 550 l 1,95,-1 + 384 704 l 2,96,97 + 371 717 371 717 354 717 c 0,98,99 + 338 717 338 717 325 704 c 0,100,101 + 313 692 313 692 313 675 c 128,-1,102 + 313 658 313 658 325 646 c 2,103,-1 + 379 591 l 1,67,68 +354 342 m 0,104,105 + 321 342 321 342 297 364.5 c 128,-1,106 + 273 387 273 387 271 419 c 1,107,-1 + 263 412 l 1,108,109 + 208 357 208 357 208 279 c 0,110,111 + 208 243 208 243 219 218.5 c 128,-1,112 + 230 194 230 194 258 166 c 0,113,114 + 288 136 288 136 281 95 c 1,115,-1 + 379 192 l 2,116,117 + 404 217 404 217 438 217 c 0,118,119 + 471 217 471 217 495 194.5 c 128,-1,120 + 519 172 519 172 521 140 c 1,121,-1 + 528 148 l 1,122,123 + 583 203 583 203 583 280 c 0,124,125 + 583 316 583 316 572.5 341 c 128,-1,126 + 562 366 562 366 534 394 c 128,-1,127 + 506 422 506 422 511 464 c 1,128,-1 + 413 366 l 2,129,130 + 389 342 389 342 354 342 c 0,104,105 +EndSplineSet +EndChar + +StartChar: glyph32 +Encoding: 32 57376 33 +Width: 625 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 64 + 55 + 2 + 3 + 5 + 19 + 12 + 2 + 0 + 4 + 2 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 52 + 0 + 6 + 5 + 5 + 6 + 94 + 0 + 3 + 5 + 7 + 5 + 3 + 7 + 104 + 0 + 4 + 2 + 0 + 2 + 4 + 0 + 104 + 0 + 1 + 0 + 0 + 1 + 95 + 0 + 5 + 0 + 7 + 2 + 5 + 7 + 92 + 0 + 2 + 4 + 0 + 2 + 79 + 0 + 2 + 2 + 0 + 83 + 0 + 0 + 2 + 0 + 71 +ELSE +NPUSHB + 50 + 0 + 6 + 5 + 6 + 106 + 0 + 3 + 5 + 7 + 5 + 3 + 7 + 104 + 0 + 4 + 2 + 0 + 2 + 4 + 0 + 104 + 0 + 1 + 0 + 1 + 107 + 0 + 5 + 0 + 7 + 2 + 5 + 7 + 92 + 0 + 2 + 4 + 0 + 2 + 79 + 0 + 2 + 2 + 0 + 83 + 0 + 0 + 2 + 0 + 71 +EIF +NPUSHB + 10 + 36 + 20 + 22 + 41 + 30 + 20 + 36 + 19 + 8 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 280 m 0,0,1 + 625 151 625 151 533 59 c 0,2,3 + 446 -28 446 -28 328 -32 c 1,4,-1 + 384 -87 l 2,5,6 + 396 -99 396 -99 396 -116.5 c 128,-1,7 + 396 -134 396 -134 384 -146 c 128,-1,8 + 372 -158 372 -158 354 -158 c 0,9,10 + 337 -158 337 -158 325 -146 c 2,11,-1 + 170 8 l 1,12,-1 + 325 163 l 2,13,14 + 337 175 337 175 354.5 175 c 128,-1,15 + 372 175 372 175 384 163 c 128,-1,16 + 396 151 396 151 396 133.5 c 128,-1,17 + 396 116 396 116 384 104 c 2,18,-1 + 332 52 l 1,19,20 + 415 58 415 58 475 118 c 0,21,22 + 542 185 542 185 542 280 c 0,23,24 + 542 324 542 324 528 356.5 c 128,-1,25 + 514 389 514 389 480 423 c 0,26,27 + 468 435 468 435 468 452.5 c 128,-1,28 + 468 470 468 470 480 482 c 128,-1,29 + 492 494 492 494 509.5 494 c 128,-1,30 + 527 494 527 494 539 482 c 0,31,32 + 625 396 625 396 625 280 c 0,0,1 +83 279 m 0,33,34 + 83 235 83 235 97 202.5 c 128,-1,35 + 111 170 111 170 145 136 c 0,36,37 + 157 124 157 124 157 106.5 c 128,-1,38 + 157 89 157 89 145 77 c 128,-1,39 + 133 65 133 65 116 65 c 0,40,41 + 98 65 98 65 86 77 c 0,42,43 + 0 163 0 163 0 279 c 0,44,45 + 0 408 0 408 92 500 c 0,46,47 + 177 585 177 585 296 591 c 1,48,-1 + 241 646 l 2,49,50 + 229 658 229 658 229 675 c 128,-1,51 + 229 692 229 692 241 704 c 128,-1,52 + 253 716 253 716 270.5 716 c 128,-1,53 + 288 716 288 716 300 704 c 2,54,-1 + 455 550 l 1,55,-1 + 300 396 l 2,56,57 + 287 383 287 383 271 383 c 0,58,59 + 254 383 254 383 241 396 c 0,60,61 + 229 408 229 408 229 425 c 128,-1,62 + 229 442 229 442 241 454 c 2,63,-1 + 294 508 l 1,64,65 + 211 502 211 502 150 441 c 0,66,67 + 83 374 83 374 83 279 c 0,33,34 +EndSplineSet +EndChar + +StartChar: glyph33 +Encoding: 33 57377 34 +Width: 542 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 5 + 1 + 0 + 64 + 16 + 1 + 1 + 63 + 2 + 1 + 0 + 1 + 0 + 106 + 3 + 1 + 1 + 1 + 97 + 12 + 11 + 1 + 0 + 11 + 22 + 12 + 21 + 0 + 10 + 1 + 9 + 4 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +42 342 m 2,0,1 + 25 342 25 342 12.5 354 c 128,-1,2 + 0 366 0 366 0 383 c 128,-1,3 + 0 400 0 400 12 412 c 2,4,-1 + 271 675 l 1,5,-1 + 529 412 l 2,6,7 + 542 399 542 399 542 383 c 128,-1,8 + 542 367 542 367 529.5 354.5 c 128,-1,9 + 517 342 517 342 500 342 c 2,10,-1 + 42 342 l 2,0,1 +500 258 m 2,11,12 + 517 258 517 258 529.5 245.5 c 128,-1,13 + 542 233 542 233 542 217 c 128,-1,14 + 542 201 542 201 529 188 c 2,15,-1 + 271 -75 l 1,16,-1 + 12 188 l 2,17,18 + 0 200 0 200 0 217 c 0,19,20 + 0 233 0 233 12.5 245.5 c 128,-1,21 + 25 258 25 258 42 258 c 2,22,-1 + 500 258 l 2,11,12 +EndSplineSet +EndChar + +StartChar: glyph34 +Encoding: 34 57378 35 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 18 + 4 + 2 + 1 + 4 + 1 + 66 + 35 + 28 + 21 + 11 + 4 + 4 + 64 + 5 + 1 + 4 + 2 + 1 + 1 + 3 + 4 + 1 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 0 + 0 + 3 + 0 + 71 + 24 + 21 + 23 + 26 + 20 + 16 + 6 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 -75 m 128,-1,1 + 281 -75 281 -75 244.5 -38.5 c 128,-1,2 + 208 -2 208 -2 208 50 c 2,3,-1 + 208 248 l 1,4,5 + 172 216 172 216 121.5 217.5 c 128,-1,6 + 71 219 71 219 37 253 c 0,7,8 + 0 290 0 290 0 341.5 c 128,-1,9 + 0 393 0 393 37 430 c 2,10,-1 + 333 727 l 1,11,-1 + 630 430 l 2,12,13 + 667 393 667 393 667 341.5 c 128,-1,14 + 667 290 667 290 630 253 c 0,15,16 + 596 219 596 219 545 217.5 c 128,-1,17 + 494 216 494 216 458 248 c 1,18,-1 + 458 50 l 2,19,20 + 458 -2 458 -2 421.5 -38.5 c 128,-1,0 + 385 -75 385 -75 333 -75 c 128,-1,1 +292 449 m 1,21,-1 + 292 50 l 2,22,23 + 292 33 292 33 304 20.5 c 128,-1,24 + 316 8 316 8 333 8 c 128,-1,25 + 350 8 350 8 362.5 20.5 c 128,-1,26 + 375 33 375 33 375 50 c 2,27,-1 + 375 449 l 1,28,-1 + 512 312 l 2,29,30 + 524 300 524 300 541.5 300 c 128,-1,31 + 559 300 559 300 571 312 c 128,-1,32 + 583 324 583 324 583 341.5 c 128,-1,33 + 583 359 583 359 571 371 c 2,34,-1 + 333 609 l 1,35,-1 + 95 371 l 2,36,37 + 83 359 83 359 83 341.5 c 128,-1,38 + 83 324 83 324 95 312 c 128,-1,39 + 107 300 107 300 124.5 300 c 128,-1,40 + 142 300 142 300 154 312 c 2,41,-1 + 292 449 l 1,21,-1 +EndSplineSet +EndChar + +StartChar: glyph35 +Encoding: 35 57379 36 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 21 + 15 + 7 + 0 + 3 + 0 + 64 + 2 + 1 + 0 + 1 + 0 + 106 + 0 + 1 + 1 + 97 + 21 + 37 + 20 + 3 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 668 m 1,0,-1 + 559 401 l 2,1,2 + 584 376 584 376 584 342 c 128,-1,3 + 584 308 584 308 559 283 c 128,-1,4 + 534 258 534 258 500 258 c 128,-1,5 + 466 258 466 258 441 283 c 2,6,-1 + 375 349 l 1,7,-1 + 375 47 l 2,8,9 + 375 12 375 12 350.5 -12 c 128,-1,10 + 326 -36 326 -36 292 -36 c 0,11,12 + 257 -36 257 -36 232.5 -11.5 c 128,-1,13 + 208 13 208 13 208 47 c 2,14,-1 + 208 349 l 1,15,-1 + 142 283 l 2,16,17 + 117 258 117 258 83 258 c 128,-1,18 + 49 258 49 258 24 283 c 128,-1,19 + -1 308 -1 308 -1 342 c 128,-1,20 + -1 376 -1 376 24 401 c 2,21,-1 + 292 668 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph36 +Encoding: 36 57380 37 +Width: 417 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 21 + 14 + 7 + 0 + 3 + 0 + 64 + 2 + 1 + 0 + 1 + 0 + 106 + 0 + 1 + 1 + 97 + 21 + 21 + 20 + 3 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +208 567 m 1,0,-1 + 404 371 l 2,1,2 + 416 359 416 359 416 341.5 c 128,-1,3 + 416 324 416 324 404 312 c 128,-1,4 + 392 300 392 300 375 300 c 128,-1,5 + 358 300 358 300 346 312 c 2,6,-1 + 250 408 l 1,7,-1 + 250 92 l 2,8,9 + 250 75 250 75 237.5 62.5 c 128,-1,10 + 225 50 225 50 208 50 c 128,-1,11 + 191 50 191 50 179 62.5 c 128,-1,12 + 167 75 167 75 167 92 c 2,13,-1 + 167 408 l 1,14,-1 + 71 312 l 2,15,16 + 59 300 59 300 41.5 300 c 128,-1,17 + 24 300 24 300 12 312 c 128,-1,18 + 0 324 0 324 0 341.5 c 128,-1,19 + 0 359 0 359 12 371 c 2,20,-1 + 208 567 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph37 +Encoding: 37 57381 38 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 73 + 18 + 1 + 10 + 3 + 9 + 1 + 1 + 5 + 2 + 66 + 0 + 0 + 0 + 6 + 3 + 0 + 6 + 91 + 4 + 1 + 3 + 0 + 10 + 5 + 3 + 10 + 91 + 11 + 9 + 2 + 5 + 2 + 1 + 1 + 7 + 5 + 1 + 91 + 0 + 7 + 8 + 8 + 7 + 79 + 0 + 7 + 7 + 8 + 84 + 0 + 8 + 7 + 8 + 72 + 51 + 50 + 56 + 54 + 50 + 59 + 51 + 59 + 39 + 35 + 21 + 21 + 34 + 35 + 34 + 37 + 16 + 12 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 633 m 128,-1,1 + 471 633 471 633 569 535.5 c 128,-1,2 + 667 438 667 438 667 300 c 2,3,-1 + 667 279 l 2,4,5 + 667 227 667 227 630.5 190.5 c 128,-1,6 + 594 154 594 154 542 154 c 0,7,8 + 480 154 480 154 442 204 c 1,9,10 + 397 154 397 154 333 154 c 0,11,12 + 273 154 273 154 230.5 197 c 128,-1,13 + 188 240 188 240 188 300 c 128,-1,14 + 188 360 188 360 230.5 403 c 128,-1,15 + 273 446 273 446 333 446 c 0,16,17 + 380 446 380 446 419 417 c 1,18,19 + 429 446 429 446 458 446 c 0,20,21 + 475 446 475 446 487.5 433.5 c 128,-1,22 + 500 421 500 421 500 404 c 2,23,-1 + 500 279 l 2,24,25 + 500 262 500 262 512.5 250 c 128,-1,26 + 525 238 525 238 542 238 c 128,-1,27 + 559 238 559 238 571 250 c 128,-1,28 + 583 262 583 262 583 279 c 2,29,-1 + 583 300 l 2,30,31 + 583 404 583 404 509.5 477 c 128,-1,32 + 436 550 436 550 333 550 c 128,-1,33 + 230 550 230 550 156.5 477 c 128,-1,34 + 83 404 83 404 83 300 c 128,-1,35 + 83 196 83 196 156.5 123 c 128,-1,36 + 230 50 230 50 333 50 c 0,37,38 + 411 50 411 50 474 93 c 0,39,40 + 488 103 488 103 505 99.5 c 128,-1,41 + 522 96 522 96 532 82 c 128,-1,42 + 542 68 542 68 538.5 51 c 128,-1,43 + 535 34 535 34 521 24 c 0,44,45 + 438 -33 438 -33 333 -33 c 0,46,47 + 195 -33 195 -33 97.5 64.5 c 128,-1,48 + 0 162 0 162 0 300 c 128,-1,49 + 0 438 0 438 97.5 535.5 c 128,-1,0 + 195 633 195 633 333 633 c 128,-1,1 +333 238 m 0,50,51 + 359 238 359 238 377.5 256.5 c 128,-1,52 + 396 275 396 275 396 300 c 128,-1,53 + 396 325 396 325 377.5 343.5 c 128,-1,54 + 359 362 359 362 333 362 c 0,55,56 + 308 362 308 362 289.5 344 c 128,-1,57 + 271 326 271 326 271 300 c 128,-1,58 + 271 274 271 274 289.5 256 c 128,-1,59 + 308 238 308 238 333 238 c 0,50,51 +EndSplineSet +EndChar + +StartChar: glyph38 +Encoding: 38 57382 39 +Width: 794 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 51 + 25 + 2 + 0 + 1 + 23 + 1 + 5 + 0 + 2 + 66 + 0 + 1 + 4 + 0 + 4 + 1 + 0 + 104 + 0 + 0 + 5 + 4 + 0 + 5 + 102 + 8 + 1 + 6 + 0 + 4 + 1 + 6 + 4 + 91 + 0 + 5 + 0 + 2 + 3 + 5 + 2 + 91 + 0 + 3 + 7 + 7 + 3 + 79 + 0 + 3 + 3 + 7 + 83 + 0 + 7 + 3 + 7 + 71 + 54 + 53 + 61 + 60 + 53 + 67 + 54 + 67 + 38 + 37 + 27 + 24 + 38 + 16 + 9 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +311 282 m 128,-1,1 + 302 282 302 282 296.5 288.5 c 128,-1,2 + 291 295 291 295 291 302 c 0,3,4 + 291 311 291 311 297 317 c 2,5,-1 + 486 506 l 2,6,7 + 511 531 511 531 544 531 c 0,8,9 + 579 531 579 531 604 506 c 0,10,11 + 628 482 628 482 628 447 c 128,-1,12 + 628 412 628 412 604 388 c 0,13,14 + 555 339 555 339 456.5 241 c 128,-1,15 + 358 143 358 143 309 94 c 0,16,17 + 284 69 284 69 250 69 c 128,-1,18 + 216 69 216 69 191 94 c 0,19,20 + 167 118 167 118 167 153 c 128,-1,21 + 167 188 167 188 191 212 c 2,22,-1 + 195 216 l 1,23,24 + 166 254 166 254 166 304 c 1,25,-1 + 132 271 l 2,26,27 + 83 222 83 222 83 153 c 128,-1,28 + 83 84 83 84 132 35 c 128,-1,29 + 181 -14 181 -14 250 -14 c 128,-1,30 + 319 -14 319 -14 368 35 c 2,31,-1 + 662 330 l 2,32,33 + 711 379 711 379 711 447.5 c 128,-1,34 + 711 516 711 516 662 565 c 128,-1,35 + 613 614 613 614 544 614 c 0,36,37 + 476 614 476 614 427 565 c 2,38,-1 + 238 376 l 2,39,40 + 207 345 207 345 207 303 c 0,41,42 + 207 260 207 260 238 229 c 128,-1,43 + 269 198 269 198 311 198 c 0,44,45 + 354 198 354 198 385 229 c 2,46,-1 + 474 317 l 2,47,48 + 498 341 498 341 498 376 c 0,49,50 + 498 410 498 410 473 435 c 1,51,-1 + 326 288 l 2,52,0 + 320 282 320 282 311 282 c 128,-1,1 +544 697 m 0,53,54 + 648 697 648 697 721 624 c 128,-1,55 + 794 551 794 551 794 447 c 0,56,57 + 794 344 794 344 721 271 c 2,58,-1 + 427 -24 l 2,59,60 + 354 -97 354 -97 250 -97 c 128,-1,61 + 146 -97 146 -97 73 -24 c 128,-1,62 + 0 49 0 49 0 153 c 0,63,64 + 0 256 0 256 73 329 c 2,65,-1 + 368 624 l 2,66,67 + 441 697 441 697 544 697 c 0,53,54 +EndSplineSet +EndChar + +StartChar: glyph39 +Encoding: 39 57383 40 +Width: 628 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 62 + 43 + 19 + 2 + 5 + 4 + 21 + 1 + 0 + 5 + 2 + 66 + 0 + 1 + 0 + 4 + 5 + 1 + 4 + 91 + 0 + 5 + 6 + 1 + 0 + 3 + 5 + 0 + 91 + 0 + 3 + 2 + 2 + 3 + 79 + 0 + 3 + 3 + 2 + 83 + 0 + 2 + 3 + 2 + 71 + 1 + 0 + 41 + 40 + 35 + 34 + 26 + 25 + 15 + 13 + 8 + 7 + 0 + 49 + 1 + 49 + 7 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +228 157 m 0,0,1 + 186 157 186 157 155 187.5 c 128,-1,2 + 124 218 124 218 124 261 c 0,3,4 + 124 305 124 305 154 335 c 2,5,-1 + 343 524 l 2,6,7 + 392 573 392 573 461 573 c 128,-1,8 + 530 573 530 573 579 524 c 128,-1,9 + 628 475 628 475 628 406 c 128,-1,10 + 628 337 628 337 579 288 c 2,11,-1 + 284 -7 l 2,12,13 + 235 -56 235 -56 167 -56 c 0,14,15 + 98 -56 98 -56 49 -7 c 128,-1,16 + 0 42 0 42 0 111 c 128,-1,17 + 0 180 0 180 49 229 c 2,18,-1 + 82 262 l 1,19,20 + 82 213 82 213 112 174 c 1,21,-1 + 108 170 l 2,22,23 + 84 146 84 146 84 111 c 128,-1,24 + 84 76 84 76 108 52 c 128,-1,25 + 132 28 132 28 167 28 c 128,-1,26 + 202 28 202 28 226 52 c 0,27,28 + 275 101 275 101 373 199.5 c 128,-1,29 + 471 298 471 298 520 347 c 0,30,31 + 544 371 544 371 544 406 c 128,-1,32 + 544 441 544 441 520 465 c 0,33,34 + 495 489 495 489 460.5 489 c 128,-1,35 + 426 489 426 489 402 465 c 2,36,-1 + 213 276 l 2,37,38 + 207 270 207 270 207 261 c 128,-1,39 + 207 252 207 252 213 246 c 128,-1,40 + 219 240 219 240 228 240 c 128,-1,41 + 237 240 237 240 243 246 c 2,42,-1 + 390 393 l 1,43,44 + 415 368 415 368 415 334 c 0,45,46 + 415 301 415 301 390 276 c 2,47,-1 + 302 187 l 2,48,49 + 272 157 272 157 228 157 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph40 +Encoding: 40 57384 41 +Width: 874 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 62 + 63 + 57 + 50 + 43 + 22 + 5 + 4 + 3 + 1 + 66 + 5 + 1 + 4 + 3 + 2 + 3 + 4 + 2 + 104 + 0 + 1 + 0 + 3 + 4 + 1 + 3 + 91 + 0 + 2 + 0 + 0 + 2 + 79 + 0 + 2 + 2 + 0 + 83 + 6 + 1 + 0 + 2 + 0 + 71 + 2 + 0 + 54 + 52 + 48 + 46 + 38 + 35 + 30 + 27 + 16 + 13 + 0 + 21 + 2 + 21 + 7 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +749 -75 m 2,0,-1 + 332 -75 l 2,1,2 + 287 -75 287 -75 239.5 -51 c 128,-1,3 + 192 -27 192 -27 166 10 c 0,4,5 + 139 47 139 47 86.5 121 c 128,-1,6 + 34 195 34 195 8 232 c 0,7,8 + 0 243 0 243 0 258 c 128,-1,9 + 0 273 0 273 7 284 c 2,10,-1 + 166 506 l 2,11,12 + 192 543 192 543 239.5 567.5 c 128,-1,13 + 287 592 287 592 332 592 c 2,14,-1 + 749 592 l 2,15,16 + 801 592 801 592 837.5 555.5 c 128,-1,17 + 874 519 874 519 874 467 c 2,18,-1 + 874 50 l 2,19,20 + 874 -2 874 -2 837.5 -38.5 c 128,-1,21 + 801 -75 801 -75 749 -75 c 2,0,-1 +92 258 m 1,22,23 + 120 220 120 220 169.5 150 c 128,-1,24 + 219 80 219 80 234 59 c 0,25,26 + 248 39 248 39 278 23.5 c 128,-1,27 + 308 8 308 8 332 8 c 2,28,-1 + 749 8 l 2,29,30 + 766 8 766 8 778 20.5 c 128,-1,31 + 790 33 790 33 790 50 c 2,32,-1 + 790 467 l 2,33,34 + 790 484 790 484 778 496 c 128,-1,35 + 766 508 766 508 749 508 c 2,36,-1 + 332 508 l 2,37,38 + 308 508 308 508 278 493 c 128,-1,39 + 248 478 248 478 234 458 c 0,40,41 + 210 424 210 424 163 358 c 128,-1,42 + 116 292 116 292 92 258 c 1,22,23 +528 258 m 1,43,-1 + 639 148 l 2,44,45 + 649 138 649 138 643 125 c 128,-1,46 + 637 112 637 112 624 112 c 0,47,48 + 616 112 616 112 609 119 c 2,49,-1 + 499 229 l 1,50,-1 + 389 119 l 2,51,52 + 382 112 382 112 374 112 c 0,53,54 + 361 112 361 112 355 125 c 128,-1,55 + 349 138 349 138 359 148 c 2,56,-1 + 469 258 l 1,57,-1 + 359 369 l 2,58,59 + 350 378 350 378 354 389 c 128,-1,60 + 358 400 358 400 368.5 403 c 128,-1,61 + 379 406 379 406 389 398 c 2,62,-1 + 499 288 l 1,63,-1 + 609 398 l 2,64,65 + 623 412 623 412 637.5 397.5 c 128,-1,66 + 652 383 652 383 638 369 c 2,67,-1 + 528 258 l 1,43,-1 +EndSplineSet +EndChar + +StartChar: glyph41 +Encoding: 41 57385 42 +Width: 832 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 55 + 45 + 36 + 29 + 22 + 4 + 4 + 2 + 1 + 66 + 6 + 1 + 0 + 3 + 1 + 2 + 4 + 0 + 2 + 91 + 5 + 1 + 4 + 1 + 1 + 4 + 79 + 5 + 1 + 4 + 4 + 1 + 83 + 0 + 1 + 4 + 1 + 71 + 1 + 0 + 49 + 47 + 43 + 41 + 32 + 31 + 27 + 26 + 9 + 6 + 0 + 20 + 1 + 19 + 7 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +728 592 m 2,0,1 + 771 592 771 592 801.5 561.5 c 128,-1,2 + 832 531 832 531 832 488 c 2,3,-1 + 832 71 l 2,4,5 + 832 28 832 28 801.5 -2.5 c 128,-1,6 + 771 -33 771 -33 728 -33 c 2,7,-1 + 311 -33 l 2,8,9 + 271 -33 271 -33 228.5 -11 c 128,-1,10 + 186 11 186 11 163 43 c 2,11,-1 + 4 265 l 2,12,13 + -6 279 -6 279 4 293 c 0,14,15 + 31 330 31 330 83.5 404 c 128,-1,16 + 136 478 136 478 162 515 c 0,17,18 + 185 547 185 547 228 569.5 c 128,-1,19 + 271 592 271 592 311 592 c 2,20,-1 + 728 592 l 2,0,1 +632 184 m 2,21,-1 + 537 279 l 1,22,-1 + 632 375 l 2,23,24 + 644 387 644 387 644 404.5 c 128,-1,25 + 644 422 644 422 632 434 c 128,-1,26 + 620 446 620 446 602.5 446 c 128,-1,27 + 585 446 585 446 573 434 c 2,28,-1 + 478 338 l 1,29,-1 + 382 434 l 2,30,31 + 370 446 370 446 352.5 446 c 128,-1,32 + 335 446 335 446 323 434 c 128,-1,33 + 311 422 311 422 311 404.5 c 128,-1,34 + 311 387 311 387 323 375 c 2,35,-1 + 419 279 l 1,36,-1 + 323 184 l 2,37,38 + 311 172 311 172 311 154.5 c 128,-1,39 + 311 137 311 137 323 125 c 0,40,41 + 336 112 336 112 353 112 c 0,42,43 + 369 112 369 112 382 125 c 2,44,-1 + 478 220 l 1,45,-1 + 573 125 l 2,46,47 + 586 112 586 112 603 112 c 0,48,49 + 619 112 619 112 632 125 c 0,50,51 + 644 137 644 137 644 154.5 c 128,-1,52 + 644 172 644 172 632 184 c 2,21,-1 +EndSplineSet +EndChar + +StartChar: glyph42 +Encoding: 42 57386 43 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 55 + 9 + 8 + 7 + 6 + 5 + 4 + 6 + 1 + 0 + 1 + 66 + 0 + 5 + 0 + 6 + 0 + 5 + 6 + 91 + 2 + 1 + 0 + 3 + 1 + 1 + 7 + 0 + 1 + 91 + 0 + 7 + 4 + 4 + 7 + 79 + 0 + 7 + 7 + 4 + 83 + 0 + 4 + 7 + 4 + 71 + 53 + 53 + 53 + 50 + 21 + 23 + 17 + 16 + 8 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +125 383 m 1,0,-1 + 583 383 l 1,1,-1 + 583 133 l 1,2,-1 + 125 133 l 1,3,-1 + 125 383 l 1,0,-1 +368 179 m 1,4,-1 + 500 276 l 1,5,-1 + 392 258 l 1,6,-1 + 343 337 l 1,7,-1 + 208 240 l 1,8,-1 + 318 258 l 1,9,-1 + 368 179 l 1,4,-1 +708 383 m 1,10,11 + 743 383 743 383 767.5 358.5 c 128,-1,12 + 792 334 792 334 792 300 c 2,13,-1 + 792 217 l 2,14,15 + 792 182 792 182 767 157.5 c 128,-1,16 + 742 133 742 133 708 133 c 1,17,18 + 708 81 708 81 671.5 44.5 c 128,-1,19 + 635 8 635 8 583 8 c 2,20,-1 + 125 8 l 2,21,22 + 73 8 73 8 36.5 44.5 c 128,-1,23 + 0 81 0 81 0 133 c 2,24,-1 + 0 383 l 2,25,26 + 0 435 0 435 36.5 471.5 c 128,-1,27 + 73 508 73 508 125 508 c 2,28,-1 + 583 508 l 2,29,30 + 635 508 635 508 671.5 471.5 c 128,-1,31 + 708 435 708 435 708 383 c 1,10,11 +625 133 m 2,32,-1 + 625 383 l 2,33,34 + 625 400 625 400 612.5 412.5 c 128,-1,35 + 600 425 600 425 583 425 c 2,36,-1 + 125 425 l 2,37,38 + 108 425 108 425 95.5 412.5 c 128,-1,39 + 83 400 83 400 83 383 c 2,40,-1 + 83 133 l 2,41,42 + 83 116 83 116 95.5 104 c 128,-1,43 + 108 92 108 92 125 92 c 2,44,-1 + 583 92 l 2,45,46 + 600 92 600 92 612.5 104 c 128,-1,47 + 625 116 625 116 625 133 c 2,32,-1 +EndSplineSet +EndChar + +StartChar: glyph43 +Encoding: 43 57387 44 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 61 + 0 + 11 + 0 + 12 + 1 + 11 + 12 + 91 + 8 + 7 + 5 + 3 + 4 + 1 + 9 + 6 + 4 + 2 + 4 + 0 + 13 + 1 + 0 + 91 + 0 + 13 + 10 + 10 + 13 + 79 + 0 + 13 + 13 + 10 + 83 + 0 + 10 + 13 + 10 + 71 + 84 + 81 + 76 + 73 + 68 + 65 + 60 + 57 + 55 + 54 + 21 + 21 + 21 + 21 + 21 + 21 + 21 + 21 + 16 + 14 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 133 m 128,-1,1 + 275 133 275 133 262.5 145.5 c 128,-1,2 + 250 158 250 158 250 175 c 2,3,-1 + 250 342 l 2,4,5 + 250 359 250 359 262.5 371 c 128,-1,6 + 275 383 275 383 292 383 c 128,-1,7 + 309 383 309 383 321 371 c 128,-1,8 + 333 359 333 359 333 342 c 2,9,-1 + 333 175 l 2,10,11 + 333 158 333 158 321 145.5 c 128,-1,0 + 309 133 309 133 292 133 c 128,-1,1 +167 133 m 128,-1,13 + 150 133 150 133 137.5 145.5 c 128,-1,14 + 125 158 125 158 125 175 c 2,15,-1 + 125 342 l 2,16,17 + 125 359 125 359 137.5 371 c 128,-1,18 + 150 383 150 383 167 383 c 128,-1,19 + 184 383 184 383 196 371 c 128,-1,20 + 208 359 208 359 208 342 c 2,21,-1 + 208 175 l 2,22,23 + 208 158 208 158 196 145.5 c 128,-1,12 + 184 133 184 133 167 133 c 128,-1,13 +542 133 m 128,-1,25 + 525 133 525 133 512.5 145.5 c 128,-1,26 + 500 158 500 158 500 175 c 2,27,-1 + 500 342 l 2,28,29 + 500 359 500 359 512.5 371 c 128,-1,30 + 525 383 525 383 542 383 c 128,-1,31 + 559 383 559 383 571 371 c 128,-1,32 + 583 359 583 359 583 342 c 2,33,-1 + 583 175 l 2,34,35 + 583 158 583 158 571 145.5 c 128,-1,24 + 559 133 559 133 542 133 c 128,-1,25 +417 133 m 128,-1,37 + 400 133 400 133 387.5 145.5 c 128,-1,38 + 375 158 375 158 375 175 c 2,39,-1 + 375 342 l 2,40,41 + 375 359 375 359 387.5 371 c 128,-1,42 + 400 383 400 383 417 383 c 128,-1,43 + 434 383 434 383 446 371 c 128,-1,44 + 458 359 458 359 458 342 c 2,45,-1 + 458 175 l 2,46,47 + 458 158 458 158 446 145.5 c 128,-1,36 + 434 133 434 133 417 133 c 128,-1,37 +708 383 m 1,48,49 + 743 383 743 383 767.5 358.5 c 128,-1,50 + 792 334 792 334 792 300 c 2,51,-1 + 792 217 l 2,52,53 + 792 182 792 182 767 157.5 c 128,-1,54 + 742 133 742 133 708 133 c 1,55,56 + 708 81 708 81 671.5 44.5 c 128,-1,57 + 635 8 635 8 583 8 c 2,58,-1 + 125 8 l 2,59,60 + 73 8 73 8 36.5 44.5 c 128,-1,61 + 0 81 0 81 0 133 c 2,62,-1 + 0 383 l 2,63,64 + 0 435 0 435 36.5 471.5 c 128,-1,65 + 73 508 73 508 125 508 c 2,66,-1 + 583 508 l 2,67,68 + 635 508 635 508 671.5 471.5 c 128,-1,69 + 708 435 708 435 708 383 c 1,48,49 +625 133 m 2,70,-1 + 625 383 l 2,71,72 + 625 400 625 400 612.5 412.5 c 128,-1,73 + 600 425 600 425 583 425 c 2,74,-1 + 125 425 l 2,75,76 + 108 425 108 425 95.5 412.5 c 128,-1,77 + 83 400 83 400 83 383 c 2,78,-1 + 83 133 l 2,79,80 + 83 116 83 116 95.5 104 c 128,-1,81 + 108 92 108 92 125 92 c 2,82,-1 + 583 92 l 2,83,84 + 600 92 600 92 612.5 104 c 128,-1,85 + 625 116 625 116 625 133 c 2,70,-1 +EndSplineSet +EndChar + +StartChar: glyph44 +Encoding: 44 57388 45 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 55 + 0 + 9 + 0 + 10 + 1 + 9 + 10 + 91 + 6 + 5 + 3 + 3 + 1 + 7 + 4 + 2 + 3 + 0 + 11 + 1 + 0 + 91 + 0 + 11 + 8 + 8 + 11 + 79 + 0 + 11 + 11 + 8 + 83 + 0 + 8 + 11 + 8 + 71 + 72 + 69 + 64 + 61 + 56 + 53 + 50 + 21 + 21 + 21 + 21 + 21 + 21 + 21 + 16 + 12 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 133 m 128,-1,1 + 275 133 275 133 262.5 145.5 c 128,-1,2 + 250 158 250 158 250 175 c 2,3,-1 + 250 342 l 2,4,5 + 250 359 250 359 262.5 371 c 128,-1,6 + 275 383 275 383 292 383 c 128,-1,7 + 309 383 309 383 321 371 c 128,-1,8 + 333 359 333 359 333 342 c 2,9,-1 + 333 175 l 2,10,11 + 333 158 333 158 321 145.5 c 128,-1,0 + 309 133 309 133 292 133 c 128,-1,1 +167 133 m 128,-1,13 + 150 133 150 133 137.5 145.5 c 128,-1,14 + 125 158 125 158 125 175 c 2,15,-1 + 125 342 l 2,16,17 + 125 359 125 359 137.5 371 c 128,-1,18 + 150 383 150 383 167 383 c 128,-1,19 + 184 383 184 383 196 371 c 128,-1,20 + 208 359 208 359 208 342 c 2,21,-1 + 208 175 l 2,22,23 + 208 158 208 158 196 145.5 c 128,-1,12 + 184 133 184 133 167 133 c 128,-1,13 +417 133 m 128,-1,25 + 400 133 400 133 387.5 145.5 c 128,-1,26 + 375 158 375 158 375 175 c 2,27,-1 + 375 342 l 2,28,29 + 375 359 375 359 387.5 371 c 128,-1,30 + 400 383 400 383 417 383 c 128,-1,31 + 434 383 434 383 446 371 c 128,-1,32 + 458 359 458 359 458 342 c 2,33,-1 + 458 175 l 2,34,35 + 458 158 458 158 446 145.5 c 128,-1,24 + 434 133 434 133 417 133 c 128,-1,25 +708 383 m 1,36,37 + 743 383 743 383 767.5 358.5 c 128,-1,38 + 792 334 792 334 792 300 c 2,39,-1 + 792 217 l 2,40,41 + 792 182 792 182 767 157.5 c 128,-1,42 + 742 133 742 133 708 133 c 1,43,44 + 708 81 708 81 671.5 44.5 c 128,-1,45 + 635 8 635 8 583 8 c 2,46,-1 + 125 8 l 2,47,48 + 73 8 73 8 36.5 44.5 c 128,-1,49 + 0 81 0 81 0 133 c 2,50,-1 + 0 383 l 2,51,52 + 0 435 0 435 36.5 471.5 c 128,-1,53 + 73 508 73 508 125 508 c 2,54,-1 + 583 508 l 2,55,56 + 635 508 635 508 671.5 471.5 c 128,-1,57 + 708 435 708 435 708 383 c 1,36,37 +625 133 m 2,58,-1 + 625 383 l 2,59,60 + 625 400 625 400 612.5 412.5 c 128,-1,61 + 600 425 600 425 583 425 c 2,62,-1 + 125 425 l 2,63,64 + 108 425 108 425 95.5 412.5 c 128,-1,65 + 83 400 83 400 83 383 c 2,66,-1 + 83 133 l 2,67,68 + 83 116 83 116 95.5 104 c 128,-1,69 + 108 92 108 92 125 92 c 2,70,-1 + 583 92 l 2,71,72 + 600 92 600 92 612.5 104 c 128,-1,73 + 625 116 625 116 625 133 c 2,58,-1 +EndSplineSet +EndChar + +StartChar: glyph45 +Encoding: 45 57389 46 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 44 + 0 + 5 + 0 + 6 + 1 + 5 + 6 + 91 + 2 + 1 + 1 + 3 + 1 + 0 + 7 + 1 + 0 + 91 + 0 + 7 + 4 + 4 + 7 + 79 + 0 + 7 + 7 + 4 + 83 + 0 + 4 + 7 + 4 + 71 + 53 + 53 + 53 + 50 + 21 + 21 + 21 + 16 + 8 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +167 133 m 128,-1,1 + 150 133 150 133 137.5 145.5 c 128,-1,2 + 125 158 125 158 125 175 c 2,3,-1 + 125 342 l 2,4,5 + 125 359 125 359 137.5 371 c 128,-1,6 + 150 383 150 383 167 383 c 128,-1,7 + 184 383 184 383 196 371 c 128,-1,8 + 208 359 208 359 208 342 c 2,9,-1 + 208 175 l 2,10,11 + 208 158 208 158 196 145.5 c 128,-1,0 + 184 133 184 133 167 133 c 128,-1,1 +708 383 m 1,12,13 + 743 383 743 383 767.5 358.5 c 128,-1,14 + 792 334 792 334 792 300 c 2,15,-1 + 792 217 l 2,16,17 + 792 182 792 182 767 157.5 c 128,-1,18 + 742 133 742 133 708 133 c 1,19,20 + 708 81 708 81 671.5 44.5 c 128,-1,21 + 635 8 635 8 583 8 c 2,22,-1 + 125 8 l 2,23,24 + 73 8 73 8 36.5 44.5 c 128,-1,25 + 0 81 0 81 0 133 c 2,26,-1 + 0 383 l 2,27,28 + 0 435 0 435 36.5 471.5 c 128,-1,29 + 73 508 73 508 125 508 c 2,30,-1 + 583 508 l 2,31,32 + 635 508 635 508 671.5 471.5 c 128,-1,33 + 708 435 708 435 708 383 c 1,12,13 +625 133 m 2,34,-1 + 625 383 l 2,35,36 + 625 400 625 400 612.5 412.5 c 128,-1,37 + 600 425 600 425 583 425 c 2,38,-1 + 125 425 l 2,39,40 + 108 425 108 425 95.5 412.5 c 128,-1,41 + 83 400 83 400 83 383 c 2,42,-1 + 83 133 l 2,43,44 + 83 116 83 116 95.5 104 c 128,-1,45 + 108 92 108 92 125 92 c 2,46,-1 + 583 92 l 2,47,48 + 600 92 600 92 612.5 104 c 128,-1,49 + 625 116 625 116 625 133 c 2,34,-1 +EndSplineSet +EndChar + +StartChar: glyph46 +Encoding: 46 57390 47 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 49 + 0 + 7 + 0 + 8 + 1 + 7 + 8 + 91 + 4 + 3 + 2 + 1 + 5 + 2 + 2 + 0 + 9 + 1 + 0 + 91 + 0 + 9 + 6 + 6 + 9 + 79 + 0 + 9 + 9 + 6 + 83 + 0 + 6 + 9 + 6 + 71 + 60 + 57 + 53 + 53 + 50 + 21 + 21 + 21 + 21 + 21 + 16 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 133 m 128,-1,1 + 275 133 275 133 262.5 145.5 c 128,-1,2 + 250 158 250 158 250 175 c 2,3,-1 + 250 342 l 2,4,5 + 250 359 250 359 262.5 371 c 128,-1,6 + 275 383 275 383 292 383 c 128,-1,7 + 309 383 309 383 321 371 c 128,-1,8 + 333 359 333 359 333 342 c 2,9,-1 + 333 175 l 2,10,11 + 333 158 333 158 321 145.5 c 128,-1,0 + 309 133 309 133 292 133 c 128,-1,1 +167 133 m 128,-1,13 + 150 133 150 133 137.5 145.5 c 128,-1,14 + 125 158 125 158 125 175 c 2,15,-1 + 125 342 l 2,16,17 + 125 359 125 359 137.5 371 c 128,-1,18 + 150 383 150 383 167 383 c 128,-1,19 + 184 383 184 383 196 371 c 128,-1,20 + 208 359 208 359 208 342 c 2,21,-1 + 208 175 l 2,22,23 + 208 158 208 158 196 145.5 c 128,-1,12 + 184 133 184 133 167 133 c 128,-1,13 +708 383 m 1,24,25 + 743 383 743 383 767.5 358.5 c 128,-1,26 + 792 334 792 334 792 300 c 2,27,-1 + 792 217 l 2,28,29 + 792 182 792 182 767 157.5 c 128,-1,30 + 742 133 742 133 708 133 c 1,31,32 + 708 81 708 81 671.5 44.5 c 128,-1,33 + 635 8 635 8 583 8 c 2,34,-1 + 125 8 l 2,35,36 + 73 8 73 8 36.5 44.5 c 128,-1,37 + 0 81 0 81 0 133 c 2,38,-1 + 0 383 l 2,39,40 + 0 435 0 435 36.5 471.5 c 128,-1,41 + 73 508 73 508 125 508 c 2,42,-1 + 583 508 l 2,43,44 + 635 508 635 508 671.5 471.5 c 128,-1,45 + 708 435 708 435 708 383 c 1,24,25 +625 133 m 2,46,-1 + 625 383 l 2,47,48 + 625 400 625 400 612.5 412.5 c 128,-1,49 + 600 425 600 425 583 425 c 2,50,-1 + 125 425 l 2,51,52 + 108 425 108 425 95.5 412.5 c 128,-1,53 + 83 400 83 400 83 383 c 2,54,-1 + 83 133 l 2,55,56 + 83 116 83 116 95.5 104 c 128,-1,57 + 108 92 108 92 125 92 c 2,58,-1 + 583 92 l 2,59,60 + 600 92 600 92 612.5 104 c 128,-1,61 + 625 116 625 116 625 133 c 2,46,-1 +EndSplineSet +EndChar + +StartChar: glyph47 +Encoding: 47 57391 48 +Width: 629 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 52 + 0 + 2 + 4 + 3 + 2 + 1 + 5 + 2 + 1 + 91 + 0 + 5 + 0 + 7 + 6 + 5 + 7 + 91 + 8 + 1 + 6 + 0 + 0 + 6 + 79 + 8 + 1 + 6 + 6 + 0 + 83 + 0 + 0 + 6 + 0 + 71 + 33 + 32 + 39 + 36 + 32 + 43 + 33 + 42 + 20 + 17 + 35 + 51 + 37 + 50 + 9 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 100 m 2,0,1 + 640 46 640 46 608 6.5 c 128,-1,2 + 576 -33 576 -33 523 -33 c 2,3,-1 + 106 -33 l 2,4,5 + 53 -33 53 -33 21 6.5 c 128,-1,6 + -11 46 -11 46 4 100 c 2,7,-1 + 107 480 l 2,8,9 + 109 488 109 488 112 508 c 1,10,-1 + 64 508 l 2,11,12 + 47 508 47 508 35 520.5 c 128,-1,13 + 23 533 23 533 23 550 c 128,-1,14 + 23 567 23 567 35 579.5 c 128,-1,15 + 47 592 47 592 64 592 c 2,16,-1 + 564 592 l 2,17,18 + 581 592 581 592 593.5 579.5 c 128,-1,19 + 606 567 606 567 606 550 c 128,-1,20 + 606 533 606 533 593.5 520.5 c 128,-1,21 + 581 508 581 508 564 508 c 2,22,-1 + 515 508 l 1,23,-1 + 625 100 l 2,0,1 +428 508 m 1,24,-1 + 195 508 l 1,25,26 + 194 480 194 480 187 459 c 2,27,-1 + 144 299 l 1,28,-1 + 148 300 l 1,29,-1 + 481 300 l 1,30,-1 + 485 299 l 1,31,-1 + 428 508 l 1,24,-1 +523 50 m 2,32,33 + 551 50 551 50 544 78 c 2,34,-1 + 494 263 l 1,35,36 + 487 258 487 258 481 258 c 2,37,-1 + 148 258 l 2,38,39 + 141 258 141 258 134 263 c 1,40,-1 + 85 78 l 2,41,42 + 78 50 78 50 106 50 c 2,43,-1 + 523 50 l 2,32,33 +EndSplineSet +EndChar + +StartChar: glyph48 +Encoding: 48 57392 49 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 122 + 68 + 1 + 13 + 6 + 84 + 1 + 15 + 10 + 2 + 66 + 0 + 9 + 20 + 1 + 12 + 6 + 9 + 12 + 89 + 0 + 13 + 14 + 6 + 13 + 77 + 11 + 19 + 2 + 6 + 17 + 1 + 14 + 10 + 6 + 14 + 91 + 0 + 10 + 0 + 15 + 1 + 10 + 15 + 91 + 5 + 3 + 2 + 1 + 4 + 2 + 2 + 0 + 7 + 1 + 0 + 91 + 0 + 18 + 0 + 7 + 16 + 18 + 7 + 91 + 0 + 16 + 8 + 8 + 16 + 79 + 0 + 16 + 16 + 8 + 83 + 0 + 8 + 16 + 8 + 71 + 61 + 61 + 37 + 36 + 100 + 98 + 97 + 95 + 90 + 87 + 83 + 81 + 80 + 79 + 78 + 77 + 61 + 75 + 61 + 75 + 74 + 73 + 66 + 64 + 57 + 54 + 49 + 46 + 44 + 42 + 36 + 60 + 37 + 60 + 21 + 21 + 21 + 21 + 21 + 18 + 21 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +208 112 m 2,0,1 + 208 104 208 104 202 98 c 128,-1,2 + 196 92 196 92 188 92 c 128,-1,3 + 180 92 180 92 173.5 98 c 128,-1,4 + 167 104 167 104 167 112 c 2,5,-1 + 167 362 l 2,6,7 + 167 370 167 370 173.5 376.5 c 128,-1,8 + 180 383 180 383 188 383 c 128,-1,9 + 196 383 196 383 202 376.5 c 128,-1,10 + 208 370 208 370 208 362 c 2,11,-1 + 208 112 l 2,0,1 +292 112 m 2,12,13 + 292 104 292 104 285.5 98 c 128,-1,14 + 279 92 279 92 271 92 c 128,-1,15 + 263 92 263 92 256.5 98 c 128,-1,16 + 250 104 250 104 250 112 c 2,17,-1 + 250 362 l 2,18,19 + 250 370 250 370 256.5 376.5 c 128,-1,20 + 263 383 263 383 271 383 c 128,-1,21 + 279 383 279 383 285.5 376.5 c 128,-1,22 + 292 370 292 370 292 362 c 2,23,-1 + 292 112 l 2,12,13 +375 112 m 2,24,25 + 375 104 375 104 368.5 98 c 128,-1,26 + 362 92 362 92 354 92 c 128,-1,27 + 346 92 346 92 339.5 98 c 128,-1,28 + 333 104 333 104 333 112 c 2,29,-1 + 333 362 l 2,30,31 + 333 370 333 370 339.5 376.5 c 128,-1,32 + 346 383 346 383 354 383 c 128,-1,33 + 362 383 362 383 368.5 376.5 c 128,-1,34 + 375 370 375 370 375 362 c 2,35,-1 + 375 112 l 2,24,25 +562 550 m 2,36,37 + 622 550 622 550 665 507 c 128,-1,38 + 708 464 708 464 708 404 c 2,39,-1 + 708 196 l 2,40,41 + 708 136 708 136 665 93 c 128,-1,42 + 622 50 622 50 562 50 c 2,43,-1 + 542 50 l 1,44,45 + 542 -2 542 -2 505.5 -38.5 c 128,-1,46 + 469 -75 469 -75 417 -75 c 2,47,-1 + 125 -75 l 2,48,49 + 73 -75 73 -75 36.5 -38.5 c 128,-1,50 + 0 -2 0 -2 0 50 c 2,51,-1 + 0 592 l 2,52,53 + 0 626 0 626 24 650.5 c 128,-1,54 + 48 675 48 675 83 675 c 2,55,-1 + 458 675 l 2,56,57 + 493 675 493 675 517.5 650.5 c 128,-1,58 + 542 626 542 626 542 592 c 2,59,-1 + 542 550 l 1,60,-1 + 562 550 l 2,36,37 +83 592 m 1,61,-1 + 83 529 l 2,62,63 + 83 504 83 504 101.5 485.5 c 128,-1,64 + 120 467 120 467 146 467 c 0,65,66 + 182 467 182 467 200 499 c 2,67,-1 + 207 512 l 1,68,-1 + 222 509 l 2,69,70 + 236 507 236 507 249.5 514.5 c 128,-1,71 + 263 522 263 522 268 536 c 2,72,-1 + 273 550 l 1,73,-1 + 458 550 l 1,74,-1 + 458 592 l 1,75,-1 + 83 592 l 1,61,-1 +458 50 m 2,76,-1 + 458 508 l 1,77,-1 + 301 508 l 1,78,79 + 276 467 276 467 229 467 c 1,80,81 + 197 425 197 425 146 425 c 0,82,83 + 110 425 110 425 83 446 c 1,84,-1 + 83 50 l 2,85,86 + 83 33 83 33 95.5 20.5 c 128,-1,87 + 108 8 108 8 125 8 c 2,88,-1 + 417 8 l 2,89,90 + 434 8 434 8 446 20.5 c 128,-1,91 + 458 33 458 33 458 50 c 2,76,-1 +625 196 m 2,92,-1 + 625 404 l 2,93,94 + 625 430 625 430 606.5 448.5 c 128,-1,95 + 588 467 588 467 562 467 c 2,96,-1 + 500 467 l 1,97,-1 + 500 133 l 1,98,-1 + 562 133 l 2,99,100 + 588 133 588 133 606.5 151.5 c 128,-1,101 + 625 170 625 170 625 196 c 2,92,-1 +EndSplineSet +EndChar + +StartChar: glyph49 +Encoding: 49 57393 50 +Width: 666 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 28 + 23 + 2 + 4 + 3 + 1 + 66 + 0 + 3 + 10 + 1 + 4 + 5 + 3 + 4 + 91 + 0 + 5 + 0 + 9 + 8 + 5 + 9 + 89 + 0 + 8 + 7 + 2 + 2 + 0 + 6 + 8 + 0 + 91 + 11 + 1 + 6 + 1 + 1 + 6 + 79 + 11 + 1 + 6 + 6 + 1 + 83 + 0 + 1 + 6 + 1 + 71 + 50 + 49 + 39 + 38 + 58 + 57 + 55 + 54 + 52 + 51 + 49 + 53 + 50 + 53 + 44 + 43 + 38 + 48 + 39 + 48 + 30 + 34 + 18 + 34 + 12 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +655 79 m 0,0,1 + 674 58 674 58 662.5 33 c 128,-1,2 + 651 8 651 8 625 8 c 2,3,-1 + 494 8 l 1,4,5 + 480 -47 480 -47 435 -82 c 128,-1,6 + 390 -117 390 -117 333 -117 c 128,-1,7 + 276 -117 276 -117 231.5 -82 c 128,-1,8 + 187 -47 187 -47 173 8 c 1,9,-1 + 42 8 l 2,10,11 + 16 8 16 8 4 34 c 128,-1,12 + -8 60 -8 60 12 80 c 0,13,14 + 15 83 15 83 20 89.5 c 128,-1,15 + 25 96 25 96 37 119 c 128,-1,16 + 49 142 49 142 58.5 169.5 c 128,-1,17 + 68 197 68 197 76 243.5 c 128,-1,18 + 84 290 84 290 84 342 c 0,19,20 + 84 423 84 423 130.5 487.5 c 128,-1,21 + 177 552 177 552 251 578 c 1,22,-1 + 250 592 l 2,23,24 + 250 626 250 626 274 650.5 c 128,-1,25 + 298 675 298 675 333 675 c 128,-1,26 + 368 675 368 675 392.5 650.5 c 128,-1,27 + 417 626 417 626 417 592 c 1,28,-1 + 415 578 l 1,29,30 + 489 552 489 552 536 487.5 c 128,-1,31 + 583 423 583 423 583 342 c 0,32,33 + 583 290 583 290 591 243.5 c 128,-1,34 + 599 197 599 197 608.5 169 c 128,-1,35 + 618 141 618 141 630 118.5 c 128,-1,36 + 642 96 642 96 647 89 c 128,-1,37 + 652 82 652 82 655 79 c 0,0,1 +333 508 m 0,38,39 + 264 508 264 508 215.5 459.5 c 128,-1,40 + 167 411 167 411 167 342 c 0,41,42 + 167 293 167 293 163 258 c 1,43,-1 + 504 258 l 1,44,45 + 499 301 499 301 499 342 c 0,46,47 + 499 411 499 411 450 459.5 c 128,-1,48 + 401 508 401 508 333 508 c 0,38,39 +333 -33 m 0,49,50 + 382 -33 382 -33 405 8 c 1,51,-1 + 262 8 l 1,52,53 + 285 -33 285 -33 333 -33 c 0,49,50 +117 92 m 1,54,-1 + 550 92 l 1,55,56 + 525 144 525 144 511 217 c 1,57,-1 + 156 217 l 1,58,59 + 142 144 142 144 117 92 c 1,54,-1 +EndSplineSet +EndChar + +StartChar: glyph50 +Encoding: 50 57394 51 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 76 + 10 + 1 + 0 + 0 + 7 + 8 + 0 + 7 + 91 + 0 + 8 + 5 + 1 + 4 + 9 + 8 + 4 + 91 + 0 + 9 + 0 + 1 + 3 + 9 + 1 + 91 + 6 + 11 + 2 + 3 + 2 + 2 + 3 + 79 + 6 + 11 + 2 + 3 + 3 + 2 + 83 + 0 + 2 + 3 + 2 + 71 + 23 + 22 + 1 + 0 + 52 + 50 + 47 + 45 + 44 + 42 + 37 + 35 + 34 + 32 + 25 + 24 + 22 + 28 + 23 + 28 + 13 + 10 + 8 + 6 + 0 + 21 + 1 + 20 + 12 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 675 m 2,0,1 + 677 675 677 675 713.5 638.5 c 128,-1,2 + 750 602 750 602 750 550 c 2,3,-1 + 750 133 l 2,4,5 + 750 81 750 81 720 44.5 c 128,-1,6 + 690 8 690 8 646 8 c 2,7,-1 + 618 8 l 1,8,9 + 605 -28 605 -28 572.5 -51.5 c 128,-1,10 + 540 -75 540 -75 500 -75 c 2,11,-1 + 125 -75 l 2,12,13 + 73 -75 73 -75 36.5 -38.5 c 128,-1,14 + 0 -2 0 -2 0 50 c 2,15,-1 + 0 508 l 2,16,17 + 0 524 0 524 12 538 c 2,18,-1 + 137 663 l 2,19,20 + 149 675 149 675 167 675 c 2,21,-1 + 625 675 l 2,0,1 +125 8 m 2,22,-1 + 167 8 l 1,23,-1 + 167 467 l 1,24,-1 + 83 467 l 1,25,-1 + 83 50 l 2,26,27 + 83 33 83 33 95.5 20.5 c 128,-1,28 + 108 8 108 8 125 8 c 2,22,-1 +542 50 m 2,29,-1 + 542 425 l 2,30,31 + 542 442 542 442 529.5 454.5 c 128,-1,32 + 517 467 517 467 500 467 c 2,33,-1 + 208 467 l 1,34,-1 + 208 8 l 1,35,-1 + 500 8 l 2,36,37 + 517 8 517 8 529.5 20.5 c 128,-1,38 + 542 33 542 33 542 50 c 2,29,-1 +667 133 m 2,39,-1 + 667 550 l 2,40,41 + 667 567 667 567 654.5 579.5 c 128,-1,42 + 642 592 642 592 625 592 c 2,43,-1 + 184 592 l 1,44,-1 + 142 550 l 1,45,-1 + 500 550 l 2,46,47 + 552 550 552 550 588.5 513.5 c 128,-1,48 + 625 477 625 477 625 425 c 2,49,-1 + 625 92 l 1,50,-1 + 646 92 l 2,51,52 + 652 92 652 92 659.5 103.5 c 128,-1,53 + 667 115 667 115 667 133 c 2,39,-1 +EndSplineSet +EndChar + +StartChar: glyph51 +Encoding: 51 57395 52 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 80 + 45 + 40 + 33 + 28 + 4 + 2 + 7 + 46 + 39 + 2 + 1 + 2 + 2 + 66 + 3 + 1 + 1 + 2 + 1 + 107 + 8 + 1 + 0 + 9 + 1 + 4 + 5 + 0 + 4 + 91 + 0 + 5 + 0 + 6 + 7 + 5 + 6 + 91 + 0 + 7 + 2 + 2 + 7 + 79 + 0 + 7 + 7 + 2 + 83 + 0 + 2 + 7 + 2 + 71 + 25 + 24 + 1 + 0 + 50 + 48 + 43 + 42 + 31 + 30 + 24 + 37 + 25 + 36 + 16 + 15 + 12 + 11 + 8 + 6 + 0 + 23 + 1 + 22 + 10 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +458 717 m 2,0,1 + 510 717 510 717 546.5 680.5 c 128,-1,2 + 583 644 583 644 583 592 c 2,3,-1 + 583 8 l 2,4,5 + 583 -33 583 -33 563.5 -54.5 c 128,-1,6 + 544 -76 544 -76 517 -76 c 0,7,8 + 483 -76 483 -76 453 -46 c 2,9,-1 + 321 87 l 2,10,11 + 309 99 309 99 291.5 99 c 128,-1,12 + 274 99 274 99 262 87 c 2,13,-1 + 130 -46 l 2,14,15 + 98 -77 98 -77 64.5 -76 c 128,-1,16 + 31 -75 31 -75 13 -45 c 0,17,18 + 0 -22 0 -22 0 8 c 2,19,-1 + 0 592 l 2,20,21 + 0 644 0 644 36.5 680.5 c 128,-1,22 + 73 717 73 717 125 717 c 2,23,-1 + 458 717 l 2,0,1 +125 633 m 2,24,25 + 108 633 108 633 95.5 621 c 128,-1,26 + 83 609 83 609 83 592 c 2,27,-1 + 83 179 l 1,28,-1 + 185 273 l 2,29,30 + 229 314 229 314 291.5 314 c 128,-1,31 + 354 314 354 314 398 273 c 2,32,-1 + 500 179 l 1,33,-1 + 500 592 l 2,34,35 + 500 609 500 609 487.5 621 c 128,-1,36 + 475 633 475 633 458 633 c 2,37,-1 + 125 633 l 2,24,25 +380 146 m 2,38,-1 + 500 26 l 1,39,-1 + 500 122 l 1,40,-1 + 370 242 l 2,41,42 + 338 271 338 271 292 271 c 128,-1,43 + 246 271 246 271 214 242 c 2,44,-1 + 83 122 l 1,45,-1 + 83 26 l 1,46,-1 + 203 146 l 2,47,48 + 239 182 239 182 292 182 c 0,49,50 + 344 182 344 182 380 146 c 2,38,-1 +EndSplineSet +EndChar + +StartChar: glyph52 +Encoding: 52 57396 53 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 82 + 0 + 3 + 12 + 1 + 4 + 0 + 3 + 4 + 91 + 5 + 2 + 2 + 0 + 0 + 9 + 10 + 0 + 9 + 91 + 13 + 1 + 10 + 0 + 11 + 8 + 10 + 11 + 91 + 0 + 8 + 0 + 6 + 7 + 8 + 6 + 89 + 0 + 7 + 1 + 1 + 7 + 79 + 0 + 7 + 7 + 1 + 83 + 0 + 1 + 7 + 1 + 71 + 51 + 50 + 23 + 22 + 57 + 54 + 50 + 61 + 51 + 60 + 47 + 44 + 41 + 40 + 38 + 35 + 32 + 31 + 26 + 25 + 22 + 29 + 23 + 28 + 50 + 21 + 53 + 16 + 14 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 508 m 1,0,1 + 677 508 677 508 713.5 471.5 c 128,-1,2 + 750 435 750 435 750 383 c 2,3,-1 + 750 92 l 2,4,5 + 750 40 750 40 713.5 3.5 c 128,-1,6 + 677 -33 677 -33 625 -33 c 2,7,-1 + 125 -33 l 2,8,9 + 73 -33 73 -33 36.5 3.5 c 128,-1,10 + 0 40 0 40 0 92 c 2,11,-1 + 0 383 l 2,12,13 + 0 435 0 435 36.5 471.5 c 128,-1,14 + 73 508 73 508 125 508 c 1,15,16 + 125 560 125 560 161.5 596.5 c 128,-1,17 + 198 633 198 633 250 633 c 2,18,-1 + 500 633 l 2,19,20 + 552 633 552 633 588.5 596.5 c 128,-1,21 + 625 560 625 560 625 508 c 1,0,1 +250 550 m 2,22,23 + 233 550 233 550 220.5 537.5 c 128,-1,24 + 208 525 208 525 208 508 c 1,25,-1 + 542 508 l 1,26,27 + 542 525 542 525 529.5 537.5 c 128,-1,28 + 517 550 517 550 500 550 c 2,29,-1 + 250 550 l 2,22,23 +667 92 m 2,30,-1 + 667 133 l 1,31,-1 + 83 133 l 1,32,-1 + 83 92 l 2,33,34 + 83 75 83 75 95.5 62.5 c 128,-1,35 + 108 50 108 50 125 50 c 2,36,-1 + 625 50 l 2,37,38 + 642 50 642 50 654.5 62.5 c 128,-1,39 + 667 75 667 75 667 92 c 2,30,-1 +83 175 m 1,40,-1 + 667 175 l 1,41,-1 + 667 383 l 2,42,43 + 667 400 667 400 654.5 412.5 c 128,-1,44 + 642 425 642 425 625 425 c 2,45,-1 + 125 425 l 2,46,47 + 108 425 108 425 95.5 412.5 c 128,-1,48 + 83 400 83 400 83 383 c 2,49,-1 + 83 175 l 1,40,-1 +417 300 m 2,50,51 + 434 300 434 300 446 287.5 c 128,-1,52 + 458 275 458 275 458 258 c 128,-1,53 + 458 241 458 241 446 229 c 128,-1,54 + 434 217 434 217 417 217 c 2,55,-1 + 333 217 l 2,56,57 + 316 217 316 217 304 229 c 128,-1,58 + 292 241 292 241 292 258 c 128,-1,59 + 292 275 292 275 304 287.5 c 128,-1,60 + 316 300 316 300 333 300 c 2,61,-1 + 417 300 l 2,50,51 +EndSplineSet +EndChar + +StartChar: glyph53 +Encoding: 53 57397 54 +Width: 752 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 47 + 45 + 43 + 41 + 40 + 38 + 36 + 34 + 29 + 28 + 9 + 2 + 1 + 1 + 66 + 0 + 1 + 2 + 1 + 106 + 3 + 1 + 2 + 0 + 0 + 2 + 79 + 3 + 1 + 2 + 2 + 0 + 83 + 0 + 0 + 2 + 0 + 71 + 26 + 25 + 25 + 33 + 26 + 33 + 44 + 40 + 4 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +727 641 m 0,0,1 + 766 602 766 602 746 551 c 0,2,3 + 638 280 638 280 356 113 c 0,4,5 + 343 105 343 105 333 103 c 1,6,7 + 320 20 320 20 257.5 -33.5 c 128,-1,8 + 195 -87 195 -87 110 -87 c 0,9,10 + 91 -87 91 -87 73 -84 c 2,11,-1 + 12 -75 l 1,12,-1 + 3 -14 l 2,13,14 + -13 87 -13 87 47 164 c 0,15,16 + 101 233 101 233 191 247 c 1,17,18 + 195 261 195 261 199 269 c 0,19,20 + 366 551 366 551 637 659 c 0,21,22 + 652 665 652 665 668 665 c 0,23,24 + 703 665 703 665 727 641 c 0,0,1 +110 -3 m 0,25,26 + 167 -3 167 -3 207 32.5 c 128,-1,27 + 247 68 247 68 253 123 c 1,28,-1 + 210 166 l 1,29,30 + 148 159 148 159 111.5 111 c 128,-1,31 + 75 63 75 63 85 -2 c 1,32,33 + 93 -3 93 -3 110 -3 c 0,25,26 +314 184 m 1,34,35 + 344 201 344 201 388 233 c 1,36,37 + 321 300 321 300 320 302 c 1,38,39 + 292 263 292 263 271 227 c 1,40,-1 + 314 184 l 1,34,35 +422 258 m 1,41,42 + 592 390 592 390 669 582 c 1,43,44 + 475 505 475 505 344 334 c 1,45,-1 + 422 258 l 1,41,42 +EndSplineSet +EndChar + +StartChar: glyph54 +Encoding: 54 57398 55 +Width: 917 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 107 + 0 + 1 + 13 + 1 + 2 + 8 + 1 + 2 + 91 + 0 + 7 + 15 + 1 + 6 + 9 + 7 + 6 + 91 + 0 + 8 + 0 + 9 + 5 + 8 + 9 + 91 + 0 + 5 + 14 + 1 + 4 + 11 + 5 + 4 + 91 + 16 + 1 + 10 + 0 + 11 + 3 + 10 + 11 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 12 + 1 + 0 + 3 + 0 + 71 + 63 + 62 + 46 + 44 + 34 + 32 + 17 + 16 + 2 + 0 + 69 + 67 + 62 + 73 + 63 + 73 + 61 + 60 + 58 + 57 + 52 + 49 + 44 + 55 + 46 + 55 + 40 + 37 + 32 + 43 + 34 + 43 + 25 + 22 + 16 + 31 + 17 + 30 + 10 + 7 + 0 + 15 + 2 + 15 + 17 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +792 -33 m 2,0,-1 + 125 -33 l 2,1,2 + 73 -33 73 -33 36.5 3.5 c 128,-1,3 + 0 40 0 40 0 92 c 2,4,-1 + 0 508 l 2,5,6 + 0 560 0 560 36.5 596.5 c 128,-1,7 + 73 633 73 633 125 633 c 2,8,-1 + 792 633 l 2,9,10 + 844 633 844 633 880.5 596.5 c 128,-1,11 + 917 560 917 560 917 508 c 2,12,-1 + 917 92 l 2,13,14 + 917 40 917 40 880.5 3.5 c 128,-1,15 + 844 -33 844 -33 792 -33 c 2,0,-1 +125 550 m 2,16,17 + 108 550 108 550 95.5 537.5 c 128,-1,18 + 83 525 83 525 83 508 c 2,19,-1 + 83 92 l 2,20,21 + 83 75 83 75 95.5 62.5 c 128,-1,22 + 108 50 108 50 125 50 c 2,23,-1 + 792 50 l 2,24,25 + 809 50 809 50 821 62.5 c 128,-1,26 + 833 75 833 75 833 92 c 2,27,-1 + 833 508 l 2,28,29 + 833 525 833 525 821 537.5 c 128,-1,30 + 809 550 809 550 792 550 c 2,31,-1 + 125 550 l 2,16,17 +375 175 m 2,32,-1 + 208 175 l 2,33,34 + 191 175 191 175 179 187.5 c 128,-1,35 + 167 200 167 200 167 217 c 128,-1,36 + 167 234 167 234 179 246 c 128,-1,37 + 191 258 191 258 208 258 c 2,38,-1 + 375 258 l 2,39,40 + 392 258 392 258 404.5 246 c 128,-1,41 + 417 234 417 234 417 217 c 128,-1,42 + 417 200 417 200 404.5 187.5 c 128,-1,43 + 392 175 392 175 375 175 c 2,32,-1 +375 342 m 2,44,-1 + 208 342 l 2,45,46 + 191 342 191 342 179 354 c 128,-1,47 + 167 366 167 366 167 383 c 128,-1,48 + 167 400 167 400 179 412.5 c 128,-1,49 + 191 425 191 425 208 425 c 2,50,-1 + 375 425 l 2,51,52 + 392 425 392 425 404.5 412.5 c 128,-1,53 + 417 400 417 400 417 383 c 128,-1,54 + 417 366 417 366 404.5 354 c 128,-1,55 + 392 342 392 342 375 342 c 2,44,-1 +542 362 m 0,56,57 + 542 446 542 446 625 446 c 128,-1,58 + 708 446 708 446 708 362 c 0,59,60 + 708 279 708 279 625 279 c 128,-1,61 + 542 279 542 279 542 362 c 0,56,57 +625 244 m 0,62,63 + 670 244 670 244 699.5 226 c 128,-1,64 + 729 208 729 208 729 184 c 0,65,66 + 729 172 729 172 699 163 c 128,-1,67 + 669 154 669 154 625 154 c 0,68,69 + 578 154 578 154 549.5 163 c 128,-1,70 + 521 172 521 172 521 184 c 0,71,72 + 521 208 521 208 549.5 226 c 128,-1,73 + 578 244 578 244 625 244 c 0,62,63 +EndSplineSet +EndChar + +StartChar: glyph55 +Encoding: 55 57399 56 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 145 + 0 + 1 + 27 + 1 + 2 + 25 + 1 + 2 + 91 + 28 + 1 + 25 + 0 + 22 + 23 + 25 + 22 + 89 + 0 + 23 + 0 + 24 + 4 + 23 + 24 + 89 + 8 + 6 + 2 + 4 + 9 + 7 + 2 + 5 + 10 + 4 + 5 + 91 + 14 + 12 + 2 + 10 + 15 + 13 + 2 + 11 + 16 + 10 + 11 + 91 + 20 + 18 + 2 + 16 + 21 + 19 + 2 + 17 + 3 + 16 + 17 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 26 + 1 + 0 + 3 + 0 + 71 + 108 + 108 + 17 + 16 + 2 + 0 + 108 + 111 + 108 + 111 + 110 + 109 + 107 + 106 + 105 + 104 + 103 + 101 + 99 + 97 + 95 + 93 + 91 + 89 + 87 + 85 + 83 + 81 + 79 + 77 + 75 + 73 + 71 + 69 + 67 + 65 + 63 + 61 + 59 + 57 + 55 + 53 + 51 + 49 + 47 + 45 + 43 + 41 + 39 + 37 + 35 + 33 + 25 + 22 + 16 + 31 + 17 + 30 + 10 + 7 + 0 + 15 + 2 + 15 + 29 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +458 -75 m 2,0,-1 + 125 -75 l 2,1,2 + 72 -75 72 -75 36 -39 c 128,-1,3 + 0 -3 0 -3 0 50 c 2,4,-1 + 0 550 l 2,5,6 + 0 603 0 603 36 639 c 128,-1,7 + 72 675 72 675 125 675 c 2,8,-1 + 458 675 l 2,9,10 + 511 675 511 675 547 639 c 128,-1,11 + 583 603 583 603 583 550 c 2,12,-1 + 583 50 l 2,13,14 + 583 -3 583 -3 547 -39 c 128,-1,15 + 511 -75 511 -75 458 -75 c 2,0,-1 +125 592 m 2,16,17 + 106 592 106 592 94.5 580.5 c 128,-1,18 + 83 569 83 569 83 550 c 2,19,-1 + 83 50 l 2,20,21 + 83 31 83 31 94.5 19.5 c 128,-1,22 + 106 8 106 8 125 8 c 2,23,-1 + 458 8 l 2,24,25 + 477 8 477 8 488.5 19.5 c 128,-1,26 + 500 31 500 31 500 50 c 2,27,-1 + 500 550 l 2,28,29 + 500 569 500 569 488.5 580.5 c 128,-1,30 + 477 592 477 592 458 592 c 2,31,-1 + 125 592 l 2,16,17 +125 342 m 0,32,33 + 125 383 125 383 167 383 c 0,34,35 + 208 383 208 383 208 342 c 0,36,37 + 208 300 208 300 167 300 c 0,38,39 + 125 300 125 300 125 342 c 0,32,33 +250 342 m 0,40,41 + 250 383 250 383 292 383 c 0,42,43 + 333 383 333 383 333 342 c 0,44,45 + 333 300 333 300 292 300 c 0,46,47 + 250 300 250 300 250 342 c 0,40,41 +375 342 m 0,48,49 + 375 383 375 383 417 383 c 0,50,51 + 458 383 458 383 458 342 c 0,52,53 + 458 300 458 300 417 300 c 0,54,55 + 375 300 375 300 375 342 c 0,48,49 +125 217 m 0,56,57 + 125 258 125 258 167 258 c 0,58,59 + 208 258 208 258 208 217 c 0,60,61 + 208 175 208 175 167 175 c 0,62,63 + 125 175 125 175 125 217 c 0,56,57 +250 217 m 0,64,65 + 250 258 250 258 292 258 c 0,66,67 + 333 258 333 258 333 217 c 0,68,69 + 333 175 333 175 292 175 c 0,70,71 + 250 175 250 175 250 217 c 0,64,65 +375 217 m 0,72,73 + 375 258 375 258 417 258 c 0,74,75 + 458 258 458 258 458 217 c 0,76,77 + 458 175 458 175 417 175 c 0,78,79 + 375 175 375 175 375 217 c 0,72,73 +125 92 m 0,80,81 + 125 133 125 133 167 133 c 0,82,83 + 208 133 208 133 208 92 c 0,84,85 + 208 50 208 50 167 50 c 0,86,87 + 125 50 125 50 125 92 c 0,80,81 +250 92 m 0,88,89 + 250 133 250 133 292 133 c 0,90,91 + 333 133 333 133 333 92 c 0,92,93 + 333 50 333 50 292 50 c 0,94,95 + 250 50 250 50 250 92 c 0,88,89 +375 92 m 0,96,97 + 375 133 375 133 417 133 c 0,98,99 + 458 133 458 133 458 92 c 0,100,101 + 458 50 458 50 417 50 c 0,102,103 + 375 50 375 50 375 92 c 0,96,97 +417 508 m 1,104,-1 + 167 508 l 1,105,-1 + 167 467 l 1,106,-1 + 417 467 l 1,107,-1 + 417 508 l 1,104,-1 +458 550 m 1,108,-1 + 458 425 l 1,109,-1 + 125 425 l 1,110,-1 + 125 550 l 1,111,-1 + 458 550 l 1,108,-1 +EndSplineSet +EndChar + +StartChar: glyph56 +Encoding: 56 57400 57 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 91 + 15 + 0 + 2 + 10 + 2 + 1 + 66 + 3 + 1 + 1 + 7 + 1 + 5 + 2 + 1 + 5 + 91 + 0 + 2 + 14 + 12 + 2 + 10 + 4 + 2 + 10 + 91 + 6 + 1 + 4 + 13 + 1 + 11 + 15 + 4 + 11 + 91 + 16 + 1 + 15 + 0 + 8 + 9 + 15 + 8 + 89 + 0 + 9 + 0 + 0 + 9 + 79 + 0 + 9 + 9 + 0 + 83 + 0 + 0 + 9 + 0 + 71 + 62 + 62 + 62 + 81 + 62 + 81 + 78 + 77 + 75 + 74 + 72 + 71 + 69 + 68 + 66 + 65 + 60 + 57 + 19 + 21 + 21 + 21 + 22 + 18 + 18 + 25 + 54 + 17 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +667 542 m 1,0,1 + 704 529 704 529 727 497 c 128,-1,2 + 750 465 750 465 750 425 c 2,3,-1 + 750 50 l 2,4,5 + 750 -2 750 -2 713.5 -38.5 c 128,-1,6 + 677 -75 677 -75 625 -75 c 2,7,-1 + 125 -75 l 2,8,9 + 73 -75 73 -75 36.5 -38.5 c 128,-1,10 + 0 -2 0 -2 0 50 c 2,11,-1 + 0 425 l 2,12,13 + 0 465 0 465 23 497 c 128,-1,14 + 46 529 46 529 83 542 c 1,15,-1 + 83 550 l 2,16,17 + 83 602 83 602 119.5 638.5 c 128,-1,18 + 156 675 156 675 208 675 c 128,-1,19 + 260 675 260 675 296.5 638.5 c 128,-1,20 + 333 602 333 602 333 550 c 1,21,-1 + 417 550 l 1,22,23 + 417 602 417 602 453.5 638.5 c 128,-1,24 + 490 675 490 675 542 675 c 128,-1,25 + 594 675 594 675 630.5 638.5 c 128,-1,26 + 667 602 667 602 667 550 c 2,27,-1 + 667 542 l 1,0,1 +500 550 m 2,28,-1 + 500 467 l 2,29,30 + 500 450 500 450 512.5 437.5 c 128,-1,31 + 525 425 525 425 542 425 c 128,-1,32 + 559 425 559 425 571 437.5 c 128,-1,33 + 583 450 583 450 583 467 c 2,34,-1 + 583 550 l 2,35,36 + 583 567 583 567 571 579.5 c 128,-1,37 + 559 592 559 592 542 592 c 128,-1,38 + 525 592 525 592 512.5 579.5 c 128,-1,39 + 500 567 500 567 500 550 c 2,28,-1 +167 550 m 2,40,-1 + 167 467 l 2,41,42 + 167 450 167 450 179 437.5 c 128,-1,43 + 191 425 191 425 208 425 c 128,-1,44 + 225 425 225 425 237.5 437.5 c 128,-1,45 + 250 450 250 450 250 467 c 2,46,-1 + 250 550 l 2,47,48 + 250 567 250 567 237.5 579.5 c 128,-1,49 + 225 592 225 592 208 592 c 128,-1,50 + 191 592 191 592 179 579.5 c 128,-1,51 + 167 567 167 567 167 550 c 2,40,-1 +667 50 m 2,52,-1 + 667 300 l 1,53,-1 + 83 300 l 1,54,-1 + 83 50 l 2,55,56 + 83 33 83 33 95.5 20.5 c 128,-1,57 + 108 8 108 8 125 8 c 2,58,-1 + 625 8 l 2,59,60 + 642 8 642 8 654.5 20.5 c 128,-1,61 + 667 33 667 33 667 50 c 2,52,-1 +667 342 m 1,62,-1 + 667 425 l 2,63,64 + 667 442 667 442 654.5 454.5 c 128,-1,65 + 642 467 642 467 625 467 c 1,66,67 + 625 432 625 432 600.5 407.5 c 128,-1,68 + 576 383 576 383 542 383 c 128,-1,69 + 508 383 508 383 483 407.5 c 128,-1,70 + 458 432 458 432 458 467 c 1,71,-1 + 292 467 l 1,72,73 + 292 432 292 432 267 407.5 c 128,-1,74 + 242 383 242 383 208 383 c 128,-1,75 + 174 383 174 383 149.5 407.5 c 128,-1,76 + 125 432 125 432 125 467 c 1,77,78 + 108 467 108 467 95.5 454.5 c 128,-1,79 + 83 442 83 442 83 425 c 2,80,-1 + 83 342 l 1,81,-1 + 667 342 l 1,62,-1 +EndSplineSet +EndChar + +StartChar: glyph57 +Encoding: 57 57401 58 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 15 + 0 + 2 + 4 + 2 + 1 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 42 + 0 + 2 + 5 + 4 + 4 + 2 + 96 + 3 + 1 + 1 + 7 + 1 + 5 + 2 + 1 + 5 + 91 + 6 + 1 + 4 + 0 + 8 + 9 + 4 + 8 + 90 + 0 + 9 + 0 + 0 + 9 + 79 + 0 + 9 + 9 + 0 + 83 + 0 + 0 + 9 + 0 + 71 +ELSE +NPUSHB + 43 + 0 + 2 + 5 + 4 + 5 + 2 + 4 + 104 + 3 + 1 + 1 + 7 + 1 + 5 + 2 + 1 + 5 + 91 + 6 + 1 + 4 + 0 + 8 + 9 + 4 + 8 + 90 + 0 + 9 + 0 + 0 + 9 + 79 + 0 + 9 + 9 + 0 + 83 + 0 + 0 + 9 + 0 + 71 +EIF +NPUSHB + 13 + 60 + 57 + 19 + 21 + 21 + 21 + 22 + 18 + 18 + 25 + 54 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +667 542 m 1,0,1 + 704 529 704 529 727 497 c 128,-1,2 + 750 465 750 465 750 425 c 2,3,-1 + 750 50 l 2,4,5 + 750 -2 750 -2 713.5 -38.5 c 128,-1,6 + 677 -75 677 -75 625 -75 c 2,7,-1 + 125 -75 l 2,8,9 + 73 -75 73 -75 36.5 -38.5 c 128,-1,10 + 0 -2 0 -2 0 50 c 2,11,-1 + 0 425 l 2,12,13 + 0 465 0 465 23 497 c 128,-1,14 + 46 529 46 529 83 542 c 1,15,-1 + 83 550 l 2,16,17 + 83 602 83 602 119.5 638.5 c 128,-1,18 + 156 675 156 675 208 675 c 128,-1,19 + 260 675 260 675 296.5 638.5 c 128,-1,20 + 333 602 333 602 333 550 c 1,21,-1 + 417 550 l 1,22,23 + 417 602 417 602 453.5 638.5 c 128,-1,24 + 490 675 490 675 542 675 c 128,-1,25 + 594 675 594 675 630.5 638.5 c 128,-1,26 + 667 602 667 602 667 550 c 2,27,-1 + 667 542 l 1,0,1 +500 550 m 2,28,-1 + 500 467 l 2,29,30 + 500 450 500 450 512.5 437.5 c 128,-1,31 + 525 425 525 425 542 425 c 128,-1,32 + 559 425 559 425 571 437.5 c 128,-1,33 + 583 450 583 450 583 467 c 2,34,-1 + 583 550 l 2,35,36 + 583 567 583 567 571 579.5 c 128,-1,37 + 559 592 559 592 542 592 c 128,-1,38 + 525 592 525 592 512.5 579.5 c 128,-1,39 + 500 567 500 567 500 550 c 2,28,-1 +167 550 m 2,40,-1 + 167 467 l 2,41,42 + 167 450 167 450 179 437.5 c 128,-1,43 + 191 425 191 425 208 425 c 128,-1,44 + 225 425 225 425 237.5 437.5 c 128,-1,45 + 250 450 250 450 250 467 c 2,46,-1 + 250 550 l 2,47,48 + 250 567 250 567 237.5 579.5 c 128,-1,49 + 225 592 225 592 208 592 c 128,-1,50 + 191 592 191 592 179 579.5 c 128,-1,51 + 167 567 167 567 167 550 c 2,40,-1 +667 50 m 2,52,-1 + 667 300 l 1,53,-1 + 83 300 l 1,54,-1 + 83 50 l 2,55,56 + 83 33 83 33 95.5 20.5 c 128,-1,57 + 108 8 108 8 125 8 c 2,58,-1 + 625 8 l 2,59,60 + 642 8 642 8 654.5 20.5 c 128,-1,61 + 667 33 667 33 667 50 c 2,52,-1 +EndSplineSet +EndChar + +StartChar: glyph58 +Encoding: 58 57402 59 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 103 + 0 + 2 + 0 + 7 + 1 + 2 + 7 + 91 + 3 + 1 + 1 + 6 + 15 + 2 + 4 + 12 + 1 + 4 + 91 + 0 + 10 + 0 + 8 + 13 + 10 + 8 + 91 + 16 + 1 + 12 + 0 + 13 + 9 + 12 + 13 + 91 + 0 + 9 + 0 + 11 + 5 + 9 + 11 + 91 + 0 + 5 + 0 + 0 + 5 + 79 + 0 + 5 + 5 + 0 + 83 + 14 + 1 + 0 + 5 + 0 + 71 + 74 + 73 + 27 + 26 + 2 + 0 + 78 + 77 + 73 + 82 + 74 + 82 + 69 + 67 + 63 + 62 + 59 + 58 + 55 + 54 + 49 + 46 + 43 + 40 + 35 + 32 + 26 + 53 + 27 + 52 + 20 + 18 + 15 + 12 + 9 + 7 + 0 + 25 + 2 + 25 + 17 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +708 -33 m 2,0,-1 + 125 -33 l 2,1,2 + 73 -33 73 -33 36.5 3.5 c 128,-1,3 + 0 40 0 40 0 92 c 2,4,-1 + 0 425 l 2,5,6 + 0 477 0 477 36.5 513.5 c 128,-1,7 + 73 550 73 550 125 550 c 2,8,-1 + 191 550 l 1,9,-1 + 233 592 l 2,10,11 + 251 610 251 610 279 621.5 c 128,-1,12 + 307 633 307 633 333 633 c 2,13,-1 + 500 633 l 2,14,15 + 526 633 526 633 554.5 621.5 c 128,-1,16 + 583 610 583 610 601 592 c 2,17,-1 + 642 550 l 1,18,-1 + 708 550 l 2,19,20 + 760 550 760 550 796.5 513.5 c 128,-1,21 + 833 477 833 477 833 425 c 2,22,-1 + 833 92 l 2,23,24 + 833 40 833 40 796.5 3.5 c 128,-1,25 + 760 -33 760 -33 708 -33 c 2,0,-1 +125 467 m 2,26,27 + 108 467 108 467 95.5 454.5 c 128,-1,28 + 83 442 83 442 83 425 c 2,29,-1 + 83 92 l 2,30,31 + 83 75 83 75 95.5 62.5 c 128,-1,32 + 108 50 108 50 125 50 c 2,33,-1 + 708 50 l 2,34,35 + 725 50 725 50 737.5 62.5 c 128,-1,36 + 750 75 750 75 750 92 c 2,37,-1 + 750 425 l 2,38,39 + 750 442 750 442 737.5 454.5 c 128,-1,40 + 725 467 725 467 708 467 c 2,41,-1 + 625 467 l 2,42,43 + 608 467 608 467 596 479 c 2,44,-1 + 542 533 l 2,45,46 + 525 550 525 550 500 550 c 2,47,-1 + 333 550 l 2,48,49 + 309 550 309 550 292 533 c 2,50,-1 + 238 479 l 2,51,52 + 226 467 226 467 208 467 c 2,53,-1 + 125 467 l 2,26,27 +417 383 m 128,-1,55 + 374 383 374 383 343 352.5 c 128,-1,56 + 312 322 312 322 312 279 c 128,-1,57 + 312 236 312 236 343 205.5 c 128,-1,58 + 374 175 374 175 417 175 c 128,-1,59 + 460 175 460 175 490.5 205.5 c 128,-1,60 + 521 236 521 236 521 279 c 128,-1,61 + 521 322 521 322 490.5 352.5 c 128,-1,54 + 460 383 460 383 417 383 c 128,-1,55 +417 425 m 128,-1,63 + 478 425 478 425 520 382.5 c 128,-1,64 + 562 340 562 340 562 279 c 0,65,66 + 562 219 562 219 519.5 176 c 128,-1,67 + 477 133 477 133 417 133 c 0,68,69 + 356 133 356 133 313.5 176 c 128,-1,70 + 271 219 271 219 271 279 c 0,71,72 + 271 340 271 340 313.5 382.5 c 128,-1,62 + 356 425 356 425 417 425 c 128,-1,63 +667 438 m 0,73,74 + 689 438 689 438 705 422 c 128,-1,75 + 721 406 721 406 721 383 c 128,-1,76 + 721 360 721 360 705.5 344.5 c 128,-1,77 + 690 329 690 329 667 329 c 128,-1,78 + 644 329 644 329 628 345 c 128,-1,79 + 612 361 612 361 612 383 c 0,80,81 + 612 406 612 406 628 422 c 128,-1,82 + 644 438 644 438 667 438 c 0,73,74 +EndSplineSet +EndChar + +StartChar: glyph59 +Encoding: 59 57403 60 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 70 + 0 + 6 + 5 + 4 + 5 + 6 + 4 + 104 + 2 + 8 + 2 + 0 + 0 + 7 + 5 + 0 + 7 + 91 + 0 + 3 + 0 + 5 + 6 + 3 + 5 + 91 + 9 + 1 + 4 + 1 + 1 + 4 + 79 + 9 + 1 + 4 + 4 + 1 + 84 + 0 + 1 + 4 + 1 + 72 + 27 + 26 + 1 + 0 + 43 + 41 + 38 + 37 + 32 + 31 + 26 + 36 + 27 + 36 + 22 + 19 + 16 + 14 + 9 + 6 + 0 + 25 + 1 + 25 + 10 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +708 550 m 2,0,1 + 760 550 760 550 796.5 513.5 c 128,-1,2 + 833 477 833 477 833 425 c 2,3,-1 + 833 92 l 2,4,5 + 833 40 833 40 796.5 3.5 c 128,-1,6 + 760 -33 760 -33 708 -33 c 2,7,-1 + 125 -33 l 2,8,9 + 73 -33 73 -33 36.5 3.5 c 128,-1,10 + 0 40 0 40 0 92 c 2,11,-1 + 0 425 l 2,12,13 + 0 477 0 477 36.5 513.5 c 128,-1,14 + 73 550 73 550 125 550 c 2,15,-1 + 191 550 l 1,16,-1 + 233 592 l 2,17,18 + 251 610 251 610 279 621.5 c 128,-1,19 + 307 633 307 633 333 633 c 2,20,-1 + 500 633 l 2,21,22 + 526 633 526 633 554.5 621.5 c 128,-1,23 + 583 610 583 610 601 592 c 2,24,-1 + 642 550 l 1,25,-1 + 708 550 l 2,0,1 +417 133 m 0,26,27 + 477 133 477 133 519.5 176 c 128,-1,28 + 562 219 562 219 562 279 c 0,29,30 + 562 340 562 340 520 382.5 c 128,-1,31 + 478 425 478 425 417 425 c 128,-1,32 + 356 425 356 425 313.5 382.5 c 128,-1,33 + 271 340 271 340 271 279 c 0,34,35 + 271 219 271 219 313.5 176 c 128,-1,36 + 356 133 356 133 417 133 c 0,26,27 +667 329 m 128,-1,38 + 690 329 690 329 705.5 344.5 c 128,-1,39 + 721 360 721 360 721 383 c 128,-1,40 + 721 406 721 406 705 422 c 128,-1,41 + 689 438 689 438 667 438 c 0,42,43 + 644 438 644 438 628 422 c 128,-1,44 + 612 406 612 406 612 383 c 0,45,46 + 612 361 612 361 628 345 c 128,-1,37 + 644 329 644 329 667 329 c 128,-1,38 +EndSplineSet +EndChar + +StartChar: glyph60 +Encoding: 60 57404 61 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 80 + 30 + 1 + 4 + 5 + 40 + 32 + 29 + 3 + 6 + 4 + 41 + 1 + 7 + 6 + 3 + 66 + 0 + 1 + 0 + 2 + 5 + 1 + 2 + 91 + 9 + 1 + 5 + 8 + 1 + 4 + 6 + 5 + 4 + 91 + 0 + 6 + 0 + 7 + 3 + 6 + 7 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 0 + 0 + 3 + 0 + 71 + 25 + 24 + 17 + 16 + 44 + 42 + 38 + 36 + 24 + 31 + 25 + 31 + 16 + 23 + 17 + 23 + 19 + 19 + 19 + 16 + 10 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +354 -54 m 128,-1,1 + 208 -54 208 -54 104 50 c 128,-1,2 + 0 154 0 154 0 300 c 128,-1,3 + 0 446 0 446 104 550 c 128,-1,4 + 208 654 208 654 354 654 c 128,-1,5 + 500 654 500 654 604 550 c 128,-1,6 + 708 446 708 446 708 300 c 128,-1,7 + 708 154 708 154 604 50 c 128,-1,0 + 500 -54 500 -54 354 -54 c 128,-1,1 +354 571 m 128,-1,9 + 242 571 242 571 162.5 491.5 c 128,-1,10 + 83 412 83 412 83 300 c 128,-1,11 + 83 188 83 188 162.5 108.5 c 128,-1,12 + 242 29 242 29 354 29 c 128,-1,13 + 466 29 466 29 545.5 108.5 c 128,-1,14 + 625 188 625 188 625 300 c 128,-1,15 + 625 412 625 412 545.5 491.5 c 128,-1,8 + 466 571 466 571 354 571 c 128,-1,9 +354 446 m 0,16,17 + 337 446 337 446 329 444 c 1,18,-1 + 498 274 l 1,19,20 + 500 282 500 282 500 300 c 0,21,22 + 500 360 500 360 457 403 c 128,-1,23 + 414 446 414 446 354 446 c 0,16,17 +354 488 m 0,24,25 + 431 488 431 488 486.5 432.5 c 128,-1,26 + 542 377 542 377 542 300 c 0,27,28 + 542 248 542 248 513 201 c 1,29,-1 + 255 458 l 1,30,31 + 303 488 303 488 354 488 c 0,24,25 +211 326 m 1,32,33 + 208 314 208 314 208 300 c 0,34,35 + 208 240 208 240 251 197 c 128,-1,36 + 294 154 294 154 354 154 c 0,37,38 + 372 154 372 154 380 156 c 1,39,-1 + 211 326 l 1,32,33 +196 400 m 1,40,-1 + 454 142 l 1,41,42 + 406 112 406 112 354 112 c 0,43,44 + 276 112 276 112 221.5 167 c 128,-1,45 + 167 222 167 222 167 300 c 0,46,47 + 167 353 167 353 196 400 c 1,40,-1 +EndSplineSet +EndChar + +StartChar: glyph61 +Encoding: 61 57405 62 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 39 + 23 + 16 + 14 + 13 + 4 + 2 + 3 + 1 + 66 + 0 + 0 + 0 + 3 + 2 + 0 + 3 + 91 + 0 + 2 + 1 + 1 + 2 + 79 + 0 + 2 + 2 + 1 + 83 + 0 + 1 + 2 + 1 + 71 + 40 + 37 + 19 + 16 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 633 m 128,-1,1 + 471 633 471 633 569 535.5 c 128,-1,2 + 667 438 667 438 667 300 c 128,-1,3 + 667 162 667 162 569 64.5 c 128,-1,4 + 471 -33 471 -33 333 -33 c 128,-1,5 + 195 -33 195 -33 97.5 64.5 c 128,-1,6 + 0 162 0 162 0 300 c 128,-1,7 + 0 438 0 438 97.5 535.5 c 128,-1,0 + 195 633 195 633 333 633 c 128,-1,1 +125 300 m 0,8,9 + 125 214 125 214 186 153 c 128,-1,10 + 247 92 247 92 333 92 c 0,11,12 + 383 92 383 92 429 116 c 1,13,-1 + 149 396 l 1,14,15 + 125 350 125 350 125 300 c 0,8,9 +517 204 m 1,16,17 + 542 252 542 252 542 300 c 0,18,19 + 542 386 542 386 480.5 447 c 128,-1,20 + 419 508 419 508 333 508 c 0,21,22 + 284 508 284 508 238 484 c 1,23,-1 + 517 204 l 1,16,17 +EndSplineSet +EndChar + +StartChar: glyph62 +Encoding: 62 57406 63 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 62 + 19 + 1 + 3 + 2 + 1 + 66 + 6 + 1 + 0 + 0 + 2 + 3 + 0 + 2 + 91 + 0 + 3 + 0 + 1 + 5 + 3 + 1 + 91 + 0 + 5 + 4 + 4 + 5 + 79 + 0 + 5 + 5 + 4 + 83 + 7 + 1 + 4 + 5 + 4 + 71 + 43 + 41 + 1 + 0 + 49 + 46 + 41 + 52 + 43 + 52 + 40 + 39 + 26 + 24 + 9 + 6 + 0 + 21 + 1 + 21 + 8 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 675 m 0,0,1 + 677 675 677 675 713.5 637.5 c 128,-1,2 + 750 600 750 600 750 550 c 2,3,-1 + 750 133 l 2,4,5 + 750 116 750 116 737.5 104 c 128,-1,6 + 725 92 725 92 708 92 c 2,7,-1 + 42 92 l 2,8,9 + 25 92 25 92 12.5 104 c 128,-1,10 + 0 116 0 116 0 133 c 2,11,-1 + 0 258 l 2,12,13 + 0 303 0 303 27 336 c 2,14,-1 + 194 545 l 2,15,16 + 225 583 225 583 276.5 589.5 c 128,-1,17 + 328 596 328 596 367 567 c 2,18,-1 + 436 514 l 1,19,-1 + 528 628 l 2,20,21 + 566 675 566 675 625 675 c 0,0,1 +667 550 m 2,22,23 + 667 566 667 566 654 579 c 128,-1,24 + 641 592 641 592 625 592 c 0,25,26 + 605 592 605 592 592 576 c 2,27,-1 + 476 431 l 2,28,29 + 465 417 465 417 449 415 c 128,-1,30 + 433 413 433 413 419 423 c 2,31,-1 + 317 500 l 2,32,33 + 304 510 304 510 286.5 508 c 128,-1,34 + 269 506 269 506 259 493 c 2,35,-1 + 92 284 l 2,36,37 + 83 273 83 273 83 258 c 2,38,-1 + 83 175 l 1,39,-1 + 667 175 l 1,40,-1 + 667 550 l 2,22,23 +708 -75 m 2,41,-1 + 42 -75 l 2,42,43 + 25 -75 25 -75 12.5 -62.5 c 128,-1,44 + 0 -50 0 -50 0 -33 c 128,-1,45 + 0 -16 0 -16 12.5 -4 c 128,-1,46 + 25 8 25 8 42 8 c 2,47,-1 + 708 8 l 2,48,49 + 725 8 725 8 737.5 -4 c 128,-1,50 + 750 -16 750 -16 750 -33 c 128,-1,51 + 750 -50 750 -50 737.5 -62.5 c 128,-1,52 + 725 -75 725 -75 708 -75 c 2,41,-1 +EndSplineSet +EndChar + +StartChar: glyph63 +Encoding: 63 57407 64 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 10 + 1 + 0 + 64 + 0 + 0 + 1 + 0 + 106 + 3 + 1 + 1 + 2 + 2 + 1 + 79 + 3 + 1 + 1 + 1 + 2 + 83 + 0 + 2 + 1 + 2 + 71 + 17 + 16 + 23 + 20 + 16 + 27 + 17 + 26 + 17 + 4 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +708 550 m 2,0,-1 + 708 133 l 1,1,-1 + 42 133 l 1,2,-1 + 42 258 l 2,3,4 + 42 288 42 288 60 310 c 2,5,-1 + 227 519 l 2,6,7 + 248 545 248 545 281.5 549 c 128,-1,8 + 315 553 315 553 342 533 c 2,9,-1 + 444 457 l 1,10,-1 + 560 602 l 2,11,12 + 582 629 582 629 616 633 c 128,-1,13 + 650 637 650 637 677 615 c 0,14,15 + 708 591 708 591 708 550 c 2,0,-1 +708 8 m 2,16,17 + 725 8 725 8 737.5 -4 c 128,-1,18 + 750 -16 750 -16 750 -33 c 128,-1,19 + 750 -50 750 -50 737.5 -62.5 c 128,-1,20 + 725 -75 725 -75 708 -75 c 2,21,-1 + 42 -75 l 2,22,23 + 25 -75 25 -75 12.5 -62.5 c 128,-1,24 + 0 -50 0 -50 0 -33 c 128,-1,25 + 0 -16 0 -16 12.5 -4 c 128,-1,26 + 25 8 25 8 42 8 c 2,27,-1 + 708 8 l 2,16,17 +EndSplineSet +EndChar + +StartChar: glyph64 +Encoding: 64 57408 65 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 106 + 18 + 1 + 8 + 0 + 11 + 1 + 6 + 2 + 2 + 66 + 0 + 3 + 0 + 4 + 0 + 3 + 4 + 91 + 12 + 1 + 0 + 0 + 8 + 2 + 0 + 8 + 91 + 0 + 2 + 0 + 6 + 5 + 2 + 6 + 91 + 14 + 9 + 13 + 7 + 4 + 5 + 0 + 1 + 11 + 5 + 1 + 89 + 0 + 11 + 10 + 10 + 11 + 79 + 0 + 11 + 11 + 10 + 83 + 15 + 1 + 10 + 11 + 10 + 71 + 46 + 44 + 36 + 36 + 28 + 28 + 1 + 0 + 52 + 49 + 44 + 55 + 46 + 55 + 36 + 43 + 36 + 43 + 40 + 39 + 28 + 35 + 28 + 35 + 32 + 31 + 25 + 24 + 21 + 20 + 15 + 14 + 10 + 8 + 5 + 4 + 0 + 19 + 1 + 19 + 16 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 592 m 0,0,1 + 594 592 594 592 630.5 555.5 c 128,-1,2 + 667 519 667 519 667 467 c 2,3,-1 + 667 92 l 1,4,-1 + 0 92 l 1,5,-1 + 0 342 l 2,6,7 + 0 394 0 394 36.5 430.5 c 128,-1,8 + 73 467 73 467 125 467 c 0,9,10 + 172 467 172 467 208 434 c 1,11,-1 + 208 633 l 2,12,13 + 208 685 208 685 244.5 721.5 c 128,-1,14 + 281 758 281 758 333 758 c 128,-1,15 + 385 758 385 758 421.5 721.5 c 128,-1,16 + 458 685 458 685 458 633 c 2,17,-1 + 458 559 l 1,18,19 + 494 592 494 592 542 592 c 0,0,1 +333 675 m 128,-1,21 + 316 675 316 675 304 662.5 c 128,-1,22 + 292 650 292 650 292 633 c 2,23,-1 + 292 175 l 1,24,-1 + 375 175 l 1,25,-1 + 375 633 l 2,26,27 + 375 650 375 650 362.5 662.5 c 128,-1,20 + 350 675 350 675 333 675 c 128,-1,21 +167 175 m 1,28,-1 + 167 342 l 2,29,30 + 167 359 167 359 154.5 371 c 128,-1,31 + 142 383 142 383 125 383 c 128,-1,32 + 108 383 108 383 95.5 371 c 128,-1,33 + 83 359 83 359 83 342 c 2,34,-1 + 83 175 l 1,35,-1 + 167 175 l 1,28,-1 +583 175 m 1,36,-1 + 583 467 l 2,37,38 + 583 484 583 484 571 496 c 128,-1,39 + 559 508 559 508 542 508 c 128,-1,40 + 525 508 525 508 512.5 496 c 128,-1,41 + 500 484 500 484 500 467 c 2,42,-1 + 500 175 l 1,43,-1 + 583 175 l 1,36,-1 +625 -75 m 2,44,-1 + 42 -75 l 2,45,46 + 25 -75 25 -75 12.5 -62.5 c 128,-1,47 + 0 -50 0 -50 0 -33 c 128,-1,48 + 0 -16 0 -16 12.5 -4 c 128,-1,49 + 25 8 25 8 42 8 c 2,50,-1 + 625 8 l 2,51,52 + 642 8 642 8 654.5 -4 c 128,-1,53 + 667 -16 667 -16 667 -33 c 128,-1,54 + 667 -50 667 -50 654.5 -62.5 c 128,-1,55 + 642 -75 642 -75 625 -75 c 2,44,-1 +EndSplineSet +EndChar + +StartChar: glyph65 +Encoding: 65 57409 66 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 56 + 0 + 1 + 3 + 0 + 1 + 79 + 0 + 3 + 5 + 0 + 3 + 79 + 0 + 5 + 4 + 2 + 2 + 0 + 6 + 5 + 0 + 89 + 8 + 1 + 6 + 7 + 7 + 6 + 79 + 8 + 1 + 6 + 6 + 7 + 83 + 0 + 7 + 6 + 7 + 71 + 27 + 26 + 33 + 30 + 26 + 37 + 27 + 36 + 19 + 19 + 35 + 19 + 35 + 17 + 9 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +417 633 m 2,0,-1 + 417 133 l 1,1,-1 + 250 133 l 1,2,-1 + 250 633 l 2,3,4 + 250 668 250 668 274.5 692.5 c 128,-1,5 + 299 717 299 717 333 717 c 0,6,7 + 368 717 368 717 392.5 692.5 c 128,-1,8 + 417 668 417 668 417 633 c 2,0,-1 +625 467 m 2,9,-1 + 625 133 l 1,10,-1 + 458 133 l 1,11,-1 + 458 467 l 2,12,13 + 458 501 458 501 482.5 525.5 c 128,-1,14 + 507 550 507 550 542 550 c 0,15,16 + 576 550 576 550 600.5 526 c 128,-1,17 + 625 502 625 502 625 467 c 2,9,-1 +208 342 m 2,18,-1 + 208 133 l 1,19,-1 + 42 133 l 1,20,-1 + 42 342 l 2,21,22 + 42 376 42 376 66 400.5 c 128,-1,23 + 90 425 90 425 125 425 c 128,-1,24 + 160 425 160 425 184 400.5 c 128,-1,25 + 208 376 208 376 208 342 c 2,18,-1 +625 8 m 2,26,27 + 642 8 642 8 654.5 -4 c 128,-1,28 + 667 -16 667 -16 667 -33 c 128,-1,29 + 667 -50 667 -50 654.5 -62.5 c 128,-1,30 + 642 -75 642 -75 625 -75 c 2,31,-1 + 42 -75 l 2,32,33 + 25 -75 25 -75 12.5 -62.5 c 128,-1,34 + 0 -50 0 -50 0 -33 c 128,-1,35 + 0 -16 0 -16 12.5 -4 c 128,-1,36 + 25 8 25 8 42 8 c 2,37,-1 + 625 8 l 2,26,27 +EndSplineSet +EndChar + +StartChar: glyph66 +Encoding: 66 57410 67 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 83 + 10 + 1 + 2 + 4 + 45 + 34 + 22 + 3 + 3 + 2 + 2 + 66 + 8 + 1 + 2 + 4 + 3 + 4 + 2 + 3 + 104 + 0 + 1 + 0 + 4 + 2 + 1 + 4 + 91 + 0 + 3 + 7 + 1 + 0 + 6 + 3 + 0 + 91 + 0 + 6 + 5 + 5 + 6 + 79 + 0 + 6 + 6 + 5 + 83 + 9 + 1 + 5 + 6 + 5 + 71 + 50 + 48 + 26 + 25 + 1 + 0 + 56 + 53 + 48 + 59 + 50 + 59 + 43 + 41 + 32 + 30 + 25 + 47 + 26 + 47 + 14 + 12 + 0 + 24 + 1 + 24 + 10 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +125 92 m 0,0,1 + 88 92 88 92 57.5 112.5 c 128,-1,2 + 27 133 27 133 12.5 162.5 c 128,-1,3 + -2 192 -2 192 0.5 228.5 c 128,-1,4 + 3 265 3 265 27 295 c 2,5,-1 + 194 503 l 2,6,7 + 225 541 225 541 276.5 548 c 128,-1,8 + 328 555 328 555 367 525 c 2,9,-1 + 436 473 l 1,10,-1 + 527 586 l 2,11,12 + 565 633 565 633 625 633 c 0,13,14 + 675 633 675 633 711 598.5 c 128,-1,15 + 747 564 747 564 750 519 c 128,-1,16 + 753 474 753 474 723 430 c 1,17,-1 + 556 222 l 2,18,19 + 525 184 525 184 474 177.5 c 128,-1,20 + 423 171 423 171 383 200 c 2,21,-1 + 313 252 l 1,22,-1 + 222 139 l 2,23,24 + 184 92 184 92 125 92 c 0,0,1 +292 467 m 0,25,26 + 272 467 272 467 259 451 c 2,27,-1 + 92 243 l 2,28,29 + 76 221 76 221 88.5 198 c 128,-1,30 + 101 175 101 175 125 175 c 0,31,32 + 145 175 145 175 158 191 c 2,33,-1 + 299 368 l 1,34,-1 + 433 267 l 2,35,36 + 446 257 446 257 463.5 259 c 128,-1,37 + 481 261 481 261 491 274 c 2,38,-1 + 658 482 l 2,39,40 + 674 504 674 504 661.5 527 c 128,-1,41 + 649 550 649 550 625 550 c 0,42,43 + 605 550 605 550 592 534 c 2,44,-1 + 451 358 l 1,45,-1 + 317 458 l 2,46,47 + 307 467 307 467 292 467 c 0,25,26 +667 -75 m 2,48,-1 + 83 -75 l 2,49,50 + 66 -75 66 -75 54 -62.5 c 128,-1,51 + 42 -50 42 -50 42 -33 c 128,-1,52 + 42 -16 42 -16 54 -4 c 128,-1,53 + 66 8 66 8 83 8 c 2,54,-1 + 667 8 l 2,55,56 + 684 8 684 8 696 -4 c 128,-1,57 + 708 -16 708 -16 708 -33 c 128,-1,58 + 708 -50 708 -50 696 -62.5 c 128,-1,59 + 684 -75 684 -75 667 -75 c 2,48,-1 +EndSplineSet +EndChar + +StartChar: glyph67 +Encoding: 67 57411 68 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 39 + 19 + 8 + 2 + 0 + 64 + 0 + 0 + 2 + 0 + 106 + 0 + 2 + 1 + 1 + 2 + 79 + 0 + 2 + 2 + 1 + 83 + 3 + 1 + 1 + 2 + 1 + 71 + 25 + 24 + 31 + 28 + 24 + 35 + 25 + 34 + 23 + 21 + 4 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +31 152 m 0,0,1 + 4 174 4 174 0 208 c 128,-1,2 + -4 242 -4 242 18 269 c 2,3,-1 + 185 477 l 2,4,5 + 206 503 206 503 239.5 507.5 c 128,-1,6 + 273 512 273 512 300 492 c 2,7,-1 + 402 415 l 1,8,-1 + 518 560 l 2,9,10 + 540 587 540 587 574 591 c 128,-1,11 + 608 595 608 595 635 573 c 128,-1,12 + 662 551 662 551 666 517 c 128,-1,13 + 670 483 670 483 648 456 c 2,14,-1 + 482 248 l 2,15,16 + 461 222 461 222 427.5 217.5 c 128,-1,17 + 394 213 394 213 367 233 c 2,18,-1 + 265 310 l 1,19,-1 + 148 165 l 2,20,21 + 124 133 124 133 83 133 c 0,22,23 + 55 133 55 133 31 152 c 0,0,1 +42 -75 m 2,24,25 + 25 -75 25 -75 12.5 -62.5 c 128,-1,26 + 0 -50 0 -50 0 -33 c 128,-1,27 + 0 -16 0 -16 12.5 -4 c 128,-1,28 + 25 8 25 8 42 8 c 2,29,-1 + 625 8 l 2,30,31 + 642 8 642 8 654.5 -4 c 128,-1,32 + 667 -16 667 -16 667 -33 c 128,-1,33 + 667 -50 667 -50 654.5 -62.5 c 128,-1,34 + 642 -75 642 -75 625 -75 c 2,35,-1 + 42 -75 l 2,24,25 +EndSplineSet +EndChar + +StartChar: glyph68 +Encoding: 68 57412 69 +Width: 722 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 62 + 46 + 42 + 41 + 40 + 38 + 37 + 31 + 30 + 29 + 26 + 10 + 11 + 3 + 0 + 18 + 1 + 1 + 3 + 2 + 66 + 0 + 0 + 3 + 0 + 106 + 0 + 1 + 3 + 2 + 3 + 1 + 2 + 104 + 4 + 1 + 3 + 1 + 2 + 3 + 79 + 4 + 1 + 3 + 3 + 2 + 84 + 0 + 2 + 3 + 2 + 72 + 28 + 27 + 27 + 36 + 28 + 36 + 34 + 43 + 34 + 5 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +264 675 m 2,0,1 + 264 709 264 709 288.5 733.5 c 128,-1,2 + 313 758 313 758 347 758 c 2,3,-1 + 355 758 l 1,4,5 + 529 743 529 743 666 629 c 0,6,7 + 693 606 693 606 695.5 569.5 c 128,-1,8 + 698 533 698 533 672 506 c 2,9,-1 + 648 483 l 1,10,11 + 722 375 722 375 722 245 c 0,12,13 + 722 98 722 98 630 -17 c 0,14,15 + 606 -46 606 -46 565 -48 c 0,16,17 + 546 -48 546 -48 528 -39 c 1,18,19 + 442 -95 442 -95 343 -95 c 0,20,21 + 201 -95 201 -95 100.5 6 c 128,-1,22 + 0 107 0 107 0 249 c 0,23,24 + 0 368 0 368 74.5 461.5 c 128,-1,25 + 149 555 149 555 264 582 c 1,26,-1 + 264 675 l 2,0,1 +343 -12 m 0,27,28 + 428 -12 428 -12 498 40 c 1,29,-1 + 306 238 l 1,30,-1 + 306 505 l 1,31,32 + 211 491 211 491 147 418.5 c 128,-1,33 + 83 346 83 346 83 249 c 0,34,35 + 83 141 83 141 159.5 64.5 c 128,-1,36 + 236 -12 236 -12 343 -12 c 0,27,28 +347 299 m 1,37,-1 + 612 565 l 1,38,39 + 496 662 496 662 347 675 c 1,40,-1 + 347 299 l 1,37,-1 +356 246 m 1,41,-1 + 565 35 l 1,42,43 + 639 128 639 128 639 245 c 0,44,45 + 639 363 639 363 565 456 c 1,46,-1 + 356 246 l 1,41,-1 +EndSplineSet +EndChar + +StartChar: glyph69 +Encoding: 69 57413 70 +Width: 675 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 16 + 20 + 18 + 10 + 9 + 1 + 0 + 6 + 0 + 64 + 0 + 0 + 0 + 97 + 43 + 1 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +359 218 m 1,0,-1 + 593 452 l 1,1,2 + 675 349 675 349 675 217 c 0,3,4 + 675 108 675 108 617 17 c 0,5,6 + 608 3 608 3 591.5 1.5 c 128,-1,7 + 575 0 575 0 563 12 c 2,8,-1 + 359 218 l 1,0,-1 +250 200 m 1,9,-1 + 466 -17 l 1,10,11 + 389 -75 389 -75 292 -75 c 0,12,13 + 171 -75 171 -75 85.5 11 c 128,-1,14 + 0 97 0 97 0 218 c 0,15,16 + 0 328 0 328 72 410 c 128,-1,17 + 144 492 144 492 250 507 c 1,18,-1 + 250 200 l 1,9,-1 +555 541 m 2,19,-1 + 333 318 l 1,20,-1 + 333 633 l 2,21,22 + 333 650 333 650 345.5 661 c 128,-1,23 + 358 672 358 672 375 669 c 0,24,25 + 473 651 473 651 552 596 c 0,26,27 + 566 586 566 586 566.5 569.5 c 128,-1,28 + 567 553 567 553 555 541 c 2,19,-1 +EndSplineSet +EndChar + +StartChar: glyph70 +Encoding: 70 57414 71 +Width: 510 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 39 + 26 + 18 + 15 + 6 + 4 + 2 + 3 + 1 + 66 + 0 + 1 + 0 + 3 + 2 + 1 + 3 + 91 + 0 + 2 + 0 + 0 + 2 + 79 + 0 + 2 + 2 + 0 + 83 + 0 + 0 + 2 + 0 + 71 + 26 + 27 + 20 + 34 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +510 92 m 0,0,1 + 510 41 510 41 473 4 c 128,-1,2 + 436 -33 436 -33 385 -33 c 0,3,4 + 333 -33 333 -33 297 3 c 2,5,-1 + 0 300 l 1,6,-1 + 297 597 l 2,7,8 + 332 632 332 632 385.5 632 c 128,-1,9 + 439 632 439 632 474 597 c 0,10,11 + 510 561 510 561 510 508 c 0,12,13 + 510 456 510 456 474 420 c 2,14,-1 + 354 300 l 1,15,-1 + 474 180 l 2,16,17 + 510 144 510 144 510 92 c 0,0,1 +118 300 m 1,18,-1 + 356 62 l 2,19,20 + 368 50 368 50 385.5 50 c 128,-1,21 + 403 50 403 50 415 62 c 128,-1,22 + 427 74 427 74 427 92 c 0,23,24 + 427 109 427 109 415 121 c 2,25,-1 + 236 300 l 1,26,-1 + 415 479 l 2,27,28 + 427 491 427 491 427 508 c 0,29,30 + 427 526 427 526 415 538 c 128,-1,31 + 403 550 403 550 385.5 550 c 128,-1,32 + 368 550 368 550 356 538 c 2,33,-1 + 118 300 l 1,18,-1 +EndSplineSet +EndChar + +StartChar: glyph71 +Encoding: 71 57415 72 +Width: 410 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 27 + 11 + 4 + 2 + 0 + 1 + 1 + 66 + 0 + 1 + 0 + 0 + 1 + 79 + 0 + 1 + 1 + 0 + 83 + 0 + 0 + 1 + 0 + 71 + 20 + 24 + 2 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +385 567 m 0,0,1 + 410 542 410 542 410 508 c 128,-1,2 + 410 474 410 474 385 449 c 2,3,-1 + 236 300 l 1,4,-1 + 385 151 l 2,5,6 + 410 126 410 126 410 92 c 128,-1,7 + 410 58 410 58 385 33 c 128,-1,8 + 360 8 360 8 326 8 c 128,-1,9 + 292 8 292 8 267 33 c 2,10,-1 + 0 300 l 1,11,-1 + 267 567 l 2,12,13 + 291 592 291 592 326 592 c 128,-1,14 + 361 592 361 592 385 567 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph72 +Encoding: 72 57416 73 +Width: 510 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 32 + 23 + 14 + 5 + 4 + 3 + 2 + 1 + 66 + 0 + 1 + 0 + 2 + 3 + 1 + 2 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 4 + 1 + 0 + 3 + 0 + 71 + 1 + 0 + 30 + 29 + 18 + 17 + 12 + 11 + 0 + 16 + 1 + 16 + 5 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +125 -33 m 0,0,1 + 74 -33 74 -33 37 4 c 128,-1,2 + 0 41 0 41 0 92 c 128,-1,3 + 0 143 0 143 37 180 c 2,4,-1 + 157 300 l 1,5,-1 + 37 420 l 2,6,7 + 0 457 0 457 0 508 c 0,8,9 + 0 560 0 560 37 597 c 0,10,11 + 72 632 72 632 125 632 c 128,-1,12 + 178 632 178 632 213 597 c 2,13,-1 + 510 300 l 1,14,-1 + 213 3 l 2,15,16 + 177 -33 177 -33 125 -33 c 0,0,1 +125 550 m 128,-1,18 + 108 550 108 550 95.5 537.5 c 128,-1,19 + 83 525 83 525 83 508 c 0,20,21 + 83 492 83 492 96 479 c 2,22,-1 + 274 300 l 1,23,-1 + 96 121 l 2,24,25 + 83 108 83 108 83 92 c 0,26,27 + 83 75 83 75 96 62 c 0,28,29 + 108 50 108 50 125 50 c 128,-1,30 + 142 50 142 50 154 62 c 2,31,-1 + 392 300 l 1,32,-1 + 154 538 l 2,33,17 + 142 550 142 550 125 550 c 128,-1,18 +EndSplineSet +EndChar + +StartChar: glyph73 +Encoding: 73 57417 74 +Width: 410 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 27 + 11 + 4 + 2 + 1 + 0 + 1 + 66 + 0 + 0 + 1 + 1 + 0 + 79 + 0 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 + 20 + 17 + 2 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +24 567 m 0,0,1 + 48 592 48 592 83 592 c 128,-1,2 + 118 592 118 592 142 567 c 2,3,-1 + 410 300 l 1,4,-1 + 142 33 l 2,5,6 + 117 8 117 8 83 8 c 128,-1,7 + 49 8 49 8 24 33 c 128,-1,8 + -1 58 -1 58 -1 92 c 128,-1,9 + -1 126 -1 126 24 151 c 2,10,-1 + 174 300 l 1,11,-1 + 24 449 l 2,12,13 + -1 474 -1 474 -1 508 c 128,-1,14 + -1 542 -1 542 24 567 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph74 +Encoding: 74 57418 75 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 113 + 14 + 1 + 0 + 6 + 4 + 15 + 3 + 3 + 2 + 0 + 3 + 91 + 0 + 2 + 0 + 5 + 13 + 2 + 5 + 91 + 0 + 13 + 18 + 1 + 12 + 11 + 13 + 12 + 91 + 0 + 11 + 17 + 1 + 10 + 9 + 11 + 10 + 91 + 0 + 9 + 16 + 1 + 8 + 7 + 9 + 8 + 91 + 0 + 7 + 1 + 1 + 7 + 79 + 0 + 7 + 7 + 1 + 83 + 0 + 1 + 7 + 1 + 71 + 78 + 76 + 66 + 64 + 54 + 52 + 16 + 16 + 1 + 0 + 84 + 81 + 76 + 87 + 78 + 87 + 72 + 69 + 64 + 75 + 66 + 75 + 60 + 57 + 52 + 63 + 54 + 63 + 50 + 47 + 42 + 40 + 37 + 34 + 31 + 29 + 16 + 25 + 16 + 25 + 22 + 19 + 9 + 6 + 0 + 15 + 1 + 14 + 19 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 675 m 2,0,1 + 594 675 594 675 630.5 638.5 c 128,-1,2 + 667 602 667 602 667 550 c 2,3,-1 + 667 50 l 2,4,5 + 667 -2 667 -2 630.5 -38.5 c 128,-1,6 + 594 -75 594 -75 542 -75 c 2,7,-1 + 125 -75 l 2,8,9 + 73 -75 73 -75 36.5 -38.5 c 128,-1,10 + 0 -2 0 -2 0 50 c 2,11,-1 + 0 550 l 2,12,13 + 0 602 0 602 36.5 638.5 c 128,-1,14 + 73 675 73 675 125 675 c 2,15,-1 + 542 675 l 2,0,1 +208 592 m 1,16,-1 + 208 550 l 2,17,18 + 208 533 208 533 220.5 520.5 c 128,-1,19 + 233 508 233 508 250 508 c 2,20,-1 + 417 508 l 2,21,22 + 434 508 434 508 446 520.5 c 128,-1,23 + 458 533 458 533 458 550 c 2,24,-1 + 458 592 l 1,25,-1 + 208 592 l 1,16,-1 +583 50 m 2,26,-1 + 583 550 l 2,27,28 + 583 567 583 567 571 579.5 c 128,-1,29 + 559 592 559 592 542 592 c 2,30,-1 + 500 592 l 1,31,-1 + 500 550 l 2,32,33 + 500 516 500 516 476 491.5 c 128,-1,34 + 452 467 452 467 417 467 c 2,35,-1 + 250 467 l 2,36,37 + 216 467 216 467 191.5 491.5 c 128,-1,38 + 167 516 167 516 167 550 c 2,39,-1 + 167 592 l 1,40,-1 + 125 592 l 2,41,42 + 108 592 108 592 95.5 579.5 c 128,-1,43 + 83 567 83 567 83 550 c 2,44,-1 + 83 50 l 2,45,46 + 83 33 83 33 95.5 20.5 c 128,-1,47 + 108 8 108 8 125 8 c 2,48,-1 + 542 8 l 2,49,50 + 559 8 559 8 571 20.5 c 128,-1,51 + 583 33 583 33 583 50 c 2,26,-1 +500 92 m 2,52,-1 + 167 92 l 2,53,54 + 146 92 146 92 146 112 c 0,55,56 + 146 121 146 121 152 127 c 128,-1,57 + 158 133 158 133 167 133 c 2,58,-1 + 500 133 l 2,59,60 + 509 133 509 133 515 127 c 128,-1,61 + 521 121 521 121 521 112 c 0,62,63 + 521 92 521 92 500 92 c 2,52,-1 +500 217 m 2,64,-1 + 167 217 l 2,65,66 + 158 217 158 217 152 223 c 128,-1,67 + 146 229 146 229 146 238 c 0,68,69 + 146 258 146 258 167 258 c 2,70,-1 + 500 258 l 2,71,72 + 521 258 521 258 521 238 c 0,73,74 + 521 229 521 229 515 223 c 128,-1,75 + 509 217 509 217 500 217 c 2,64,-1 +500 342 m 2,76,-1 + 167 342 l 2,77,78 + 146 342 146 342 146 362 c 0,79,80 + 146 371 146 371 152 377 c 128,-1,81 + 158 383 158 383 167 383 c 2,82,-1 + 500 383 l 2,83,84 + 509 383 509 383 515 377 c 128,-1,85 + 521 371 521 371 521 362 c 0,86,87 + 521 342 521 342 500 342 c 2,76,-1 +EndSplineSet +EndChar + +StartChar: glyph75 +Encoding: 75 57419 76 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 64 + 36 + 28 + 7 + 3 + 2 + 3 + 1 + 66 + 7 + 1 + 0 + 6 + 3 + 6 + 0 + 3 + 104 + 0 + 6 + 0 + 3 + 2 + 6 + 3 + 91 + 4 + 1 + 2 + 1 + 1 + 2 + 79 + 4 + 1 + 2 + 2 + 1 + 84 + 5 + 1 + 1 + 2 + 1 + 72 + 1 + 0 + 41 + 39 + 31 + 29 + 26 + 24 + 18 + 17 + 11 + 9 + 6 + 4 + 0 + 43 + 1 + 43 + 8 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 425 m 1,0,1 + 711 425 711 425 772 364 c 128,-1,2 + 833 303 833 303 833 217 c 128,-1,3 + 833 131 833 131 772 69.5 c 128,-1,4 + 711 8 711 8 625 8 c 2,5,-1 + 458 8 l 1,6,-1 + 458 199 l 1,7,-1 + 512 146 l 2,8,9 + 525 133 525 133 542 133 c 0,10,11 + 558 133 558 133 571 146 c 0,12,13 + 583 158 583 158 583 175 c 128,-1,14 + 583 192 583 192 571 204 c 2,15,-1 + 446 329 l 2,16,17 + 435 340 435 340 417 340.5 c 128,-1,18 + 399 341 399 341 387 329 c 2,19,-1 + 262 204 l 2,20,21 + 250 192 250 192 250 175 c 128,-1,22 + 250 158 250 158 262 146 c 0,23,24 + 275 133 275 133 292 133 c 0,25,26 + 308 133 308 133 321 146 c 2,27,-1 + 375 199 l 1,28,-1 + 375 8 l 1,29,-1 + 167 8 l 2,30,31 + 98 8 98 8 49 57 c 128,-1,32 + 0 106 0 106 0 175 c 0,33,34 + 0 233 0 233 35 277.5 c 128,-1,35 + 70 322 70 322 125 336 c 1,36,-1 + 125 342 l 2,37,38 + 125 446 125 446 198.5 519 c 128,-1,39 + 272 592 272 592 375 592 c 0,40,41 + 455 592 455 592 519.5 545.5 c 128,-1,42 + 584 499 584 499 610 424 c 1,43,-1 + 625 425 l 1,0,1 +EndSplineSet +EndChar + +StartChar: glyph76 +Encoding: 84 57428 77 +Width: 844 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 87 + 28 + 12 + 2 + 6 + 4 + 63 + 47 + 2 + 8 + 6 + 2 + 66 + 0 + 6 + 4 + 8 + 4 + 6 + 8 + 104 + 9 + 1 + 8 + 3 + 4 + 8 + 3 + 102 + 0 + 2 + 0 + 5 + 0 + 2 + 5 + 91 + 0 + 0 + 0 + 4 + 6 + 0 + 4 + 91 + 7 + 10 + 2 + 3 + 1 + 1 + 3 + 79 + 7 + 10 + 2 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 + 21 + 20 + 61 + 59 + 51 + 49 + 46 + 44 + 40 + 38 + 33 + 31 + 26 + 24 + 20 + 64 + 21 + 64 + 40 + 51 + 16 + 11 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +635 425 m 1,0,1 + 721 425 721 425 782.5 364 c 128,-1,2 + 844 303 844 303 844 217 c 128,-1,3 + 844 131 844 131 782.5 69.5 c 128,-1,4 + 721 8 721 8 635 8 c 2,5,-1 + 177 8 l 2,6,7 + 107 8 107 8 53.5 57.5 c 128,-1,8 + 0 107 0 107 0 175 c 0,9,10 + 0 228 0 228 38 273 c 128,-1,11 + 76 318 76 318 115 336 c 1,12,-1 + 115 342 l 2,13,14 + 115 445 115 445 193 518.5 c 128,-1,15 + 271 592 271 592 375 592 c 0,16,17 + 457 592 457 592 526.5 545 c 128,-1,18 + 596 498 596 498 621 424 c 1,19,-1 + 635 425 l 1,0,1 +635 92 m 2,20,21 + 687 92 687 92 723.5 128.5 c 128,-1,22 + 760 165 760 165 760 217 c 128,-1,23 + 760 269 760 269 724 305.5 c 128,-1,24 + 688 342 688 342 636 342 c 0,25,26 + 622 342 622 342 602 336 c 2,27,-1 + 557 324 l 1,28,-1 + 549 369 l 2,29,30 + 538 429 538 429 492 468.5 c 128,-1,31 + 446 508 446 508 385 508 c 0,32,33 + 316 508 316 508 267.5 459.5 c 128,-1,34 + 219 411 219 411 219 342 c 0,35,36 + 219 324 219 324 222 308 c 2,37,-1 + 232 258 l 1,38,-1 + 173 259 l 2,39,40 + 141 259 141 259 117.5 234 c 128,-1,41 + 94 209 94 209 94 175 c 0,42,43 + 94 140 94 140 118 116 c 128,-1,44 + 142 92 142 92 177 92 c 2,45,-1 + 406 92 l 1,46,-1 + 406 250 l 1,47,-1 + 317 160 l 2,48,49 + 311 154 311 154 302 154 c 0,50,51 + 289 154 289 154 283 167 c 128,-1,52 + 277 180 277 180 287 190 c 2,53,-1 + 412 315 l 1,54,55 + 427 324 427 324 442 315 c 1,56,-1 + 567 190 l 2,57,58 + 577 180 577 180 571 167 c 128,-1,59 + 565 154 565 154 552 154 c 0,60,61 + 543 154 543 154 537 160 c 2,62,-1 + 448 250 l 1,63,-1 + 448 92 l 1,64,-1 + 635 92 l 2,20,21 +EndSplineSet +EndChar + +StartChar: glyph77 +Encoding: 76 57420 78 +Width: 951 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 58 + 51 + 43 + 35 + 23 + 16 + 11 + 3 + 8 + 2 + 3 + 1 + 66 + 5 + 1 + 1 + 10 + 6 + 2 + 3 + 2 + 1 + 3 + 91 + 7 + 1 + 2 + 0 + 0 + 2 + 79 + 7 + 1 + 2 + 2 + 0 + 83 + 9 + 4 + 8 + 3 + 0 + 2 + 0 + 71 + 47 + 46 + 31 + 30 + 1 + 0 + 56 + 55 + 46 + 60 + 47 + 60 + 41 + 40 + 30 + 45 + 31 + 45 + 28 + 27 + 19 + 18 + 6 + 5 + 0 + 15 + 1 + 15 + 11 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +302 8 m 0,0,1 + 250 8 250 8 213 45 c 2,2,-1 + 0 258 l 1,3,-1 + 213 472 l 2,4,5 + 248 507 248 507 301.5 507 c 128,-1,6 + 355 507 355 507 390 472 c 0,7,8 + 427 435 427 435 427 383.5 c 128,-1,9 + 427 332 427 332 390 295 c 2,10,-1 + 354 258 l 1,11,-1 + 390 222 l 2,12,13 + 427 185 427 185 427 133.5 c 128,-1,14 + 427 82 427 82 390 45 c 128,-1,15 + 353 8 353 8 302 8 c 0,0,1 +118 258 m 1,16,-1 + 272 104 l 2,17,18 + 284 92 284 92 301.5 92 c 128,-1,19 + 319 92 319 92 331 104 c 128,-1,20 + 343 116 343 116 343 133.5 c 128,-1,21 + 343 151 343 151 331 163 c 2,22,-1 + 236 258 l 1,23,-1 + 331 354 l 2,24,25 + 343 366 343 366 343 383.5 c 128,-1,26 + 343 401 343 401 331 413 c 128,-1,27 + 319 425 319 425 301.5 425 c 128,-1,28 + 284 425 284 425 272 413 c 2,29,-1 + 118 258 l 1,16,-1 +649 8 m 0,30,31 + 598 8 598 8 561 45 c 128,-1,32 + 524 82 524 82 524 133.5 c 128,-1,33 + 524 185 524 185 561 222 c 2,34,-1 + 598 258 l 1,35,-1 + 561 295 l 2,36,37 + 524 332 524 332 524 383.5 c 128,-1,38 + 524 435 524 435 561 472 c 0,39,40 + 596 507 596 507 649.5 507 c 128,-1,41 + 703 507 703 507 738 472 c 2,42,-1 + 951 258 l 1,43,-1 + 738 45 l 2,44,45 + 701 8 701 8 649 8 c 0,30,31 +649 425 m 0,46,47 + 632 425 632 425 620 413 c 128,-1,48 + 608 401 608 401 608 383.5 c 128,-1,49 + 608 366 608 366 620 354 c 2,50,-1 + 715 258 l 1,51,-1 + 620 163 l 2,52,53 + 608 151 608 151 608 133.5 c 128,-1,54 + 608 116 608 116 620 104 c 128,-1,55 + 632 92 632 92 649.5 92 c 128,-1,56 + 667 92 667 92 679 104 c 2,57,-1 + 833 258 l 1,58,-1 + 679 413 l 2,59,60 + 667 425 667 425 649 425 c 0,46,47 +EndSplineSet +EndChar + +StartChar: glyph78 +Encoding: 77 57421 79 +Width: 805 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 34 + 30 + 22 + 11 + 3 + 4 + 0 + 1 + 1 + 66 + 3 + 1 + 1 + 0 + 0 + 1 + 79 + 3 + 1 + 1 + 1 + 0 + 83 + 2 + 1 + 0 + 1 + 0 + 71 + 26 + 26 + 20 + 16 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +243 50 m 128,-1,1 + 208 50 208 50 184 74 c 2,2,-1 + 0 258 l 1,3,-1 + 184 442 l 2,4,5 + 209 467 209 467 243.5 467 c 128,-1,6 + 278 467 278 467 302 442 c 0,7,8 + 327 417 327 417 327 383 c 128,-1,9 + 327 349 327 349 302 324 c 2,10,-1 + 236 258 l 1,11,-1 + 302 192 l 2,12,13 + 327 167 327 167 327 133 c 128,-1,14 + 327 99 327 99 302 74 c 0,15,0 + 278 50 278 50 243 50 c 128,-1,1 +562 50 m 128,-1,17 + 527 50 527 50 503 74 c 0,18,19 + 478 99 478 99 478 133 c 128,-1,20 + 478 167 478 167 503 192 c 2,21,-1 + 569 258 l 1,22,-1 + 503 324 l 2,23,24 + 478 349 478 349 478 383 c 128,-1,25 + 478 417 478 417 503 442 c 0,26,27 + 527 467 527 467 561.5 467 c 128,-1,28 + 596 467 596 467 621 442 c 2,29,-1 + 805 258 l 1,30,-1 + 621 74 l 2,31,16 + 597 50 597 50 562 50 c 128,-1,17 +EndSplineSet +EndChar + +StartChar: glyph79 +Encoding: 78 57422 80 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 81 + 10 + 1 + 2 + 8 + 1 + 5 + 7 + 2 + 5 + 91 + 12 + 1 + 7 + 0 + 3 + 6 + 7 + 3 + 91 + 11 + 1 + 6 + 0 + 4 + 1 + 6 + 4 + 91 + 0 + 1 + 0 + 0 + 1 + 79 + 0 + 1 + 1 + 0 + 83 + 9 + 1 + 0 + 1 + 0 + 71 + 33 + 32 + 28 + 28 + 13 + 12 + 2 + 0 + 39 + 37 + 32 + 40 + 33 + 40 + 28 + 31 + 28 + 31 + 30 + 29 + 24 + 21 + 18 + 16 + 12 + 27 + 13 + 27 + 8 + 5 + 0 + 11 + 2 + 11 + 13 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 8 m 2,0,-1 + 42 8 l 2,1,2 + 25 8 25 8 12.5 20.5 c 128,-1,3 + 0 33 0 33 0 50 c 128,-1,4 + 0 67 0 67 12.5 79.5 c 128,-1,5 + 25 92 25 92 42 92 c 2,6,-1 + 542 92 l 2,7,8 + 559 92 559 92 571 79.5 c 128,-1,9 + 583 67 583 67 583 50 c 128,-1,10 + 583 33 583 33 571 20.5 c 128,-1,11 + 559 8 559 8 542 8 c 2,0,-1 +562 592 m 2,12,13 + 622 592 622 592 665 549 c 128,-1,14 + 708 506 708 506 708 446 c 128,-1,15 + 708 386 708 386 665 343 c 128,-1,16 + 622 300 622 300 562 300 c 2,17,-1 + 542 300 l 1,18,-1 + 542 217 l 2,19,20 + 542 182 542 182 517 157.5 c 128,-1,21 + 492 133 492 133 458 133 c 2,22,-1 + 125 133 l 2,23,24 + 91 133 91 133 66.5 157.5 c 128,-1,25 + 42 182 42 182 42 217 c 2,26,-1 + 42 592 l 1,27,-1 + 562 592 l 2,12,13 +458 217 m 1,28,-1 + 458 508 l 1,29,-1 + 125 508 l 1,30,-1 + 125 217 l 1,31,-1 + 458 217 l 1,28,-1 +562 383 m 2,32,33 + 588 383 588 383 606.5 401.5 c 128,-1,34 + 625 420 625 420 625 446 c 0,35,36 + 625 471 625 471 606.5 489.5 c 128,-1,37 + 588 508 588 508 562 508 c 2,38,-1 + 500 508 l 1,39,-1 + 500 383 l 1,40,-1 + 562 383 l 2,32,33 +EndSplineSet +EndChar + +StartChar: glyph80 +Encoding: 79 57423 81 +Width: 770 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 116 + 71 + 22 + 17 + 16 + 3 + 2 + 6 + 10 + 3 + 15 + 4 + 2 + 8 + 10 + 61 + 32 + 14 + 5 + 4 + 9 + 8 + 13 + 6 + 2 + 11 + 9 + 51 + 42 + 12 + 11 + 8 + 7 + 6 + 4 + 11 + 5 + 66 + 12 + 1 + 2 + 0 + 0 + 3 + 2 + 0 + 89 + 0 + 10 + 0 + 8 + 9 + 10 + 8 + 91 + 0 + 9 + 0 + 11 + 4 + 9 + 11 + 91 + 7 + 1 + 3 + 6 + 1 + 4 + 1 + 3 + 4 + 91 + 0 + 1 + 5 + 5 + 1 + 77 + 0 + 1 + 1 + 5 + 83 + 0 + 5 + 1 + 5 + 71 + 19 + 18 + 89 + 88 + 85 + 84 + 81 + 80 + 77 + 76 + 69 + 67 + 55 + 53 + 48 + 45 + 40 + 38 + 26 + 24 + 18 + 75 + 19 + 74 + 24 + 16 + 13 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +448 592 m 1,0,-1 + 323 592 l 1,1,-1 + 287 449 l 1,2,-1 + 146 490 l 1,3,-1 + 83 381 l 1,4,-1 + 189 279 l 1,5,-1 + 83 177 l 1,6,-1 + 146 69 l 1,7,-1 + 287 109 l 1,8,-1 + 323 -33 l 1,9,-1 + 448 -33 l 1,10,-1 + 483 109 l 1,11,-1 + 625 69 l 1,12,-1 + 687 177 l 1,13,-1 + 581 279 l 1,14,-1 + 687 381 l 1,15,-1 + 625 490 l 1,16,-1 + 483 449 l 1,17,-1 + 448 592 l 1,0,-1 +448 675 m 2,18,19 + 476 675 476 675 498.5 657.5 c 128,-1,20 + 521 640 521 640 528 612 c 2,21,-1 + 543 553 l 1,22,-1 + 602 570 l 2,23,24 + 614 573 614 573 625 573 c 0,25,26 + 673 573 673 573 697 531 c 2,27,-1 + 759 423 l 2,28,29 + 773 398 773 398 769.5 370 c 128,-1,30 + 766 342 766 342 745 322 c 2,31,-1 + 701 279 l 1,32,-1 + 745 237 l 2,33,34 + 765 217 765 217 769 189 c 128,-1,35 + 773 161 773 161 759 136 c 2,36,-1 + 697 27 l 2,37,38 + 673 -14 673 -14 625 -14 c 0,39,40 + 614 -14 614 -14 602 -11 c 2,41,-1 + 543 5 l 1,42,-1 + 529 -54 l 2,43,44 + 522 -82 522 -82 499.5 -99.5 c 128,-1,45 + 477 -117 477 -117 448 -117 c 2,46,-1 + 323 -117 l 2,47,48 + 294 -117 294 -117 271.5 -99.5 c 128,-1,49 + 249 -82 249 -82 242 -54 c 2,50,-1 + 227 5 l 1,51,-1 + 169 -12 l 2,52,53 + 157 -15 157 -15 146 -15 c 0,54,55 + 98 -15 98 -15 74 27 c 2,56,-1 + 11 135 l 2,57,58 + -3 160 -3 160 0.5 188.5 c 128,-1,59 + 4 217 4 217 25 237 c 2,60,-1 + 69 279 l 1,61,-1 + 25 321 l 2,62,63 + 5 341 5 341 1 369.5 c 128,-1,64 + -3 398 -3 398 11 423 c 2,65,-1 + 74 531 l 2,66,67 + 98 573 98 573 146 573 c 0,68,69 + 157 573 157 573 169 570 c 2,70,-1 + 227 553 l 1,71,-1 + 242 612 l 2,72,73 + 249 640 249 640 271.5 657.5 c 128,-1,74 + 294 675 294 675 323 675 c 2,75,-1 + 448 675 l 2,18,19 +385 362 m 128,-1,77 + 350 362 350 362 326 338 c 128,-1,78 + 302 314 302 314 302 279 c 128,-1,79 + 302 244 302 244 326 220 c 128,-1,80 + 350 196 350 196 385 196 c 128,-1,81 + 420 196 420 196 444.5 220.5 c 128,-1,82 + 469 245 469 245 469 279 c 128,-1,83 + 469 313 469 313 444.5 337.5 c 128,-1,76 + 420 362 420 362 385 362 c 128,-1,77 +385 404 m 128,-1,85 + 437 404 437 404 473.5 367.5 c 128,-1,86 + 510 331 510 331 510 279 c 128,-1,87 + 510 227 510 227 473.5 190.5 c 128,-1,88 + 437 154 437 154 385 154 c 128,-1,89 + 333 154 333 154 296.5 190.5 c 128,-1,90 + 260 227 260 227 260 279 c 128,-1,91 + 260 331 260 331 296.5 367.5 c 128,-1,84 + 333 404 333 404 385 404 c 128,-1,85 +EndSplineSet +EndChar + +StartChar: glyph81 +Encoding: 80 57424 82 +Width: 575 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 39 + 0 + 0 + 4 + 1 + 2 + 3 + 0 + 2 + 91 + 0 + 3 + 1 + 1 + 3 + 79 + 0 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 + 73 + 72 + 78 + 76 + 72 + 81 + 73 + 81 + 69 + 66 + 33 + 30 + 5 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +200 69 m 2,0,1 + 196 85 196 85 181 94 c 128,-1,2 + 166 103 166 103 149 98 c 2,3,-1 + 88 80 l 2,4,5 + 71 75 71 75 53 82.5 c 128,-1,6 + 35 90 35 90 27 105 c 2,7,-1 + 6 141 l 2,8,9 + -2 156 -2 156 1 175 c 128,-1,10 + 4 194 4 194 16 206 c 2,11,-1 + 61 250 l 2,12,13 + 73 262 73 262 73 279 c 128,-1,14 + 73 296 73 296 61 308 c 2,15,-1 + 16 352 l 2,16,17 + 3 364 3 364 1 383 c 128,-1,18 + -1 402 -1 402 7 417 c 2,19,-1 + 27 454 l 2,20,21 + 35 469 35 469 53 476 c 128,-1,22 + 71 483 71 483 88 478 c 2,23,-1 + 149 461 l 2,24,25 + 166 456 166 456 181 465 c 128,-1,26 + 196 474 196 474 200 490 c 2,27,-1 + 215 551 l 2,28,29 + 220 568 220 568 235 580 c 128,-1,30 + 250 592 250 592 267 592 c 2,31,-1 + 308 592 l 2,32,33 + 325 592 325 592 340 580 c 128,-1,34 + 355 568 355 568 360 551 c 2,35,-1 + 376 490 l 2,36,37 + 381 473 381 473 395.5 465 c 128,-1,38 + 410 457 410 457 426 461 c 2,39,-1 + 487 478 l 2,40,41 + 504 483 504 483 522 476 c 128,-1,42 + 540 469 540 469 548 454 c 2,43,-1 + 569 417 l 2,44,45 + 577 402 577 402 574 383 c 128,-1,46 + 571 364 571 364 559 352 c 2,47,-1 + 514 308 l 2,48,49 + 501 296 501 296 501.5 279 c 128,-1,50 + 502 262 502 262 514 250 c 2,51,-1 + 559 206 l 2,52,53 + 571 194 571 194 574 175 c 128,-1,54 + 577 156 577 156 569 141 c 2,55,-1 + 548 105 l 2,56,57 + 540 90 540 90 522 82.5 c 128,-1,58 + 504 75 504 75 487 80 c 2,59,-1 + 426 98 l 2,60,61 + 410 102 410 102 395.5 94 c 128,-1,62 + 381 86 381 86 376 69 c 2,63,-1 + 360 7 l 2,64,65 + 355 -10 355 -10 340 -21.5 c 128,-1,66 + 325 -33 325 -33 308 -33 c 2,67,-1 + 267 -33 l 2,68,69 + 250 -33 250 -33 235 -21.5 c 128,-1,70 + 220 -10 220 -10 215 7 c 2,71,-1 + 200 69 l 2,0,1 +288 362 m 0,72,73 + 253 362 253 362 228.5 337.5 c 128,-1,74 + 204 313 204 313 204 279 c 128,-1,75 + 204 245 204 245 228.5 220.5 c 128,-1,76 + 253 196 253 196 288 196 c 0,77,78 + 322 196 322 196 346.5 220 c 128,-1,79 + 371 244 371 244 371 279 c 128,-1,80 + 371 314 371 314 346.5 338 c 128,-1,81 + 322 362 322 362 288 362 c 0,72,73 +EndSplineSet +EndChar + +StartChar: glyph82 +Encoding: 81 57425 83 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 47 + 33 + 32 + 31 + 3 + 4 + 0 + 1 + 66 + 0 + 4 + 0 + 1 + 0 + 4 + 1 + 104 + 0 + 2 + 0 + 0 + 4 + 2 + 0 + 91 + 0 + 1 + 3 + 3 + 1 + 79 + 0 + 1 + 1 + 3 + 83 + 0 + 3 + 1 + 3 + 71 + 42 + 19 + 19 + 19 + 16 + 5 + 20 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 592 m 128,-1,1 + 254 592 254 592 168.5 506.5 c 128,-1,2 + 83 421 83 421 83 300 c 128,-1,3 + 83 179 83 179 168.5 93.5 c 128,-1,4 + 254 8 254 8 375 8 c 128,-1,5 + 496 8 496 8 581.5 93.5 c 128,-1,6 + 667 179 667 179 667 300 c 128,-1,7 + 667 421 667 421 581.5 506.5 c 128,-1,0 + 496 592 496 592 375 592 c 128,-1,1 +375 675 m 128,-1,9 + 530 675 530 675 640 565 c 128,-1,10 + 750 455 750 455 750 300 c 128,-1,11 + 750 145 750 145 640 35 c 128,-1,12 + 530 -75 530 -75 375 -75 c 128,-1,13 + 220 -75 220 -75 110 35 c 128,-1,14 + 0 145 0 145 0 300 c 128,-1,15 + 0 455 0 455 110 565 c 128,-1,8 + 220 675 220 675 375 675 c 128,-1,9 +529 480 m 2,16,17 + 540 483 540 483 549 474 c 128,-1,18 + 558 465 558 465 555 454 c 2,19,-1 + 483 206 l 2,20,21 + 480 195 480 195 469 192 c 2,22,-1 + 221 120 l 1,23,-1 + 216 120 l 2,24,25 + 206 120 206 120 199 128 c 128,-1,26 + 192 136 192 136 195 146 c 2,27,-1 + 267 394 l 2,28,29 + 270 405 270 405 281 408 c 2,30,-1 + 529 480 l 2,16,17 +246 171 m 1,31,-1 + 447 228 l 1,32,-1 + 303 372 l 1,33,-1 + 246 171 l 1,31,-1 +EndSplineSet +EndChar + +StartChar: glyph83 +Encoding: 82 57426 84 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 139 + 22 + 1 + 0 + 16 + 1 + 9 + 7 + 0 + 9 + 91 + 8 + 1 + 7 + 23 + 11 + 2 + 6 + 5 + 7 + 6 + 91 + 0 + 18 + 0 + 19 + 4 + 18 + 19 + 91 + 10 + 1 + 5 + 24 + 13 + 2 + 4 + 20 + 5 + 4 + 91 + 25 + 1 + 20 + 0 + 21 + 2 + 20 + 21 + 91 + 12 + 1 + 3 + 15 + 1 + 2 + 14 + 3 + 2 + 91 + 17 + 1 + 14 + 1 + 1 + 14 + 79 + 17 + 1 + 14 + 14 + 1 + 83 + 0 + 1 + 14 + 1 + 71 + 79 + 78 + 50 + 50 + 46 + 46 + 1 + 0 + 85 + 83 + 78 + 89 + 79 + 89 + 77 + 75 + 73 + 71 + 68 + 66 + 65 + 63 + 59 + 58 + 57 + 56 + 50 + 53 + 50 + 53 + 52 + 51 + 46 + 49 + 46 + 49 + 48 + 47 + 44 + 43 + 42 + 41 + 35 + 33 + 30 + 28 + 27 + 25 + 22 + 20 + 19 + 17 + 14 + 12 + 9 + 6 + 0 + 39 + 1 + 38 + 26 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +667 675 m 2,0,1 + 719 675 719 675 755.5 638.5 c 128,-1,2 + 792 602 792 602 792 550 c 2,3,-1 + 792 50 l 2,4,5 + 792 -2 792 -2 755.5 -38.5 c 128,-1,6 + 719 -75 719 -75 667 -75 c 2,7,-1 + 208 -75 l 2,8,9 + 156 -75 156 -75 119.5 -38.5 c 128,-1,10 + 83 -2 83 -2 83 50 c 2,11,-1 + 83 92 l 1,12,-1 + 42 92 l 2,13,14 + 25 92 25 92 12.5 104 c 128,-1,15 + 0 116 0 116 0 133 c 128,-1,16 + 0 150 0 150 12.5 162.5 c 128,-1,17 + 25 175 25 175 42 175 c 2,18,-1 + 83 175 l 1,19,-1 + 83 258 l 1,20,-1 + 42 258 l 2,21,22 + 25 258 25 258 12.5 270.5 c 128,-1,23 + 0 283 0 283 0 300 c 128,-1,24 + 0 317 0 317 12.5 329.5 c 128,-1,25 + 25 342 25 342 42 342 c 2,26,-1 + 83 342 l 1,27,-1 + 83 425 l 1,28,-1 + 42 425 l 2,29,30 + 25 425 25 425 12.5 437.5 c 128,-1,31 + 0 450 0 450 0 467 c 128,-1,32 + 0 484 0 484 12.5 496 c 128,-1,33 + 25 508 25 508 42 508 c 2,34,-1 + 83 508 l 1,35,-1 + 83 550 l 2,36,37 + 83 602 83 602 119.5 638.5 c 128,-1,38 + 156 675 156 675 208 675 c 2,39,-1 + 667 675 l 2,0,1 +167 550 m 2,40,-1 + 167 508 l 1,41,-1 + 208 508 l 1,42,-1 + 208 592 l 1,43,44 + 191 592 191 592 179 579.5 c 128,-1,45 + 167 567 167 567 167 550 c 2,40,-1 +167 425 m 1,46,-1 + 167 342 l 1,47,-1 + 208 342 l 1,48,-1 + 208 425 l 1,49,-1 + 167 425 l 1,46,-1 +167 258 m 1,50,-1 + 167 175 l 1,51,-1 + 208 175 l 1,52,-1 + 208 258 l 1,53,-1 + 167 258 l 1,50,-1 +167 50 m 2,54,55 + 167 33 167 33 179 20.5 c 128,-1,56 + 191 8 191 8 208 8 c 1,57,-1 + 208 92 l 1,58,-1 + 167 92 l 1,59,-1 + 167 50 l 2,54,55 +708 50 m 2,60,-1 + 708 550 l 2,61,62 + 708 567 708 567 696 579.5 c 128,-1,63 + 684 592 684 592 667 592 c 2,64,-1 + 250 592 l 1,65,-1 + 250 8 l 1,66,-1 + 667 8 l 2,67,68 + 684 8 684 8 696 20.5 c 128,-1,69 + 708 33 708 33 708 50 c 2,60,-1 +375 362 m 0,70,71 + 375 446 375 446 458 446 c 0,72,73 + 542 446 542 446 542 362 c 0,74,75 + 542 279 542 279 458 279 c 0,76,77 + 375 279 375 279 375 362 c 0,70,71 +458 244 m 0,78,79 + 503 244 503 244 532.5 226 c 128,-1,80 + 562 208 562 208 562 184 c 0,81,82 + 562 172 562 172 532 163 c 128,-1,83 + 502 154 502 154 458 154 c 0,84,85 + 411 154 411 154 382.5 163 c 128,-1,86 + 354 172 354 172 354 184 c 0,87,88 + 354 208 354 208 382.5 226 c 128,-1,89 + 411 244 411 244 458 244 c 0,78,79 +EndSplineSet +EndChar + +StartChar: glyph84 +Encoding: 83 57427 85 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 73 + 8 + 1 + 0 + 0 + 4 + 5 + 0 + 4 + 91 + 9 + 1 + 5 + 0 + 2 + 7 + 5 + 2 + 89 + 0 + 7 + 10 + 1 + 6 + 3 + 7 + 6 + 91 + 0 + 3 + 1 + 1 + 3 + 79 + 0 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 + 37 + 36 + 26 + 26 + 1 + 0 + 41 + 38 + 36 + 43 + 37 + 42 + 26 + 35 + 26 + 35 + 32 + 29 + 24 + 21 + 18 + 17 + 9 + 6 + 0 + 15 + 1 + 14 + 11 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 508 m 2,0,1 + 635 508 635 508 671.5 471.5 c 128,-1,2 + 708 435 708 435 708 383 c 2,3,-1 + 708 92 l 2,4,5 + 708 40 708 40 671.5 3.5 c 128,-1,6 + 635 -33 635 -33 583 -33 c 2,7,-1 + 125 -33 l 2,8,9 + 73 -33 73 -33 36.5 3.5 c 128,-1,10 + 0 40 0 40 0 92 c 2,11,-1 + 0 383 l 2,12,13 + 0 435 0 435 36.5 471.5 c 128,-1,14 + 73 508 73 508 125 508 c 2,15,-1 + 583 508 l 2,0,1 +625 92 m 2,16,-1 + 625 258 l 1,17,-1 + 83 258 l 1,18,-1 + 83 92 l 2,19,20 + 83 75 83 75 95.5 62.5 c 128,-1,21 + 108 50 108 50 125 50 c 2,22,-1 + 583 50 l 2,23,24 + 600 50 600 50 612.5 62.5 c 128,-1,25 + 625 75 625 75 625 92 c 2,16,-1 +625 342 m 1,26,-1 + 625 383 l 2,27,28 + 625 400 625 400 612.5 412.5 c 128,-1,29 + 600 425 600 425 583 425 c 2,30,-1 + 125 425 l 2,31,32 + 108 425 108 425 95.5 412.5 c 128,-1,33 + 83 400 83 400 83 383 c 2,34,-1 + 83 342 l 1,35,-1 + 625 342 l 1,26,-1 +458 133 m 2,36,37 + 438 133 438 133 438 154 c 128,-1,38 + 438 175 438 175 458 175 c 2,39,-1 + 542 175 l 2,40,41 + 562 175 562 175 562 154 c 128,-1,42 + 562 133 562 133 542 133 c 2,43,-1 + 458 133 l 2,36,37 +EndSplineSet +EndChar + +StartChar: glyph85 +Encoding: 85 57429 86 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 43 + 10 + 9 + 6 + 5 + 4 + 1 + 63 + 0 + 1 + 2 + 1 + 107 + 0 + 0 + 0 + 4 + 3 + 0 + 4 + 89 + 0 + 3 + 2 + 2 + 3 + 77 + 0 + 3 + 3 + 2 + 81 + 0 + 2 + 3 + 2 + 69 + 17 + 17 + 20 + 22 + 16 + 5 + 20 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +112 658 m 1,0,-1 + 750 658 l 1,1,-1 + 692 354 l 2,2,3 + 691 346 691 346 638 62 c 1,4,-1 + 296 -58 l 1,5,-1 + 0 62 l 1,6,-1 + 29 221 l 1,7,-1 + 154 221 l 1,8,-1 + 142 154 l 1,9,-1 + 321 83 l 1,10,-1 + 529 154 l 1,11,-1 + 558 304 l 1,12,-1 + 46 304 l 1,13,-1 + 71 438 l 1,14,-1 + 583 438 l 1,15,-1 + 600 525 l 1,16,-1 + 88 525 l 1,17,-1 + 112 658 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph86 +Encoding: 86 57430 87 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 69 + 22 + 18 + 9 + 8 + 4 + 5 + 4 + 23 + 17 + 2 + 3 + 5 + 39 + 36 + 2 + 2 + 3 + 3 + 66 + 0 + 1 + 0 + 4 + 5 + 1 + 4 + 91 + 0 + 5 + 0 + 3 + 2 + 5 + 3 + 91 + 0 + 2 + 0 + 7 + 6 + 2 + 7 + 91 + 0 + 6 + 0 + 0 + 6 + 79 + 0 + 6 + 6 + 0 + 83 + 0 + 0 + 6 + 0 + 71 + 19 + 19 + 19 + 20 + 36 + 18 + 22 + 20 + 8 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 434 m 1,0,-1 + 583 430 l 1,1,-1 + 583 170 l 2,2,3 + 583 49 583 49 498 -36.5 c 128,-1,4 + 413 -122 413 -122 292 -122 c 128,-1,5 + 171 -122 171 -122 85.5 -36.5 c 128,-1,6 + 0 49 0 49 0 170 c 2,7,-1 + 0 430 l 1,8,-1 + 1 434 l 1,9,10 + 6 550 6 550 90.5 630.5 c 128,-1,11 + 175 711 175 711 292 711 c 128,-1,12 + 409 711 409 711 493.5 630.5 c 128,-1,13 + 578 550 578 550 583 434 c 1,0,-1 +292 66 m 128,-1,15 + 360 66 360 66 416.5 103 c 128,-1,16 + 473 140 473 140 500 200 c 1,17,-1 + 500 216 l 1,18,19 + 414 128 414 128 292 128 c 0,20,21 + 169 128 169 128 83 216 c 1,22,-1 + 83 200 l 1,23,24 + 110 140 110 140 167 103 c 128,-1,14 + 224 66 224 66 292 66 c 128,-1,15 +292 628 m 128,-1,26 + 206 628 206 628 144.5 567 c 128,-1,27 + 83 506 83 506 83 420 c 128,-1,28 + 83 334 83 334 144.5 272.5 c 128,-1,29 + 206 211 206 211 292 211 c 128,-1,30 + 378 211 378 211 439 272.5 c 128,-1,31 + 500 334 500 334 500 420 c 128,-1,32 + 500 506 500 506 439 567 c 128,-1,25 + 378 628 378 628 292 628 c 128,-1,26 +292 -39 m 128,-1,34 + 362 -39 362 -39 417 3.5 c 128,-1,35 + 472 46 472 46 491 112 c 1,36,37 + 410 24 410 24 292 24 c 128,-1,38 + 174 24 174 24 93 112 c 1,39,40 + 112 46 112 46 167 3.5 c 128,-1,33 + 222 -39 222 -39 292 -39 c 128,-1,34 +EndSplineSet +EndChar + +StartChar: glyph87 +Encoding: 87 57431 88 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 50 + 35 + 30 + 23 + 16 + 4 + 4 + 3 + 1 + 66 + 5 + 1 + 4 + 3 + 2 + 3 + 4 + 2 + 104 + 0 + 0 + 0 + 3 + 4 + 0 + 3 + 91 + 0 + 2 + 1 + 1 + 2 + 79 + 0 + 2 + 2 + 1 + 83 + 0 + 1 + 2 + 1 + 71 + 36 + 38 + 19 + 19 + 19 + 16 + 6 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 675 m 128,-1,1 + 530 675 530 675 640 565 c 128,-1,2 + 750 455 750 455 750 300 c 128,-1,3 + 750 145 750 145 640 35 c 128,-1,4 + 530 -75 530 -75 375 -75 c 128,-1,5 + 220 -75 220 -75 110 35 c 128,-1,6 + 0 145 0 145 0 300 c 128,-1,7 + 0 455 0 455 110 565 c 128,-1,0 + 220 675 220 675 375 675 c 128,-1,1 +375 8 m 128,-1,9 + 496 8 496 8 581.5 93.5 c 128,-1,10 + 667 179 667 179 667 300 c 128,-1,11 + 667 421 667 421 581.5 506.5 c 128,-1,12 + 496 592 496 592 375 592 c 128,-1,13 + 254 592 254 592 168.5 506.5 c 128,-1,14 + 83 421 83 421 83 300 c 128,-1,15 + 83 179 83 179 168.5 93.5 c 128,-1,8 + 254 8 254 8 375 8 c 128,-1,9 +404 300 m 1,16,-1 + 515 190 l 2,17,18 + 525 180 525 180 519 167 c 128,-1,19 + 513 154 513 154 500 154 c 0,20,21 + 491 154 491 154 485 160 c 2,22,-1 + 375 271 l 1,23,-1 + 265 160 l 2,24,25 + 259 154 259 154 250 154 c 0,26,27 + 237 154 237 154 231 167 c 128,-1,28 + 225 180 225 180 235 190 c 2,29,-1 + 346 300 l 1,30,-1 + 235 410 l 2,31,32 + 221 424 221 424 236 439 c 128,-1,33 + 251 454 251 454 265 440 c 2,34,-1 + 375 329 l 1,35,-1 + 485 440 l 2,36,37 + 499 454 499 454 514 439 c 128,-1,38 + 529 424 529 424 515 410 c 2,39,-1 + 404 300 l 1,16,-1 +EndSplineSet +EndChar + +StartChar: glyph88 +Encoding: 88 57432 89 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 44 + 32 + 23 + 16 + 9 + 4 + 4 + 2 + 1 + 66 + 0 + 0 + 3 + 1 + 2 + 4 + 0 + 2 + 91 + 5 + 1 + 4 + 1 + 1 + 4 + 79 + 5 + 1 + 4 + 4 + 1 + 83 + 0 + 1 + 4 + 1 + 71 + 36 + 41 + 20 + 24 + 19 + 16 + 6 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 633 m 128,-1,1 + 471 633 471 633 569 535.5 c 128,-1,2 + 667 438 667 438 667 300 c 128,-1,3 + 667 162 667 162 569 64.5 c 128,-1,4 + 471 -33 471 -33 333 -33 c 128,-1,5 + 195 -33 195 -33 97.5 64.5 c 128,-1,6 + 0 162 0 162 0 300 c 128,-1,7 + 0 438 0 438 97.5 535.5 c 128,-1,0 + 195 633 195 633 333 633 c 128,-1,1 +488 204 m 2,8,-1 + 392 300 l 1,9,-1 + 488 396 l 2,10,11 + 500 408 500 408 500 425 c 128,-1,12 + 500 442 500 442 488 454 c 128,-1,13 + 476 466 476 466 458.5 466 c 128,-1,14 + 441 466 441 466 429 454 c 2,15,-1 + 333 359 l 1,16,-1 + 238 454 l 2,17,18 + 226 466 226 466 208.5 466 c 128,-1,19 + 191 466 191 466 179 454 c 128,-1,20 + 167 442 167 442 167 425 c 128,-1,21 + 167 408 167 408 179 396 c 2,22,-1 + 274 300 l 1,23,-1 + 179 204 l 2,24,25 + 167 192 167 192 167 175 c 128,-1,26 + 167 158 167 158 179 146 c 0,27,28 + 192 133 192 133 208 133 c 0,29,30 + 225 133 225 133 238 146 c 2,31,-1 + 333 241 l 1,32,-1 + 429 146 l 2,33,34 + 442 133 442 133 458 133 c 0,35,36 + 475 133 475 133 488 146 c 0,37,38 + 500 158 500 158 500 175 c 128,-1,39 + 500 192 500 192 488 204 c 2,8,-1 +EndSplineSet +EndChar + +StartChar: glyph89 +Encoding: 89 57433 90 +Width: 1000 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 105 + 14 + 1 + 0 + 0 + 8 + 10 + 0 + 8 + 91 + 16 + 1 + 10 + 0 + 12 + 13 + 10 + 12 + 89 + 17 + 1 + 13 + 0 + 11 + 9 + 13 + 11 + 91 + 0 + 9 + 6 + 5 + 2 + 1 + 2 + 9 + 1 + 91 + 15 + 7 + 4 + 3 + 2 + 3 + 3 + 2 + 79 + 15 + 7 + 4 + 3 + 2 + 2 + 3 + 83 + 0 + 3 + 2 + 3 + 71 + 68 + 68 + 53 + 52 + 32 + 32 + 1 + 0 + 68 + 71 + 68 + 71 + 70 + 69 + 61 + 58 + 52 + 67 + 53 + 66 + 50 + 47 + 42 + 39 + 32 + 35 + 32 + 35 + 34 + 33 + 25 + 23 + 22 + 20 + 17 + 14 + 11 + 9 + 8 + 6 + 0 + 31 + 1 + 30 + 18 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +875 758 m 2,0,1 + 927 758 927 758 963.5 721.5 c 128,-1,2 + 1000 685 1000 685 1000 633 c 2,3,-1 + 1000 175 l 2,4,5 + 1000 123 1000 123 963.5 86.5 c 128,-1,6 + 927 50 927 50 875 50 c 2,7,-1 + 625 50 l 1,8,-1 + 625 -33 l 1,9,-1 + 750 -33 l 2,10,11 + 767 -33 767 -33 779.5 -45.5 c 128,-1,12 + 792 -58 792 -58 792 -75 c 128,-1,13 + 792 -92 792 -92 779.5 -104.5 c 128,-1,14 + 767 -117 767 -117 750 -117 c 2,15,-1 + 250 -117 l 2,16,17 + 233 -117 233 -117 220.5 -104.5 c 128,-1,18 + 208 -92 208 -92 208 -75 c 128,-1,19 + 208 -58 208 -58 220.5 -45.5 c 128,-1,20 + 233 -33 233 -33 250 -33 c 2,21,-1 + 375 -33 l 1,22,-1 + 375 50 l 1,23,-1 + 125 50 l 2,24,25 + 73 50 73 50 36.5 86.5 c 128,-1,26 + 0 123 0 123 0 175 c 2,27,-1 + 0 633 l 2,28,29 + 0 685 0 685 36.5 721.5 c 128,-1,30 + 73 758 73 758 125 758 c 2,31,-1 + 875 758 l 2,0,1 +583 -33 m 1,32,-1 + 583 50 l 1,33,-1 + 417 50 l 1,34,-1 + 417 -33 l 1,35,-1 + 583 -33 l 1,32,-1 +917 175 m 2,36,-1 + 917 633 l 2,37,38 + 917 650 917 650 904.5 662.5 c 128,-1,39 + 892 675 892 675 875 675 c 2,40,-1 + 125 675 l 2,41,42 + 108 675 108 675 95.5 662.5 c 128,-1,43 + 83 650 83 650 83 633 c 2,44,-1 + 83 175 l 2,45,46 + 83 158 83 158 95.5 145.5 c 128,-1,47 + 108 133 108 133 125 133 c 2,48,-1 + 875 133 l 2,49,50 + 892 133 892 133 904.5 145.5 c 128,-1,51 + 917 158 917 158 917 175 c 2,36,-1 +833 633 m 2,52,53 + 850 633 850 633 862.5 621 c 128,-1,54 + 875 609 875 609 875 592 c 2,55,-1 + 875 258 l 2,56,57 + 875 241 875 241 862.5 229 c 128,-1,58 + 850 217 850 217 833 217 c 2,59,-1 + 167 217 l 2,60,61 + 150 217 150 217 137.5 229 c 128,-1,62 + 125 241 125 241 125 258 c 2,63,-1 + 125 592 l 2,64,65 + 125 609 125 609 137.5 621 c 128,-1,66 + 150 633 150 633 167 633 c 2,67,-1 + 833 633 l 2,52,53 +833 258 m 1,68,-1 + 833 592 l 1,69,-1 + 167 592 l 1,70,-1 + 167 258 l 1,71,-1 + 833 258 l 1,68,-1 +EndSplineSet +EndChar + +StartChar: glyph90 +Encoding: 90 57434 91 +Width: 1000 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 13 + 0 + 2 + 9 + 2 + 1 + 66 + 0 + 1 + 0 + 5 + 3 + 1 + 5 + 91 + 0 + 3 + 0 + 6 + 2 + 3 + 6 + 89 + 10 + 7 + 4 + 3 + 2 + 0 + 9 + 8 + 2 + 9 + 91 + 11 + 1 + 8 + 0 + 0 + 8 + 79 + 11 + 1 + 8 + 8 + 0 + 83 + 0 + 0 + 8 + 0 + 71 + 57 + 56 + 52 + 52 + 63 + 60 + 56 + 67 + 57 + 66 + 52 + 55 + 52 + 55 + 19 + 52 + 19 + 51 + 26 + 59 + 53 + 12 + 22 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +916 131 m 1,0,1 + 952 123 952 123 976 94.5 c 128,-1,2 + 1000 66 1000 66 1000 29 c 0,3,4 + 1000 -14 1000 -14 969.5 -44.5 c 128,-1,5 + 939 -75 939 -75 896 -75 c 2,6,-1 + 104 -75 l 2,7,8 + 61 -75 61 -75 30.5 -44.5 c 128,-1,9 + 0 -14 0 -14 0 29 c 0,10,11 + 0 66 0 66 24 94.5 c 128,-1,12 + 48 123 48 123 84 131 c 1,13,14 + 84 137 84 137 83.5 152 c 128,-1,15 + 83 167 83 167 83 175 c 2,16,-1 + 83 550 l 2,17,18 + 83 602 83 602 119.5 638.5 c 128,-1,19 + 156 675 156 675 208 675 c 2,20,-1 + 792 675 l 2,21,22 + 844 675 844 675 880.5 638.5 c 128,-1,23 + 917 602 917 602 917 550 c 2,24,-1 + 917 175 l 2,25,26 + 917 167 917 167 916.5 152 c 128,-1,27 + 916 137 916 137 916 131 c 1,0,1 +167 550 m 2,28,-1 + 167 175 l 2,29,30 + 167 166 167 166 167.5 152 c 128,-1,31 + 168 138 168 138 168 133 c 1,32,-1 + 208 133 l 1,33,-1 + 208 508 l 2,34,35 + 208 525 208 525 220.5 537.5 c 128,-1,36 + 233 550 233 550 250 550 c 2,37,-1 + 750 550 l 2,38,39 + 767 550 767 550 779.5 537.5 c 128,-1,40 + 792 525 792 525 792 508 c 2,41,-1 + 792 133 l 1,42,-1 + 833 133 l 1,43,-1 + 833 175 l 1,44,-1 + 833 550 l 2,45,46 + 833 567 833 567 821 579.5 c 128,-1,47 + 809 592 809 592 792 592 c 2,48,-1 + 208 592 l 2,49,50 + 191 592 191 592 179 579.5 c 128,-1,51 + 167 567 167 567 167 550 c 2,28,-1 +750 133 m 1,52,-1 + 750 508 l 1,53,-1 + 250 508 l 1,54,-1 + 250 133 l 1,55,-1 + 750 133 l 1,52,-1 +896 8 m 2,56,57 + 904 8 904 8 910.5 14.5 c 128,-1,58 + 917 21 917 21 917 29 c 128,-1,59 + 917 37 917 37 910.5 43.5 c 128,-1,60 + 904 50 904 50 896 50 c 2,61,-1 + 104 50 l 2,62,63 + 96 50 96 50 89.5 43.5 c 128,-1,64 + 83 37 83 37 83 29 c 128,-1,65 + 83 21 83 21 89.5 14.5 c 128,-1,66 + 96 8 96 8 104 8 c 2,67,-1 + 896 8 l 2,56,57 +EndSplineSet +EndChar + +StartChar: glyph91 +Encoding: 91 57435 92 +Width: 542 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 30 +LT +IF +NPUSHB + 51 + 0 + 6 + 5 + 3 + 5 + 6 + 96 + 10 + 1 + 0 + 0 + 2 + 4 + 0 + 2 + 91 + 11 + 1 + 4 + 0 + 8 + 9 + 4 + 8 + 89 + 12 + 1 + 9 + 7 + 1 + 5 + 6 + 9 + 5 + 91 + 0 + 3 + 1 + 1 + 3 + 79 + 0 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 +ELSE +NPUSHB + 52 + 0 + 6 + 5 + 3 + 5 + 6 + 3 + 104 + 10 + 1 + 0 + 0 + 2 + 4 + 0 + 2 + 91 + 11 + 1 + 4 + 0 + 8 + 9 + 4 + 8 + 89 + 12 + 1 + 9 + 7 + 1 + 5 + 6 + 9 + 5 + 91 + 0 + 3 + 1 + 1 + 3 + 79 + 0 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 +EIF +NPUSHB + 34 + 54 + 54 + 33 + 32 + 1 + 0 + 54 + 57 + 54 + 57 + 56 + 55 + 47 + 45 + 43 + 42 + 40 + 38 + 32 + 53 + 33 + 52 + 30 + 27 + 22 + 19 + 9 + 6 + 0 + 15 + 1 + 14 + 13 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +417 675 m 2,0,1 + 469 675 469 675 505.5 638.5 c 128,-1,2 + 542 602 542 602 542 550 c 2,3,-1 + 542 50 l 2,4,5 + 542 -2 542 -2 505.5 -38.5 c 128,-1,6 + 469 -75 469 -75 417 -75 c 2,7,-1 + 125 -75 l 2,8,9 + 73 -75 73 -75 36.5 -38.5 c 128,-1,10 + 0 -2 0 -2 0 50 c 2,11,-1 + 0 550 l 2,12,13 + 0 602 0 602 36.5 638.5 c 128,-1,14 + 73 675 73 675 125 675 c 2,15,-1 + 417 675 l 2,0,1 +458 50 m 2,16,-1 + 458 550 l 2,17,18 + 458 567 458 567 446 579.5 c 128,-1,19 + 434 592 434 592 417 592 c 2,20,-1 + 125 592 l 2,21,22 + 108 592 108 592 95.5 579.5 c 128,-1,23 + 83 567 83 567 83 550 c 2,24,-1 + 83 50 l 2,25,26 + 83 33 83 33 95.5 20.5 c 128,-1,27 + 108 8 108 8 125 8 c 2,28,-1 + 417 8 l 2,29,30 + 434 8 434 8 446 20.5 c 128,-1,31 + 458 33 458 33 458 50 c 2,16,-1 +375 550 m 2,32,33 + 392 550 392 550 404.5 537.5 c 128,-1,34 + 417 525 417 525 417 508 c 2,35,-1 + 417 133 l 2,36,37 + 417 116 417 116 404.5 104 c 128,-1,38 + 392 92 392 92 375 92 c 2,39,-1 + 312 92 l 1,40,41 + 312 75 312 75 300 62.5 c 128,-1,42 + 288 50 288 50 271 50 c 128,-1,43 + 254 50 254 50 241.5 62.5 c 128,-1,44 + 229 75 229 75 229 92 c 1,45,-1 + 167 92 l 2,46,47 + 150 92 150 92 137.5 104 c 128,-1,48 + 125 116 125 116 125 133 c 2,49,-1 + 125 508 l 2,50,51 + 125 525 125 525 137.5 537.5 c 128,-1,52 + 150 550 150 550 167 550 c 2,53,-1 + 375 550 l 2,32,33 +375 133 m 1,54,-1 + 375 508 l 1,55,-1 + 167 508 l 1,56,-1 + 167 133 l 1,57,-1 + 375 133 l 1,54,-1 +EndSplineSet +EndChar + +StartChar: glyph92 +Encoding: 92 57436 93 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 30 +LT +IF +NPUSHB + 51 + 0 + 2 + 1 + 9 + 1 + 2 + 96 + 12 + 1 + 6 + 0 + 8 + 0 + 6 + 8 + 91 + 10 + 1 + 0 + 0 + 4 + 5 + 0 + 4 + 89 + 11 + 1 + 5 + 3 + 1 + 1 + 2 + 5 + 1 + 91 + 0 + 9 + 7 + 7 + 9 + 79 + 0 + 9 + 9 + 7 + 83 + 0 + 7 + 9 + 7 + 71 +ELSE +NPUSHB + 52 + 0 + 2 + 1 + 9 + 1 + 2 + 9 + 104 + 12 + 1 + 6 + 0 + 8 + 0 + 6 + 8 + 91 + 10 + 1 + 0 + 0 + 4 + 5 + 0 + 4 + 89 + 11 + 1 + 5 + 3 + 1 + 1 + 2 + 5 + 1 + 91 + 0 + 9 + 7 + 7 + 9 + 79 + 0 + 9 + 9 + 7 + 83 + 0 + 7 + 9 + 7 + 71 +EIF +NPUSHB + 34 + 27 + 26 + 22 + 22 + 1 + 0 + 56 + 53 + 48 + 45 + 35 + 32 + 26 + 41 + 27 + 40 + 22 + 25 + 22 + 25 + 24 + 23 + 15 + 13 + 11 + 10 + 8 + 6 + 0 + 21 + 1 + 20 + 13 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 633 m 2,0,1 + 559 633 559 633 571 621 c 128,-1,2 + 583 609 583 609 583 592 c 2,3,-1 + 583 92 l 2,4,5 + 583 75 583 75 571 62.5 c 128,-1,6 + 559 50 559 50 542 50 c 2,7,-1 + 396 50 l 1,8,9 + 396 33 396 33 383.5 20.5 c 128,-1,10 + 371 8 371 8 354 8 c 128,-1,11 + 337 8 337 8 324.5 20.5 c 128,-1,12 + 312 33 312 33 312 50 c 1,13,-1 + 167 50 l 2,14,15 + 150 50 150 50 137.5 62.5 c 128,-1,16 + 125 75 125 75 125 92 c 2,17,-1 + 125 592 l 2,18,19 + 125 609 125 609 137.5 621 c 128,-1,20 + 150 633 150 633 167 633 c 2,21,-1 + 542 633 l 2,0,1 +542 92 m 1,22,-1 + 542 592 l 1,23,-1 + 167 592 l 1,24,-1 + 167 92 l 1,25,-1 + 542 92 l 1,22,-1 +583 758 m 2,26,27 + 635 758 635 758 671.5 721.5 c 128,-1,28 + 708 685 708 685 708 633 c 2,29,-1 + 708 8 l 2,30,31 + 708 -44 708 -44 671.5 -80.5 c 128,-1,32 + 635 -117 635 -117 583 -117 c 2,33,-1 + 125 -117 l 2,34,35 + 73 -117 73 -117 36.5 -80.5 c 128,-1,36 + 0 -44 0 -44 0 8 c 2,37,-1 + 0 633 l 2,38,39 + 0 685 0 685 36.5 721.5 c 128,-1,40 + 73 758 73 758 125 758 c 2,41,-1 + 583 758 l 2,26,27 +625 8 m 2,42,-1 + 625 633 l 2,43,44 + 625 650 625 650 612.5 662.5 c 128,-1,45 + 600 675 600 675 583 675 c 2,46,-1 + 125 675 l 2,47,48 + 108 675 108 675 95.5 662.5 c 128,-1,49 + 83 650 83 650 83 633 c 2,50,-1 + 83 8 l 2,51,52 + 83 -9 83 -9 95.5 -21 c 128,-1,53 + 108 -33 108 -33 125 -33 c 2,54,-1 + 583 -33 l 2,55,56 + 600 -33 600 -33 612.5 -21 c 128,-1,57 + 625 -9 625 -9 625 8 c 2,42,-1 +EndSplineSet +EndChar + +StartChar: glyph93 +Encoding: 93 57437 94 +Width: 746 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 17 + 48 + 0 + 2 + 9 + 8 + 16 + 2 + 2 + 7 + 9 + 43 + 15 + 2 + 6 + 7 + 3 + 66 +MPPEM +PUSHB_1 + 15 +LT +IF +NPUSHB + 47 + 0 + 4 + 3 + 3 + 4 + 94 + 0 + 1 + 0 + 1 + 107 + 5 + 1 + 3 + 0 + 8 + 9 + 3 + 8 + 92 + 0 + 9 + 0 + 7 + 6 + 9 + 7 + 91 + 10 + 1 + 6 + 0 + 0 + 6 + 79 + 10 + 1 + 6 + 6 + 0 + 83 + 2 + 1 + 0 + 6 + 0 + 71 +ELSE +NPUSHB + 46 + 0 + 4 + 3 + 4 + 106 + 0 + 1 + 0 + 1 + 107 + 5 + 1 + 3 + 0 + 8 + 9 + 3 + 8 + 92 + 0 + 9 + 0 + 7 + 6 + 9 + 7 + 91 + 10 + 1 + 6 + 0 + 0 + 6 + 79 + 10 + 1 + 6 + 6 + 0 + 83 + 2 + 1 + 0 + 6 + 0 + 71 +EIF +NPUSHB + 20 + 35 + 34 + 60 + 57 + 53 + 50 + 41 + 38 + 34 + 46 + 35 + 45 + 35 + 19 + 40 + 33 + 17 + 38 + 11 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +746 404 m 1,0,-1 + 632 296 l 1,1,-1 + 629 293 l 1,2,3 + 667 250 667 250 667 196 c 0,4,5 + 667 136 667 136 624 93 c 128,-1,6 + 581 50 581 50 521 50 c 2,7,-1 + 408 50 l 1,8,-1 + 375 -117 l 1,9,-1 + 333 -117 l 1,10,-1 + 300 50 l 1,11,-1 + 208 50 l 2,12,13 + 153 50 153 50 114 89 c 2,14,-1 + 7 196 l 1,15,-1 + 84 273 l 1,16,17 + 46 290 46 290 23 325.5 c 128,-1,18 + 0 361 0 361 0 404 c 0,19,20 + 0 464 0 464 43 507 c 128,-1,21 + 86 550 86 550 146 550 c 2,22,-1 + 292 550 l 1,23,-1 + 292 571 l 2,24,25 + 292 596 292 596 310 614.5 c 128,-1,26 + 328 633 328 633 354 633 c 128,-1,27 + 380 633 380 633 398.5 614.5 c 128,-1,28 + 417 596 417 596 417 571 c 2,29,-1 + 417 550 l 1,30,-1 + 538 550 l 2,31,32 + 592 550 592 550 631 513 c 2,33,-1 + 746 404 l 1,0,-1 +521 133 m 2,34,35 + 546 133 546 133 564.5 151.5 c 128,-1,36 + 583 170 583 170 583 196 c 128,-1,37 + 583 222 583 222 564.5 240 c 128,-1,38 + 546 258 546 258 521 258 c 2,39,-1 + 208 258 l 2,40,41 + 187 258 187 258 173 244 c 2,42,-1 + 125 196 l 1,43,-1 + 173 148 l 2,44,45 + 188 133 188 133 208 133 c 2,46,-1 + 521 133 l 2,34,35 +574 356 m 2,47,-1 + 625 404 l 1,48,-1 + 574 452 l 2,49,50 + 559 467 559 467 538 467 c 2,51,-1 + 146 467 l 2,52,53 + 120 467 120 467 101.5 448.5 c 128,-1,54 + 83 430 83 430 83 404 c 0,55,56 + 83 379 83 379 101.5 360.5 c 128,-1,57 + 120 342 120 342 146 342 c 2,58,-1 + 538 342 l 2,59,60 + 560 342 560 342 574 356 c 2,47,-1 +EndSplineSet +EndChar + +StartChar: glyph94 +Encoding: 94 57438 95 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 84 + 0 + 1 + 0 + 2 + 3 + 1 + 2 + 91 + 0 + 3 + 0 + 0 + 9 + 3 + 0 + 91 + 0 + 9 + 13 + 1 + 10 + 11 + 9 + 10 + 91 + 0 + 11 + 12 + 1 + 8 + 5 + 11 + 8 + 91 + 0 + 5 + 0 + 6 + 7 + 5 + 6 + 91 + 0 + 7 + 4 + 4 + 7 + 79 + 0 + 7 + 7 + 4 + 83 + 0 + 4 + 7 + 4 + 71 + 45 + 44 + 34 + 32 + 51 + 48 + 44 + 55 + 45 + 54 + 40 + 37 + 32 + 43 + 34 + 43 + 19 + 19 + 19 + 19 + 19 + 19 + 19 + 16 + 14 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 446 m 128,-1,1 + 323 446 323 446 286.5 482.5 c 128,-1,2 + 250 519 250 519 250 571 c 128,-1,3 + 250 623 250 623 286.5 659.5 c 128,-1,4 + 323 696 323 696 375 696 c 128,-1,5 + 427 696 427 696 463.5 659.5 c 128,-1,6 + 500 623 500 623 500 571 c 128,-1,7 + 500 519 500 519 463.5 482.5 c 128,-1,0 + 427 446 427 446 375 446 c 128,-1,1 +375 612 m 128,-1,9 + 358 612 358 612 345.5 600 c 128,-1,10 + 333 588 333 588 333 571 c 128,-1,11 + 333 554 333 554 345.5 541.5 c 128,-1,12 + 358 529 358 529 375 529 c 128,-1,13 + 392 529 392 529 404.5 541.5 c 128,-1,14 + 417 554 417 554 417 571 c 128,-1,15 + 417 588 417 588 404.5 600 c 128,-1,8 + 392 612 392 612 375 612 c 128,-1,9 +375 -96 m 128,-1,17 + 323 -96 323 -96 286.5 -59.5 c 128,-1,18 + 250 -23 250 -23 250 29 c 128,-1,19 + 250 81 250 81 286.5 117.5 c 128,-1,20 + 323 154 323 154 375 154 c 128,-1,21 + 427 154 427 154 463.5 117.5 c 128,-1,22 + 500 81 500 81 500 29 c 128,-1,23 + 500 -23 500 -23 463.5 -59.5 c 128,-1,16 + 427 -96 427 -96 375 -96 c 128,-1,17 +375 71 m 128,-1,25 + 358 71 358 71 345.5 58.5 c 128,-1,26 + 333 46 333 46 333 29 c 128,-1,27 + 333 12 333 12 345.5 0 c 128,-1,28 + 358 -12 358 -12 375 -12 c 128,-1,29 + 392 -12 392 -12 404.5 0 c 128,-1,30 + 417 12 417 12 417 29 c 128,-1,31 + 417 46 417 46 404.5 58.5 c 128,-1,24 + 392 71 392 71 375 71 c 128,-1,25 +625 175 m 2,32,-1 + 125 175 l 2,33,34 + 73 175 73 175 36.5 211.5 c 128,-1,35 + 0 248 0 248 0 300 c 128,-1,36 + 0 352 0 352 36.5 388.5 c 128,-1,37 + 73 425 73 425 125 425 c 2,38,-1 + 625 425 l 2,39,40 + 677 425 677 425 713.5 388.5 c 128,-1,41 + 750 352 750 352 750 300 c 128,-1,42 + 750 248 750 248 713.5 211.5 c 128,-1,43 + 677 175 677 175 625 175 c 2,32,-1 +125 342 m 2,44,45 + 108 342 108 342 95.5 329.5 c 128,-1,46 + 83 317 83 317 83 300 c 128,-1,47 + 83 283 83 283 95.5 270.5 c 128,-1,48 + 108 258 108 258 125 258 c 2,49,-1 + 625 258 l 2,50,51 + 642 258 642 258 654.5 270.5 c 128,-1,52 + 667 283 667 283 667 300 c 128,-1,53 + 667 317 667 317 654.5 329.5 c 128,-1,54 + 642 342 642 342 625 342 c 2,55,-1 + 125 342 l 2,44,45 +EndSplineSet +EndChar + +StartChar: glyph95 +Encoding: 95 57439 96 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 55 + 0 + 0 + 6 + 1 + 1 + 4 + 0 + 1 + 91 + 0 + 4 + 0 + 5 + 2 + 4 + 5 + 91 + 0 + 2 + 3 + 3 + 2 + 79 + 0 + 2 + 2 + 3 + 83 + 7 + 1 + 3 + 2 + 3 + 71 + 6 + 6 + 0 + 0 + 23 + 20 + 17 + 14 + 6 + 11 + 6 + 10 + 9 + 7 + 0 + 5 + 0 + 4 + 33 + 8 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +240 550 m 128,-1,1 + 240 644 240 644 333 644 c 0,2,3 + 427 644 427 644 427 550 c 128,-1,4 + 427 456 427 456 333 456 c 0,5,0 + 240 456 240 456 240 550 c 128,-1,1 +240 50 m 128,-1,7 + 240 144 240 144 333 144 c 0,8,9 + 427 144 427 144 427 50 c 128,-1,10 + 427 -44 427 -44 333 -44 c 0,11,6 + 240 -44 240 -44 240 50 c 128,-1,7 +0 300 m 128,-1,13 + 0 334 0 334 24 358.5 c 128,-1,14 + 48 383 48 383 83 383 c 2,15,-1 + 583 383 l 2,16,17 + 618 383 618 383 642.5 358.5 c 128,-1,18 + 667 334 667 334 667 300 c 128,-1,19 + 667 266 667 266 642.5 241.5 c 128,-1,20 + 618 217 618 217 583 217 c 2,21,-1 + 83 217 l 2,22,23 + 48 217 48 217 24 241.5 c 128,-1,12 + 0 266 0 266 0 300 c 128,-1,13 +EndSplineSet +EndChar + +StartChar: glyph96 +Encoding: 96 57440 97 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 98 + 47 + 1 + 8 + 11 + 1 + 66 + 0 + 7 + 0 + 11 + 8 + 7 + 11 + 91 + 13 + 1 + 8 + 0 + 10 + 5 + 8 + 10 + 91 + 4 + 12 + 2 + 0 + 3 + 1 + 1 + 2 + 0 + 1 + 91 + 0 + 5 + 0 + 2 + 9 + 5 + 2 + 91 + 14 + 1 + 9 + 6 + 6 + 9 + 79 + 14 + 1 + 9 + 9 + 6 + 83 + 0 + 6 + 9 + 6 + 71 + 53 + 52 + 46 + 46 + 1 + 0 + 63 + 61 + 58 + 56 + 52 + 69 + 53 + 68 + 46 + 51 + 46 + 50 + 44 + 41 + 36 + 33 + 24 + 23 + 20 + 18 + 15 + 13 + 10 + 9 + 6 + 4 + 0 + 27 + 1 + 27 + 15 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +458 300 m 2,0,1 + 475 300 475 300 487.5 287.5 c 128,-1,2 + 500 275 500 275 500 258 c 128,-1,3 + 500 241 500 241 487.5 229 c 128,-1,4 + 475 217 475 217 458 217 c 2,5,-1 + 375 217 l 1,6,-1 + 375 133 l 2,7,8 + 375 116 375 116 362.5 104 c 128,-1,9 + 350 92 350 92 333 92 c 128,-1,10 + 316 92 316 92 304 104 c 128,-1,11 + 292 116 292 116 292 133 c 2,12,-1 + 292 217 l 1,13,-1 + 208 217 l 2,14,15 + 191 217 191 217 179 229 c 128,-1,16 + 167 241 167 241 167 258 c 128,-1,17 + 167 275 167 275 179 287.5 c 128,-1,18 + 191 300 191 300 208 300 c 2,19,-1 + 292 300 l 1,20,-1 + 292 383 l 2,21,22 + 292 400 292 400 304 412.5 c 128,-1,23 + 316 425 316 425 333 425 c 128,-1,24 + 350 425 350 425 362.5 412.5 c 128,-1,25 + 375 400 375 400 375 383 c 2,26,-1 + 375 300 l 1,27,-1 + 458 300 l 2,0,1 +654 496 m 2,28,29 + 667 483 667 483 667 467 c 2,30,-1 + 667 50 l 2,31,32 + 667 -2 667 -2 630.5 -38.5 c 128,-1,33 + 594 -75 594 -75 542 -75 c 2,34,-1 + 125 -75 l 2,35,36 + 73 -75 73 -75 36.5 -38.5 c 128,-1,37 + 0 -2 0 -2 0 50 c 2,38,-1 + 0 550 l 2,39,40 + 0 602 0 602 36.5 638.5 c 128,-1,41 + 73 675 73 675 125 675 c 2,42,-1 + 458 675 l 2,43,44 + 476 675 476 675 488 663 c 2,45,-1 + 654 496 l 2,28,29 +566 467 m 1,46,-1 + 458 574 l 1,47,-1 + 458 529 l 2,48,49 + 458 504 458 504 476.5 485.5 c 128,-1,50 + 495 467 495 467 521 467 c 2,51,-1 + 566 467 l 1,46,-1 +542 8 m 2,52,53 + 559 8 559 8 571 20.5 c 128,-1,54 + 583 33 583 33 583 50 c 2,55,-1 + 583 425 l 1,56,-1 + 521 425 l 2,57,58 + 478 425 478 425 447.5 455.5 c 128,-1,59 + 417 486 417 486 417 529 c 2,60,-1 + 417 592 l 1,61,-1 + 125 592 l 2,62,63 + 108 592 108 592 95.5 579.5 c 128,-1,64 + 83 567 83 567 83 550 c 2,65,-1 + 83 50 l 2,66,67 + 83 33 83 33 95.5 20.5 c 128,-1,68 + 108 8 108 8 125 8 c 2,69,-1 + 542 8 l 2,52,53 +EndSplineSet +EndChar + +StartChar: glyph97 +Encoding: 97 57441 98 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 19 + 1 + 2 + 5 + 1 + 66 + 0 + 1 + 0 + 5 + 2 + 1 + 5 + 91 + 8 + 1 + 2 + 0 + 4 + 7 + 2 + 4 + 91 + 0 + 7 + 10 + 1 + 6 + 3 + 7 + 6 + 91 + 9 + 1 + 3 + 0 + 0 + 3 + 79 + 9 + 1 + 3 + 3 + 0 + 83 + 0 + 0 + 3 + 0 + 71 + 44 + 42 + 25 + 24 + 18 + 18 + 50 + 47 + 42 + 53 + 44 + 53 + 35 + 33 + 30 + 28 + 24 + 41 + 25 + 40 + 18 + 23 + 18 + 22 + 53 + 53 + 11 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +654 496 m 2,0,1 + 667 483 667 483 667 467 c 2,2,-1 + 667 50 l 2,3,4 + 667 -2 667 -2 630.5 -38.5 c 128,-1,5 + 594 -75 594 -75 542 -75 c 2,6,-1 + 125 -75 l 2,7,8 + 73 -75 73 -75 36.5 -38.5 c 128,-1,9 + 0 -2 0 -2 0 50 c 2,10,-1 + 0 550 l 2,11,12 + 0 602 0 602 36.5 638.5 c 128,-1,13 + 73 675 73 675 125 675 c 2,14,-1 + 458 675 l 2,15,16 + 476 675 476 675 488 663 c 2,17,-1 + 654 496 l 2,0,1 +566 467 m 1,18,-1 + 458 574 l 1,19,-1 + 458 529 l 2,20,21 + 458 504 458 504 476.5 485.5 c 128,-1,22 + 495 467 495 467 521 467 c 2,23,-1 + 566 467 l 1,18,-1 +542 8 m 2,24,25 + 559 8 559 8 571 20.5 c 128,-1,26 + 583 33 583 33 583 50 c 2,27,-1 + 583 425 l 1,28,-1 + 521 425 l 2,29,30 + 478 425 478 425 447.5 455.5 c 128,-1,31 + 417 486 417 486 417 529 c 2,32,-1 + 417 592 l 1,33,-1 + 125 592 l 2,34,35 + 108 592 108 592 95.5 579.5 c 128,-1,36 + 83 567 83 567 83 550 c 2,37,-1 + 83 50 l 2,38,39 + 83 33 83 33 95.5 20.5 c 128,-1,40 + 108 8 108 8 125 8 c 2,41,-1 + 542 8 l 2,24,25 +458 217 m 2,42,-1 + 208 217 l 2,43,44 + 191 217 191 217 179 229 c 128,-1,45 + 167 241 167 241 167 258 c 128,-1,46 + 167 275 167 275 179 287.5 c 128,-1,47 + 191 300 191 300 208 300 c 2,48,-1 + 458 300 l 2,49,50 + 475 300 475 300 487.5 287.5 c 128,-1,51 + 500 275 500 275 500 258 c 128,-1,52 + 500 241 500 241 487.5 229 c 128,-1,53 + 475 217 475 217 458 217 c 2,42,-1 +EndSplineSet +EndChar + +StartChar: glyph98 +Encoding: 98 57442 99 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 112 + 0 + 1 + 13 + 1 + 2 + 7 + 1 + 2 + 91 + 0 + 7 + 15 + 1 + 6 + 5 + 7 + 6 + 91 + 0 + 5 + 14 + 1 + 4 + 9 + 5 + 4 + 91 + 0 + 9 + 16 + 1 + 8 + 11 + 9 + 8 + 91 + 0 + 11 + 17 + 1 + 10 + 3 + 11 + 10 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 12 + 1 + 0 + 3 + 0 + 71 + 70 + 68 + 58 + 56 + 46 + 44 + 34 + 32 + 17 + 16 + 2 + 0 + 76 + 73 + 68 + 79 + 70 + 79 + 64 + 61 + 56 + 67 + 58 + 67 + 52 + 49 + 44 + 55 + 46 + 55 + 40 + 37 + 32 + 43 + 34 + 43 + 25 + 22 + 16 + 31 + 17 + 30 + 10 + 7 + 0 + 15 + 2 + 15 + 18 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 -75 m 2,0,-1 + 125 -75 l 2,1,2 + 73 -75 73 -75 36.5 -38.5 c 128,-1,3 + 0 -2 0 -2 0 50 c 2,4,-1 + 0 550 l 2,5,6 + 0 602 0 602 36.5 638.5 c 128,-1,7 + 73 675 73 675 125 675 c 2,8,-1 + 542 675 l 2,9,10 + 594 675 594 675 630.5 638.5 c 128,-1,11 + 667 602 667 602 667 550 c 2,12,-1 + 667 50 l 2,13,14 + 667 -2 667 -2 630.5 -38.5 c 128,-1,15 + 594 -75 594 -75 542 -75 c 2,0,-1 +125 592 m 2,16,17 + 108 592 108 592 95.5 579.5 c 128,-1,18 + 83 567 83 567 83 550 c 2,19,-1 + 83 50 l 2,20,21 + 83 33 83 33 95.5 20.5 c 128,-1,22 + 108 8 108 8 125 8 c 2,23,-1 + 542 8 l 2,24,25 + 559 8 559 8 571 20.5 c 128,-1,26 + 583 33 583 33 583 50 c 2,27,-1 + 583 550 l 2,28,29 + 583 567 583 567 571 579.5 c 128,-1,30 + 559 592 559 592 542 592 c 2,31,-1 + 125 592 l 2,16,17 +500 342 m 2,32,-1 + 167 342 l 2,33,34 + 146 342 146 342 146 362 c 0,35,36 + 146 371 146 371 152 377 c 128,-1,37 + 158 383 158 383 167 383 c 2,38,-1 + 500 383 l 2,39,40 + 509 383 509 383 515 377 c 128,-1,41 + 521 371 521 371 521 362 c 0,42,43 + 521 342 521 342 500 342 c 2,32,-1 +500 467 m 2,44,-1 + 167 467 l 2,45,46 + 158 467 158 467 152 473 c 128,-1,47 + 146 479 146 479 146 488 c 0,48,49 + 146 508 146 508 167 508 c 2,50,-1 + 500 508 l 2,51,52 + 521 508 521 508 521 488 c 0,53,54 + 521 479 521 479 515 473 c 128,-1,55 + 509 467 509 467 500 467 c 2,44,-1 +500 217 m 2,56,-1 + 167 217 l 2,57,58 + 158 217 158 217 152 223 c 128,-1,59 + 146 229 146 229 146 238 c 0,60,61 + 146 258 146 258 167 258 c 2,62,-1 + 500 258 l 2,63,64 + 521 258 521 258 521 238 c 0,65,66 + 521 229 521 229 515 223 c 128,-1,67 + 509 217 509 217 500 217 c 2,56,-1 +500 92 m 2,68,-1 + 167 92 l 2,69,70 + 146 92 146 92 146 112 c 0,71,72 + 146 121 146 121 152 127 c 128,-1,73 + 158 133 158 133 167 133 c 2,74,-1 + 500 133 l 2,75,76 + 509 133 509 133 515 127 c 128,-1,77 + 521 121 521 121 521 112 c 0,78,79 + 521 92 521 92 500 92 c 2,68,-1 +EndSplineSet +EndChar + +StartChar: glyph99 +Encoding: 99 57443 100 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 61 + 19 + 1 + 2 + 5 + 1 + 66 + 0 + 1 + 0 + 5 + 2 + 1 + 5 + 91 + 6 + 1 + 2 + 0 + 4 + 3 + 2 + 4 + 91 + 7 + 1 + 3 + 0 + 0 + 3 + 79 + 7 + 1 + 3 + 3 + 0 + 83 + 0 + 0 + 3 + 0 + 71 + 25 + 24 + 18 + 18 + 35 + 33 + 30 + 28 + 24 + 41 + 25 + 40 + 18 + 23 + 18 + 22 + 53 + 53 + 8 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +654 496 m 2,0,1 + 667 483 667 483 667 467 c 2,2,-1 + 667 50 l 2,3,4 + 667 -2 667 -2 630.5 -38.5 c 128,-1,5 + 594 -75 594 -75 542 -75 c 2,6,-1 + 125 -75 l 2,7,8 + 73 -75 73 -75 36.5 -38.5 c 128,-1,9 + 0 -2 0 -2 0 50 c 2,10,-1 + 0 550 l 2,11,12 + 0 602 0 602 36.5 638.5 c 128,-1,13 + 73 675 73 675 125 675 c 2,14,-1 + 458 675 l 2,15,16 + 476 675 476 675 488 663 c 2,17,-1 + 654 496 l 2,0,1 +566 467 m 1,18,-1 + 458 574 l 1,19,-1 + 458 529 l 2,20,21 + 458 504 458 504 476.5 485.5 c 128,-1,22 + 495 467 495 467 521 467 c 2,23,-1 + 566 467 l 1,18,-1 +542 8 m 2,24,25 + 559 8 559 8 571 20.5 c 128,-1,26 + 583 33 583 33 583 50 c 2,27,-1 + 583 425 l 1,28,-1 + 521 425 l 2,29,30 + 478 425 478 425 447.5 455.5 c 128,-1,31 + 417 486 417 486 417 529 c 2,32,-1 + 417 592 l 1,33,-1 + 125 592 l 2,34,35 + 108 592 108 592 95.5 579.5 c 128,-1,36 + 83 567 83 567 83 550 c 2,37,-1 + 83 50 l 2,38,39 + 83 33 83 33 95.5 20.5 c 128,-1,40 + 108 8 108 8 125 8 c 2,41,-1 + 542 8 l 2,24,25 +EndSplineSet +EndChar + +StartChar: glyph100 +Encoding: 100 57444 101 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 105 + 30 + 23 + 2 + 5 + 6 + 61 + 54 + 2 + 2 + 5 + 71 + 47 + 2 + 1 + 9 + 3 + 66 + 7 + 1 + 5 + 6 + 2 + 6 + 5 + 2 + 104 + 4 + 1 + 2 + 9 + 6 + 2 + 9 + 102 + 13 + 10 + 2 + 9 + 1 + 6 + 9 + 1 + 102 + 0 + 3 + 0 + 6 + 5 + 3 + 6 + 91 + 8 + 1 + 1 + 0 + 11 + 12 + 1 + 11 + 90 + 14 + 1 + 12 + 0 + 0 + 12 + 77 + 14 + 1 + 12 + 12 + 0 + 83 + 0 + 0 + 12 + 0 + 71 + 73 + 73 + 66 + 66 + 73 + 76 + 73 + 76 + 75 + 74 + 66 + 72 + 66 + 72 + 70 + 69 + 18 + 37 + 21 + 28 + 42 + 26 + 36 + 19 + 51 + 15 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +749 92 m 2,0,-1 + 750 -117 l 2,1,2 + 750 -134 750 -134 737.5 -146 c 128,-1,3 + 725 -158 725 -158 708 -158 c 2,4,-1 + 42 -158 l 2,5,6 + 25 -158 25 -158 12.5 -146 c 128,-1,7 + 0 -134 0 -134 0 -117 c 0,8,9 + 0 92 0 92 1 92 c 1,10,11 + 1 101 1 101 2 105 c 2,12,-1 + 86 355 l 2,13,14 + 96 383 96 383 125 383 c 2,15,-1 + 148 383 l 1,16,-1 + 120 412 l 2,17,18 + 83 449 83 449 83 500 c 128,-1,19 + 83 551 83 551 120 588 c 0,20,21 + 145 613 145 613 181 621 c 128,-1,22 + 217 629 217 629 250 618 c 1,23,-1 + 250 675 l 2,24,25 + 250 727 250 727 286.5 763.5 c 128,-1,26 + 323 800 323 800 375 800 c 128,-1,27 + 427 800 427 800 463.5 763.5 c 128,-1,28 + 500 727 500 727 500 675 c 2,29,-1 + 500 618 l 1,30,31 + 533 629 533 629 569 621 c 128,-1,32 + 605 613 605 613 630 588 c 0,33,34 + 667 551 667 551 667 500 c 128,-1,35 + 667 449 667 449 630 412 c 2,36,-1 + 602 383 l 1,37,-1 + 625 383 l 2,38,39 + 654 383 654 383 664 355 c 2,40,-1 + 748 105 l 2,41,42 + 749 101 749 101 749 92 c 2,0,-1 +179 529 m 0,43,44 + 167 517 167 517 167 499.5 c 128,-1,45 + 167 482 167 482 179 470 c 2,46,-1 + 375 275 l 1,47,-1 + 571 471 l 2,48,49 + 583 483 583 483 583 500 c 128,-1,50 + 583 517 583 517 571 529 c 128,-1,51 + 559 541 559 541 541.5 541 c 128,-1,52 + 524 541 524 541 512 529 c 2,53,-1 + 417 434 l 1,54,-1 + 417 675 l 2,55,56 + 417 692 417 692 404.5 704.5 c 128,-1,57 + 392 717 392 717 375 717 c 128,-1,58 + 358 717 358 717 345.5 704.5 c 128,-1,59 + 333 692 333 692 333 675 c 2,60,-1 + 333 434 l 1,61,-1 + 238 529 l 2,62,63 + 225 542 225 542 208 542 c 0,64,65 + 192 542 192 542 179 529 c 0,43,44 +155 300 m 1,66,-1 + 86 92 l 1,67,-1 + 665 92 l 1,68,-1 + 595 300 l 1,69,-1 + 518 300 l 1,70,-1 + 375 158 l 1,71,-1 + 232 300 l 1,72,-1 + 155 300 l 1,66,-1 +667 -75 m 1,73,-1 + 667 50 l 1,74,-1 + 83 50 l 1,75,-1 + 83 -75 l 1,76,-1 + 667 -75 l 1,73,-1 +EndSplineSet +EndChar + +StartChar: glyph101 +Encoding: 101 57445 102 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 19 + 12 + 2 + 6 + 5 + 4 + 1 + 4 + 6 + 2 + 66 + 0 + 1 + 0 + 1 + 106 + 9 + 1 + 5 + 0 + 6 + 0 + 5 + 6 + 104 + 2 + 1 + 0 + 8 + 1 + 6 + 4 + 0 + 6 + 89 + 7 + 1 + 4 + 3 + 3 + 4 + 79 + 7 + 1 + 4 + 4 + 3 + 84 + 0 + 3 + 4 + 3 + 72 + 53 + 51 + 17 + 17 + 19 + 36 + 19 + 52 + 37 + 21 + 40 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +571 492 m 0,0,1 + 583 480 583 480 583 462.5 c 128,-1,2 + 583 445 583 445 571 433 c 2,3,-1 + 375 238 l 1,4,-1 + 179 433 l 2,5,6 + 167 445 167 445 167 462.5 c 128,-1,7 + 167 480 167 480 179 492 c 128,-1,8 + 191 504 191 504 208 504 c 0,9,10 + 226 504 226 504 238 492 c 2,11,-1 + 333 396 l 1,12,-1 + 333 675 l 2,13,14 + 333 692 333 692 345.5 704.5 c 128,-1,15 + 358 717 358 717 375 717 c 128,-1,16 + 392 717 392 717 404.5 704.5 c 128,-1,17 + 417 692 417 692 417 675 c 2,18,-1 + 417 396 l 1,19,-1 + 512 492 l 2,20,21 + 523 503 523 503 542 503 c 0,22,23 + 560 503 560 503 571 492 c 0,0,1 +749 133 m 2,24,-1 + 750 -75 l 2,25,26 + 750 -92 750 -92 737.5 -104.5 c 128,-1,27 + 725 -117 725 -117 708 -117 c 2,28,-1 + 42 -117 l 2,29,30 + 25 -117 25 -117 12.5 -104.5 c 128,-1,31 + 0 -92 0 -92 0 -75 c 0,32,33 + 0 133 0 133 1 133 c 1,34,35 + 1 142 1 142 2 146 c 2,36,-1 + 86 396 l 2,37,38 + 96 425 96 425 125 425 c 2,39,-1 + 134 425 l 1,40,41 + 141 411 141 411 149 403 c 2,42,-1 + 211 342 l 1,43,-1 + 155 342 l 1,44,-1 + 86 133 l 1,45,-1 + 664 133 l 1,46,-1 + 595 342 l 1,47,-1 + 539 342 l 1,48,-1 + 601 403 l 2,49,50 + 609 411 609 411 616 425 c 1,51,-1 + 625 425 l 2,52,53 + 654 425 654 425 664 396 c 2,54,-1 + 748 146 l 2,55,56 + 749 142 749 142 749 133 c 2,24,-1 +EndSplineSet +EndChar + +StartChar: glyph102 +Encoding: 102 57446 103 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 20 + 16 + 15 + 13 + 11 + 9 + 6 + 4 + 3 + 1 + 5 + 40 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +0 262 m 1,0,-1 + 154 383 l 1,1,-1 + 375 246 l 1,2,-1 + 221 117 l 1,3,-1 + 0 262 l 1,0,-1 +221 650 m 1,4,-1 + 375 521 l 1,5,-1 + 154 383 l 1,6,-1 + 0 504 l 1,7,-1 + 221 650 l 1,4,-1 +750 504 m 1,8,-1 + 596 383 l 1,9,-1 + 375 521 l 1,10,-1 + 529 650 l 1,11,-1 + 750 504 l 1,8,-1 +375 246 m 1,12,-1 + 596 383 l 1,13,-1 + 750 262 l 1,14,-1 + 529 117 l 1,15,-1 + 375 246 l 1,12,-1 +375 196 m 1,16,-1 + 529 67 l 1,17,-1 + 596 112 l 1,18,-1 + 596 62 l 1,19,-1 + 375 -71 l 1,20,-1 + 154 62 l 1,21,-1 + 154 112 l 1,22,-1 + 221 67 l 1,23,-1 + 375 196 l 1,16,-1 +EndSplineSet +EndChar + +StartChar: glyph103 +Encoding: 103 57447 104 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 46 + 45 + 2 + 1 + 2 + 44 + 43 + 24 + 3 + 5 + 1 + 30 + 26 + 25 + 23 + 22 + 4 + 6 + 3 + 5 + 3 + 66 + 0 + 2 + 1 + 2 + 106 + 0 + 1 + 0 + 5 + 3 + 1 + 5 + 89 + 0 + 3 + 0 + 4 + 6 + 3 + 4 + 91 + 7 + 1 + 6 + 0 + 0 + 6 + 77 + 7 + 1 + 6 + 6 + 0 + 84 + 0 + 0 + 6 + 0 + 72 + 29 + 29 + 29 + 42 + 29 + 42 + 21 + 37 + 23 + 18 + 37 + 55 + 8 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +773 578 m 2,0,1 + 792 559 792 559 792 534 c 128,-1,2 + 792 509 792 509 773 490 c 2,3,-1 + 625 342 l 1,4,-1 + 625 -33 l 2,5,6 + 625 -50 625 -50 612.5 -62.5 c 128,-1,7 + 600 -75 600 -75 583 -75 c 2,8,-1 + 42 -75 l 2,9,10 + 25 -75 25 -75 12.5 -62.5 c 128,-1,11 + 0 -50 0 -50 0 -33 c 2,12,-1 + 0 508 l 2,13,14 + 0 525 0 525 12.5 537.5 c 128,-1,15 + 25 550 25 550 42 550 c 2,16,-1 + 417 550 l 1,17,-1 + 565 698 l 2,18,19 + 584 717 584 717 609 717 c 128,-1,20 + 634 717 634 717 653 698 c 2,21,-1 + 773 578 l 2,0,1 +354 189 m 1,22,-1 + 616 451 l 1,23,-1 + 526 541 l 1,24,-1 + 264 279 l 1,25,-1 + 354 189 l 1,22,-1 +247 244 m 1,26,-1 + 250 175 l 1,27,-1 + 321 172 l 1,28,-1 + 247 244 l 1,26,-1 +542 8 m 1,29,-1 + 542 258 l 1,30,-1 + 409 130 l 2,31,32 + 393 114 393 114 358.5 103 c 128,-1,33 + 324 92 324 92 294 92 c 2,34,-1 + 167 92 l 1,35,-1 + 167 219 l 2,36,37 + 167 252 167 252 176 285 c 128,-1,38 + 185 318 185 318 201 334 c 2,39,-1 + 333 467 l 1,40,-1 + 83 467 l 1,41,-1 + 83 8 l 1,42,-1 + 542 8 l 1,29,-1 +646 480 m 1,43,-1 + 700 534 l 1,44,-1 + 609 625 l 1,45,-1 + 555 571 l 1,46,-1 + 646 480 l 1,43,-1 +EndSplineSet +EndChar + +StartChar: glyph104 +Encoding: 104 57448 105 +Width: 706 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 0 + 1 + 4 + 5 + 56 + 48 + 19 + 3 + 6 + 8 + 2 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 54 + 0 + 4 + 5 + 8 + 5 + 4 + 8 + 104 + 0 + 8 + 6 + 5 + 8 + 94 + 0 + 2 + 0 + 5 + 4 + 2 + 5 + 91 + 0 + 3 + 0 + 9 + 1 + 3 + 9 + 92 + 0 + 6 + 0 + 1 + 7 + 6 + 1 + 91 + 0 + 7 + 0 + 0 + 7 + 79 + 0 + 7 + 7 + 0 + 83 + 0 + 0 + 7 + 0 + 71 +ELSE +NPUSHB + 55 + 0 + 4 + 5 + 8 + 5 + 4 + 8 + 104 + 0 + 8 + 6 + 5 + 8 + 6 + 102 + 0 + 2 + 0 + 5 + 4 + 2 + 5 + 91 + 0 + 3 + 0 + 9 + 1 + 3 + 9 + 92 + 0 + 6 + 0 + 1 + 7 + 6 + 1 + 91 + 0 + 7 + 0 + 0 + 7 + 79 + 0 + 7 + 7 + 0 + 83 + 0 + 0 + 7 + 0 + 71 +EIF +NPUSHB + 13 + 54 + 53 + 35 + 19 + 19 + 35 + 36 + 37 + 35 + 34 + 37 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +500 444 m 1,0,1 + 591 417 591 417 648.5 342.5 c 128,-1,2 + 706 268 706 268 706 170 c 0,3,4 + 706 50 706 50 619.5 -33.5 c 128,-1,5 + 533 -117 533 -117 411 -117 c 0,6,7 + 313 -117 313 -117 234.5 -58 c 128,-1,8 + 156 1 156 1 128 92 c 1,9,-1 + 83 92 l 2,10,11 + 48 92 48 92 24 116 c 128,-1,12 + 0 140 0 140 0 175 c 2,13,-1 + 0 592 l 1,14,-1 + 417 592 l 2,15,16 + 451 592 451 592 475.5 567.5 c 128,-1,17 + 500 543 500 543 500 508 c 2,18,-1 + 500 444 l 1,0,1 +167 366 m 1,19,-1 + 367 166 l 2,20,21 + 379 154 379 154 396 154 c 0,22,23 + 414 154 414 154 426 166 c 128,-1,24 + 438 178 438 178 438 195.5 c 128,-1,25 + 438 213 438 213 426 225 c 2,26,-1 + 226 425 l 1,27,-1 + 361 425 l 2,28,29 + 378 425 378 425 390 437.5 c 128,-1,30 + 402 450 402 450 402 467 c 128,-1,31 + 402 484 402 484 390 496 c 128,-1,32 + 378 508 378 508 361 508 c 2,33,-1 + 83 508 l 1,34,-1 + 83 231 l 2,35,36 + 83 214 83 214 95.5 201.5 c 128,-1,37 + 108 189 108 189 125 189 c 128,-1,38 + 142 189 142 189 154.5 201.5 c 128,-1,39 + 167 214 167 214 167 231 c 2,40,-1 + 167 366 l 1,19,-1 +417 -35 m 128,-1,42 + 503 -35 503 -35 564 25.5 c 128,-1,43 + 625 86 625 86 625 172 c 128,-1,44 + 625 258 625 258 564 318 c 128,-1,45 + 503 378 503 378 417 378 c 0,46,47 + 387 378 387 378 348 362 c 1,48,-1 + 455 255 l 2,49,50 + 480 230 480 230 480 195.5 c 128,-1,51 + 480 161 480 161 455 137 c 0,52,53 + 430 112 430 112 396 112 c 128,-1,54 + 362 112 362 112 337 137 c 2,55,-1 + 217 257 l 1,56,57 + 208 232 208 232 208 174 c 0,58,59 + 208 88 208 88 269.5 26.5 c 128,-1,41 + 331 -35 331 -35 417 -35 c 128,-1,42 +EndSplineSet +EndChar + +StartChar: glyph105 +Encoding: 105 57449 106 +Width: 646 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 74 + 38 + 1 + 1 + 2 + 1 + 66 + 0 + 8 + 1 + 4 + 1 + 8 + 4 + 104 + 0 + 4 + 7 + 1 + 4 + 7 + 102 + 0 + 7 + 0 + 1 + 7 + 0 + 102 + 9 + 1 + 5 + 0 + 6 + 2 + 5 + 6 + 91 + 0 + 2 + 0 + 1 + 8 + 2 + 1 + 91 + 0 + 0 + 3 + 3 + 0 + 79 + 0 + 0 + 0 + 3 + 83 + 0 + 3 + 0 + 3 + 71 + 46 + 45 + 21 + 36 + 35 + 20 + 20 + 19 + 35 + 35 + 16 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 71 m 128,-1,1 + 452 71 452 71 507 126 c 128,-1,2 + 562 181 562 181 562 258 c 128,-1,3 + 562 335 562 335 507 390.5 c 128,-1,4 + 452 446 452 446 375 446 c 0,5,6 + 358 446 358 446 345.5 458.5 c 128,-1,7 + 333 471 333 471 333 488 c 128,-1,8 + 333 505 333 505 345.5 517 c 128,-1,9 + 358 529 358 529 375 529 c 0,10,11 + 487 529 487 529 566.5 449.5 c 128,-1,12 + 646 370 646 370 646 258 c 128,-1,13 + 646 146 646 146 566.5 67 c 128,-1,14 + 487 -12 487 -12 375 -12 c 128,-1,15 + 263 -12 263 -12 183.5 67 c 128,-1,16 + 104 146 104 146 104 258 c 0,17,18 + 104 275 104 275 116.5 287.5 c 128,-1,19 + 129 300 129 300 146 300 c 128,-1,20 + 163 300 163 300 175.5 287.5 c 128,-1,21 + 188 275 188 275 188 258 c 0,22,23 + 188 181 188 181 243 126 c 128,-1,0 + 298 71 298 71 375 71 c 128,-1,1 +277 633 m 1,24,25 + 294 633 294 633 306.5 621 c 128,-1,26 + 319 609 319 609 319 592 c 128,-1,27 + 319 575 319 575 306.5 562.5 c 128,-1,28 + 294 550 294 550 277 550 c 2,29,-1 + 142 550 l 1,30,-1 + 384 308 l 2,31,32 + 396 296 396 296 396 278.5 c 128,-1,33 + 396 261 396 261 384 249 c 128,-1,34 + 372 237 372 237 354 237 c 0,35,36 + 337 237 337 237 325 249 c 2,37,-1 + 83 491 l 1,38,-1 + 83 356 l 2,39,40 + 83 339 83 339 71 326.5 c 128,-1,41 + 59 314 59 314 42 314 c 128,-1,42 + 25 314 25 314 12.5 326.5 c 128,-1,43 + 0 339 0 339 0 356 c 2,44,-1 + 0 633 l 1,45,-1 + 277 633 l 1,46,-1 + 277 633 l 1,24,25 +EndSplineSet +EndChar + +StartChar: glyph106 +Encoding: 106 57450 107 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 0 + 1 + 9 + 1 + 2 + 3 + 1 + 2 + 91 + 0 + 3 + 8 + 1 + 0 + 5 + 3 + 0 + 91 + 0 + 5 + 11 + 1 + 6 + 7 + 5 + 6 + 91 + 0 + 7 + 4 + 4 + 7 + 79 + 0 + 7 + 7 + 4 + 83 + 10 + 1 + 4 + 7 + 4 + 71 + 37 + 36 + 26 + 24 + 13 + 12 + 2 + 0 + 43 + 40 + 36 + 47 + 37 + 46 + 32 + 29 + 24 + 35 + 26 + 35 + 19 + 16 + 12 + 23 + 13 + 22 + 8 + 5 + 0 + 11 + 2 + 11 + 12 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 300 m 2,0,-1 + 125 300 l 2,1,2 + 73 300 73 300 36.5 336.5 c 128,-1,3 + 0 373 0 373 0 425 c 128,-1,4 + 0 477 0 477 36.5 513.5 c 128,-1,5 + 73 550 73 550 125 550 c 2,6,-1 + 625 550 l 2,7,8 + 677 550 677 550 713.5 513.5 c 128,-1,9 + 750 477 750 477 750 425 c 128,-1,10 + 750 373 750 373 713.5 336.5 c 128,-1,11 + 677 300 677 300 625 300 c 2,0,-1 +125 467 m 2,12,13 + 108 467 108 467 95.5 454.5 c 128,-1,14 + 83 442 83 442 83 425 c 128,-1,15 + 83 408 83 408 95.5 395.5 c 128,-1,16 + 108 383 108 383 125 383 c 2,17,-1 + 625 383 l 2,18,19 + 642 383 642 383 654.5 395.5 c 128,-1,20 + 667 408 667 408 667 425 c 128,-1,21 + 667 442 667 442 654.5 454.5 c 128,-1,22 + 642 467 642 467 625 467 c 2,23,-1 + 125 467 l 2,12,13 +625 8 m 2,24,-1 + 125 8 l 2,25,26 + 73 8 73 8 36.5 44.5 c 128,-1,27 + 0 81 0 81 0 133 c 128,-1,28 + 0 185 0 185 36.5 221.5 c 128,-1,29 + 73 258 73 258 125 258 c 2,30,-1 + 625 258 l 2,31,32 + 677 258 677 258 713.5 221.5 c 128,-1,33 + 750 185 750 185 750 133 c 128,-1,34 + 750 81 750 81 713.5 44.5 c 128,-1,35 + 677 8 677 8 625 8 c 2,24,-1 +125 175 m 2,36,37 + 108 175 108 175 95.5 162.5 c 128,-1,38 + 83 150 83 150 83 133 c 128,-1,39 + 83 116 83 116 95.5 104 c 128,-1,40 + 108 92 108 92 125 92 c 2,41,-1 + 625 92 l 2,42,43 + 642 92 642 92 654.5 104 c 128,-1,44 + 667 116 667 116 667 133 c 128,-1,45 + 667 150 667 150 654.5 162.5 c 128,-1,46 + 642 175 642 175 625 175 c 2,47,-1 + 125 175 l 2,36,37 +EndSplineSet +EndChar + +StartChar: glyph107 +Encoding: 107 57451 108 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 45 + 4 + 1 + 0 + 0 + 1 + 2 + 0 + 1 + 91 + 5 + 1 + 2 + 3 + 3 + 2 + 79 + 5 + 1 + 2 + 2 + 3 + 83 + 0 + 3 + 2 + 3 + 71 + 13 + 12 + 1 + 0 + 20 + 17 + 12 + 24 + 13 + 23 + 7 + 4 + 0 + 11 + 1 + 10 + 6 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 508 m 2,0,1 + 618 508 618 508 642.5 483.5 c 128,-1,2 + 667 459 667 459 667 425 c 128,-1,3 + 667 391 667 391 642.5 366.5 c 128,-1,4 + 618 342 618 342 583 342 c 2,5,-1 + 83 342 l 2,6,7 + 48 342 48 342 24 366 c 128,-1,8 + 0 390 0 390 0 425 c 128,-1,9 + 0 460 0 460 24 484 c 128,-1,10 + 48 508 48 508 83 508 c 2,11,-1 + 583 508 l 2,0,1 +583 217 m 2,12,13 + 618 217 618 217 642.5 192.5 c 128,-1,14 + 667 168 667 168 667 133 c 0,15,16 + 667 99 667 99 642.5 74.5 c 128,-1,17 + 618 50 618 50 583 50 c 2,18,-1 + 83 50 l 2,19,20 + 48 50 48 50 24 74 c 128,-1,21 + 0 98 0 98 0 133 c 128,-1,22 + 0 168 0 168 24.5 192.5 c 128,-1,23 + 49 217 49 217 83 217 c 2,24,-1 + 583 217 l 2,12,13 +EndSplineSet +EndChar + +StartChar: glyph108 +Encoding: 108 57452 109 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 92 + 30 + 1 + 9 + 1 + 26 + 1 + 4 + 3 + 46 + 43 + 42 + 38 + 5 + 5 + 6 + 7 + 3 + 66 + 29 + 1 + 1 + 56 + 1 + 6 + 2 + 65 + 0 + 2 + 1 + 2 + 106 + 0 + 6 + 7 + 5 + 7 + 6 + 5 + 104 + 0 + 1 + 0 + 9 + 8 + 1 + 9 + 89 + 0 + 8 + 0 + 3 + 4 + 8 + 3 + 92 + 0 + 4 + 0 + 7 + 6 + 4 + 7 + 91 + 0 + 5 + 0 + 0 + 5 + 77 + 0 + 5 + 5 + 0 + 83 + 0 + 0 + 5 + 0 + 71 + 65 + 64 + 23 + 19 + 36 + 19 + 38 + 42 + 18 + 37 + 56 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +780 392 m 0,0,1 + 792 380 792 380 792 362.5 c 128,-1,2 + 792 345 792 345 780 333 c 0,3,4 + 727 280 727 280 667 219 c 1,5,-1 + 667 -33 l 2,6,7 + 667 -50 667 -50 654.5 -62.5 c 128,-1,8 + 642 -75 642 -75 625 -75 c 2,9,-1 + 42 -75 l 2,10,11 + 25 -75 25 -75 12.5 -62.5 c 128,-1,12 + 0 -50 0 -50 0 -33 c 2,13,-1 + 0 550 l 2,14,15 + 0 567 0 567 12.5 579.5 c 128,-1,16 + 25 592 25 592 42 592 c 2,17,-1 + 375 592 l 1,18,19 + 375 626 375 626 401 650.5 c 128,-1,20 + 427 675 427 675 464 675 c 128,-1,21 + 501 675 501 675 530 648 c 0,22,23 + 626 546 626 546 780 392 c 0,0,1 +470 136 m 1,24,25 + 675 346 675 346 691 362 c 1,26,27 + 550 505 550 505 471 590 c 1,28,-1 + 464 592 l 1,29,-1 + 458 590 l 1,30,-1 + 458 425 l 1,31,-1 + 417 425 l 2,32,33 + 379 425 379 425 348 412 c 128,-1,34 + 317 399 317 399 296 379 c 128,-1,35 + 275 359 275 359 259 330.5 c 128,-1,36 + 243 302 243 302 234 275 c 128,-1,37 + 225 248 225 248 219 218 c 1,38,39 + 309 299 309 299 417 300 c 2,40,-1 + 458 300 l 1,41,-1 + 458 135 l 1,42,-1 + 464 133 l 1,43,-1 + 470 136 l 1,24,25 +83 8 m 1,44,-1 + 583 8 l 1,45,-1 + 583 193 l 1,46,47 + 534 144 534 144 501 108 c 0,48,49 + 487 92 487 92 464 92 c 0,50,51 + 444 92 444 92 430.5 104 c 128,-1,52 + 417 116 417 116 417 133 c 2,53,-1 + 417 258 l 1,54,55 + 274 255 274 255 167 92 c 1,56,-1 + 167 112 l 2,57,58 + 167 160 167 160 174 207 c 128,-1,59 + 181 254 181 254 199.5 302 c 128,-1,60 + 218 350 218 350 245 386 c 128,-1,61 + 272 422 272 422 316.5 444.5 c 128,-1,62 + 361 467 361 467 417 467 c 1,63,-1 + 417 508 l 1,64,-1 + 83 508 l 1,65,-1 + 83 8 l 1,44,-1 +EndSplineSet +EndChar + +StartChar: glyph109 +Encoding: 109 57453 110 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 13 + 1 + 3 + 0 + 39 + 37 + 2 + 2 + 3 + 2 + 66 + 23 + 1 + 2 + 1 + 65 + 0 + 5 + 0 + 6 + 0 + 5 + 6 + 89 + 0 + 0 + 0 + 3 + 2 + 0 + 3 + 91 + 0 + 1 + 0 + 2 + 7 + 1 + 2 + 91 + 0 + 7 + 4 + 4 + 7 + 77 + 0 + 7 + 7 + 4 + 83 + 8 + 1 + 4 + 7 + 4 + 71 + 25 + 24 + 36 + 35 + 34 + 33 + 32 + 30 + 24 + 43 + 25 + 42 + 19 + 37 + 35 + 21 + 9 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +167 112 m 2,0,1 + 167 160 167 160 174 207 c 128,-1,2 + 181 254 181 254 199.5 302 c 128,-1,3 + 218 350 218 350 245 386 c 128,-1,4 + 272 422 272 422 316.5 444.5 c 128,-1,5 + 361 467 361 467 417 467 c 1,6,-1 + 417 592 l 2,7,8 + 417 609 417 609 430.5 621 c 128,-1,9 + 444 633 444 633 464 633 c 0,10,11 + 486 633 486 633 501 618 c 2,12,-1 + 750 362 l 1,13,14 + 582 193 582 193 501 108 c 0,15,16 + 487 92 487 92 464 92 c 0,17,18 + 444 92 444 92 430.5 104 c 128,-1,19 + 417 116 417 116 417 133 c 2,20,-1 + 417 258 l 1,21,22 + 274 255 274 255 167 92 c 1,23,-1 + 167 112 l 2,0,1 +42 -75 m 2,24,25 + 25 -75 25 -75 12.5 -62.5 c 128,-1,26 + 0 -50 0 -50 0 -33 c 2,27,-1 + 0 550 l 2,28,29 + 0 567 0 567 12.5 579.5 c 128,-1,30 + 25 592 25 592 42 592 c 2,31,-1 + 375 592 l 1,32,-1 + 375 508 l 1,33,-1 + 83 508 l 1,34,-1 + 83 8 l 1,35,-1 + 583 8 l 1,36,-1 + 583 133 l 1,37,38 + 635 187 635 187 667 219 c 1,39,-1 + 667 -33 l 2,40,41 + 667 -50 667 -50 654.5 -62.5 c 128,-1,42 + 642 -75 642 -75 625 -75 c 2,43,-1 + 42 -75 l 2,24,25 +EndSplineSet +EndChar + +StartChar: glyph110 +Encoding: 110 57454 111 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 82 + 32 + 20 + 11 + 4 + 4 + 5 + 4 + 1 + 66 + 10 + 1 + 2 + 0 + 0 + 7 + 2 + 0 + 91 + 0 + 7 + 0 + 8 + 4 + 7 + 8 + 91 + 0 + 4 + 0 + 5 + 9 + 4 + 5 + 91 + 0 + 9 + 0 + 6 + 1 + 9 + 6 + 91 + 0 + 1 + 3 + 3 + 1 + 79 + 0 + 1 + 1 + 3 + 83 + 0 + 3 + 1 + 3 + 71 + 15 + 14 + 60 + 59 + 55 + 54 + 51 + 50 + 47 + 46 + 43 + 42 + 39 + 38 + 27 + 25 + 14 + 37 + 15 + 37 + 22 + 16 + 11 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 425 m 128,-1,1 + 297 425 297 425 238 383 c 0,2,3 + 176 339 176 339 106 258 c 1,4,5 + 174 179 174 179 238 134 c 0,6,7 + 297 92 297 92 375 92 c 128,-1,8 + 453 92 453 92 512 134 c 0,9,10 + 576 179 576 179 644 258 c 1,11,12 + 574 339 574 339 512 383 c 0,13,0 + 453 425 453 425 375 425 c 128,-1,1 +375 508 m 0,14,15 + 481 508 481 508 560 451 c 0,16,17 + 608 417 608 417 655.5 368.5 c 128,-1,18 + 703 320 703 320 726 289 c 2,19,-1 + 750 258 l 1,20,21 + 741 245 741 245 724.5 223.5 c 128,-1,22 + 708 202 708 202 658 150.5 c 128,-1,23 + 608 99 608 99 560 65 c 0,24,25 + 481 8 481 8 375 8 c 0,26,27 + 268 8 268 8 189 65 c 0,28,29 + 141 99 141 99 93.5 147.5 c 128,-1,30 + 46 196 46 196 23 227 c 2,31,-1 + 0 258 l 1,32,33 + 9 271 9 271 25.5 292.5 c 128,-1,34 + 42 314 42 314 91.5 365.5 c 128,-1,35 + 141 417 141 417 189 451 c 0,36,37 + 268 508 268 508 375 508 c 0,14,15 +375 300 m 128,-1,39 + 392 300 392 300 404.5 287.5 c 128,-1,40 + 417 275 417 275 417 258 c 128,-1,41 + 417 241 417 241 404.5 229 c 128,-1,42 + 392 217 392 217 375 217 c 128,-1,43 + 358 217 358 217 345.5 229 c 128,-1,44 + 333 241 333 241 333 258 c 128,-1,45 + 333 275 333 275 345.5 287.5 c 128,-1,38 + 358 300 358 300 375 300 c 128,-1,39 +375 133 m 128,-1,47 + 323 133 323 133 286.5 169.5 c 128,-1,48 + 250 206 250 206 250 258 c 128,-1,49 + 250 310 250 310 286.5 346.5 c 128,-1,50 + 323 383 323 383 375 383 c 128,-1,51 + 427 383 427 383 463.5 346.5 c 128,-1,52 + 500 310 500 310 500 258 c 128,-1,53 + 500 206 500 206 463.5 169.5 c 128,-1,46 + 427 133 427 133 375 133 c 128,-1,47 +375 342 m 128,-1,55 + 341 342 341 342 316.5 317.5 c 128,-1,56 + 292 293 292 293 292 258 c 0,57,58 + 292 224 292 224 316 199.5 c 128,-1,59 + 340 175 340 175 375 175 c 128,-1,60 + 410 175 410 175 434 199.5 c 128,-1,61 + 458 224 458 224 458 258 c 0,62,63 + 458 293 458 293 433.5 317.5 c 128,-1,54 + 409 342 409 342 375 342 c 128,-1,55 +EndSplineSet +EndChar + +StartChar: glyph111 +Encoding: 111 57455 112 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 50 + 0 + 1 + 0 + 3 + 5 + 1 + 3 + 91 + 0 + 5 + 0 + 4 + 2 + 5 + 4 + 91 + 6 + 1 + 2 + 0 + 0 + 2 + 79 + 6 + 1 + 2 + 2 + 0 + 83 + 0 + 0 + 2 + 0 + 71 + 29 + 28 + 48 + 46 + 43 + 42 + 35 + 33 + 28 + 39 + 29 + 39 + 44 + 39 + 7 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +826 282 m 0,0,1 + 843 259 843 259 826 235 c 0,2,3 + 820 226 820 226 798.5 198 c 128,-1,4 + 777 170 777 170 727 118.5 c 128,-1,5 + 677 67 677 67 626 31 c 0,6,7 + 536 -33 536 -33 417 -33 c 0,8,9 + 297 -33 297 -33 207 31 c 0,10,11 + 156 67 156 67 106 118.5 c 128,-1,12 + 56 170 56 170 34.5 198 c 128,-1,13 + 13 226 13 226 7 235 c 0,14,15 + -10 258 -10 258 7 282 c 0,16,17 + 12 291 12 291 34 319 c 128,-1,18 + 56 347 56 347 106 398 c 128,-1,19 + 156 449 156 449 207 485 c 0,20,21 + 298 550 298 550 417 550 c 0,22,23 + 535 550 535 550 626 485 c 0,24,25 + 677 449 677 449 727 398 c 128,-1,26 + 777 347 777 347 799 319 c 128,-1,27 + 821 291 821 291 826 282 c 0,0,1 +417 112 m 0,28,29 + 477 112 477 112 519.5 155 c 128,-1,30 + 562 198 562 198 562 258 c 0,31,32 + 562 319 562 319 519.5 361.5 c 128,-1,33 + 477 404 477 404 417 404 c 0,34,35 + 356 404 356 404 313.5 361.5 c 128,-1,36 + 271 319 271 319 271 258 c 0,37,38 + 271 198 271 198 313.5 155 c 128,-1,39 + 356 112 356 112 417 112 c 0,28,29 +500 258 m 0,40,41 + 500 224 500 224 476 199.5 c 128,-1,42 + 452 175 452 175 417 175 c 128,-1,43 + 382 175 382 175 357.5 199.5 c 128,-1,44 + 333 224 333 224 333 258 c 128,-1,45 + 333 292 333 292 357.5 317 c 128,-1,46 + 382 342 382 342 417 342 c 0,47,48 + 451 342 451 342 475.5 317.5 c 128,-1,49 + 500 293 500 293 500 258 c 0,40,41 +EndSplineSet +EndChar + +StartChar: glyph112 +Encoding: 112 57456 113 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 72 + 51 + 44 + 40 + 33 + 4 + 2 + 5 + 60 + 24 + 2 + 1 + 2 + 63 + 21 + 13 + 6 + 4 + 0 + 1 + 3 + 66 + 42 + 20 + 2 + 5 + 64 + 3 + 1 + 2 + 5 + 1 + 5 + 2 + 1 + 104 + 4 + 1 + 1 + 0 + 5 + 1 + 0 + 102 + 0 + 5 + 2 + 0 + 5 + 79 + 0 + 5 + 5 + 0 + 83 + 0 + 0 + 5 + 0 + 71 + 67 + 66 + 58 + 56 + 49 + 47 + 37 + 35 + 28 + 26 + 25 + 6 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +362 758 m 1,0,1 + 513 730 513 730 610.5 612.5 c 128,-1,2 + 708 495 708 495 708 342 c 0,3,4 + 708 198 708 198 621 84.5 c 128,-1,5 + 534 -29 534 -29 396 -66 c 1,6,-1 + 396 -117 l 2,7,8 + 396 -134 396 -134 383.5 -146 c 128,-1,9 + 371 -158 371 -158 354 -158 c 128,-1,10 + 337 -158 337 -158 324.5 -146 c 128,-1,11 + 312 -134 312 -134 312 -117 c 2,12,-1 + 312 -66 l 1,13,14 + 174 -29 174 -29 87 84.5 c 128,-1,15 + 0 198 0 198 0 342 c 0,16,17 + 0 495 0 495 98 612.5 c 128,-1,18 + 196 730 196 730 347 758 c 1,19,-1 + 354 759 l 1,20,-1 + 362 758 l 1,0,1 +396 21 m 1,21,22 + 496 56 496 56 559 141 c 128,-1,23 + 622 226 622 226 625 333 c 1,24,-1 + 494 202 l 2,25,26 + 488 196 488 196 479 196 c 0,27,28 + 466 196 466 196 460 208 c 128,-1,29 + 454 220 454 220 464 231 c 2,30,-1 + 621 388 l 1,31,32 + 612 449 612 449 585 501 c 1,33,-1 + 494 410 l 2,34,35 + 488 404 488 404 479 404 c 0,36,37 + 466 404 466 404 460 417 c 128,-1,38 + 454 430 454 430 464 440 c 2,39,-1 + 562 538 l 1,40,41 + 485 647 485 647 354 674 c 1,42,43 + 223 647 223 647 146 538 c 1,44,-1 + 244 440 l 2,45,46 + 254 430 254 430 248 417 c 128,-1,47 + 242 404 242 404 229 404 c 0,48,49 + 220 404 220 404 214 410 c 2,50,-1 + 123 501 l 1,51,52 + 96 449 96 449 87 388 c 1,53,-1 + 244 231 l 2,54,55 + 254 220 254 220 248 208 c 128,-1,56 + 242 196 242 196 229 196 c 0,57,58 + 220 196 220 196 214 202 c 2,59,-1 + 84 333 l 1,60,61 + 87 226 87 226 149.5 141 c 128,-1,62 + 212 56 212 56 312 21 c 1,63,-1 + 312 508 l 2,64,65 + 312 525 312 525 324.5 537.5 c 128,-1,66 + 337 550 337 550 354 550 c 128,-1,67 + 371 550 371 550 383.5 537.5 c 128,-1,68 + 396 525 396 525 396 508 c 2,69,-1 + 396 21 l 1,21,22 +EndSplineSet +EndChar + +StartChar: glyph113 +Encoding: 113 57457 114 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 179 + 8 + 33 + 2 + 4 + 12 + 1 + 10 + 9 + 4 + 10 + 91 + 0 + 9 + 0 + 11 + 13 + 9 + 11 + 89 + 34 + 31 + 2 + 13 + 30 + 1 + 14 + 0 + 13 + 14 + 91 + 0 + 0 + 0 + 2 + 15 + 0 + 2 + 89 + 29 + 1 + 15 + 28 + 1 + 16 + 17 + 15 + 16 + 91 + 27 + 1 + 17 + 26 + 1 + 18 + 3 + 17 + 18 + 91 + 32 + 1 + 3 + 0 + 1 + 19 + 3 + 1 + 89 + 25 + 1 + 19 + 24 + 1 + 20 + 22 + 19 + 20 + 91 + 0 + 22 + 0 + 6 + 21 + 22 + 6 + 89 + 23 + 1 + 21 + 5 + 5 + 21 + 79 + 23 + 1 + 21 + 21 + 5 + 83 + 7 + 1 + 5 + 21 + 5 + 71 + 32 + 32 + 9 + 8 + 4 + 4 + 32 + 103 + 32 + 103 + 100 + 99 + 98 + 97 + 94 + 93 + 92 + 91 + 88 + 87 + 86 + 85 + 82 + 81 + 78 + 76 + 75 + 74 + 73 + 71 + 68 + 67 + 64 + 63 + 62 + 61 + 58 + 57 + 56 + 55 + 52 + 51 + 50 + 49 + 46 + 45 + 42 + 40 + 39 + 38 + 37 + 35 + 30 + 29 + 28 + 26 + 21 + 19 + 18 + 17 + 16 + 14 + 8 + 31 + 9 + 31 + 4 + 7 + 4 + 7 + 18 + 17 + 16 + 35 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +167 467 m 1,0,-1 + 500 467 l 1,1,-1 + 500 175 l 1,2,-1 + 167 175 l 1,3,-1 + 167 467 l 1,0,-1 +458 217 m 1,4,-1 + 458 425 l 1,5,-1 + 208 425 l 1,6,-1 + 208 217 l 1,7,-1 + 458 217 l 1,4,-1 +542 717 m 2,8,9 + 594 717 594 717 630.5 680.5 c 128,-1,10 + 667 644 667 644 667 592 c 2,11,-1 + 667 50 l 2,12,13 + 667 -2 667 -2 630.5 -38.5 c 128,-1,14 + 594 -75 594 -75 542 -75 c 2,15,-1 + 417 -75 l 1,16,-1 + 417 8 l 1,17,-1 + 250 8 l 1,18,-1 + 250 -75 l 1,19,-1 + 125 -75 l 2,20,21 + 73 -75 73 -75 36.5 -38.5 c 128,-1,22 + 0 -2 0 -2 0 50 c 2,23,-1 + 0 592 l 2,24,25 + 0 644 0 644 36.5 680.5 c 128,-1,26 + 73 717 73 717 125 717 c 2,27,-1 + 250 717 l 1,28,-1 + 250 633 l 1,29,-1 + 417 633 l 1,30,-1 + 417 717 l 1,31,-1 + 542 717 l 2,8,9 +583 550 m 1,32,-1 + 583 592 l 2,33,34 + 583 609 583 609 571 621 c 128,-1,35 + 559 633 559 633 542 633 c 2,36,-1 + 500 633 l 1,37,-1 + 500 550 l 1,38,-1 + 167 550 l 1,39,-1 + 167 633 l 1,40,-1 + 125 633 l 2,41,42 + 108 633 108 633 95.5 621 c 128,-1,43 + 83 609 83 609 83 592 c 2,44,-1 + 83 550 l 1,45,46 + 100 550 100 550 112.5 537.5 c 128,-1,47 + 125 525 125 525 125 508 c 128,-1,48 + 125 491 125 491 112.5 479 c 128,-1,49 + 100 467 100 467 83 467 c 1,50,-1 + 83 425 l 1,51,52 + 100 425 100 425 112.5 412.5 c 128,-1,53 + 125 400 125 400 125 383 c 128,-1,54 + 125 366 125 366 112.5 354 c 128,-1,55 + 100 342 100 342 83 342 c 1,56,-1 + 83 300 l 1,57,58 + 100 300 100 300 112.5 287.5 c 128,-1,59 + 125 275 125 275 125 258 c 128,-1,60 + 125 241 125 241 112.5 229 c 128,-1,61 + 100 217 100 217 83 217 c 1,62,-1 + 83 175 l 1,63,64 + 100 175 100 175 112.5 162.5 c 128,-1,65 + 125 150 125 150 125 133 c 128,-1,66 + 125 116 125 116 112.5 104 c 128,-1,67 + 100 92 100 92 83 92 c 1,68,-1 + 83 50 l 2,69,70 + 83 33 83 33 95.5 20.5 c 128,-1,71 + 108 8 108 8 125 8 c 2,72,-1 + 167 8 l 1,73,-1 + 167 92 l 1,74,-1 + 500 92 l 1,75,-1 + 500 8 l 1,76,-1 + 542 8 l 2,77,78 + 559 8 559 8 571 20.5 c 128,-1,79 + 583 33 583 33 583 50 c 2,80,-1 + 583 92 l 1,81,82 + 566 92 566 92 554 104 c 128,-1,83 + 542 116 542 116 542 133 c 128,-1,84 + 542 150 542 150 554 162.5 c 128,-1,85 + 566 175 566 175 583 175 c 1,86,-1 + 583 217 l 1,87,88 + 566 217 566 217 554 229 c 128,-1,89 + 542 241 542 241 542 258 c 128,-1,90 + 542 275 542 275 554 287.5 c 128,-1,91 + 566 300 566 300 583 300 c 1,92,-1 + 583 342 l 1,93,94 + 566 342 566 342 554 354 c 128,-1,95 + 542 366 542 366 542 383 c 128,-1,96 + 542 400 542 400 554 412.5 c 128,-1,97 + 566 425 566 425 583 425 c 1,98,-1 + 583 467 l 1,99,100 + 566 467 566 467 554 479 c 128,-1,101 + 542 491 542 491 542 508 c 128,-1,102 + 542 525 542 525 554 537.5 c 128,-1,103 + 566 550 566 550 583 550 c 1,32,-1 +EndSplineSet +EndChar + +StartChar: glyph114 +Encoding: 114 57458 115 +Width: 671 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 9 + 8 + 2 + 0 + 63 + 1 + 1 + 0 + 0 + 97 + 1 + 0 + 0 + 17 + 1 + 16 + 2 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +627 550 m 2,0,1 + 662 550 662 550 669.5 533.5 c 128,-1,2 + 677 517 677 517 652 492 c 2,3,-1 + 477 317 l 2,4,5 + 453 293 453 293 436 257 c 128,-1,6 + 419 221 419 221 419 196 c 2,7,-1 + 419 50 l 1,8,-1 + 252 -33 l 1,9,-1 + 252 175 l 2,10,11 + 252 210 252 210 235.5 251 c 128,-1,12 + 219 292 219 292 194 317 c 2,13,-1 + 19 492 l 2,14,15 + -6 517 -6 517 1.5 533.5 c 128,-1,16 + 9 550 9 550 44 550 c 2,17,-1 + 627 550 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph115 +Encoding: 115 57459 116 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 76 + 52 + 45 + 38 + 37 + 31 + 30 + 6 + 7 + 4 + 53 + 44 + 2 + 1 + 8 + 12 + 1 + 0 + 6 + 3 + 66 + 0 + 2 + 0 + 2 + 107 + 0 + 3 + 0 + 5 + 4 + 3 + 5 + 91 + 0 + 4 + 0 + 7 + 8 + 4 + 7 + 91 + 0 + 8 + 0 + 1 + 6 + 8 + 1 + 91 + 0 + 6 + 0 + 0 + 6 + 79 + 0 + 6 + 6 + 0 + 83 + 0 + 0 + 6 + 0 + 71 + 38 + 35 + 29 + 18 + 18 + 22 + 20 + 18 + 23 + 9 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +512 611 m 0,0,1 + 532 631 532 631 557.5 619.5 c 128,-1,2 + 583 608 583 608 583 582 c 2,3,-1 + 583 248 l 2,4,5 + 583 231 583 231 571 219 c 0,6,7 + 507 155 507 155 416.5 155 c 128,-1,8 + 326 155 326 155 262 219 c 0,9,10 + 225 256 225 256 174 259 c 128,-1,11 + 123 262 123 262 83 230 c 1,12,-1 + 83 40 l 2,13,14 + 83 23 83 23 71 10.5 c 128,-1,15 + 59 -2 59 -2 42 -2 c 128,-1,16 + 25 -2 25 -2 12.5 10.5 c 128,-1,17 + 0 23 0 23 0 40 c 2,18,-1 + 0 582 l 2,19,20 + 0 599 0 599 12 611 c 0,21,22 + 76 675 76 675 166.5 675 c 128,-1,23 + 257 675 257 675 321 611 c 0,24,25 + 361 571 361 571 416.5 571 c 128,-1,26 + 472 571 472 571 512 611 c 0,0,1 +262 552 m 0,27,28 + 225 589 225 589 174 592 c 128,-1,29 + 123 595 123 595 83 563 c 1,30,-1 + 83 468 l 1,31,32 + 137 494 137 494 199.5 484 c 128,-1,33 + 262 474 262 474 306 430 c 0,34,35 + 345 391 345 391 400 385 c 128,-1,36 + 455 379 455 379 500 408 c 1,37,-1 + 500 505 l 1,38,39 + 442 480 442 480 375.5 492.5 c 128,-1,40 + 309 505 309 505 262 552 c 0,27,28 +321 278 m 0,41,42 + 358 241 358 241 409 238 c 128,-1,43 + 460 235 460 235 500 267 c 1,44,-1 + 500 362 l 1,45,46 + 457 342 457 342 417 342 c 0,47,48 + 337 342 337 342 277 400 c 0,49,50 + 238 439 238 439 183 444.5 c 128,-1,51 + 128 450 128 450 83 421 c 1,52,-1 + 83 325 l 1,53,54 + 125 342 125 342 167 342 c 0,55,56 + 257 342 257 342 321 278 c 0,41,42 +EndSplineSet +EndChar + +StartChar: glyph116 +Encoding: 116 57460 117 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 42 + 12 + 1 + 0 + 1 + 1 + 66 + 0 + 2 + 0 + 2 + 107 + 0 + 4 + 1 + 0 + 4 + 79 + 0 + 3 + 0 + 1 + 0 + 3 + 1 + 91 + 0 + 4 + 4 + 0 + 83 + 0 + 0 + 4 + 0 + 71 + 18 + 22 + 20 + 18 + 23 + 5 + 20 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +512 611 m 0,0,1 + 532 631 532 631 557.5 619.5 c 128,-1,2 + 583 608 583 608 583 582 c 2,3,-1 + 583 248 l 2,4,5 + 583 231 583 231 571 219 c 0,6,7 + 507 155 507 155 416.5 155 c 128,-1,8 + 326 155 326 155 262 219 c 0,9,10 + 225 256 225 256 174 259 c 128,-1,11 + 123 262 123 262 83 230 c 1,12,-1 + 83 40 l 2,13,14 + 83 23 83 23 71 10.5 c 128,-1,15 + 59 -2 59 -2 42 -2 c 128,-1,16 + 25 -2 25 -2 12.5 10.5 c 128,-1,17 + 0 23 0 23 0 40 c 2,18,-1 + 0 582 l 2,19,20 + 0 599 0 599 12 611 c 0,21,22 + 76 675 76 675 166.5 675 c 128,-1,23 + 257 675 257 675 321 611 c 0,24,25 + 361 571 361 571 416.5 571 c 128,-1,26 + 472 571 472 571 512 611 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph117 +Encoding: 117 57461 118 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 34 + 24 + 13 + 6 + 5 + 4 + 3 + 2 + 1 + 0 + 9 + 1 + 0 + 1 + 66 + 2 + 1 + 0 + 1 + 0 + 106 + 0 + 1 + 1 + 97 + 8 + 7 + 21 + 19 + 7 + 30 + 8 + 30 + 3 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +396 633 m 1024,0,-1 +396 633 m 1,1,-1 + 83 338 l 1,2,-1 + 292 217 l 1,3,-1 + 188 -33 l 1,4,-1 + 500 263 l 1,5,-1 + 292 383 l 1,6,-1 + 396 633 l 1,1,-1 +396 717 m 0,7,8 + 430 717 430 717 454.5 692.5 c 128,-1,9 + 479 668 479 668 479 633 c 0,10,11 + 479 616 479 616 471 598 c 2,12,-1 + 397 419 l 1,13,-1 + 542 335 l 2,14,15 + 577 315 577 315 582.5 273.5 c 128,-1,16 + 588 232 588 232 557 202 c 2,17,-1 + 245 -94 l 2,18,19 + 220 -117 220 -117 187 -117 c 0,20,21 + 142 -117 142 -117 118 -79 c 128,-1,22 + 94 -41 94 -41 111 -1 c 2,23,-1 + 187 181 l 1,24,-1 + 42 265 l 2,25,26 + 7 285 7 285 1 326 c 128,-1,27 + -5 367 -5 367 26 398 c 2,28,-1 + 338 694 l 2,29,30 + 363 717 363 717 396 717 c 0,7,8 +EndSplineSet +EndChar + +StartChar: glyph118 +Encoding: 118 57462 119 +Width: 500 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 20 + 23 + 10 + 2 + 0 + 1 + 1 + 66 + 0 + 1 + 0 + 1 + 106 + 0 + 0 + 0 + 97 + 41 + 37 + 2 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +479 299 m 2,0,1 + 497 289 497 289 499.5 268 c 128,-1,2 + 502 247 502 247 487 232 c 2,3,-1 + 174 -64 l 2,4,5 + 163 -75 163 -75 146 -75 c 0,6,7 + 124 -75 124 -75 111.5 -56 c 128,-1,8 + 99 -37 99 -37 107 -17 c 2,9,-1 + 197 199 l 1,10,-1 + 21 301 l 2,11,12 + 4 311 4 311 1 332 c 128,-1,13 + -2 353 -2 353 13 368 c 2,14,-1 + 326 664 l 2,15,16 + 339 675 339 675 354 675 c 0,17,18 + 371 675 371 675 383.5 662.5 c 128,-1,19 + 396 650 396 650 396 633 c 0,20,21 + 396 623 396 623 392 615 c 2,22,-1 + 303 401 l 1,23,-1 + 479 299 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph119 +Encoding: 119 57463 120 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 120 + 24 + 13 + 2 + 5 + 12 + 43 + 1 + 7 + 4 + 2 + 66 + 0 + 12 + 11 + 5 + 11 + 12 + 5 + 104 + 0 + 3 + 0 + 11 + 12 + 3 + 11 + 91 + 0 + 5 + 0 + 9 + 4 + 5 + 9 + 91 + 0 + 4 + 0 + 7 + 10 + 4 + 7 + 91 + 0 + 10 + 0 + 6 + 0 + 10 + 6 + 91 + 15 + 1 + 0 + 0 + 14 + 8 + 0 + 14 + 91 + 0 + 8 + 0 + 2 + 13 + 8 + 2 + 91 + 0 + 13 + 1 + 1 + 13 + 79 + 0 + 13 + 13 + 1 + 83 + 0 + 1 + 13 + 1 + 71 + 1 + 0 + 72 + 71 + 68 + 67 + 64 + 63 + 60 + 59 + 56 + 55 + 52 + 51 + 48 + 46 + 42 + 40 + 38 + 36 + 33 + 31 + 29 + 27 + 19 + 18 + 10 + 8 + 6 + 4 + 0 + 50 + 1 + 50 + 16 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 133 m 0,0,1 + 594 133 594 133 630.5 96.5 c 128,-1,2 + 667 60 667 60 667 8 c 128,-1,3 + 667 -44 667 -44 630.5 -80.5 c 128,-1,4 + 594 -117 594 -117 542 -117 c 0,5,6 + 502 -117 502 -117 469.5 -93.5 c 128,-1,7 + 437 -70 437 -70 424 -33 c 1,8,-1 + 292 -33 l 2,9,10 + 206 -33 206 -33 144.5 28 c 128,-1,11 + 83 89 83 89 83 175 c 2,12,-1 + 83 474 l 1,13,14 + 47 487 47 487 23.5 519.5 c 128,-1,15 + 0 552 0 552 0 592 c 0,16,17 + 0 644 0 644 36.5 680.5 c 128,-1,18 + 73 717 73 717 125 717 c 128,-1,19 + 177 717 177 717 213.5 680.5 c 128,-1,20 + 250 644 250 644 250 592 c 0,21,22 + 250 552 250 552 226.5 519.5 c 128,-1,23 + 203 487 203 487 167 474 c 1,24,-1 + 167 467 l 2,25,26 + 167 415 167 415 203.5 378.5 c 128,-1,27 + 240 342 240 342 292 342 c 2,28,-1 + 424 342 l 1,29,30 + 437 378 437 378 469.5 401.5 c 128,-1,31 + 502 425 502 425 542 425 c 0,32,33 + 594 425 594 425 630.5 388.5 c 128,-1,34 + 667 352 667 352 667 300 c 128,-1,35 + 667 248 667 248 630.5 211.5 c 128,-1,36 + 594 175 594 175 542 175 c 0,37,38 + 502 175 502 175 469.5 198.5 c 128,-1,39 + 437 222 437 222 424 258 c 1,40,-1 + 292 258 l 2,41,42 + 225 258 225 258 167 301 c 1,43,-1 + 167 175 l 2,44,45 + 167 123 167 123 203.5 86.5 c 128,-1,46 + 240 50 240 50 292 50 c 2,47,-1 + 424 50 l 1,48,49 + 437 86 437 86 469.5 109.5 c 128,-1,50 + 502 133 502 133 542 133 c 0,0,1 +542 342 m 128,-1,52 + 525 342 525 342 512.5 329.5 c 128,-1,53 + 500 317 500 317 500 300 c 128,-1,54 + 500 283 500 283 512.5 270.5 c 128,-1,55 + 525 258 525 258 542 258 c 128,-1,56 + 559 258 559 258 571 270.5 c 128,-1,57 + 583 283 583 283 583 300 c 128,-1,58 + 583 317 583 317 571 329.5 c 128,-1,51 + 559 342 559 342 542 342 c 128,-1,52 +125 633 m 128,-1,60 + 108 633 108 633 95.5 621 c 128,-1,61 + 83 609 83 609 83 592 c 128,-1,62 + 83 575 83 575 95.5 562.5 c 128,-1,63 + 108 550 108 550 125 550 c 128,-1,64 + 142 550 142 550 154.5 562.5 c 128,-1,65 + 167 575 167 575 167 592 c 128,-1,66 + 167 609 167 609 154.5 621 c 128,-1,59 + 142 633 142 633 125 633 c 128,-1,60 +542 -33 m 128,-1,68 + 559 -33 559 -33 571 -21 c 128,-1,69 + 583 -9 583 -9 583 8 c 128,-1,70 + 583 25 583 25 571 37.5 c 128,-1,71 + 559 50 559 50 542 50 c 128,-1,72 + 525 50 525 50 512.5 37.5 c 128,-1,73 + 500 25 500 25 500 8 c 128,-1,74 + 500 -9 500 -9 512.5 -21 c 128,-1,67 + 525 -33 525 -33 542 -33 c 128,-1,68 +EndSplineSet +EndChar + +StartChar: glyph120 +Encoding: 120 57464 121 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 91 + 53 + 42 + 2 + 4 + 10 + 17 + 1 + 1 + 4 + 34 + 23 + 11 + 0 + 4 + 8 + 1 + 3 + 66 + 0 + 10 + 9 + 4 + 9 + 10 + 4 + 104 + 12 + 1 + 8 + 1 + 7 + 1 + 8 + 7 + 104 + 0 + 5 + 0 + 9 + 10 + 5 + 9 + 91 + 6 + 1 + 4 + 2 + 1 + 1 + 8 + 4 + 1 + 91 + 11 + 1 + 7 + 0 + 0 + 7 + 79 + 11 + 1 + 7 + 7 + 0 + 83 + 3 + 1 + 0 + 7 + 0 + 71 + 82 + 81 + 78 + 77 + 74 + 73 + 70 + 69 + 19 + 19 + 40 + 24 + 40 + 24 + 34 + 40 + 21 + 13 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 126 m 1,0,1 + 620 113 620 113 643.5 80.5 c 128,-1,2 + 667 48 667 48 667 8 c 0,3,4 + 667 -44 667 -44 630.5 -80.5 c 128,-1,5 + 594 -117 594 -117 542 -117 c 128,-1,6 + 490 -117 490 -117 453.5 -80.5 c 128,-1,7 + 417 -44 417 -44 417 8 c 0,8,9 + 417 48 417 48 440.5 80.5 c 128,-1,10 + 464 113 464 113 500 126 c 1,11,-1 + 500 203 l 2,12,13 + 500 228 500 228 482 246.5 c 128,-1,14 + 464 265 464 265 438 265 c 0,15,16 + 375 265 375 265 333 309 c 1,17,18 + 291 265 291 265 229 265 c 0,19,20 + 204 265 204 265 185.5 246.5 c 128,-1,21 + 167 228 167 228 167 203 c 2,22,-1 + 167 126 l 1,23,24 + 203 113 203 113 226.5 80.5 c 128,-1,25 + 250 48 250 48 250 8 c 0,26,27 + 250 -44 250 -44 213.5 -80.5 c 128,-1,28 + 177 -117 177 -117 125 -117 c 128,-1,29 + 73 -117 73 -117 36.5 -80.5 c 128,-1,30 + 0 -44 0 -44 0 8 c 0,31,32 + 0 48 0 48 23.5 80.5 c 128,-1,33 + 47 113 47 113 83 126 c 1,34,-1 + 83 203 l 2,35,36 + 83 263 83 263 126 306 c 128,-1,37 + 169 349 169 349 229 349 c 0,38,39 + 255 349 255 349 273.5 367.5 c 128,-1,40 + 292 386 292 386 292 411 c 2,41,-1 + 292 474 l 1,42,43 + 255 487 255 487 231.5 519.5 c 128,-1,44 + 208 552 208 552 208 592 c 0,45,46 + 208 644 208 644 244.5 680.5 c 128,-1,47 + 281 717 281 717 333 717 c 128,-1,48 + 385 717 385 717 421.5 680.5 c 128,-1,49 + 458 644 458 644 458 592 c 0,50,51 + 458 552 458 552 434.5 519.5 c 128,-1,52 + 411 487 411 487 375 474 c 1,53,-1 + 375 411 l 2,54,55 + 375 386 375 386 393.5 367.5 c 128,-1,56 + 412 349 412 349 438 349 c 0,57,58 + 498 349 498 349 540.5 306 c 128,-1,59 + 583 263 583 263 583 203 c 2,60,-1 + 583 126 l 1,0,1 +125 -33 m 128,-1,62 + 142 -33 142 -33 154.5 -21 c 128,-1,63 + 167 -9 167 -9 167 8 c 128,-1,64 + 167 25 167 25 154.5 37.5 c 128,-1,65 + 142 50 142 50 125 50 c 128,-1,66 + 108 50 108 50 95.5 37.5 c 128,-1,67 + 83 25 83 25 83 8 c 128,-1,68 + 83 -9 83 -9 95.5 -21 c 128,-1,61 + 108 -33 108 -33 125 -33 c 128,-1,62 +333 633 m 128,-1,70 + 316 633 316 633 304 621 c 128,-1,71 + 292 609 292 609 292 592 c 128,-1,72 + 292 575 292 575 304 562.5 c 128,-1,73 + 316 550 316 550 333 550 c 128,-1,74 + 350 550 350 550 362.5 562.5 c 128,-1,75 + 375 575 375 575 375 592 c 128,-1,76 + 375 609 375 609 362.5 621 c 128,-1,69 + 350 633 350 633 333 633 c 128,-1,70 +542 -33 m 128,-1,78 + 559 -33 559 -33 571 -21 c 128,-1,79 + 583 -9 583 -9 583 8 c 128,-1,80 + 583 25 583 25 571 37.5 c 128,-1,81 + 559 50 559 50 542 50 c 128,-1,82 + 525 50 525 50 512.5 37.5 c 128,-1,83 + 500 25 500 25 500 8 c 128,-1,84 + 500 -9 500 -9 512.5 -21 c 128,-1,77 + 525 -33 525 -33 542 -33 c 128,-1,78 +EndSplineSet +EndChar + +StartChar: glyph121 +Encoding: 121 57465 122 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 69 + 56 + 55 + 44 + 43 + 23 + 12 + 11 + 0 + 8 + 5 + 3 + 1 + 66 + 7 + 1 + 1 + 8 + 1 + 2 + 3 + 1 + 2 + 91 + 9 + 1 + 3 + 11 + 1 + 5 + 4 + 3 + 5 + 91 + 10 + 1 + 4 + 0 + 0 + 4 + 79 + 10 + 1 + 4 + 4 + 0 + 83 + 6 + 1 + 0 + 4 + 0 + 71 + 77 + 76 + 73 + 72 + 69 + 68 + 18 + 27 + 28 + 19 + 19 + 19 + 22 + 27 + 21 + 12 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 126 m 1,0,1 + 620 113 620 113 643.5 80.5 c 128,-1,2 + 667 48 667 48 667 8 c 0,3,4 + 667 -44 667 -44 630.5 -80.5 c 128,-1,5 + 594 -117 594 -117 542 -117 c 128,-1,6 + 490 -117 490 -117 453.5 -80.5 c 128,-1,7 + 417 -44 417 -44 417 8 c 0,8,9 + 417 48 417 48 440.5 80.5 c 128,-1,10 + 464 113 464 113 500 126 c 1,11,-1 + 500 474 l 1,12,13 + 464 487 464 487 440.5 519.5 c 128,-1,14 + 417 552 417 552 417 592 c 0,15,16 + 417 644 417 644 453.5 680.5 c 128,-1,17 + 490 717 490 717 542 717 c 128,-1,18 + 594 717 594 717 630.5 680.5 c 128,-1,19 + 667 644 667 644 667 592 c 0,20,21 + 667 552 667 552 643.5 519.5 c 128,-1,22 + 620 487 620 487 583 474 c 1,23,-1 + 583 126 l 1,0,1 +542 633 m 128,-1,25 + 525 633 525 633 512.5 621 c 128,-1,26 + 500 609 500 609 500 592 c 128,-1,27 + 500 575 500 575 512.5 562.5 c 128,-1,28 + 525 550 525 550 542 550 c 128,-1,29 + 559 550 559 550 571 562.5 c 128,-1,30 + 583 575 583 575 583 592 c 128,-1,31 + 583 609 583 609 571 621 c 128,-1,24 + 559 633 559 633 542 633 c 128,-1,25 +542 -33 m 128,-1,33 + 559 -33 559 -33 571 -21 c 128,-1,34 + 583 -9 583 -9 583 8 c 128,-1,35 + 583 25 583 25 571 37.5 c 128,-1,36 + 559 50 559 50 542 50 c 128,-1,37 + 525 50 525 50 512.5 37.5 c 128,-1,38 + 500 25 500 25 500 8 c 128,-1,39 + 500 -9 500 -9 512.5 -21 c 128,-1,32 + 525 -33 525 -33 542 -33 c 128,-1,33 +250 592 m 0,40,41 + 250 552 250 552 226.5 519.5 c 128,-1,42 + 203 487 203 487 167 474 c 1,43,-1 + 167 126 l 1,44,45 + 203 113 203 113 226.5 80.5 c 128,-1,46 + 250 48 250 48 250 8 c 0,47,48 + 250 -44 250 -44 213.5 -80.5 c 128,-1,49 + 177 -117 177 -117 125 -117 c 128,-1,50 + 73 -117 73 -117 36.5 -80.5 c 128,-1,51 + 0 -44 0 -44 0 8 c 0,52,53 + 0 48 0 48 23.5 80.5 c 128,-1,54 + 47 113 47 113 83 126 c 1,55,-1 + 83 474 l 1,56,57 + 47 487 47 487 23.5 519.5 c 128,-1,58 + 0 552 0 552 0 592 c 0,59,60 + 0 644 0 644 36.5 680.5 c 128,-1,61 + 73 717 73 717 125 717 c 128,-1,62 + 177 717 177 717 213.5 680.5 c 128,-1,63 + 250 644 250 644 250 592 c 0,40,41 +125 633 m 128,-1,65 + 108 633 108 633 95.5 621 c 128,-1,66 + 83 609 83 609 83 592 c 128,-1,67 + 83 575 83 575 95.5 562.5 c 128,-1,68 + 108 550 108 550 125 550 c 128,-1,69 + 142 550 142 550 154.5 562.5 c 128,-1,70 + 167 575 167 575 167 592 c 128,-1,71 + 167 609 167 609 154.5 621 c 128,-1,64 + 142 633 142 633 125 633 c 128,-1,65 +125 -33 m 128,-1,73 + 142 -33 142 -33 154.5 -21 c 128,-1,74 + 167 -9 167 -9 167 8 c 128,-1,75 + 167 25 167 25 154.5 37.5 c 128,-1,76 + 142 50 142 50 125 50 c 128,-1,77 + 108 50 108 50 95.5 37.5 c 128,-1,78 + 83 25 83 25 83 8 c 128,-1,79 + 83 -9 83 -9 95.5 -21 c 128,-1,72 + 108 -33 108 -33 125 -33 c 128,-1,73 +EndSplineSet +EndChar + +StartChar: glyph122 +Encoding: 122 57466 123 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 89 + 82 + 43 + 38 + 27 + 4 + 9 + 5 + 41 + 14 + 2 + 7 + 9 + 65 + 16 + 11 + 0 + 4 + 2 + 7 + 3 + 66 + 8 + 1 + 3 + 10 + 1 + 4 + 5 + 3 + 4 + 91 + 0 + 9 + 0 + 7 + 2 + 9 + 7 + 91 + 11 + 1 + 5 + 13 + 1 + 2 + 1 + 5 + 2 + 91 + 12 + 1 + 1 + 0 + 0 + 1 + 79 + 12 + 1 + 1 + 1 + 0 + 83 + 6 + 1 + 0 + 1 + 0 + 71 + 101 + 100 + 97 + 96 + 93 + 92 + 89 + 88 + 86 + 84 + 23 + 39 + 24 + 19 + 29 + 24 + 19 + 29 + 21 + 14 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +167 126 m 1,0,1 + 203 113 203 113 226.5 80.5 c 128,-1,2 + 250 48 250 48 250 8 c 0,3,4 + 250 -44 250 -44 213.5 -80.5 c 128,-1,5 + 177 -117 177 -117 125 -117 c 128,-1,6 + 73 -117 73 -117 36.5 -80.5 c 128,-1,7 + 0 -44 0 -44 0 8 c 0,8,9 + 0 48 0 48 23.5 80.5 c 128,-1,10 + 47 113 47 113 83 126 c 1,11,-1 + 83 154 l 2,12,13 + 83 232 83 232 144 287 c 1,14,15 + 183 255 183 255 220 239 c 1,16,17 + 167 208 167 208 167 154 c 2,18,-1 + 167 126 l 1,0,1 +125 -33 m 128,-1,20 + 142 -33 142 -33 154.5 -21 c 128,-1,21 + 167 -9 167 -9 167 8 c 128,-1,22 + 167 25 167 25 154.5 37.5 c 128,-1,23 + 142 50 142 50 125 50 c 128,-1,24 + 108 50 108 50 95.5 37.5 c 128,-1,25 + 83 25 83 25 83 8 c 128,-1,26 + 83 -9 83 -9 95.5 -21 c 128,-1,19 + 108 -33 108 -33 125 -33 c 128,-1,20 +500 474 m 1,27,28 + 464 487 464 487 440.5 519.5 c 128,-1,29 + 417 552 417 552 417 592 c 0,30,31 + 417 644 417 644 453.5 680.5 c 128,-1,32 + 490 717 490 717 542 717 c 128,-1,33 + 594 717 594 717 630.5 680.5 c 128,-1,34 + 667 644 667 644 667 592 c 0,35,36 + 667 552 667 552 643.5 519.5 c 128,-1,37 + 620 487 620 487 583 474 c 1,38,-1 + 583 460 l 2,39,40 + 583 376 583 376 520 316 c 1,41,42 + 485 345 485 345 444 361 c 1,43,44 + 500 396 500 396 500 460 c 2,45,-1 + 500 474 l 1,27,28 +542 633 m 128,-1,47 + 525 633 525 633 512.5 621 c 128,-1,48 + 500 609 500 609 500 592 c 128,-1,49 + 500 575 500 575 512.5 562.5 c 128,-1,50 + 525 550 525 550 542 550 c 128,-1,51 + 559 550 559 550 571 562.5 c 128,-1,52 + 583 575 583 575 583 592 c 128,-1,53 + 583 609 583 609 571 621 c 128,-1,46 + 559 633 559 633 542 633 c 128,-1,47 +581 126 m 1,54,55 + 619 114 619 114 643 81.5 c 128,-1,56 + 667 49 667 49 667 8 c 0,57,58 + 667 -44 667 -44 630.5 -80.5 c 128,-1,59 + 594 -117 594 -117 542 -117 c 128,-1,60 + 490 -117 490 -117 453.5 -80.5 c 128,-1,61 + 417 -44 417 -44 417 8 c 0,62,63 + 417 47 417 47 439 79 c 128,-1,64 + 461 111 461 111 497 125 c 1,65,66 + 486 182 486 182 439.5 220 c 128,-1,67 + 393 258 393 258 333 258 c 0,68,69 + 239 258 239 258 169 320 c 128,-1,70 + 99 382 99 382 86 474 c 1,71,72 + 48 486 48 486 24 518.5 c 128,-1,73 + 0 551 0 551 0 592 c 0,74,75 + 0 644 0 644 36.5 680.5 c 128,-1,76 + 73 717 73 717 125 717 c 128,-1,77 + 177 717 177 717 213.5 680.5 c 128,-1,78 + 250 644 250 644 250 592 c 0,79,80 + 250 553 250 553 228 521 c 128,-1,81 + 206 489 206 489 170 475 c 1,82,83 + 181 418 181 418 227 380 c 128,-1,84 + 273 342 273 342 333 342 c 0,85,86 + 427 342 427 342 497.5 279.5 c 128,-1,87 + 568 217 568 217 581 126 c 1,54,55 +125 633 m 128,-1,89 + 108 633 108 633 95.5 621 c 128,-1,90 + 83 609 83 609 83 592 c 128,-1,91 + 83 575 83 575 95.5 562.5 c 128,-1,92 + 108 550 108 550 125 550 c 128,-1,93 + 142 550 142 550 154.5 562.5 c 128,-1,94 + 167 575 167 575 167 592 c 128,-1,95 + 167 609 167 609 154.5 621 c 128,-1,88 + 142 633 142 633 125 633 c 128,-1,89 +542 -33 m 128,-1,97 + 559 -33 559 -33 571 -21 c 128,-1,98 + 583 -9 583 -9 583 8 c 128,-1,99 + 583 25 583 25 571 37.5 c 128,-1,100 + 559 50 559 50 542 50 c 128,-1,101 + 525 50 525 50 512.5 37.5 c 128,-1,102 + 500 25 500 25 500 8 c 128,-1,103 + 500 -9 500 -9 512.5 -21 c 128,-1,96 + 525 -33 525 -33 542 -33 c 128,-1,97 +EndSplineSet +EndChar + +StartChar: glyph123 +Encoding: 123 57467 124 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 109 + 0 + 2 + 0 + 7 + 0 + 2 + 7 + 91 + 16 + 1 + 0 + 0 + 6 + 5 + 0 + 6 + 91 + 9 + 1 + 4 + 10 + 5 + 4 + 79 + 14 + 18 + 2 + 10 + 13 + 1 + 11 + 12 + 10 + 11 + 91 + 15 + 8 + 2 + 5 + 0 + 12 + 3 + 5 + 12 + 91 + 17 + 1 + 3 + 1 + 1 + 3 + 79 + 17 + 1 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 + 56 + 55 + 21 + 20 + 1 + 0 + 79 + 78 + 75 + 73 + 70 + 68 + 65 + 64 + 61 + 59 + 55 + 82 + 56 + 82 + 50 + 48 + 45 + 43 + 40 + 38 + 36 + 33 + 31 + 29 + 26 + 24 + 20 + 54 + 21 + 53 + 17 + 14 + 9 + 6 + 0 + 19 + 1 + 19 + 19 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 550 m 2,0,1 + 677 550 677 550 713.5 513.5 c 128,-1,2 + 750 477 750 477 750 425 c 2,3,-1 + 750 92 l 2,4,5 + 750 40 750 40 713.5 3.5 c 128,-1,6 + 677 -33 677 -33 625 -33 c 2,7,-1 + 125 -33 l 2,8,9 + 73 -33 73 -33 36.5 3.5 c 128,-1,10 + 0 40 0 40 0 92 c 2,11,-1 + 0 508 l 2,12,13 + 0 560 0 560 36.5 596.5 c 128,-1,14 + 73 633 73 633 125 633 c 2,15,-1 + 292 633 l 2,16,17 + 326 633 326 633 350.5 608.5 c 128,-1,18 + 375 584 375 584 375 550 c 1,19,-1 + 625 550 l 2,0,1 +625 50 m 2,20,21 + 642 50 642 50 654.5 62.5 c 128,-1,22 + 667 75 667 75 667 92 c 2,23,-1 + 667 383 l 1,24,-1 + 500 383 l 2,25,26 + 492 383 492 383 485.5 389.5 c 128,-1,27 + 479 396 479 396 479 404 c 128,-1,28 + 479 412 479 412 485.5 418.5 c 128,-1,29 + 492 425 492 425 500 425 c 2,30,-1 + 667 425 l 1,31,32 + 667 442 667 442 654.5 454.5 c 128,-1,33 + 642 467 642 467 625 467 c 2,34,-1 + 375 467 l 2,35,36 + 340 467 340 467 316 491.5 c 128,-1,37 + 292 516 292 516 292 550 c 1,38,-1 + 125 550 l 2,39,40 + 108 550 108 550 95.5 537.5 c 128,-1,41 + 83 525 83 525 83 508 c 2,42,-1 + 83 425 l 1,43,-1 + 250 425 l 2,44,45 + 258 425 258 425 264.5 418.5 c 128,-1,46 + 271 412 271 412 271 404 c 128,-1,47 + 271 396 271 396 264.5 389.5 c 128,-1,48 + 258 383 258 383 250 383 c 2,49,-1 + 83 383 l 1,50,-1 + 83 92 l 2,51,52 + 83 75 83 75 95.5 62.5 c 128,-1,53 + 108 50 108 50 125 50 c 2,54,-1 + 625 50 l 2,20,21 +500 300 m 2,55,56 + 517 300 517 300 529.5 287.5 c 128,-1,57 + 542 275 542 275 542 258 c 128,-1,58 + 542 241 542 241 529.5 229 c 128,-1,59 + 517 217 517 217 500 217 c 2,60,-1 + 417 217 l 1,61,-1 + 417 133 l 2,62,63 + 417 116 417 116 404.5 104 c 128,-1,64 + 392 92 392 92 375 92 c 128,-1,65 + 358 92 358 92 345.5 104 c 128,-1,66 + 333 116 333 116 333 133 c 2,67,-1 + 333 217 l 1,68,-1 + 250 217 l 2,69,70 + 233 217 233 217 220.5 229 c 128,-1,71 + 208 241 208 241 208 258 c 128,-1,72 + 208 275 208 275 220.5 287.5 c 128,-1,73 + 233 300 233 300 250 300 c 2,74,-1 + 333 300 l 1,75,-1 + 333 383 l 2,76,77 + 333 400 333 400 345.5 412.5 c 128,-1,78 + 358 425 358 425 375 425 c 128,-1,79 + 392 425 392 425 404.5 412.5 c 128,-1,80 + 417 400 417 400 417 383 c 2,81,-1 + 417 300 l 1,82,-1 + 500 300 l 2,55,56 +EndSplineSet +EndChar + +StartChar: glyph124 +Encoding: 124 57468 125 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 91 + 0 + 2 + 11 + 1 + 3 + 0 + 2 + 3 + 91 + 10 + 1 + 0 + 0 + 5 + 4 + 0 + 5 + 91 + 0 + 4 + 0 + 7 + 9 + 4 + 7 + 89 + 0 + 9 + 13 + 1 + 8 + 6 + 9 + 8 + 91 + 12 + 1 + 6 + 1 + 1 + 6 + 79 + 12 + 1 + 6 + 6 + 1 + 83 + 0 + 1 + 6 + 1 + 71 + 45 + 43 + 34 + 33 + 21 + 20 + 1 + 0 + 51 + 48 + 43 + 54 + 45 + 54 + 38 + 37 + 33 + 42 + 34 + 41 + 30 + 27 + 25 + 24 + 20 + 32 + 21 + 32 + 17 + 14 + 9 + 6 + 0 + 19 + 1 + 19 + 14 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 550 m 2,0,1 + 677 550 677 550 713.5 513.5 c 128,-1,2 + 750 477 750 477 750 425 c 2,3,-1 + 750 92 l 2,4,5 + 750 40 750 40 713.5 3.5 c 128,-1,6 + 677 -33 677 -33 625 -33 c 2,7,-1 + 125 -33 l 2,8,9 + 73 -33 73 -33 36.5 3.5 c 128,-1,10 + 0 40 0 40 0 92 c 2,11,-1 + 0 508 l 2,12,13 + 0 560 0 560 36.5 596.5 c 128,-1,14 + 73 633 73 633 125 633 c 2,15,-1 + 292 633 l 2,16,17 + 326 633 326 633 350.5 608.5 c 128,-1,18 + 375 584 375 584 375 550 c 1,19,-1 + 625 550 l 2,0,1 +125 550 m 2,20,21 + 108 550 108 550 95.5 537.5 c 128,-1,22 + 83 525 83 525 83 508 c 2,23,-1 + 83 425 l 1,24,-1 + 667 425 l 1,25,26 + 667 442 667 442 654.5 454.5 c 128,-1,27 + 642 467 642 467 625 467 c 2,28,-1 + 375 467 l 2,29,30 + 340 467 340 467 316 491.5 c 128,-1,31 + 292 516 292 516 292 550 c 1,32,-1 + 125 550 l 2,20,21 +625 50 m 2,33,34 + 642 50 642 50 654.5 62.5 c 128,-1,35 + 667 75 667 75 667 92 c 2,36,-1 + 667 383 l 1,37,-1 + 83 383 l 1,38,-1 + 83 92 l 2,39,40 + 83 75 83 75 95.5 62.5 c 128,-1,41 + 108 50 108 50 125 50 c 2,42,-1 + 625 50 l 2,33,34 +500 217 m 2,43,-1 + 250 217 l 2,44,45 + 233 217 233 217 220.5 229 c 128,-1,46 + 208 241 208 241 208 258 c 128,-1,47 + 208 275 208 275 220.5 287.5 c 128,-1,48 + 233 300 233 300 250 300 c 2,49,-1 + 500 300 l 2,50,51 + 517 300 517 300 529.5 287.5 c 128,-1,52 + 542 275 542 275 542 258 c 128,-1,53 + 542 241 542 241 529.5 229 c 128,-1,54 + 517 217 517 217 500 217 c 2,43,-1 +EndSplineSet +EndChar + +StartChar: glyph125 +Encoding: 125 57469 126 +Width: 876 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_8 + 50 + 46 + 25 + 3 + 8 + 7 + 1 + 66 +MPPEM +PUSHB_1 + 30 +LT +IF +NPUSHB + 48 + 9 + 1 + 0 + 5 + 4 + 4 + 0 + 96 + 0 + 2 + 0 + 6 + 3 + 2 + 6 + 91 + 0 + 3 + 0 + 5 + 0 + 3 + 5 + 91 + 0 + 4 + 0 + 7 + 8 + 4 + 7 + 92 + 0 + 8 + 1 + 1 + 8 + 79 + 0 + 8 + 8 + 1 + 83 + 0 + 1 + 8 + 1 + 71 +ELSE +NPUSHB + 49 + 9 + 1 + 0 + 5 + 4 + 5 + 0 + 4 + 104 + 0 + 2 + 0 + 6 + 3 + 2 + 6 + 91 + 0 + 3 + 0 + 5 + 0 + 3 + 5 + 91 + 0 + 4 + 0 + 7 + 8 + 4 + 7 + 92 + 0 + 8 + 1 + 1 + 8 + 79 + 0 + 8 + 8 + 1 + 83 + 0 + 1 + 8 + 1 + 71 +EIF +NPUSHB + 24 + 1 + 0 + 53 + 51 + 44 + 42 + 39 + 37 + 35 + 32 + 30 + 28 + 21 + 19 + 17 + 14 + 9 + 6 + 0 + 23 + 1 + 23 + 10 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +846 467 m 2,0,1 + 862 467 862 467 870 455.5 c 128,-1,2 + 878 444 878 444 875 425 c 2,3,-1 + 783 92 l 2,4,5 + 770 39 770 39 724.5 3 c 128,-1,6 + 679 -33 679 -33 625 -33 c 2,7,-1 + 125 -33 l 2,8,9 + 72 -33 72 -33 36 3 c 128,-1,10 + 0 39 0 39 0 92 c 2,11,-1 + 0 508 l 2,12,13 + 0 561 0 561 36 597 c 128,-1,14 + 72 633 72 633 125 633 c 2,15,-1 + 296 633 l 2,16,17 + 330 633 330 633 354.5 608.5 c 128,-1,18 + 379 584 379 584 379 550 c 1,19,-1 + 629 550 l 2,20,21 + 669 550 669 550 701 527.5 c 128,-1,22 + 733 505 733 505 746 467 c 1,23,-1 + 846 467 l 2,0,1 +83 508 m 2,24,-1 + 83 121 l 1,25,-1 + 150 383 l 2,26,27 + 156 402 156 402 170.5 413.5 c 128,-1,28 + 185 425 185 425 204 425 c 2,29,-1 + 667 425 l 1,30,31 + 667 444 667 444 655.5 455.5 c 128,-1,32 + 644 467 644 467 625 467 c 2,33,-1 + 375 467 l 2,34,35 + 340 467 340 467 316 491.5 c 128,-1,36 + 292 516 292 516 292 550 c 1,37,-1 + 125 550 l 2,38,39 + 106 550 106 550 94.5 538.5 c 128,-1,40 + 83 527 83 527 83 508 c 2,24,-1 +704 112 m 2,41,-1 + 779 383 l 1,42,-1 + 208 383 l 2,43,44 + 205 383 205 383 200.5 380.5 c 128,-1,45 + 196 378 196 378 196 375 c 2,46,-1 + 117 83 l 2,47,48 + 114 71 114 71 115.5 63.5 c 128,-1,49 + 117 56 117 56 121 53 c 2,50,-1 + 125 50 l 1,51,-1 + 625 50 l 2,52,53 + 650 50 650 50 674 68.5 c 128,-1,54 + 698 87 698 87 704 112 c 2,41,-1 +EndSplineSet +EndChar + +StartChar: glyph126 +Encoding: 126 57470 127 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 74 + 0 + 2 + 9 + 1 + 3 + 0 + 2 + 3 + 91 + 8 + 1 + 0 + 0 + 5 + 4 + 0 + 5 + 91 + 0 + 4 + 0 + 7 + 6 + 4 + 7 + 89 + 10 + 1 + 6 + 1 + 1 + 6 + 79 + 10 + 1 + 6 + 6 + 1 + 83 + 0 + 1 + 6 + 1 + 71 + 34 + 33 + 21 + 20 + 1 + 0 + 38 + 37 + 33 + 42 + 34 + 41 + 30 + 27 + 25 + 24 + 20 + 32 + 21 + 32 + 17 + 14 + 9 + 6 + 0 + 19 + 1 + 19 + 11 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 550 m 2,0,1 + 677 550 677 550 713.5 513.5 c 128,-1,2 + 750 477 750 477 750 425 c 2,3,-1 + 750 92 l 2,4,5 + 750 40 750 40 713.5 3.5 c 128,-1,6 + 677 -33 677 -33 625 -33 c 2,7,-1 + 125 -33 l 2,8,9 + 73 -33 73 -33 36.5 3.5 c 128,-1,10 + 0 40 0 40 0 92 c 2,11,-1 + 0 508 l 2,12,13 + 0 560 0 560 36.5 596.5 c 128,-1,14 + 73 633 73 633 125 633 c 2,15,-1 + 292 633 l 2,16,17 + 326 633 326 633 350.5 608.5 c 128,-1,18 + 375 584 375 584 375 550 c 1,19,-1 + 625 550 l 2,0,1 +125 550 m 2,20,21 + 108 550 108 550 95.5 537.5 c 128,-1,22 + 83 525 83 525 83 508 c 2,23,-1 + 83 425 l 1,24,-1 + 667 425 l 1,25,26 + 667 442 667 442 654.5 454.5 c 128,-1,27 + 642 467 642 467 625 467 c 2,28,-1 + 375 467 l 2,29,30 + 340 467 340 467 316 491.5 c 128,-1,31 + 292 516 292 516 292 550 c 1,32,-1 + 125 550 l 2,20,21 +625 50 m 2,33,34 + 642 50 642 50 654.5 62.5 c 128,-1,35 + 667 75 667 75 667 92 c 2,36,-1 + 667 383 l 1,37,-1 + 83 383 l 1,38,-1 + 83 92 l 2,39,40 + 83 75 83 75 95.5 62.5 c 128,-1,41 + 108 50 108 50 125 50 c 2,42,-1 + 625 50 l 2,33,34 +EndSplineSet +EndChar + +StartChar: glyph127 +Encoding: 127 57471 128 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 173 + 31 + 1 + 13 + 5 + 74 + 54 + 2 + 10 + 13 + 70 + 58 + 2 + 0 + 10 + 3 + 66 + 27 + 1 + 10 + 13 + 0 + 13 + 10 + 0 + 104 + 3 + 1 + 1 + 20 + 19 + 20 + 1 + 19 + 104 + 6 + 1 + 5 + 16 + 28 + 2 + 13 + 10 + 5 + 13 + 91 + 15 + 14 + 9 + 4 + 25 + 5 + 0 + 17 + 11 + 2 + 7 + 8 + 0 + 7 + 89 + 18 + 12 + 26 + 3 + 8 + 24 + 22 + 2 + 20 + 1 + 8 + 20 + 89 + 30 + 23 + 21 + 29 + 4 + 19 + 2 + 2 + 19 + 79 + 30 + 23 + 21 + 29 + 4 + 19 + 19 + 2 + 83 + 0 + 2 + 19 + 2 + 71 + 95 + 94 + 84 + 83 + 52 + 51 + 43 + 43 + 39 + 39 + 1 + 0 + 99 + 98 + 94 + 100 + 95 + 100 + 93 + 92 + 91 + 90 + 86 + 85 + 83 + 89 + 84 + 89 + 82 + 81 + 80 + 79 + 78 + 76 + 69 + 67 + 61 + 59 + 51 + 64 + 52 + 64 + 50 + 49 + 48 + 47 + 43 + 46 + 43 + 46 + 45 + 44 + 39 + 42 + 39 + 42 + 41 + 40 + 34 + 32 + 30 + 28 + 24 + 22 + 17 + 16 + 13 + 10 + 7 + 6 + 0 + 38 + 1 + 38 + 31 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +708 467 m 2,0,1 + 725 467 725 467 737.5 454.5 c 128,-1,2 + 750 442 750 442 750 425 c 2,3,-1 + 750 258 l 2,4,5 + 750 241 750 241 737.5 229 c 128,-1,6 + 725 217 725 217 708 217 c 1,7,-1 + 708 8 l 2,8,9 + 708 -44 708 -44 671.5 -80.5 c 128,-1,10 + 635 -117 635 -117 583 -117 c 2,11,-1 + 167 -117 l 2,12,13 + 115 -117 115 -117 78.5 -80.5 c 128,-1,14 + 42 -44 42 -44 42 8 c 2,15,-1 + 42 217 l 1,16,17 + 25 217 25 217 12.5 229 c 128,-1,18 + 0 241 0 241 0 258 c 2,19,-1 + 0 425 l 2,20,21 + 0 442 0 442 12.5 454.5 c 128,-1,22 + 25 467 25 467 42 467 c 2,23,-1 + 140 467 l 1,24,25 + 125 499 125 499 125 529 c 0,26,27 + 125 589 125 589 168 632 c 128,-1,28 + 211 675 211 675 271 675 c 0,29,30 + 333 675 333 675 375 631 c 1,31,32 + 417 675 417 675 479 675 c 0,33,34 + 539 675 539 675 582 632 c 128,-1,35 + 625 589 625 589 625 529 c 0,36,37 + 625 499 625 499 610 467 c 1,38,-1 + 708 467 l 2,0,1 +667 300 m 1,39,-1 + 667 383 l 1,40,-1 + 458 383 l 1,41,-1 + 458 300 l 1,42,-1 + 667 300 l 1,39,-1 +333 508 m 1,43,-1 + 333 467 l 1,44,-1 + 417 467 l 1,45,-1 + 417 508 l 1,46,-1 + 333 508 l 1,43,-1 +417 383 m 1,47,-1 + 333 383 l 1,48,-1 + 333 300 l 1,49,-1 + 417 300 l 1,50,-1 + 417 383 l 1,47,-1 +479 592 m 0,51,52 + 459 592 459 592 442.5 580 c 128,-1,53 + 426 568 426 568 420 549 c 1,54,55 + 436 547 436 547 447 535.5 c 128,-1,56 + 458 524 458 524 458 508 c 2,57,-1 + 458 471 l 1,58,59 + 470 467 470 467 479 467 c 0,60,61 + 505 467 505 467 523.5 485.5 c 128,-1,62 + 542 504 542 504 542 529 c 128,-1,63 + 542 554 542 554 523 573 c 128,-1,64 + 504 592 504 592 479 592 c 0,51,52 +208 529 m 128,-1,66 + 208 504 208 504 226.5 485.5 c 128,-1,67 + 245 467 245 467 271 467 c 0,68,69 + 280 467 280 467 292 471 c 1,70,-1 + 292 508 l 2,71,72 + 292 524 292 524 303 535.5 c 128,-1,73 + 314 547 314 547 330 549 c 1,74,75 + 324 568 324 568 307.5 580 c 128,-1,76 + 291 592 291 592 271 592 c 0,77,78 + 246 592 246 592 227 573 c 128,-1,65 + 208 554 208 554 208 529 c 128,-1,66 +292 383 m 1,79,-1 + 83 383 l 1,80,-1 + 83 300 l 1,81,-1 + 292 300 l 1,82,-1 + 292 383 l 1,79,-1 +167 -33 m 2,83,-1 + 292 -33 l 1,84,-1 + 292 258 l 1,85,-1 + 125 258 l 1,86,-1 + 125 8 l 2,87,88 + 125 -9 125 -9 137.5 -21 c 128,-1,89 + 150 -33 150 -33 167 -33 c 2,83,-1 +333 -33 m 1,90,-1 + 417 -33 l 1,91,-1 + 417 258 l 1,92,-1 + 333 258 l 1,93,-1 + 333 -33 l 1,90,-1 +583 -33 m 2,94,95 + 600 -33 600 -33 612.5 -21 c 128,-1,96 + 625 -9 625 -9 625 8 c 2,97,-1 + 625 258 l 1,98,-1 + 458 258 l 1,99,-1 + 458 -33 l 1,100,-1 + 583 -33 l 2,94,95 +EndSplineSet +EndChar + +StartChar: glyph128 +Encoding: 128 57472 129 +Width: 652 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 92 + 51 + 44 + 2 + 0 + 2 + 57 + 1 + 7 + 9 + 2 + 66 + 0 + 10 + 2 + 10 + 106 + 0 + 8 + 1 + 3 + 1 + 8 + 3 + 104 + 0 + 2 + 0 + 0 + 1 + 2 + 0 + 91 + 0 + 1 + 0 + 3 + 9 + 1 + 3 + 91 + 0 + 9 + 0 + 7 + 4 + 9 + 7 + 91 + 6 + 11 + 2 + 4 + 5 + 5 + 4 + 79 + 6 + 11 + 2 + 4 + 4 + 5 + 83 + 0 + 5 + 4 + 5 + 71 + 17 + 16 + 47 + 46 + 39 + 37 + 35 + 34 + 30 + 29 + 28 + 26 + 23 + 20 + 16 + 58 + 17 + 58 + 19 + 19 + 19 + 16 + 12 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +277 550 m 128,-1,1 + 208 550 208 550 159.5 501 c 128,-1,2 + 111 452 111 452 111 383 c 128,-1,3 + 111 314 111 314 159.5 265.5 c 128,-1,4 + 208 217 208 217 277 217 c 128,-1,5 + 346 217 346 217 395 265.5 c 128,-1,6 + 444 314 444 314 444 383 c 128,-1,7 + 444 452 444 452 395 501 c 128,-1,0 + 346 550 346 550 277 550 c 128,-1,1 +277 633 m 128,-1,9 + 380 633 380 633 453.5 559.5 c 128,-1,10 + 527 486 527 486 527 383 c 128,-1,11 + 527 280 527 280 453.5 206.5 c 128,-1,12 + 380 133 380 133 277 133 c 128,-1,13 + 174 133 174 133 100.5 206.5 c 128,-1,14 + 27 280 27 280 27 383 c 128,-1,15 + 27 486 27 486 100.5 559.5 c 128,-1,8 + 174 633 174 633 277 633 c 128,-1,9 +527 -33 m 2,16,17 + 544 -33 544 -33 556.5 -45.5 c 128,-1,18 + 569 -58 569 -58 569 -75 c 128,-1,19 + 569 -92 569 -92 556.5 -104.5 c 128,-1,20 + 544 -117 544 -117 527 -117 c 2,21,-1 + 111 -117 l 2,22,23 + 94 -117 94 -117 81.5 -104.5 c 128,-1,24 + 69 -92 69 -92 69 -75 c 128,-1,25 + 69 -58 69 -58 81.5 -45.5 c 128,-1,26 + 94 -33 94 -33 111 -33 c 2,27,-1 + 277 -33 l 1,28,-1 + 277 8 l 1,29,30 + 122 8 122 8 12 118 c 0,31,32 + 0 130 0 130 0 147.5 c 128,-1,33 + 0 165 0 165 12 177 c 128,-1,34 + 24 189 24 189 41.5 189 c 128,-1,35 + 59 189 59 189 71 177 c 0,36,37 + 156 92 156 92 277 92 c 0,38,39 + 399 92 399 92 484 177 c 128,-1,40 + 569 262 569 262 569 383 c 0,41,42 + 569 505 569 505 484 590 c 2,43,-1 + 454 619 l 1,44,-1 + 540 704 l 2,45,46 + 552 716 552 716 569.5 716 c 128,-1,47 + 587 716 587 716 599 704 c 128,-1,48 + 611 692 611 692 610.5 674.5 c 128,-1,49 + 610 657 610 657 598 645 c 2,50,-1 + 570 617 l 1,51,52 + 652 515 652 515 652 383 c 0,53,54 + 652 228 652 228 542 118 c 0,55,56 + 465 41 465 41 361 18 c 1,57,-1 + 361 -33 l 1,58,-1 + 527 -33 l 2,16,17 +EndSplineSet +EndChar + +StartChar: glyph129 +Encoding: 129 57473 130 +Width: 652 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 23 + 16 + 2 + 1 + 7 + 29 + 1 + 0 + 2 + 2 + 66 + 0 + 3 + 7 + 3 + 106 + 0 + 1 + 7 + 8 + 7 + 1 + 8 + 104 + 0 + 7 + 0 + 8 + 2 + 7 + 8 + 91 + 0 + 2 + 0 + 0 + 4 + 2 + 0 + 91 + 9 + 6 + 2 + 4 + 5 + 5 + 4 + 79 + 9 + 6 + 2 + 4 + 4 + 5 + 83 + 0 + 5 + 4 + 5 + 71 + 0 + 0 + 50 + 49 + 46 + 45 + 0 + 42 + 0 + 41 + 51 + 43 + 23 + 34 + 20 + 17 + 10 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +277 -33 m 1,0,-1 + 277 8 l 1,1,2 + 122 8 122 8 12 118 c 0,3,4 + 0 130 0 130 0 147.5 c 128,-1,5 + 0 165 0 165 12 177 c 128,-1,6 + 24 189 24 189 41.5 189 c 128,-1,7 + 59 189 59 189 71 177 c 0,8,9 + 156 92 156 92 277 92 c 0,10,11 + 399 92 399 92 484 177 c 128,-1,12 + 569 262 569 262 569 383 c 0,13,14 + 569 505 569 505 484 590 c 2,15,-1 + 454 619 l 1,16,-1 + 540 704 l 2,17,18 + 552 716 552 716 569.5 716 c 128,-1,19 + 587 716 587 716 599 704 c 128,-1,20 + 611 692 611 692 610.5 675 c 128,-1,21 + 610 658 610 658 598 646 c 2,22,-1 + 570 617 l 1,23,24 + 652 515 652 515 652 383 c 0,25,26 + 652 228 652 228 542 118 c 0,27,28 + 465 41 465 41 361 18 c 1,29,-1 + 361 -33 l 1,30,-1 + 527 -33 l 2,31,32 + 544 -33 544 -33 556.5 -45.5 c 128,-1,33 + 569 -58 569 -58 569 -75 c 128,-1,34 + 569 -92 569 -92 556.5 -104.5 c 128,-1,35 + 544 -117 544 -117 527 -117 c 2,36,-1 + 111 -117 l 2,37,38 + 94 -117 94 -117 81.5 -104.5 c 128,-1,39 + 69 -92 69 -92 69 -75 c 128,-1,40 + 69 -58 69 -58 81.5 -45.5 c 128,-1,41 + 94 -33 94 -33 111 -33 c 2,42,-1 + 277 -33 l 1,0,-1 +27 383 m 128,-1,44 + 27 486 27 486 100.5 559.5 c 128,-1,45 + 174 633 174 633 277 633 c 128,-1,46 + 380 633 380 633 453.5 559.5 c 128,-1,47 + 527 486 527 486 527 383 c 128,-1,48 + 527 280 527 280 453.5 206.5 c 128,-1,49 + 380 133 380 133 277 133 c 128,-1,50 + 174 133 174 133 100.5 206.5 c 128,-1,43 + 27 280 27 280 27 383 c 128,-1,44 +EndSplineSet +EndChar + +StartChar: glyph130 +Encoding: 130 57474 131 +Width: 958 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 182 + 63 + 60 + 2 + 15 + 8 + 91 + 86 + 72 + 68 + 4 + 14 + 17 + 82 + 76 + 50 + 42 + 4 + 9 + 14 + 3 + 66 + 49 + 43 + 2 + 16 + 1 + 65 + 0 + 1 + 0 + 2 + 5 + 1 + 2 + 91 + 21 + 1 + 5 + 29 + 22 + 24 + 3 + 6 + 3 + 5 + 6 + 91 + 0 + 3 + 0 + 0 + 7 + 3 + 0 + 91 + 23 + 1 + 7 + 20 + 1 + 4 + 13 + 7 + 4 + 91 + 12 + 25 + 2 + 8 + 19 + 1 + 15 + 17 + 8 + 15 + 91 + 0 + 13 + 0 + 17 + 14 + 13 + 17 + 91 + 28 + 18 + 26 + 3 + 14 + 11 + 1 + 9 + 16 + 14 + 9 + 91 + 27 + 1 + 16 + 10 + 10 + 16 + 79 + 27 + 1 + 16 + 16 + 10 + 83 + 0 + 10 + 16 + 10 + 71 + 104 + 103 + 85 + 84 + 75 + 74 + 66 + 65 + 35 + 34 + 25 + 24 + 108 + 107 + 103 + 112 + 104 + 112 + 100 + 99 + 96 + 95 + 90 + 88 + 84 + 94 + 85 + 94 + 80 + 78 + 74 + 83 + 75 + 83 + 71 + 69 + 65 + 73 + 66 + 73 + 62 + 61 + 59 + 57 + 53 + 51 + 47 + 45 + 41 + 39 + 34 + 64 + 35 + 64 + 30 + 29 + 24 + 33 + 25 + 33 + 19 + 19 + 19 + 19 + 19 + 16 + 30 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +479 217 m 128,-1,1 + 393 217 393 217 332 278 c 128,-1,2 + 271 339 271 339 271 425 c 128,-1,3 + 271 511 271 511 332 572 c 128,-1,4 + 393 633 393 633 479 633 c 128,-1,5 + 565 633 565 633 626.5 572 c 128,-1,6 + 688 511 688 511 688 425 c 128,-1,7 + 688 339 688 339 626.5 278 c 128,-1,0 + 565 217 565 217 479 217 c 128,-1,1 +479 550 m 128,-1,9 + 427 550 427 550 390.5 513.5 c 128,-1,10 + 354 477 354 477 354 425 c 128,-1,11 + 354 373 354 373 390.5 336.5 c 128,-1,12 + 427 300 427 300 479 300 c 128,-1,13 + 531 300 531 300 567.5 336.5 c 128,-1,14 + 604 373 604 373 604 425 c 128,-1,15 + 604 477 604 477 567.5 513.5 c 128,-1,8 + 531 550 531 550 479 550 c 128,-1,9 +812 175 m 128,-1,17 + 768 175 768 175 738 205.5 c 128,-1,18 + 708 236 708 236 708 279 c 128,-1,19 + 708 322 708 322 738 352.5 c 128,-1,20 + 768 383 768 383 812 383 c 128,-1,21 + 856 383 856 383 886.5 352.5 c 128,-1,22 + 917 322 917 322 917 279 c 128,-1,23 + 917 236 917 236 886.5 205.5 c 128,-1,16 + 856 175 856 175 812 175 c 128,-1,17 +812 342 m 0,24,25 + 787 342 787 342 768.5 323.5 c 128,-1,26 + 750 305 750 305 750 279 c 0,27,28 + 750 254 750 254 768 235.5 c 128,-1,29 + 786 217 786 217 812 217 c 128,-1,30 + 838 217 838 217 856.5 235.5 c 128,-1,31 + 875 254 875 254 875 279 c 128,-1,32 + 875 304 875 304 856.5 323 c 128,-1,33 + 838 342 838 342 812 342 c 0,24,25 +812 150 m 0,34,35 + 876 150 876 150 917 123 c 128,-1,36 + 958 96 958 96 958 60 c 0,37,38 + 958 42 958 42 916 28 c 128,-1,39 + 874 14 874 14 812 14 c 0,40,41 + 778 14 778 14 746 19 c 1,42,-1 + 747 8 l 2,43,44 + 747 -25 747 -25 670 -50 c 128,-1,45 + 593 -75 593 -75 479 -75 c 0,46,47 + 359 -75 359 -75 285.5 -50 c 128,-1,48 + 212 -25 212 -25 212 8 c 2,49,-1 + 213 20 l 1,50,51 + 173 14 173 14 146 14 c 0,52,53 + 81 14 81 14 40.5 28 c 128,-1,54 + 0 42 0 42 0 60 c 0,55,56 + 0 96 0 96 40 123 c 128,-1,57 + 80 150 80 150 146 150 c 0,58,59 + 225 150 225 150 267 110 c 1,60,61 + 346 175 346 175 479 175 c 128,-1,62 + 612 175 612 175 691 110 c 1,63,64 + 733 150 733 150 812 150 c 0,34,35 +146 56 m 0,65,66 + 194 56 194 56 228 65 c 1,67,-1 + 238 79 l 1,68,69 + 208 109 208 109 146 109 c 0,70,71 + 68 109 68 109 45 70 c 1,72,73 + 80 56 80 56 146 56 c 0,65,66 +479 8 m 0,74,75 + 584 8 584 8 652 32 c 1,76,77 + 632 56 632 56 586.5 74 c 128,-1,78 + 541 92 541 92 479 92 c 0,79,80 + 414 92 414 92 369 74 c 128,-1,81 + 324 56 324 56 305 32 c 1,82,83 + 372 8 372 8 479 8 c 0,74,75 +812 56 m 0,84,85 + 879 56 879 56 913 71 c 1,86,87 + 903 86 903 86 876.5 97.5 c 128,-1,88 + 850 109 850 109 812 109 c 0,89,90 + 751 109 751 109 720 80 c 1,91,92 + 724 75 724 75 730 65 c 1,93,94 + 762 56 762 56 812 56 c 0,84,85 +146 175 m 128,-1,96 + 102 175 102 175 72 205.5 c 128,-1,97 + 42 236 42 236 42 279 c 128,-1,98 + 42 322 42 322 72.5 352.5 c 128,-1,99 + 103 383 103 383 146 383 c 128,-1,100 + 189 383 189 383 219.5 352.5 c 128,-1,101 + 250 322 250 322 250 279 c 128,-1,102 + 250 236 250 236 220 205.5 c 128,-1,95 + 190 175 190 175 146 175 c 128,-1,96 +146 342 m 0,103,104 + 120 342 120 342 101.5 323 c 128,-1,105 + 83 304 83 304 83 279 c 128,-1,106 + 83 254 83 254 101.5 235.5 c 128,-1,107 + 120 217 120 217 146 217 c 128,-1,108 + 172 217 172 217 190 235.5 c 128,-1,109 + 208 254 208 254 208 279 c 0,110,111 + 208 305 208 305 189.5 323.5 c 128,-1,112 + 171 342 171 342 146 342 c 0,103,104 +EndSplineSet +EndChar + +StartChar: glyph131 +Encoding: 131 57475 132 +Width: 958 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 85 + 45 + 42 + 32 + 24 + 4 + 5 + 4 + 31 + 25 + 2 + 6 + 5 + 2 + 66 + 0 + 1 + 0 + 0 + 2 + 1 + 0 + 91 + 11 + 1 + 3 + 10 + 1 + 2 + 9 + 3 + 2 + 91 + 0 + 9 + 4 + 6 + 9 + 79 + 8 + 12 + 2 + 4 + 7 + 1 + 5 + 6 + 4 + 5 + 91 + 0 + 9 + 9 + 6 + 83 + 0 + 6 + 9 + 6 + 71 + 17 + 16 + 55 + 53 + 50 + 49 + 44 + 43 + 41 + 39 + 35 + 33 + 29 + 27 + 23 + 21 + 16 + 46 + 17 + 46 + 19 + 19 + 19 + 18 + 13 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +688 425 m 128,-1,1 + 688 339 688 339 626.5 278 c 128,-1,2 + 565 217 565 217 479 217 c 128,-1,3 + 393 217 393 217 332 278 c 128,-1,4 + 271 339 271 339 271 425 c 128,-1,5 + 271 511 271 511 332 572 c 128,-1,6 + 393 633 393 633 479 633 c 128,-1,7 + 565 633 565 633 626.5 572 c 128,-1,0 + 688 511 688 511 688 425 c 128,-1,1 +917 279 m 128,-1,9 + 917 236 917 236 886.5 205.5 c 128,-1,10 + 856 175 856 175 812 175 c 128,-1,11 + 768 175 768 175 738 205.5 c 128,-1,12 + 708 236 708 236 708 279 c 128,-1,13 + 708 322 708 322 738 352.5 c 128,-1,14 + 768 383 768 383 812 383 c 128,-1,15 + 856 383 856 383 886.5 352.5 c 128,-1,8 + 917 322 917 322 917 279 c 128,-1,9 +812 150 m 0,16,17 + 876 150 876 150 917 123 c 128,-1,18 + 958 96 958 96 958 60 c 0,19,20 + 958 42 958 42 916 28 c 128,-1,21 + 874 14 874 14 812 14 c 0,22,23 + 778 14 778 14 746 19 c 1,24,-1 + 747 8 l 2,25,26 + 747 -25 747 -25 670 -50 c 128,-1,27 + 593 -75 593 -75 479 -75 c 0,28,29 + 359 -75 359 -75 285.5 -50 c 128,-1,30 + 212 -25 212 -25 212 8 c 2,31,-1 + 213 20 l 1,32,33 + 173 14 173 14 146 14 c 0,34,35 + 81 14 81 14 40.5 28 c 128,-1,36 + 0 42 0 42 0 60 c 0,37,38 + 0 96 0 96 40 123 c 128,-1,39 + 80 150 80 150 146 150 c 0,40,41 + 225 150 225 150 267 110 c 1,42,43 + 346 175 346 175 479 175 c 128,-1,44 + 612 175 612 175 691 110 c 1,45,46 + 733 150 733 150 812 150 c 0,16,17 +250 279 m 128,-1,48 + 250 236 250 236 220 205.5 c 128,-1,49 + 190 175 190 175 146 175 c 128,-1,50 + 102 175 102 175 72 205.5 c 128,-1,51 + 42 236 42 236 42 279 c 128,-1,52 + 42 322 42 322 72 352.5 c 128,-1,53 + 102 383 102 383 146 383 c 0,54,55 + 189 383 189 383 219.5 352.5 c 128,-1,47 + 250 322 250 322 250 279 c 128,-1,48 +EndSplineSet +EndChar + +StartChar: glyph132 +Encoding: 132 57476 133 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 113 + 67 + 64 + 2 + 9 + 8 + 88 + 45 + 2 + 1 + 9 + 89 + 69 + 60 + 44 + 4 + 5 + 1 + 19 + 14 + 2 + 4 + 5 + 32 + 31 + 2 + 1 + 4 + 7 + 6 + 5 + 66 + 91 + 1 + 5 + 1 + 65 + 0 + 5 + 1 + 4 + 1 + 5 + 4 + 104 + 0 + 3 + 0 + 8 + 9 + 3 + 8 + 91 + 0 + 9 + 0 + 1 + 5 + 9 + 1 + 91 + 13 + 12 + 2 + 4 + 10 + 1 + 6 + 7 + 4 + 6 + 91 + 11 + 1 + 7 + 0 + 0 + 7 + 79 + 11 + 1 + 7 + 7 + 0 + 83 + 2 + 1 + 0 + 7 + 0 + 71 + 85 + 85 + 85 + 92 + 85 + 92 + 83 + 82 + 77 + 75 + 71 + 70 + 23 + 21 + 40 + 17 + 19 + 25 + 24 + 24 + 23 + 14 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +750 258 m 2,0,-1 + 750 150 l 1,1,-1 + 749 145 l 2,2,3 + 750 135 750 135 750 112 c 2,4,-1 + 750 29 l 2,5,6 + 750 -31 750 -31 707 -74 c 128,-1,7 + 664 -117 664 -117 604 -117 c 128,-1,8 + 544 -117 544 -117 501 -74 c 128,-1,9 + 458 -31 458 -31 458 29 c 2,10,-1 + 458 112 l 2,11,12 + 458 159 458 159 481 196.5 c 128,-1,13 + 504 234 504 234 541 249 c 1,14,15 + 538 315 538 315 490 361.5 c 128,-1,16 + 442 408 442 408 375 408 c 128,-1,17 + 308 408 308 408 260 361.5 c 128,-1,18 + 212 315 212 315 209 249 c 1,19,20 + 246 234 246 234 269 196.5 c 128,-1,21 + 292 159 292 159 292 112 c 2,22,-1 + 292 29 l 2,23,24 + 292 -31 292 -31 249 -74 c 128,-1,25 + 206 -117 206 -117 146 -117 c 128,-1,26 + 86 -117 86 -117 43 -74 c 128,-1,27 + 0 -31 0 -31 0 29 c 2,28,-1 + 0 112 l 2,29,30 + 0 135 0 135 1 145 c 2,31,-1 + 0 150 l 1,32,-1 + 0 258 l 2,33,34 + 0 413 0 413 110 523 c 128,-1,35 + 220 633 220 633 375 633 c 128,-1,36 + 530 633 530 633 640 523 c 128,-1,37 + 750 413 750 413 750 258 c 2,0,-1 +83 258 m 2,38,-1 + 83 217 l 1,39,-1 + 125 217 l 1,40,41 + 125 258 125 258 126 258 c 0,42,43 + 132 337 132 337 180 397 c 1,44,-1 + 143 434 l 1,45,46 + 83 355 83 355 83 258 c 2,38,-1 +208 29 m 2,47,-1 + 208 112 l 2,48,49 + 208 139 208 139 195.5 157 c 128,-1,50 + 183 175 183 175 167 175 c 2,51,-1 + 88 175 l 1,52,53 + 83 140 83 140 83 112 c 2,54,-1 + 83 29 l 2,55,56 + 83 4 83 4 101.5 -14.5 c 128,-1,57 + 120 -33 120 -33 146 -33 c 128,-1,58 + 172 -33 172 -33 190 -14.5 c 128,-1,59 + 208 4 208 4 208 29 c 2,47,-1 +517 404 m 1,60,61 + 528 415 528 415 549 435.5 c 128,-1,62 + 570 456 570 456 580 466 c 2,63,-1 + 606 492 l 1,64,65 + 510 588 510 588 375 588 c 128,-1,66 + 240 588 240 588 144 492 c 1,67,-1 + 218 418 l 1,68,-1 + 233 404 l 1,69,70 + 291 462 291 462 375 462 c 128,-1,71 + 459 462 459 462 517 404 c 1,60,61 +667 29 m 2,72,-1 + 667 112 l 2,73,74 + 667 140 667 140 662 175 c 1,75,-1 + 583 175 l 2,76,77 + 567 175 567 175 554.5 157 c 128,-1,78 + 542 139 542 139 542 112 c 2,79,-1 + 542 29 l 2,80,81 + 542 4 542 4 560 -14.5 c 128,-1,82 + 578 -33 578 -33 604 -33 c 128,-1,83 + 630 -33 630 -33 648.5 -14.5 c 128,-1,84 + 667 4 667 4 667 29 c 2,72,-1 +667 217 m 1,85,-1 + 667 258 l 2,86,87 + 667 355 667 355 607 434 c 1,88,-1 + 570 397 l 1,89,90 + 619 335 619 335 625 258 c 1,91,-1 + 625 217 l 1,92,-1 + 667 217 l 1,85,-1 +EndSplineSet +EndChar + +StartChar: glyph133 +Encoding: 133 57477 134 +Width: 808 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 21 + 5 + 1 + 2 + 0 + 1 + 66 + 1 + 1 + 0 + 2 + 0 + 106 + 0 + 2 + 2 + 97 + 25 + 35 + 34 + 3 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +0 408 m 0,0,1 + 0 501 0 501 67 567 c 128,-1,2 + 134 633 134 633 225 633 c 0,3,4 + 339 633 339 633 408 538 c 1,5,6 + 440 582 440 582 486.5 607.5 c 128,-1,7 + 533 633 533 633 583 633 c 0,8,9 + 677 633 677 633 742.5 567.5 c 128,-1,10 + 808 502 808 502 808 408 c 0,11,12 + 808 279 808 279 725 196 c 0,13,14 + 695 165 695 165 623.5 111 c 128,-1,15 + 552 57 552 57 491 14.5 c 128,-1,16 + 430 -28 430 -28 429 -29 c 0,17,18 + 411 -38 411 -38 404 -38 c 128,-1,19 + 397 -38 397 -38 379 -29 c 0,20,21 + 377 -27 377 -27 316.5 15.5 c 128,-1,22 + 256 58 256 58 184.5 112 c 128,-1,23 + 113 166 113 166 83 196 c 0,24,25 + 0 279 0 279 0 408 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph134 +Encoding: 134 57478 135 +Width: 808 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 53 + 5 + 1 + 4 + 3 + 27 + 1 + 2 + 4 + 2 + 66 + 5 + 1 + 4 + 3 + 2 + 3 + 4 + 2 + 104 + 0 + 2 + 2 + 105 + 1 + 1 + 0 + 3 + 3 + 0 + 79 + 1 + 1 + 0 + 0 + 3 + 83 + 0 + 3 + 0 + 3 + 71 + 26 + 26 + 26 + 39 + 26 + 39 + 31 + 25 + 35 + 34 + 6 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +0 408 m 0,0,1 + 0 501 0 501 67 567 c 128,-1,2 + 134 633 134 633 225 633 c 0,3,4 + 339 633 339 633 408 538 c 1,5,6 + 440 582 440 582 486.5 607.5 c 128,-1,7 + 533 633 533 633 583 633 c 0,8,9 + 677 633 677 633 742.5 567.5 c 128,-1,10 + 808 502 808 502 808 408 c 0,11,12 + 808 279 808 279 725 196 c 0,13,14 + 695 165 695 165 623.5 111 c 128,-1,15 + 552 57 552 57 491 14.5 c 128,-1,16 + 430 -28 430 -28 429 -29 c 0,17,18 + 411 -38 411 -38 404 -38 c 128,-1,19 + 397 -38 397 -38 379 -29 c 0,20,21 + 377 -27 377 -27 316.5 15.5 c 128,-1,22 + 256 58 256 58 184.5 112 c 128,-1,23 + 113 166 113 166 83 196 c 0,24,25 + 0 279 0 279 0 408 c 0,0,1 +408 367 m 1,26,-1 + 408 58 l 1,27,28 + 468 97 468 97 553 159 c 128,-1,29 + 638 221 638 221 671 254 c 0,30,31 + 733 316 733 316 733 408 c 0,32,33 + 733 467 733 467 692 508.5 c 128,-1,34 + 651 550 651 550 592 550 c 128,-1,35 + 533 550 533 550 491.5 508.5 c 128,-1,36 + 450 467 450 467 450 408 c 0,37,38 + 450 389 450 389 438.5 378 c 128,-1,39 + 427 367 427 367 408 367 c 1,26,-1 +EndSplineSet +EndChar + +StartChar: glyph135 +Encoding: 135 57479 136 +Width: 812 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 60 + 13 + 1 + 5 + 3 + 34 + 1 + 0 + 5 + 2 + 66 + 0 + 5 + 3 + 0 + 3 + 5 + 0 + 104 + 6 + 1 + 0 + 0 + 105 + 2 + 1 + 1 + 3 + 3 + 1 + 79 + 2 + 1 + 1 + 1 + 3 + 83 + 4 + 1 + 3 + 1 + 3 + 71 + 1 + 0 + 47 + 46 + 42 + 40 + 28 + 27 + 17 + 15 + 12 + 10 + 0 + 26 + 1 + 26 + 7 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +406 -33 m 0,0,1 + 393 -33 393 -33 383 -26 c 0,2,3 + 362 -12 362 -12 315.5 20.5 c 128,-1,4 + 269 53 269 53 192 110.5 c 128,-1,5 + 115 168 115 168 85 198 c 0,6,7 + 0 283 0 283 0 409 c 0,8,9 + 0 502 0 502 65.5 567.5 c 128,-1,10 + 131 633 131 633 224 633 c 0,11,12 + 338 633 338 633 406 539 c 1,13,14 + 437 583 437 583 485.5 608 c 128,-1,15 + 534 633 534 633 589 633 c 0,16,17 + 682 633 682 633 747 567.5 c 128,-1,18 + 812 502 812 502 812 409 c 0,19,20 + 812 283 812 283 727 198 c 0,21,22 + 697 168 697 168 621 110.5 c 128,-1,23 + 545 53 545 53 497 20 c 128,-1,24 + 449 -13 449 -13 430 -26 c 0,25,26 + 420 -33 420 -33 406 -33 c 0,0,1 +224 550 m 128,-1,28 + 166 550 166 550 124.5 509 c 128,-1,29 + 83 468 83 468 83 409 c 0,30,31 + 83 318 83 318 144 257 c 0,32,33 + 207 194 207 194 406 59 c 1,34,35 + 605 194 605 194 668 257 c 0,36,37 + 729 318 729 318 729 409 c 0,38,39 + 729 468 729 468 688 509 c 128,-1,40 + 647 550 647 550 589 550 c 0,41,42 + 530 550 530 550 489 509 c 128,-1,43 + 448 468 448 468 448 409 c 0,44,45 + 448 392 448 392 435.5 380 c 128,-1,46 + 423 368 423 368 406 368 c 128,-1,47 + 389 368 389 368 377 380 c 128,-1,48 + 365 392 365 392 365 409 c 0,49,50 + 365 468 365 468 323.5 509 c 128,-1,27 + 282 550 282 550 224 550 c 128,-1,28 +EndSplineSet +EndChar + +StartChar: glyph136 +Encoding: 136 57480 137 +Width: 729 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 15 + 17 + 8 + 0 + 3 + 0 + 63 + 1 + 1 + 0 + 0 + 97 + 27 + 18 + 2 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +365 368 m 1,0,1 + 365 444 365 444 311.5 497 c 128,-1,2 + 258 550 258 550 182 550 c 128,-1,3 + 106 550 106 550 53 497 c 128,-1,4 + 0 444 0 444 0 368 c 0,5,6 + 0 258 0 258 73 185 c 1,7,-1 + 365 -33 l 1,8,9 + 590 119 590 119 656 185 c 0,10,11 + 729 258 729 258 729 368 c 0,12,13 + 729 444 729 444 676 497 c 128,-1,14 + 623 550 623 550 547 550 c 128,-1,15 + 471 550 471 550 418 497 c 128,-1,16 + 365 444 365 444 365 368 c 1,17,-1 + 365 368 l 1,0,1 +EndSplineSet +EndChar + +StartChar: glyph137 +Encoding: 137 57481 138 +Width: 917 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 67 + 38 + 26 + 2 + 5 + 64 + 6 + 1 + 5 + 2 + 1 + 0 + 8 + 5 + 0 + 91 + 0 + 8 + 0 + 3 + 4 + 8 + 3 + 89 + 9 + 7 + 10 + 3 + 4 + 1 + 1 + 4 + 77 + 9 + 7 + 10 + 3 + 4 + 4 + 1 + 83 + 0 + 1 + 4 + 1 + 71 + 31 + 31 + 47 + 46 + 45 + 44 + 43 + 42 + 41 + 40 + 36 + 35 + 31 + 34 + 31 + 34 + 31 + 35 + 51 + 36 + 11 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +886 364 m 0,0,1 + 917 340 917 340 917 300 c 0,2,3 + 917 266 917 266 892.5 241.5 c 128,-1,4 + 868 217 868 217 833 217 c 2,5,-1 + 792 217 l 1,6,-1 + 792 -33 l 2,7,8 + 792 -68 792 -68 767 -92.5 c 128,-1,9 + 742 -117 742 -117 708 -117 c 2,10,-1 + 208 -117 l 2,11,12 + 174 -117 174 -117 149.5 -92.5 c 128,-1,13 + 125 -68 125 -68 125 -33 c 2,14,-1 + 125 217 l 1,15,-1 + 83 217 l 2,16,17 + 48 217 48 217 24 241.5 c 128,-1,18 + 0 266 0 266 0 300 c 0,19,20 + 0 337 0 337 29 363 c 0,21,22 + 92 416 92 416 192 502 c 128,-1,23 + 292 588 292 588 361 647 c 128,-1,24 + 430 706 430 706 431 707 c 2,25,-1 + 458 730 l 1,26,-1 + 486 707 l 2,27,28 + 487 706 487 706 555.5 647 c 128,-1,29 + 624 588 624 588 724 502 c 128,-1,30 + 824 416 824 416 886 364 c 0,0,1 +542 -33 m 1,31,-1 + 542 175 l 1,32,-1 + 375 175 l 1,33,-1 + 375 -33 l 1,34,-1 + 542 -33 l 1,31,-1 +708 300 m 1,35,-1 + 833 300 l 1,36,37 + 648 455 648 455 458 620 c 1,38,39 + 268 455 268 455 83 300 c 1,40,-1 + 208 300 l 1,41,-1 + 208 -33 l 1,42,-1 + 333 -33 l 1,43,-1 + 333 217 l 1,44,-1 + 583 217 l 1,45,-1 + 583 -33 l 1,46,-1 + 708 -33 l 1,47,-1 + 708 300 l 1,35,-1 +EndSplineSet +EndChar + +StartChar: glyph138 +Encoding: 138 57482 139 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 27 + 0 + 1 + 0 + 64 + 4 + 1 + 0 + 2 + 0 + 106 + 0 + 2 + 1 + 2 + 106 + 3 + 1 + 1 + 1 + 97 + 35 + 51 + 19 + 51 + 38 + 5 + 20 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +417 675 m 1,0,1 + 674 452 674 452 817 332 c 0,2,3 + 833 319 833 319 833 300 c 0,4,5 + 833 283 833 283 821 270.5 c 128,-1,6 + 809 258 809 258 792 258 c 2,7,-1 + 708 258 l 1,8,-1 + 708 -33 l 2,9,10 + 708 -50 708 -50 696 -62.5 c 128,-1,11 + 684 -75 684 -75 667 -75 c 2,12,-1 + 542 -75 l 2,13,14 + 525 -75 525 -75 512.5 -62.5 c 128,-1,15 + 500 -50 500 -50 500 -33 c 2,16,-1 + 500 133 l 1,17,-1 + 333 133 l 1,18,-1 + 333 -33 l 2,19,20 + 333 -50 333 -50 321 -62.5 c 128,-1,21 + 309 -75 309 -75 292 -75 c 2,22,-1 + 167 -75 l 2,23,24 + 150 -75 150 -75 137.5 -62.5 c 128,-1,25 + 125 -50 125 -50 125 -33 c 2,26,-1 + 125 258 l 1,27,-1 + 42 258 l 2,28,29 + 25 258 25 258 12.5 270.5 c 128,-1,30 + 0 283 0 283 0 300 c 128,-1,31 + 0 317 0 317 15 332 c 2,32,-1 + 417 675 l 1,0,1 +EndSplineSet +EndChar + +StartChar: glyph139 +Encoding: 139 57483 140 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 140 + 10 + 5 + 0 + 3 + 16 + 13 + 11 + 1 + 0 + 6 + 2 + 66 + 54 + 50 + 49 + 41 + 4 + 20 + 63 + 14 + 12 + 8 + 5 + 2 + 5 + 1 + 9 + 1 + 7 + 13 + 1 + 7 + 89 + 0 + 13 + 24 + 1 + 16 + 6 + 13 + 16 + 89 + 0 + 6 + 15 + 11 + 23 + 10 + 4 + 3 + 6 + 0 + 17 + 6 + 0 + 90 + 0 + 17 + 0 + 18 + 22 + 17 + 18 + 89 + 25 + 1 + 22 + 0 + 21 + 19 + 22 + 21 + 89 + 0 + 19 + 20 + 20 + 19 + 77 + 0 + 19 + 19 + 20 + 81 + 0 + 20 + 19 + 20 + 69 + 43 + 43 + 26 + 26 + 18 + 18 + 43 + 58 + 43 + 58 + 57 + 56 + 52 + 51 + 47 + 46 + 45 + 44 + 39 + 38 + 26 + 37 + 26 + 37 + 36 + 35 + 34 + 33 + 32 + 31 + 30 + 29 + 28 + 27 + 18 + 25 + 18 + 25 + 24 + 23 + 17 + 18 + 17 + 17 + 19 + 17 + 18 + 17 + 17 + 26 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +338 654 m 1,0,-1 + 338 592 l 1,1,-1 + 296 592 l 1,2,-1 + 296 717 l 1,3,-1 + 342 717 l 1,4,-1 + 367 671 l 1,5,-1 + 396 717 l 1,6,-1 + 438 717 l 1,7,-1 + 438 592 l 1,8,-1 + 396 592 l 1,9,-1 + 396 654 l 1,10,-1 + 367 608 l 1,11,-1 + 338 654 l 1,0,-1 +558 592 m 1,12,-1 + 458 592 l 1,13,-1 + 458 717 l 1,14,-1 + 500 717 l 1,15,-1 + 500 633 l 1,16,-1 + 558 633 l 1,17,-1 + 558 592 l 1,12,-1 +200 592 m 1,18,-1 + 200 675 l 1,19,-1 + 162 675 l 1,20,-1 + 162 717 l 1,21,-1 + 279 717 l 1,22,-1 + 279 675 l 1,23,-1 + 242 675 l 1,24,-1 + 242 592 l 1,25,-1 + 200 592 l 1,18,-1 +67 633 m 1,26,-1 + 67 592 l 1,27,-1 + 25 592 l 1,28,-1 + 25 717 l 1,29,-1 + 67 717 l 1,30,-1 + 67 675 l 1,31,-1 + 104 675 l 1,32,-1 + 104 717 l 1,33,-1 + 146 717 l 1,34,-1 + 146 592 l 1,35,-1 + 104 592 l 1,36,-1 + 104 633 l 1,37,-1 + 67 633 l 1,26,-1 +0 550 m 1,38,-1 + 583 550 l 1,39,-1 + 533 -50 l 1,40,-1 + 292 -117 l 1,41,-1 + 50 -50 l 1,42,-1 + 0 550 l 1,38,-1 +471 358 m 1,43,-1 + 479 429 l 1,44,-1 + 104 429 l 1,45,-1 + 125 208 l 1,46,-1 + 383 208 l 1,47,-1 + 375 112 l 1,48,-1 + 292 92 l 1,49,-1 + 208 112 l 1,50,-1 + 204 175 l 1,51,-1 + 129 175 l 1,52,-1 + 142 54 l 1,53,-1 + 292 12 l 1,54,-1 + 442 54 l 1,55,-1 + 462 283 l 1,56,-1 + 196 283 l 1,57,-1 + 188 358 l 1,58,-1 + 471 358 l 1,43,-1 +EndSplineSet +EndChar + +StartChar: glyph140 +Encoding: 140 57484 141 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 112 + 0 + 13 + 0 + 14 + 2 + 13 + 14 + 89 + 0 + 2 + 0 + 0 + 1 + 2 + 0 + 91 + 17 + 8 + 2 + 1 + 7 + 1 + 3 + 10 + 1 + 3 + 91 + 0 + 10 + 0 + 5 + 11 + 10 + 5 + 91 + 0 + 11 + 16 + 1 + 4 + 6 + 11 + 4 + 91 + 0 + 6 + 0 + 9 + 15 + 6 + 9 + 89 + 18 + 1 + 15 + 12 + 12 + 15 + 77 + 18 + 1 + 15 + 15 + 12 + 83 + 0 + 12 + 15 + 12 + 71 + 68 + 68 + 34 + 33 + 19 + 18 + 68 + 71 + 68 + 71 + 70 + 69 + 66 + 63 + 58 + 55 + 48 + 46 + 45 + 43 + 38 + 37 + 33 + 51 + 34 + 51 + 28 + 27 + 24 + 23 + 22 + 20 + 18 + 32 + 19 + 32 + 19 + 19 + 36 + 16 + 19 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +271 467 m 128,-1,1 + 246 467 246 467 227 448.5 c 128,-1,2 + 208 430 208 430 208 404 c 0,3,4 + 208 379 208 379 226.5 360.5 c 128,-1,5 + 245 342 245 342 271 342 c 0,6,7 + 296 342 296 342 314.5 360 c 128,-1,8 + 333 378 333 378 333 404 c 128,-1,9 + 333 430 333 430 314.5 448.5 c 128,-1,0 + 296 467 296 467 271 467 c 128,-1,1 +271 508 m 128,-1,11 + 314 508 314 508 344.5 478 c 128,-1,12 + 375 448 375 448 375 404 c 128,-1,13 + 375 360 375 360 344.5 330 c 128,-1,14 + 314 300 314 300 271 300 c 128,-1,15 + 228 300 228 300 197.5 330 c 128,-1,16 + 167 360 167 360 167 404 c 128,-1,17 + 167 448 167 448 197.5 478 c 128,-1,10 + 228 508 228 508 271 508 c 128,-1,11 +396 175 m 0,18,19 + 357 175 357 175 321 196 c 128,-1,20 + 285 217 285 217 250 217 c 0,21,22 + 218 217 218 217 183 133 c 1,23,-1 + 657 133 l 1,24,25 + 642 201 642 201 620 249.5 c 128,-1,26 + 598 298 598 298 583 300 c 0,27,28 + 556 300 556 300 506 244 c 0,29,30 + 486 222 486 222 473.5 210.5 c 128,-1,31 + 461 199 461 199 439.5 187 c 128,-1,32 + 418 175 418 175 396 175 c 0,18,19 +583 342 m 0,33,34 + 620 342 620 342 651 279.5 c 128,-1,35 + 682 217 682 217 695 154 c 2,36,-1 + 708 92 l 1,37,-1 + 125 92 l 1,38,39 + 127 99 127 99 130 110 c 128,-1,40 + 133 121 133 121 145 149.5 c 128,-1,41 + 157 178 157 178 170 200 c 128,-1,42 + 183 222 183 222 205 240 c 128,-1,43 + 227 258 227 258 250 258 c 0,44,45 + 294 258 294 258 331 237.5 c 128,-1,46 + 368 217 368 217 396 217 c 0,47,48 + 416 217 416 217 439.5 236.5 c 128,-1,49 + 463 256 463 256 481.5 279.5 c 128,-1,50 + 500 303 500 303 527.5 322.5 c 128,-1,51 + 555 342 555 342 583 342 c 0,33,34 +833 550 m 2,52,-1 + 833 50 l 2,53,54 + 833 16 833 16 808.5 -8.5 c 128,-1,55 + 784 -33 784 -33 750 -33 c 2,56,-1 + 83 -33 l 2,57,58 + 48 -33 48 -33 24 -8.5 c 128,-1,59 + 0 16 0 16 0 50 c 2,60,-1 + 0 550 l 2,61,62 + 0 584 0 584 24 608.5 c 128,-1,63 + 48 633 48 633 83 633 c 2,64,-1 + 750 633 l 2,65,66 + 784 633 784 633 808.5 608.5 c 128,-1,67 + 833 584 833 584 833 550 c 2,52,-1 +750 50 m 1,68,-1 + 750 550 l 1,69,-1 + 83 550 l 1,70,-1 + 83 50 l 1,71,-1 + 750 50 l 1,68,-1 +EndSplineSet +EndChar + +StartChar: glyph141 +Encoding: 141 57485 142 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 58 + 11 + 1 + 2 + 0 + 1 + 5 + 2 + 96 + 0 + 4 + 1 + 5 + 5 + 4 + 96 + 0 + 6 + 0 + 8 + 0 + 6 + 8 + 89 + 0 + 0 + 10 + 1 + 1 + 4 + 0 + 1 + 91 + 0 + 5 + 0 + 3 + 9 + 5 + 3 + 90 + 12 + 1 + 9 + 7 + 7 + 9 + 77 + 12 + 1 + 9 + 9 + 7 + 83 + 0 + 7 + 9 + 7 + 71 +ELSE +MPPEM +PUSHB_1 + 30 +LT +IF +NPUSHB + 59 + 11 + 1 + 2 + 0 + 1 + 0 + 2 + 1 + 104 + 0 + 4 + 1 + 5 + 5 + 4 + 96 + 0 + 6 + 0 + 8 + 0 + 6 + 8 + 89 + 0 + 0 + 10 + 1 + 1 + 4 + 0 + 1 + 91 + 0 + 5 + 0 + 3 + 9 + 5 + 3 + 90 + 12 + 1 + 9 + 7 + 7 + 9 + 77 + 12 + 1 + 9 + 9 + 7 + 83 + 0 + 7 + 9 + 7 + 71 +ELSE +NPUSHB + 60 + 11 + 1 + 2 + 0 + 1 + 0 + 2 + 1 + 104 + 0 + 4 + 1 + 5 + 1 + 4 + 5 + 104 + 0 + 6 + 0 + 8 + 0 + 6 + 8 + 89 + 0 + 0 + 10 + 1 + 1 + 4 + 0 + 1 + 91 + 0 + 5 + 0 + 3 + 9 + 5 + 3 + 90 + 12 + 1 + 9 + 7 + 7 + 9 + 77 + 12 + 1 + 9 + 9 + 7 + 83 + 0 + 7 + 9 + 7 + 71 +EIF +EIF +NPUSHB + 33 + 39 + 39 + 5 + 4 + 0 + 0 + 39 + 42 + 39 + 42 + 41 + 40 + 36 + 33 + 28 + 25 + 18 + 16 + 14 + 12 + 9 + 8 + 4 + 22 + 5 + 22 + 0 + 3 + 0 + 3 + 17 + 13 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +167 446 m 128,-1,1 + 167 550 167 550 271 550 c 128,-1,2 + 375 550 375 550 375 446 c 128,-1,3 + 375 342 375 342 271 342 c 128,-1,0 + 167 342 167 342 167 446 c 128,-1,1 +583 383 m 0,4,5 + 616 383 616 383 645 334 c 0,6,7 + 686 260 686 260 708 133 c 1,8,-1 + 125 133 l 1,9,-1 + 138 175 l 2,10,11 + 152 218 152 218 182.5 259 c 128,-1,12 + 213 300 213 300 250 300 c 0,13,14 + 293 300 293 300 351 269 c 0,15,16 + 371 258 371 258 396 258 c 0,17,18 + 426 258 426 258 465 302 c 0,19,20 + 511 354 511 354 538 370 c 0,21,22 + 560 383 560 383 583 383 c 0,4,5 +0 592 m 2,23,24 + 0 626 0 626 24 650.5 c 128,-1,25 + 48 675 48 675 83 675 c 2,26,-1 + 750 675 l 2,27,28 + 784 675 784 675 808.5 650.5 c 128,-1,29 + 833 626 833 626 833 592 c 2,30,-1 + 833 92 l 2,31,32 + 833 57 833 57 808.5 32.5 c 128,-1,33 + 784 8 784 8 750 8 c 2,34,-1 + 83 8 l 2,35,36 + 49 8 49 8 24.5 32.5 c 128,-1,37 + 0 57 0 57 0 92 c 2,38,-1 + 0 592 l 2,23,24 +750 92 m 1,39,-1 + 750 592 l 1,40,-1 + 83 592 l 1,41,-1 + 83 92 l 1,42,-1 + 750 92 l 1,39,-1 +EndSplineSet +EndChar + +StartChar: glyph142 +Encoding: 142 57486 143 +Width: 896 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 109 + 41 + 1 + 0 + 4 + 6 + 1 + 9 + 10 + 81 + 70 + 59 + 48 + 4 + 8 + 9 + 17 + 1 + 11 + 8 + 31 + 1 + 5 + 2 + 5 + 66 + 7 + 16 + 2 + 4 + 1 + 1 + 0 + 10 + 4 + 0 + 91 + 15 + 1 + 10 + 12 + 1 + 9 + 8 + 10 + 9 + 91 + 13 + 1 + 8 + 14 + 1 + 11 + 2 + 8 + 11 + 91 + 3 + 1 + 2 + 5 + 5 + 2 + 79 + 3 + 1 + 2 + 2 + 5 + 83 + 6 + 1 + 5 + 2 + 5 + 71 + 24 + 23 + 85 + 83 + 79 + 77 + 74 + 72 + 68 + 66 + 63 + 61 + 57 + 55 + 52 + 50 + 46 + 45 + 40 + 38 + 34 + 32 + 30 + 28 + 23 + 42 + 24 + 42 + 36 + 35 + 36 + 34 + 17 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +813 262 m 0,0,1 + 813 336 813 336 759.5 389 c 128,-1,2 + 706 442 706 442 633 442 c 0,3,4 + 558 442 558 442 506 390 c 2,5,-1 + 448 334 l 1,6,-1 + 391 389 l 2,7,8 + 338 442 338 442 263 442 c 0,9,10 + 190 442 190 442 136.5 389 c 128,-1,11 + 83 336 83 336 83 262 c 128,-1,12 + 83 188 83 188 136.5 135 c 128,-1,13 + 190 82 190 82 263 82 c 0,14,15 + 338 82 338 82 390 134 c 2,16,-1 + 448 190 l 1,17,-1 + 505 134 l 2,18,19 + 557 82 557 82 632 82 c 0,20,21 + 706 82 706 82 759.5 135.5 c 128,-1,22 + 813 189 813 189 813 262 c 0,0,1 +633 525 m 0,23,24 + 742 525 742 525 819 448 c 128,-1,25 + 896 371 896 371 896 262 c 128,-1,26 + 896 153 896 153 819 76 c 0,27,28 + 741 -2 741 -2 633 -2 c 0,29,30 + 524 -2 524 -2 448 74 c 1,31,32 + 372 -2 372 -2 263 -2 c 0,33,34 + 155 -2 155 -2 77 76 c 0,35,36 + 0 153 0 153 0 262 c 128,-1,37 + 0 371 0 371 77 448 c 128,-1,38 + 154 525 154 525 263 525 c 0,39,40 + 373 525 373 525 448 450 c 1,41,42 + 523 525 523 525 633 525 c 0,23,24 +229 262 m 128,-1,44 + 229 248 229 248 239 238 c 128,-1,45 + 249 228 249 228 263 228 c 128,-1,46 + 277 228 277 228 287 238 c 2,47,-1 + 313 262 l 1,48,-1 + 289 285 l 2,49,50 + 278 296 278 296 263 296 c 0,51,52 + 249 296 249 296 239 286 c 128,-1,43 + 229 276 229 276 229 262 c 128,-1,44 +187 262 m 128,-1,54 + 187 293 187 293 209.5 315.5 c 128,-1,55 + 232 338 232 338 263 338 c 0,56,57 + 295 338 295 338 318 315 c 2,58,-1 + 373 262 l 1,59,-1 + 317 208 l 2,60,61 + 296 187 296 187 263 187 c 0,62,63 + 232 187 232 187 209.5 209 c 128,-1,53 + 187 231 187 231 187 262 c 128,-1,54 +667 262 m 128,-1,65 + 667 276 667 276 657.5 285.5 c 128,-1,66 + 648 295 648 295 633 295 c 0,67,68 + 617 295 617 295 608 286 c 2,69,-1 + 583 262 l 1,70,-1 + 607 239 l 2,71,72 + 618 228 618 228 633 228 c 0,73,74 + 647 228 647 228 657 238 c 128,-1,64 + 667 248 667 248 667 262 c 128,-1,65 +708 262 m 128,-1,76 + 708 231 708 231 686 209 c 128,-1,77 + 664 187 664 187 633 187 c 0,78,79 + 600 187 600 187 578 209 c 2,80,-1 + 523 262 l 1,81,-1 + 579 315 l 2,82,83 + 601 337 601 337 633 337 c 0,84,85 + 664 337 664 337 686 315 c 128,-1,75 + 708 293 708 293 708 262 c 128,-1,76 +EndSplineSet +EndChar + +StartChar: glyph143 +Encoding: 143 57487 144 +Width: 729 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 55 + 36 + 28 + 16 + 5 + 4 + 5 + 4 + 1 + 66 + 1 + 1 + 0 + 6 + 1 + 4 + 5 + 0 + 4 + 91 + 8 + 7 + 2 + 5 + 2 + 2 + 5 + 79 + 8 + 7 + 2 + 5 + 5 + 2 + 83 + 3 + 1 + 2 + 5 + 2 + 71 + 30 + 30 + 30 + 38 + 30 + 38 + 23 + 20 + 17 + 20 + 35 + 36 + 18 + 9 + 22 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +0 262 m 128,-1,1 + 0 336 0 336 53 389 c 128,-1,2 + 106 442 106 442 180 442 c 128,-1,3 + 254 442 254 442 307 389 c 2,4,-1 + 365 334 l 1,5,-1 + 423 390 l 2,6,7 + 475 442 475 442 549 442 c 0,8,9 + 622 442 622 442 675.5 389 c 128,-1,10 + 729 336 729 336 729 262 c 128,-1,11 + 729 188 729 188 675.5 135 c 128,-1,12 + 622 82 622 82 549 82 c 0,13,14 + 475 82 475 82 422 135 c 2,15,-1 + 365 190 l 1,16,-1 + 306 134 l 2,17,18 + 254 82 254 82 180 82 c 128,-1,19 + 106 82 106 82 53 135 c 128,-1,0 + 0 188 0 188 0 262 c 128,-1,1 +180 338 m 128,-1,21 + 149 338 149 338 126.5 315.5 c 128,-1,22 + 104 293 104 293 104 262 c 0,23,24 + 104 230 104 230 126 208 c 128,-1,25 + 148 186 148 186 180 186 c 128,-1,26 + 212 186 212 186 234 208 c 2,27,-1 + 289 262 l 1,28,-1 + 234 315 l 2,29,20 + 211 338 211 338 180 338 c 128,-1,21 +603 208 m 128,-1,31 + 625 230 625 230 625 262 c 128,-1,32 + 625 294 625 294 603 316 c 128,-1,33 + 581 338 581 338 549.5 338 c 128,-1,34 + 518 338 518 338 496 316 c 2,35,-1 + 440 262 l 1,36,-1 + 495 209 l 2,37,38 + 517 187 517 187 549 186.5 c 128,-1,30 + 581 186 581 186 603 208 c 128,-1,31 +EndSplineSet +EndChar + +StartChar: glyph144 +Encoding: 144 57488 145 +Width: 458 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 88 + 29 + 19 + 2 + 6 + 3 + 60 + 47 + 12 + 0 + 4 + 5 + 7 + 2 + 66 + 0 + 7 + 6 + 5 + 6 + 7 + 5 + 104 + 0 + 5 + 4 + 6 + 5 + 4 + 102 + 0 + 1 + 8 + 1 + 2 + 3 + 1 + 2 + 91 + 0 + 3 + 0 + 6 + 7 + 3 + 6 + 91 + 9 + 1 + 4 + 0 + 0 + 4 + 79 + 9 + 1 + 4 + 4 + 0 + 84 + 0 + 0 + 4 + 0 + 72 + 44 + 43 + 34 + 33 + 63 + 61 + 57 + 55 + 50 + 48 + 43 + 68 + 44 + 68 + 39 + 37 + 33 + 42 + 34 + 42 + 31 + 38 + 10 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +343 133 m 1,0,1 + 383 128 383 128 405 92 c 0,2,3 + 420 67 420 67 415 37 c 128,-1,4 + 410 7 410 7 388 -12 c 0,5,6 + 314 -75 314 -75 216 -75 c 0,7,8 + 88 -75 88 -75 40 23 c 0,9,10 + -2 110 -2 110 50 213 c 2,11,-1 + 74 259 l 1,12,13 + 33 264 33 264 11 300 c 0,14,15 + -4 325 -4 325 1 355 c 128,-1,16 + 6 385 6 385 28 404 c 0,17,18 + 79 447 79 447 151 461 c 1,19,20 + 125 503 125 503 125 550 c 0,21,22 + 125 619 125 619 174 668 c 128,-1,23 + 223 717 223 717 292 717 c 128,-1,24 + 361 717 361 717 409.5 668 c 128,-1,25 + 458 619 458 619 458 550 c 0,26,27 + 458 500 458 500 430.5 458.5 c 128,-1,28 + 403 417 403 417 358 397 c 1,29,30 + 390 355 390 355 393 298.5 c 128,-1,31 + 396 242 396 242 366 179 c 2,32,-1 + 343 133 l 1,0,1 +292 633 m 0,33,34 + 257 633 257 633 232.5 608.5 c 128,-1,35 + 208 584 208 584 208 550 c 128,-1,36 + 208 516 208 516 232.5 491.5 c 128,-1,37 + 257 467 257 467 292 467 c 0,38,39 + 326 467 326 467 350.5 491.5 c 128,-1,40 + 375 516 375 516 375 550 c 128,-1,41 + 375 584 375 584 350.5 608.5 c 128,-1,42 + 326 633 326 633 292 633 c 0,33,34 +216 8 m 0,43,44 + 247 8 247 8 276.5 18.5 c 128,-1,45 + 306 29 306 29 320 40 c 2,46,-1 + 333 50 l 1,47,48 + 307 41 307 41 283 41 c 0,49,50 + 246 41 246 41 238 67.5 c 128,-1,51 + 230 94 230 94 250 133 c 2,52,-1 + 292 216 l 2,53,54 + 327 289 327 289 300 336 c 128,-1,55 + 273 383 273 383 201 383 c 0,56,57 + 170 383 170 383 140.5 372.5 c 128,-1,58 + 111 362 111 362 97 352 c 2,59,-1 + 83 342 l 1,60,61 + 110 351 110 351 134 351 c 0,62,63 + 171 351 171 351 179 324 c 128,-1,64 + 187 297 187 297 167 259 c 2,65,-1 + 125 176 l 2,66,67 + 90 103 90 103 117 55.5 c 128,-1,68 + 144 8 144 8 216 8 c 0,43,44 +EndSplineSet +EndChar + +StartChar: glyph145 +Encoding: 145 57489 146 +Width: 333 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 53 + 0 + 1 + 2 + 3 + 2 + 1 + 3 + 104 + 0 + 3 + 0 + 2 + 3 + 0 + 102 + 0 + 4 + 6 + 1 + 5 + 2 + 4 + 5 + 91 + 0 + 2 + 1 + 0 + 2 + 79 + 0 + 2 + 2 + 0 + 83 + 0 + 0 + 2 + 0 + 71 + 40 + 40 + 40 + 43 + 40 + 43 + 20 + 39 + 41 + 39 + 38 + 7 + 20 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +264 70 m 2,0,1 + 279 75 279 75 288.5 60.5 c 128,-1,2 + 298 46 298 46 285 34 c 0,3,4 + 281 30 281 30 267.5 21 c 128,-1,5 + 254 12 254 12 220.5 0 c 128,-1,6 + 187 -12 187 -12 153 -12 c 0,7,8 + 66 -12 66 -12 34 51 c 0,9,10 + 6 110 6 110 44 185 c 2,11,-1 + 86 268 l 2,12,13 + 108 312 108 312 88 326 c 0,14,15 + 84 330 84 330 71 330 c 0,16,17 + 62 330 62 330 51.5 328 c 128,-1,18 + 41 326 41 326 34 324 c 2,19,-1 + 28 322 l 2,20,21 + 13 317 13 317 3.5 331 c 128,-1,22 + -6 345 -6 345 7 357 c 0,23,24 + 12 362 12 362 24.5 370.5 c 128,-1,25 + 37 379 37 379 70.5 391.5 c 128,-1,26 + 104 404 104 404 138 404 c 0,27,28 + 227 404 227 404 258 341 c 0,29,30 + 286 282 286 282 248 207 c 2,31,-1 + 206 124 l 2,32,33 + 184 79 184 79 204 65 c 0,34,35 + 207 62 207 62 221 62 c 0,36,37 + 230 62 230 62 240.5 64 c 128,-1,38 + 251 66 251 66 258 68 c 2,39,-1 + 264 70 l 2,0,1 +125 550 m 128,-1,41 + 125 654 125 654 229 654 c 128,-1,42 + 333 654 333 654 333 550 c 128,-1,43 + 333 446 333 446 229 446 c 128,-1,40 + 125 446 125 446 125 550 c 128,-1,41 +EndSplineSet +EndChar + +StartChar: glyph146 +Encoding: 146 57490 147 +Width: 819 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 43 + 29 + 2 + 4 + 5 + 1 + 66 + 0 + 3 + 8 + 1 + 0 + 6 + 3 + 0 + 91 + 0 + 6 + 0 + 7 + 5 + 6 + 7 + 91 + 0 + 5 + 0 + 4 + 1 + 5 + 4 + 91 + 0 + 1 + 2 + 2 + 1 + 79 + 0 + 1 + 1 + 2 + 83 + 9 + 1 + 2 + 1 + 2 + 71 + 14 + 13 + 1 + 0 + 64 + 62 + 60 + 58 + 48 + 46 + 34 + 32 + 22 + 20 + 13 + 28 + 14 + 27 + 8 + 5 + 0 + 12 + 1 + 12 + 10 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +410 570 m 0,0,1 + 371 570 371 570 345 526 c 2,2,-1 + 99 115 l 2,3,4 + 73 71 73 71 90.5 39.5 c 128,-1,5 + 108 8 108 8 160 8 c 2,6,-1 + 660 8 l 2,7,8 + 712 8 712 8 729.5 40 c 128,-1,9 + 747 72 747 72 720 116 c 2,10,-1 + 474 526 l 2,11,12 + 448 570 448 570 410 570 c 0,0,1 +160 -75 m 2,13,14 + 93 -75 93 -75 46.5 -37 c 128,-1,15 + 0 1 0 1 0 65 c 0,16,17 + 0 110 0 110 28 158 c 2,18,-1 + 274 569 l 2,19,20 + 324 654 324 654 410 654 c 0,21,22 + 495 654 495 654 545 569 c 2,23,-1 + 792 158 l 2,24,25 + 843 73 843 73 802 -1 c 0,26,27 + 759 -75 759 -75 660 -75 c 2,28,-1 + 160 -75 l 2,13,14 +472 102 m 1,29,30 + 468 98 468 98 461.5 92 c 128,-1,31 + 455 86 455 86 433 76.5 c 128,-1,32 + 411 67 411 67 388 68 c 0,33,34 + 357 70 357 70 344 94.5 c 128,-1,35 + 331 119 331 119 343 156 c 2,36,-1 + 360 207 l 2,37,38 + 372 243 372 243 350 255 c 0,39,40 + 342 258 342 258 332 256.5 c 128,-1,41 + 322 255 322 255 314 252 c 2,42,-1 + 306 248 l 1,43,44 + 310 252 310 252 316.5 258 c 128,-1,45 + 323 264 323 264 345 273.5 c 128,-1,46 + 367 283 367 283 390 282 c 0,47,48 + 421 280 421 280 434 255 c 128,-1,49 + 447 230 447 230 435 193 c 2,50,-1 + 418 142 l 2,51,52 + 407 106 407 106 428 95 c 0,53,54 + 436 92 436 92 446 93.5 c 128,-1,55 + 456 95 456 95 464 98 c 2,56,-1 + 472 102 l 1,29,30 +355 383 m 0,57,58 + 355 438 355 438 410 438 c 0,59,60 + 464 438 464 438 464 383 c 0,61,62 + 464 329 464 329 410 329 c 0,63,64 + 355 329 355 329 355 383 c 0,57,58 +EndSplineSet +EndChar + +StartChar: glyph147 +Encoding: 147 57491 148 +Width: 819 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 0 + 6 + 5 + 4 + 5 + 6 + 4 + 104 + 0 + 4 + 7 + 5 + 4 + 7 + 102 + 0 + 1 + 9 + 1 + 2 + 3 + 1 + 2 + 91 + 0 + 3 + 0 + 5 + 6 + 3 + 5 + 91 + 0 + 7 + 0 + 0 + 7 + 79 + 0 + 7 + 7 + 0 + 84 + 8 + 1 + 0 + 7 + 0 + 72 + 19 + 18 + 1 + 0 + 59 + 56 + 50 + 49 + 42 + 40 + 34 + 33 + 25 + 23 + 18 + 28 + 19 + 28 + 9 + 7 + 0 + 17 + 1 + 16 + 10 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +160 -75 m 2,0,1 + 93 -75 93 -75 46.5 -37 c 128,-1,2 + 0 1 0 1 0 66 c 0,3,4 + 0 111 0 111 28 158 c 2,5,-1 + 274 569 l 2,6,7 + 324 654 324 654 410 654 c 0,8,9 + 495 654 495 654 545 569 c 2,10,-1 + 792 158 l 2,11,12 + 819 114 819 114 819 65 c 0,13,14 + 819 27 819 27 802 -1 c 0,15,16 + 759 -75 759 -75 660 -75 c 2,17,-1 + 160 -75 l 2,0,1 +410 448 m 0,18,19 + 383 448 383 448 364 429 c 128,-1,20 + 345 410 345 410 345 383 c 0,21,22 + 345 357 345 357 364.5 338 c 128,-1,23 + 384 319 384 319 410 319 c 0,24,25 + 437 319 437 319 455.5 338 c 128,-1,26 + 474 357 474 357 474 383 c 128,-1,27 + 474 409 474 409 455 428.5 c 128,-1,28 + 436 448 436 448 410 448 c 0,18,19 +480 95 m 0,29,30 + 486 102 486 102 480 107.5 c 128,-1,31 + 474 113 474 113 468 110 c 0,32,33 + 448 102 448 102 438 102 c 2,34,-1 + 432 103 l 2,35,36 + 418 109 418 109 428 138 c 2,37,-1 + 445 189 l 2,38,39 + 458 230 458 230 442 260 c 128,-1,40 + 426 290 426 290 390 292 c 0,41,42 + 365 293 365 293 342 283.5 c 128,-1,43 + 319 274 319 274 309.5 265.5 c 128,-1,44 + 300 257 300 257 298 254 c 0,45,46 + 292 247 292 247 297.5 241 c 128,-1,47 + 303 235 303 235 310 238 c 0,48,49 + 330 246 330 246 340 246 c 2,50,-1 + 346 245 l 2,51,52 + 360 239 360 239 350 210 c 2,53,-1 + 333 159 l 2,54,55 + 319 118 319 118 335.5 88.5 c 128,-1,56 + 352 59 352 59 388 57 c 2,57,-1 + 394 57 l 2,58,59 + 418 57 418 57 439.5 66.5 c 128,-1,60 + 461 76 461 76 470 84 c 128,-1,61 + 479 92 479 92 480 95 c 0,29,30 +EndSplineSet +EndChar + +StartChar: glyph148 +Encoding: 148 57492 149 +Width: 625 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 88 + 4 + 1 + 3 + 7 + 58 + 44 + 20 + 3 + 4 + 3 + 2 + 66 + 9 + 1 + 0 + 2 + 0 + 106 + 0 + 2 + 0 + 8 + 7 + 2 + 8 + 91 + 0 + 7 + 0 + 3 + 4 + 7 + 3 + 91 + 0 + 4 + 0 + 6 + 5 + 4 + 6 + 91 + 10 + 1 + 5 + 1 + 1 + 5 + 79 + 10 + 1 + 5 + 5 + 1 + 84 + 0 + 1 + 5 + 1 + 72 + 41 + 40 + 1 + 0 + 61 + 59 + 56 + 55 + 49 + 48 + 40 + 67 + 41 + 66 + 30 + 29 + 24 + 22 + 17 + 15 + 10 + 7 + 0 + 18 + 1 + 18 + 11 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +500 633 m 0,0,1 + 569 633 569 633 607 573 c 128,-1,2 + 645 513 645 513 609 448 c 2,3,-1 + 583 402 l 1,4,-1 + 583 133 l 2,5,6 + 583 81 583 81 546.5 44.5 c 128,-1,7 + 510 8 510 8 458 8 c 2,8,-1 + 125 8 l 2,9,10 + 73 8 73 8 36.5 44.5 c 128,-1,11 + 0 81 0 81 0 133 c 2,12,-1 + 0 467 l 2,13,14 + 0 519 0 519 36.5 555.5 c 128,-1,15 + 73 592 73 592 125 592 c 2,16,-1 + 408 592 l 1,17,18 + 444 633 444 633 500 633 c 0,0,1 +464 529 m 2,19,-1 + 323 286 l 1,20,-1 + 238 371 l 2,21,22 + 226 383 226 383 208 383 c 0,23,24 + 191 383 191 383 179 371 c 128,-1,25 + 167 359 167 359 167 341.5 c 128,-1,26 + 167 324 167 324 179 312 c 2,27,-1 + 304 187 l 2,28,29 + 316 175 316 175 333 175 c 0,30,31 + 360 177 360 177 370 196 c 2,32,-1 + 537 488 l 1,33,34 + 543 508 543 508 540 520 c 0,35,36 + 535 537 535 537 519 545.5 c 128,-1,37 + 503 554 503 554 483 546 c 0,38,39 + 469 539 469 539 464 529 c 2,19,-1 +458 92 m 2,40,41 + 475 92 475 92 487.5 104 c 128,-1,42 + 500 116 500 116 500 133 c 2,43,-1 + 500 340 l 1,44,-1 + 406 176 l 2,45,46 + 386 140 386 140 345 134 c 2,47,-1 + 333 133 l 2,48,49 + 299 133 299 133 274 158 c 2,50,-1 + 149 283 l 2,51,52 + 124 308 124 308 124 342 c 128,-1,53 + 124 376 124 376 149 401 c 0,54,55 + 173 425 173 425 208 425 c 128,-1,56 + 243 425 243 425 267 401 c 2,57,-1 + 314 354 l 1,58,-1 + 404 508 l 1,59,-1 + 125 508 l 2,60,61 + 108 508 108 508 95.5 496 c 128,-1,62 + 83 484 83 484 83 467 c 2,63,-1 + 83 133 l 2,64,65 + 83 116 83 116 95.5 104 c 128,-1,66 + 108 92 108 92 125 92 c 2,67,-1 + 458 92 l 2,40,41 +EndSplineSet +EndChar + +StartChar: glyph149 +Encoding: 149 57493 150 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 73 + 45 + 1 + 4 + 6 + 1 + 66 + 0 + 6 + 2 + 4 + 2 + 6 + 4 + 104 + 0 + 4 + 5 + 2 + 4 + 5 + 102 + 0 + 5 + 3 + 2 + 5 + 3 + 102 + 0 + 1 + 0 + 2 + 6 + 1 + 2 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 84 + 7 + 1 + 0 + 3 + 0 + 72 + 2 + 0 + 43 + 42 + 37 + 36 + 30 + 29 + 24 + 21 + 16 + 13 + 10 + 7 + 0 + 35 + 2 + 35 + 8 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +458 8 m 2,0,-1 + 125 8 l 2,1,2 + 73 8 73 8 36.5 44.5 c 128,-1,3 + 0 81 0 81 0 133 c 2,4,-1 + 0 467 l 2,5,6 + 0 519 0 519 36.5 555.5 c 128,-1,7 + 73 592 73 592 125 592 c 2,8,-1 + 333 592 l 2,9,10 + 350 592 350 592 362.5 579.5 c 128,-1,11 + 375 567 375 567 375 550 c 128,-1,12 + 375 533 375 533 362.5 520.5 c 128,-1,13 + 350 508 350 508 333 508 c 2,14,-1 + 125 508 l 2,15,16 + 108 508 108 508 95.5 496 c 128,-1,17 + 83 484 83 484 83 467 c 2,18,-1 + 83 133 l 2,19,20 + 83 116 83 116 95.5 104 c 128,-1,21 + 108 92 108 92 125 92 c 2,22,-1 + 458 92 l 2,23,24 + 475 92 475 92 487.5 104 c 128,-1,25 + 500 116 500 116 500 133 c 2,26,-1 + 500 258 l 2,27,28 + 500 275 500 275 512.5 287.5 c 128,-1,29 + 525 300 525 300 542 300 c 128,-1,30 + 559 300 559 300 571 287.5 c 128,-1,31 + 583 275 583 275 583 258 c 2,32,-1 + 583 133 l 2,33,34 + 583 81 583 81 546.5 44.5 c 128,-1,35 + 510 8 510 8 458 8 c 2,0,-1 +340 182 m 0,36,37 + 317 182 317 182 301 198 c 2,38,-1 + 190 309 l 2,39,40 + 174 326 174 326 174 349 c 128,-1,41 + 174 372 174 372 190 388 c 128,-1,42 + 206 404 206 404 229 404 c 128,-1,43 + 252 404 252 404 268 388 c 2,44,-1 + 328 329 l 1,45,-1 + 472 556 l 2,46,47 + 483 576 483 576 505.5 582.5 c 128,-1,48 + 528 589 528 589 548 578 c 128,-1,49 + 568 567 568 567 574 544.5 c 128,-1,50 + 580 522 580 522 569 502 c 2,51,-1 + 389 211 l 2,52,53 + 375 185 375 185 340 182 c 0,36,37 +EndSplineSet +EndChar + +StartChar: glyph150 +Encoding: 150 57494 151 +Width: 646 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 3 + 1 + 11 + 9 + 31 + 1 + 6 + 11 + 2 + 1 + 2 + 6 + 32 + 1 + 3 + 5 + 4 + 66 +MPPEM +PUSHB_1 + 15 +LT +IF +NPUSHB + 62 + 0 + 5 + 2 + 3 + 4 + 5 + 96 + 0 + 3 + 4 + 2 + 3 + 94 + 0 + 1 + 0 + 7 + 10 + 1 + 7 + 91 + 12 + 1 + 10 + 0 + 8 + 9 + 10 + 8 + 91 + 0 + 9 + 0 + 11 + 6 + 9 + 11 + 91 + 0 + 6 + 0 + 2 + 5 + 6 + 2 + 91 + 0 + 4 + 0 + 0 + 4 + 77 + 0 + 4 + 4 + 0 + 82 + 0 + 0 + 4 + 0 + 70 +ELSE +NPUSHB + 64 + 0 + 5 + 2 + 3 + 2 + 5 + 3 + 104 + 0 + 3 + 4 + 2 + 3 + 4 + 102 + 0 + 1 + 0 + 7 + 10 + 1 + 7 + 91 + 12 + 1 + 10 + 0 + 8 + 9 + 10 + 8 + 91 + 0 + 9 + 0 + 11 + 6 + 9 + 11 + 91 + 0 + 6 + 0 + 2 + 5 + 6 + 2 + 91 + 0 + 4 + 0 + 0 + 4 + 77 + 0 + 4 + 4 + 0 + 82 + 0 + 0 + 4 + 0 + 70 +EIF +NPUSHB + 21 + 42 + 41 + 47 + 46 + 41 + 50 + 42 + 50 + 38 + 37 + 23 + 19 + 33 + 17 + 17 + 17 + 35 + 22 + 16 + 13 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +250 -75 m 1,0,-1 + 0 -75 l 1,1,-1 + 0 109 l 1,2,-1 + 158 267 l 1,3,4 + 146 303 146 303 146 342 c 0,5,6 + 146 446 146 446 219 519 c 128,-1,7 + 292 592 292 592 396 592 c 128,-1,8 + 500 592 500 592 573 519 c 128,-1,9 + 646 446 646 446 646 342 c 128,-1,10 + 646 238 646 238 573 165 c 128,-1,11 + 500 92 500 92 396 92 c 2,12,-1 + 333 92 l 1,13,-1 + 333 8 l 1,14,-1 + 250 8 l 1,15,-1 + 250 -75 l 1,0,-1 +83 8 m 1,16,-1 + 167 8 l 1,17,-1 + 167 92 l 1,18,-1 + 250 92 l 1,19,-1 + 250 175 l 1,20,-1 + 396 175 l 2,21,22 + 465 175 465 175 513.5 224 c 128,-1,23 + 562 273 562 273 562 342 c 128,-1,24 + 562 411 562 411 513.5 459.5 c 128,-1,25 + 465 508 465 508 396 508 c 128,-1,26 + 327 508 327 508 278 459.5 c 128,-1,27 + 229 411 229 411 229 342 c 0,28,29 + 229 306 229 306 244 273 c 2,30,-1 + 256 247 l 1,31,-1 + 83 74 l 1,32,-1 + 83 8 l 1,16,-1 +396 383 m 128,-1,34 + 379 383 379 383 366.5 371 c 128,-1,35 + 354 359 354 359 354 342 c 128,-1,36 + 354 325 354 325 366.5 312.5 c 128,-1,37 + 379 300 379 300 396 300 c 128,-1,38 + 413 300 413 300 425.5 312.5 c 128,-1,39 + 438 325 438 325 438 342 c 128,-1,40 + 438 359 438 359 425.5 371 c 128,-1,33 + 413 383 413 383 396 383 c 128,-1,34 +396 425 m 0,41,42 + 430 425 430 425 454.5 400.5 c 128,-1,43 + 479 376 479 376 479 342 c 0,44,45 + 479 307 479 307 454.5 282.5 c 128,-1,46 + 430 258 430 258 396 258 c 128,-1,47 + 362 258 362 258 337 283 c 128,-1,48 + 312 308 312 308 312 342 c 128,-1,49 + 312 376 312 376 336.5 400.5 c 128,-1,50 + 361 425 361 425 396 425 c 0,41,42 +EndSplineSet +EndChar + +StartChar: glyph151 +Encoding: 151 57495 152 +Width: 562 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 58 + 18 + 1 + 1 + 4 + 17 + 1 + 2 + 1 + 16 + 1 + 3 + 2 + 3 + 66 + 0 + 2 + 1 + 3 + 1 + 2 + 3 + 104 + 0 + 3 + 3 + 105 + 0 + 0 + 0 + 5 + 4 + 0 + 5 + 91 + 0 + 4 + 1 + 1 + 4 + 79 + 0 + 4 + 4 + 1 + 83 + 0 + 1 + 4 + 1 + 71 + 35 + 23 + 33 + 17 + 35 + 18 + 6 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +146 342 m 0,0,1 + 146 428 146 428 207 489 c 128,-1,2 + 268 550 268 550 354 550 c 128,-1,3 + 440 550 440 550 501 489 c 128,-1,4 + 562 428 562 428 562 342 c 128,-1,5 + 562 256 562 256 501 194.5 c 128,-1,6 + 440 133 440 133 354 133 c 2,7,-1 + 250 133 l 1,8,-1 + 250 50 l 1,9,-1 + 167 50 l 1,10,-1 + 167 -33 l 1,11,-1 + 83 -33 l 2,12,13 + 63 -33 63 -33 42 -17.5 c 128,-1,14 + 21 -2 21 -2 10 14 c 2,15,-1 + 0 29 l 1,16,-1 + 0 92 l 1,17,-1 + 165 256 l 1,18,19 + 146 297 146 297 146 342 c 0,0,1 +354 258 m 128,-1,21 + 388 258 388 258 413 283 c 128,-1,22 + 438 308 438 308 438 342 c 128,-1,23 + 438 376 438 376 413.5 400.5 c 128,-1,24 + 389 425 389 425 354 425 c 0,25,26 + 320 425 320 425 295.5 400.5 c 128,-1,27 + 271 376 271 376 271 342 c 0,28,29 + 271 307 271 307 295.5 282.5 c 128,-1,20 + 320 258 320 258 354 258 c 128,-1,21 +EndSplineSet +EndChar + +StartChar: glyph152 +Encoding: 152 57496 153 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 168 + 39 + 1 + 33 + 0 + 35 + 4 + 33 + 35 + 89 + 27 + 24 + 20 + 16 + 12 + 8 + 6 + 4 + 25 + 21 + 17 + 13 + 9 + 5 + 5 + 7 + 4 + 5 + 89 + 26 + 22 + 18 + 14 + 10 + 5 + 7 + 37 + 28 + 23 + 19 + 15 + 11 + 6 + 6 + 0 + 7 + 6 + 90 + 38 + 32 + 2 + 3 + 0 + 29 + 1 + 0 + 77 + 31 + 1 + 29 + 30 + 3 + 2 + 1 + 36 + 29 + 1 + 90 + 40 + 1 + 36 + 34 + 34 + 36 + 77 + 40 + 1 + 36 + 36 + 34 + 83 + 0 + 34 + 36 + 34 + 71 + 82 + 82 + 67 + 66 + 58 + 58 + 52 + 52 + 82 + 85 + 82 + 85 + 84 + 83 + 75 + 72 + 66 + 81 + 67 + 80 + 58 + 65 + 58 + 65 + 64 + 63 + 62 + 61 + 60 + 59 + 52 + 57 + 52 + 57 + 56 + 55 + 54 + 53 + 51 + 50 + 49 + 48 + 47 + 46 + 45 + 44 + 43 + 42 + 41 + 40 + 39 + 38 + 37 + 36 + 35 + 34 + 33 + 32 + 31 + 30 + 29 + 28 + 27 + 26 + 25 + 24 + 23 + 22 + 21 + 20 + 19 + 18 + 17 + 17 + 17 + 17 + 17 + 17 + 17 + 17 + 16 + 41 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +250 258 m 1,0,-1 + 542 258 l 1,1,-1 + 542 175 l 1,2,-1 + 250 175 l 1,3,-1 + 250 258 l 1,0,-1 +125 258 m 1,4,-1 + 208 258 l 1,5,-1 + 208 175 l 1,6,-1 + 125 175 l 1,7,-1 + 125 258 l 1,4,-1 +125 425 m 1,8,-1 + 208 425 l 1,9,-1 + 208 383 l 1,10,-1 + 125 383 l 1,11,-1 + 125 425 l 1,8,-1 +250 300 m 1,12,-1 + 125 300 l 1,13,-1 + 125 342 l 1,14,-1 + 250 342 l 1,15,-1 + 250 300 l 1,12,-1 +250 425 m 1,16,-1 + 292 425 l 1,17,-1 + 292 383 l 1,18,-1 + 250 383 l 1,19,-1 + 250 425 l 1,16,-1 +292 342 m 1,20,-1 + 333 342 l 1,21,-1 + 333 300 l 1,22,-1 + 292 300 l 1,23,-1 + 292 342 l 1,20,-1 +333 425 m 1,24,-1 + 375 425 l 1,25,-1 + 375 383 l 1,26,-1 + 333 383 l 1,27,-1 + 333 425 l 1,24,-1 +375 342 m 1,28,-1 + 417 342 l 1,29,-1 + 417 300 l 1,30,-1 + 375 300 l 1,31,-1 + 375 342 l 1,28,-1 +417 425 m 1,32,-1 + 458 425 l 1,33,-1 + 458 383 l 1,34,-1 + 417 383 l 1,35,-1 + 417 425 l 1,32,-1 +458 342 m 1,36,-1 + 500 342 l 1,37,-1 + 500 300 l 1,38,-1 + 458 300 l 1,39,-1 + 458 342 l 1,36,-1 +500 425 m 1,40,-1 + 542 425 l 1,41,-1 + 542 383 l 1,42,-1 + 500 383 l 1,43,-1 + 500 425 l 1,40,-1 +542 342 m 1,44,-1 + 583 342 l 1,45,-1 + 583 300 l 1,46,-1 + 542 300 l 1,47,-1 + 542 342 l 1,44,-1 +583 425 m 1,48,-1 + 625 425 l 1,49,-1 + 625 383 l 1,50,-1 + 583 383 l 1,51,-1 + 583 425 l 1,48,-1 +625 300 m 1,52,-1 + 625 342 l 1,53,-1 + 667 342 l 1,54,-1 + 667 425 l 1,55,-1 + 708 425 l 1,56,-1 + 708 300 l 1,57,-1 + 625 300 l 1,52,-1 +667 258 m 1,58,-1 + 667 217 l 1,59,-1 + 708 217 l 1,60,-1 + 708 175 l 1,61,-1 + 583 175 l 1,62,-1 + 583 217 l 1,63,-1 + 625 217 l 1,64,-1 + 625 258 l 1,65,-1 + 667 258 l 1,58,-1 +750 550 m 2,66,67 + 784 550 784 550 808.5 526 c 128,-1,68 + 833 502 833 502 833 467 c 2,69,-1 + 833 133 l 2,70,71 + 833 98 833 98 808.5 74 c 128,-1,72 + 784 50 784 50 750 50 c 2,73,-1 + 83 50 l 2,74,75 + 48 50 48 50 24 74 c 128,-1,76 + 0 98 0 98 0 133 c 2,77,-1 + 0 467 l 2,78,79 + 0 502 0 502 24 526 c 128,-1,80 + 48 550 48 550 83 550 c 2,81,-1 + 750 550 l 2,66,67 +750 133 m 1,82,-1 + 750 467 l 1,83,-1 + 83 467 l 1,84,-1 + 83 133 l 1,85,-1 + 750 133 l 1,82,-1 +EndSplineSet +EndChar + +StartChar: glyph153 +Encoding: 153 57497 154 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 43 + 66 + 61 + 60 + 54 + 47 + 41 + 40 + 34 + 33 + 21 + 10 + 3 + 12 + 0 + 1 + 1 + 66 + 27 + 17 + 2 + 1 + 64 + 0 + 1 + 0 + 0 + 1 + 79 + 0 + 1 + 1 + 0 + 83 + 0 + 0 + 1 + 0 + 71 + 51 + 50 + 22 + 2 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +708 342 m 0,0,1 + 708 198 708 198 621 84.5 c 128,-1,2 + 534 -29 534 -29 396 -66 c 1,3,-1 + 396 -117 l 2,4,5 + 396 -134 396 -134 383.5 -146 c 128,-1,6 + 371 -158 371 -158 354 -158 c 128,-1,7 + 337 -158 337 -158 324.5 -146 c 128,-1,8 + 312 -134 312 -134 312 -117 c 2,9,-1 + 312 -66 l 1,10,11 + 174 -29 174 -29 87 84.5 c 128,-1,12 + 0 198 0 198 0 342 c 0,13,14 + 0 495 0 495 98 612.5 c 128,-1,15 + 196 730 196 730 347 758 c 1,16,-1 + 354 759 l 1,17,-1 + 362 758 l 1,18,19 + 513 730 513 730 610.5 612.5 c 128,-1,20 + 708 495 708 495 708 342 c 0,0,1 +396 21 m 1,21,22 + 498 56 498 56 561.5 144 c 128,-1,23 + 625 232 625 232 625 342 c 0,24,25 + 625 463 625 463 548.5 556.5 c 128,-1,26 + 472 650 472 650 354 674 c 1,27,28 + 236 650 236 650 159.5 556.5 c 128,-1,29 + 83 463 83 463 83 342 c 0,30,31 + 83 233 83 233 147 144.5 c 128,-1,32 + 211 56 211 56 313 21 c 1,33,-1 + 313 146 l 1,34,-1 + 131 327 l 2,35,36 + 122 336 122 336 126 347 c 128,-1,37 + 130 358 130 358 140.5 361 c 128,-1,38 + 151 364 151 364 161 356 c 2,39,-1 + 313 204 l 1,40,-1 + 313 354 l 1,41,-1 + 214 452 l 2,42,43 + 205 461 205 461 209 472 c 128,-1,44 + 213 483 213 483 223.5 486 c 128,-1,45 + 234 489 234 489 244 481 c 2,46,-1 + 312 413 l 1,47,-1 + 312 550 l 2,48,49 + 312 567 312 567 324.5 579.5 c 128,-1,50 + 337 592 337 592 354 592 c 128,-1,51 + 371 592 371 592 383.5 579.5 c 128,-1,52 + 396 567 396 567 396 550 c 2,53,-1 + 396 413 l 1,54,-1 + 464 481 l 2,55,56 + 473 490 473 490 484.5 486 c 128,-1,57 + 496 482 496 482 499 472 c 128,-1,58 + 502 462 502 462 494 452 c 2,59,-1 + 396 354 l 1,60,-1 + 396 204 l 1,61,-1 + 548 356 l 2,62,63 + 562 370 562 370 576.5 355.5 c 128,-1,64 + 591 341 591 341 577 327 c 2,65,-1 + 396 146 l 1,66,-1 + 396 21 l 1,21,22 +EndSplineSet +EndChar + +StartChar: glyph154 +Encoding: 154 57498 155 +Width: 625 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 65 + 0 + 1 + 2 + 11 + 2 + 1 + 11 + 104 + 0 + 11 + 10 + 10 + 11 + 94 + 0 + 3 + 4 + 4 + 3 + 95 + 0 + 5 + 0 + 9 + 0 + 5 + 9 + 91 + 13 + 1 + 0 + 0 + 2 + 1 + 0 + 2 + 91 + 12 + 1 + 10 + 0 + 7 + 8 + 10 + 7 + 90 + 14 + 1 + 8 + 4 + 4 + 8 + 77 + 14 + 1 + 8 + 8 + 4 + 83 + 6 + 1 + 4 + 8 + 4 + 71 +ELSE +MPPEM +PUSHB_1 + 30 +LT +IF +NPUSHB + 66 + 0 + 1 + 2 + 11 + 2 + 1 + 11 + 104 + 0 + 11 + 10 + 2 + 11 + 10 + 102 + 0 + 3 + 4 + 4 + 3 + 95 + 0 + 5 + 0 + 9 + 0 + 5 + 9 + 91 + 13 + 1 + 0 + 0 + 2 + 1 + 0 + 2 + 91 + 12 + 1 + 10 + 0 + 7 + 8 + 10 + 7 + 90 + 14 + 1 + 8 + 4 + 4 + 8 + 77 + 14 + 1 + 8 + 8 + 4 + 83 + 6 + 1 + 4 + 8 + 4 + 71 +ELSE +NPUSHB + 65 + 0 + 1 + 2 + 11 + 2 + 1 + 11 + 104 + 0 + 11 + 10 + 2 + 11 + 10 + 102 + 0 + 3 + 4 + 3 + 107 + 0 + 5 + 0 + 9 + 0 + 5 + 9 + 91 + 13 + 1 + 0 + 0 + 2 + 1 + 0 + 2 + 91 + 12 + 1 + 10 + 0 + 7 + 8 + 10 + 7 + 90 + 14 + 1 + 8 + 4 + 4 + 8 + 77 + 14 + 1 + 8 + 8 + 4 + 83 + 6 + 1 + 4 + 8 + 4 + 71 +EIF +EIF +NPUSHB + 36 + 45 + 45 + 1 + 0 + 71 + 70 + 67 + 66 + 63 + 62 + 55 + 53 + 45 + 48 + 45 + 48 + 47 + 46 + 43 + 41 + 31 + 30 + 19 + 17 + 15 + 14 + 12 + 10 + 6 + 5 + 0 + 13 + 1 + 13 + 15 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +312 571 m 0,0,1 + 363 571 363 571 399.5 534.5 c 128,-1,2 + 436 498 436 498 436 447 c 0,3,4 + 436 438 436 438 430 432 c 128,-1,5 + 424 426 424 426 415 426 c 128,-1,6 + 406 426 406 426 400 432 c 128,-1,7 + 394 438 394 438 394 447 c 0,8,9 + 394 481 394 481 370 505 c 128,-1,10 + 346 529 346 529 312 529 c 0,11,12 + 292 529 292 529 292 550 c 128,-1,13 + 292 571 292 571 312 571 c 0,0,1 +312 -117 m 128,-1,15 + 295 -117 295 -117 283 -104.5 c 128,-1,16 + 271 -92 271 -92 271 -75 c 1,17,-1 + 188 -75 l 2,18,19 + 171 -75 171 -75 158.5 -62.5 c 128,-1,20 + 146 -50 146 -50 146 -33 c 2,21,-1 + 146 92 l 2,22,23 + 146 117 146 117 128 153 c 128,-1,24 + 110 189 110 189 56 267 c 1,25,-1 + 53 272 l 1,26,27 + 0 351 0 351 0 446 c 0,28,29 + 0 575 0 575 91.5 666.5 c 128,-1,30 + 183 758 183 758 312 758 c 128,-1,31 + 441 758 441 758 533 666.5 c 128,-1,32 + 625 575 625 575 625 446 c 0,33,34 + 625 349 625 349 568 267 c 0,35,36 + 514 190 514 190 496.5 154.5 c 128,-1,37 + 479 119 479 119 479 92 c 2,38,-1 + 479 -33 l 2,39,40 + 479 -50 479 -50 467 -62.5 c 128,-1,41 + 455 -75 455 -75 438 -75 c 2,42,-1 + 354 -75 l 1,43,44 + 354 -92 354 -92 341.5 -104.5 c 128,-1,14 + 329 -117 329 -117 312 -117 c 128,-1,15 +396 8 m 1,45,-1 + 396 50 l 1,46,-1 + 229 50 l 1,47,-1 + 229 8 l 1,48,-1 + 396 8 l 1,45,-1 +500 314 m 0,49,50 + 542 375 542 375 542 446 c 0,51,52 + 542 540 542 540 474.5 607.5 c 128,-1,53 + 407 675 407 675 312 675 c 0,54,55 + 218 675 218 675 150.5 607.5 c 128,-1,56 + 83 540 83 540 83 446 c 0,57,58 + 83 376 83 376 125 315 c 1,59,-1 + 128 309 l 1,60,61 + 210 192 210 192 224 133 c 1,62,-1 + 271 133 l 1,63,-1 + 271 217 l 2,64,65 + 271 234 271 234 283 246 c 128,-1,66 + 295 258 295 258 312 258 c 128,-1,67 + 329 258 329 258 341.5 246 c 128,-1,68 + 354 234 354 234 354 217 c 2,69,-1 + 354 133 l 1,70,-1 + 400 133 l 1,71,72 + 413 190 413 190 500 314 c 0,49,50 +EndSplineSet +EndChar + +StartChar: glyph155 +Encoding: 155 57499 156 +Width: 758 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 34 + 53 + 1 + 0 + 5 + 3 + 1 + 10 + 1 + 93 + 84 + 76 + 62 + 32 + 5 + 11 + 10 + 113 + 104 + 80 + 44 + 13 + 5 + 12 + 13 + 22 + 1 + 3 + 12 + 71 + 1 + 7 + 2 + 6 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 72 + 15 + 1 + 10 + 1 + 11 + 11 + 10 + 96 + 0 + 12 + 13 + 3 + 13 + 12 + 96 + 0 + 6 + 14 + 1 + 0 + 1 + 6 + 0 + 91 + 0 + 5 + 0 + 1 + 10 + 5 + 1 + 91 + 0 + 11 + 0 + 8 + 13 + 11 + 8 + 92 + 0 + 9 + 0 + 13 + 12 + 9 + 13 + 91 + 0 + 2 + 7 + 4 + 2 + 79 + 0 + 3 + 0 + 7 + 4 + 3 + 7 + 91 + 0 + 2 + 2 + 4 + 83 + 0 + 4 + 2 + 4 + 71 +ELSE +NPUSHB + 74 + 15 + 1 + 10 + 1 + 11 + 1 + 10 + 11 + 104 + 0 + 12 + 13 + 3 + 13 + 12 + 3 + 104 + 0 + 6 + 14 + 1 + 0 + 1 + 6 + 0 + 91 + 0 + 5 + 0 + 1 + 10 + 5 + 1 + 91 + 0 + 11 + 0 + 8 + 13 + 11 + 8 + 92 + 0 + 9 + 0 + 13 + 12 + 9 + 13 + 91 + 0 + 2 + 7 + 4 + 2 + 79 + 0 + 3 + 0 + 7 + 4 + 3 + 7 + 91 + 0 + 2 + 2 + 4 + 83 + 0 + 4 + 2 + 4 + 71 +EIF +NPUSHB + 38 + 82 + 81 + 1 + 0 + 111 + 109 + 102 + 100 + 91 + 89 + 81 + 120 + 82 + 120 + 78 + 77 + 74 + 73 + 70 + 68 + 57 + 55 + 52 + 50 + 39 + 38 + 26 + 24 + 20 + 18 + 6 + 5 + 0 + 37 + 1 + 37 + 16 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +629 550 m 0,0,1 + 610 550 610 550 597 537 c 2,2,-1 + 525 465 l 1,3,-1 + 512 478 l 2,4,5 + 476 514 476 514 421 514 c 128,-1,6 + 366 514 366 514 330 478 c 2,7,-1 + 156 304 l 2,8,9 + 118 266 118 266 118 212 c 0,10,11 + 118 159 118 159 156 121 c 2,12,-1 + 168 108 l 1,13,-1 + 97 37 l 2,14,15 + 84 24 84 24 84 5 c 128,-1,16 + 84 -14 84 -14 97 -28 c 0,17,18 + 111 -42 111 -42 129 -42 c 0,19,20 + 148 -42 148 -42 162 -28 c 2,21,-1 + 233 44 l 1,22,-1 + 246 31 l 2,23,24 + 284 -7 284 -7 338 -7 c 0,25,26 + 391 -7 391 -7 429 31 c 2,27,-1 + 603 205 l 2,28,29 + 640 242 640 242 640 296 c 128,-1,30 + 640 350 640 350 603 387 c 2,31,-1 + 590 400 l 1,32,-1 + 662 472 l 2,33,34 + 676 486 676 486 676 505 c 128,-1,35 + 676 524 676 524 662 537 c 0,36,37 + 649 550 649 550 629 550 c 0,0,1 +129 -125 m 128,-1,39 + 76 -125 76 -125 38 -86.5 c 128,-1,40 + 0 -48 0 -48 0 4 c 0,41,42 + 0 58 0 58 38 96 c 2,43,-1 + 58 116 l 1,44,45 + 35 162 35 162 35 212 c 0,46,47 + 35 301 35 301 97 363 c 2,48,-1 + 271 537 l 2,49,50 + 332 598 332 598 421 598 c 0,51,52 + 473 598 473 598 517 575 c 1,53,-1 + 538 596 l 2,54,55 + 575 633 575 633 629 633 c 0,56,57 + 682 633 682 633 720 594.5 c 128,-1,58 + 758 556 758 556 758 504 c 0,59,60 + 758 449 758 449 720 413 c 2,61,-1 + 700 393 l 1,62,63 + 724 345 724 345 724 296 c 0,64,65 + 724 209 724 209 661 146 c 2,66,-1 + 488 -28 l 2,67,68 + 426 -90 426 -90 337 -90 c 0,69,70 + 286 -90 286 -90 240 -67 c 1,71,-1 + 220 -87 l 2,72,38 + 182 -125 182 -125 129 -125 c 128,-1,39 +460 250 m 1,73,74 + 426 251 426 251 401 276 c 128,-1,75 + 376 301 376 301 375 335 c 1,76,-1 + 299 258 l 1,77,78 + 333 257 333 257 357.5 232.5 c 128,-1,79 + 382 208 382 208 383 174 c 1,80,-1 + 460 250 l 1,73,74 +421 424 m 0,81,82 + 436 424 436 424 447 413 c 2,83,-1 + 460 400 l 1,84,-1 + 430 370 l 2,85,86 + 416 356 416 356 416 337 c 128,-1,87 + 416 318 416 318 430 305 c 0,88,89 + 443 292 443 292 462 292 c 0,90,91 + 482 292 482 292 495 305 c 2,92,-1 + 525 335 l 1,93,-1 + 538 322 l 2,94,95 + 549 311 549 311 549 296 c 0,96,97 + 549 280 549 280 538 269 c 2,98,-1 + 364 96 l 2,99,100 + 353 85 353 85 338 85 c 0,101,102 + 322 85 322 85 311 96 c 2,103,-1 + 298 108 l 1,104,-1 + 328 138 l 2,105,106 + 342 152 342 152 342 171 c 128,-1,107 + 342 190 342 190 328 203 c 0,108,109 + 314 217 314 217 296 217 c 0,110,111 + 277 217 277 217 263 203 c 2,112,-1 + 233 173 l 1,113,-1 + 220 186 l 2,114,115 + 210 196 210 196 210 212 c 0,116,117 + 210 229 210 229 220 239 c 2,118,-1 + 394 413 l 2,119,120 + 405 424 405 424 421 424 c 0,81,82 +EndSplineSet +EndChar + +StartChar: glyph156 +Encoding: 156 57500 157 +Width: 592 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 22 + 33 + 1 + 5 + 2 + 49 + 41 + 4 + 3 + 4 + 5 + 69 + 60 + 23 + 3 + 7 + 6 + 14 + 1 + 0 + 7 + 4 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 48 + 8 + 1 + 3 + 2 + 3 + 106 + 0 + 4 + 5 + 6 + 5 + 4 + 96 + 0 + 6 + 7 + 7 + 6 + 94 + 0 + 1 + 0 + 1 + 107 + 0 + 2 + 0 + 5 + 4 + 2 + 5 + 91 + 0 + 7 + 0 + 0 + 7 + 79 + 0 + 7 + 7 + 0 + 84 + 0 + 0 + 7 + 0 + 72 +ELSE +NPUSHB + 50 + 8 + 1 + 3 + 2 + 3 + 106 + 0 + 4 + 5 + 6 + 5 + 4 + 6 + 104 + 0 + 6 + 7 + 5 + 6 + 7 + 102 + 0 + 1 + 0 + 1 + 107 + 0 + 2 + 0 + 5 + 4 + 2 + 5 + 91 + 0 + 7 + 0 + 0 + 7 + 79 + 0 + 7 + 7 + 0 + 84 + 0 + 0 + 7 + 0 + 72 +EIF +NPUSHB + 19 + 0 + 0 + 73 + 71 + 64 + 62 + 53 + 51 + 45 + 43 + 0 + 35 + 0 + 35 + 28 + 36 + 42 + 9 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +578 537 m 128,-1,1 + 592 524 592 524 592 505 c 128,-1,2 + 592 486 592 486 578 472 c 2,3,-1 + 507 400 l 1,4,-1 + 519 387 l 2,5,6 + 557 349 557 349 557 296 c 128,-1,7 + 557 243 557 243 519 205 c 2,8,-1 + 346 31 l 2,9,10 + 308 -7 308 -7 254 -7 c 0,11,12 + 201 -7 201 -7 163 31 c 2,13,-1 + 150 44 l 1,14,-1 + 78 -28 l 2,15,16 + 64 -42 64 -42 46 -42 c 0,17,18 + 27 -42 27 -42 13 -28 c 0,19,20 + 0 -14 0 -14 0 5 c 128,-1,21 + 0 24 0 24 13 37 c 2,22,-1 + 85 108 l 1,23,-1 + 72 121 l 2,24,25 + 35 158 35 158 35 213 c 0,26,27 + 35 267 35 267 72 304 c 2,28,-1 + 246 478 l 2,29,30 + 283 515 283 515 337.5 515 c 128,-1,31 + 392 515 392 515 429 478 c 2,32,-1 + 442 465 l 1,33,-1 + 513 537 l 2,34,35 + 526 550 526 550 545 550 c 128,-1,0 + 564 550 564 550 578 537 c 128,-1,1 +455 269 m 2,36,37 + 465 279 465 279 465 296 c 0,38,39 + 465 312 465 312 455 322 c 2,40,-1 + 442 335 l 1,41,-1 + 412 305 l 2,42,43 + 399 292 399 292 379 292 c 0,44,45 + 360 292 360 292 347 305 c 128,-1,46 + 334 318 334 318 334 337 c 128,-1,47 + 334 356 334 356 347 370 c 2,48,-1 + 377 400 l 1,49,-1 + 364 413 l 2,50,51 + 353 424 353 424 338 424 c 0,52,53 + 322 424 322 424 311 413 c 2,54,-1 + 137 239 l 2,55,56 + 126 228 126 228 126 213 c 0,57,58 + 126 197 126 197 137 186 c 2,59,-1 + 150 173 l 1,60,-1 + 180 203 l 2,61,62 + 194 217 194 217 213 217 c 0,63,64 + 231 217 231 217 245 203 c 0,65,66 + 258 190 258 190 258 171 c 128,-1,67 + 258 152 258 152 245 138 c 2,68,-1 + 215 108 l 1,69,-1 + 228 96 l 2,70,71 + 239 85 239 85 254 85 c 0,72,73 + 270 85 270 85 281 96 c 2,74,-1 + 455 269 l 2,36,37 +EndSplineSet +EndChar + +StartChar: glyph157 +Encoding: 157 57501 158 +Width: 636 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 20 + 19 + 17 + 3 + 0 + 64 + 1 + 1 + 0 + 0 + 97 + 1 + 0 + 0 + 16 + 1 + 16 + 2 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 -71 m 0,0,1 + 285 -71 285 -71 264 -9 c 2,2,-1 + 213 142 l 1,3,-1 + 62 192 l 2,4,5 + 3 211 3 211 0 259 c 0,6,7 + -3 305 -3 305 54 331 c 2,8,-1 + 528 553 l 2,9,10 + 561 568 561 568 586.5 563 c 128,-1,11 + 612 558 612 558 626 537 c 0,12,13 + 646 504 646 504 624 457 c 2,14,-1 + 403 -17 l 2,15,16 + 378 -71 378 -71 333 -71 c 0,0,1 +109 265 m 1,17,-1 + 279 208 l 1,18,-1 + 336 37 l 1,19,-1 + 535 464 l 1,20,-1 + 109 265 l 1,17,-1 +EndSplineSet +EndChar + +StartChar: glyph158 +Encoding: 158 57502 159 +Width: 552 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_4 + 13 + 8 + 1 + 40 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +262 4 m 2,0,-1 + 205 175 l 1,1,-1 + 34 232 l 2,2,3 + 12 239 12 239 4 250 c 128,-1,4 + -4 261 -4 261 2.5 273 c 128,-1,5 + 9 285 9 285 30 294 c 2,6,-1 + 504 515 l 2,7,8 + 536 529 536 529 547.5 517.5 c 128,-1,9 + 559 506 559 506 545 474 c 2,10,-1 + 323 0 l 2,11,12 + 314 -21 314 -21 302.5 -27.5 c 128,-1,13 + 291 -34 291 -34 280 -26 c 128,-1,14 + 269 -18 269 -18 262 4 c 2,0,-1 +EndSplineSet +EndChar + +StartChar: glyph159 +Encoding: 159 57503 160 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 19 + 7 + 2 + 5 + 63 + 7 + 1 + 1 + 6 + 1 + 0 + 4 + 1 + 0 + 91 + 0 + 4 + 8 + 1 + 2 + 3 + 4 + 2 + 91 + 0 + 3 + 5 + 5 + 3 + 79 + 0 + 3 + 3 + 5 + 83 + 0 + 5 + 3 + 5 + 71 + 25 + 24 + 15 + 14 + 1 + 0 + 41 + 40 + 37 + 36 + 31 + 29 + 24 + 35 + 25 + 35 + 14 + 23 + 15 + 23 + 0 + 13 + 1 + 13 + 9 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 592 m 0,0,1 + 230 592 230 592 156 520 c 0,2,3 + 83 449 83 449 83 347 c 0,4,5 + 83 246 83 246 156 175 c 2,6,-1 + 333 0 l 1,7,-1 + 511 175 l 2,8,9 + 583 245 583 245 583 347 c 0,10,11 + 583 450 583 450 511 520 c 0,12,13 + 437 592 437 592 333 592 c 0,0,1 +333 675 m 0,14,15 + 472 675 472 675 569 579 c 128,-1,16 + 666 483 666 483 666 347 c 128,-1,17 + 666 211 666 211 569 115 c 2,18,-1 + 333 -117 l 1,19,-1 + 98 115 l 2,20,21 + 0 211 0 211 0 347 c 128,-1,22 + 0 483 0 483 98 579 c 128,-1,23 + 196 675 196 675 333 675 c 0,14,15 +333 446 m 0,24,25 + 291 446 291 446 260 415 c 128,-1,26 + 229 384 229 384 229 341.5 c 128,-1,27 + 229 299 229 299 260 268 c 0,28,29 + 290 238 290 238 333 238 c 0,30,31 + 377 238 377 238 407 268 c 0,32,33 + 438 299 438 299 438 341.5 c 128,-1,34 + 438 384 438 384 407 415 c 128,-1,35 + 376 446 376 446 333 446 c 0,24,25 +333 488 m 128,-1,37 + 393 488 393 488 436 445 c 128,-1,38 + 479 402 479 402 479 342 c 128,-1,39 + 479 282 479 282 436 239 c 128,-1,40 + 393 196 393 196 333 196 c 128,-1,41 + 273 196 273 196 230 239 c 128,-1,42 + 187 282 187 282 187 342 c 128,-1,43 + 187 402 187 402 230 445 c 128,-1,36 + 273 488 273 488 333 488 c 128,-1,37 +EndSplineSet +EndChar + +StartChar: glyph160 +Encoding: 160 57504 161 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 44 + 4 + 1 + 1 + 63 + 4 + 1 + 1 + 2 + 1 + 107 + 3 + 1 + 0 + 2 + 2 + 0 + 79 + 3 + 1 + 0 + 0 + 2 + 83 + 0 + 2 + 0 + 2 + 71 + 10 + 9 + 0 + 0 + 16 + 14 + 9 + 20 + 10 + 20 + 0 + 8 + 0 + 8 + 5 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +569 579 m 128,-1,1 + 666 483 666 483 666 347 c 128,-1,2 + 666 211 666 211 569 115 c 2,3,-1 + 333 -117 l 1,4,-1 + 98 115 l 2,5,6 + 0 211 0 211 0 347 c 128,-1,7 + 0 483 0 483 98 579 c 128,-1,8 + 196 675 196 675 334 675 c 128,-1,0 + 472 675 472 675 569 579 c 128,-1,1 +333 238 m 0,9,10 + 377 238 377 238 407 268 c 0,11,12 + 438 299 438 299 438 341.5 c 128,-1,13 + 438 384 438 384 407 415 c 128,-1,14 + 376 446 376 446 333 446 c 0,15,16 + 291 446 291 446 260 415 c 128,-1,17 + 229 384 229 384 229 341.5 c 128,-1,18 + 229 299 229 299 260 268 c 0,19,20 + 290 238 290 238 333 238 c 0,9,10 +EndSplineSet +EndChar + +StartChar: glyph161 +Encoding: 161 57505 162 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 31 +LT +IF +NPUSHB + 53 + 5 + 1 + 3 + 6 + 7 + 7 + 3 + 96 + 11 + 1 + 2 + 12 + 1 + 6 + 3 + 2 + 6 + 91 + 0 + 7 + 0 + 8 + 0 + 7 + 8 + 90 + 0 + 0 + 10 + 1 + 1 + 9 + 0 + 1 + 91 + 13 + 1 + 9 + 4 + 4 + 9 + 77 + 13 + 1 + 9 + 9 + 4 + 83 + 0 + 4 + 9 + 4 + 71 +ELSE +NPUSHB + 54 + 5 + 1 + 3 + 6 + 7 + 6 + 3 + 7 + 104 + 11 + 1 + 2 + 12 + 1 + 6 + 3 + 2 + 6 + 91 + 0 + 7 + 0 + 8 + 0 + 7 + 8 + 90 + 0 + 0 + 10 + 1 + 1 + 9 + 0 + 1 + 91 + 13 + 1 + 9 + 4 + 4 + 9 + 77 + 13 + 1 + 9 + 9 + 4 + 83 + 0 + 4 + 9 + 4 + 71 +EIF +NPUSHB + 37 + 40 + 40 + 32 + 31 + 5 + 4 + 0 + 0 + 40 + 43 + 40 + 43 + 42 + 41 + 36 + 35 + 31 + 39 + 32 + 39 + 25 + 23 + 18 + 15 + 10 + 8 + 4 + 30 + 5 + 30 + 0 + 3 + 0 + 3 + 17 + 14 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +238 92 m 128,-1,1 + 238 146 238 146 292 146 c 128,-1,2 + 346 146 346 146 346 92 c 128,-1,3 + 346 38 346 38 292 38 c 128,-1,0 + 238 38 238 38 238 92 c 128,-1,1 +292 633 m 0,4,5 + 360 633 360 633 409 584 c 128,-1,6 + 458 535 458 535 458 467 c 2,7,-1 + 458 383 l 1,8,-1 + 500 383 l 2,9,10 + 534 383 534 383 558.5 358.5 c 128,-1,11 + 583 334 583 334 583 300 c 2,12,-1 + 583 8 l 2,13,14 + 583 -26 583 -26 558.5 -50.5 c 128,-1,15 + 534 -75 534 -75 500 -75 c 2,16,-1 + 83 -75 l 2,17,18 + 48 -75 48 -75 24 -50.5 c 128,-1,19 + 0 -26 0 -26 0 8 c 2,20,-1 + 0 300 l 2,21,22 + 0 334 0 334 24 358.5 c 128,-1,23 + 48 383 48 383 83 383 c 2,24,-1 + 125 383 l 1,25,-1 + 125 467 l 2,26,27 + 125 515 125 515 148.5 552.5 c 128,-1,28 + 172 590 172 590 208 611 c 0,29,30 + 246 633 246 633 292 633 c 0,4,5 +292 550 m 0,31,32 + 257 550 257 550 232.5 525.5 c 128,-1,33 + 208 501 208 501 208 467 c 2,34,-1 + 208 342 l 1,35,-1 + 375 342 l 1,36,-1 + 375 467 l 2,37,38 + 375 502 375 502 350.5 526 c 128,-1,39 + 326 550 326 550 292 550 c 0,31,32 +500 8 m 1,40,-1 + 500 300 l 1,41,-1 + 83 300 l 1,42,-1 + 83 8 l 1,43,-1 + 500 8 l 1,40,-1 +EndSplineSet +EndChar + +StartChar: glyph162 +Encoding: 162 57506 163 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 69 + 2 + 8 + 2 + 0 + 6 + 7 + 6 + 0 + 7 + 104 + 0 + 3 + 0 + 6 + 0 + 3 + 6 + 91 + 9 + 1 + 7 + 0 + 5 + 4 + 7 + 5 + 91 + 0 + 4 + 1 + 1 + 4 + 79 + 0 + 4 + 4 + 1 + 84 + 0 + 1 + 4 + 1 + 72 + 32 + 32 + 1 + 0 + 32 + 40 + 32 + 40 + 37 + 35 + 29 + 28 + 25 + 24 + 20 + 19 + 16 + 14 + 9 + 6 + 0 + 23 + 1 + 23 + 10 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +500 383 m 2,0,1 + 534 383 534 383 558.5 358.5 c 128,-1,2 + 583 334 583 334 583 300 c 2,3,-1 + 583 8 l 2,4,5 + 583 -26 583 -26 558.5 -50.5 c 128,-1,6 + 534 -75 534 -75 500 -75 c 2,7,-1 + 83 -75 l 2,8,9 + 48 -75 48 -75 24 -50.5 c 128,-1,10 + 0 -26 0 -26 0 8 c 2,11,-1 + 0 300 l 2,12,13 + 0 334 0 334 24 358.5 c 128,-1,14 + 48 383 48 383 83 383 c 2,15,-1 + 125 383 l 1,16,-1 + 125 467 l 2,17,18 + 125 536 125 536 174 584.5 c 128,-1,19 + 223 633 223 633 292 633 c 128,-1,20 + 361 633 361 633 409.5 584.5 c 128,-1,21 + 458 536 458 536 458 467 c 2,22,-1 + 458 383 l 1,23,-1 + 500 383 l 2,0,1 +292 38 m 128,-1,25 + 314 38 314 38 330 54 c 128,-1,26 + 346 70 346 70 346 92 c 128,-1,27 + 346 114 346 114 330 130 c 128,-1,28 + 314 146 314 146 292 146 c 128,-1,29 + 270 146 270 146 254 130 c 128,-1,30 + 238 114 238 114 238 92 c 128,-1,31 + 238 70 238 70 254 54 c 128,-1,24 + 270 38 270 38 292 38 c 128,-1,25 +375 342 m 1,32,-1 + 375 467 l 2,33,34 + 375 502 375 502 350.5 526 c 128,-1,35 + 326 550 326 550 292 550 c 0,36,37 + 257 550 257 550 232.5 525.5 c 128,-1,38 + 208 501 208 501 208 467 c 2,39,-1 + 208 342 l 1,40,-1 + 375 342 l 1,32,-1 +EndSplineSet +EndChar + +StartChar: glyph163 +Encoding: 163 57507 164 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 31 +LT +IF +NPUSHB + 52 + 7 + 1 + 2 + 6 + 3 + 3 + 2 + 96 + 0 + 4 + 0 + 6 + 2 + 4 + 6 + 91 + 0 + 3 + 9 + 1 + 5 + 0 + 3 + 5 + 92 + 0 + 0 + 11 + 1 + 1 + 10 + 0 + 1 + 91 + 12 + 1 + 10 + 8 + 8 + 10 + 77 + 12 + 1 + 10 + 10 + 8 + 83 + 0 + 8 + 10 + 8 + 71 +ELSE +NPUSHB + 53 + 7 + 1 + 2 + 6 + 3 + 6 + 2 + 3 + 104 + 0 + 4 + 0 + 6 + 2 + 4 + 6 + 91 + 0 + 3 + 9 + 1 + 5 + 0 + 3 + 5 + 92 + 0 + 0 + 11 + 1 + 1 + 10 + 0 + 1 + 91 + 12 + 1 + 10 + 8 + 8 + 10 + 77 + 12 + 1 + 10 + 10 + 8 + 83 + 0 + 8 + 10 + 8 + 71 +EIF +NPUSHB + 31 + 46 + 46 + 0 + 0 + 46 + 49 + 46 + 49 + 48 + 47 + 43 + 40 + 35 + 33 + 30 + 28 + 23 + 22 + 17 + 15 + 10 + 9 + 8 + 6 + 0 + 3 + 0 + 3 + 17 + 13 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +238 92 m 128,-1,1 + 238 146 238 146 292 146 c 128,-1,2 + 346 146 346 146 346 92 c 128,-1,3 + 346 38 346 38 292 38 c 128,-1,0 + 238 38 238 38 238 92 c 128,-1,1 +0 300 m 2,4,5 + 0 334 0 334 24 358.5 c 128,-1,6 + 48 383 48 383 83 383 c 2,7,-1 + 208 383 l 1,8,-1 + 208 342 l 1,9,-1 + 375 342 l 1,10,-1 + 375 467 l 2,11,12 + 375 522 375 522 403.5 561.5 c 128,-1,13 + 432 601 432 601 477 620 c 0,14,15 + 507 633 507 633 542 633 c 0,16,17 + 610 633 610 633 659 584 c 128,-1,18 + 708 535 708 535 708 467 c 2,19,-1 + 708 342 l 2,20,21 + 708 325 708 325 696 312.5 c 128,-1,22 + 684 300 684 300 667 300 c 128,-1,23 + 650 300 650 300 637.5 312.5 c 128,-1,24 + 625 325 625 325 625 342 c 2,25,-1 + 625 467 l 2,26,27 + 625 502 625 502 600.5 526 c 128,-1,28 + 576 550 576 550 542 550 c 0,29,30 + 507 550 507 550 482.5 525.5 c 128,-1,31 + 458 501 458 501 458 467 c 2,32,-1 + 458 383 l 1,33,-1 + 500 383 l 2,34,35 + 534 383 534 383 558.5 358.5 c 128,-1,36 + 583 334 583 334 583 300 c 2,37,-1 + 583 8 l 2,38,39 + 583 -26 583 -26 558.5 -50.5 c 128,-1,40 + 534 -75 534 -75 500 -75 c 2,41,-1 + 83 -75 l 2,42,43 + 48 -75 48 -75 24 -50.5 c 128,-1,44 + 0 -26 0 -26 0 8 c 2,45,-1 + 0 300 l 2,4,5 +500 8 m 1,46,-1 + 500 300 l 1,47,-1 + 83 300 l 1,48,-1 + 83 8 l 1,49,-1 + 500 8 l 1,46,-1 +EndSplineSet +EndChar + +StartChar: glyph164 +Encoding: 164 57508 165 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 60 + 5 + 1 + 3 + 2 + 6 + 2 + 3 + 6 + 104 + 0 + 1 + 6 + 8 + 6 + 1 + 8 + 104 + 0 + 0 + 0 + 2 + 3 + 0 + 2 + 91 + 0 + 6 + 0 + 8 + 7 + 6 + 8 + 91 + 0 + 7 + 4 + 4 + 7 + 79 + 0 + 7 + 7 + 4 + 84 + 0 + 4 + 7 + 4 + 72 + 19 + 19 + 17 + 37 + 53 + 35 + 37 + 21 + 16 + 9 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 633 m 128,-1,1 + 611 633 611 633 659.5 584.5 c 128,-1,2 + 708 536 708 536 708 467 c 2,3,-1 + 708 342 l 2,4,5 + 708 325 708 325 696 312.5 c 128,-1,6 + 684 300 684 300 667 300 c 128,-1,7 + 650 300 650 300 637.5 312.5 c 128,-1,8 + 625 325 625 325 625 342 c 2,9,-1 + 625 467 l 2,10,11 + 625 502 625 502 600.5 526 c 128,-1,12 + 576 550 576 550 542 550 c 0,13,14 + 507 550 507 550 482.5 525.5 c 128,-1,15 + 458 501 458 501 458 467 c 2,16,-1 + 458 383 l 1,17,-1 + 500 383 l 2,18,19 + 534 383 534 383 558.5 358.5 c 128,-1,20 + 583 334 583 334 583 300 c 2,21,-1 + 583 8 l 2,22,23 + 583 -26 583 -26 558.5 -50.5 c 128,-1,24 + 534 -75 534 -75 500 -75 c 2,25,-1 + 83 -75 l 2,26,27 + 48 -75 48 -75 24 -50.5 c 128,-1,28 + 0 -26 0 -26 0 8 c 2,29,-1 + 0 300 l 2,30,31 + 0 334 0 334 24 358.5 c 128,-1,32 + 48 383 48 383 83 383 c 2,33,-1 + 208 383 l 1,34,-1 + 208 342 l 1,35,-1 + 375 342 l 1,36,-1 + 375 467 l 2,37,38 + 375 536 375 536 424 584.5 c 128,-1,0 + 473 633 473 633 542 633 c 128,-1,1 +292 38 m 128,-1,40 + 314 38 314 38 330 54 c 128,-1,41 + 346 70 346 70 346 92 c 128,-1,42 + 346 114 346 114 330 130 c 128,-1,43 + 314 146 314 146 292 146 c 128,-1,44 + 270 146 270 146 254 130 c 128,-1,45 + 238 114 238 114 238 92 c 128,-1,46 + 238 70 238 70 254 54 c 128,-1,39 + 270 38 270 38 292 38 c 128,-1,40 +EndSplineSet +EndChar + +StartChar: glyph165 +Encoding: 165 57509 166 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 69 + 37 + 32 + 29 + 27 + 26 + 25 + 20 + 17 + 8 + 5 + 4 + 28 + 24 + 2 + 2 + 3 + 2 + 66 + 6 + 1 + 0 + 0 + 4 + 5 + 0 + 4 + 89 + 0 + 5 + 0 + 3 + 2 + 5 + 3 + 91 + 0 + 2 + 1 + 1 + 2 + 77 + 0 + 2 + 2 + 1 + 83 + 0 + 1 + 2 + 1 + 71 + 1 + 0 + 35 + 34 + 31 + 30 + 23 + 22 + 19 + 18 + 9 + 6 + 0 + 15 + 1 + 14 + 7 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +667 508 m 2,0,1 + 702 508 702 508 726 484 c 128,-1,2 + 750 460 750 460 750 425 c 2,3,-1 + 750 50 l 2,4,5 + 750 16 750 16 726 -8.5 c 128,-1,6 + 702 -33 702 -33 667 -33 c 2,7,-1 + 83 -33 l 2,8,9 + 48 -33 48 -33 24 -8.5 c 128,-1,10 + 0 16 0 16 0 50 c 2,11,-1 + 0 425 l 2,12,13 + 0 460 0 460 24 484 c 128,-1,14 + 48 508 48 508 83 508 c 2,15,-1 + 667 508 l 2,0,1 +330 145 m 2,16,-1 + 265 202 l 1,17,-1 + 113 50 l 1,18,-1 + 637 50 l 1,19,-1 + 485 202 l 1,20,-1 + 420 145 l 2,21,22 + 401 129 401 129 375 129 c 128,-1,23 + 349 129 349 129 330 145 c 2,16,-1 +83 79 m 1,24,-1 + 233 230 l 1,25,-1 + 83 361 l 1,26,-1 + 83 79 l 1,24,-1 +517 230 m 1,27,-1 + 667 80 l 1,28,-1 + 667 361 l 1,29,-1 + 517 230 l 1,27,-1 +667 425 m 1,30,-1 + 83 425 l 1,31,-1 + 83 416 l 1,32,-1 + 357 176 l 2,33,34 + 364 170 364 170 375 170 c 128,-1,35 + 386 170 386 170 393 176 c 2,36,-1 + 667 416 l 1,37,-1 + 667 425 l 1,30,-1 +EndSplineSet +EndChar + +StartChar: glyph166 +Encoding: 166 57510 167 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 46 + 40 + 39 + 37 + 36 + 35 + 34 + 33 + 32 + 30 + 29 + 28 + 26 + 23 + 11 + 14 + 2 + 1 + 1 + 66 + 0 + 1 + 2 + 1 + 106 + 0 + 2 + 0 + 2 + 106 + 3 + 1 + 0 + 0 + 97 + 1 + 0 + 21 + 20 + 9 + 8 + 0 + 25 + 1 + 25 + 4 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +42 -33 m 0,0,1 + 24 -33 24 -33 12 -20.5 c 128,-1,2 + 0 -8 0 -8 0 8 c 2,3,-1 + 0 425 l 2,4,5 + 0 442 0 442 12 454 c 2,6,-1 + 200 642 l 2,7,8 + 211 653 211 653 227 654 c 128,-1,9 + 243 655 243 655 255 645 c 2,10,-1 + 434 502 l 1,11,-1 + 596 663 l 2,12,13 + 616 683 616 683 641.5 671 c 128,-1,14 + 667 659 667 659 667 633 c 2,15,-1 + 667 217 l 2,16,17 + 667 200 667 200 654 187 c 2,18,-1 + 467 0 l 2,19,20 + 456 -11 456 -11 439.5 -12 c 128,-1,21 + 423 -13 423 -13 411 -3 c 2,22,-1 + 232 140 l 1,23,-1 + 71 -21 l 2,24,25 + 59 -33 59 -33 42 -33 c 0,0,1 +83 109 m 1,26,27 + 205 229 205 229 208 231 c 2,28,-1 + 208 533 l 1,29,-1 + 83 408 l 1,30,-1 + 83 109 l 1,26,27 +255 228 m 1,31,-1 + 417 99 l 1,32,-1 + 417 410 l 1,33,-1 + 250 542 l 1,34,-1 + 250 231 l 1,35,-1 + 255 228 l 1,31,-1 +583 234 m 1,36,-1 + 583 533 l 1,37,38 + 461 412 461 412 458 410 c 2,39,-1 + 458 109 l 1,40,-1 + 583 234 l 1,36,-1 +EndSplineSet +EndChar + +StartChar: glyph167 +Encoding: 167 57511 168 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 61 + 30 + 24 + 2 + 4 + 64 + 0 + 4 + 0 + 5 + 1 + 4 + 5 + 91 + 0 + 1 + 7 + 1 + 2 + 3 + 1 + 2 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 6 + 1 + 0 + 3 + 0 + 71 + 13 + 12 + 2 + 0 + 39 + 36 + 27 + 26 + 19 + 16 + 12 + 23 + 13 + 22 + 8 + 5 + 0 + 11 + 2 + 11 + 8 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +458 -75 m 2,0,-1 + 125 -75 l 2,1,2 + 73 -75 73 -75 36.5 -38.5 c 128,-1,3 + 0 -2 0 -2 0 50 c 128,-1,4 + 0 102 0 102 36.5 138.5 c 128,-1,5 + 73 175 73 175 125 175 c 2,6,-1 + 458 175 l 2,7,8 + 510 175 510 175 546.5 138.5 c 128,-1,9 + 583 102 583 102 583 50 c 128,-1,10 + 583 -2 583 -2 546.5 -38.5 c 128,-1,11 + 510 -75 510 -75 458 -75 c 2,0,-1 +125 92 m 2,12,13 + 108 92 108 92 95.5 79.5 c 128,-1,14 + 83 67 83 67 83 50 c 128,-1,15 + 83 33 83 33 95.5 20.5 c 128,-1,16 + 108 8 108 8 125 8 c 2,17,-1 + 458 8 l 2,18,19 + 475 8 475 8 487.5 20.5 c 128,-1,20 + 500 33 500 33 500 50 c 128,-1,21 + 500 67 500 67 487.5 79.5 c 128,-1,22 + 475 92 475 92 458 92 c 2,23,-1 + 125 92 l 2,12,13 +292 514 m 1,24,-1 + 87 303 l 1,25,-1 + 83 300 l 1,26,-1 + 500 300 l 1,27,28 + 466 336 466 336 396 407 c 128,-1,29 + 326 478 326 478 292 514 c 1,24,-1 +292 633 m 1,30,31 + 453 468 453 468 560 358 c 0,32,33 + 583 335 583 335 583 300 c 0,34,35 + 583 266 583 266 558.5 241.5 c 128,-1,36 + 534 217 534 217 500 217 c 2,37,-1 + 83 217 l 2,38,39 + 48 217 48 217 24 241.5 c 128,-1,40 + 0 266 0 266 0 300 c 128,-1,41 + 0 334 0 334 24 358 c 2,42,-1 + 292 633 l 1,30,31 +EndSplineSet +EndChar + +StartChar: glyph168 +Encoding: 168 57512 169 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 39 + 23 + 1 + 2 + 64 + 0 + 2 + 0 + 2 + 106 + 3 + 1 + 0 + 1 + 1 + 0 + 79 + 3 + 1 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 + 1 + 0 + 19 + 16 + 7 + 4 + 0 + 11 + 1 + 10 + 4 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +500 133 m 2,0,1 + 534 133 534 133 558.5 108.5 c 128,-1,2 + 583 84 583 84 583 50 c 128,-1,3 + 583 16 583 16 558.5 -8.5 c 128,-1,4 + 534 -33 534 -33 500 -33 c 2,5,-1 + 83 -33 l 2,6,7 + 48 -33 48 -33 24 -8.5 c 128,-1,8 + 0 16 0 16 0 50 c 128,-1,9 + 0 84 0 84 24 108.5 c 128,-1,10 + 48 133 48 133 83 133 c 2,11,-1 + 500 133 l 2,0,1 +560 358 m 0,12,13 + 583 335 583 335 583 300 c 0,14,15 + 583 266 583 266 558.5 241.5 c 128,-1,16 + 534 217 534 217 500 217 c 2,17,-1 + 83 217 l 2,18,19 + 48 217 48 217 24 241.5 c 128,-1,20 + 0 266 0 266 0 300 c 128,-1,21 + 0 334 0 334 24 358 c 2,22,-1 + 292 633 l 1,23,24 + 453 468 453 468 560 358 c 0,12,13 +EndSplineSet +EndChar + +StartChar: glyph169 +Encoding: 169 57513 170 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 54 + 23 + 19 + 18 + 17 + 6 + 2 + 1 + 0 + 8 + 1 + 0 + 1 + 66 + 5 + 2 + 4 + 3 + 0 + 1 + 1 + 0 + 79 + 5 + 2 + 4 + 3 + 0 + 0 + 1 + 83 + 3 + 1 + 1 + 0 + 1 + 71 + 21 + 20 + 4 + 3 + 28 + 26 + 20 + 33 + 21 + 33 + 11 + 9 + 3 + 16 + 4 + 16 + 6 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +458 438 m 1,0,-1 + 458 103 l 1,1,-1 + 631 271 l 1,2,-1 + 458 438 l 1,0,-1 +450 533 m 0,3,4 + 479 533 479 533 502 512 c 2,5,-1 + 750 271 l 1,6,7 + 601 126 601 126 502 30 c 0,8,9 + 480 8 480 8 450 8 c 0,10,11 + 419 8 419 8 397 30 c 128,-1,12 + 375 52 375 52 375 83 c 2,13,-1 + 375 458 l 2,14,15 + 375 489 375 489 397 511 c 128,-1,16 + 419 533 419 533 450 533 c 0,3,4 +83 438 m 1,17,-1 + 83 103 l 1,18,-1 + 256 271 l 1,19,-1 + 83 438 l 1,17,-1 +75 533 m 0,20,21 + 104 533 104 533 127 512 c 2,22,-1 + 375 271 l 1,23,24 + 226 126 226 126 127 30 c 0,25,26 + 105 8 105 8 75 8 c 0,27,28 + 44 8 44 8 22 30 c 128,-1,29 + 0 52 0 52 0 83 c 2,30,-1 + 0 458 l 2,31,32 + 0 489 0 489 22 511 c 128,-1,33 + 44 533 44 533 75 533 c 0,20,21 +EndSplineSet +EndChar + +StartChar: glyph170 +Encoding: 170 57514 171 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 32 + 15 + 1 + 2 + 0 + 1 + 1 + 66 + 3 + 1 + 1 + 0 + 0 + 1 + 79 + 3 + 1 + 1 + 1 + 0 + 83 + 2 + 1 + 0 + 1 + 0 + 71 + 37 + 37 + 37 + 36 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +502 512 m 2,0,-1 + 750 271 l 1,1,2 + 601 126 601 126 502 30 c 0,3,4 + 480 8 480 8 450 8 c 0,5,6 + 419 8 419 8 397 30 c 128,-1,7 + 375 52 375 52 375 83 c 2,8,-1 + 375 458 l 2,9,10 + 375 489 375 489 397 511 c 128,-1,11 + 419 533 419 533 450 533 c 0,12,13 + 479 533 479 533 502 512 c 2,0,-1 +127 512 m 2,14,-1 + 375 271 l 1,15,16 + 226 126 226 126 127 30 c 0,17,18 + 105 8 105 8 75 8 c 0,19,20 + 44 8 44 8 22 30 c 128,-1,21 + 0 52 0 52 0 83 c 2,22,-1 + 0 458 l 2,23,24 + 0 489 0 489 22 511 c 128,-1,25 + 44 533 44 533 75 533 c 0,26,27 + 104 533 104 533 127 512 c 2,14,-1 +EndSplineSet +EndChar + +StartChar: glyph171 +Encoding: 171 57515 172 +Width: 542 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 39 + 5 + 1 + 1 + 6 + 1 + 2 + 3 + 1 + 2 + 91 + 7 + 1 + 3 + 0 + 0 + 3 + 79 + 7 + 1 + 3 + 3 + 0 + 83 + 4 + 1 + 0 + 3 + 0 + 71 + 21 + 21 + 21 + 21 + 21 + 21 + 21 + 16 + 8 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +125 -33 m 128,-1,1 + 73 -33 73 -33 36.5 3.5 c 128,-1,2 + 0 40 0 40 0 92 c 2,3,-1 + 0 467 l 2,4,5 + 0 519 0 519 36.5 555.5 c 128,-1,6 + 73 592 73 592 125 592 c 128,-1,7 + 177 592 177 592 213.5 555.5 c 128,-1,8 + 250 519 250 519 250 467 c 2,9,-1 + 250 92 l 2,10,11 + 250 40 250 40 213.5 3.5 c 128,-1,0 + 177 -33 177 -33 125 -33 c 128,-1,1 +125 508 m 128,-1,13 + 108 508 108 508 95.5 496 c 128,-1,14 + 83 484 83 484 83 467 c 2,15,-1 + 83 92 l 2,16,17 + 83 75 83 75 95.5 62.5 c 128,-1,18 + 108 50 108 50 125 50 c 128,-1,19 + 142 50 142 50 154.5 62.5 c 128,-1,20 + 167 75 167 75 167 92 c 2,21,-1 + 167 467 l 2,22,23 + 167 484 167 484 154.5 496 c 128,-1,12 + 142 508 142 508 125 508 c 128,-1,13 +417 -33 m 128,-1,25 + 365 -33 365 -33 328.5 3.5 c 128,-1,26 + 292 40 292 40 292 92 c 2,27,-1 + 292 467 l 2,28,29 + 292 519 292 519 328.5 555.5 c 128,-1,30 + 365 592 365 592 417 592 c 128,-1,31 + 469 592 469 592 505.5 555.5 c 128,-1,32 + 542 519 542 519 542 467 c 2,33,-1 + 542 92 l 2,34,35 + 542 40 542 40 505.5 3.5 c 128,-1,24 + 469 -33 469 -33 417 -33 c 128,-1,25 +417 508 m 128,-1,37 + 400 508 400 508 387.5 496 c 128,-1,38 + 375 484 375 484 375 467 c 2,39,-1 + 375 92 l 2,40,41 + 375 75 375 75 387.5 62.5 c 128,-1,42 + 400 50 400 50 417 50 c 128,-1,43 + 434 50 434 50 446 62.5 c 128,-1,44 + 458 75 458 75 458 92 c 2,45,-1 + 458 467 l 2,46,47 + 458 484 458 484 446 496 c 128,-1,36 + 434 508 434 508 417 508 c 128,-1,37 +EndSplineSet +EndChar + +StartChar: glyph172 +Encoding: 172 57516 173 +Width: 458 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 25 + 2 + 1 + 0 + 1 + 1 + 0 + 79 + 2 + 1 + 0 + 0 + 1 + 83 + 3 + 1 + 1 + 0 + 1 + 71 + 21 + 21 + 21 + 16 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +83 550 m 128,-1,1 + 118 550 118 550 142.5 525.5 c 128,-1,2 + 167 501 167 501 167 467 c 2,3,-1 + 167 133 l 2,4,5 + 167 99 167 99 142.5 74.5 c 128,-1,6 + 118 50 118 50 83 50 c 128,-1,7 + 48 50 48 50 24 74 c 128,-1,8 + 0 98 0 98 0 133 c 2,9,-1 + 0 467 l 2,10,11 + 0 502 0 502 24 526 c 128,-1,0 + 48 550 48 550 83 550 c 128,-1,1 +375 550 m 128,-1,13 + 410 550 410 550 434 526 c 128,-1,14 + 458 502 458 502 458 467 c 2,15,-1 + 458 133 l 2,16,17 + 458 98 458 98 434 74 c 128,-1,18 + 410 50 410 50 375 50 c 128,-1,19 + 340 50 340 50 316 74 c 128,-1,20 + 292 98 292 98 292 133 c 2,21,-1 + 292 467 l 2,22,23 + 292 502 292 502 316 526 c 128,-1,12 + 340 550 340 550 375 550 c 128,-1,13 +EndSplineSet +EndChar + +StartChar: glyph173 +Encoding: 173 57517 174 +Width: 417 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 37 + 9 + 4 + 1 + 0 + 4 + 1 + 0 + 1 + 66 + 2 + 1 + 0 + 1 + 1 + 0 + 79 + 2 + 1 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 + 7 + 6 + 13 + 12 + 6 + 18 + 7 + 18 + 3 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +83 508 m 1,0,-1 + 83 92 l 1,1,2 + 118 127 118 127 189.5 196 c 128,-1,3 + 261 265 261 265 297 300 c 1,4,-1 + 87 505 l 1,5,-1 + 83 508 l 1,0,-1 +83 592 m 0,6,7 + 118 592 118 592 142 568 c 2,8,-1 + 417 300 l 1,9,10 + 251 139 251 139 141 32 c 0,11,12 + 117 8 117 8 83 8 c 128,-1,13 + 49 8 49 8 24.5 32.5 c 128,-1,14 + 0 57 0 57 0 92 c 2,15,-1 + 0 508 l 2,16,17 + 0 543 0 543 24.5 567.5 c 128,-1,18 + 49 592 49 592 83 592 c 0,6,7 +EndSplineSet +EndChar + +StartChar: glyph174 +Encoding: 174 57518 175 +Width: 417 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 29 + 15 + 2 + 1 + 0 + 4 + 1 + 0 + 1 + 66 + 0 + 0 + 1 + 1 + 0 + 79 + 0 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 + 37 + 36 + 2 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 508 m 1,0,-1 + 121 300 l 1,1,-1 + 333 92 l 1,2,-1 + 333 508 l 1,0,-1 +275 567 m 0,3,4 + 300 592 300 592 333 592 c 0,5,6 + 368 592 368 592 392.5 567 c 128,-1,7 + 417 542 417 542 417 508 c 2,8,-1 + 417 92 l 2,9,10 + 417 58 417 58 392.5 33 c 128,-1,11 + 368 8 368 8 333 8 c 0,12,13 + 300 8 300 8 275 33 c 2,14,-1 + 0 300 l 1,15,16 + 167 463 167 463 275 567 c 0,3,4 +EndSplineSet +EndChar + +StartChar: glyph175 +Encoding: 175 57519 176 +Width: 417 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 3 + 1 + 0 + 1 + 1 + 66 + 0 + 1 + 0 + 0 + 1 + 79 + 0 + 1 + 1 + 0 + 83 + 2 + 1 + 0 + 1 + 0 + 71 + 1 + 0 + 8 + 6 + 0 + 13 + 1 + 13 + 3 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +333 8 m 0,0,1 + 300 8 300 8 275 33 c 2,2,-1 + 0 300 l 1,3,4 + 167 463 167 463 275 567 c 0,5,6 + 300 592 300 592 333 592 c 0,7,8 + 368 592 368 592 392.5 567 c 128,-1,9 + 417 542 417 542 417 508 c 2,10,-1 + 417 92 l 2,11,12 + 417 58 417 58 392.5 33 c 128,-1,13 + 368 8 368 8 333 8 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph176 +Encoding: 176 57520 177 +Width: 417 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 26 + 12 + 1 + 0 + 1 + 1 + 66 + 0 + 1 + 0 + 0 + 1 + 79 + 0 + 1 + 1 + 0 + 83 + 0 + 0 + 1 + 0 + 71 + 37 + 33 + 2 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +142 32 m 0,0,1 + 118 8 118 8 83 8 c 0,2,3 + 49 8 49 8 24.5 32.5 c 128,-1,4 + 0 57 0 57 0 92 c 2,5,-1 + 0 508 l 2,6,7 + 0 543 0 543 24.5 567.5 c 128,-1,8 + 49 592 49 592 83 592 c 0,9,10 + 118 592 118 592 142 568 c 2,11,-1 + 417 300 l 1,12,13 + 252 139 252 139 142 32 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph177 +Encoding: 177 57521 178 +Width: 500 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 30 + 0 + 2 + 0 + 0 + 1 + 2 + 0 + 91 + 0 + 1 + 3 + 3 + 1 + 79 + 0 + 1 + 1 + 3 + 83 + 0 + 3 + 1 + 3 + 71 + 19 + 19 + 19 + 16 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +250 467 m 128,-1,1 + 181 467 181 467 132 418 c 128,-1,2 + 83 369 83 369 83 300 c 128,-1,3 + 83 231 83 231 132 182 c 128,-1,4 + 181 133 181 133 250 133 c 128,-1,5 + 319 133 319 133 368 182 c 128,-1,6 + 417 231 417 231 417 300 c 128,-1,7 + 417 369 417 369 368 418 c 128,-1,0 + 319 467 319 467 250 467 c 128,-1,1 +250 550 m 128,-1,9 + 354 550 354 550 427 477 c 128,-1,10 + 500 404 500 404 500 300 c 128,-1,11 + 500 196 500 196 427 123 c 128,-1,12 + 354 50 354 50 250 50 c 128,-1,13 + 146 50 146 50 73 123 c 128,-1,14 + 0 196 0 196 0 300 c 128,-1,15 + 0 404 0 404 73 477 c 128,-1,8 + 146 550 146 550 250 550 c 128,-1,9 +EndSplineSet +EndChar + +StartChar: glyph178 +Encoding: 178 57522 179 +Width: 500 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 20 + 0 + 0 + 1 + 1 + 0 + 79 + 0 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 + 19 + 16 + 2 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +250 550 m 128,-1,1 + 354 550 354 550 427 477 c 128,-1,2 + 500 404 500 404 500 300 c 128,-1,3 + 500 196 500 196 427 123 c 128,-1,4 + 354 50 354 50 250 50 c 128,-1,5 + 146 50 146 50 73 123 c 128,-1,6 + 0 196 0 196 0 300 c 128,-1,7 + 0 404 0 404 73 477 c 128,-1,0 + 146 550 146 550 250 550 c 128,-1,1 +EndSplineSet +EndChar + +StartChar: glyph179 +Encoding: 179 57523 180 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 29 + 18 + 17 + 16 + 13 + 2 + 1 + 0 + 8 + 1 + 0 + 1 + 66 + 2 + 1 + 0 + 1 + 1 + 0 + 79 + 2 + 1 + 0 + 0 + 1 + 83 + 3 + 1 + 1 + 0 + 1 + 71 + 37 + 24 + 37 + 19 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 438 m 1,0,-1 + 119 271 l 1,1,-1 + 292 103 l 1,2,-1 + 292 438 l 1,0,-1 +300 533 m 128,-1,4 + 331 533 331 533 353 511 c 128,-1,5 + 375 489 375 489 375 458 c 2,6,-1 + 375 83 l 2,7,8 + 375 52 375 52 353 30 c 128,-1,9 + 331 8 331 8 300 8 c 0,10,11 + 272 8 272 8 248 30 c 2,12,-1 + 0 271 l 1,13,14 + 149 416 149 416 248 512 c 0,15,3 + 269 533 269 533 300 533 c 128,-1,4 +667 438 m 1,16,-1 + 494 271 l 1,17,-1 + 667 103 l 1,18,-1 + 667 438 l 1,16,-1 +675 533 m 128,-1,20 + 706 533 706 533 728 511 c 128,-1,21 + 750 489 750 489 750 458 c 2,22,-1 + 750 83 l 2,23,24 + 750 52 750 52 728 30 c 128,-1,25 + 706 8 706 8 675 8 c 0,26,27 + 647 8 647 8 623 30 c 2,28,-1 + 375 271 l 1,29,30 + 524 416 524 416 623 512 c 0,31,19 + 644 533 644 533 675 533 c 128,-1,20 +EndSplineSet +EndChar + +StartChar: glyph180 +Encoding: 180 57524 181 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 32 + 23 + 10 + 2 + 1 + 0 + 1 + 66 + 2 + 1 + 0 + 1 + 1 + 0 + 79 + 2 + 1 + 0 + 0 + 1 + 83 + 3 + 1 + 1 + 0 + 1 + 71 + 37 + 21 + 37 + 16 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +300 533 m 128,-1,1 + 331 533 331 533 353 511 c 128,-1,2 + 375 489 375 489 375 458 c 2,3,-1 + 375 83 l 2,4,5 + 375 52 375 52 353 30 c 128,-1,6 + 331 8 331 8 300 8 c 0,7,8 + 272 8 272 8 248 30 c 2,9,-1 + 0 271 l 1,10,11 + 149 416 149 416 248 512 c 0,12,0 + 269 533 269 533 300 533 c 128,-1,1 +675 533 m 128,-1,14 + 706 533 706 533 728 511 c 128,-1,15 + 750 489 750 489 750 458 c 2,16,-1 + 750 83 l 2,17,18 + 750 52 750 52 728 30 c 128,-1,19 + 706 8 706 8 675 8 c 0,20,21 + 647 8 647 8 623 30 c 2,22,-1 + 375 271 l 1,23,24 + 524 416 524 416 623 512 c 0,25,13 + 644 533 644 533 675 533 c 128,-1,14 +EndSplineSet +EndChar + +StartChar: glyph181 +Encoding: 181 57525 182 +Width: 500 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 37 + 4 + 1 + 2 + 0 + 0 + 1 + 2 + 0 + 89 + 0 + 1 + 3 + 3 + 1 + 77 + 0 + 1 + 1 + 3 + 83 + 0 + 3 + 1 + 3 + 71 + 5 + 4 + 13 + 10 + 4 + 19 + 5 + 18 + 17 + 16 + 5 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +417 467 m 1,0,-1 + 83 467 l 1,1,-1 + 83 133 l 1,2,-1 + 417 133 l 1,3,-1 + 417 467 l 1,0,-1 +417 550 m 2,4,5 + 452 550 452 550 476 526 c 128,-1,6 + 500 502 500 502 500 467 c 2,7,-1 + 500 133 l 2,8,9 + 500 98 500 98 476 74 c 128,-1,10 + 452 50 452 50 417 50 c 2,11,-1 + 83 50 l 2,12,13 + 48 50 48 50 24 74 c 128,-1,14 + 0 98 0 98 0 133 c 2,15,-1 + 0 467 l 2,16,17 + 0 502 0 502 24 526 c 128,-1,18 + 48 550 48 550 83 550 c 2,19,-1 + 417 550 l 2,4,5 +EndSplineSet +EndChar + +StartChar: glyph182 +Encoding: 182 57526 183 +Width: 500 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 28 + 2 + 1 + 0 + 1 + 1 + 0 + 79 + 2 + 1 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 + 1 + 0 + 9 + 6 + 0 + 15 + 1 + 14 + 3 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +417 550 m 2,0,1 + 452 550 452 550 476 526 c 128,-1,2 + 500 502 500 502 500 467 c 2,3,-1 + 500 133 l 2,4,5 + 500 98 500 98 476 74 c 128,-1,6 + 452 50 452 50 417 50 c 2,7,-1 + 83 50 l 2,8,9 + 48 50 48 50 24 74 c 128,-1,10 + 0 98 0 98 0 133 c 2,11,-1 + 0 467 l 2,12,13 + 0 502 0 502 24 526 c 128,-1,14 + 48 550 48 550 83 550 c 2,15,-1 + 417 550 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph183 +Encoding: 183 57527 184 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 104 + 9 + 1 + 1 + 63 + 17 + 1 + 0 + 0 + 3 + 6 + 0 + 3 + 91 + 14 + 10 + 2 + 6 + 15 + 11 + 2 + 7 + 8 + 6 + 7 + 91 + 16 + 12 + 2 + 8 + 13 + 19 + 9 + 18 + 4 + 5 + 4 + 8 + 5 + 91 + 0 + 4 + 1 + 1 + 4 + 79 + 0 + 4 + 4 + 1 + 83 + 2 + 1 + 1 + 4 + 1 + 71 + 54 + 53 + 36 + 35 + 1 + 0 + 84 + 83 + 80 + 79 + 76 + 75 + 72 + 71 + 68 + 67 + 64 + 63 + 59 + 57 + 53 + 62 + 54 + 62 + 50 + 49 + 46 + 45 + 41 + 39 + 35 + 44 + 36 + 44 + 33 + 30 + 25 + 22 + 12 + 10 + 8 + 6 + 0 + 18 + 1 + 17 + 20 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +667 550 m 2,0,1 + 719 550 719 550 755.5 513.5 c 128,-1,2 + 792 477 792 477 792 425 c 2,3,-1 + 792 133 l 2,4,5 + 792 81 792 81 755.5 44.5 c 128,-1,6 + 719 8 719 8 667 8 c 2,7,-1 + 292 8 l 1,8,-1 + 167 -117 l 1,9,-1 + 167 8 l 1,10,-1 + 125 8 l 2,11,12 + 73 8 73 8 36.5 44.5 c 128,-1,13 + 0 81 0 81 0 133 c 2,14,-1 + 0 425 l 2,15,16 + 0 477 0 477 36.5 513.5 c 128,-1,17 + 73 550 73 550 125 550 c 2,18,-1 + 667 550 l 2,0,1 +708 133 m 2,19,-1 + 708 425 l 2,20,21 + 708 442 708 442 696 454.5 c 128,-1,22 + 684 467 684 467 667 467 c 2,23,-1 + 125 467 l 2,24,25 + 108 467 108 467 95.5 454.5 c 128,-1,26 + 83 442 83 442 83 425 c 2,27,-1 + 83 133 l 2,28,29 + 83 116 83 116 95.5 104 c 128,-1,30 + 108 92 108 92 125 92 c 2,31,-1 + 667 92 l 2,32,33 + 684 92 684 92 696 104 c 128,-1,34 + 708 116 708 116 708 133 c 2,19,-1 +208 196 m 0,35,36 + 174 196 174 196 149.5 220 c 128,-1,37 + 125 244 125 244 125 279 c 128,-1,38 + 125 314 125 314 149.5 338 c 128,-1,39 + 174 362 174 362 208 362 c 0,40,41 + 243 362 243 362 267.5 337.5 c 128,-1,42 + 292 313 292 313 292 279 c 128,-1,43 + 292 245 292 245 267.5 220.5 c 128,-1,44 + 243 196 243 196 208 196 c 0,35,36 +208 321 m 128,-1,46 + 191 321 191 321 179 308.5 c 128,-1,47 + 167 296 167 296 167 279 c 128,-1,48 + 167 262 167 262 179 250 c 128,-1,49 + 191 238 191 238 208 238 c 128,-1,50 + 225 238 225 238 237.5 250 c 128,-1,51 + 250 262 250 262 250 279 c 128,-1,52 + 250 296 250 296 237.5 308.5 c 128,-1,45 + 225 321 225 321 208 321 c 128,-1,46 +396 196 m 0,53,54 + 361 196 361 196 336.5 220.5 c 128,-1,55 + 312 245 312 245 312 279 c 128,-1,56 + 312 313 312 313 336.5 337.5 c 128,-1,57 + 361 362 361 362 396 362 c 0,58,59 + 430 362 430 362 454.5 338 c 128,-1,60 + 479 314 479 314 479 279 c 128,-1,61 + 479 244 479 244 454.5 220 c 128,-1,62 + 430 196 430 196 396 196 c 0,53,54 +396 321 m 128,-1,64 + 379 321 379 321 366.5 308.5 c 128,-1,65 + 354 296 354 296 354 279 c 128,-1,66 + 354 262 354 262 366.5 250 c 128,-1,67 + 379 238 379 238 396 238 c 128,-1,68 + 413 238 413 238 425.5 250 c 128,-1,69 + 438 262 438 262 438 279 c 128,-1,70 + 438 296 438 296 425.5 308.5 c 128,-1,63 + 413 321 413 321 396 321 c 128,-1,64 +583 196 m 128,-1,72 + 548 196 548 196 524 220 c 128,-1,73 + 500 244 500 244 500 279 c 128,-1,74 + 500 314 500 314 524 338 c 128,-1,75 + 548 362 548 362 583 362 c 128,-1,76 + 618 362 618 362 642.5 337.5 c 128,-1,77 + 667 313 667 313 667 279 c 128,-1,78 + 667 245 667 245 642.5 220.5 c 128,-1,71 + 618 196 618 196 583 196 c 128,-1,72 +583 321 m 128,-1,80 + 566 321 566 321 554 308.5 c 128,-1,81 + 542 296 542 296 542 279 c 128,-1,82 + 542 262 542 262 554 250 c 128,-1,83 + 566 238 566 238 583 238 c 128,-1,84 + 600 238 600 238 612.5 250 c 128,-1,85 + 625 262 625 262 625 279 c 128,-1,86 + 625 296 625 296 612.5 308.5 c 128,-1,79 + 600 321 600 321 583 321 c 128,-1,80 +EndSplineSet +EndChar + +StartChar: glyph184 +Encoding: 184 57528 185 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 61 + 10 + 1 + 4 + 1 + 1 + 66 + 28 + 1 + 4 + 63 + 7 + 1 + 3 + 6 + 1 + 0 + 1 + 3 + 0 + 91 + 2 + 1 + 1 + 4 + 4 + 1 + 79 + 2 + 1 + 1 + 1 + 4 + 83 + 5 + 1 + 4 + 1 + 4 + 71 + 20 + 19 + 2 + 0 + 31 + 29 + 27 + 25 + 19 + 37 + 20 + 36 + 13 + 11 + 9 + 7 + 0 + 18 + 2 + 18 + 8 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 508 m 2,0,-1 + 125 508 l 2,1,2 + 108 508 108 508 95.5 496 c 128,-1,3 + 83 484 83 484 83 467 c 2,4,-1 + 83 175 l 2,5,6 + 83 158 83 158 95.5 145.5 c 128,-1,7 + 108 133 108 133 125 133 c 2,8,-1 + 250 133 l 1,9,-1 + 250 126 l 1,10,-1 + 257 133 l 1,11,-1 + 625 133 l 2,12,13 + 642 133 642 133 654.5 145.5 c 128,-1,14 + 667 158 667 158 667 175 c 2,15,-1 + 667 467 l 2,16,17 + 667 484 667 484 654.5 496 c 128,-1,18 + 642 508 642 508 625 508 c 2,0,-1 +625 592 m 2,19,20 + 677 592 677 592 713.5 555.5 c 128,-1,21 + 750 519 750 519 750 467 c 2,22,-1 + 750 175 l 2,23,24 + 750 123 750 123 713.5 86.5 c 128,-1,25 + 677 50 677 50 625 50 c 2,26,-1 + 292 50 l 1,27,-1 + 167 -75 l 1,28,-1 + 167 50 l 1,29,-1 + 125 50 l 2,30,31 + 73 50 73 50 36.5 86.5 c 128,-1,32 + 0 123 0 123 0 175 c 2,33,-1 + 0 467 l 2,34,35 + 0 519 0 519 36.5 555.5 c 128,-1,36 + 73 592 73 592 125 592 c 2,37,-1 + 625 592 l 2,19,20 +EndSplineSet +EndChar + +StartChar: glyph185 +Encoding: 185 57529 186 +Width: 1000 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 14 + 1 + 3 + 1 + 65 + 15 + 9 + 2 + 1 + 63 +MPPEM +PUSHB_1 + 31 +LT +IF +NPUSHB + 50 + 10 + 1 + 0 + 7 + 6 + 6 + 0 + 96 + 0 + 4 + 0 + 7 + 0 + 4 + 7 + 91 + 0 + 6 + 0 + 8 + 5 + 6 + 8 + 92 + 11 + 1 + 5 + 0 + 3 + 9 + 5 + 3 + 91 + 0 + 9 + 1 + 1 + 9 + 79 + 0 + 9 + 9 + 1 + 83 + 2 + 1 + 1 + 9 + 1 + 71 +ELSE +NPUSHB + 51 + 10 + 1 + 0 + 7 + 6 + 7 + 0 + 6 + 104 + 0 + 4 + 0 + 7 + 0 + 4 + 7 + 91 + 0 + 6 + 0 + 8 + 5 + 6 + 8 + 92 + 11 + 1 + 5 + 0 + 3 + 9 + 5 + 3 + 91 + 0 + 9 + 1 + 1 + 9 + 79 + 0 + 9 + 9 + 1 + 83 + 2 + 1 + 1 + 9 + 1 + 71 +EIF +NPUSHB + 30 + 29 + 28 + 1 + 0 + 60 + 57 + 52 + 49 + 40 + 37 + 34 + 32 + 28 + 45 + 29 + 45 + 25 + 22 + 17 + 16 + 12 + 10 + 8 + 6 + 0 + 27 + 1 + 27 + 12 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +875 508 m 2,0,1 + 927 508 927 508 963.5 471.5 c 128,-1,2 + 1000 435 1000 435 1000 383 c 2,3,-1 + 1000 92 l 2,4,5 + 1000 40 1000 40 963.5 3.5 c 128,-1,6 + 927 -33 927 -33 875 -33 c 2,7,-1 + 833 -33 l 1,8,-1 + 833 -158 l 1,9,-1 + 708 -33 l 1,10,-1 + 375 -33 l 2,11,12 + 323 -33 323 -33 286.5 3.5 c 128,-1,13 + 250 40 250 40 250 92 c 1,14,-1 + 125 -33 l 1,15,-1 + 125 92 l 1,16,17 + 73 92 73 92 36.5 128.5 c 128,-1,18 + 0 165 0 165 0 217 c 2,19,-1 + 0 508 l 2,20,21 + 0 560 0 560 36.5 596.5 c 128,-1,22 + 73 633 73 633 125 633 c 2,23,-1 + 625 633 l 2,24,25 + 677 633 677 633 713.5 596.5 c 128,-1,26 + 750 560 750 560 750 508 c 1,27,-1 + 875 508 l 2,0,1 +125 175 m 2,28,-1 + 292 175 l 1,29,-1 + 292 362 l 2,30,31 + 292 405 292 405 322.5 436 c 128,-1,32 + 353 467 353 467 396 467 c 2,33,-1 + 667 467 l 1,34,-1 + 667 508 l 2,35,36 + 667 525 667 525 654.5 537.5 c 128,-1,37 + 642 550 642 550 625 550 c 2,38,-1 + 125 550 l 2,39,40 + 108 550 108 550 95.5 537.5 c 128,-1,41 + 83 525 83 525 83 508 c 2,42,-1 + 83 217 l 2,43,44 + 83 200 83 200 95.5 187.5 c 128,-1,45 + 108 175 108 175 125 175 c 2,28,-1 +917 92 m 2,46,-1 + 917 383 l 2,47,48 + 917 400 917 400 904.5 412.5 c 128,-1,49 + 892 425 892 425 875 425 c 2,50,-1 + 396 425 l 2,51,52 + 370 425 370 425 351.5 406.5 c 128,-1,53 + 333 388 333 388 333 362 c 2,54,-1 + 333 92 l 2,55,56 + 333 75 333 75 345.5 62.5 c 128,-1,57 + 358 50 358 50 375 50 c 2,58,-1 + 875 50 l 2,59,60 + 892 50 892 50 904.5 62.5 c 128,-1,61 + 917 75 917 75 917 92 c 2,46,-1 +EndSplineSet +EndChar + +StartChar: glyph186 +Encoding: 186 57530 187 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 44 + 29 + 2 + 4 + 8 + 1 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 51 + 9 + 1 + 7 + 2 + 3 + 2 + 7 + 3 + 104 + 0 + 8 + 0 + 4 + 4 + 8 + 96 + 0 + 1 + 10 + 1 + 2 + 7 + 1 + 2 + 91 + 0 + 3 + 0 + 0 + 8 + 3 + 0 + 91 + 6 + 1 + 4 + 5 + 5 + 4 + 79 + 6 + 1 + 4 + 4 + 5 + 84 + 0 + 5 + 4 + 5 + 72 +ELSE +NPUSHB + 52 + 9 + 1 + 7 + 2 + 3 + 2 + 7 + 3 + 104 + 0 + 8 + 0 + 4 + 0 + 8 + 4 + 104 + 0 + 1 + 10 + 1 + 2 + 7 + 1 + 2 + 91 + 0 + 3 + 0 + 0 + 8 + 3 + 0 + 91 + 6 + 1 + 4 + 5 + 5 + 4 + 79 + 6 + 1 + 4 + 4 + 5 + 84 + 0 + 5 + 4 + 5 + 72 +EIF +NPUSHB + 24 + 13 + 12 + 63 + 62 + 57 + 56 + 51 + 50 + 43 + 41 + 38 + 35 + 32 + 30 + 20 + 18 + 12 + 25 + 13 + 25 + 21 + 16 + 11 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 133 m 128,-1,1 + 223 133 223 133 174 182 c 128,-1,2 + 125 231 125 231 125 300 c 2,3,-1 + 125 550 l 2,4,5 + 125 619 125 619 174 668 c 128,-1,6 + 223 717 223 717 292 717 c 128,-1,7 + 361 717 361 717 409.5 668 c 128,-1,8 + 458 619 458 619 458 550 c 2,9,-1 + 458 300 l 2,10,11 + 458 231 458 231 409.5 182 c 128,-1,0 + 361 133 361 133 292 133 c 128,-1,1 +292 633 m 0,12,13 + 257 633 257 633 232.5 608.5 c 128,-1,14 + 208 584 208 584 208 550 c 2,15,-1 + 208 300 l 2,16,17 + 208 266 208 266 232.5 241.5 c 128,-1,18 + 257 217 257 217 292 217 c 0,19,20 + 326 217 326 217 350.5 241.5 c 128,-1,21 + 375 266 375 266 375 300 c 2,22,-1 + 375 550 l 2,23,24 + 375 584 375 584 350.5 608.5 c 128,-1,25 + 326 633 326 633 292 633 c 0,12,13 +583 300 m 2,26,27 + 583 191 583 191 511.5 109 c 128,-1,28 + 440 27 440 27 333 12 c 1,29,-1 + 333 -33 l 1,30,-1 + 458 -33 l 2,31,32 + 475 -33 475 -33 487.5 -45.5 c 128,-1,33 + 500 -58 500 -58 500 -75 c 128,-1,34 + 500 -92 500 -92 487.5 -104.5 c 128,-1,35 + 475 -117 475 -117 458 -117 c 2,36,-1 + 125 -117 l 2,37,38 + 108 -117 108 -117 95.5 -104.5 c 128,-1,39 + 83 -92 83 -92 83 -75 c 128,-1,40 + 83 -58 83 -58 95.5 -45.5 c 128,-1,41 + 108 -33 108 -33 125 -33 c 2,42,-1 + 250 -33 l 1,43,-1 + 250 12 l 1,44,45 + 143 27 143 27 71.5 109 c 128,-1,46 + 0 191 0 191 0 300 c 2,47,-1 + 0 383 l 2,48,49 + 0 400 0 400 12.5 412.5 c 128,-1,50 + 25 425 25 425 42 425 c 128,-1,51 + 59 425 59 425 71 412.5 c 128,-1,52 + 83 400 83 400 83 383 c 2,53,-1 + 83 300 l 2,54,55 + 83 214 83 214 144.5 153 c 128,-1,56 + 206 92 206 92 292 92 c 128,-1,57 + 378 92 378 92 439 153 c 128,-1,58 + 500 214 500 214 500 300 c 2,59,-1 + 500 383 l 2,60,61 + 500 400 500 400 512.5 412.5 c 128,-1,62 + 525 425 525 425 542 425 c 128,-1,63 + 559 425 559 425 571 412.5 c 128,-1,64 + 583 400 583 400 583 383 c 2,65,-1 + 583 300 l 2,26,27 +EndSplineSet +EndChar + +StartChar: glyph187 +Encoding: 187 57531 188 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 30 + 15 + 2 + 2 + 6 + 1 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 42 + 7 + 1 + 5 + 1 + 0 + 1 + 5 + 0 + 104 + 0 + 6 + 0 + 2 + 2 + 6 + 96 + 0 + 1 + 0 + 0 + 6 + 1 + 0 + 91 + 4 + 1 + 2 + 3 + 3 + 2 + 79 + 4 + 1 + 2 + 2 + 3 + 84 + 0 + 3 + 2 + 3 + 72 +ELSE +NPUSHB + 43 + 7 + 1 + 5 + 1 + 0 + 1 + 5 + 0 + 104 + 0 + 6 + 0 + 2 + 0 + 6 + 2 + 104 + 0 + 1 + 0 + 0 + 6 + 1 + 0 + 91 + 4 + 1 + 2 + 3 + 3 + 2 + 79 + 4 + 1 + 2 + 2 + 3 + 84 + 0 + 3 + 2 + 3 + 72 +EIF +NPUSHB + 10 + 21 + 21 + 23 + 35 + 51 + 41 + 21 + 16 + 8 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 133 m 128,-1,1 + 223 133 223 133 174 182 c 128,-1,2 + 125 231 125 231 125 300 c 2,3,-1 + 125 550 l 2,4,5 + 125 619 125 619 174 668 c 128,-1,6 + 223 717 223 717 292 717 c 128,-1,7 + 361 717 361 717 409.5 668 c 128,-1,8 + 458 619 458 619 458 550 c 2,9,-1 + 458 300 l 2,10,11 + 458 231 458 231 409.5 182 c 128,-1,0 + 361 133 361 133 292 133 c 128,-1,1 +583 300 m 2,12,13 + 583 191 583 191 511.5 109 c 128,-1,14 + 440 27 440 27 333 12 c 1,15,-1 + 333 -33 l 1,16,-1 + 458 -33 l 2,17,18 + 475 -33 475 -33 487.5 -45.5 c 128,-1,19 + 500 -58 500 -58 500 -75 c 128,-1,20 + 500 -92 500 -92 487.5 -104.5 c 128,-1,21 + 475 -117 475 -117 458 -117 c 2,22,-1 + 125 -117 l 2,23,24 + 108 -117 108 -117 95.5 -104.5 c 128,-1,25 + 83 -92 83 -92 83 -75 c 128,-1,26 + 83 -58 83 -58 95.5 -45.5 c 128,-1,27 + 108 -33 108 -33 125 -33 c 2,28,-1 + 250 -33 l 1,29,-1 + 250 12 l 1,30,31 + 143 27 143 27 71.5 109 c 128,-1,32 + 0 191 0 191 0 300 c 2,33,-1 + 0 383 l 2,34,35 + 0 400 0 400 12.5 412.5 c 128,-1,36 + 25 425 25 425 42 425 c 128,-1,37 + 59 425 59 425 71 412.5 c 128,-1,38 + 83 400 83 400 83 383 c 2,39,-1 + 83 300 l 2,40,41 + 83 214 83 214 144.5 153 c 128,-1,42 + 206 92 206 92 292 92 c 128,-1,43 + 378 92 378 92 439 153 c 128,-1,44 + 500 214 500 214 500 300 c 2,45,-1 + 500 383 l 2,46,47 + 500 400 500 400 512.5 412.5 c 128,-1,48 + 525 425 525 425 542 425 c 128,-1,49 + 559 425 559 425 571 412.5 c 128,-1,50 + 583 400 583 400 583 383 c 2,51,-1 + 583 300 l 2,12,13 +EndSplineSet +EndChar + +StartChar: glyph188 +Encoding: 188 57532 189 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 44 + 0 + 1 + 5 + 1 + 2 + 3 + 1 + 2 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 4 + 1 + 0 + 3 + 0 + 71 + 13 + 12 + 2 + 0 + 19 + 16 + 12 + 23 + 13 + 22 + 8 + 5 + 0 + 11 + 2 + 11 + 6 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 133 m 2,0,-1 + 125 133 l 2,1,2 + 73 133 73 133 36.5 169.5 c 128,-1,3 + 0 206 0 206 0 258 c 128,-1,4 + 0 310 0 310 36.5 346.5 c 128,-1,5 + 73 383 73 383 125 383 c 2,6,-1 + 625 383 l 2,7,8 + 677 383 677 383 713.5 346.5 c 128,-1,9 + 750 310 750 310 750 258 c 128,-1,10 + 750 206 750 206 713.5 169.5 c 128,-1,11 + 677 133 677 133 625 133 c 2,0,-1 +125 300 m 2,12,13 + 108 300 108 300 95.5 287.5 c 128,-1,14 + 83 275 83 275 83 258 c 128,-1,15 + 83 241 83 241 95.5 229 c 128,-1,16 + 108 217 108 217 125 217 c 2,17,-1 + 625 217 l 2,18,19 + 642 217 642 217 654.5 229 c 128,-1,20 + 667 241 667 241 667 258 c 128,-1,21 + 667 275 667 275 654.5 287.5 c 128,-1,22 + 642 300 642 300 625 300 c 2,23,-1 + 125 300 l 2,12,13 +EndSplineSet +EndChar + +StartChar: glyph189 +Encoding: 189 57533 190 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 28 + 2 + 1 + 0 + 1 + 1 + 0 + 79 + 2 + 1 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 + 1 + 0 + 7 + 4 + 0 + 12 + 1 + 11 + 3 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 342 m 2,0,1 + 618 342 618 342 642.5 317 c 128,-1,2 + 667 292 667 292 667 258 c 128,-1,3 + 667 224 667 224 642.5 199.5 c 128,-1,4 + 618 175 618 175 583 175 c 2,5,-1 + 83 175 l 2,6,7 + 48 175 48 175 24 199.5 c 128,-1,8 + 0 224 0 224 0 258 c 0,9,10 + 0 293 0 293 24.5 317.5 c 128,-1,11 + 49 342 49 342 83 342 c 2,12,-1 + 583 342 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph190 +Encoding: 190 57534 191 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 55 + 72 + 57 + 42 + 41 + 37 + 36 + 22 + 5 + 2 + 9 + 3 + 1 + 1 + 66 + 0 + 1 + 3 + 1 + 106 + 0 + 3 + 2 + 3 + 106 + 4 + 1 + 2 + 0 + 0 + 2 + 79 + 4 + 1 + 2 + 2 + 0 + 84 + 0 + 0 + 2 + 0 + 72 + 34 + 33 + 66 + 63 + 33 + 44 + 34 + 44 + 31 + 30 + 41 + 5 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +771 471 m 2,0,1 + 826 446 826 446 833 392 c 1,2,3 + 833 326 833 326 779 296 c 2,4,-1 + 733 271 l 1,5,6 + 750 204 750 204 750 158 c 0,7,8 + 750 70 750 70 656 10 c 128,-1,9 + 562 -50 562 -50 425 -50 c 0,10,11 + 253 -50 253 -50 158 38 c 0,12,13 + 155 37 155 37 149.5 36 c 128,-1,14 + 144 35 144 35 126 32.5 c 128,-1,15 + 108 30 108 30 92 33 c 0,16,17 + 60 36 60 36 30 69.5 c 128,-1,18 + 0 103 0 103 0 146 c 0,19,20 + 0 233 0 233 12 283 c 2,21,-1 + 25 346 l 1,22,23 + 17 363 17 363 17 396 c 0,24,25 + 17 420 17 420 35 443 c 128,-1,26 + 53 466 53 466 79 479 c 0,27,28 + 304 592 304 592 358 617 c 0,29,30 + 400 638 400 638 423.5 637.5 c 128,-1,31 + 447 637 447 637 483 617 c 2,32,-1 + 771 471 l 2,0,1 +429 38 m 0,33,34 + 531 38 531 38 601 74.5 c 128,-1,35 + 671 111 671 111 671 162 c 1,36,-1 + 654 279 l 1,37,-1 + 475 192 l 2,38,39 + 426 172 426 172 383 192 c 2,40,-1 + 208 279 l 1,41,-1 + 188 162 l 1,42,43 + 188 109 188 109 258 73.5 c 128,-1,44 + 328 38 328 38 429 38 c 0,33,34 +733 375 m 2,45,46 + 746 381 746 381 746 389.5 c 128,-1,47 + 746 398 746 398 733 404 c 0,48,49 + 471 538 471 538 454 546 c 0,50,51 + 427 559 427 559 400 546 c 2,52,-1 + 121 404 l 2,53,54 + 108 398 108 398 108 389.5 c 128,-1,55 + 108 381 108 381 121 375 c 2,56,-1 + 129 371 l 1,57,58 + 116 338 116 338 104 279 c 0,59,60 + 92 217 92 217 92 150 c 0,61,62 + 92 135 92 135 102 126 c 128,-1,63 + 112 117 112 117 125 117 c 2,64,-1 + 129 117 l 2,65,66 + 158 117 158 117 158 150 c 0,67,68 + 158 156 158 156 154 196.5 c 128,-1,69 + 150 237 150 237 150 271 c 0,70,71 + 150 323 150 323 162 354 c 1,72,-1 + 400 233 l 2,73,74 + 429 219 429 219 458 233 c 2,75,-1 + 733 375 l 2,45,46 +EndSplineSet +EndChar + +StartChar: glyph191 +Encoding: 191 57535 192 +Width: 917 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 209 + 28 + 1 + 0 + 4 + 29 + 2 + 3 + 9 + 0 + 3 + 89 + 35 + 1 + 18 + 11 + 9 + 18 + 79 + 0 + 11 + 31 + 1 + 10 + 20 + 11 + 10 + 91 + 21 + 19 + 2 + 9 + 0 + 20 + 13 + 9 + 20 + 91 + 0 + 13 + 32 + 1 + 12 + 24 + 13 + 12 + 91 + 37 + 1 + 24 + 25 + 1 + 8 + 7 + 24 + 8 + 91 + 0 + 7 + 15 + 6 + 7 + 79 + 36 + 22 + 2 + 15 + 23 + 33 + 2 + 14 + 16 + 15 + 14 + 91 + 38 + 26 + 34 + 3 + 16 + 27 + 17 + 2 + 6 + 2 + 16 + 6 + 91 + 30 + 5 + 2 + 2 + 1 + 1 + 2 + 77 + 30 + 5 + 2 + 2 + 2 + 1 + 83 + 0 + 1 + 2 + 1 + 71 + 157 + 156 + 145 + 144 + 133 + 132 + 105 + 104 + 93 + 92 + 81 + 80 + 69 + 68 + 57 + 56 + 20 + 20 + 16 + 16 + 1 + 0 + 163 + 160 + 156 + 167 + 157 + 166 + 151 + 148 + 144 + 155 + 145 + 154 + 139 + 136 + 132 + 143 + 133 + 142 + 130 + 127 + 122 + 119 + 111 + 108 + 104 + 115 + 105 + 114 + 99 + 96 + 92 + 103 + 93 + 102 + 87 + 84 + 80 + 91 + 81 + 90 + 75 + 72 + 68 + 79 + 69 + 78 + 63 + 60 + 56 + 67 + 57 + 66 + 54 + 51 + 46 + 43 + 38 + 35 + 30 + 27 + 20 + 23 + 20 + 23 + 22 + 21 + 16 + 19 + 16 + 19 + 18 + 17 + 9 + 6 + 0 + 15 + 1 + 14 + 39 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +833 633 m 2,0,1 + 868 633 868 633 892.5 608.5 c 128,-1,2 + 917 584 917 584 917 550 c 2,3,-1 + 917 50 l 2,4,5 + 917 16 917 16 892.5 -8.5 c 128,-1,6 + 868 -33 868 -33 833 -33 c 2,7,-1 + 83 -33 l 2,8,9 + 48 -33 48 -33 24 -8.5 c 128,-1,10 + 0 16 0 16 0 50 c 2,11,-1 + 0 550 l 2,12,13 + 0 584 0 584 24 608.5 c 128,-1,14 + 48 633 48 633 83 633 c 2,15,-1 + 833 633 l 2,0,1 +83 550 m 1,16,-1 + 83 50 l 1,17,-1 + 417 50 l 1,18,-1 + 417 550 l 1,19,-1 + 83 550 l 1,16,-1 +833 50 m 1,20,-1 + 833 550 l 1,21,-1 + 458 550 l 1,22,-1 + 458 50 l 1,23,-1 + 833 50 l 1,20,-1 +792 238 m 2,24,-1 + 792 112 l 2,25,26 + 792 104 792 104 785.5 98 c 128,-1,27 + 779 92 779 92 771 92 c 2,28,-1 + 729 92 l 2,29,30 + 721 92 721 92 714.5 98 c 128,-1,31 + 708 104 708 104 708 112 c 2,32,-1 + 708 238 l 2,33,34 + 708 246 708 246 714.5 252 c 128,-1,35 + 721 258 721 258 729 258 c 2,36,-1 + 771 258 l 2,37,38 + 779 258 779 258 785.5 252 c 128,-1,39 + 792 246 792 246 792 238 c 2,24,-1 +667 488 m 2,40,-1 + 667 279 l 2,41,42 + 667 271 667 271 660.5 264.5 c 128,-1,43 + 654 258 654 258 646 258 c 2,44,-1 + 521 258 l 2,45,46 + 513 258 513 258 506.5 264.5 c 128,-1,47 + 500 271 500 271 500 279 c 2,48,-1 + 500 488 l 2,49,50 + 500 496 500 496 506.5 502 c 128,-1,51 + 513 508 513 508 521 508 c 2,52,-1 + 646 508 l 2,53,54 + 654 508 654 508 660.5 502 c 128,-1,55 + 667 496 667 496 667 488 c 2,40,-1 +729 383 m 2,56,57 + 721 383 721 383 714.5 389.5 c 128,-1,58 + 708 396 708 396 708 404 c 128,-1,59 + 708 412 708 412 714.5 418.5 c 128,-1,60 + 721 425 721 425 729 425 c 2,61,-1 + 771 425 l 2,62,63 + 779 425 779 425 785.5 418.5 c 128,-1,64 + 792 412 792 412 792 404 c 128,-1,65 + 792 396 792 396 785.5 389.5 c 128,-1,66 + 779 383 779 383 771 383 c 2,67,-1 + 729 383 l 2,56,57 +729 300 m 2,68,69 + 721 300 721 300 714.5 306.5 c 128,-1,70 + 708 313 708 313 708 321 c 128,-1,71 + 708 329 708 329 714.5 335.5 c 128,-1,72 + 721 342 721 342 729 342 c 2,73,-1 + 771 342 l 2,74,75 + 779 342 779 342 785.5 335.5 c 128,-1,76 + 792 329 792 329 792 321 c 128,-1,77 + 792 313 792 313 785.5 306.5 c 128,-1,78 + 779 300 779 300 771 300 c 2,79,-1 + 729 300 l 2,68,69 +521 175 m 2,80,81 + 513 175 513 175 506.5 181.5 c 128,-1,82 + 500 188 500 188 500 196 c 128,-1,83 + 500 204 500 204 506.5 210.5 c 128,-1,84 + 513 217 513 217 521 217 c 2,85,-1 + 646 217 l 2,86,87 + 654 217 654 217 660.5 210.5 c 128,-1,88 + 667 204 667 204 667 196 c 128,-1,89 + 667 188 667 188 660.5 181.5 c 128,-1,90 + 654 175 654 175 646 175 c 2,91,-1 + 521 175 l 2,80,81 +646 133 m 2,92,93 + 654 133 654 133 660.5 126.5 c 128,-1,94 + 667 120 667 120 667 112 c 128,-1,95 + 667 104 667 104 660.5 98 c 128,-1,96 + 654 92 654 92 646 92 c 2,97,-1 + 521 92 l 2,98,99 + 513 92 513 92 506.5 98 c 128,-1,100 + 500 104 500 104 500 112 c 128,-1,101 + 500 120 500 120 506.5 126.5 c 128,-1,102 + 513 133 513 133 521 133 c 2,103,-1 + 646 133 l 2,92,93 +729 467 m 2,104,105 + 721 467 721 467 714.5 473.5 c 128,-1,106 + 708 480 708 480 708 488 c 128,-1,107 + 708 496 708 496 714.5 502 c 128,-1,108 + 721 508 721 508 729 508 c 2,109,-1 + 771 508 l 2,110,111 + 779 508 779 508 785.5 502 c 128,-1,112 + 792 496 792 496 792 488 c 128,-1,113 + 792 480 792 480 785.5 473.5 c 128,-1,114 + 779 467 779 467 771 467 c 2,115,-1 + 729 467 l 2,104,105 +375 488 m 2,116,-1 + 375 362 l 2,117,118 + 375 354 375 354 368.5 348 c 128,-1,119 + 362 342 362 342 354 342 c 2,120,-1 + 146 342 l 2,121,122 + 138 342 138 342 131.5 348 c 128,-1,123 + 125 354 125 354 125 362 c 2,124,-1 + 125 488 l 2,125,126 + 125 496 125 496 131.5 502 c 128,-1,127 + 138 508 138 508 146 508 c 2,128,-1 + 354 508 l 2,129,130 + 362 508 362 508 368.5 502 c 128,-1,131 + 375 496 375 496 375 488 c 2,116,-1 +354 217 m 2,132,133 + 362 217 362 217 368.5 210.5 c 128,-1,134 + 375 204 375 204 375 196 c 128,-1,135 + 375 188 375 188 368.5 181.5 c 128,-1,136 + 362 175 362 175 354 175 c 2,137,-1 + 146 175 l 2,138,139 + 138 175 138 175 131.5 181.5 c 128,-1,140 + 125 188 125 188 125 196 c 128,-1,141 + 125 204 125 204 131.5 210.5 c 128,-1,142 + 138 217 138 217 146 217 c 2,143,-1 + 354 217 l 2,132,133 +354 300 m 2,144,145 + 362 300 362 300 368.5 293.5 c 128,-1,146 + 375 287 375 287 375 279 c 128,-1,147 + 375 271 375 271 368.5 264.5 c 128,-1,148 + 362 258 362 258 354 258 c 2,149,-1 + 146 258 l 2,150,151 + 138 258 138 258 131.5 264.5 c 128,-1,152 + 125 271 125 271 125 279 c 128,-1,153 + 125 287 125 287 131.5 293.5 c 128,-1,154 + 138 300 138 300 146 300 c 2,155,-1 + 354 300 l 2,144,145 +354 133 m 2,156,157 + 362 133 362 133 368.5 126.5 c 128,-1,158 + 375 120 375 120 375 112 c 128,-1,159 + 375 104 375 104 368.5 98 c 128,-1,160 + 362 92 362 92 354 92 c 2,161,-1 + 146 92 l 2,162,163 + 138 92 138 92 131.5 98 c 128,-1,164 + 125 104 125 104 125 112 c 128,-1,165 + 125 120 125 120 131.5 126.5 c 128,-1,166 + 138 133 138 133 146 133 c 2,167,-1 + 354 133 l 2,156,157 +EndSplineSet +EndChar + +StartChar: glyph192 +Encoding: 192 57536 193 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 77 + 45 + 44 + 32 + 31 + 29 + 28 + 27 + 18 + 8 + 5 + 0 + 46 + 1 + 3 + 5 + 33 + 1 + 6 + 3 + 9 + 1 + 4 + 6 + 4 + 66 + 0 + 0 + 5 + 0 + 106 + 0 + 5 + 3 + 5 + 106 + 0 + 3 + 6 + 3 + 106 + 0 + 4 + 1 + 2 + 4 + 79 + 0 + 6 + 0 + 1 + 2 + 6 + 1 + 91 + 0 + 4 + 4 + 2 + 83 + 0 + 2 + 4 + 2 + 71 + 53 + 52 + 49 + 47 + 41 + 40 + 36 + 34 + 35 + 37 + 16 + 7 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 639 m 2,0,1 + 617 639 617 639 642 614.5 c 128,-1,2 + 667 590 667 590 667 556 c 2,3,-1 + 667 133 l 2,4,5 + 667 64 667 64 611.5 15.5 c 128,-1,6 + 556 -33 556 -33 479 -33 c 0,7,8 + 405 -33 405 -33 352 12 c 1,9,10 + 328 -28 328 -28 284 -51.5 c 128,-1,11 + 240 -75 240 -75 188 -75 c 0,12,13 + 111 -75 111 -75 55.5 -26 c 128,-1,14 + 0 23 0 23 0 92 c 0,15,16 + 0 145 0 145 35 188.5 c 128,-1,17 + 70 232 70 232 125 249 c 1,18,-1 + 125 503 l 2,19,20 + 125 535 125 535 146 558.5 c 128,-1,21 + 167 582 167 582 198 586 c 2,22,-1 + 573 638 l 1,23,-1 + 583 639 l 2,0,1 +333 133 m 1,24,25 + 333 180 333 180 368.5 215 c 128,-1,26 + 404 250 404 250 458 257 c 1,27,-1 + 458 329 l 1,28,-1 + 333 311 l 1,29,-1 + 333 133 l 1,24,25 +583 133 m 2,30,-1 + 583 556 l 1,31,-1 + 208 503 l 1,32,-1 + 208 173 l 1,33,34 + 194 175 194 175 188 175 c 0,35,36 + 144 175 144 175 113.5 150.5 c 128,-1,37 + 83 126 83 126 83 92 c 0,38,39 + 83 57 83 57 114 32.5 c 128,-1,40 + 145 8 145 8 188 8 c 128,-1,41 + 231 8 231 8 261.5 32.5 c 128,-1,42 + 292 57 292 57 292 92 c 2,43,-1 + 292 347 l 1,44,-1 + 500 378 l 1,45,-1 + 500 215 l 1,46,47 + 486 217 486 217 479 217 c 0,48,49 + 436 217 436 217 405.5 192.5 c 128,-1,50 + 375 168 375 168 375 133 c 128,-1,51 + 375 98 375 98 405.5 74 c 128,-1,52 + 436 50 436 50 479 50 c 128,-1,53 + 522 50 522 50 552.5 74 c 128,-1,54 + 583 98 583 98 583 133 c 2,30,-1 +EndSplineSet +EndChar + +StartChar: glyph193 +Encoding: 193 57537 194 +Width: 625 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 35 + 13 + 12 + 2 + 1 + 64 + 0 + 3 + 0 + 2 + 3 + 79 + 0 + 1 + 0 + 0 + 2 + 1 + 0 + 91 + 0 + 3 + 3 + 2 + 83 + 0 + 2 + 3 + 2 + 71 + 19 + 21 + 19 + 22 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +602 636 m 2,0,1 + 611 637 611 637 618 630.5 c 128,-1,2 + 625 624 625 624 625 615 c 2,3,-1 + 625 112 l 2,4,5 + 625 69 625 69 588.5 38.5 c 128,-1,6 + 552 8 552 8 500 8 c 128,-1,7 + 448 8 448 8 411.5 38.5 c 128,-1,8 + 375 69 375 69 375 112 c 128,-1,9 + 375 155 375 155 411.5 186 c 128,-1,10 + 448 217 448 217 500 217 c 1,11,-1 + 500 372 l 1,12,-1 + 250 346 l 1,13,-1 + 250 29 l 2,14,15 + 250 -14 250 -14 213.5 -44.5 c 128,-1,16 + 177 -75 177 -75 125 -75 c 128,-1,17 + 73 -75 73 -75 36.5 -44.5 c 128,-1,18 + 0 -14 0 -14 0 29 c 128,-1,19 + 0 72 0 72 36.5 102.5 c 128,-1,20 + 73 133 73 133 125 133 c 1,21,-1 + 125 563 l 2,22,23 + 125 571 125 571 130.5 577 c 128,-1,24 + 136 583 136 583 143 584 c 2,25,-1 + 602 636 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph194 +Encoding: 194 57538 195 +Width: 793 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 70 + 68 + 61 + 59 + 44 + 43 + 5 + 6 + 3 + 4 + 39 + 1 + 1 + 3 + 38 + 37 + 36 + 34 + 33 + 29 + 6 + 2 + 1 + 3 + 66 + 0 + 2 + 1 + 2 + 107 + 5 + 1 + 0 + 0 + 4 + 3 + 0 + 4 + 91 + 0 + 3 + 1 + 1 + 3 + 79 + 0 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 + 1 + 0 + 67 + 66 + 57 + 55 + 19 + 17 + 11 + 9 + 0 + 28 + 1 + 28 + 6 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +604 689 m 0,0,1 + 681 689 681 689 737 633 c 128,-1,2 + 793 577 793 577 793 500 c 0,3,4 + 793 478 793 478 786 450 c 1,5,6 + 806 388 806 388 761 343 c 2,7,-1 + 574 155 l 2,8,9 + 544 125 544 125 500 125 c 2,10,-1 + 497 125 l 1,11,-1 + 407 35 l 2,12,13 + 382 10 382 10 344 -5 c 0,14,15 + 334 -9 334 -9 55 -102 c 0,16,17 + 47 -104 47 -104 42 -104 c 0,18,19 + 21 -104 21 -104 8 -87 c 128,-1,20 + -5 -70 -5 -70 2 -50 c 0,21,22 + 95 229 95 229 99 239 c 0,23,24 + 114 277 114 277 140 303 c 0,25,26 + 471 633 471 633 472 634 c 0,27,28 + 529 689 529 689 604 689 c 0,0,1 +299 67 m 1,29,-1 + 172 194 l 1,30,31 + 170 188 170 188 160 159 c 128,-1,32 + 150 130 150 130 143 109 c 1,33,-1 + 214 38 l 1,34,35 + 249 49 249 49 299 67 c 1,29,-1 +128 65 m 1,36,-1 + 107 3 l 1,37,-1 + 170 24 l 1,38,-1 + 128 65 l 1,36,-1 +449 195 m 1,39,40 + 437 213 437 213 438.5 235 c 128,-1,41 + 440 257 440 257 456 273 c 2,42,-1 + 610 427 l 1,43,-1 + 496 541 l 1,44,-1 + 199 243 l 1,45,-1 + 191 234 l 1,46,-1 + 338 87 l 1,47,-1 + 348 94 l 1,48,-1 + 449 195 l 1,39,40 +702 402 m 2,49,50 + 716 416 716 416 701.5 430.5 c 128,-1,51 + 687 445 687 445 673 431 c 2,52,-1 + 485 244 l 2,53,54 + 475 234 475 234 481 221 c 128,-1,55 + 487 208 487 208 500 208 c 0,56,57 + 509 208 509 208 515 214 c 2,58,-1 + 702 402 l 2,49,50 +639 456 m 1,59,60 + 670 487 670 487 707 475 c 1,61,62 + 710 487 710 487 710 500 c 0,63,64 + 710 543 710 543 679 574 c 0,65,66 + 646 605 646 605 601.5 603.5 c 128,-1,67 + 557 602 557 602 525 570 c 1,68,-1 + 639 456 l 1,59,60 +EndSplineSet +EndChar + +StartChar: glyph195 +Encoding: 195 57539 196 +Width: 768 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 53 + 40 + 39 + 38 + 37 + 36 + 35 + 34 + 33 + 31 + 28 + 23 + 20 + 19 + 18 + 17 + 15 + 2 + 1 + 1 + 66 + 0 + 1 + 2 + 1 + 106 + 3 + 1 + 2 + 0 + 0 + 2 + 79 + 3 + 1 + 2 + 2 + 0 + 83 + 0 + 0 + 2 + 0 + 71 + 22 + 21 + 21 + 32 + 22 + 32 + 22 + 38 + 4 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +750 513 m 2,0,1 + 768 495 768 495 768 469 c 128,-1,2 + 768 443 768 443 750 425 c 2,3,-1 + 294 -31 l 2,4,5 + 277 -48 277 -48 246.5 -61.5 c 128,-1,6 + 216 -75 216 -75 188 -75 c 2,7,-1 + 0 -75 l 1,8,-1 + 0 112 l 2,9,10 + 0 140 0 140 13.5 171 c 128,-1,11 + 27 202 27 202 44 219 c 2,12,-1 + 500 675 l 2,13,14 + 518 693 518 693 544 693 c 128,-1,15 + 570 693 570 693 588 675 c 2,16,-1 + 750 513 l 2,0,1 +115 172 m 1,17,-1 + 167 121 l 1,18,-1 + 512 467 l 1,19,-1 + 461 518 l 1,20,-1 + 115 172 l 1,17,-1 +188 8 m 2,21,22 + 199 8 199 8 214 15 c 1,23,24 + 206 23 206 23 193 35.5 c 128,-1,25 + 180 48 180 48 153 75.5 c 128,-1,26 + 126 103 126 103 108 120 c 2,27,-1 + 90 138 l 1,28,29 + 83 121 83 121 83 112 c 2,30,-1 + 83 50 l 1,31,-1 + 125 8 l 1,32,-1 + 188 8 l 2,21,22 +247 40 m 1,33,-1 + 593 386 l 1,34,-1 + 542 437 l 1,35,-1 + 196 92 l 1,36,-1 + 247 40 l 1,33,-1 +622 415 m 1,37,-1 + 676 469 l 1,38,-1 + 544 601 l 1,39,-1 + 490 548 l 1,40,-1 + 622 415 l 1,37,-1 +EndSplineSet +EndChar + +StartChar: glyph196 +Encoding: 196 57540 197 +Width: 836 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 72 + 58 + 57 + 35 + 34 + 20 + 5 + 1 + 3 + 68 + 43 + 19 + 3 + 5 + 4 + 69 + 42 + 2 + 6 + 5 + 3 + 66 + 0 + 5 + 4 + 6 + 4 + 5 + 6 + 104 + 0 + 2 + 0 + 3 + 1 + 2 + 3 + 91 + 0 + 1 + 0 + 4 + 5 + 1 + 4 + 91 + 0 + 6 + 0 + 0 + 6 + 79 + 0 + 6 + 6 + 0 + 83 + 0 + 0 + 6 + 0 + 71 + 72 + 70 + 66 + 64 + 22 + 41 + 41 + 23 + 39 + 7 + 20 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +771 647 m 2,0,1 + 796 622 796 622 813 587.5 c 128,-1,2 + 830 553 830 553 834.5 500.5 c 128,-1,3 + 839 448 839 448 825 391 c 128,-1,4 + 811 334 811 334 765.5 260 c 128,-1,5 + 720 186 720 186 646 112 c 0,6,7 + 457 -77 457 -77 283 -77 c 0,8,9 + 176 -77 176 -77 111 -12 c 2,10,-1 + 37 62 l 2,11,12 + 0 99 0 99 0 150.5 c 128,-1,13 + 0 202 0 202 37 239 c 2,14,-1 + 103 305 l 2,15,16 + 140 342 140 342 191 342 c 128,-1,17 + 242 342 242 342 279 305 c 2,18,-1 + 337 248 l 1,19,-1 + 511 421 l 1,20,-1 + 453 479 l 2,21,22 + 416 516 416 516 416 567.5 c 128,-1,23 + 416 619 416 619 453 656 c 2,24,-1 + 519 722 l 2,25,26 + 555 758 555 758 608 758 c 0,27,28 + 660 758 660 758 696 722 c 2,29,-1 + 771 647 l 2,0,1 +512 597 m 2,30,31 + 500 585 500 585 500 567.5 c 128,-1,32 + 500 550 500 550 512 538 c 2,33,-1 + 557 493 l 1,34,-1 + 682 618 l 1,35,-1 + 637 663 l 2,36,37 + 625 675 625 675 608 675 c 0,38,39 + 590 675 590 675 578 663 c 2,40,-1 + 512 597 l 2,30,31 +95 121 m 2,41,-1 + 141 76 l 1,42,-1 + 266 201 l 1,43,-1 + 220 246 l 2,44,45 + 208 258 208 258 191 258 c 128,-1,46 + 174 258 174 258 162 246 c 2,47,-1 + 95 180 l 2,48,49 + 83 168 83 168 83 150.5 c 128,-1,50 + 83 133 83 133 95 121 c 2,41,-1 +587 171 m 0,51,52 + 652 236 652 236 691 298 c 128,-1,53 + 730 360 730 360 742 404.5 c 128,-1,54 + 754 449 754 449 751 488.5 c 128,-1,55 + 748 528 748 528 737.5 550.5 c 128,-1,56 + 727 573 727 573 712 588 c 1,57,-1 + 587 463 l 1,58,-1 + 599 451 l 2,59,60 + 611 439 611 439 611 421.5 c 128,-1,61 + 611 404 611 404 599 392 c 2,62,-1 + 366 159 l 2,63,64 + 354 147 354 147 337 147 c 0,65,66 + 319 147 319 147 307 159 c 2,67,-1 + 295 172 l 1,68,-1 + 170 46 l 1,69,70 + 210 6 210 6 283 6 c 0,71,72 + 422 6 422 6 587 171 c 0,51,52 +EndSplineSet +EndChar + +StartChar: glyph197 +Encoding: 197 57541 198 +Width: 710 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 42 + 43 + 42 + 9 + 0 + 4 + 1 + 0 + 33 + 32 + 12 + 11 + 4 + 2 + 1 + 2 + 66 + 0 + 0 + 1 + 0 + 106 + 0 + 1 + 2 + 2 + 1 + 79 + 0 + 1 + 1 + 2 + 83 + 0 + 2 + 1 + 2 + 71 + 40 + 28 + 22 + 3 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +453 505 m 1,0,-1 + 435 523 l 2,1,2 + 417 541 417 541 417 567 c 128,-1,3 + 417 593 417 593 435 611 c 2,4,-1 + 501 678 l 2,5,6 + 519 696 519 696 545 696 c 128,-1,7 + 571 696 571 696 589 678 c 2,8,-1 + 608 659 l 1,9,-1 + 453 505 l 1,0,-1 +173 261 m 2,10,-1 + 191 243 l 1,11,-1 + 37 88 l 1,12,-1 + 18 106 l 2,13,14 + 0 124 0 124 0 151 c 0,15,16 + 0 177 0 177 18 195 c 2,17,-1 + 84 261 l 2,18,19 + 102 279 102 279 128.5 279 c 128,-1,20 + 155 279 155 279 173 261 c 2,10,-1 +664 603 m 2,21,22 + 672 595 672 595 682 581 c 128,-1,23 + 692 567 692 567 703 524.5 c 128,-1,24 + 714 482 714 482 708 434 c 128,-1,25 + 702 386 702 386 660 311 c 128,-1,26 + 618 236 618 236 539 157 c 0,27,28 + 368 -14 368 -14 220 -14 c 0,29,30 + 139 -14 139 -14 93 32 c 2,31,-1 + 78 46 l 1,32,-1 + 233 201 l 1,33,-1 + 260 174 l 2,34,35 + 274 160 274 160 289 174 c 2,36,-1 + 522 407 l 2,37,38 + 528 413 528 413 528 421 c 0,39,40 + 528 430 528 430 522 436 c 2,41,-1 + 495 463 l 1,42,-1 + 649 618 l 1,43,-1 + 664 603 l 2,21,22 +EndSplineSet +EndChar + +StartChar: glyph198 +Encoding: 198 57542 199 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 84 + 56 + 49 + 2 + 7 + 6 + 67 + 60 + 2 + 3 + 9 + 7 + 1 + 10 + 3 + 3 + 66 + 0 + 4 + 0 + 8 + 5 + 4 + 8 + 91 + 0 + 0 + 0 + 6 + 7 + 0 + 6 + 91 + 0 + 5 + 0 + 7 + 9 + 5 + 7 + 91 + 0 + 9 + 0 + 3 + 10 + 9 + 3 + 91 + 11 + 1 + 10 + 1 + 1 + 10 + 79 + 11 + 1 + 10 + 10 + 1 + 83 + 2 + 1 + 1 + 10 + 1 + 71 + 64 + 63 + 53 + 52 + 46 + 45 + 18 + 18 + 22 + 18 + 20 + 19 + 20 + 25 + 16 + 12 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 540 m 128,-1,1 + 676 540 676 540 713 503 c 128,-1,2 + 750 466 750 466 750 415 c 0,3,4 + 750 363 750 363 713 326 c 0,5,6 + 675 287 675 287 625 265 c 1,7,-1 + 625 92 l 2,8,9 + 625 40 625 40 588.5 3.5 c 128,-1,10 + 552 -33 552 -33 500 -33 c 128,-1,11 + 448 -33 448 -33 411.5 3.5 c 128,-1,12 + 375 40 375 40 375 92 c 1,13,14 + 375 40 375 40 338.5 3.5 c 128,-1,15 + 302 -33 302 -33 250 -33 c 128,-1,16 + 198 -33 198 -33 161.5 3.5 c 128,-1,17 + 125 40 125 40 125 92 c 2,18,-1 + 125 290 l 1,19,20 + 74 290 74 290 37 327 c 128,-1,21 + 0 364 0 364 0 415 c 128,-1,22 + 0 466 0 466 37 503 c 0,23,24 + 126 592 126 592 250 592 c 128,-1,25 + 374 592 374 592 463 503 c 0,26,27 + 478 488 478 488 500 488 c 128,-1,28 + 522 488 522 488 537 503 c 0,29,0 + 574 540 574 540 625 540 c 128,-1,1 +654 385 m 0,30,31 + 666 397 666 397 666 414.5 c 128,-1,32 + 666 432 666 432 654 444 c 0,33,34 + 641 457 641 457 625 457 c 128,-1,35 + 609 457 609 457 596 444 c 0,36,37 + 557 405 557 405 500 405 c 128,-1,38 + 443 405 443 405 404 444 c 0,39,40 + 340 508 340 508 250 508 c 128,-1,41 + 160 508 160 508 96 444 c 0,42,43 + 84 432 84 432 84 414.5 c 128,-1,44 + 84 397 84 397 96 385 c 128,-1,45 + 108 373 108 373 125 373 c 128,-1,46 + 142 373 142 373 154 385 c 0,47,48 + 178 409 178 409 208 418 c 1,49,-1 + 208 92 l 2,50,51 + 208 75 208 75 220.5 62.5 c 128,-1,52 + 233 50 233 50 250 50 c 128,-1,53 + 267 50 267 50 279.5 62.5 c 128,-1,54 + 292 75 292 75 292 92 c 2,55,-1 + 292 418 l 1,56,57 + 322 409 322 409 346 385 c 0,58,59 + 392 339 392 339 458 326 c 1,60,-1 + 458 92 l 2,61,62 + 458 75 458 75 470.5 62.5 c 128,-1,63 + 483 50 483 50 500 50 c 128,-1,64 + 517 50 517 50 529.5 62.5 c 128,-1,65 + 542 75 542 75 542 92 c 2,66,-1 + 542 326 l 1,67,68 + 608 339 608 339 654 385 c 0,30,31 +EndSplineSet +EndChar + +StartChar: glyph199 +Encoding: 199 57543 200 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 65 + 23 + 16 + 2 + 4 + 5 + 12 + 5 + 2 + 0 + 2 + 2 + 66 + 6 + 1 + 5 + 3 + 4 + 3 + 5 + 4 + 104 + 0 + 2 + 4 + 0 + 4 + 2 + 0 + 104 + 0 + 3 + 5 + 0 + 3 + 79 + 0 + 4 + 2 + 0 + 4 + 79 + 0 + 4 + 4 + 0 + 83 + 1 + 1 + 0 + 4 + 0 + 71 + 0 + 0 + 0 + 37 + 0 + 37 + 18 + 20 + 22 + 26 + 24 + 7 + 20 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +571 444 m 128,-1,1 + 583 432 583 432 583 414.5 c 128,-1,2 + 583 397 583 397 571 385 c 0,3,4 + 525 339 525 339 458 326 c 1,5,-1 + 458 92 l 2,6,7 + 458 75 458 75 446 62.5 c 128,-1,8 + 434 50 434 50 417 50 c 128,-1,9 + 400 50 400 50 387.5 62.5 c 128,-1,10 + 375 75 375 75 375 92 c 2,11,-1 + 375 326 l 1,12,13 + 308 339 308 339 262 385 c 0,14,15 + 238 409 238 409 208 418 c 1,16,-1 + 208 92 l 2,17,18 + 208 75 208 75 196 62.5 c 128,-1,19 + 184 50 184 50 167 50 c 128,-1,20 + 150 50 150 50 137.5 62.5 c 128,-1,21 + 125 75 125 75 125 92 c 2,22,-1 + 125 418 l 1,23,24 + 95 409 95 409 71 385 c 0,25,26 + 59 373 59 373 41.5 373 c 128,-1,27 + 24 373 24 373 12 385 c 128,-1,28 + 0 397 0 397 0 414.5 c 128,-1,29 + 0 432 0 432 12 444 c 0,30,31 + 76 508 76 508 166.5 508 c 128,-1,32 + 257 508 257 508 321 444 c 0,33,34 + 361 404 361 404 416.5 404 c 128,-1,35 + 472 404 472 404 512 444 c 0,36,37 + 524 456 524 456 541.5 456 c 128,-1,0 + 559 456 559 456 571 444 c 128,-1,1 +EndSplineSet +EndChar + +StartChar: glyph200 +Encoding: 200 57544 201 +Width: 709 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 50 + 37 + 1 + 1 + 2 + 36 + 1 + 3 + 1 + 43 + 17 + 15 + 3 + 0 + 3 + 3 + 66 + 16 + 1 + 0 + 63 + 0 + 2 + 1 + 0 + 2 + 79 + 0 + 1 + 0 + 3 + 0 + 1 + 3 + 91 + 0 + 2 + 2 + 0 + 83 + 0 + 0 + 2 + 0 + 71 + 25 + 23 + 41 + 43 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +685 484 m 2,0,1 + 709 460 709 460 709 425.5 c 128,-1,2 + 709 391 709 391 685 366 c 0,3,4 + 672 353 672 353 656 347 c 0,5,6 + 571 306 571 306 541 247 c 0,7,8 + 500 165 500 165 500 50 c 0,9,10 + 500 14 500 14 476.5 -9.5 c 128,-1,11 + 453 -33 453 -33 417 -33 c 0,12,13 + 379 -33 379 -33 357 -9 c 2,14,-1 + 223 126 l 1,15,-1 + 0 -33 l 1,16,-1 + 159 190 l 1,17,-1 + 24 324 l 2,18,19 + 8 339 8 339 2.5 363.5 c 128,-1,20 + -3 388 -3 388 6 415 c 0,21,22 + 28 467 28 467 83 467 c 0,23,24 + 200 467 200 467 280 507 c 2,25,-1 + 289 512 l 2,26,27 + 344 542 344 542 383 625 c 0,28,29 + 389 641 389 641 400 652 c 0,30,31 + 424 676 424 676 459.5 675.5 c 128,-1,32 + 495 675 495 675 518 651 c 2,33,-1 + 685 484 l 2,0,1 +466 284 m 0,34,35 + 509 370 509 370 623 424 c 1,36,-1 + 459 593 l 1,37,38 + 404 476 404 476 318 433 c 2,39,-1 + 308 428 l 2,40,41 + 212 383 212 383 83 383 c 1,42,-1 + 416 50 l 1,43,44 + 416 184 416 184 466 284 c 0,34,35 +EndSplineSet +EndChar + +StartChar: glyph201 +Encoding: 201 57545 202 +Width: 668 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 24 + 8 + 6 + 2 + 0 + 1 + 1 + 66 + 7 + 1 + 0 + 63 + 0 + 1 + 0 + 1 + 106 + 0 + 0 + 0 + 97 + 40 + 34 + 2 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +458 50 m 0,0,1 + 458 32 458 32 446.5 20 c 128,-1,2 + 435 8 435 8 417 8 c 0,3,4 + 400 8 400 8 387 21 c 2,5,-1 + 252 156 l 1,6,-1 + 0 -33 l 1,7,-1 + 189 219 l 1,8,-1 + 54 354 l 2,9,10 + 35 373 35 373 45 399 c 0,11,12 + 56 425 56 425 83 425 c 0,13,14 + 209 425 209 425 299 470 c 0,15,16 + 371 506 371 506 420 607 c 0,17,18 + 427 626 427 626 449 632.5 c 128,-1,19 + 471 639 471 639 489 622 c 2,20,-1 + 655 455 l 2,21,22 + 672 437 672 437 666 415 c 128,-1,23 + 660 393 660 393 641 386 c 0,24,25 + 539 336 539 336 503 265 c 0,26,27 + 458 177 458 177 458 50 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph202 +Encoding: 202 57546 203 +Width: 766 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 51 + 53 + 52 + 38 + 5 + 4 + 0 + 2 + 56 + 49 + 47 + 46 + 4 + 1 + 0 + 2 + 66 + 0 + 2 + 3 + 0 + 3 + 2 + 0 + 104 + 0 + 1 + 0 + 1 + 107 + 0 + 3 + 2 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 0 + 0 + 3 + 0 + 71 + 37 + 30 + 40 + 41 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +718 627 m 0,0,1 + 765 580 765 580 765.5 504.5 c 128,-1,2 + 766 429 766 429 715 388 c 0,3,4 + 673 355 673 355 563 314 c 1,5,-1 + 630 247 l 2,6,7 + 642 235 642 235 642 217.5 c 128,-1,8 + 642 200 642 200 630 188 c 128,-1,9 + 618 176 618 176 601 176 c 0,10,11 + 583 176 583 176 571 188 c 2,12,-1 + 559 200 l 1,13,-1 + 341 -18 l 2,14,15 + 316 -43 316 -43 278 -58 c 0,16,17 + 277 -59 277 -59 254.5 -66.5 c 128,-1,18 + 232 -74 232 -74 192.5 -82.5 c 128,-1,19 + 153 -91 153 -91 120 -91 c 0,20,21 + 58 -91 58 -91 29 -62 c 0,22,23 + 10 -43 10 -43 3.5 -10.5 c 128,-1,24 + -3 22 -3 22 0.5 54 c 128,-1,25 + 4 86 4 86 12 117.5 c 128,-1,26 + 20 149 20 149 25.5 166 c 128,-1,27 + 31 183 31 183 33 186 c 0,28,29 + 48 224 48 224 74 250 c 2,30,-1 + 292 468 l 1,31,-1 + 279 480 l 2,32,33 + 267 492 267 492 267 509.5 c 128,-1,34 + 267 527 267 527 279 539 c 128,-1,35 + 291 551 291 551 308.5 551 c 128,-1,36 + 326 551 326 551 338 539 c 2,37,-1 + 406 471 l 1,38,39 + 448 583 448 583 479 623 c 0,40,41 + 520 675 520 675 597 675 c 0,42,43 + 670 675 670 675 718 627 c 0,0,1 +88 -3 m 1,44,45 + 107 -19 107 -19 196 3 c 1,46,-1 + 95 104 l 1,47,48 + 73 15 73 15 88 -3 c 1,44,45 +241 17 m 1,49,50 + 268 27 268 27 282 41 c 2,51,-1 + 500 259 l 1,52,-1 + 351 408 l 1,53,-1 + 133 190 l 2,54,55 + 119 176 119 176 109 150 c 1,56,-1 + 241 17 l 1,49,50 +EndSplineSet +EndChar + +StartChar: glyph203 +Encoding: 203 57547 204 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 63 + 81 + 80 + 62 + 61 + 54 + 47 + 42 + 35 + 28 + 27 + 8 + 7 + 12 + 3 + 5 + 1 + 66 + 0 + 1 + 0 + 2 + 4 + 1 + 2 + 91 + 0 + 4 + 0 + 5 + 3 + 4 + 5 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 0 + 0 + 3 + 0 + 71 + 91 + 89 + 87 + 85 + 71 + 69 + 51 + 50 + 39 + 38 + 17 + 16 + 6 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +770 284 m 2,0,1 + 811 261 811 261 827 215.5 c 128,-1,2 + 843 170 843 170 824 126 c 0,3,4 + 805 83 805 83 762.5 62.5 c 128,-1,5 + 720 42 720 42 674 55 c 2,6,-1 + 562 87 l 1,7,-1 + 562 52 l 1,8,-1 + 599 23 l 2,9,10 + 636 -7 636 -7 644 -54.5 c 128,-1,11 + 652 -102 652 -102 626 -142 c 0,12,13 + 600 -183 600 -183 554 -196 c 128,-1,14 + 508 -209 508 -209 465 -187 c 1,15,-1 + 417 -179 l 2,16,17 + 405 -179 405 -179 392.5 -181 c 128,-1,18 + 380 -183 380 -183 374 -185 c 2,19,-1 + 368 -187 l 1,20,21 + 325 -209 325 -209 279 -196 c 128,-1,22 + 233 -183 233 -183 207 -142 c 0,23,24 + 181 -102 181 -102 189 -54.5 c 128,-1,25 + 197 -7 197 -7 234 23 c 2,26,-1 + 271 52 l 1,27,-1 + 271 87 l 1,28,-1 + 159 55 l 2,29,30 + 113 42 113 42 71 62.5 c 128,-1,31 + 29 83 29 83 10 126 c 128,-1,32 + -9 169 -9 169 6.5 215 c 128,-1,33 + 22 261 22 261 63 284 c 2,34,-1 + 271 402 l 1,35,-1 + 271 602 l 2,36,37 + 271 662 271 662 314 705 c 128,-1,38 + 357 748 357 748 417 748 c 128,-1,39 + 477 748 477 748 519.5 705 c 128,-1,40 + 562 662 562 662 562 602 c 2,41,-1 + 562 402 l 1,42,-1 + 770 284 l 2,0,1 +747 159 m 128,-1,44 + 753 173 753 173 748 188 c 128,-1,45 + 743 203 743 203 729 211 c 2,46,-1 + 479 354 l 1,47,-1 + 479 602 l 2,48,49 + 479 628 479 628 460.5 646.5 c 128,-1,50 + 442 665 442 665 417 665 c 128,-1,51 + 392 665 392 665 373 646.5 c 128,-1,52 + 354 628 354 628 354 602 c 2,53,-1 + 354 354 l 1,54,-1 + 104 211 l 2,55,56 + 91 204 91 204 86 188.5 c 128,-1,57 + 81 173 81 173 87 159 c 128,-1,58 + 93 145 93 145 107 138 c 128,-1,59 + 121 131 121 131 136 135 c 2,60,-1 + 354 197 l 1,61,-1 + 354 12 l 1,62,-1 + 286 -42 l 2,63,64 + 273 -52 273 -52 271 -68.5 c 128,-1,65 + 269 -85 269 -85 277 -98 c 128,-1,66 + 285 -111 285 -111 301 -115 c 128,-1,67 + 317 -119 317 -119 331 -112 c 0,68,69 + 366 -96 366 -96 417 -96 c 0,70,71 + 440 -96 440 -96 461 -100 c 128,-1,72 + 482 -104 482 -104 492 -108 c 2,73,-1 + 502 -112 l 2,74,75 + 516 -120 516 -120 532 -115.5 c 128,-1,76 + 548 -111 548 -111 556 -98 c 128,-1,77 + 564 -85 564 -85 562 -68.5 c 128,-1,78 + 560 -52 560 -52 547 -42 c 2,79,-1 + 479 12 l 1,80,-1 + 479 197 l 1,81,-1 + 697 135 l 2,82,83 + 712 131 712 131 726.5 138 c 128,-1,43 + 741 145 741 145 747 159 c 128,-1,44 +396 612 m 0,84,85 + 396 633 396 633 417 633 c 0,86,87 + 437 633 437 633 437 612 c 0,88,89 + 437 592 437 592 417 592 c 0,90,91 + 396 592 396 592 396 612 c 0,84,85 +EndSplineSet +EndChar + +StartChar: glyph204 +Encoding: 204 57548 205 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 65 + 36 + 29 + 22 + 5 + 4 + 0 + 3 + 21 + 13 + 6 + 3 + 1 + 0 + 2 + 66 + 5 + 1 + 3 + 4 + 0 + 4 + 3 + 0 + 104 + 0 + 0 + 1 + 4 + 0 + 1 + 102 + 0 + 1 + 1 + 105 + 0 + 2 + 4 + 4 + 2 + 79 + 0 + 2 + 2 + 4 + 83 + 0 + 4 + 2 + 4 + 71 + 38 + 37 + 43 + 41 + 37 + 45 + 38 + 45 + 33 + 32 + 38 + 18 + 6 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +646 237 m 2,0,1 + 674 221 674 221 665 190 c 128,-1,2 + 656 159 656 159 625 159 c 1,3,-1 + 614 161 l 1,4,-1 + 396 223 l 1,5,-1 + 396 38 l 1,6,-1 + 464 -16 l 2,7,8 + 487 -36 487 -36 476.5 -63.5 c 128,-1,9 + 466 -91 466 -91 438 -91 c 0,10,11 + 430 -91 430 -91 422 -88 c 2,12,-1 + 333 -52 l 1,13,-1 + 245 -88 l 2,14,15 + 231 -94 231 -94 216 -89 c 128,-1,16 + 201 -84 201 -84 193 -70 c 0,17,18 + 185 -57 185 -57 188 -41.5 c 128,-1,19 + 191 -26 191 -26 203 -16 c 2,20,-1 + 271 38 l 1,21,-1 + 271 223 l 1,22,-1 + 53 161 l 2,23,24 + 38 157 38 157 23.5 164 c 128,-1,25 + 9 171 9 171 3 185 c 128,-1,26 + -3 199 -3 199 2 214 c 128,-1,27 + 7 229 7 229 21 237 c 2,28,-1 + 271 380 l 1,29,-1 + 271 628 l 2,30,31 + 271 654 271 654 289.5 672.5 c 128,-1,32 + 308 691 308 691 333 691 c 128,-1,33 + 358 691 358 691 377 672.5 c 128,-1,34 + 396 654 396 654 396 628 c 2,35,-1 + 396 380 l 1,36,-1 + 646 237 l 2,0,1 +333 618 m 0,37,38 + 342 618 342 618 348 624 c 128,-1,39 + 354 630 354 630 354 639 c 0,40,41 + 354 659 354 659 333 659 c 0,42,43 + 313 659 313 659 313 639 c 0,44,45 + 313 618 313 618 333 618 c 0,37,38 +EndSplineSet +EndChar + +StartChar: glyph205 +Encoding: 205 57549 206 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 121 + 19 + 4 + 2 + 13 + 15 + 16 + 7 + 2 + 10 + 12 + 2 + 66 + 5 + 1 + 3 + 18 + 9 + 17 + 3 + 7 + 0 + 3 + 7 + 89 + 8 + 6 + 4 + 2 + 16 + 5 + 0 + 0 + 14 + 15 + 0 + 14 + 89 + 0 + 15 + 0 + 13 + 12 + 15 + 13 + 89 + 0 + 12 + 0 + 10 + 11 + 12 + 10 + 89 + 19 + 1 + 11 + 1 + 1 + 11 + 77 + 19 + 1 + 11 + 11 + 1 + 83 + 0 + 1 + 11 + 1 + 71 + 52 + 52 + 48 + 48 + 44 + 44 + 1 + 0 + 68 + 67 + 64 + 63 + 60 + 59 + 57 + 56 + 52 + 55 + 52 + 55 + 54 + 53 + 48 + 51 + 48 + 51 + 50 + 49 + 44 + 47 + 44 + 47 + 46 + 45 + 40 + 37 + 34 + 33 + 30 + 27 + 24 + 22 + 13 + 10 + 0 + 43 + 1 + 43 + 20 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 550 m 2,0,1 + 561 550 561 550 572 538.5 c 128,-1,2 + 583 527 583 527 583 508 c 2,3,-1 + 583 333 l 1,4,5 + 574 255 574 255 530 193.5 c 128,-1,6 + 486 132 486 132 417 100 c 1,7,-1 + 417 -33 l 2,8,9 + 417 -68 417 -68 392.5 -92.5 c 128,-1,10 + 368 -117 368 -117 333 -117 c 2,11,-1 + 250 -117 l 2,12,13 + 216 -117 216 -117 191.5 -92.5 c 128,-1,14 + 167 -68 167 -68 167 -33 c 2,15,-1 + 167 100 l 1,16,17 + 97 132 97 132 51.5 194 c 128,-1,18 + 6 256 6 256 0 333 c 1,19,-1 + 0 508 l 2,20,21 + 0 527 0 527 11.5 538.5 c 128,-1,22 + 23 550 23 550 42 550 c 2,23,-1 + 83 550 l 1,24,-1 + 83 675 l 2,25,26 + 83 694 83 694 94.5 705.5 c 128,-1,27 + 106 717 106 717 125 717 c 2,28,-1 + 208 717 l 2,29,30 + 227 717 227 717 238.5 705.5 c 128,-1,31 + 250 694 250 694 250 675 c 2,32,-1 + 250 550 l 1,33,-1 + 333 550 l 1,34,-1 + 333 675 l 2,35,36 + 333 694 333 694 344.5 705.5 c 128,-1,37 + 356 717 356 717 375 717 c 2,38,-1 + 458 717 l 2,39,40 + 477 717 477 717 488.5 705.5 c 128,-1,41 + 500 694 500 694 500 675 c 2,42,-1 + 500 550 l 1,43,-1 + 542 550 l 2,0,1 +375 675 m 1,44,-1 + 375 550 l 1,45,-1 + 458 550 l 1,46,-1 + 458 675 l 1,47,-1 + 375 675 l 1,44,-1 +125 675 m 1,48,-1 + 125 550 l 1,49,-1 + 208 550 l 1,50,-1 + 208 675 l 1,51,-1 + 125 675 l 1,48,-1 +333 -33 m 1,52,-1 + 333 50 l 1,53,-1 + 250 50 l 1,54,-1 + 250 -33 l 1,55,-1 + 333 -33 l 1,52,-1 +292 154 m 128,-1,57 + 360 154 360 154 415 195 c 128,-1,58 + 470 236 470 236 492 300 c 1,59,-1 + 96 300 l 1,60,61 + 115 237 115 237 169.5 195.5 c 128,-1,56 + 224 154 224 154 292 154 c 128,-1,57 +500 362 m 2,62,-1 + 500 467 l 1,63,-1 + 83 467 l 1,64,-1 + 83 362 l 2,65,66 + 83 352 83 352 88 342 c 1,67,-1 + 496 342 l 1,68,69 + 500 350 500 350 500 362 c 2,62,-1 +EndSplineSet +EndChar + +StartChar: glyph206 +Encoding: 206 57550 207 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 0 + 3 + 0 + 9 + 2 + 3 + 9 + 91 + 4 + 1 + 2 + 10 + 1 + 8 + 7 + 2 + 8 + 91 + 12 + 11 + 2 + 7 + 5 + 1 + 1 + 6 + 7 + 1 + 91 + 0 + 6 + 0 + 0 + 6 + 79 + 0 + 6 + 6 + 0 + 83 + 0 + 0 + 6 + 0 + 71 + 28 + 28 + 28 + 55 + 28 + 54 + 51 + 49 + 46 + 45 + 35 + 35 + 22 + 35 + 35 + 19 + 35 + 35 + 16 + 13 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 -75 m 128,-1,1 + 323 -75 323 -75 286.5 -38.5 c 128,-1,2 + 250 -2 250 -2 250 50 c 2,3,-1 + 252 177 l 1,4,-1 + 126 175 l 2,5,6 + 74 175 74 175 37 211.5 c 128,-1,7 + 0 248 0 248 0 300 c 128,-1,8 + 0 352 0 352 36.5 388.5 c 128,-1,9 + 73 425 73 425 125 425 c 2,10,-1 + 252 427 l 1,11,-1 + 250 549 l 2,12,13 + 250 601 250 601 286.5 638 c 128,-1,14 + 323 675 323 675 375 675 c 128,-1,15 + 427 675 427 675 463.5 638.5 c 128,-1,16 + 500 602 500 602 500 550 c 2,17,-1 + 502 427 l 1,18,-1 + 626 425 l 2,19,20 + 677 425 677 425 713.5 388.5 c 128,-1,21 + 750 352 750 352 750 300 c 128,-1,22 + 750 248 750 248 713.5 211.5 c 128,-1,23 + 677 175 677 175 625 175 c 2,24,-1 + 502 177 l 1,25,-1 + 500 49 l 2,26,27 + 500 -2 500 -2 463.5 -38.5 c 128,-1,0 + 427 -75 427 -75 375 -75 c 128,-1,1 +333 258 m 1,28,-1 + 333 49 l 2,29,30 + 333 32 333 32 345.5 20 c 128,-1,31 + 358 8 358 8 375 8 c 128,-1,32 + 392 8 392 8 404.5 20.5 c 128,-1,33 + 417 33 417 33 417 50 c 2,34,-1 + 417 258 l 1,35,-1 + 626 258 l 2,36,37 + 643 258 643 258 655 270.5 c 128,-1,38 + 667 283 667 283 667 300 c 128,-1,39 + 667 317 667 317 654.5 329.5 c 128,-1,40 + 642 342 642 342 625 342 c 2,41,-1 + 417 342 l 1,42,-1 + 417 550 l 2,43,44 + 417 568 417 568 404.5 580 c 128,-1,45 + 392 592 392 592 375 592 c 128,-1,46 + 358 592 358 592 345.5 579.5 c 128,-1,47 + 333 567 333 567 333 550 c 2,48,-1 + 333 342 l 1,49,-1 + 125 342 l 2,50,51 + 107 342 107 342 95 329.5 c 128,-1,52 + 83 317 83 317 83 300 c 128,-1,53 + 83 283 83 283 95.5 270.5 c 128,-1,54 + 108 258 108 258 125 258 c 2,55,-1 + 333 258 l 1,28,-1 +EndSplineSet +EndChar + +StartChar: glyph207 +Encoding: 207 57551 208 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 45 + 0 + 5 + 0 + 2 + 5 + 79 + 4 + 6 + 2 + 0 + 3 + 1 + 1 + 2 + 0 + 1 + 91 + 0 + 5 + 5 + 2 + 83 + 0 + 2 + 5 + 2 + 71 + 1 + 0 + 24 + 23 + 20 + 18 + 15 + 13 + 10 + 9 + 6 + 4 + 0 + 27 + 1 + 27 + 7 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 383 m 2,0,1 + 618 383 618 383 642.5 358.5 c 128,-1,2 + 667 334 667 334 667 300 c 128,-1,3 + 667 266 667 266 642.5 241.5 c 128,-1,4 + 618 217 618 217 583 217 c 2,5,-1 + 417 220 l 1,6,-1 + 417 50 l 2,7,8 + 417 16 417 16 392.5 -8.5 c 128,-1,9 + 368 -33 368 -33 333 -33 c 128,-1,10 + 298 -33 298 -33 274 -8.5 c 128,-1,11 + 250 16 250 16 250 50 c 2,12,-1 + 253 220 l 1,13,-1 + 83 217 l 2,14,15 + 48 217 48 217 24 241.5 c 128,-1,16 + 0 266 0 266 0 300 c 128,-1,17 + 0 334 0 334 24 358.5 c 128,-1,18 + 48 383 48 383 83 383 c 2,19,-1 + 253 383 l 1,20,-1 + 250 550 l 2,21,22 + 250 584 250 584 274 608.5 c 128,-1,23 + 298 633 298 633 333 633 c 128,-1,24 + 368 633 368 633 392.5 608.5 c 128,-1,25 + 417 584 417 584 417 550 c 2,26,-1 + 417 383 l 1,27,-1 + 583 383 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph208 +Encoding: 208 57552 209 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 144 + 113 + 1 + 10 + 0 + 104 + 86 + 2 + 4 + 3 + 95 + 1 + 5 + 14 + 3 + 66 + 21 + 27 + 2 + 18 + 2 + 1 + 0 + 10 + 18 + 0 + 91 + 13 + 1 + 10 + 25 + 12 + 24 + 11 + 4 + 1 + 3 + 10 + 1 + 91 + 28 + 23 + 9 + 3 + 3 + 22 + 8 + 2 + 4 + 6 + 3 + 4 + 91 + 17 + 15 + 2 + 6 + 26 + 16 + 2 + 14 + 5 + 6 + 14 + 91 + 7 + 1 + 5 + 19 + 19 + 5 + 79 + 7 + 1 + 5 + 5 + 19 + 83 + 20 + 1 + 19 + 5 + 19 + 71 + 116 + 116 + 81 + 80 + 71 + 70 + 51 + 50 + 40 + 40 + 116 + 119 + 116 + 119 + 118 + 117 + 111 + 109 + 99 + 97 + 93 + 91 + 80 + 115 + 81 + 115 + 76 + 74 + 70 + 79 + 71 + 79 + 66 + 64 + 61 + 60 + 56 + 54 + 50 + 59 + 51 + 59 + 40 + 49 + 40 + 48 + 44 + 43 + 37 + 35 + 35 + 19 + 19 + 19 + 33 + 35 + 19 + 19 + 16 + 29 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +604 633 m 128,-1,1 + 544 633 544 633 501 590.5 c 128,-1,2 + 458 548 458 548 458 488 c 2,3,-1 + 458 425 l 1,4,-1 + 375 425 l 1,5,-1 + 375 488 l 2,6,7 + 375 548 375 548 332 590.5 c 128,-1,8 + 289 633 289 633 229 633 c 128,-1,9 + 169 633 169 633 126 590.5 c 128,-1,10 + 83 548 83 548 83 488 c 128,-1,11 + 83 428 83 428 126 385 c 128,-1,12 + 169 342 169 342 229 342 c 2,13,-1 + 292 342 l 1,14,-1 + 292 258 l 1,15,-1 + 229 258 l 2,16,17 + 169 258 169 258 126 215 c 128,-1,18 + 83 172 83 172 83 112 c 128,-1,19 + 83 52 83 52 126 9.5 c 128,-1,20 + 169 -33 169 -33 229 -33 c 128,-1,21 + 289 -33 289 -33 332 9.5 c 128,-1,22 + 375 52 375 52 375 112 c 2,23,-1 + 375 175 l 1,24,-1 + 458 175 l 1,25,-1 + 458 112 l 2,26,27 + 458 52 458 52 501 9.5 c 128,-1,28 + 544 -33 544 -33 604 -33 c 128,-1,29 + 664 -33 664 -33 707 9.5 c 128,-1,30 + 750 52 750 52 750 112 c 128,-1,31 + 750 172 750 172 707 215 c 128,-1,32 + 664 258 664 258 604 258 c 2,33,-1 + 542 258 l 1,34,-1 + 542 342 l 1,35,-1 + 604 342 l 2,36,37 + 664 342 664 342 707 385 c 128,-1,38 + 750 428 750 428 750 488 c 128,-1,39 + 750 548 750 548 707 590.5 c 128,-1,0 + 664 633 664 633 604 633 c 128,-1,1 +542 425 m 1,40,-1 + 542 488 l 2,41,42 + 542 514 542 514 560 532 c 128,-1,43 + 578 550 578 550 604 550 c 128,-1,44 + 630 550 630 550 648.5 531.5 c 128,-1,45 + 667 513 667 513 667 488 c 0,46,47 + 667 462 667 462 648.5 443.5 c 128,-1,48 + 630 425 630 425 604 425 c 2,49,-1 + 542 425 l 1,40,-1 +229 425 m 2,50,51 + 204 425 204 425 185.5 443.5 c 128,-1,52 + 167 462 167 462 167 488 c 128,-1,53 + 167 514 167 514 185.5 532 c 128,-1,54 + 204 550 204 550 229 550 c 0,55,56 + 255 550 255 550 273.5 531.5 c 128,-1,57 + 292 513 292 513 292 488 c 2,58,-1 + 292 425 l 1,59,-1 + 229 425 l 2,50,51 +604 50 m 128,-1,61 + 578 50 578 50 560 68 c 128,-1,62 + 542 86 542 86 542 112 c 2,63,-1 + 542 175 l 1,64,-1 + 604 175 l 2,65,66 + 630 175 630 175 648.5 156.5 c 128,-1,67 + 667 138 667 138 667 112 c 0,68,69 + 667 87 667 87 648.5 68.5 c 128,-1,60 + 630 50 630 50 604 50 c 128,-1,61 +229 50 m 0,70,71 + 204 50 204 50 185.5 68 c 128,-1,72 + 167 86 167 86 167 112 c 128,-1,73 + 167 138 167 138 185.5 156.5 c 128,-1,74 + 204 175 204 175 229 175 c 2,75,-1 + 292 175 l 1,76,-1 + 292 112 l 2,77,78 + 292 87 292 87 273.5 68.5 c 128,-1,79 + 255 50 255 50 229 50 c 0,70,71 +604 717 m 0,80,81 + 698 717 698 717 765.5 649.5 c 128,-1,82 + 833 582 833 582 833 488 c 0,83,84 + 833 431 833 431 807 381.5 c 128,-1,85 + 781 332 781 332 736 300 c 1,86,87 + 781 268 781 268 807 218.5 c 128,-1,88 + 833 169 833 169 833 112 c 0,89,90 + 833 18 833 18 765.5 -49.5 c 128,-1,91 + 698 -117 698 -117 604 -117 c 0,92,93 + 547 -117 547 -117 498 -90.5 c 128,-1,94 + 449 -64 449 -64 417 -19 c 1,95,96 + 385 -64 385 -64 335.5 -90.5 c 128,-1,97 + 286 -117 286 -117 229 -117 c 0,98,99 + 134 -117 134 -117 67 -49.5 c 128,-1,100 + 0 18 0 18 0 112 c 0,101,102 + 0 169 0 169 26.5 218.5 c 128,-1,103 + 53 268 53 268 98 300 c 1,104,105 + 53 332 53 332 26.5 381.5 c 128,-1,106 + 0 431 0 431 0 488 c 0,107,108 + 0 582 0 582 67 649.5 c 128,-1,109 + 134 717 134 717 229 717 c 0,110,111 + 286 717 286 717 335.5 690.5 c 128,-1,112 + 385 664 385 664 417 619 c 1,113,114 + 449 664 449 664 498 690.5 c 128,-1,115 + 547 717 547 717 604 717 c 0,80,81 +458 342 m 1,116,-1 + 458 258 l 1,117,-1 + 375 258 l 1,118,-1 + 375 342 l 1,119,-1 + 458 342 l 1,116,-1 +EndSplineSet +EndChar + +StartChar: glyph209 +Encoding: 209 57553 210 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 115 + 9 + 1 + 7 + 14 + 1 + 11 + 8 + 7 + 11 + 91 + 21 + 15 + 10 + 3 + 8 + 16 + 6 + 20 + 3 + 0 + 1 + 8 + 0 + 91 + 22 + 17 + 5 + 3 + 1 + 23 + 18 + 12 + 3 + 3 + 13 + 1 + 3 + 91 + 19 + 1 + 13 + 2 + 2 + 13 + 79 + 19 + 1 + 13 + 13 + 2 + 83 + 4 + 1 + 2 + 13 + 2 + 71 + 75 + 74 + 70 + 70 + 60 + 60 + 1 + 0 + 80 + 78 + 74 + 83 + 75 + 83 + 70 + 73 + 70 + 73 + 72 + 71 + 60 + 69 + 60 + 68 + 64 + 63 + 58 + 57 + 53 + 51 + 48 + 46 + 43 + 41 + 36 + 35 + 32 + 31 + 28 + 27 + 24 + 22 + 21 + 19 + 16 + 15 + 12 + 11 + 8 + 7 + 4 + 2 + 0 + 39 + 1 + 39 + 24 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +521 342 m 2,0,-1 + 458 342 l 1,1,-1 + 458 258 l 1,2,-1 + 521 258 l 2,3,4 + 581 258 581 258 624 215 c 128,-1,5 + 667 172 667 172 667 112 c 128,-1,6 + 667 52 667 52 624 9.5 c 128,-1,7 + 581 -33 581 -33 521 -33 c 128,-1,8 + 461 -33 461 -33 418 9.5 c 128,-1,9 + 375 52 375 52 375 112 c 2,10,-1 + 375 175 l 1,11,-1 + 292 175 l 1,12,-1 + 292 112 l 2,13,14 + 292 52 292 52 249 9.5 c 128,-1,15 + 206 -33 206 -33 146 -33 c 128,-1,16 + 86 -33 86 -33 43 9.5 c 128,-1,17 + 0 52 0 52 0 112 c 128,-1,18 + 0 172 0 172 43 215 c 128,-1,19 + 86 258 86 258 146 258 c 2,20,-1 + 208 258 l 1,21,-1 + 208 342 l 1,22,-1 + 146 342 l 2,23,24 + 86 342 86 342 43 385 c 128,-1,25 + 0 428 0 428 0 488 c 128,-1,26 + 0 548 0 548 43 590.5 c 128,-1,27 + 86 633 86 633 146 633 c 128,-1,28 + 206 633 206 633 249 590.5 c 128,-1,29 + 292 548 292 548 292 488 c 2,30,-1 + 292 425 l 1,31,-1 + 375 425 l 1,32,-1 + 375 488 l 2,33,34 + 375 548 375 548 418 590.5 c 128,-1,35 + 461 633 461 633 521 633 c 128,-1,36 + 581 633 581 633 624 590.5 c 128,-1,37 + 667 548 667 548 667 488 c 128,-1,38 + 667 428 667 428 624 385 c 128,-1,39 + 581 342 581 342 521 342 c 2,0,-1 +458 488 m 2,40,-1 + 458 425 l 1,41,-1 + 521 425 l 2,42,43 + 546 425 546 425 564.5 443.5 c 128,-1,44 + 583 462 583 462 583 488 c 128,-1,45 + 583 514 583 514 564.5 532 c 128,-1,46 + 546 550 546 550 521 550 c 0,47,48 + 495 550 495 550 476.5 531.5 c 128,-1,49 + 458 513 458 513 458 488 c 2,40,-1 +208 112 m 2,50,-1 + 208 175 l 1,51,-1 + 146 175 l 2,52,53 + 120 175 120 175 101.5 156.5 c 128,-1,54 + 83 138 83 138 83 112 c 0,55,56 + 83 87 83 87 101.5 68.5 c 128,-1,57 + 120 50 120 50 146 50 c 128,-1,58 + 172 50 172 50 190 68 c 128,-1,59 + 208 86 208 86 208 112 c 2,50,-1 +208 425 m 1,60,-1 + 208 488 l 2,61,62 + 208 514 208 514 190 532 c 128,-1,63 + 172 550 172 550 146 550 c 128,-1,64 + 120 550 120 550 101.5 531.5 c 128,-1,65 + 83 513 83 513 83 488 c 0,66,67 + 83 462 83 462 101.5 443.5 c 128,-1,68 + 120 425 120 425 146 425 c 2,69,-1 + 208 425 l 1,60,-1 +375 258 m 1,70,-1 + 375 342 l 1,71,-1 + 292 342 l 1,72,-1 + 292 258 l 1,73,-1 + 375 258 l 1,70,-1 +521 175 m 2,74,-1 + 458 175 l 1,75,-1 + 458 112 l 2,76,77 + 458 87 458 87 476.5 68.5 c 128,-1,78 + 495 50 495 50 521 50 c 0,79,80 + 546 50 546 50 564.5 68 c 128,-1,81 + 583 86 583 86 583 112 c 128,-1,82 + 583 138 583 138 564.5 156.5 c 128,-1,83 + 546 175 546 175 521 175 c 2,74,-1 +EndSplineSet +EndChar + +StartChar: glyph210 +Encoding: 210 57554 211 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 74 + 20 + 13 + 2 + 7 + 3 + 48 + 35 + 2 + 2 + 7 + 2 + 66 + 9 + 1 + 7 + 3 + 2 + 3 + 7 + 2 + 104 + 0 + 1 + 0 + 3 + 7 + 1 + 3 + 91 + 0 + 2 + 0 + 5 + 4 + 2 + 5 + 91 + 0 + 4 + 0 + 6 + 8 + 4 + 6 + 91 + 0 + 8 + 0 + 0 + 8 + 79 + 0 + 8 + 8 + 0 + 83 + 0 + 0 + 8 + 0 + 71 + 79 + 78 + 38 + 23 + 19 + 41 + 24 + 21 + 25 + 26 + 36 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +605 547 m 0,0,1 + 708 444 708 444 708 297 c 0,2,3 + 708 149 708 149 605 46 c 128,-1,4 + 502 -57 502 -57 354 -57 c 0,5,6 + 207 -57 207 -57 104 46 c 0,7,8 + 0 150 0 150 0 297 c 0,9,10 + 0 443 0 443 104 547 c 0,11,12 + 157 600 157 600 229 578 c 1,13,-1 + 229 592 l 2,14,15 + 229 644 229 644 265.5 680.5 c 128,-1,16 + 302 717 302 717 354 717 c 128,-1,17 + 406 717 406 717 442.5 680.5 c 128,-1,18 + 479 644 479 644 479 592 c 2,19,-1 + 479 578 l 1,20,21 + 511 588 511 588 545.5 580 c 128,-1,22 + 580 572 580 572 605 547 c 0,0,1 +312 592 m 2,23,-1 + 312 383 l 2,24,25 + 312 366 312 366 324.5 354 c 128,-1,26 + 337 342 337 342 354 342 c 128,-1,27 + 371 342 371 342 383.5 354 c 128,-1,28 + 396 366 396 366 396 383 c 2,29,-1 + 396 592 l 2,30,31 + 396 609 396 609 383.5 621 c 128,-1,32 + 371 633 371 633 354 633 c 128,-1,33 + 337 633 337 633 324.5 621 c 128,-1,34 + 312 609 312 609 312 592 c 2,23,-1 +271 433 m 1,35,36 + 264 414 264 414 251 400 c 0,37,38 + 208 357 208 357 208 297 c 128,-1,39 + 208 237 208 237 251 194 c 0,40,41 + 292 153 292 153 354 153 c 128,-1,42 + 416 153 416 153 457 194 c 0,43,44 + 500 237 500 237 500 297 c 128,-1,45 + 500 357 500 357 457 400 c 0,46,47 + 445 412 445 412 438 433 c 1,48,-1 + 438 383 l 2,49,50 + 438 349 438 349 413.5 324.5 c 128,-1,51 + 389 300 389 300 354 300 c 0,52,53 + 320 300 320 300 295.5 324 c 128,-1,54 + 271 348 271 348 271 383 c 2,55,-1 + 271 433 l 1,35,36 +354 109 m 128,-1,57 + 278 109 278 109 222.5 164.5 c 128,-1,58 + 167 220 167 220 167 297 c 0,59,60 + 167 375 167 375 222 430 c 0,61,62 + 234 442 234 442 234 459 c 128,-1,63 + 234 476 234 476 222 488 c 128,-1,64 + 210 500 210 500 192.5 500 c 128,-1,65 + 175 500 175 500 163 488 c 0,66,67 + 83 408 83 408 83 297 c 0,68,69 + 83 185 83 185 163 105 c 0,70,71 + 242 26 242 26 354 26 c 0,72,73 + 467 26 467 26 546 105 c 128,-1,74 + 625 184 625 184 625 297 c 0,75,76 + 625 409 625 409 546 488 c 0,77,78 + 534 500 534 500 516.5 500 c 128,-1,79 + 499 500 499 500 487 488 c 128,-1,80 + 475 476 475 476 475 459 c 128,-1,81 + 475 442 475 442 487 430 c 0,82,83 + 542 375 542 375 542 297 c 0,84,85 + 542 220 542 220 486 164.5 c 128,-1,56 + 430 109 430 109 354 109 c 128,-1,57 +EndSplineSet +EndChar + +StartChar: glyph211 +Encoding: 211 57555 212 +Width: 542 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 53 + 3 + 1 + 1 + 5 + 4 + 5 + 1 + 4 + 104 + 0 + 5 + 0 + 4 + 0 + 5 + 4 + 91 + 6 + 1 + 0 + 2 + 2 + 0 + 79 + 6 + 1 + 0 + 0 + 2 + 83 + 0 + 2 + 0 + 2 + 71 + 1 + 0 + 38 + 37 + 32 + 31 + 23 + 22 + 17 + 15 + 9 + 8 + 0 + 30 + 1 + 30 + 7 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +271 109 m 0,0,1 + 347 109 347 109 402.5 164.5 c 128,-1,2 + 458 220 458 220 458 297 c 0,3,4 + 458 375 458 375 403 430 c 0,5,6 + 391 442 391 442 391 459 c 128,-1,7 + 391 476 391 476 403 488 c 128,-1,8 + 415 500 415 500 432.5 500 c 128,-1,9 + 450 500 450 500 462 488 c 0,10,11 + 542 408 542 408 542 297 c 0,12,13 + 542 185 542 185 462 105 c 0,14,15 + 383 26 383 26 271 26 c 0,16,17 + 158 26 158 26 79 105 c 128,-1,18 + 0 184 0 184 0 297 c 0,19,20 + 0 409 0 409 79 488 c 0,21,22 + 91 500 91 500 108.5 500 c 128,-1,23 + 126 500 126 500 138 488 c 128,-1,24 + 150 476 150 476 150 459 c 128,-1,25 + 150 442 150 442 138 430 c 0,26,27 + 83 375 83 375 83 297 c 0,28,29 + 83 220 83 220 138.5 164.5 c 128,-1,30 + 194 109 194 109 271 109 c 0,0,1 +271 342 m 128,-1,32 + 254 342 254 342 241.5 354 c 128,-1,33 + 229 366 229 366 229 383 c 2,34,-1 + 229 592 l 2,35,36 + 229 609 229 609 241.5 621 c 128,-1,37 + 254 633 254 633 271 633 c 128,-1,38 + 288 633 288 633 300 621 c 128,-1,39 + 312 609 312 609 312 592 c 2,40,-1 + 312 383 l 2,41,42 + 312 366 312 366 300 354 c 128,-1,31 + 288 342 288 342 271 342 c 128,-1,32 +EndSplineSet +EndChar + +StartChar: glyph212 +Encoding: 212 57556 213 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 139 + 61 + 56 + 2 + 11 + 7 + 1 + 66 + 0 + 3 + 18 + 1 + 5 + 0 + 3 + 5 + 89 + 0 + 17 + 6 + 0 + 17 + 79 + 22 + 16 + 2 + 3 + 0 + 8 + 1 + 6 + 12 + 0 + 6 + 91 + 20 + 1 + 12 + 0 + 13 + 4 + 12 + 13 + 91 + 0 + 4 + 0 + 9 + 7 + 4 + 9 + 91 + 0 + 7 + 0 + 11 + 14 + 7 + 11 + 91 + 21 + 1 + 14 + 0 + 15 + 10 + 14 + 15 + 91 + 19 + 1 + 10 + 1 + 1 + 10 + 79 + 19 + 1 + 10 + 10 + 1 + 83 + 0 + 1 + 10 + 1 + 71 + 89 + 88 + 78 + 77 + 67 + 66 + 53 + 52 + 24 + 24 + 93 + 90 + 88 + 97 + 89 + 96 + 84 + 81 + 77 + 87 + 78 + 86 + 72 + 69 + 66 + 76 + 67 + 75 + 60 + 57 + 52 + 65 + 53 + 64 + 49 + 46 + 43 + 42 + 37 + 34 + 29 + 28 + 24 + 27 + 24 + 27 + 20 + 51 + 21 + 53 + 16 + 23 + 20 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 592 m 1,0,1 + 635 592 635 592 671.5 555.5 c 128,-1,2 + 708 519 708 519 708 467 c 2,3,-1 + 708 50 l 2,4,5 + 708 -2 708 -2 671.5 -38.5 c 128,-1,6 + 635 -75 635 -75 583 -75 c 2,7,-1 + 125 -75 l 2,8,9 + 73 -75 73 -75 36.5 -38.5 c 128,-1,10 + 0 -2 0 -2 0 50 c 2,11,-1 + 0 467 l 2,12,13 + 0 519 0 519 36.5 555.5 c 128,-1,14 + 73 592 73 592 125 592 c 1,15,-1 + 125 675 l 2,16,17 + 125 692 125 692 137.5 704.5 c 128,-1,18 + 150 717 150 717 167 717 c 2,19,-1 + 542 717 l 2,20,21 + 559 717 559 717 571 704.5 c 128,-1,22 + 583 692 583 692 583 675 c 2,23,-1 + 583 592 l 1,0,1 +208 633 m 1,24,-1 + 208 425 l 1,25,-1 + 500 425 l 1,26,-1 + 500 633 l 1,27,-1 + 208 633 l 1,24,-1 +125 508 m 1,28,29 + 108 508 108 508 95.5 496 c 128,-1,30 + 83 484 83 484 83 467 c 2,31,-1 + 83 362 l 2,32,33 + 83 337 83 337 101.5 318.5 c 128,-1,34 + 120 300 120 300 146 300 c 2,35,-1 + 562 300 l 2,36,37 + 588 300 588 300 606.5 318.5 c 128,-1,38 + 625 337 625 337 625 362 c 2,39,-1 + 625 467 l 2,40,41 + 625 484 625 484 612.5 496 c 128,-1,42 + 600 508 600 508 583 508 c 1,43,-1 + 583 383 l 2,44,45 + 583 366 583 366 571 354 c 128,-1,46 + 559 342 559 342 542 342 c 2,47,-1 + 167 342 l 2,48,49 + 150 342 150 342 137.5 354 c 128,-1,50 + 125 366 125 366 125 383 c 2,51,-1 + 125 508 l 1,28,29 +583 8 m 2,52,53 + 600 8 600 8 612.5 20.5 c 128,-1,54 + 625 33 625 33 625 50 c 2,55,-1 + 625 280 l 1,56,57 + 596 258 596 258 562 258 c 2,58,-1 + 146 258 l 2,59,60 + 112 258 112 258 83 280 c 1,61,-1 + 83 50 l 2,62,63 + 83 33 83 33 95.5 20.5 c 128,-1,64 + 108 8 108 8 125 8 c 2,65,-1 + 583 8 l 2,52,53 +438 508 m 2,66,67 + 458 508 458 508 458 488 c 0,68,69 + 458 467 458 467 438 467 c 2,70,-1 + 271 467 l 2,71,72 + 262 467 262 467 256 473 c 128,-1,73 + 250 479 250 479 250 488 c 0,74,75 + 250 508 250 508 271 508 c 2,76,-1 + 438 508 l 2,66,67 +500 133 m 2,77,78 + 509 133 509 133 515 127 c 128,-1,79 + 521 121 521 121 521 112 c 0,80,81 + 521 92 521 92 500 92 c 2,82,-1 + 208 92 l 2,83,84 + 188 92 188 92 188 112 c 0,85,86 + 188 133 188 133 208 133 c 2,87,-1 + 500 133 l 2,77,78 +438 592 m 2,88,89 + 458 592 458 592 458 571 c 128,-1,90 + 458 550 458 550 438 550 c 2,91,-1 + 271 550 l 2,92,93 + 262 550 262 550 256 556 c 128,-1,94 + 250 562 250 562 250 571 c 128,-1,95 + 250 580 250 580 256 586 c 128,-1,96 + 262 592 262 592 271 592 c 2,97,-1 + 438 592 l 2,88,89 +EndSplineSet +EndChar + +StartChar: glyph213 +Encoding: 213 57557 214 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 164 + 141 + 120 + 2 + 22 + 21 + 21 + 2 + 2 + 19 + 22 + 140 + 121 + 2 + 20 + 19 + 30 + 1 + 3 + 16 + 4 + 66 + 0 + 1 + 0 + 10 + 0 + 1 + 10 + 91 + 2 + 1 + 0 + 11 + 1 + 9 + 7 + 0 + 9 + 91 + 13 + 1 + 7 + 25 + 1 + 21 + 22 + 7 + 21 + 91 + 12 + 1 + 8 + 24 + 1 + 22 + 19 + 8 + 22 + 91 + 29 + 23 + 2 + 19 + 15 + 1 + 5 + 6 + 19 + 5 + 91 + 26 + 1 + 20 + 14 + 1 + 6 + 17 + 20 + 6 + 91 + 0 + 17 + 0 + 28 + 16 + 17 + 28 + 91 + 27 + 18 + 2 + 16 + 3 + 3 + 16 + 79 + 27 + 18 + 2 + 16 + 16 + 3 + 83 + 4 + 1 + 3 + 16 + 3 + 71 + 139 + 138 + 164 + 163 + 157 + 156 + 153 + 151 + 148 + 146 + 144 + 142 + 138 + 155 + 139 + 155 + 137 + 135 + 133 + 131 + 128 + 126 + 124 + 122 + 118 + 115 + 109 + 108 + 102 + 99 + 95 + 93 + 91 + 89 + 86 + 84 + 82 + 80 + 76 + 73 + 67 + 66 + 60 + 57 + 34 + 35 + 33 + 37 + 50 + 58 + 34 + 18 + 39 + 30 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +0 144 m 2,0,1 + 0 209 0 209 54 238 c 1,2,3 + 0 266 0 266 0 331 c 2,4,-1 + 0 404 l 2,5,6 + 0 464 0 464 43 507 c 128,-1,7 + 86 550 86 550 146 550 c 2,8,-1 + 177 550 l 1,9,10 + 182 612 182 612 232.5 654 c 128,-1,11 + 283 696 283 696 354 696 c 128,-1,12 + 425 696 425 696 475.5 654 c 128,-1,13 + 526 612 526 612 531 550 c 1,14,-1 + 562 550 l 2,15,16 + 622 550 622 550 665 507 c 128,-1,17 + 708 464 708 464 708 404 c 2,18,-1 + 708 331 l 2,19,20 + 708 266 708 266 654 237 c 1,21,22 + 708 209 708 209 708 144 c 2,23,-1 + 708 29 l 2,24,25 + 708 -31 708 -31 665 -74 c 128,-1,26 + 622 -117 622 -117 562 -117 c 2,27,-1 + 448 -117 l 2,28,29 + 383 -117 383 -117 354 -63 c 1,30,31 + 326 -117 326 -117 260 -117 c 2,32,-1 + 146 -117 l 2,33,34 + 86 -117 86 -117 43 -74 c 128,-1,35 + 0 -31 0 -31 0 29 c 2,36,-1 + 0 144 l 2,0,1 +625 29 m 2,37,-1 + 625 144 l 2,38,39 + 625 164 625 164 610 164 c 0,40,41 + 600 164 600 164 586 154 c 128,-1,42 + 572 144 572 144 552 144 c 0,43,44 + 522 144 522 144 500.5 171.5 c 128,-1,45 + 479 199 479 199 479 238 c 128,-1,46 + 479 277 479 277 500.5 304 c 128,-1,47 + 522 331 522 331 552 331 c 0,48,49 + 574 331 574 331 593 315 c 0,50,51 + 600 310 600 310 609 310 c 0,52,53 + 625 310 625 310 625 331 c 2,54,-1 + 625 404 l 2,55,56 + 625 430 625 430 606.5 448.5 c 128,-1,57 + 588 467 588 467 562 467 c 2,58,-1 + 448 467 l 2,59,60 + 435 467 435 467 429.5 474.5 c 128,-1,61 + 424 482 424 482 432 499 c 1,62,63 + 448 518 448 518 448 540 c 0,64,65 + 448 570 448 570 420.5 591 c 128,-1,66 + 393 612 393 612 354 612 c 128,-1,67 + 315 612 315 612 287.5 591 c 128,-1,68 + 260 570 260 570 260 540 c 0,69,70 + 260 523 260 523 271 505 c 0,71,72 + 285 484 285 484 280 475.5 c 128,-1,73 + 275 467 275 467 260 467 c 2,74,-1 + 146 467 l 2,75,76 + 120 467 120 467 101.5 448.5 c 128,-1,77 + 83 430 83 430 83 404 c 2,78,-1 + 83 331 l 2,79,80 + 83 310 83 310 99 310 c 0,81,82 + 106 310 106 310 122 321 c 0,83,84 + 136 331 136 331 156 331 c 0,85,86 + 186 331 186 331 207.5 304 c 128,-1,87 + 229 277 229 277 229 238 c 128,-1,88 + 229 199 229 199 207.5 171.5 c 128,-1,89 + 186 144 186 144 156 144 c 0,90,91 + 134 144 134 144 115 160 c 0,92,93 + 107 165 107 165 99 165 c 0,94,95 + 83 165 83 165 83 144 c 2,96,-1 + 83 29 l 2,97,98 + 83 4 83 4 101.5 -14.5 c 128,-1,99 + 120 -33 120 -33 146 -33 c 2,100,-1 + 260 -33 l 2,101,102 + 275 -33 275 -33 279.5 -24.5 c 128,-1,103 + 284 -16 284 -16 271 5 c 0,104,105 + 260 21 260 21 260 40 c 0,106,107 + 260 70 260 70 287.5 91 c 128,-1,108 + 315 112 315 112 354 112 c 128,-1,109 + 393 112 393 112 420.5 91 c 128,-1,110 + 448 70 448 70 448 40 c 0,111,112 + 448 18 448 18 432 -1 c 1,113,114 + 424 -18 424 -18 429.5 -25.5 c 128,-1,115 + 435 -33 435 -33 448 -33 c 2,116,-1 + 562 -33 l 2,117,118 + 588 -33 588 -33 606.5 -14.5 c 128,-1,119 + 625 4 625 4 625 29 c 2,37,-1 +83 271 m 1,120,-1 + 83 205 l 1,121,122 + 88 207 88 207 99 207 c 0,123,124 + 122 207 122 207 143 191 c 0,125,126 + 149 185 149 185 156 185 c 0,127,128 + 168 185 168 185 177.5 200.5 c 128,-1,129 + 187 216 187 216 187 238 c 128,-1,130 + 187 260 187 260 177.5 275 c 128,-1,131 + 168 290 168 290 156 290 c 0,132,133 + 150 290 150 290 142 284 c 0,134,135 + 119 269 119 269 98 269 c 0,136,137 + 93 269 93 269 83 271 c 1,120,-1 +610 206 m 0,138,139 + 615 206 615 206 625 204 c 1,140,-1 + 625 270 l 1,141,142 + 620 268 620 268 609 268 c 0,143,144 + 587 268 587 268 566 284 c 0,145,146 + 560 290 560 290 552 290 c 0,147,148 + 540 290 540 290 530.5 275 c 128,-1,149 + 521 260 521 260 521 238 c 128,-1,150 + 521 216 521 216 530.5 200.5 c 128,-1,151 + 540 185 540 185 552 185 c 0,152,153 + 558 185 558 185 566 191 c 0,154,155 + 588 206 588 206 610 206 c 0,138,139 +320 -33 m 1,156,-1 + 387 -33 l 1,157,158 + 379 -2 379 -2 400 26 c 0,159,160 + 406 32 406 32 406 40 c 0,161,162 + 406 52 406 52 391 61.5 c 128,-1,163 + 376 71 376 71 354 71 c 128,-1,164 + 332 71 332 71 317 61.5 c 128,-1,165 + 302 52 302 52 302 40 c 0,166,167 + 302 33 302 33 308 25 c 0,168,169 + 328 -4 328 -4 320 -33 c 1,156,-1 +EndSplineSet +EndChar + +StartChar: glyph214 +Encoding: 214 57558 215 +Width: 542 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 64 + 9 + 1 + 7 + 6 + 10 + 2 + 0 + 1 + 7 + 0 + 91 + 5 + 1 + 1 + 3 + 2 + 1 + 79 + 0 + 8 + 0 + 3 + 2 + 8 + 3 + 91 + 5 + 1 + 1 + 1 + 2 + 83 + 4 + 1 + 2 + 1 + 2 + 71 + 1 + 0 + 72 + 69 + 63 + 62 + 56 + 53 + 46 + 44 + 41 + 39 + 32 + 29 + 23 + 22 + 16 + 13 + 6 + 4 + 0 + 79 + 1 + 79 + 11 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +469 331 m 0,0,1 + 439 331 439 331 417.5 304 c 128,-1,2 + 396 277 396 277 396 238 c 128,-1,3 + 396 199 396 199 417.5 171.5 c 128,-1,4 + 439 144 439 144 469 144 c 0,5,6 + 486 144 486 144 503 154 c 0,7,8 + 524 168 524 168 533 163.5 c 128,-1,9 + 542 159 542 159 542 144 c 2,10,-1 + 542 29 l 2,11,12 + 542 4 542 4 523.5 -14.5 c 128,-1,13 + 505 -33 505 -33 479 -33 c 2,14,-1 + 365 -33 l 2,15,16 + 352 -33 352 -33 346 -25.5 c 128,-1,17 + 340 -18 340 -18 348 -1 c 1,18,19 + 365 19 365 19 365 40 c 0,20,21 + 365 70 365 70 337.5 91 c 128,-1,22 + 310 112 310 112 271 112 c 128,-1,23 + 232 112 232 112 204.5 91 c 128,-1,24 + 177 70 177 70 177 40 c 0,25,26 + 177 22 177 22 187 5 c 0,27,28 + 201 -16 201 -16 196.5 -24.5 c 128,-1,29 + 192 -33 192 -33 177 -33 c 2,30,-1 + 62 -33 l 2,31,32 + 36 -33 36 -33 18 -14.5 c 128,-1,33 + 0 4 0 4 0 29 c 2,34,-1 + 0 144 l 2,35,36 + 0 157 0 157 7.5 162.5 c 128,-1,37 + 15 168 15 168 32 160 c 1,38,39 + 51 144 51 144 73 144 c 0,40,41 + 103 144 103 144 124.5 171.5 c 128,-1,42 + 146 199 146 199 146 238 c 128,-1,43 + 146 277 146 277 124.5 304 c 128,-1,44 + 103 331 103 331 73 331 c 0,45,46 + 56 331 56 331 39 321 c 0,47,48 + 18 307 18 307 9 311.5 c 128,-1,49 + 0 316 0 316 0 331 c 2,50,-1 + 0 404 l 2,51,52 + 0 430 0 430 18.5 448.5 c 128,-1,53 + 37 467 37 467 62 467 c 2,54,-1 + 177 467 l 2,55,56 + 192 467 192 467 196.5 475.5 c 128,-1,57 + 201 484 201 484 188 505 c 0,58,59 + 177 521 177 521 177 540 c 0,60,61 + 177 570 177 570 204.5 591 c 128,-1,62 + 232 612 232 612 271 612 c 128,-1,63 + 310 612 310 612 337.5 591 c 128,-1,64 + 365 570 365 570 365 540 c 0,65,66 + 365 519 365 519 348 499 c 1,67,68 + 340 482 340 482 346 474.5 c 128,-1,69 + 352 467 352 467 365 467 c 2,70,-1 + 479 467 l 2,71,72 + 504 467 504 467 523 448.5 c 128,-1,73 + 542 430 542 430 542 404 c 2,74,-1 + 542 331 l 2,75,76 + 542 318 542 318 534.5 312.5 c 128,-1,77 + 527 307 527 307 510 315 c 1,78,79 + 491 331 491 331 469 331 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph215 +Encoding: 215 57559 216 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 108 + 64 + 59 + 48 + 42 + 41 + 5 + 8 + 3 + 66 + 57 + 2 + 10 + 8 + 71 + 52 + 2 + 5 + 11 + 78 + 73 + 29 + 28 + 25 + 24 + 6 + 2 + 5 + 4 + 66 + 12 + 9 + 2 + 7 + 10 + 4 + 10 + 7 + 4 + 104 + 6 + 1 + 4 + 11 + 10 + 4 + 11 + 102 + 0 + 0 + 0 + 3 + 8 + 0 + 3 + 91 + 0 + 8 + 0 + 10 + 7 + 8 + 10 + 91 + 0 + 11 + 0 + 5 + 2 + 11 + 5 + 91 + 0 + 2 + 1 + 1 + 2 + 79 + 0 + 2 + 2 + 1 + 83 + 0 + 1 + 2 + 1 + 71 + 16 + 16 + 76 + 75 + 62 + 61 + 16 + 51 + 16 + 51 + 37 + 20 + 21 + 21 + 23 + 19 + 19 + 19 + 16 + 13 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +354 612 m 128,-1,1 + 500 612 500 612 604 508 c 128,-1,2 + 708 404 708 404 708 258 c 128,-1,3 + 708 112 708 112 604 8 c 128,-1,4 + 500 -96 500 -96 354 -96 c 128,-1,5 + 208 -96 208 -96 104 8 c 128,-1,6 + 0 112 0 112 0 258 c 128,-1,7 + 0 404 0 404 104 508 c 128,-1,0 + 208 612 208 612 354 612 c 128,-1,1 +354 -12 m 128,-1,9 + 466 -12 466 -12 545.5 67 c 128,-1,10 + 625 146 625 146 625 258 c 128,-1,11 + 625 370 625 370 545.5 449.5 c 128,-1,12 + 466 529 466 529 354 529 c 128,-1,13 + 242 529 242 529 162.5 449.5 c 128,-1,14 + 83 370 83 370 83 258 c 128,-1,15 + 83 146 83 146 162.5 67 c 128,-1,8 + 242 -12 242 -12 354 -12 c 128,-1,9 +500 300 m 1,16,17 + 458 291 458 291 458 258 c 0,18,19 + 458 226 458 226 500 217 c 1,20,-1 + 537 217 l 1,21,22 + 525 164 525 164 486.5 126 c 128,-1,23 + 448 88 448 88 396 76 c 1,24,-1 + 396 112 l 1,25,26 + 387 154 387 154 354 154 c 128,-1,27 + 321 154 321 154 312 112 c 1,28,-1 + 312 76 l 1,29,30 + 260 88 260 88 222 126 c 128,-1,31 + 184 164 184 164 172 217 c 1,32,-1 + 208 217 l 1,33,34 + 250 226 250 226 250 258 c 0,35,36 + 250 291 250 291 208 300 c 1,37,-1 + 172 300 l 1,38,39 + 184 353 184 353 222 391 c 128,-1,40 + 260 429 260 429 312 441 c 1,41,-1 + 312 404 l 1,42,43 + 321 362 321 362 354 362 c 0,44,45 + 371 362 371 362 383.5 374.5 c 128,-1,46 + 396 387 396 387 396 404 c 2,47,-1 + 396 441 l 1,48,49 + 448 429 448 429 486.5 390.5 c 128,-1,50 + 525 352 525 352 537 300 c 1,51,-1 + 500 300 l 1,16,17 +475 179 m 1,52,53 + 449 187 449 187 433 209 c 128,-1,54 + 417 231 417 231 417 258 c 128,-1,55 + 417 285 417 285 433 307 c 128,-1,56 + 449 329 449 329 475 337 c 1,57,58 + 458 362 458 362 433 379 c 1,59,60 + 425 353 425 353 403 337 c 128,-1,61 + 381 321 381 321 354 321 c 128,-1,62 + 327 321 327 321 305 337 c 128,-1,63 + 283 353 283 353 275 379 c 1,64,65 + 250 362 250 362 233 337 c 1,66,67 + 259 329 259 329 275.5 307 c 128,-1,68 + 292 285 292 285 292 258 c 128,-1,69 + 292 231 292 231 275.5 209 c 128,-1,70 + 259 187 259 187 233 179 c 1,71,72 + 248 155 248 155 275 138 c 1,73,74 + 283 164 283 164 305 180 c 128,-1,75 + 327 196 327 196 354 196 c 128,-1,76 + 381 196 381 196 403 180 c 128,-1,77 + 425 164 425 164 433 138 c 1,78,79 + 460 155 460 155 475 179 c 1,52,53 +EndSplineSet +EndChar + +StartChar: glyph216 +Encoding: 216 57560 217 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 56 + 41 + 8 + 2 + 7 + 1 + 28 + 21 + 2 + 0 + 4 + 2 + 66 + 0 + 1 + 0 + 7 + 2 + 1 + 7 + 91 + 6 + 1 + 2 + 5 + 1 + 3 + 4 + 2 + 3 + 91 + 0 + 4 + 0 + 0 + 4 + 79 + 0 + 4 + 4 + 0 + 83 + 0 + 0 + 4 + 0 + 71 + 22 + 35 + 38 + 22 + 35 + 38 + 19 + 16 + 8 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 -33 m 128,-1,1 + 171 -33 171 -33 85.5 52 c 128,-1,2 + 0 137 0 137 0 258 c 128,-1,3 + 0 379 0 379 85.5 464.5 c 128,-1,4 + 171 550 171 550 292 550 c 128,-1,5 + 413 550 413 550 498 464.5 c 128,-1,6 + 583 379 583 379 583 258 c 128,-1,7 + 583 137 583 137 498 52 c 128,-1,0 + 413 -33 413 -33 292 -33 c 128,-1,1 +250 462 m 1,8,9 + 188 449 188 449 144.5 405.5 c 128,-1,10 + 101 362 101 362 88 300 c 1,11,-1 + 167 300 l 2,12,13 + 184 300 184 300 196 287.5 c 128,-1,14 + 208 275 208 275 208 258 c 128,-1,15 + 208 241 208 241 196 229 c 128,-1,16 + 184 217 184 217 167 217 c 2,17,-1 + 88 217 l 1,18,19 + 101 155 101 155 145 111 c 128,-1,20 + 189 67 189 67 250 54 c 1,21,-1 + 250 133 l 2,22,23 + 250 150 250 150 262.5 162.5 c 128,-1,24 + 275 175 275 175 292 175 c 128,-1,25 + 309 175 309 175 321 162.5 c 128,-1,26 + 333 150 333 150 333 133 c 2,27,-1 + 333 54 l 1,28,29 + 394 67 394 67 438.5 111 c 128,-1,30 + 483 155 483 155 496 217 c 1,31,-1 + 417 217 l 2,32,33 + 400 217 400 217 387.5 229 c 128,-1,34 + 375 241 375 241 375 258 c 128,-1,35 + 375 275 375 275 387.5 287.5 c 128,-1,36 + 400 300 400 300 417 300 c 2,37,-1 + 496 300 l 1,38,39 + 483 361 483 361 439 405 c 128,-1,40 + 395 449 395 449 333 462 c 1,41,-1 + 333 383 l 2,42,43 + 333 366 333 366 321 354 c 128,-1,44 + 309 342 309 342 292 342 c 128,-1,45 + 275 342 275 342 262.5 354 c 128,-1,46 + 250 366 250 366 250 383 c 2,47,-1 + 250 462 l 1,8,9 +EndSplineSet +EndChar + +StartChar: glyph217 +Encoding: 217 57561 218 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 109 + 13 + 1 + 5 + 0 + 31 + 1 + 3 + 6 + 20 + 1 + 12 + 3 + 3 + 66 + 0 + 8 + 11 + 10 + 11 + 8 + 96 + 0 + 5 + 6 + 0 + 5 + 79 + 2 + 13 + 2 + 0 + 0 + 6 + 3 + 0 + 6 + 91 + 0 + 3 + 0 + 12 + 4 + 3 + 12 + 91 + 0 + 4 + 0 + 11 + 8 + 4 + 11 + 91 + 0 + 10 + 0 + 9 + 7 + 10 + 9 + 91 + 0 + 7 + 1 + 1 + 7 + 79 + 0 + 7 + 7 + 1 + 83 + 0 + 1 + 7 + 1 + 71 + 1 + 0 + 69 + 68 + 64 + 62 + 57 + 55 + 52 + 50 + 47 + 45 + 40 + 39 + 34 + 32 + 29 + 27 + 25 + 23 + 19 + 17 + 12 + 10 + 7 + 6 + 0 + 14 + 1 + 14 + 14 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +557 592 m 0,0,1 + 600 592 600 592 633 559 c 128,-1,2 + 666 526 666 526 667 464 c 2,3,-1 + 667 258 l 2,4,5 + 667 114 667 114 569 19.5 c 128,-1,6 + 471 -75 471 -75 333 -75 c 128,-1,7 + 195 -75 195 -75 97.5 22.5 c 128,-1,8 + 0 120 0 120 0 258 c 128,-1,9 + 0 396 0 396 97.5 494 c 128,-1,10 + 195 592 195 592 333 592 c 0,11,12 + 407 592 407 592 476 560 c 1,13,14 + 515 592 515 592 557 592 c 0,0,1 +180 251 m 128,-1,16 + 180 310 180 310 223 353 c 128,-1,17 + 266 396 266 396 325 396 c 0,18,19 + 371 396 371 396 405 374 c 1,20,-1 + 344 315 l 2,21,22 + 319 290 319 290 327 274 c 128,-1,23 + 335 258 335 258 370 258 c 2,24,-1 + 583 258 l 1,25,-1 + 583 464 l 2,26,27 + 583 508 583 508 557 508 c 0,28,29 + 541 508 541 508 522 489 c 2,30,-1 + 474 441 l 1,31,32 + 409 492 409 492 325 492 c 0,33,34 + 225 492 225 492 154 421 c 0,35,36 + 84 351 84 351 84 250 c 128,-1,37 + 84 149 84 149 154 79 c 0,38,39 + 225 8 225 8 325 8 c 128,-1,40 + 425 8 425 8 496 79 c 0,41,42 + 516 99 516 99 529 119 c 0,43,44 + 544 142 544 142 530.5 168 c 128,-1,45 + 517 194 517 194 488 194 c 0,46,47 + 462 194 462 194 448 172 c 0,48,49 + 429 143 429 143 395.5 124 c 128,-1,50 + 362 105 362 105 325 105 c 0,51,52 + 266 105 266 105 223 148.5 c 128,-1,15 + 180 192 180 192 180 251 c 128,-1,16 +222 251 m 0,53,54 + 222 208 222 208 252 178 c 128,-1,55 + 282 148 282 148 325 148 c 0,56,57 + 367 148 367 148 398 179 c 0,58,59 + 406 187 406 187 412.5 196.5 c 128,-1,60 + 419 206 419 206 422 212 c 2,61,-1 + 424 217 l 1,62,-1 + 370 217 l 2,63,64 + 305 217 305 217 288 256 c 0,65,66 + 272 294 272 294 315 337 c 1,67,-1 + 325 342 l 1,68,69 + 277 342 277 342 252 317 c 0,70,71 + 222 288 222 288 222 251 c 0,53,54 +EndSplineSet +EndChar + +StartChar: glyph218 +Encoding: 218 57562 219 +Width: 500 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 10 + 22 + 1 + 4 + 2 + 32 + 1 + 3 + 4 + 2 + 66 +MPPEM +PUSHB_1 + 9 +LT +IF +NPUSHB + 31 + 0 + 3 + 4 + 0 + 4 + 3 + 96 + 0 + 2 + 0 + 4 + 3 + 2 + 4 + 91 + 0 + 0 + 1 + 1 + 0 + 79 + 0 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 +ELSE +NPUSHB + 32 + 0 + 3 + 4 + 0 + 4 + 3 + 0 + 104 + 0 + 2 + 0 + 4 + 3 + 2 + 4 + 91 + 0 + 0 + 1 + 1 + 0 + 79 + 0 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 +EIF +PUSHB_7 + 36 + 38 + 35 + 27 + 34 + 5 + 20 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +97 250 m 128,-1,1 + 97 191 97 191 140 148 c 128,-1,2 + 183 105 183 105 242 105 c 0,3,4 + 279 105 279 105 312 123.5 c 128,-1,5 + 345 142 345 142 364 172 c 0,6,7 + 374 188 374 188 394.5 192.5 c 128,-1,8 + 415 197 415 197 431 186 c 0,9,10 + 448 175 448 175 452 156 c 128,-1,11 + 456 137 456 137 446 120 c 0,12,13 + 432 98 432 98 413 79 c 0,14,15 + 342 8 342 8 242 8 c 128,-1,16 + 142 8 142 8 71 79 c 128,-1,17 + 0 150 0 150 0 250 c 128,-1,18 + 0 350 0 350 71 421 c 128,-1,19 + 142 492 142 492 242 492 c 0,20,21 + 326 492 326 492 391 441 c 1,22,-1 + 439 489 l 2,23,24 + 464 514 464 514 482 506.5 c 128,-1,25 + 500 499 500 499 500 464 c 2,26,-1 + 500 250 l 1,27,-1 + 286 250 l 2,28,29 + 251 250 251 250 243.5 268 c 128,-1,30 + 236 286 236 286 261 311 c 2,31,-1 + 322 372 l 1,32,33 + 287 395 287 395 242 395 c 0,34,35 + 183 395 183 395 140 352 c 128,-1,0 + 97 309 97 309 97 250 c 128,-1,1 +EndSplineSet +EndChar + +StartChar: glyph219 +Encoding: 219 57563 220 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 71 + 10 + 1 + 0 + 0 + 8 + 9 + 0 + 8 + 91 + 0 + 9 + 0 + 5 + 6 + 9 + 5 + 91 + 0 + 6 + 0 + 3 + 2 + 6 + 3 + 91 + 7 + 4 + 2 + 2 + 1 + 1 + 2 + 79 + 7 + 4 + 2 + 2 + 2 + 1 + 83 + 0 + 1 + 2 + 1 + 71 + 1 + 0 + 55 + 53 + 50 + 48 + 43 + 42 + 38 + 36 + 33 + 31 + 27 + 26 + 22 + 21 + 17 + 16 + 10 + 7 + 0 + 15 + 1 + 15 + 11 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +125 592 m 0,0,1 + 235 592 235 592 335.5 549 c 128,-1,2 + 436 506 436 506 508.5 433.5 c 128,-1,3 + 581 361 581 361 624 260.5 c 128,-1,4 + 667 160 667 160 667 50 c 0,5,6 + 667 -2 667 -2 630.5 -38.5 c 128,-1,7 + 594 -75 594 -75 542 -75 c 2,8,-1 + 167 -75 l 2,9,10 + 98 -75 98 -75 49 -26 c 128,-1,11 + 0 23 0 23 0 92 c 2,12,-1 + 0 467 l 2,13,14 + 0 519 0 519 36.5 555.5 c 128,-1,15 + 73 592 73 592 125 592 c 0,0,1 +167 8 m 128,-1,17 + 201 8 201 8 225.5 32.5 c 128,-1,18 + 250 57 250 57 250 92 c 0,19,20 + 250 126 250 126 226 150.5 c 128,-1,21 + 202 175 202 175 167 175 c 128,-1,22 + 132 175 132 175 108 150.5 c 128,-1,23 + 84 126 84 126 84 92 c 0,24,25 + 84 57 84 57 108.5 32.5 c 128,-1,16 + 133 8 133 8 167 8 c 128,-1,17 +355 8 m 128,-1,27 + 381 8 381 8 399 26.5 c 128,-1,28 + 417 45 417 45 417 71 c 0,29,30 + 417 183 417 183 337.5 262.5 c 128,-1,31 + 258 342 258 342 146 342 c 0,32,33 + 120 342 120 342 102 323.5 c 128,-1,34 + 84 305 84 305 84 279 c 128,-1,35 + 84 253 84 253 102 235 c 128,-1,36 + 120 217 120 217 146 217 c 0,37,38 + 206 217 206 217 249 174 c 128,-1,39 + 292 131 292 131 292 71 c 0,40,41 + 292 45 292 45 310.5 26.5 c 128,-1,26 + 329 8 329 8 355 8 c 128,-1,27 +521 8 m 128,-1,43 + 547 8 547 8 565.5 26.5 c 128,-1,44 + 584 45 584 45 584 71 c 0,45,46 + 584 189 584 189 525 290 c 128,-1,47 + 466 391 466 391 365.5 449.5 c 128,-1,48 + 265 508 265 508 146 508 c 0,49,50 + 120 508 120 508 102 490 c 128,-1,51 + 84 472 84 472 84 446 c 128,-1,52 + 84 420 84 420 102 401.5 c 128,-1,53 + 120 383 120 383 146 383 c 0,54,55 + 275 383 275 383 367 291.5 c 128,-1,56 + 459 200 459 200 459 71 c 0,57,58 + 459 45 459 45 477 26.5 c 128,-1,42 + 495 8 495 8 521 8 c 128,-1,43 +EndSplineSet +EndChar + +StartChar: glyph220 +Encoding: 220 57564 221 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 60 + 8 + 1 + 2 + 0 + 4 + 5 + 2 + 4 + 91 + 9 + 1 + 5 + 0 + 7 + 0 + 5 + 7 + 91 + 0 + 0 + 1 + 1 + 0 + 79 + 0 + 0 + 0 + 1 + 83 + 6 + 3 + 2 + 1 + 0 + 1 + 71 + 26 + 25 + 9 + 8 + 37 + 35 + 31 + 30 + 25 + 40 + 26 + 40 + 21 + 19 + 15 + 14 + 8 + 24 + 9 + 24 + 19 + 16 + 10 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +83 133 m 128,-1,1 + 118 133 118 133 142.5 108.5 c 128,-1,2 + 167 84 167 84 167 50 c 128,-1,3 + 167 16 167 16 142.5 -8.5 c 128,-1,4 + 118 -33 118 -33 83 -33 c 128,-1,5 + 48 -33 48 -33 24 -8.5 c 128,-1,6 + 0 16 0 16 0 50 c 128,-1,7 + 0 84 0 84 24 108.5 c 128,-1,0 + 48 133 48 133 83 133 c 128,-1,1 +83 633 m 0,8,9 + 241 633 241 633 375.5 555 c 128,-1,10 + 510 477 510 477 588.5 342.5 c 128,-1,11 + 667 208 667 208 667 50 c 0,12,13 + 667 16 667 16 642.5 -8.5 c 128,-1,14 + 618 -33 618 -33 583 -33 c 128,-1,15 + 548 -33 548 -33 524 -8.5 c 128,-1,16 + 500 16 500 16 500 50 c 0,17,18 + 500 222 500 222 378 344.5 c 128,-1,19 + 256 467 256 467 83 467 c 0,20,21 + 48 467 48 467 24 491.5 c 128,-1,22 + 0 516 0 516 0 550 c 128,-1,23 + 0 584 0 584 24 608.5 c 128,-1,24 + 48 633 48 633 83 633 c 0,8,9 +83 383 m 0,25,26 + 221 383 221 383 319 285.5 c 128,-1,27 + 417 188 417 188 417 50 c 0,28,29 + 417 16 417 16 392.5 -8.5 c 128,-1,30 + 368 -33 368 -33 333 -33 c 128,-1,31 + 298 -33 298 -33 274 -8.5 c 128,-1,32 + 250 16 250 16 250 50 c 0,33,34 + 250 119 250 119 201 168 c 128,-1,35 + 152 217 152 217 83 217 c 0,36,37 + 48 217 48 217 24 241.5 c 128,-1,38 + 0 266 0 266 0 300 c 128,-1,39 + 0 334 0 334 24 358.5 c 128,-1,40 + 48 383 48 383 83 383 c 0,25,26 +EndSplineSet +EndChar + +StartChar: glyph221 +Encoding: 221 57565 222 +Width: 869 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 38 + 4 + 1 + 6 + 1 + 58 + 49 + 2 + 9 + 5 + 144 + 102 + 2 + 8 + 9 + 42 + 22 + 2 + 3 + 8 + 10 + 1 + 13 + 3 + 132 + 108 + 41 + 23 + 4 + 15 + 13 + 120 + 32 + 31 + 3 + 16 + 12 + 7 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 85 + 7 + 1 + 6 + 1 + 5 + 1 + 6 + 5 + 104 + 0 + 5 + 9 + 1 + 5 + 9 + 102 + 17 + 1 + 16 + 12 + 16 + 107 + 0 + 19 + 20 + 1 + 19 + 79 + 24 + 1 + 14 + 21 + 1 + 0 + 1 + 14 + 0 + 91 + 0 + 20 + 2 + 1 + 1 + 6 + 20 + 1 + 91 + 11 + 1 + 9 + 23 + 10 + 22 + 3 + 8 + 3 + 9 + 8 + 91 + 0 + 13 + 15 + 12 + 13 + 79 + 4 + 1 + 3 + 18 + 1 + 15 + 12 + 3 + 15 + 91 + 0 + 13 + 13 + 12 + 83 + 0 + 12 + 13 + 12 + 71 +ELSE +MPPEM +PUSHB_1 + 11 +LT +IF +NPUSHB + 80 + 7 + 1 + 6 + 1 + 5 + 1 + 6 + 5 + 104 + 0 + 5 + 9 + 1 + 5 + 9 + 102 + 17 + 1 + 16 + 12 + 16 + 107 + 24 + 1 + 14 + 21 + 1 + 0 + 1 + 14 + 0 + 91 + 20 + 1 + 19 + 2 + 1 + 1 + 6 + 19 + 1 + 91 + 11 + 1 + 9 + 23 + 10 + 22 + 3 + 8 + 3 + 9 + 8 + 91 + 0 + 13 + 15 + 12 + 13 + 79 + 4 + 1 + 3 + 18 + 1 + 15 + 12 + 3 + 15 + 91 + 0 + 13 + 13 + 12 + 83 + 0 + 12 + 13 + 12 + 71 +ELSE +NPUSHB + 85 + 7 + 1 + 6 + 1 + 5 + 1 + 6 + 5 + 104 + 0 + 5 + 9 + 1 + 5 + 9 + 102 + 17 + 1 + 16 + 12 + 16 + 107 + 0 + 19 + 20 + 1 + 19 + 79 + 24 + 1 + 14 + 21 + 1 + 0 + 1 + 14 + 0 + 91 + 0 + 20 + 2 + 1 + 1 + 6 + 20 + 1 + 91 + 11 + 1 + 9 + 23 + 10 + 22 + 3 + 8 + 3 + 9 + 8 + 91 + 0 + 13 + 15 + 12 + 13 + 79 + 4 + 1 + 3 + 18 + 1 + 15 + 12 + 3 + 15 + 91 + 0 + 13 + 13 + 12 + 83 + 0 + 12 + 13 + 12 + 71 +EIF +EIF +NPUSHB + 60 + 95 + 94 + 75 + 74 + 64 + 63 + 1 + 0 + 148 + 147 + 140 + 138 + 135 + 133 + 124 + 122 + 118 + 116 + 107 + 105 + 94 + 150 + 95 + 150 + 91 + 89 + 86 + 85 + 80 + 78 + 74 + 84 + 75 + 84 + 70 + 68 + 63 + 73 + 64 + 73 + 57 + 55 + 54 + 53 + 52 + 51 + 45 + 43 + 21 + 19 + 16 + 14 + 6 + 5 + 0 + 62 + 1 + 62 + 25 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +694 580 m 2,0,1 + 665 580 665 580 646 569 c 0,2,3 + 626 559 626 559 616 553 c 1,4,-1 + 608 554 l 1,5,6 + 549 554 549 554 516 504 c 0,7,8 + 504 486 504 486 465 418.5 c 128,-1,9 + 426 351 426 351 402 323 c 1,10,11 + 378 351 378 351 338 419 c 128,-1,12 + 298 487 298 487 287 504 c 0,13,14 + 254 554 254 554 195 554 c 0,15,16 + 149 554 149 554 116 521 c 128,-1,17 + 83 488 83 488 83 442 c 128,-1,18 + 83 396 83 396 116 363.5 c 128,-1,19 + 149 331 149 331 195 331 c 0,20,21 + 253 331 253 331 286 379 c 1,22,-1 + 355 270 l 1,23,24 + 323 234 323 234 289.5 189 c 128,-1,25 + 256 144 256 144 238 116 c 2,26,-1 + 221 89 l 2,27,28 + 203 57 203 57 210 20 c 128,-1,29 + 217 -17 217 -17 235 -46 c 2,30,-1 + 253 -76 l 1,31,-1 + 401 196 l 1,32,-1 + 549 -76 l 1,33,34 + 552 -72 552 -72 557 -64.5 c 128,-1,35 + 562 -57 562 -57 572.5 -35.5 c 128,-1,36 + 583 -14 583 -14 589 5.5 c 128,-1,37 + 595 25 595 25 594.5 48.5 c 128,-1,38 + 594 72 594 72 582 89 c 0,39,40 + 519 190 519 190 448 270 c 1,41,-1 + 517 379 l 1,42,43 + 550 331 550 331 608 331 c 0,44,45 + 654 331 654 331 686.5 363.5 c 128,-1,46 + 719 396 719 396 719 442 c 0,47,48 + 719 486 719 486 689 518 c 1,49,50 + 700 531 700 531 711 536 c 0,51,52 + 713 536 713 536 717 538.5 c 128,-1,53 + 721 541 721 541 723 541 c 2,54,-1 + 736 543 l 1,55,-1 + 742 543 l 2,56,57 + 757 543 757 543 786 531 c 1,58,59 + 772 550 772 550 768 553 c 0,60,61 + 748 573 748 573 705 580 c 1,62,-1 + 694 580 l 2,0,1 +608 398 m 0,63,64 + 585 398 585 398 572 417 c 128,-1,65 + 559 436 559 436 567 458 c 1,66,-1 + 577 474 l 1,67,68 + 590 487 590 487 608 487 c 0,69,70 + 627 487 627 487 640 474 c 128,-1,71 + 653 461 653 461 653 442.5 c 128,-1,72 + 653 424 653 424 640 411 c 128,-1,73 + 627 398 627 398 608 398 c 0,63,64 +194 398 m 0,74,75 + 176 398 176 398 163 411 c 128,-1,76 + 150 424 150 424 150 442.5 c 128,-1,77 + 150 461 150 461 163 474 c 128,-1,78 + 176 487 176 487 194 487 c 0,79,80 + 213 487 213 487 226 474 c 1,81,-1 + 236 458 l 1,82,83 + 244 436 244 436 230.5 417 c 128,-1,84 + 217 398 217 398 194 398 c 0,74,75 +401 241 m 128,-1,86 + 394 241 394 241 389.5 246 c 128,-1,87 + 385 251 385 251 385 258 c 0,88,89 + 385 274 385 274 401 274 c 0,90,91 + 408 274 408 274 413 269.5 c 128,-1,92 + 418 265 418 265 418 258 c 128,-1,93 + 418 251 418 251 413 246 c 128,-1,85 + 408 241 408 241 401 241 c 128,-1,86 +694 664 m 2,94,-1 + 713 663 l 1,95,96 + 801 653 801 653 851 583 c 0,97,98 + 869 560 869 560 869.5 532.5 c 128,-1,99 + 870 505 870 505 853 482 c 0,100,101 + 833 456 833 456 803 450 c 1,102,-1 + 803 443 l 2,103,104 + 803 363 803 363 745.5 305.5 c 128,-1,105 + 688 248 688 248 608 248 c 0,106,107 + 594 248 594 248 570 252 c 1,108,109 + 620 186 620 186 652 135 c 0,110,111 + 677 99 677 99 679.5 56 c 128,-1,112 + 682 13 682 13 667 -26 c 128,-1,113 + 652 -65 652 -65 640.5 -86.5 c 128,-1,114 + 629 -108 629 -108 617 -125 c 0,115,116 + 592 -159 592 -159 549 -159 c 0,117,118 + 499 -157 499 -157 476 -116 c 2,119,-1 + 401 22 l 1,120,-1 + 327 -116 l 2,121,122 + 304 -157 304 -157 253 -159 c 0,123,124 + 211 -159 211 -159 186 -125 c 0,125,126 + 174 -108 174 -108 162.5 -86.5 c 128,-1,127 + 151 -65 151 -65 136 -26 c 128,-1,128 + 121 13 121 13 123.5 56 c 128,-1,129 + 126 99 126 99 151 135 c 0,130,131 + 189 194 189 194 232 252 c 1,132,133 + 208 248 208 248 194 248 c 0,134,135 + 114 248 114 248 57 305.5 c 128,-1,136 + 0 363 0 363 0 443 c 128,-1,137 + 0 523 0 523 57 580 c 128,-1,138 + 114 637 114 637 194 637 c 0,139,140 + 241 637 241 637 283 615.5 c 128,-1,141 + 325 594 325 594 353 555 c 0,142,143 + 365 538 365 538 401 476 c 1,144,145 + 433 531 433 531 450 555 c 0,146,147 + 503 630 503 630 594 636 c 1,148,-1 + 606 643 l 2,149,150 + 645 664 645 664 694 664 c 2,94,-1 +EndSplineSet +EndChar + +StartChar: glyph222 +Encoding: 222 57566 223 +Width: 703 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 87 + 5 + 1 + 7 + 4 + 50 + 38 + 12 + 3 + 0 + 6 + 37 + 13 + 2 + 8 + 9 + 24 + 1 + 1 + 8 + 4 + 66 + 0 + 9 + 0 + 8 + 0 + 9 + 8 + 104 + 0 + 8 + 1 + 0 + 8 + 1 + 102 + 2 + 1 + 1 + 1 + 105 + 5 + 1 + 4 + 11 + 1 + 7 + 6 + 4 + 7 + 91 + 10 + 1 + 6 + 0 + 0 + 6 + 79 + 10 + 1 + 6 + 6 + 0 + 83 + 3 + 1 + 0 + 6 + 0 + 71 + 84 + 83 + 80 + 79 + 75 + 74 + 19 + 19 + 20 + 41 + 35 + 43 + 36 + 26 + 41 + 12 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +698 570 m 0,0,1 + 708 558 708 558 698 545 c 128,-1,2 + 688 532 688 532 674 538 c 0,3,4 + 637 555 637 555 613 542 c 1,5,6 + 636 508 636 508 636 468 c 0,7,8 + 636 413 636 413 597.5 374.5 c 128,-1,9 + 559 336 559 336 504 336 c 0,10,11 + 455 336 455 336 417 369 c 1,12,-1 + 390 320 l 1,13,14 + 435 269 435 269 451 247.5 c 128,-1,15 + 467 226 467 226 503 168 c 2,16,-1 + 517 146 l 1,17,18 + 565 80 565 80 484 -39 c 1,19,-1 + 483 -41 l 2,20,21 + 476 -50 476 -50 464.5 -49.5 c 128,-1,22 + 453 -49 453 -49 448 -39 c 2,23,-1 + 318 199 l 1,24,-1 + 188 -39 l 2,25,26 + 182 -50 182 -50 170 -50 c 0,27,28 + 160 -50 160 -50 153 -41 c 0,29,30 + 150 -37 150 -37 143 -26 c 128,-1,31 + 136 -15 136 -15 125 7.5 c 128,-1,32 + 114 30 114 30 107.5 52.5 c 128,-1,33 + 101 75 101 75 103 101.5 c 128,-1,34 + 105 128 105 128 120 148 c 0,35,36 + 195 260 195 260 246 319 c 1,37,-1 + 219 369 l 1,38,39 + 181 336 181 336 132 336 c 0,40,41 + 77 336 77 336 38.5 374.5 c 128,-1,42 + 0 413 0 413 0 468 c 128,-1,43 + 0 523 0 523 38.5 561.5 c 128,-1,44 + 77 600 77 600 132 600 c 0,45,46 + 198 600 198 600 242 541 c 0,47,48 + 258 517 258 517 280 472 c 128,-1,49 + 302 427 302 427 318 404 c 1,50,51 + 334 427 334 427 356 472 c 128,-1,52 + 378 517 378 517 394 541 c 1,53,-1 + 396 543 l 1,54,55 + 436 600 436 600 504 600 c 2,56,-1 + 507 600 l 1,57,-1 + 515 605 l 2,58,59 + 560 633 560 633 614 624.5 c 128,-1,60 + 668 616 668 616 698 570 c 0,0,1 +131 425 m 128,-1,62 + 148 425 148 425 160 437.5 c 128,-1,63 + 172 450 172 450 172 467 c 128,-1,64 + 172 484 172 484 160 496 c 128,-1,65 + 148 508 148 508 131 508 c 128,-1,66 + 114 508 114 508 101.5 496 c 128,-1,67 + 89 484 89 484 89 467 c 128,-1,68 + 89 450 89 450 101.5 437.5 c 128,-1,61 + 114 425 114 425 131 425 c 128,-1,62 +318 284 m 128,-1,70 + 327 284 327 284 333 290 c 128,-1,71 + 339 296 339 296 339 304 c 0,72,73 + 339 313 339 313 333 319 c 128,-1,74 + 327 325 327 325 318 325 c 128,-1,75 + 309 325 309 325 303 319 c 128,-1,76 + 297 313 297 313 297 304 c 0,77,78 + 297 296 297 296 303 290 c 128,-1,69 + 309 284 309 284 318 284 c 128,-1,70 +506 425 m 128,-1,80 + 523 425 523 425 535 437.5 c 128,-1,81 + 547 450 547 450 547 467 c 128,-1,82 + 547 484 547 484 535 496 c 128,-1,83 + 523 508 523 508 506 508 c 128,-1,84 + 489 508 489 508 476.5 496 c 128,-1,85 + 464 484 464 484 464 467 c 128,-1,86 + 464 450 464 450 476.5 437.5 c 128,-1,79 + 489 425 489 425 506 425 c 128,-1,80 +EndSplineSet +EndChar + +StartChar: glyph223 +Encoding: 223 57567 224 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 81 + 28 + 17 + 2 + 2 + 9 + 1 + 66 + 10 + 1 + 0 + 0 + 8 + 9 + 0 + 8 + 91 + 0 + 9 + 11 + 7 + 4 + 3 + 2 + 6 + 9 + 2 + 91 + 0 + 6 + 0 + 3 + 5 + 6 + 3 + 91 + 0 + 5 + 1 + 1 + 5 + 79 + 0 + 5 + 5 + 1 + 83 + 0 + 1 + 5 + 1 + 71 + 36 + 36 + 1 + 0 + 56 + 53 + 48 + 45 + 36 + 41 + 36 + 41 + 39 + 38 + 34 + 31 + 27 + 25 + 23 + 22 + 20 + 18 + 9 + 6 + 0 + 15 + 1 + 14 + 12 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 633 m 2,0,1 + 594 633 594 633 630.5 596.5 c 128,-1,2 + 667 560 667 560 667 508 c 2,3,-1 + 667 50 l 2,4,5 + 667 -2 667 -2 630.5 -38.5 c 128,-1,6 + 594 -75 594 -75 542 -75 c 2,7,-1 + 125 -75 l 2,8,9 + 73 -75 73 -75 36.5 -38.5 c 128,-1,10 + 0 -2 0 -2 0 50 c 2,11,-1 + 0 508 l 2,12,13 + 0 560 0 560 36.5 596.5 c 128,-1,14 + 73 633 73 633 125 633 c 2,15,-1 + 542 633 l 2,0,1 +583 50 m 2,16,-1 + 583 353 l 1,17,18 + 564 342 564 342 542 342 c 2,19,-1 + 479 342 l 1,20,21 + 479 282 479 282 436 239 c 128,-1,22 + 393 196 393 196 333 196 c 128,-1,23 + 273 196 273 196 230.5 239 c 128,-1,24 + 188 282 188 282 188 342 c 1,25,-1 + 125 342 l 2,26,27 + 102 342 102 342 83 353 c 1,28,-1 + 83 50 l 2,29,30 + 83 33 83 33 95.5 20.5 c 128,-1,31 + 108 8 108 8 125 8 c 2,32,-1 + 542 8 l 2,33,34 + 559 8 559 8 571 20.5 c 128,-1,35 + 583 33 583 33 583 50 c 2,16,-1 +229 342 m 1,36,37 + 229 299 229 299 259.5 268.5 c 128,-1,38 + 290 238 290 238 333 238 c 128,-1,39 + 376 238 376 238 407 268.5 c 128,-1,40 + 438 299 438 299 438 342 c 1,41,-1 + 229 342 l 1,36,37 +583 425 m 2,42,-1 + 583 508 l 2,43,44 + 583 525 583 525 571 537.5 c 128,-1,45 + 559 550 559 550 542 550 c 2,46,-1 + 125 550 l 2,47,48 + 108 550 108 550 95.5 537.5 c 128,-1,49 + 83 525 83 525 83 508 c 2,50,-1 + 83 425 l 2,51,52 + 83 408 83 408 95.5 395.5 c 128,-1,53 + 108 383 108 383 125 383 c 2,54,-1 + 542 383 l 2,55,56 + 559 383 559 383 571 395.5 c 128,-1,57 + 583 408 583 408 583 425 c 2,42,-1 +EndSplineSet +EndChar + +StartChar: glyph224 +Encoding: 224 57568 225 +Width: 802 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 129 + 18 + 1 + 3 + 2 + 1 + 66 + 0 + 5 + 0 + 4 + 0 + 5 + 4 + 91 + 22 + 1 + 0 + 12 + 8 + 2 + 6 + 7 + 0 + 6 + 89 + 13 + 9 + 2 + 7 + 17 + 23 + 15 + 3 + 10 + 11 + 7 + 10 + 89 + 16 + 14 + 2 + 11 + 0 + 1 + 2 + 11 + 1 + 91 + 0 + 2 + 0 + 3 + 18 + 2 + 3 + 91 + 20 + 1 + 18 + 19 + 19 + 18 + 79 + 20 + 1 + 18 + 18 + 19 + 83 + 21 + 1 + 19 + 18 + 19 + 71 + 51 + 51 + 1 + 0 + 74 + 72 + 70 + 68 + 66 + 64 + 62 + 60 + 58 + 57 + 56 + 55 + 51 + 54 + 51 + 54 + 53 + 52 + 50 + 49 + 47 + 46 + 45 + 44 + 43 + 42 + 41 + 40 + 39 + 38 + 37 + 36 + 35 + 34 + 30 + 27 + 24 + 22 + 17 + 14 + 11 + 9 + 8 + 6 + 0 + 33 + 1 + 33 + 24 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +760 592 m 2,0,1 + 778 592 778 592 791.5 577 c 128,-1,2 + 805 562 805 562 802 544 c 2,3,-1 + 760 252 l 2,4,5 + 758 237 758 237 746.5 227 c 128,-1,6 + 735 217 735 217 719 217 c 2,7,-1 + 247 217 l 1,8,-1 + 254 175 l 1,9,-1 + 677 175 l 2,10,11 + 694 175 694 175 706.5 162.5 c 128,-1,12 + 719 150 719 150 719 133 c 128,-1,13 + 719 116 719 116 706.5 104 c 128,-1,14 + 694 92 694 92 677 92 c 2,15,-1 + 219 92 l 2,16,17 + 199 92 199 92 182 115 c 0,18,19 + 182 117 182 117 180.5 120.5 c 128,-1,20 + 179 124 179 124 178 126 c 2,21,-1 + 100 592 l 1,22,-1 + 42 592 l 2,23,24 + 25 592 25 592 12.5 604 c 128,-1,25 + 0 616 0 616 0 633 c 128,-1,26 + 0 650 0 650 12.5 662.5 c 128,-1,27 + 25 675 25 675 42 675 c 2,28,-1 + 135 675 l 2,29,30 + 150 675 150 675 162 665 c 128,-1,31 + 174 655 174 655 176 640 c 2,32,-1 + 185 592 l 1,33,-1 + 760 592 l 2,0,1 +712 508 m 1,34,-1 + 552 508 l 1,35,-1 + 552 425 l 1,36,-1 + 700 425 l 1,37,-1 + 712 508 l 1,34,-1 +510 508 m 1,38,-1 + 385 508 l 1,39,-1 + 385 425 l 1,40,-1 + 510 425 l 1,41,-1 + 510 508 l 1,38,-1 +510 383 m 1,42,-1 + 385 383 l 1,43,-1 + 385 300 l 1,44,-1 + 510 300 l 1,45,-1 + 510 383 l 1,42,-1 +344 508 m 1,46,-1 + 198 508 l 1,47,-1 + 213 424 l 1,48,-1 + 219 425 l 1,49,-1 + 344 425 l 1,50,-1 + 344 508 l 1,46,-1 +219 383 m 1,51,-1 + 233 300 l 1,52,-1 + 344 300 l 1,53,-1 + 344 383 l 1,54,-1 + 219 383 l 1,51,-1 +552 300 m 1,55,-1 + 683 300 l 1,56,-1 + 694 383 l 1,57,-1 + 552 383 l 1,58,-1 + 552 300 l 1,55,-1 +219 -12 m 0,59,60 + 219 50 219 50 281 50 c 0,61,62 + 344 50 344 50 344 -12 c 0,63,64 + 344 -75 344 -75 281 -75 c 0,65,66 + 219 -75 219 -75 219 -12 c 0,59,60 +594 -12 m 0,67,68 + 594 50 594 50 656 50 c 0,69,70 + 719 50 719 50 719 -12 c 0,71,72 + 719 -75 719 -75 656 -75 c 0,73,74 + 594 -75 594 -75 594 -12 c 0,67,68 +EndSplineSet +EndChar + +StartChar: glyph225 +Encoding: 225 57569 226 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 92 + 19 + 1 + 10 + 3 + 9 + 1 + 1 + 5 + 2 + 66 + 0 + 12 + 0 + 13 + 0 + 12 + 13 + 91 + 0 + 0 + 0 + 6 + 3 + 0 + 6 + 91 + 4 + 1 + 3 + 0 + 10 + 5 + 3 + 10 + 91 + 9 + 1 + 5 + 2 + 1 + 1 + 7 + 5 + 1 + 91 + 0 + 7 + 0 + 8 + 14 + 7 + 8 + 91 + 0 + 14 + 11 + 11 + 14 + 79 + 0 + 14 + 14 + 11 + 84 + 0 + 11 + 14 + 11 + 72 + 73 + 72 + 69 + 68 + 65 + 64 + 61 + 60 + 57 + 56 + 53 + 52 + 38 + 36 + 37 + 20 + 34 + 36 + 34 + 37 + 16 + 15 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +368 488 m 128,-1,1 + 445 488 445 488 498 433 c 128,-1,2 + 551 378 551 378 551 300 c 2,3,-1 + 551 290 l 2,4,5 + 551 259 551 259 532 238 c 128,-1,6 + 513 217 513 217 483 217 c 0,7,8 + 455 217 455 217 433 242 c 1,9,10 + 410 217 410 217 373 217 c 0,11,12 + 338 217 338 217 314 241.5 c 128,-1,13 + 290 266 290 266 290 300 c 0,14,15 + 290 335 290 335 314 359 c 128,-1,16 + 338 383 338 383 372 383 c 0,17,18 + 394 383 394 383 414 371 c 1,19,20 + 419 383 419 383 431 383 c 0,21,22 + 447 383 447 383 447 362 c 2,23,-1 + 447 290 l 2,24,25 + 447 277 447 277 456 267.5 c 128,-1,26 + 465 258 465 258 478 258 c 128,-1,27 + 491 258 491 258 500 267.5 c 128,-1,28 + 509 277 509 277 509 290 c 2,29,-1 + 509 300 l 2,30,31 + 509 360 509 360 468.5 403 c 128,-1,32 + 428 446 428 446 368 446 c 0,33,34 + 309 446 309 446 268.5 403.5 c 128,-1,35 + 228 361 228 361 228 300 c 0,36,37 + 228 240 228 240 271 197 c 128,-1,38 + 314 154 314 154 374 154 c 0,39,40 + 418 154 418 154 456 179 c 0,41,42 + 466 186 466 186 476 180 c 128,-1,43 + 486 174 486 174 487 163.5 c 128,-1,44 + 488 153 488 153 478 145 c 0,45,46 + 429 112 429 112 372 112 c 0,47,48 + 295 112 295 112 239.5 167.5 c 128,-1,49 + 184 223 184 223 184 300 c 0,50,51 + 184 378 184 378 237.5 433 c 128,-1,0 + 291 488 291 488 368 488 c 128,-1,1 +374 258 m 128,-1,53 + 391 258 391 258 403 270.5 c 128,-1,54 + 415 283 415 283 415 300 c 128,-1,55 + 415 317 415 317 403 329.5 c 128,-1,56 + 391 342 391 342 374 342 c 128,-1,57 + 357 342 357 342 344.5 329.5 c 128,-1,58 + 332 317 332 317 332 300 c 128,-1,59 + 332 283 332 283 344.5 270.5 c 128,-1,52 + 357 258 357 258 374 258 c 128,-1,53 +375 -75 m 128,-1,61 + 220 -75 220 -75 110 35 c 128,-1,62 + 0 145 0 145 0 300 c 128,-1,63 + 0 455 0 455 110 565 c 128,-1,64 + 220 675 220 675 375 675 c 128,-1,65 + 530 675 530 675 640 565 c 128,-1,66 + 750 455 750 455 750 300 c 128,-1,67 + 750 145 750 145 640 35 c 128,-1,60 + 530 -75 530 -75 375 -75 c 128,-1,61 +375 592 m 128,-1,69 + 254 592 254 592 168.5 506.5 c 128,-1,70 + 83 421 83 421 83 300 c 128,-1,71 + 83 179 83 179 168.5 93.5 c 128,-1,72 + 254 8 254 8 375 8 c 128,-1,73 + 496 8 496 8 581.5 93.5 c 128,-1,74 + 667 179 667 179 667 300 c 128,-1,75 + 667 421 667 421 581.5 506.5 c 128,-1,68 + 496 592 496 592 375 592 c 128,-1,69 +EndSplineSet +EndChar + +StartChar: glyph226 +Encoding: 226 57570 227 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 88 + 54 + 46 + 44 + 42 + 40 + 38 + 36 + 32 + 30 + 28 + 26 + 24 + 12 + 7 + 6 + 70 + 68 + 66 + 64 + 62 + 58 + 48 + 7 + 8 + 7 + 2 + 66 + 0 + 7 + 6 + 8 + 6 + 7 + 8 + 104 + 0 + 1 + 0 + 2 + 4 + 1 + 2 + 91 + 0 + 4 + 0 + 6 + 7 + 4 + 6 + 91 + 0 + 8 + 0 + 5 + 3 + 8 + 5 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 0 + 0 + 3 + 0 + 71 + 61 + 59 + 57 + 55 + 44 + 19 + 19 + 19 + 19 + 19 + 16 + 9 + 22 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 -75 m 128,-1,1 + 220 -75 220 -75 110 35 c 128,-1,2 + 0 145 0 145 0 300 c 128,-1,3 + 0 455 0 455 110 565 c 128,-1,4 + 220 675 220 675 375 675 c 128,-1,5 + 530 675 530 675 640 565 c 128,-1,6 + 750 455 750 455 750 300 c 128,-1,7 + 750 145 750 145 640 35 c 128,-1,0 + 530 -75 530 -75 375 -75 c 128,-1,1 +375 592 m 128,-1,9 + 254 592 254 592 168.5 506.5 c 128,-1,10 + 83 421 83 421 83 300 c 128,-1,11 + 83 179 83 179 168.5 93.5 c 128,-1,12 + 254 8 254 8 375 8 c 128,-1,13 + 496 8 496 8 581.5 93.5 c 128,-1,14 + 667 179 667 179 667 300 c 128,-1,15 + 667 421 667 421 581.5 506.5 c 128,-1,8 + 496 592 496 592 375 592 c 128,-1,9 +375 529 m 128,-1,17 + 470 529 470 529 537 461.5 c 128,-1,18 + 604 394 604 394 604 300 c 128,-1,19 + 604 206 604 206 537 138.5 c 128,-1,20 + 470 71 470 71 375 71 c 128,-1,21 + 280 71 280 71 213 138.5 c 128,-1,22 + 146 206 146 206 146 300 c 128,-1,23 + 146 394 146 394 213 461.5 c 128,-1,16 + 280 529 280 529 375 529 c 128,-1,17 +562 304 m 1,24,25 + 560 376 560 376 511 429 c 1,26,27 + 474 379 474 379 415 343 c 1,28,29 + 430 311 430 311 433 302 c 1,30,31 + 497 316 497 316 562 304 c 1,24,25 +479 456 m 1,32,33 + 431 488 431 488 375 488 c 0,34,35 + 358 488 358 488 326 480 c 1,36,37 + 366 434 366 434 396 380 c 1,38,39 + 444 408 444 408 479 456 c 1,32,33 +285 464 m 1,40,41 + 212 424 212 424 193 342 c 1,42,43 + 276 326 276 326 359 361 c 1,44,45 + 327 418 327 418 285 464 c 1,40,41 +188 300 m 1,46,47 + 188 227 188 227 238 174 c 1,48,49 + 297 255 297 255 393 290 c 1,50,51 + 391 295 391 295 388.5 300.5 c 128,-1,52 + 386 306 386 306 383 312.5 c 128,-1,53 + 380 319 380 319 378 323 c 1,54,55 + 313 295 313 295 246 295 c 0,56,57 + 221 295 221 295 188 300 c 1,46,47 +269 146 m 1,58,59 + 318 112 318 112 375 112 c 0,60,61 + 402 112 402 112 432 122 c 1,62,63 + 428 184 428 184 407 251 c 1,64,65 + 320 220 320 220 269 146 c 1,58,59 +472 140 m 1,66,67 + 542 183 542 183 559 262 c 1,68,69 + 499 273 499 273 447 263 c 1,70,71 + 466 198 466 198 472 140 c 1,66,67 +EndSplineSet +EndChar + +StartChar: glyph227 +Encoding: 227 57571 228 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 70 + 40 + 36 + 34 + 28 + 26 + 23 + 21 + 19 + 15 + 13 + 12 + 10 + 8 + 13 + 3 + 2 + 54 + 52 + 49 + 47 + 45 + 41 + 32 + 30 + 8 + 4 + 3 + 2 + 66 + 0 + 3 + 2 + 4 + 2 + 3 + 4 + 104 + 0 + 0 + 0 + 2 + 3 + 0 + 2 + 91 + 0 + 4 + 1 + 1 + 4 + 79 + 0 + 4 + 4 + 1 + 83 + 0 + 1 + 4 + 1 + 71 + 44 + 42 + 39 + 37 + 43 + 19 + 16 + 5 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 675 m 128,-1,1 + 530 675 530 675 640 565 c 128,-1,2 + 750 455 750 455 750 300 c 128,-1,3 + 750 145 750 145 640 35 c 128,-1,4 + 530 -75 530 -75 375 -75 c 128,-1,5 + 220 -75 220 -75 110 35 c 128,-1,6 + 0 145 0 145 0 300 c 128,-1,7 + 0 455 0 455 110 565 c 128,-1,0 + 220 675 220 675 375 675 c 128,-1,1 +665 330 m 1,8,9 + 654 436 654 436 578 509 c 1,10,11 + 513 424 513 424 424 373 c 1,12,-1 + 448 319 l 1,13,14 + 555 348 555 348 665 330 c 1,8,9 +547 535 m 1,15,16 + 469 592 469 592 375 592 c 0,17,18 + 332 592 332 592 288 579 c 1,19,20 + 354 503 354 503 405 410 c 1,21,22 + 490 459 490 459 547 535 c 1,15,16 +248 562 m 1,23,24 + 186 532 186 532 143.5 476.5 c 128,-1,25 + 101 421 101 421 88 353 c 1,26,27 + 236 329 236 329 368 390 c 1,28,29 + 317 484 317 484 248 562 c 1,23,24 +83 300 m 1,30,31 + 83 192 83 192 154 110 c 1,32,33 + 249 250 249 250 408 307 c 1,34,35 + 397 331 397 331 386 354 c 1,36,37 + 280 304 280 304 168 304 c 0,38,39 + 129 304 129 304 84 312 c 1,40,-1 + 83 300 l 1,30,31 +183 81 m 1,41,42 + 266 8 266 8 375 8 c 0,43,44 + 426 8 426 8 477 27 c 1,45,46 + 467 147 467 147 423 268 c 1,47,48 + 273 215 273 215 183 81 c 1,41,42 +517 45 m 1,49,50 + 582 81 582 81 622.5 146 c 128,-1,51 + 663 211 663 211 666 288 c 1,52,53 + 562 306 562 306 463 280 c 1,54,55 + 505 168 505 168 517 45 c 1,49,50 +EndSplineSet +EndChar + +StartChar: glyph228 +Encoding: 228 57572 229 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 58 + 43 + 29 + 2 + 0 + 5 + 1 + 66 + 0 + 0 + 5 + 0 + 107 + 0 + 1 + 0 + 6 + 2 + 1 + 6 + 91 + 0 + 2 + 0 + 3 + 4 + 2 + 3 + 91 + 8 + 1 + 4 + 5 + 5 + 4 + 77 + 8 + 1 + 4 + 4 + 5 + 81 + 7 + 1 + 5 + 4 + 5 + 69 + 17 + 23 + 39 + 17 + 19 + 33 + 35 + 38 + 36 + 9 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +640 566 m 0,0,1 + 750 456 750 456 750 300 c 0,2,3 + 750 145 750 145 640 35 c 128,-1,4 + 530 -75 530 -75 375 -75 c 0,5,6 + 219 -75 219 -75 109 35 c 0,7,8 + 0 144 0 144 0 300 c 0,9,10 + 0 457 0 457 109 566 c 0,11,12 + 217 675 217 675 375 675 c 0,13,14 + 531 675 531 675 640 566 c 0,0,1 +333 349 m 2,15,16 + 333 398 333 398 364 432.5 c 128,-1,17 + 395 467 395 467 442 467 c 2,18,-1 + 500 467 l 1,19,-1 + 500 383 l 1,20,-1 + 442 383 l 2,21,22 + 432 383 432 383 424.5 375.5 c 128,-1,23 + 417 368 417 368 417 358 c 2,24,-1 + 417 300 l 1,25,-1 + 500 300 l 1,26,-1 + 500 217 l 1,27,-1 + 417 217 l 1,28,-1 + 417 11 l 1,29,30 + 510 23 510 23 581 94 c 0,31,32 + 667 180 667 180 667 300 c 0,33,34 + 667 422 667 422 581 507 c 128,-1,35 + 495 592 495 592 375 592 c 0,36,37 + 253 592 253 592 168 507 c 128,-1,38 + 83 422 83 422 83 300 c 0,39,40 + 83 180 83 180 168 94 c 0,41,42 + 239 23 239 23 333 11 c 1,43,-1 + 333 217 l 1,44,-1 + 250 217 l 1,45,-1 + 250 300 l 1,46,-1 + 333 300 l 1,47,-1 + 333 349 l 2,15,16 +EndSplineSet +EndChar + +StartChar: glyph229 +Encoding: 229 57573 230 +Width: 375 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 41 + 0 + 2 + 1 + 2 + 107 + 0 + 5 + 0 + 6 + 0 + 5 + 6 + 91 + 4 + 1 + 0 + 1 + 1 + 0 + 77 + 4 + 1 + 0 + 0 + 1 + 81 + 3 + 1 + 1 + 0 + 1 + 69 + 33 + 37 + 17 + 17 + 17 + 17 + 16 + 7 + 22 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +250 383 m 1,0,-1 + 375 383 l 1,1,-1 + 375 258 l 1,2,-1 + 250 258 l 1,3,-1 + 250 -33 l 1,4,-1 + 125 -33 l 1,5,-1 + 125 258 l 1,6,-1 + 0 258 l 1,7,-1 + 0 383 l 1,8,-1 + 125 383 l 1,9,-1 + 125 436 l 2,10,11 + 125 476 125 476 137.5 517 c 128,-1,12 + 150 558 150 558 172 582 c 0,13,14 + 218 633 218 633 288 633 c 2,15,-1 + 375 633 l 1,16,-1 + 375 508 l 1,17,-1 + 288 508 l 2,18,19 + 272 508 272 508 261 497.5 c 128,-1,20 + 250 487 250 487 250 471 c 2,21,-1 + 250 383 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph230 +Encoding: 230 57574 231 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 74 + 0 + 1 + 11 + 1 + 2 + 5 + 1 + 2 + 91 + 9 + 1 + 5 + 0 + 6 + 7 + 5 + 6 + 91 + 0 + 7 + 8 + 1 + 4 + 3 + 7 + 4 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 10 + 1 + 0 + 3 + 0 + 71 + 16 + 15 + 1 + 0 + 48 + 47 + 44 + 43 + 40 + 39 + 36 + 35 + 32 + 31 + 28 + 27 + 22 + 20 + 15 + 26 + 16 + 26 + 9 + 7 + 0 + 14 + 1 + 14 + 12 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 -75 m 0,0,1 + 219 -75 219 -75 109 35 c 0,2,3 + 0 144 0 144 0 300 c 0,4,5 + 0 457 0 457 109 566 c 0,6,7 + 217 675 217 675 375 675 c 0,8,9 + 531 675 531 675 640 566 c 0,10,11 + 750 456 750 456 750 300 c 0,12,13 + 750 145 750 145 640 35 c 128,-1,14 + 530 -75 530 -75 375 -75 c 0,0,1 +375 592 m 0,15,16 + 253 592 253 592 168 507 c 128,-1,17 + 83 422 83 422 83 300 c 0,18,19 + 83 180 83 180 168 94 c 128,-1,20 + 253 8 253 8 375 8 c 0,21,22 + 495 8 495 8 581 94 c 128,-1,23 + 667 180 667 180 667 300 c 0,24,25 + 667 422 667 422 581 507 c 128,-1,26 + 495 592 495 592 375 592 c 0,15,16 +250 196 m 128,-1,28 + 207 196 207 196 176.5 226.5 c 128,-1,29 + 146 257 146 257 146 300 c 128,-1,30 + 146 343 146 343 176.5 373.5 c 128,-1,31 + 207 404 207 404 250 404 c 128,-1,32 + 293 404 293 404 323.5 373.5 c 128,-1,33 + 354 343 354 343 354 300 c 128,-1,34 + 354 257 354 257 323.5 226.5 c 128,-1,27 + 293 196 293 196 250 196 c 128,-1,28 +250 362 m 128,-1,36 + 224 362 224 362 206 344 c 128,-1,37 + 188 326 188 326 188 300 c 128,-1,38 + 188 274 188 274 206 256 c 128,-1,39 + 224 238 224 238 250 238 c 128,-1,40 + 276 238 276 238 294 256 c 128,-1,41 + 312 274 312 274 312 300 c 128,-1,42 + 312 326 312 326 294 344 c 128,-1,35 + 276 362 276 362 250 362 c 128,-1,36 +500 196 m 128,-1,44 + 457 196 457 196 426.5 226.5 c 128,-1,45 + 396 257 396 257 396 300 c 128,-1,46 + 396 343 396 343 426.5 373.5 c 128,-1,47 + 457 404 457 404 500 404 c 128,-1,48 + 543 404 543 404 573.5 373.5 c 128,-1,49 + 604 343 604 343 604 300 c 128,-1,50 + 604 257 604 257 573.5 226.5 c 128,-1,43 + 543 196 543 196 500 196 c 128,-1,44 +EndSplineSet +EndChar + +StartChar: glyph231 +Encoding: 231 57575 232 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 34 + 4 + 1 + 1 + 0 + 2 + 3 + 1 + 2 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 5 + 1 + 0 + 3 + 0 + 71 + 19 + 19 + 19 + 19 + 19 + 16 + 6 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +167 133 m 128,-1,1 + 98 133 98 133 49 182 c 128,-1,2 + 0 231 0 231 0 300 c 128,-1,3 + 0 369 0 369 49 418 c 128,-1,4 + 98 467 98 467 167 467 c 128,-1,5 + 236 467 236 467 284.5 418 c 128,-1,6 + 333 369 333 369 333 300 c 128,-1,7 + 333 231 333 231 284.5 182 c 128,-1,0 + 236 133 236 133 167 133 c 128,-1,1 +167 383 m 128,-1,9 + 132 383 132 383 107.5 358.5 c 128,-1,10 + 83 334 83 334 83 300 c 128,-1,11 + 83 266 83 266 107.5 241.5 c 128,-1,12 + 132 217 132 217 167 217 c 128,-1,13 + 202 217 202 217 226 241.5 c 128,-1,14 + 250 266 250 266 250 300 c 128,-1,15 + 250 334 250 334 226 358.5 c 128,-1,8 + 202 383 202 383 167 383 c 128,-1,9 +542 467 m 128,-1,17 + 611 467 611 467 659.5 418 c 128,-1,18 + 708 369 708 369 708 300 c 128,-1,19 + 708 231 708 231 659.5 182 c 128,-1,20 + 611 133 611 133 542 133 c 128,-1,21 + 473 133 473 133 424 182 c 128,-1,22 + 375 231 375 231 375 300 c 128,-1,23 + 375 369 375 369 424 418 c 128,-1,16 + 473 467 473 467 542 467 c 128,-1,17 +EndSplineSet +EndChar + +StartChar: glyph232 +Encoding: 232 57576 233 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 93 + 54 + 45 + 2 + 7 + 2 + 51 + 47 + 41 + 25 + 4 + 9 + 7 + 2 + 66 + 0 + 1 + 0 + 2 + 7 + 1 + 2 + 91 + 0 + 7 + 10 + 1 + 9 + 4 + 7 + 9 + 91 + 13 + 11 + 2 + 4 + 12 + 1 + 5 + 8 + 4 + 5 + 91 + 14 + 1 + 8 + 0 + 6 + 3 + 8 + 6 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 0 + 0 + 3 + 0 + 71 + 59 + 58 + 89 + 88 + 85 + 83 + 80 + 79 + 72 + 70 + 69 + 66 + 58 + 78 + 59 + 77 + 43 + 133 + 19 + 37 + 19 + 19 + 19 + 16 + 15 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 -75 m 128,-1,1 + 220 -75 220 -75 110 35 c 128,-1,2 + 0 145 0 145 0 300 c 128,-1,3 + 0 455 0 455 110 565 c 128,-1,4 + 220 675 220 675 375 675 c 128,-1,5 + 530 675 530 675 640 565 c 128,-1,6 + 750 455 750 455 750 300 c 128,-1,7 + 750 145 750 145 640 35 c 128,-1,0 + 530 -75 530 -75 375 -75 c 128,-1,1 +375 592 m 128,-1,9 + 254 592 254 592 168.5 506.5 c 128,-1,10 + 83 421 83 421 83 300 c 128,-1,11 + 83 179 83 179 168.5 93.5 c 128,-1,12 + 254 8 254 8 375 8 c 128,-1,13 + 496 8 496 8 581.5 93.5 c 128,-1,14 + 667 179 667 179 667 300 c 128,-1,15 + 667 421 667 421 581.5 506.5 c 128,-1,8 + 496 592 496 592 375 592 c 128,-1,9 +413 237 m 128,-1,17 + 413 251 413 251 420.5 262.5 c 128,-1,18 + 428 274 428 274 440 274 c 0,19,20 + 451 274 451 274 458.5 262.5 c 128,-1,21 + 466 251 466 251 466 237 c 128,-1,22 + 466 223 466 223 459 212 c 128,-1,23 + 452 201 452 201 440 201 c 128,-1,24 + 428 201 428 201 420.5 212 c 128,-1,16 + 413 223 413 223 413 237 c 128,-1,17 +532 369 m 1,25,26 + 562 336 562 336 562 290 c 0,27,28 + 562 221 562 221 527.5 183 c 128,-1,29 + 493 145 493 145 428 142 c 2,30,-1 + 410 142 l 1,31,-1 + 395 141 l 1,32,-1 + 375 141 l 1,33,-1 + 355 141 l 1,34,-1 + 340 142 l 1,35,-1 + 322 142 l 2,36,37 + 257 145 257 145 222.5 183.5 c 128,-1,38 + 188 222 188 222 188 290 c 0,39,40 + 188 336 188 336 218 369 c 1,41,42 + 214 371 214 371 217 402 c 0,43,44 + 220 432 220 432 231 459 c 1,45,46 + 271 454 271 454 324 417 c 1,47,48 + 344 422 344 422 375 422 c 0,49,50 + 408 422 408 422 426 417 c 1,51,52 + 476 452 476 452 509 457 c 2,53,-1 + 519 459 l 1,54,55 + 530 432 530 432 533 402 c 0,56,57 + 536 371 536 371 532 369 c 1,25,26 +376 160 m 2,58,59 + 445 160 445 160 478 176 c 0,60,61 + 513 193 513 193 513 243 c 0,62,63 + 513 265 513 265 499 283 c 128,-1,64 + 485 301 485 301 464 305 c 0,65,66 + 455 306 455 306 416.5 304 c 128,-1,67 + 378 302 378 302 376 302 c 0,68,69 + 368 302 368 302 340 304 c 2,70,-1 + 308 306 l 2,71,72 + 276 307 276 307 257 289.5 c 128,-1,73 + 238 272 238 272 238 243 c 0,74,75 + 238 192 238 192 272 176 c 0,76,77 + 305 160 305 160 374 160 c 2,78,-1 + 376 160 l 2,58,59 +311 274 m 1,79,80 + 322 274 322 274 329.5 262.5 c 128,-1,81 + 337 251 337 251 337 237 c 128,-1,82 + 337 223 337 223 329.5 212 c 128,-1,83 + 322 201 322 201 311 201 c 0,84,85 + 299 201 299 201 291.5 212 c 128,-1,86 + 284 223 284 223 284 237 c 128,-1,87 + 284 251 284 251 291.5 262.5 c 128,-1,88 + 299 274 299 274 311 274 c 1,89,-1 + 311 274 l 1,79,80 +EndSplineSet +EndChar + +StartChar: glyph233 +Encoding: 233 57577 234 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 71 + 37 + 33 + 27 + 10 + 4 + 5 + 3 + 1 + 66 + 42 + 31 + 2 + 3 + 64 + 0 + 3 + 0 + 5 + 0 + 3 + 5 + 91 + 8 + 6 + 2 + 0 + 7 + 1 + 1 + 4 + 0 + 1 + 91 + 9 + 1 + 4 + 2 + 2 + 4 + 79 + 9 + 1 + 4 + 4 + 2 + 83 + 0 + 2 + 4 + 2 + 71 + 47 + 46 + 78 + 77 + 74 + 72 + 69 + 68 + 59 + 54 + 46 + 67 + 47 + 66 + 43 + 134 + 35 + 34 + 10 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +351 202 m 128,-1,1 + 351 224 351 224 362.5 241.5 c 128,-1,2 + 374 259 374 259 393 259 c 0,3,4 + 411 259 411 259 422.5 241.5 c 128,-1,5 + 434 224 434 224 434 202 c 128,-1,6 + 434 180 434 180 422.5 162.5 c 128,-1,7 + 411 145 411 145 393 145 c 0,8,9 + 374 145 374 145 362.5 162.5 c 128,-1,0 + 351 180 351 180 351 202 c 128,-1,1 +536 408 m 1,10,11 + 583 356 583 356 583 285 c 0,12,13 + 583 156 583 156 505 98 c 0,14,15 + 453 59 453 59 375 55 c 2,16,-1 + 346 54 l 1,17,-1 + 323 53 l 1,18,-1 + 292 53 l 1,19,-1 + 260 53 l 1,20,-1 + 237 54 l 1,21,-1 + 209 55 l 2,22,23 + 109 60 109 60 54.5 119.5 c 128,-1,24 + 0 179 0 179 0 285 c 0,25,26 + 0 356 0 356 47 408 c 1,27,28 + 43 411 43 411 47 458 c 0,29,30 + 52 510 52 510 67 547 c 1,31,32 + 125 541 125 541 212 481 c 1,33,34 + 242 489 242 489 292 489 c 0,35,36 + 343 489 343 489 372 481 c 1,37,38 + 409 507 409 507 447 524 c 0,39,40 + 484 541 484 541 500 544 c 2,41,-1 + 516 547 l 1,42,43 + 532 507 532 507 537 458 c 0,44,45 + 541 412 541 412 536 408 c 1,10,11 +293 82 m 2,46,47 + 399 82 399 82 452 107 c 0,48,49 + 506 132 506 132 506 211 c 0,50,51 + 506 245 506 245 484 274 c 128,-1,52 + 462 303 462 303 430 308 c 0,53,54 + 416 310 416 310 355 307 c 128,-1,55 + 294 304 294 304 293 304 c 0,56,57 + 276 304 276 304 243.5 306 c 128,-1,58 + 211 308 211 308 191.5 308.5 c 128,-1,59 + 172 309 172 309 149 304 c 128,-1,60 + 126 299 126 299 112 287 c 0,61,62 + 79 257 79 257 79 211 c 0,63,64 + 79 132 79 132 132 107 c 0,65,66 + 183 82 183 82 290 82 c 2,67,-1 + 293 82 l 2,46,47 +192 259 m 1,68,69 + 210 259 210 259 221 241.5 c 128,-1,70 + 232 224 232 224 232 202 c 128,-1,71 + 232 180 232 180 221 162.5 c 128,-1,72 + 210 145 210 145 192 145 c 0,73,74 + 173 145 173 145 161 162.5 c 128,-1,75 + 149 180 149 180 149 202 c 128,-1,76 + 149 224 149 224 161 241.5 c 128,-1,77 + 173 259 173 259 192 259 c 1,78,-1 + 192 259 l 1,68,69 +EndSplineSet +EndChar + +StartChar: glyph234 +Encoding: 234 57578 235 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 53 + 1 + 11 + 4 + 40 + 1 + 14 + 2 + 66 + 1 + 7 + 8 + 3 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 77 + 0 + 16 + 0 + 17 + 3 + 16 + 17 + 91 + 0 + 3 + 6 + 1 + 4 + 11 + 3 + 4 + 91 + 12 + 1 + 10 + 13 + 1 + 9 + 2 + 10 + 9 + 89 + 19 + 1 + 5 + 0 + 2 + 14 + 5 + 2 + 91 + 0 + 11 + 0 + 14 + 1 + 11 + 14 + 89 + 0 + 1 + 0 + 8 + 7 + 1 + 8 + 91 + 20 + 1 + 7 + 0 + 0 + 18 + 7 + 0 + 91 + 0 + 18 + 15 + 15 + 18 + 79 + 0 + 18 + 18 + 15 + 83 + 0 + 15 + 18 + 15 + 71 +ELSE +MPPEM +PUSHB_1 + 11 +LT +IF +NPUSHB + 76 + 0 + 16 + 0 + 17 + 3 + 16 + 17 + 91 + 0 + 3 + 6 + 1 + 4 + 11 + 3 + 4 + 91 + 12 + 1 + 10 + 5 + 2 + 10 + 77 + 19 + 1 + 5 + 13 + 9 + 2 + 2 + 14 + 5 + 2 + 89 + 0 + 11 + 0 + 14 + 1 + 11 + 14 + 89 + 0 + 1 + 0 + 8 + 7 + 1 + 8 + 91 + 20 + 1 + 7 + 0 + 0 + 18 + 7 + 0 + 91 + 0 + 18 + 15 + 15 + 18 + 79 + 0 + 18 + 18 + 15 + 83 + 0 + 15 + 18 + 15 + 71 +ELSE +NPUSHB + 77 + 0 + 16 + 0 + 17 + 3 + 16 + 17 + 91 + 0 + 3 + 6 + 1 + 4 + 11 + 3 + 4 + 91 + 12 + 1 + 10 + 13 + 1 + 9 + 2 + 10 + 9 + 89 + 19 + 1 + 5 + 0 + 2 + 14 + 5 + 2 + 91 + 0 + 11 + 0 + 14 + 1 + 11 + 14 + 89 + 0 + 1 + 0 + 8 + 7 + 1 + 8 + 91 + 20 + 1 + 7 + 0 + 0 + 18 + 7 + 0 + 91 + 0 + 18 + 15 + 15 + 18 + 79 + 0 + 18 + 18 + 15 + 83 + 0 + 15 + 18 + 15 + 71 +EIF +EIF +NPUSHB + 43 + 57 + 56 + 44 + 43 + 102 + 101 + 98 + 97 + 94 + 93 + 90 + 89 + 88 + 87 + 86 + 85 + 84 + 83 + 82 + 81 + 80 + 79 + 78 + 77 + 64 + 62 + 56 + 76 + 57 + 76 + 50 + 48 + 43 + 55 + 44 + 55 + 17 + 37 + 36 + 21 + 42 + 21 + 20 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +408 254 m 2,0,1 + 411 251 411 251 417 245.5 c 128,-1,2 + 423 240 423 240 425.5 237 c 128,-1,3 + 428 234 428 234 433 228.5 c 128,-1,4 + 438 223 438 223 440.5 219.5 c 128,-1,5 + 443 216 443 216 445.5 210.5 c 128,-1,6 + 448 205 448 205 449 199.5 c 128,-1,7 + 450 194 450 194 450 188 c 0,8,9 + 450 151 450 151 415 123.5 c 128,-1,10 + 380 96 380 96 321 96 c 0,11,12 + 270 96 270 96 243.5 116.5 c 128,-1,13 + 217 137 217 137 217 167 c 0,14,15 + 217 203 217 203 254 225 c 0,16,17 + 295 246 295 246 350 246 c 1,18,19 + 333 263 333 263 333 279 c 0,20,21 + 333 291 333 291 338 296 c 1,22,-1 + 321 296 l 2,23,24 + 283 296 283 296 260.5 320 c 128,-1,25 + 238 344 238 344 238 375 c 0,26,27 + 238 415 238 415 271 442 c 0,28,29 + 306 467 306 467 358 467 c 2,30,-1 + 458 467 l 1,31,-1 + 429 450 l 1,32,-1 + 400 450 l 1,33,34 + 433 417 433 417 433 383 c 0,35,36 + 433 365 433 365 426.5 351 c 128,-1,37 + 420 337 420 337 413 330 c 128,-1,38 + 406 323 406 323 392 312 c 1,39,-1 + 379 288 l 2,40,41 + 379 280 379 280 392 267 c 2,42,-1 + 408 254 l 2,0,1 +342 308 m 0,43,44 + 362 308 362 308 375 321 c 128,-1,45 + 388 334 388 334 388 358 c 0,46,47 + 388 391 388 391 371 420.5 c 128,-1,48 + 354 450 354 450 325 450 c 0,49,50 + 309 450 309 450 292 433 c 0,51,52 + 286 427 286 427 279 396 c 1,53,54 + 279 366 279 366 296 337 c 128,-1,55 + 313 308 313 308 342 308 c 0,43,44 +346 112 m 0,56,57 + 380 112 380 112 398.5 126 c 128,-1,58 + 417 140 417 140 417 162 c 0,59,60 + 417 180 417 180 404.5 194.5 c 128,-1,61 + 392 209 392 209 362 229 c 1,62,-1 + 350 229 l 2,63,64 + 321 229 321 229 300 221 c 2,65,-1 + 296 219 l 2,66,67 + 292 217 292 217 290 216 c 128,-1,68 + 288 215 288 215 283.5 212 c 128,-1,69 + 279 209 279 209 276 206.5 c 128,-1,70 + 273 204 273 204 269.5 200 c 128,-1,71 + 266 196 266 196 263.5 192 c 128,-1,72 + 261 188 261 188 259.5 182.5 c 128,-1,73 + 258 177 258 177 258 171 c 0,74,75 + 258 146 258 146 282 129 c 128,-1,76 + 306 112 306 112 346 112 c 0,56,57 +500 300 m 1,77,-1 + 458 300 l 1,78,-1 + 458 342 l 1,79,-1 + 500 342 l 1,80,-1 + 500 383 l 1,81,-1 + 542 383 l 1,82,-1 + 542 342 l 1,83,-1 + 583 342 l 1,84,-1 + 583 300 l 1,85,-1 + 542 300 l 1,86,-1 + 542 258 l 1,87,-1 + 500 258 l 1,88,-1 + 500 300 l 1,77,-1 +375 -75 m 128,-1,90 + 219 -75 219 -75 109.5 34.5 c 128,-1,91 + 0 144 0 144 0 300 c 128,-1,92 + 0 456 0 456 109.5 565.5 c 128,-1,93 + 219 675 219 675 375 675 c 128,-1,94 + 531 675 531 675 640.5 565.5 c 128,-1,95 + 750 456 750 456 750 300 c 128,-1,96 + 750 144 750 144 640.5 34.5 c 128,-1,89 + 531 -75 531 -75 375 -75 c 128,-1,90 +375 592 m 128,-1,98 + 254 592 254 592 168.5 507 c 128,-1,99 + 83 422 83 422 83 300 c 128,-1,100 + 83 178 83 178 168.5 93 c 128,-1,101 + 254 8 254 8 375 8 c 128,-1,102 + 496 8 496 8 581.5 93 c 128,-1,103 + 667 178 667 178 667 300 c 128,-1,104 + 667 422 667 422 581.5 507 c 128,-1,97 + 496 592 496 592 375 592 c 128,-1,98 +EndSplineSet +EndChar + +StartChar: glyph235 +Encoding: 235 57579 236 +Width: 617 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 11 + 77 + 76 + 2 + 9 + 3 + 15 + 1 + 12 + 8 + 2 + 66 +MPPEM +PUSHB_1 + 12 +LT +IF +NPUSHB + 66 + 0 + 3 + 5 + 9 + 5 + 3 + 96 + 0 + 12 + 8 + 7 + 8 + 12 + 7 + 104 + 0 + 7 + 6 + 1 + 7 + 94 + 0 + 2 + 0 + 5 + 3 + 2 + 5 + 91 + 13 + 1 + 4 + 0 + 1 + 8 + 4 + 1 + 91 + 10 + 1 + 9 + 11 + 1 + 8 + 12 + 9 + 8 + 89 + 14 + 1 + 6 + 0 + 0 + 6 + 79 + 14 + 1 + 6 + 6 + 0 + 83 + 0 + 0 + 6 + 0 + 71 +ELSE +NPUSHB + 67 + 0 + 3 + 5 + 9 + 5 + 3 + 96 + 0 + 12 + 8 + 7 + 8 + 12 + 7 + 104 + 0 + 7 + 6 + 8 + 7 + 6 + 102 + 0 + 2 + 0 + 5 + 3 + 2 + 5 + 91 + 13 + 1 + 4 + 0 + 1 + 8 + 4 + 1 + 91 + 10 + 1 + 9 + 11 + 1 + 8 + 12 + 9 + 8 + 89 + 14 + 1 + 6 + 0 + 0 + 6 + 79 + 14 + 1 + 6 + 6 + 0 + 83 + 0 + 0 + 6 + 0 + 71 +EIF +NPUSHB + 32 + 58 + 57 + 42 + 41 + 83 + 82 + 81 + 80 + 79 + 78 + 75 + 74 + 73 + 72 + 65 + 63 + 57 + 71 + 58 + 71 + 50 + 48 + 41 + 56 + 42 + 56 + 17 + 37 + 42 + 39 + 15 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +321 238 m 2,0,1 + 342 220 342 220 349 213 c 128,-1,2 + 356 206 356 206 369.5 190.5 c 128,-1,3 + 383 175 383 175 387.5 159.5 c 128,-1,4 + 392 144 392 144 392 125 c 0,5,6 + 392 64 392 64 333.5 17.5 c 128,-1,7 + 275 -29 275 -29 175 -29 c 0,8,9 + 91 -29 91 -29 45.5 4.5 c 128,-1,10 + 0 38 0 38 0 88 c 0,11,12 + 0 152 0 152 62 188 c 0,13,14 + 109 213 109 213 221 225 c 1,15,16 + 196 250 196 250 196 279 c 0,17,18 + 196 292 196 292 204 308 c 1,19,-1 + 179 308 l 2,20,21 + 117 308 117 308 79.5 348 c 128,-1,22 + 42 388 42 388 42 438 c 0,23,24 + 42 502 42 502 92 546 c 0,25,26 + 148 592 148 592 238 592 c 2,27,-1 + 408 592 l 1,28,-1 + 358 562 l 1,29,-1 + 308 562 l 1,30,31 + 367 514 367 514 367 450 c 0,32,33 + 367 421 367 421 355 397 c 128,-1,34 + 343 373 343 373 330.5 361.5 c 128,-1,35 + 318 350 318 350 296 333 c 0,36,37 + 271 308 271 308 271 292 c 0,38,39 + 271 279 271 279 292 258 c 1,40,-1 + 321 238 l 2,0,1 +217 329 m 0,41,42 + 230 329 230 329 246 337.5 c 128,-1,43 + 262 346 262 346 271 358 c 0,44,45 + 292 375 292 375 292 417 c 0,46,47 + 292 468 292 468 263 517.5 c 128,-1,48 + 234 567 234 567 188 567 c 0,49,50 + 172 567 172 567 155 559 c 128,-1,51 + 138 551 138 551 129 538 c 0,52,53 + 112 508 112 508 112 475 c 0,54,55 + 112 426 112 426 140.5 377.5 c 128,-1,56 + 169 329 169 329 217 329 c 0,41,42 +217 0 m 0,57,58 + 274 0 274 0 306 24.5 c 128,-1,59 + 338 49 338 49 338 88 c 0,60,61 + 338 117 338 117 320.5 137 c 128,-1,62 + 303 157 303 157 250 196 c 1,63,-1 + 229 196 l 2,64,65 + 178 196 178 196 142 183 c 0,66,67 + 119 178 119 178 95 158 c 128,-1,68 + 71 138 71 138 71 100 c 0,69,70 + 71 56 71 56 111.5 28 c 128,-1,71 + 152 0 152 0 217 0 c 0,57,58 +492 300 m 1,72,-1 + 408 300 l 1,73,-1 + 408 342 l 1,74,-1 + 492 342 l 1,75,-1 + 492 421 l 1,76,-1 + 533 425 l 1,77,-1 + 533 342 l 1,78,-1 + 617 342 l 1,79,-1 + 617 300 l 1,80,-1 + 533 300 l 1,81,-1 + 533 217 l 1,82,-1 + 492 217 l 1,83,-1 + 492 300 l 1,72,-1 +EndSplineSet +EndChar + +StartChar: glyph236 +Encoding: 236 57580 237 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 48 + 0 + 5 + 0 + 4 + 2 + 5 + 96 + 0 + 0 + 0 + 2 + 7 + 0 + 2 + 91 + 0 + 4 + 9 + 1 + 7 + 3 + 4 + 7 + 89 + 0 + 3 + 0 + 8 + 6 + 3 + 8 + 91 + 0 + 6 + 1 + 1 + 6 + 79 + 0 + 6 + 6 + 1 + 83 + 0 + 1 + 6 + 1 + 71 +ELSE +NPUSHB + 49 + 0 + 5 + 0 + 4 + 0 + 5 + 4 + 104 + 0 + 0 + 0 + 2 + 7 + 0 + 2 + 91 + 0 + 4 + 9 + 1 + 7 + 3 + 4 + 7 + 89 + 0 + 3 + 0 + 8 + 6 + 3 + 8 + 91 + 0 + 6 + 1 + 1 + 6 + 79 + 0 + 6 + 6 + 1 + 83 + 0 + 1 + 6 + 1 + 71 +EIF +NPUSHB + 13 + 36 + 35 + 18 + 18 + 18 + 19 + 37 + 19 + 19 + 19 + 16 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 675 m 128,-1,1 + 531 675 531 675 640.5 565.5 c 128,-1,2 + 750 456 750 456 750 300 c 128,-1,3 + 750 144 750 144 640.5 34.5 c 128,-1,4 + 531 -75 531 -75 375 -75 c 128,-1,5 + 219 -75 219 -75 109.5 34.5 c 128,-1,6 + 0 144 0 144 0 300 c 128,-1,7 + 0 456 0 456 109.5 565.5 c 128,-1,0 + 219 675 219 675 375 675 c 128,-1,1 +375 383 m 128,-1,9 + 340 383 340 383 316 358.5 c 128,-1,10 + 292 334 292 334 292 300 c 128,-1,11 + 292 266 292 266 316 241.5 c 128,-1,12 + 340 217 340 217 375 217 c 128,-1,13 + 410 217 410 217 434 241.5 c 128,-1,14 + 458 266 458 266 458 300 c 128,-1,15 + 458 334 458 334 434 358.5 c 128,-1,8 + 410 383 410 383 375 383 c 128,-1,9 +492 467 m 0,16,17 + 492 445 492 445 506 431 c 128,-1,18 + 520 417 520 417 542 417 c 0,19,20 + 563 417 563 417 577.5 432.5 c 128,-1,21 + 592 448 592 448 592 467 c 128,-1,22 + 592 486 592 486 576.5 501.5 c 128,-1,23 + 561 517 561 517 542 517 c 128,-1,24 + 523 517 523 517 507.5 502.5 c 128,-1,25 + 492 488 492 488 492 467 c 0,16,17 +375 8 m 128,-1,27 + 496 8 496 8 581.5 93 c 128,-1,28 + 667 178 667 178 667 300 c 1,29,-1 + 542 300 l 1,30,31 + 542 231 542 231 493 182 c 128,-1,32 + 444 133 444 133 375 133 c 128,-1,33 + 306 133 306 133 257 182 c 128,-1,34 + 208 231 208 231 208 300 c 1,35,-1 + 83 300 l 1,36,37 + 83 178 83 178 168.5 93 c 128,-1,26 + 254 8 254 8 375 8 c 128,-1,27 +EndSplineSet +EndChar + +StartChar: glyph237 +Encoding: 237 57581 238 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 51 + 0 + 2 + 4 + 7 + 5 + 2 + 96 + 10 + 1 + 0 + 0 + 5 + 4 + 0 + 5 + 91 + 0 + 4 + 9 + 1 + 7 + 3 + 4 + 7 + 89 + 0 + 3 + 0 + 8 + 6 + 3 + 8 + 91 + 11 + 1 + 6 + 1 + 1 + 6 + 79 + 11 + 1 + 6 + 6 + 1 + 83 + 0 + 1 + 6 + 1 + 71 +ELSE +NPUSHB + 52 + 0 + 2 + 4 + 7 + 4 + 2 + 7 + 104 + 10 + 1 + 0 + 0 + 5 + 4 + 0 + 5 + 91 + 0 + 4 + 9 + 1 + 7 + 3 + 4 + 7 + 89 + 0 + 3 + 0 + 8 + 6 + 3 + 8 + 91 + 11 + 1 + 6 + 1 + 1 + 6 + 79 + 11 + 1 + 6 + 6 + 1 + 83 + 0 + 1 + 6 + 1 + 71 +EIF +NPUSHB + 30 + 35 + 34 + 1 + 0 + 45 + 44 + 42 + 41 + 39 + 38 + 34 + 49 + 35 + 48 + 32 + 31 + 28 + 26 + 21 + 20 + 17 + 16 + 9 + 6 + 0 + 15 + 1 + 14 + 12 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 675 m 2,0,1 + 678 675 678 675 714 639 c 128,-1,2 + 750 603 750 603 750 550 c 2,3,-1 + 750 50 l 2,4,5 + 750 -3 750 -3 714 -39 c 128,-1,6 + 678 -75 678 -75 625 -75 c 2,7,-1 + 125 -75 l 2,8,9 + 72 -75 72 -75 36 -39 c 128,-1,10 + 0 -3 0 -3 0 50 c 2,11,-1 + 0 550 l 2,12,13 + 0 603 0 603 36 639 c 128,-1,14 + 72 675 72 675 125 675 c 2,15,-1 + 625 675 l 2,0,1 +375 425 m 128,-1,17 + 322 425 322 425 286 389 c 128,-1,18 + 250 353 250 353 250 300 c 128,-1,19 + 250 247 250 247 286 211 c 128,-1,20 + 322 175 322 175 375 175 c 128,-1,21 + 428 175 428 175 464 211 c 128,-1,22 + 500 247 500 247 500 300 c 128,-1,23 + 500 353 500 353 464 389 c 128,-1,16 + 428 425 428 425 375 425 c 128,-1,17 +533 508 m 0,24,25 + 533 486 533 486 547 472 c 128,-1,26 + 561 458 561 458 583 458 c 0,27,28 + 604 458 604 458 618.5 473.5 c 128,-1,29 + 633 489 633 489 633 508 c 128,-1,30 + 633 527 633 527 617.5 542.5 c 128,-1,31 + 602 558 602 558 583 558 c 128,-1,32 + 564 558 564 558 548.5 543.5 c 128,-1,33 + 533 529 533 529 533 508 c 0,24,25 +625 8 m 2,34,35 + 644 8 644 8 655.5 19.5 c 128,-1,36 + 667 31 667 31 667 50 c 2,37,-1 + 667 300 l 1,38,-1 + 583 300 l 1,39,40 + 583 212 583 212 523 152 c 128,-1,41 + 463 92 463 92 375 92 c 128,-1,42 + 287 92 287 92 227 152 c 128,-1,43 + 167 212 167 212 167 300 c 1,44,-1 + 83 300 l 1,45,-1 + 83 50 l 2,46,47 + 83 31 83 31 94.5 19.5 c 128,-1,48 + 106 8 106 8 125 8 c 2,49,-1 + 625 8 l 2,34,35 +EndSplineSet +EndChar + +StartChar: glyph238 +Encoding: 238 57582 239 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 103 + 65 + 39 + 38 + 3 + 7 + 5 + 64 + 1 + 4 + 7 + 2 + 66 + 8 + 1 + 6 + 2 + 5 + 2 + 6 + 5 + 104 + 12 + 9 + 2 + 4 + 7 + 3 + 7 + 4 + 3 + 104 + 0 + 1 + 14 + 1 + 2 + 6 + 1 + 2 + 91 + 11 + 1 + 5 + 10 + 1 + 7 + 4 + 5 + 7 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 84 + 13 + 1 + 0 + 3 + 0 + 72 + 16 + 15 + 1 + 0 + 80 + 79 + 74 + 72 + 68 + 66 + 63 + 61 + 57 + 55 + 51 + 49 + 42 + 40 + 37 + 35 + 28 + 27 + 22 + 20 + 15 + 26 + 16 + 26 + 9 + 7 + 0 + 14 + 1 + 14 + 15 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 -75 m 0,0,1 + 219 -75 219 -75 109 35 c 0,2,3 + 0 144 0 144 0 300 c 0,4,5 + 0 457 0 457 109 566 c 0,6,7 + 217 675 217 675 375 675 c 0,8,9 + 531 675 531 675 640 566 c 0,10,11 + 750 456 750 456 750 300 c 0,12,13 + 750 145 750 145 640 35 c 128,-1,14 + 530 -75 530 -75 375 -75 c 0,0,1 +375 592 m 0,15,16 + 253 592 253 592 168 507 c 128,-1,17 + 83 422 83 422 83 300 c 0,18,19 + 83 180 83 180 168 94 c 128,-1,20 + 253 8 253 8 375 8 c 0,21,22 + 495 8 495 8 581 94 c 128,-1,23 + 667 180 667 180 667 300 c 0,24,25 + 667 422 667 422 581 507 c 128,-1,26 + 495 592 495 592 375 592 c 0,15,16 +467 203 m 1,27,28 + 550 203 550 203 550 258 c 0,29,30 + 550 305 550 305 497 317 c 2,31,-1 + 471 322 l 2,32,33 + 449 328 449 328 449 346 c 0,34,35 + 449 367 449 367 476 367 c 0,36,37 + 506 367 506 367 508 343 c 1,38,-1 + 549 347 l 1,39,40 + 544 399 544 399 479 399 c 0,41,42 + 408 399 408 399 408 340 c 0,43,44 + 408 297 408 297 454 287 c 2,45,-1 + 482 282 l 2,46,47 + 510 274 510 274 510 257 c 0,48,49 + 510 235 510 235 467 235 c 0,50,51 + 414 235 414 235 397 286 c 2,52,-1 + 383 326 l 2,53,54 + 371 366 371 366 353 382.5 c 128,-1,55 + 335 399 335 399 293 399 c 0,56,57 + 253 399 253 399 226 369 c 128,-1,58 + 199 339 199 339 199 297 c 0,59,60 + 199 257 199 257 225 230 c 128,-1,61 + 251 203 251 203 290 203 c 0,62,63 + 328 203 328 203 350 221 c 1,64,-1 + 338 256 l 1,65,66 + 318 236 318 236 292 236 c 0,67,68 + 268 236 268 236 252.5 254.5 c 128,-1,69 + 237 273 237 273 237 299 c 0,70,71 + 237 329 237 329 252 347 c 128,-1,72 + 267 365 267 365 294 365 c 0,73,74 + 311 365 311 365 321.5 357.5 c 128,-1,75 + 332 350 332 350 336.5 341.5 c 128,-1,76 + 341 333 341 333 347 314 c 2,77,-1 + 360 274 l 2,78,79 + 383 203 383 203 467 203 c 1,80,-1 + 467 203 l 1,27,28 +EndSplineSet +EndChar + +StartChar: glyph239 +Encoding: 239 57583 240 +Width: 625 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 53 + 41 + 12 + 11 + 3 + 3 + 1 + 40 + 1 + 0 + 3 + 2 + 66 + 4 + 1 + 2 + 7 + 1 + 1 + 3 + 2 + 1 + 91 + 6 + 1 + 3 + 0 + 0 + 3 + 79 + 6 + 1 + 3 + 3 + 0 + 83 + 8 + 5 + 2 + 0 + 3 + 0 + 71 + 21 + 37 + 35 + 38 + 37 + 39 + 35 + 39 + 16 + 9 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +477 126 m 1,0,1 + 625 126 625 126 625 225 c 0,2,3 + 625 306 625 306 531 328 c 2,4,-1 + 484 338 l 2,5,6 + 445 348 445 348 445 380 c 0,7,8 + 445 417 445 417 494 417 c 0,9,10 + 548 417 548 417 551 375 c 1,11,-1 + 623 383 l 1,12,13 + 616 474 616 474 499 474 c 0,14,15 + 373 474 373 474 373 370 c 0,16,17 + 373 296 373 296 455 276 c 1,18,-1 + 504 267 l 2,19,20 + 554 255 554 255 554 222 c 0,21,22 + 554 183 554 183 477 183 c 0,23,24 + 383 183 383 183 353 274 c 2,25,-1 + 329 346 l 2,26,27 + 307 417 307 417 273 446 c 0,28,29 + 241 474 241 474 168 474 c 0,30,31 + 101 474 101 474 51 425 c 0,32,33 + 0 376 0 376 0 294 c 0,34,35 + 0 217 0 217 48 172 c 0,36,37 + 95 126 95 126 163 126 c 0,38,39 + 229 126 229 126 269 158 c 1,40,-1 + 247 220 l 1,41,42 + 212 185 212 185 166 185 c 0,43,44 + 124 185 124 185 96.5 217.5 c 128,-1,45 + 69 250 69 250 69 296 c 0,46,47 + 69 358 69 358 100 386 c 0,48,49 + 132 415 132 415 170 415 c 0,50,51 + 212 415 212 415 231 393 c 0,52,53 + 248 371 248 371 264 323 c 2,54,-1 + 287 252 l 2,55,56 + 326 126 326 126 477 126 c 1,57,-1 + 477 126 l 1,0,1 +EndSplineSet +EndChar + +StartChar: glyph240 +Encoding: 240 57584 241 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 86 + 30 + 1 + 6 + 1 + 1 + 66 + 0 + 10 + 0 + 11 + 2 + 10 + 11 + 91 + 0 + 2 + 0 + 3 + 4 + 2 + 3 + 91 + 13 + 1 + 4 + 0 + 6 + 0 + 4 + 6 + 91 + 8 + 1 + 1 + 7 + 5 + 2 + 0 + 12 + 1 + 0 + 89 + 0 + 12 + 9 + 9 + 12 + 79 + 0 + 12 + 12 + 9 + 83 + 0 + 9 + 12 + 9 + 71 + 13 + 12 + 45 + 44 + 41 + 40 + 37 + 36 + 33 + 32 + 29 + 28 + 25 + 24 + 21 + 19 + 17 + 16 + 12 + 31 + 13 + 31 + 18 + 35 + 17 + 16 + 14 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +293 162 m 1,0,-1 + 226 162 l 1,1,-1 + 226 379 l 1,2,-1 + 293 379 l 1,3,-1 + 293 162 l 1,0,-1 +224 440 m 0,4,5 + 224 454 224 454 234.5 464 c 128,-1,6 + 245 474 245 474 260 474 c 0,7,8 + 296 474 296 474 296 440 c 0,9,10 + 296 407 296 407 260 407 c 128,-1,11 + 224 407 224 407 224 440 c 0,4,5 +462 385 m 0,12,13 + 500 385 500 385 520 359 c 128,-1,14 + 540 333 540 333 540 290 c 2,15,-1 + 540 162 l 1,16,-1 + 472 162 l 1,17,-1 + 472 283 l 2,18,19 + 472 331 472 331 439 331 c 0,20,21 + 422 331 422 331 411.5 319.5 c 128,-1,22 + 401 308 401 308 401 288 c 2,23,-1 + 401 162 l 1,24,-1 + 333 162 l 1,25,-1 + 333 310 l 2,26,27 + 333 366 333 366 332 379 c 1,28,-1 + 390 379 l 1,29,-1 + 394 350 l 1,30,31 + 417 385 417 385 462 385 c 0,12,13 +375 -75 m 128,-1,33 + 220 -75 220 -75 110 35 c 128,-1,34 + 0 145 0 145 0 300 c 128,-1,35 + 0 455 0 455 110 565 c 128,-1,36 + 220 675 220 675 375 675 c 128,-1,37 + 530 675 530 675 640 565 c 128,-1,38 + 750 455 750 455 750 300 c 128,-1,39 + 750 145 750 145 640 35 c 128,-1,32 + 530 -75 530 -75 375 -75 c 128,-1,33 +375 592 m 128,-1,41 + 254 592 254 592 168.5 506.5 c 128,-1,42 + 83 421 83 421 83 300 c 128,-1,43 + 83 179 83 179 168.5 93.5 c 128,-1,44 + 254 8 254 8 375 8 c 128,-1,45 + 496 8 496 8 581.5 93.5 c 128,-1,46 + 667 179 667 179 667 300 c 128,-1,47 + 667 421 667 421 581.5 506.5 c 128,-1,40 + 496 592 496 592 375 592 c 128,-1,41 +EndSplineSet +EndChar + +StartChar: glyph241 +Encoding: 241 57585 242 +Width: 585 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 14 + 1 + 0 + 4 + 1 + 66 + 0 + 7 + 2 + 4 + 2 + 7 + 4 + 104 + 0 + 8 + 0 + 9 + 1 + 8 + 9 + 91 + 6 + 1 + 1 + 2 + 0 + 1 + 77 + 10 + 1 + 2 + 0 + 4 + 0 + 2 + 4 + 91 + 6 + 1 + 1 + 1 + 0 + 81 + 5 + 3 + 2 + 0 + 1 + 0 + 69 + 5 + 4 + 30 + 28 + 26 + 24 + 21 + 20 + 19 + 18 + 16 + 15 + 13 + 11 + 9 + 8 + 4 + 22 + 5 + 22 + 17 + 16 + 11 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +127 8 m 1,0,-1 + 2 8 l 1,1,-1 + 2 425 l 1,2,-1 + 127 425 l 1,3,-1 + 127 8 l 1,0,-1 +442 412 m 0,4,5 + 512 412 512 412 548.5 367 c 128,-1,6 + 585 322 585 322 585 244 c 2,7,-1 + 585 8 l 1,8,-1 + 460 8 l 1,9,-1 + 460 231 l 2,10,11 + 460 318 460 318 399 318 c 0,12,13 + 350 318 350 318 335 269 c 1,14,-1 + 335 8 l 1,15,-1 + 210 8 l 1,16,17 + 212 383 212 383 210 425 c 1,18,-1 + 309 425 l 1,19,-1 + 317 342 l 1,20,-1 + 319 342 l 1,21,22 + 362 412 362 412 442 412 c 0,4,5 +0 529 m 0,23,24 + 0 592 0 592 65 592 c 0,25,26 + 129 592 129 592 129 529 c 0,27,28 + 129 467 129 467 65 467 c 0,29,30 + 0 467 0 467 0 529 c 0,23,24 +EndSplineSet +EndChar + +StartChar: glyph242 +Encoding: 242 57586 243 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 79 + 39 + 1 + 7 + 6 + 36 + 1 + 3 + 5 + 2 + 66 + 0 + 6 + 8 + 7 + 8 + 6 + 7 + 104 + 0 + 1 + 0 + 2 + 4 + 1 + 2 + 91 + 9 + 1 + 4 + 0 + 8 + 6 + 4 + 8 + 91 + 0 + 7 + 0 + 5 + 3 + 7 + 5 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 84 + 0 + 0 + 3 + 0 + 72 + 17 + 16 + 59 + 57 + 53 + 51 + 45 + 43 + 23 + 21 + 16 + 72 + 17 + 72 + 19 + 19 + 19 + 16 + 10 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 -75 m 128,-1,1 + 220 -75 220 -75 110 35 c 128,-1,2 + 0 145 0 145 0 300 c 128,-1,3 + 0 455 0 455 110 565 c 128,-1,4 + 220 675 220 675 375 675 c 128,-1,5 + 530 675 530 675 640 565 c 128,-1,6 + 750 455 750 455 750 300 c 128,-1,7 + 750 145 750 145 640 35 c 128,-1,0 + 530 -75 530 -75 375 -75 c 128,-1,1 +375 592 m 128,-1,9 + 254 592 254 592 168.5 506.5 c 128,-1,10 + 83 421 83 421 83 300 c 128,-1,11 + 83 179 83 179 168.5 93.5 c 128,-1,12 + 254 8 254 8 375 8 c 128,-1,13 + 496 8 496 8 581.5 93.5 c 128,-1,14 + 667 179 667 179 667 300 c 128,-1,15 + 667 421 667 421 581.5 506.5 c 128,-1,8 + 496 592 496 592 375 592 c 128,-1,9 +389 467 m 0,16,17 + 449 467 449 467 487.5 430 c 128,-1,18 + 526 393 526 393 526 343 c 0,19,20 + 526 279 526 279 493.5 236.5 c 128,-1,21 + 461 194 461 194 409 194 c 0,22,23 + 392 194 392 194 377 202 c 128,-1,24 + 362 210 362 210 356 221 c 0,25,26 + 355 222 355 222 354.5 219 c 128,-1,27 + 354 216 354 216 353 209.5 c 128,-1,28 + 352 203 352 203 350 194 c 128,-1,29 + 348 185 348 185 344.5 172.5 c 128,-1,30 + 341 160 341 160 335.5 147.5 c 128,-1,31 + 330 135 330 135 321.5 120 c 128,-1,32 + 313 105 313 105 302 91 c 0,33,34 + 300 89 300 89 298.5 89.5 c 128,-1,35 + 297 90 297 90 297 92 c 0,36,37 + 288 130 288 130 298 175 c 2,38,-1 + 325 292 l 1,39,40 + 318 307 318 307 318 327 c 0,41,42 + 318 351 318 351 330.5 367 c 128,-1,43 + 343 383 343 383 360 383 c 0,44,45 + 389 383 389 383 389 350 c 0,46,47 + 389 338 389 338 380.5 309 c 128,-1,48 + 372 280 372 280 370 273 c 0,49,50 + 366 256 366 256 376.5 244 c 128,-1,51 + 387 232 387 232 404 232 c 0,52,53 + 434 232 434 232 453.5 265.5 c 128,-1,54 + 473 299 473 299 473 347 c 0,55,56 + 473 383 473 383 449 406.5 c 128,-1,57 + 425 430 425 430 383 430 c 0,58,59 + 335 430 335 430 305.5 399.5 c 128,-1,60 + 276 369 276 369 276 326 c 0,61,62 + 276 301 276 301 291 284 c 0,63,64 + 295 279 295 279 294 272 c 2,65,-1 + 289 254 l 2,66,67 + 287 246 287 246 279 249 c 0,68,69 + 234 267 234 267 234 332 c 0,70,71 + 234 383 234 383 275.5 425 c 128,-1,72 + 317 467 317 467 389 467 c 0,16,17 +EndSplineSet +EndChar + +StartChar: glyph243 +Encoding: 243 57587 244 +Width: 500 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 18 + 1 + 3 + 2 + 9 + 1 + 1 + 3 + 2 + 66 + 0 + 2 + 4 + 3 + 4 + 2 + 3 + 104 + 5 + 1 + 0 + 0 + 4 + 2 + 0 + 4 + 91 + 0 + 3 + 1 + 1 + 3 + 79 + 0 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 + 1 + 0 + 40 + 38 + 34 + 32 + 24 + 22 + 7 + 5 + 0 + 53 + 1 + 53 + 6 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +265 601 m 0,0,1 + 368 601 368 601 434 538 c 128,-1,2 + 500 475 500 475 500 389 c 0,3,4 + 500 278 500 278 444 206 c 128,-1,5 + 388 134 388 134 300 134 c 0,6,7 + 271 134 271 134 245 148 c 128,-1,8 + 219 162 219 162 209 181 c 1,9,10 + 188 95 188 95 183 79 c 0,11,12 + 167 21 167 21 116 -43 c 0,13,14 + 110 -49 110 -49 108 -41 c 0,15,16 + 96 44 96 44 109 100 c 2,17,-1 + 156 303 l 1,18,19 + 144 326 144 326 144 361 c 0,20,21 + 144 402 144 402 165 429.5 c 128,-1,22 + 186 457 186 457 216 457 c 0,23,24 + 240 457 240 457 253 441.5 c 128,-1,25 + 266 426 266 426 266 402 c 0,26,27 + 266 387 266 387 260.5 365.5 c 128,-1,28 + 255 344 255 344 246 315.5 c 128,-1,29 + 237 287 237 287 233 270 c 0,30,31 + 226 241 226 241 244 219.5 c 128,-1,32 + 262 198 262 198 292 198 c 0,33,34 + 343 198 343 198 376 256 c 128,-1,35 + 409 314 409 314 409 396 c 0,36,37 + 409 459 409 459 368.5 498.5 c 128,-1,38 + 328 538 328 538 255 538 c 0,39,40 + 173 538 173 538 122.5 485.5 c 128,-1,41 + 72 433 72 433 72 360 c 0,42,43 + 72 317 72 317 97 287 c 0,44,45 + 105 277 105 277 102 267 c 2,46,-1 + 95 237 l 2,47,48 + 91 221 91 221 76 228 c 0,49,50 + 0 259 0 259 0 369 c 0,51,52 + 0 457 0 457 71 529 c 128,-1,53 + 142 601 142 601 265 601 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph244 +Encoding: 244 57588 245 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 145 + 13 + 1 + 7 + 1 + 115 + 20 + 2 + 6 + 8 + 99 + 5 + 2 + 5 + 4 + 28 + 1 + 3 + 10 + 107 + 1 + 14 + 0 + 5 + 66 + 0 + 8 + 9 + 6 + 9 + 8 + 6 + 104 + 0 + 6 + 4 + 9 + 6 + 4 + 102 + 0 + 4 + 5 + 9 + 4 + 5 + 102 + 16 + 1 + 11 + 0 + 2 + 1 + 11 + 2 + 91 + 0 + 12 + 0 + 1 + 7 + 12 + 1 + 91 + 0 + 7 + 0 + 9 + 8 + 7 + 9 + 91 + 0 + 5 + 0 + 10 + 3 + 5 + 10 + 91 + 15 + 1 + 0 + 14 + 13 + 0 + 79 + 0 + 3 + 0 + 14 + 13 + 3 + 14 + 92 + 15 + 1 + 0 + 0 + 13 + 83 + 0 + 13 + 0 + 13 + 71 + 90 + 89 + 1 + 0 + 110 + 108 + 106 + 104 + 94 + 92 + 89 + 120 + 90 + 120 + 86 + 84 + 70 + 68 + 64 + 62 + 57 + 55 + 48 + 47 + 40 + 38 + 34 + 32 + 27 + 25 + 16 + 14 + 12 + 10 + 0 + 29 + 1 + 29 + 17 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +506 -17 m 0,0,1 + 572 -17 572 -17 619.5 32.5 c 128,-1,2 + 667 82 667 82 667 149 c 0,3,4 + 667 185 667 185 650 224 c 1,5,6 + 656 255 656 255 656 285 c 0,7,8 + 656 404 656 404 575 488 c 0,9,10 + 495 571 495 571 379 571 c 0,11,12 + 354 571 354 571 331 566 c 1,13,14 + 291 592 291 592 244 592 c 0,15,16 + 177 592 177 592 130 543.5 c 128,-1,17 + 83 495 83 495 83 427 c 0,18,19 + 83 380 83 380 106 342 c 1,20,21 + 100 312 100 312 100 285 c 0,22,23 + 100 167 100 167 182 82 c 0,24,25 + 263 -2 263 -2 379 -2 c 0,26,27 + 393 -2 393 -2 430 3 c 1,28,29 + 464 -17 464 -17 506 -17 c 0,0,1 +214 204 m 0,30,31 + 214 220 214 220 225.5 231 c 128,-1,32 + 237 242 237 242 254 242 c 0,33,34 + 283 242 283 242 295 207 c 0,35,36 + 299 203 299 203 312 178 c 1,37,38 + 330 153 330 153 375 153 c 0,39,40 + 406 153 406 153 429 166 c 128,-1,41 + 452 179 452 179 452 204 c 0,42,43 + 452 233 452 233 412 248 c 1,44,-1 + 398 251 l 1,45,-1 + 379 256 l 2,46,47 + 363 261 363 261 361 261 c 0,48,49 + 319 270 319 270 287 284 c 0,50,51 + 260 295 260 295 241 318.5 c 128,-1,52 + 222 342 222 342 222 376 c 0,53,54 + 222 431 222 431 266 458.5 c 128,-1,55 + 310 486 310 486 376 486 c 0,56,57 + 446 486 446 486 488 453 c 1,58,59 + 523 420 523 420 523 390 c 0,60,61 + 523 374 523 374 511 361.5 c 128,-1,62 + 499 349 499 349 483 349 c 0,63,64 + 472 349 472 349 464 354 c 128,-1,65 + 456 359 456 359 452.5 363.5 c 128,-1,66 + 449 368 449 368 442 380 c 0,67,68 + 424 423 424 423 371 423 c 0,69,70 + 345 423 345 423 325 412.5 c 128,-1,71 + 305 402 305 402 305 384 c 0,72,73 + 305 368 305 368 317 359.5 c 128,-1,74 + 329 351 329 351 350 344 c 2,75,-1 + 367 340 l 2,76,77 + 445 321 445 321 450 319 c 0,78,79 + 510 298 510 298 530 262 c 0,80,81 + 540 241 540 241 540 211 c 0,82,83 + 540 151 540 151 494.5 119.5 c 128,-1,84 + 449 88 449 88 378 88 c 0,85,86 + 274 88 274 88 232 152 c 0,87,88 + 214 180 214 180 214 204 c 0,30,31 +244 675 m 0,89,90 + 298 675 298 675 345 653 c 1,91,92 + 367 655 367 655 379 655 c 0,93,94 + 529 655 529 655 635 546 c 0,95,96 + 740 436 740 436 740 285 c 0,97,98 + 740 269 740 269 736 233 c 1,99,100 + 750 191 750 191 750 149 c 0,101,102 + 750 47 750 47 679 -26 c 0,103,104 + 607 -100 607 -100 506 -100 c 0,105,106 + 457 -100 457 -100 416 -83 c 1,107,108 + 401 -85 401 -85 379 -85 c 0,109,110 + 229 -85 229 -85 122 24 c 0,111,112 + 16 133 16 133 16 285 c 0,113,114 + 16 306 16 306 19 329 c 1,115,116 + 0 373 0 373 0 427 c 0,117,118 + 0 529 0 529 70 601 c 0,119,120 + 142 675 142 675 244 675 c 0,89,90 +EndSplineSet +EndChar + +StartChar: glyph245 +Encoding: 245 57589 246 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 85 + 16 + 1 + 9 + 6 + 0 + 1 + 8 + 9 + 8 + 1 + 1 + 4 + 3 + 66 + 0 + 3 + 0 + 7 + 5 + 3 + 7 + 91 + 0 + 6 + 9 + 0 + 6 + 79 + 0 + 2 + 0 + 9 + 8 + 2 + 9 + 91 + 0 + 5 + 0 + 8 + 4 + 5 + 8 + 91 + 10 + 1 + 4 + 0 + 1 + 0 + 4 + 1 + 91 + 0 + 6 + 6 + 0 + 83 + 0 + 0 + 6 + 0 + 71 + 33 + 32 + 86 + 84 + 80 + 78 + 63 + 61 + 56 + 54 + 50 + 48 + 32 + 92 + 33 + 92 + 34 + 42 + 34 + 37 + 11 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +736 245 m 1,0,1 + 750 203 750 203 750 162 c 0,2,3 + 750 59 750 59 679 -14 c 0,4,5 + 607 -88 607 -88 506 -88 c 0,6,7 + 460 -88 460 -88 416 -70 c 1,8,9 + 401 -72 401 -72 379 -72 c 0,10,11 + 229 -72 229 -72 122 36 c 0,12,13 + 16 145 16 145 16 297 c 0,14,15 + 16 320 16 320 19 342 c 1,16,17 + 0 386 0 386 0 440 c 0,18,19 + 0 542 0 542 70 614 c 0,20,21 + 142 688 142 688 244 688 c 0,22,23 + 298 688 298 688 345 666 c 1,24,25 + 356 667 356 667 379 667 c 0,26,27 + 529 667 529 667 635 558 c 0,28,29 + 740 448 740 448 740 297 c 0,30,31 + 740 281 740 281 736 245 c 1,0,1 +378 101 m 0,32,33 + 449 101 449 101 494.5 132.5 c 128,-1,34 + 540 164 540 164 540 224 c 0,35,36 + 540 279 540 279 498 309 c 0,37,38 + 473 324 473 324 450 332 c 0,39,40 + 445 333 445 333 367 353 c 2,41,-1 + 350 357 l 2,42,43 + 322 366 322 366 312 380 c 0,44,45 + 305 387 305 387 305 396 c 0,46,47 + 305 414 305 414 325.5 425 c 128,-1,48 + 346 436 346 436 371 436 c 0,49,50 + 424 436 424 436 442 393 c 0,51,52 + 450 380 450 380 452.5 376 c 128,-1,53 + 455 372 455 372 463.5 367 c 128,-1,54 + 472 362 472 362 483 362 c 0,55,56 + 499 362 499 362 511 374.5 c 128,-1,57 + 523 387 523 387 523 403 c 0,58,59 + 523 435 523 435 488 466 c 0,60,61 + 446 499 446 499 376 499 c 0,62,63 + 310 499 310 499 266 471.5 c 128,-1,64 + 222 444 222 444 222 389 c 0,65,66 + 222 355 222 355 240.5 331 c 128,-1,67 + 259 307 259 307 287 296 c 0,68,69 + 319 282 319 282 361 273 c 0,70,71 + 374 270 374 270 379 269 c 2,72,-1 + 398 264 l 1,73,-1 + 412 261 l 1,74,75 + 452 246 452 246 452 216 c 0,76,77 + 452 192 452 192 429 179 c 128,-1,78 + 406 166 406 166 375 166 c 0,79,80 + 330 166 330 166 312 191 c 1,81,82 + 299 216 299 216 295 220 c 0,83,84 + 284 254 284 254 254 254 c 0,85,86 + 237 254 237 254 225.5 243 c 128,-1,87 + 214 232 214 232 214 216 c 0,88,89 + 214 188 214 188 233 162.5 c 128,-1,90 + 252 137 252 137 277 123 c 0,91,92 + 319 101 319 101 378 101 c 0,32,33 +EndSplineSet +EndChar + +StartChar: glyph246 +Encoding: 246 57590 247 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 19 + 1 + 1 + 2 + 1 + 1 + 0 + 1 + 0 + 1 + 5 + 0 + 3 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 54 + 0 + 3 + 8 + 2 + 8 + 3 + 96 + 0 + 2 + 1 + 8 + 2 + 1 + 102 + 0 + 5 + 0 + 9 + 9 + 5 + 96 + 0 + 7 + 0 + 8 + 3 + 7 + 8 + 91 + 4 + 1 + 1 + 0 + 0 + 5 + 1 + 0 + 91 + 0 + 9 + 6 + 6 + 9 + 79 + 0 + 9 + 9 + 6 + 84 + 0 + 6 + 9 + 6 + 72 +ELSE +MPPEM +PUSHB_1 + 11 +LT +IF +NPUSHB + 55 + 0 + 3 + 8 + 2 + 8 + 3 + 2 + 104 + 0 + 2 + 1 + 8 + 2 + 1 + 102 + 0 + 5 + 0 + 9 + 9 + 5 + 96 + 0 + 7 + 0 + 8 + 3 + 7 + 8 + 91 + 4 + 1 + 1 + 0 + 0 + 5 + 1 + 0 + 91 + 0 + 9 + 6 + 6 + 9 + 79 + 0 + 9 + 9 + 6 + 84 + 0 + 6 + 9 + 6 + 72 +ELSE +NPUSHB + 56 + 0 + 3 + 8 + 2 + 8 + 3 + 2 + 104 + 0 + 2 + 1 + 8 + 2 + 1 + 102 + 0 + 5 + 0 + 9 + 0 + 5 + 9 + 104 + 0 + 7 + 0 + 8 + 3 + 7 + 8 + 91 + 4 + 1 + 1 + 0 + 0 + 5 + 1 + 0 + 91 + 0 + 9 + 6 + 6 + 9 + 79 + 0 + 9 + 9 + 6 + 84 + 0 + 6 + 9 + 6 + 72 +EIF +EIF +NPUSHB + 13 + 42 + 41 + 19 + 19 + 18 + 36 + 22 + 17 + 17 + 21 + 34 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +474 150 m 1,0,-1 + 474 202 l 1,1,2 + 448 185 448 185 425 185 c 0,3,4 + 415 185 415 185 403.5 191 c 128,-1,5 + 392 197 392 197 391 205 c 0,6,7 + 387 213 387 213 387 241 c 2,8,-1 + 387 323 l 1,9,-1 + 463 323 l 1,10,-1 + 463 374 l 1,11,-1 + 387 374 l 1,12,-1 + 387 456 l 1,13,-1 + 342 456 l 1,14,15 + 336 425 336 425 330.5 412.5 c 128,-1,16 + 325 400 325 400 309 387 c 0,17,18 + 292 374 292 374 277 368 c 1,19,-1 + 277 323 l 1,20,-1 + 312 323 l 1,21,-1 + 312 210 l 2,22,23 + 312 157 312 157 362 138 c 0,24,25 + 384 132 384 132 400 132 c 0,26,27 + 440 132 440 132 474 150 c 1,28,-1 + 474 150 l 1,0,-1 +375 -75 m 128,-1,30 + 220 -75 220 -75 110 35 c 128,-1,31 + 0 145 0 145 0 300 c 128,-1,32 + 0 455 0 455 110 565 c 128,-1,33 + 220 675 220 675 375 675 c 128,-1,34 + 530 675 530 675 640 565 c 128,-1,35 + 750 455 750 455 750 300 c 128,-1,36 + 750 145 750 145 640 35 c 128,-1,29 + 530 -75 530 -75 375 -75 c 128,-1,30 +375 592 m 128,-1,38 + 254 592 254 592 168.5 506.5 c 128,-1,39 + 83 421 83 421 83 300 c 128,-1,40 + 83 179 83 179 168.5 93.5 c 128,-1,41 + 254 8 254 8 375 8 c 128,-1,42 + 496 8 496 8 581.5 93.5 c 128,-1,43 + 667 179 667 179 667 300 c 128,-1,44 + 667 421 667 421 581.5 506.5 c 128,-1,37 + 496 592 496 592 375 592 c 128,-1,38 +EndSplineSet +EndChar + +StartChar: glyph247 +Encoding: 247 57591 248 +Width: 330 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 52 + 19 + 1 + 1 + 2 + 1 + 1 + 0 + 1 + 0 + 1 + 5 + 0 + 3 + 66 + 0 + 3 + 2 + 3 + 106 + 0 + 2 + 4 + 1 + 1 + 0 + 2 + 1 + 89 + 0 + 0 + 5 + 5 + 0 + 79 + 0 + 0 + 0 + 5 + 84 + 0 + 5 + 0 + 5 + 72 + 38 + 22 + 17 + 17 + 21 + 34 + 6 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +330 53 m 1,0,-1 + 330 139 l 1,1,2 + 289 111 289 111 249 111 c 0,3,4 + 232 111 232 111 213 120.5 c 128,-1,5 + 194 130 194 130 191 144 c 1,6,7 + 183 158 183 158 183 205 c 2,8,-1 + 183 342 l 1,9,-1 + 308 342 l 1,10,-1 + 308 425 l 1,11,-1 + 183 425 l 1,12,-1 + 183 565 l 1,13,-1 + 109 565 l 1,14,15 + 99 513 99 513 90 492 c 128,-1,16 + 81 471 81 471 54 449 c 0,17,18 + 27 426 27 426 0 418 c 1,19,-1 + 0 342 l 1,20,-1 + 58 342 l 1,21,-1 + 58 153 l 2,22,23 + 58 93 58 93 95 60 c 0,24,25 + 110 45 110 45 142 32 c 1,26,27 + 180 23 180 23 207 23 c 0,28,29 + 275 23 275 23 330 53 c 1,30,-1 + 330 53 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph248 +Encoding: 248 57592 249 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 22 + 39 + 12 + 10 + 8 + 6 + 4 + 6 + 5 + 0 + 35 + 33 + 30 + 26 + 4 + 4 + 5 + 19 + 1 + 2 + 3 + 3 + 66 +MPPEM +PUSHB_1 + 17 +LT +IF +NPUSHB + 61 + 0 + 0 + 8 + 5 + 8 + 0 + 5 + 104 + 0 + 5 + 4 + 8 + 5 + 4 + 102 + 0 + 4 + 3 + 2 + 4 + 94 + 0 + 3 + 2 + 1 + 3 + 94 + 0 + 7 + 11 + 1 + 8 + 0 + 7 + 8 + 91 + 0 + 2 + 0 + 1 + 9 + 2 + 1 + 92 + 0 + 9 + 6 + 6 + 9 + 79 + 0 + 9 + 9 + 6 + 84 + 10 + 1 + 6 + 9 + 6 + 72 +ELSE +MPPEM +PUSHB_1 + 22 +LT +IF +NPUSHB + 62 + 0 + 0 + 8 + 5 + 8 + 0 + 5 + 104 + 0 + 5 + 4 + 8 + 5 + 4 + 102 + 0 + 4 + 3 + 8 + 4 + 3 + 102 + 0 + 3 + 2 + 1 + 3 + 94 + 0 + 7 + 11 + 1 + 8 + 0 + 7 + 8 + 91 + 0 + 2 + 0 + 1 + 9 + 2 + 1 + 92 + 0 + 9 + 6 + 6 + 9 + 79 + 0 + 9 + 9 + 6 + 84 + 10 + 1 + 6 + 9 + 6 + 72 +ELSE +NPUSHB + 63 + 0 + 0 + 8 + 5 + 8 + 0 + 5 + 104 + 0 + 5 + 4 + 8 + 5 + 4 + 102 + 0 + 4 + 3 + 8 + 4 + 3 + 102 + 0 + 3 + 2 + 8 + 3 + 2 + 102 + 0 + 7 + 11 + 1 + 8 + 0 + 7 + 8 + 91 + 0 + 2 + 0 + 1 + 9 + 2 + 1 + 92 + 0 + 9 + 6 + 6 + 9 + 79 + 0 + 9 + 9 + 6 + 84 + 10 + 1 + 6 + 9 + 6 + 72 +EIF +EIF +NPUSHB + 24 + 59 + 58 + 44 + 43 + 65 + 63 + 58 + 69 + 59 + 69 + 52 + 50 + 43 + 57 + 44 + 57 + 27 + 35 + 17 + 34 + 45 + 18 + 12 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +380 346 m 0,0,1 + 380 374 380 374 400 394 c 128,-1,2 + 420 414 420 414 449 414 c 128,-1,3 + 478 414 478 414 498 393 c 1,4,5 + 520 398 520 398 541 409 c 1,6,7 + 533 385 533 385 512 372 c 1,8,9 + 536 375 536 375 551 383 c 1,10,11 + 538 364 538 364 516 347 c 1,12,-1 + 516 338 l 2,13,14 + 516 232 516 232 427 174 c 0,15,16 + 382 144 382 144 322 144 c 0,17,18 + 265 144 265 144 217 175 c 1,19,20 + 220 174 220 174 234 174 c 0,21,22 + 281 174 281 174 319 203 c 1,23,24 + 296 204 296 204 278.5 217.5 c 128,-1,25 + 261 231 261 231 255 251 c 1,26,27 + 259 249 259 249 267 249 c 0,28,29 + 279 249 279 249 285 251 c 1,30,31 + 262 256 262 256 246.5 274.5 c 128,-1,32 + 231 293 231 293 231 319 c 1,33,34 + 242 313 242 313 262 311 c 1,35,36 + 231 333 231 333 231 368 c 0,37,38 + 231 384 231 384 241 402 c 1,39,40 + 296 334 296 334 382 331 c 1,41,42 + 380 339 380 339 380 346 c 0,0,1 +375 -75 m 0,43,44 + 219 -75 219 -75 109 35 c 0,45,46 + 0 144 0 144 0 300 c 0,47,48 + 0 457 0 457 109 566 c 0,49,50 + 217 675 217 675 375 675 c 0,51,52 + 531 675 531 675 640 566 c 0,53,54 + 750 456 750 456 750 300 c 0,55,56 + 750 145 750 145 640 35 c 128,-1,57 + 530 -75 530 -75 375 -75 c 0,43,44 +375 592 m 0,58,59 + 253 592 253 592 168 507 c 128,-1,60 + 83 422 83 422 83 300 c 0,61,62 + 83 180 83 180 168 94 c 128,-1,63 + 253 8 253 8 375 8 c 0,64,65 + 495 8 495 8 581 94 c 128,-1,66 + 667 180 667 180 667 300 c 0,67,68 + 667 422 667 422 581 507 c 128,-1,69 + 495 592 495 592 375 592 c 0,58,59 +EndSplineSet +EndChar + +StartChar: glyph249 +Encoding: 249 57593 250 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 67 + 40 + 13 + 11 + 9 + 7 + 5 + 6 + 5 + 0 + 36 + 34 + 31 + 28 + 4 + 4 + 5 + 21 + 1 + 2 + 3 + 3 + 66 + 0 + 0 + 5 + 0 + 106 + 0 + 4 + 5 + 3 + 5 + 4 + 3 + 104 + 0 + 5 + 0 + 3 + 2 + 5 + 3 + 91 + 0 + 2 + 1 + 1 + 2 + 79 + 0 + 2 + 2 + 1 + 84 + 0 + 1 + 2 + 1 + 72 + 27 + 19 + 17 + 34 + 46 + 34 + 6 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +365 451 m 0,0,1 + 365 515 365 515 410.5 559.5 c 128,-1,2 + 456 604 456 604 520 604 c 0,3,4 + 588 604 588 604 631 557 c 1,5,6 + 679 567 679 567 729 593 c 1,7,8 + 713 539 713 539 662 508 c 1,9,10 + 705 514 705 514 750 533 c 1,11,12 + 719 486 719 486 673 452 c 1,13,-1 + 673 433 l 2,14,15 + 673 324 673 324 625 229 c 0,16,17 + 577 132 577 132 473 64 c 128,-1,18 + 369 -4 369 -4 236 -4 c 0,19,20 + 106 -4 106 -4 0 65 c 1,21,22 + 16 63 16 63 38 63 c 0,23,24 + 145 63 145 63 228 128 c 1,25,26 + 176 129 176 129 137.5 160 c 128,-1,27 + 99 191 99 191 85 236 c 1,28,29 + 95 232 95 232 113 232 c 128,-1,30 + 131 232 131 232 153 237 c 1,31,32 + 101 248 101 248 66 290 c 128,-1,33 + 31 332 31 332 31 390 c 1,34,35 + 60 374 60 374 100 371 c 1,36,37 + 31 419 31 419 31 500 c 0,38,39 + 31 538 31 538 52 576 c 1,40,41 + 178 423 178 423 370 417 c 1,42,43 + 365 434 365 434 365 451 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph250 +Encoding: 250 57594 251 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 12 + 21 + 0 + 2 + 2 + 5 + 20 + 16 + 2 + 4 + 2 + 2 + 66 +MPPEM +PUSHB_1 + 9 +LT +IF +NPUSHB + 61 + 3 + 1 + 0 + 8 + 5 + 8 + 0 + 5 + 104 + 0 + 5 + 2 + 8 + 5 + 2 + 102 + 0 + 2 + 4 + 8 + 2 + 4 + 102 + 0 + 4 + 1 + 8 + 4 + 1 + 102 + 0 + 1 + 9 + 8 + 1 + 9 + 102 + 0 + 7 + 0 + 8 + 0 + 7 + 8 + 91 + 0 + 9 + 6 + 6 + 9 + 79 + 0 + 9 + 9 + 6 + 84 + 0 + 6 + 9 + 6 + 72 +ELSE +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 67 + 0 + 0 + 8 + 3 + 8 + 0 + 3 + 104 + 0 + 3 + 5 + 8 + 3 + 5 + 102 + 0 + 5 + 2 + 8 + 5 + 2 + 102 + 0 + 2 + 4 + 8 + 2 + 4 + 102 + 0 + 4 + 1 + 8 + 4 + 1 + 102 + 0 + 1 + 9 + 8 + 1 + 9 + 102 + 0 + 7 + 0 + 8 + 0 + 7 + 8 + 91 + 0 + 9 + 6 + 6 + 9 + 79 + 0 + 9 + 9 + 6 + 84 + 0 + 6 + 9 + 6 + 72 +ELSE +NPUSHB + 61 + 3 + 1 + 0 + 8 + 5 + 8 + 0 + 5 + 104 + 0 + 5 + 2 + 8 + 5 + 2 + 102 + 0 + 2 + 4 + 8 + 2 + 4 + 102 + 0 + 4 + 1 + 8 + 4 + 1 + 102 + 0 + 1 + 9 + 8 + 1 + 9 + 102 + 0 + 7 + 0 + 8 + 0 + 7 + 8 + 91 + 0 + 9 + 6 + 6 + 9 + 79 + 0 + 9 + 9 + 6 + 84 + 0 + 6 + 9 + 6 + 72 +EIF +EIF +NPUSHB + 13 + 51 + 50 + 19 + 19 + 17 + 35 + 37 + 22 + 21 + 38 + 34 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +394 343 m 1,0,1 + 399 372 399 372 424.5 395.5 c 128,-1,2 + 450 419 450 419 478 419 c 0,3,4 + 540 419 540 419 528 352 c 0,5,6 + 518 289 518 289 468 228 c 0,7,8 + 422 173 422 173 382 145 c 0,9,10 + 370 139 370 139 359 139 c 0,11,12 + 332 139 332 139 315 174 c 0,13,14 + 311 182 311 182 288.5 257 c 128,-1,15 + 266 332 266 332 263 336 c 0,16,17 + 261 340 261 340 257 340 c 0,18,19 + 237 336 237 336 226 325 c 1,20,-1 + 214 342 l 1,21,-1 + 228 359 l 2,22,23 + 275 411 275 411 316 416 c 0,24,25 + 330 416 330 416 339 402.5 c 128,-1,26 + 348 389 348 389 351 373 c 128,-1,27 + 354 357 354 357 357 335.5 c 128,-1,28 + 360 314 360 314 362 306 c 0,29,30 + 377 241 377 241 388 241 c 0,31,32 + 402 241 402 241 432 299 c 0,33,34 + 442 316 442 316 438 334 c 128,-1,35 + 434 352 434 352 417 352 c 0,36,37 + 410 352 410 352 394 343 c 1,0,1 +375 -75 m 128,-1,39 + 220 -75 220 -75 110 35 c 128,-1,40 + 0 145 0 145 0 300 c 128,-1,41 + 0 455 0 455 110 565 c 128,-1,42 + 220 675 220 675 375 675 c 128,-1,43 + 530 675 530 675 640 565 c 128,-1,44 + 750 455 750 455 750 300 c 128,-1,45 + 750 145 750 145 640 35 c 128,-1,38 + 530 -75 530 -75 375 -75 c 128,-1,39 +375 592 m 128,-1,47 + 254 592 254 592 168.5 506.5 c 128,-1,48 + 83 421 83 421 83 300 c 128,-1,49 + 83 179 83 179 168.5 93.5 c 128,-1,50 + 254 8 254 8 375 8 c 128,-1,51 + 496 8 496 8 581.5 93.5 c 128,-1,52 + 667 179 667 179 667 300 c 128,-1,53 + 667 421 667 421 581.5 506.5 c 128,-1,46 + 496 592 496 592 375 592 c 128,-1,47 +EndSplineSet +EndChar + +StartChar: glyph251 +Encoding: 251 57595 252 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 14 + 32 + 15 + 14 + 3 + 0 + 64 + 0 + 0 + 0 + 97 + 28 + 26 + 1 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +580 434 m 0,0,1 + 559 312 559 312 470 206 c 0,2,3 + 382 101 382 101 310 52 c 1,4,5 + 268 31 268 31 236 51 c 0,6,7 + 205 70 205 70 187 106 c 0,8,9 + 177 125 177 125 137.5 260.5 c 128,-1,10 + 98 396 98 396 90 406 c 0,11,12 + 83 419 83 419 57.5 407 c 128,-1,13 + 32 395 32 395 23 386 c 1,14,-1 + 0 416 l 1,15,-1 + 26 447 l 2,16,17 + 57 480 57 480 99 512.5 c 128,-1,18 + 141 545 141 545 174 552 c 0,19,20 + 218 561 218 561 239 509 c 0,21,22 + 252 479 252 479 264 401 c 0,23,24 + 266 386 266 386 275 350 c 0,25,26 + 304 229 304 229 321 229 c 0,27,28 + 346 229 346 229 403 337 c 0,29,30 + 429 386 429 386 406 418 c 128,-1,31 + 383 450 383 450 334 419 c 1,32,33 + 342 469 342 469 377 504 c 0,34,35 + 442 573 442 573 518 555 c 0,36,37 + 598 540 598 540 580 434 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph252 +Encoding: 252 57596 253 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 121 + 1 + 31 + 20 + 118 + 115 + 92 + 3 + 21 + 31 + 87 + 1 + 18 + 30 + 38 + 1 + 15 + 4 + 44 + 1 + 14 + 15 + 45 + 33 + 32 + 20 + 13 + 8 + 6 + 2 + 13 + 6 + 66 +MPPEM +PUSHB_1 + 9 +LT +IF +NPUSHB + 112 + 24 + 22 + 2 + 20 + 25 + 31 + 25 + 20 + 96 + 0 + 21 + 31 + 30 + 31 + 21 + 30 + 104 + 0 + 13 + 12 + 2 + 12 + 13 + 2 + 104 + 0 + 16 + 27 + 1 + 25 + 20 + 16 + 25 + 89 + 0 + 31 + 36 + 1 + 30 + 18 + 31 + 30 + 91 + 26 + 23 + 19 + 35 + 4 + 18 + 0 + 28 + 0 + 18 + 28 + 91 + 10 + 1 + 0 + 32 + 3 + 2 + 1 + 4 + 0 + 1 + 89 + 0 + 15 + 14 + 4 + 15 + 80 + 0 + 14 + 0 + 12 + 13 + 14 + 12 + 89 + 34 + 11 + 33 + 7 + 6 + 5 + 4 + 9 + 8 + 5 + 3 + 2 + 29 + 4 + 2 + 90 + 0 + 29 + 17 + 17 + 29 + 79 + 0 + 29 + 29 + 17 + 84 + 0 + 17 + 29 + 17 + 72 +ELSE +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 124 + 0 + 24 + 25 + 20 + 25 + 24 + 96 + 22 + 1 + 20 + 31 + 25 + 20 + 94 + 0 + 21 + 31 + 30 + 31 + 21 + 30 + 104 + 0 + 23 + 18 + 28 + 18 + 23 + 96 + 0 + 13 + 12 + 2 + 12 + 13 + 2 + 104 + 0 + 16 + 27 + 1 + 25 + 24 + 16 + 25 + 89 + 0 + 31 + 36 + 1 + 30 + 18 + 31 + 30 + 91 + 26 + 19 + 35 + 3 + 18 + 0 + 28 + 0 + 18 + 28 + 91 + 10 + 1 + 0 + 32 + 3 + 2 + 1 + 11 + 0 + 1 + 89 + 34 + 1 + 11 + 0 + 15 + 14 + 11 + 15 + 92 + 0 + 14 + 0 + 12 + 13 + 14 + 12 + 89 + 33 + 7 + 6 + 3 + 4 + 9 + 8 + 5 + 3 + 2 + 29 + 4 + 2 + 89 + 0 + 29 + 17 + 17 + 29 + 79 + 0 + 29 + 29 + 17 + 84 + 0 + 17 + 29 + 17 + 72 +ELSE +MPPEM +PUSHB_1 + 25 +LT +IF +NPUSHB + 112 + 24 + 22 + 2 + 20 + 25 + 31 + 25 + 20 + 96 + 0 + 21 + 31 + 30 + 31 + 21 + 30 + 104 + 0 + 13 + 12 + 2 + 12 + 13 + 2 + 104 + 0 + 16 + 27 + 1 + 25 + 20 + 16 + 25 + 89 + 0 + 31 + 36 + 1 + 30 + 18 + 31 + 30 + 91 + 26 + 23 + 19 + 35 + 4 + 18 + 0 + 28 + 0 + 18 + 28 + 91 + 10 + 1 + 0 + 32 + 3 + 2 + 1 + 4 + 0 + 1 + 89 + 0 + 15 + 14 + 4 + 15 + 80 + 0 + 14 + 0 + 12 + 13 + 14 + 12 + 89 + 34 + 11 + 33 + 7 + 6 + 5 + 4 + 9 + 8 + 5 + 3 + 2 + 29 + 4 + 2 + 90 + 0 + 29 + 17 + 17 + 29 + 79 + 0 + 29 + 29 + 17 + 84 + 0 + 17 + 29 + 17 + 72 +ELSE +NPUSHB + 113 + 24 + 22 + 2 + 20 + 25 + 31 + 25 + 20 + 31 + 104 + 0 + 21 + 31 + 30 + 31 + 21 + 30 + 104 + 0 + 13 + 12 + 2 + 12 + 13 + 2 + 104 + 0 + 16 + 27 + 1 + 25 + 20 + 16 + 25 + 89 + 0 + 31 + 36 + 1 + 30 + 18 + 31 + 30 + 91 + 26 + 23 + 19 + 35 + 4 + 18 + 0 + 28 + 0 + 18 + 28 + 91 + 10 + 1 + 0 + 32 + 3 + 2 + 1 + 4 + 0 + 1 + 89 + 0 + 15 + 14 + 4 + 15 + 80 + 0 + 14 + 0 + 12 + 13 + 14 + 12 + 89 + 34 + 11 + 33 + 7 + 6 + 5 + 4 + 9 + 8 + 5 + 3 + 2 + 29 + 4 + 2 + 90 + 0 + 29 + 17 + 17 + 29 + 79 + 0 + 29 + 29 + 17 + 84 + 0 + 17 + 29 + 17 + 72 +EIF +EIF +EIF +NPUSHB + 83 + 147 + 146 + 86 + 85 + 50 + 49 + 24 + 23 + 0 + 0 + 152 + 150 + 146 + 155 + 147 + 155 + 145 + 142 + 133 + 130 + 120 + 119 + 117 + 116 + 114 + 113 + 111 + 110 + 105 + 104 + 98 + 97 + 95 + 93 + 91 + 90 + 89 + 88 + 85 + 100 + 86 + 100 + 82 + 81 + 78 + 77 + 76 + 74 + 72 + 71 + 61 + 60 + 54 + 53 + 49 + 69 + 50 + 69 + 37 + 36 + 35 + 34 + 30 + 28 + 23 + 39 + 24 + 39 + 19 + 18 + 12 + 11 + 10 + 9 + 0 + 7 + 0 + 7 + 17 + 17 + 17 + 37 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +188 252 m 1,0,-1 + 188 278 l 1,1,-1 + 278 278 l 1,2,-1 + 278 252 l 1,3,-1 + 248 252 l 1,4,-1 + 248 102 l 1,5,-1 + 218 102 l 1,6,-1 + 218 252 l 1,7,-1 + 188 252 l 1,0,-1 +342 133 m 1,8,-1 + 342 232 l 1,9,-1 + 368 232 l 1,10,-1 + 368 102 l 1,11,-1 + 342 102 l 1,12,-1 + 342 116 l 1,13,14 + 334 107 334 107 323 102.5 c 128,-1,15 + 312 98 312 98 303 103 c 128,-1,16 + 294 108 294 108 294 123 c 2,17,-1 + 294 232 l 1,18,-1 + 320 232 l 1,19,-1 + 320 132 l 2,20,21 + 322 121 322 121 329 123.5 c 128,-1,22 + 336 126 336 126 342 133 c 1,8,-1 +438 233 m 0,23,24 + 462 233 462 233 462 201 c 2,25,-1 + 462 129 l 2,26,27 + 462 116 462 116 455.5 108 c 128,-1,28 + 449 100 449 100 438 100 c 0,29,30 + 431 100 431 100 424.5 103 c 128,-1,31 + 418 106 418 106 416 109 c 2,32,-1 + 413 112 l 1,33,-1 + 413 102 l 1,34,-1 + 387 102 l 1,35,-1 + 387 278 l 1,36,-1 + 413 278 l 1,37,-1 + 413 222 l 1,38,39 + 423 233 423 233 438 233 c 0,23,24 +435 132 m 2,40,-1 + 435 200 l 2,41,42 + 435 211 435 211 427 213 c 128,-1,43 + 419 215 419 215 413 208 c 1,44,-1 + 413 127 l 1,45,46 + 417 123 417 123 422 121.5 c 128,-1,47 + 427 120 427 120 431 122.5 c 128,-1,48 + 435 125 435 125 435 132 c 2,40,-1 +519 235 m 0,49,50 + 535 235 535 235 545.5 224.5 c 128,-1,51 + 556 214 556 214 556 197 c 2,52,-1 + 556 164 l 1,53,-1 + 506 164 l 1,54,-1 + 506 139 l 2,55,56 + 506 128 506 128 512 123.5 c 128,-1,57 + 518 119 518 119 524.5 124 c 128,-1,58 + 531 129 531 129 531 139 c 2,59,-1 + 531 145 l 1,60,-1 + 556 145 l 1,61,-1 + 556 139 l 2,62,63 + 556 114 556 114 537 104 c 128,-1,64 + 518 94 518 94 499 104 c 128,-1,65 + 480 114 480 114 480 139 c 2,66,-1 + 480 197 l 2,67,68 + 480 214 480 214 491 224.5 c 128,-1,69 + 502 235 502 235 519 235 c 0,49,50 +506 197 m 2,70,-1 + 506 184 l 1,71,-1 + 531 184 l 1,72,-1 + 531 197 l 2,73,74 + 531 212 531 212 518 212 c 0,75,76 + 506 212 506 212 506 197 c 2,70,-1 +375 675 m 128,-1,78 + 530 675 530 675 640 565 c 128,-1,79 + 750 455 750 455 750 300 c 128,-1,80 + 750 145 750 145 640 35 c 128,-1,81 + 530 -75 530 -75 375 -75 c 128,-1,82 + 220 -75 220 -75 110 35 c 128,-1,83 + 0 145 0 145 0 300 c 128,-1,84 + 0 455 0 455 110 565 c 128,-1,77 + 220 675 220 675 375 675 c 128,-1,78 +463 386 m 0,85,86 + 479 386 479 386 495 400 c 1,87,-1 + 495 388 l 1,88,-1 + 528 388 l 1,89,-1 + 528 535 l 1,90,-1 + 495 535 l 1,91,-1 + 495 425 l 1,92,93 + 486 416 486 416 479 416 c 0,94,95 + 474 416 474 416 474 423 c 2,96,-1 + 474 535 l 1,97,-1 + 441 535 l 1,98,-1 + 441 413 l 2,99,100 + 441 386 441 386 463 386 c 0,85,86 +335 496 m 2,101,-1 + 335 425 l 2,102,103 + 335 408 335 408 347 395.5 c 128,-1,104 + 359 383 359 383 376 383 c 128,-1,105 + 393 383 393 383 405.5 395.5 c 128,-1,106 + 418 408 418 408 418 425 c 2,107,-1 + 418 496 l 2,108,109 + 418 513 418 513 405.5 525.5 c 128,-1,110 + 393 538 393 538 376 538 c 128,-1,111 + 359 538 359 538 347 525.5 c 128,-1,112 + 335 513 335 513 335 496 c 2,101,-1 +248 585 m 1,113,-1 + 210 585 l 1,114,-1 + 250 470 l 1,115,-1 + 250 388 l 1,116,-1 + 287 388 l 1,117,-1 + 287 470 l 1,118,-1 + 326 585 l 1,119,-1 + 288 585 l 1,120,-1 + 268 512 l 1,121,-1 + 248 585 l 1,113,-1 +577 63 m 0,122,123 + 587 72 587 72 592.5 103.5 c 128,-1,124 + 598 135 598 135 598 162 c 2,125,-1 + 599 188 l 2,126,127 + 599 292 599 292 577 314 c 0,128,129 + 567 323 567 323 517 328.5 c 128,-1,130 + 467 334 467 334 422 334 c 2,131,-1 + 376 335 l 2,132,133 + 196 335 196 335 175 314 c 0,134,135 + 166 305 166 305 160.5 273.5 c 128,-1,136 + 155 242 155 242 154 215 c 2,137,-1 + 153 188 l 2,138,139 + 153 85 153 85 175 63 c 0,140,141 + 185 54 185 54 235 48.5 c 128,-1,142 + 285 43 285 43 330 42 c 2,143,-1 + 376 42 l 2,144,145 + 556 42 556 42 577 63 c 0,122,123 +375 410 m 0,146,147 + 365 410 365 410 365 421 c 2,148,-1 + 365 500 l 2,149,150 + 365 510 365 510 376 510 c 0,151,152 + 386 510 386 510 386 500 c 2,153,-1 + 386 421 l 2,154,155 + 386 410 386 410 375 410 c 0,146,147 +EndSplineSet +EndChar + +StartChar: glyph253 +Encoding: 253 57597 254 +Width: 917 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 28 + 26 + 25 + 24 + 3 + 0 + 1 + 1 + 66 + 0 + 1 + 0 + 0 + 1 + 79 + 0 + 1 + 1 + 0 + 83 + 0 + 0 + 1 + 0 + 71 + 41 + 39 + 2 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +908 442 m 0,0,1 + 917 372 917 372 917 300 c 128,-1,2 + 917 228 917 228 908 158 c 0,3,4 + 901 103 901 103 892.5 74 c 128,-1,5 + 884 45 884 45 867 33 c 0,6,7 + 837 8 837 8 458 8 c 0,8,9 + 80 8 80 8 50 33 c 0,10,11 + 22 52 22 52 8 158 c 0,12,13 + 0 220 0 220 0 300 c 128,-1,14 + 0 380 0 380 8 442 c 0,15,16 + 22 548 22 548 50 567 c 0,17,18 + 80 592 80 592 458 592 c 0,19,20 + 837 592 837 592 867 567 c 0,21,22 + 884 555 884 555 892.5 526 c 128,-1,23 + 901 497 901 497 908 442 c 0,0,1 +375 150 m 1,24,-1 + 625 300 l 1,25,-1 + 375 450 l 1,26,-1 + 375 150 l 1,24,-1 +EndSplineSet +EndChar + +StartChar: glyph254 +Encoding: 254 57598 255 +Width: 1000 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 146 + 26 + 1 + 2 + 14 + 5 + 3 + 1 + 1 + 9 + 2 + 66 + 0 + 18 + 10 + 5 + 10 + 18 + 5 + 104 + 19 + 1 + 0 + 14 + 7 + 14 + 0 + 7 + 104 + 6 + 1 + 4 + 17 + 1 + 10 + 18 + 4 + 10 + 91 + 0 + 5 + 0 + 14 + 0 + 5 + 14 + 91 + 21 + 13 + 2 + 7 + 0 + 16 + 12 + 7 + 16 + 92 + 0 + 12 + 0 + 2 + 9 + 12 + 2 + 89 + 22 + 15 + 11 + 20 + 4 + 9 + 1 + 1 + 9 + 79 + 22 + 15 + 11 + 20 + 4 + 9 + 9 + 1 + 84 + 8 + 3 + 2 + 1 + 9 + 1 + 72 + 80 + 79 + 69 + 67 + 50 + 49 + 0 + 0 + 96 + 94 + 91 + 88 + 85 + 83 + 79 + 100 + 80 + 99 + 75 + 72 + 67 + 78 + 69 + 78 + 64 + 63 + 61 + 59 + 55 + 54 + 49 + 66 + 50 + 66 + 48 + 45 + 42 + 41 + 36 + 33 + 29 + 27 + 23 + 22 + 15 + 13 + 10 + 9 + 6 + 4 + 0 + 2 + 0 + 2 + 23 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +234 217 m 1,0,-1 + 292 332 l 1,1,-1 + 349 217 l 1,2,-1 + 234 217 l 1,0,-1 +542 -1 m 1,3,4 + 506 -33 506 -33 458 -33 c 0,5,6 + 422 -33 422 -33 392.5 -14.5 c 128,-1,7 + 363 4 363 4 347 36 c 2,8,-1 + 339 50 l 1,9,-1 + 244 50 l 1,10,-1 + 237 36 l 2,11,12 + 221 4 221 4 191 -14.5 c 128,-1,13 + 161 -33 161 -33 125 -33 c 0,14,15 + 81 -33 81 -33 49.5 -9 c 128,-1,16 + 18 15 18 15 6 52 c 0,17,18 + -11 101 -11 101 13 148 c 2,19,-1 + 180 481 l 2,20,21 + 196 512 196 512 226 530 c 128,-1,22 + 256 548 256 548 292 548 c 128,-1,23 + 328 548 328 548 358 530 c 128,-1,24 + 388 512 388 512 404 481 c 2,25,-1 + 479 330 l 1,26,27 + 500 342 500 342 521 342 c 2,28,-1 + 532 342 l 1,29,30 + 500 377 500 377 500 425 c 0,31,32 + 500 477 500 477 536.5 513.5 c 128,-1,33 + 573 550 573 550 625 550 c 2,34,-1 + 875 550 l 2,35,36 + 911 550 911 550 941 531.5 c 128,-1,37 + 971 513 971 513 987 481 c 0,38,39 + 1021 411 1021 411 975 350 c 2,40,-1 + 875 217 l 1,41,42 + 927 217 927 217 963.5 180.5 c 128,-1,43 + 1000 144 1000 144 1000 92 c 128,-1,44 + 1000 40 1000 40 963.5 3.5 c 128,-1,45 + 927 -33 927 -33 875 -33 c 2,46,-1 + 625 -33 l 2,47,48 + 577 -33 577 -33 542 -1 c 1,3,4 +458 50 m 0,49,50 + 482 50 482 50 494 70 c 128,-1,51 + 506 90 506 90 496 110 c 2,52,-1 + 329 444 l 2,53,54 + 318 465 318 465 292 465 c 128,-1,55 + 266 465 266 465 255 444 c 2,56,-1 + 88 110 l 2,57,58 + 78 90 78 90 89.5 70 c 128,-1,59 + 101 50 101 50 125 50 c 0,60,61 + 151 50 151 50 162 73 c 2,62,-1 + 193 133 l 1,63,-1 + 391 133 l 1,64,-1 + 421 73 l 2,65,66 + 432 50 432 50 458 50 c 0,49,50 +521 217 m 2,67,-1 + 563 217 l 2,68,69 + 580 217 580 217 592 229 c 128,-1,70 + 604 241 604 241 604 258 c 128,-1,71 + 604 275 604 275 592 287.5 c 128,-1,72 + 580 300 580 300 563 300 c 2,73,-1 + 521 300 l 2,74,75 + 504 300 504 300 491.5 287.5 c 128,-1,76 + 479 275 479 275 479 258 c 128,-1,77 + 479 241 479 241 491.5 229 c 128,-1,78 + 504 217 504 217 521 217 c 2,67,-1 +875 50 m 2,79,80 + 892 50 892 50 904.5 62.5 c 128,-1,81 + 917 75 917 75 917 92 c 128,-1,82 + 917 109 917 109 904.5 121 c 128,-1,83 + 892 133 892 133 875 133 c 2,84,-1 + 708 133 l 1,85,-1 + 908 400 l 2,86,87 + 924 422 924 422 911.5 444.5 c 128,-1,88 + 899 467 899 467 875 467 c 2,89,-1 + 625 467 l 2,90,91 + 608 467 608 467 595.5 454.5 c 128,-1,92 + 583 442 583 442 583 425 c 128,-1,93 + 583 408 583 408 595.5 395.5 c 128,-1,94 + 608 383 608 383 625 383 c 2,95,-1 + 792 383 l 1,96,-1 + 592 117 l 2,97,98 + 576 94 576 94 588.5 72 c 128,-1,99 + 601 50 601 50 625 50 c 2,100,-1 + 875 50 l 2,79,80 +EndSplineSet +EndChar + +StartChar: glyph255 +Encoding: 255 57599 256 +Width: 917 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 76 + 21 + 1 + 9 + 5 + 1 + 66 + 6 + 1 + 2 + 0 + 5 + 9 + 2 + 5 + 91 + 0 + 9 + 11 + 1 + 8 + 3 + 9 + 8 + 91 + 0 + 3 + 0 + 1 + 7 + 3 + 1 + 90 + 0 + 7 + 0 + 0 + 7 + 79 + 0 + 7 + 7 + 0 + 83 + 10 + 4 + 2 + 0 + 7 + 0 + 71 + 46 + 44 + 24 + 22 + 52 + 49 + 44 + 55 + 46 + 55 + 40 + 38 + 35 + 32 + 29 + 27 + 22 + 43 + 24 + 43 + 18 + 25 + 18 + 34 + 12 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +412 110 m 2,0,1 + 422 90 422 90 410.5 70 c 128,-1,2 + 399 50 399 50 375 50 c 0,3,4 + 349 50 349 50 338 73 c 2,5,-1 + 308 133 l 1,6,-1 + 109 133 l 1,7,-1 + 79 73 l 2,8,9 + 72 57 72 57 55.5 51.5 c 128,-1,10 + 39 46 39 46 23 54 c 0,11,12 + 7 61 7 61 1.5 77.5 c 128,-1,13 + -4 94 -4 94 4 110 c 2,14,-1 + 171 444 l 2,15,16 + 182 465 182 465 209 465 c 128,-1,17 + 236 465 236 465 246 444 c 2,18,-1 + 412 110 l 2,0,1 +151 217 m 1,19,-1 + 266 217 l 1,20,-1 + 208 332 l 1,21,-1 + 151 217 l 1,19,-1 +875 50 m 2,22,-1 + 625 50 l 2,23,24 + 601 50 601 50 588.5 72 c 128,-1,25 + 576 94 576 94 592 117 c 2,26,-1 + 792 383 l 1,27,-1 + 625 383 l 2,28,29 + 608 383 608 383 595.5 395.5 c 128,-1,30 + 583 408 583 408 583 425 c 128,-1,31 + 583 442 583 442 595.5 454.5 c 128,-1,32 + 608 467 608 467 625 467 c 2,33,-1 + 875 467 l 2,34,35 + 899 467 899 467 911.5 444.5 c 128,-1,36 + 924 422 924 422 908 400 c 2,37,-1 + 708 133 l 1,38,-1 + 875 133 l 2,39,40 + 892 133 892 133 904.5 121 c 128,-1,41 + 917 109 917 109 917 92 c 128,-1,42 + 917 75 917 75 904.5 62.5 c 128,-1,43 + 892 50 892 50 875 50 c 2,22,-1 +542 217 m 2,44,-1 + 458 217 l 2,45,46 + 441 217 441 217 429 229 c 128,-1,47 + 417 241 417 241 417 258 c 128,-1,48 + 417 275 417 275 429 287.5 c 128,-1,49 + 441 300 441 300 458 300 c 2,50,-1 + 542 300 l 2,51,52 + 559 300 559 300 571 287.5 c 128,-1,53 + 583 275 583 275 583 258 c 128,-1,54 + 583 241 583 241 571 229 c 128,-1,55 + 559 217 559 217 542 217 c 2,44,-1 +EndSplineSet +EndChar + +StartChar: glyph256 +Encoding: 256 57600 257 +Width: 982 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 155 + 3 + 1 + 6 + 0 + 54 + 1 + 7 + 9 + 15 + 1 + 13 + 18 + 99 + 1 + 19 + 13 + 27 + 22 + 2 + 3 + 8 + 5 + 66 + 33 + 1 + 13 + 1 + 65 + 0 + 7 + 9 + 16 + 9 + 7 + 16 + 104 + 0 + 13 + 18 + 19 + 18 + 13 + 19 + 104 + 2 + 1 + 22 + 3 + 0 + 15 + 12 + 2 + 6 + 9 + 0 + 6 + 91 + 17 + 1 + 9 + 0 + 18 + 13 + 9 + 18 + 91 + 0 + 16 + 0 + 21 + 11 + 16 + 21 + 91 + 0 + 19 + 20 + 1 + 11 + 8 + 19 + 11 + 91 + 14 + 10 + 2 + 8 + 3 + 3 + 8 + 79 + 14 + 10 + 2 + 8 + 8 + 3 + 84 + 5 + 4 + 2 + 3 + 8 + 3 + 72 + 1 + 0 + 133 + 132 + 128 + 127 + 124 + 122 + 119 + 117 + 114 + 112 + 110 + 108 + 105 + 103 + 95 + 94 + 90 + 89 + 84 + 82 + 76 + 74 + 71 + 68 + 62 + 61 + 58 + 57 + 53 + 51 + 45 + 43 + 30 + 28 + 26 + 23 + 21 + 19 + 11 + 9 + 6 + 4 + 0 + 40 + 1 + 40 + 23 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +183 550 m 0,0,1 + 220 550 220 550 250.5 531 c 128,-1,2 + 281 512 281 512 297 485 c 1,3,4 + 363 549 363 549 454 549 c 0,5,6 + 548 549 548 549 612 485 c 1,7,-1 + 614 482 l 1,8,9 + 673 550 673 550 763 550 c 0,10,11 + 845 550 845 550 903 492 c 128,-1,12 + 961 434 961 434 961 352 c 0,13,14 + 961 322 961 322 952 294 c 1,15,16 + 982 242 982 242 982 185 c 0,17,18 + 982 94 982 94 918 30.5 c 128,-1,19 + 854 -33 854 -33 763 -33 c 0,20,21 + 701 -33 701 -33 649 0 c 1,22,23 + 613 -33 613 -33 565 -33 c 2,24,-1 + 357 -33 l 2,25,26 + 308 -33 308 -33 273 -1 c 1,27,28 + 238 -33 238 -33 190 -33 c 0,29,30 + 138 -33 138 -33 101.5 3.5 c 128,-1,31 + 65 40 65 40 65 92 c 2,32,-1 + 65 286 l 1,33,34 + 29 306 29 306 13 339 c 0,35,36 + -10 386 -10 386 6.5 434.5 c 128,-1,37 + 23 483 23 483 68 506 c 2,38,-1 + 126 537 l 2,39,40 + 151 550 151 550 183 550 c 0,0,1 +232 425 m 2,41,42 + 232 441 232 441 216.5 454 c 128,-1,43 + 201 467 201 467 183 467 c 0,44,45 + 174 467 174 467 164 462 c 2,46,-1 + 107 432 l 2,47,48 + 91 425 91 425 85.5 408.5 c 128,-1,49 + 80 392 80 392 88 376 c 0,50,51 + 99 353 99 353 129 353 c 0,52,53 + 138 353 138 353 148 358 c 1,54,-1 + 148 92 l 2,55,56 + 148 75 148 75 160.5 62.5 c 128,-1,57 + 173 50 173 50 190 50 c 128,-1,58 + 207 50 207 50 219.5 62.5 c 128,-1,59 + 232 75 232 75 232 92 c 2,60,-1 + 232 425 l 2,41,42 +454 383 m 128,-1,62 + 477 383 477 383 493.5 366.5 c 128,-1,63 + 510 350 510 350 510 327 c 128,-1,64 + 510 304 510 304 494 288 c 2,65,-1 + 327 121 l 2,66,67 + 307 101 307 101 319 75.5 c 128,-1,68 + 331 50 331 50 357 50 c 2,69,-1 + 565 50 l 2,70,71 + 582 50 582 50 594.5 62.5 c 128,-1,72 + 607 75 607 75 607 92 c 128,-1,73 + 607 109 607 109 594.5 121 c 128,-1,74 + 582 133 582 133 565 133 c 2,75,-1 + 457 133 l 1,76,-1 + 553 229 l 2,77,78 + 594 270 594 270 594 327 c 0,79,80 + 594 385 594 385 553 426 c 0,81,82 + 514 465 514 465 454 465 c 0,83,84 + 395 465 395 465 356 426 c 0,85,86 + 315 385 315 385 315 327 c 0,87,88 + 315 310 315 310 327.5 298 c 128,-1,89 + 340 286 340 286 357 286 c 128,-1,90 + 374 286 374 286 386 298 c 128,-1,91 + 398 310 398 310 398 327 c 0,92,93 + 398 350 398 350 414.5 366.5 c 128,-1,61 + 431 383 431 383 454 383 c 128,-1,62 +763 50 m 128,-1,95 + 819 50 819 50 858.5 89.5 c 128,-1,96 + 898 129 898 129 898 185 c 0,97,98 + 898 244 898 244 855 284 c 1,99,100 + 878 315 878 315 878 352 c 0,101,102 + 878 399 878 399 844 433 c 128,-1,103 + 810 467 810 467 763 467 c 0,104,105 + 694 467 694 467 661 405 c 0,106,107 + 651 385 651 385 662.5 364.5 c 128,-1,108 + 674 344 674 344 698 344 c 0,109,110 + 724 344 724 344 735 366 c 0,111,112 + 744 383 744 383 763 383 c 0,113,114 + 776 383 776 383 785 374 c 128,-1,115 + 794 365 794 365 794 352 c 128,-1,116 + 794 339 794 339 785 330 c 128,-1,117 + 776 321 776 321 763 321 c 0,118,119 + 746 321 746 321 733.5 308.5 c 128,-1,120 + 721 296 721 296 721 279 c 128,-1,121 + 721 262 721 262 733.5 250 c 128,-1,122 + 746 238 746 238 763 238 c 0,123,124 + 785 238 785 238 800 222.5 c 128,-1,125 + 815 207 815 207 815 185 c 128,-1,126 + 815 163 815 163 800 148 c 128,-1,127 + 785 133 785 133 763 133 c 128,-1,128 + 741 133 741 133 726 148 c 128,-1,129 + 711 163 711 163 711 185 c 0,130,131 + 711 202 711 202 698.5 214.5 c 128,-1,132 + 686 227 686 227 669 227 c 128,-1,133 + 652 227 652 227 640 214.5 c 128,-1,134 + 628 202 628 202 628 185 c 0,135,136 + 628 129 628 129 667.5 89.5 c 128,-1,94 + 707 50 707 50 763 50 c 128,-1,95 +EndSplineSet +EndChar + +StartChar: glyph257 +Encoding: 257 57601 258 +Width: 875 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 96 + 4 + 1 + 10 + 2 + 52 + 1 + 9 + 3 + 2 + 66 + 0 + 3 + 10 + 9 + 10 + 3 + 9 + 104 + 0 + 7 + 9 + 5 + 9 + 7 + 5 + 104 + 12 + 1 + 4 + 11 + 1 + 2 + 10 + 4 + 2 + 91 + 0 + 10 + 0 + 9 + 7 + 10 + 9 + 91 + 8 + 1 + 5 + 0 + 0 + 5 + 79 + 8 + 1 + 5 + 5 + 0 + 83 + 6 + 13 + 1 + 3 + 0 + 5 + 0 + 71 + 20 + 18 + 91 + 89 + 82 + 80 + 77 + 75 + 72 + 70 + 67 + 66 + 62 + 61 + 57 + 56 + 48 + 46 + 40 + 39 + 34 + 33 + 28 + 27 + 18 + 51 + 20 + 51 + 16 + 14 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +125 50 m 128,-1,1 + 108 50 108 50 95.5 62.5 c 128,-1,2 + 83 75 83 75 83 92 c 2,3,-1 + 83 358 l 1,4,-1 + 60 346 l 2,5,6 + 44 338 44 338 27.5 343.5 c 128,-1,7 + 11 349 11 349 4 365 c 0,8,9 + -4 381 -4 381 1.5 397.5 c 128,-1,10 + 7 414 7 414 23 421 c 2,11,-1 + 106 462 l 2,12,13 + 128 473 128 473 147.5 459.5 c 128,-1,14 + 167 446 167 446 167 425 c 2,15,-1 + 167 92 l 2,16,17 + 167 75 167 75 154.5 62.5 c 128,-1,0 + 142 50 142 50 125 50 c 128,-1,1 +500 50 m 2,18,-1 + 292 50 l 2,19,20 + 266 50 266 50 254 75.5 c 128,-1,21 + 242 101 242 101 262 121 c 2,22,-1 + 429 288 l 2,23,24 + 445 304 445 304 445 327 c 0,25,26 + 445 351 445 351 429 367 c 128,-1,27 + 413 383 413 383 389.5 383 c 128,-1,28 + 366 383 366 383 350 367 c 0,29,30 + 333 352 333 352 333 327 c 0,31,32 + 333 310 333 310 321 298 c 128,-1,33 + 309 286 309 286 292 286 c 128,-1,34 + 275 286 275 286 262.5 298 c 128,-1,35 + 250 310 250 310 250 327 c 0,36,37 + 250 385 250 385 291 426 c 0,38,39 + 331 466 331 466 389.5 466 c 128,-1,40 + 448 466 448 466 488 426 c 0,41,42 + 529 385 529 385 529 327 c 0,43,44 + 529 270 529 270 488 229 c 2,45,-1 + 392 133 l 1,46,-1 + 500 133 l 2,47,48 + 517 133 517 133 529.5 121 c 128,-1,49 + 542 109 542 109 542 92 c 128,-1,50 + 542 75 542 75 529.5 62.5 c 128,-1,51 + 517 50 517 50 500 50 c 2,18,-1 +831 284 m 1,52,53 + 875 243 875 243 875 185 c 0,54,55 + 875 129 875 129 835.5 89.5 c 128,-1,56 + 796 50 796 50 740 50 c 128,-1,57 + 684 50 684 50 644 89.5 c 128,-1,58 + 604 129 604 129 604 185 c 0,59,60 + 604 202 604 202 616.5 214.5 c 128,-1,61 + 629 227 629 227 646 227 c 128,-1,62 + 663 227 663 227 675.5 214.5 c 128,-1,63 + 688 202 688 202 688 185 c 0,64,65 + 688 163 688 163 703 148 c 128,-1,66 + 718 133 718 133 740 133 c 128,-1,67 + 762 133 762 133 777 148 c 128,-1,68 + 792 163 792 163 792 185 c 128,-1,69 + 792 207 792 207 777 222.5 c 128,-1,70 + 762 238 762 238 740 238 c 0,71,72 + 723 238 723 238 710.5 250 c 128,-1,73 + 698 262 698 262 698 279 c 128,-1,74 + 698 296 698 296 710.5 308.5 c 128,-1,75 + 723 321 723 321 740 321 c 0,76,77 + 753 321 753 321 762 330 c 128,-1,78 + 771 339 771 339 771 352 c 128,-1,79 + 771 365 771 365 762 374 c 128,-1,80 + 753 383 753 383 740 383 c 0,81,82 + 720 383 720 383 712 366 c 0,83,84 + 704 351 704 351 687.5 346 c 128,-1,85 + 671 341 671 341 656 349 c 128,-1,86 + 641 357 641 357 635.5 373.5 c 128,-1,87 + 630 390 630 390 638 405 c 0,88,89 + 671 467 671 467 740 467 c 0,90,91 + 787 467 787 467 820.5 433 c 128,-1,92 + 854 399 854 399 854 352 c 0,93,94 + 854 315 854 315 831 284 c 1,52,53 +EndSplineSet +EndChar + +StartChar: glyph258 +Encoding: 258 57602 259 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 79 + 59 + 1 + 5 + 8 + 77 + 75 + 74 + 72 + 66 + 58 + 56 + 55 + 48 + 36 + 26 + 11 + 7 + 5 + 2 + 66 + 0 + 5 + 8 + 7 + 8 + 5 + 7 + 104 + 0 + 4 + 0 + 8 + 5 + 4 + 8 + 91 + 0 + 7 + 0 + 2 + 0 + 7 + 2 + 91 + 0 + 0 + 0 + 1 + 6 + 0 + 1 + 91 + 0 + 6 + 3 + 3 + 6 + 79 + 0 + 6 + 6 + 3 + 83 + 0 + 3 + 6 + 3 + 71 + 41 + 38 + 35 + 21 + 42 + 35 + 38 + 34 + 33 + 9 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +167 133 m 0,0,1 + 167 175 167 175 208 175 c 0,2,3 + 250 175 250 175 250 133 c 0,4,5 + 250 92 250 92 208 92 c 0,6,7 + 167 92 167 92 167 133 c 0,0,1 +739 606 m 0,8,9 + 792 533 792 533 792 446 c 0,10,11 + 792 334 792 334 712 254 c 0,12,13 + 633 175 633 175 521 175 c 1,14,-1 + 505 176 l 1,15,16 + 395 32 395 32 367 -1 c 0,17,18 + 306 -75 306 -75 208 -75 c 0,19,20 + 122 -75 122 -75 61 -14 c 128,-1,21 + 0 47 0 47 0 133 c 0,22,23 + 0 227 0 227 74 292 c 0,24,25 + 160 365 160 365 251 430 c 1,26,-1 + 250 446 l 1,27,28 + 250 558 250 558 329 637 c 0,29,30 + 409 717 409 717 521 717 c 0,31,32 + 608 717 608 717 681 664 c 0,33,34 + 693 652 693 652 693 635 c 128,-1,35 + 693 618 693 618 681 606 c 1,36,37 + 693 618 693 618 710 618 c 128,-1,38 + 727 618 727 618 739 606 c 0,8,9 +83 133 m 0,39,40 + 83 82 83 82 120 45 c 128,-1,41 + 157 8 157 8 208 8 c 0,42,43 + 266 8 266 8 303 53 c 0,44,45 + 344 100 344 100 399 174 c 0,46,47 + 451 243 451 243 471 266 c 1,48,49 + 500 258 500 258 521 258 c 0,50,51 + 598 258 598 258 653 313.5 c 128,-1,52 + 708 369 708 369 708 446 c 0,53,54 + 708 468 708 468 700 498 c 1,55,-1 + 583 383 l 1,56,-1 + 479 404 l 1,57,-1 + 458 508 l 1,58,-1 + 577 624 l 1,59,60 + 547 633 547 633 521 633 c 0,61,62 + 444 633 444 633 388.5 578 c 128,-1,63 + 333 523 333 523 333 446 c 0,64,65 + 333 425 333 425 341 396 c 1,66,67 + 314 374 314 374 248 324 c 0,68,69 + 188 279 188 279 128 229 c 0,70,71 + 83 190 83 190 83 133 c 0,39,40 +683 539 m 1,72,73 + 660 579 660 579 617 605 c 1,74,-1 + 504 494 l 1,75,-1 + 515 440 l 1,76,-1 + 570 428 l 1,77,-1 + 683 539 l 1,72,73 +EndSplineSet +EndChar + +StartChar: glyph259 +Encoding: 259 57603 260 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 33 + 31 + 20 + 7 + 4 + 0 + 2 + 1 + 66 + 0 + 4 + 0 + 3 + 0 + 4 + 3 + 104 + 0 + 2 + 0 + 0 + 4 + 2 + 0 + 91 + 0 + 3 + 1 + 1 + 3 + 79 + 0 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 + 19 + 26 + 43 + 37 + 36 + 5 + 20 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +643 518 m 0,0,1 + 667 511 667 511 667 446 c 0,2,3 + 667 360 667 360 605.5 299 c 128,-1,4 + 544 238 544 238 458 238 c 0,5,6 + 436 238 436 238 416 242 c 1,7,8 + 391 211 391 211 344 149 c 128,-1,9 + 297 87 297 87 257 40 c 0,10,11 + 213 -12 213 -12 146 -12 c 0,12,13 + 86 -12 86 -12 43 30.5 c 128,-1,14 + 0 73 0 73 0 133 c 0,15,16 + 0 200 0 200 51 245 c 0,17,18 + 98 285 98 285 161 331.5 c 128,-1,19 + 224 378 224 378 255 404 c 1,20,21 + 250 429 250 429 250 446 c 0,22,23 + 250 532 250 532 311 593 c 128,-1,24 + 372 654 372 654 458 654 c 0,25,26 + 489 654 489 654 520 644 c 0,27,28 + 531 641 531 641 534.5 629.5 c 128,-1,29 + 538 618 538 618 529 609 c 2,30,-1 + 418 501 l 1,31,-1 + 434 422 l 1,32,-1 + 514 406 l 1,33,-1 + 623 512 l 2,34,35 + 632 521 632 521 643 518 c 0,0,1 +146 92 m 128,-1,37 + 163 92 163 92 175.5 104 c 128,-1,38 + 188 116 188 116 188 133 c 128,-1,39 + 188 150 188 150 175.5 162.5 c 128,-1,40 + 163 175 163 175 146 175 c 128,-1,41 + 129 175 129 175 116.5 162.5 c 128,-1,42 + 104 150 104 150 104 133 c 128,-1,43 + 104 116 104 116 116.5 104 c 128,-1,36 + 129 92 129 92 146 92 c 128,-1,37 +EndSplineSet +EndChar + +StartChar: glyph260 +Encoding: 260 57604 261 +Width: 751 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 43 + 74 + 19 + 0 + 3 + 3 + 1 + 1 + 66 + 0 + 1 + 3 + 1 + 106 + 0 + 3 + 0 + 3 + 106 + 0 + 0 + 2 + 2 + 0 + 79 + 0 + 0 + 0 + 2 + 83 + 0 + 2 + 0 + 2 + 71 + 66 + 65 + 37 + 35 + 31 + 30 + 25 + 4 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +379 308 m 1,0,1 + 408 323 408 323 405.5 355 c 128,-1,2 + 403 387 403 387 379 408 c 0,3,4 + 344 435 344 435 301.5 424.5 c 128,-1,5 + 259 414 259 414 237 375 c 0,6,7 + 209 323 209 323 223 277 c 128,-1,8 + 237 231 237 231 282 200 c 128,-1,9 + 327 169 327 169 379 171 c 0,10,11 + 461 177 461 177 506.5 246.5 c 128,-1,12 + 552 316 552 316 533 396 c 0,13,14 + 512 488 512 488 427.5 531.5 c 128,-1,15 + 343 575 343 575 254 546 c 0,16,17 + 174 522 174 522 127.5 448 c 128,-1,18 + 81 374 81 374 87 288 c 0,19,20 + 96 195 96 195 160.5 126.5 c 128,-1,21 + 225 58 225 58 316 42 c 0,22,23 + 404 26 404 26 486.5 63 c 128,-1,24 + 569 100 569 100 616 175 c 0,25,26 + 666 254 666 254 666 333 c 0,27,28 + 666 349 666 349 680 361.5 c 128,-1,29 + 694 374 694 374 712 371 c 0,30,31 + 735 371 735 371 744 352.5 c 128,-1,32 + 753 334 753 334 750 312 c 0,33,34 + 737 164 737 164 624 59 c 128,-1,35 + 511 -46 511 -46 362 -46 c 0,36,37 + 290 -46 290 -46 223 -17 c 128,-1,38 + 156 12 156 12 108.5 60.5 c 128,-1,39 + 61 109 61 109 30.5 172.5 c 128,-1,40 + 0 236 0 236 0 305.5 c 128,-1,41 + 0 375 0 375 29 446 c 0,42,43 + 67 528 67 528 142 579 c 128,-1,44 + 217 630 217 630 298 639 c 128,-1,45 + 379 648 379 648 458.5 612 c 128,-1,46 + 538 576 538 576 583 496 c 0,47,48 + 630 419 630 419 620.5 325.5 c 128,-1,49 + 611 232 611 232 546 167 c 0,50,51 + 483 104 483 104 392 95 c 128,-1,52 + 301 86 301 86 225 138 c 0,53,54 + 154 189 154 189 139 277 c 128,-1,55 + 124 365 124 365 179 438 c 0,56,57 + 214 485 214 485 271.5 502.5 c 128,-1,58 + 329 520 329 520 385 500.5 c 128,-1,59 + 441 481 441 481 471 429 c 0,60,61 + 488 400 488 400 488.5 362.5 c 128,-1,62 + 489 325 489 325 475.5 293 c 128,-1,63 + 462 261 462 261 432.5 241 c 128,-1,64 + 403 221 403 221 366 225 c 1,65,66 + 314 225 314 225 282.5 269 c 128,-1,67 + 251 313 251 313 279 358 c 0,68,69 + 299 385 299 385 330 381.5 c 128,-1,70 + 361 378 361 378 375 354 c 1,71,72 + 379 339 379 339 380 327.5 c 128,-1,73 + 381 316 381 316 380 312 c 2,74,-1 + 379 308 l 1,0,1 +EndSplineSet +EndChar + +StartChar: glyph261 +Encoding: 261 57605 262 +Width: 772 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 34 + 43 + 34 + 27 + 3 + 3 + 2 + 1 + 66 + 0 + 1 + 0 + 1 + 106 + 0 + 0 + 2 + 0 + 106 + 0 + 2 + 3 + 2 + 106 + 0 + 3 + 3 + 97 + 39 + 37 + 21 + 36 + 21 + 4 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +18 329 m 2,0,1 + -5 352 -5 352 2 396 c 0,2,3 + 8 412 8 412 22 423.5 c 128,-1,4 + 36 435 36 435 52 438 c 2,5,-1 + 56 438 l 1,6,-1 + 252 458 l 1,7,-1 + 331 638 l 1,8,-1 + 335 642 l 1,9,10 + 354 675 354 675 389 675 c 0,11,12 + 406 675 406 675 419 664.5 c 128,-1,13 + 432 654 432 654 435 633 c 1,14,-1 + 439 629 l 1,15,-1 + 518 450 l 1,16,-1 + 714 429 l 1,17,-1 + 718 429 l 1,18,19 + 752 423 752 423 767.5 389 c 128,-1,20 + 783 355 783 355 756 325 c 0,21,22 + 744 314 744 314 730 301.5 c 128,-1,23 + 716 289 716 289 698.5 273.5 c 128,-1,24 + 681 258 681 258 672 250 c 0,25,26 + 620 198 620 198 606 188 c 1,27,-1 + 647 -4 l 2,28,29 + 654 -49 654 -49 622 -67 c 0,30,31 + 597 -85 597 -85 560 -71 c 1,32,-1 + 556 -67 l 1,33,-1 + 385 29 l 1,34,-1 + 214 -67 l 1,35,-1 + 210 -71 l 2,36,37 + 202 -75 202 -75 185 -75 c 0,38,39 + 165 -75 165 -75 152 -62 c 1,40,41 + 120 -44 120 -44 127 0 c 2,42,-1 + 168 192 l 1,43,-1 + 18 329 l 2,0,1 +EndSplineSet +EndChar + +StartChar: glyph262 +Encoding: 262 57606 263 +Width: 772 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 51 + 58 + 1 + 0 + 1 + 54 + 51 + 43 + 27 + 4 + 4 + 2 + 47 + 34 + 2 + 3 + 4 + 3 + 66 + 0 + 1 + 0 + 1 + 106 + 0 + 0 + 2 + 0 + 106 + 0 + 2 + 4 + 2 + 106 + 0 + 4 + 3 + 4 + 106 + 0 + 3 + 3 + 97 + 45 + 44 + 39 + 37 + 21 + 36 + 21 + 5 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +18 329 m 2,0,1 + -5 352 -5 352 2 396 c 0,2,3 + 8 412 8 412 22 423.5 c 128,-1,4 + 36 435 36 435 52 438 c 2,5,-1 + 56 438 l 1,6,-1 + 252 458 l 1,7,-1 + 331 638 l 1,8,-1 + 335 642 l 1,9,10 + 354 675 354 675 389 675 c 0,11,12 + 406 675 406 675 419 664.5 c 128,-1,13 + 432 654 432 654 435 633 c 1,14,-1 + 439 629 l 1,15,-1 + 518 450 l 1,16,-1 + 714 429 l 1,17,-1 + 718 429 l 1,18,19 + 752 423 752 423 767.5 389 c 128,-1,20 + 783 355 783 355 756 325 c 0,21,22 + 744 314 744 314 730 301.5 c 128,-1,23 + 716 289 716 289 698.5 273.5 c 128,-1,24 + 681 258 681 258 672 250 c 0,25,26 + 620 198 620 198 606 188 c 1,27,-1 + 647 -4 l 2,28,29 + 654 -49 654 -49 622 -67 c 0,30,31 + 597 -85 597 -85 560 -71 c 1,32,-1 + 556 -67 l 1,33,-1 + 385 29 l 1,34,-1 + 214 -67 l 1,35,-1 + 210 -71 l 2,36,37 + 202 -75 202 -75 185 -75 c 0,38,39 + 165 -75 165 -75 152 -62 c 1,40,41 + 120 -44 120 -44 127 0 c 2,42,-1 + 168 192 l 1,43,-1 + 18 329 l 2,0,1 +389 121 m 1,44,45 + 401 121 401 121 410 112 c 2,46,-1 + 560 25 l 1,47,48 + 555 59 555 59 546.5 100.5 c 128,-1,49 + 538 142 538 142 532.5 167.5 c 128,-1,50 + 527 193 527 193 527 196 c 0,51,52 + 520 225 520 225 539 238 c 2,53,-1 + 668 354 l 1,54,-1 + 493 375 l 1,55,56 + 465 384 465 384 460 400 c 2,57,-1 + 389 558 l 1,58,-1 + 389 121 l 1,44,45 +EndSplineSet +EndChar + +StartChar: glyph263 +Encoding: 263 57607 264 +Width: 348 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 20 + 14 + 10 + 9 + 3 + 4 + 1 + 63 + 0 + 0 + 1 + 0 + 106 + 0 + 1 + 1 + 97 + 30 + 17 + 2 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +327 621 m 1,0,1 + 339 633 339 633 348 633 c 1,2,-1 + 348 79 l 1,3,4 + 231 13 231 13 156 -29 c 0,5,6 + 142 -36 142 -36 131 -25 c 0,7,8 + 123 -21 123 -21 123 -4 c 2,9,-1 + 168 212 l 1,10,11 + 73 304 73 304 6 362 c 0,12,13 + -4 372 -4 372 2 383 c 0,14,15 + 2 386 2 386 7 391 c 128,-1,16 + 12 396 12 396 18 396 c 2,17,-1 + 235 421 l 1,18,19 + 289 542 289 542 327 621 c 1,0,1 +EndSplineSet +EndChar + +StartChar: glyph264 +Encoding: 264 57608 265 +Width: 779 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 33 + 53 + 49 + 45 + 41 + 37 + 29 + 9 + 3 + 8 + 0 + 1 + 1 + 66 + 0 + 1 + 0 + 1 + 106 + 2 + 1 + 0 + 0 + 97 + 1 + 0 + 21 + 19 + 0 + 32 + 1 + 32 + 3 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +592 -74 m 0,0,1 + 581 -74 581 -74 561 -65 c 2,2,-1 + 390 32 l 1,3,-1 + 218 -65 l 2,4,5 + 180 -83 180 -83 151 -62 c 0,6,7 + 118 -39 118 -39 126 1 c 2,8,-1 + 166 195 l 1,9,10 + 142 217 142 217 93 261 c 128,-1,11 + 44 305 44 305 20 327 c 0,12,13 + -8 357 -8 357 3 393 c 0,14,15 + 15 429 15 429 56 436 c 2,16,-1 + 251 457 l 1,17,-1 + 333 637 l 2,18,19 + 354 674 354 674 390 674 c 0,20,21 + 427 674 427 674 447 637 c 2,22,-1 + 528 457 l 1,23,-1 + 724 435 l 2,24,25 + 764 429 764 429 776 393 c 0,26,27 + 788 356 788 356 759 327 c 2,28,-1 + 613 194 l 1,29,-1 + 653 1 l 2,30,31 + 658 -27 658 -27 640 -50.5 c 128,-1,32 + 622 -74 622 -74 592 -74 c 0,0,1 +252 200 m 0,33,34 + 251 197 251 197 246 171.5 c 128,-1,35 + 241 146 241 146 232.5 104 c 128,-1,36 + 224 62 224 62 217 30 c 1,37,-1 + 369 116 l 2,38,39 + 390 127 390 127 410 116 c 2,40,-1 + 562 30 l 1,41,-1 + 527 201 l 2,42,43 + 522 224 522 224 540 240 c 2,44,-1 + 669 358 l 1,45,-1 + 495 377 l 2,46,47 + 471 380 471 380 462 401 c 2,48,-1 + 390 560 l 1,49,-1 + 318 401 l 2,50,51 + 308 380 308 380 284 377 c 2,52,-1 + 111 358 l 1,53,-1 + 240 240 l 2,54,55 + 257 225 257 225 252 200 c 0,33,34 +EndSplineSet +EndChar + +StartChar: glyph265 +Encoding: 265 57609 266 +Width: 696 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 13 + 22 + 16 + 11 + 3 + 0 + 63 + 0 + 0 + 0 + 97 + 18 + 1 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +238 418 m 1,0,-1 + 329 620 l 2,1,2 + 334 632 334 632 348 632 c 128,-1,3 + 362 632 362 632 367 620 c 2,4,-1 + 458 418 l 1,5,6 + 589 404 589 404 677 394 c 0,7,8 + 689 392 689 392 694 380 c 128,-1,9 + 699 368 699 368 689 358 c 2,10,-1 + 526 209 l 1,11,-1 + 570 -7 l 2,12,13 + 572 -19 572 -19 562 -27.5 c 128,-1,14 + 552 -36 552 -36 540 -29 c 2,15,-1 + 348 80 l 1,16,17 + 233 15 233 15 156 -29 c 0,18,19 + 144 -36 144 -36 133.5 -27.5 c 128,-1,20 + 123 -19 123 -19 125 -7 c 2,21,-1 + 170 209 l 1,22,23 + 72 298 72 298 7 358 c 0,24,25 + -3 367 -3 367 2 379.5 c 128,-1,26 + 7 392 7 392 19 394 c 2,27,-1 + 238 418 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph266 +Encoding: 266 57610 267 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 93 + 82 + 78 + 74 + 50 + 45 + 41 + 6 + 3 + 4 + 92 + 65 + 60 + 35 + 30 + 4 + 6 + 8 + 6 + 101 + 1 + 9 + 8 + 113 + 108 + 102 + 24 + 20 + 14 + 10 + 7 + 1 + 0 + 4 + 66 + 0 + 9 + 8 + 0 + 8 + 9 + 0 + 104 + 0 + 4 + 3 + 1 + 4 + 79 + 5 + 1 + 3 + 7 + 1 + 6 + 8 + 3 + 6 + 91 + 10 + 1 + 8 + 2 + 1 + 0 + 1 + 8 + 0 + 89 + 0 + 4 + 4 + 1 + 83 + 0 + 1 + 4 + 1 + 71 + 118 + 116 + 106 + 104 + 42 + 46 + 45 + 23 + 23 + 29 + 23 + 39 + 24 + 11 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +815 335 m 2,0,1 + 833 323 833 323 833 300 c 128,-1,2 + 833 277 833 277 815 265 c 2,3,-1 + 738 214 l 1,4,-1 + 779 131 l 2,5,6 + 790 110 790 110 777 91.5 c 128,-1,7 + 764 73 764 73 744 71 c 2,8,-1 + 652 65 l 1,9,-1 + 646 -28 l 2,10,11 + 644 -48 644 -48 626 -60.5 c 128,-1,12 + 608 -73 608 -73 586 -62 c 2,13,-1 + 503 -21 l 1,14,-1 + 451 -98 l 2,15,16 + 438 -117 438 -117 417 -117 c 0,17,18 + 395 -117 395 -117 382 -98 c 2,19,-1 + 331 -21 l 1,20,-1 + 248 -62 l 2,21,22 + 227 -73 227 -73 208.5 -60.5 c 128,-1,23 + 190 -48 190 -48 188 -28 c 2,24,-1 + 182 65 l 1,25,-1 + 89 71 l 2,26,27 + 69 73 69 73 56.5 91 c 128,-1,28 + 44 109 44 109 55 131 c 2,29,-1 + 96 214 l 1,30,-1 + 19 265 l 2,31,32 + 0 278 0 278 0 300 c 128,-1,33 + 0 322 0 322 19 335 c 2,34,-1 + 96 386 l 1,35,-1 + 55 469 l 2,36,37 + 44 491 44 491 56.5 509 c 128,-1,38 + 69 527 69 527 89 529 c 2,39,-1 + 182 535 l 1,40,-1 + 188 627 l 2,41,42 + 190 647 190 647 208.5 660 c 128,-1,43 + 227 673 227 673 248 662 c 2,44,-1 + 331 621 l 1,45,-1 + 382 698 l 2,46,47 + 393 715 393 715 416.5 715 c 128,-1,48 + 440 715 440 715 451 698 c 2,49,-1 + 503 621 l 1,50,-1 + 586 662 l 2,51,52 + 607 673 607 673 626 660 c 128,-1,53 + 645 647 645 647 646 627 c 2,54,-1 + 652 535 l 1,55,-1 + 744 529 l 2,56,57 + 764 527 764 527 777 509 c 128,-1,58 + 790 491 790 491 779 469 c 2,59,-1 + 738 386 l 1,60,-1 + 815 335 l 2,0,1 +647 210 m 2,61,62 + 640 224 640 224 644 239 c 128,-1,63 + 648 254 648 254 661 263 c 2,64,-1 + 717 300 l 1,65,-1 + 661 337 l 2,66,67 + 632 358 632 358 647 390 c 2,68,-1 + 677 450 l 1,69,-1 + 610 454 l 2,70,71 + 594 455 594 455 583 466 c 128,-1,72 + 572 477 572 477 571 493 c 2,73,-1 + 567 560 l 1,74,-1 + 507 530 l 2,75,76 + 475 515 475 515 454 544 c 2,77,-1 + 417 600 l 1,78,-1 + 380 544 l 2,79,80 + 359 515 359 515 327 530 c 2,81,-1 + 267 560 l 1,82,-1 + 263 493 l 2,83,84 + 262 477 262 477 251 466 c 128,-1,85 + 240 455 240 455 224 454 c 2,86,-1 + 157 450 l 1,87,-1 + 187 390 l 2,88,89 + 194 376 194 376 189.5 361 c 128,-1,90 + 185 346 185 346 172 337 c 2,91,-1 + 117 300 l 1,92,-1 + 172 263 l 2,93,94 + 185 254 185 254 189.5 239 c 128,-1,95 + 194 224 194 224 187 210 c 2,96,-1 + 157 150 l 1,97,-1 + 224 146 l 2,98,99 + 240 145 240 145 250.5 134 c 128,-1,100 + 261 123 261 123 262 107 c 2,101,-1 + 267 40 l 1,102,-1 + 327 70 l 2,103,104 + 335 74 335 74 345 74 c 0,105,106 + 368 74 368 74 380 56 c 2,107,-1 + 417 0 l 1,108,-1 + 454 55 l 2,109,110 + 463 68 463 68 478 72.5 c 128,-1,111 + 493 77 493 77 507 70 c 2,112,-1 + 567 40 l 1,113,-1 + 571 107 l 2,114,115 + 572 123 572 123 583 134 c 128,-1,116 + 594 145 594 145 610 146 c 2,117,-1 + 676 150 l 1,118,-1 + 647 210 l 2,61,62 +EndSplineSet +EndChar + +StartChar: glyph267 +Encoding: 267 57611 268 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 54 + 50 + 45 + 3 + 2 + 3 + 35 + 30 + 5 + 0 + 4 + 1 + 2 + 20 + 15 + 11 + 10 + 4 + 0 + 1 + 3 + 66 + 0 + 3 + 2 + 0 + 3 + 79 + 4 + 1 + 2 + 0 + 1 + 0 + 2 + 1 + 89 + 0 + 3 + 3 + 0 + 83 + 0 + 0 + 3 + 0 + 71 + 56 + 55 + 48 + 47 + 40 + 39 + 26 + 25 + 18 + 17 + 5 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +690 379 m 1,0,-1 + 782 317 l 2,1,2 + 792 310 792 310 792 300 c 128,-1,3 + 792 290 792 290 782 283 c 2,4,-1 + 690 221 l 1,5,-1 + 739 122 l 2,6,7 + 745 111 745 111 738.5 102 c 128,-1,8 + 732 93 732 93 722 92 c 2,9,-1 + 611 84 l 1,10,-1 + 604 -26 l 2,11,12 + 603 -36 603 -36 594 -42.5 c 128,-1,13 + 585 -49 585 -49 574 -44 c 2,14,-1 + 475 6 l 1,15,-1 + 413 -87 l 2,16,17 + 407 -96 407 -96 396 -96 c 128,-1,18 + 385 -96 385 -96 379 -87 c 2,19,-1 + 317 6 l 1,20,-1 + 218 -44 l 2,21,22 + 207 -49 207 -49 198 -42.5 c 128,-1,23 + 189 -36 189 -36 188 -26 c 2,24,-1 + 180 85 l 1,25,-1 + 70 92 l 2,26,27 + 60 93 60 93 53 102.5 c 128,-1,28 + 46 112 46 112 52 122 c 2,29,-1 + 102 221 l 1,30,-1 + 9 283 l 2,31,32 + 0 289 0 289 0 300 c 128,-1,33 + 0 311 0 311 9 317 c 2,34,-1 + 102 379 l 1,35,-1 + 52 478 l 2,36,37 + 46 488 46 488 53 497.5 c 128,-1,38 + 60 507 60 507 70 508 c 2,39,-1 + 180 515 l 1,40,-1 + 188 626 l 2,41,42 + 189 636 189 636 198 642.5 c 128,-1,43 + 207 649 207 649 218 643 c 2,44,-1 + 317 594 l 1,45,-1 + 379 687 l 2,46,47 + 385 696 385 696 396 696 c 128,-1,48 + 407 696 407 696 413 687 c 2,49,-1 + 475 594 l 1,50,-1 + 574 643 l 2,51,52 + 585 649 585 649 594 642.5 c 128,-1,53 + 603 636 603 636 604 626 c 2,54,-1 + 611 515 l 1,55,-1 + 722 508 l 2,56,57 + 732 507 732 507 738.5 498 c 128,-1,58 + 745 489 745 489 739 478 c 2,59,-1 + 690 379 l 1,0,-1 +EndSplineSet +EndChar + +StartChar: glyph268 +Encoding: 268 57612 269 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 15 + 26 + 11 + 2 + 4 + 1 + 29 + 1 + 10 + 6 + 0 + 1 + 13 + 10 + 3 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 70 + 0 + 4 + 1 + 6 + 1 + 4 + 6 + 104 + 0 + 6 + 10 + 1 + 6 + 94 + 0 + 9 + 13 + 7 + 7 + 9 + 96 + 0 + 2 + 3 + 1 + 1 + 4 + 2 + 1 + 91 + 0 + 10 + 0 + 13 + 9 + 10 + 13 + 91 + 0 + 7 + 0 + 8 + 12 + 7 + 8 + 92 + 0 + 12 + 0 + 11 + 5 + 12 + 11 + 91 + 0 + 5 + 0 + 0 + 5 + 79 + 0 + 5 + 5 + 0 + 83 + 0 + 0 + 5 + 0 + 71 +ELSE +NPUSHB + 72 + 0 + 4 + 1 + 6 + 1 + 4 + 6 + 104 + 0 + 6 + 10 + 1 + 6 + 10 + 102 + 0 + 9 + 13 + 7 + 13 + 9 + 7 + 104 + 0 + 2 + 3 + 1 + 1 + 4 + 2 + 1 + 91 + 0 + 10 + 0 + 13 + 9 + 10 + 13 + 91 + 0 + 7 + 0 + 8 + 12 + 7 + 8 + 92 + 0 + 12 + 0 + 11 + 5 + 12 + 11 + 91 + 0 + 5 + 0 + 0 + 5 + 79 + 0 + 5 + 5 + 0 + 83 + 0 + 0 + 5 + 0 + 71 +EIF +NPUSHB + 21 + 77 + 76 + 73 + 72 + 69 + 68 + 65 + 64 + 61 + 60 + 51 + 35 + 19 + 22 + 23 + 35 + 51 + 39 + 20 + 14 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +684 429 m 1,0,1 + 750 335 750 335 750 217 c 0,2,3 + 750 62 750 62 640 -48 c 128,-1,4 + 530 -158 530 -158 375 -158 c 128,-1,5 + 220 -158 220 -158 110 -48 c 128,-1,6 + 0 62 0 62 0 217 c 0,7,8 + 0 361 0 361 96 467.5 c 128,-1,9 + 192 574 192 574 334 589 c 1,10,-1 + 333 592 l 1,11,-1 + 333 633 l 1,12,-1 + 292 633 l 2,13,14 + 275 633 275 633 262.5 645.5 c 128,-1,15 + 250 658 250 658 250 675 c 128,-1,16 + 250 692 250 692 262.5 704.5 c 128,-1,17 + 275 717 275 717 292 717 c 2,18,-1 + 458 717 l 2,19,20 + 475 717 475 717 487.5 704.5 c 128,-1,21 + 500 692 500 692 500 675 c 128,-1,22 + 500 658 500 658 487.5 645.5 c 128,-1,23 + 475 633 475 633 458 633 c 2,24,-1 + 417 633 l 1,25,-1 + 417 592 l 1,26,-1 + 416 589 l 1,27,28 + 541 575 541 575 632 489 c 1,29,-1 + 637 496 l 1,30,-1 + 658 517 l 2,31,32 + 670 529 670 529 687.5 529 c 128,-1,33 + 705 529 705 529 717 517 c 128,-1,34 + 729 505 729 505 729 487.5 c 128,-1,35 + 729 470 729 470 717 458 c 2,36,-1 + 696 437 l 2,37,38 + 692 433 692 433 684 429 c 1,0,1 +375 -75 m 128,-1,40 + 496 -75 496 -75 581.5 10.5 c 128,-1,41 + 667 96 667 96 667 217 c 128,-1,42 + 667 338 667 338 581.5 423 c 128,-1,43 + 496 508 496 508 375 508 c 128,-1,44 + 254 508 254 508 168.5 423 c 128,-1,45 + 83 338 83 338 83 217 c 128,-1,46 + 83 96 83 96 168.5 10.5 c 128,-1,39 + 254 -75 254 -75 375 -75 c 128,-1,40 +417 258 m 1,47,-1 + 500 258 l 2,48,49 + 517 258 517 258 529.5 246 c 128,-1,50 + 542 234 542 234 542 217 c 128,-1,51 + 542 200 542 200 529.5 187.5 c 128,-1,52 + 517 175 517 175 500 175 c 2,53,-1 + 375 175 l 2,54,55 + 358 175 358 175 345.5 187.5 c 128,-1,56 + 333 200 333 200 333 217 c 2,57,-1 + 333 342 l 2,58,59 + 333 359 333 359 345.5 371 c 128,-1,60 + 358 383 358 383 375 383 c 128,-1,61 + 392 383 392 383 404.5 371 c 128,-1,62 + 417 359 417 359 417 342 c 2,63,-1 + 417 258 l 1,47,-1 +375 467 m 128,-1,65 + 478 467 478 467 551.5 393.5 c 128,-1,66 + 625 320 625 320 625 217 c 128,-1,67 + 625 114 625 114 551.5 40.5 c 128,-1,68 + 478 -33 478 -33 375 -33 c 128,-1,69 + 272 -33 272 -33 198.5 40.5 c 128,-1,70 + 125 114 125 114 125 217 c 128,-1,71 + 125 320 125 320 198.5 393.5 c 128,-1,64 + 272 467 272 467 375 467 c 128,-1,65 +375 8 m 128,-1,73 + 461 8 461 8 522 69.5 c 128,-1,74 + 583 131 583 131 583 217 c 128,-1,75 + 583 303 583 303 522 364 c 128,-1,76 + 461 425 461 425 375 425 c 128,-1,77 + 289 425 289 425 228 364 c 128,-1,78 + 167 303 167 303 167 217 c 128,-1,79 + 167 131 167 131 228 69.5 c 128,-1,72 + 289 8 289 8 375 8 c 128,-1,73 +EndSplineSet +EndChar + +StartChar: glyph269 +Encoding: 269 57613 270 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 105 + 59 + 56 + 47 + 28 + 4 + 5 + 4 + 63 + 60 + 50 + 48 + 46 + 29 + 27 + 25 + 24 + 10 + 10 + 3 + 5 + 23 + 19 + 14 + 11 + 4 + 2 + 3 + 71 + 68 + 55 + 53 + 51 + 33 + 32 + 30 + 18 + 15 + 10 + 7 + 2 + 67 + 64 + 54 + 34 + 4 + 6 + 7 + 5 + 66 + 0 + 0 + 0 + 4 + 5 + 0 + 4 + 91 + 0 + 5 + 0 + 3 + 2 + 5 + 3 + 91 + 0 + 2 + 0 + 7 + 6 + 2 + 7 + 91 + 0 + 6 + 1 + 1 + 6 + 79 + 0 + 6 + 6 + 1 + 83 + 0 + 1 + 6 + 1 + 71 + 70 + 69 + 66 + 65 + 62 + 61 + 58 + 57 + 43 + 41 + 37 + 36 + 19 + 16 + 8 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +354 654 m 128,-1,1 + 500 654 500 654 604 550 c 128,-1,2 + 708 446 708 446 708 300 c 128,-1,3 + 708 154 708 154 604 50 c 128,-1,4 + 500 -54 500 -54 354 -54 c 128,-1,5 + 208 -54 208 -54 104 50 c 128,-1,6 + 0 154 0 154 0 300 c 128,-1,7 + 0 446 0 446 104 550 c 128,-1,0 + 208 654 208 654 354 654 c 128,-1,1 +625 300 m 128,-1,9 + 625 365 625 365 595 423 c 1,10,-1 + 515 343 l 1,11,12 + 521 322 521 322 521 300 c 128,-1,13 + 521 278 521 278 515 257 c 1,14,-1 + 595 177 l 1,15,8 + 625 235 625 235 625 300 c 128,-1,9 +83 300 m 128,-1,17 + 83 235 83 235 113 177 c 1,18,-1 + 194 258 l 1,19,20 + 188 279 188 279 188 300 c 0,21,22 + 188 322 188 322 194 343 c 1,23,-1 + 113 423 l 1,24,16 + 83 365 83 365 83 300 c 128,-1,17 +211 384 m 1,25,26 + 233 421 233 421 270 443 c 1,27,-1 + 196 517 l 1,28,-1 + 137 458 l 1,29,-1 + 211 384 l 1,25,26 +270 157 m 1,30,31 + 234 177 234 177 211 216 c 1,32,-1 + 137 142 l 1,33,-1 + 196 83 l 1,34,-1 + 270 157 l 1,30,31 +295 241 m 128,-1,36 + 319 217 319 217 354.5 217 c 128,-1,37 + 390 217 390 217 413 241 c 0,38,39 + 438 266 438 266 438 300 c 128,-1,40 + 438 334 438 334 413.5 358.5 c 128,-1,41 + 389 383 389 383 354 383 c 0,42,43 + 320 383 320 383 295.5 358.5 c 128,-1,44 + 271 334 271 334 271 300 c 0,45,35 + 271 265 271 265 295 241 c 128,-1,36 +571 458 m 1,46,-1 + 512 517 l 1,47,-1 + 438 443 l 1,48,49 + 475 421 475 421 497 384 c 1,50,-1 + 571 458 l 1,46,-1 +497 216 m 1,51,52 + 474 177 474 177 438 157 c 1,53,-1 + 512 83 l 1,54,-1 + 571 142 l 1,55,-1 + 497 216 l 1,51,52 +477 541 m 1,56,57 + 419 571 419 571 354 571 c 128,-1,58 + 289 571 289 571 231 541 c 1,59,-1 + 312 460 l 1,60,61 + 336 467 336 467 354 467 c 128,-1,62 + 372 467 372 467 397 460 c 1,63,-1 + 477 541 l 1,56,57 +231 59 m 1,64,65 + 289 29 289 29 354 29 c 128,-1,66 + 419 29 419 29 477 59 c 1,67,-1 + 397 140 l 1,68,69 + 372 133 372 133 354 133 c 128,-1,70 + 336 133 336 133 312 140 c 1,71,-1 + 231 59 l 1,64,65 +EndSplineSet +EndChar + +StartChar: glyph270 +Encoding: 270 57614 271 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 30 +LT +IF +NPUSHB + 49 + 0 + 3 + 6 + 7 + 7 + 3 + 96 + 9 + 1 + 0 + 0 + 6 + 3 + 0 + 6 + 89 + 0 + 7 + 0 + 5 + 8 + 7 + 5 + 92 + 10 + 1 + 8 + 0 + 1 + 4 + 8 + 1 + 91 + 0 + 4 + 2 + 2 + 4 + 77 + 0 + 4 + 4 + 2 + 83 + 0 + 2 + 4 + 2 + 71 +ELSE +NPUSHB + 50 + 0 + 3 + 6 + 7 + 6 + 3 + 7 + 104 + 9 + 1 + 0 + 0 + 6 + 3 + 0 + 6 + 89 + 0 + 7 + 0 + 5 + 8 + 7 + 5 + 92 + 10 + 1 + 8 + 0 + 1 + 4 + 8 + 1 + 91 + 0 + 4 + 2 + 2 + 4 + 77 + 0 + 4 + 4 + 2 + 83 + 0 + 2 + 4 + 2 + 71 +EIF +NPUSHB + 28 + 33 + 33 + 1 + 0 + 33 + 41 + 33 + 41 + 38 + 36 + 35 + 34 + 32 + 30 + 27 + 26 + 21 + 19 + 14 + 11 + 8 + 6 + 0 + 25 + 1 + 24 + 11 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 633 m 2,0,1 + 660 633 660 633 684 608.5 c 128,-1,2 + 708 584 708 584 708 550 c 2,3,-1 + 708 133 l 2,4,5 + 708 98 708 98 684 74 c 128,-1,6 + 660 50 660 50 625 50 c 2,7,-1 + 542 50 l 1,8,-1 + 542 8 l 2,9,10 + 542 -26 542 -26 517.5 -50.5 c 128,-1,11 + 493 -75 493 -75 458 -75 c 2,12,-1 + 83 -75 l 2,13,14 + 48 -75 48 -75 24 -50.5 c 128,-1,15 + 0 -26 0 -26 0 8 c 2,16,-1 + 0 383 l 2,17,18 + 0 418 0 418 24.5 442.5 c 128,-1,19 + 49 467 49 467 83 467 c 2,20,-1 + 125 467 l 1,21,-1 + 125 550 l 2,22,23 + 125 584 125 584 149.5 608.5 c 128,-1,24 + 174 633 174 633 208 633 c 2,25,-1 + 625 633 l 2,0,1 +83 8 m 1,26,-1 + 458 8 l 1,27,-1 + 458 362 l 2,28,29 + 458 370 458 370 452 376.5 c 128,-1,30 + 446 383 446 383 438 383 c 2,31,-1 + 83 383 l 1,32,-1 + 83 8 l 1,26,-1 +625 133 m 1,33,-1 + 625 550 l 1,34,-1 + 208 550 l 1,35,-1 + 208 425 l 1,36,-1 + 438 425 l 2,37,38 + 463 425 463 425 481.5 406.5 c 128,-1,39 + 500 388 500 388 500 362 c 2,40,-1 + 500 133 l 1,41,-1 + 625 133 l 1,33,-1 +EndSplineSet +EndChar + +StartChar: glyph271 +Encoding: 271 57615 272 +Width: 875 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 65 + 7 + 6 + 2 + 2 + 6 + 1 + 66 + 0 + 2 + 6 + 2 + 107 + 0 + 1 + 7 + 1 + 0 + 5 + 1 + 0 + 91 + 0 + 5 + 0 + 3 + 4 + 5 + 3 + 91 + 0 + 4 + 6 + 6 + 4 + 79 + 0 + 4 + 4 + 6 + 83 + 0 + 6 + 4 + 6 + 71 + 1 + 0 + 43 + 42 + 39 + 38 + 35 + 34 + 31 + 30 + 21 + 20 + 12 + 11 + 0 + 10 + 1 + 10 + 8 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 633 m 0,0,1 + 205 633 205 633 144 572 c 128,-1,2 + 83 511 83 511 83 425 c 128,-1,3 + 83 339 83 339 144 278 c 2,4,-1 + 271 154 l 1,5,-1 + 500 -75 l 1,6,-1 + 792 217 l 1,7,8 + 497 512 497 512 439 572 c 0,9,10 + 378 633 378 633 292 633 c 0,0,1 +292 717 m 128,-1,12 + 413 717 413 717 499 631 c 0,13,14 + 586 541 586 541 851 276 c 0,15,16 + 875 251 875 251 875 217 c 128,-1,17 + 875 183 875 183 851 158 c 2,18,-1 + 559 -134 l 2,19,20 + 535 -158 535 -158 500 -158 c 128,-1,21 + 465 -158 465 -158 441 -134 c 2,22,-1 + 225 82 l 2,23,24 + 218 87 218 87 210 94 c 2,25,-1 + 85 219 l 2,26,27 + 0 304 0 304 0 425 c 128,-1,28 + 0 546 0 546 85 631 c 0,29,11 + 171 717 171 717 292 717 c 128,-1,12 +292 488 m 128,-1,31 + 266 488 266 488 247.5 469.5 c 128,-1,32 + 229 451 229 451 229 425 c 128,-1,33 + 229 399 229 399 247.5 381 c 128,-1,34 + 266 363 266 363 292 363 c 128,-1,35 + 318 363 318 363 336 381 c 128,-1,36 + 354 399 354 399 354 425 c 128,-1,37 + 354 451 354 451 336 469.5 c 128,-1,30 + 318 488 318 488 292 488 c 128,-1,31 +292 529 m 128,-1,39 + 335 529 335 529 365.5 498.5 c 128,-1,40 + 396 468 396 468 396 425 c 128,-1,41 + 396 382 396 382 365.5 351.5 c 128,-1,42 + 335 321 335 321 292 321 c 128,-1,43 + 249 321 249 321 218.5 351.5 c 128,-1,44 + 188 382 188 382 188 425 c 128,-1,45 + 188 468 188 468 218.5 498.5 c 128,-1,38 + 249 529 249 529 292 529 c 128,-1,39 +EndSplineSet +EndChar + +StartChar: glyph272 +Encoding: 272 57616 273 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 81 + 44 + 1 + 2 + 4 + 18 + 1 + 7 + 2 + 37 + 36 + 2 + 6 + 5 + 26 + 25 + 2 + 0 + 8 + 4 + 66 + 4 + 1 + 6 + 1 + 65 + 0 + 0 + 8 + 0 + 107 + 0 + 1 + 0 + 3 + 4 + 1 + 3 + 91 + 0 + 4 + 0 + 2 + 7 + 4 + 2 + 91 + 0 + 7 + 0 + 5 + 6 + 7 + 5 + 91 + 0 + 6 + 8 + 8 + 6 + 79 + 0 + 6 + 6 + 8 + 83 + 0 + 8 + 6 + 8 + 71 + 19 + 19 + 19 + 17 + 36 + 41 + 37 + 42 + 26 + 9 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +809 400 m 2,0,1 + 833 375 833 375 833 341 c 128,-1,2 + 833 307 833 307 809 283 c 2,3,-1 + 764 238 l 1,4,-1 + 768 234 l 2,5,6 + 792 209 792 209 791.5 174.5 c 128,-1,7 + 791 140 791 140 767 116 c 2,8,-1 + 476 -176 l 2,9,10 + 452 -200 452 -200 417 -200 c 128,-1,11 + 382 -200 382 -200 358 -176 c 0,12,13 + 177 5 177 5 85 94 c 0,14,15 + 0 179 0 179 0 300 c 0,16,17 + 0 382 0 382 43 451 c 1,18,19 + 37 583 37 583 127 673 c 0,20,21 + 212 758 212 758 333 758 c 0,22,23 + 455 758 455 758 540 673 c 2,24,-1 + 809 400 l 2,0,1 +417 -117 m 1,25,-1 + 708 175 l 1,26,-1 + 439 447 l 2,27,28 + 378 508 378 508 292 508 c 0,29,30 + 205 508 205 508 144 447 c 128,-1,31 + 83 386 83 386 83 300 c 128,-1,32 + 83 214 83 214 144 153 c 0,33,34 + 236 64 236 64 417 -117 c 1,25,-1 +498 506 m 2,35,-1 + 705 297 l 1,36,-1 + 750 342 l 1,37,-1 + 481 614 l 2,38,39 + 420 675 420 675 333 675 c 0,40,41 + 247 675 247 675 186 614 c 0,42,43 + 158 586 158 586 143 551 c 1,44,45 + 212 592 212 592 292 592 c 0,46,47 + 412 592 412 592 498 506 c 2,35,-1 +292 363 m 128,-1,49 + 266 363 266 363 247.5 344.5 c 128,-1,50 + 229 326 229 326 229 300 c 128,-1,51 + 229 274 229 274 247.5 256 c 128,-1,52 + 266 238 266 238 292 238 c 128,-1,53 + 318 238 318 238 336 256 c 128,-1,54 + 354 274 354 274 354 300 c 128,-1,55 + 354 326 354 326 336 344.5 c 128,-1,48 + 318 363 318 363 292 363 c 128,-1,49 +292 404 m 128,-1,57 + 335 404 335 404 365.5 373.5 c 128,-1,58 + 396 343 396 343 396 300 c 128,-1,59 + 396 257 396 257 365.5 226.5 c 128,-1,60 + 335 196 335 196 292 196 c 128,-1,61 + 249 196 249 196 218.5 226.5 c 128,-1,62 + 188 257 188 257 188 300 c 128,-1,63 + 188 343 188 343 218.5 373.5 c 128,-1,56 + 249 404 249 404 292 404 c 128,-1,57 +EndSplineSet +EndChar + +StartChar: glyph273 +Encoding: 273 57617 274 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 125 + 18 + 4 + 16 + 3 + 0 + 6 + 1 + 2 + 3 + 0 + 2 + 89 + 19 + 7 + 17 + 3 + 3 + 5 + 1 + 1 + 8 + 3 + 1 + 91 + 22 + 12 + 20 + 3 + 8 + 14 + 1 + 10 + 11 + 8 + 10 + 89 + 23 + 15 + 21 + 3 + 11 + 9 + 9 + 11 + 77 + 23 + 15 + 21 + 3 + 11 + 11 + 9 + 83 + 13 + 1 + 9 + 11 + 9 + 71 + 76 + 76 + 61 + 60 + 56 + 56 + 41 + 40 + 36 + 36 + 21 + 20 + 16 + 16 + 1 + 0 + 76 + 79 + 76 + 79 + 78 + 77 + 69 + 66 + 60 + 75 + 61 + 74 + 56 + 59 + 56 + 59 + 58 + 57 + 49 + 46 + 40 + 55 + 41 + 54 + 36 + 39 + 36 + 39 + 38 + 37 + 29 + 26 + 20 + 35 + 21 + 34 + 16 + 19 + 16 + 19 + 18 + 17 + 9 + 6 + 0 + 15 + 1 + 14 + 24 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 717 m 2,0,1 + 326 717 326 717 350.5 692.5 c 128,-1,2 + 375 668 375 668 375 633 c 2,3,-1 + 375 425 l 2,4,5 + 375 390 375 390 350.5 366 c 128,-1,6 + 326 342 326 342 292 342 c 2,7,-1 + 83 342 l 2,8,9 + 48 342 48 342 24 366 c 128,-1,10 + 0 390 0 390 0 425 c 2,11,-1 + 0 633 l 2,12,13 + 0 668 0 668 24.5 692.5 c 128,-1,14 + 49 717 49 717 83 717 c 2,15,-1 + 292 717 l 2,0,1 +292 425 m 1,16,-1 + 292 633 l 1,17,-1 + 83 633 l 1,18,-1 + 83 425 l 1,19,-1 + 292 425 l 1,16,-1 +750 717 m 2,20,21 + 784 717 784 717 808.5 692.5 c 128,-1,22 + 833 668 833 668 833 633 c 2,23,-1 + 833 425 l 2,24,25 + 833 390 833 390 808.5 366 c 128,-1,26 + 784 342 784 342 750 342 c 2,27,-1 + 542 342 l 2,28,29 + 507 342 507 342 482.5 366.5 c 128,-1,30 + 458 391 458 391 458 425 c 2,31,-1 + 458 633 l 2,32,33 + 458 668 458 668 483 692.5 c 128,-1,34 + 508 717 508 717 542 717 c 2,35,-1 + 750 717 l 2,20,21 +750 425 m 1,36,-1 + 750 633 l 1,37,-1 + 542 633 l 1,38,-1 + 542 425 l 1,39,-1 + 750 425 l 1,36,-1 +292 258 m 2,40,41 + 326 258 326 258 350.5 234 c 128,-1,42 + 375 210 375 210 375 175 c 2,43,-1 + 375 -33 l 2,44,45 + 375 -68 375 -68 350.5 -92.5 c 128,-1,46 + 326 -117 326 -117 292 -117 c 2,47,-1 + 83 -117 l 2,48,49 + 49 -117 49 -117 24.5 -92.5 c 128,-1,50 + 0 -68 0 -68 0 -33 c 2,51,-1 + 0 175 l 2,52,53 + 0 210 0 210 24 234 c 128,-1,54 + 48 258 48 258 83 258 c 2,55,-1 + 292 258 l 2,40,41 +292 -33 m 1,56,-1 + 292 175 l 1,57,-1 + 83 175 l 1,58,-1 + 83 -33 l 1,59,-1 + 292 -33 l 1,56,-1 +750 258 m 2,60,61 + 784 258 784 258 808.5 234 c 128,-1,62 + 833 210 833 210 833 175 c 2,63,-1 + 833 -33 l 2,64,65 + 833 -68 833 -68 808.5 -92.5 c 128,-1,66 + 784 -117 784 -117 750 -117 c 2,67,-1 + 542 -117 l 2,68,69 + 508 -117 508 -117 483 -92.5 c 128,-1,70 + 458 -68 458 -68 458 -33 c 2,71,-1 + 458 175 l 2,72,73 + 458 209 458 209 482.5 233.5 c 128,-1,74 + 507 258 507 258 542 258 c 2,75,-1 + 750 258 l 2,60,61 +750 -33 m 1,76,-1 + 750 175 l 1,77,-1 + 542 175 l 1,78,-1 + 542 -33 l 1,79,-1 + 750 -33 l 1,76,-1 +EndSplineSet +EndChar + +StartChar: glyph274 +Encoding: 274 57618 275 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 39 + 2 + 1 + 0 + 3 + 1 + 1 + 4 + 0 + 1 + 91 + 6 + 1 + 4 + 5 + 5 + 4 + 79 + 6 + 1 + 4 + 4 + 5 + 83 + 7 + 1 + 5 + 4 + 5 + 71 + 53 + 53 + 53 + 53 + 53 + 53 + 53 + 50 + 8 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +0 550 m 2,0,1 + 0 602 0 602 36.5 638.5 c 128,-1,2 + 73 675 73 675 125 675 c 2,3,-1 + 208 675 l 2,4,5 + 260 675 260 675 296.5 638.5 c 128,-1,6 + 333 602 333 602 333 550 c 2,7,-1 + 333 467 l 2,8,9 + 333 415 333 415 296.5 378.5 c 128,-1,10 + 260 342 260 342 208 342 c 2,11,-1 + 125 342 l 2,12,13 + 73 342 73 342 36.5 378.5 c 128,-1,14 + 0 415 0 415 0 467 c 2,15,-1 + 0 550 l 2,0,1 +417 550 m 2,16,17 + 417 602 417 602 453.5 638.5 c 128,-1,18 + 490 675 490 675 542 675 c 2,19,-1 + 625 675 l 2,20,21 + 677 675 677 675 713.5 638.5 c 128,-1,22 + 750 602 750 602 750 550 c 2,23,-1 + 750 467 l 2,24,25 + 750 415 750 415 713.5 378.5 c 128,-1,26 + 677 342 677 342 625 342 c 2,27,-1 + 542 342 l 2,28,29 + 490 342 490 342 453.5 378.5 c 128,-1,30 + 417 415 417 415 417 467 c 2,31,-1 + 417 550 l 2,16,17 +0 133 m 2,32,33 + 0 185 0 185 36.5 221.5 c 128,-1,34 + 73 258 73 258 125 258 c 2,35,-1 + 208 258 l 2,36,37 + 260 258 260 258 296.5 221.5 c 128,-1,38 + 333 185 333 185 333 133 c 2,39,-1 + 333 50 l 2,40,41 + 333 -2 333 -2 296.5 -38.5 c 128,-1,42 + 260 -75 260 -75 208 -75 c 2,43,-1 + 125 -75 l 2,44,45 + 73 -75 73 -75 36.5 -38.5 c 128,-1,46 + 0 -2 0 -2 0 50 c 2,47,-1 + 0 133 l 2,32,33 +417 133 m 2,48,49 + 417 185 417 185 453.5 221.5 c 128,-1,50 + 490 258 490 258 542 258 c 2,51,-1 + 625 258 l 2,52,53 + 677 258 677 258 713.5 221.5 c 128,-1,54 + 750 185 750 185 750 133 c 2,55,-1 + 750 50 l 2,56,57 + 750 -2 750 -2 713.5 -38.5 c 128,-1,58 + 677 -75 677 -75 625 -75 c 2,59,-1 + 542 -75 l 2,60,61 + 490 -75 490 -75 453.5 -38.5 c 128,-1,62 + 417 -2 417 -2 417 50 c 2,63,-1 + 417 133 l 2,48,49 +EndSplineSet +EndChar + +StartChar: glyph275 +Encoding: 275 57619 276 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 180 + 34 + 20 + 29 + 3 + 10 + 22 + 28 + 2 + 8 + 9 + 10 + 8 + 91 + 35 + 23 + 2 + 9 + 21 + 1 + 11 + 6 + 9 + 11 + 91 + 32 + 16 + 27 + 3 + 6 + 18 + 26 + 2 + 4 + 5 + 6 + 4 + 91 + 33 + 19 + 2 + 5 + 17 + 1 + 7 + 2 + 5 + 7 + 91 + 30 + 12 + 25 + 3 + 2 + 14 + 24 + 2 + 0 + 1 + 2 + 0 + 91 + 31 + 15 + 2 + 1 + 3 + 3 + 1 + 79 + 31 + 15 + 2 + 1 + 1 + 3 + 83 + 13 + 1 + 3 + 1 + 3 + 71 + 128 + 128 + 113 + 112 + 108 + 108 + 93 + 92 + 88 + 88 + 73 + 72 + 61 + 60 + 50 + 48 + 37 + 36 + 26 + 24 + 13 + 12 + 2 + 0 + 128 + 131 + 128 + 131 + 130 + 129 + 121 + 118 + 112 + 127 + 113 + 126 + 108 + 111 + 108 + 111 + 110 + 109 + 101 + 98 + 92 + 107 + 93 + 106 + 88 + 91 + 88 + 91 + 90 + 89 + 81 + 78 + 72 + 87 + 73 + 86 + 67 + 64 + 60 + 71 + 61 + 70 + 56 + 53 + 48 + 59 + 50 + 59 + 43 + 40 + 36 + 47 + 37 + 46 + 32 + 29 + 24 + 35 + 26 + 35 + 19 + 16 + 12 + 23 + 13 + 22 + 8 + 5 + 0 + 11 + 2 + 11 + 36 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +708 50 m 2,0,-1 + 417 50 l 2,1,2 + 400 50 400 50 387.5 37.5 c 128,-1,3 + 375 25 375 25 375 8 c 128,-1,4 + 375 -9 375 -9 387.5 -21 c 128,-1,5 + 400 -33 400 -33 417 -33 c 2,6,-1 + 708 -33 l 2,7,8 + 725 -33 725 -33 737.5 -21 c 128,-1,9 + 750 -9 750 -9 750 8 c 128,-1,10 + 750 25 750 25 737.5 37.5 c 128,-1,11 + 725 50 725 50 708 50 c 2,0,-1 +708 133 m 2,12,13 + 760 133 760 133 796.5 96.5 c 128,-1,14 + 833 60 833 60 833 8 c 128,-1,15 + 833 -44 833 -44 796.5 -80.5 c 128,-1,16 + 760 -117 760 -117 708 -117 c 2,17,-1 + 417 -117 l 2,18,19 + 365 -117 365 -117 328.5 -80.5 c 128,-1,20 + 292 -44 292 -44 292 8 c 128,-1,21 + 292 60 292 60 328.5 96.5 c 128,-1,22 + 365 133 365 133 417 133 c 2,23,-1 + 708 133 l 2,12,13 +708 342 m 2,24,-1 + 417 342 l 2,25,26 + 400 342 400 342 387.5 329.5 c 128,-1,27 + 375 317 375 317 375 300 c 128,-1,28 + 375 283 375 283 387.5 270.5 c 128,-1,29 + 400 258 400 258 417 258 c 2,30,-1 + 708 258 l 2,31,32 + 725 258 725 258 737.5 270.5 c 128,-1,33 + 750 283 750 283 750 300 c 128,-1,34 + 750 317 750 317 737.5 329.5 c 128,-1,35 + 725 342 725 342 708 342 c 2,24,-1 +708 425 m 2,36,37 + 760 425 760 425 796.5 388.5 c 128,-1,38 + 833 352 833 352 833 300 c 128,-1,39 + 833 248 833 248 796.5 211.5 c 128,-1,40 + 760 175 760 175 708 175 c 2,41,-1 + 417 175 l 2,42,43 + 365 175 365 175 328.5 211.5 c 128,-1,44 + 292 248 292 248 292 300 c 128,-1,45 + 292 352 292 352 328.5 388.5 c 128,-1,46 + 365 425 365 425 417 425 c 2,47,-1 + 708 425 l 2,36,37 +708 633 m 2,48,-1 + 417 633 l 2,49,50 + 400 633 400 633 387.5 621 c 128,-1,51 + 375 609 375 609 375 592 c 128,-1,52 + 375 575 375 575 387.5 562.5 c 128,-1,53 + 400 550 400 550 417 550 c 2,54,-1 + 708 550 l 2,55,56 + 725 550 725 550 737.5 562.5 c 128,-1,57 + 750 575 750 575 750 592 c 128,-1,58 + 750 609 750 609 737.5 621 c 128,-1,59 + 725 633 725 633 708 633 c 2,48,-1 +708 717 m 2,60,61 + 760 717 760 717 796.5 680.5 c 128,-1,62 + 833 644 833 644 833 592 c 128,-1,63 + 833 540 833 540 796.5 503.5 c 128,-1,64 + 760 467 760 467 708 467 c 2,65,-1 + 417 467 l 2,66,67 + 365 467 365 467 328.5 503.5 c 128,-1,68 + 292 540 292 540 292 592 c 128,-1,69 + 292 644 292 644 328.5 680.5 c 128,-1,70 + 365 717 365 717 417 717 c 2,71,-1 + 708 717 l 2,60,61 +167 133 m 2,72,73 + 202 133 202 133 226 108.5 c 128,-1,74 + 250 84 250 84 250 50 c 2,75,-1 + 250 -33 l 2,76,77 + 250 -68 250 -68 225.5 -92.5 c 128,-1,78 + 201 -117 201 -117 167 -117 c 2,79,-1 + 83 -117 l 2,80,81 + 49 -117 49 -117 24.5 -92.5 c 128,-1,82 + 0 -68 0 -68 0 -33 c 2,83,-1 + 0 50 l 2,84,85 + 0 84 0 84 24 108.5 c 128,-1,86 + 48 133 48 133 83 133 c 2,87,-1 + 167 133 l 2,72,73 +167 -33 m 1,88,-1 + 167 50 l 1,89,-1 + 83 50 l 1,90,-1 + 83 -33 l 1,91,-1 + 167 -33 l 1,88,-1 +167 425 m 2,92,93 + 202 425 202 425 226 400.5 c 128,-1,94 + 250 376 250 376 250 342 c 2,95,-1 + 250 258 l 2,96,97 + 250 224 250 224 226 199.5 c 128,-1,98 + 202 175 202 175 167 175 c 2,99,-1 + 83 175 l 2,100,101 + 48 175 48 175 24 199.5 c 128,-1,102 + 0 224 0 224 0 258 c 2,103,-1 + 0 342 l 2,104,105 + 0 376 0 376 24 400.5 c 128,-1,106 + 48 425 48 425 83 425 c 2,107,-1 + 167 425 l 2,92,93 +167 258 m 1,108,-1 + 167 342 l 1,109,-1 + 83 342 l 1,110,-1 + 83 258 l 1,111,-1 + 167 258 l 1,108,-1 +167 717 m 2,112,113 + 201 717 201 717 225.5 692.5 c 128,-1,114 + 250 668 250 668 250 633 c 2,115,-1 + 250 550 l 2,116,117 + 250 516 250 516 226 491.5 c 128,-1,118 + 202 467 202 467 167 467 c 2,119,-1 + 83 467 l 2,120,121 + 48 467 48 467 24 491.5 c 128,-1,122 + 0 516 0 516 0 550 c 2,123,-1 + 0 633 l 2,124,125 + 0 668 0 668 24.5 692.5 c 128,-1,126 + 49 717 49 717 83 717 c 2,127,-1 + 167 717 l 2,112,113 +167 550 m 1,128,-1 + 167 633 l 1,129,-1 + 83 633 l 1,130,-1 + 83 550 l 1,131,-1 + 167 550 l 1,128,-1 +EndSplineSet +EndChar + +StartChar: glyph276 +Encoding: 276 57620 277 +Width: 771 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 112 + 14 + 1 + 4 + 0 + 5 + 11 + 4 + 5 + 91 + 0 + 10 + 17 + 1 + 11 + 8 + 10 + 11 + 91 + 13 + 1 + 2 + 0 + 3 + 9 + 2 + 3 + 91 + 0 + 8 + 16 + 1 + 9 + 6 + 8 + 9 + 91 + 0 + 6 + 0 + 7 + 6 + 79 + 12 + 1 + 0 + 0 + 1 + 7 + 0 + 1 + 91 + 0 + 6 + 6 + 7 + 83 + 15 + 1 + 7 + 6 + 7 + 71 + 46 + 46 + 42 + 42 + 38 + 38 + 26 + 25 + 14 + 13 + 1 + 0 + 46 + 49 + 46 + 49 + 48 + 47 + 42 + 45 + 42 + 45 + 44 + 43 + 38 + 41 + 38 + 41 + 40 + 39 + 33 + 30 + 25 + 37 + 26 + 36 + 20 + 17 + 13 + 24 + 14 + 23 + 8 + 5 + 0 + 12 + 1 + 11 + 18 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +688 92 m 2,0,1 + 722 92 722 92 746.5 67.5 c 128,-1,2 + 771 43 771 43 771 8 c 0,3,4 + 771 -26 771 -26 746.5 -50.5 c 128,-1,5 + 722 -75 722 -75 688 -75 c 2,6,-1 + 396 -75 l 2,7,8 + 361 -75 361 -75 336.5 -50.5 c 128,-1,9 + 312 -26 312 -26 312 8 c 128,-1,10 + 312 42 312 42 337 67 c 128,-1,11 + 362 92 362 92 396 92 c 2,12,-1 + 688 92 l 2,0,1 +688 383 m 2,13,14 + 722 383 722 383 746.5 358.5 c 128,-1,15 + 771 334 771 334 771 300 c 128,-1,16 + 771 266 771 266 746.5 241.5 c 128,-1,17 + 722 217 722 217 688 217 c 2,18,-1 + 396 217 l 2,19,20 + 361 217 361 217 336.5 241.5 c 128,-1,21 + 312 266 312 266 312 300 c 128,-1,22 + 312 334 312 334 336.5 358.5 c 128,-1,23 + 361 383 361 383 396 383 c 2,24,-1 + 688 383 l 2,13,14 +688 675 m 2,25,26 + 722 675 722 675 746.5 650.5 c 128,-1,27 + 771 626 771 626 771 592 c 0,28,29 + 771 557 771 557 746.5 532.5 c 128,-1,30 + 722 508 722 508 688 508 c 2,31,-1 + 396 508 l 2,32,33 + 362 508 362 508 337 533 c 128,-1,34 + 312 558 312 558 312 592 c 128,-1,35 + 312 626 312 626 336.5 650.5 c 128,-1,36 + 361 675 361 675 396 675 c 2,37,-1 + 688 675 l 2,25,26 +0 8 m 128,-1,39 + 0 112 0 112 104 112 c 128,-1,40 + 208 112 208 112 208 8 c 128,-1,41 + 208 -96 208 -96 104 -96 c 128,-1,38 + 0 -96 0 -96 0 8 c 128,-1,39 +0 300 m 128,-1,43 + 0 404 0 404 104 404 c 128,-1,44 + 208 404 208 404 208 300 c 128,-1,45 + 208 196 208 196 104 196 c 128,-1,42 + 0 196 0 196 0 300 c 128,-1,43 +0 592 m 128,-1,47 + 0 696 0 696 104 696 c 128,-1,48 + 208 696 208 696 208 592 c 128,-1,49 + 208 488 208 488 104 488 c 128,-1,46 + 0 488 0 488 0 592 c 128,-1,47 +EndSplineSet +EndChar + +StartChar: glyph277 +Encoding: 277 57621 278 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 112 + 17 + 1 + 10 + 16 + 1 + 8 + 9 + 10 + 8 + 91 + 0 + 9 + 0 + 11 + 6 + 9 + 11 + 91 + 15 + 1 + 6 + 14 + 1 + 4 + 5 + 6 + 4 + 91 + 0 + 5 + 0 + 7 + 2 + 5 + 7 + 91 + 13 + 1 + 2 + 12 + 1 + 0 + 1 + 2 + 0 + 91 + 0 + 1 + 3 + 3 + 1 + 79 + 0 + 1 + 1 + 3 + 83 + 0 + 3 + 1 + 3 + 71 + 61 + 60 + 50 + 48 + 37 + 36 + 26 + 24 + 13 + 12 + 2 + 0 + 67 + 64 + 60 + 71 + 61 + 70 + 56 + 53 + 48 + 59 + 50 + 59 + 43 + 40 + 36 + 47 + 37 + 46 + 32 + 29 + 24 + 35 + 26 + 35 + 19 + 16 + 12 + 23 + 13 + 22 + 8 + 5 + 0 + 11 + 2 + 11 + 18 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +708 50 m 2,0,-1 + 125 50 l 2,1,2 + 108 50 108 50 95.5 37.5 c 128,-1,3 + 83 25 83 25 83 8 c 128,-1,4 + 83 -9 83 -9 95.5 -21 c 128,-1,5 + 108 -33 108 -33 125 -33 c 2,6,-1 + 708 -33 l 2,7,8 + 725 -33 725 -33 737.5 -21 c 128,-1,9 + 750 -9 750 -9 750 8 c 128,-1,10 + 750 25 750 25 737.5 37.5 c 128,-1,11 + 725 50 725 50 708 50 c 2,0,-1 +708 133 m 2,12,13 + 760 133 760 133 796.5 96.5 c 128,-1,14 + 833 60 833 60 833 8 c 128,-1,15 + 833 -44 833 -44 796.5 -80.5 c 128,-1,16 + 760 -117 760 -117 708 -117 c 2,17,-1 + 125 -117 l 2,18,19 + 73 -117 73 -117 36.5 -80.5 c 128,-1,20 + 0 -44 0 -44 0 8 c 128,-1,21 + 0 60 0 60 36.5 96.5 c 128,-1,22 + 73 133 73 133 125 133 c 2,23,-1 + 708 133 l 2,12,13 +708 342 m 2,24,-1 + 125 342 l 2,25,26 + 108 342 108 342 95.5 329.5 c 128,-1,27 + 83 317 83 317 83 300 c 128,-1,28 + 83 283 83 283 95.5 270.5 c 128,-1,29 + 108 258 108 258 125 258 c 2,30,-1 + 708 258 l 2,31,32 + 725 258 725 258 737.5 270.5 c 128,-1,33 + 750 283 750 283 750 300 c 128,-1,34 + 750 317 750 317 737.5 329.5 c 128,-1,35 + 725 342 725 342 708 342 c 2,24,-1 +708 425 m 2,36,37 + 760 425 760 425 796.5 388.5 c 128,-1,38 + 833 352 833 352 833 300 c 128,-1,39 + 833 248 833 248 796.5 211.5 c 128,-1,40 + 760 175 760 175 708 175 c 2,41,-1 + 125 175 l 2,42,43 + 73 175 73 175 36.5 211.5 c 128,-1,44 + 0 248 0 248 0 300 c 128,-1,45 + 0 352 0 352 36.5 388.5 c 128,-1,46 + 73 425 73 425 125 425 c 2,47,-1 + 708 425 l 2,36,37 +708 633 m 2,48,-1 + 125 633 l 2,49,50 + 108 633 108 633 95.5 621 c 128,-1,51 + 83 609 83 609 83 592 c 128,-1,52 + 83 575 83 575 95.5 562.5 c 128,-1,53 + 108 550 108 550 125 550 c 2,54,-1 + 708 550 l 2,55,56 + 725 550 725 550 737.5 562.5 c 128,-1,57 + 750 575 750 575 750 592 c 128,-1,58 + 750 609 750 609 737.5 621 c 128,-1,59 + 725 633 725 633 708 633 c 2,48,-1 +708 717 m 2,60,61 + 760 717 760 717 796.5 680.5 c 128,-1,62 + 833 644 833 644 833 592 c 128,-1,63 + 833 540 833 540 796.5 503.5 c 128,-1,64 + 760 467 760 467 708 467 c 2,65,-1 + 125 467 l 2,66,67 + 73 467 73 467 36.5 503.5 c 128,-1,68 + 0 540 0 540 0 592 c 128,-1,69 + 0 644 0 644 36.5 680.5 c 128,-1,70 + 73 717 73 717 125 717 c 2,71,-1 + 708 717 l 2,60,61 +EndSplineSet +EndChar + +StartChar: glyph278 +Encoding: 278 57622 279 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 62 + 8 + 1 + 4 + 0 + 5 + 2 + 4 + 5 + 91 + 7 + 1 + 2 + 0 + 3 + 0 + 2 + 3 + 91 + 6 + 1 + 0 + 1 + 1 + 0 + 79 + 6 + 1 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 + 27 + 26 + 15 + 14 + 1 + 0 + 34 + 31 + 26 + 39 + 27 + 38 + 21 + 18 + 14 + 25 + 15 + 24 + 8 + 5 + 0 + 13 + 1 + 12 + 9 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +667 92 m 2,0,1 + 701 92 701 92 725.5 67.5 c 128,-1,2 + 750 43 750 43 750 8 c 0,3,4 + 750 -26 750 -26 726 -50.5 c 128,-1,5 + 702 -75 702 -75 667 -75 c 2,6,-1 + 83 -75 l 2,7,8 + 48 -75 48 -75 24 -50.5 c 128,-1,9 + 0 -26 0 -26 0 8 c 0,10,11 + 0 43 0 43 24.5 67.5 c 128,-1,12 + 49 92 49 92 83 92 c 2,13,-1 + 667 92 l 2,0,1 +667 383 m 2,14,15 + 702 383 702 383 726 358.5 c 128,-1,16 + 750 334 750 334 750 300 c 128,-1,17 + 750 266 750 266 726 241.5 c 128,-1,18 + 702 217 702 217 667 217 c 2,19,-1 + 83 217 l 2,20,21 + 48 217 48 217 24 241.5 c 128,-1,22 + 0 266 0 266 0 300 c 128,-1,23 + 0 334 0 334 24 358.5 c 128,-1,24 + 48 383 48 383 83 383 c 2,25,-1 + 667 383 l 2,14,15 +667 675 m 2,26,27 + 702 675 702 675 726 650.5 c 128,-1,28 + 750 626 750 626 750 592 c 0,29,30 + 750 557 750 557 725.5 532.5 c 128,-1,31 + 701 508 701 508 667 508 c 2,32,-1 + 83 508 l 2,33,34 + 49 508 49 508 24.5 532.5 c 128,-1,35 + 0 557 0 557 0 592 c 0,36,37 + 0 626 0 626 24 650.5 c 128,-1,38 + 48 675 48 675 83 675 c 2,39,-1 + 667 675 l 2,26,27 +EndSplineSet +EndChar + +StartChar: glyph279 +Encoding: 279 57623 280 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 249 + 52 + 32 + 46 + 20 + 40 + 5 + 8 + 34 + 22 + 2 + 10 + 11 + 8 + 10 + 89 + 53 + 35 + 47 + 23 + 41 + 5 + 11 + 33 + 21 + 2 + 9 + 4 + 11 + 9 + 91 + 50 + 28 + 44 + 16 + 38 + 5 + 4 + 30 + 18 + 2 + 6 + 7 + 4 + 6 + 89 + 51 + 31 + 45 + 19 + 39 + 5 + 7 + 29 + 17 + 2 + 5 + 0 + 7 + 5 + 91 + 48 + 24 + 42 + 12 + 36 + 5 + 0 + 26 + 14 + 2 + 2 + 3 + 0 + 2 + 89 + 49 + 27 + 43 + 15 + 37 + 5 + 3 + 1 + 1 + 3 + 77 + 49 + 27 + 43 + 15 + 37 + 5 + 3 + 3 + 1 + 83 + 25 + 13 + 2 + 1 + 3 + 1 + 71 + 176 + 176 + 161 + 160 + 156 + 156 + 141 + 140 + 136 + 136 + 121 + 120 + 116 + 116 + 101 + 100 + 96 + 96 + 81 + 80 + 76 + 76 + 61 + 60 + 56 + 56 + 41 + 40 + 36 + 36 + 21 + 20 + 16 + 16 + 1 + 0 + 176 + 179 + 176 + 179 + 178 + 177 + 169 + 166 + 160 + 175 + 161 + 174 + 156 + 159 + 156 + 159 + 158 + 157 + 149 + 146 + 140 + 155 + 141 + 154 + 136 + 139 + 136 + 139 + 138 + 137 + 129 + 126 + 120 + 135 + 121 + 134 + 116 + 119 + 116 + 119 + 118 + 117 + 109 + 106 + 100 + 115 + 101 + 114 + 96 + 99 + 96 + 99 + 98 + 97 + 89 + 86 + 80 + 95 + 81 + 94 + 76 + 79 + 76 + 79 + 78 + 77 + 69 + 66 + 60 + 75 + 61 + 74 + 56 + 59 + 56 + 59 + 58 + 57 + 49 + 46 + 40 + 55 + 41 + 54 + 36 + 39 + 36 + 39 + 38 + 37 + 29 + 26 + 20 + 35 + 21 + 34 + 16 + 19 + 16 + 19 + 18 + 17 + 9 + 6 + 0 + 15 + 1 + 14 + 54 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +167 133 m 2,0,1 + 202 133 202 133 226 108.5 c 128,-1,2 + 250 84 250 84 250 50 c 2,3,-1 + 250 -33 l 2,4,5 + 250 -68 250 -68 225.5 -92.5 c 128,-1,6 + 201 -117 201 -117 167 -117 c 2,7,-1 + 83 -117 l 2,8,9 + 49 -117 49 -117 24.5 -92.5 c 128,-1,10 + 0 -68 0 -68 0 -33 c 2,11,-1 + 0 50 l 2,12,13 + 0 84 0 84 24 108.5 c 128,-1,14 + 48 133 48 133 83 133 c 2,15,-1 + 167 133 l 2,0,1 +167 -33 m 1,16,-1 + 167 50 l 1,17,-1 + 83 50 l 1,18,-1 + 83 -33 l 1,19,-1 + 167 -33 l 1,16,-1 +167 425 m 2,20,21 + 202 425 202 425 226 400.5 c 128,-1,22 + 250 376 250 376 250 342 c 2,23,-1 + 250 258 l 2,24,25 + 250 224 250 224 226 199.5 c 128,-1,26 + 202 175 202 175 167 175 c 2,27,-1 + 83 175 l 2,28,29 + 48 175 48 175 24 199.5 c 128,-1,30 + 0 224 0 224 0 258 c 2,31,-1 + 0 342 l 2,32,33 + 0 376 0 376 24 400.5 c 128,-1,34 + 48 425 48 425 83 425 c 2,35,-1 + 167 425 l 2,20,21 +167 258 m 1,36,-1 + 167 342 l 1,37,-1 + 83 342 l 1,38,-1 + 83 258 l 1,39,-1 + 167 258 l 1,36,-1 +167 717 m 2,40,41 + 201 717 201 717 225.5 692.5 c 128,-1,42 + 250 668 250 668 250 633 c 2,43,-1 + 250 550 l 2,44,45 + 250 516 250 516 226 491.5 c 128,-1,46 + 202 467 202 467 167 467 c 2,47,-1 + 83 467 l 2,48,49 + 48 467 48 467 24 491.5 c 128,-1,50 + 0 516 0 516 0 550 c 2,51,-1 + 0 633 l 2,52,53 + 0 668 0 668 24.5 692.5 c 128,-1,54 + 49 717 49 717 83 717 c 2,55,-1 + 167 717 l 2,40,41 +167 550 m 1,56,-1 + 167 633 l 1,57,-1 + 83 633 l 1,58,-1 + 83 550 l 1,59,-1 + 167 550 l 1,56,-1 +458 133 m 2,60,61 + 493 133 493 133 517.5 108.5 c 128,-1,62 + 542 84 542 84 542 50 c 2,63,-1 + 542 -33 l 2,64,65 + 542 -68 542 -68 517 -92.5 c 128,-1,66 + 492 -117 492 -117 458 -117 c 2,67,-1 + 375 -117 l 2,68,69 + 341 -117 341 -117 316.5 -92.5 c 128,-1,70 + 292 -68 292 -68 292 -33 c 2,71,-1 + 292 50 l 2,72,73 + 292 84 292 84 316 108.5 c 128,-1,74 + 340 133 340 133 375 133 c 2,75,-1 + 458 133 l 2,60,61 +458 -33 m 1,76,-1 + 458 50 l 1,77,-1 + 375 50 l 1,78,-1 + 375 -33 l 1,79,-1 + 458 -33 l 1,76,-1 +458 425 m 2,80,81 + 493 425 493 425 517.5 400.5 c 128,-1,82 + 542 376 542 376 542 342 c 2,83,-1 + 542 258 l 2,84,85 + 542 224 542 224 517.5 199.5 c 128,-1,86 + 493 175 493 175 458 175 c 2,87,-1 + 375 175 l 2,88,89 + 340 175 340 175 316 199.5 c 128,-1,90 + 292 224 292 224 292 258 c 2,91,-1 + 292 342 l 2,92,93 + 292 376 292 376 316 400.5 c 128,-1,94 + 340 425 340 425 375 425 c 2,95,-1 + 458 425 l 2,80,81 +458 258 m 1,96,-1 + 458 342 l 1,97,-1 + 375 342 l 1,98,-1 + 375 258 l 1,99,-1 + 458 258 l 1,96,-1 +458 717 m 2,100,101 + 492 717 492 717 517 692.5 c 128,-1,102 + 542 668 542 668 542 633 c 2,103,-1 + 542 550 l 2,104,105 + 542 516 542 516 517.5 491.5 c 128,-1,106 + 493 467 493 467 458 467 c 2,107,-1 + 375 467 l 2,108,109 + 340 467 340 467 316 491.5 c 128,-1,110 + 292 516 292 516 292 550 c 2,111,-1 + 292 633 l 2,112,113 + 292 668 292 668 316.5 692.5 c 128,-1,114 + 341 717 341 717 375 717 c 2,115,-1 + 458 717 l 2,100,101 +458 550 m 1,116,-1 + 458 633 l 1,117,-1 + 375 633 l 1,118,-1 + 375 550 l 1,119,-1 + 458 550 l 1,116,-1 +750 133 m 2,120,121 + 784 133 784 133 808.5 108.5 c 128,-1,122 + 833 84 833 84 833 50 c 2,123,-1 + 833 -33 l 2,124,125 + 833 -68 833 -68 808.5 -92.5 c 128,-1,126 + 784 -117 784 -117 750 -117 c 2,127,-1 + 667 -117 l 2,128,129 + 632 -117 632 -117 607.5 -92.5 c 128,-1,130 + 583 -68 583 -68 583 -33 c 2,131,-1 + 583 50 l 2,132,133 + 583 84 583 84 607.5 108.5 c 128,-1,134 + 632 133 632 133 667 133 c 2,135,-1 + 750 133 l 2,120,121 +750 -33 m 1,136,-1 + 750 50 l 1,137,-1 + 667 50 l 1,138,-1 + 667 -33 l 1,139,-1 + 750 -33 l 1,136,-1 +750 425 m 2,140,141 + 784 425 784 425 808.5 400.5 c 128,-1,142 + 833 376 833 376 833 342 c 2,143,-1 + 833 258 l 2,144,145 + 833 224 833 224 808.5 199.5 c 128,-1,146 + 784 175 784 175 750 175 c 2,147,-1 + 667 175 l 2,148,149 + 632 175 632 175 607.5 199.5 c 128,-1,150 + 583 224 583 224 583 258 c 2,151,-1 + 583 342 l 2,152,153 + 583 376 583 376 607.5 400.5 c 128,-1,154 + 632 425 632 425 667 425 c 2,155,-1 + 750 425 l 2,140,141 +750 258 m 1,156,-1 + 750 342 l 1,157,-1 + 667 342 l 1,158,-1 + 667 258 l 1,159,-1 + 750 258 l 1,156,-1 +750 717 m 2,160,161 + 784 717 784 717 808.5 692.5 c 128,-1,162 + 833 668 833 668 833 633 c 2,163,-1 + 833 550 l 2,164,165 + 833 516 833 516 808.5 491.5 c 128,-1,166 + 784 467 784 467 750 467 c 2,167,-1 + 667 467 l 2,168,169 + 632 467 632 467 607.5 491.5 c 128,-1,170 + 583 516 583 516 583 550 c 2,171,-1 + 583 633 l 2,172,173 + 583 668 583 668 607.5 692.5 c 128,-1,174 + 632 717 632 717 667 717 c 2,175,-1 + 750 717 l 2,160,161 +750 550 m 1,176,-1 + 750 633 l 1,177,-1 + 667 633 l 1,178,-1 + 667 550 l 1,179,-1 + 750 550 l 1,176,-1 +EndSplineSet +EndChar + +StartChar: glyph280 +Encoding: 280 57624 281 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 128 + 16 + 10 + 2 + 4 + 26 + 17 + 23 + 11 + 20 + 5 + 5 + 2 + 4 + 5 + 91 + 14 + 8 + 2 + 2 + 25 + 15 + 22 + 9 + 19 + 5 + 3 + 0 + 2 + 3 + 91 + 12 + 6 + 2 + 0 + 1 + 1 + 0 + 79 + 12 + 6 + 2 + 0 + 0 + 1 + 83 + 24 + 13 + 21 + 7 + 18 + 5 + 1 + 0 + 1 + 71 + 36 + 36 + 30 + 30 + 24 + 24 + 20 + 20 + 16 + 16 + 12 + 12 + 8 + 8 + 4 + 4 + 0 + 0 + 36 + 41 + 36 + 40 + 39 + 37 + 30 + 35 + 30 + 34 + 33 + 31 + 24 + 29 + 24 + 28 + 27 + 25 + 20 + 23 + 20 + 23 + 22 + 21 + 16 + 19 + 16 + 19 + 18 + 17 + 12 + 15 + 12 + 15 + 14 + 13 + 8 + 11 + 8 + 11 + 10 + 9 + 4 + 7 + 4 + 7 + 6 + 5 + 0 + 3 + 0 + 3 + 17 + 27 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +0 8 m 128,-1,1 + 0 112 0 112 104 112 c 128,-1,2 + 208 112 208 112 208 8 c 128,-1,3 + 208 -96 208 -96 104 -96 c 128,-1,0 + 0 -96 0 -96 0 8 c 128,-1,1 +0 300 m 128,-1,5 + 0 404 0 404 104 404 c 128,-1,6 + 208 404 208 404 208 300 c 128,-1,7 + 208 196 208 196 104 196 c 128,-1,4 + 0 196 0 196 0 300 c 128,-1,5 +0 592 m 128,-1,9 + 0 696 0 696 104 696 c 128,-1,10 + 208 696 208 696 208 592 c 128,-1,11 + 208 488 208 488 104 488 c 128,-1,8 + 0 488 0 488 0 592 c 128,-1,9 +292 8 m 128,-1,13 + 292 112 292 112 396 112 c 128,-1,14 + 500 112 500 112 500 8 c 128,-1,15 + 500 -96 500 -96 396 -96 c 128,-1,12 + 292 -96 292 -96 292 8 c 128,-1,13 +292 300 m 128,-1,17 + 292 404 292 404 396 404 c 128,-1,18 + 500 404 500 404 500 300 c 128,-1,19 + 500 196 500 196 396 196 c 128,-1,16 + 292 196 292 196 292 300 c 128,-1,17 +292 592 m 128,-1,21 + 292 696 292 696 396 696 c 128,-1,22 + 500 696 500 696 500 592 c 128,-1,23 + 500 488 500 488 396 488 c 128,-1,20 + 292 488 292 488 292 592 c 128,-1,21 +583 8 m 128,-1,25 + 583 112 583 112 688 112 c 0,26,27 + 792 112 792 112 792 8 c 128,-1,28 + 792 -96 792 -96 688 -96 c 0,29,24 + 583 -96 583 -96 583 8 c 128,-1,25 +583 300 m 128,-1,31 + 583 404 583 404 688 404 c 0,32,33 + 792 404 792 404 792 300 c 128,-1,34 + 792 196 792 196 688 196 c 0,35,30 + 583 196 583 196 583 300 c 128,-1,31 +583 592 m 128,-1,37 + 583 696 583 696 688 696 c 0,38,39 + 792 696 792 696 792 592 c 128,-1,40 + 792 488 792 488 688 488 c 0,41,36 + 583 488 583 488 583 592 c 128,-1,37 +EndSplineSet +EndChar + +StartChar: glyph281 +Encoding: 281 57625 282 +Width: 417 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 51 + 46 + 39 + 27 + 18 + 11 + 0 + 6 + 0 + 1 + 1 + 66 + 0 + 3 + 0 + 5 + 1 + 3 + 5 + 91 + 0 + 1 + 0 + 0 + 4 + 1 + 0 + 91 + 0 + 4 + 2 + 2 + 4 + 79 + 0 + 4 + 4 + 2 + 83 + 0 + 2 + 4 + 2 + 71 + 23 + 19 + 23 + 23 + 24 + 21 + 6 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +229 172 m 1,0,1 + 256 165 256 165 274 143 c 128,-1,2 + 292 121 292 121 292 92 c 0,3,4 + 292 58 292 58 267 33 c 128,-1,5 + 242 8 242 8 208 8 c 128,-1,6 + 174 8 174 8 149.5 32.5 c 128,-1,7 + 125 57 125 57 125 92 c 0,8,9 + 125 121 125 121 143 143 c 128,-1,10 + 161 165 161 165 188 172 c 1,11,-1 + 188 404 l 2,12,13 + 188 412 188 412 194 418.5 c 128,-1,14 + 200 425 200 425 208 425 c 128,-1,15 + 216 425 216 425 222.5 418.5 c 128,-1,16 + 229 412 229 412 229 404 c 2,17,-1 + 229 172 l 1,0,1 +354 239 m 1,18,19 + 417 176 417 176 417 92 c 0,20,21 + 417 6 417 6 355.5 -55.5 c 128,-1,22 + 294 -117 294 -117 208 -117 c 128,-1,23 + 122 -117 122 -117 61 -55.5 c 128,-1,24 + 0 6 0 6 0 92 c 0,25,26 + 0 177 0 177 62 239 c 1,27,-1 + 62 571 l 2,28,29 + 62 631 62 631 105 674 c 128,-1,30 + 148 717 148 717 208 717 c 128,-1,31 + 268 717 268 717 311 674 c 128,-1,32 + 354 631 354 631 354 571 c 2,33,-1 + 354 239 l 1,18,19 +208 -33 m 128,-1,35 + 260 -33 260 -33 296.5 3.5 c 128,-1,36 + 333 40 333 40 333 92 c 0,37,38 + 333 162 333 162 271 199 c 1,39,-1 + 271 571 l 2,40,41 + 271 596 271 596 252.5 614.5 c 128,-1,42 + 234 633 234 633 208 633 c 128,-1,43 + 182 633 182 633 164 614.5 c 128,-1,44 + 146 596 146 596 146 571 c 2,45,-1 + 146 199 l 1,46,47 + 83 162 83 162 83 92 c 0,48,49 + 83 40 83 40 119.5 3.5 c 128,-1,34 + 156 -33 156 -33 208 -33 c 128,-1,35 +EndSplineSet +EndChar + +StartChar: glyph282 +Encoding: 282 57626 283 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 78 + 35 + 1 + 4 + 0 + 64 + 1 + 7 + 6 + 19 + 9 + 2 + 1 + 7 + 3 + 66 + 0 + 3 + 0 + 4 + 6 + 3 + 4 + 91 + 8 + 1 + 0 + 0 + 6 + 7 + 0 + 6 + 91 + 0 + 7 + 0 + 1 + 5 + 7 + 1 + 91 + 0 + 5 + 2 + 2 + 5 + 79 + 0 + 5 + 5 + 2 + 83 + 0 + 2 + 5 + 2 + 71 + 1 + 0 + 82 + 81 + 76 + 75 + 70 + 69 + 52 + 50 + 32 + 30 + 15 + 14 + 8 + 6 + 0 + 36 + 1 + 36 + 9 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 592 m 0,0,1 + 635 592 635 592 671.5 555.5 c 128,-1,2 + 708 519 708 519 708 467 c 2,3,-1 + 708 217 l 2,4,5 + 708 165 708 165 671.5 128.5 c 128,-1,6 + 635 92 635 92 583 92 c 0,7,8 + 522 92 522 92 484 142 c 1,9,10 + 450 108 450 108 433.5 74.5 c 128,-1,11 + 417 41 417 41 417 -13 c 0,12,13 + 417 -56 417 -56 386.5 -86.5 c 128,-1,14 + 356 -117 356 -117 313 -117 c 128,-1,15 + 270 -117 270 -117 239 -86.5 c 128,-1,16 + 208 -56 208 -56 208 -13 c 0,17,18 + 208 63 208 63 221 138 c 1,19,20 + 82 153 82 153 60 161 c 0,21,22 + 30 172 30 172 13 202.5 c 128,-1,23 + -4 233 -4 233 1 265 c 2,24,-1 + 29 514 l 2,25,26 + 34 544 34 544 54.5 569.5 c 128,-1,27 + 75 595 75 595 101 605 c 2,28,-1 + 114 610 l 2,29,30 + 170 633 170 633 250 633 c 0,31,32 + 316 633 316 633 389.5 612.5 c 128,-1,33 + 463 592 463 592 494 568 c 1,34,-1 + 501 560 l 1,35,36 + 538 592 538 592 583 592 c 0,0,1 +333 -12 m 0,37,38 + 333 31 333 31 341.5 66 c 128,-1,39 + 350 101 350 101 367.5 128.5 c 128,-1,40 + 385 156 385 156 396.5 169.5 c 128,-1,41 + 408 183 408 183 429 204 c 0,42,43 + 458 233 458 233 458 259 c 2,44,-1 + 458 467 l 2,45,46 + 458 476 458 476 453 487 c 128,-1,47 + 448 498 448 498 443 502 c 0,48,49 + 424 516 424 516 364 533 c 128,-1,50 + 304 550 304 550 250 550 c 0,51,52 + 189 550 189 550 146 533 c 2,53,-1 + 130 527 l 2,54,55 + 125 525 125 525 118.5 517 c 128,-1,56 + 112 509 112 509 111 502 c 2,57,-1 + 84 253 l 2,58,59 + 82 243 82 243 88 240 c 0,60,61 + 100 237 100 237 174 228 c 128,-1,62 + 248 219 248 219 269 217 c 1,63,-1 + 324 225 l 1,64,-1 + 312 166 l 2,65,66 + 292 68 292 68 292 -12 c 0,67,68 + 292 -20 292 -20 298 -26.5 c 128,-1,69 + 304 -33 304 -33 312 -33 c 128,-1,70 + 320 -33 320 -33 326.5 -26.5 c 128,-1,71 + 333 -20 333 -20 333 -12 c 0,37,38 +625 217 m 2,72,-1 + 625 467 l 2,73,74 + 625 484 625 484 612.5 496 c 128,-1,75 + 600 508 600 508 583 508 c 128,-1,76 + 566 508 566 508 554 496 c 128,-1,77 + 542 484 542 484 542 467 c 2,78,-1 + 542 217 l 2,79,80 + 542 200 542 200 554 187.5 c 128,-1,81 + 566 175 566 175 583 175 c 128,-1,82 + 600 175 600 175 612.5 187.5 c 128,-1,83 + 625 200 625 200 625 217 c 2,72,-1 +EndSplineSet +EndChar + +StartChar: glyph283 +Encoding: 283 57627 284 +Width: 731 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 141 + 88 + 80 + 41 + 3 + 3 + 6 + 68 + 1 + 11 + 3 + 2 + 66 + 0 + 1 + 9 + 96 + 1 + 12 + 2 + 65 + 97 + 52 + 9 + 3 + 8 + 63 + 0 + 6 + 5 + 3 + 5 + 6 + 3 + 104 + 0 + 3 + 11 + 5 + 3 + 11 + 102 + 0 + 11 + 2 + 5 + 11 + 2 + 102 + 0 + 10 + 2 + 9 + 2 + 10 + 9 + 104 + 14 + 1 + 9 + 7 + 2 + 9 + 7 + 102 + 0 + 1 + 0 + 4 + 5 + 1 + 4 + 91 + 0 + 0 + 0 + 5 + 6 + 0 + 5 + 91 + 13 + 1 + 2 + 0 + 7 + 12 + 2 + 7 + 91 + 0 + 12 + 8 + 8 + 12 + 79 + 0 + 12 + 12 + 8 + 83 + 0 + 8 + 12 + 8 + 71 + 124 + 124 + 58 + 57 + 134 + 132 + 129 + 127 + 125 + 124 + 124 + 136 + 124 + 136 + 113 + 111 + 107 + 105 + 92 + 90 + 85 + 83 + 76 + 74 + 65 + 64 + 57 + 123 + 58 + 123 + 38 + 36 + 33 + 32 + 15 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +712 312 m 1,0,1 + 757 244 757 244 687 158 c 0,2,3 + 643 100 643 100 533 71 c 0,4,5 + 517 67 517 67 498.5 57.5 c 128,-1,6 + 480 48 480 48 469 40.5 c 128,-1,7 + 458 33 458 33 442 21 c 128,-1,8 + 426 9 426 9 425 8 c 0,9,10 + 429 -1 429 -1 433.5 -15.5 c 128,-1,11 + 438 -30 438 -30 434 -66.5 c 128,-1,12 + 430 -103 430 -103 404 -129 c 0,13,14 + 379 -156 379 -156 345 -165 c 128,-1,15 + 311 -174 311 -174 282.5 -166.5 c 128,-1,16 + 254 -159 254 -159 237 -142 c 2,17,-1 + 29 67 l 1,18,19 + -29 134 -29 134 25 200 c 0,20,21 + 147 342 147 342 179 396 c 0,22,23 + 187 409 187 409 192 436.5 c 128,-1,24 + 197 464 197 464 202.5 505 c 128,-1,25 + 208 546 208 546 212 567 c 0,26,27 + 217 595 217 595 238 615.5 c 128,-1,28 + 259 636 259 636 278 643 c 2,29,-1 + 296 650 l 1,30,-1 + 350 700 l 1,31,32 + 369 705 369 705 387.5 706 c 128,-1,33 + 406 707 406 707 416 706 c 2,34,-1 + 425 704 l 1,35,36 + 460 767 460 767 521 767 c 0,37,38 + 576 767 576 767 613.5 717 c 128,-1,39 + 651 667 651 667 621 608 c 2,40,-1 + 587 533 l 1,41,-1 + 658 496 l 1,42,43 + 713 441 713 441 725 392 c 0,44,45 + 733 355 733 355 712 312 c 1,0,1 +283 -71 m 2,46,47 + 304 -91 304 -91 329 -79 c 128,-1,48 + 354 -67 354 -67 354 -42 c 0,49,50 + 354 -25 354 -25 341 -12 c 2,51,-1 + 137 192 l 1,52,-1 + 108 162 l 2,53,54 + 96 150 96 150 96 133 c 128,-1,55 + 96 116 96 116 108 104 c 2,56,-1 + 283 -71 l 2,46,47 +616 342 m 0,57,58 + 632 342 632 342 642 353 c 128,-1,59 + 652 364 652 364 646 379 c 0,60,61 + 625 415 625 415 600 433 c 0,62,63 + 557 462 557 462 512 458 c 0,64,65 + 484 458 484 458 441 429 c 0,66,67 + 431 424 431 424 431 430 c 0,68,69 + 432 432 432 432 433 433 c 0,70,71 + 533 596 533 596 550 633 c 0,72,73 + 556 649 556 649 546.5 664 c 128,-1,74 + 537 679 537 679 521 679 c 0,75,76 + 500 679 500 679 483 654 c 0,77,78 + 478 645 478 645 444.5 585 c 128,-1,79 + 411 525 411 525 396 496 c 1,80,-1 + 416 596 l 2,81,82 + 419 611 419 611 410 620 c 128,-1,83 + 401 629 401 629 387 629 c 0,84,85 + 381 629 381 629 373 623 c 128,-1,86 + 365 617 365 617 362 608 c 2,87,-1 + 346 554 l 1,88,89 + 343 560 343 560 334 565.5 c 128,-1,90 + 325 571 325 571 316 571 c 0,91,92 + 296 571 296 571 291 550 c 2,93,-1 + 262 388 l 2,94,95 + 256 351 256 351 187 267 c 1,96,-1 + 379 75 l 1,97,98 + 403 99 403 99 454 129 c 0,99,100 + 483 147 483 147 528.5 154.5 c 128,-1,101 + 574 162 574 162 600 179 c 0,102,103 + 650 213 650 213 650 250 c 0,104,105 + 650 283 650 283 621 283 c 0,106,107 + 613 283 613 283 607 279 c 128,-1,108 + 601 275 601 275 590.5 265.5 c 128,-1,109 + 580 256 580 256 571 250 c 0,110,111 + 546 238 546 238 516 238 c 0,112,113 + 485 238 485 238 465.5 261.5 c 128,-1,114 + 446 285 446 285 446 317 c 0,115,116 + 446 371 446 371 487 388 c 0,117,118 + 509 397 509 397 533.5 394.5 c 128,-1,119 + 558 392 558 392 571 379 c 0,120,121 + 576 374 576 374 584.5 363 c 128,-1,122 + 593 352 593 352 600 347 c 128,-1,123 + 607 342 607 342 616 342 c 0,57,58 +608 312 m 1,124,125 + 580 312 580 312 571 325 c 0,126,127 + 552 354 552 354 525 354 c 0,128,129 + 504 354 504 354 491.5 342.5 c 128,-1,130 + 479 331 479 331 479 312 c 128,-1,131 + 479 293 479 293 491.5 280 c 128,-1,132 + 504 267 504 267 525 267 c 0,133,134 + 552 267 552 267 571 296 c 0,135,136 + 582 312 582 312 608 312 c 1,124,125 +EndSplineSet +EndChar + +StartChar: glyph284 +Encoding: 284 57628 285 +Width: 708 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 67 + 35 + 25 + 2 + 5 + 2 + 56 + 1 + 4 + 5 + 14 + 1 + 1 + 7 + 3 + 66 + 0 + 3 + 0 + 6 + 2 + 3 + 6 + 91 + 0 + 2 + 0 + 5 + 4 + 2 + 5 + 91 + 0 + 7 + 1 + 0 + 7 + 79 + 0 + 4 + 0 + 1 + 0 + 4 + 1 + 91 + 0 + 7 + 7 + 0 + 83 + 0 + 0 + 7 + 0 + 71 + 78 + 76 + 62 + 61 + 21 + 22 + 22 + 37 + 36 + 41 + 8 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +649 438 m 0,0,1 + 679 427 679 427 695.5 397 c 128,-1,2 + 712 367 712 367 707 335 c 2,3,-1 + 679 86 l 2,4,5 + 674 55 674 55 653.5 30 c 128,-1,6 + 633 5 633 5 607 -5 c 2,7,-1 + 594 -10 l 2,8,9 + 538 -33 538 -33 458 -33 c 0,10,11 + 392 -33 392 -33 319 -12.5 c 128,-1,12 + 246 8 246 8 215 32 c 1,13,-1 + 207 40 l 1,14,15 + 170 8 170 8 125 8 c 0,16,17 + 73 8 73 8 36.5 44.5 c 128,-1,18 + 0 81 0 81 0 133 c 2,19,-1 + 0 383 l 2,20,21 + 0 435 0 435 36.5 471.5 c 128,-1,22 + 73 508 73 508 125 508 c 0,23,24 + 186 508 186 508 224 458 c 1,25,26 + 259 493 259 493 275.5 525.5 c 128,-1,27 + 292 558 292 558 292 612 c 0,28,29 + 292 655 292 655 322.5 686 c 128,-1,30 + 353 717 353 717 396 717 c 128,-1,31 + 439 717 439 717 469.5 686 c 128,-1,32 + 500 655 500 655 500 612 c 0,33,34 + 500 537 500 537 487 462 c 1,35,36 + 623 448 623 448 649 438 c 0,0,1 +125 92 m 128,-1,38 + 142 92 142 92 154.5 104 c 128,-1,39 + 167 116 167 116 167 133 c 2,40,-1 + 167 383 l 2,41,42 + 167 400 167 400 154.5 412.5 c 128,-1,43 + 142 425 142 425 125 425 c 128,-1,44 + 108 425 108 425 95.5 412.5 c 128,-1,45 + 83 400 83 400 83 383 c 2,46,-1 + 83 133 l 2,47,48 + 83 116 83 116 95.5 104 c 128,-1,37 + 108 92 108 92 125 92 c 128,-1,38 +597 98 m 2,49,-1 + 625 347 l 2,50,51 + 627 357 627 357 620 360 c 0,52,53 + 608 363 608 363 534 372 c 128,-1,54 + 460 381 460 381 439 383 c 1,55,-1 + 384 375 l 1,56,-1 + 397 434 l 2,57,58 + 417 527 417 527 417 612 c 0,59,60 + 417 620 417 620 410.5 626.5 c 128,-1,61 + 404 633 404 633 396 633 c 128,-1,62 + 388 633 388 633 381.5 626.5 c 128,-1,63 + 375 620 375 620 375 612 c 0,64,65 + 375 569 375 569 366.5 534 c 128,-1,66 + 358 499 358 499 340.5 471.5 c 128,-1,67 + 323 444 323 444 311.5 430.5 c 128,-1,68 + 300 417 300 417 279 396 c 0,69,70 + 250 367 250 367 250 341 c 2,71,-1 + 250 133 l 2,72,73 + 250 109 250 109 265 98 c 0,74,75 + 284 84 284 84 344 67 c 128,-1,76 + 404 50 404 50 458 50 c 0,77,78 + 520 50 520 50 563 67 c 2,79,-1 + 578 73 l 2,80,81 + 583 75 583 75 589.5 83 c 128,-1,82 + 596 91 596 91 597 98 c 2,49,-1 +EndSplineSet +EndChar + +StartChar: glyph285 +Encoding: 285 57629 286 +Width: 625 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 48 + 38 + 11 + 2 + 0 + 3 + 1 + 66 + 0 + 2 + 1 + 2 + 106 + 4 + 1 + 0 + 3 + 0 + 107 + 0 + 1 + 3 + 3 + 1 + 79 + 0 + 1 + 1 + 3 + 83 + 0 + 3 + 1 + 3 + 71 + 1 + 0 + 22 + 21 + 16 + 14 + 9 + 8 + 0 + 20 + 1 + 20 + 5 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 -33 m 0,0,1 + 239 -33 239 -33 203 3 c 2,2,-1 + 37 170 l 2,3,4 + 0 207 0 207 0 258 c 0,5,6 + 0 310 0 310 37 347 c 0,7,8 + 72 382 72 382 125 382 c 128,-1,9 + 178 382 178 382 213 347 c 2,10,-1 + 263 297 l 1,11,-1 + 391 527 l 2,12,13 + 407 557 407 557 436.5 574.5 c 128,-1,14 + 466 592 466 592 500 592 c 0,15,16 + 570 592 570 592 607.5 531.5 c 128,-1,17 + 645 471 645 471 609 406 c 2,18,-1 + 401 31 l 2,19,20 + 366 -33 366 -33 292 -33 c 0,0,1 +125 300 m 128,-1,22 + 108 300 108 300 95.5 287.5 c 128,-1,23 + 83 275 83 275 83 258 c 0,24,25 + 83 242 83 242 96 229 c 2,26,-1 + 262 62 l 2,27,28 + 277 47 277 47 297.5 50 c 128,-1,29 + 318 53 318 53 328 71 c 2,30,-1 + 536 446 l 2,31,32 + 545 464 545 464 539.5 480 c 128,-1,33 + 534 496 534 496 520 503 c 0,34,35 + 505 511 505 511 488.5 506 c 128,-1,36 + 472 501 472 501 464 487 c 2,37,-1 + 282 160 l 1,38,-1 + 154 288 l 2,39,21 + 142 300 142 300 125 300 c 128,-1,22 +EndSplineSet +EndChar + +StartChar: glyph286 +Encoding: 286 57630 287 +Width: 542 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 19 + 16 + 1 + 0 + 1 + 1 + 66 + 0 + 1 + 0 + 1 + 106 + 0 + 0 + 0 + 97 + 21 + 23 + 2 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +499 540 m 0,0,1 + 529 524 529 524 538.5 490 c 128,-1,2 + 548 456 548 456 531 426 c 2,3,-1 + 323 51 l 2,4,5 + 303 15 303 15 262 9 c 2,6,-1 + 250 8 l 2,7,8 + 216 8 216 8 191 33 c 2,9,-1 + 24 199 l 2,10,11 + -1 224 -1 224 -1 258 c 128,-1,12 + -1 292 -1 292 24 317 c 128,-1,13 + 49 342 49 342 83 342 c 128,-1,14 + 117 342 117 342 142 317 c 2,15,-1 + 231 229 l 1,16,-1 + 385 507 l 2,17,18 + 401 537 401 537 435 547 c 128,-1,19 + 469 557 469 557 499 540 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph287 +Encoding: 287 57631 288 +Width: 855 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 70 + 54 + 49 + 26 + 21 + 4 + 2 + 3 + 53 + 51 + 50 + 48 + 4 + 4 + 2 + 52 + 47 + 42 + 36 + 4 + 5 + 4 + 3 + 66 + 0 + 2 + 3 + 4 + 3 + 2 + 4 + 104 + 0 + 4 + 5 + 3 + 4 + 5 + 102 + 0 + 1 + 0 + 3 + 2 + 1 + 3 + 91 + 0 + 5 + 0 + 0 + 5 + 79 + 0 + 5 + 5 + 0 + 83 + 0 + 0 + 5 + 0 + 71 + 22 + 23 + 37 + 23 + 23 + 37 + 6 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +819 464 m 2,0,1 + 855 428 855 428 854.5 375.5 c 128,-1,2 + 854 323 854 323 818 287 c 2,3,-1 + 437 -88 l 2,4,5 + 399 -124 399 -124 349 -124 c 0,6,7 + 297 -124 297 -124 260 -87 c 2,8,-1 + 36 136 l 2,9,10 + 0 172 0 172 0.5 224.5 c 128,-1,11 + 1 277 1 277 37 313 c 2,12,-1 + 418 688 l 2,13,14 + 453 723 453 723 506.5 722.5 c 128,-1,15 + 560 722 560 722 595 687 c 2,16,-1 + 819 464 l 2,0,1 +760 347 m 2,17,18 + 772 359 772 359 772 376 c 128,-1,19 + 772 393 772 393 760 405 c 2,20,-1 + 707 458 l 1,21,22 + 682 435 682 435 649 435.5 c 128,-1,23 + 616 436 616 436 592 460 c 128,-1,24 + 568 484 568 484 567.5 517 c 128,-1,25 + 567 550 567 550 590 575 c 1,26,-1 + 536 628 l 2,27,28 + 524 640 524 640 506 640 c 0,29,30 + 489 640 489 640 477 628 c 2,31,-1 + 96 253 l 2,32,33 + 84 241 84 241 83.5 224 c 128,-1,34 + 83 207 83 207 95 195 c 2,35,-1 + 148 142 l 1,36,37 + 173 165 173 165 206 164.5 c 128,-1,38 + 239 164 239 164 263 140 c 0,39,40 + 286 116 286 116 287 83 c 128,-1,41 + 288 50 288 50 266 25 c 1,42,-1 + 319 -28 l 2,43,44 + 331 -40 331 -40 349 -40.5 c 128,-1,45 + 367 -41 367 -41 379 -29 c 2,46,-1 + 760 347 l 2,17,18 +407 90 m 1,47,-1 + 213 284 l 1,48,-1 + 448 510 l 1,49,-1 + 642 316 l 1,50,-1 + 407 90 l 1,47,-1 +272 283 m 1,51,-1 + 408 148 l 1,52,-1 + 583 317 l 1,53,-1 + 448 452 l 1,54,-1 + 272 283 l 1,51,-1 +EndSplineSet +EndChar + +StartChar: glyph288 +Encoding: 288 57632 289 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 30 +LT +IF +NPUSHB + 63 + 0 + 6 + 8 + 1 + 8 + 6 + 96 + 0 + 7 + 0 + 9 + 0 + 7 + 9 + 104 + 0 + 4 + 0 + 2 + 10 + 4 + 2 + 91 + 0 + 10 + 0 + 8 + 6 + 10 + 8 + 91 + 0 + 1 + 0 + 0 + 7 + 1 + 0 + 91 + 0 + 9 + 0 + 11 + 3 + 9 + 11 + 92 + 0 + 3 + 5 + 5 + 3 + 79 + 0 + 3 + 3 + 5 + 83 + 0 + 5 + 3 + 5 + 71 +ELSE +NPUSHB + 64 + 0 + 6 + 8 + 1 + 8 + 6 + 1 + 104 + 0 + 7 + 0 + 9 + 0 + 7 + 9 + 104 + 0 + 4 + 0 + 2 + 10 + 4 + 2 + 91 + 0 + 10 + 0 + 8 + 6 + 10 + 8 + 91 + 0 + 1 + 0 + 0 + 7 + 1 + 0 + 91 + 0 + 9 + 0 + 11 + 3 + 9 + 11 + 92 + 0 + 3 + 5 + 5 + 3 + 79 + 0 + 3 + 3 + 5 + 83 + 0 + 5 + 3 + 5 + 71 +EIF +NPUSHB + 17 + 53 + 52 + 49 + 48 + 45 + 44 + 19 + 21 + 21 + 19 + 19 + 19 + 17 + 51 + 50 + 12 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 258 m 128,-1,1 + 542 241 542 241 529.5 229 c 128,-1,2 + 517 217 517 217 500 217 c 2,3,-1 + 375 217 l 2,4,5 + 358 217 358 217 345.5 229 c 128,-1,6 + 333 241 333 241 333 258 c 128,-1,7 + 333 275 333 275 345.5 287.5 c 128,-1,8 + 358 300 358 300 375 300 c 2,9,-1 + 500 300 l 2,10,11 + 517 300 517 300 529.5 287.5 c 128,-1,0 + 542 275 542 275 542 258 c 128,-1,1 +375 550 m 128,-1,13 + 254 550 254 550 168.5 464.5 c 128,-1,14 + 83 379 83 379 83 258 c 128,-1,15 + 83 137 83 137 168.5 52 c 128,-1,16 + 254 -33 254 -33 375 -33 c 128,-1,17 + 496 -33 496 -33 581.5 52 c 128,-1,18 + 667 137 667 137 667 258 c 128,-1,19 + 667 379 667 379 581.5 464.5 c 128,-1,12 + 496 550 496 550 375 550 c 128,-1,13 +375 633 m 128,-1,21 + 530 633 530 633 640 523 c 128,-1,22 + 750 413 750 413 750 258 c 128,-1,23 + 750 103 750 103 640 -7 c 128,-1,24 + 530 -117 530 -117 375 -117 c 128,-1,25 + 220 -117 220 -117 110 -7 c 128,-1,26 + 0 103 0 103 0 258 c 128,-1,27 + 0 413 0 413 110 523 c 128,-1,20 + 220 633 220 633 375 633 c 128,-1,21 +417 383 m 2,28,29 + 417 400 417 400 404.5 412.5 c 128,-1,30 + 392 425 392 425 375 425 c 128,-1,31 + 358 425 358 425 345.5 412.5 c 128,-1,32 + 333 400 333 400 333 383 c 2,33,-1 + 333 258 l 2,34,35 + 333 241 333 241 345.5 229 c 128,-1,36 + 358 217 358 217 375 217 c 128,-1,37 + 392 217 392 217 404.5 229 c 128,-1,38 + 417 241 417 241 417 258 c 2,39,-1 + 417 383 l 2,28,29 +375 467 m 128,-1,41 + 289 467 289 467 228 405.5 c 128,-1,42 + 167 344 167 344 167 258 c 128,-1,43 + 167 172 167 172 228 111 c 128,-1,44 + 289 50 289 50 375 50 c 128,-1,45 + 461 50 461 50 522 111 c 128,-1,46 + 583 172 583 172 583 258 c 128,-1,47 + 583 344 583 344 522 405.5 c 128,-1,40 + 461 467 461 467 375 467 c 128,-1,41 +375 508 m 128,-1,49 + 478 508 478 508 551.5 435 c 128,-1,50 + 625 362 625 362 625 258 c 128,-1,51 + 625 154 625 154 551.5 81 c 128,-1,52 + 478 8 478 8 375 8 c 128,-1,53 + 272 8 272 8 198.5 81 c 128,-1,54 + 125 154 125 154 125 258 c 128,-1,55 + 125 362 125 362 198.5 435 c 128,-1,48 + 272 508 272 508 375 508 c 128,-1,49 +EndSplineSet +EndChar + +StartChar: glyph289 +Encoding: 289 57633 290 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 52 + 60 + 51 + 43 + 35 + 32 + 23 + 14 + 5 + 8 + 4 + 5 + 1 + 66 + 3 + 1 + 2 + 6 + 1 + 5 + 4 + 2 + 5 + 91 + 7 + 1 + 4 + 0 + 0 + 4 + 79 + 7 + 1 + 4 + 4 + 0 + 83 + 1 + 1 + 0 + 4 + 0 + 71 + 28 + 20 + 26 + 27 + 20 + 28 + 20 + 18 + 8 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 133 m 0,0,1 + 583 82 583 82 546 45 c 128,-1,2 + 509 8 509 8 458 8 c 128,-1,3 + 407 8 407 8 370 45 c 2,4,-1 + 292 123 l 1,5,-1 + 213 45 l 2,6,7 + 178 10 178 10 125 10 c 128,-1,8 + 72 10 72 10 37 45 c 0,9,10 + 0 82 0 82 0 133 c 0,11,12 + 0 185 0 185 37 222 c 2,13,-1 + 115 300 l 1,14,-1 + 37 378 l 2,15,16 + 0 415 0 415 0 467 c 0,17,18 + 0 518 0 518 37 555 c 0,19,20 + 72 590 72 590 125 590 c 128,-1,21 + 178 590 178 590 213 555 c 2,22,-1 + 292 477 l 1,23,-1 + 370 555 l 2,24,25 + 405 590 405 590 458.5 590 c 128,-1,26 + 512 590 512 590 547 555 c 0,27,28 + 583 519 583 519 583 467 c 0,29,30 + 583 414 583 414 547 378 c 2,31,-1 + 468 300 l 1,32,-1 + 547 222 l 2,33,34 + 583 186 583 186 583 133 c 0,0,1 +292 241 m 1,35,-1 + 429 104 l 2,36,37 + 441 92 441 92 458.5 92 c 128,-1,38 + 476 92 476 92 488 104 c 128,-1,39 + 500 116 500 116 500 133 c 0,40,41 + 500 151 500 151 488 163 c 2,42,-1 + 351 300 l 1,43,-1 + 488 437 l 2,44,45 + 500 449 500 449 500 467 c 0,46,47 + 500 484 500 484 488 496 c 128,-1,48 + 476 508 476 508 458.5 508 c 128,-1,49 + 441 508 441 508 429 496 c 2,50,-1 + 292 359 l 1,51,-1 + 154 496 l 2,52,53 + 142 508 142 508 125 508 c 128,-1,54 + 108 508 108 508 96 496 c 0,55,56 + 83 483 83 483 83 467 c 0,57,58 + 83 450 83 450 96 437 c 2,59,-1 + 233 300 l 1,60,-1 + 96 163 l 2,61,62 + 83 150 83 150 83 133 c 0,63,64 + 83 117 83 117 96 104 c 0,65,66 + 108 92 108 92 125 92 c 128,-1,67 + 142 92 142 92 154 104 c 2,68,-1 + 292 241 l 1,35,-1 +EndSplineSet +EndChar + +StartChar: glyph290 +Encoding: 290 57634 291 +Width: 500 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 34 + 28 + 20 + 12 + 4 + 4 + 0 + 2 + 1 + 66 + 3 + 1 + 2 + 0 + 0 + 2 + 79 + 3 + 1 + 2 + 2 + 0 + 83 + 1 + 1 + 0 + 2 + 0 + 71 + 20 + 26 + 20 + 25 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +476 526 m 0,0,1 + 501 501 501 501 501 467 c 128,-1,2 + 501 433 501 433 476 408 c 2,3,-1 + 368 300 l 1,4,-1 + 476 192 l 2,5,6 + 501 167 501 167 501 133 c 128,-1,7 + 501 99 501 99 476 74 c 0,8,9 + 452 50 452 50 417 50 c 128,-1,10 + 382 50 382 50 358 74 c 2,11,-1 + 250 182 l 1,12,-1 + 142 74 l 2,13,14 + 118 50 118 50 83 50 c 128,-1,15 + 48 50 48 50 24 74 c 0,16,17 + -1 99 -1 99 -1 133 c 128,-1,18 + -1 167 -1 167 24 192 c 2,19,-1 + 132 300 l 1,20,-1 + 24 408 l 2,21,22 + -1 433 -1 433 -1 467 c 128,-1,23 + -1 501 -1 501 24 526 c 0,24,25 + 48 551 48 551 83 551 c 128,-1,26 + 118 551 118 551 142 526 c 2,27,-1 + 250 418 l 1,28,-1 + 358 526 l 2,29,30 + 382 551 382 551 417 551 c 128,-1,31 + 452 551 452 551 476 526 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph291 +Encoding: 291 57635 292 +Width: 625 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 98 + 0 + 5 + 19 + 1 + 7 + 0 + 5 + 7 + 89 + 6 + 4 + 18 + 3 + 0 + 8 + 3 + 2 + 1 + 10 + 0 + 1 + 91 + 16 + 14 + 12 + 3 + 10 + 17 + 15 + 13 + 3 + 11 + 9 + 10 + 11 + 91 + 0 + 9 + 2 + 2 + 9 + 79 + 0 + 9 + 9 + 2 + 83 + 0 + 2 + 9 + 2 + 71 + 30 + 30 + 1 + 0 + 87 + 86 + 81 + 80 + 75 + 74 + 69 + 68 + 63 + 62 + 57 + 56 + 51 + 50 + 45 + 44 + 42 + 39 + 36 + 35 + 30 + 33 + 30 + 33 + 32 + 31 + 26 + 23 + 20 + 18 + 15 + 14 + 11 + 8 + 5 + 4 + 0 + 29 + 1 + 29 + 20 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +583 508 m 2,0,1 + 600 508 600 508 612.5 496 c 128,-1,2 + 625 484 625 484 625 467 c 128,-1,3 + 625 450 625 450 612.5 437.5 c 128,-1,4 + 600 425 600 425 583 425 c 1,5,-1 + 583 92 l 2,6,7 + 583 23 583 23 534.5 -26 c 128,-1,8 + 486 -75 486 -75 417 -75 c 2,9,-1 + 208 -75 l 2,10,11 + 139 -75 139 -75 90.5 -26 c 128,-1,12 + 42 23 42 23 42 92 c 2,13,-1 + 42 425 l 1,14,15 + 25 425 25 425 12.5 437.5 c 128,-1,16 + 0 450 0 450 0 467 c 128,-1,17 + 0 484 0 484 12.5 496 c 128,-1,18 + 25 508 25 508 42 508 c 2,19,-1 + 83 508 l 1,20,-1 + 83 550 l 2,21,22 + 83 584 83 584 107.5 608.5 c 128,-1,23 + 132 633 132 633 167 633 c 2,24,-1 + 458 633 l 2,25,26 + 493 633 493 633 517.5 608.5 c 128,-1,27 + 542 584 542 584 542 550 c 2,28,-1 + 542 508 l 1,29,-1 + 583 508 l 2,0,1 +167 550 m 1,30,-1 + 167 508 l 1,31,-1 + 458 508 l 1,32,-1 + 458 550 l 1,33,-1 + 167 550 l 1,30,-1 +500 92 m 2,34,-1 + 500 425 l 1,35,-1 + 125 425 l 1,36,-1 + 125 92 l 2,37,38 + 125 57 125 57 149.5 32.5 c 128,-1,39 + 174 8 174 8 208 8 c 2,40,-1 + 417 8 l 2,41,42 + 451 8 451 8 475.5 32.5 c 128,-1,43 + 500 57 500 57 500 92 c 2,34,-1 +188 362 m 128,-1,45 + 196 362 196 362 202 356 c 128,-1,46 + 208 350 208 350 208 342 c 2,47,-1 + 208 92 l 2,48,49 + 208 84 208 84 202 77.5 c 128,-1,50 + 196 71 196 71 188 71 c 128,-1,51 + 180 71 180 71 173.5 77.5 c 128,-1,52 + 167 84 167 84 167 92 c 2,53,-1 + 167 342 l 2,54,55 + 167 350 167 350 173.5 356 c 128,-1,44 + 180 362 180 362 188 362 c 128,-1,45 +271 362 m 128,-1,57 + 279 362 279 362 285.5 356 c 128,-1,58 + 292 350 292 350 292 342 c 2,59,-1 + 292 92 l 2,60,61 + 292 84 292 84 285.5 77.5 c 128,-1,62 + 279 71 279 71 271 71 c 128,-1,63 + 263 71 263 71 256.5 77.5 c 128,-1,64 + 250 84 250 84 250 92 c 2,65,-1 + 250 342 l 2,66,67 + 250 350 250 350 256.5 356 c 128,-1,56 + 263 362 263 362 271 362 c 128,-1,57 +354 362 m 128,-1,69 + 362 362 362 362 368.5 356 c 128,-1,70 + 375 350 375 350 375 342 c 2,71,-1 + 375 92 l 2,72,73 + 375 84 375 84 368.5 77.5 c 128,-1,74 + 362 71 362 71 354 71 c 128,-1,75 + 346 71 346 71 339.5 77.5 c 128,-1,76 + 333 84 333 84 333 92 c 2,77,-1 + 333 342 l 2,78,79 + 333 350 333 350 339.5 356 c 128,-1,68 + 346 362 346 362 354 362 c 128,-1,69 +438 362 m 128,-1,81 + 446 362 446 362 452 356 c 128,-1,82 + 458 350 458 350 458 342 c 2,83,-1 + 458 92 l 2,84,85 + 458 84 458 84 452 77.5 c 128,-1,86 + 446 71 446 71 438 71 c 128,-1,87 + 430 71 430 71 423.5 77.5 c 128,-1,88 + 417 84 417 84 417 92 c 2,89,-1 + 417 342 l 2,90,91 + 417 350 417 350 423.5 356 c 128,-1,80 + 430 362 430 362 438 362 c 128,-1,81 +EndSplineSet +EndChar + +StartChar: glyph292 +Encoding: 292 57636 293 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 69 + 38 + 1 + 10 + 4 + 1 + 66 + 0 + 4 + 10 + 4 + 106 + 8 + 1 + 7 + 10 + 3 + 10 + 7 + 3 + 104 + 5 + 1 + 3 + 6 + 10 + 3 + 6 + 102 + 0 + 10 + 7 + 1 + 10 + 79 + 9 + 1 + 6 + 2 + 1 + 0 + 1 + 6 + 0 + 92 + 0 + 10 + 10 + 1 + 84 + 0 + 1 + 10 + 1 + 72 + 49 + 48 + 45 + 44 + 34 + 35 + 17 + 36 + 21 + 35 + 35 + 19 + 34 + 11 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +741 76 m 2,0,1 + 758 54 758 54 745 31 c 128,-1,2 + 732 8 732 8 708 8 c 2,3,-1 + 417 8 l 1,4,-1 + 417 -117 l 2,5,6 + 417 -134 417 -134 404.5 -146 c 128,-1,7 + 392 -158 392 -158 375 -158 c 128,-1,8 + 358 -158 358 -158 345.5 -146 c 128,-1,9 + 333 -134 333 -134 333 -117 c 2,10,-1 + 333 8 l 1,11,-1 + 42 8 l 2,12,13 + 18 8 18 8 5 31 c 128,-1,14 + -8 54 -8 54 9 76 c 2,15,-1 + 122 217 l 1,16,-1 + 83 217 l 2,17,18 + 60 217 60 217 47 238 c 128,-1,19 + 34 259 34 259 49 282 c 0,20,21 + 341 699 341 699 342 700 c 0,22,23 + 354 716 354 716 375 716.5 c 128,-1,24 + 396 717 396 717 409 699 c 2,25,-1 + 701 282 l 2,26,27 + 715 259 715 259 702.5 238 c 128,-1,28 + 690 217 690 217 667 217 c 2,29,-1 + 628 217 l 1,30,-1 + 741 76 l 2,0,1 +417 92 m 1,31,-1 + 622 92 l 1,32,-1 + 509 232 l 2,33,34 + 492 254 492 254 505 277 c 128,-1,35 + 518 300 518 300 542 300 c 2,36,-1 + 587 300 l 1,37,-1 + 375 602 l 1,38,-1 + 163 300 l 1,39,-1 + 208 300 l 2,40,41 + 232 300 232 300 245 277 c 128,-1,42 + 258 254 258 254 241 232 c 2,43,-1 + 128 92 l 1,44,-1 + 333 92 l 1,45,-1 + 333 300 l 2,46,47 + 333 317 333 317 345.5 329.5 c 128,-1,48 + 358 342 358 342 375 342 c 128,-1,49 + 392 342 392 342 404.5 329.5 c 128,-1,50 + 417 317 417 317 417 300 c 2,51,-1 + 417 92 l 1,31,-1 +EndSplineSet +EndChar + +StartChar: glyph293 +Encoding: 293 57637 294 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 82 + 22 + 14 + 2 + 5 + 1 + 1 + 66 + 47 + 40 + 33 + 18 + 4 + 1 + 64 + 3 + 1 + 1 + 10 + 7 + 2 + 5 + 2 + 1 + 5 + 89 + 0 + 2 + 0 + 6 + 4 + 2 + 6 + 91 + 0 + 4 + 0 + 9 + 8 + 4 + 9 + 89 + 0 + 8 + 0 + 0 + 8 + 77 + 0 + 8 + 8 + 0 + 83 + 0 + 0 + 8 + 0 + 71 + 48 + 48 + 63 + 62 + 61 + 60 + 48 + 59 + 48 + 59 + 56 + 55 + 52 + 51 + 50 + 49 + 43 + 42 + 37 + 36 + 31 + 30 + 51 + 11 + 16 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +749 92 m 2,0,-1 + 750 -117 l 2,1,2 + 750 -134 750 -134 737.5 -146 c 128,-1,3 + 725 -158 725 -158 708 -158 c 2,4,-1 + 42 -158 l 2,5,6 + 25 -158 25 -158 12.5 -146 c 128,-1,7 + 0 -134 0 -134 0 -117 c 2,8,-1 + 0 92 l 2,9,10 + 0 97 0 97 2 105 c 2,11,-1 + 85 355 l 2,12,13 + 91 372 91 372 109 380 c 1,14,15 + 81 417 81 417 84 463.5 c 128,-1,16 + 87 510 87 510 120 543 c 2,17,-1 + 375 798 l 1,18,-1 + 630 543 l 2,19,20 + 663 510 663 510 666 463.5 c 128,-1,21 + 669 417 669 417 641 380 c 1,22,23 + 658 372 658 372 664 355 c 2,24,-1 + 748 105 l 2,25,26 + 749 101 749 101 749 92 c 2,0,-1 +179 484 m 2,27,28 + 167 472 167 472 167 454.5 c 128,-1,29 + 167 437 167 437 179 425 c 128,-1,30 + 191 413 191 413 208.5 413 c 128,-1,31 + 226 413 226 413 238 425 c 2,32,-1 + 333 520 l 1,33,-1 + 333 279 l 2,34,35 + 333 262 333 262 345.5 250 c 128,-1,36 + 358 238 358 238 375 238 c 128,-1,37 + 392 238 392 238 404.5 250 c 128,-1,38 + 417 262 417 262 417 279 c 2,39,-1 + 417 520 l 1,40,-1 + 512 425 l 2,41,42 + 524 413 524 413 541.5 413 c 128,-1,43 + 559 413 559 413 571 425 c 128,-1,44 + 583 437 583 437 583 454.5 c 128,-1,45 + 583 472 583 472 571 484 c 2,46,-1 + 375 680 l 1,47,-1 + 179 484 l 2,27,28 +155 300 m 1,48,-1 + 86 92 l 1,49,-1 + 664 92 l 1,50,-1 + 595 300 l 1,51,-1 + 500 300 l 1,52,-1 + 500 279 l 2,53,54 + 500 227 500 227 463.5 190.5 c 128,-1,55 + 427 154 427 154 375 154 c 128,-1,56 + 323 154 323 154 286.5 190.5 c 128,-1,57 + 250 227 250 227 250 279 c 2,58,-1 + 250 300 l 1,59,-1 + 155 300 l 1,48,-1 +83 -75 m 1,60,-1 + 667 -75 l 1,61,-1 + 667 50 l 1,62,-1 + 83 50 l 1,63,-1 + 83 -75 l 1,60,-1 +EndSplineSet +EndChar + +StartChar: glyph294 +Encoding: 294 57638 295 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 68 + 48 + 39 + 32 + 3 + 7 + 64 + 9 + 10 + 2 + 7 + 2 + 7 + 106 + 0 + 8 + 3 + 1 + 3 + 8 + 1 + 104 + 6 + 1 + 2 + 5 + 1 + 3 + 8 + 2 + 3 + 89 + 4 + 1 + 1 + 0 + 0 + 1 + 79 + 4 + 1 + 1 + 1 + 0 + 83 + 0 + 0 + 1 + 0 + 71 + 30 + 29 + 43 + 41 + 36 + 35 + 29 + 53 + 30 + 53 + 33 + 17 + 17 + 17 + 36 + 19 + 51 + 11 + 22 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +749 133 m 2,0,-1 + 750 -75 l 2,1,2 + 750 -92 750 -92 737.5 -104.5 c 128,-1,3 + 725 -117 725 -117 708 -117 c 2,4,-1 + 42 -117 l 2,5,6 + 25 -117 25 -117 12.5 -104.5 c 128,-1,7 + 0 -92 0 -92 0 -75 c 0,8,9 + 0 133 0 133 1 133 c 1,10,11 + 1 142 1 142 2 146 c 2,12,-1 + 86 396 l 2,13,14 + 96 425 96 425 125 425 c 2,15,-1 + 292 425 l 1,16,-1 + 292 342 l 1,17,-1 + 155 342 l 1,18,-1 + 86 133 l 1,19,-1 + 664 133 l 1,20,-1 + 595 342 l 1,21,-1 + 458 342 l 1,22,-1 + 458 425 l 1,23,-1 + 625 425 l 2,24,25 + 654 425 654 425 664 396 c 2,26,-1 + 748 146 l 2,27,28 + 749 142 749 142 749 133 c 2,0,-1 +542 471 m 0,29,30 + 523 471 523 471 512 482 c 2,31,-1 + 417 578 l 1,32,-1 + 417 300 l 2,33,34 + 417 283 417 283 404.5 270.5 c 128,-1,35 + 392 258 392 258 375 258 c 128,-1,36 + 358 258 358 258 345.5 270.5 c 128,-1,37 + 333 283 333 283 333 300 c 2,38,-1 + 333 578 l 1,39,-1 + 238 482 l 2,40,41 + 227 471 227 471 208 471 c 0,42,43 + 190 471 190 471 179 482 c 0,44,45 + 167 494 167 494 167 511.5 c 128,-1,46 + 167 529 167 529 179 541 c 2,47,-1 + 375 738 l 1,48,-1 + 571 541 l 2,49,50 + 583 529 583 529 583 511.5 c 128,-1,51 + 583 494 583 494 571 482 c 0,52,53 + 560 471 560 471 542 471 c 0,29,30 +EndSplineSet +EndChar + +StartChar: glyph295 +Encoding: 295 57639 296 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +PUSHB_7 + 46 + 43 + 2 + 9 + 2 + 1 + 66 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 53 + 0 + 3 + 4 + 1 + 1 + 3 + 96 + 0 + 6 + 0 + 4 + 3 + 6 + 4 + 91 + 5 + 1 + 1 + 7 + 12 + 2 + 0 + 10 + 1 + 0 + 92 + 14 + 1 + 10 + 13 + 8 + 2 + 2 + 9 + 10 + 2 + 91 + 0 + 9 + 11 + 11 + 9 + 79 + 0 + 9 + 9 + 11 + 83 + 0 + 11 + 9 + 11 + 71 +ELSE +NPUSHB + 54 + 0 + 3 + 4 + 1 + 4 + 3 + 1 + 104 + 0 + 6 + 0 + 4 + 3 + 6 + 4 + 91 + 5 + 1 + 1 + 7 + 12 + 2 + 0 + 10 + 1 + 0 + 92 + 14 + 1 + 10 + 13 + 8 + 2 + 2 + 9 + 10 + 2 + 91 + 0 + 9 + 11 + 11 + 9 + 79 + 0 + 9 + 9 + 11 + 83 + 0 + 11 + 9 + 11 + 71 +EIF +NPUSHB + 38 + 50 + 49 + 41 + 40 + 2 + 0 + 56 + 54 + 49 + 60 + 50 + 60 + 45 + 44 + 40 + 48 + 41 + 48 + 37 + 36 + 33 + 32 + 29 + 28 + 25 + 24 + 19 + 18 + 13 + 12 + 8 + 5 + 0 + 11 + 2 + 11 + 15 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +750 217 m 2,0,-1 + 500 217 l 2,1,2 + 483 217 483 217 470.5 229 c 128,-1,3 + 458 241 458 241 458 258 c 128,-1,4 + 458 275 458 275 470.5 287.5 c 128,-1,5 + 483 300 483 300 500 300 c 2,6,-1 + 750 300 l 2,7,8 + 767 300 767 300 779.5 287.5 c 128,-1,9 + 792 275 792 275 792 258 c 128,-1,10 + 792 241 792 241 779.5 229 c 128,-1,11 + 767 217 767 217 750 217 c 2,0,-1 +625 92 m 128,-1,13 + 608 92 608 92 595.5 104 c 128,-1,14 + 583 116 583 116 583 133 c 2,15,-1 + 583 383 l 2,16,17 + 583 400 583 400 595.5 412.5 c 128,-1,18 + 608 425 608 425 625 425 c 128,-1,19 + 642 425 642 425 654.5 412.5 c 128,-1,20 + 667 400 667 400 667 383 c 2,21,-1 + 667 133 l 2,22,23 + 667 116 667 116 654.5 104 c 128,-1,12 + 642 92 642 92 625 92 c 128,-1,13 +250 550 m 128,-1,25 + 198 550 198 550 161.5 513.5 c 128,-1,26 + 125 477 125 477 125 425 c 128,-1,27 + 125 373 125 373 161.5 336.5 c 128,-1,28 + 198 300 198 300 250 300 c 128,-1,29 + 302 300 302 300 338.5 336.5 c 128,-1,30 + 375 373 375 373 375 425 c 128,-1,31 + 375 477 375 477 338.5 513.5 c 128,-1,24 + 302 550 302 550 250 550 c 128,-1,25 +250 633 m 128,-1,33 + 336 633 336 633 397 572 c 128,-1,34 + 458 511 458 511 458 425 c 128,-1,35 + 458 339 458 339 397 278 c 128,-1,36 + 336 217 336 217 250 217 c 128,-1,37 + 164 217 164 217 103 278 c 128,-1,38 + 42 339 42 339 42 425 c 128,-1,39 + 42 511 42 511 103 572 c 128,-1,32 + 164 633 164 633 250 633 c 128,-1,33 +250 92 m 0,40,41 + 191 92 191 92 149 74 c 128,-1,42 + 107 56 107 56 91 31 c 1,43,44 + 151 8 151 8 250 8 c 128,-1,45 + 349 8 349 8 408 31 c 1,46,47 + 391 55 391 55 349.5 73.5 c 128,-1,48 + 308 92 308 92 250 92 c 0,40,41 +250 175 m 0,49,50 + 359 175 359 175 429.5 124.5 c 128,-1,51 + 500 74 500 74 500 8 c 0,52,53 + 500 -25 500 -25 428.5 -50 c 128,-1,54 + 357 -75 357 -75 250 -75 c 0,55,56 + 138 -75 138 -75 69 -50 c 128,-1,57 + 0 -25 0 -25 0 8 c 0,58,59 + 0 74 0 74 69 124.5 c 128,-1,60 + 138 175 138 175 250 175 c 0,49,50 +EndSplineSet +EndChar + +StartChar: glyph296 +Encoding: 296 57640 297 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 71 + 0 + 1 + 9 + 0 + 1 + 79 + 8 + 11 + 2 + 4 + 7 + 5 + 2 + 0 + 3 + 4 + 0 + 91 + 0 + 3 + 6 + 2 + 3 + 79 + 0 + 9 + 0 + 6 + 2 + 9 + 6 + 91 + 0 + 3 + 3 + 2 + 83 + 10 + 1 + 2 + 3 + 2 + 71 + 21 + 20 + 9 + 8 + 44 + 43 + 40 + 38 + 35 + 33 + 30 + 29 + 26 + 24 + 20 + 47 + 21 + 47 + 15 + 13 + 8 + 19 + 9 + 19 + 19 + 18 + 12 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +458 425 m 128,-1,1 + 458 339 458 339 397 278 c 128,-1,2 + 336 217 336 217 250 217 c 128,-1,3 + 164 217 164 217 103 278 c 128,-1,4 + 42 339 42 339 42 425 c 128,-1,5 + 42 511 42 511 103 572 c 128,-1,6 + 164 633 164 633 250 633 c 128,-1,7 + 336 633 336 633 397 572 c 128,-1,0 + 458 511 458 511 458 425 c 128,-1,1 +250 -75 m 0,8,9 + 138 -75 138 -75 69 -50 c 128,-1,10 + 0 -25 0 -25 0 8 c 0,11,12 + 0 74 0 74 69 124.5 c 128,-1,13 + 138 175 138 175 250 175 c 0,14,15 + 359 175 359 175 429.5 124.5 c 128,-1,16 + 500 74 500 74 500 8 c 0,17,18 + 500 -25 500 -25 428.5 -50 c 128,-1,19 + 357 -75 357 -75 250 -75 c 0,8,9 +750 300 m 2,20,21 + 767 300 767 300 779.5 287.5 c 128,-1,22 + 792 275 792 275 792 258 c 128,-1,23 + 792 241 792 241 779.5 229 c 128,-1,24 + 767 217 767 217 750 217 c 2,25,-1 + 667 217 l 1,26,-1 + 667 133 l 2,27,28 + 667 116 667 116 654.5 104 c 128,-1,29 + 642 92 642 92 625 92 c 128,-1,30 + 608 92 608 92 595.5 104 c 128,-1,31 + 583 116 583 116 583 133 c 2,32,-1 + 583 217 l 1,33,-1 + 500 217 l 2,34,35 + 483 217 483 217 470.5 229 c 128,-1,36 + 458 241 458 241 458 258 c 128,-1,37 + 458 275 458 275 470.5 287.5 c 128,-1,38 + 483 300 483 300 500 300 c 2,39,-1 + 583 300 l 1,40,-1 + 583 383 l 2,41,42 + 583 400 583 400 595.5 412.5 c 128,-1,43 + 608 425 608 425 625 425 c 128,-1,44 + 642 425 642 425 654.5 412.5 c 128,-1,45 + 667 400 667 400 667 383 c 2,46,-1 + 667 300 l 1,47,-1 + 750 300 l 2,20,21 +EndSplineSet +EndChar + +StartChar: glyph297 +Encoding: 297 57641 298 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 86 + 34 + 31 + 2 + 7 + 6 + 1 + 66 + 0 + 4 + 0 + 2 + 1 + 4 + 2 + 91 + 3 + 1 + 1 + 5 + 10 + 2 + 0 + 8 + 1 + 0 + 91 + 12 + 1 + 8 + 11 + 1 + 6 + 7 + 8 + 6 + 91 + 0 + 7 + 9 + 9 + 7 + 79 + 0 + 7 + 7 + 9 + 83 + 0 + 9 + 7 + 9 + 71 + 38 + 37 + 29 + 28 + 2 + 0 + 44 + 42 + 37 + 48 + 38 + 48 + 33 + 32 + 28 + 36 + 29 + 36 + 25 + 24 + 21 + 20 + 17 + 16 + 13 + 12 + 8 + 5 + 0 + 11 + 2 + 11 + 13 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +750 217 m 2,0,-1 + 500 217 l 2,1,2 + 483 217 483 217 470.5 229 c 128,-1,3 + 458 241 458 241 458 258 c 128,-1,4 + 458 275 458 275 470.5 287.5 c 128,-1,5 + 483 300 483 300 500 300 c 2,6,-1 + 750 300 l 2,7,8 + 767 300 767 300 779.5 287.5 c 128,-1,9 + 792 275 792 275 792 258 c 128,-1,10 + 792 241 792 241 779.5 229 c 128,-1,11 + 767 217 767 217 750 217 c 2,0,-1 +250 550 m 128,-1,13 + 198 550 198 550 161.5 513.5 c 128,-1,14 + 125 477 125 477 125 425 c 128,-1,15 + 125 373 125 373 161.5 336.5 c 128,-1,16 + 198 300 198 300 250 300 c 128,-1,17 + 302 300 302 300 338.5 336.5 c 128,-1,18 + 375 373 375 373 375 425 c 128,-1,19 + 375 477 375 477 338.5 513.5 c 128,-1,12 + 302 550 302 550 250 550 c 128,-1,13 +250 633 m 128,-1,21 + 336 633 336 633 397 572 c 128,-1,22 + 458 511 458 511 458 425 c 128,-1,23 + 458 339 458 339 397 278 c 128,-1,24 + 336 217 336 217 250 217 c 128,-1,25 + 164 217 164 217 103 278 c 128,-1,26 + 42 339 42 339 42 425 c 128,-1,27 + 42 511 42 511 103 572 c 128,-1,20 + 164 633 164 633 250 633 c 128,-1,21 +250 92 m 0,28,29 + 191 92 191 92 149 74 c 128,-1,30 + 107 56 107 56 91 31 c 1,31,32 + 151 8 151 8 250 8 c 128,-1,33 + 349 8 349 8 408 31 c 1,34,35 + 391 55 391 55 349.5 73.5 c 128,-1,36 + 308 92 308 92 250 92 c 0,28,29 +250 175 m 0,37,38 + 359 175 359 175 429.5 124.5 c 128,-1,39 + 500 74 500 74 500 8 c 0,40,41 + 500 -25 500 -25 428.5 -50 c 128,-1,42 + 357 -75 357 -75 250 -75 c 0,43,44 + 138 -75 138 -75 69 -50 c 128,-1,45 + 0 -25 0 -25 0 8 c 0,46,47 + 0 74 0 74 69 124.5 c 128,-1,48 + 138 175 138 175 250 175 c 0,37,38 +EndSplineSet +EndChar + +StartChar: glyph298 +Encoding: 298 57642 299 +Width: 792 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 56 + 0 + 2 + 1 + 0 + 2 + 79 + 0 + 1 + 3 + 6 + 2 + 0 + 4 + 1 + 0 + 91 + 7 + 1 + 4 + 5 + 5 + 4 + 79 + 7 + 1 + 4 + 4 + 5 + 83 + 0 + 5 + 4 + 5 + 71 + 21 + 20 + 2 + 0 + 27 + 25 + 20 + 31 + 21 + 31 + 17 + 16 + 13 + 12 + 8 + 5 + 0 + 11 + 2 + 11 + 8 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +750 217 m 2,0,-1 + 500 217 l 2,1,2 + 483 217 483 217 470.5 229 c 128,-1,3 + 458 241 458 241 458 258 c 128,-1,4 + 458 275 458 275 470.5 287.5 c 128,-1,5 + 483 300 483 300 500 300 c 2,6,-1 + 750 300 l 2,7,8 + 767 300 767 300 779.5 287.5 c 128,-1,9 + 792 275 792 275 792 258 c 128,-1,10 + 792 241 792 241 779.5 229 c 128,-1,11 + 767 217 767 217 750 217 c 2,0,-1 +250 633 m 128,-1,13 + 336 633 336 633 397 572 c 128,-1,14 + 458 511 458 511 458 425 c 128,-1,15 + 458 339 458 339 397 278 c 128,-1,16 + 336 217 336 217 250 217 c 128,-1,17 + 164 217 164 217 103 278 c 128,-1,18 + 42 339 42 339 42 425 c 128,-1,19 + 42 511 42 511 103 572 c 128,-1,12 + 164 633 164 633 250 633 c 128,-1,13 +250 175 m 0,20,21 + 359 175 359 175 429.5 124.5 c 128,-1,22 + 500 74 500 74 500 8 c 0,23,24 + 500 -25 500 -25 428.5 -50 c 128,-1,25 + 357 -75 357 -75 250 -75 c 0,26,27 + 138 -75 138 -75 69 -50 c 128,-1,28 + 0 -25 0 -25 0 8 c 0,29,30 + 0 74 0 74 69 124.5 c 128,-1,31 + 138 175 138 175 250 175 c 0,20,21 +EndSplineSet +EndChar + +StartChar: glyph299 +Encoding: 299 57643 300 +Width: 500 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 71 + 22 + 19 + 2 + 5 + 4 + 1 + 66 + 0 + 2 + 0 + 0 + 1 + 2 + 0 + 91 + 0 + 1 + 0 + 3 + 6 + 1 + 3 + 91 + 9 + 1 + 6 + 8 + 1 + 4 + 5 + 6 + 4 + 91 + 0 + 5 + 7 + 7 + 5 + 79 + 0 + 5 + 5 + 7 + 83 + 0 + 7 + 5 + 7 + 71 + 26 + 25 + 17 + 16 + 32 + 30 + 25 + 36 + 26 + 36 + 21 + 20 + 16 + 24 + 17 + 24 + 19 + 19 + 19 + 16 + 10 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +250 550 m 128,-1,1 + 198 550 198 550 161.5 513.5 c 128,-1,2 + 125 477 125 477 125 425 c 128,-1,3 + 125 373 125 373 161.5 336.5 c 128,-1,4 + 198 300 198 300 250 300 c 128,-1,5 + 302 300 302 300 338.5 336.5 c 128,-1,6 + 375 373 375 373 375 425 c 128,-1,7 + 375 477 375 477 338.5 513.5 c 128,-1,0 + 302 550 302 550 250 550 c 128,-1,1 +250 633 m 128,-1,9 + 336 633 336 633 397 572 c 128,-1,10 + 458 511 458 511 458 425 c 128,-1,11 + 458 339 458 339 397 278 c 128,-1,12 + 336 217 336 217 250 217 c 128,-1,13 + 164 217 164 217 103 278 c 128,-1,14 + 42 339 42 339 42 425 c 128,-1,15 + 42 511 42 511 103 572 c 128,-1,8 + 164 633 164 633 250 633 c 128,-1,9 +250 92 m 0,16,17 + 191 92 191 92 149 74 c 128,-1,18 + 107 56 107 56 91 31 c 1,19,20 + 151 8 151 8 250 8 c 128,-1,21 + 349 8 349 8 408 31 c 1,22,23 + 391 55 391 55 349.5 73.5 c 128,-1,24 + 308 92 308 92 250 92 c 0,16,17 +250 175 m 0,25,26 + 359 175 359 175 429.5 124.5 c 128,-1,27 + 500 74 500 74 500 8 c 0,28,29 + 500 -25 500 -25 428.5 -50 c 128,-1,30 + 357 -75 357 -75 250 -75 c 0,31,32 + 138 -75 138 -75 69 -50 c 128,-1,33 + 0 -25 0 -25 0 8 c 0,34,35 + 0 74 0 74 69 124.5 c 128,-1,36 + 138 175 138 175 250 175 c 0,25,26 +EndSplineSet +EndChar + +StartChar: glyph300 +Encoding: 300 57644 301 +Width: 500 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 30 + 0 + 0 + 0 + 1 + 2 + 0 + 1 + 91 + 0 + 2 + 3 + 3 + 2 + 79 + 0 + 2 + 2 + 3 + 83 + 0 + 3 + 2 + 3 + 71 + 36 + 37 + 19 + 16 + 4 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +250 633 m 128,-1,1 + 336 633 336 633 397 572 c 128,-1,2 + 458 511 458 511 458 425 c 128,-1,3 + 458 339 458 339 397 278 c 128,-1,4 + 336 217 336 217 250 217 c 128,-1,5 + 164 217 164 217 103 278 c 128,-1,6 + 42 339 42 339 42 425 c 128,-1,7 + 42 511 42 511 103 572 c 128,-1,0 + 164 633 164 633 250 633 c 128,-1,1 +0 8 m 0,8,9 + 0 74 0 74 69 124.5 c 128,-1,10 + 138 175 138 175 250 175 c 0,11,12 + 359 175 359 175 429.5 124.5 c 128,-1,13 + 500 74 500 74 500 8 c 0,14,15 + 500 -25 500 -25 428.5 -50 c 128,-1,16 + 357 -75 357 -75 250 -75 c 0,17,18 + 138 -75 138 -75 69 -50 c 128,-1,19 + 0 -25 0 -25 0 8 c 0,8,9 +EndSplineSet +EndChar + +StartChar: glyph301 +Encoding: 301 57645 302 +Width: 667 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 23 + 16 + 1 + 4 + 1 + 43 + 1 + 6 + 5 + 35 + 30 + 2 + 3 + 6 + 3 + 66 + 14 + 1 + 1 + 25 + 1 + 4 + 2 + 65 +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 67 + 0 + 0 + 2 + 0 + 106 + 0 + 2 + 1 + 6 + 2 + 94 + 0 + 1 + 4 + 4 + 1 + 94 + 17 + 1 + 15 + 14 + 15 + 107 + 19 + 1 + 4 + 7 + 1 + 5 + 6 + 4 + 5 + 92 + 8 + 1 + 6 + 0 + 3 + 9 + 6 + 3 + 92 + 13 + 11 + 2 + 9 + 12 + 1 + 10 + 14 + 9 + 10 + 91 + 13 + 11 + 2 + 9 + 9 + 14 + 83 + 18 + 16 + 2 + 14 + 9 + 14 + 71 +ELSE +NPUSHB + 66 + 0 + 0 + 2 + 0 + 106 + 0 + 2 + 1 + 2 + 106 + 0 + 1 + 4 + 4 + 1 + 94 + 17 + 1 + 15 + 14 + 15 + 107 + 19 + 1 + 4 + 7 + 1 + 5 + 6 + 4 + 5 + 92 + 8 + 1 + 6 + 0 + 3 + 9 + 6 + 3 + 92 + 13 + 11 + 2 + 9 + 12 + 1 + 10 + 14 + 9 + 10 + 91 + 13 + 11 + 2 + 9 + 9 + 14 + 83 + 18 + 16 + 2 + 14 + 9 + 14 + 71 +EIF +NPUSHB + 41 + 0 + 0 + 109 + 107 + 104 + 103 + 100 + 99 + 96 + 95 + 92 + 90 + 87 + 86 + 80 + 79 + 74 + 73 + 68 + 67 + 62 + 61 + 57 + 55 + 52 + 51 + 47 + 45 + 41 + 40 + 0 + 39 + 0 + 39 + 34 + 31 + 33 + 20 + 20 + 20 + 18 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +238 617 m 1,0,1 + 218 637 218 637 200 671 c 1,2,-1 + 196 675 l 2,3,4 + 188 683 188 683 196 683 c 1,5,6 + 196 691 196 691 204 683 c 2,7,-1 + 208 679 l 1,8,-1 + 246 629 l 1,9,-1 + 250 629 l 1,10,11 + 295 646 295 646 317 646 c 0,12,13 + 370 646 370 646 417 629 c 0,14,15 + 417 626 417 626 419 628 c 2,16,-1 + 421 629 l 1,17,-1 + 458 683 l 2,18,19 + 467 692 467 692 471 688 c 0,20,21 + 478 682 478 682 471 675 c 0,22,23 + 470 674 470 674 433 621 c 1,24,-1 + 429 617 l 1,25,-1 + 446 608 l 1,26,27 + 505 571 505 571 525 525 c 0,28,29 + 536 501 536 501 542 471 c 0,30,31 + 542 467 542 467 538 467 c 2,32,-1 + 129 467 l 2,33,34 + 125 467 125 467 125 471 c 0,35,36 + 131 527 131 527 171 567 c 1,37,38 + 198 600 198 600 233 617 c 1,39,-1 + 238 617 l 1,0,1 +425 583 m 128,-1,41 + 412 583 412 583 402.5 572.5 c 128,-1,42 + 393 562 393 562 396 550 c 0,43,44 + 396 535 396 535 406 526 c 128,-1,45 + 416 517 416 517 429 517 c 0,46,47 + 441 517 441 517 449.5 527 c 128,-1,48 + 458 537 458 537 458 550 c 0,49,50 + 458 565 458 565 448 574 c 128,-1,40 + 438 583 438 583 425 583 c 128,-1,41 +246 583 m 128,-1,52 + 233 583 233 583 222.5 573 c 128,-1,53 + 212 563 212 563 212 550 c 128,-1,54 + 212 537 212 537 223 527 c 128,-1,55 + 234 517 234 517 250 517 c 0,56,57 + 262 517 262 517 270.5 527 c 128,-1,58 + 279 537 279 537 279 550 c 0,59,60 + 279 565 279 565 269 574 c 128,-1,51 + 259 583 259 583 246 583 c 128,-1,52 +42 425 m 128,-1,62 + 58 425 58 425 70.5 412 c 128,-1,63 + 83 399 83 399 83 383 c 2,64,-1 + 83 175 l 2,65,66 + 83 159 83 159 70.5 146 c 128,-1,67 + 58 133 58 133 42 133 c 128,-1,68 + 26 133 26 133 13 146 c 128,-1,69 + 0 159 0 159 0 175 c 2,70,-1 + 0 383 l 2,71,72 + 0 399 0 399 13 412 c 128,-1,61 + 26 425 26 425 42 425 c 128,-1,62 +625 425 m 128,-1,74 + 641 425 641 425 654 412 c 128,-1,75 + 667 399 667 399 667 383 c 2,76,-1 + 667 175 l 2,77,78 + 667 159 667 159 654 146 c 128,-1,79 + 641 133 641 133 625 133 c 128,-1,80 + 609 133 609 133 596 146 c 128,-1,81 + 583 159 583 159 583 175 c 2,82,-1 + 583 383 l 2,83,84 + 583 399 583 399 596 412 c 128,-1,73 + 609 425 609 425 625 425 c 128,-1,74 +125 92 m 2,85,-1 + 125 425 l 1,86,-1 + 542 425 l 1,87,-1 + 542 92 l 2,88,89 + 542 76 542 76 529 63 c 128,-1,90 + 516 50 516 50 500 50 c 2,91,-1 + 458 50 l 1,92,-1 + 458 -75 l 2,93,94 + 458 -91 458 -91 445.5 -104 c 128,-1,95 + 433 -117 433 -117 417 -117 c 128,-1,96 + 401 -117 401 -117 388 -104 c 128,-1,97 + 375 -91 375 -91 375 -75 c 2,98,-1 + 375 50 l 1,99,-1 + 292 50 l 1,100,-1 + 292 -75 l 2,101,102 + 292 -91 292 -91 279 -104 c 128,-1,103 + 266 -117 266 -117 250 -117 c 128,-1,104 + 234 -117 234 -117 221 -104 c 128,-1,105 + 208 -91 208 -91 208 -75 c 2,106,-1 + 208 50 l 1,107,-1 + 167 50 l 2,108,109 + 151 50 151 50 138 63 c 128,-1,110 + 125 76 125 76 125 92 c 2,85,-1 +EndSplineSet +EndChar + +StartChar: glyph302 +Encoding: 302 57646 303 +Width: 661 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 12 + 50 + 9 + 2 + 1 + 3 + 1 + 66 + 3 + 0 + 2 + 2 + 64 +ELSE +MPPEM +PUSHB_1 + 11 +LT +IF +NPUSHB + 12 + 50 + 9 + 2 + 0 + 3 + 1 + 66 + 3 + 0 + 2 + 2 + 64 +ELSE +NPUSHB + 12 + 50 + 9 + 2 + 1 + 3 + 1 + 66 + 3 + 0 + 2 + 2 + 64 +EIF +EIF +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 32 + 0 + 3 + 2 + 1 + 2 + 3 + 1 + 104 + 0 + 0 + 1 + 1 + 0 + 95 + 4 + 1 + 2 + 3 + 1 + 2 + 79 + 4 + 1 + 2 + 2 + 1 + 83 + 0 + 1 + 2 + 1 + 71 +ELSE +MPPEM +PUSHB_1 + 11 +LT +IF +NPUSHB + 27 + 0 + 3 + 2 + 0 + 2 + 3 + 0 + 104 + 4 + 1 + 2 + 3 + 0 + 2 + 79 + 4 + 1 + 2 + 2 + 0 + 83 + 1 + 1 + 0 + 2 + 0 + 71 +ELSE +NPUSHB + 32 + 0 + 3 + 2 + 1 + 2 + 3 + 1 + 104 + 0 + 0 + 1 + 1 + 0 + 95 + 4 + 1 + 2 + 3 + 1 + 2 + 79 + 4 + 1 + 2 + 2 + 1 + 83 + 0 + 1 + 2 + 1 + 71 +EIF +EIF +NPUSHB + 12 + 48 + 46 + 45 + 43 + 41 + 40 + 26 + 25 + 24 + 23 + 5 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +323 525 m 1,0,1 + 319 592 319 592 361 650 c 1,2,-1 + 477 717 l 1,3,4 + 482 650 482 650 440 592 c 1,5,-1 + 323 525 l 1,0,1 +548 292 m 0,6,7 + 548 236 548 236 579 192 c 128,-1,8 + 610 148 610 148 661 129 c 1,9,10 + 654 99 654 99 615 33 c 1,11,12 + 586 -8 586 -8 573 -21 c 0,13,14 + 527 -83 527 -83 461 -71 c 0,15,16 + 444 -69 444 -69 413.5 -50 c 128,-1,17 + 383 -31 383 -31 369 -29 c 0,18,19 + 339 -23 339 -23 315 -29 c 0,20,21 + 298 -33 298 -33 262.5 -53 c 128,-1,22 + 227 -73 227 -73 215 -75 c 0,23,24 + 208 -75 208 -75 197 -73 c 128,-1,25 + 186 -71 186 -71 182 -71 c 0,26,27 + 127 -44 127 -44 94 0 c 0,28,29 + 74 30 74 30 52 75 c 0,30,31 + 21 135 21 135 11 183 c 0,32,33 + -4 241 -4 241 2 317 c 0,34,35 + 5 353 5 353 21 389.5 c 128,-1,36 + 37 426 37 426 57 446 c 0,37,38 + 86 482 86 482 123 496 c 0,39,40 + 152 508 152 508 211 508 c 0,41,42 + 226 506 226 506 268 488.5 c 128,-1,43 + 310 471 310 471 340 471 c 0,44,45 + 366 471 366 471 415.5 489.5 c 128,-1,46 + 465 508 465 508 494 508 c 0,47,48 + 543 508 543 508 594 479 c 1,49,-1 + 632 442 l 1,50,51 + 594 417 594 417 571 377 c 128,-1,52 + 548 337 548 337 548 292 c 0,6,7 +EndSplineSet +EndChar + +StartChar: glyph303 +Encoding: 303 57647 304 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +MPPEM +PUSHB_1 + 10 +LT +IF +NPUSHB + 39 + 0 + 5 + 0 + 4 + 6 + 5 + 4 + 91 + 9 + 1 + 7 + 0 + 6 + 1 + 7 + 6 + 91 + 8 + 2 + 2 + 1 + 0 + 0 + 3 + 1 + 0 + 91 + 8 + 2 + 2 + 1 + 1 + 3 + 83 + 0 + 3 + 1 + 3 + 71 +ELSE +MPPEM +PUSHB_1 + 11 +LT +IF +NPUSHB + 38 + 9 + 1 + 7 + 5 + 4 + 7 + 79 + 0 + 5 + 6 + 1 + 4 + 1 + 5 + 4 + 91 + 8 + 2 + 2 + 1 + 0 + 0 + 3 + 1 + 0 + 91 + 8 + 2 + 2 + 1 + 1 + 3 + 83 + 0 + 3 + 1 + 3 + 71 +ELSE +NPUSHB + 39 + 0 + 5 + 0 + 4 + 6 + 5 + 4 + 91 + 9 + 1 + 7 + 0 + 6 + 1 + 7 + 6 + 91 + 8 + 2 + 2 + 1 + 0 + 0 + 3 + 1 + 0 + 91 + 8 + 2 + 2 + 1 + 1 + 3 + 83 + 0 + 3 + 1 + 3 + 71 +EIF +EIF +NPUSHB + 24 + 44 + 44 + 17 + 15 + 44 + 57 + 44 + 57 + 53 + 50 + 40 + 39 + 35 + 32 + 23 + 22 + 15 + 29 + 17 + 29 + 54 + 19 + 10 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 279 m 2,0,-1 + 292 33 l 2,1,2 + 292 27 292 27 286 22 c 128,-1,3 + 280 17 280 17 271 17 c 2,4,-1 + 21 46 l 1,5,6 + 0 53 0 53 0 71 c 2,7,-1 + 0 279 l 2,8,9 + 0 288 0 288 6 294 c 128,-1,10 + 12 300 12 300 21 300 c 2,11,-1 + 271 300 l 2,12,13 + 280 300 280 300 286 294 c 128,-1,14 + 292 288 292 288 292 279 c 2,0,-1 +354 300 m 2,15,-1 + 729 296 l 2,16,17 + 738 296 738 296 744 290 c 128,-1,18 + 750 284 750 284 750 275 c 2,19,-1 + 750 -17 l 2,20,21 + 750 -23 750 -23 744 -28 c 128,-1,22 + 738 -33 738 -33 729 -33 c 2,23,-1 + 354 8 l 1,24,25 + 333 15 333 15 333 33 c 2,26,-1 + 333 279 l 2,27,28 + 333 288 333 288 339 294 c 128,-1,29 + 345 300 345 300 354 300 c 2,15,-1 +292 604 m 2,30,-1 + 292 362 l 2,31,32 + 292 342 292 342 271 342 c 2,33,-1 + 21 342 l 2,34,35 + 0 342 0 342 0 362 c 2,36,-1 + 0 571 l 2,37,38 + 0 580 0 580 6 586 c 128,-1,39 + 12 592 12 592 21 592 c 2,40,-1 + 271 621 l 2,41,42 + 280 624 280 624 286 618.5 c 128,-1,43 + 292 613 292 613 292 604 c 2,30,-1 +354 629 m 2,44,-1 + 729 667 l 2,45,46 + 738 670 738 670 744 664.5 c 128,-1,47 + 750 659 750 659 750 650 c 2,48,-1 + 750 358 l 2,49,50 + 750 338 750 338 729 338 c 2,51,-1 + 354 338 l 2,52,53 + 333 338 333 338 333 358 c 2,54,-1 + 333 604 l 2,55,56 + 333 613 333 613 339 621 c 128,-1,57 + 345 629 345 629 354 629 c 2,44,-1 +EndSplineSet +EndChar + +StartChar: glyph304 +Encoding: 304 57648 305 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 18 + 67 + 66 + 11 + 3 + 0 + 9 + 65 + 20 + 2 + 8 + 10 + 46 + 30 + 2 + 6 + 3 + 3 + 66 +MPPEM +PUSHB_1 + 31 +LT +IF +NPUSHB + 60 + 0 + 10 + 1 + 8 + 1 + 10 + 8 + 104 + 5 + 1 + 3 + 7 + 6 + 7 + 3 + 96 + 11 + 1 + 2 + 0 + 9 + 0 + 2 + 9 + 91 + 0 + 0 + 0 + 1 + 10 + 0 + 1 + 91 + 13 + 1 + 8 + 0 + 7 + 3 + 8 + 7 + 89 + 12 + 1 + 6 + 4 + 4 + 6 + 79 + 12 + 1 + 6 + 6 + 4 + 83 + 0 + 4 + 6 + 4 + 71 +ELSE +NPUSHB + 61 + 0 + 10 + 1 + 8 + 1 + 10 + 8 + 104 + 5 + 1 + 3 + 7 + 6 + 7 + 3 + 6 + 104 + 11 + 1 + 2 + 0 + 9 + 0 + 2 + 9 + 91 + 0 + 0 + 0 + 1 + 10 + 0 + 1 + 91 + 13 + 1 + 8 + 0 + 7 + 3 + 8 + 7 + 89 + 12 + 1 + 6 + 4 + 4 + 6 + 79 + 12 + 1 + 6 + 6 + 4 + 83 + 0 + 4 + 6 + 4 + 71 +EIF +NPUSHB + 34 + 50 + 49 + 41 + 40 + 9 + 8 + 69 + 68 + 58 + 55 + 49 + 64 + 50 + 63 + 45 + 44 + 40 + 48 + 41 + 48 + 33 + 31 + 28 + 27 + 24 + 22 + 8 + 39 + 9 + 38 + 34 + 33 + 14 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +167 342 m 0,0,1 + 167 383 167 383 208 383 c 0,2,3 + 250 383 250 383 250 342 c 0,4,5 + 250 300 250 300 208 300 c 0,6,7 + 167 300 167 300 167 342 c 0,0,1 +583 592 m 2,8,9 + 631 592 631 592 666.5 560 c 128,-1,10 + 702 528 702 528 707 483 c 1,11,-1 + 778 506 l 2,12,13 + 798 513 798 513 815.5 500 c 128,-1,14 + 833 487 833 487 833 467 c 2,15,-1 + 833 217 l 2,16,17 + 833 197 833 197 816 183.5 c 128,-1,18 + 799 170 799 170 778 177 c 2,19,-1 + 707 201 l 1,20,21 + 701 156 701 156 666 124 c 128,-1,22 + 631 92 631 92 583 92 c 2,23,-1 + 500 92 l 1,24,-1 + 500 49 l 2,25,26 + 500 -1 500 -1 463 -38 c 128,-1,27 + 426 -75 426 -75 375 -75 c 128,-1,28 + 324 -75 324 -75 289.5 -40.5 c 128,-1,29 + 255 -6 255 -6 250 45 c 1,30,-1 + 250 92 l 1,31,-1 + 125 92 l 2,32,33 + 74 92 74 92 37 129 c 128,-1,34 + 0 166 0 166 0 217 c 2,35,-1 + 0 467 l 2,36,37 + 0 518 0 518 37 555 c 128,-1,38 + 74 592 74 592 125 592 c 2,39,-1 + 583 592 l 2,8,9 +375 8 m 0,40,41 + 391 8 391 8 404 20.5 c 128,-1,42 + 417 33 417 33 417 49 c 2,43,-1 + 417 133 l 1,44,-1 + 333 133 l 1,45,-1 + 333 49 l 2,46,47 + 335 32 335 32 346.5 20 c 128,-1,48 + 358 8 358 8 375 8 c 0,40,41 +583 175 m 2,49,50 + 601 175 601 175 613 187 c 128,-1,51 + 625 199 625 199 625 217 c 2,52,-1 + 625 467 l 2,53,54 + 625 484 625 484 612.5 496 c 128,-1,55 + 600 508 600 508 583 508 c 2,56,-1 + 125 508 l 2,57,58 + 108 508 108 508 95.5 496 c 128,-1,59 + 83 484 83 484 83 467 c 2,60,-1 + 83 217 l 2,61,62 + 83 200 83 200 95.5 187.5 c 128,-1,63 + 108 175 108 175 125 175 c 2,64,-1 + 583 175 l 2,49,50 +750 275 m 1,65,-1 + 750 409 l 1,66,-1 + 667 384 l 1,67,-1 + 667 300 l 1,68,69 + 672 300 672 300 750 275 c 1,65,-1 +EndSplineSet +EndChar + +StartChar: glyph305 +Encoding: 305 57649 306 +Width: 875 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 61 + 27 + 1 + 5 + 0 + 10 + 1 + 1 + 4 + 2 + 66 + 0 + 3 + 0 + 5 + 4 + 3 + 5 + 91 + 0 + 4 + 1 + 2 + 4 + 79 + 6 + 1 + 0 + 0 + 1 + 2 + 0 + 1 + 91 + 0 + 4 + 4 + 2 + 83 + 0 + 2 + 4 + 2 + 71 + 1 + 0 + 35 + 34 + 31 + 30 + 24 + 21 + 16 + 13 + 8 + 6 + 0 + 29 + 1 + 29 + 7 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +833 508 m 0,0,1 + 851 508 851 508 863 496 c 128,-1,2 + 875 484 875 484 875 467 c 2,3,-1 + 875 133 l 2,4,5 + 875 116 875 116 863 104 c 128,-1,6 + 851 92 851 92 833 92 c 0,7,8 + 823 92 823 92 815 96 c 2,9,-1 + 708 149 l 1,10,-1 + 708 133 l 2,11,12 + 708 81 708 81 671.5 44.5 c 128,-1,13 + 635 8 635 8 583 8 c 2,14,-1 + 125 8 l 2,15,16 + 73 8 73 8 36.5 44.5 c 128,-1,17 + 0 81 0 81 0 133 c 2,18,-1 + 0 467 l 2,19,20 + 0 519 0 519 36.5 555.5 c 128,-1,21 + 73 592 73 592 125 592 c 2,22,-1 + 583 592 l 2,23,24 + 635 592 635 592 671.5 555.5 c 128,-1,25 + 708 519 708 519 708 467 c 2,26,-1 + 708 451 l 1,27,-1 + 815 504 l 2,28,29 + 823 508 823 508 833 508 c 0,0,1 +208 238 m 128,-1,31 + 234 238 234 238 252.5 256 c 128,-1,32 + 271 274 271 274 271 300 c 128,-1,33 + 271 326 271 326 252.5 344 c 128,-1,34 + 234 362 234 362 208 362 c 128,-1,35 + 182 362 182 362 164 344 c 128,-1,36 + 146 326 146 326 146 300 c 128,-1,37 + 146 274 146 274 164 256 c 128,-1,30 + 182 238 182 238 208 238 c 128,-1,31 +EndSplineSet +EndChar + +StartChar: glyph306 +Encoding: 306 57650 307 +Width: 660 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 91 + 42 + 41 + 2 + 3 + 0 + 45 + 30 + 2 + 6 + 3 + 46 + 29 + 2 + 2 + 7 + 48 + 40 + 2 + 1 + 2 + 4 + 66 + 8 + 1 + 0 + 3 + 1 + 0 + 79 + 0 + 3 + 0 + 5 + 4 + 3 + 5 + 91 + 0 + 6 + 0 + 7 + 2 + 6 + 7 + 91 + 9 + 1 + 4 + 0 + 2 + 1 + 4 + 2 + 91 + 8 + 1 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 + 27 + 26 + 1 + 0 + 59 + 57 + 51 + 50 + 34 + 32 + 26 + 39 + 27 + 39 + 21 + 19 + 14 + 12 + 8 + 6 + 0 + 25 + 1 + 25 + 10 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +422 557 m 0,0,1 + 453 557 453 557 476.5 533.5 c 128,-1,2 + 500 510 500 510 500 467 c 2,3,-1 + 500 50 l 2,4,5 + 500 7 500 7 476.5 -17 c 128,-1,6 + 453 -41 453 -41 422 -41 c 0,7,8 + 394 -41 394 -41 366 -22 c 2,9,-1 + 255 52 l 2,10,11 + 232 68 232 68 192.5 80 c 128,-1,12 + 153 92 153 92 125 92 c 0,13,14 + 73 92 73 92 36.5 128.5 c 128,-1,15 + 0 165 0 165 0 217 c 2,16,-1 + 0 300 l 2,17,18 + 0 352 0 352 36.5 388.5 c 128,-1,19 + 73 425 73 425 125 425 c 0,20,21 + 154 425 154 425 193 436.5 c 128,-1,22 + 232 448 232 448 255 464 c 2,23,-1 + 366 538 l 2,24,25 + 394 557 394 557 422 557 c 0,0,1 +125 175 m 0,26,27 + 162 175 162 175 209.5 161 c 128,-1,28 + 257 147 257 147 292 127 c 1,29,-1 + 292 389 l 1,30,31 + 257 369 257 369 209.5 355.5 c 128,-1,32 + 162 342 162 342 125 342 c 0,33,34 + 108 342 108 342 95.5 329.5 c 128,-1,35 + 83 317 83 317 83 300 c 2,36,-1 + 83 217 l 2,37,38 + 83 200 83 200 95.5 187.5 c 128,-1,39 + 108 175 108 175 125 175 c 0,26,27 +417 50 m 1,40,-1 + 417 467 l 1,41,-1 + 416 472 l 1,42,43 + 402 463 402 463 374.5 444.5 c 128,-1,44 + 347 426 347 426 333 417 c 1,45,-1 + 333 100 l 1,46,-1 + 412 48 l 1,47,-1 + 416 45 l 1,48,-1 + 417 50 l 1,40,-1 +554 371 m 128,-1,50 + 566 383 566 383 583.5 383 c 128,-1,51 + 601 383 601 383 613 371 c 0,52,53 + 660 324 660 324 660 258 c 0,54,55 + 660 193 660 193 613 146 c 0,56,57 + 600 133 600 133 583 133 c 0,58,59 + 567 133 567 133 554 146 c 0,60,61 + 542 158 542 158 542 175 c 128,-1,62 + 542 192 542 192 554 204 c 0,63,64 + 576 226 576 226 576 258 c 128,-1,65 + 576 290 576 290 554 312 c 0,66,67 + 542 324 542 324 542 341.5 c 128,-1,49 + 542 359 542 359 554 371 c 128,-1,50 +EndSplineSet +EndChar + +StartChar: glyph307 +Encoding: 307 57651 308 +Width: 625 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 94 + 45 + 39 + 36 + 3 + 2 + 3 + 66 + 54 + 44 + 42 + 4 + 5 + 6 + 2 + 67 + 63 + 53 + 43 + 4 + 5 + 6 + 68 + 65 + 64 + 62 + 60 + 21 + 13 + 7 + 1 + 5 + 4 + 66 + 7 + 1 + 4 + 3 + 4 + 106 + 0 + 5 + 6 + 1 + 6 + 5 + 1 + 104 + 0 + 1 + 0 + 6 + 1 + 0 + 102 + 0 + 3 + 2 + 0 + 3 + 79 + 0 + 2 + 0 + 6 + 5 + 2 + 6 + 91 + 0 + 3 + 3 + 0 + 83 + 0 + 0 + 3 + 0 + 71 + 0 + 0 + 58 + 56 + 51 + 49 + 0 + 38 + 0 + 38 + 36 + 42 + 38 + 39 + 8 + 19 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +613 579 m 128,-1,1 + 625 567 625 567 625 550 c 128,-1,2 + 625 533 625 533 613 521 c 2,3,-1 + 500 408 l 1,4,-1 + 500 50 l 2,5,6 + 500 7 500 7 476.5 -17 c 128,-1,7 + 453 -41 453 -41 422 -41 c 0,8,9 + 394 -41 394 -41 366 -22 c 2,10,-1 + 255 52 l 2,11,12 + 226 72 226 72 176 84 c 1,13,-1 + 71 -21 l 2,14,15 + 59 -33 59 -33 42 -33 c 0,16,17 + 24 -33 24 -33 12 -21 c 128,-1,18 + 0 -9 0 -9 0 8.5 c 128,-1,19 + 0 26 0 26 12 38 c 2,20,-1 + 76 102 l 1,21,22 + 42 116 42 116 21 147.5 c 128,-1,23 + 0 179 0 179 0 217 c 2,24,-1 + 0 300 l 2,25,26 + 0 352 0 352 36.5 388.5 c 128,-1,27 + 73 425 73 425 125 425 c 0,28,29 + 154 425 154 425 193 436.5 c 128,-1,30 + 232 448 232 448 255 464 c 2,31,-1 + 366 538 l 2,32,33 + 394 557 394 557 422 557 c 0,34,35 + 469 557 469 557 489 515 c 1,36,-1 + 554 579 l 2,37,38 + 566 591 566 591 583.5 591 c 128,-1,0 + 601 591 601 591 613 579 c 128,-1,1 +416 472 m 1,39,40 + 402 463 402 463 374.5 444.5 c 128,-1,41 + 347 426 347 426 333 417 c 1,42,-1 + 333 329 l 1,43,-1 + 417 413 l 1,44,-1 + 417 467 l 1,45,-1 + 416 472 l 1,39,40 +83 300 m 2,46,-1 + 83 217 l 2,47,48 + 83 200 83 200 95.5 187.5 c 128,-1,49 + 108 175 108 175 125 175 c 0,50,51 + 146 175 146 175 174 170 c 1,52,-1 + 292 288 l 1,53,-1 + 292 389 l 1,54,55 + 257 369 257 369 209.5 355.5 c 128,-1,56 + 162 342 162 342 125 342 c 0,57,58 + 108 342 108 342 95.5 329.5 c 128,-1,59 + 83 317 83 317 83 300 c 2,46,-1 +221 158 m 1,60,61 + 261 146 261 146 292 127 c 1,62,-1 + 292 229 l 1,63,-1 + 221 158 l 1,60,61 +416 45 m 1,64,-1 + 417 50 l 1,65,-1 + 417 354 l 1,66,-1 + 333 271 l 1,67,-1 + 333 100 l 1,68,-1 + 412 48 l 1,69,-1 + 416 45 l 1,64,-1 +EndSplineSet +EndChar + +StartChar: glyph308 +Encoding: 308 57652 309 +Width: 895 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 113 + 97 + 96 + 2 + 3 + 5 + 100 + 85 + 2 + 1 + 9 + 101 + 84 + 2 + 8 + 0 + 103 + 1 + 4 + 2 + 4 + 66 + 95 + 1 + 2 + 1 + 65 + 12 + 1 + 6 + 5 + 7 + 6 + 79 + 0 + 9 + 0 + 11 + 10 + 9 + 11 + 91 + 0 + 1 + 0 + 0 + 8 + 1 + 0 + 91 + 13 + 1 + 10 + 0 + 8 + 2 + 10 + 8 + 91 + 0 + 3 + 0 + 2 + 4 + 3 + 2 + 91 + 0 + 5 + 0 + 4 + 7 + 5 + 4 + 91 + 12 + 1 + 6 + 6 + 7 + 83 + 0 + 7 + 6 + 7 + 71 + 82 + 81 + 56 + 55 + 89 + 87 + 81 + 94 + 82 + 94 + 76 + 74 + 69 + 67 + 63 + 61 + 55 + 80 + 56 + 80 + 26 + 22 + 25 + 38 + 26 + 37 + 14 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +613 371 m 0,0,1 + 660 324 660 324 660 258 c 0,2,3 + 660 193 660 193 613 146 c 0,4,5 + 600 133 600 133 583 133 c 0,6,7 + 567 133 567 133 554 146 c 0,8,9 + 542 158 542 158 542 175 c 128,-1,10 + 542 192 542 192 554 204 c 0,11,12 + 576 226 576 226 576 258 c 128,-1,13 + 576 290 576 290 554 312 c 0,14,15 + 542 324 542 324 542 341.5 c 128,-1,16 + 542 359 542 359 554 371 c 128,-1,17 + 566 383 566 383 583.5 383 c 128,-1,18 + 601 383 601 383 613 371 c 0,0,1 +696 454 m 0,19,20 + 777 373 777 373 777 259 c 0,21,22 + 777 143 777 143 696 62 c 0,23,24 + 684 50 684 50 667 50 c 0,25,26 + 649 50 649 50 637 62 c 128,-1,27 + 625 74 625 74 625 91.5 c 128,-1,28 + 625 109 625 109 637 121 c 0,29,30 + 693 177 693 177 693 258.5 c 128,-1,31 + 693 340 693 340 637 396 c 0,32,33 + 625 408 625 408 625 425 c 128,-1,34 + 625 442 625 442 637 454 c 128,-1,35 + 649 466 649 466 666.5 466 c 128,-1,36 + 684 466 684 466 696 454 c 0,19,20 +779 538 m 0,37,38 + 895 424 895 424 895 259 c 0,39,40 + 895 95 895 95 779 -21 c 0,41,42 + 767 -33 767 -33 750 -33 c 128,-1,43 + 733 -33 733 -33 721 -21 c 128,-1,44 + 709 -9 709 -9 709 8.5 c 128,-1,45 + 709 26 709 26 721 38 c 0,46,47 + 812 129 812 129 812 259 c 0,48,49 + 812 388 812 388 721 479 c 0,50,51 + 709 491 709 491 708.5 508.5 c 128,-1,52 + 708 526 708 526 720 538 c 128,-1,53 + 732 550 732 550 749.5 550 c 128,-1,54 + 767 550 767 550 779 538 c 0,37,38 +422 557 m 0,55,56 + 453 557 453 557 476.5 533.5 c 128,-1,57 + 500 510 500 510 500 467 c 2,58,-1 + 500 50 l 2,59,60 + 500 7 500 7 476.5 -17 c 128,-1,61 + 453 -41 453 -41 422 -41 c 0,62,63 + 394 -41 394 -41 366 -22 c 2,64,-1 + 255 52 l 2,65,66 + 232 68 232 68 192.5 80 c 128,-1,67 + 153 92 153 92 125 92 c 0,68,69 + 73 92 73 92 36.5 128.5 c 128,-1,70 + 0 165 0 165 0 217 c 2,71,-1 + 0 300 l 2,72,73 + 0 352 0 352 36.5 388.5 c 128,-1,74 + 73 425 73 425 125 425 c 0,75,76 + 154 425 154 425 193 436.5 c 128,-1,77 + 232 448 232 448 255 464 c 2,78,-1 + 366 538 l 2,79,80 + 394 557 394 557 422 557 c 0,55,56 +125 175 m 0,81,82 + 162 175 162 175 209.5 161 c 128,-1,83 + 257 147 257 147 292 127 c 1,84,-1 + 292 389 l 1,85,86 + 257 369 257 369 209.5 355.5 c 128,-1,87 + 162 342 162 342 125 342 c 0,88,89 + 108 342 108 342 95.5 329.5 c 128,-1,90 + 83 317 83 317 83 300 c 2,91,-1 + 83 217 l 2,92,93 + 83 200 83 200 95.5 187.5 c 128,-1,94 + 108 175 108 175 125 175 c 0,81,82 +417 50 m 1,95,-1 + 417 467 l 1,96,-1 + 416 472 l 1,97,98 + 402 463 402 463 374.5 444.5 c 128,-1,99 + 347 426 347 426 333 417 c 1,100,-1 + 333 100 l 1,101,-1 + 412 48 l 1,102,-1 + 416 45 l 1,103,-1 + 417 50 l 1,95,-1 +EndSplineSet +EndChar + +StartChar: glyph309 +Encoding: 309 57653 310 +Width: 500 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 74 + 42 + 41 + 2 + 3 + 0 + 45 + 27 + 2 + 4 + 3 + 46 + 26 + 2 + 2 + 5 + 48 + 40 + 2 + 1 + 2 + 4 + 66 + 6 + 1 + 0 + 3 + 1 + 0 + 79 + 0 + 3 + 0 + 4 + 5 + 3 + 4 + 91 + 0 + 5 + 0 + 2 + 1 + 5 + 2 + 91 + 6 + 1 + 0 + 0 + 1 + 83 + 0 + 1 + 0 + 1 + 71 + 1 + 0 + 38 + 36 + 31 + 29 + 21 + 19 + 14 + 12 + 8 + 6 + 0 + 25 + 1 + 25 + 7 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +422 557 m 0,0,1 + 453 557 453 557 476.5 533.5 c 128,-1,2 + 500 510 500 510 500 467 c 2,3,-1 + 500 50 l 2,4,5 + 500 7 500 7 476.5 -17 c 128,-1,6 + 453 -41 453 -41 422 -41 c 0,7,8 + 394 -41 394 -41 366 -22 c 2,9,-1 + 255 52 l 2,10,11 + 232 68 232 68 192.5 80 c 128,-1,12 + 153 92 153 92 125 92 c 0,13,14 + 73 92 73 92 36.5 128.5 c 128,-1,15 + 0 165 0 165 0 217 c 2,16,-1 + 0 300 l 2,17,18 + 0 352 0 352 36.5 388.5 c 128,-1,19 + 73 425 73 425 125 425 c 0,20,21 + 154 425 154 425 193 436.5 c 128,-1,22 + 232 448 232 448 255 464 c 2,23,-1 + 366 538 l 2,24,25 + 394 557 394 557 422 557 c 0,0,1 +292 127 m 1,26,-1 + 292 389 l 1,27,28 + 257 369 257 369 209.5 355.5 c 128,-1,29 + 162 342 162 342 125 342 c 0,30,31 + 108 342 108 342 95.5 329.5 c 128,-1,32 + 83 317 83 317 83 300 c 2,33,-1 + 83 217 l 2,34,35 + 83 200 83 200 95.5 187.5 c 128,-1,36 + 108 175 108 175 125 175 c 0,37,38 + 162 175 162 175 209.5 161 c 128,-1,39 + 257 147 257 147 292 127 c 1,26,-1 +417 50 m 1,40,-1 + 417 467 l 1,41,-1 + 416 472 l 1,42,43 + 402 463 402 463 374.5 444.5 c 128,-1,44 + 347 426 347 426 333 417 c 1,45,-1 + 333 100 l 1,46,-1 + 412 48 l 1,47,-1 + 416 45 l 1,48,-1 + 417 50 l 1,40,-1 +EndSplineSet +EndChar + +StartChar: glyph310 +Encoding: 310 57654 311 +Width: 819 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 72 + 39 + 1 + 4 + 6 + 1 + 66 + 0 + 6 + 0 + 4 + 0 + 6 + 4 + 104 + 8 + 1 + 2 + 7 + 1 + 0 + 6 + 2 + 0 + 91 + 0 + 4 + 0 + 5 + 1 + 4 + 5 + 92 + 0 + 1 + 3 + 3 + 1 + 79 + 0 + 1 + 1 + 3 + 83 + 0 + 3 + 1 + 3 + 71 + 14 + 13 + 1 + 0 + 46 + 45 + 35 + 33 + 31 + 29 + 22 + 19 + 13 + 27 + 14 + 27 + 8 + 5 + 0 + 12 + 1 + 12 + 9 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +410 570 m 0,0,1 + 371 570 371 570 345 526 c 2,2,-1 + 99 116 l 2,3,4 + 73 72 73 72 90.5 40 c 128,-1,5 + 108 8 108 8 160 8 c 2,6,-1 + 660 8 l 2,7,8 + 712 8 712 8 729 40 c 128,-1,9 + 746 72 746 72 720 116 c 2,10,-1 + 474 526 l 2,11,12 + 448 570 448 570 410 570 c 0,0,1 +410 654 m 0,13,14 + 495 654 495 654 545 569 c 2,15,-1 + 792 158 l 2,16,17 + 842 74 842 74 801 -1 c 0,18,19 + 760 -75 760 -75 660 -75 c 2,20,-1 + 160 -75 l 2,21,22 + 61 -75 61 -75 18 -1 c 0,23,24 + -24 73 -24 73 27 158 c 2,25,-1 + 274 569 l 2,26,27 + 324 654 324 654 410 654 c 0,13,14 +355 133 m 0,28,29 + 355 188 355 188 410 188 c 0,30,31 + 464 188 464 188 464 133 c 0,32,33 + 464 79 464 79 410 79 c 0,34,35 + 355 79 355 79 355 133 c 0,28,29 +472 383 m 0,36,37 + 472 372 472 372 467 360 c 2,38,-1 + 410 217 l 1,39,40 + 375 303 375 303 352 360 c 0,41,42 + 347 372 347 372 347 383 c 0,43,44 + 347 409 347 409 365.5 427.5 c 128,-1,45 + 384 446 384 446 410 446 c 128,-1,46 + 436 446 436 446 454 427.5 c 128,-1,47 + 472 409 472 409 472 383 c 0,36,37 +EndSplineSet +EndChar + +StartChar: glyph311 +Encoding: 311 57655 312 +Width: 819 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 46 + 23 + 1 + 5 + 4 + 1 + 66 + 0 + 1 + 0 + 4 + 5 + 1 + 4 + 91 + 0 + 5 + 0 + 3 + 2 + 5 + 3 + 91 + 0 + 2 + 0 + 0 + 2 + 79 + 0 + 2 + 2 + 0 + 83 + 0 + 0 + 2 + 0 + 71 + 22 + 23 + 19 + 18 + 37 + 51 + 6 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +792 158 m 2,0,1 + 843 73 843 73 801 -1 c 0,2,3 + 760 -75 760 -75 660 -75 c 2,4,-1 + 160 -75 l 2,5,6 + 59 -75 59 -75 18 -1 c 0,7,8 + -24 73 -24 73 27 158 c 2,9,-1 + 274 569 l 2,10,11 + 324 654 324 654 410 654 c 0,12,13 + 495 654 495 654 545 569 c 2,14,-1 + 792 158 l 2,0,1 +410 69 m 128,-1,16 + 437 69 437 69 455.5 87.5 c 128,-1,17 + 474 106 474 106 474 133 c 128,-1,18 + 474 160 474 160 455.5 179 c 128,-1,19 + 437 198 437 198 410 198 c 128,-1,20 + 383 198 383 198 364 179 c 128,-1,21 + 345 160 345 160 345 133 c 128,-1,22 + 345 106 345 106 364 87.5 c 128,-1,15 + 383 69 383 69 410 69 c 128,-1,16 +478 378 m 0,23,24 + 482 389 482 389 482 404 c 0,25,26 + 482 434 482 434 461 455.5 c 128,-1,27 + 440 477 440 477 410 477 c 128,-1,28 + 380 477 380 477 358.5 455.5 c 128,-1,29 + 337 434 337 434 337 404 c 0,30,31 + 337 390 337 390 342 377 c 2,32,-1 + 400 234 l 2,33,34 + 404 227 404 227 410 227 c 128,-1,35 + 416 227 416 227 419 234 c 0,36,37 + 478 377 478 377 478 378 c 0,23,24 +EndSplineSet +EndChar + +StartChar: glyph312 +Encoding: 312 57656 313 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 22 + 45 + 42 + 2 + 10 + 5 + 32 + 17 + 2 + 1 + 10 + 29 + 20 + 2 + 9 + 0 + 57 + 54 + 2 + 7 + 9 + 4 + 66 +MPPEM +PUSHB_1 + 15 +LT +IF +NPUSHB + 56 + 0 + 1 + 10 + 2 + 2 + 1 + 96 + 0 + 4 + 0 + 6 + 5 + 4 + 6 + 91 + 0 + 5 + 0 + 10 + 1 + 5 + 10 + 91 + 0 + 2 + 11 + 1 + 0 + 9 + 2 + 0 + 92 + 0 + 9 + 0 + 7 + 8 + 9 + 7 + 91 + 0 + 8 + 3 + 3 + 8 + 79 + 0 + 8 + 8 + 3 + 83 + 0 + 3 + 8 + 3 + 71 +ELSE +NPUSHB + 57 + 0 + 1 + 10 + 2 + 10 + 1 + 2 + 104 + 0 + 4 + 0 + 6 + 5 + 4 + 6 + 91 + 0 + 5 + 0 + 10 + 1 + 5 + 10 + 91 + 0 + 2 + 11 + 1 + 0 + 9 + 2 + 0 + 92 + 0 + 9 + 0 + 7 + 8 + 9 + 7 + 91 + 0 + 8 + 3 + 3 + 8 + 79 + 0 + 8 + 8 + 3 + 83 + 0 + 3 + 8 + 3 + 71 +EIF +NPUSHB + 28 + 1 + 0 + 70 + 69 + 66 + 65 + 63 + 60 + 56 + 55 + 51 + 48 + 44 + 43 + 38 + 35 + 26 + 23 + 12 + 10 + 7 + 6 + 0 + 16 + 1 + 15 + 12 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +292 258 m 2,0,1 + 275 258 275 258 262.5 270.5 c 128,-1,2 + 250 283 250 283 250 300 c 2,3,-1 + 250 383 l 2,4,5 + 250 400 250 400 262.5 412.5 c 128,-1,6 + 275 425 275 425 292 425 c 128,-1,7 + 309 425 309 425 321 412.5 c 128,-1,8 + 333 400 333 400 333 383 c 2,9,-1 + 333 342 l 1,10,-1 + 375 342 l 2,11,12 + 392 342 392 342 404.5 329.5 c 128,-1,13 + 417 317 417 317 417 300 c 128,-1,14 + 417 283 417 283 404.5 270.5 c 128,-1,15 + 392 258 392 258 375 258 c 2,16,-1 + 292 258 l 2,0,1 +500 504 m 1,17,18 + 583 419 583 419 583 300 c 128,-1,19 + 583 181 583 181 500 96 c 1,20,-1 + 500 8 l 2,21,22 + 500 -44 500 -44 463.5 -80.5 c 128,-1,23 + 427 -117 427 -117 375 -117 c 2,24,-1 + 208 -117 l 2,25,26 + 156 -117 156 -117 119.5 -80.5 c 128,-1,27 + 83 -44 83 -44 83 8 c 2,28,-1 + 83 96 l 1,29,30 + 0 181 0 181 0 300 c 128,-1,31 + 0 419 0 419 83 504 c 1,32,-1 + 83 592 l 2,33,34 + 83 644 83 644 119.5 680.5 c 128,-1,35 + 156 717 156 717 208 717 c 2,36,-1 + 375 717 l 2,37,38 + 427 717 427 717 463.5 680.5 c 128,-1,39 + 500 644 500 644 500 592 c 2,40,-1 + 500 504 l 1,17,18 +167 592 m 2,41,-1 + 167 516 l 1,42,43 + 227 550 227 550 292 550 c 128,-1,44 + 357 550 357 550 417 516 c 1,45,-1 + 417 592 l 2,46,47 + 417 609 417 609 404.5 621 c 128,-1,48 + 392 633 392 633 375 633 c 2,49,-1 + 208 633 l 2,50,51 + 191 633 191 633 179 621 c 128,-1,52 + 167 609 167 609 167 592 c 2,41,-1 +417 8 m 2,53,-1 + 417 84 l 1,54,55 + 357 50 357 50 292 50 c 128,-1,56 + 227 50 227 50 167 84 c 1,57,-1 + 167 8 l 2,58,59 + 167 -9 167 -9 179 -21 c 128,-1,60 + 191 -33 191 -33 208 -33 c 2,61,-1 + 375 -33 l 2,62,63 + 392 -33 392 -33 404.5 -21 c 128,-1,64 + 417 -9 417 -9 417 8 c 2,53,-1 +292 92 m 128,-1,66 + 378 92 378 92 439 153 c 128,-1,67 + 500 214 500 214 500 300 c 128,-1,68 + 500 386 500 386 439 447 c 128,-1,69 + 378 508 378 508 292 508 c 128,-1,70 + 206 508 206 508 144.5 447 c 128,-1,71 + 83 386 83 386 83 300 c 128,-1,72 + 83 214 83 214 144.5 153 c 128,-1,65 + 206 92 206 92 292 92 c 128,-1,66 +EndSplineSet +EndChar + +StartChar: glyph313 +Encoding: 313 57657 314 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 173 + 30 + 5 + 2 + 14 + 20 + 26 + 9 + 2 + 23 + 8 + 2 + 66 + 0 + 12 + 16 + 20 + 16 + 12 + 20 + 104 + 0 + 18 + 14 + 22 + 14 + 18 + 22 + 104 + 0 + 21 + 19 + 8 + 19 + 21 + 8 + 104 + 0 + 6 + 23 + 10 + 23 + 6 + 10 + 104 + 0 + 4 + 0 + 17 + 5 + 4 + 17 + 91 + 0 + 0 + 0 + 15 + 13 + 0 + 15 + 91 + 0 + 5 + 0 + 16 + 12 + 5 + 16 + 91 + 0 + 13 + 0 + 20 + 14 + 13 + 20 + 91 + 0 + 14 + 0 + 19 + 21 + 14 + 19 + 91 + 0 + 22 + 0 + 8 + 23 + 22 + 8 + 91 + 0 + 23 + 0 + 7 + 9 + 23 + 7 + 91 + 0 + 10 + 0 + 2 + 11 + 10 + 2 + 91 + 0 + 11 + 3 + 1 + 11 + 79 + 0 + 9 + 0 + 3 + 1 + 9 + 3 + 92 + 0 + 11 + 11 + 1 + 83 + 0 + 1 + 11 + 1 + 71 + 108 + 107 + 105 + 104 + 102 + 101 + 97 + 96 + 94 + 93 + 91 + 90 + 86 + 85 + 83 + 82 + 80 + 79 + 74 + 73 + 71 + 70 + 68 + 67 + 62 + 61 + 59 + 58 + 56 + 55 + 18 + 18 + 21 + 18 + 29 + 34 + 18 + 29 + 16 + 24 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 560 m 128,-1,1 + 676 560 676 560 713 523 c 128,-1,2 + 750 486 750 486 750 435 c 0,3,4 + 750 387 750 387 718 352 c 1,5,6 + 750 317 750 317 750 268 c 0,7,8 + 750 220 750 220 718 185 c 1,9,10 + 750 150 750 150 750 102 c 0,11,12 + 750 50 750 50 713 13 c 0,13,14 + 625 -75 625 -75 500 -75 c 128,-1,15 + 375 -75 375 -75 287 13 c 0,16,17 + 272 28 272 28 250 28 c 128,-1,18 + 228 28 228 28 213 13 c 0,19,20 + 177 -23 177 -23 125 -23 c 0,21,22 + 74 -23 74 -23 37 14 c 128,-1,23 + 0 51 0 51 0 102 c 0,24,25 + 0 150 0 150 32 185 c 1,26,27 + 0 220 0 220 0 268 c 0,28,29 + 0 317 0 317 32 352 c 1,30,31 + 0 387 0 387 0 435 c 0,32,33 + 0 486 0 486 37 523 c 0,34,35 + 126 612 126 612 250 612 c 128,-1,36 + 374 612 374 612 463 523 c 0,37,38 + 478 508 478 508 500 508 c 128,-1,39 + 522 508 522 508 537 523 c 0,40,0 + 574 560 574 560 625 560 c 128,-1,1 +654 72 m 0,41,42 + 666 84 666 84 666 101.5 c 128,-1,43 + 666 119 666 119 654 131 c 128,-1,44 + 642 143 642 143 625 143 c 128,-1,45 + 608 143 608 143 596 131 c 0,46,47 + 557 92 557 92 500 92 c 128,-1,48 + 443 92 443 92 404 131 c 0,49,50 + 340 195 340 195 250 195 c 128,-1,51 + 160 195 160 195 96 131 c 0,52,53 + 84 119 84 119 84 101.5 c 128,-1,54 + 84 84 84 84 96 72 c 128,-1,55 + 108 60 108 60 125 60 c 128,-1,56 + 142 60 142 60 154 72 c 0,57,58 + 194 112 194 112 250 112 c 128,-1,59 + 306 112 306 112 346 72 c 0,60,61 + 410 8 410 8 500 8 c 128,-1,62 + 590 8 590 8 654 72 c 0,41,42 +96 464 m 0,63,64 + 84 452 84 452 84 435 c 128,-1,65 + 84 418 84 418 96 406 c 0,66,67 + 109 393 109 393 125 393 c 128,-1,68 + 141 393 141 393 154 406 c 0,69,70 + 193 445 193 445 250 445 c 128,-1,71 + 307 445 307 445 346 406 c 0,72,73 + 410 342 410 342 500 342 c 128,-1,74 + 590 342 590 342 654 406 c 0,75,76 + 666 418 666 418 666 435 c 128,-1,77 + 666 452 666 452 654 464 c 0,78,79 + 641 477 641 477 625 477 c 128,-1,80 + 609 477 609 477 596 464 c 0,81,82 + 557 425 557 425 500 425 c 128,-1,83 + 443 425 443 425 404 464 c 0,84,85 + 340 528 340 528 250 528 c 128,-1,86 + 160 528 160 528 96 464 c 0,63,64 +654 239 m 0,87,88 + 666 251 666 251 666 268.5 c 128,-1,89 + 666 286 666 286 654 298 c 128,-1,90 + 642 310 642 310 625 310 c 128,-1,91 + 608 310 608 310 596 298 c 0,92,93 + 556 258 556 258 500 258 c 128,-1,94 + 444 258 444 258 404 298 c 0,95,96 + 340 362 340 362 250 362 c 128,-1,97 + 160 362 160 362 96 298 c 0,98,99 + 84 286 84 286 84 268.5 c 128,-1,100 + 84 251 84 251 96 239 c 128,-1,101 + 108 227 108 227 125 227 c 128,-1,102 + 142 227 142 227 154 239 c 0,103,104 + 193 278 193 278 250 278 c 128,-1,105 + 307 278 307 278 346 239 c 0,106,107 + 410 175 410 175 500 175 c 128,-1,108 + 590 175 590 175 654 239 c 0,87,88 +EndSplineSet +EndChar + +StartChar: glyph314 +Encoding: 314 57658 315 +Width: 583 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 157 + 0 + 17 + 15 + 13 + 15 + 17 + 13 + 104 + 0 + 14 + 16 + 9 + 16 + 14 + 9 + 104 + 0 + 11 + 12 + 7 + 12 + 11 + 7 + 104 + 0 + 8 + 10 + 3 + 10 + 8 + 3 + 104 + 0 + 5 + 6 + 1 + 6 + 5 + 1 + 104 + 0 + 2 + 4 + 0 + 4 + 2 + 0 + 104 + 0 + 15 + 0 + 13 + 16 + 15 + 13 + 91 + 0 + 16 + 20 + 1 + 12 + 11 + 16 + 12 + 91 + 0 + 9 + 0 + 7 + 10 + 9 + 7 + 91 + 0 + 10 + 19 + 1 + 6 + 5 + 10 + 6 + 91 + 0 + 3 + 0 + 1 + 4 + 3 + 1 + 91 + 0 + 4 + 2 + 0 + 4 + 79 + 0 + 4 + 4 + 0 + 83 + 18 + 1 + 0 + 4 + 0 + 71 + 47 + 46 + 24 + 23 + 1 + 0 + 64 + 63 + 61 + 60 + 58 + 57 + 53 + 52 + 50 + 49 + 46 + 68 + 47 + 68 + 41 + 40 + 38 + 37 + 35 + 34 + 30 + 29 + 27 + 26 + 23 + 45 + 24 + 45 + 18 + 17 + 15 + 14 + 12 + 11 + 7 + 6 + 4 + 3 + 0 + 22 + 1 + 22 + 21 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +417 8 m 0,0,1 + 326 8 326 8 262 72 c 0,2,3 + 222 112 222 112 166.5 112 c 128,-1,4 + 111 112 111 112 71 72 c 0,5,6 + 59 60 59 60 41.5 60 c 128,-1,7 + 24 60 24 60 12 72 c 128,-1,8 + 0 84 0 84 0 101.5 c 128,-1,9 + 0 119 0 119 12 131 c 0,10,11 + 76 195 76 195 166.5 195 c 128,-1,12 + 257 195 257 195 321 131 c 0,13,14 + 361 91 361 91 416.5 91 c 128,-1,15 + 472 91 472 91 512 131 c 0,16,17 + 524 143 524 143 541.5 143 c 128,-1,18 + 559 143 559 143 571 131 c 128,-1,19 + 583 119 583 119 583 101.5 c 128,-1,20 + 583 84 583 84 571 72 c 0,21,22 + 507 8 507 8 417 8 c 0,0,1 +417 175 m 0,23,24 + 326 175 326 175 262 239 c 0,25,26 + 222 279 222 279 166.5 279 c 128,-1,27 + 111 279 111 279 71 239 c 0,28,29 + 59 227 59 227 41.5 227 c 128,-1,30 + 24 227 24 227 12 239 c 128,-1,31 + 0 251 0 251 0 268.5 c 128,-1,32 + 0 286 0 286 12 298 c 0,33,34 + 76 362 76 362 166.5 362 c 128,-1,35 + 257 362 257 362 321 298 c 0,36,37 + 361 258 361 258 416.5 258 c 128,-1,38 + 472 258 472 258 512 298 c 0,39,40 + 524 310 524 310 541.5 310 c 128,-1,41 + 559 310 559 310 571 298 c 128,-1,42 + 583 286 583 286 583 268.5 c 128,-1,43 + 583 251 583 251 571 239 c 0,44,45 + 507 175 507 175 417 175 c 0,23,24 +417 342 m 0,46,47 + 326 342 326 342 262 406 c 0,48,49 + 222 446 222 446 166.5 446 c 128,-1,50 + 111 446 111 446 71 406 c 0,51,52 + 59 394 59 394 41.5 394 c 128,-1,53 + 24 394 24 394 12 406 c 128,-1,54 + 0 418 0 418 0 435 c 128,-1,55 + 0 452 0 452 12 464 c 0,56,57 + 76 528 76 528 166.5 528 c 128,-1,58 + 257 528 257 528 321 464 c 0,59,60 + 361 424 361 424 416.5 424 c 128,-1,61 + 472 424 472 424 512 464 c 0,62,63 + 524 476 524 476 541.5 476 c 128,-1,64 + 559 476 559 476 571 464 c 128,-1,65 + 583 452 583 452 583 435 c 128,-1,66 + 583 418 583 418 571 406 c 0,67,68 + 507 342 507 342 417 342 c 0,46,47 +EndSplineSet +EndChar + +StartChar: glyph315 +Encoding: 315 57659 316 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 74 + 14 + 1 + 4 + 5 + 34 + 7 + 2 + 2 + 4 + 2 + 66 + 0 + 4 + 5 + 2 + 5 + 4 + 2 + 104 + 7 + 1 + 2 + 3 + 5 + 2 + 3 + 102 + 0 + 1 + 0 + 5 + 4 + 1 + 5 + 91 + 0 + 3 + 0 + 0 + 3 + 79 + 0 + 3 + 3 + 0 + 83 + 6 + 1 + 0 + 3 + 0 + 71 + 21 + 20 + 2 + 0 + 39 + 37 + 32 + 30 + 27 + 24 + 20 + 44 + 21 + 44 + 12 + 10 + 0 + 19 + 2 + 19 + 8 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 8 m 2,0,-1 + 167 8 l 2,1,2 + 98 8 98 8 49 57 c 128,-1,3 + 0 106 0 106 0 175 c 0,4,5 + 0 233 0 233 35 277.5 c 128,-1,6 + 70 322 70 322 125 336 c 1,7,-1 + 125 342 l 2,8,9 + 125 446 125 446 198.5 519 c 128,-1,10 + 272 592 272 592 375 592 c 0,11,12 + 455 592 455 592 519.5 545.5 c 128,-1,13 + 584 499 584 499 610 424 c 1,14,15 + 702 431 702 431 767.5 369.5 c 128,-1,16 + 833 308 833 308 833 217 c 0,17,18 + 833 131 833 131 772 69.5 c 128,-1,19 + 711 8 711 8 625 8 c 2,0,-1 +163 259 m 2,20,21 + 131 259 131 259 107 234 c 128,-1,22 + 83 209 83 209 83 175 c 128,-1,23 + 83 141 83 141 107.5 116.5 c 128,-1,24 + 132 92 132 92 167 92 c 2,25,-1 + 625 92 l 2,26,27 + 677 92 677 92 713.5 128.5 c 128,-1,28 + 750 165 750 165 750 217 c 128,-1,29 + 750 269 750 269 713.5 305.5 c 128,-1,30 + 677 342 677 342 625 342 c 0,31,32 + 610 342 610 342 591 336 c 2,33,-1 + 546 323 l 1,34,-1 + 539 369 l 2,35,36 + 528 429 528 429 482 468.5 c 128,-1,37 + 436 508 436 508 375 508 c 0,38,39 + 306 508 306 508 257 459.5 c 128,-1,40 + 208 411 208 411 208 342 c 0,41,42 + 208 330 208 330 212 308 c 2,43,-1 + 222 258 l 1,44,-1 + 163 259 l 2,20,21 +EndSplineSet +EndChar + +StartChar: glyph316 +Encoding: 316 57660 317 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 89 + 49 + 1 + 8 + 9 + 70 + 42 + 2 + 10 + 8 + 2 + 66 + 0 + 8 + 9 + 10 + 9 + 8 + 10 + 104 + 0 + 10 + 1 + 9 + 10 + 1 + 102 + 0 + 7 + 0 + 9 + 8 + 7 + 9 + 91 + 11 + 1 + 5 + 12 + 1 + 6 + 0 + 5 + 6 + 91 + 3 + 1 + 1 + 2 + 1 + 0 + 4 + 1 + 0 + 91 + 11 + 1 + 5 + 5 + 4 + 83 + 0 + 4 + 5 + 4 + 71 + 37 + 36 + 88 + 86 + 82 + 80 + 75 + 73 + 68 + 66 + 47 + 45 + 36 + 91 + 37 + 91 + 21 + 21 + 21 + 21 + 21 + 16 + 13 + 21 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +542 -117 m 128,-1,1 + 525 -117 525 -117 512.5 -104.5 c 128,-1,2 + 500 -92 500 -92 500 -75 c 2,3,-1 + 500 175 l 2,4,5 + 500 192 500 192 512.5 204.5 c 128,-1,6 + 525 217 525 217 542 217 c 128,-1,7 + 559 217 559 217 571 204.5 c 128,-1,8 + 583 192 583 192 583 175 c 2,9,-1 + 583 -75 l 2,10,11 + 583 -92 583 -92 571 -104.5 c 128,-1,0 + 559 -117 559 -117 542 -117 c 128,-1,1 +292 -117 m 128,-1,13 + 275 -117 275 -117 262.5 -104.5 c 128,-1,14 + 250 -92 250 -92 250 -75 c 2,15,-1 + 250 175 l 2,16,17 + 250 192 250 192 262.5 204.5 c 128,-1,18 + 275 217 275 217 292 217 c 128,-1,19 + 309 217 309 217 321 204.5 c 128,-1,20 + 333 192 333 192 333 175 c 2,21,-1 + 333 -75 l 2,22,23 + 333 -92 333 -92 321 -104.5 c 128,-1,12 + 309 -117 309 -117 292 -117 c 128,-1,13 +417 -200 m 128,-1,25 + 400 -200 400 -200 387.5 -187.5 c 128,-1,26 + 375 -175 375 -175 375 -158 c 2,27,-1 + 375 92 l 2,28,29 + 375 109 375 109 387.5 121 c 128,-1,30 + 400 133 400 133 417 133 c 128,-1,31 + 434 133 434 133 446 121 c 128,-1,32 + 458 109 458 109 458 92 c 2,33,-1 + 458 -158 l 2,34,35 + 458 -175 458 -175 446 -187.5 c 128,-1,24 + 434 -200 434 -200 417 -200 c 128,-1,25 +167 50 m 0,36,37 + 98 50 98 50 49 99 c 128,-1,38 + 0 148 0 148 0 217 c 0,39,40 + 0 275 0 275 35 319.5 c 128,-1,41 + 70 364 70 364 125 378 c 1,42,-1 + 125 383 l 2,43,44 + 125 486 125 486 198.5 559.5 c 128,-1,45 + 272 633 272 633 375 633 c 0,46,47 + 456 633 456 633 520 587 c 128,-1,48 + 584 541 584 541 610 466 c 1,49,50 + 701 473 701 473 767 411 c 128,-1,51 + 833 349 833 349 833 258 c 0,52,53 + 833 188 833 188 790.5 132.5 c 128,-1,54 + 748 77 748 77 681 58 c 0,55,56 + 664 53 664 53 648.5 62 c 128,-1,57 + 633 71 633 71 629 87 c 0,58,59 + 624 104 624 104 633 119 c 128,-1,60 + 642 134 642 134 658 138 c 0,61,62 + 699 149 699 149 724.5 182.5 c 128,-1,63 + 750 216 750 216 750 258 c 0,64,65 + 750 310 750 310 713.5 346.5 c 128,-1,66 + 677 383 677 383 625 383 c 0,67,68 + 607 383 607 383 591 378 c 2,69,-1 + 546 365 l 1,70,-1 + 539 411 l 2,71,72 + 528 471 528 471 482 510.5 c 128,-1,73 + 436 550 436 550 375 550 c 0,74,75 + 306 550 306 550 257 501 c 128,-1,76 + 208 452 208 452 208 383 c 0,77,78 + 208 372 208 372 212 350 c 2,79,-1 + 222 300 l 1,80,-1 + 163 300 l 2,81,82 + 131 300 131 300 107 275.5 c 128,-1,83 + 83 251 83 251 83 217 c 0,84,85 + 83 182 83 182 107.5 157.5 c 128,-1,86 + 132 133 132 133 167 133 c 0,87,88 + 184 133 184 133 196 121 c 128,-1,89 + 208 109 208 109 208 92 c 128,-1,90 + 208 75 208 75 196 62.5 c 128,-1,91 + 184 50 184 50 167 50 c 0,36,37 +EndSplineSet +EndChar + +StartChar: glyph317 +Encoding: 317 57661 318 +Width: 473 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 54 + 8 + 1 + 3 + 1 + 25 + 16 + 2 + 2 + 3 + 3 + 1 + 0 + 2 + 3 + 66 + 0 + 1 + 0 + 3 + 2 + 1 + 3 + 91 + 0 + 2 + 0 + 0 + 2 + 79 + 0 + 2 + 2 + 0 + 83 + 4 + 1 + 0 + 2 + 0 + 71 + 1 + 0 + 24 + 22 + 19 + 17 + 12 + 10 + 0 + 15 + 1 + 15 + 5 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +160 -33 m 0,0,1 + 106 -33 106 -33 55 -15 c 2,2,-1 + 0 6 l 1,3,-1 + 37 51 l 2,4,5 + 118 150 118 150 118 279 c 128,-1,6 + 118 408 118 408 37 507 c 2,7,-1 + 0 553 l 1,8,-1 + 55 573 l 2,9,10 + 109 592 109 592 160 592 c 0,11,12 + 289 592 289 592 381 500 c 128,-1,13 + 473 408 473 408 473 279 c 128,-1,14 + 473 150 473 150 381 58.5 c 128,-1,15 + 289 -33 289 -33 160 -33 c 0,0,1 +139 51 m 1,16,17 + 146 50 146 50 160 50 c 0,18,19 + 254 50 254 50 321.5 117 c 128,-1,20 + 389 184 389 184 389 279 c 128,-1,21 + 389 374 389 374 321.5 441 c 128,-1,22 + 254 508 254 508 160 508 c 0,23,24 + 146 508 146 508 139 507 c 1,25,26 + 202 401 202 401 202 279 c 128,-1,27 + 202 157 202 157 139 51 c 1,16,17 +EndSplineSet +EndChar + +StartChar: glyph318 +Encoding: 318 57662 319 +Width: 912 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 126 + 1 + 1 + 3 + 0 + 25 + 9 + 2 + 2 + 3 + 63 + 1 + 8 + 4 + 65 + 48 + 32 + 17 + 4 + 6 + 8 + 45 + 1 + 7 + 6 + 5 + 66 + 51 + 1 + 8 + 1 + 65 + 0 + 0 + 3 + 0 + 106 + 0 + 6 + 8 + 7 + 8 + 6 + 7 + 104 + 0 + 7 + 10 + 8 + 7 + 10 + 102 + 0 + 10 + 5 + 8 + 10 + 5 + 102 + 0 + 3 + 11 + 1 + 4 + 8 + 3 + 4 + 91 + 0 + 2 + 9 + 1 + 8 + 6 + 2 + 8 + 91 + 12 + 1 + 5 + 1 + 1 + 5 + 79 + 12 + 1 + 5 + 5 + 1 + 84 + 0 + 1 + 5 + 1 + 72 + 73 + 72 + 62 + 61 + 94 + 92 + 87 + 86 + 85 + 84 + 81 + 80 + 78 + 76 + 72 + 98 + 73 + 97 + 61 + 71 + 62 + 71 + 57 + 55 + 53 + 52 + 40 + 37 + 31 + 30 + 13 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +562 675 m 2,0,-1 + 521 550 l 1,1,-1 + 479 675 l 2,2,3 + 473 692 473 692 481.5 708.5 c 128,-1,4 + 490 725 490 725 507 731 c 0,5,6 + 530 739 530 739 550.5 721 c 128,-1,7 + 571 703 571 703 562 675 c 2,0,-1 +786 548 m 2,8,-1 + 668 489 l 1,9,-1 + 727 607 l 2,10,11 + 735 623 735 623 752.5 628.5 c 128,-1,12 + 770 634 770 634 786 626 c 0,13,14 + 811 613 811 613 810 586.5 c 128,-1,15 + 809 560 809 560 786 548 c 2,8,-1 +854 300 m 2,16,-1 + 729 342 l 1,17,-1 + 854 383 l 2,18,19 + 871 389 871 389 887.5 381 c 128,-1,20 + 904 373 904 373 910 356 c 0,21,22 + 918 333 918 333 900 312 c 128,-1,23 + 882 291 882 291 854 300 c 2,16,-1 +315 607 m 2,24,-1 + 374 489 l 1,25,-1 + 256 548 l 2,26,27 + 239 556 239 556 233.5 573 c 128,-1,28 + 228 590 228 590 236 607 c 0,29,30 + 249 632 249 632 276 631 c 128,-1,31 + 303 630 303 630 315 607 c 2,24,-1 +699 286 m 1,32,33 + 759 263 759 263 796 210.5 c 128,-1,34 + 833 158 833 158 833 92 c 0,35,36 + 833 6 833 6 772 -55.5 c 128,-1,37 + 711 -117 711 -117 625 -117 c 2,38,-1 + 167 -117 l 2,39,40 + 98 -117 98 -117 49 -68 c 128,-1,41 + 0 -19 0 -19 0 50 c 0,42,43 + 0 108 0 108 35 152.5 c 128,-1,44 + 70 197 70 197 125 211 c 1,45,-1 + 125 217 l 2,46,47 + 125 267 125 267 143 311 c 1,48,49 + 119 333 119 333 136 364 c 128,-1,50 + 153 395 153 395 189 383 c 1,51,52 + 265 467 265 467 375 467 c 1,53,-1 + 381 466 l 1,54,55 + 436 529 436 529 521 529 c 0,56,57 + 598 529 598 529 653 474 c 128,-1,58 + 708 419 708 419 708 342 c 0,59,60 + 708 313 708 313 699 286 c 1,32,33 +521 446 m 0,61,62 + 477 446 477 446 445 412 c 1,63,64 + 533 381 533 381 568 291 c 1,65,66 + 589 297 589 297 615 299 c 1,67,68 + 625 321 625 321 625 342 c 0,69,70 + 625 385 625 385 594.5 415.5 c 128,-1,71 + 564 446 564 446 521 446 c 0,61,62 +625 -33 m 2,72,73 + 677 -33 677 -33 713.5 3.5 c 128,-1,74 + 750 40 750 40 750 92 c 128,-1,75 + 750 144 750 144 713.5 180.5 c 128,-1,76 + 677 217 677 217 625 217 c 0,77,78 + 610 217 610 217 591 211 c 1,79,-1 + 579 210 l 2,80,81 + 546 210 546 210 538 248 c 0,82,83 + 527 306 527 306 482 344 c 128,-1,84 + 437 382 437 382 378 384 c 1,85,-1 + 375 383 l 1,86,87 + 306 383 306 383 257 334.5 c 128,-1,88 + 208 286 208 286 208 217 c 0,89,90 + 208 205 208 205 212 183 c 2,91,-1 + 222 133 l 1,92,-1 + 163 134 l 2,93,94 + 131 134 131 134 107 109 c 128,-1,95 + 83 84 83 84 83 50 c 128,-1,96 + 83 16 83 16 107.5 -8.5 c 128,-1,97 + 132 -33 132 -33 167 -33 c 2,98,-1 + 625 -33 l 2,72,73 +EndSplineSet +EndChar + +StartChar: glyph319 +Encoding: 319 57663 320 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 85 + 48 + 1 + 2 + 3 + 41 + 13 + 2 + 4 + 2 + 55 + 1 + 1 + 4 + 71 + 63 + 2 + 0 + 1 + 4 + 66 + 0 + 2 + 3 + 4 + 3 + 2 + 4 + 104 + 0 + 4 + 1 + 3 + 4 + 1 + 102 + 0 + 7 + 0 + 3 + 2 + 7 + 3 + 91 + 5 + 1 + 1 + 0 + 0 + 1 + 79 + 5 + 1 + 1 + 1 + 0 + 83 + 6 + 8 + 2 + 0 + 1 + 0 + 71 + 1 + 0 + 46 + 44 + 36 + 34 + 31 + 29 + 25 + 23 + 18 + 16 + 11 + 9 + 6 + 4 + 0 + 53 + 1 + 53 + 9 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 50 m 0,0,1 + 608 50 608 50 595.5 62.5 c 128,-1,2 + 583 75 583 75 583 92 c 128,-1,3 + 583 109 583 109 595.5 121 c 128,-1,4 + 608 133 608 133 625 133 c 0,5,6 + 677 133 677 133 713.5 169.5 c 128,-1,7 + 750 206 750 206 750 258 c 128,-1,8 + 750 310 750 310 713.5 346.5 c 128,-1,9 + 677 383 677 383 625 383 c 0,10,11 + 607 383 607 383 591 378 c 2,12,-1 + 546 365 l 1,13,-1 + 539 411 l 2,14,15 + 528 471 528 471 482 510.5 c 128,-1,16 + 436 550 436 550 375 550 c 0,17,18 + 306 550 306 550 257 501 c 128,-1,19 + 208 452 208 452 208 383 c 0,20,21 + 208 372 208 372 212 350 c 2,22,-1 + 222 300 l 1,23,-1 + 163 300 l 2,24,25 + 131 300 131 300 107 275.5 c 128,-1,26 + 83 251 83 251 83 217 c 0,27,28 + 83 182 83 182 107.5 157.5 c 128,-1,29 + 132 133 132 133 167 133 c 0,30,31 + 184 133 184 133 196 121 c 128,-1,32 + 208 109 208 109 208 92 c 128,-1,33 + 208 75 208 75 196 62.5 c 128,-1,34 + 184 50 184 50 167 50 c 0,35,36 + 98 50 98 50 49 99 c 128,-1,37 + 0 148 0 148 0 217 c 0,38,39 + 0 275 0 275 35 319.5 c 128,-1,40 + 70 364 70 364 125 378 c 1,41,-1 + 125 383 l 2,42,43 + 125 486 125 486 198.5 559.5 c 128,-1,44 + 272 633 272 633 375 633 c 0,45,46 + 456 633 456 633 520 587 c 128,-1,47 + 584 541 584 541 610 466 c 1,48,49 + 701 473 701 473 767 411 c 128,-1,50 + 833 349 833 349 833 258 c 0,51,52 + 833 172 833 172 772 111 c 128,-1,53 + 711 50 711 50 625 50 c 0,0,1 +354 50 m 2,54,-1 + 396 175 l 1,55,-1 + 438 50 l 2,56,57 + 444 33 444 33 435.5 16.5 c 128,-1,58 + 427 0 427 0 410 -6 c 0,59,60 + 387 -14 387 -14 366 4 c 128,-1,61 + 345 22 345 22 354 50 c 2,54,-1 +479 -33 m 2,62,-1 + 521 92 l 1,63,-1 + 562 -33 l 2,64,65 + 568 -50 568 -50 560 -66.5 c 128,-1,66 + 552 -83 552 -83 535 -89 c 0,67,68 + 512 -97 512 -97 491 -79 c 128,-1,69 + 470 -61 470 -61 479 -33 c 2,62,-1 +229 -33 m 2,70,-1 + 271 92 l 1,71,-1 + 312 -33 l 2,72,73 + 318 -50 318 -50 310 -66.5 c 128,-1,74 + 302 -83 302 -83 285 -89 c 0,75,76 + 262 -97 262 -97 241 -79 c 128,-1,77 + 220 -61 220 -61 229 -33 c 2,70,-1 +EndSplineSet +EndChar + +StartChar: glyph320 +Encoding: 320 57664 321 +Width: 689 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 129 + 117 + 109 + 2 + 10 + 8 + 143 + 133 + 126 + 124 + 102 + 100 + 92 + 84 + 8 + 13 + 10 + 152 + 75 + 2 + 7 + 13 + 155 + 72 + 2 + 12 + 7 + 163 + 65 + 55 + 46 + 44 + 18 + 16 + 7 + 8 + 6 + 12 + 5 + 66 + 0 + 10 + 8 + 13 + 8 + 10 + 13 + 104 + 0 + 13 + 7 + 8 + 13 + 7 + 102 + 11 + 1 + 7 + 12 + 8 + 7 + 12 + 102 + 0 + 6 + 12 + 0 + 12 + 6 + 0 + 104 + 5 + 1 + 0 + 2 + 12 + 0 + 2 + 102 + 9 + 1 + 8 + 10 + 1 + 8 + 79 + 0 + 12 + 3 + 1 + 2 + 1 + 12 + 2 + 89 + 9 + 1 + 8 + 8 + 1 + 83 + 4 + 1 + 1 + 8 + 1 + 71 + 169 + 168 + 165 + 164 + 150 + 149 + 136 + 135 + 120 + 119 + 107 + 106 + 78 + 77 + 23 + 25 + 18 + 24 + 18 + 42 + 28 + 14 + 22 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +654 169 m 2,0,1 + 672 165 672 165 682 150.5 c 128,-1,2 + 692 136 692 136 688 118 c 0,3,4 + 683 92 683 92 656 84.5 c 128,-1,5 + 629 77 629 77 612 97 c 2,6,-1 + 543 175 l 1,7,-1 + 560 114 l 2,8,9 + 564 98 564 98 555.5 83 c 128,-1,10 + 547 68 547 68 530 63 c 2,11,-1 + 519 61 l 2,12,13 + 505 61 505 61 494 69.5 c 128,-1,14 + 483 78 483 78 479 92 c 2,15,-1 + 462 155 l 1,16,17 + 436 134 436 134 411 125 c 1,18,-1 + 457 79 l 2,19,20 + 469 67 469 67 469 50 c 128,-1,21 + 469 33 469 33 457 21 c 0,22,23 + 444 8 444 8 428 8 c 0,24,25 + 411 8 411 8 398 21 c 2,26,-1 + 369 50 l 1,27,-1 + 359 50 l 1,28,-1 + 386 -33 l 2,29,30 + 392 -50 392 -50 383.5 -66.5 c 128,-1,31 + 375 -83 375 -83 358 -89 c 0,32,33 + 335 -97 335 -97 314.5 -79 c 128,-1,34 + 294 -61 294 -61 303 -33 c 2,35,-1 + 331 50 l 1,36,-1 + 320 50 l 1,37,-1 + 291 21 l 2,38,39 + 279 9 279 9 261.5 9 c 128,-1,40 + 244 9 244 9 232 21 c 128,-1,41 + 220 33 220 33 220 50 c 128,-1,42 + 220 67 220 67 232 79 c 2,43,-1 + 278 125 l 1,44,45 + 253 134 253 134 227 155 c 1,46,-1 + 210 92 l 2,47,48 + 206 78 206 78 195 69.5 c 128,-1,49 + 184 61 184 61 170 61 c 2,50,-1 + 159 63 l 2,51,52 + 143 67 143 67 134 82 c 128,-1,53 + 125 97 125 97 130 114 c 2,54,-1 + 146 176 l 1,55,-1 + 77 97 l 2,56,57 + 65 84 65 84 46.5 83 c 128,-1,58 + 28 82 28 82 15 94 c 0,59,60 + 1 106 1 106 0 124 c 128,-1,61 + -1 142 -1 142 11 156 c 0,62,63 + 21 166 21 166 35 169 c 2,64,-1 + 137 190 l 1,65,-1 + 76 207 l 2,66,67 + 59 212 59 212 50.5 227 c 128,-1,68 + 42 242 42 242 46 258 c 128,-1,69 + 50 274 50 274 65 283 c 128,-1,70 + 80 292 80 292 97 287 c 2,71,-1 + 160 271 l 1,72,73 + 157 286 157 286 157 300 c 128,-1,74 + 157 314 157 314 160 329 c 1,75,-1 + 97 313 l 1,76,-1 + 86 311 l 2,77,78 + 72 311 72 311 61 319.5 c 128,-1,79 + 50 328 50 328 46 342 c 0,80,81 + 42 358 42 358 50.5 373 c 128,-1,82 + 59 388 59 388 76 393 c 2,83,-1 + 137 410 l 1,84,-1 + 35 431 l 2,85,86 + 17 435 17 435 7 449.5 c 128,-1,87 + -3 464 -3 464 1 482 c 0,88,89 + 6 508 6 508 33 515.5 c 128,-1,90 + 60 523 60 523 77 503 c 2,91,-1 + 146 424 l 1,92,-1 + 130 486 l 2,93,94 + 125 503 125 503 134 518 c 128,-1,95 + 143 533 143 533 159 537 c 0,96,97 + 176 542 176 542 191 533 c 128,-1,98 + 206 524 206 524 210 508 c 2,99,-1 + 227 445 l 1,100,101 + 253 466 253 466 278 475 c 1,102,-1 + 232 521 l 2,103,104 + 220 533 220 533 220 550 c 128,-1,105 + 220 567 220 567 232 579 c 128,-1,106 + 244 591 244 591 261.5 591 c 128,-1,107 + 279 591 279 591 291 579 c 2,108,-1 + 336 534 l 1,109,-1 + 303 633 l 2,110,111 + 297 650 297 650 305.5 666.5 c 128,-1,112 + 314 683 314 683 331 689 c 0,113,114 + 354 697 354 697 374.5 679 c 128,-1,115 + 395 661 395 661 386 633 c 2,116,-1 + 353 534 l 1,117,-1 + 398 579 l 2,118,119 + 410 591 410 591 427.5 591 c 128,-1,120 + 445 591 445 591 457 579 c 128,-1,121 + 469 567 469 567 469 550 c 128,-1,122 + 469 533 469 533 457 521 c 2,123,-1 + 411 475 l 1,124,125 + 436 466 436 466 462 445 c 1,126,-1 + 479 508 l 2,127,128 + 483 524 483 524 498 533 c 128,-1,129 + 513 542 513 542 530 537 c 128,-1,130 + 547 532 547 532 555.5 517 c 128,-1,131 + 564 502 564 502 560 486 c 2,132,-1 + 543 425 l 1,133,-1 + 612 503 l 2,134,135 + 624 516 624 516 642.5 517 c 128,-1,136 + 661 518 661 518 674 506 c 0,137,138 + 688 494 688 494 689 476 c 128,-1,139 + 690 458 690 458 678 444 c 0,140,141 + 668 434 668 434 654 431 c 2,142,-1 + 552 410 l 1,143,-1 + 614 393 l 2,144,145 + 630 389 630 389 639 374 c 128,-1,146 + 648 359 648 359 643 342 c 0,147,148 + 639 328 639 328 628 319.5 c 128,-1,149 + 617 311 617 311 603 311 c 2,150,-1 + 592 313 l 1,151,-1 + 529 329 l 1,152,153 + 532 314 532 314 532 300 c 128,-1,154 + 532 286 532 286 529 271 c 1,155,-1 + 592 287 l 2,156,157 + 609 292 609 292 624 283 c 128,-1,158 + 639 274 639 274 643 258 c 0,159,160 + 648 241 648 241 639 226 c 128,-1,161 + 630 211 630 211 614 207 c 2,162,-1 + 552 190 l 1,163,-1 + 654 169 l 2,0,1 +345 196 m 128,-1,165 + 388 196 388 196 418.5 226.5 c 128,-1,166 + 449 257 449 257 449 300 c 128,-1,167 + 449 343 449 343 418.5 373.5 c 128,-1,168 + 388 404 388 404 345 404 c 128,-1,169 + 302 404 302 404 271 373.5 c 128,-1,170 + 240 343 240 343 240 300 c 128,-1,171 + 240 257 240 257 271 226.5 c 128,-1,164 + 302 196 302 196 345 196 c 128,-1,165 +EndSplineSet +EndChar + +StartChar: glyph321 +Encoding: 321 57665 322 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 91 + 48 + 1 + 2 + 3 + 41 + 13 + 2 + 4 + 2 + 54 + 1 + 1 + 4 + 55 + 1 + 0 + 1 + 4 + 66 + 59 + 58 + 57 + 56 + 4 + 0 + 63 + 0 + 2 + 3 + 4 + 3 + 2 + 4 + 104 + 0 + 4 + 1 + 3 + 4 + 1 + 102 + 0 + 7 + 0 + 3 + 2 + 7 + 3 + 91 + 5 + 1 + 1 + 0 + 0 + 1 + 79 + 5 + 1 + 1 + 1 + 0 + 83 + 6 + 8 + 2 + 0 + 1 + 0 + 71 + 1 + 0 + 46 + 44 + 36 + 34 + 31 + 29 + 25 + 23 + 18 + 16 + 11 + 9 + 6 + 4 + 0 + 53 + 1 + 53 + 9 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +625 50 m 0,0,1 + 608 50 608 50 595.5 62.5 c 128,-1,2 + 583 75 583 75 583 92 c 128,-1,3 + 583 109 583 109 595.5 121 c 128,-1,4 + 608 133 608 133 625 133 c 0,5,6 + 677 133 677 133 713.5 169.5 c 128,-1,7 + 750 206 750 206 750 258 c 128,-1,8 + 750 310 750 310 713.5 346.5 c 128,-1,9 + 677 383 677 383 625 383 c 0,10,11 + 607 383 607 383 591 378 c 2,12,-1 + 546 365 l 1,13,-1 + 539 411 l 2,14,15 + 528 471 528 471 482 510.5 c 128,-1,16 + 436 550 436 550 375 550 c 0,17,18 + 306 550 306 550 257 501 c 128,-1,19 + 208 452 208 452 208 383 c 0,20,21 + 208 372 208 372 212 350 c 2,22,-1 + 223 298 l 1,23,-1 + 163 300 l 2,24,25 + 131 300 131 300 107 275.5 c 128,-1,26 + 83 251 83 251 83 217 c 0,27,28 + 83 182 83 182 107.5 157.5 c 128,-1,29 + 132 133 132 133 167 133 c 0,30,31 + 184 133 184 133 196 121 c 128,-1,32 + 208 109 208 109 208 92 c 128,-1,33 + 208 75 208 75 196 62.5 c 128,-1,34 + 184 50 184 50 167 50 c 0,35,36 + 98 50 98 50 49 99 c 128,-1,37 + 0 148 0 148 0 217 c 0,38,39 + 0 275 0 275 35 319.5 c 128,-1,40 + 70 364 70 364 125 378 c 1,41,-1 + 125 383 l 2,42,43 + 125 486 125 486 198.5 559.5 c 128,-1,44 + 272 633 272 633 375 633 c 0,45,46 + 456 633 456 633 520 587 c 128,-1,47 + 584 541 584 541 610 466 c 1,48,49 + 701 473 701 473 767 411 c 128,-1,50 + 833 349 833 349 833 258 c 0,51,52 + 833 172 833 172 772 111 c 128,-1,53 + 711 50 711 50 625 50 c 0,0,1 +443 217 m 1,54,-1 + 381 71 l 1,55,-1 + 506 10 l 1,56,-1 + 318 -158 l 1,57,-1 + 381 -12 l 1,58,-1 + 256 48 l 1,59,-1 + 443 217 l 1,54,-1 +EndSplineSet +EndChar + +StartChar: glyph322 +Encoding: 322 57666 323 +Width: 783 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 73 + 1 + 1 + 3 + 0 + 57 + 33 + 2 + 4 + 3 + 25 + 9 + 2 + 5 + 4 + 49 + 41 + 2 + 2 + 5 + 17 + 1 + 1 + 2 + 5 + 66 + 0 + 0 + 3 + 0 + 106 + 0 + 1 + 2 + 1 + 107 + 0 + 3 + 0 + 4 + 5 + 3 + 4 + 91 + 0 + 5 + 2 + 2 + 5 + 79 + 0 + 5 + 5 + 2 + 83 + 0 + 2 + 5 + 2 + 71 + 77 + 76 + 73 + 72 + 69 + 68 + 65 + 64 + 55 + 54 + 39 + 38 + 6 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +433 633 m 2,0,-1 + 392 511 l 1,1,-1 + 350 633 l 2,2,3 + 344 650 344 650 352 666.5 c 128,-1,4 + 360 683 360 683 377 689 c 0,5,6 + 401 697 401 697 422 679.5 c 128,-1,7 + 443 662 443 662 433 633 c 2,0,-1 +58 342 m 2,8,-1 + 180 300 l 1,9,-1 + 58 258 l 2,10,11 + 41 252 41 252 24.5 260.5 c 128,-1,12 + 8 269 8 269 2 286 c 0,13,14 + -6 310 -6 310 11.5 331 c 128,-1,15 + 29 352 29 352 58 342 c 2,8,-1 +350 -33 m 2,16,-1 + 392 89 l 1,17,-1 + 433 -33 l 2,18,19 + 439 -50 439 -50 431 -66.5 c 128,-1,20 + 423 -83 423 -83 406 -89 c 0,21,22 + 382 -97 382 -97 361 -79.5 c 128,-1,23 + 340 -62 340 -62 350 -33 c 2,16,-1 +725 258 m 2,24,-1 + 603 300 l 1,25,-1 + 725 342 l 2,26,27 + 742 348 742 348 758.5 339.5 c 128,-1,28 + 775 331 775 331 781 314 c 0,29,30 + 789 290 789 290 771.5 269 c 128,-1,31 + 754 248 754 248 725 258 c 2,24,-1 +185 565 m 2,32,-1 + 242 449 l 1,33,-1 + 126 506 l 2,34,35 + 109 514 109 514 103.5 531 c 128,-1,36 + 98 548 98 548 106 565 c 0,37,38 + 119 590 119 590 146 589 c 128,-1,39 + 173 588 173 588 185 565 c 2,32,-1 +126 94 m 2,40,-1 + 242 151 l 1,41,-1 + 185 35 l 2,42,43 + 177 18 177 18 160 12.5 c 128,-1,44 + 143 7 143 7 126 15 c 0,45,46 + 101 28 101 28 102 55 c 128,-1,47 + 103 82 103 82 126 94 c 2,40,-1 +598 35 m 2,48,-1 + 541 151 l 1,49,-1 + 657 94 l 2,50,51 + 674 86 674 86 679.5 69 c 128,-1,52 + 685 52 685 52 677 35 c 0,53,54 + 664 10 664 10 637 11 c 128,-1,55 + 610 12 610 12 598 35 c 2,48,-1 +657 506 m 2,56,-1 + 541 449 l 1,57,-1 + 598 565 l 2,58,59 + 606 582 606 582 623 587.5 c 128,-1,60 + 640 593 640 593 657 585 c 0,61,62 + 682 572 682 572 681 545 c 128,-1,63 + 680 518 680 518 657 506 c 2,56,-1 +392 112 m 128,-1,65 + 315 112 315 112 259.5 167.5 c 128,-1,66 + 204 223 204 223 204 300 c 128,-1,67 + 204 377 204 377 259.5 432.5 c 128,-1,68 + 315 488 315 488 392 488 c 128,-1,69 + 469 488 469 488 524 432.5 c 128,-1,70 + 579 377 579 377 579 300 c 128,-1,71 + 579 223 579 223 524 167.5 c 128,-1,64 + 469 112 469 112 392 112 c 128,-1,65 +392 404 m 128,-1,73 + 349 404 349 404 318 373.5 c 128,-1,74 + 287 343 287 343 287 300 c 128,-1,75 + 287 257 287 257 318 226.5 c 128,-1,76 + 349 196 349 196 392 196 c 128,-1,77 + 435 196 435 196 465.5 226.5 c 128,-1,78 + 496 257 496 257 496 300 c 128,-1,79 + 496 343 496 343 465.5 373.5 c 128,-1,72 + 435 404 435 404 392 404 c 128,-1,73 +EndSplineSet +EndChar + +StartChar: glyph323 +Encoding: 323 57667 324 +Width: 833 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 109 + 8 + 1 + 12 + 4 + 1 + 66 + 0 + 3 + 12 + 11 + 12 + 3 + 11 + 104 + 13 + 1 + 0 + 9 + 6 + 9 + 0 + 6 + 104 + 0 + 1 + 0 + 2 + 4 + 1 + 2 + 91 + 14 + 1 + 4 + 0 + 12 + 3 + 4 + 12 + 91 + 0 + 11 + 10 + 1 + 5 + 9 + 11 + 5 + 91 + 0 + 9 + 0 + 6 + 7 + 9 + 6 + 91 + 0 + 7 + 8 + 8 + 7 + 79 + 0 + 7 + 7 + 8 + 83 + 0 + 8 + 7 + 8 + 71 + 42 + 41 + 1 + 0 + 85 + 84 + 81 + 78 + 75 + 72 + 69 + 66 + 63 + 61 + 58 + 57 + 54 + 51 + 47 + 45 + 41 + 88 + 42 + 88 + 32 + 30 + 25 + 23 + 13 + 11 + 0 + 40 + 1 + 40 + 15 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +117 144 m 0,0,1 + 108 144 108 144 100 147 c 0,2,3 + 54 167 54 167 27 208.5 c 128,-1,4 + 0 250 0 250 0 300 c 0,5,6 + 0 358 0 358 35 402.5 c 128,-1,7 + 70 447 70 447 125 461 c 1,8,-1 + 125 467 l 2,9,10 + 125 570 125 570 198.5 643.5 c 128,-1,11 + 272 717 272 717 375 717 c 0,12,13 + 467 717 467 717 536.5 658 c 128,-1,14 + 606 599 606 599 621 508 c 0,15,16 + 624 491 624 491 614 477 c 128,-1,17 + 604 463 604 463 587 460 c 0,18,19 + 570 458 570 458 556 467.5 c 128,-1,20 + 542 477 542 477 539 494 c 0,21,22 + 528 554 528 554 482 593.5 c 128,-1,23 + 436 633 436 633 375 633 c 0,24,25 + 306 633 306 633 257 584.5 c 128,-1,26 + 208 536 208 536 208 467 c 0,27,28 + 208 455 208 455 212 433 c 2,29,-1 + 222 380 l 1,30,-1 + 163 384 l 2,31,32 + 131 384 131 384 107 359 c 128,-1,33 + 83 334 83 334 83 300 c 0,34,35 + 83 275 83 275 96.5 254.5 c 128,-1,36 + 110 234 110 234 133 224 c 0,37,38 + 153 215 153 215 157 195.5 c 128,-1,39 + 161 176 161 176 149.5 160 c 128,-1,40 + 138 144 138 144 117 144 c 0,0,1 +708 508 m 0,41,42 + 760 508 760 508 796.5 471.5 c 128,-1,43 + 833 435 833 435 833 383 c 128,-1,44 + 833 331 833 331 796.5 294.5 c 128,-1,45 + 760 258 760 258 708 258 c 2,46,-1 + 617 258 l 1,47,48 + 625 237 625 237 625 217 c 0,49,50 + 625 165 625 165 588.5 128.5 c 128,-1,51 + 552 92 552 92 500 92 c 2,52,-1 + 292 92 l 2,53,54 + 275 92 275 92 262.5 79.5 c 128,-1,55 + 250 67 250 67 250 50 c 128,-1,56 + 250 33 250 33 262.5 20.5 c 128,-1,57 + 275 8 275 8 292 8 c 128,-1,58 + 309 8 309 8 321 -4 c 128,-1,59 + 333 -16 333 -16 333 -33 c 128,-1,60 + 333 -50 333 -50 321 -62.5 c 128,-1,61 + 309 -75 309 -75 292 -75 c 0,62,63 + 240 -75 240 -75 203.5 -38.5 c 128,-1,64 + 167 -2 167 -2 167 50 c 128,-1,65 + 167 102 167 102 203.5 138.5 c 128,-1,66 + 240 175 240 175 292 175 c 2,67,-1 + 500 175 l 2,68,69 + 517 175 517 175 529.5 187.5 c 128,-1,70 + 542 200 542 200 542 217 c 128,-1,71 + 542 234 542 234 529.5 246 c 128,-1,72 + 517 258 517 258 500 258 c 2,73,-1 + 308 258 l 2,74,75 + 291 258 291 258 279 270.5 c 128,-1,76 + 267 283 267 283 267 300 c 128,-1,77 + 267 317 267 317 279 329.5 c 128,-1,78 + 291 342 291 342 308 342 c 2,79,-1 + 708 342 l 2,80,81 + 725 342 725 342 737.5 354 c 128,-1,82 + 750 366 750 366 750 383 c 128,-1,83 + 750 400 750 400 737.5 412.5 c 128,-1,84 + 725 425 725 425 708 425 c 128,-1,85 + 691 425 691 425 679 437.5 c 128,-1,86 + 667 450 667 450 667 467 c 128,-1,87 + 667 484 667 484 679 496 c 128,-1,88 + 691 508 691 508 708 508 c 0,41,42 +EndSplineSet +EndChar + +StartChar: glyph324 +Encoding: 324 57668 325 +Width: 725 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 9 + 1 + 0 + 0 + 8 + 7 + 0 + 8 + 91 + 0 + 7 + 6 + 1 + 1 + 5 + 7 + 1 + 91 + 0 + 5 + 0 + 2 + 3 + 5 + 2 + 91 + 0 + 3 + 4 + 4 + 3 + 79 + 0 + 3 + 3 + 4 + 83 + 0 + 4 + 3 + 4 + 71 + 1 + 0 + 44 + 43 + 40 + 37 + 34 + 31 + 28 + 25 + 22 + 20 + 17 + 16 + 13 + 10 + 6 + 4 + 0 + 47 + 1 + 47 + 10 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +600 592 m 0,0,1 + 652 592 652 592 688.5 555.5 c 128,-1,2 + 725 519 725 519 725 467 c 128,-1,3 + 725 415 725 415 688.5 378.5 c 128,-1,4 + 652 342 652 342 600 342 c 2,5,-1 + 509 342 l 1,6,7 + 517 321 517 321 517 300 c 0,8,9 + 517 248 517 248 480.5 211.5 c 128,-1,10 + 444 175 444 175 392 175 c 2,11,-1 + 125 175 l 2,12,13 + 108 175 108 175 95.5 162.5 c 128,-1,14 + 83 150 83 150 83 133 c 128,-1,15 + 83 116 83 116 95.5 104 c 128,-1,16 + 108 92 108 92 125 92 c 128,-1,17 + 142 92 142 92 154.5 79.5 c 128,-1,18 + 167 67 167 67 167 50 c 128,-1,19 + 167 33 167 33 154.5 20.5 c 128,-1,20 + 142 8 142 8 125 8 c 0,21,22 + 73 8 73 8 36.5 44.5 c 128,-1,23 + 0 81 0 81 0 133 c 128,-1,24 + 0 185 0 185 36.5 221.5 c 128,-1,25 + 73 258 73 258 125 258 c 2,26,-1 + 392 258 l 2,27,28 + 409 258 409 258 421 270.5 c 128,-1,29 + 433 283 433 283 433 300 c 128,-1,30 + 433 317 433 317 421 329.5 c 128,-1,31 + 409 342 409 342 392 342 c 2,32,-1 + 142 342 l 2,33,34 + 125 342 125 342 112.5 354 c 128,-1,35 + 100 366 100 366 100 383 c 128,-1,36 + 100 400 100 400 112.5 412.5 c 128,-1,37 + 125 425 125 425 142 425 c 2,38,-1 + 600 425 l 2,39,40 + 617 425 617 425 629.5 437.5 c 128,-1,41 + 642 450 642 450 642 467 c 128,-1,42 + 642 484 642 484 629.5 496 c 128,-1,43 + 617 508 617 508 600 508 c 128,-1,44 + 583 508 583 508 570.5 520.5 c 128,-1,45 + 558 533 558 533 558 550 c 128,-1,46 + 558 567 558 567 570.5 579.5 c 128,-1,47 + 583 592 583 592 600 592 c 0,0,1 +EndSplineSet +EndChar + +StartChar: glyph325 +Encoding: 325 57669 326 +Width: 763 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 87 + 13 + 11 + 2 + 9 + 4 + 6 + 4 + 9 + 6 + 104 + 12 + 7 + 2 + 5 + 3 + 2 + 3 + 5 + 2 + 104 + 0 + 1 + 0 + 8 + 10 + 1 + 8 + 91 + 0 + 10 + 0 + 4 + 9 + 10 + 4 + 91 + 0 + 6 + 0 + 3 + 5 + 6 + 3 + 91 + 0 + 2 + 0 + 0 + 2 + 79 + 0 + 2 + 2 + 0 + 83 + 0 + 0 + 2 + 0 + 71 + 48 + 48 + 31 + 31 + 48 + 63 + 48 + 63 + 61 + 60 + 58 + 57 + 53 + 52 + 31 + 47 + 31 + 46 + 18 + 20 + 23 + 19 + 21 + 26 + 37 + 14 + 22 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +763 352 m 0,0,1 + 763 288 763 288 719 244 c 2,2,-1 + 487 8 l 2,3,4 + 463 -17 463 -17 439.5 -25 c 128,-1,5 + 416 -33 416 -33 382 -33 c 0,6,7 + 317 -33 317 -33 272 17 c 2,8,-1 + 32 258 l 2,9,10 + 19 271 19 271 9.5 297 c 128,-1,11 + 0 323 0 323 0 348 c 0,12,13 + 0 396 0 396 29 435 c 0,14,15 + 52 460 52 460 60 466 c 0,16,17 + 199 583 199 583 381.5 583 c 128,-1,18 + 564 583 564 583 703 466 c 0,19,20 + 716 456 716 456 725 446 c 0,21,22 + 763 410 763 410 763 352 c 0,0,1 +382 50 m 128,-1,24 + 408 50 408 50 426 68 c 128,-1,25 + 444 86 444 86 444 112 c 128,-1,26 + 444 138 444 138 426 156.5 c 128,-1,27 + 408 175 408 175 382 175 c 128,-1,28 + 356 175 356 175 337.5 156.5 c 128,-1,29 + 319 138 319 138 319 112 c 128,-1,30 + 319 86 319 86 337.5 68 c 128,-1,23 + 356 50 356 50 382 50 c 128,-1,24 +544 186 m 128,-1,32 + 562 204 562 204 562 230.5 c 128,-1,33 + 562 257 562 257 544 275 c 0,34,35 + 477 342 477 342 381.5 342 c 128,-1,36 + 286 342 286 342 219 275 c 0,37,38 + 201 257 201 257 201 230.5 c 128,-1,39 + 201 204 201 204 219 186 c 128,-1,40 + 237 168 237 168 263.5 168 c 128,-1,41 + 290 168 290 168 308 186 c 0,42,43 + 339 217 339 217 381.5 217 c 128,-1,44 + 424 217 424 217 455 186 c 0,45,46 + 473 168 473 168 499 168 c 0,47,31 + 526 168 526 168 544 186 c 128,-1,32 +661 304 m 128,-1,49 + 679 322 679 322 679 348.5 c 128,-1,50 + 679 375 679 375 661 393 c 0,51,52 + 546 508 546 508 382 508 c 128,-1,53 + 218 508 218 508 102 393 c 0,54,55 + 84 375 84 375 84 348.5 c 128,-1,56 + 84 322 84 322 102 304 c 128,-1,57 + 120 286 120 286 146 286 c 128,-1,58 + 172 286 172 286 190 304 c 0,59,60 + 270 384 270 384 382 384 c 128,-1,61 + 494 384 494 384 573 304 c 0,62,63 + 591 286 591 286 617 286 c 128,-1,48 + 643 286 643 286 661 304 c 128,-1,49 +EndSplineSet +EndChar + +StartChar: glyph326 +Encoding: 326 57670 327 +Width: 874 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 0 + 3 + 2 + 3 + 106 + 4 + 8 + 2 + 2 + 7 + 2 + 106 + 0 + 7 + 5 + 7 + 106 + 6 + 1 + 5 + 1 + 5 + 106 + 0 + 1 + 0 + 0 + 1 + 79 + 0 + 1 + 1 + 0 + 83 + 0 + 0 + 1 + 0 + 71 + 12 + 11 + 45 + 44 + 42 + 41 + 31 + 30 + 18 + 17 + 15 + 14 + 11 + 29 + 12 + 29 + 20 + 17 + 9 + 17 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +496 -9 m 0,0,1 + 472 -34 472 -34 437.5 -33.5 c 128,-1,2 + 403 -33 403 -33 378 -9 c 128,-1,3 + 353 15 353 15 353 49.5 c 128,-1,4 + 353 84 353 84 378 109 c 0,5,6 + 402 134 402 134 436.5 134 c 128,-1,7 + 471 134 471 134 496 109 c 0,8,9 + 521 85 521 85 521 50 c 128,-1,10 + 521 15 521 15 496 -9 c 0,0,1 +790 320 m 0,11,12 + 757 320 757 320 732 345 c 0,13,14 + 610 466 610 466 437 466 c 128,-1,15 + 264 466 264 466 142 345 c 0,16,17 + 117 320 117 320 83 320.5 c 128,-1,18 + 49 321 49 321 24 345 c 0,19,20 + -1 370 -1 370 -1 403.5 c 128,-1,21 + -1 437 -1 437 24 462 c 0,22,23 + 136 574 136 574 286 613.5 c 128,-1,24 + 436 653 436 653 586.5 613.5 c 128,-1,25 + 737 574 737 574 849 462 c 0,26,27 + 874 437 874 437 874 403.5 c 128,-1,28 + 874 370 874 370 849 345 c 128,-1,29 + 824 320 824 320 790 320 c 0,11,12 +260 143 m 128,-1,31 + 226 143 226 143 201 168 c 128,-1,32 + 176 193 176 193 176 227 c 128,-1,33 + 176 261 176 261 201 286 c 0,34,35 + 265 350 265 350 351 372.5 c 128,-1,36 + 437 395 437 395 523 372.5 c 128,-1,37 + 609 350 609 350 673 286 c 0,38,39 + 698 261 698 261 698 227 c 128,-1,40 + 698 193 698 193 673 168 c 128,-1,41 + 648 143 648 143 614 143 c 128,-1,42 + 580 143 580 143 555 168 c 0,43,44 + 506 217 506 217 437 217 c 128,-1,45 + 368 217 368 217 319 168 c 0,46,30 + 294 143 294 143 260 143 c 128,-1,31 +EndSplineSet +EndChar + +StartChar: glyph327 +Encoding: 327 57671 328 +Width: 464 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 59 + 19 + 4 + 2 + 0 + 4 + 1 + 66 + 0 + 4 + 5 + 0 + 5 + 4 + 0 + 104 + 0 + 3 + 0 + 7 + 6 + 3 + 7 + 89 + 0 + 6 + 0 + 5 + 4 + 6 + 5 + 89 + 2 + 1 + 0 + 1 + 1 + 0 + 79 + 2 + 1 + 0 + 0 + 1 + 84 + 0 + 1 + 0 + 1 + 72 + 18 + 18 + 18 + 22 + 59 + 35 + 51 + 37 + 8 + 23 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +464 407 m 0,0,1 + 464 322 464 322 409.5 257.5 c 128,-1,2 + 355 193 355 193 273 179 c 1,3,-1 + 274 175 l 1,4,-1 + 274 8 l 1,5,-1 + 315 8 l 2,6,7 + 332 8 332 8 344.5 -4 c 128,-1,8 + 357 -16 357 -16 357 -33 c 128,-1,9 + 357 -50 357 -50 344.5 -62.5 c 128,-1,10 + 332 -75 332 -75 315 -75 c 2,11,-1 + 149 -75 l 2,12,13 + 132 -75 132 -75 119.5 -62.5 c 128,-1,14 + 107 -50 107 -50 107 -33 c 128,-1,15 + 107 -16 107 -16 119.5 -4 c 128,-1,16 + 132 8 132 8 149 8 c 2,17,-1 + 190 8 l 1,18,-1 + 190 175 l 1,19,-1 + 191 179 l 1,20,21 + 109 193 109 193 54.5 257.5 c 128,-1,22 + 0 322 0 322 0 407 c 0,23,24 + 0 454 0 454 10 513.5 c 128,-1,25 + 20 573 20 573 28 605.5 c 128,-1,26 + 36 638 36 638 39 645 c 0,27,28 + 43 658 43 658 54 666.5 c 128,-1,29 + 65 675 65 675 79 675 c 2,30,-1 + 385 675 l 2,31,32 + 399 675 399 675 410 666.5 c 128,-1,33 + 421 658 421 658 425 645 c 0,34,35 + 428 638 428 638 436 605.5 c 128,-1,36 + 444 573 444 573 454 513.5 c 128,-1,37 + 464 454 464 454 464 407 c 0,0,1 +232 258 m 128,-1,39 + 287 258 287 258 328.5 293.5 c 128,-1,40 + 370 329 370 329 378 383 c 1,41,-1 + 86 383 l 1,42,43 + 94 329 94 329 135.5 293.5 c 128,-1,38 + 177 258 177 258 232 258 c 128,-1,39 +84 425 m 1,44,-1 + 380 425 l 1,45,46 + 376 504 376 504 353 592 c 1,47,-1 + 111 592 l 1,48,49 + 88 504 88 504 84 425 c 1,44,-1 +EndSplineSet +EndChar + +StartChar: glyph328 +Encoding: 328 57672 329 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 132 + 100 + 21 + 2 + 2 + 3 + 102 + 1 + 9 + 2 + 90 + 26 + 2 + 4 + 9 + 50 + 29 + 13 + 3 + 8 + 4 + 75 + 1 + 7 + 6 + 89 + 1 + 5 + 7 + 6 + 66 + 49 + 34 + 14 + 3 + 8 + 48 + 1 + 6 + 35 + 1 + 7 + 41 + 1 + 12 + 4 + 65 + 0 + 11 + 12 + 13 + 12 + 11 + 13 + 104 + 0 + 0 + 0 + 3 + 2 + 0 + 3 + 91 + 0 + 2 + 0 + 9 + 4 + 2 + 9 + 91 + 10 + 1 + 4 + 0 + 6 + 7 + 4 + 6 + 89 + 0 + 8 + 0 + 7 + 5 + 8 + 7 + 91 + 0 + 5 + 0 + 12 + 11 + 5 + 12 + 91 + 0 + 13 + 1 + 1 + 13 + 79 + 0 + 13 + 13 + 1 + 84 + 0 + 1 + 13 + 1 + 72 + 95 + 94 + 86 + 84 + 81 + 79 + 69 + 67 + 63 + 62 + 19 + 18 + 29 + 35 + 24 + 35 + 44 + 19 + 16 + 14 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 717 m 128,-1,1 + 530 717 530 717 640 607 c 128,-1,2 + 750 497 750 497 750 342 c 128,-1,3 + 750 187 750 187 640 77 c 128,-1,4 + 530 -33 530 -33 375 -33 c 128,-1,5 + 220 -33 220 -33 110 77 c 128,-1,6 + 0 187 0 187 0 342 c 128,-1,7 + 0 497 0 497 110 607 c 128,-1,0 + 220 717 220 717 375 717 c 128,-1,1 +375 467 m 0,8,9 + 375 432 375 432 370.5 406.5 c 128,-1,10 + 366 381 366 381 360 369 c 128,-1,11 + 354 357 354 357 348 350.5 c 128,-1,12 + 342 344 342 344 338 343 c 2,13,-1 + 333 342 l 1,14,-1 + 333 467 l 2,15,16 + 333 501 333 501 349.5 525.5 c 128,-1,17 + 366 550 366 550 396 550 c 0,18,19 + 423 550 423 550 439 570.5 c 128,-1,20 + 455 591 455 591 458 621 c 1,21,22 + 419 633 419 633 375 633 c 0,23,24 + 291 633 291 633 222 590.5 c 128,-1,25 + 153 548 153 548 116 476 c 1,26,27 + 132 461 132 461 162.5 430 c 128,-1,28 + 193 399 193 399 208 383 c 1,29,30 + 208 388 208 388 209 395 c 128,-1,31 + 210 402 210 402 220.5 413.5 c 128,-1,32 + 231 425 231 425 250 425 c 1,33,-1 + 250 342 l 1,34,-1 + 333 258 l 1,35,-1 + 333 175 l 1,36,37 + 372 175 372 175 389 174.5 c 128,-1,38 + 406 174 406 174 425.5 170 c 128,-1,39 + 445 166 445 166 451.5 157 c 128,-1,40 + 458 148 458 148 458 133 c 1,41,42 + 484 146 484 146 493.5 151 c 128,-1,43 + 503 156 503 156 516 167.5 c 128,-1,44 + 529 179 529 179 531.5 185 c 128,-1,45 + 534 191 534 191 538 211 c 128,-1,46 + 542 231 542 231 542 247 c 128,-1,47 + 542 263 542 263 542 300 c 1,48,-1 + 583 342 l 1,49,-1 + 542 383 l 1,50,-1 + 542 300 l 1,51,-1 + 500 300 l 1,52,53 + 500 283 500 283 487.5 270.5 c 128,-1,54 + 475 258 475 258 458 258 c 128,-1,55 + 441 258 441 258 429 270.5 c 128,-1,56 + 417 283 417 283 417 300 c 128,-1,57 + 417 317 417 317 429 329.5 c 128,-1,58 + 441 342 441 342 458 342 c 1,59,-1 + 458 467 l 2,60,61 + 458 484 458 484 446 496 c 128,-1,62 + 434 508 434 508 417 508 c 128,-1,63 + 400 508 400 508 387.5 496 c 128,-1,64 + 375 484 375 484 375 467 c 0,8,9 +500 383 m 1,65,66 + 500 399 500 399 512 412 c 128,-1,67 + 524 425 524 425 542 425 c 0,68,69 + 559 425 559 425 571 413 c 2,70,-1 + 613 371 l 2,71,72 + 625 359 625 359 625 341.5 c 128,-1,73 + 625 324 625 324 613 312 c 2,74,-1 + 583 283 l 1,75,76 + 582 193 582 193 565.5 162.5 c 128,-1,77 + 549 132 549 132 477 96 c 0,78,79 + 469 92 469 92 459 92 c 0,80,81 + 442 92 442 92 430.5 103 c 128,-1,82 + 419 114 419 114 417 130 c 1,83,84 + 406 133 406 133 333 133 c 0,85,86 + 316 133 316 133 304 145.5 c 128,-1,87 + 292 158 292 158 292 175 c 2,88,-1 + 292 241 l 1,89,-1 + 99 434 l 1,90,91 + 83 388 83 388 83 342 c 0,92,93 + 83 221 83 221 168.5 135.5 c 128,-1,94 + 254 50 254 50 375 50 c 128,-1,95 + 496 50 496 50 581.5 135.5 c 128,-1,96 + 667 221 667 221 667 342 c 0,97,98 + 667 429 667 429 620.5 500 c 128,-1,99 + 574 571 574 571 498 606 c 1,100,101 + 490 562 490 562 463 536 c 1,102,103 + 500 511 500 511 500 467 c 2,104,-1 + 500 383 l 1,65,66 +EndSplineSet +EndChar + +StartChar: glyph329 +Encoding: 329 57673 330 +Width: 750 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 102 + 9 + 1 + 9 + 2 + 16 + 1 + 3 + 8 + 58 + 38 + 17 + 3 + 7 + 3 + 29 + 1 + 1 + 4 + 4 + 66 + 59 + 37 + 22 + 3 + 7 + 36 + 1 + 5 + 23 + 1 + 6 + 3 + 65 + 0 + 3 + 8 + 7 + 8 + 3 + 7 + 104 + 0 + 5 + 7 + 6 + 7 + 5 + 6 + 104 + 0 + 0 + 0 + 2 + 9 + 0 + 2 + 91 + 0 + 9 + 0 + 8 + 3 + 9 + 8 + 91 + 0 + 7 + 0 + 6 + 4 + 7 + 6 + 91 + 0 + 4 + 1 + 1 + 4 + 79 + 0 + 4 + 4 + 1 + 84 + 0 + 1 + 4 + 1 + 72 + 63 + 62 + 19 + 19 + 18 + 29 + 35 + 24 + 37 + 19 + 16 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +375 717 m 128,-1,1 + 530 717 530 717 640 607 c 128,-1,2 + 750 497 750 497 750 342 c 128,-1,3 + 750 187 750 187 640 77 c 128,-1,4 + 530 -33 530 -33 375 -33 c 128,-1,5 + 220 -33 220 -33 110 77 c 128,-1,6 + 0 187 0 187 0 342 c 128,-1,7 + 0 497 0 497 110 607 c 128,-1,0 + 220 717 220 717 375 717 c 128,-1,1 +458 633 m 2,8,-1 + 458 664 l 1,9,10 + 416 675 416 675 375 675 c 0,11,12 + 300 675 300 675 234.5 644 c 128,-1,13 + 169 613 169 613 122 558 c 2,14,-1 + 100 530 l 1,15,-1 + 85 506 l 1,16,-1 + 208 383 l 1,17,18 + 208 388 208 388 209 395 c 128,-1,19 + 210 402 210 402 220.5 413.5 c 128,-1,20 + 231 425 231 425 250 425 c 1,21,-1 + 250 342 l 1,22,-1 + 333 258 l 1,23,-1 + 333 175 l 1,24,25 + 372 175 372 175 389 174.5 c 128,-1,26 + 406 174 406 174 425.5 170 c 128,-1,27 + 445 166 445 166 451.5 157 c 128,-1,28 + 458 148 458 148 458 133 c 1,29,30 + 484 146 484 146 493.5 151 c 128,-1,31 + 503 156 503 156 516 167.5 c 128,-1,32 + 529 179 529 179 531.5 185 c 128,-1,33 + 534 191 534 191 538 211 c 128,-1,34 + 542 231 542 231 542 247 c 128,-1,35 + 542 263 542 263 542 300 c 1,36,-1 + 583 342 l 1,37,-1 + 542 383 l 1,38,-1 + 542 300 l 1,39,-1 + 500 300 l 1,40,41 + 500 283 500 283 487.5 270.5 c 128,-1,42 + 475 258 475 258 458 258 c 128,-1,43 + 441 258 441 258 429 270.5 c 128,-1,44 + 417 283 417 283 417 300 c 128,-1,45 + 417 317 417 317 429 329.5 c 128,-1,46 + 441 342 441 342 458 342 c 1,47,-1 + 458 467 l 2,48,49 + 458 484 458 484 446 496 c 128,-1,50 + 434 508 434 508 417 508 c 128,-1,51 + 400 508 400 508 387.5 496 c 128,-1,52 + 375 484 375 484 375 467 c 0,53,54 + 375 432 375 432 370.5 406.5 c 128,-1,55 + 366 381 366 381 360 369 c 128,-1,56 + 354 357 354 357 348 350.5 c 128,-1,57 + 342 344 342 344 338 343 c 2,58,-1 + 333 342 l 1,59,-1 + 333 467 l 2,60,61 + 333 501 333 501 349.5 525.5 c 128,-1,62 + 366 550 366 550 396 550 c 128,-1,63 + 426 550 426 550 442 574.5 c 128,-1,64 + 458 599 458 599 458 633 c 2,8,-1 +EndSplineSet +EndChar + +StartChar: glyph330 +Encoding: 330 57674 331 +Width: 700 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 96 + 46 + 1 + 2 + 1 + 49 + 47 + 2 + 10 + 2 + 35 + 1 + 7 + 10 + 3 + 66 + 0 + 8 + 0 + 11 + 5 + 8 + 11 + 91 + 4 + 12 + 2 + 0 + 3 + 1 + 1 + 2 + 0 + 1 + 91 + 0 + 5 + 0 + 2 + 10 + 5 + 2 + 91 + 0 + 10 + 0 + 7 + 9 + 10 + 7 + 91 + 0 + 9 + 6 + 6 + 9 + 79 + 0 + 9 + 9 + 6 + 83 + 0 + 6 + 9 + 6 + 71 + 1 + 0 + 65 + 64 + 61 + 60 + 53 + 51 + 42 + 41 + 38 + 36 + 33 + 31 + 24 + 23 + 20 + 18 + 15 + 13 + 10 + 9 + 6 + 4 + 0 + 27 + 1 + 27 + 13 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +396 342 m 2,0,1 + 404 342 404 342 410.5 335.5 c 128,-1,2 + 417 329 417 329 417 321 c 128,-1,3 + 417 313 417 313 410.5 306.5 c 128,-1,4 + 404 300 404 300 396 300 c 2,5,-1 + 312 300 l 1,6,-1 + 312 217 l 2,7,8 + 312 209 312 209 306 202.5 c 128,-1,9 + 300 196 300 196 292 196 c 128,-1,10 + 284 196 284 196 277.5 202.5 c 128,-1,11 + 271 209 271 209 271 217 c 2,12,-1 + 271 300 l 1,13,-1 + 188 300 l 2,14,15 + 180 300 180 300 173.5 306.5 c 128,-1,16 + 167 313 167 313 167 321 c 128,-1,17 + 167 329 167 329 173.5 335.5 c 128,-1,18 + 180 342 180 342 188 342 c 2,19,-1 + 271 342 l 1,20,-1 + 271 425 l 2,21,22 + 271 433 271 433 277.5 439.5 c 128,-1,23 + 284 446 284 446 292 446 c 128,-1,24 + 300 446 300 446 306 439.5 c 128,-1,25 + 312 433 312 433 312 425 c 2,26,-1 + 312 342 l 1,27,-1 + 396 342 l 2,0,1 +662 135 m 2,28,29 + 700 97 700 97 700 43 c 128,-1,30 + 700 -11 700 -11 662 -49.5 c 128,-1,31 + 624 -88 624 -88 570 -88 c 0,32,33 + 521 -88 521 -88 482 -55 c 2,34,-1 + 382 44 l 1,35,36 + 334 29 334 29 292 29 c 0,37,38 + 171 29 171 29 85.5 114.5 c 128,-1,39 + 0 200 0 200 0 321 c 128,-1,40 + 0 442 0 442 85.5 527 c 128,-1,41 + 171 612 171 612 292 612 c 128,-1,42 + 413 612 413 612 498 527 c 128,-1,43 + 583 442 583 442 583 321 c 0,44,45 + 583 278 583 278 568 230 c 1,46,-1 + 662 135 l 2,28,29 +499 181 m 1,47,48 + 472 140 472 140 431 113 c 1,49,-1 + 536 9 l 2,50,51 + 551 -4 551 -4 570 -4 c 0,52,53 + 590 -4 590 -4 603.5 10 c 128,-1,54 + 617 24 617 24 617 43 c 0,55,56 + 617 64 617 64 603 76 c 2,57,-1 + 499 181 l 1,47,48 +83 321 m 128,-1,59 + 83 235 83 235 144.5 173.5 c 128,-1,60 + 206 112 206 112 292 112 c 128,-1,61 + 378 112 378 112 439 173.5 c 128,-1,62 + 500 235 500 235 500 321 c 128,-1,63 + 500 407 500 407 439 468 c 128,-1,64 + 378 529 378 529 292 529 c 128,-1,65 + 206 529 206 529 144.5 468 c 128,-1,58 + 83 407 83 407 83 321 c 128,-1,59 +EndSplineSet +EndChar + +StartChar: glyph331 +Encoding: 331 57675 332 +Width: 700 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 86 + 47 + 1 + 2 + 1 + 36 + 1 + 7 + 9 + 2 + 66 + 0 + 6 + 7 + 6 + 107 + 0 + 8 + 0 + 10 + 5 + 8 + 10 + 91 + 4 + 11 + 2 + 0 + 3 + 1 + 1 + 2 + 0 + 1 + 91 + 0 + 5 + 0 + 2 + 9 + 5 + 2 + 91 + 0 + 9 + 7 + 7 + 9 + 79 + 0 + 9 + 9 + 7 + 83 + 0 + 7 + 9 + 7 + 71 + 1 + 0 + 55 + 54 + 51 + 50 + 43 + 42 + 39 + 37 + 34 + 32 + 23 + 21 + 18 + 16 + 15 + 13 + 10 + 8 + 6 + 4 + 0 + 25 + 1 + 25 + 12 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +396 342 m 2,0,1 + 405 342 405 342 411 336 c 128,-1,2 + 417 330 417 330 417 321 c 128,-1,3 + 417 312 417 312 411 306 c 128,-1,4 + 405 300 405 300 396 300 c 2,5,-1 + 312 300 l 1,6,-1 + 312 217 l 2,7,8 + 312 196 312 196 292 196 c 0,9,10 + 283 196 283 196 277 202 c 128,-1,11 + 271 208 271 208 271 217 c 2,12,-1 + 271 300 l 1,13,-1 + 187 300 l 2,14,15 + 167 300 167 300 167 321 c 128,-1,16 + 167 342 167 342 187 342 c 2,17,-1 + 271 342 l 1,18,-1 + 271 425 l 2,19,20 + 271 434 271 434 277 440 c 128,-1,21 + 283 446 283 446 292 446 c 0,22,23 + 312 446 312 446 312 425 c 2,24,-1 + 312 342 l 1,25,-1 + 396 342 l 2,0,1 +600 199 m 2,26,27 + 610 189 610 189 630.5 167.5 c 128,-1,28 + 651 146 651 146 662 135 c 0,29,30 + 700 97 700 97 700 43 c 128,-1,31 + 700 -11 700 -11 662 -49.5 c 128,-1,32 + 624 -88 624 -88 570 -88 c 0,33,34 + 515 -88 515 -88 477 -50 c 2,35,-1 + 383 44 l 1,36,37 + 335 29 335 29 292 29 c 0,38,39 + 171 29 171 29 85.5 114.5 c 128,-1,40 + 0 200 0 200 0 321 c 128,-1,41 + 0 442 0 442 85.5 527 c 128,-1,42 + 171 612 171 612 292 612 c 128,-1,43 + 413 612 413 612 498 527 c 128,-1,44 + 583 442 583 442 583 321 c 0,45,46 + 583 275 583 275 569 230 c 1,47,-1 + 600 199 l 2,26,27 +83 321 m 128,-1,49 + 83 235 83 235 144.5 173.5 c 128,-1,50 + 206 112 206 112 292 112 c 128,-1,51 + 378 112 378 112 439 173.5 c 128,-1,52 + 500 235 500 235 500 321 c 128,-1,53 + 500 407 500 407 439 468 c 128,-1,54 + 378 529 378 529 292 529 c 128,-1,55 + 206 529 206 529 144.5 468 c 128,-1,48 + 83 407 83 407 83 321 c 128,-1,49 +EndSplineSet +EndChar + +StartChar: glyph332 +Encoding: 332 57676 333 +Width: 700 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 75 + 33 + 31 + 30 + 3 + 6 + 0 + 19 + 1 + 3 + 6 + 2 + 66 + 0 + 4 + 0 + 7 + 1 + 4 + 7 + 91 + 0 + 1 + 8 + 1 + 0 + 6 + 1 + 0 + 91 + 0 + 6 + 0 + 3 + 5 + 6 + 3 + 91 + 0 + 5 + 2 + 2 + 5 + 79 + 0 + 5 + 5 + 2 + 83 + 0 + 2 + 5 + 2 + 71 + 2 + 0 + 49 + 48 + 45 + 44 + 37 + 35 + 26 + 25 + 22 + 20 + 17 + 15 + 8 + 5 + 0 + 11 + 2 + 11 + 9 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +396 300 m 2,0,-1 + 188 300 l 2,1,2 + 180 300 180 300 173.5 306.5 c 128,-1,3 + 167 313 167 313 167 321 c 128,-1,4 + 167 329 167 329 173.5 335.5 c 128,-1,5 + 180 342 180 342 188 342 c 2,6,-1 + 396 342 l 2,7,8 + 404 342 404 342 410.5 335.5 c 128,-1,9 + 417 329 417 329 417 321 c 128,-1,10 + 417 313 417 313 410.5 306.5 c 128,-1,11 + 404 300 404 300 396 300 c 2,0,-1 +662 135 m 2,12,13 + 700 97 700 97 700 43 c 128,-1,14 + 700 -11 700 -11 662 -49.5 c 128,-1,15 + 624 -88 624 -88 570 -88 c 0,16,17 + 521 -88 521 -88 482 -55 c 2,18,-1 + 382 44 l 1,19,20 + 334 29 334 29 292 29 c 0,21,22 + 171 29 171 29 85.5 114.5 c 128,-1,23 + 0 200 0 200 0 321 c 128,-1,24 + 0 442 0 442 85.5 527 c 128,-1,25 + 171 612 171 612 292 612 c 128,-1,26 + 413 612 413 612 498 527 c 128,-1,27 + 583 442 583 442 583 321 c 0,28,29 + 583 274 583 274 568 230 c 1,30,-1 + 662 135 l 2,12,13 +499 181 m 1,31,32 + 472 140 472 140 431 113 c 1,33,-1 + 536 9 l 2,34,35 + 551 -4 551 -4 570 -4 c 0,36,37 + 590 -4 590 -4 603.5 10 c 128,-1,38 + 617 24 617 24 617 43 c 0,39,40 + 617 64 617 64 603 76 c 2,41,-1 + 499 181 l 1,31,32 +83 321 m 128,-1,43 + 83 235 83 235 144.5 173.5 c 128,-1,44 + 206 112 206 112 292 112 c 128,-1,45 + 378 112 378 112 439 173.5 c 128,-1,46 + 500 235 500 235 500 321 c 128,-1,47 + 500 407 500 407 439 468 c 128,-1,48 + 378 529 378 529 292 529 c 128,-1,49 + 206 529 206 529 144.5 468 c 128,-1,42 + 83 407 83 407 83 321 c 128,-1,43 +EndSplineSet +EndChar + +StartChar: glyph333 +Encoding: 333 57677 334 +Width: 700 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 68 + 30 + 1 + 5 + 1 + 19 + 1 + 3 + 5 + 2 + 66 + 0 + 2 + 3 + 2 + 107 + 0 + 4 + 0 + 6 + 0 + 4 + 6 + 91 + 7 + 1 + 0 + 0 + 1 + 5 + 0 + 1 + 91 + 0 + 5 + 3 + 3 + 5 + 79 + 0 + 5 + 5 + 3 + 83 + 0 + 3 + 5 + 3 + 71 + 1 + 0 + 41 + 40 + 37 + 36 + 26 + 25 + 22 + 20 + 17 + 15 + 7 + 4 + 0 + 11 + 1 + 10 + 8 + 15 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +396 342 m 2,0,1 + 405 342 405 342 411 336 c 128,-1,2 + 417 330 417 330 417 321 c 128,-1,3 + 417 312 417 312 411 306 c 128,-1,4 + 405 300 405 300 396 300 c 2,5,-1 + 188 300 l 2,6,7 + 179 300 179 300 173 306 c 128,-1,8 + 167 312 167 312 167 321 c 128,-1,9 + 167 330 167 330 173 336 c 128,-1,10 + 179 342 179 342 188 342 c 2,11,-1 + 396 342 l 2,0,1 +662 135 m 2,12,13 + 700 97 700 97 700 43 c 128,-1,14 + 700 -11 700 -11 662 -49.5 c 128,-1,15 + 624 -88 624 -88 570 -88 c 0,16,17 + 513 -88 513 -88 477 -50 c 2,18,-1 + 383 44 l 1,19,20 + 335 29 335 29 292 29 c 0,21,22 + 171 29 171 29 85.5 114.5 c 128,-1,23 + 0 200 0 200 0 321 c 128,-1,24 + 0 442 0 442 85.5 527 c 128,-1,25 + 171 612 171 612 292 612 c 128,-1,26 + 413 612 413 612 498 527 c 128,-1,27 + 583 442 583 442 583 321 c 0,28,29 + 583 275 583 275 569 230 c 1,30,31 + 578 221 578 221 595.5 203 c 128,-1,32 + 613 185 613 185 622 176 c 2,33,-1 + 662 135 l 2,12,13 +83 321 m 128,-1,35 + 83 235 83 235 144.5 173.5 c 128,-1,36 + 206 112 206 112 292 112 c 128,-1,37 + 378 112 378 112 439 173.5 c 128,-1,38 + 500 235 500 235 500 321 c 128,-1,39 + 500 407 500 407 439 468 c 128,-1,40 + 378 529 378 529 292 529 c 128,-1,41 + 206 529 206 529 144.5 468 c 128,-1,34 + 83 407 83 407 83 321 c 128,-1,35 +EndSplineSet +EndChar + +StartChar: glyph334 +Encoding: 334 57678 335 +Width: 700 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 79 + 19 + 1 + 1 + 0 + 37 + 1 + 3 + 1 + 35 + 1 + 8 + 3 + 30 + 1 + 5 + 8 + 4 + 66 + 0 + 4 + 0 + 9 + 2 + 4 + 9 + 91 + 0 + 2 + 0 + 0 + 1 + 2 + 0 + 91 + 0 + 1 + 0 + 3 + 8 + 1 + 3 + 91 + 0 + 8 + 0 + 5 + 7 + 8 + 5 + 91 + 0 + 7 + 6 + 6 + 7 + 79 + 0 + 7 + 7 + 6 + 83 + 0 + 6 + 7 + 6 + 71 + 51 + 50 + 18 + 40 + 35 + 35 + 26 + 19 + 19 + 19 + 16 + 10 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +409 467 m 128,-1,1 + 357 467 357 467 320.5 430.5 c 128,-1,2 + 284 394 284 394 284 342 c 128,-1,3 + 284 290 284 290 320.5 253.5 c 128,-1,4 + 357 217 357 217 409 217 c 128,-1,5 + 461 217 461 217 497.5 253.5 c 128,-1,6 + 534 290 534 290 534 342 c 128,-1,7 + 534 394 534 394 497.5 430.5 c 128,-1,0 + 461 467 461 467 409 467 c 128,-1,1 +409 508 m 128,-1,9 + 478 508 478 508 526.5 459.5 c 128,-1,10 + 575 411 575 411 575 342 c 128,-1,11 + 575 273 575 273 526.5 224 c 128,-1,12 + 478 175 478 175 409 175 c 128,-1,13 + 340 175 340 175 291 224 c 128,-1,14 + 242 273 242 273 242 342 c 128,-1,15 + 242 411 242 411 291 459.5 c 128,-1,8 + 340 508 340 508 409 508 c 128,-1,9 +0 64 m 128,-1,17 + 0 118 0 118 38 156 c 2,18,-1 + 132 251 l 1,19,20 + 117 294 117 294 117 342 c 0,21,22 + 117 463 117 463 202.5 548 c 128,-1,23 + 288 633 288 633 409 633 c 128,-1,24 + 530 633 530 633 615 548 c 128,-1,25 + 700 463 700 463 700 342 c 128,-1,26 + 700 221 700 221 615 135.5 c 128,-1,27 + 530 50 530 50 409 50 c 0,28,29 + 366 50 366 50 318 65 c 1,30,-1 + 218 -34 l 2,31,32 + 179 -67 179 -67 130 -67 c 0,33,34 + 76 -67 76 -67 38 -28.5 c 128,-1,16 + 0 10 0 10 0 64 c 128,-1,17 +269 134 m 1,35,36 + 228 161 228 161 201 202 c 1,37,-1 + 97 97 l 2,38,39 + 83 85 83 85 83 64 c 0,40,41 + 83 44 83 44 97 30 c 128,-1,42 + 111 16 111 16 130 16 c 0,43,44 + 148 16 148 16 164 30 c 2,45,-1 + 269 134 l 1,35,36 +409 133 m 128,-1,47 + 495 133 495 133 556 194.5 c 128,-1,48 + 617 256 617 256 617 342 c 128,-1,49 + 617 428 617 428 556 489 c 128,-1,50 + 495 550 495 550 409 550 c 128,-1,51 + 323 550 323 550 261.5 489 c 128,-1,52 + 200 428 200 428 200 342 c 128,-1,53 + 200 256 200 256 261.5 194.5 c 128,-1,46 + 323 133 323 133 409 133 c 128,-1,47 +EndSplineSet +EndChar + +StartChar: glyph335 +Encoding: 335 57679 336 +Width: 700 +GlyphClass: 1 +Flags: W +TtInstrs: +NPUSHB + 66 + 17 + 1 + 7 + 8 + 7 + 1 + 1 + 3 + 2 + 66 + 0 + 2 + 1 + 2 + 107 + 0 + 0 + 0 + 4 + 5 + 0 + 4 + 91 + 0 + 5 + 0 + 8 + 7 + 5 + 8 + 91 + 0 + 7 + 0 + 6 + 3 + 7 + 6 + 91 + 0 + 3 + 1 + 1 + 3 + 79 + 0 + 3 + 3 + 1 + 83 + 0 + 1 + 3 + 1 + 71 + 19 + 19 + 19 + 19 + 19 + 26 + 35 + 35 + 16 + 9 + 24 +CALL +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +409 633 m 128,-1,1 + 530 633 530 633 615 548 c 128,-1,2 + 700 463 700 463 700 342 c 128,-1,3 + 700 221 700 221 615 135.5 c 128,-1,4 + 530 50 530 50 409 50 c 0,5,6 + 366 50 366 50 318 65 c 1,7,-1 + 221 -32 l 2,8,9 + 181 -67 181 -67 130 -67 c 0,10,11 + 76 -67 76 -67 38 -28.5 c 128,-1,12 + 0 10 0 10 0 64 c 128,-1,13 + 0 118 0 118 37 155 c 0,14,15 + 79 198 79 198 100 219 c 2,16,-1 + 132 251 l 1,17,18 + 117 299 117 299 117 342 c 0,19,20 + 117 463 117 463 202.5 548 c 128,-1,0 + 288 633 288 633 409 633 c 128,-1,1 +409 133 m 128,-1,22 + 495 133 495 133 556 194.5 c 128,-1,23 + 617 256 617 256 617 342 c 128,-1,24 + 617 428 617 428 556 489 c 128,-1,25 + 495 550 495 550 409 550 c 128,-1,26 + 323 550 323 550 261.5 489 c 128,-1,27 + 200 428 200 428 200 342 c 128,-1,28 + 200 256 200 256 261.5 194.5 c 128,-1,21 + 323 133 323 133 409 133 c 128,-1,22 +409 508 m 128,-1,30 + 478 508 478 508 526.5 459.5 c 128,-1,31 + 575 411 575 411 575 342 c 128,-1,32 + 575 273 575 273 526.5 224 c 128,-1,33 + 478 175 478 175 409 175 c 128,-1,34 + 340 175 340 175 291 224 c 128,-1,35 + 242 273 242 273 242 342 c 128,-1,36 + 242 411 242 411 291 459.5 c 128,-1,29 + 340 508 340 508 409 508 c 128,-1,30 +409 217 m 128,-1,38 + 461 217 461 217 497.5 253.5 c 128,-1,39 + 534 290 534 290 534 342 c 128,-1,40 + 534 394 534 394 497.5 430.5 c 128,-1,41 + 461 467 461 467 409 467 c 128,-1,42 + 357 467 357 467 320.5 430.5 c 128,-1,43 + 284 394 284 394 284 342 c 128,-1,44 + 284 290 284 290 320.5 253.5 c 128,-1,37 + 357 217 357 217 409 217 c 128,-1,38 +EndSplineSet +EndChar + +StartChar: uniE150 +Encoding: 337 57680 337 +Width: 750 +Flags: WO +LayerCount: 2 +Fore +SplineSet +205 202 m 4 + 206 232 206 232 256 254 c 128 + 306 276 306 276 377 275.5 c 0 + 448 276 448 276 498 254 c 128 + 548 232 548 232 548.5 202 c 0 + 548 172 548 172 498 150 c 128 + 448 128 448 128 377 128.5 c 0 + 306 128 306 128 256 150 c 128 + 206 172 206 172 205 202 c 4 +538.5 -8 m 128,-1,1 + 538.5 8 538.5 8 552.5 19 c 128,-1,2 + 566.5 30 566.5 30 585 30 c 0,3,4 + 602.5 30 602.5 30 616.5 19 c 128,-1,5 + 630.5 8 630.5 8 630.5 -8 c 128,-1,6 + 630.5 -24 630.5 -24 616.5 -35 c 128,-1,7 + 602.5 -46 602.5 -46 584 -46 c 0,8,9 + 566.5 -46 566.5 -46 552.5 -35 c 128,-1,0 + 538.5 -24 538.5 -24 538.5 -8 c 128,-1,1 +457 82 m 1025,10,-1 +518 300 m 17,11,-1 + 595 300 l 1,12,-1 + 665 92 l 1,13,-1 + 86 92 l 1,14,-1 + 155 300 l 1,15,-1 + 232 300 l 1,16,-1 + 518 300 l 17,11,-1 +148 383 m 17,17,-1 + 125 383 l 2,18,19 + 95 383 95 383 86 355 c 2,20,-1 + 2 105 l 2,21,22 + 1 102.023809524 1 102.023809524 1 92 c 1,23,24 + 0 92 0 92 0 -117 c 0,25,26 + 0 -134 0 -134 12.5 -146 c 128,-1,27 + 25 -158 25 -158 42 -158 c 2,28,-1 + 708 -158 l 2,29,30 + 725 -158 725 -158 737.5 -146 c 128,-1,31 + 750 -134 750 -134 750 -117 c 2,32,-1 + 749 92 l 2,33,34 + 748.951456311 102.145631068 748.951456311 102.145631068 748 105 c 2,35,-1 + 664 355 l 2,36,37 + 654.592 383 654.592 383 625 383 c 2,38,-1 + 602 383 l 1,39,-1 + 148 383 l 17,17,-1 +667 -75 m 1,40,-1 + 83 -75 l 1,41,-1 + 83 50 l 1,42,-1 + 667 50 l 1,43,-1 + 667 -75 l 1,40,-1 +EndSplineSet +EndChar +EndChars +EndSplineFont diff --git a/libmui/mui/c2_arrays.c b/libmui/mui/c2_arrays.c new file mode 100644 index 0000000..25495f1 --- /dev/null +++ b/libmui/mui/c2_arrays.c @@ -0,0 +1,46 @@ +/* + * c2_arrays.c + * + * Created on: 4 Feb 2023 + * Author: michel + */ + +#include "c2_arrays.h" + +/*! Simplify array 'a' into 'b', return 1 if it was. + * This takes a list of rectangles 'a', duplicates are skipped. If two rectangles + * overlap, see if the union is 'worth' it. Returns results in array 'b' + * Returns 1 if the b array has been simplified somehow, zero if not + */ +int +c2_rect_array_simplify( + c2_rect_array_p a, + c2_rect_array_p b) +{ + c2_rect_array_clear(b); + for (unsigned int i = 0; i < a->count; i++) { + int addit = 1; + c2_rect_p ra = &a->e[i]; + for (unsigned int j = 0; j < b->count && addit; j++) { + c2_rect_p rb = &b->e[j]; + if (c2_rect_equal(rb, ra)) { // already a copy here + addit = 0; + } else if (c2_rect_contains_rect(rb, ra)) { + addit = 0; + } else if (c2_rect_intersect_rect(rb, ra)) { + c2_rect_t o = *ra; + c2_rect_union(&o, rb); + long sa = c2_rect_surface_squared(ra); + long sb = c2_rect_surface_squared(rb); + long so = c2_rect_surface_squared(&o); + if (so <= (sa + sb)) { + *rb = o; + addit = 0; + } + } + } + if (addit) + c2_rect_array_add(b, *ra); + } + return b->count < a->count; +} diff --git a/libmui/mui/c2_arrays.h b/libmui/mui/c2_arrays.h new file mode 100644 index 0000000..57fd888 --- /dev/null +++ b/libmui/mui/c2_arrays.h @@ -0,0 +1,33 @@ +/* + * c2_arrays.h + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#ifndef C2_ARRAYS_H_ +#define C2_ARRAYS_H_ + +#include "c2_geometry.h" +#include "c_array.h" + +DECLARE_C_ARRAY(c2_pt_t, c2_pt_array, 16); +DECLARE_C_ARRAY(c2_coord_t, c2_coord_array, 16); +DECLARE_C_ARRAY(c2_rect_t, c2_rect_array, 16); + +IMPLEMENT_C_ARRAY(c2_pt_array); +IMPLEMENT_C_ARRAY(c2_coord_array); +IMPLEMENT_C_ARRAY(c2_rect_array); + +/*! Simplify array 'a' into 'b', return 1 if it was. + * This takes a list of rectangles 'a', duplicates are skipped. If two rectangles + * overlap, see if the union is 'worth' it. Returns results in array 'b' + * Returns 1 if the b array has been simplified somehow, zero if not + */ +int +c2_rect_array_simplify( + c2_rect_array_p a, + c2_rect_array_p b); + +#endif /* C2_ARRAYS_H_ */ diff --git a/libmui/mui/c2_geometry.c b/libmui/mui/c2_geometry.c new file mode 100644 index 0000000..02ce113 --- /dev/null +++ b/libmui/mui/c2_geometry.c @@ -0,0 +1,819 @@ +/* + * c2_geometry.c + * + * C2DGeometry Implementation + * Created: Monday, March 30, 1998 11:51:47 + * Converted back to C99 May 2013 + * + * Copyright (C) 1998-2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ +#include +#include "c2_geometry.h" +#include "c2_geometry_poly.h" + +const char * +c2_rect_as_str( + const c2_rect_p r ) +{ + static char ret[8][32]; + static int reti = 0; + char *d = ret[reti]; + reti = (reti+1) & 7; + if (r) + sprintf(d, "[%d,%d,%d,%d]",r->v[0],r->v[1],r->v[2],r->v[3]); + else strcpy(d, "[NULL]"); + return d; +} + +uint8_t +c2_rect_get_next_edge( + uint8_t inEdge, + int inCW ) +{ + uint8_t ret = inCW ? (inEdge << 1) & 0xf : (inEdge >> 1) & 0xf; + return ret ? ret : inCW ? out_Left : out_Bottom; +} + +uint8_t +c2_rect_is_on_edge( + const c2_rect_p r, + const c2_pt_p p ) +{ + if (p->v[X] == r->tl.v[X]) + return out_Left; + if (p->v[Y] == r->tl.v[Y]) + return out_Top; + if (p->v[X] == r->br.v[X]) + return out_Right; + if (p->v[Y] == r->br.v[Y]) + return out_Bottom; + return 0; +} + +int +c2_rect_get_edge( + const c2_rect_p r, + uint8_t inEdge, + c2_segment_p outEdge ) +{ + switch (inEdge) { + case out_Left: + c2_segment_set(outEdge, r->tl.v[X], r->tl.v[Y], r->tl.v[X], r->br.v[Y]); + break; + case out_Top: + c2_segment_set(outEdge, r->tl.v[X], r->tl.v[Y], r->br.v[X], r->tl.v[Y]); + break; + case out_Right: + c2_segment_set(outEdge, r->br.v[X], r->tl.v[Y], r->br.v[X], r->br.v[Y]); + break; + case out_Bottom: + c2_segment_set(outEdge, r->tl.v[X], r->br.v[Y], r->br.v[X], r->br.v[Y]); + break; + default: + return -1; + } + return 0; +} + +int +c2_rect_get_corner( + const c2_rect_p r, + uint8_t inCorner, + c2_pt_p outCorner, + int inCW ) +{ + uint8_t corner = inCW ? inCorner : c2_rect_get_next_edge(inCorner, 0); + switch (corner) { + case corner_TopLeft: + *outCorner = r->tl; + break; + case corner_TopRight: + outCorner->v[X] = r->br.v[X]; + outCorner->v[Y] = r->tl.v[Y]; + break; + case corner_BottomRight: + *outCorner = r->br; + break; + case corner_BottomLeft: + outCorner->v[X] = r->tl.v[X]; + outCorner->v[Y] = r->br.v[Y]; + break; + default: + return -1; + } + return 0; +} + + +int +c2_rect_clip_segment( + const c2_rect_p r, + c2_segment_p s, + c2_segment_p o, + char * outEdges ) +{ + int accept = 0, done = 0; + uint8_t outcode0 = c2_rect_get_out_code(r, &s->a); + uint8_t outcode1 = c2_rect_get_out_code(r, &s->b); + *o = *s; + do { + if (!(outcode0 | outcode1)) { + accept = 1; done = 1; + continue; + } else if ((outcode0 & outcode1) != 0) { + if (outEdges) { + outEdges[0] = outcode0; + outEdges[1] = outcode1; // return offending borders + } + done = 1; // don't accept + continue; + } + + // at least one end is outside, pick it + c2_pt_t *p; + uint8_t *outcode; + uint8_t dummy; + uint8_t *edge = &dummy; + if (outcode0) { + outcode = &outcode0; + p = &o->a; + if (outEdges) edge = &edge[0]; + } else { + outcode = &outcode1; + p = &o->b; + if (outEdges) edge = &edge[1]; + } + if (*outcode & out_Top) { + p->v[X] = s->a.v[X] + + (s->b.v[X] - s->a.v[X]) * + (double)(r->tl.v[Y] - s->a.v[Y]) / (s->b.v[Y] - s->a.v[Y]); + p->v[Y] = r->tl.v[Y]; + *edge = out_Top; + *outcode &= ~out_Top; + } else if (*outcode & out_Bottom) { + p->v[X] = s->a.v[X] + (s->b.v[X] - s->a.v[X]) * + (double)(r->br.v[Y] - s->a.v[Y]) / (s->b.v[Y] - s->a.v[Y]); + p->v[Y] = r->br.v[Y]; + *edge = out_Bottom; + *outcode &= ~out_Bottom; + } + if (*outcode & out_Left) { + p->v[Y] = s->a.v[Y] + (s->b.v[Y] - s->a.v[Y]) * + (double)(r->tl.v[X] - s->a.v[X]) / (s->b.v[X] - s->a.v[X]); + p->v[X] = r->tl.v[X]; + *edge = out_Left; + *outcode &= ~out_Left; + } else if (*outcode & out_Right) { + p->v[Y] = s->a.v[Y] + (s->b.v[Y] - s->a.v[Y]) * + (double)(r->br.v[X] - s->a.v[X]) / (s->b.v[X] - s->a.v[X]); + p->v[X] = r->br.v[X]; + *edge = out_Right; + *outcode &= ~out_Right; + } + *outcode = c2_rect_get_out_code(r, p); + *outcode = 0; + } while (!done); + + return accept; +} + +// C2DRectangle::Intersect( +int +c2_rect_clip_rect( + const c2_rect_p r, + const c2_rect_p s, + c2_rect_p o ) +{ + uint8_t outcode0 = c2_rect_get_out_code(r, &s->tl); + uint8_t outcode1 = c2_rect_get_out_code(r, &s->br); + + // if both corners are on the same 'side' as the + // other corner, there can't be any intersection anyway + if (outcode0 & outcode1) { + o->br = o->tl;// make sure result rect is empty + return 0; + } + // ^^ this is equivalent to testing for all corners: + // for (int c = out_Left; c <= out_Bottom; c <<= 1) + // if ((outcode0 & c) && (outcode1 & c)) + // return 0; + + /* here we /know/ the rectangle intersects, or contains the + * other, so just detect where the corners are in relation to + * the rectangle, and copy the 'clipped' coordinates over + */ + *o = *s; + if (outcode0 & out_Left) + o->tl.x = r->tl.x; + if (outcode0 & out_Top) + o->tl.y = r->tl.y; + if (outcode1 & out_Right) + o->br.x = r->br.x; + if (outcode1 & out_Bottom) + o->br.y = r->br.y; + // only return 1 is the result is a true + // rectangle. adjacent rectangles would + // return a 'valid' intersection with with + // width or height being 0 + return c2_rect_width(o) && c2_rect_height(o); +} + +//! return true if all corners of 'r2' are inside 'r1' +int +c2_rect_contains_rect( + const c2_rect_p r1, + const c2_rect_p r2 ) +{ + for (int c = corner_TopLeft; c <= corner_BottomLeft; c <<= 1) { + c2_pt_t p = {}; + c2_rect_get_corner(r2, c, &p, 1); + if (!c2_rect_contains_pt(r1, &p)) + return 0; + } + return 1; +} + +// Return true if rectangle 'r' intersects with rectangle 's' +int +c2_rect_intersect_rect( + const c2_rect_p s, + const c2_rect_p r ) +{ + // if any of the corners are inside, we are intersecting anyway + for (int c = corner_TopLeft; c <= corner_BottomLeft; c <<= 1) { + c2_pt_t p = {}; + c2_rect_get_corner(r, c, &p, 1); + if (c2_rect_contains_pt(s, &p)) + return 1; + } + // if any of the edges of 'r' intersects 's', we intersect + for (int e = out_Left; e <= out_Bottom; e <<= 1) { + c2_segment_t seg, clip; + c2_rect_get_edge(r, e, &seg); + if (c2_rect_clip_segment(s, &seg, &clip, NULL)) + return 1; + } + // if 'r' *contains* 's', we intersect + return c2_rect_contains_rect(r, s); +} + +uint8_t +c2_rect_get_out_code( + const c2_rect_p r, + const c2_pt_p p ) +{ + return ((p->v[X] < r->tl.v[X] ? out_Left : (p->v[X] > r->br.v[X]) ? out_Right : 0) | + (p->v[Y] < r->tl.v[Y] ? out_Top : (p->v[Y] > r->br.v[Y]) ? out_Bottom : 0)); +} + +void +c2_rect_clip_pt( + const c2_rect_p r, + c2_pt_p p ) +{ + uint8_t o = c2_rect_get_out_code(r, p); + if (o & out_Left) + p->v[X] = r->tl.v[X]; + else + p->v[X] = r->br.v[X]; + if (o & out_Top) + p->v[Y] = r->tl.v[Y]; + else + p->v[Y] = r->br.v[Y]; +} + + +void +c2_polyline_clear( + c2_polyline_p pl) +{ + const c2_rect_t z = C2_RECT_ZERO; + pl->bounds = z; + c2_pt_array_clear(&pl->pt); +} + +//c2_polyline_t::GetSegment( +int +c2_polyline_get_segment( + c2_polyline_p pl, + long ind, + c2_segment_p o ) +{ + if (ind > pl->pt.count) + return 0; + o->a = pl->pt.e[ind]; + o->b = pl->pt.e[ind == pl->pt.count ? 1 : ind]; + return 1; +} + +void +c2_polyline_offset( + c2_polyline_p pl, + c2_coord_t inX, + c2_coord_t inY ) +{ + for (unsigned int i = 0; i < pl->pt.count; i++) { + pl->pt.e[i].x += inX; + pl->pt.e[i].y += inY; + } + c2_rect_offset(&pl->bounds, inX, inY); +} + +void +c2_polyline_scale( + c2_polyline_p pl, + double inFactor, + c2_rect_p inSkip /* = NULL */ ) +{ + long pMax = pl->pt.count; + c2_pt_t * c = pl->pt.e; + long count = 0; + long total = pMax; + int testrect = inSkip != NULL; + + c2_rect_scale(&pl->bounds, inFactor); + + if (c2_rect_height(&pl->bounds) > 3 && c2_rect_width(&pl->bounds) > 3 && total >= 8) { + c2_pt_t delta = C2_PT_ZERO; + c2_pt_t o = C2_PT_ZERO; + short skip = 11; + c2_pt_t *d = c; + c2_pt_t orig; + + for (int i = 0; i < total; i++, c++) { + orig = *c; + c2_pt_scale(c, inFactor); + delta.v[X] += c->v[X] - o.v[X]; + delta.v[Y] += c->v[Y] - o.v[Y]; + int add = 0; + + if (testrect) + add = orig.v[X] == inSkip->tl.v[X] || orig.v[X] == inSkip->br.v[X] || + orig.v[Y] == inSkip->tl.v[Y] || orig.v[X] == inSkip->br.v[Y]; + + if (!add) + add = skip > 10 || delta.v[X] > 3 || delta.v[X] < -3 || + delta.v[Y] > 3 || delta.v[Y] < -3; + if (add) { + *d++ = *c; + count++; + delta.v[X] = delta.v[Y] = 0; + skip = 0; + } else + skip++; + o = *c; + } + if (count < 2) { + c = pl->pt.e; + c[0] = pl->bounds.tl; + c[1] = pl->bounds.br; + count = 2; + } + if (count & 1) { + *d++ = o; + count++; + } + } else { + for (int i = 1; i <= total; i++, c++) + c2_pt_scale(c, inFactor); + } + + pl->pt.count = count; + // TODO: trim? +} + +void +c2_polyline_add_pt( + c2_polyline_p pl, + c2_pt_p p ) +{ + if (!pl->pt.count) { + pl->bounds.tl = *p; + pl->bounds.br = *p; + } else { + pl->bounds.tl.v[X] = PMIN(pl->bounds.tl.v[X], p->v[X]); + pl->bounds.tl.v[Y] = PMIN(pl->bounds.tl.v[Y], p->v[Y]); + pl->bounds.br.v[X] = PMAX(pl->bounds.br.v[X], p->v[X]); + pl->bounds.br.v[Y] = PMAX(pl->bounds.br.v[Y], p->v[Y]); + } + c2_pt_array_add(&pl->pt, *p); +} + +#if 0 +void +c2_polyline_t::Frame() +{ + Lock(); + SInt32 pMax = GetCount(); + c2_pt_t *c = (c2_pt_t*)GetItemPtr(1); + MoveTo(Pixel_32k(c->v[X]), Pixel_32k(c->v[Y])); + for (int i = 1; i <= GetCount(); i++, c++) { + if (i == 1) + i = 1; + LineTo(Pixel_32k(c->v[X]), Pixel_32k(c->v[Y])); + } + Unlock(); +} +#endif + +void +c2_polyline_array_break( + c2_polyline_array_p pa) +{ + pa->current = NULL; +} + +void +c2_polyline_array_add_pt( + c2_polyline_array_p pa, + c2_pt_p p ) +{ + if (!pa->current) { + pa->current = malloc(sizeof(c2_polyline_t)); + memset(pa->current, 0, sizeof(*pa->current)); + c2_polyline_array_add(pa, pa->current); + } + c2_polyline_add_pt(pa->current, p); +} + +int +c2_polyline_array_clip( + c2_polyline_array_p pa, + c2_rect_p clip, + c2_polyline_array_p outPoly ) +{ + for (long poly = 0; poly < pa->count; poly++) { + c2_polyline_t *p = pa->e[poly]; + if (!p) + break; + + long pMax = p->pt.count; + c2_pt_t * last = p->pt.e; + int lastIn = c2_rect_contains_pt(clip, last); + c2_pt_t * current = last+1; + int currentIn = c2_rect_contains_pt(clip, current); + + for (long pIndex = 2; pIndex <= pMax; pIndex++) { + if (lastIn && currentIn) { // both points are IN + //outPoly.AddPoint(*last); + c2_polyline_array_add_pt(outPoly, current); + } else if (lastIn && !currentIn) { // line goes OUT + c2_segment_t src = { .a = *last, .b = *current }; + c2_segment_t dst; + c2_rect_clip_segment(clip, &src, &dst, NULL); + c2_polyline_array_add_pt(outPoly, &dst.b); + c2_polyline_array_break(outPoly); + } else if (!lastIn && currentIn) { // line goes IN + c2_segment_t src = { .a = *last, .b = *current }; + c2_segment_t dst; + c2_rect_clip_segment(clip, &src, &dst, NULL); + c2_polyline_array_break(outPoly); + c2_polyline_array_add_pt(outPoly, &dst.a); + c2_polyline_array_add_pt(outPoly, &dst.b); + } else { // line outside + c2_segment_t src = { .a = *last, .b = *current }; + c2_segment_t dst; + if (c2_rect_clip_segment(clip, &src, &dst, NULL)) { // both point are out, but crosses the rectangle + c2_polyline_array_break(outPoly); + c2_polyline_array_add_pt(outPoly, &dst.a); + c2_polyline_array_add_pt(outPoly, &dst.b); + } + } + last++; + current++; + lastIn = c2_rect_contains_pt(clip, last); + currentIn = c2_rect_contains_pt(clip, current); + } + + } + return 0; +} + + +void +c2_polyline_array_scale( + c2_polyline_array_p pa, + float inFactor, + c2_rect_p inSkip /* = NULL */ ) +{ + for (unsigned int ind = 0; ind < pa->count; ind++) { + c2_polyline_scale(pa->e[ind], inFactor, inSkip); + } +} + +void +c2_polyline_array_offset( + c2_polyline_array_p pa, + c2_coord_t inX, + c2_coord_t inY ) +{ + for (unsigned int ind = 0; ind < pa->count; ind++) { + c2_polyline_offset(pa->e[ind], inX, inY); + } +} + +void +c2_scanline_array_proper_alloc( + c2_scanline_array_p a, + c2_coord_t height) +{ + c2_scanline_array_realloc(a, height); + memset(a->e, 0, height * sizeof(a->e[0])); +} + +void +c2_scanline_array_proper_clear( + c2_scanline_array_p a) +{ + for (unsigned int i = 0; i < a->count; i++) + c2_coord_array_free(&a->e[i]); +} + +void +c2_scanline_array_add_coord( + c2_scanline_array_p a, + int inY, + c2_coord_t inX ) +{ + if (inY < 0 || inY >= (int)a->count) return; + + c2_coord_array_p l = &a->e[inY]; + + if (l->count == 0 || inX >= l->e[l->count-1]) { + c2_coord_array_add(l, inX); + return; + } + + int num = l->count; + int ind = 0; + c2_coord_t * cur = l->e; + + while (*cur < inX && num--) { + cur++; + ind++; + } + c2_coord_array_insert(l, ind, &inX, 1); +} + +int +c2_polygon_isempty( + c2_polygon_p pl) +{ + return !pl->pt.count || c2_rect_isempty(&pl->bounds); +} + +c2_coord_t +c2_polygon_get_heigth( + c2_polygon_p pl) +{ + return c2_rect_height(&pl->bounds); +} + +void +c2_polygon_clip( + c2_polygon_p pl, + c2_rect_p clip, + c2_polygon_p outPoly ) +{ + int sect = c2_rect_intersect_rect(&pl->bounds, clip); + int contains = c2_rect_contains_rect(&pl->bounds, clip); + if (!sect && !contains) + return; // don't even bother + + long pMax = pl->pt.count; + c2_pt_t * last = pl->pt.e; + int lastIn = c2_rect_contains_pt(clip, last); + c2_pt_t * current = last+1; + int currentIn = c2_rect_contains_pt(clip, current); + //char outPart = clip.GetOutCode(*last); + uint8_t edgesStack[40]; + short edgesClock[40]; + long edgesCount = 0; + + char edgesIndexes[13] = // Bit valued to quadrant index + { 0, 1, 3, 2, 5, 0, 4, 0, 7, 8, 0, 0, 6 }; + + // if we start outside, remember our quadrant + if (!lastIn) + edgesStack[edgesCount++] = edgesIndexes[c2_rect_get_out_code(clip, last)]; + if (lastIn) + c2_polyline_add_pt(outPoly, last); + for (long pIndex = 2; pIndex <= pMax; pIndex++) { + if (lastIn && currentIn) { // both points are IN + c2_polyline_add_pt(outPoly, current); + } else if (lastIn && !currentIn) { // line goes OUT + c2_segment_t src = { .a = *last, .b = *current }; + c2_segment_t dst; + c2_rect_clip_segment(clip, &src, &dst, NULL); + c2_polyline_add_pt(outPoly, &dst.b); + edgesStack[edgesCount++] = edgesIndexes[c2_rect_is_on_edge(clip, &dst.b)]; + } else if (!lastIn && currentIn) { // line goes IN + // flush corner stack + if (edgesCount > 1) { + for (int c = 0; c < edgesCount; c++) { + c2_pt_t p; + switch (edgesStack[c]) { + case 2: // topleft + p = clip->tl; + c2_polyline_add_pt(outPoly, &p); + break; + case 4: // topright + p.v[X] = clip->br.v[X]; p.v[Y] = clip->tl.v[Y]; + c2_polyline_add_pt(outPoly, &p); + break; + case 6: // botright + p = clip->br; + c2_polyline_add_pt(outPoly, &p); + break; + case 8: // botleft + p.v[X] = clip->tl.v[X]; p.v[Y] = clip->br.v[Y]; + c2_polyline_add_pt(outPoly, &p); + break; + } + } + } + edgesCount = 0; + c2_segment_t src = { .a = *last, .b = *current }; + c2_segment_t dst; + c2_rect_clip_segment(clip, &src, &dst, NULL); + c2_polyline_add_pt(outPoly, &dst.a); + c2_polyline_add_pt(outPoly, &dst.b); + } else { // line outside + c2_segment_t src = { .a = *last, .b = *current }; + c2_segment_t dst; + if (c2_rect_clip_segment(clip, &src, &dst, NULL)) { // both point are out, but crosses the rectangle + // flush corner stack + if (edgesCount > 1) { + for (int c = 0; c < edgesCount; c++) { + c2_pt_t p; + switch (edgesStack[c]) { + case 2: // topleft + p = clip->tl; + c2_polyline_add_pt(outPoly, &p); + break; + case 4: // topright + p.v[X] = clip->br.v[X]; p.v[Y] = clip->tl.v[Y]; + c2_polyline_add_pt(outPoly, &p); + break; + case 6: // botright + p = clip->br; + c2_polyline_add_pt(outPoly, &p); + break; + case 8: // botleft + p.v[X] = clip->tl.v[X]; p.v[Y] = clip->br.v[Y]; + c2_polyline_add_pt(outPoly, &p); + break; + } + } + } + edgesCount = 0; + c2_polyline_add_pt(outPoly, &dst.a); + c2_polyline_add_pt(outPoly, &dst.b); + edgesStack[edgesCount++] = edgesIndexes[c2_rect_is_on_edge(clip, &dst.b)]; + } else { // setup edge stack properly + unsigned char clockTable[9] = + { 0, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xc1, 0x83, 0x07 }; + uint8_t o = edgesIndexes[c2_rect_get_out_code(clip, current)]; + if (o != edgesStack[edgesCount - 1]) { + short clock = clockTable[edgesStack[edgesCount - 1]] & (1 << (o-1)) ? 1 : -1; + + do { + if (edgesCount == 1) + edgesClock[edgesCount -1] = clock; + + if (clock == edgesClock[edgesCount -1]) { + int c = edgesStack[edgesCount - 1]; + do { + c += clock; + if (c == 0) c = 8; + else if (c == 9) c = 1; + edgesClock[edgesCount] = clock; + edgesStack[edgesCount++] = c; +#ifdef TRACELIB + { + static long ecount = 0; + if (edgesCount > ecount) { + ecount = edgesCount; + printf("Max edgecount = %d\n", ecount); + } + } + if (edgesCount == 40) { + DebugStr("\p HELP!"); + } +#endif + } while (c != o); + } else { // change direction, remove points + while (edgesCount > 1 && edgesStack[edgesCount - 1] != o) + edgesCount--; + } + } while (o != edgesStack[edgesCount -1]); + } + } + } + last++; + current++; + lastIn = c2_rect_contains_pt(clip, last); + currentIn = c2_rect_contains_pt(clip, current); + } + // flush corner stack + if (edgesCount > 1) { + for (int c = 0; c < edgesCount; c++) { + c2_pt_t p; + switch (edgesStack[c]) { + case 2: // topleft + p = clip->tl; + c2_polyline_add_pt(outPoly, &p); + break; + case 4: // topright + p.v[X] = clip->br.v[X]; p.v[Y] = clip->tl.v[Y]; + c2_polyline_add_pt(outPoly, &p); + break; + case 6: // botright + p = clip->br; + c2_polyline_add_pt(outPoly, &p); + break; + case 8: // botleft + p.v[X] = clip->tl.v[X]; p.v[Y] = clip->br.v[Y]; + c2_polyline_add_pt(outPoly, &p); + break; + } + } + } + edgesCount = 0; +} + + +#define exchange(t, p1, p2) { t e=p1;p1=p2;p2=e; } + +void +c2_polygon_scanline( + c2_polygon_p pl, + c2_scanline_array_p ioList, + c2_coord_t ymin ) +{ + c2_coord_t ysize = ioList->height;//TODO check if we meant the polygon height? + if (ysize <= 0 || c2_rect_width(&pl->bounds) <= 0) + return; + + c2_pt_t *first = pl->pt.e; + c2_pt_t *sp1 = first; + c2_pt_t *sp2 = sp1+1; + long numPoints = pl->pt.count; + // + // Compute list of intersections between the vertex and the horizontal + // lines. The lists are automaticaly sorted + // + do { + if (numPoints == 1) sp2 = first; + c2_pt_t *p1 = sp1; + c2_pt_t *p2 = sp2; + if (p2->v[Y] < p1->v[Y]) + exchange(c2_pt_t *, p1, p2); + c2_coord_t y1 = p1->v[Y]; + c2_coord_t y2 = p2->v[Y]; + c2_coord_t idy = y2 - y1; + if ((y1 < ymin && y2 < ymin) || + ((y1-ymin > ioList->height) && (y2-ymin > ioList->height))) + continue; + if (idy) { + double x, dx; + x = p1->v[X]; + dx = (p2->v[X] - p1->v[X]) / (double)idy; + do { + c2_coord_t ix = x; + c2_scanline_array_add_coord(ioList, y1-ymin, x - ix > 0.5 ? ix+1 : ix); + x += dx; + y1++; + } while (y1 < y2); + } else { + c2_scanline_array_add_coord(ioList, y1-ymin, p1->v[X]); + c2_scanline_array_add_coord(ioList, y1-ymin, p2->v[X]); + } + sp1++; + sp2++; + } while(numPoints-- > 1); +} + +#if 0 +void +c2_polygon_t::Paint() +{ + c2_scanline_list_t scan(Height()+1); + AddIntersections(scan, bounds.tl.v[Y]); + + for (int i = 0; i < Height(); i++) { + SInt32 num = scan.Get(i).GetCount(); + if (num > 1) { + c2_coord_t * cur = scan.Get(i); + for (SInt32 ind = 1; ind <= num - 1; ind += 2, cur += 2) { + if (cur[0] < cur[1]) { + MoveTo(cur[0], bounds.tl.v[Y]+i); + LineTo(cur[1], bounds.tl.v[Y]+i); + } + } + } + } +} +#endif diff --git a/libmui/mui/c2_geometry.h b/libmui/mui/c2_geometry.h new file mode 100644 index 0000000..e47c8ac --- /dev/null +++ b/libmui/mui/c2_geometry.h @@ -0,0 +1,148 @@ +/* + * c2_geometry.h + * + * C2DGeometry Implementation + * Created: Monday, March 30, 1998 11:51:47 + * Converted back to C99 May 2013 + * + * Copyright (C) 1998-2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#ifndef __C2_GEOMETRY_H__ +#define __C2_GEOMETRY_H__ + +#include + +#define PMIN(x1,x2) ((x1 < x2) ? x1 : x2) +#define PMAX(x1,x2) ((x1 > x2) ? x1 : x2) + +typedef int32_t c2_coord_t; + +enum { + X = 0, Y, +// L = 0, T, R, B, +}; + +// +// a basic x,y point +// +typedef union c2_pt_t { + struct { + c2_coord_t x, y; + }; + c2_coord_t v[2]; +} c2_pt_t;//, *c2_pt_p; +#define c2_pt_p union c2_pt_t* + +#define C2_PT(_a, _b) (c2_pt_t){ .x = (_a), .y = (_b) } +#define C2_PT_ZERO C2_PT(0,0) + +// +// a basic segment, a pair of points +// +typedef struct c2_segment_t { + c2_pt_t a, b; +} c2_segment_t;//, *c2_segment_p; +#define c2_segment_p struct c2_segment_t* + +#define C2_SEGMENT_ZERO { C2_PT_ZERO, C2_PT_ZERO } + +// +// a rectangle defined by two points +// +typedef union c2_rect_t { + struct { + c2_pt_t tl, br; + }; + c2_coord_t v[4]; + struct { + c2_coord_t l,t,r,b; + }; +} c2_rect_t;//, *c2_rect_p; +#define c2_rect_p union c2_rect_t* + +#define C2_RECT(_l,_t,_r,_b) (c2_rect_t){ .l = _l, .t = _t, .r = _r, .b = _b } +#define C2_RECT_WH(_l,_t,_w,_h) (c2_rect_t){ \ + .l = _l, .t = _t, .r = (_l)+(_w), .b = (_t)+(_h) } +/* Return the squared surface of the rectangle, for area comparison sake */ +#define c2_rect_surface_squared(_r) \ + ((c2_rect_width(_r)*c2_rect_width(_r))+\ + (c2_rect_height(_r)*c2_rect_height(_r))) + +#define C2_RECT_ZERO C2_RECT(0,0,0,0) + +int +c2_rect_contains_rect( + const c2_rect_p r1, + const c2_rect_p r2 ); + +int +c2_rect_clip_segment( + const c2_rect_p r, + c2_segment_p s, + c2_segment_p o, + char * outEdges ); +int +c2_rect_clip_rect( + const c2_rect_p r, + const c2_rect_p s, + c2_rect_p o ); +int +c2_rect_intersect_rect( + const c2_rect_p s, + const c2_rect_p r ); + +enum { + out_Left = (1 << 0), + out_Top = (1 << 1), + out_Right = (1 << 2), + out_Bottom = (1 << 3), +}; +enum { + corner_TopLeft = out_Left, + corner_TopRight = out_Top, + corner_BottomRight = out_Right, + corner_BottomLeft = out_Bottom, +}; + +uint8_t +c2_rect_get_out_code( + const c2_rect_p r, + const c2_pt_p p ); +void +c2_rect_clip_pt( + const c2_rect_p r, + c2_pt_p p ); + +uint8_t +c2_rect_get_next_edge( + uint8_t inEdge, + int inCW ); +uint8_t +c2_rect_is_on_edge( + const c2_rect_p r, + const c2_pt_p p ); +int +c2_rect_get_edge( + const c2_rect_p r, + uint8_t inEdge, + c2_segment_p outEdge ); +int +c2_rect_get_corner( + const c2_rect_p r, + uint8_t inCorner, + c2_pt_p outCorner, + int inCW ); + +const char * +c2_rect_as_str( + const c2_rect_p r ); + +#ifndef C2_GEOMETRY_INLINE_H_ +#ifndef C2_DECL +#include "c2_geometry_inline.h" +#endif +#endif +#endif diff --git a/libmui/mui/c2_geometry_inline.h b/libmui/mui/c2_geometry_inline.h new file mode 100644 index 0000000..bbdf211 --- /dev/null +++ b/libmui/mui/c2_geometry_inline.h @@ -0,0 +1,244 @@ +/* + * c2_geometry_inline.h + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#ifndef C2_GEOMETRY_INLINE_H_ +#define C2_GEOMETRY_INLINE_H_ + +#include "c2_geometry.h" + +#ifndef C2_DECL +#define C2_DECL static inline __attribute__((unused)) +#endif + +C2_DECL void +c2_pt_offset( + c2_pt_p p, + c2_coord_t inX, + c2_coord_t inY) +{ + p->x += inX; + p->y += inY; +} + +C2_DECL int +c2_pt_equal( + const c2_pt_p p1, + const c2_pt_p p2) +{ + return p1->v[0] == p2->v[0] && p1->v[1] == p2->v[1]; +} + +C2_DECL void +c2_pt_scale( + c2_pt_p p, + float inFactor ) +{// TODO fix rounding + p->v[X] *= inFactor; + p->v[Y] *= inFactor; +} + +C2_DECL c2_segment_p +c2_segment_set( + c2_segment_p s, + c2_coord_t x1, + c2_coord_t y1, + c2_coord_t x2, + c2_coord_t y2 ) +{ + s->a.v[X] = PMIN(x1, x2); + s->a.v[Y] = PMIN(y1, y2); + s->b.v[X] = PMAX(x1, x2); + s->b.v[Y] = PMAX(y1, y2); + return s; +} + + +C2_DECL int +c2_segment_equal( + const c2_segment_p s1, + const c2_segment_p s2) +{ + return (c2_pt_equal(&s1->a, &s2->a) && c2_pt_equal(&s1->b, &s2->b)) || + (c2_pt_equal(&s1->a, &s2->b) && c2_pt_equal(&s1->b, &s2->a)); +} + +C2_DECL int +c2_segment_isempty( + const c2_segment_p s) +{ + return c2_pt_equal(&s->a, &s->b); +} + +C2_DECL void +c2_segment_offset( + c2_segment_p s, + c2_coord_t inX, + c2_coord_t inY ) +{ + c2_pt_offset(&s->a, inX, inY); + c2_pt_offset(&s->b, inX, inY); +} + +C2_DECL void +c2_segment_scale( + c2_segment_p s, + double inFactor ) +{ + c2_pt_scale(&s->a, inFactor); + c2_pt_scale(&s->b, inFactor); +} + + +C2_DECL c2_rect_p +c2_rect_set( + c2_rect_p r, + c2_coord_t x1, + c2_coord_t y1, + c2_coord_t x2, + c2_coord_t y2 ) +{ + r->tl.v[X] = PMIN(x1, x2); + r->tl.v[Y] = PMIN(y1, y2); + r->br.v[X] = PMAX(x1, x2); + r->br.v[Y] = PMAX(y1, y2); + return r; +} + +C2_DECL int +c2_rect_isempty( + const c2_rect_p r) +{ + return c2_pt_equal(&r->tl, &r->br) || + r->tl.x >= r->br.x || r->tl.y >= r->br.y; +} +C2_DECL int +c2_rect_equal( + const c2_rect_p r, + const c2_rect_p o) +{ + return r->v[0] == o->v[0] && r->v[1] == o->v[1] && + r->v[2] == o->v[2] && r->v[3] == o->v[3]; + /* This got miscompiled under gcc 4.8 and 4.9. The above is more straightforward. + * return c2_pt_equal(&r->tl, &o->tl) && c2_pt_equal(&r->br, &o->br); + */ +} +C2_DECL c2_coord_t +c2_rect_height( + const c2_rect_p r) +{ + return r->br.v[Y] - r->tl.v[Y]; +} + +C2_DECL c2_coord_t +c2_rect_width( + const c2_rect_p r) +{ + return r->br.v[X] - r->tl.v[X]; +} + +C2_DECL c2_pt_t +c2_rect_size( + const c2_rect_p r) +{ + return (c2_pt_t){ .x = c2_rect_width(r), .y = c2_rect_height(r) }; +} + +C2_DECL void +c2_rect_offset( + c2_rect_p r, + c2_coord_t inX, + c2_coord_t inY) +{ + c2_pt_offset(&r->tl, inX, inY); + c2_pt_offset(&r->br, inX, inY); +} + +C2_DECL void +c2_rect_inset( + c2_rect_p r, + c2_coord_t inX, + c2_coord_t inY) +{ + c2_pt_offset(&r->tl, inX, inY); + c2_pt_offset(&r->br, -inX, -inY); +} + +C2_DECL void +c2_rect_scale( + c2_rect_p r, + double inFactor ) +{ + c2_pt_scale(&r->tl, inFactor); + c2_pt_scale(&r->br, inFactor); +} + +C2_DECL int +c2_rect_contains_pt( + const c2_rect_p r, + c2_pt_p p ) +{ + return (p->v[X] >= r->tl.v[X] && p->v[X] <= r->br.v[X]) && + (p->v[Y] >= r->tl.v[Y] && p->v[Y] <= r->br.v[Y]); +} + +/* Returns 'r' as the union of 'r' and 'u' (enclosing rectangle) */ +C2_DECL c2_rect_p +c2_rect_union( + c2_rect_p r, + c2_rect_p u ) +{ + if (!r || !u) return r; + if (c2_rect_isempty(r)) { + *r = *u; + return r; + } + r->l = PMIN(r->l, u->l); + r->t = PMIN(r->t, u->t); + r->r = PMAX(r->r, u->r); + r->b = PMAX(r->b, u->b); + return r; +} + +static c2_rect_t +c2_rect_left_of( + c2_rect_t * r, + int mark, + int margin) +{ + c2_rect_offset(r, -r->l + mark - c2_rect_width(r) - margin, 0); + return *r; +} +static c2_rect_t +c2_rect_right_of( + c2_rect_t * r, + int mark, + int margin) +{ + c2_rect_offset(r, -r->l + mark + margin, 0); + return *r; +} +static c2_rect_t +c2_rect_top_of( + c2_rect_t * r, + int mark, + int margin) +{ + c2_rect_offset(r, 0, -r->t + mark - c2_rect_height(r) - margin); + return *r; +} +static c2_rect_t +c2_rect_bottom_of( + c2_rect_t * r, + int mark, + int margin) +{ + c2_rect_offset(r, 0, -r->t + mark + margin); + return *r; +} + +#endif /* C2_GEOMETRY_INLINE_H_ */ diff --git a/libmui/mui/c2_geometry_poly.h b/libmui/mui/c2_geometry_poly.h new file mode 100644 index 0000000..c8b464f --- /dev/null +++ b/libmui/mui/c2_geometry_poly.h @@ -0,0 +1,119 @@ +/* + * c2_geometry_poly.h + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#ifndef C2_GEOMETRY_POLY_H_ +#define C2_GEOMETRY_POLY_H_ + +#include "c2_arrays.h" + +typedef struct c2_polyline_t { + c2_pt_array_t pt; + c2_rect_t bounds; +} c2_polyline_t, *c2_polyline_p; + +DECLARE_C_ARRAY(c2_polyline_p, c2_polyline_array, 16, + c2_polyline_p current; ); +DECLARE_C_ARRAY(c2_coord_array_t, c2_scanline_array, 16, + c2_coord_t height; ); + +IMPLEMENT_C_ARRAY(c2_scanline_array); +IMPLEMENT_C_ARRAY(c2_polyline_array); + + +void +c2_polyline_clear( + c2_polyline_p pl); + +int +c2_polyline_get_segment( + c2_polyline_p pl, + long ind, + c2_segment_p o ); + +void +c2_polyline_offset( + c2_polyline_p pl, + c2_coord_t inX, + c2_coord_t inY ); + +void +c2_polyline_scale( + c2_polyline_p pl, + double inFactor, + c2_rect_p inSkip /* = NULL */ ); + +void +c2_polyline_add_pt( + c2_polyline_p pl, + c2_pt_p p ); + +int +c2_polyline_array_clip( + c2_polyline_array_p pa, + c2_rect_p clip, + c2_polyline_array_p outPoly ); +void +c2_polyline_array_break( + c2_polyline_array_p pa); +void +c2_polyline_array_add_pt( + c2_polyline_array_p pa, + c2_pt_p p ); + +void +c2_polyline_array_scale( + c2_polyline_array_p pa, + float inFactor, + c2_rect_p inSkip /* = NULL */ ); +void +c2_polyline_array_offset( + c2_polyline_array_p pa, + c2_coord_t inX, + c2_coord_t inY ); + + +void +c2_scanline_array_proper_alloc( + c2_scanline_array_p a, + c2_coord_t height); +void +c2_scanline_array_proper_clear( + c2_scanline_array_p a); +void +c2_scanline_array_add_coord( + c2_scanline_array_p a, + int inY, + c2_coord_t inX ); + + +typedef c2_polyline_p c2_polygon_p; + +int +c2_polygon_isempty( + c2_polygon_p pl); + +c2_coord_t +c2_polygon_get_heigth( + c2_polygon_p pl); + + +void +c2_polygon_clip( + c2_polygon_p pl, + c2_rect_p clip, + c2_polygon_p outPoly ); + +void +c2_polygon_scanline( + c2_polygon_p pl, + c2_scanline_array_p ioList, + c2_coord_t ymin ); + + + +#endif /* C2_GEOMETRY_POLY_H_ */ diff --git a/libmui/mui/c_array.h b/libmui/mui/c_array.h new file mode 100644 index 0000000..fd40780 --- /dev/null +++ b/libmui/mui/c_array.h @@ -0,0 +1,161 @@ +/* + * c_array.h + * + * Copyright 2012 Michel Pollet + * + * SPDX-License-Identifier: Apache-2.0 + * vi: ts=4 + */ + + +#ifndef __C_ARRAY_H___ +#define __C_ARRAY_H___ + +#include +#include +#include + +#ifndef C_ARRAY_INLINE +#define C_ARRAY_INLINE inline +#endif +#ifndef C_ARRAY_SIZE_TYPE +#define C_ARRAY_SIZE_TYPE uint32_t +#endif +/* New compilers don't like unused static functions. However, + * we do like 'static inlines' for these small accessors, + * so we mark them as 'unused'. It stops it complaining */ +#ifdef __GNUC__ +#define C_ARRAY_DECL static __attribute__ ((unused)) +#else +#define C_ARRAY_DECL static +#endif + + +#define DECLARE_C_ARRAY(__type, __name, __page, __args...) \ +enum { __name##_page_size = __page }; \ +typedef __type __name##_element_t; \ +typedef C_ARRAY_SIZE_TYPE __name##_count_t; \ +typedef struct __name##_t {\ + volatile __name##_count_t count;\ + volatile __name##_count_t size;\ + __name##_element_t * e;\ + __args \ +} __name##_t, *__name##_p; + +#define C_ARRAY_NULL { 0, 0, NULL } + +#ifndef NO_DECL +#define IMPLEMENT_C_ARRAY(__name) \ +C_ARRAY_DECL C_ARRAY_INLINE \ + void __name##_init(\ + __name##_p a) \ +{\ + static const __name##_t zero = {}; \ + if (!a) return;\ + *a = zero;\ +}\ +C_ARRAY_DECL C_ARRAY_INLINE \ + void __name##_free(\ + __name##_p a) \ +{\ + if (!a) return;\ + if (a->e) free(a->e);\ + a->count = a->size = 0;\ + a->e = NULL;\ +}\ +C_ARRAY_DECL C_ARRAY_INLINE \ + void __name##_clear(\ + __name##_p a) \ +{\ + if (!a) return;\ + a->count = 0;\ +}\ +C_ARRAY_DECL C_ARRAY_INLINE \ + void __name##_realloc(\ + __name##_p a, __name##_count_t size) \ +{\ + if (!a || a->size == size) return; \ + if (size == 0) { if (a->e) free(a->e); a->e = NULL; } \ + else a->e = (__name##_element_t*)realloc(a->e, \ + size * sizeof(__name##_element_t));\ + a->size = size; \ +}\ +C_ARRAY_DECL C_ARRAY_INLINE \ + void __name##_trim(\ + __name##_p a) \ +{\ + if (!a) return;\ + __name##_count_t n = a->count + __name##_page_size;\ + n -= (n % __name##_page_size);\ + if (n != a->size)\ + __name##_realloc(a, n);\ +}\ +C_ARRAY_DECL C_ARRAY_INLINE \ + __name##_element_t * __name##_get_ptr(\ + __name##_p a, __name##_count_t index) \ +{\ + if (!a) return NULL;\ + if (index > a->count) index = a->count;\ + return index < a->count ? a->e + index : NULL;\ +}\ +C_ARRAY_DECL C_ARRAY_INLINE \ + __name##_count_t __name##_add(\ + __name##_p a, __name##_element_t e) \ +{\ + if (!a) return 0;\ + if (a->count + 1 >= a->size)\ + __name##_realloc(a, a->size + __name##_page_size);\ + a->e[a->count++] = e;\ + return a->count;\ +}\ +C_ARRAY_DECL C_ARRAY_INLINE \ + __name##_count_t __name##_push(\ + __name##_p a, __name##_element_t e) \ +{\ + return __name##_add(a, e);\ +}\ +C_ARRAY_DECL C_ARRAY_INLINE \ + int __name##_pop(\ + __name##_p a, __name##_element_t *e) \ +{\ + if (a->count) { *e = a->e[--a->count]; return 1; } \ + return 0;\ +}\ +C_ARRAY_DECL C_ARRAY_INLINE \ + __name##_count_t __name##_insert(\ + __name##_p a, __name##_count_t index, \ + __name##_element_t * e, __name##_count_t count) \ +{\ + if (!a) return 0;\ + if (index > a->count) index = a->count;\ + if (a->count + count >= a->size) \ + __name##_realloc(a, (((a->count + count) / __name##_page_size)+1) * __name##_page_size);\ + if (index < a->count)\ + memmove(&a->e[index + count], &a->e[index], \ + (a->count - index) * sizeof(__name##_element_t));\ + memmove(&a->e[index], e, count * sizeof(__name##_element_t));\ + a->count += count;\ + return a->count;\ +}\ +C_ARRAY_DECL C_ARRAY_INLINE \ + __name##_count_t __name##_delete(\ + __name##_p a, __name##_count_t index, __name##_count_t count) \ +{\ + if (!a) return 0;\ + if (index > a->count) index = a->count;\ + if (index + count > a->count) \ + count = a->count - index;\ + if (count && a->count - index) { \ + memmove(&a->e[index], &a->e[index + count], \ + (a->count - index - count) * sizeof(__name##_element_t));\ + }\ + a->count -= count;\ + return a->count;\ +} +#else /* NO_DECL */ + +#define IMPLEMENT_C_ARRAY(__name) + +#endif + +#endif /* __C_ARRAY_H___ */ diff --git a/libmui/mui/cg.c b/libmui/mui/cg.c new file mode 100644 index 0000000..35fac43 --- /dev/null +++ b/libmui/mui/cg.c @@ -0,0 +1,2512 @@ +/* + * cg.c + * + * Copyright(c) 2007-2023 Jianjun Jiang <8192542@qq.com> + * Mobile phone: +86-18665388956 + * QQ: 8192542 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in 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: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the 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 + * AUTHORS 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 IN THE + * SOFTWARE. + * + */ + +#include "cg.h" + +#define cg_array_init(array) \ + do { \ + array.data = NULL; \ + array.size = 0; \ + array.capacity = 0; \ + } while(0) + +#define cg_array_ensure(array, count) \ + do { \ + if(array.size + count > array.capacity) { \ + int capacity = array.size + count; \ + int newcapacity = (array.capacity == 0) ? 8 : array.capacity; \ + while(newcapacity < capacity) { newcapacity <<= 1; } \ + array.data = realloc(array.data, (size_t)newcapacity * sizeof(array.data[0])); \ + array.capacity = newcapacity; \ + } \ + } while(0) + +static inline void cg_color_init_rgba(struct cg_color_t * color, double r, double g, double b, double a) +{ + color->r = r; + color->g = g; + color->b = b; + color->a = a; +} + +static inline void cg_rect_init(struct cg_rect_t * rect, double x, double y, double w, double h) +{ + rect->x = x; + rect->y = y; + rect->w = w; + rect->h = h; +} + +void cg_matrix_init(struct cg_matrix_t * m, double a, double b, double c, double d, double tx, double ty) +{ + m->a = a; m->b = b; + m->c = c; m->d = d; + m->tx = tx; m->ty = ty; +} + +void cg_matrix_init_identity(struct cg_matrix_t * m) +{ + m->a = 1; m->b = 0; + m->c = 0; m->d = 1; + m->tx = 0; m->ty = 0; +} + +void cg_matrix_init_translate(struct cg_matrix_t * m, double tx, double ty) +{ + m->a = 1; m->b = 0; + m->c = 0; m->d = 1; + m->tx = tx; m->ty = ty; +} + +void cg_matrix_init_scale(struct cg_matrix_t * m, double sx, double sy) +{ + m->a = sx; m->b = 0; + m->c = 0; m->d = sy; + m->tx = 0; m->ty = 0; +} + +void cg_matrix_init_rotate(struct cg_matrix_t * m, double r) +{ + double s = sin(r); + double c = cos(r); + + m->a = c; m->b = s; + m->c = -s; m->d = c; + m->tx = 0; m->ty = 0; +} + +void cg_matrix_translate(struct cg_matrix_t * m, double tx, double ty) +{ + m->tx += m->a * tx + m->c * ty; + m->ty += m->b * tx + m->d * ty; +} + +void cg_matrix_scale(struct cg_matrix_t * m, double sx, double sy) +{ + m->a *= sx; + m->b *= sx; + m->c *= sy; + m->d *= sy; +} + +void cg_matrix_rotate(struct cg_matrix_t * m, double r) +{ + double s = sin(r); + double c = cos(r); + double ca = c * m->a; + double cb = c * m->b; + double cc = c * m->c; + double cd = c * m->d; + double sa = s * m->a; + double sb = s * m->b; + double sc = s * m->c; + double sd = s * m->d; + + m->a = ca + sc; + m->b = cb + sd; + m->c = cc - sa; + m->d = cd - sb; +} + +void cg_matrix_multiply(struct cg_matrix_t * m, struct cg_matrix_t * m1, struct cg_matrix_t * m2) +{ + struct cg_matrix_t t; + + t.a = m1->a * m2->a; + t.b = 0.0; + t.c = 0.0; + t.d = m1->d * m2->d; + t.tx = m1->tx * m2->a + m2->tx; + t.ty = m1->ty * m2->d + m2->ty; + if(m1->b != 0.0 || m1->c != 0.0 || m2->b != 0.0 || m2->c != 0.0) + { + t.a += m1->b * m2->c; + t.b += m1->a * m2->b + m1->b * m2->d; + t.c += m1->c * m2->a + m1->d * m2->c; + t.d += m1->c * m2->b; + t.tx += m1->ty * m2->c; + t.ty += m1->tx * m2->b; + } + memcpy(m, &t, sizeof(struct cg_matrix_t)); +} + +void cg_matrix_invert(struct cg_matrix_t * m) +{ + double a, b, c, d, tx, ty; + double det; + + if((m->c == 0.0) && (m->b == 0.0)) + { + m->tx = -m->tx; + m->ty = -m->ty; + if(m->a != 1.0) + { + if(m->a == 0.0) + return; + m->a = 1.0 / m->a; + m->tx *= m->a; + } + if(m->d != 1.0) + { + if(m->d == 0.0) + return; + m->d = 1.0 / m->d; + m->ty *= m->d; + } + } + else + { + det = m->a * m->d - m->b * m->c; + if(det != 0.0) + { + a = m->a; + b = m->b; + c = m->c; + d = m->d; + tx = m->tx; + ty = m->ty; + m->a = d / det; + m->b = -b / det; + m->c = -c / det; + m->d = a / det; + m->tx = (c * ty - d * tx) / det; + m->ty = (b * tx - a * ty) / det; + } + } +} + +void cg_matrix_map_point(struct cg_matrix_t * m, struct cg_point_t * p1, struct cg_point_t * p2) +{ + p2->x = p1->x * m->a + p1->y * m->c + m->tx; + p2->y = p1->x * m->b + p1->y * m->d + m->ty; +} + +struct cg_surface_t * cg_surface_create(int width, int height) +{ + struct cg_surface_t * surface = malloc(sizeof(struct cg_surface_t)); + surface->ref = 1; + surface->width = width; + surface->height = height; + surface->stride = width << 2; + surface->owndata = 1; + surface->pixels = calloc(1, (size_t)(height * surface->stride)); + return surface; +} + +struct cg_surface_t * cg_surface_create_for_data(int width, int height, void * pixels) +{ + struct cg_surface_t * surface = malloc(sizeof(struct cg_surface_t)); + surface->ref = 1; + surface->width = width; + surface->height = height; + surface->stride = width << 2; + surface->owndata = 0; + surface->pixels = pixels; + return surface; +} + +void cg_surface_destroy(struct cg_surface_t * surface) +{ + if(surface) + { + if(--surface->ref == 0) + { + if(surface->owndata) + free(surface->pixels); + free(surface); + } + } +} + +struct cg_surface_t * cg_surface_reference(struct cg_surface_t * surface) +{ + if(surface) + { + ++surface->ref; + return surface; + } + return NULL; +} + +static struct cg_path_t * cg_path_create(void) +{ + struct cg_path_t * path = malloc(sizeof(struct cg_path_t)); + path->contours = 0; + path->start.x = 0.0; + path->start.y = 0.0; + cg_array_init(path->elements); + cg_array_init(path->points); + return path; +} + +static void cg_path_destroy(struct cg_path_t * path) +{ + if(path) + { + if(path->elements.data) + free(path->elements.data); + if(path->points.data) + free(path->points.data); + free(path); + } +} + +static inline void cg_path_get_current_point(struct cg_path_t * path, double * x, double * y) +{ + if(path->points.size == 0) + { + *x = 0.0; + *y = 0.0; + } + else + { + *x = path->points.data[path->points.size - 1].x; + *y = path->points.data[path->points.size - 1].y; + } +} + +static void cg_path_move_to(struct cg_path_t * path, double x, double y) +{ + cg_array_ensure(path->elements, 1); + cg_array_ensure(path->points, 1); + + path->elements.data[path->elements.size] = CG_PATH_ELEMENT_MOVE_TO; + path->elements.size += 1; + path->contours += 1; + path->points.data[path->points.size].x = x; + path->points.data[path->points.size].y = y; + path->points.size += 1; + path->start.x = x; + path->start.y = y; +} + +static void cg_path_line_to(struct cg_path_t * path, double x, double y) +{ + cg_array_ensure(path->elements, 1); + cg_array_ensure(path->points, 1); + + path->elements.data[path->elements.size] = CG_PATH_ELEMENT_LINE_TO; + path->elements.size += 1; + path->points.data[path->points.size].x = x; + path->points.data[path->points.size].y = y; + path->points.size += 1; +} + +static void cg_path_curve_to(struct cg_path_t * path, double x1, double y1, double x2, double y2, double x3, double y3) +{ + cg_array_ensure(path->elements, 1); + cg_array_ensure(path->points, 3); + + path->elements.data[path->elements.size] = CG_PATH_ELEMENT_CURVE_TO; + path->elements.size += 1; + struct cg_point_t * points = path->points.data + path->points.size; + points[0].x = x1; + points[0].y = y1; + points[1].x = x2; + points[1].y = y2; + points[2].x = x3; + points[2].y = y3; + path->points.size += 3; +} + +static void cg_path_quad_to(struct cg_path_t * path, double x1, double y1, double x2, double y2) +{ + double x, y; + cg_path_get_current_point(path, &x, &y); + + double cx = 2.0 / 3.0 * x1 + 1.0 / 3.0 * x; + double cy = 2.0 / 3.0 * y1 + 1.0 / 3.0 * y; + double cx1 = 2.0 / 3.0 * x1 + 1.0 / 3.0 * x2; + double cy1 = 2.0 / 3.0 * y1 + 1.0 / 3.0 * y2; + cg_path_curve_to(path, cx, cy, cx1, cy1, x2, y2); +} + +static void cg_path_close(struct cg_path_t * path) +{ + if(path->elements.size == 0) + return; + if(path->elements.data[path->elements.size - 1] == CG_PATH_ELEMENT_CLOSE) + return; + cg_array_ensure(path->elements, 1); + cg_array_ensure(path->points, 1); + path->elements.data[path->elements.size] = CG_PATH_ELEMENT_CLOSE; + path->elements.size += 1; + path->points.data[path->points.size].x = path->start.x; + path->points.data[path->points.size].y = path->start.y; + path->points.size += 1; +} + +static void cg_path_rel_move_to(struct cg_path_t * path, double dx, double dy) +{ + double x, y; + cg_path_get_current_point(path, &x, &y); + cg_path_move_to(path, dx + x, dy + y); +} + +static void cg_path_rel_line_to(struct cg_path_t * path, double dx, double dy) +{ + double x, y; + cg_path_get_current_point(path, &x, &y); + cg_path_line_to(path, dx + x, dy + y); +} + +static void cg_path_rel_curve_to(struct cg_path_t * path, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3) +{ + double x, y; + cg_path_get_current_point(path, &x, &y); + cg_path_curve_to(path, dx1 + x, dy1 + y, dx2 + x, dy2 + y, dx3 + x, dy3 + y); +} + +static void cg_path_rel_quad_to(struct cg_path_t * path, double dx1, double dy1, double dx2, double dy2) +{ + double x, y; + cg_path_get_current_point(path, &x, &y); + cg_path_quad_to(path, dx1 + x, dy1 + y, dx2 + x, dy2 + y); +} + +static inline void cg_path_add_rectangle(struct cg_path_t * path, double x, double y, double w, double h) +{ + cg_path_move_to(path, x, y); + cg_path_line_to(path, x + w, y); + cg_path_line_to(path, x + w, y + h); + cg_path_line_to(path, x, y + h); + cg_path_line_to(path, x, y); + cg_path_close(path); +} + +static inline void cg_path_add_round_rectangle(struct cg_path_t * path, double x, double y, double w, double h, double rx, double ry) +{ + rx = CG_MIN(rx, w * 0.5); + ry = CG_MIN(ry, h * 0.5); + + double right = x + w; + double bottom = y + h; + double cpx = rx * 0.55228474983079339840; + double cpy = ry * 0.55228474983079339840; + + cg_path_move_to(path, x, y + ry); + cg_path_curve_to(path, x, y + ry - cpy, x + rx - cpx, y, x + rx, y); + cg_path_line_to(path, right - rx, y); + cg_path_curve_to(path, right - rx + cpx, y, right, y + ry - cpy, right, y + ry); + cg_path_line_to(path, right, bottom - ry); + cg_path_curve_to(path, right, bottom - ry + cpy, right - rx + cpx, bottom, right - rx, bottom); + cg_path_line_to(path, x + rx, bottom); + cg_path_curve_to(path, x + rx - cpx, bottom, x, bottom - ry + cpy, x, bottom - ry); + cg_path_line_to(path, x, y + ry); + cg_path_close(path); +} + +static void cg_path_add_ellipse(struct cg_path_t * path, double cx, double cy, double rx, double ry) +{ + double left = cx - rx; + double top = cy - ry; + double right = cx + rx; + double bottom = cy + ry; + double cpx = rx * 0.55228474983079339840; + double cpy = ry * 0.55228474983079339840; + + cg_path_move_to(path, cx, top); + cg_path_curve_to(path, cx + cpx, top, right, cy - cpy, right, cy); + cg_path_curve_to(path, right, cy + cpy, cx + cpx, bottom, cx, bottom); + cg_path_curve_to(path, cx - cpx, bottom, left, cy + cpy, left, cy); + cg_path_curve_to(path, left, cy - cpy, cx - cpx, top, cx, top); + cg_path_close(path); +} + +static void cg_path_add_arc(struct cg_path_t * path, double cx, double cy, double r, double a0, double a1, int ccw) +{ + double da = a1 - a0; + if(fabs(da) > 6.28318530717958647693) + { + da = 6.28318530717958647693; + } + else if(da != 0.0 && ccw != (da < 0.0)) + { + da += 6.28318530717958647693 * (ccw ? -1 : 1); + } + int seg_n = (int)(ceil(fabs(da) / 1.57079632679489661923)); + double seg_a = da / seg_n; + double d = (seg_a / 1.57079632679489661923) * 0.55228474983079339840 * r; + double a = a0; + double ax = cx + cos(a) * r; + double ay = cy + sin(a) * r; + double dx = -sin(a) * d; + double dy = cos(a) * d; + if(path->points.size == 0) + cg_path_move_to(path, ax, ay); + else + cg_path_line_to(path, ax, ay); + for(int i = 0; i < seg_n; i++) + { + double cp1x = ax + dx; + double cp1y = ay + dy; + a += seg_a; + ax = cx + cos(a) * r; + ay = cy + sin(a) * r; + dx = -sin(a) * d; + dy = cos(a) * d; + double cp2x = ax - dx; + double cp2y = ay - dy; + cg_path_curve_to(path, cp1x, cp1y, cp2x, cp2y, ax, ay); + } +} + +static inline void cg_path_clear(struct cg_path_t * path) +{ + path->elements.size = 0; + path->points.size = 0; + path->contours = 0; + path->start.x = 0.0; + path->start.y = 0.0; +} + +struct cg_bezier_t { + double x1; double y1; + double x2; double y2; + double x3; double y3; + double x4; double y4; +}; + +static inline void split(struct cg_bezier_t * b, struct cg_bezier_t * first, struct cg_bezier_t * second) +{ + double c = (b->x2 + b->x3) * 0.5; + first->x2 = (b->x1 + b->x2) * 0.5; + second->x3 = (b->x3 + b->x4) * 0.5; + first->x1 = b->x1; + second->x4 = b->x4; + first->x3 = (first->x2 + c) * 0.5; + second->x2 = (second->x3 + c) * 0.5; + first->x4 = second->x1 = (first->x3 + second->x2) * 0.5; + + c = (b->y2 + b->y3) * 0.5; + first->y2 = (b->y1 + b->y2) * 0.5; + second->y3 = (b->y3 + b->y4) * 0.5; + first->y1 = b->y1; + second->y4 = b->y4; + first->y3 = (first->y2 + c) * 0.5; + second->y2 = (second->y3 + c) * 0.5; + first->y4 = second->y1 = (first->y3 + second->y2) * 0.5; +} + +static inline void flatten(struct cg_path_t * path, struct cg_point_t * p0, struct cg_point_t * p1, struct cg_point_t * p2, struct cg_point_t * p3) +{ + struct cg_bezier_t beziers[32]; + struct cg_bezier_t * b = beziers; + + beziers[0].x1 = p0->x; + beziers[0].y1 = p0->y; + beziers[0].x2 = p1->x; + beziers[0].y2 = p1->y; + beziers[0].x3 = p2->x; + beziers[0].y3 = p2->y; + beziers[0].x4 = p3->x; + beziers[0].y4 = p3->y; + while(b >= beziers) + { + double y4y1 = b->y4 - b->y1; + double x4x1 = b->x4 - b->x1; + double l = fabs(x4x1) + fabs(y4y1); + double d; + if(l > 1.0) + { + d = fabs((x4x1) * (b->y1 - b->y2) - (y4y1) * (b->x1 - b->x2)) + fabs((x4x1) * (b->y1 - b->y3) - (y4y1) * (b->x1 - b->x3)); + } + else + { + d = fabs(b->x1 - b->x2) + fabs(b->y1 - b->y2) + fabs(b->x1 - b->x3) + fabs(b->y1 - b->y3); + l = 1.0; + } + if((d < l * 0.25) || (b == beziers + 31)) + { + cg_path_line_to(path, b->x4, b->y4); + --b; + } + else + { + split(b, b + 1, b); + ++b; + } + } +} + +static inline struct cg_path_t * cg_path_clone(const struct cg_path_t * path) +{ + struct cg_path_t * result = cg_path_create(); + cg_array_ensure(result->elements, path->elements.size); + cg_array_ensure(result->points, path->points.size); + + memcpy(result->elements.data, path->elements.data, (size_t)path->elements.size * sizeof(enum cg_path_element_t)); + memcpy(result->points.data, path->points.data, (size_t)path->points.size * sizeof(struct cg_point_t)); + + result->elements.size = path->elements.size; + result->points.size = path->points.size; + result->contours = path->contours; + result->start = path->start; + return result; +} + +static inline struct cg_path_t * cg_path_clone_flat(struct cg_path_t * path) +{ + struct cg_point_t * points = path->points.data; + struct cg_path_t * result = cg_path_create(); + struct cg_point_t p0; + + cg_array_ensure(result->elements, path->elements.size); + cg_array_ensure(result->points, path->points.size); + for(int i = 0; i < path->elements.size; i++) + { + switch(path->elements.data[i]) + { + case CG_PATH_ELEMENT_MOVE_TO: + cg_path_move_to(result, points[0].x, points[0].y); + points += 1; + break; + case CG_PATH_ELEMENT_LINE_TO: + cg_path_line_to(result, points[0].x, points[0].y); + points += 1; + break; + case CG_PATH_ELEMENT_CURVE_TO: + cg_path_get_current_point(result, &p0.x, &p0.y); + flatten(result, &p0, points, points + 1, points + 2); + points += 3; + break; + case CG_PATH_ELEMENT_CLOSE: + cg_path_line_to(result, points[0].x, points[0].y); + points += 1; + break; + default: + break; + } + } + return result; +} + +static struct cg_dash_t * cg_dash_create(double * dashes, int ndash, double offset) +{ + if(dashes && (ndash > 0)) + { + struct cg_dash_t * dash = malloc(sizeof(struct cg_dash_t)); + dash->offset = offset; + dash->data = malloc((size_t)ndash * sizeof(double)); + dash->size = ndash; + memcpy(dash->data, dashes, (size_t)ndash * sizeof(double)); + return dash; + } + return NULL; +} + +static struct cg_dash_t * cg_dash_clone(struct cg_dash_t * dash) +{ + if(dash) + return cg_dash_create(dash->data, dash->size, dash->offset); + return NULL; +} + +static void cg_dash_destroy(struct cg_dash_t * dash) +{ + if(dash) + { + free(dash->data); + free(dash); + } +} + +static inline struct cg_path_t * cg_dash_path(struct cg_dash_t * dash, struct cg_path_t * path) +{ + if((dash->data == NULL) || (dash->size <= 0)) + return cg_path_clone(path); + + int toggle = 1; + int offset = 0; + double phase = dash->offset; + while(phase >= dash->data[offset]) + { + toggle = !toggle; + phase -= dash->data[offset]; + offset += 1; + if(offset == dash->size) + offset = 0; + } + + struct cg_path_t * flat = cg_path_clone_flat(path); + struct cg_path_t * result = cg_path_create(); + cg_array_ensure(result->elements, flat->elements.size); + cg_array_ensure(result->points, flat->points.size); + + enum cg_path_element_t * elements = flat->elements.data; + enum cg_path_element_t * end = elements + flat->elements.size; + struct cg_point_t * points = flat->points.data; + while(elements < end) + { + int itoggle = toggle; + int ioffset = offset; + double iphase = phase; + double x0 = points->x; + double y0 = points->y; + if(itoggle) + cg_path_move_to(result, x0, y0); + ++elements; + ++points; + while((elements < end) && (*elements == CG_PATH_ELEMENT_LINE_TO)) + { + double dx = points->x - x0; + double dy = points->y - y0; + double dist0 = sqrt(dx * dx + dy * dy); + double dist1 = 0; + while(dist0 - dist1 > dash->data[ioffset] - iphase) + { + dist1 += dash->data[ioffset] - iphase; + double a = dist1 / dist0; + double x = x0 + a * dx; + double y = y0 + a * dy; + if(itoggle) + cg_path_line_to(result, x, y); + else + cg_path_move_to(result, x, y); + itoggle = !itoggle; + iphase = 0; + ioffset += 1; + if(ioffset == dash->size) + ioffset = 0; + } + iphase += dist0 - dist1; + x0 = points->x; + y0 = points->y; + if(itoggle) + cg_path_line_to(result, x0, y0); + ++elements; + ++points; + } + } + cg_path_destroy(flat); + return result; +} + +#define ALIGN_SIZE(size) (((size) + 7ul) & ~7ul) +static void ft_outline_init(XCG_FT_Outline * outline, struct cg_ctx_t * ctx, int points, int contours) +{ + size_t size_a = ALIGN_SIZE((points + contours) * sizeof(XCG_FT_Vector)); + size_t size_b = ALIGN_SIZE((points + contours) * sizeof(char)); + size_t size_c = ALIGN_SIZE(contours * sizeof(int)); + size_t size_d = ALIGN_SIZE(contours * sizeof(char)); + size_t size_n = size_a + size_b + size_c + size_d; + if(size_n > ctx->outline_size) + { + ctx->outline_data = realloc(ctx->outline_data, size_n); + ctx->outline_size = size_n; + } + + XCG_FT_Byte * data = ctx->outline_data; + outline->points = (XCG_FT_Vector *)(data); + outline->tags = outline->contours_flag = NULL; + outline->contours = NULL; + if(data) + { + outline->tags = (char *)(data + size_a); + outline->contours = (int *)(data + size_a + size_b); + outline->contours_flag = (char*)(data + size_a + size_b + size_c); + } + outline->n_points = 0; + outline->n_contours = 0; + outline->flags = 0x0; +} + +#define FT_COORD(x) (XCG_FT_Pos)((x) * 64) +static void ft_outline_move_to(XCG_FT_Outline * ft, double x, double y) +{ + ft->points[ft->n_points].x = FT_COORD(x); + ft->points[ft->n_points].y = FT_COORD(y); + ft->tags[ft->n_points] = XCG_FT_CURVE_TAG_ON; + if(ft->n_points) + { + ft->contours[ft->n_contours] = ft->n_points - 1; + ft->n_contours++; + } + ft->contours_flag[ft->n_contours] = 1; + ft->n_points++; +} + +static void ft_outline_line_to(XCG_FT_Outline * ft, double x, double y) +{ + ft->points[ft->n_points].x = FT_COORD(x); + ft->points[ft->n_points].y = FT_COORD(y); + ft->tags[ft->n_points] = XCG_FT_CURVE_TAG_ON; + ft->n_points++; +} + +static void ft_outline_curve_to(XCG_FT_Outline * ft, double x1, double y1, double x2, double y2, double x3, double y3) +{ + ft->points[ft->n_points].x = FT_COORD(x1); + ft->points[ft->n_points].y = FT_COORD(y1); + ft->tags[ft->n_points] = XCG_FT_CURVE_TAG_CUBIC; + ft->n_points++; + + ft->points[ft->n_points].x = FT_COORD(x2); + ft->points[ft->n_points].y = FT_COORD(y2); + ft->tags[ft->n_points] = XCG_FT_CURVE_TAG_CUBIC; + ft->n_points++; + + ft->points[ft->n_points].x = FT_COORD(x3); + ft->points[ft->n_points].y = FT_COORD(y3); + ft->tags[ft->n_points] = XCG_FT_CURVE_TAG_ON; + ft->n_points++; +} + +static void ft_outline_close(XCG_FT_Outline * ft) +{ + ft->contours_flag[ft->n_contours] = 0; + int index = ft->n_contours ? ft->contours[ft->n_contours - 1] + 1 : 0; + if(index == ft->n_points) + return; + + ft->points[ft->n_points].x = ft->points[index].x; + ft->points[ft->n_points].y = ft->points[index].y; + ft->tags[ft->n_points] = XCG_FT_CURVE_TAG_ON; + ft->n_points++; +} + +static void ft_outline_end(XCG_FT_Outline * ft) +{ + if(ft->n_points) + { + ft->contours[ft->n_contours] = ft->n_points - 1; + ft->n_contours++; + } +} + +static void ft_outline_convert(XCG_FT_Outline * outline, struct cg_ctx_t * ctx, struct cg_path_t * path, struct cg_matrix_t * matrix) +{ + ft_outline_init(outline, ctx, path->points.size, path->contours); + enum cg_path_element_t * elements = path->elements.data; + struct cg_point_t * points = path->points.data; + struct cg_point_t p[3]; + for(int i = 0; i < path->elements.size; i++) + { + switch(elements[i]) + { + case CG_PATH_ELEMENT_MOVE_TO: + cg_matrix_map_point(matrix, &points[0], &p[0]); + ft_outline_move_to(outline, p[0].x, p[0].y); + points += 1; + break; + case CG_PATH_ELEMENT_LINE_TO: + cg_matrix_map_point(matrix, &points[0], &p[0]); + ft_outline_line_to(outline, p[0].x, p[0].y); + points += 1; + break; + case CG_PATH_ELEMENT_CURVE_TO: + cg_matrix_map_point(matrix, &points[0], &p[0]); + cg_matrix_map_point(matrix, &points[1], &p[1]); + cg_matrix_map_point(matrix, &points[2], &p[2]); + ft_outline_curve_to(outline, p[0].x, p[0].y, p[1].x, p[1].y, p[2].x, p[2].y); + points += 3; + break; + case CG_PATH_ELEMENT_CLOSE: + ft_outline_close(outline); + points += 1; + break; + } + } + ft_outline_end(outline); +} + +static void ft_outline_convert_dash(XCG_FT_Outline * outline, struct cg_ctx_t * ctx, struct cg_path_t * path, struct cg_matrix_t * matrix, struct cg_dash_t * dash) +{ + struct cg_path_t * dashed = cg_dash_path(dash, path); + ft_outline_convert(outline, ctx, dashed, matrix); + cg_path_destroy(dashed); +} + +static void generation_callback(int count, const XCG_FT_Span * spans, void * user) +{ + struct cg_rle_t * rle = user; + cg_array_ensure(rle->spans, count); + struct cg_span_t * data = rle->spans.data + rle->spans.size; + memcpy(data, spans, (size_t)count * sizeof(struct cg_span_t)); + rle->spans.size += count; +} + +static struct cg_rle_t * cg_rle_create(void) +{ + struct cg_rle_t * rle = malloc(sizeof(struct cg_rle_t)); + cg_array_init(rle->spans); + rle->x = 0; + rle->y = 0; + rle->w = 0; + rle->h = 0; + return rle; +} + +static void cg_rle_destroy(struct cg_rle_t * rle) +{ + if(rle) + { + free(rle->spans.data); + free(rle); + } +} + +static void cg_rle_rasterize(struct cg_ctx_t * ctx, struct cg_rle_t * rle, struct cg_path_t * path, struct cg_matrix_t * m, struct cg_rect_t * clip, struct cg_stroke_data_t * stroke, enum cg_fill_rule_t winding) +{ + XCG_FT_Raster_Params params; + params.flags = XCG_FT_RASTER_FLAG_DIRECT | XCG_FT_RASTER_FLAG_AA; + params.gray_spans = generation_callback; + params.user = rle; + if(clip) + { + params.flags |= XCG_FT_RASTER_FLAG_CLIP; + params.clip_box.xMin = (XCG_FT_Pos)(clip->x); + params.clip_box.yMin = (XCG_FT_Pos)(clip->y); + params.clip_box.xMax = (XCG_FT_Pos)(clip->x + clip->w); + params.clip_box.yMax = (XCG_FT_Pos)(clip->y + clip->h); + } + if(stroke) + { + XCG_FT_Outline outline; + if(stroke->dash == NULL) + ft_outline_convert(&outline, ctx, path, m); + else + ft_outline_convert_dash(&outline, ctx, path, m, stroke->dash); + XCG_FT_Stroker_LineCap ftCap; + XCG_FT_Stroker_LineJoin ftJoin; + XCG_FT_Fixed ftWidth; + XCG_FT_Fixed ftMiterLimit; + + struct cg_point_t p1 = { 0, 0 }; + struct cg_point_t p2 = { 1.41421356237309504880, 1.41421356237309504880 }; + struct cg_point_t p3; + + cg_matrix_map_point(m, &p1, &p1); + cg_matrix_map_point(m, &p2, &p2); + + p3.x = p2.x - p1.x; + p3.y = p2.y - p1.y; + + double scale = sqrt(p3.x * p3.x + p3.y * p3.y) / 2.0; + + ftWidth = (XCG_FT_Fixed)(stroke->width * scale * 0.5 * (1 << 6)); + ftMiterLimit = (XCG_FT_Fixed)(stroke->miterlimit * (1 << 16)); + + switch(stroke->cap) + { + case CG_LINE_CAP_SQUARE: + ftCap = XCG_FT_STROKER_LINECAP_SQUARE; + break; + case CG_LINE_CAP_ROUND: + ftCap = XCG_FT_STROKER_LINECAP_ROUND; + break; + default: + ftCap = XCG_FT_STROKER_LINECAP_BUTT; + break; + } + switch(stroke->join) + { + case CG_LINE_JOIN_BEVEL: + ftJoin = XCG_FT_STROKER_LINEJOIN_BEVEL; + break; + case CG_LINE_JOIN_ROUND: + ftJoin = XCG_FT_STROKER_LINEJOIN_ROUND; + break; + default: + ftJoin = XCG_FT_STROKER_LINEJOIN_MITER_FIXED; + break; + } + XCG_FT_Stroker stroker; + XCG_FT_Stroker_New(&stroker); + XCG_FT_Stroker_Set(stroker, ftWidth, ftCap, ftJoin, ftMiterLimit); + XCG_FT_Stroker_ParseOutline(stroker, &outline); + + XCG_FT_UInt points; + XCG_FT_UInt contours; + XCG_FT_Stroker_GetCounts(stroker, &points, &contours); + + ft_outline_init(&outline, ctx, points, contours); + XCG_FT_Stroker_Export(stroker, &outline); + XCG_FT_Stroker_Done(stroker); + + outline.flags = XCG_FT_OUTLINE_NONE; + params.source = &outline; + XCG_FT_Raster_Render(¶ms); + } + else + { + XCG_FT_Outline outline; + ft_outline_convert(&outline, ctx, path, m); + switch(winding) + { + case CG_FILL_RULE_EVEN_ODD: + outline.flags = XCG_FT_OUTLINE_EVEN_ODD_FILL; + break; + default: + outline.flags = XCG_FT_OUTLINE_NONE; + break; + } + + params.source = &outline; + XCG_FT_Raster_Render(¶ms); + } + + if(rle->spans.size == 0) + { + rle->x = 0; + rle->y = 0; + rle->w = 0; + rle->h = 0; + return; + } + + struct cg_span_t *spans = rle->spans.data; + int x1 = INT_MAX; + int y1 = spans[0].y; + int x2 = 0; + int y2 = spans[rle->spans.size - 1].y; + for(int i = 0; i < rle->spans.size; i++) + { + if(spans[i].x < x1) + x1 = spans[i].x; + if(spans[i].x + spans[i].len > x2) + x2 = spans[i].x + spans[i].len; + } + + rle->x = x1; + rle->y = y1; + rle->w = x2 - x1; + rle->h = y2 - y1 + 1; +} + +static struct cg_rle_t * cg_rle_intersection(struct cg_rle_t * a, struct cg_rle_t * b) +{ + struct cg_rle_t * result = malloc(sizeof(struct cg_rle_t)); + cg_array_init(result->spans); + cg_array_ensure(result->spans, CG_MAX(a->spans.size, b->spans.size)); + + struct cg_span_t * a_spans = a->spans.data; + struct cg_span_t * a_end = a_spans + a->spans.size; + struct cg_span_t * b_spans = b->spans.data; + struct cg_span_t * b_end = b_spans + b->spans.size; + while((a_spans < a_end) && (b_spans < b_end)) + { + if(b_spans->y > a_spans->y) + { + ++a_spans; + continue; + } + if(a_spans->y != b_spans->y) + { + ++b_spans; + continue; + } + int ax1 = a_spans->x; + int ax2 = ax1 + a_spans->len; + int bx1 = b_spans->x; + int bx2 = bx1 + b_spans->len; + if(bx1 < ax1 && bx2 < ax1) + { + ++b_spans; + continue; + } + else if(ax1 < bx1 && ax2 < bx1) + { + ++a_spans; + continue; + } + int x = CG_MAX(ax1, bx1); + int len = CG_MIN(ax2, bx2) - x; + if(len) + { + struct cg_span_t * span = result->spans.data + result->spans.size; + span->x = x; + span->len = len; + span->y = a_spans->y; + span->coverage = CG_DIV255(a_spans->coverage * b_spans->coverage); + result->spans.size += 1; + } + if(ax2 < bx2) + { + ++a_spans; + } + else + { + ++b_spans; + } + } + if(result->spans.size == 0) + { + result->x = 0; + result->y = 0; + result->w = 0; + result->h = 0; + return result; + } + struct cg_span_t * spans = result->spans.data; + int x1 = INT_MAX; + int y1 = spans[0].y; + int x2 = 0; + int y2 = spans[result->spans.size - 1].y; + for(int i = 0; i < result->spans.size; i++) + { + if(spans[i].x < x1) + x1 = spans[i].x; + if(spans[i].x + spans[i].len > x2) + x2 = spans[i].x + spans[i].len; + } + result->x = x1; + result->y = y1; + result->w = x2 - x1; + result->h = y2 - y1 + 1; + + return result; +} + +static void cg_rle_clip_path(struct cg_rle_t * rle, struct cg_rle_t * clip) +{ + if(rle && clip) + { + struct cg_rle_t * result = cg_rle_intersection(rle, clip); + cg_array_ensure(rle->spans, result->spans.size); + memcpy(rle->spans.data, result->spans.data, (size_t)result->spans.size * sizeof(struct cg_span_t)); + rle->spans.size = result->spans.size; + rle->x = result->x; + rle->y = result->y; + rle->w = result->w; + rle->h = result->h; + cg_rle_destroy(result); + } +} + +static struct cg_rle_t * cg_rle_clone(struct cg_rle_t * rle) +{ + if(rle) + { + struct cg_rle_t * result = malloc(sizeof(struct cg_rle_t)); + cg_array_init(result->spans); + cg_array_ensure(result->spans, rle->spans.size); + memcpy(result->spans.data, rle->spans.data, (size_t)rle->spans.size * sizeof(struct cg_span_t)); + result->spans.size = rle->spans.size; + result->x = rle->x; + result->y = rle->y; + result->w = rle->w; + result->h = rle->h; + return result; + } + return NULL; +} + +static inline void cg_rle_clear(struct cg_rle_t * rle) +{ + rle->spans.size = 0; + rle->x = 0; + rle->y = 0; + rle->w = 0; + rle->h = 0; +} + +static void cg_gradient_init_linear(struct cg_gradient_t * gradient, double x1, double y1, double x2, double y2) +{ + gradient->type = CG_GRADIENT_TYPE_LINEAR; + gradient->spread = CG_SPREAD_METHOD_PAD; + gradient->opacity = 1.0; + gradient->stops.size = 0; + cg_matrix_init_identity(&gradient->matrix); + cg_gradient_set_values_linear(gradient, x1, y1, x2, y2); +} + +static void cg_gradient_init_radial(struct cg_gradient_t * gradient, double cx, double cy, double cr, double fx, double fy, double fr) +{ + gradient->type = CG_GRADIENT_TYPE_RADIAL; + gradient->spread = CG_SPREAD_METHOD_PAD; + gradient->opacity = 1.0; + gradient->stops.size = 0; + cg_matrix_init_identity(&gradient->matrix); + cg_gradient_set_values_radial(gradient, cx, cy, cr, fx, fy, fr); +} + +void cg_gradient_set_values_linear(struct cg_gradient_t * gradient, double x1, double y1, double x2, double y2) +{ + gradient->values[0] = x1; + gradient->values[1] = y1; + gradient->values[2] = x2; + gradient->values[3] = y2; +} + +void cg_gradient_set_values_radial(struct cg_gradient_t * gradient, double cx, double cy, double cr, double fx, double fy, double fr) +{ + gradient->values[0] = cx; + gradient->values[1] = cy; + gradient->values[2] = cr; + gradient->values[3] = fx; + gradient->values[4] = fy; + gradient->values[5] = fr; +} + +void cg_gradient_set_spread(struct cg_gradient_t * gradient, enum cg_spread_method_t spread) +{ + gradient->spread = spread; +} + +void cg_gradient_set_matrix(struct cg_gradient_t * gradient, struct cg_matrix_t * m) +{ + memcpy(&gradient->matrix, m, sizeof(struct cg_matrix_t)); +} + +void cg_gradient_set_opacity(struct cg_gradient_t * gradient, double opacity) +{ + gradient->opacity = CG_CLAMP(opacity, 0.0, 1.0); +} + +void cg_gradient_add_stop_rgb(struct cg_gradient_t * gradient, double offset, double r, double g, double b) +{ + cg_gradient_add_stop_rgba(gradient, offset, r, g, b, 1.0); +} + +void cg_gradient_add_stop_rgba(struct cg_gradient_t * gradient, double offset, double r, double g, double b, double a) +{ + if(offset < 0.0) + offset = 0.0; + if(offset > 1.0) + offset = 1.0; + cg_array_ensure(gradient->stops, 1); + struct cg_gradient_stop_t * stops = gradient->stops.data; + int nstops = gradient->stops.size; + int i; + for(i = 0; i < nstops; i++) + { + if(offset < stops[i].offset) + { + memmove(&stops[i + 1], &stops[i], (size_t)(nstops - i) * sizeof(struct cg_gradient_stop_t)); + break; + } + } + struct cg_gradient_stop_t * stop = &stops[i]; + stop->offset = offset; + cg_color_init_rgba(&stop->color, r, g, b, a); + gradient->stops.size += 1; +} + +void cg_gradient_add_stop_color(struct cg_gradient_t * gradient, double offset, struct cg_color_t * color) +{ + cg_gradient_add_stop_rgba(gradient, offset, color->r, color->g, color->b, color->a); +} + +void cg_gradient_add_stop(struct cg_gradient_t * gradient, struct cg_gradient_stop_t * stop) +{ + cg_gradient_add_stop_rgba(gradient, stop->offset, stop->color.r, stop->color.g, stop->color.b, stop->color.a); +} + +void cg_gradient_clear_stops(struct cg_gradient_t * gradient) +{ + gradient->stops.size = 0; +} + +static void cg_gradient_copy(struct cg_gradient_t * gradient, struct cg_gradient_t * source) +{ + gradient->type = source->type; + gradient->spread = source->spread; + gradient->matrix = source->matrix; + gradient->opacity = source->opacity; + cg_array_ensure(gradient->stops, source->stops.size); + memcpy(gradient->values, source->values, sizeof(source->values)); + memcpy(gradient->stops.data, source->stops.data, source->stops.size * sizeof(struct cg_gradient_stop_t)); +} + +static void cg_gradient_destroy(struct cg_gradient_t * gradient) +{ + if(gradient->stops.data) + free(gradient->stops.data); +} + +static void cg_texture_init(struct cg_texture_t * texture, struct cg_surface_t * surface, enum cg_texture_type_t type) +{ + surface = cg_surface_reference(surface); + cg_surface_destroy(texture->surface); + texture->type = type; + texture->surface = surface; + texture->opacity = 1.0; + cg_matrix_init_identity(&texture->matrix); +} + +void cg_texture_set_type(struct cg_texture_t * texture, enum cg_texture_type_t type) +{ + texture->type = type; +} + +void cg_texture_set_matrix(struct cg_texture_t * texture, struct cg_matrix_t * m) +{ + memcpy(&texture->matrix, m, sizeof(struct cg_matrix_t)); +} + +void cg_texture_set_surface(struct cg_texture_t * texture, struct cg_surface_t * surface) +{ + surface = cg_surface_reference(surface); + cg_surface_destroy(texture->surface); + texture->surface = surface; +} + +void cg_texture_set_opacity(struct cg_texture_t * texture, double opacity) +{ + texture->opacity = CG_CLAMP(opacity, 0.0, 1.0); +} + +static void cg_texture_copy(struct cg_texture_t * texture, struct cg_texture_t * source) +{ + struct cg_surface_t * surface = cg_surface_reference(source->surface); + cg_surface_destroy(texture->surface); + texture->type = source->type; + texture->surface = surface; + texture->opacity = source->opacity; + texture->matrix = source->matrix; +} + +static void cg_texture_destroy(struct cg_texture_t * texture) +{ + cg_surface_destroy(texture->surface); +} + +static void cg_paint_init(struct cg_paint_t * paint) +{ + paint->type = CG_PAINT_TYPE_COLOR; + paint->texture.surface = NULL; + cg_array_init(paint->gradient.stops); + cg_color_init_rgba(&paint->color, 0, 0, 0, 1.0); +} + +static void cg_paint_destroy(struct cg_paint_t * paint) +{ + cg_texture_destroy(&paint->texture); + cg_gradient_destroy(&paint->gradient); +} + +static void cg_paint_copy(struct cg_paint_t * paint, struct cg_paint_t * source) +{ + paint->type = source->type; + switch(source->type) + { + case CG_PAINT_TYPE_COLOR: + paint->color = source->color; + break; + case CG_PAINT_TYPE_GRADIENT: + cg_gradient_copy(&paint->gradient, &source->gradient); + break; + case CG_PAINT_TYPE_TEXTURE: + cg_texture_copy(&paint->texture, &source->texture); + break; + default: + break; + } +} + +struct cg_gradient_data_t { + enum cg_spread_method_t spread; + struct cg_matrix_t matrix; + uint32_t colortable[1024]; + union { + struct { + double x1, y1; + double x2, y2; + } linear; + struct { + double cx, cy, cr; + double fx, fy, fr; + } radial; + }; +}; + +struct cg_texture_data_t { + struct cg_matrix_t matrix; + int width; + int height; + int stride; + int alpha; + void * pixels; +}; + +struct cg_linear_gradient_values_t { + double dx; + double dy; + double l; + double off; +}; + +struct cg_radial_gradient_values_t { + double dx; + double dy; + double dr; + double sqrfr; + double a; + double inv2a; + int extended; +}; + +static inline uint32_t premultiply_color(struct cg_color_t * color, double opacity) +{ + uint32_t alpha = (uint8_t)(color->a * opacity * 255); + uint32_t pr = (uint8_t)(color->r * alpha); + uint32_t pg = (uint8_t)(color->g * alpha); + uint32_t pb = (uint8_t)(color->b * alpha); + return (alpha << 24) | (pr << 16) | (pg << 8) | (pb); +} + +static inline uint32_t combine_opacity(struct cg_color_t * color, double opacity) +{ + uint32_t a = (uint8_t)(color->a * opacity * 255); + uint32_t r = (uint8_t)(color->r * 255); + uint32_t g = (uint8_t)(color->g * 255); + uint32_t b = (uint8_t)(color->b * 255); + return (a << 24) | (r << 16) | (g << 8) | (b); +} + +static inline uint32_t premultiply_pixel(uint32_t color) +{ + uint32_t a = CG_ALPHA(color); + uint32_t r = (color >> 16) & 0xff; + uint32_t g = (color >> 8) & 0xff; + uint32_t b = (color >> 0) & 0xff; + uint32_t pr = (r * a) / 255; + uint32_t pg = (g * a) / 255; + uint32_t pb = (b * a) / 255; + return (a << 24) | (pr << 16) | (pg << 8) | (pb); +} + +static inline uint32_t interpolate_pixel(uint32_t x, uint32_t a, uint32_t y, uint32_t b) +{ + uint32_t t = (x & 0xff00ff) * a + (y & 0xff00ff) * b; + t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8; + t &= 0xff00ff; + x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b; + x = (x + ((x >> 8) & 0xff00ff) + 0x800080); + x &= 0xff00ff00; + x |= t; + return x; +} + +static void __cg_memfill32(uint32_t * dst, uint32_t val, int len) +{ + for(int i = 0; i < len; i++) + dst[i] = val; +} +extern __typeof(__cg_memfill32) cg_memfill32 __attribute__((weak, alias("__cg_memfill32"))); + +static inline int gradient_clamp(struct cg_gradient_data_t * gradient, int ipos) +{ + switch(gradient->spread) + { + case CG_SPREAD_METHOD_PAD: + if(ipos < 0) + ipos = 0; + else if(ipos >= 1024) + ipos = 1024 - 1; + break; + case CG_SPREAD_METHOD_REFLECT: + ipos = ipos % 2048; + ipos = ipos < 0 ? 2048 + ipos : ipos; + ipos = ipos >= 1024 ? 2048 - 1 - ipos : ipos; + break; + case CG_SPREAD_METHOD_REPEAT: + ipos = ipos % 1024; + ipos = ipos < 0 ? 1024 + ipos : ipos; + break; + default: + break; + } + return ipos; +} + +#define FIXPT_BITS (8) +#define FIXPT_SIZE (1 << FIXPT_BITS) + +static inline uint32_t gradient_pixel_fixed(struct cg_gradient_data_t * gradient, int fixed_pos) +{ + int ipos = (fixed_pos + (FIXPT_SIZE / 2)) >> FIXPT_BITS; + return gradient->colortable[gradient_clamp(gradient, ipos)]; +} + +static inline uint32_t gradient_pixel(struct cg_gradient_data_t * gradient, double pos) +{ + int ipos = (int)(pos * (1024 - 1) + 0.5); + return gradient->colortable[gradient_clamp(gradient, ipos)]; +} + +static inline void fetch_linear_gradient(uint32_t * buffer, struct cg_linear_gradient_values_t * v, struct cg_gradient_data_t * gradient, int y, int x, int length) +{ + double t, inc; + double rx = 0, ry = 0; + + if(v->l == 0.0) + { + t = inc = 0; + } + else + { + rx = gradient->matrix.c * (y + 0.5) + gradient->matrix.a * (x + 0.5) + gradient->matrix.tx; + ry = gradient->matrix.d * (y + 0.5) + gradient->matrix.b * (x + 0.5) + gradient->matrix.ty; + t = v->dx * rx + v->dy * ry + v->off; + inc = v->dx * gradient->matrix.a + v->dy * gradient->matrix.b; + t *= (1024 - 1); + inc *= (1024 - 1); + } + uint32_t * end = buffer + length; + if((inc > -1e-5) && (inc < 1e-5)) + { + cg_memfill32(buffer, gradient_pixel_fixed(gradient, (int)(t * FIXPT_SIZE)), length); + } + else + { + if(t + inc * length < (double)(INT_MAX >> (FIXPT_BITS + 1)) && t + inc * length > (double)(INT_MIN >> (FIXPT_BITS + 1))) + { + int t_fixed = (int)(t * FIXPT_SIZE); + int inc_fixed = (int)(inc * FIXPT_SIZE); + while(buffer < end) + { + *buffer = gradient_pixel_fixed(gradient, t_fixed); + t_fixed += inc_fixed; + ++buffer; + } + } + else + { + while(buffer < end) + { + *buffer = gradient_pixel(gradient, t / 1024); + t += inc; + ++buffer; + } + } + } +} + +static inline void fetch_radial_gradient(uint32_t * buffer, struct cg_radial_gradient_values_t * v, struct cg_gradient_data_t * gradient, int y, int x, int length) +{ + if(v->a == 0.0) + { + cg_memfill32(buffer, 0, length); + return; + } + + double rx = gradient->matrix.c * (y + 0.5) + gradient->matrix.tx + gradient->matrix.a * (x + 0.5); + double ry = gradient->matrix.d * (y + 0.5) + gradient->matrix.ty + gradient->matrix.b * (x + 0.5); + rx -= gradient->radial.fx; + ry -= gradient->radial.fy; + + double inv_a = 1.0 / (2.0 * v->a); + double delta_rx = gradient->matrix.a; + double delta_ry = gradient->matrix.b; + + double b = 2 * (v->dr * gradient->radial.fr + rx * v->dx + ry * v->dy); + double delta_b = 2 * (delta_rx * v->dx + delta_ry * v->dy); + double b_delta_b = 2 * b * delta_b; + double delta_b_delta_b = 2 * delta_b * delta_b; + + double bb = b * b; + double delta_bb = delta_b * delta_b; + + b *= inv_a; + delta_b *= inv_a; + + double rxrxryry = rx * rx + ry * ry; + double delta_rxrxryry = delta_rx * delta_rx + delta_ry * delta_ry; + double rx_plus_ry = 2 * (rx * delta_rx + ry * delta_ry); + double delta_rx_plus_ry = 2 * delta_rxrxryry; + + inv_a *= inv_a; + + double det = (bb - 4 * v->a * (v->sqrfr - rxrxryry)) * inv_a; + double delta_det = (b_delta_b + delta_bb + 4 * v->a * (rx_plus_ry + delta_rxrxryry)) * inv_a; + double delta_delta_det = (delta_b_delta_b + 4 * v->a * delta_rx_plus_ry) * inv_a; + + uint32_t * end = buffer + length; + if(v->extended) + { + while(buffer < end) + { + uint32_t result = 0; + det = fabs(det) < DBL_EPSILON ? 0.0 : det; + if(det >= 0) + { + double w = sqrt(det) - b; + if(gradient->radial.fr + v->dr * w >= 0) + result = gradient_pixel(gradient, w); + } + *buffer = result; + det += delta_det; + delta_det += delta_delta_det; + b += delta_b; + ++buffer; + } + } + else + { + while(buffer < end) + { + det = fabs(det) < DBL_EPSILON ? 0.0 : det; + uint32_t result = 0; + if(det >= 0) + result = gradient_pixel(gradient, sqrt(det) - b); + *buffer++ = result; + det += delta_det; + delta_det += delta_delta_det; + b += delta_b; + } + } +} + +static void __cg_comp_solid_source(uint32_t * dst, int len, uint32_t color, uint32_t alpha) +{ + if(alpha == 255) + { + cg_memfill32(dst, color, len); + } + else + { + uint32_t ialpha = 255 - alpha; + color = CG_BYTE_MUL(color, alpha); + for(int i = 0; i < len; i++) + dst[i] = color + CG_BYTE_MUL(dst[i], ialpha); + } +} +extern __typeof(__cg_comp_solid_source) cg_comp_solid_source __attribute__((weak, alias("__cg_comp_solid_source"))); + +static void __cg_comp_solid_source_over(uint32_t * dst, int len, uint32_t color, uint32_t alpha) +{ + if((alpha & CG_ALPHA(color)) == 255) + { + cg_memfill32(dst, color, len); + } + else + { + if(alpha != 255) + color = CG_BYTE_MUL(color, alpha); + uint32_t ialpha = 255 - CG_ALPHA(color); + for(int i = 0; i < len; i++) + dst[i] = color + CG_BYTE_MUL(dst[i], ialpha); + } +} +extern __typeof(__cg_comp_solid_source_over) cg_comp_solid_source_over __attribute__((weak, alias("__cg_comp_solid_source_over"))); + +static void __cg_comp_solid_destination_in(uint32_t * dst, int len, uint32_t color, uint32_t alpha) +{ + uint32_t a = CG_ALPHA(color); + if(alpha != 255) + a = CG_BYTE_MUL(a, alpha) + 255 - alpha; + for(int i = 0; i < len; i++) + dst[i] = CG_BYTE_MUL(dst[i], a); +} +extern __typeof(__cg_comp_solid_destination_in) cg_comp_solid_destination_in __attribute__((weak, alias("__cg_comp_solid_destination_in"))); + +static void __cg_comp_solid_destination_out(uint32_t * dst, int len, uint32_t color, uint32_t alpha) +{ + uint32_t a = CG_ALPHA(~color); + if(alpha != 255) + a = CG_BYTE_MUL(a, alpha) + 255 - alpha; + for(int i = 0; i < len; i++) + dst[i] = CG_BYTE_MUL(dst[i], a); +} +extern __typeof(__cg_comp_solid_destination_out) cg_comp_solid_destination_out __attribute__((weak, alias("__cg_comp_solid_destination_out"))); + +static void __cg_comp_source(uint32_t * dst, int len, uint32_t * src, uint32_t alpha) +{ + if(alpha == 255) + { + memcpy(dst, src, (size_t)(len) * sizeof(uint32_t)); + } + else + { + uint32_t ialpha = 255 - alpha; + for(int i = 0; i < len; i++) + dst[i] = interpolate_pixel(src[i], alpha, dst[i], ialpha); + } +} +extern __typeof(__cg_comp_source) cg_comp_source __attribute__((weak, alias("__cg_comp_source"))); + +static void __cg_comp_source_over(uint32_t * dst, int len, uint32_t * src, uint32_t alpha) +{ + uint32_t s, sia; + if(alpha == 255) + { + for(int i = 0; i < len; i++) + { + s = src[i]; + if(s >= 0xff000000) + dst[i] = s; + else if(s != 0) + { + sia = CG_ALPHA(~s); + dst[i] = s + CG_BYTE_MUL(dst[i], sia); + } + } + } + else + { + for(int i = 0; i < len; i++) + { + s = CG_BYTE_MUL(src[i], alpha); + sia = CG_ALPHA(~s); + dst[i] = s + CG_BYTE_MUL(dst[i], sia); + } + } +} +extern __typeof(__cg_comp_source_over) cg_comp_source_over __attribute__((weak, alias("__cg_comp_source_over"))); + +static void __cg_comp_destination_in(uint32_t * dst, int len, uint32_t * src, uint32_t alpha) +{ + if(alpha == 255) + { + for(int i = 0; i < len; i++) + dst[i] = CG_BYTE_MUL(dst[i], CG_ALPHA(src[i])); + } + else + { + uint32_t cia = 255 - alpha; + uint32_t a; + for(int i = 0; i < len; i++) + { + a = CG_BYTE_MUL(CG_ALPHA(src[i]), alpha) + cia; + dst[i] = CG_BYTE_MUL(dst[i], a); + } + } +} +extern __typeof(__cg_comp_destination_in) cg_comp_destination_in __attribute__((weak, alias("__cg_comp_destination_in"))); + +static void __cg_comp_destination_out(uint32_t * dst, int len, uint32_t * src, uint32_t alpha) +{ + if(alpha == 255) + { + for(int i = 0; i < len; i++) + dst[i] = CG_BYTE_MUL(dst[i], CG_ALPHA(~src[i])); + } + else + { + uint32_t cia = 255 - alpha; + uint32_t sia; + for(int i = 0; i < len; i++) + { + sia = CG_BYTE_MUL(CG_ALPHA(~src[i]), alpha) + cia; + dst[i] = CG_BYTE_MUL(dst[i], sia); + } + } +} +extern __typeof(__cg_comp_destination_out) cg_comp_destination_out __attribute__((weak, alias("__cg_comp_destination_out"))); + +typedef void (*cg_comp_solid_function_t)(uint32_t * dst, int len, uint32_t color, uint32_t alpha); +static const cg_comp_solid_function_t cg_comp_solid_map[] = { + cg_comp_solid_source, + cg_comp_solid_source_over, + cg_comp_solid_destination_in, + cg_comp_solid_destination_out, +}; + +typedef void (*cg_comp_function_t)(uint32_t * dst, int len, uint32_t * src, uint32_t alpha); +static const cg_comp_function_t cg_comp_map[] = { + cg_comp_source, + cg_comp_source_over, + cg_comp_destination_in, + cg_comp_destination_out, +}; + +static inline void blend_solid(struct cg_surface_t * surface, enum cg_operator_t op, struct cg_rle_t * rle, uint32_t solid) +{ + cg_comp_solid_function_t func = cg_comp_solid_map[op]; + int count = rle->spans.size; + struct cg_span_t * spans = rle->spans.data; + while(count--) + { + uint32_t * target = (uint32_t *)(surface->pixels + spans->y * surface->stride) + spans->x; + func(target, spans->len, solid, spans->coverage); + ++spans; + } +} + +static inline void blend_linear_gradient(struct cg_surface_t * surface, enum cg_operator_t op, struct cg_rle_t * rle, struct cg_gradient_data_t * gradient) +{ + cg_comp_function_t func = cg_comp_map[op]; + unsigned int buffer[1024]; + + struct cg_linear_gradient_values_t v; + v.dx = gradient->linear.x2 - gradient->linear.x1; + v.dy = gradient->linear.y2 - gradient->linear.y1; + v.l = v.dx * v.dx + v.dy * v.dy; + v.off = 0.0; + if(v.l != 0.0) + { + v.dx /= v.l; + v.dy /= v.l; + v.off = -v.dx * gradient->linear.x1 - v.dy * gradient->linear.y1; + } + + int count = rle->spans.size; + struct cg_span_t * spans = rle->spans.data; + while(count--) + { + int length = spans->len; + int x = spans->x; + while(length) + { + int l = CG_MIN(length, 1024); + fetch_linear_gradient(buffer, &v, gradient, spans->y, x, l); + uint32_t * target = (uint32_t *)(surface->pixels + spans->y * surface->stride) + x; + func(target, l, buffer, spans->coverage); + x += l; + length -= l; + } + ++spans; + } +} + +static inline void blend_radial_gradient(struct cg_surface_t * surface, enum cg_operator_t op, struct cg_rle_t * rle, struct cg_gradient_data_t * gradient) +{ + cg_comp_function_t func = cg_comp_map[op]; + unsigned int buffer[1024]; + + struct cg_radial_gradient_values_t v; + v.dx = gradient->radial.cx - gradient->radial.fx; + v.dy = gradient->radial.cy - gradient->radial.fy; + v.dr = gradient->radial.cr - gradient->radial.fr; + v.sqrfr = gradient->radial.fr * gradient->radial.fr; + v.a = v.dr * v.dr - v.dx * v.dx - v.dy * v.dy; + v.inv2a = 1.0 / (2.0 * v.a); + v.extended = gradient->radial.fr != 0.0 || v.a <= 0.0; + + int count = rle->spans.size; + struct cg_span_t * spans = rle->spans.data; + while(count--) + { + int length = spans->len; + int x = spans->x; + while(length) + { + int l = CG_MIN(length, 1024); + fetch_radial_gradient(buffer, &v, gradient, spans->y, x, l); + uint32_t * target = (uint32_t *)(surface->pixels + spans->y * surface->stride) + x; + func(target, l, buffer, spans->coverage); + x += l; + length -= l; + } + ++spans; + } +} + +#define FIXED_SCALE (1 << 16) +static inline void blend_untransformed_argb(struct cg_surface_t * surface, enum cg_operator_t op, struct cg_rle_t * rle, struct cg_texture_data_t * texture) +{ + cg_comp_function_t func = cg_comp_map[op]; + + int image_width = texture->width; + int image_height = texture->height; + int xoff = (int)(texture->matrix.tx); + int yoff = (int)(texture->matrix.ty); + int count = rle->spans.size; + struct cg_span_t * spans = rle->spans.data; + while(count--) + { + int x = spans->x; + int length = spans->len; + int sx = xoff + x; + int sy = yoff + spans->y; + if(sy >= 0 && sy < image_height && sx < image_width) + { + if(sx < 0) + { + x -= sx; + length += sx; + sx = 0; + } + if(sx + length > image_width) + length = image_width - sx; + if(length > 0) + { + int coverage = (spans->coverage * texture->alpha) >> 8; + uint32_t * src = (uint32_t *)(texture->pixels + sy * texture->stride) + sx; + uint32_t * dst = (uint32_t *)(surface->pixels + spans->y * surface->stride) + x; + func(dst, length, src, coverage); + } + } + ++spans; + } +} + +static inline void blend_transformed_argb(struct cg_surface_t * surface, enum cg_operator_t op, struct cg_rle_t * rle, struct cg_texture_data_t * texture) +{ + cg_comp_function_t func = cg_comp_map[op]; + uint32_t buffer[1024]; + + int image_width = texture->width; + int image_height = texture->height; + int fdx = (int)(texture->matrix.a * FIXED_SCALE); + int fdy = (int)(texture->matrix.b * FIXED_SCALE); + int count = rle->spans.size; + struct cg_span_t * spans = rle->spans.data; + while(count--) + { + uint32_t * target = (uint32_t *)(surface->pixels + spans->y * surface->stride) + spans->x; + double cx = spans->x + 0.5; + double cy = spans->y + 0.5; + int x = (int)((texture->matrix.c * cy + texture->matrix.a * cx + texture->matrix.tx) * FIXED_SCALE); + int y = (int)((texture->matrix.d * cy + texture->matrix.b * cx + texture->matrix.ty) * FIXED_SCALE); + int length = spans->len; + int coverage = (spans->coverage * texture->alpha) >> 8; + while(length) + { + int l = CG_MIN(length, 1024); + uint32_t * end = buffer + l; + uint32_t * b = buffer; + int start = 0; + int clen = 0; + while(b < end) + { + int px = x >> 16; + int py = y >> 16; + if(((unsigned int)px < (unsigned int)image_width) && ((unsigned int)py < (unsigned int)image_height)) + { + *b = ((uint32_t *)(texture->pixels + py * texture->stride))[px]; + clen++; + } + x += fdx; + y += fdy; + ++b; + if(clen == 0) + start++; + } + func(target + start, clen, buffer + start, coverage); + target += l; + length -= l; + } + ++spans; + } +} + +static inline void blend_untransformed_tiled_argb(struct cg_surface_t * surface, enum cg_operator_t op, struct cg_rle_t * rle, struct cg_texture_data_t * texture) +{ + cg_comp_function_t func = cg_comp_map[op]; + + int image_width = texture->width; + int image_height = texture->height; + int xoff = (int)(texture->matrix.tx) % image_width; + int yoff = (int)(texture->matrix.ty) % image_height; + if(xoff < 0) + xoff += image_width; + if(yoff < 0) + yoff += image_height; + int count = rle->spans.size; + struct cg_span_t * spans = rle->spans.data; + while(count--) + { + int x = spans->x; + int length = spans->len; + int sx = (xoff + spans->x) % image_width; + int sy = (spans->y + yoff) % image_height; + if(sx < 0) + sx += image_width; + if(sy < 0) + sy += image_height; + int coverage = (spans->coverage * texture->alpha) >> 8; + while(length) + { + int l = CG_MIN(image_width - sx, length); + if(1024 < l) + l = 1024; + uint32_t * src = (uint32_t *)(texture->pixels + sy * texture->stride) + sx; + uint32_t * dst = (uint32_t *)(surface->pixels + spans->y * surface->stride) + x; + func(dst, l, src, coverage); + x += l; + length -= l; + sx = 0; + } + ++spans; + } +} + +static inline void blend_transformed_tiled_argb(struct cg_surface_t * surface, enum cg_operator_t op, struct cg_rle_t * rle, struct cg_texture_data_t * texture) +{ + cg_comp_function_t func = cg_comp_map[op]; + uint32_t buffer[1024]; + + int image_width = texture->width; + int image_height = texture->height; + int scanline_offset = texture->stride / 4; + int fdx = (int)(texture->matrix.a * FIXED_SCALE); + int fdy = (int)(texture->matrix.b * FIXED_SCALE); + int count = rle->spans.size; + struct cg_span_t * spans = rle->spans.data; + while(count--) + { + uint32_t * target = (uint32_t *)(surface->pixels + spans->y * surface->stride) + spans->x; + uint32_t * image_bits = (uint32_t *)texture->pixels; + double cx = spans->x + 0.5; + double cy = spans->y + 0.5; + int x = (int)((texture->matrix.c * cy + texture->matrix.a * cx + texture->matrix.tx) * FIXED_SCALE); + int y = (int)((texture->matrix.d * cy + texture->matrix.b * cx + texture->matrix.ty) * FIXED_SCALE); + int coverage = (spans->coverage * texture->alpha) >> 8; + int length = spans->len; + while(length) + { + int l = CG_MIN(length, 1024); + uint32_t * end = buffer + l; + uint32_t * b = buffer; + int px16 = x % (image_width << 16); + int py16 = y % (image_height << 16); + int px_delta = fdx % (image_width << 16); + int py_delta = fdy % (image_height << 16); + while(b < end) + { + if(px16 < 0) + px16 += image_width << 16; + if(py16 < 0) + py16 += image_height << 16; + int px = px16 >> 16; + int py = py16 >> 16; + int y_offset = py * scanline_offset; + + *b = image_bits[y_offset + px]; + x += fdx; + y += fdy; + px16 += px_delta; + if(px16 >= image_width << 16) + px16 -= image_width << 16; + py16 += py_delta; + if(py16 >= image_height << 16) + py16 -= image_height << 16; + ++b; + } + func(target, l, buffer, coverage); + target += l; + length -= l; + } + ++spans; + } +} + +static inline void cg_blend_color(struct cg_ctx_t * ctx, struct cg_rle_t * rle, struct cg_color_t * color) +{ + if(color) + { + struct cg_state_t * state = ctx->state; + uint32_t solid = premultiply_color(color, state->opacity); + if((CG_ALPHA(solid) == 255) && (state->op == CG_OPERATOR_SRC_OVER)) + blend_solid(ctx->surface, CG_OPERATOR_SRC, rle, solid); + else + blend_solid(ctx->surface, state->op, rle, solid); + } +} + +static inline void cg_blend_gradient(struct cg_ctx_t * ctx, struct cg_rle_t * rle, struct cg_gradient_t * gradient) +{ + if(gradient && (gradient->stops.size > 0)) + { + struct cg_state_t * state = ctx->state; + struct cg_gradient_data_t data; + int i, pos = 0, nstop = gradient->stops.size; + struct cg_gradient_stop_t *curr, *next, *start, *last; + uint32_t curr_color, next_color, last_color; + uint32_t dist, idist; + double delta, t, incr, fpos; + double opacity = state->opacity * gradient->opacity; + + start = gradient->stops.data; + curr = start; + curr_color = combine_opacity(&curr->color, opacity); + + data.colortable[pos] = premultiply_pixel(curr_color); + ++pos; + incr = 1.0 / 1024; + fpos = 1.5 * incr; + + while(fpos <= curr->offset) + { + data.colortable[pos] = data.colortable[pos - 1]; + ++pos; + fpos += incr; + } + for(i = 0; i < nstop - 1; i++) + { + curr = (start + i); + next = (start + i + 1); + delta = 1.0 / (next->offset - curr->offset); + next_color = combine_opacity(&next->color, opacity); + while(fpos < next->offset && pos < 1024) + { + t = (fpos - curr->offset) * delta; + dist = (uint32_t)(255 * t); + idist = 255 - dist; + data.colortable[pos] = premultiply_pixel(interpolate_pixel(curr_color, idist, next_color, dist)); + ++pos; + fpos += incr; + } + curr_color = next_color; + } + + last = start + nstop - 1; + last_color = premultiply_color(&last->color, opacity); + for(; pos < 1024; ++pos) + data.colortable[pos] = last_color; + + data.spread = gradient->spread; + data.matrix = gradient->matrix; + cg_matrix_multiply(&data.matrix, &data.matrix, &state->matrix); + cg_matrix_invert(&data.matrix); + + if(gradient->type == CG_GRADIENT_TYPE_LINEAR) + { + data.linear.x1 = gradient->values[0]; + data.linear.y1 = gradient->values[1]; + data.linear.x2 = gradient->values[2]; + data.linear.y2 = gradient->values[3]; + blend_linear_gradient(ctx->surface, state->op, rle, &data); + } + else + { + data.radial.cx = gradient->values[0]; + data.radial.cy = gradient->values[1]; + data.radial.cr = gradient->values[2]; + data.radial.fx = gradient->values[3]; + data.radial.fy = gradient->values[4]; + data.radial.fr = gradient->values[5]; + blend_radial_gradient(ctx->surface, state->op, rle, &data); + } + } +} + +static inline void cg_blend_texture(struct cg_ctx_t * ctx, struct cg_rle_t * rle, struct cg_texture_t * texture) +{ + if(texture) + { + struct cg_state_t * state = ctx->state; + struct cg_texture_data_t data; + data.width = texture->surface->width; + data.height = texture->surface->height; + data.stride = texture->surface->stride; + data.alpha = (int)(state->opacity * texture->opacity * 256.0); + data.pixels = texture->surface->pixels; + data.matrix = texture->matrix; + cg_matrix_multiply(&data.matrix, &data.matrix, &state->matrix); + cg_matrix_invert(&data.matrix); + struct cg_matrix_t * m = &data.matrix; + if((m->a == 1.0) && (m->b == 0.0) && (m->c == 0.0) && (m->d == 1.0)) + { + if(texture->type == CG_TEXTURE_TYPE_PLAIN) + blend_untransformed_argb(ctx->surface, state->op, rle, &data); + else + blend_untransformed_tiled_argb(ctx->surface, state->op, rle, &data); + } + else + { + if(texture->type == CG_TEXTURE_TYPE_PLAIN) + blend_transformed_argb(ctx->surface, state->op, rle, &data); + else + blend_transformed_tiled_argb(ctx->surface, state->op, rle, &data); + } + } +} + +static void cg_blend(struct cg_ctx_t * ctx, struct cg_rle_t * rle) +{ + if(rle && (rle->spans.size > 0)) + { + struct cg_paint_t * source = &ctx->state->paint; + switch(source->type) + { + case CG_PAINT_TYPE_COLOR: + cg_blend_color(ctx, rle, &source->color); + break; + case CG_PAINT_TYPE_GRADIENT: + cg_blend_gradient(ctx, rle, &source->gradient); + break; + case CG_PAINT_TYPE_TEXTURE: + cg_blend_texture(ctx, rle, &source->texture); + default: + break; + } + } +} + +static struct cg_state_t * cg_state_create(void) +{ + struct cg_state_t * state = malloc(sizeof(struct cg_state_t)); + state->clippath = NULL; + cg_paint_init(&state->paint); + cg_matrix_init_identity(&state->matrix); + state->winding = CG_FILL_RULE_NON_ZERO; + state->stroke.width = 1.0; + state->stroke.miterlimit = 10.0; + state->stroke.cap = CG_LINE_CAP_BUTT; + state->stroke.join = CG_LINE_JOIN_MITER; + state->stroke.dash = NULL; + state->op = CG_OPERATOR_SRC_OVER; + state->opacity = 1.0; + state->next = NULL; + return state; +} + +static struct cg_state_t * cg_state_clone(struct cg_state_t * state) +{ + struct cg_state_t * newstate = cg_state_create(); + newstate->clippath = cg_rle_clone(state->clippath); + cg_paint_copy(&newstate->paint, &state->paint); + newstate->matrix = state->matrix; + newstate->winding = state->winding; + newstate->stroke.width = state->stroke.width; + newstate->stroke.miterlimit = state->stroke.miterlimit; + newstate->stroke.cap = state->stroke.cap; + newstate->stroke.join = state->stroke.join; + newstate->stroke.dash = cg_dash_clone(state->stroke.dash); + newstate->op = state->op; + newstate->opacity = state->opacity; + newstate->next = NULL; + return newstate; +} + +static void cg_state_destroy(struct cg_state_t * state) +{ + cg_rle_destroy(state->clippath); + cg_paint_destroy(&state->paint); + cg_dash_destroy(state->stroke.dash); + free(state); +} + +struct cg_ctx_t * cg_create(struct cg_surface_t * surface) +{ + struct cg_ctx_t * ctx = malloc(sizeof(struct cg_ctx_t)); + ctx->surface = cg_surface_reference(surface); + ctx->state = cg_state_create(); + ctx->path = cg_path_create(); + ctx->rle = cg_rle_create(); + ctx->clippath = NULL; + ctx->clip.x = 0.0; + ctx->clip.y = 0.0; + ctx->clip.w = surface->width; + ctx->clip.h = surface->height; + ctx->outline_data = NULL; + ctx->outline_size = 0; + return ctx; +} + +void cg_destroy(struct cg_ctx_t * ctx) +{ + if(ctx) + { + while(ctx->state) + { + struct cg_state_t * state = ctx->state; + ctx->state = state->next; + cg_state_destroy(state); + } + cg_surface_destroy(ctx->surface); + cg_path_destroy(ctx->path); + cg_rle_destroy(ctx->rle); + cg_rle_destroy(ctx->clippath); + if(ctx->outline_data) + free(ctx->outline_data); + free(ctx); + } +} + +void cg_save(struct cg_ctx_t * ctx) +{ + struct cg_state_t * state = cg_state_clone(ctx->state); + state->next = ctx->state; + ctx->state = state; +} + +void cg_restore(struct cg_ctx_t * ctx) +{ + struct cg_state_t * state = ctx->state; + ctx->state = state->next; + cg_state_destroy(state); +} + +struct cg_color_t * cg_set_source_rgb(struct cg_ctx_t * ctx, double r, double g, double b) +{ + return cg_set_source_rgba(ctx, r, g, b, 1.0); +} + +struct cg_color_t * cg_set_source_rgba(struct cg_ctx_t * ctx, double r, double g, double b, double a) +{ + struct cg_paint_t * paint = &ctx->state->paint; + paint->type = CG_PAINT_TYPE_COLOR; + cg_color_init_rgba(&paint->color, r, g, b, a); + return &paint->color; +} + +struct cg_color_t * cg_set_source_color(struct cg_ctx_t * ctx, struct cg_color_t * color) +{ + return cg_set_source_rgba(ctx, color->r, color->g, color->b, color->a); +} + +struct cg_gradient_t * cg_set_source_linear_gradient(struct cg_ctx_t * ctx, double x1, double y1, double x2, double y2) +{ + struct cg_paint_t * paint = &ctx->state->paint; + paint->type = CG_PAINT_TYPE_GRADIENT; + cg_gradient_init_linear(&paint->gradient, x1, y1, x2, y2); + return &paint->gradient; +} + +struct cg_gradient_t * cg_set_source_radial_gradient(struct cg_ctx_t * ctx, double cx, double cy, double cr, double fx, double fy, double fr) +{ + struct cg_paint_t * paint = &ctx->state->paint; + paint->type = CG_PAINT_TYPE_GRADIENT; + cg_gradient_init_radial(&paint->gradient, cx, cy, cr, fx, fy, fr); + return &paint->gradient; +} + +static inline struct cg_texture_t * cg_set_texture(struct cg_ctx_t *ctx, struct cg_surface_t * surface, enum cg_texture_type_t type) +{ + struct cg_paint_t * paint = &ctx->state->paint; + paint->type = CG_PAINT_TYPE_TEXTURE; + cg_texture_init(&paint->texture, surface, type); + return &paint->texture; +} + +struct cg_texture_t * cg_set_source_surface(struct cg_ctx_t * ctx, struct cg_surface_t * surface, double x, double y) +{ + struct cg_texture_t * texture = cg_set_texture(ctx, surface, CG_TEXTURE_TYPE_PLAIN); + cg_matrix_init_translate(&texture->matrix, x, y); + return texture; +} + +void cg_set_operator(struct cg_ctx_t * ctx, enum cg_operator_t op) +{ + ctx->state->op = op; +} + +void cg_set_opacity(struct cg_ctx_t * ctx, double opacity) +{ + ctx->state->opacity = CG_CLAMP(opacity, 0.0, 1.0); +} + +void cg_set_fill_rule(struct cg_ctx_t * ctx, enum cg_fill_rule_t winding) +{ + ctx->state->winding = winding; +} + +void cg_set_line_width(struct cg_ctx_t * ctx, double width) +{ + ctx->state->stroke.width = width; +} + +void cg_set_line_cap(struct cg_ctx_t * ctx, enum cg_line_cap_t cap) +{ + ctx->state->stroke.cap = cap; +} + +void cg_set_line_join(struct cg_ctx_t * ctx, enum cg_line_join_t join) +{ + ctx->state->stroke.join = join; +} + +void cg_set_miter_limit(struct cg_ctx_t * ctx, double limit) +{ + ctx->state->stroke.miterlimit = limit; +} + +void cg_set_dash(struct cg_ctx_t * ctx, double * dashes, int ndash, double offset) +{ + cg_dash_destroy(ctx->state->stroke.dash); + ctx->state->stroke.dash = cg_dash_create(dashes, ndash, offset); +} + +void cg_translate(struct cg_ctx_t * ctx, double tx, double ty) +{ + cg_matrix_translate(&ctx->state->matrix, tx, ty); +} + +void cg_scale(struct cg_ctx_t * ctx, double sx, double sy) +{ + cg_matrix_scale(&ctx->state->matrix, sx, sy); +} + +void cg_rotate(struct cg_ctx_t * ctx, double r) +{ + cg_matrix_rotate(&ctx->state->matrix, r); +} + +void cg_transform(struct cg_ctx_t * ctx, struct cg_matrix_t * m) +{ + cg_matrix_multiply(&ctx->state->matrix, m, &ctx->state->matrix); +} + +void cg_set_matrix(struct cg_ctx_t * ctx, struct cg_matrix_t * m) +{ + memcpy(&ctx->state->matrix, m, sizeof(struct cg_matrix_t)); +} + +void cg_identity_matrix(struct cg_ctx_t * ctx) +{ + cg_matrix_init_identity(&ctx->state->matrix); +} + +void cg_move_to(struct cg_ctx_t * ctx, double x, double y) +{ + cg_path_move_to(ctx->path, x, y); +} + +void cg_line_to(struct cg_ctx_t * ctx, double x, double y) +{ + cg_path_line_to(ctx->path, x, y); +} + +void cg_curve_to(struct cg_ctx_t * ctx, double x1, double y1, double x2, double y2, double x3, double y3) +{ + cg_path_curve_to(ctx->path, x1, y1, x2, y2, x3, y3); +} + +void cg_quad_to(struct cg_ctx_t * ctx, double x1, double y1, double x2, double y2) +{ + cg_path_quad_to(ctx->path, x1, y1, x2, y2); +} + +void cg_rel_move_to(struct cg_ctx_t * ctx, double dx, double dy) +{ + cg_path_rel_move_to(ctx->path, dx, dy); +} + +void cg_rel_line_to(struct cg_ctx_t * ctx, double dx, double dy) +{ + cg_path_rel_line_to(ctx->path, dx, dy); +} + +void cg_rel_curve_to(struct cg_ctx_t * ctx, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3) +{ + cg_path_rel_curve_to(ctx->path, dx1, dy1, dx2, dy2, dx3, dy3); +} + +void cg_rel_quad_to(struct cg_ctx_t * ctx, double dx1, double dy1, double dx2, double dy2) +{ + cg_path_rel_quad_to(ctx->path, dx1, dy1, dx2, dy2); +} + +void cg_rectangle(struct cg_ctx_t * ctx, double x, double y, double w, double h) +{ + cg_path_add_rectangle(ctx->path, x, y, w, h); +} + +void cg_round_rectangle(struct cg_ctx_t * ctx, double x, double y, double w, double h, double rx, double ry) +{ + cg_path_add_round_rectangle(ctx->path, x, y, w, h, rx, ry); +} + +void cg_ellipse(struct cg_ctx_t * ctx, double cx, double cy, double rx, double ry) +{ + cg_path_add_ellipse(ctx->path, cx, cy, rx, ry); +} + +void cg_circle(struct cg_ctx_t * ctx, double cx, double cy, double r) +{ + cg_path_add_ellipse(ctx->path, cx, cy, r, r); +} + +void cg_arc(struct cg_ctx_t * ctx, double cx, double cy, double r, double a0, double a1) +{ + cg_path_add_arc(ctx->path, cx, cy, r, a0, a1, 0); +} + +void cg_arc_negative(struct cg_ctx_t * ctx, double cx, double cy, double r, double a0, double a1) +{ + cg_path_add_arc(ctx->path, cx, cy, r, a0, a1, 1); +} + +void cg_new_path(struct cg_ctx_t * ctx) +{ + cg_path_clear(ctx->path); +} + +void cg_close_path(struct cg_ctx_t * ctx) +{ + cg_path_close(ctx->path); +} + +void cg_reset_clip(struct cg_ctx_t * ctx) +{ + cg_rle_destroy(ctx->state->clippath); + ctx->state->clippath = NULL; +} + +void cg_clip(struct cg_ctx_t * ctx) +{ + cg_clip_preserve(ctx); + cg_new_path(ctx); +} + +void cg_clip_preserve(struct cg_ctx_t * ctx) +{ + struct cg_state_t * state = ctx->state; + if(state->clippath) + { + cg_rle_clear(ctx->rle); + cg_rle_rasterize(ctx, ctx->rle, ctx->path, &state->matrix, &ctx->clip, NULL, state->winding); + cg_rle_clip_path(state->clippath, ctx->rle); + } + else + { + state->clippath = cg_rle_create(); + cg_rle_rasterize(ctx, state->clippath, ctx->path, &state->matrix, &ctx->clip, NULL, state->winding); + } +} + +void cg_fill(struct cg_ctx_t * ctx) +{ + cg_fill_preserve(ctx); + cg_new_path(ctx); +} + +void cg_fill_preserve(struct cg_ctx_t * ctx) +{ + struct cg_state_t * state = ctx->state; + cg_rle_clear(ctx->rle); + cg_rle_rasterize(ctx, ctx->rle, ctx->path, &state->matrix, &ctx->clip, NULL, state->winding); + cg_rle_clip_path(ctx->rle, state->clippath); + cg_blend(ctx, ctx->rle); +} + +void cg_stroke(struct cg_ctx_t * ctx) +{ + cg_stroke_preserve(ctx); + cg_new_path(ctx); +} + +void cg_stroke_preserve(struct cg_ctx_t * ctx) +{ + struct cg_state_t * state = ctx->state; + cg_rle_clear(ctx->rle); + cg_rle_rasterize(ctx, ctx->rle, ctx->path, &state->matrix, &ctx->clip, &state->stroke, CG_FILL_RULE_NON_ZERO); + cg_rle_clip_path(ctx->rle, state->clippath); + cg_blend(ctx, ctx->rle); +} + +void cg_paint(struct cg_ctx_t * ctx) +{ + struct cg_state_t * state = ctx->state; + if((state->clippath == NULL) && (ctx->clippath == NULL)) + { + struct cg_path_t * path = cg_path_create(); + cg_path_add_rectangle(path, ctx->clip.x, ctx->clip.y, ctx->clip.w, ctx->clip.h); + struct cg_matrix_t m; + cg_matrix_init_identity(&m); + ctx->clippath = cg_rle_create(); + cg_rle_rasterize(ctx, ctx->clippath, path, &m, &ctx->clip, NULL, CG_FILL_RULE_NON_ZERO); + cg_path_destroy(path); + } + struct cg_rle_t * rle = state->clippath ? state->clippath : ctx->clippath; + cg_blend(ctx, rle); +} diff --git a/libmui/mui/cg.h b/libmui/mui/cg.h new file mode 100644 index 0000000..ca7b3d0 --- /dev/null +++ b/libmui/mui/cg.h @@ -0,0 +1,314 @@ +#ifndef __CG_H__ +#define __CG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "xft.h" + +struct cg_point_t { + double x; + double y; +}; + +struct cg_rect_t { + double x; + double y; + double w; + double h; +}; + +struct cg_matrix_t { + double a; double b; + double c; double d; + double tx; double ty; +}; + +struct cg_color_t { + double r; + double g; + double b; + double a; +}; + +struct cg_gradient_stop_t { + double offset; + struct cg_color_t color; +}; + +enum cg_path_element_t { + CG_PATH_ELEMENT_MOVE_TO = 0, + CG_PATH_ELEMENT_LINE_TO = 1, + CG_PATH_ELEMENT_CURVE_TO = 2, + CG_PATH_ELEMENT_CLOSE = 3, +}; + +enum cg_spread_method_t { + CG_SPREAD_METHOD_PAD = 0, + CG_SPREAD_METHOD_REFLECT = 1, + CG_SPREAD_METHOD_REPEAT = 2, +}; + +enum cg_gradient_type_t { + CG_GRADIENT_TYPE_LINEAR = 0, + CG_GRADIENT_TYPE_RADIAL = 1, +}; + +enum cg_texture_type_t { + CG_TEXTURE_TYPE_PLAIN = 0, + CG_TEXTURE_TYPE_TILED = 1, +}; + +enum cg_line_cap_t { + CG_LINE_CAP_BUTT = 0, + CG_LINE_CAP_ROUND = 1, + CG_LINE_CAP_SQUARE = 2, +}; + +enum cg_line_join_t { + CG_LINE_JOIN_MITER = 0, + CG_LINE_JOIN_ROUND = 1, + CG_LINE_JOIN_BEVEL = 2, +}; + +enum cg_fill_rule_t { + CG_FILL_RULE_NON_ZERO = 0, + CG_FILL_RULE_EVEN_ODD = 1, +}; + +enum cg_paint_type_t { + CG_PAINT_TYPE_COLOR = 0, + CG_PAINT_TYPE_GRADIENT = 1, + CG_PAINT_TYPE_TEXTURE = 2, +}; + +enum cg_operator_t { + CG_OPERATOR_SRC = 0, /* r = s * ca + d * cia */ + CG_OPERATOR_SRC_OVER = 1, /* r = (s + d * sia) * ca + d * cia */ + CG_OPERATOR_DST_IN = 2, /* r = d * sa * ca + d * cia */ + CG_OPERATOR_DST_OUT = 3, /* r = d * sia * ca + d * cia */ +}; + +struct cg_surface_t { + int ref; + int width; + int height; + int stride; + int owndata; + void * pixels; +}; + +struct cg_path_t { + int contours; + struct cg_point_t start; + struct { + enum cg_path_element_t * data; + int size; + int capacity; + } elements; + struct { + struct cg_point_t * data; + int size; + int capacity; + } points; +}; + +struct cg_gradient_t { + enum cg_gradient_type_t type; + enum cg_spread_method_t spread; + struct cg_matrix_t matrix; + double values[6]; + double opacity; + struct { + struct cg_gradient_stop_t * data; + int size; + int capacity; + } stops; +}; + +struct cg_texture_t { + enum cg_texture_type_t type; + struct cg_surface_t * surface; + struct cg_matrix_t matrix; + double opacity; +}; + +struct cg_paint_t { + enum cg_paint_type_t type; + struct cg_color_t color; + struct cg_gradient_t gradient; + struct cg_texture_t texture; +}; + +struct cg_span_t { + int x; + int len; + int y; + unsigned char coverage; +}; + +struct cg_rle_t { + struct { + struct cg_span_t * data; + int size; + int capacity; + } spans; + int x; + int y; + int w; + int h; +}; + +struct cg_dash_t { + double offset; + double * data; + int size; +}; + +struct cg_stroke_data_t { + double width; + double miterlimit; + enum cg_line_cap_t cap; + enum cg_line_join_t join; + struct cg_dash_t * dash; +}; + +struct cg_state_t { + struct cg_rle_t * clippath; + struct cg_paint_t paint; + struct cg_matrix_t matrix; + enum cg_fill_rule_t winding; + struct cg_stroke_data_t stroke; + enum cg_operator_t op; + double opacity; + struct cg_state_t * next; +}; + +struct cg_ctx_t { + struct cg_surface_t * surface; + struct cg_state_t * state; + struct cg_path_t * path; + struct cg_rle_t * rle; + struct cg_rle_t * clippath; + struct cg_rect_t clip; + void * outline_data; + size_t outline_size; +}; + +#ifndef CG_MIN +#define CG_MIN(a, b) ({typeof(a) _amin = (a); typeof(b) _bmin = (b); (void)(&_amin == &_bmin); _amin < _bmin ? _amin : _bmin;}) +#endif +#ifndef CG_MAX +#define CG_MAX(a, b) ({typeof(a) _amax = (a); typeof(b) _bmax = (b); (void)(&_amax == &_bmax); _amax > _bmax ? _amax : _bmax;}) +#endif +#ifndef CG_CLAMP +#define CG_CLAMP(v, a, b) CG_MIN(CG_MAX(a, v), b) +#endif +#ifndef CG_ALPHA +#define CG_ALPHA(c) ((c) >> 24) +#endif +#ifndef CG_DIV255 +#define CG_DIV255(x) (((x) + ((x) >> 8) + 0x80) >> 8) +#endif +#ifndef CG_BYTE_MUL +#define CG_BYTE_MUL(x, a) ((((((x) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + (((((x) & 0x00ff00ff) * (a)) >> 8) & 0x00ff00ff)) +#endif + +void cg_memfill32(uint32_t * dst, uint32_t val, int len); +void cg_comp_solid_source(uint32_t * dst, int len, uint32_t color, uint32_t alpha); +void cg_comp_solid_source_over(uint32_t * dst, int len, uint32_t color, uint32_t alpha); +void cg_comp_solid_destination_in(uint32_t * dst, int len, uint32_t color, uint32_t alpha); +void cg_comp_solid_destination_out(uint32_t * dst, int len, uint32_t color, uint32_t alpha); +void cg_comp_source(uint32_t * dst, int len, uint32_t * src, uint32_t alpha); +void cg_comp_source_over(uint32_t * dst, int len, uint32_t * src, uint32_t alpha); +void cg_comp_destination_in(uint32_t * dst, int len, uint32_t * src, uint32_t alpha); +void cg_comp_destination_out(uint32_t * dst, int len, uint32_t * src, uint32_t alpha); + +void cg_matrix_init(struct cg_matrix_t * m, double a, double b, double c, double d, double tx, double ty); +void cg_matrix_init_identity(struct cg_matrix_t * m); +void cg_matrix_init_translate(struct cg_matrix_t * m, double tx, double ty); +void cg_matrix_init_scale(struct cg_matrix_t * m, double sx, double sy); +void cg_matrix_init_rotate(struct cg_matrix_t * m, double r); +void cg_matrix_translate(struct cg_matrix_t * m, double tx, double ty); +void cg_matrix_scale(struct cg_matrix_t * m, double sx, double sy); +void cg_matrix_rotate(struct cg_matrix_t * m, double r); +void cg_matrix_multiply(struct cg_matrix_t * m, struct cg_matrix_t * m1, struct cg_matrix_t * m2); +void cg_matrix_invert(struct cg_matrix_t * m); +void cg_matrix_map_point(struct cg_matrix_t * m, struct cg_point_t * p1, struct cg_point_t * p2); + +struct cg_surface_t * cg_surface_create(int width, int height); +struct cg_surface_t * cg_surface_create_for_data(int width, int height, void * pixels); +void cg_surface_destroy(struct cg_surface_t * surface); +struct cg_surface_t * cg_surface_reference(struct cg_surface_t * surface); + +void cg_gradient_set_values_linear(struct cg_gradient_t * gradient, double x1, double y1, double x2, double y2); +void cg_gradient_set_values_radial(struct cg_gradient_t * gradient, double cx, double cy, double cr, double fx, double fy, double fr); +void cg_gradient_set_spread(struct cg_gradient_t * gradient, enum cg_spread_method_t spread); +void cg_gradient_set_matrix(struct cg_gradient_t * gradient, struct cg_matrix_t * m); +void cg_gradient_set_opacity(struct cg_gradient_t * gradient, double opacity); +void cg_gradient_add_stop_rgb(struct cg_gradient_t * gradient, double offset, double r, double g, double b); +void cg_gradient_add_stop_rgba(struct cg_gradient_t * gradient, double offset, double r, double g, double b, double a); +void cg_gradient_add_stop_color(struct cg_gradient_t * gradient, double offset, struct cg_color_t * color); +void cg_gradient_add_stop(struct cg_gradient_t * gradient, struct cg_gradient_stop_t * stop); +void cg_gradient_clear_stops(struct cg_gradient_t * gradient); + +void cg_texture_set_type(struct cg_texture_t * texture, enum cg_texture_type_t type); +void cg_texture_set_matrix(struct cg_texture_t * texture, struct cg_matrix_t * m); +void cg_texture_set_surface(struct cg_texture_t * texture, struct cg_surface_t * surface); +void cg_texture_set_opacity(struct cg_texture_t * texture, double opacity); + +struct cg_ctx_t * cg_create(struct cg_surface_t * surface); +void cg_destroy(struct cg_ctx_t * ctx); +void cg_save(struct cg_ctx_t * ctx); +void cg_restore(struct cg_ctx_t * ctx); +struct cg_color_t * cg_set_source_rgb(struct cg_ctx_t * ctx, double r, double g, double b); +struct cg_color_t * cg_set_source_rgba(struct cg_ctx_t * ctx, double r, double g, double b, double a); +struct cg_color_t * cg_set_source_color(struct cg_ctx_t * ctx, struct cg_color_t * color); +struct cg_gradient_t * cg_set_source_linear_gradient(struct cg_ctx_t * ctx, double x1, double y1, double x2, double y2); +struct cg_gradient_t * cg_set_source_radial_gradient(struct cg_ctx_t * ctx, double cx, double cy, double cr, double fx, double fy, double fr); +struct cg_texture_t * cg_set_source_surface(struct cg_ctx_t * ctx, struct cg_surface_t * surface, double x, double y); +void cg_set_operator(struct cg_ctx_t * ctx, enum cg_operator_t op); +void cg_set_opacity(struct cg_ctx_t * ctx, double opacity); +void cg_set_fill_rule(struct cg_ctx_t * ctx, enum cg_fill_rule_t winding); +void cg_set_line_width(struct cg_ctx_t * ctx, double width); +void cg_set_line_cap(struct cg_ctx_t * ctx, enum cg_line_cap_t cap); +void cg_set_line_join(struct cg_ctx_t * ctx, enum cg_line_join_t join); +void cg_set_miter_limit(struct cg_ctx_t * ctx, double limit); +void cg_set_dash(struct cg_ctx_t * ctx, double * dashes, int ndash, double offset); +void cg_translate(struct cg_ctx_t * ctx, double tx, double ty); +void cg_scale(struct cg_ctx_t * ctx, double sx, double sy); +void cg_rotate(struct cg_ctx_t * ctx, double r); +void cg_transform(struct cg_ctx_t * ctx, struct cg_matrix_t * m); +void cg_set_matrix(struct cg_ctx_t * ctx, struct cg_matrix_t * m); +void cg_identity_matrix(struct cg_ctx_t * ctx); +void cg_move_to(struct cg_ctx_t * ctx, double x, double y); +void cg_line_to(struct cg_ctx_t * ctx, double x, double y); +void cg_curve_to(struct cg_ctx_t * ctx, double x1, double y1, double x2, double y2, double x3, double y3); +void cg_quad_to(struct cg_ctx_t * ctx, double x1, double y1, double x2, double y2); +void cg_rel_move_to(struct cg_ctx_t * ctx, double dx, double dy); +void cg_rel_line_to(struct cg_ctx_t * ctx, double dx, double dy); +void cg_rel_curve_to(struct cg_ctx_t * ctx, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3); +void cg_rel_quad_to(struct cg_ctx_t * ctx, double dx1, double dy1, double dx2, double dy2); +void cg_rectangle(struct cg_ctx_t * ctx, double x, double y, double w, double h); +void cg_round_rectangle(struct cg_ctx_t * ctx, double x, double y, double w, double h, double rx, double ry); +void cg_ellipse(struct cg_ctx_t * ctx, double cx, double cy, double rx, double ry); +void cg_circle(struct cg_ctx_t * ctx, double cx, double cy, double r); +void cg_arc(struct cg_ctx_t * ctx, double cx, double cy, double r, double a0, double a1); +void cg_arc_negative(struct cg_ctx_t * ctx, double cx, double cy, double r, double a0, double a1); +void cg_new_path(struct cg_ctx_t * ctx); +void cg_close_path(struct cg_ctx_t * ctx); +void cg_reset_clip(struct cg_ctx_t * ctx); +void cg_clip(struct cg_ctx_t * ctx); +void cg_clip_preserve(struct cg_ctx_t * ctx); +void cg_fill(struct cg_ctx_t * ctx); +void cg_fill_preserve(struct cg_ctx_t * ctx); +void cg_stroke(struct cg_ctx_t * ctx); +void cg_stroke_preserve(struct cg_ctx_t * ctx); +void cg_paint(struct cg_ctx_t * ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* __CG_H__ */ diff --git a/libmui/mui/mui.c b/libmui/mui/mui.c new file mode 100644 index 0000000..c0655ee --- /dev/null +++ b/libmui/mui/mui.c @@ -0,0 +1,285 @@ +/* + * mui.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#include "mui_priv.h" + +void +mui_init( + mui_t *ui) +{ + //memset(ui, 0, sizeof(*ui)); + ui->clear_color = MUI_COLOR(0xccccccff); + TAILQ_INIT(&ui->windows); + TAILQ_INIT(&ui->zombies); + TAILQ_INIT(&ui->fonts); + mui_font_init(ui); + pixman_region32_init(&ui->redraw); + c2_rect_t whole = C2_RECT(0, 0, ui->screen_size.x, ui->screen_size.y); + pixman_region32_reset(&ui->inval, (pixman_box32_t*)&whole); +} + +void +mui_dispose( + mui_t *ui) +{ + pixman_region32_fini(&ui->inval); + mui_font_dispose(ui); + mui_window_t *w; + while ((w = TAILQ_FIRST(&ui->windows))) { + mui_window_dispose(w); + } +} + +void +mui_draw( + mui_t *ui, + mui_drawable_t *dr, + uint16_t all) +{ + if (!(all || pixman_region32_not_empty(&ui->inval))) + return; + if (all) { + // printf("%s: all\n", __func__); + c2_rect_t whole = C2_RECT(0, 0, dr->pix.size.x, dr->pix.size.y); + pixman_region32_reset(&ui->inval, (pixman_box32_t*)&whole); + } + mui_drawable_set_clip(dr, NULL); + + /* + * Windows are drawn top to bottom, their area/rectangle is added to the + * done region, the done region (any windows that are overlaping others) + * is substracted to any other windows update region before drawing... + * once all windows are done, the 'done' region (sum of all the windows), + * is substracted from the 'desk' area and erased. + */ + pixman_region32_t done = {}; + + mui_window_t * win; + TAILQ_FOREACH_REVERSE(win, &ui->windows, windows, self) { + pixman_region32_intersect_rect(&win->inval, &win->inval, + win->frame.l, win->frame.t, + c2_rect_width(&win->frame), c2_rect_height(&win->frame)); + + mui_drawable_set_clip(dr, NULL); + if (!all) + mui_drawable_clip_push_region(dr, &win->inval); + else + mui_drawable_clip_push(dr, &win->frame); + pixman_region32_clear(&win->inval); + + mui_drawable_clip_substract_region(dr, &done); + mui_window_draw(win, dr); + // printf(" %s : %s\n", win->title, c2_rect_as_str(&win->frame)); + pixman_region32_union_rect(&done, &done, + win->frame.l, win->frame.t, + c2_rect_width(&win->frame), c2_rect_height(&win->frame)); + } + + mui_drawable_set_clip(dr, NULL); + pixman_region32_t sect = {}; + c2_rect_t desk = C2_RECT(0, 0, dr->pix.size.x, dr->pix.size.y); + pixman_region32_inverse(§, &done, (pixman_box32_t*)&desk); + + mui_drawable_clip_push_region(dr, §); + + pixman_image_fill_boxes( + ui->clear_color.value ? PIXMAN_OP_SRC : PIXMAN_OP_CLEAR, + mui_drawable_get_pixman(dr), + &PIXMAN_COLOR(ui->clear_color), 1, (pixman_box32_t*)&desk); + pixman_region32_fini(§); + pixman_region32_fini(&done); + + pixman_region32_union(&ui->redraw, &ui->redraw, &ui->inval); + pixman_region32_clear(&ui->inval); + if (ui->draw_debug) { + // save a png of the current screen + ui->draw_debug = 0; + printf("%s: saving debug.png\n", __func__); + // mui_drawable_save_to_png(dr, "debug.png"); + } +} + +bool +mui_handle_event( + mui_t *ui, + mui_event_t *ev) +{ + bool res = false; + if (!ev->when) + ev->when = mui_get_time(); + ui->action_active++; + switch (ev->type) { + case MUI_EVENT_KEYUP: + case MUI_EVENT_KEYDOWN: { + if (ev->modifiers & MUI_MODIFIER_EVENT_TRACE) + printf("%s modifiers %04x key %x\n", __func__, + ev->modifiers, ev->key.key); + mui_window_t *w, *safe; + TAILQ_FOREACH_REVERSE_SAFE(w, &ui->windows, windows, self, safe) { + if ((res = mui_window_handle_keyboard(w, ev))) { + if (ev->modifiers & MUI_MODIFIER_EVENT_TRACE) + printf(" window:%s handled it\n", + w->title); + break; + } + } + if (ev->modifiers & MUI_MODIFIER_EVENT_TRACE) + if (!res) + printf(" no window handled it\n"); + } break; + case MUI_EVENT_BUTTONUP: + case MUI_EVENT_BUTTONDOWN: + case MUI_EVENT_WHEEL: + case MUI_EVENT_DRAG: { + if (ev->type == MUI_EVENT_BUTTONDOWN && ev->mouse.button > 1) { + printf("%s: button %d not handled\n", __func__, + ev->mouse.button); + ui->draw_debug++; + c2_rect_t whole = C2_RECT(0, 0, ui->screen_size.x, ui->screen_size.y); + pixman_region32_reset(&ui->inval, (pixman_box32_t*)&whole); + } + if (ev->modifiers & MUI_MODIFIER_EVENT_TRACE) + printf("%s %d mouse %d %3dx%3d capture:%s\n", __func__, + ev->type, ev->mouse.button, + ev->mouse.where.x, ev->mouse.where.y, + ui->event_capture ? + ui->event_capture->title : "(none)"); + if (ui->event_capture) { + res = mui_window_handle_mouse(ui->event_capture, ev); + break; + } else { + mui_window_t *w, *safe; + TAILQ_FOREACH_REVERSE_SAFE(w, &ui->windows, windows, self, safe) { + if ((res = mui_window_handle_mouse(w, ev))) { + if (ev->modifiers & MUI_MODIFIER_EVENT_TRACE) + printf(" window:%s handled it\n", + w->title); + break; + } + } + } + if (ev->modifiers & MUI_MODIFIER_EVENT_TRACE) + if (!res) + printf(" no window handled it\n"); + } break; + } + ui->action_active--; + return res; +} + +static uint16_t +_mui_simplify_mods( + uint16_t mods) +{ + uint16_t res = 0; + if (mods & MUI_MODIFIER_SHIFT) + res |= MUI_MODIFIER_RSHIFT; + if (mods & MUI_MODIFIER_CTRL) + res |= MUI_MODIFIER_RCTRL; + if (mods & MUI_MODIFIER_ALT) + res |= MUI_MODIFIER_RALT; + if (mods & MUI_MODIFIER_SUPER) + res |= MUI_MODIFIER_RSUPER; + return res; +} + +bool +mui_event_match_key( + mui_event_t *ev, + mui_key_equ_t key_equ) +{ + if (ev->type != MUI_EVENT_KEYUP && ev->type != MUI_EVENT_KEYDOWN) + return false; + if (toupper(ev->key.key) != toupper(key_equ.key)) + return false; + if (_mui_simplify_mods(ev->modifiers) != _mui_simplify_mods(key_equ.mod)) + return false; + return true; +} + +uint8_t +mui_timer_register( + mui_t *ui, + mui_timer_p cb, + void *param, + uint32_t delay) +{ + if (ui->timer.map == (uint64_t)-1) { + fprintf(stderr, "%s ran out of timers\n", __func__); + return -1; + } + int ti = ffsl(~ui->timer.map) - 1; + ui->timer.map |= 1 << ti; + ui->timer.timers[ti].cb = cb; + ui->timer.timers[ti].param = param; + ui->timer.timers[ti].when = mui_get_time() + delay; + return 0; +} + +void +mui_timers_run( + mui_t *ui ) +{ + uint64_t now = mui_get_time(); + uint64_t map = ui->timer.map; + while (map) { + int ti = ffsl(map) - 1; + map &= ~(1 << ti); + if (ui->timer.timers[ti].when > now) + continue; + mui_time_t r = ui->timer.timers[ti].cb( + ui, now, + ui->timer.timers[ti].param); + if (r == 0) + ui->timer.map &= ~(1 << ti); + else + ui->timer.timers[ti].when += r; + } +} + +void +_mui_window_free( + mui_window_t *win); + +void +mui_garbage_collect( + mui_t * ui) +{ + mui_window_t *win, *safe; + TAILQ_FOREACH_SAFE(win, &ui->zombies, self, safe) { + TAILQ_REMOVE(&ui->zombies, win, self); + _mui_window_free(win); + } +} + +void +mui_run( + mui_t *ui) +{ + mui_timers_run(ui); + mui_garbage_collect(ui); +} + +bool +mui_has_active_windows( + mui_t *ui) +{ + mui_window_t *win; + TAILQ_FOREACH(win, &ui->windows, self) { + if (mui_menubar_window(win) || win->flags.hidden) + continue; + return true; + } + return false; +} diff --git a/libmui/mui/mui.h b/libmui/mui/mui.h new file mode 100644 index 0000000..6aa38d5 --- /dev/null +++ b/libmui/mui/mui.h @@ -0,0 +1,984 @@ +/* + * mui.h + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +/* + * This is the main include file for the libmui UI library, it should be + * the only one you need to include. + */ + +#pragma once + +#include +#include +#include +#include "c2_arrays.h" +#include "bsd_queue.h" +#include "stb_ttc.h" + +/* Four Character Constants are used everywhere. Wish this had become a standard, + * as it is so handy -- but nope, thus the macro. Annoyingly, the little- + * endianess of them makes it a pain to do a printf() with them, this is why + * the values are reversed here. + */ +#ifndef FCC +#define FCC(_a,_b,_c,_d) (((_d)<<24)|((_c)<<16)|((_b)<<8)|(_a)) +#endif + +enum mui_event_e { + MUI_EVENT_KEYUP = 0, + MUI_EVENT_KEYDOWN, + MUI_EVENT_BUTTONUP, + MUI_EVENT_BUTTONDOWN, + MUI_EVENT_WHEEL, + MUI_EVENT_DRAG, + // the following ones aren't supported yet + MUI_EVENT_MOUSEENTER, + MUI_EVENT_MOUSELEAVE, + MUI_EVENT_RESIZE, + MUI_EVENT_CLOSE, + MUI_EVENT_COUNT, +}; + +enum mui_key_e { + MUI_KEY_ESCAPE = 0x1b, + MUI_KEY_LEFT = 0x80, + MUI_KEY_UP, + MUI_KEY_RIGHT, + MUI_KEY_DOWN, + MUI_KEY_INSERT, + MUI_KEY_HOME, + MUI_KEY_END, + MUI_KEY_PAGEUP, + MUI_KEY_PAGEDOWN, + MUI_KEY_MODIFIERS = 0x90, + MUI_KEY_LSHIFT = MUI_KEY_MODIFIERS, + MUI_KEY_RSHIFT, + MUI_KEY_LCTRL, + MUI_KEY_RCTRL, + MUI_KEY_LALT, + MUI_KEY_RALT, + MUI_KEY_RSUPER, + MUI_KEY_LSUPER, + MUI_KEY_MODIFIERS_LAST, + MUI_KEY_F1 = 0x100, + MUI_KEY_F2, + MUI_KEY_F3, + MUI_KEY_F4, + MUI_KEY_F5, + MUI_KEY_F6, + MUI_KEY_F7, + MUI_KEY_F8, + MUI_KEY_F9, + MUI_KEY_F10, + MUI_KEY_F11, + MUI_KEY_F12, +}; + +enum mui_modifier_e { + MUI_MODIFIER_LSHIFT = (1 << (MUI_KEY_LSHIFT - MUI_KEY_MODIFIERS)), + MUI_MODIFIER_RSHIFT = (1 << (MUI_KEY_RSHIFT - MUI_KEY_MODIFIERS)), + MUI_MODIFIER_LCTRL = (1 << (MUI_KEY_LCTRL - MUI_KEY_MODIFIERS)), + MUI_MODIFIER_RCTRL = (1 << (MUI_KEY_RCTRL - MUI_KEY_MODIFIERS)), + MUI_MODIFIER_LALT = (1 << (MUI_KEY_LALT - MUI_KEY_MODIFIERS)), + MUI_MODIFIER_RALT = (1 << (MUI_KEY_RALT - MUI_KEY_MODIFIERS)), + MUI_MODIFIER_RSUPER = (1 << (MUI_KEY_RSUPER - MUI_KEY_MODIFIERS)), + MUI_MODIFIER_LSUPER = (1 << (MUI_KEY_LSUPER - MUI_KEY_MODIFIERS)), + + // special flag, trace events handling for this event + MUI_MODIFIER_EVENT_TRACE= (1 << 15), + MUI_MODIFIER_SHIFT = (MUI_MODIFIER_LSHIFT | MUI_MODIFIER_RSHIFT), + MUI_MODIFIER_CTRL = (MUI_MODIFIER_LCTRL | MUI_MODIFIER_RCTRL), + MUI_MODIFIER_ALT = (MUI_MODIFIER_LALT | MUI_MODIFIER_RALT), + MUI_MODIFIER_SUPER = (MUI_MODIFIER_LSUPER | MUI_MODIFIER_RSUPER), +}; + +/* + * The following constants are in UTF8 format, and relate to glyphs in + * the TTF fonts + */ +/* These are from the icon font */ +#define MUI_ICON_FOLDER "" +#define MUI_ICON_FOLDER_OPEN "" +#define MUI_ICON_ROOT "" +#define MUI_ICON_FILE "" +#define MUI_ICON_POPUP_ARROWS "" +#define MUI_ICON_HOME "" +#define MUI_ICON_SBAR_UP "" +#define MUI_ICON_SBAR_DOWN "" + +/* These are specific the Charcoal System font */ +#define MUI_GLYPH_APPLE "" // solid apple +#define MUI_GLYPH_OAPPLE "" // open apple +#define MUI_GLYPH_COMMAND "" +#define MUI_GLYPH_OPTION "" +#define MUI_GLYPH_CONTROL "" +#define MUI_GLYPH_SHIFT "" +#define MUI_GLYPH_TICK "" // tickmark for menus +#define MUI_GLYPH_SUBMENU "" // custom, for the hierarchical menus +#define MUI_GLYPH_IIE "" // custom, IIe glyph +/* These are also from Charcoal System font (added to the original) */ +#define MUI_GLYPH_F1 "" +#define MUI_GLYPH_F2 "" +#define MUI_GLYPH_F3 "" +#define MUI_GLYPH_F4 "" +#define MUI_GLYPH_F5 "" +#define MUI_GLYPH_F6 "" +#define MUI_GLYPH_F7 "" +#define MUI_GLYPH_F8 "" +#define MUI_GLYPH_F9 "" +#define MUI_GLYPH_F10 "" +#define MUI_GLYPH_F11 "" +#define MUI_GLYPH_F12 "" + +typedef uint64_t mui_time_t; + +/* + * Even description. pretty standard stuff here -- the 'when' field is + * only used really to detect double clicks so far. + * + * Even handlers should return true if the event was handled, (in which case + * even processing stops for that event) or false to continue passing the even + * down the chain. + * + * Events are passed to the top window first, and then down the chain of + * windows, until one of them returns true. + * Implicitely, it means the menubar gets to see the events first, even clicks, + * even if the click wasn't in the menubar. This is also true of key events of + * course, which allows the menu to detect key combos, first. + */ +typedef struct mui_event_t { + uint8_t type; + mui_time_t when; + uint32_t modifiers; + union { + struct key { + uint32_t key; + bool up; + } key; + struct { + uint32_t button; + c2_pt_t where; + } mouse; + struct { + int32_t delta; + c2_pt_t where; + } wheel; + }; +} mui_event_t; + +/* + * Key equivalent, used to match key events to menu items + * Might be extended to controls, right now only the 'key' is checked, + * mostly for Return and ESC. + */ +typedef union mui_key_equ_t { + struct { + uint16_t mod; + uint16_t key; + }; + uint32_t value; +} mui_key_equ_t; + +#define MUI_KEY_EQU(_mask, _key) \ + (mui_key_equ_t){ .mod = (_mask), .key = (_key) } + +struct mui_t; + +typedef struct mui_listbox_elem_t { + uint32_t disabled : 1; + char icon[8]; + void * elem; // char * or... ? +} mui_listbox_elem_t; + +DECLARE_C_ARRAY(mui_listbox_elem_t, mui_listbox_elems, 2); +IMPLEMENT_C_ARRAY(mui_listbox_elems); + +struct mui_control_t; +struct mui_window_t; +struct mui_listbox_elem_t; + +/* + * Window DEFinition -- Handle all related to a window, from drawing to + * even handling. + */ +enum { + MUI_WDEF_INIT = 0, + MUI_WDEF_DISPOSE, + MUI_WDEF_DRAW, + MUI_WDEF_EVENT, +}; +typedef bool (*mui_wdef_p)( + struct mui_window_t * win, + uint8_t what, + void * param); +enum { + MUI_CDEF_INIT = 0, + MUI_CDEF_DISPOSE, + MUI_CDEF_DRAW, + MUI_CDEF_EVENT, + MUI_CDEF_SET_STATE, + MUI_CDEF_SET_VALUE, + MUI_CDEF_SET_TITLE, + MUI_CDEF_SELECT, +}; +typedef bool (*mui_cdef_p)( + struct mui_control_t * c, + uint8_t what, + void * param); +typedef void (*mui_ldef_p)( + struct mui_control_t * c, + uint32_t elem_index, + struct mui_listbox_elem_t * elem); + +/* + * Timer callback definition. Behaves in a pretty standard way; the timer + * returns 0 to be cancelled (for one shot timers for example) or return + * the delay to the next call. + */ +typedef mui_time_t (*mui_timer_p)( + struct mui_t * mui, + mui_time_t now, + void * param); +/* + * Actions are the provided way to add custom response to events for the + * application; action handlers are called for a variety of things, from clicks + * in controls, to menu selections, to window close etc. + * + * The 'what' parameter is a 4 character code, that can be used to identify + * the action, and the 'param' is a pointer to a structure that depends on + * the 'what' action (hopefully documented with that action constant) + * + * the 'cb_param' is specific to this action function pointer and is passed as + * is to the callback. + */ +typedef int (*mui_window_action_p)( + struct mui_window_t * win, + void * cb_param, + uint32_t what, + void * param); +typedef int (*mui_control_action_p)( + struct mui_control_t *c, + void * cb_param, + uint32_t what, + void * param); +/* + * This is a standardized way of installing 'action' handlers onto windows + * and controls. The 'current' field is used to prevent re-entrance. This structure + * is opaque and is not accessible by the application, typically. + */ +typedef struct mui_action_t { + STAILQ_ENTRY(mui_action_t) self; + uint32_t current; // prevents re-entrance + union { + mui_window_action_p window_cb; + mui_control_action_p control_cb; + }; + void * cb_param; +} mui_action_t; + +typedef STAILQ_HEAD(, mui_action_t) mui_action_queue_t; + +struct cg_surface_t; +struct cg_ctx_t; + +/* + * Describes a pixmap. Currently only used for the screen destination pixels. + * And really, only bpp:43 for ARGB is supported. + */ +typedef struct mui_pixmap_t { + uint8_t * pixels; + uint32_t bpp : 8; + c2_pt_t size; + uint32_t row_bytes; +} mui_pixmap_t; + +typedef pixman_region32_t mui_region_t; + +DECLARE_C_ARRAY(mui_region_t, mui_clip_stack, 2); + +/* + * The Drawable is a drawing context -- currently there's only one for the + * whole screen, but technically we could have several. The important feature + * of this is that it keeps a context for the pixman library destination + * image, AND also the context for the 'cg' vectorial library. + * Furthermore it keeps track of a stack of clipping rectangles, and is able + * to 'sync' the current clipping area for either (or both) cg and libpixman. + */ +typedef struct mui_drawable_t { + mui_pixmap_t pix; // *has* to be first in struct + void * _pix_hash; // used to detect if pix has changed + struct cg_surface_t * cg_surface; + struct cg_ctx_t * cg; + union pixman_image * pixman; // (try) not to use these directly + unsigned int pixman_clip_dirty: 1, + cg_clip_dirty : 1; + mui_clip_stack_t clip; +} mui_drawable_t; + +/* + * Drawable related + */ +void +mui_drawable_dispose( + mui_drawable_t * dr); +// get/allocate a pixman structure for this drawable +union pixman_image * +mui_drawable_get_pixman( + mui_drawable_t * dr); +// get/allocate a cg drawing context for this +struct cg_ctx_t * +mui_drawable_get_cg( + mui_drawable_t * dr); +// return 0 (no intersect), 1: fully contained and 2: partial contains +int +mui_drawable_clip_intersects( + mui_drawable_t * dr, + c2_rect_p r ); +void +mui_drawable_set_clip( + mui_drawable_t * dr, + c2_rect_array_p clip ); +int +mui_drawable_clip_push( + mui_drawable_t * dr, + c2_rect_p r ); +int +mui_drawable_clip_push_region( + mui_drawable_t * dr, + pixman_region32_t * rgn ); +int +mui_drawable_clip_substract_region( + mui_drawable_t * dr, + pixman_region32_t * rgn ); +void +mui_drawable_clip_pop( + mui_drawable_t * dr ); +pixman_region32_t * +mui_drawable_clip_get( + mui_drawable_t * dr); + + +/* + * Your typical ARGB color. Note that the components are NOT + * alpha-premultiplied at this stage. + * This struct should be able to be passed as a value, not a pointer + */ +typedef union mui_color_t { + struct { + uint8_t a,r,g,b; + } __attribute__((packed)); + uint32_t value; + uint8_t v[4]; +} mui_color_t; + +typedef struct mui_control_color_t { + mui_color_t fill, frame, text; +} mui_control_color_t; + +#define MUI_COLOR(_v) ((mui_color_t){ .value = (_v)}) + +#define CG_COLOR(_c) (struct cg_color_t){ \ + .a = (_c).a / 255.0, .r = (_c).r / 255.0, \ + .g = (_c).g / 255.0, .b = (_c).b / 255.0 } +/* + * Pixman use premultiplied alpha values + */ +#define PIXMAN_COLOR(_c) (pixman_color_t){ \ + .alpha = (_c).a * 257, .red = (_c).r * (_c).a, \ + .green = (_c).g * (_c).a, .blue = (_c).b * (_c).a } + + +typedef struct mui_font_t { + mui_drawable_t font; // points to ttc pixels! + char * name; // not filename, internal name, aka 'main' + unsigned int size; // in pixels + TAILQ_ENTRY(mui_font_t) self; + struct stb_ttc_info ttc; +} mui_font_t; + +/* + * Font related + */ +void +mui_font_init( + struct mui_t * ui); +void +mui_font_dispose( + struct mui_t * ui); + +mui_font_t * +mui_font_find( + struct mui_t * ui, + const char * name); +void +mui_font_text_draw( + mui_font_t * font, + mui_drawable_t *dr, + c2_pt_t where, + const char * text, + unsigned int text_len, + mui_color_t color); +int +mui_font_text_measure( + mui_font_t * font, + const char * text, + struct stb_ttc_measure *m ); + +enum mui_text_align_e { + MUI_TEXT_ALIGN_LEFT = 0, + MUI_TEXT_ALIGN_CENTER = (1 << 0), + MUI_TEXT_ALIGN_RIGHT = (1 << 1), + MUI_TEXT_ALIGN_TOP = 0, + MUI_TEXT_ALIGN_MIDDLE = (MUI_TEXT_ALIGN_CENTER << 2), + MUI_TEXT_ALIGN_BOTTOM = (MUI_TEXT_ALIGN_RIGHT << 2), +}; + +void +mui_font_textbox( + mui_font_t * font, + mui_drawable_t *dr, + c2_rect_t bbox, + const char * text, + unsigned int text_len, + mui_color_t color, + uint16_t flags ); +DECLARE_C_ARRAY(stb_ttc_g*, mui_glyph_array, 8, int x, y, w; ); +DECLARE_C_ARRAY(mui_glyph_array_t, mui_glyph_line_array, 8); + +/* + * Measure a text string, return the number of lines, and each glyphs + * position already aligned to the MUI_TEXT_ALIGN_* flags. + */ +void +mui_font_measure( + mui_font_t * font, + c2_rect_t bbox, + const char * text, + unsigned int text_len, + mui_glyph_line_array_t *lines, + uint16_t flags); +// clear all the lines, and glyph lists. Use it after mui_font_measure +void +mui_font_measure_clear( + mui_glyph_line_array_t *lines); + + +enum mui_window_layer_e { + MUI_WINDOW_LAYER_NORMAL = 0, + MUI_WINDOW_LAYER_MODAL = 3, + MUI_WINDOW_LAYER_ALERT = 5, + MUI_WINDOW_LAYER_TOP = 15, + // Menubar and Menus (popups) are also windows + MUI_WINDOW_MENUBAR_LAYER = MUI_WINDOW_LAYER_TOP - 1, + MUI_WINDOW_MENU_LAYER, +}; + +enum mui_window_action_e { + MUI_WINDOW_ACTION_NONE = 0, + MUI_WINDOW_ACTION_CLOSE = FCC('w','c','l','s'), +}; + +typedef struct mui_window_t { + TAILQ_ENTRY(mui_window_t) self; + struct mui_t * ui; + mui_wdef_p wdef; + uint32_t uid; // optional, pseudo unique id + struct { + unsigned long hidden: 1, + zombie: 1, // is in pre-delete ui->zombies + layer : 4, + hit_part : 8; + } flags; + c2_pt_t click_loc; + struct mui_drawable_t * dr; + // both these rectangles are in screen coordinates, even tho + // 'contents' is fully included in 'frame' + c2_rect_t frame, content; + char * title; + mui_action_queue_t actions; + TAILQ_HEAD(controls, mui_control_t) controls; + // anything deleted during an action goes in zombies + TAILQ_HEAD(zombies, mui_control_t) zombies; + struct mui_control_t * control_clicked; + mui_region_t inval; +} mui_window_t; + +/* + * Window related + */ +mui_window_t * +mui_window_create( + struct mui_t * ui, + c2_rect_t frame, + mui_wdef_p wdef, + uint8_t layer, + const char * title, + uint32_t instance_size); +// Dispose a window and it's content (controls). +/* + * Note: if an action is in progress the window is not freed immediately + * but added to the zombie list, and freed when the action is done. + * This is to prevent re-entrance problems. This allows window actions to + * delete their own window without crashing. + */ +void +mui_window_dispose( + mui_window_t * win); +// Invalidate 'r' in window coordinates, or the whole window if 'r' is NULL +void +mui_window_inval( + mui_window_t * win, + c2_rect_t * r); +// return true if the window is the frontmost window (in that window's layer) +bool +mui_window_isfront( + mui_window_t * win); +// return the top (non menubar/menu) window +mui_window_t * +mui_window_front( + struct mui_t *ui); + +// move win to the front (of its layer), return true if it was moved +bool +mui_window_select( + mui_window_t * win); +// call the window action callback, if any +void +mui_window_action( + mui_window_t * c, + uint32_t what, + void * param ); +// add an action callback for this window +void +mui_window_set_action( + mui_window_t * c, + mui_window_action_p cb, + void * param ); +// return the window whose UID is 'uid', or NULL if not found +mui_window_t * +mui_window_get_by_id( + struct mui_t * ui, + uint32_t uid ); +// set the window UID +void +mui_window_set_id( + mui_window_t * win, + uint32_t uid); + +struct mui_menu_items_t; + +/* + * This is a menu item descriptor (also used for the titles, bar a few bits). + * This does not a *control* in the window, instead this is used to describe + * the menus and menu item controls that are created when the menu becomes visible. + */ +typedef struct mui_menu_item_t { + uint32_t disabled : 1, hilited : 1; + uint32_t index: 9; + uint32_t uid; + char * title; + char mark[8]; // UTF8 -- Charcoal + char icon[8]; // UTF8 -- Wider, icon font + char kcombo[16]; // UTF8 -- display only + mui_key_equ_t key_equ; // keystroke to select this item + struct mui_menu_item_t * submenu; + c2_pt_t location; // calculated by menu creation code +} mui_menu_item_t; + +/* + * The menu item array is atypical as the items ('e' field) are not allocated + * by the array, but by the menu creation code. This is because the menu + * reuses the pointer to the items that is passed when the menu is added to + * the menubar. + * the 'read only' field is used to prevent the array from trying to free the + * items when being disposed. + */ +DECLARE_C_ARRAY(mui_menu_item_t, mui_menu_items, 2, + bool read_only; ); +IMPLEMENT_C_ARRAY(mui_menu_items); + +enum { + // parameter is a mui_menu_item_t* for the first item of the menu, + // this is exactly the parameter passed to add_simple() + // you can use this to disable/enable menu items etc + MUI_MENUBAR_ACTION_PREPARE = FCC('m','b','p','r'), + // parameter 'target' is a mui_menuitem_t* + MUI_MENUBAR_ACTION_SELECT = FCC('m','b','a','r'), +}; +/* + * Menu related. + * Menubar, and menus/popups are windows as well, in a layer above the + * normal ones. + */ +mui_window_t * +mui_menubar_new( + struct mui_t * ui ); +// return the previously created menubar (or NULL) +mui_window_t * +mui_menubar_get( + struct mui_t * ui ); + +/* + * Add a menu to the menubar. 'items' is an array of mui_menu_item_t + * terminated by an element with a NULL title. + * Note: The array is NOT const, it will be tweaked for storing items position, + * it can also be tweaked to set/reset the disabled state, check marks etc + */ +struct mui_control_t * +mui_menubar_add_simple( + mui_window_t * win, + const char * title, + uint32_t menu_uid, + mui_menu_item_t * items ); +/* Turn off any highlighted menu titles */ +mui_window_t * +mui_menubar_highlight( + mui_window_t * win, + bool ignored ); + +enum mui_control_type_e { + MUI_CONTROL_NONE = 0, + MUI_CONTROL_BUTTON, + MUI_CONTROL_GROUP, + MUI_CONTROL_SEPARATOR, + MUI_CONTROL_TEXTBOX, + MUI_CONTROL_GROUPBOX, + MUI_CONTROL_LISTBOX, + MUI_CONTROL_SCROLLBAR, + MUI_CONTROL_MENUTITLE, + MUI_CONTROL_MENUITEM, + MUI_CONTROL_SUBMENUITEM, + MUI_CONTROL_POPUP, +}; + +enum { + MUI_BUTTON_STYLE_NORMAL = 0, + MUI_BUTTON_STYLE_DEFAULT = 1, + MUI_BUTTON_STYLE_RADIO, + MUI_BUTTON_STYLE_CHECKBOX, +}; + +enum { + MUI_CONTROL_STATE_NORMAL = 0, + MUI_CONTROL_STATE_HOVER, + MUI_CONTROL_STATE_CLICKED, + MUI_CONTROL_STATE_DISABLED, + MUI_CONTROL_STATE_COUNT +}; + +enum { + MUI_CONTROL_ACTION_NONE = 0, + MUI_CONTROL_ACTION_VALUE_CHANGED = FCC('c','v','a','l'), + MUI_CONTROL_ACTION_CLICKED = FCC('c','l','k','d'), + MUI_CONTROL_ACTION_SELECT = FCC('c','s','e','l'), + MUI_CONTROL_ACTION_DOUBLECLICK = FCC('c','d','c','l'), +}; + +/* + * Control record... this are the 'common' fields, most of the controls + * have their own 'extended' record using their own fields. + */ +typedef struct mui_control_t { + TAILQ_ENTRY(mui_control_t) self; + struct mui_window_t * win; + mui_cdef_p cdef; + uint32_t state; + uint32_t type; + uint32_t style; + struct { + unsigned int hidden : 1, + zombie : 1, + hit_part : 8; + } flags; + uint32_t value; + uint32_t uid; + uint32_t uid_mask; // for radio buttons + c2_rect_t frame; + mui_key_equ_t key_equ; // keystroke to select this control + char * title; + mui_action_queue_t actions; +} mui_control_t; + +/* + * Control related + */ +mui_control_t * +mui_control_new( + mui_window_t * win, + uint8_t type, + mui_cdef_p cdef, + c2_rect_t frame, + const char * title, + uint32_t uid, + uint32_t instance_size ); +void +mui_control_dispose( + mui_control_t * c ); +uint32_t +mui_control_get_type( + mui_control_t * c ); +uint32_t +mui_control_get_uid( + mui_control_t * c ); +mui_control_t * +mui_control_locate( + mui_window_t * win, + c2_pt_t pt ); +mui_control_t * +mui_control_get_by_id( + mui_window_t * win, + uint32_t uid ); +void +mui_control_inval( + mui_control_t * c ); +void +mui_control_action( + mui_control_t * c, + uint32_t what, + void * param ); +void +mui_control_set_action( + mui_control_t * c, + mui_control_action_p cb, + void * param ); +void +mui_control_set_state( + mui_control_t * c, + uint32_t state ); +uint32_t +mui_control_get_state( + mui_control_t * c ); + +int32_t +mui_control_get_value( + mui_control_t * c); +int32_t +mui_control_set_value( + mui_control_t * c, + int32_t selected); +const char * +mui_control_get_title( + mui_control_t * c ); +void +mui_control_set_title( + mui_control_t * c, + const char * text ); + +mui_control_t * +mui_button_new( + mui_window_t * win, + c2_rect_t frame, + uint8_t style, + const char * title, + uint32_t uid ); +/* + * Create a static text box. Font is optional, flags correponds to the MUI_TEXT_ALIGN_* + * PLUS the extrast listed below. + */ +enum mui_textbox_e { + MUI_CONTROL_TEXTBOX_FRAME = (1 << 8), +}; +mui_control_t * +mui_textbox_new( + mui_window_t * win, + c2_rect_t frame, + const char * text, + const char * font, + uint16_t flags ); +mui_control_t * +mui_groupbox_new( + mui_window_t * win, + c2_rect_t frame, + const char * title, + uint16_t flags ); + +mui_control_t * +mui_scrollbar_new( + mui_window_t * win, + c2_rect_t frame, + uint32_t uid ); +uint32_t +mui_scrollbar_get_max( + mui_control_t * c); +void +mui_scrollbar_set_max( + mui_control_t * c, + uint32_t max); +void +mui_scrollbar_set_page( + mui_control_t * c, + uint32_t page); + +mui_control_t * +mui_listbox_new( + mui_window_t * win, + c2_rect_t frame, + uint32_t uid ); +void +mui_listbox_prepare( + mui_control_t * c); +mui_listbox_elems_t * +mui_listbox_get_elems( + mui_control_t * c); +mui_control_t * +mui_separator_new( + mui_window_t * win, + c2_rect_t frame); +mui_control_t * +mui_popupmenu_new( + mui_window_t * win, + c2_rect_t frame, + const char * title, + uint32_t uid ); +mui_menu_items_t * +mui_popupmenu_get_items( + mui_control_t * c); +void +mui_popupmenu_prepare( + mui_control_t * c); + +/* + * Standard file dialog + */ +enum mui_std_action_e { + MUI_STDF_ACTION_NONE = 0, + // parameter 'target' is a char * with full pathname of selected file + MUI_STDF_ACTION_SELECT = FCC('s','t','d','s'), + MUI_STDF_ACTION_CANCEL = FCC('s','t','d','c'), +}; + +mui_window_t * +mui_stdfile_get( + struct mui_t * ui, + c2_pt_t where, + const char * prompt, + const char * regexp, + const char * start_path ); +// return the curently selected pathname -- caller must free() it +char * +mui_stdfile_get_selected_path( + mui_window_t * w ); + +/* + * Alert dialog + */ +enum { + MUI_ALERT_FLAG_OK = (1 << 0), + MUI_ALERT_FLAG_CANCEL = (1 << 1), + + MUI_ALERT_ICON_INFO = (1 << 8), + + MUI_ALERT_INFO = (MUI_ALERT_FLAG_OK | MUI_ALERT_ICON_INFO), + MUI_ALERT_WARN = (MUI_ALERT_FLAG_OK | MUI_ALERT_FLAG_CANCEL), +}; + +enum { + MUI_ALERT_BUTTON_OK = FCC('o','k',' ',' '), + MUI_ALERT_BUTTON_CANCEL = FCC('c','a','n','c'), +}; + +mui_window_t * +mui_alert( + struct mui_t * ui, + c2_pt_t where, // (0,0) will center it + const char * title, + const char * message, + uint16_t flags ); + +enum { + MUI_TIME_RES = 1, + MUI_TIME_SECOND = 1000000, + MUI_TIME_MS = (MUI_TIME_SECOND/1000), +}; +mui_time_t +mui_get_time(); + +typedef struct mui_timer_group_t { + uint64_t map; + struct { + mui_time_t when; + mui_timer_p cb; + void * param; + } timers[64]; +} mui_timer_group_t; + +/* + * Register 'cb' to be called after 'delay'. Returns a timer id (0 to 63) + * or 0xff if no timer is available. The timer function cb can return 0 for a one + * shot timer, or another delay that will be added to the current stamp for a further + * call of the timer. + * 'param' will be also passed to the timer callback. + */ +uint8_t +mui_timer_register( + struct mui_t * ui, + mui_timer_p cb, + void * param, + uint32_t delay); + +typedef struct mui_t { + c2_pt_t screen_size; + mui_color_t clear_color; + uint16_t modifier_keys; + int draw_debug; + // this is the sum of all the window's dirty regions, inc moved windows etc + mui_region_t inval; + // once the pixels have been refreshed, 'inval' is copied to 'redraw' + // to push the pixels to the screen. + mui_region_t redraw; + + TAILQ_HEAD(, mui_font_t) fonts; + TAILQ_HEAD(windows, mui_window_t) windows; + mui_window_t * menubar; + TAILQ_HEAD(, mui_window_t) zombies; + // this is used to track any active action callbacks to + // prevent recursion problem and track any 'delete' happening + // during an action callback + uint32_t action_active; + mui_window_t * event_capture; + mui_timer_group_t timer; + char * pref_directory; /* optional */ +} mui_t; + +void +mui_init( + mui_t * ui); +void +mui_dispose( + mui_t * ui); +void +mui_draw( + mui_t * ui, + mui_drawable_t *dr, + uint16_t all); +void +mui_run( + mui_t * ui); +// return true if the event was handled by the ui +bool +mui_handle_event( + mui_t * ui, + mui_event_t * ev); +// return true if event 'ev' is a key combo matching key_equ +bool +mui_event_match_key( + mui_event_t * ev, + mui_key_equ_t key_equ); +/* Return true if the ui has any active windows, ie, not hidden, zombie; + * This does not include the menubar, but it does include any menus or popups + * + * This is used to decide wether to hide the mouse cursor or not + */ +bool +mui_has_active_windows( + mui_t * ui); + +/* Return a hash value for string inString */ +uint32_t +mui_hash( + const char * inString ); diff --git a/libmui/mui/mui_alert.c b/libmui/mui/mui_alert.c new file mode 100644 index 0000000..0647bff --- /dev/null +++ b/libmui/mui/mui_alert.c @@ -0,0 +1,90 @@ +/* + * mui_alert.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +#include "mui.h" + + +typedef struct mui_alert_t { + mui_window_t win; + mui_control_t * ok, *cancel; +} mui_alert_t; + +static int +_mui_alert_button_cb( + mui_control_t * c, + void * cb_param, + uint32_t what, + void * param) +{ +// mui_alert_t * alert = (mui_alert_t *)c->win; + + // notify the window handler of the control action + mui_window_action(c->win, what, c); + mui_window_dispose(c->win); + return 0; +} + +mui_window_t * +mui_alert( + struct mui_t * ui, + c2_pt_t where, + const char * title, + const char * message, + uint16_t flags ) +{ + c2_rect_t cf = C2_RECT_WH(0, 0, 540, 200); + + if (where.x && where.y) + c2_rect_offset(&cf, where.x, where.y); + else + c2_rect_offset(&cf, + (ui->screen_size.x / 2) - (c2_rect_width(&cf) / 2), + (ui->screen_size.y * 0.3) - (c2_rect_height(&cf) / 2)); + mui_window_t *w = mui_window_create(ui, cf, + NULL, MUI_WINDOW_LAYER_ALERT, + title, sizeof(mui_alert_t)); + mui_alert_t * alert = (mui_alert_t *)w; + mui_control_t * c = NULL; + + cf = C2_RECT_WH(0, 0, 120, 40); + c2_rect_left_of(&cf, c2_rect_width(&w->content), 20); + c2_rect_top_of(&cf, c2_rect_height(&w->content), 20); + if (flags & MUI_ALERT_FLAG_OK) { + alert->ok = c = mui_button_new(w, cf, MUI_BUTTON_STYLE_DEFAULT, + "OK", MUI_ALERT_BUTTON_OK); + alert->ok->key_equ = MUI_KEY_EQU(0, 13); // return + c2_rect_left_of(&cf, cf.l, 30); + } + if (flags & MUI_ALERT_FLAG_CANCEL) { + alert->cancel = c = mui_button_new(w, cf, MUI_BUTTON_STYLE_NORMAL, + "Cancel", MUI_ALERT_BUTTON_CANCEL); + alert->cancel->key_equ = MUI_KEY_EQU(0, 27); // ESC + } + cf = C2_RECT_WH(0, 10, 540-140, 70); + c2_rect_left_of(&cf, c2_rect_width(&w->content), 20); + c = mui_textbox_new(w, cf, message, NULL, 0); + cf = C2_RECT_WH(10, 10, 80, 75); + c = mui_textbox_new(w, cf, + "", "icon_large", + MUI_TEXT_ALIGN_CENTER | MUI_TEXT_ALIGN_MIDDLE); + + c = NULL; + TAILQ_FOREACH(c, &w->controls, self) { + if (mui_control_get_uid(c) == 0) + continue; + mui_control_set_action(c, _mui_alert_button_cb, alert); + } + + return w; +} + diff --git a/libmui/mui/mui_cdef_boxes.c b/libmui/mui/mui_cdef_boxes.c new file mode 100644 index 0000000..bb3e723 --- /dev/null +++ b/libmui/mui/mui_cdef_boxes.c @@ -0,0 +1,188 @@ +/* + * mui_cdef_boxes.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#include "mui.h" +#include "cg.h" + +typedef struct mui_textbox_control_t { + mui_control_t control; + mui_font_t * font; + uint16_t flags; +} mui_textbox_control_t; + +extern const mui_control_color_t mui_control_color[MUI_CONTROL_STATE_COUNT]; + +static void +mui_textbox_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ) +{ + c2_rect_t f = c->frame; + c2_rect_offset(&f, win->content.l, win->content.t); + + mui_textbox_control_t *tb = (mui_textbox_control_t *)c; + + c2_rect_t text_frame = f; + mui_drawable_clip_push(dr, &f); + mui_font_textbox(tb->font, dr, + text_frame, c->title, strlen(c->title), + mui_control_color[c->state].text, + tb->flags); + if (tb->flags & MUI_CONTROL_TEXTBOX_FRAME) { + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + cg_set_line_width(cg, 1); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].frame)); + cg_rectangle(cg, f.l, f.t, + c2_rect_width(&f), c2_rect_height(&f)); + cg_stroke(cg); + } + mui_drawable_clip_pop(dr); +} + +static void +mui_groupbox_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ) +{ + c2_rect_t f = c->frame; + c2_rect_offset(&f, win->content.l, win->content.t); + + mui_textbox_control_t *tb = (mui_textbox_control_t *)c; + + c2_rect_t text_frame = f; + c2_rect_t box_frame = f; + + mui_font_t * main = mui_font_find(win->ui, "main"); + stb_ttc_measure m = {}; + mui_font_text_measure(main, c->title, &m); + text_frame.l += main->size * 0.3; + text_frame.b = text_frame.t + main->size; + text_frame.r = text_frame.l + m.x1 + m.x0; + box_frame.t += m.ascent * 0.85; + + mui_color_t contentFill = MUI_COLOR(0xf0f0f0ff); + mui_color_t decoColor = MUI_COLOR(0x666666ff); + + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + cg_set_line_width(cg, 1); + cg_set_source_color(cg, &CG_COLOR(decoColor)); + cg_rectangle(cg, box_frame.l, box_frame.t, + c2_rect_width(&box_frame), c2_rect_height(&box_frame)); + cg_stroke(cg); + // now erase text background + cg_set_source_color(cg, &CG_COLOR(contentFill)); + cg_rectangle(cg, text_frame.l, text_frame.t, + c2_rect_width(&text_frame), c2_rect_height(&text_frame)); + cg_fill(cg); + +// mui_drawable_clip_push(dr, &f); + mui_font_textbox(main, dr, + text_frame, c->title, strlen(c->title), + mui_control_color[c->state].text, + tb->flags); +// mui_drawable_clip_pop(dr); +} + +static void +mui_separator_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ) +{ + c2_rect_t f = c->frame; + c2_rect_offset(&f, win->content.l, win->content.t); + +// mui_drawable_clip_push(dr, &f); + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + cg_set_line_width(cg, 1); + + mui_color_t decoColor = MUI_COLOR(0x666666ff); + cg_set_source_color(cg, &CG_COLOR(decoColor)); + cg_move_to(cg, f.l + 0, f.t); + cg_line_to(cg, f.r - 0, f.t); + cg_stroke(cg); +// mui_drawable_clip_pop(dr); +} + +static bool +mui_cdef_boxes( + struct mui_control_t * c, + uint8_t what, + void * param) +{ +// mui_textbox_control_t *tb = (mui_textbox_control_t *)c; + switch (what) { + case MUI_CDEF_DRAW: { + mui_drawable_t * dr = param; + switch (c->type) { + case MUI_CONTROL_SEPARATOR: + mui_separator_draw(c->win, c, dr); + break; + case MUI_CONTROL_GROUPBOX: + mui_groupbox_draw(c->win, c, dr); + break; + case MUI_CONTROL_TEXTBOX: + mui_textbox_draw(c->win, c, dr); + break; + default: + break; + } + } break; + } + return false; +} + +mui_control_t * +mui_textbox_new( + mui_window_t * win, + c2_rect_t frame, + const char * text, + const char * font, + uint16_t flags ) +{ + mui_control_t * c = mui_control_new( + win, MUI_CONTROL_TEXTBOX, mui_cdef_boxes, + frame, text, 0, sizeof(mui_textbox_control_t)); + mui_textbox_control_t *tb = (mui_textbox_control_t *)c; + tb->font = mui_font_find(win->ui, font ? font : "main"); + tb->flags = flags; + return c; +} + +mui_control_t * +mui_separator_new( + mui_window_t * win, + c2_rect_t frame) +{ + return mui_control_new( + win, MUI_CONTROL_SEPARATOR, mui_cdef_boxes, + frame, NULL, 0, sizeof(mui_textbox_control_t)); +} + +mui_control_t * +mui_groupbox_new( + mui_window_t * win, + c2_rect_t frame, + const char * title, + uint16_t flags ) +{ + mui_control_t * c = mui_control_new( + win, MUI_CONTROL_GROUPBOX, mui_cdef_boxes, + frame, title, 0, sizeof(mui_textbox_control_t)); + mui_textbox_control_t *tb = (mui_textbox_control_t *)c; + tb->flags = flags; + return c; +} diff --git a/libmui/mui/mui_cdef_buttons.c b/libmui/mui/mui_cdef_buttons.c new file mode 100644 index 0000000..183a840 --- /dev/null +++ b/libmui/mui/mui_cdef_buttons.c @@ -0,0 +1,267 @@ +/* + * mui_cdef_buttons.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#include "mui.h" +#include "cg.h" + + +extern const mui_control_color_t mui_control_color[MUI_CONTROL_STATE_COUNT]; + +#define BUTTON_INSET 4 +void +mui_button_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ) +{ + c2_rect_t f = c->frame; + c2_rect_offset(&f, win->content.l, win->content.t); + + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].frame)); + if (c->style == MUI_BUTTON_STYLE_DEFAULT) { + cg_set_line_width(cg, 3); + cg_round_rectangle(cg, f.l, f.t, + c2_rect_width(&f), c2_rect_height(&f), + 10, 10); + cg_stroke(cg); + c2_rect_inset(&f, BUTTON_INSET, BUTTON_INSET); + } + mui_font_t * main = TAILQ_FIRST(&win->ui->fonts); + stb_ttc_measure m = {}; + mui_font_text_measure(main, c->title, &m); + + int title_width = m.x1 - m.x0; + c2_rect_t title = f; + title.r = title.l + title_width + 1; + title.b = title.t + m.ascent - m.descent; + c2_rect_offset(&title, -m.x0 + + (int)((c2_rect_width(&f) / 2) - (c2_rect_width(&title)) / 2), + (c2_rect_height(&f) / 2) - (c2_rect_height(&title) / 2)); + mui_drawable_clip_push(dr, &f); + cg = mui_drawable_get_cg(dr); + c2_rect_t inner = f; + c2_rect_inset(&inner, 1, 1); + cg_set_line_width(cg, 2); + cg_round_rectangle(cg, inner.l, inner.t, + c2_rect_width(&inner), c2_rect_height(&inner), 6, 6); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].fill)); + cg_fill_preserve(cg); +// cg_rectangle(cg, title.l, title.t, +// c2_rect_width(&title), c2_rect_height(&title)); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].frame)); + cg_stroke(cg); + mui_font_text_draw(main, dr, + C2_PT(title.l, title.t), c->title, strlen(c->title), + mui_control_color[c->state].text); + mui_drawable_clip_pop(dr); +} + +void +mui_check_rad_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ) +{ + mui_font_t * main = mui_font_find(win->ui, "main"); + c2_rect_t f = c->frame; + c2_rect_offset(&f, win->content.l, win->content.t); + + c2_rect_t box = f; + box.r = box.l + (main->size * 0.95); + box.b = box.t + (main->size * 0.95); + c2_rect_offset(&box, 0, (c2_rect_height(&f) / 2) - (c2_rect_height(&box) / 2)); + c2_rect_t title = f; + title.l = box.r + 8; + + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + + mui_drawable_clip_push(dr, &f); + + // draw the box/circle + if (c->style == MUI_BUTTON_STYLE_RADIO) { + cg_circle(cg, box.l + (c2_rect_width(&box) / 2), + box.t + (c2_rect_height(&box) / 2), + c2_rect_width(&box) / 2); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].fill)); + cg_fill_preserve(cg); + cg_set_line_width(cg, 2); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].frame)); + cg_stroke(cg); + if (c->value) { // fill the inside circle + c2_rect_inset(&box, 5, 5); + cg_circle(cg, box.l + (c2_rect_width(&box) / 2), + box.t + (c2_rect_height(&box) / 2), + c2_rect_width(&box) / 2); + cg_fill(cg); + } + } else { + cg_rectangle(cg, box.l, box.t, + c2_rect_width(&box), c2_rect_height(&box)); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].fill)); + cg_fill_preserve(cg); + cg_set_line_width(cg, 2); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].frame)); + cg_stroke(cg); + // now the cross + if (c->value) { + cg_set_line_width(cg, 2); + cg_move_to(cg, box.l, box.t); + cg_line_to(cg, box.r, box.b); + cg_move_to(cg, box.r, box.t); + cg_line_to(cg, box.l, box.b); + cg_stroke(cg); + } + } + mui_font_textbox(main, dr, + title, c->title, 0, + mui_control_color[0].text, + MUI_TEXT_ALIGN_MIDDLE); + mui_drawable_clip_pop(dr); +} + + +static bool +mui_button_mouse( + struct mui_control_t * c, + mui_event_t * ev) +{ + if (c->state == MUI_CONTROL_STATE_DISABLED) + return false; + + c2_rect_t f = c->frame; + c2_rect_offset(&f, c->win->content.l, c->win->content.t); + + switch (ev->type) { + case MUI_EVENT_BUTTONDOWN: { + if (c2_rect_contains_pt(&f, &ev->mouse.where)) + mui_control_set_state(c, MUI_CONTROL_STATE_CLICKED); + } break; + case MUI_EVENT_BUTTONUP: { + if (c->state != MUI_CONTROL_STATE_CLICKED) + break; + mui_control_set_state(c, MUI_CONTROL_STATE_NORMAL); + switch (c->style) { + case MUI_BUTTON_STYLE_NORMAL: + case MUI_BUTTON_STYLE_DEFAULT: + break; + /* Look for all other matching radio buttons, turn + * their values off, before setting this one to on */ + case MUI_BUTTON_STYLE_RADIO: { + if (c->uid_mask) { + mui_control_t * c2 = NULL; + TAILQ_FOREACH(c2, &c->win->controls, self) { + if (c2->type == MUI_CONTROL_BUTTON && + c2->style == MUI_BUTTON_STYLE_RADIO && + (c2->uid & c->uid_mask) == (c->uid & c->uid_mask) && + c2 != c) { + // printf("OFF %4.4s\n", (char*)&c2->uid); + mui_control_set_value(c2, false); + } + } + } + // printf("ON %4.4s\n", (char*)&c->uid); + mui_control_set_value(c, true); + } break; + case MUI_BUTTON_STYLE_CHECKBOX: + mui_control_set_value(c, + !mui_control_get_value(c)); + break; + } + mui_control_action(c, MUI_CONTROL_ACTION_SELECT, NULL); + } break; + case MUI_EVENT_DRAG: { + if (c2_rect_contains_pt(&f, &ev->mouse.where)) + mui_control_set_state(c, MUI_CONTROL_STATE_CLICKED); + else + mui_control_set_state(c, MUI_CONTROL_STATE_NORMAL); + } break; + } + return true; +} + +static bool +mui_cdef_button( + struct mui_control_t * c, + uint8_t what, + void * param) +{ + switch (what) { + case MUI_CDEF_INIT: + break; + case MUI_CDEF_DISPOSE: + break; + case MUI_CDEF_DRAW: { + mui_drawable_t * dr = param; + switch (c->style) { + case MUI_BUTTON_STYLE_NORMAL: + case MUI_BUTTON_STYLE_DEFAULT: + mui_button_draw(c->win, c, dr); + break; + case MUI_BUTTON_STYLE_CHECKBOX: + case MUI_BUTTON_STYLE_RADIO: + mui_check_rad_draw(c->win, c, dr); + break; + default: + return false; + } + } break; + case MUI_CDEF_EVENT: { + mui_event_t *ev = param; + // printf("%s event %d where %dx%d\n", __func__, ev->type, + // ev->mouse.where.x, + // ev->mouse.where.y); + switch (ev->type) { + case MUI_EVENT_BUTTONUP: + case MUI_EVENT_DRAG: + case MUI_EVENT_BUTTONDOWN: { + return mui_button_mouse(c, ev); + } break; + } + } break; + case MUI_CDEF_SELECT: { + if (c->style == MUI_BUTTON_STYLE_CHECKBOX) { + mui_control_set_value(c, !c->value); + } + } break; + } + return false; +} + +mui_control_t * +mui_button_new( + mui_window_t * win, + c2_rect_t frame, + uint8_t style, + const char * title, + uint32_t uid ) +{ + switch (style) { + case MUI_BUTTON_STYLE_NORMAL: + break; + case MUI_BUTTON_STYLE_DEFAULT: + c2_rect_inset(&frame, -BUTTON_INSET, -BUTTON_INSET); + break; + case MUI_BUTTON_STYLE_CHECKBOX: + break; + case MUI_BUTTON_STYLE_RADIO: + break; + } + mui_control_t * c = mui_control_new( + win, MUI_CONTROL_BUTTON, mui_cdef_button, + frame, title, uid, 0); + c->style = style; + return c; +} diff --git a/libmui/mui/mui_cdef_listbox.c b/libmui/mui/mui_cdef_listbox.c new file mode 100644 index 0000000..564f427 --- /dev/null +++ b/libmui/mui/mui_cdef_listbox.c @@ -0,0 +1,307 @@ +/* + * mui_cdef_listbox.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#include "mui.h" +#include "cg.h" + +typedef struct mui_listbox_control_t { + mui_control_t control; + struct mui_control_t * scrollbar; + int32_t scroll; + uint8_t elem_height; + mui_listbox_elems_t elems; + mui_ldef_p ldef; + // to handle double-click + mui_time_t last_click; +} mui_listbox_control_t; + +extern const mui_control_color_t mui_control_color[MUI_CONTROL_STATE_COUNT]; + +static void +mui_listbox_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ) +{ + c2_rect_t f = c->frame; + c2_rect_offset(&f, win->content.l, win->content.t); + + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + cg_set_line_width(cg, 1); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].frame)); + cg_rectangle(cg, f.l, f.t, + c2_rect_width(&f), c2_rect_height(&f)); + cg_stroke(cg); + { + c2_rect_t clip = f; + c2_rect_inset(&clip, 1, 1); + mui_drawable_clip_push(dr, &clip); + } + mui_listbox_control_t *lb = (mui_listbox_control_t *)c; + uint32_t top_element = lb->scroll / lb->elem_height; + uint32_t bottom_element = top_element + 1 + + (c2_rect_height(&f) / lb->elem_height); +// printf("%s draw from %d to %d\n", __func__, top_element, bottom_element); + + mui_font_t * icons = mui_font_find(win->ui, "icon_small"); + mui_font_t * main = mui_font_find(win->ui, "main"); + mui_color_t highlight = MUI_COLOR(0xd6fcc0ff); + + for (unsigned int ii = top_element; + ii < lb->elems.count && ii < bottom_element; ii++) { + c2_rect_t ef = f; + ef.b = ef.t + lb->elem_height; + c2_rect_offset(&ef, 0, ii * lb->elem_height - lb->scroll); + if (ii == c->value) { + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + cg_set_line_width(cg, 1); + cg_set_source_color(cg, &CG_COLOR(highlight)); + cg_rectangle(cg, ef.l, ef.t, + c2_rect_width(&ef), c2_rect_height(&ef)); + cg_fill(cg); + } + ef.l += 8; + mui_listbox_elem_t *e = &lb->elems.e[ii]; + if (lb->elems.e[ii].icon[0]) + mui_font_text_draw(icons, dr, ef.tl, lb->elems.e[ii].icon, 0, + mui_control_color[e->disabled ? + MUI_CONTROL_STATE_DISABLED : 0].text); + ef.l += 26; + mui_font_text_draw(main, dr, ef.tl, e->elem, 0, + mui_control_color[e->disabled ? + MUI_CONTROL_STATE_DISABLED : 0].text); + } + mui_drawable_clip_pop(dr); +} + +static bool +mui_listbox_key( + mui_control_t * c, + mui_event_t * ev) +{ + mui_listbox_control_t *lb = (mui_listbox_control_t *)c; + printf("%s key: %d\n", __func__, ev->key.key); + c2_rect_t f = c->frame; + c2_rect_offset(&f, -f.l, -f.t); + uint32_t page_size = (c2_rect_height(&f) / lb->elem_height)-1; + + int delta = 0; + if (ev->modifiers & (MUI_MODIFIER_SUPER | MUI_MODIFIER_CTRL)) + return false; + switch (ev->key.key) { + case MUI_KEY_UP: delta = -1; break; + case MUI_KEY_DOWN: delta = 1; break; + case MUI_KEY_PAGEUP: delta = -page_size; break; + case MUI_KEY_PAGEDOWN: delta = page_size; break; + } + if (!delta) + return false; + int nsel = c->value + delta; + if (nsel < 0) + nsel = 0; + if (nsel >= (int)lb->elems.count) + nsel = lb->elems.count - 1; + if (nsel != (int)c->value) { + c->value = nsel; + c2_rect_t e = c->frame; + e.b = e.t + lb->elem_height; + + c2_rect_offset(&e, -e.l, + -e.t + (c->value * lb->elem_height)); + c2_rect_t w = f; + c2_rect_offset(&w, 0, lb->scroll); + printf(" e:%s f:%s\n", c2_rect_as_str(&e), c2_rect_as_str(&w)); + if (e.b > w.b) { + lb->scroll = (e.b - c2_rect_height(&c->frame)); + printf(" over %d\n", lb->scroll); + } + if (e.t < w.t) + lb->scroll = e.t; + printf(" scroll:%d\n", lb->scroll); + mui_control_set_value(lb->scrollbar, lb->scroll); + mui_control_inval(c); +// mui_control_inval(lb->scrollbar); + mui_control_action(c, MUI_CONTROL_ACTION_VALUE_CHANGED, + &lb->elems.e[nsel]); + return true; + } + return false; +} + +static bool +mui_cdef_event( + struct mui_control_t * c, + mui_event_t *ev) +{ + mui_listbox_control_t *lb = (mui_listbox_control_t *)c; + switch (ev->type) { + case MUI_EVENT_BUTTONDOWN: { + c2_rect_t f = c->frame; + c2_rect_offset(&f, c->win->content.l, c->win->content.t); + // uint32_t page_size = (c2_rect_height(&f) / lb->elem_height)-1; + int nsel = lb->scroll + (ev->mouse.where.y - f.t); + nsel /= lb->elem_height; + if (nsel < 0) + nsel = 0; + if (nsel >= (int)lb->elems.count) + nsel = lb->elems.count - 1; + if (nsel != (int)c->value) { + mui_control_set_value(c, nsel); + mui_control_action(c, + MUI_CONTROL_ACTION_VALUE_CHANGED, + &lb->elems.e[nsel]); + } + { + mui_time_t now = mui_get_time(); + if ((now - lb->last_click) < + (MUI_TIME_MS * 300)) { + lb->last_click = 0; + if (lb->elems.e[nsel].disabled) + return true; + mui_control_action(c, + MUI_CONTROL_ACTION_SELECT, + &lb->elems.e[nsel]); + } else + lb->last_click = now; + } + return true; + } break; + case MUI_EVENT_KEYUP: { // ignore keydowns + if (ev->key.key == 13) { + if (!lb->elems.e[c->value].disabled) { + mui_control_action(c, + MUI_CONTROL_ACTION_SELECT, + &lb->elems.e[c->value]); + } + return true; + } + if (mui_listbox_key(c, ev)) + return true; + } break; + case MUI_EVENT_WHEEL: { + // printf("%s wheel delta %d\n", __func__, ev->wheel.delta); + lb->scroll += ev->wheel.delta * 20; + if (lb->scroll < 0) + lb->scroll = 0; + if (lb->scroll > + (int32_t)((lb->elems.count * lb->elem_height) - + c2_rect_height(&c->frame))) + lb->scroll = (lb->elems.count * lb->elem_height) - + c2_rect_height(&c->frame); + mui_control_set_value(lb->scrollbar, lb->scroll); + mui_control_inval(c); + return true; + } break; + } + return false; +} + +bool +mui_cdef_listbox( + struct mui_control_t * c, + uint8_t what, + void * param) +{ + switch (what) { + case MUI_CDEF_INIT: + break; + case MUI_CDEF_DISPOSE: + break; + case MUI_CDEF_DRAW: { + mui_drawable_t * dr = param; + mui_listbox_draw(c->win, c, dr); + } break; + case MUI_CDEF_EVENT: { + mui_event_t *ev = param; + return mui_cdef_event(c, ev); + } break; + } + return false; +} + +static int +mui_listbox_sbar_action( + mui_control_t * c, + void * cb_param, + uint32_t what, + void * param) +{ + mui_listbox_control_t *lb = (mui_listbox_control_t *)cb_param; + lb->scroll = mui_control_get_value(lb->scrollbar); +// printf("%s scroll %d\n", __func__, lb->scroll); + mui_control_inval(&lb->control); + return 0; +} + +mui_listbox_elems_t * +mui_listbox_get_elems( + mui_control_t * c) +{ + mui_listbox_control_t *lb = (mui_listbox_control_t *)c; + return &lb->elems; +} + + +mui_control_t * +mui_listbox_new( + mui_window_t * win, + c2_rect_t frame, + uint32_t uid ) +{ + c2_rect_t lbf = frame; + c2_rect_t sb = frame; + mui_font_t * main = mui_font_find(win->ui, "main"); + lbf.r -= main->size; + sb.l = sb.r - main->size; + mui_control_t *c = mui_control_new( + win, MUI_CONTROL_LISTBOX, mui_cdef_listbox, + lbf, NULL, uid, sizeof(mui_listbox_control_t)); + mui_listbox_control_t *lb = (mui_listbox_control_t *)c; + lb->scrollbar = mui_scrollbar_new(win, sb, 0); + mui_control_set_action(lb->scrollbar, mui_listbox_sbar_action, c); + lb->elem_height = main->size + 2; + + return c; +} + +void +mui_listbox_prepare( + mui_control_t * c) +{ + mui_listbox_control_t *lb = (mui_listbox_control_t *)c; + c2_rect_t content = C2_RECT_WH(0, 0, + c2_rect_width(&c->frame), c2_rect_height(&c->frame)); + content.b = lb->elems.count * lb->elem_height; + + c2_rect_offset(&content, 0, lb->scroll); + if (content.b < c2_rect_height(&c->frame)) { + c2_rect_offset(&content, 0, c2_rect_height(&c->frame) - content.b); + } + if (content.t > 0) { + c2_rect_offset(&content, 0, -content.t); + } + lb->scroll = content.t; + if (c2_rect_height(&content) > c2_rect_height(&c->frame)) { + mui_scrollbar_set_max(lb->scrollbar, + c2_rect_height(&content)); + mui_control_set_value(lb->scrollbar, -lb->scroll); + mui_scrollbar_set_page(lb->scrollbar, c2_rect_height(&c->frame)); + } else { + mui_scrollbar_set_max(lb->scrollbar, 0); + mui_control_set_value(lb->scrollbar, 0); + mui_scrollbar_set_page(lb->scrollbar, 0); + } + mui_control_inval(lb->scrollbar); + mui_control_inval(c); +} diff --git a/libmui/mui/mui_cdef_scrollbar.c b/libmui/mui/mui_cdef_scrollbar.c new file mode 100644 index 0000000..10d412a --- /dev/null +++ b/libmui/mui/mui_cdef_scrollbar.c @@ -0,0 +1,366 @@ +/* + * mui_cdef_scrollbar.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#include "mui.h" +#include "cg.h" + + +extern const mui_control_color_t mui_control_color[MUI_CONTROL_STATE_COUNT]; + +enum mui_sb_part_e { + MUI_SB_PART_FRAME = 0, + MUI_SB_PART_UP, + MUI_SB_PART_DOWN, + MUI_SB_PART_PAGEUP, + MUI_SB_PART_PAGEDOWN, + MUI_SB_PART_THUMB, + MUI_SB_PART_COUNT, +}; + +typedef struct mui_scrollbar_control_t { + mui_control_t control; + uint32_t visible; + uint32_t max; + c2_pt_t drag_offset; + uint32_t saved_value; // to handle 'snapback' +} mui_scrollbar_control_t; + +static void +mui_scrollbar_make_rects( + mui_control_t * c, + c2_rect_t * parts) +{ + c2_rect_t f = c->frame; + c2_rect_offset(&f, c->win->content.l, c->win->content.t); + parts[MUI_SB_PART_FRAME] = f; + + c2_rect_t part = f; + part.b = part.t + c2_rect_width(&part); + parts[MUI_SB_PART_UP] = part; + part = f; + part.t = part.b - c2_rect_width(&part); + parts[MUI_SB_PART_DOWN] = part; + + mui_scrollbar_control_t *sb = (mui_scrollbar_control_t *)c; + if (sb->max <= sb->visible) { + c2_rect_t z = {}; + parts[MUI_SB_PART_THUMB] = z; + parts[MUI_SB_PART_PAGEUP] = z; + parts[MUI_SB_PART_PAGEDOWN] = z; + return; + } + part = f; + part.t = parts[MUI_SB_PART_UP].b + 1; + part.b = parts[MUI_SB_PART_DOWN].t - 1; + + float visible = sb->visible / (float)sb->max; + float thumb_size = visible * sb->visible; + if (thumb_size < 20) + thumb_size = 20; + float thumb_pos = c->value / ((float)sb->max- sb->visible); + float thumb_offset = 0.5 + thumb_pos * (c2_rect_height(&part) - thumb_size); +// printf("%s visible:%.2f ts: %.2f thumb_pos:%.2f thumb_offset:%.2f\n", +// __func__, visible, thumb_size, thumb_pos, thumb_offset); + + part.b = part.t + thumb_size; + c2_rect_offset(&part, 0, thumb_offset); + if (part.b > parts[MUI_SB_PART_DOWN].t) { + c2_rect_offset(&part, 0, parts[MUI_SB_PART_DOWN].t - part.b); + } + parts[MUI_SB_PART_THUMB] = part; + part = f; + part.t = parts[MUI_SB_PART_UP].b + 1; + part.b = parts[MUI_SB_PART_THUMB].t - 1; + parts[MUI_SB_PART_PAGEUP] = part; + part = f; + part.t = parts[MUI_SB_PART_THUMB].b + 1; + part.b = parts[MUI_SB_PART_DOWN].t - 1; + parts[MUI_SB_PART_PAGEDOWN] = part; +} + +static void +mui_scrollbar_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ) +{ + c2_rect_t f = c->frame; + c2_rect_offset(&f, win->content.l, win->content.t); + + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + cg_set_line_width(cg, 1); + + cg_rectangle(cg, f.l, f.t, + c2_rect_width(&f), c2_rect_height(&f)); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].fill)); + cg_fill_preserve(cg); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].frame)); + cg_stroke(cg); + + mui_font_t * icons = mui_font_find(win->ui, "icon_small"); + + c2_rect_t parts[MUI_SB_PART_COUNT]; + mui_scrollbar_make_rects(c, parts); + + mui_color_t contentFill = MUI_COLOR(0xa0a0a0ff); + mui_color_t decoColor = MUI_COLOR(0x666666ff); + + c2_rect_t pf; + pf = parts[MUI_SB_PART_UP]; + cg_rectangle(cg, pf.l, pf.t, + c2_rect_width(&pf), c2_rect_height(&pf)); + cg_set_source_color(cg, + c->flags.hit_part == MUI_SB_PART_UP ? + &CG_COLOR(decoColor) : + &CG_COLOR(mui_control_color[c->state].fill)); + cg_fill_preserve(cg); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].frame)); + cg_stroke(cg); + + stb_ttc_measure m = {}; + mui_font_text_measure(icons, "", &m); + pf.l = pf.l + (c2_rect_width(&pf) - m.x1 - m.x0) / 2; + mui_font_text_draw(icons, dr, pf.tl, "", 0, + mui_control_color[c->state].text); + + pf = parts[MUI_SB_PART_DOWN]; + cg_rectangle(cg, pf.l, pf.t, + c2_rect_width(&pf), c2_rect_height(&pf)); + cg_set_source_color(cg, + c->flags.hit_part == MUI_SB_PART_DOWN ? + &CG_COLOR(decoColor) : + &CG_COLOR(mui_control_color[c->state].fill)); + cg_fill_preserve(cg); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[c->state].frame)); + cg_stroke(cg); + + mui_font_text_measure(icons, "", &m); + pf.l = pf.l + (c2_rect_width(&pf) - m.x1 - m.x0) / 2; + mui_font_text_draw(icons, dr, pf.tl, "", 0, + mui_control_color[c->state].text); + + pf = parts[MUI_SB_PART_PAGEUP]; + if (c2_rect_height(&pf) > 0) { + cg_rectangle(cg, pf.l, pf.t, + c2_rect_width(&pf), c2_rect_height(&pf)); + cg_set_source_color(cg, + c->flags.hit_part == MUI_SB_PART_PAGEUP ? + &CG_COLOR(decoColor) : + &CG_COLOR(contentFill)); + cg_fill(cg); + } + pf = parts[MUI_SB_PART_PAGEDOWN]; + if (c2_rect_height(&pf) > 0) { + cg_rectangle(cg, pf.l, pf.t, + c2_rect_width(&pf), c2_rect_height(&pf)); + cg_set_source_color(cg, + c->flags.hit_part == MUI_SB_PART_PAGEDOWN ? + &CG_COLOR(decoColor) : + &CG_COLOR(contentFill)); + cg_fill(cg); + } + pf = parts[MUI_SB_PART_THUMB]; + if (c2_rect_height(&pf) > 0) { + cg_rectangle(cg, pf.l, pf.t, + c2_rect_width(&pf), c2_rect_height(&pf)); + cg_set_source_color(cg, + c->flags.hit_part == MUI_SB_PART_THUMB ? + &CG_COLOR(decoColor) : + &CG_COLOR(mui_control_color[c->state].fill)); + cg_fill_preserve(cg); + cg_set_source_color(cg, + &CG_COLOR(mui_control_color[c->state].frame)); + cg_stroke(cg); + } +} + +static void +_mui_scrollbar_scroll( + mui_control_t * c, + int32_t delta ) +{ + mui_scrollbar_control_t *sb = (mui_scrollbar_control_t *)c; + int32_t v = (int32_t)c->value + delta; + if (v < 0) + v = 0; + if (v > ((int32_t)sb->max - (int32_t)sb->visible)) + v = sb->max - sb->visible; + c->value = v; + mui_control_inval(c); + mui_control_action(c, MUI_CONTROL_ACTION_VALUE_CHANGED, NULL); +} + +static bool +mui_scrollbar_mouse( + struct mui_control_t * c, + mui_event_t * ev) +{ + mui_scrollbar_control_t *sb = (mui_scrollbar_control_t *)c; + c2_rect_t parts[MUI_SB_PART_COUNT]; + mui_scrollbar_make_rects(c, parts); + + switch (ev->type) { + case MUI_EVENT_BUTTONDOWN: { + for (int i = 1; i < MUI_SB_PART_COUNT; ++i) { + if (c2_rect_contains_pt(&parts[i], &ev->mouse.where)) { + c->flags.hit_part = i; + sb->drag_offset.x = + ev->mouse.where.x - parts[i].l; + sb->drag_offset.y = + ev->mouse.where.y - parts[i].t; + sb->saved_value = c->value; + break; + } + } + int part = c->flags.hit_part % MUI_SB_PART_COUNT; + switch (part) { + case MUI_SB_PART_DOWN: + case MUI_SB_PART_UP: { + _mui_scrollbar_scroll(c, + part == MUI_SB_PART_UP ? -30 : 30); + } break; + case MUI_SB_PART_PAGEUP: + case MUI_SB_PART_PAGEDOWN: { + int32_t offset = sb->visible; + _mui_scrollbar_scroll(c, + part == MUI_SB_PART_PAGEUP ? + -offset : offset); + } break; + case MUI_SB_PART_THUMB: + mui_control_inval(c); + break; + } + // printf("%s hit part %d\n", __func__, c->flags.hit_part); + } break; + case MUI_EVENT_DRAG: { + if (!c->flags.hit_part) + break; + int part = c->flags.hit_part % MUI_SB_PART_COUNT; + c2_rect_t test_rect = parts[part]; + if (part == MUI_SB_PART_THUMB) + c2_rect_inset(&test_rect, -60, -60); + if (c2_rect_contains_pt(&test_rect, &ev->mouse.where)) { + c->flags.hit_part = part; + switch (part) { + case MUI_SB_PART_THUMB: { + c2_rect_t nt = parts[part]; + c2_rect_offset(&nt, 0, + -(nt.t + parts[MUI_SB_PART_UP].b) + + ev->mouse.where.y - sb->drag_offset.y); + // printf("%s thumb %s\n", __func__, c2_rect_as_str(&nt)); + if (nt.t < 0) + c2_rect_offset(&nt, 0, -nt.t); + if (nt.b > parts[MUI_SB_PART_DOWN].t) + c2_rect_offset(&nt, 0, parts[MUI_SB_PART_DOWN].t - nt.b); + + int max_pixels = parts[MUI_SB_PART_DOWN].t - + parts[MUI_SB_PART_UP].b - + c2_rect_height(&nt); + uint32_t nv = nt.t * (sb->max - sb->visible) / max_pixels; + if (nv > (sb->max - sb->visible)) + nv = sb->max - sb->visible; + c->value = nv; + // printf("v is %d vs %d max %d = %d new val %d\n", + // nt.t, max_pixels, sb->max, nv, + // mui_control_get_value(c)); + mui_control_inval(c); + mui_control_action(c, MUI_CONTROL_ACTION_VALUE_CHANGED, NULL); + } break; + } + } else { + c->flags.hit_part = part + MUI_SB_PART_COUNT; + if (part == MUI_SB_PART_THUMB) { + c->value = sb->saved_value; + mui_control_inval(c); + mui_control_action(c, MUI_CONTROL_ACTION_VALUE_CHANGED, NULL); + } + } + } break; + case MUI_EVENT_BUTTONUP: { + if (!c->flags.hit_part) + break; + mui_control_inval(c); + c->flags.hit_part = 0; + } break; + } + return true; +} + +static bool +mui_cdef_scrollbar( + struct mui_control_t * c, + uint8_t what, + void * param) +{ + switch (what) { + case MUI_CDEF_INIT: + break; + case MUI_CDEF_DISPOSE: + break; + case MUI_CDEF_DRAW: { + mui_drawable_t * dr = param; + mui_scrollbar_draw(c->win, c, dr); + } break; + case MUI_CDEF_EVENT: { + // printf("%s event\n", __func__); + mui_event_t *ev = param; + switch (ev->type) { + case MUI_EVENT_BUTTONUP: + case MUI_EVENT_DRAG: + case MUI_EVENT_BUTTONDOWN: { + return mui_scrollbar_mouse(c, ev); + } break; + } + } break; + } + return false; +} + +uint32_t +mui_scrollbar_get_max( + mui_control_t * c) +{ + mui_scrollbar_control_t *sb = (mui_scrollbar_control_t *)c; + return sb->max; +} +void +mui_scrollbar_set_max( + mui_control_t * c, + uint32_t max) +{ + mui_scrollbar_control_t *sb = (mui_scrollbar_control_t *)c; + sb->max = max; + mui_control_inval(c); +} +void +mui_scrollbar_set_page( + mui_control_t * c, + uint32_t page) +{ + mui_scrollbar_control_t *sb = (mui_scrollbar_control_t *)c; + sb->visible = page; + mui_control_inval(c); +} + +mui_control_t * +mui_scrollbar_new( + mui_window_t * win, + c2_rect_t frame, + uint32_t uid ) +{ + return mui_control_new( + win, MUI_CONTROL_SCROLLBAR, mui_cdef_scrollbar, + frame, NULL, uid, + sizeof(mui_scrollbar_control_t)); +} diff --git a/libmui/mui/mui_controls.c b/libmui/mui/mui_controls.c new file mode 100644 index 0000000..e7ec48d --- /dev/null +++ b/libmui/mui/mui_controls.c @@ -0,0 +1,318 @@ +/* + * mui_controls.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#include "mui.h" + + +const mui_control_color_t mui_control_color[MUI_CONTROL_STATE_COUNT] = { + [MUI_CONTROL_STATE_NORMAL] = { + .fill = MUI_COLOR(0xeeeeeeff), + .frame = MUI_COLOR(0x000000ff), + .text = MUI_COLOR(0x000000ff), + }, + [MUI_CONTROL_STATE_HOVER] = { + .fill = MUI_COLOR(0xaaaaaaff), + .frame = MUI_COLOR(0x000000ff), + .text = MUI_COLOR(0x0000ffff), + }, + [MUI_CONTROL_STATE_CLICKED] = { + .fill = MUI_COLOR(0x777777ff), + .frame = MUI_COLOR(0x000000ff), + .text = MUI_COLOR(0xffffffff), + }, + [MUI_CONTROL_STATE_DISABLED] = { + .fill = MUI_COLOR(0xeeeeeeff), + .frame = MUI_COLOR(0x666666ff), + .text = MUI_COLOR(0xccccccff), + }, +}; + +void +mui_control_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ) +{ + if (!c) + return; + if (c->cdef) + c->cdef(c, MUI_CDEF_DRAW, dr); +} + +mui_control_t * +mui_control_new( + mui_window_t * win, + uint8_t type, + mui_cdef_p cdef, + c2_rect_t frame, + const char * title, + uint32_t uid, + uint32_t instance_size ) +{ + if (!win) + return NULL; + mui_control_t *c = calloc(1, instance_size >= sizeof(*c) ? + instance_size : sizeof(*c)); + c->type = type; + c->cdef = cdef; + c->frame = frame; + c->title = title ? strdup(title) : NULL; + c->win = win; + c->uid = uid; + STAILQ_INIT(&c->actions); + TAILQ_INSERT_TAIL(&win->controls, c, self); + if (c->cdef) + c->cdef(c, MUI_CDEF_INIT, NULL); + return c; +} + +void +_mui_control_free( + mui_control_t * c ) +{ + if (!c) + return; + if (c->title) + free(c->title); + c->title = NULL; + if (c->cdef) + c->cdef(c, MUI_CDEF_DISPOSE, NULL); + free(c); +} + +void +mui_control_dispose( + mui_control_t * c ) +{ + if (!c) + return; + if (c->flags.zombie) { + printf("%s: DOUBLE delete %s\n", __func__, c->title); + return; + } + TAILQ_REMOVE(&c->win->controls, c, self); + if (c->win->flags.zombie || c->win->ui->action_active) { + c->flags.zombie = true; + TAILQ_INSERT_TAIL(&c->win->zombies, c, self); + } else + _mui_control_free(c); +} + +uint32_t +mui_control_get_type( + mui_control_t * c ) +{ + if (!c) + return 0; + return c->type; +} +uint32_t +mui_control_get_uid( + mui_control_t * c ) +{ + if (!c) + return 0; + return c->uid; +} + +mui_control_t * +mui_control_locate( + mui_window_t * win, + c2_pt_t pt ) +{ + if (!win) + return NULL; + mui_control_t * c; + TAILQ_FOREACH(c, &win->controls, self) { + c2_rect_t f = c->frame; + c2_rect_offset(&f, win->content.l, win->content.t); + if (c2_rect_contains_pt(&f, &pt)) + return c; + } + return NULL; +} + +static mui_time_t +_mui_control_highlight_timer_cb( + struct mui_t * mui, + mui_time_t now, + void * param) +{ + mui_control_t * c = param; + + printf("%s: %s\n", __func__, c->title); + mui_control_set_state(c, MUI_CONTROL_STATE_NORMAL); + if (c->cdef) + c->cdef(c, MUI_CDEF_SELECT, NULL); + mui_control_action(c, MUI_CONTROL_ACTION_SELECT, NULL); + + return 0; +} + +int32_t +mui_control_get_value( + mui_control_t * c) +{ + if (!c) + return 0; + return c->value; +} + +int32_t +mui_control_set_value( + mui_control_t * c, + int32_t value) +{ + if (!c) + return 0; + if (c->cdef && c->cdef(c, MUI_CDEF_SET_VALUE, &value)) + return c->value; + if (value != (int)c->value) + mui_control_inval(c); + c->value = value; + return c->value; +} + +bool +mui_control_event( + mui_control_t * c, + mui_event_t * ev ) +{ + if (!c) + return false; + bool res = false; + + res = c->cdef && c->cdef(c, MUI_CDEF_EVENT, ev); + if (res || !c->key_equ.key) + return res; + switch (ev->type) { + case MUI_EVENT_KEYDOWN: + if (c->state != MUI_CONTROL_STATE_DISABLED && + mui_event_match_key(ev, c->key_equ)) { + mui_control_set_state(c, MUI_CONTROL_STATE_CLICKED); + mui_timer_register( + c->win->ui, _mui_control_highlight_timer_cb, + c, MUI_TIME_SECOND / 10); + res = true; + } + break; + } + return res; +} + +void +mui_control_inval( + mui_control_t * c ) +{ + if (!c) + return; + mui_window_inval(c->win, &c->frame); +} + +void +mui_control_set_state( + mui_control_t * c, + uint32_t state ) +{ + if (!c) + return; + if (c->cdef && c->cdef(c, MUI_CDEF_SET_STATE, &state)) + return; + if (c->state == state) + return; + c->state = state; + mui_control_inval(c); +} + +uint32_t +mui_control_get_state( + mui_control_t * c ) +{ + if (!c) + return 0; + return c->state; +} + +const char * +mui_control_get_title( + mui_control_t * c ) +{ + if (!c) + return NULL; + return c->title; +} + +void +mui_control_set_title( + mui_control_t * c, + const char * text ) +{ + if (!c) + return; + if (c->cdef && c->cdef(c, MUI_CDEF_SET_TITLE, (void*)text)) + return; + if (text && c->title && !strcmp(text, c->title)) + return; + if (c->title) + free(c->title); + c->title = text ? strdup(text) : NULL; + mui_control_inval(c); +} + +void +mui_control_action( + mui_control_t * c, + uint32_t what, + void * param ) +{ + if (!c) + return; + c->win->ui->action_active++; + mui_action_t *a; + STAILQ_FOREACH(a, &c->actions, self) { + if (!a->control_cb) + continue; + a->control_cb(c, a->cb_param, what, param); + } + c->win->ui->action_active--; +} + +void +mui_control_set_action( + mui_control_t * c, + mui_control_action_p cb, + void * param ) +{ + if (!c) + return; + mui_action_t *a = calloc(1, sizeof(*a)); + a->control_cb = cb; + a->cb_param = param; + STAILQ_INSERT_TAIL(&c->actions, a, self); +} + +mui_control_t * +mui_control_get_by_id( + mui_window_t * win, + uint32_t uid ) +{ + if (!win) + return NULL; + mui_control_t *c; + TAILQ_FOREACH(c, &win->controls, self) { + if (c->uid == uid) + return c; + } + return NULL; +} diff --git a/libmui/mui/mui_drawable.c b/libmui/mui/mui_drawable.c new file mode 100644 index 0000000..c1bbe47 --- /dev/null +++ b/libmui/mui/mui_drawable.c @@ -0,0 +1,280 @@ +/* + * mui_drawable.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +#include +#include "mui.h" +#include "cg.h" + + +IMPLEMENT_C_ARRAY(mui_clip_stack); + +void +mui_drawable_clear( + mui_drawable_t * dr) +{ + if (!dr) + return; + if (dr->cg) + cg_destroy(dr->cg); + dr->cg = NULL; + if (dr->cg_surface) + cg_surface_destroy(dr->cg_surface); + dr->cg_surface = NULL; + if (dr->pixman) + pixman_image_unref(dr->pixman); + dr->pixman = NULL; + for (int i = 0; i < (int)dr->clip.count; i++) + pixman_region32_fini(&dr->clip.e[i]); + mui_clip_stack_clear(&dr->clip); + dr->_pix_hash = NULL; +} + +void +mui_drawable_dispose( + mui_drawable_t * dr) +{ + if (!dr) + return; + mui_drawable_clear(dr); + mui_clip_stack_free(&dr->clip); +// free(dr); +} + +static struct cg_ctx_t * +_cg_updated_clip( + mui_drawable_t * dr) +{ + if (!dr->cg_clip_dirty) + return dr->cg; + dr->cg_clip_dirty = 0; + cg_reset_clip(dr->cg); + if (!dr->clip.count) + return dr->cg; + int cnt = 0; + pixman_box32_t *r = pixman_region32_rectangles( + &dr->clip.e[dr->clip.count-1], &cnt); + for (int i = 0; i < cnt; i++) { + cg_rectangle(dr->cg, r[i].x1, r[i].y1, + r[i].x2 - r[i].x1, r[i].y2 - r[i].y1); + } + cg_clip(dr->cg); + return dr->cg; +} + +struct cg_ctx_t * +mui_drawable_get_cg( + mui_drawable_t * dr) +{ + if (!dr) + return NULL; + + if (dr->cg) { + // in case the pix structure had changed... + dr->cg_surface->stride = dr->pix.row_bytes; + dr->cg_surface->pixels = dr->pix.pixels; + dr->cg_surface->width = dr->pix.size.x; + dr->cg_surface->height = dr->pix.size.y; + return _cg_updated_clip(dr); + } + dr->cg_surface = cg_surface_create_for_data( + dr->pix.size.x, dr->pix.size.y, + dr->pix.pixels); + dr->cg_surface->stride = dr->pix.row_bytes; + dr->cg = cg_create(dr->cg_surface); + return _cg_updated_clip(dr); +} + +/* + * Update clip to the 'latest' one from the stack of clips. + */ +static union pixman_image * +_pixman_updated_clip( + mui_drawable_t * dr) +{ + if (!dr->pixman_clip_dirty) + return dr->pixman; + dr->pixman_clip_dirty = 0; + if (dr->clip.count) + pixman_image_set_clip_region32( + dr->pixman, &dr->clip.e[dr->clip.count-1]); + else + pixman_image_set_clip_region32( + dr->pixman, NULL); + return dr->pixman; +} + +union pixman_image * +mui_pixmap_make_pixman( + mui_pixmap_t * pix) +{ + pixman_format_code_t k = PIXMAN_a8r8g8b8; + switch (pix->bpp) { + case 8: k = PIXMAN_a8; break; + case 16: k = PIXMAN_r5g6b5; break; + case 24: k = PIXMAN_r8g8b8; break; + case 32: k = PIXMAN_a8r8g8b8; break; + } + union pixman_image * res = pixman_image_create_bits_no_clear( + k, pix->size.x, pix->size.y, + (uint32_t*)pix->pixels, pix->row_bytes); + return res; +} + +union pixman_image * +mui_drawable_get_pixman( + mui_drawable_t * dr) +{ + if (!dr) + return NULL; + void * _hash = dr->pix.pixels + dr->pix.size.y * dr->pix.row_bytes; + if (dr->_pix_hash != _hash) { + dr->_pix_hash = _hash; + dr->_pix_hash = dr->pix.pixels + dr->pix.size.y * dr->pix.row_bytes; + if (dr->pixman) + pixman_image_unref(dr->pixman); + dr->pixman = NULL; + } +// return _pixman_updated_clip(dr); + if (dr->pixman) + return _pixman_updated_clip(dr); + dr->pixman = mui_pixmap_make_pixman(&dr->pix); + dr->pixman_clip_dirty = 1; + return _pixman_updated_clip(dr); +} + +pixman_region32_t * +mui_drawable_clip_get( + mui_drawable_t * dr) +{ + if (!dr || !dr->clip.count) + return NULL; + return &dr->clip.e[dr->clip.count-1]; +} + +void +mui_drawable_set_clip( + mui_drawable_t * dr, + c2_rect_array_p clip ) +{ + if (!dr) + return; + for (int i = 0; i < (int)dr->clip.count; i++) + pixman_region32_fini(&dr->clip.e[i]); + mui_clip_stack_clear(&dr->clip); + if (clip && clip->count) { + pixman_region32_t r = {}; + + pixman_region32_init_rects(&r, + (pixman_box32_t*)clip->e, clip->count); + // intersect the whole lot with the whole pixmap boundary + pixman_region32_t rg = {}; + pixman_region32_intersect_rect(&rg, &r, + 0, 0, dr->pix.size.x, dr->pix.size.y); + pixman_region32_fini(&r); + + mui_clip_stack_add(&dr->clip, rg); + } + dr->pixman_clip_dirty = 1; + dr->cg_clip_dirty = 1; +} + +int +mui_drawable_clip_intersects( + mui_drawable_t * dr, + c2_rect_p r ) +{ + if (!dr || !r) + return 0; + if (!dr->clip.count) + return 1; + // conveniently, c2_rect_t is the same as pixman_box_32_t + pixman_region_overlap_t o = pixman_region32_contains_rectangle( + &dr->clip.e[dr->clip.count-1], (pixman_box32_t*)r); + + return o == PIXMAN_REGION_OUT ? 0 : + o == PIXMAN_REGION_IN ? 1 : -1; +} + +int +mui_drawable_clip_push( + mui_drawable_t * dr, + c2_rect_p r ) +{ + if (!dr || !r) + return 0; + pixman_region32_t rg = {}; + if (dr->clip.count == 0) { + pixman_region32_init_rect(&rg, + r->l, r->t, c2_rect_width(r), c2_rect_height(r)); + } else { + pixman_region32_intersect_rect(&rg, &dr->clip.e[dr->clip.count-1], + r->l, r->t, c2_rect_width(r), c2_rect_height(r)); + } + mui_clip_stack_add(&dr->clip, rg); + dr->pixman_clip_dirty = 1; + dr->cg_clip_dirty = 1; + + return dr->clip.count; +} + +int +mui_drawable_clip_push_region( + mui_drawable_t * dr, + pixman_region32_t * rgn ) +{ + if (!dr || !rgn) + return 0; + + pixman_region32_t rg = {}; + if (dr->clip.count == 0) { + pixman_region32_copy(&rg, rgn); + } else { + pixman_region32_intersect(&rg, &dr->clip.e[dr->clip.count-1], rgn); + } + mui_clip_stack_add(&dr->clip, rg); + dr->pixman_clip_dirty = 1; + dr->cg_clip_dirty = 1; + + return dr->clip.count; +} + +int +mui_drawable_clip_substract_region( + mui_drawable_t * dr, + pixman_region32_t * rgn ) +{ + if (!dr || !rgn) + return 0; + + pixman_region32_t rg = {}; + if (dr->clip.count != 0) { + pixman_region32_subtract(&rg, &dr->clip.e[dr->clip.count-1], rgn); + } + mui_clip_stack_add(&dr->clip, rg); + dr->pixman_clip_dirty = 1; + dr->cg_clip_dirty = 1; + + return dr->clip.count; +} + +void +mui_drawable_clip_pop( + mui_drawable_t * dr ) +{ + if (!dr || !dr->clip.count) + return; + pixman_region32_fini(&dr->clip.e[dr->clip.count-1]); + dr->clip.count--; + dr->pixman_clip_dirty = 1; + dr->cg_clip_dirty = 1; +} diff --git a/libmui/mui/mui_font.c b/libmui/mui/mui_font.c new file mode 100644 index 0000000..606881d --- /dev/null +++ b/libmui/mui/mui_font.c @@ -0,0 +1,351 @@ +/* + * mui_font.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#define STB_TRUETYPE_IMPLEMENTATION +#define STB_TTC_IMPLEMENTATION +#include "stb_ttc.h" + + +#define INCBIN_STYLE INCBIN_STYLE_SNAKE +#define INCBIN_PREFIX mui_ +#include "incbin.h" + +INCBIN(main_font, "fonts/Charcoal_mui.ttf"); +INCBIN(icon_font, "fonts/typicon.ttf"); +INCBIN(dingbat_font, "fonts/Dingbat.ttf"); + +#include "mui.h" + +mui_font_t * +mui_font_find( + mui_t *ui, + const char *name) +{ + mui_font_t *f; + TAILQ_FOREACH(f, &ui->fonts, self) { + if (!strcmp(f->name, name)) + return f; + } + return NULL; +} + +static void +_mui_font_pixman_prep( + mui_font_t *f) +{ + f->font.pix.bpp = 8; + f->font.pix.size.x = f->ttc.p_stride; + f->font.pix.size.y = f->ttc.p_height; + f->font.pix.row_bytes = f->ttc.p_stride; + f->font.pix.pixels = f->ttc.pixels; +} + +mui_font_t * +mui_font_from_mem( + mui_t *ui, + const char *name, + unsigned int size, + const void *font_data, + unsigned int font_size ) +{ + mui_font_t *f = calloc(1, sizeof(*f)); + f->name = strdup(name); + f->size = size; + stb_ttc_LoadFont(&f->ttc, font_data, font_size); + TAILQ_INSERT_TAIL(&ui->fonts, f, self); + printf("%s: Loaded font %s:%d\n", __func__, name, size); + + return f; +} + +void +mui_font_init( + mui_t *ui) +{ + printf("%s: Loading fonts\n", __func__); + mui_font_from_mem(ui, "main", 28, + mui_main_font_data, mui_main_font_size); + mui_font_from_mem(ui, "icon_large", 96, + mui_icon_font_data, mui_icon_font_size); + mui_font_from_mem(ui, "icon_small", 30, + mui_icon_font_data, mui_icon_font_size); +} + +void +mui_font_dispose( + mui_t *ui) +{ + mui_font_t *f; + while ((f = TAILQ_FIRST(&ui->fonts))) { + TAILQ_REMOVE(&ui->fonts, f, self); + stb_ttc_Free(&f->ttc); + free(f->name); + free(f); + } +} + +int +mui_font_text_measure( + mui_font_t *font, + const char *text, + stb_ttc_measure *m ) +{ + struct stb_ttc_info * ttc = &font->ttc; + float scale = stbtt_ScaleForPixelHeight(&ttc->font, font->size); + int w = stb_ttc_MeasureText(ttc, scale, text, m); + return w; +} + + +void +mui_font_text_draw( + mui_font_t *font, + mui_drawable_t *dr, + c2_pt_t where, + const char *text, + unsigned int text_len, + mui_color_t color) +{ + struct stb_ttc_info * ttc = &font->ttc; + unsigned int state = 0; + float scale = stbtt_ScaleForPixelHeight(&ttc->font, font->size); + double xpos = 0; + unsigned int last = 0; + unsigned int cp = 0; + + if (!text_len) + text_len = strlen(text); + mui_drawable_t * src = &font->font; + mui_drawable_t * dst = dr; + + pixman_color_t pc = PIXMAN_COLOR(color); + pixman_image_t * fill = pixman_image_create_solid_fill(&pc); + + where.y += font->ttc.ascent * scale; + for (unsigned int ch = 0; text[ch] && ch < text_len; ch++) { + if (stb_ttc__UTF8_Decode(&state, &cp, text[ch]) != UTF8_ACCEPT) + continue; + if (last) { + int kern = scale * stb_ttc__CodepointsGetKerning(ttc, last, cp); + xpos += kern; + } + last = cp; + int gl = stb_ttc__CodepointGetGlyph(ttc, cp); + if (gl == -1) + continue; + stb_ttc_g *gc = stb_ttc__ScaledGlyphGetCache(ttc, gl, scale); + if (!gc) + continue; + if (gc->p_y == (unsigned short) -1) + stb_ttc__ScaledGlyphRenderToCache(ttc, gc); +// int pxpos = gc->x0 + ((xpos + gc->lsb) * scale); + int pxpos = where.x + gc->x0 + ((xpos + 0) * scale); + // if (gc->lsb) + // printf("glyph %3d : %04x:%c lsb %d\n", ch, cp, cp < 32 ? '.' : cp, gc->lsb); + + int ph = gc->y1 - gc->y0; + int pw = gc->x1 - gc->x0; + _mui_font_pixman_prep(font); + pixman_image_composite32( + PIXMAN_OP_OVER, + fill, + mui_drawable_get_pixman(src), + mui_drawable_get_pixman(dst), + 0, 0, gc->p_x, gc->p_y, + pxpos, where.y + gc->y0, pw, ph); + xpos += gc->advance; + } + pixman_image_unref(fill); +} + +IMPLEMENT_C_ARRAY(mui_glyph_array); +IMPLEMENT_C_ARRAY(mui_glyph_line_array); + +void +mui_font_measure( + mui_font_t *font, + c2_rect_t bbox, + const char *text, + unsigned int text_len, + mui_glyph_line_array_t *lines, + uint16_t flags) +{ + struct stb_ttc_info * ttc = &font->ttc; + unsigned int state = 0; + float scale = stbtt_ScaleForPixelHeight(&ttc->font, font->size); + unsigned int last = 0; + unsigned int cp = 0; + + if (!text_len) + text_len = strlen(text); + + c2_pt_t where = {}; + unsigned int ch = 0; + int wrap_chi = 0; + int wrap_w = 0; + int wrap_count = 0; + do { + where.y += font->ttc.ascent * scale; + const mui_glyph_array_t zero = {}; + mui_glyph_line_array_push(lines, zero); + mui_glyph_array_t * line = &lines->e[lines->count - 1]; + line->x = 0; + line->y = where.y; + line->w = 0; + wrap_chi = ch; + wrap_w = 0; + wrap_count = 0; + for (;text[ch]; ch++) { + if (stb_ttc__UTF8_Decode(&state, &cp, text[ch]) != UTF8_ACCEPT) + continue; + if (last) { + int kern = scale * stb_ttc__CodepointsGetKerning(ttc, last, cp); + line->w += kern; + } + last = cp; +// printf("glyph %3d : %04x:%c\n", ch, cp, cp < 32 ? '.' : cp); + if (cp == '\n') { + ch++; + break; + } + if (isspace(cp) || ispunct(cp)) { + wrap_chi = ch; + wrap_w = line->w; + wrap_count = line->count; + } + int gl = stb_ttc__CodepointGetGlyph(ttc, cp); + if (gl == -1) + continue; + stb_ttc_g *gc = stb_ttc__ScaledGlyphGetCache(ttc, gl, scale); + if (!gc) + continue; + if (gc->p_y == (unsigned short) -1) + stb_ttc__ScaledGlyphRenderToCache(ttc, gc); + if (((line->w + gc->advance) * scale) > c2_rect_width(&bbox)) { + if (wrap_count) { + ch = wrap_chi + 1; + line->count = wrap_count; + line->w = wrap_w; + } + break; + } + line->w += gc->advance; + mui_glyph_array_push(line, gc); + }; + } while (text[ch] && ch < text_len); + int bh = 0; + for (int i = 0; i < (int)lines->count; i++) { + mui_glyph_array_t * line = &lines->e[i]; + bh = line->y - (font->ttc.descent * scale); + line->w *= scale; +// printf(" line %d y %3d size %d width %d\n", i, +// line->y, line->count, line->w); + } +// printf("box height is %d/%d\n", bh, c2_rect_height(&bbox)); + int ydiff = 0; + if (flags & MUI_TEXT_ALIGN_MIDDLE) { + ydiff = (c2_rect_height(&bbox) - bh) / 2; + } else if (flags & MUI_TEXT_ALIGN_BOTTOM) { + ydiff = c2_rect_height(&bbox) - bh; + } + for (int i = 0; i < (int)lines->count; i++) { + mui_glyph_array_t * line = &lines->e[i]; + line->y += ydiff; + if (flags & MUI_TEXT_ALIGN_RIGHT) { + line->x = c2_rect_width(&bbox) - line->w; + } else if (flags & MUI_TEXT_ALIGN_CENTER) { + line->x = (c2_rect_width(&bbox) - line->w) / 2; + } + } +} + +void +mui_font_measure_clear( + mui_glyph_line_array_t *lines) +{ + if (!lines) + return; + for (int i = 0; i < (int)lines->count; i++) { + mui_glyph_array_t * line = &lines->e[i]; + mui_glyph_array_free(line); + } + mui_glyph_line_array_free(lines); +} + + +void +mui_font_measure_draw( + mui_font_t *font, + mui_drawable_t *dr, + c2_rect_t bbox, + mui_glyph_line_array_t *lines, + mui_color_t color, + uint16_t flags) +{ + pixman_color_t pc = PIXMAN_COLOR(color); + pixman_image_t * fill = pixman_image_create_solid_fill(&pc); + struct stb_ttc_info * ttc = &font->ttc; + float scale = stbtt_ScaleForPixelHeight(&ttc->font, font->size); + + mui_drawable_t * src = &font->font; + mui_drawable_t * dst = dr; + + // all glyphs we need were loaded, update the pixman texture + _mui_font_pixman_prep(font); + + for (int li = 0; li < (int)lines->count; li++) { + mui_glyph_array_t * line = &lines->e[li]; + int xpos = 0;//where.x / scale; + for (int ci = 0; ci < (int)line->count; ci++) { + stb_ttc_g *gc = line->e[ci]; +// int pxpos = gc->x0 + ((xpos + gc->lsb) * scale); + int pxpos = gc->x0 + ((xpos + 0) * scale); + + int ph = gc->y1 - gc->y0; + int pw = gc->x1 - gc->x0; + pixman_image_composite32( + PIXMAN_OP_OVER, + fill, + mui_drawable_get_pixman(src), + mui_drawable_get_pixman(dst), + 0, 0, gc->p_x, gc->p_y, + bbox.l + line->x + pxpos, + bbox.t + line->y + gc->y0, pw, ph); + xpos += gc->advance; + } + } + pixman_image_unref(fill); +} + +void +mui_font_textbox( + mui_font_t *font, + mui_drawable_t *dr, + c2_rect_t bbox, + const char *text, + unsigned int text_len, + mui_color_t color, + uint16_t flags) +{ + mui_glyph_line_array_t lines = {}; + + if (!text_len) + text_len = strlen(text); + + mui_font_measure(font, bbox, text, text_len, &lines, flags); + + mui_font_measure_draw(font, dr, bbox, &lines, color, flags); + + mui_font_measure_clear(&lines); +} diff --git a/libmui/mui/mui_menus.c b/libmui/mui/mui_menus.c new file mode 100644 index 0000000..6e20639 --- /dev/null +++ b/libmui/mui/mui_menus.c @@ -0,0 +1,916 @@ +/* + * mui_menus.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#include "mui.h" +#include "mui_priv.h" +#include "cg.h" + +#ifndef D +#define D(_x) //_x +#endif + +/* These are *window action* -- parameter 'target' is a mui_menu_t* */ +enum mui_menu_action_e { + MUI_MENU_ACTION_NONE = 0, + MUI_MENU_ACTION_OPEN = FCC('m','e','n','o'), + MUI_MENU_ACTION_CLOSE = FCC('m','e','n','c'), + MUI_MENU_ACTION_SELECT = FCC('m','e','n','s'), + // BEFORE a menu/submenu get opened/created + MUI_MENU_ACTION_PREPARE = FCC('m','e','p','r'), +}; + +struct mui_menu_control_t; +struct mui_menubar_t; + +typedef struct mui_menu_t { + mui_window_t win; + unsigned int click_inside : 1, + drag_ev : 1, + closing: 1, // prevent double-delete + timer_call_count : 2; // used by mui_menu_close_timer_cb + mui_control_t * highlighted; + mui_time_t sub_open_stamp; + // currently open menu, if any + struct mui_menu_control_t * sub; + struct mui_menubar_t * menubar; +} mui_menu_t; + +typedef struct mui_menubar_t { + mui_window_t win; + unsigned int click_inside : 1, + drag_ev : 1, + was_highlighted : 1, + timer_call_count : 2; // used by mui_menu_close_timer_cb + + // currently open menu title + struct mui_menu_control_t * selected_title; + // keep track of the menus, and their own submenus as they are being opened + // this is to keep track of the 'hierarchy' of menus, so that we can close + // them all when the user clicks outside of them, or release the mouse. + mui_menu_t * open[8]; + int open_count; + bool delayed_closing; +} mui_menubar_t; + +/* These are *control action* -- parameter is a menu title or popup, + * parameter is a mui_menu_control_t* + */ +enum mui_menu_control_action_e { + MUI_MENU_CONTROL_ACTION_NONE = 0, + // called *before* the window is opened, you can change the items state/list + MUI_MENU_CONTROL_ACTION_PREPARE = FCC('m','c','p','r'), + // when an item is selected. + MUI_MENU_CONTROL_ACTION_SELECT = FCC('m','c','s','l'), +}; + + +static mui_window_t * +_mui_menu_create( + mui_t * ui, + mui_menubar_t * mbar, + c2_pt_t origin, + mui_menu_item_t* items ); +static void +mui_menu_close( + mui_window_t * win ); +static bool +mui_wdef_menu( + struct mui_window_t * win, + uint8_t what, + void * param); +static bool +mui_wdef_menubar( + struct mui_window_t * win, + uint8_t what, + void * param); +static bool +mui_cdef_popup( + struct mui_control_t * c, + uint8_t what, + void * param); + +#define MUI_MENU_CLOSE_BLINK_DELAY (MUI_TIME_SECOND / 20) + + +// The menu bar title is a control, reset it's state to normal, and close +// any open menus (and their submenus, if any) +static bool +_mui_menubar_close_menu( + mui_menubar_t *mbar ) +{ + if (mbar->delayed_closing) + return false; + mbar->click_inside = false; + mui_control_set_state((mui_control_t*)mbar->selected_title, 0); + if (mbar->selected_title) + mbar->selected_title->menu_window = NULL; + if (!mbar->open_count) + return false; + mbar->selected_title = NULL; + for (int i = 0; i < mbar->open_count; i++) { + mui_menu_close(&mbar->open[i]->win); + mbar->open[i] = NULL; + } + mbar->open_count = 0; + return true; +} + +// close the submenu from a hierarchical menu item +static bool +_mui_menu_close_submenu( + mui_menu_t * menu ) +{ + mui_menu_control_t * sub = menu->sub; + if (!sub) + return false; + menu->sub = NULL; + mui_control_set_state((mui_control_t*)sub, 0); + if (sub->menu_window) { + mui_menu_close(sub->menu_window); + } + sub->menu_window = NULL; + + return true; +} + +/* + * This does the blinking of the selected item, and closes the menu + */ +static mui_time_t +mui_menu_close_timer_cb( + struct mui_t * mui, + mui_time_t now, + void * param) +{ + mui_menu_t * menu = param; + if (!menu->highlighted) { + printf("%s: no selected item, closing\n", __func__); + mui_window_dispose(&menu->win); + return 0; + } + menu->timer_call_count++; + mui_control_set_state(menu->highlighted, + menu->highlighted->state == MUI_CONTROL_STATE_CLICKED ? + MUI_CONTROL_STATE_NORMAL : MUI_CONTROL_STATE_CLICKED); + if (menu->timer_call_count == 3) { + // we are done! + mui_menuitem_control_t * item = (mui_menuitem_control_t*)menu->highlighted; + mui_window_action(&menu->win, MUI_MENU_ACTION_SELECT, &item->item); + // mui_menu_close_all(&menu->win); + if (menu->menubar) { + mui_menubar_t * mbar = (mui_menubar_t*)menu->menubar; + mui_window_action(&mbar->win, + MUI_MENUBAR_ACTION_SELECT, &item->item); + mbar->delayed_closing = false; + _mui_menubar_close_menu((mui_menubar_t*)menu->menubar); + } else + mui_menu_close(&menu->win); + return 0; + } + return MUI_MENU_CLOSE_BLINK_DELAY; +} +/* + * This restore the menubar to normal after a keystroke/menu equivalent was hit + */ +static mui_time_t +mui_menubar_unhighlight_cb( + struct mui_t * mui, + mui_time_t now, + void * param) +{ + mui_menubar_t * mbar = param; + mui_menubar_highlight(&mbar->win, false); + return 0; +} + +static int +mui_menu_action_cb( + mui_window_t * win, + void * cb_param, + uint32_t what, + void * param) // menu item here +{ + mui_menubar_t * mbar = cb_param; + D(printf("%s %s %4.4s\n", __func__, mbar->win.title, (char*)&what);) + switch (what) { + /* + * If a submenu is created, add ourselves as a callback to it as well, + * so we get notified when it is closed or an item is selected + */ + case MUI_MENU_ACTION_OPEN: { + mui_menu_t * submenu = param; + mui_window_set_action(&submenu->win, mui_menu_action_cb, mbar); + } break; + case MUI_MENU_ACTION_SELECT: { + mui_menu_item_t * item = param; + D(printf(" %s calling menubar action: %s\n", __func__, item->title);) + // this is typically application code! + mui_window_action(&mbar->win, MUI_MENUBAR_ACTION_SELECT, item); + } break; + case MUI_WINDOW_ACTION_CLOSE: { + D(mui_menu_t * menu = (mui_menu_t*)win;) + D(printf("%s closing %s\n", __func__, menu->win.title);) +// mui_menu_close_all(&mbar->win); + } break; + } + return 0; +} + +static int +mui_submenu_action_cb( + mui_window_t * win, + void * cb_param, + uint32_t what, + void * param) // menu item here +{ + mui_menu_t * menu = cb_param; + D(printf("%s %s %4.4s\n", __func__, menu->win.title, (char*)&what);) + switch (what) { + case MUI_MENU_ACTION_SELECT: { + mui_menu_item_t * item = param; + D(printf(" %s calling menubar action: %s\n", __func__, item->title);) + // this is typically application code! + mui_window_action(&menu->win, MUI_MENUBAR_ACTION_SELECT, item); + } break; + } + return 0; +} + + +static bool +mui_menubar_handle_mouse( + mui_menubar_t * mbar, + mui_event_t * ev ) +{ + mui_window_t * win = &mbar->win; + + bool inside = c2_rect_contains_pt(&win->frame, &ev->mouse.where); + mui_control_t * c = inside ? mui_control_locate(win, ev->mouse.where) : NULL; + switch (ev->type) { + case MUI_EVENT_BUTTONUP: { + D(printf("%s up drag %d click in:%d high:%d was:%d\n", __func__, + mbar->drag_ev, mbar->click_inside, + mbar->selected_title ? 1 : 0, mbar->was_highlighted);) + if (mbar->drag_ev == 0 && mbar->click_inside) { + if (mbar->was_highlighted) { + return _mui_menubar_close_menu(mbar); + } else + mbar->click_inside = false; + return true; + } else if (mbar->drag_ev == 0 && !mbar->click_inside) { + return false; + } + return _mui_menubar_close_menu(mbar); + } break; + case MUI_EVENT_DRAG: + if (!mbar->click_inside) + break; + mbar->drag_ev = 1; + // fallthrough + case MUI_EVENT_BUTTONDOWN: { + // printf("%s button %d\n", __func__, ev->mouse.button); + if (ev->mouse.button > 1) + break; + // save click, for detecting click+drag vs sticky menus + if (ev->type == MUI_EVENT_BUTTONDOWN) { + D(printf("%s click inside %d\n", __func__, inside);) + mbar->drag_ev = 0; + mbar->click_inside = inside; + mbar->was_highlighted = mbar->selected_title != NULL; + } + if (c && mui_control_get_state(c) != MUI_CONTROL_STATE_DISABLED) { + if (mbar->selected_title && + c != (mui_control_t*)mbar->selected_title) + _mui_menubar_close_menu(mbar); + mbar->click_inside = true; + mui_control_set_state(c, MUI_CONTROL_STATE_CLICKED); + mui_menu_control_t *title = (mui_menu_control_t*)c; + mbar->selected_title = title; + if (mui_control_get_type(c) == MUI_CONTROL_MENUTITLE) { + if (title->menu_window == NULL) { + title->menu_window = _mui_menu_create( + win->ui, mbar, C2_PT(c->frame.l, c->frame.b), + title->menu.e); + } + } + return true; + } + } break; + } + return false; +} + +/* + * Look into a menu item list for a key_equ match -- also handle + * recursive submenus, return true the match itself, if found + */ +static mui_menu_item_t * +mui_menu_handle_keydown( + mui_menu_item_t * items, + mui_event_t *ev ) +{ +// D(printf("%s\n", __func__);) + for (int ii = 0; items[ii].title; ii++) { + mui_menu_item_t * item = &items[ii]; + if (item->submenu) { + mui_menu_item_t * sub = mui_menu_handle_keydown(item->submenu, ev); + if (sub) + return sub; + continue; + } + if (!item->key_equ.value || item->disabled) + continue; + if (mui_event_match_key(ev, item->key_equ)) { + // printf("%s KEY MATCH %s\n", __func__, item->title); + return item; + } + } + return NULL; +} + +static bool +mui_menubar_handle_keydown( + mui_menubar_t * mbar, + mui_event_t *ev ) +{ + // iterate all the menus, check any with a key_equ that is + // non-zero, if would, highlight that menu (temporarily) + // and call the action function witht that menu item. score! + mui_window_t * win = &mbar->win; + for (mui_control_t * c = TAILQ_FIRST(&win->controls); + c; c = TAILQ_NEXT(c, self)) { + if (c->type != MUI_CONTROL_MENUTITLE) + continue; + mui_menu_control_t * title = (mui_menu_control_t*)c; + // printf("%s title %s\n", __func__, c->title); + mui_menu_item_t * item = mui_menu_handle_keydown( + title->menu.e, ev); + if (item) { + // printf("%s KEY MATCH %s\n", __func__, item->title); + mui_control_set_state(c, MUI_CONTROL_STATE_CLICKED); + mui_window_action(&mbar->win, + MUI_MENUBAR_ACTION_SELECT, item); + mui_timer_register(win->ui, mui_menubar_unhighlight_cb, mbar, + MUI_MENU_CLOSE_BLINK_DELAY); + return true; + } + } + return false; +} + +static bool +mui_wdef_menubar( + struct mui_window_t * win, + uint8_t what, + void * param) +{ + mui_menubar_t * mbar = (mui_menubar_t*)win; + switch (what) { + case MUI_WDEF_DRAW: { + mui_drawable_t * dr = param; + mui_wdef_menubar_draw(win, dr); + } break; + case MUI_WDEF_EVENT: { + mui_event_t *ev = param; + switch (ev->type) { + case MUI_EVENT_BUTTONUP: + case MUI_EVENT_DRAG: + case MUI_EVENT_BUTTONDOWN: { + if (mui_menubar_handle_mouse(mbar, ev)) { + // printf("%s handled\n", __func__); + return true; + } + } break; + case MUI_EVENT_KEYDOWN: { + // printf("%s keydown %c\n", __func__, ev->key.key); + if (mui_menubar_handle_keydown(mbar, ev)) + return true; + } break; + } + } break; + } + return false; +} + +static bool +mui_menu_handle_mouse( + mui_menu_t * menu, + mui_event_t * ev ) +{ + mui_window_t * win = &menu->win; + +// bool inside = c2_rect_contains_pt(&win->frame, &ev->mouse.where); + bool is_front = mui_window_isfront(win); + mui_control_t * c = mui_control_locate(win, ev->mouse.where); + switch (ev->type) { + case MUI_EVENT_BUTTONUP: { + D(printf("%s (%s) up drag %d\n", __func__, win->title, menu->drag_ev);) + if (menu->drag_ev == 0) { + // return true; + } + mui_menubar_t * mbar = (mui_menubar_t*)menu->menubar; + if (menu->highlighted && + menu->highlighted->type != MUI_CONTROL_SUBMENUITEM) { + /* + * This tells the normal closing code that we are + * taking care of the closing with the timer, and not *now* + */ + if (mbar) + mbar->delayed_closing = true; + menu->timer_call_count = 0; + mui_timer_register(win->ui, mui_menu_close_timer_cb, menu, + MUI_MENU_CLOSE_BLINK_DELAY); + } else { + menu->highlighted = NULL; + if (mbar) + _mui_menubar_close_menu(mbar); + else + mui_menu_close(win); + } + } break; + case MUI_EVENT_DRAG: + /* + * if we've just opened a submenu, make it 'sticky' for a while + * so that the user can drag the mouse to it without it closing + */ + if (!is_front && + (mui_get_time() - menu->sub_open_stamp) < (MUI_TIME_SECOND / 2)) + return false; + menu->drag_ev = 1; + // fallthrough + case MUI_EVENT_BUTTONDOWN: { + // save click, for detecting click+drag vs sticky menus + if (ev->type == MUI_EVENT_BUTTONDOWN) { + menu->drag_ev = 0; + } + // printf("%s in:%d c:%s\n", __func__, inside, c ? c->title : ""); + if (c && mui_control_get_state(c) != MUI_CONTROL_STATE_DISABLED) { + if (menu->sub && c != (mui_control_t*)menu->sub) + _mui_menu_close_submenu(menu); + if (menu->highlighted && c != menu->highlighted) + mui_control_set_state(menu->highlighted, 0); + mui_control_set_state(c, MUI_CONTROL_STATE_CLICKED); + menu->highlighted = c; + if (c->type == MUI_CONTROL_SUBMENUITEM) { + mui_menu_control_t *title = (mui_menu_control_t*)c; + if (title->menu_window == NULL) { + c2_pt_t where = C2_PT(c->frame.r, c->frame.t); + c2_pt_offset(&where, win->content.l, win->content.t); + title->menu_window = _mui_menu_create( + win->ui, + (mui_menubar_t*)menu->menubar, where, + title->menu.e); + menu->sub = title; + menu->sub_open_stamp = mui_get_time(); + mui_window_action(&menu->win, MUI_MENU_ACTION_OPEN, + title->menu_window); + mui_window_set_action(title->menu_window, + mui_submenu_action_cb, menu); + } + } + } else { + if (!menu->sub) { + if (menu->highlighted) + mui_control_set_state(menu->highlighted, 0); + menu->highlighted = NULL; + } + } + } break; + } + return false; +} + +static bool +mui_wdef_menu( + struct mui_window_t * win, + uint8_t what, + void * param) +{ + mui_menu_t * menu = (mui_menu_t*)win; + switch (what) { + case MUI_WDEF_DISPOSE: { + _mui_menu_close_submenu(menu); + } break; + case MUI_WDEF_DRAW: { + mui_drawable_t * dr = param; + // shared drawing code for the menubar and menu + mui_wdef_menubar_draw(win, dr); + } break; + case MUI_WDEF_EVENT: { + mui_event_t *ev = param; + switch (ev->type) { + case MUI_EVENT_BUTTONUP: + case MUI_EVENT_DRAG: + case MUI_EVENT_BUTTONDOWN: { + if (mui_menu_handle_mouse(menu, ev)) + return true; + } break; + } + } break; + } + return false; +} + + +mui_window_t * +mui_menubar_new( + mui_t * ui ) +{ + mui_font_t * main = mui_font_find(ui, "main"); + c2_rect_t mbf = C2_RECT_WH(0, 0, ui->screen_size.x, main->size + 4); + +// printf("%s frame %s\n", __func__, c2_rect_as_str(&mbf)); + mui_menubar_t * mbar = (mui_menubar_t*)mui_window_create( + ui, mbf, + mui_wdef_menubar, MUI_WINDOW_MENUBAR_LAYER, + "Menubar", sizeof(*mbar)); + ui->menubar = &mbar->win; + return &mbar->win; +} + +mui_window_t * +mui_menubar_get( + mui_t * ui ) +{ + return ui ? ui->menubar : NULL; +} + +bool +mui_menubar_window( + mui_window_t * win) +{ + return win && win->wdef == mui_wdef_menubar; +} + +mui_control_t * +mui_menubar_add_simple( + mui_window_t *win, + const char * title, + uint32_t menu_uid, + mui_menu_item_t * items ) +{ + mui_font_t * main = mui_font_find(win->ui, "main"); + stb_ttc_measure m = {}; + mui_font_text_measure(main, title, &m); + + int title_width = m.x1 - m.x0 + (main->size / 2); + c2_rect_t title_rect = { .t = 2 }; + + mui_control_t * last = TAILQ_LAST(&win->controls, controls); + if (last) { + c2_rect_offset(&title_rect, last->frame.r, 0); + } else + title_rect.l = 4; + title_rect.r = title_rect.l + title_width + 6; + title_rect.b = win->content.b + 2;// title_rect.t + m.ascent - m.descent; + + mui_control_t * c = mui_control_new( + win, MUI_CONTROL_MENUTITLE, mui_cdef_popup, + title_rect, title, menu_uid, + sizeof(mui_menu_control_t)); + //printf("%s title %s rect %s\n", __func__, title, c2_rect_as_str(&title_rect)); + + mui_menu_control_t *menu = (mui_menu_control_t*)c; + menu->menubar = win; + /* + * We do not clone the items, so they must be static + * from somewhere -- we do not free them either. + */ + int sub_count = 0; + for (int ii = 0; items[ii].title; ii++) + sub_count++; + menu->menu.count = sub_count; + menu->menu.e = items; + menu->menu.read_only = 1; + + return c; +} + +mui_window_t * +mui_menubar_highlight( + mui_window_t * win, + bool ignored ) +{ +// mui_menubar_t * mbar = (mui_menubar_t*)win; + mui_control_t * c = NULL; + TAILQ_FOREACH(c, &win->controls, self) { + if (c->type == MUI_CONTROL_MENUTITLE || + mui_control_get_state(c)) { + mui_control_set_state(c, 0); + } + } + return win; +} + + +static c2_rect_t +mui_menu_get_enclosing_rect( + mui_t * ui, + mui_menu_item_t * items) +{ + c2_rect_t frame = {}; + + mui_font_t * main = mui_font_find(ui, "main"); + stb_ttc_measure m = {}; + for (int i = 0; items[i].title; i++) { + items[i].location = frame.br; + if (items[i].title && items[i].title[0] != '-') { + mui_font_text_measure(main, items[i].title, &m); + int title_width = main->size + m.x1 - m.x0 ; + + if (items[i].kcombo[0]) { + mui_font_text_measure(main, items[i].kcombo, &m); + title_width += m.x1 - m.x0 + main->size; + } else + title_width += main->size; + + if (title_width > frame.r) + frame.r = title_width; + frame.b += main->size + 2; + } else { + frame.b += main->size / 4; + } + } + return frame; +} + +/* + * Given a list of items, create the actual windows & controls to show + * it onscreen + */ +static mui_window_t * +_mui_menu_create( + mui_t * ui, + mui_menubar_t * mbar, + c2_pt_t origin, + mui_menu_item_t * items ) +{ + if (mbar) + mui_window_action(&mbar->win, + MUI_MENUBAR_ACTION_PREPARE, + items); + + c2_rect_t frame = mui_menu_get_enclosing_rect(ui, items); + c2_rect_t on_screen = frame; + c2_rect_offset(&on_screen, origin.x, origin.y); + + /* Make sure the whole popup is on screen */ + /* TODO: handle very large popups, that'll be considerably more + * complicated to do, with the arrows, scrolling and stuff */ + c2_rect_t screen = C2_RECT_WH(0, 0, ui->screen_size.x, ui->screen_size.y); + if (on_screen.r > screen.r) + c2_rect_offset(&on_screen, screen.r - on_screen.r, 0); + if (on_screen.b > screen.b) + c2_rect_offset(&on_screen, 0, screen.b - on_screen.b); + if (on_screen.t < screen.t) + c2_rect_offset(&on_screen, 0, screen.t - on_screen.t); + if (on_screen.l < screen.l) + c2_rect_offset(&on_screen, screen.l - on_screen.l, 0); + + mui_menu_t * menu = (mui_menu_t*)mui_window_create( + ui, on_screen, + mui_wdef_menu, MUI_WINDOW_MENU_LAYER, + items[0].title, sizeof(*menu)); + if (mbar) { + mbar->open[mbar->open_count++] = menu; + menu->menubar = mbar; + } + /* Walk all the items in out static structure, and create the controls + * for each of them with their own corresponding item */ + for (int i = 0; items[i].title; i++) { + mui_menu_item_t * item = &items[i]; + item->index = i; + c2_rect_t title_rect = frame; + title_rect.t = item->location.y - 1; + if (items[i+1].title) + title_rect.b = items[i+1].location.y; + else + title_rect.b = frame.b; + + mui_control_t * c = NULL; + if (item->submenu) { + // printf("%s submenu %s\n", __func__, item->title); + c = mui_control_new( + &menu->win, + MUI_CONTROL_SUBMENUITEM, + mui_cdef_popup, + title_rect, item->title, item->uid, + sizeof(mui_menu_control_t)); + mui_menu_control_t *sub = (mui_menu_control_t*)c; + /* Note: menuitems aren't copied, we use the same static structure */ + sub->menu.count = 0; + for (int i = 0; item->submenu[i].title; i++) + sub->menu.count++; + sub->menu.e = item->submenu; + sub->menu.read_only = 1; + } else { + c = mui_control_new( + &menu->win, + MUI_CONTROL_MENUITEM, + mui_cdef_popup, + title_rect, item->title, item->uid, + sizeof(mui_menuitem_control_t)); + } + if (item->disabled) + mui_control_set_state(c, MUI_CONTROL_STATE_DISABLED); + // both item and submenu share a menuitem control + mui_menuitem_control_t *mic = (mui_menuitem_control_t*)c; + mic->item = *item; + } + return &menu->win; +} + +static void +mui_menu_close( + mui_window_t * win ) +{ + mui_menu_t * menu = (mui_menu_t*)win; + mui_menubar_t * mbar = (mui_menubar_t*)menu->menubar; // can be NULL + + menu->highlighted = NULL; + if (mbar && mbar->open_count) { + mbar->open[mbar->open_count-1] = NULL; + mbar->open_count--; + } + mui_window_dispose(win); +} + + +static int +mui_popupmenu_action_cb( + mui_window_t * win, + void * cb_param, + uint32_t what, + void * param) // popup control here +{ + mui_menu_control_t * pop = cb_param; + printf("%s %4.4s\n", __func__, (char*)&what); + switch (what) { + case MUI_MENU_ACTION_SELECT: { + mui_menu_item_t * item = param; + pop->item.control.value = item->index; + mui_control_inval(&pop->item.control); + mui_control_action(&pop->item.control, + MUI_CONTROL_ACTION_VALUE_CHANGED, NULL); + } break; + } + return 0; +} + +static bool +mui_popupmenu_handle_mouse( + mui_menu_control_t * pop, + mui_event_t * ev ) +{ + mui_control_t * c = &pop->item.control; + switch (ev->type) { + case MUI_EVENT_BUTTONUP: { + printf("%s up has popup %d\n", __func__, pop->menu_window != NULL); + if (pop->menu_window) { +// mui_menu_close(pop->menu_window); + pop->menu_window = NULL; + } + mui_control_set_state(c, 0); + } break; + case MUI_EVENT_BUTTONDOWN: { + mui_control_set_state(c, + ev->type != MUI_EVENT_BUTTONUP ? + MUI_CONTROL_STATE_CLICKED : 0); + if (!pop->menu_window) { + c2_pt_t loc = pop->menu_frame.tl; + c2_pt_offset(&loc, c->win->content.l, c->win->content.t); + c2_pt_offset(&loc, 0, -pop->menu.e[c->value].location.y); + pop->menu_window = _mui_menu_create( + c->win->ui, NULL, loc, + pop->menu.e); + mui_window_set_action(pop->menu_window, + mui_popupmenu_action_cb, pop); + // pass the mousedown to the new popup + // mui_window_handle_mouse(pop->menu_window, ev); + } + mui_control_inval(c); + } break; + } + return true; +} + +static bool +mui_cdef_popup( + struct mui_control_t * c, + uint8_t what, + void * param) +{ + switch (what) { + case MUI_CDEF_INIT: { + } break; + case MUI_CDEF_DISPOSE: + switch (c->type) { + case MUI_CONTROL_POPUP: + case MUI_CONTROL_MENUTITLE: { + mui_menu_control_t *pop = (mui_menu_control_t*)c; + if (pop->menu_window) { + mui_menu_close(pop->menu_window); + pop->menu_window = NULL; + } + mui_menu_items_clear(&pop->menu); + if (!pop->menu.read_only) + mui_menu_items_free(&pop->menu); + } break; + } + break; + case MUI_CDEF_DRAW: { + mui_drawable_t * dr = param; + switch (c->type) { + case MUI_CONTROL_POPUP: + mui_popuptitle_draw(c->win, c, dr); + break; + case MUI_CONTROL_MENUTITLE: + mui_menutitle_draw(c->win, c, dr); + break; + case MUI_CONTROL_MENUITEM: + case MUI_CONTROL_SUBMENUITEM: + mui_menuitem_draw(c->win, c, dr); + break; + } + } break; + case MUI_CDEF_EVENT: { + mui_event_t *ev = param; + // printf("%s event %d\n", __func__, ev->type); + switch (ev->type) { + case MUI_EVENT_BUTTONUP: + case MUI_EVENT_DRAG: + case MUI_EVENT_BUTTONDOWN: { + switch (c->type) { + case MUI_CONTROL_POPUP: { + mui_menu_control_t *pop = (mui_menu_control_t*)c; + return mui_popupmenu_handle_mouse(pop, ev); + } break; + case MUI_CONTROL_MENUTITLE: + // mui_menutitle_draw(c->win, c, dr); + break; + } + } break; + } + } break; + } + return false; +} + +mui_control_t * +mui_popupmenu_new( + mui_window_t * win, + c2_rect_t frame, + const char * title, + uint32_t uid ) +{ + return mui_control_new( + win, MUI_CONTROL_POPUP, mui_cdef_popup, + frame, title, uid, sizeof(mui_menu_control_t)); +} + +mui_menu_items_t * +mui_popupmenu_get_items( + mui_control_t * c) +{ + if (!c) + return NULL; + if (c->type != MUI_CONTROL_POPUP && c->type != MUI_CONTROL_MENUTITLE) { + printf("%s: not a popup or menutitle\n", __func__); + return NULL; + } + mui_menu_control_t *pop = (mui_menu_control_t*)c; + return &pop->menu; +} + +void +mui_popupmenu_prepare( + mui_control_t * c) +{ + mui_menu_control_t *pop = (mui_menu_control_t*)c; + if (pop->menu_window) { + mui_window_dispose(pop->menu_window); + pop->menu_window = NULL; + } + c2_rect_t frame = mui_menu_get_enclosing_rect(c->win->ui, pop->menu.e); + pop->menu_frame = frame; + c2_rect_offset(&frame, c->frame.l, c->frame.t); + frame.r += 32; // add the popup symbol width + if (c2_rect_width(&frame) < c2_rect_width(&c->frame)) { + c2_rect_offset(&frame, (c2_rect_width(&c->frame) / 2) - + (c2_rect_width(&frame) / 2), 0); + } + pop->menu_frame = frame; + c->value = 0; + mui_control_inval(c); +} diff --git a/libmui/mui/mui_menus_draw.c b/libmui/mui/mui_menus_draw.c new file mode 100644 index 0000000..8d7e1ad --- /dev/null +++ b/libmui/mui/mui_menus_draw.c @@ -0,0 +1,240 @@ +/* + * mui_menus_draw.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#include "mui.h" +#include "mui_priv.h" +#include "cg.h" + + +/* + * Menubar/menus frames is easy as pie -- just a framed rectangle + */ +void +mui_wdef_menubar_draw( + struct mui_window_t * win, + mui_drawable_t * dr) +{ + c2_rect_t content = win->frame; + win->content = content; + + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + + mui_color_t frameColor = MUI_COLOR(0x000000ff); + mui_color_t contentFill = MUI_COLOR(0xf0f0f0ff); + cg_set_line_width(cg, 1); + cg_rectangle(cg, win->frame.l + 0.5f, win->frame.t + 0.5f, + c2_rect_width(&win->frame) - 1, c2_rect_height(&win->frame) - 1); + cg_set_source_color(cg, &CG_COLOR(contentFill)); + cg_fill_preserve(cg); + cg_set_source_color(cg, &CG_COLOR(frameColor)); + cg_stroke(cg); +} + + +extern const mui_control_color_t mui_control_color[MUI_CONTROL_STATE_COUNT]; + +void +mui_menutitle_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ) +{ + c2_rect_t f = c->frame; + c2_rect_offset(&f, win->content.l, win->content.t); + + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + + mui_font_t * main = mui_font_find(win->ui, "main"); + stb_ttc_measure m = {}; + mui_font_text_measure(main, c->title, &m); + + int title_width = m.x1 - m.x0; + c2_rect_t title = f; + title.r = title.l + title_width + 1; + title.b = title.t + m.ascent - m.descent; + c2_rect_offset(&title, //-m.x0 + + (int)((c2_rect_width(&f) / 2) - (c2_rect_width(&title)) / 2), + (c2_rect_height(&f) / 2) - (c2_rect_height(&title) / 2)); + mui_drawable_clip_push(dr, &f); + uint32_t state = mui_control_get_state(c); + if (state) { + cg_set_source_color(cg, &CG_COLOR(mui_control_color[state].fill)); + cg_rectangle(cg, f.l, f.t, c2_rect_width(&f), c2_rect_height(&f)); + cg_fill(cg); + } + mui_font_text_draw(main, dr, + C2_PT(title.l, title.t), c->title, strlen(c->title), + mui_control_color[state].text); + mui_drawable_clip_pop(dr); +} + + +static void +mui_menuitem_get_locations( + mui_t * ui, + c2_rect_t * frame, + mui_menu_item_t * item, + c2_pt_t out[3] ) +{ + mui_font_t * main = mui_font_find(ui, "main"); + + stb_ttc_measure m = {}; + mui_font_text_measure(main, item->title, &m); + + c2_rect_t title = *frame; + title.b = title.t + m.ascent - m.descent; + c2_rect_offset(&title, 0, + (c2_rect_height(frame) / 2) - (c2_rect_height(&title) / 2)); + + if (item->icon[0]) { + title.l += 6; + mui_font_t * icons = mui_font_find(ui, "icon_small"); + + mui_font_text_measure(icons, item->icon, &m); + c2_pt_t loc = title.tl; + loc.x = loc.x + (icons->size / 2) - ((m.x1 - m.x0) / 2); + out[0] = loc; + title.l += 6; + } else if (item->mark[0]) { + mui_font_text_measure(main, item->mark, &m); + c2_pt_t loc = title.tl; + loc.x = loc.x + (main->size / 2) - ((m.x1 - m.x0) / 2); + out[0] = loc; + } + title.l += main->size; + out[1] = title.tl; + + if (item->kcombo[0]) { + mui_font_text_measure(main, item->kcombo, &m); + + c2_pt_t loc = C2_PT(title.r - m.x1 - m.x0 - (main->size/3), title.t); + out[2] = loc; + } +} + + +extern const mui_control_color_t mui_control_color[MUI_CONTROL_STATE_COUNT]; + +void +mui_menuitem_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ) +{ + c2_rect_t f = c->frame; + c2_rect_offset(&f, win->content.l, win->content.t); + + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + mui_drawable_clip_push(dr, &f); + + mui_font_t * main = TAILQ_FIRST(&win->ui->fonts); + if (c->title && c->title[0] != '-') { + c2_pt_t loc[3]; + mui_menuitem_control_t *mic = (mui_menuitem_control_t*)c; + mui_menuitem_get_locations(win->ui, &f, &mic->item, loc); + + uint32_t state = mui_control_get_state(c); + if (state && state != MUI_CONTROL_STATE_DISABLED) { + c2_rect_t b = f; + c2_rect_inset(&b, 1, 0); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[state].fill)); + cg_rectangle(cg, b.l, b.t, c2_rect_width(&b), c2_rect_height(&b)); + cg_fill(cg); + } + if (mic->item.icon[0]) { + mui_font_t * icons = mui_font_find(win->ui, "icon_small"); + mui_font_text_draw(icons, dr, + loc[0], mic->item.icon, 0, + mui_control_color[state].text); + } else if (mic->item.mark[0]) { + mui_font_text_draw(main, dr, + loc[0], mic->item.mark, 0, + mui_control_color[state].text); + } + mui_font_text_draw(main, dr, + loc[1], mic->item.title, 0, + mui_control_color[state].text); + + if (mic->item.kcombo[0]) { + mui_font_text_draw(main, dr, + loc[2], mic->item.kcombo, 0, + mui_control_color[state].text); + } + } else { + cg_move_to(cg, f.l, f.t + c2_rect_height(&f) / 2); + cg_line_to(cg, f.r, f.t + c2_rect_height(&f) / 2); + mui_color_t decoColor = MUI_COLOR(0x666666ff); + + cg_set_source_color(cg, &CG_COLOR(decoColor)); + cg_stroke(cg); + } + mui_drawable_clip_pop(dr); +} + + +void +mui_popuptitle_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ) +{ + mui_menu_control_t *pop = (mui_menu_control_t*)c; + c2_rect_t f = c->frame; + if (c2_rect_width(&pop->menu_frame) && + c2_rect_width(&pop->menu_frame) < c2_rect_width(&f)) { + f = pop->menu_frame; + f.b = c->frame.b; + } + c2_rect_offset(&f, win->content.l, win->content.t); + + mui_font_t * main = TAILQ_FIRST(&win->ui->fonts); + mui_font_t * icons = mui_font_find(win->ui, "icon_small"); + uint32_t state = mui_control_get_state(c); + + mui_drawable_clip_push(dr, &f); + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + c2_rect_t inner = f; + c2_rect_inset(&inner, 1, 1); + cg_set_line_width(cg, 2); + cg_round_rectangle(cg, inner.l, inner.t, + c2_rect_width(&inner), c2_rect_height(&inner), 3, 3); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[state].fill)); + cg_fill_preserve(cg); + cg_set_source_color(cg, &CG_COLOR(mui_control_color[state].frame)); + cg_stroke(cg); + cg_move_to(cg, inner.r - 32, inner.t + 2); + cg_line_to(cg, inner.r - 32, inner.b - 2); + mui_color_t decoColor = MUI_COLOR(0x666666ff); + cg_set_source_color(cg, &CG_COLOR(decoColor)); + cg_stroke(cg); + + if (pop->menu.count) { + mui_menu_item_t item = pop->menu.e[c->value]; + c2_pt_t loc[3]; + c2_rect_offset(&f, 0, -1); + mui_menuitem_get_locations(win->ui, &f, &item, loc); + + if (item.icon[0]) + mui_font_text_draw(icons, dr, + loc[0], item.icon, 0, + mui_control_color[state].text); + mui_font_text_draw(main, dr, + loc[1], item.title, 0, + mui_control_color[state].text); + } + mui_font_text_draw(icons, dr, + C2_PT(inner.r - 32 + 8, inner.t + 2), "", 0, + mui_control_color[state].text); + mui_drawable_clip_pop(dr); +} diff --git a/libmui/mui/mui_priv.h b/libmui/mui/mui_priv.h new file mode 100644 index 0000000..b321817 --- /dev/null +++ b/libmui/mui/mui_priv.h @@ -0,0 +1,87 @@ +/* + * mui_priv.h + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +/* + * This are functions that are used internally by the MUI library itself, + * but are not part of the public API. + */ + +#pragma once + +#include "mui.h" + +// private, used my mui_draw() -- do not use outside of this context +void +mui_window_draw( + mui_window_t *win, + mui_drawable_t *dr); +bool +mui_window_handle_mouse( + mui_window_t *win, + mui_event_t *event); +bool +mui_window_handle_keyboard( + mui_window_t *win, + mui_event_t *event); + + +void +mui_control_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ); + +bool +mui_control_event( + mui_control_t * c, + mui_event_t * ev ); + + +/* This is common to: + * - Menu titles in the menubar + * - Menu items in a popup menu + * - Menu items pointing to a sub-menu + */ +typedef struct mui_menuitem_control_t { + mui_control_t control; + mui_menu_item_t item; +} mui_menuitem_control_t; + +/* this is for menu title, popup menu labels, and hierarchical menu items */ +typedef struct mui_menu_control_t { + mui_menuitem_control_t item; + mui_menu_items_t menu; + c2_rect_t menu_frame; + mui_window_t * menubar; + mui_window_t * menu_window; // when open +} mui_menu_control_t; + +void +mui_wdef_menubar_draw( + struct mui_window_t * win, + mui_drawable_t * dr); +void +mui_popuptitle_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ); +void +mui_menuitem_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ); +void +mui_menutitle_draw( + mui_window_t * win, + mui_control_t * c, + mui_drawable_t *dr ); + +// return true if window win is the menubar +bool +mui_menubar_window( + mui_window_t * win); diff --git a/libmui/mui/mui_stdfile.c b/libmui/mui/mui_stdfile.c new file mode 100644 index 0000000..9aafd6c --- /dev/null +++ b/libmui/mui/mui_stdfile.c @@ -0,0 +1,409 @@ +/* + * mui_stdfile.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mui.h" +#include "c2_geometry.h" + +#include +#include + +DECLARE_C_ARRAY(char*, string_array, 2); +IMPLEMENT_C_ARRAY(string_array); + +typedef struct mui_stdfile_t { + mui_window_t win; + mui_control_t * ok, *cancel, *home, *root; + mui_control_t * listbox, *popup; + char * pref_file; // pathname we put last path used + char * re_pattern; + char * current_path; + char * selected_path; + regex_t re; + string_array_t pop_path; +} mui_stdfile_t; + +enum { + MUI_STD_FILE_PART_FRAME = 0, + MUI_STD_FILE_PART_OK, + MUI_STD_FILE_PART_CANCEL, + MUI_STD_FILE_PART_HOME, + MUI_STD_FILE_PART_ROOT, + MUI_STD_FILE_PART_LISTBOX, + MUI_STD_FILE_PART_POPUP, + MUI_STD_FILE_PART_COUNT, +}; + +static int +_mui_stdfile_sort_cb( + const void * a, + const void * b) +{ + const mui_listbox_elem_t * ea = a; + const mui_listbox_elem_t * eb = b; + #if 0 + if (ea->icon == MUI_ICON_FOLDER && eb->icon != MUI_ICON_FOLDER) + return -1; + if (ea->icon != MUI_ICON_FOLDER && eb->icon == MUI_ICON_FOLDER) + return 1; + #endif + return strcmp(ea->elem, eb->elem); +} + +static int +_mui_stdfile_populate( + mui_stdfile_t * std, + const char * path) +{ + if (std->current_path && !strcmp(std->current_path, path)) + return 0; + + printf("%s %s\n", __func__, path); + errno = 0; + DIR * dir = opendir(path); + if (!dir) { + // show an alert of some sort + char * msg = NULL; + asprintf(&msg, "%s\n%s", path, + strerror(errno)); + mui_alert(std->win.ui, C2_PT(0,0), + "Could not open directory", + msg, + MUI_ALERT_FLAG_OK); + return -1; + } + if (std->current_path) + free(std->current_path); + std->current_path = strdup(path); + path = NULL; // this COULD be in the list we are now deleting! + for (int i = 0; i < (int)std->pop_path.count; i++) + free(std->pop_path.e[i]); + std->pop_path.count = 0; + + mui_control_t *pop = std->popup; + mui_menu_items_t * items = mui_popupmenu_get_items(pop); + mui_menu_items_clear(items); + char * p = strdup(std->current_path); + char * d; + const char *home = getenv("HOME"); + int item_id = 1000; + while ((d = basename(p)) != NULL) { + mui_menu_item_t i = { + .title = strdup(d), + .uid = item_id++, + }; + if (!strcmp(d, "/")) + strcpy(i.icon, MUI_ICON_ROOT); + else if (home && !strcmp(p, home)) + strcpy(i.icon, MUI_ICON_HOME); + else + strcpy(i.icon, MUI_ICON_FOLDER_OPEN); + mui_menu_items_push(items, i); + // printf(" %s - %s\n", p, d); + string_array_push(&std->pop_path, strdup(p)); + if (!strcmp(d, "/")) + break; + *d = 0; + } + free(p); + mui_menu_item_t z = {}; + mui_menu_items_push(items, z); + mui_popupmenu_prepare(pop); + + mui_control_t * lb = std->listbox; + mui_listbox_elems_t * elems = mui_listbox_get_elems(lb); + mui_listbox_elems_clear(elems); + struct dirent * ent; + while ((ent = readdir(dir))) { + if (ent->d_name[0] == '.') + continue; + struct stat st; + char * full_path = NULL; + asprintf(&full_path, "%s/%s", std->current_path, ent->d_name); + stat(full_path, &st); + free(full_path); + mui_listbox_elem_t e = {}; + // usr the regex to filter file names + if (std->re_pattern) { + if (!S_ISDIR(st.st_mode) && regexec(&std->re, ent->d_name, 0, NULL, 0)) + e.disabled = 1; + } + e.elem = strdup(ent->d_name); + if (S_ISDIR(st.st_mode)) + strcpy(e.icon, MUI_ICON_FOLDER); + else + strcpy(e.icon, MUI_ICON_FILE); + mui_listbox_elems_push(elems, e); + } + qsort(elems->e, elems->count, + sizeof(mui_listbox_elem_t), _mui_stdfile_sort_cb); + mui_control_set_value(lb, 0); + mui_listbox_prepare(lb); + closedir(dir); + return 0; +} + +static int +_mui_stdfile_window_action( + mui_window_t * win, + void * cb_param, + uint32_t what, + void * param) +{ + mui_stdfile_t * std = (mui_stdfile_t*)win; + + switch (what) { + case MUI_WINDOW_ACTION_CLOSE: { + // dispose of anything we had allocated + printf("%s close\n", __func__); + if (std->pref_file) + free(std->pref_file); + if (std->re_pattern) + free(std->re_pattern); + if (std->current_path) + free(std->current_path); + if (std->selected_path) + free(std->selected_path); + regfree(&std->re); + for (int i = 0; i < (int)std->pop_path.count; i++) + free(std->pop_path.e[i]); + std->pop_path.count = 0; + + } break; + } + return 0; +} + +static int +_mui_stdfile_control_action( + mui_control_t * c, + void * cb_param, + uint32_t what, + void * param) +{ + mui_stdfile_t * std = cb_param; + switch (c->uid) { + case MUI_STD_FILE_PART_OK: { + mui_listbox_elem_t * e = mui_listbox_get_elems(std->listbox)->e; + int idx = mui_control_get_value(std->listbox); + if (idx < 0 || idx >= (int)mui_listbox_get_elems(std->listbox)->count) + return 0; + mui_listbox_elem_t * elem = &e[idx]; + if (elem->disabled) + break; + // save pref file + if (std->pref_file) { + FILE * f = fopen(std->pref_file, "w"); + if (f) { + fprintf(f, "%s\n", std->current_path); + fclose(f); + } + } + _mui_stdfile_control_action(std->listbox, std, + MUI_CONTROL_ACTION_SELECT, elem); + } break; + case MUI_STD_FILE_PART_CANCEL: + mui_window_action(&std->win, MUI_STDF_ACTION_CANCEL, NULL); + break; + case MUI_STD_FILE_PART_HOME: + // printf("%s Home\n", __func__); + _mui_stdfile_populate(std, getenv("HOME")); + break; + case MUI_STD_FILE_PART_ROOT: + // printf("%s Root\n", __func__); + _mui_stdfile_populate(std, "/"); + break; + case MUI_STD_FILE_PART_LISTBOX: { + // printf("%s Listbox\n", __func__); + if (what == MUI_CONTROL_ACTION_SELECT || + what == MUI_CONTROL_ACTION_DOUBLECLICK) { + mui_listbox_elem_t * e = param; + if (e->disabled) + break; + char * full_path = NULL; + asprintf(&full_path, "%s/%s", + std->current_path, (char*)e->elem); + char *dbl; + while ((dbl = strstr(full_path, "//")) != NULL) { + memmove(dbl, dbl + 1, strlen(dbl)); // include zero + } + struct stat st; + stat(full_path, &st); + if (S_ISDIR(st.st_mode)) { + _mui_stdfile_populate(std, full_path); + } else { + printf("Selected: %s\n", full_path); + mui_window_action(&std->win, MUI_STDF_ACTION_SELECT, NULL); + } + free(full_path); + } + } break; + case MUI_STD_FILE_PART_POPUP: + // printf("%s POPUP\n", __func__); + if (what == MUI_CONTROL_ACTION_VALUE_CHANGED) { + int idx = mui_control_get_value(c); + printf("Selected: %s\n", std->pop_path.e[idx]); + _mui_stdfile_populate(std, std->pop_path.e[idx]); + } + break; + } + return 0; +} + +mui_window_t * +mui_stdfile_get( + struct mui_t * ui, + c2_pt_t where, + const char * prompt, + const char * regexp, + const char * start_path ) +{ + c2_rect_t wpos = C2_RECT_WH(where.x, where.y, 700, 400); + if (where.x == 0 && where.y == 0) + c2_rect_offset(&wpos, + (ui->screen_size.x / 2) - (c2_rect_width(&wpos) / 2), + (ui->screen_size.y * 0.4) - (c2_rect_height(&wpos) / 2)); + mui_window_t *w = mui_window_create(ui, + wpos, + NULL, MUI_WINDOW_LAYER_MODAL, + prompt, sizeof(mui_stdfile_t)); + mui_window_set_action(w, _mui_stdfile_window_action, NULL); + mui_stdfile_t *std = (mui_stdfile_t *)w; + if (regexp) { + std->re_pattern = strdup(regexp); + int re = regcomp(&std->re, std->re_pattern, REG_EXTENDED); + if (re) { + char * msg = NULL; + asprintf(&msg, "%s\n%s", std->re_pattern, + strerror(errno)); + mui_alert(std->win.ui, C2_PT(0,0), + "Could not compile regexp", + msg, + MUI_ALERT_FLAG_OK); + free(std->re_pattern); + std->re_pattern = NULL; + } + } + mui_control_t * c = NULL; + c2_rect_t cf; + cf = C2_RECT_WH(0, 0, 120, 40); + c2_rect_left_of(&cf, c2_rect_width(&w->content), 20); + c2_rect_top_of(&cf, c2_rect_height(&w->content), 20); + std->cancel = c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Cancel", MUI_STD_FILE_PART_CANCEL); + c2_rect_top_of(&cf, cf.t, 20); + std->ok = c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_DEFAULT, + "Select", MUI_STD_FILE_PART_OK); + + std->ok->key_equ = MUI_KEY_EQU(0, 13); // return + std->cancel->key_equ = MUI_KEY_EQU(0, 27); // ESC + + c2_rect_t t = cf; + t.b = t.t + 1; + c2_rect_top_of(&t, cf.t, 25); + c = mui_separator_new(w, t); + + c2_rect_top_of(&cf, cf.t, 40); + std->home = c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Home", MUI_STD_FILE_PART_HOME); + c->key_equ = MUI_KEY_EQU(MUI_MODIFIER_ALT, 'h'); + + c2_rect_top_of(&cf, cf.t, 20); + std->root = c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Root", MUI_STD_FILE_PART_ROOT); + c->key_equ = MUI_KEY_EQU(MUI_MODIFIER_ALT, '/'); + + cf = C2_RECT_WH(15, 45, 700-185, 300); + std->listbox = c = mui_listbox_new(w, cf, + MUI_STD_FILE_PART_LISTBOX); + + cf = C2_RECT_WH(15, 0, 700-185, 34); + c2_rect_top_of(&cf, std->listbox->frame.t, 6); + std->popup = c = mui_popupmenu_new(w, cf, + "Popup", MUI_STD_FILE_PART_POPUP); +// printf("Popup: %p\n", c); + c = NULL; + TAILQ_FOREACH(c, &w->controls, self) { + if (mui_control_get_uid(c) == 0) + continue; + mui_control_set_action(c, _mui_stdfile_control_action, std); + } + int dopop = 1; // populate to start_path by default + if (ui->pref_directory) { + uint32_t hash = std->re_pattern ? mui_hash(std->re_pattern) : 0; + asprintf(&std->pref_file, "%s/std_path_%04x", ui->pref_directory, hash); + printf("%s pref file: %s\n", __func__, std->pref_file); + /* read last used pathname */ + FILE * f = fopen(std->pref_file, "r"); + if (f) { + char * path = NULL; + size_t len = 0; + getline(&path, &len, f); + fclose(f); + if (path) { + char *nl = strrchr(path, '\n'); + if (nl) + *nl = 0; + if (_mui_stdfile_populate(std, path) == 0) { + printf("%s last path[%s]: %s\n", __func__, + std->re_pattern, path); + dopop = 0; + } + free(path); + } + } + } + if (dopop) + _mui_stdfile_populate(std, start_path); + + return w; +} + +char * +mui_stdfile_get_path( + mui_window_t * w ) +{ + mui_stdfile_t * std = (mui_stdfile_t *)w; + return std->current_path; +} + +char * +mui_stdfile_get_selected_path( + mui_window_t * w ) +{ + mui_stdfile_t * std = (mui_stdfile_t *)w; + + mui_listbox_elem_t * e = mui_listbox_get_elems(std->listbox)->e; + int idx = mui_control_get_value(std->listbox); + if (idx < 0 || idx >= (int)mui_listbox_get_elems(std->listbox)->count) + return NULL; + mui_listbox_elem_t * elem = &e[idx]; + char * full_path = NULL; + asprintf(&full_path, "%s/%s", + std->current_path, (char*)elem->elem); + char *dbl; + while ((dbl = strstr(full_path, "//")) != NULL) { + memmove(dbl, dbl + 1, strlen(dbl)); // include zero + } + return full_path; +} diff --git a/libmui/mui/mui_utils.c b/libmui/mui/mui_utils.c new file mode 100644 index 0000000..e5b86f7 --- /dev/null +++ b/libmui/mui/mui_utils.c @@ -0,0 +1,40 @@ +/* + * mui_utils.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include "mui.h" + +mui_time_t +mui_get_time() +{ + struct timespec tim; + clock_gettime(CLOCK_MONOTONIC_RAW, &tim); + uint64_t time = ((uint64_t)tim.tv_sec) * (1000000 / MUI_TIME_RES) + + tim.tv_nsec / (1000 * MUI_TIME_RES); + return time; +} + + +uint32_t +mui_hash( + const char * inString ) +{ + if (!inString) + return 0; + /* Described http://papa.bretmulvey.com/post/124027987928/hash-functions */ + const uint32_t p = 16777619; + uint32_t hash = 0x811c9dc5; + while (*inString) + hash = (hash ^ (*inString++)) * p; + hash += hash << 13; + hash ^= hash >> 7; + hash += hash << 3; + hash ^= hash >> 17; + hash += hash << 5; + return hash; +} \ No newline at end of file diff --git a/libmui/mui/mui_window.c b/libmui/mui/mui_window.c new file mode 100644 index 0000000..bfcf94d --- /dev/null +++ b/libmui/mui/mui_window.c @@ -0,0 +1,503 @@ +/* + * mui_window.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +#include "mui_priv.h" +#include "cg.h" + +enum mui_window_part_e { + MUI_WINDOW_PART_NONE = 0, + MUI_WINDOW_PART_CONTENT, + MUI_WINDOW_PART_TITLE, + MUI_WINDOW_PART_FRAME, + MUI_WINDOW_PART_COUNT, +}; + +static void +mui_window_update_rects( + mui_window_t *win, + mui_font_t * main ) +{ + int title_height = main->size; + c2_rect_t content = win->frame; + c2_rect_inset(&content, 4, 4); + content.t += title_height - 1; + win->content = content; +} + +void +mui_titled_window_draw( + struct mui_t *ui, + mui_window_t *win, + mui_drawable_t *dr) +{ + mui_font_t * main = mui_font_find(ui, "main"); + if (!main) + return; + mui_window_update_rects(win, main); + int title_height = main->size; + + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + mui_color_t frameFill = MUI_COLOR(0xbbbbbbff); + mui_color_t contentFill = MUI_COLOR(0xf0f0f0ff); + mui_color_t frameColor = MUI_COLOR(0x000000ff); + mui_color_t decoColor = MUI_COLOR(0x999999ff); + mui_color_t titleColor = MUI_COLOR(0x000000aa); + mui_color_t dimTitleColor = MUI_COLOR(0x00000055); + + cg_set_line_width(cg, 1); + cg_rectangle(cg, win->frame.l + 0.5f, win->frame.t + 0.5f, + c2_rect_width(&win->frame) - 1, c2_rect_height(&win->frame) - 1); + cg_rectangle(cg, win->content.l + 0.5f, win->content.t + 0.5f, + c2_rect_width(&win->content) - 1, c2_rect_height(&win->content) - 1); + cg_set_source_color(cg, &CG_COLOR(frameFill)); + cg_fill_preserve(cg); + cg_set_source_color(cg, &CG_COLOR(frameColor)); + cg_stroke(cg); + + bool isFront = mui_window_front(ui) == win; + if (isFront) { + const int lrMargin = 6; + const int steps = 6; + cg_set_line_width(cg, 2); + for (int i = 1; i < (title_height + 4) / steps; i++) { + cg_move_to(cg, win->frame.l + lrMargin, win->frame.t + i * steps); + cg_line_to(cg, win->frame.r - lrMargin, win->frame.t + i * steps); + } + cg_set_source_color(cg, &CG_COLOR(decoColor)); + cg_stroke(cg); + } + if (win->title) { + stb_ttc_measure m = {}; + mui_font_text_measure(main, win->title, &m); + + int title_width = m.x1 - m.x0; + c2_rect_t title = win->frame; + c2_rect_offset(&title, 0, 1); + title.b = title.t + title_height; + title.l += (c2_rect_width(&win->frame) / 2) - (title_width / 2); + title.r = title.l + title_width; + if (isFront) { + c2_rect_t titleBack = title; + c2_rect_inset(&titleBack, -6, 0); + cg_round_rectangle(cg, titleBack.l, titleBack.t, + c2_rect_width(&titleBack), c2_rect_height(&titleBack), 12, 12); + cg_set_source_color(cg, &CG_COLOR(frameFill)); + cg_fill(cg); + } + mui_font_text_draw(main, dr, + C2_PT(-m.x0 + 1 + title.l, title.t + 0), + win->title, strlen(win->title), + isFront ? titleColor : dimTitleColor); + } + cg_set_source_color(cg, &CG_COLOR(contentFill)); + cg_rectangle(cg, win->content.l + 0.5f, win->content.t + 0.5f, + c2_rect_width(&win->content) - 1, c2_rect_height(&win->content) - 1); + cg_fill(cg); +} + +mui_window_t * +mui_window_create( + struct mui_t *ui, + c2_rect_t frame, + mui_wdef_p wdef, + uint8_t layer, + const char *title, + uint32_t instance_size) +{ + mui_window_t * w = calloc(1, + instance_size >= sizeof(*w) ? + instance_size : sizeof(*w)); + w->ui = ui; + w->frame = frame; + w->title = title ? strdup(title) : NULL; + w->wdef = wdef; + w->flags.layer = layer; + TAILQ_INIT(&w->controls); + TAILQ_INIT(&w->zombies); + STAILQ_INIT(&w->actions); + pixman_region32_init(&w->inval); + + TAILQ_INSERT_HEAD(&ui->windows, w, self); + mui_window_select(w); // place it in it's own layer + mui_font_t * main = mui_font_find(ui, "main"); + mui_window_update_rects(w, main); + mui_window_inval(w, NULL); // just to mark the UI dirty + + return w; +} + +void +_mui_control_free( + mui_control_t * c ); +void +_mui_window_free( + mui_window_t *win) +{ + if (!win) + return; + pixman_region32_fini(&win->inval); + mui_control_t * c; + while ((c = TAILQ_FIRST(&win->controls))) { + mui_control_dispose(c); + } + while ((c = TAILQ_FIRST(&win->zombies))) { + TAILQ_REMOVE(&win->zombies, c, self); + _mui_control_free(c); + } + if (win->title) + free(win->title); + free(win); +} + +void +mui_window_dispose( + mui_window_t *win) +{ + if (!win) + return; + if (win->flags.zombie) { + printf("%s: DOUBLE delete %s\n", __func__, win->title); + return; + } + bool was_front = mui_window_isfront(win); + mui_window_action(win, MUI_WINDOW_ACTION_CLOSE, NULL); + mui_window_inval(win, NULL); // just to mark the UI dirty + if (win->wdef) + win->wdef(win, MUI_WDEF_DISPOSE, NULL); + struct mui_t *ui = win->ui; + TAILQ_REMOVE(&ui->windows, win, self); + if (ui->event_capture == win) + ui->event_capture = NULL; + if (ui->action_active) { + // printf("%s %s is now zombie\n", __func__, win->title); + win->flags.zombie = true; + TAILQ_INSERT_TAIL(&ui->zombies, win, self); + } else + _mui_window_free(win); + if (was_front) { + mui_window_t * front = mui_window_front(ui); + if (front) + mui_window_inval(front, NULL); + } +} + +void +mui_window_draw( + mui_window_t *win, + mui_drawable_t *dr) +{ + mui_drawable_clip_push(dr, &win->frame); + if (win->wdef) + win->wdef(win, MUI_WDEF_DRAW, dr); + else + mui_titled_window_draw(win->ui, win, dr); + struct cg_ctx_t * cg = mui_drawable_get_cg(dr); + cg_save(cg); +// cg_translate(cg, content.l, content.t); + mui_control_t * c, *safe; + TAILQ_FOREACH_SAFE(c, &win->controls, self, safe) { + mui_control_draw(win, c, dr); + } + cg_restore(cg); + + mui_drawable_clip_pop(dr); +} + +bool +mui_window_handle_keyboard( + mui_window_t *win, + mui_event_t *event) +{ + if (!mui_window_isfront(win)) + return false; + if (win->wdef && win->wdef(win, MUI_WDEF_EVENT, event)) { +// printf("%s %s handled it\n", __func__, win->title); + return true; + } +// printf("%s %s checkint controls\n", __func__, win->title); + mui_control_t * c, *safe; + TAILQ_FOREACH_SAFE(c, &win->controls, self, safe) { + if (mui_control_event(c, event)) { +// printf("%s control %s handled it\n", __func__, c->title); + return true; + } + } + return false; +} + +bool +mui_window_handle_mouse( + mui_window_t *win, + mui_event_t *event) +{ + if (win->wdef && win->wdef(win, MUI_WDEF_EVENT, event)) + return true; + switch (event->type) { + case MUI_EVENT_WHEEL: { + if (!c2_rect_contains_pt(&win->frame, &event->wheel.where)) + return false; + mui_control_t * c = mui_control_locate(win, event->wheel.where); + if (!c) + return false; + if (c->cdef && c->cdef(c, MUI_CDEF_EVENT, event)) { + return true; + } + } break; + case MUI_EVENT_BUTTONDOWN: { + if (!c2_rect_contains_pt(&win->frame, &event->mouse.where)) + return false; + mui_control_t * c = mui_control_locate(win, event->mouse.where); + /* if modifiers like control is down, don't select */ + if (!(event->modifiers & MUI_MODIFIER_CTRL)) + mui_window_select(win); + if (mui_window_front(win->ui) != win) + c = NULL; + if (!c) { + /* find where we clicked in the window */ + win->ui->event_capture = win; + win->click_loc = event->mouse.where; + c2_pt_offset(&win->click_loc, -win->frame.l, -win->frame.t); + win->flags.hit_part = MUI_WINDOW_PART_FRAME; + if (event->mouse.where.y < win->content.t) + win->flags.hit_part = MUI_WINDOW_PART_TITLE; + else if (c2_rect_contains_pt(&win->content, &event->mouse.where)) + win->flags.hit_part = MUI_WINDOW_PART_CONTENT; + } else + win->flags.hit_part = MUI_WINDOW_PART_CONTENT; + if (c) { + if (c->cdef && c->cdef(c, MUI_CDEF_EVENT, event)) { + // c->state = MUI_CONTROL_STATE_CLICKED; + win->control_clicked = c; + } + } + return true; + } break; + case MUI_EVENT_DRAG: + if (win->flags.hit_part == MUI_WINDOW_PART_TITLE) { + c2_rect_t frame = win->frame; + c2_rect_offset(&frame, + -win->frame.l + event->mouse.where.x - win->click_loc.x, + -win->frame.t + event->mouse.where.y - win->click_loc.y); + // todo, get that visibel rectangle from somewhere else + c2_rect_t screen = { .br = win->ui->screen_size }; + screen.t += 35; + c2_rect_t title_bar = frame; + title_bar.b = title_bar.t + 35; // TODO fix that + if (c2_rect_intersect_rect(&title_bar, &screen)) { + c2_rect_t o; + c2_rect_clip_rect(&title_bar, &screen, &o); + if (c2_rect_width(&o) > 10 && c2_rect_height(&o) > 10) { + mui_window_inval(win, NULL); // old frame + win->frame = frame; + mui_window_inval(win, NULL); // new frame + } + } + // mui_window_inval(win, NULL); + return true; + } + if (win->control_clicked) { + mui_control_t * c = win->control_clicked; + if (c->cdef && c->cdef(c, MUI_CDEF_EVENT, event)) { + return true; + } else + win->control_clicked = NULL; + } + return win->flags.hit_part != MUI_WINDOW_PART_NONE; + break; + case MUI_EVENT_BUTTONUP: { + int part = win->flags.hit_part; + win->flags.hit_part = MUI_WINDOW_PART_NONE; + win->ui->event_capture = NULL; + if (win->control_clicked) { + mui_control_t * c = win->control_clicked; + win->control_clicked = NULL; + if (c->cdef && c->cdef(c, MUI_CDEF_EVENT, event)) + return true; + } + return part != MUI_WINDOW_PART_NONE; + } break; + case MUI_EVENT_MOUSEENTER: + case MUI_EVENT_MOUSELEAVE: + break; + } +// printf("MOUSE %s button %d\n", __func__, event->mouse.button); +// printf("MOUSE %s %s\n", __func__, c->title); + return false; +} + +void +mui_window_inval( + mui_window_t *win, + c2_rect_t * r) +{ + if (!win) + return; + c2_rect_t frame = win->frame; + c2_rect_t forward = {}; + + if (!r) { + // printf("%s %s inval %s (whole)\n", __func__, win->title, c2_rect_as_str(&frame)); + pixman_region32_reset(&win->inval, (pixman_box32_t*)&frame); + forward = frame; + + mui_window_t * w; + TAILQ_FOREACH(w, &win->ui->windows, self) { + if (w == win || !c2_rect_intersect_rect(&w->frame, &forward)) + continue; + pixman_region32_union_rect(&w->inval, &w->inval, + forward.l, forward.t, + c2_rect_width(&forward), c2_rect_height(&forward)); + } + } else { + c2_rect_t local = *r; + c2_rect_offset(&local, win->content.l, win->content.t); + forward = local; + + pixman_region32_union_rect(&win->inval, &win->inval, + forward.l, forward.t, + c2_rect_width(&forward), c2_rect_height(&forward)); + } + if (c2_rect_isempty(&forward)) + return; + pixman_region32_union_rect(&win->ui->inval, &win->ui->inval, + forward.l, forward.t, + c2_rect_width(&forward), c2_rect_height(&forward)); +} + +mui_window_t * +mui_window_front( + struct mui_t *ui) +{ + if (!ui) + return NULL; + mui_window_t * w; + TAILQ_FOREACH_REVERSE(w, &ui->windows, windows, self) { + if (w->flags.hidden) + continue; + if (w->flags.layer < MUI_WINDOW_MENUBAR_LAYER) + return w; + } + return NULL; +} + +bool +mui_window_isfront( + mui_window_t *win) +{ + if (!win) + return NULL; + mui_window_t * next = TAILQ_NEXT(win, self); + while (next && next->flags.hidden) + next = TAILQ_NEXT(next, self); + if (!next) + return true; + if (next->flags.layer > win->flags.layer) + return true; + return false; +} + +bool +mui_window_select( + mui_window_t *win) +{ + bool res = false; + if (!win) + return false; + mui_window_t *last = NULL; + if (mui_window_isfront(win)) + goto done; + res = true; + mui_window_inval(win, NULL); + TAILQ_REMOVE(&win->ui->windows, win, self); + mui_window_t *w, *save; + TAILQ_FOREACH_SAFE(w, &win->ui->windows, self, save) { + if (w->flags.layer > win->flags.layer) { + TAILQ_INSERT_BEFORE(w, win, self); + goto done; + } + last = w; + } + TAILQ_INSERT_TAIL(&win->ui->windows, win, self); +done: + if (last) // we are deselecting this one, so redraw it + mui_window_inval(last, NULL); +#if 0 + printf("%s %s res:%d stack is now:\n", __func__, win->title, res); + TAILQ_FOREACH(w, &win->ui->windows, self) { + printf(" L:%2d T:%s\n", w->flags.layer, w->title); + } +#endif + return res; +} + +void +mui_window_action( + mui_window_t * win, + uint32_t what, + void * param ) +{ + if (!win) + return; + win->ui->action_active++; + mui_action_t *a; + STAILQ_FOREACH(a, &win->actions, self) { + if (!a->window_cb) + continue; + a->window_cb(win, a->cb_param, what, param); + } + win->ui->action_active--; +} + +void +mui_window_set_action( + mui_window_t * win, + mui_window_action_p cb, + void * param ) +{ + if (!win || !cb) + return; + + mui_action_t *a; + STAILQ_FOREACH(a, &win->actions, self) { + if (a->window_cb == cb && a->cb_param == param) + return; + } + a = calloc(1, sizeof(*a)); + a->window_cb = cb; + a->cb_param = param; + STAILQ_INSERT_TAIL(&win->actions, a, self); +} + +mui_window_t * +mui_window_get_by_id( + struct mui_t *ui, + uint32_t uid ) +{ + mui_window_t *w; + TAILQ_FOREACH(w, &ui->windows, self) { + if (w->uid == uid) + return w; + } + return NULL; +} + +void +mui_window_set_id( + mui_window_t *win, + uint32_t uid) +{ + if (!win) + return; + win->uid = uid; +} diff --git a/libmui/mui/stb_truetype.h b/libmui/mui/stb_truetype.h new file mode 100644 index 0000000..bbf2284 --- /dev/null +++ b/libmui/mui/stb_truetype.h @@ -0,0 +1,5077 @@ +// stb_truetype.h - v1.26 - public domain +// authored from 2009-2021 by Sean Barrett / RAD Game Tools +// +// ======================================================================= +// +// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES +// +// This library does no range checking of the offsets found in the file, +// meaning an attacker can use it to read arbitrary memory. +// +// ======================================================================= +// +// This library processes TrueType files: +// parse files +// extract glyph metrics +// extract glyph shapes +// render glyphs to one-channel bitmaps with antialiasing (box filter) +// render glyphs to one-channel SDF bitmaps (signed-distance field/function) +// +// Todo: +// non-MS cmaps +// crashproof on bad data +// hinting? (no longer patented) +// cleartype-style AA? +// optimize: use simple memory allocator for intermediates +// optimize: build edge-list directly from curves +// optimize: rasterize directly from curves? +// +// ADDITIONAL CONTRIBUTORS +// +// Mikko Mononen: compound shape support, more cmap formats +// Tor Andersson: kerning, subpixel rendering +// Dougall Johnson: OpenType / Type 2 font handling +// Daniel Ribeiro Maciel: basic GPOS-based kerning +// +// Misc other: +// Ryan Gordon +// Simon Glass +// github:IntellectualKitty +// Imanol Celaya +// Daniel Ribeiro Maciel +// +// Bug/warning reports/fixes: +// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe +// Cass Everitt Martins Mozeiko github:aloucks +// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam +// Brian Hook Omar Cornut github:vassvik +// Walter van Niftrik Ryan Griege +// David Gow Peter LaValle +// David Given Sergey Popov +// Ivan-Assen Ivanov Giumo X. Clanjor +// Anthony Pesch Higor Euripedes +// Johan Duparc Thomas Fields +// Hou Qiming Derek Vinyard +// Rob Loach Cort Stratton +// Kenney Phillis Jr. Brian Costabile +// Ken Voskuil (kaesve) +// +// VERSION HISTORY +// +// 1.26 (2021-08-28) fix broken rasterizer +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// variant PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// +// Full history can be found at the end of this file. +// +// LICENSE +// +// See end of file for license information. +// +// USAGE +// +// Include this file in whatever places need to refer to it. In ONE C/C++ +// file, write: +// #define STB_TRUETYPE_IMPLEMENTATION +// before the #include of this file. This expands out the actual +// implementation into that C/C++ file. +// +// To make the implementation private to the file that generates the implementation, +// #define STBTT_STATIC +// +// Simple 3D API (don't ship this, but it's fine for tools and quick start) +// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture +// stbtt_GetBakedQuad() -- compute quad to draw for a given char +// +// Improved 3D API (more shippable): +// #include "stb_rect_pack.h" -- optional, but you really want it +// stbtt_PackBegin() +// stbtt_PackSetOversampling() -- for improved quality on small fonts +// stbtt_PackFontRanges() -- pack and renders +// stbtt_PackEnd() +// stbtt_GetPackedQuad() +// +// "Load" a font file from a memory buffer (you have to keep the buffer loaded) +// stbtt_InitFont() +// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections +// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections +// +// Render a unicode codepoint to a bitmap +// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap +// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide +// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be +// +// Character advance/positioning +// stbtt_GetCodepointHMetrics() +// stbtt_GetFontVMetrics() +// stbtt_GetFontVMetricsOS2() +// stbtt_GetCodepointKernAdvance() +// +// Starting with version 1.06, the rasterizer was replaced with a new, +// faster and generally-more-precise rasterizer. The new rasterizer more +// accurately measures pixel coverage for anti-aliasing, except in the case +// where multiple shapes overlap, in which case it overestimates the AA pixel +// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If +// this turns out to be a problem, you can re-enable the old rasterizer with +// #define STBTT_RASTERIZER_VERSION 1 +// which will incur about a 15% speed hit. +// +// ADDITIONAL DOCUMENTATION +// +// Immediately after this block comment are a series of sample programs. +// +// After the sample programs is the "header file" section. This section +// includes documentation for each API function. +// +// Some important concepts to understand to use this library: +// +// Codepoint +// Characters are defined by unicode codepoints, e.g. 65 is +// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is +// the hiragana for "ma". +// +// Glyph +// A visual character shape (every codepoint is rendered as +// some glyph) +// +// Glyph index +// A font-specific integer ID representing a glyph +// +// Baseline +// Glyph shapes are defined relative to a baseline, which is the +// bottom of uppercase characters. Characters extend both above +// and below the baseline. +// +// Current Point +// As you draw text to the screen, you keep track of a "current point" +// which is the origin of each character. The current point's vertical +// position is the baseline. Even "baked fonts" use this model. +// +// Vertical Font Metrics +// The vertical qualities of the font, used to vertically position +// and space the characters. See docs for stbtt_GetFontVMetrics. +// +// Font Size in Pixels or Points +// The preferred interface for specifying font sizes in stb_truetype +// is to specify how tall the font's vertical extent should be in pixels. +// If that sounds good enough, skip the next paragraph. +// +// Most font APIs instead use "points", which are a common typographic +// measurement for describing font size, defined as 72 points per inch. +// stb_truetype provides a point API for compatibility. However, true +// "per inch" conventions don't make much sense on computer displays +// since different monitors have different number of pixels per +// inch. For example, Windows traditionally uses a convention that +// there are 96 pixels per inch, thus making 'inch' measurements have +// nothing to do with inches, and thus effectively defining a point to +// be 1.333 pixels. Additionally, the TrueType font data provides +// an explicit scale factor to scale a given font's glyphs to points, +// but the author has observed that this scale factor is often wrong +// for non-commercial fonts, thus making fonts scaled in points +// according to the TrueType spec incoherently sized in practice. +// +// DETAILED USAGE: +// +// Scale: +// Select how high you want the font to be, in points or pixels. +// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute +// a scale factor SF that will be used by all other functions. +// +// Baseline: +// You need to select a y-coordinate that is the baseline of where +// your text will appear. Call GetFontBoundingBox to get the baseline-relative +// bounding box for all characters. SF*-y0 will be the distance in pixels +// that the worst-case character could extend above the baseline, so if +// you want the top edge of characters to appear at the top of the +// screen where y=0, then you would set the baseline to SF*-y0. +// +// Current point: +// Set the current point where the first character will appear. The +// first character could extend left of the current point; this is font +// dependent. You can either choose a current point that is the leftmost +// point and hope, or add some padding, or check the bounding box or +// left-side-bearing of the first character to be displayed and set +// the current point based on that. +// +// Displaying a character: +// Compute the bounding box of the character. It will contain signed values +// relative to . I.e. if it returns x0,y0,x1,y1, +// then the character should be displayed in the rectangle from +// to = 32 && *text < 128) { + stbtt_aligned_quad q; + stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 + glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y0); + glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y0); + glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y1); + glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y1); + } + ++text; + } + glEnd(); +} +#endif +// +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program (this compiles): get a single bitmap, print as ASCII art +// +#if 0 +#include +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1<<25]; + +int main(int argc, char **argv) +{ + stbtt_fontinfo font; + unsigned char *bitmap; + int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); + + fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); + + stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); + bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); + + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) + putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); + putchar('\n'); + } + return 0; +} +#endif +// +// Output: +// +// .ii. +// @@@@@@. +// V@Mio@@o +// :i. V@V +// :oM@@M +// :@@@MM@M +// @@o o@M +// :@@. M@M +// @@@o@@@@ +// :M@@V:@@. +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program: print "Hello World!" banner, with bugs +// +#if 0 +char buffer[24<<20]; +unsigned char screen[20][79]; + +int main(int arg, char **argv) +{ + stbtt_fontinfo font; + int i,j,ascent,baseline,ch=0; + float scale, xpos=2; // leave a little padding in case the character extends left + char *text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness + + fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); + stbtt_InitFont(&font, buffer, 0); + + scale = stbtt_ScaleForPixelHeight(&font, 15); + stbtt_GetFontVMetrics(&font, &ascent,0,0); + baseline = (int) (ascent*scale); + + while (text[ch]) { + int advance,lsb,x0,y0,x1,y1; + float x_shift = xpos - (float) floor(xpos); + stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); + stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); + stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); + // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong + // because this API is really for baking character bitmaps into textures. if you want to render + // a sequence of characters, you really need to render each bitmap to a temp buffer, then + // "alpha blend" that into the working buffer + xpos += (advance * scale); + if (text[ch+1]) + xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); + ++ch; + } + + for (j=0; j < 20; ++j) { + for (i=0; i < 78; ++i) + putchar(" .:ioVM@"[screen[j][i]>>5]); + putchar('\n'); + } + + return 0; +} +#endif + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// INTEGRATION WITH YOUR CODEBASE +//// +//// The following sections allow you to supply alternate definitions +//// of C library functions used by stb_truetype, e.g. if you don't +//// link with the C runtime library. + +#ifdef STB_TRUETYPE_IMPLEMENTATION + // #define your own (u)stbtt_int8/16/32 before including to override this + #ifndef stbtt_uint8 + typedef unsigned char stbtt_uint8; + typedef signed char stbtt_int8; + typedef unsigned short stbtt_uint16; + typedef signed short stbtt_int16; + typedef unsigned int stbtt_uint32; + typedef signed int stbtt_int32; + #endif + + typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; + typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; + + // e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h + #ifndef STBTT_ifloor + #include + #define STBTT_ifloor(x) ((int) floor(x)) + #define STBTT_iceil(x) ((int) ceil(x)) + #endif + + #ifndef STBTT_sqrt + #include + #define STBTT_sqrt(x) sqrt(x) + #define STBTT_pow(x,y) pow(x,y) + #endif + + #ifndef STBTT_fmod + #include + #define STBTT_fmod(x,y) fmod(x,y) + #endif + + #ifndef STBTT_cos + #include + #define STBTT_cos(x) cos(x) + #define STBTT_acos(x) acos(x) + #endif + + #ifndef STBTT_fabs + #include + #define STBTT_fabs(x) fabs(x) + #endif + + // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h + #ifndef STBTT_malloc + #include + #define STBTT_malloc(x,u) ((void)(u),malloc(x)) + #define STBTT_free(x,u) ((void)(u),free(x)) + #endif + + #ifndef STBTT_assert + #include + #define STBTT_assert(x) assert(x) + #endif + + #ifndef STBTT_strlen + #include + #define STBTT_strlen(x) strlen(x) + #endif + + #ifndef STBTT_memcpy + #include + #define STBTT_memcpy memcpy + #define STBTT_memset memset + #endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// INTERFACE +//// +//// + +#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ +#define __STB_INCLUDE_STB_TRUETYPE_H__ + +#ifdef STBTT_STATIC +#define STBTT_DEF static +#else +#define STBTT_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// private structure +typedef struct +{ + unsigned char *data; + int cursor; + int size; +} stbtt__buf; + +////////////////////////////////////////////////////////////////////////////// +// +// TEXTURE BAKING API +// +// If you use this API, you only have to call two functions ever. +// + +typedef struct +{ + unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap + float xoff,yoff,xadvance; +} stbtt_bakedchar; + +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char *pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar *chardata); // you allocate this, it's num_chars long +// if return is positive, the first unused row of the bitmap +// if return is negative, returns the negative of the number of characters that fit +// if return is 0, no characters fit and no rows were used +// This uses a very crappy packing. + +typedef struct +{ + float x0,y0,s0,t0; // top-left + float x1,y1,s1,t1; // bottom-right +} stbtt_aligned_quad; + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, // same data as above + int char_index, // character to display + float *xpos, float *ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad *q, // output: quad to draw + int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier +// Call GetBakedQuad with char_index = 'character - first_char', and it +// creates the quad you need to draw and advances the current position. +// +// The coordinate system used assumes y increases downwards. +// +// Characters will extend both above and below the current position; +// see discussion of "BASELINE" above. +// +// It's inefficient; you might want to c&p it and optimize it. + +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap); +// Query the font vertical metrics without having to create a font first. + + +////////////////////////////////////////////////////////////////////////////// +// +// NEW TEXTURE BAKING API +// +// This provides options for packing multiple fonts into one atlas, not +// perfectly but better than nothing. + +typedef struct +{ + unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap + float xoff,yoff,xadvance; + float xoff2,yoff2; +} stbtt_packedchar; + +typedef struct stbtt_pack_context stbtt_pack_context; +typedef struct stbtt_fontinfo stbtt_fontinfo; +#ifndef STB_RECT_PACK_VERSION +typedef struct stbrp_rect stbrp_rect; +#endif + +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context); +// Initializes a packing context stored in the passed-in stbtt_pack_context. +// Future calls using this context will pack characters into the bitmap passed +// in here: a 1-channel bitmap that is width * height. stride_in_bytes is +// the distance from one row to the next (or 0 to mean they are packed tightly +// together). "padding" is the amount of padding to leave between each +// character (normally you want '1' for bitmaps you'll use as textures with +// bilinear filtering). +// +// Returns 0 on failure, 1 on success. + +STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc); +// Cleans up the packing context and frees all memory. + +#define STBTT_POINT_SIZE(x) (-(x)) + +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, + int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); +// Creates character bitmaps from the font_index'th font found in fontdata (use +// font_index=0 if you don't know what that is). It creates num_chars_in_range +// bitmaps for characters with unicode values starting at first_unicode_char_in_range +// and increasing. Data for how to render them is stored in chardata_for_range; +// pass these to stbtt_GetPackedQuad to get back renderable quads. +// +// font_size is the full height of the character from ascender to descender, +// as computed by stbtt_ScaleForPixelHeight. To use a point size as computed +// by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE() +// and pass that result as 'font_size': +// ..., 20 , ... // font max minus min y is 20 pixels tall +// ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall + +typedef struct +{ + float font_size; + int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint + int *array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints + int num_chars; + stbtt_packedchar *chardata_for_range; // output + unsigned char h_oversample, v_oversample; // don't set these, they're used internally +} stbtt_pack_range; + +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); +// Creates character bitmaps from multiple ranges of characters stored in +// ranges. This will usually create a better-packed bitmap than multiple +// calls to stbtt_PackFontRange. Note that you can call this multiple +// times within a single PackBegin/PackEnd. + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample); +// Oversampling a font increases the quality by allowing higher-quality subpixel +// positioning, and is especially valuable at smaller text sizes. +// +// This function sets the amount of oversampling for all following calls to +// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given +// pack context. The default (no oversampling) is achieved by h_oversample=1 +// and v_oversample=1. The total number of pixels required is +// h_oversample*v_oversample larger than the default; for example, 2x2 +// oversampling requires 4x the storage of 1x1. For best results, render +// oversampled textures with bilinear filtering. Look at the readme in +// stb/tests/oversample for information about oversampled fonts +// +// To use with PackFontRangesGather etc., you must set it before calls +// call to PackFontRangesGatherRects. + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip); +// If skip != 0, this tells stb_truetype to skip any codepoints for which +// there is no corresponding glyph. If skip=0, which is the default, then +// codepoints without a glyph recived the font's "missing character" glyph, +// typically an empty box by convention. + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above + int char_index, // character to display + float *xpos, float *ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad *q, // output: quad to draw + int align_to_integer); + +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects); +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); +// Calling these functions in sequence is roughly equivalent to calling +// stbtt_PackFontRanges(). If you more control over the packing of multiple +// fonts, or if you want to pack custom data into a font texture, take a look +// at the source to of stbtt_PackFontRanges() and create a custom version +// using these functions, e.g. call GatherRects multiple times, +// building up a single array of rects, then call PackRects once, +// then call RenderIntoRects repeatedly. This may result in a +// better packing than calling PackFontRanges multiple times +// (or it may not). + +// this is an opaque structure that you shouldn't mess with which holds +// all the context needed from PackBegin to PackEnd. +struct stbtt_pack_context { + void *user_allocator_context; + void *pack_info; + int width; + int height; + int stride_in_bytes; + int padding; + int skip_missing; + unsigned int h_oversample, v_oversample; + unsigned char *pixels; + void *nodes; +}; + +////////////////////////////////////////////////////////////////////////////// +// +// FONT LOADING +// +// + +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data); +// This function will determine the number of fonts in a font file. TrueType +// collection (.ttc) files may contain multiple fonts, while TrueType font +// (.ttf) files only contain one font. The number of fonts can be used for +// indexing with the previous function where the index is between zero and one +// less than the total fonts. If an error occurs, -1 is returned. + +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); +// Each .ttf/.ttc file may have more than one font. Each font has a sequential +// index number starting from 0. Call this function to get the font offset for +// a given index; it returns -1 if the index is out of range. A regular .ttf +// file will only define one font and it always be at offset 0, so it will +// return '0' for index 0, and -1 for all other indices. + +// The following structure is defined publicly so you can declare one on +// the stack or as a global or etc, but you should treat it as opaque. +struct stbtt_fontinfo +{ + void * userdata; + unsigned char * data; // pointer to .ttf file + int fontstart; // offset of start of font + + int numGlyphs; // number of glyphs, needed for range checking + + int loca,head,glyf,hhea,hmtx,kern,gpos,svg; // table locations as offset from start of .ttf + int index_map; // a cmap mapping for our chosen character encoding + int indexToLocFormat; // format needed to map from glyph index to glyph + + stbtt__buf cff; // cff font data + stbtt__buf charstrings; // the charstring index + stbtt__buf gsubrs; // global charstring subroutines index + stbtt__buf subrs; // private charstring subroutines index + stbtt__buf fontdicts; // array of font dicts + stbtt__buf fdselect; // map from glyph to fontdict +}; + +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); +// Given an offset into the file that defines a font, this function builds +// the necessary cached info for the rest of the system. You must allocate +// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't +// need to do anything special to free it, because the contents are pure +// value data with no additional data structures. Returns 0 on failure. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER TO GLYPH-INDEX CONVERSIOn + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); +// If you're going to perform multiple operations on the same character +// and you want a speed-up, call this function with the character you're +// going to process, then use glyph-based functions instead of the +// codepoint-based functions. +// Returns 0 if the character codepoint is not defined in the font. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER PROPERTIES +// + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); +// computes a scale factor to produce a font whose "height" is 'pixels' tall. +// Height is measured as the distance from the highest ascender to the lowest +// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics +// and computing: +// scale = pixels / (ascent - descent) +// so if you prefer to measure height by the ascent only, use a similar calculation. + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); +// computes a scale factor to produce a font whose EM size is mapped to +// 'pixels' tall. This is probably what traditional APIs compute, but +// I'm not positive. + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); +// ascent is the coordinate above the baseline the font extends; descent +// is the coordinate below the baseline the font extends (i.e. it is typically negative) +// lineGap is the spacing between one row's descent and the next row's ascent... +// so you should advance the vertical position by "*ascent - *descent + *lineGap" +// these are expressed in unscaled coordinates, so you must multiply by +// the scale factor for a given size + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap); +// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 +// table (specific to MS/Windows TTF files). +// +// Returns 1 on success (table present), 0 on failure. + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); +// the bounding box around all possible characters + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); +// leftSideBearing is the offset from the current horizontal position to the left edge of the character +// advanceWidth is the offset from the current horizontal position to the next horizontal position +// these are expressed in unscaled coordinates + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); +// an additional amount to add to the 'advance' value between ch1 and ch2 + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); +// Gets the bounding box of the visible part of the glyph, in unscaled coordinates + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); +// as above, but takes one or more glyph indices for greater efficiency + +typedef struct stbtt_kerningentry +{ + int glyph1; // use stbtt_FindGlyphIndex + int glyph2; + int advance; +} stbtt_kerningentry; + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info); +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length); +// Retrieves a complete list of all of the kerning pairs provided by the font +// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. +// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) + +////////////////////////////////////////////////////////////////////////////// +// +// GLYPH SHAPES (you probably don't need these, but they have to go before +// the bitmaps for C declaration-order reasons) +// + +#ifndef STBTT_vmove // you can predefine these to use different values (but why?) + enum { + STBTT_vmove=1, + STBTT_vline, + STBTT_vcurve, + STBTT_vcubic + }; +#endif + +#ifndef stbtt_vertex // you can predefine this to use different values + // (we share this with other code at RAD) + #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file + typedef struct + { + stbtt_vertex_type x,y,cx,cy,cx1,cy1; + unsigned char type,padding; + } stbtt_vertex; +#endif + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); +// returns non-zero if nothing is drawn for this glyph + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); +// returns # of vertices and fills *vertices with the pointer to them +// these are expressed in "unscaled" coordinates +// +// The shape is a series of contours. Each one starts with +// a STBTT_moveto, then consists of a series of mixed +// STBTT_lineto and STBTT_curveto segments. A lineto +// draws a line from previous endpoint to its x,y; a curveto +// draws a quadratic bezier from previous endpoint to +// its x,y, using cx,cy as the bezier control point. + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); +// frees the data allocated above + +STBTT_DEF unsigned char *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl); +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg); +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg); +// fills svg with the character's SVG data. +// returns data size or 0 if SVG not found. + +////////////////////////////////////////////////////////////////////////////// +// +// BITMAP RENDERING +// + +STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); +// frees the bitmap allocated below + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); +// allocates a large-enough single-channel 8bpp bitmap and renders the +// specified character/glyph at the specified scale into it, with +// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). +// *width & *height are filled out with the width & height of the bitmap, +// which is stored left-to-right, top-to-bottom. +// +// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); +// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); +// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap +// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap +// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the +// width and height and positioning info for it first. + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); +// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint); +// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering +// is performed (see stbtt_PackSetOversampling) + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); +// get the bbox of the bitmap centered around the glyph origin; so the +// bitmap width is ix1-ix0, height is iy1-iy0, and location to place +// the bitmap top left is (leftSideBearing*scale,iy0). +// (Note that the bitmap uses y-increases-down, but the shape uses +// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); +// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel +// shift for the character + +// the following functions are equivalent to the above functions, but operate +// on glyph indices instead of Unicode codepoints (for efficiency) +STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); +STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int glyph); +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); + + +// @TODO: don't expose this structure +typedef struct +{ + int w,h,stride; + unsigned char *pixels; +} stbtt__bitmap; + +// rasterize a shape with quadratic beziers into a bitmap +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, // 1-channel bitmap to draw into + float flatness_in_pixels, // allowable error of curve in pixels + stbtt_vertex *vertices, // array of vertices defining shape + int num_verts, // number of vertices in above array + float scale_x, float scale_y, // scale applied to input vertices + float shift_x, float shift_y, // translation applied to input vertices + int x_off, int y_off, // another translation applied to input + int invert, // if non-zero, vertically flip shape + void *userdata); // context for to STBTT_MALLOC + +////////////////////////////////////////////////////////////////////////////// +// +// Signed Distance Function (or Field) rendering + +STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata); +// frees the SDF bitmap allocated below + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); +// These functions compute a discretized SDF field for a single character, suitable for storing +// in a single-channel texture, sampling with bilinear filtering, and testing against +// larger than some threshold to produce scalable fonts. +// info -- the font +// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap +// glyph/codepoint -- the character to generate the SDF for +// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), +// which allows effects like bit outlines +// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) +// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) +// if positive, > onedge_value is inside; if negative, < onedge_value is inside +// width,height -- output height & width of the SDF bitmap (including padding) +// xoff,yoff -- output origin of the character +// return value -- a 2D array of bytes 0..255, width*height in size +// +// pixel_dist_scale & onedge_value are a scale & bias that allows you to make +// optimal use of the limited 0..255 for your application, trading off precision +// and special effects. SDF values outside the range 0..255 are clamped to 0..255. +// +// Example: +// scale = stbtt_ScaleForPixelHeight(22) +// padding = 5 +// onedge_value = 180 +// pixel_dist_scale = 180/5.0 = 36.0 +// +// This will create an SDF bitmap in which the character is about 22 pixels +// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled +// shape, sample the SDF at each pixel and fill the pixel if the SDF value +// is greater than or equal to 180/255. (You'll actually want to antialias, +// which is beyond the scope of this example.) Additionally, you can compute +// offset outlines (e.g. to stroke the character border inside & outside, +// or only outside). For example, to fill outside the character up to 3 SDF +// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above +// choice of variables maps a range from 5 pixels outside the shape to +// 2 pixels inside the shape to 0..255; this is intended primarily for apply +// outside effects only (the interior range is needed to allow proper +// antialiasing of the font at *smaller* sizes) +// +// The function computes the SDF analytically at each SDF pixel, not by e.g. +// building a higher-res bitmap and approximating it. In theory the quality +// should be as high as possible for an SDF of this size & representation, but +// unclear if this is true in practice (perhaps building a higher-res bitmap +// and computing from that can allow drop-out prevention). +// +// The algorithm has not been optimized at all, so expect it to be slow +// if computing lots of characters or very large sizes. + + + +////////////////////////////////////////////////////////////////////////////// +// +// Finding the right font... +// +// You should really just solve this offline, keep your own tables +// of what font is what, and don't try to get it out of the .ttf file. +// That's because getting it out of the .ttf file is really hard, because +// the names in the file can appear in many possible encodings, in many +// possible languages, and e.g. if you need a case-insensitive comparison, +// the details of that depend on the encoding & language in a complex way +// (actually underspecified in truetype, but also gigantic). +// +// But you can use the provided functions in two possible ways: +// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on +// unicode-encoded names to try to find the font you want; +// you can run this before calling stbtt_InitFont() +// +// stbtt_GetFontNameString() lets you get any of the various strings +// from the file yourself and do your own comparisons on them. +// You have to have called stbtt_InitFont() first. + + +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); +// returns the offset (not index) of the font that matches, or -1 if none +// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". +// if you use any other flag, use a font name like "Arial"; this checks +// the 'macStyle' header field; i don't know if fonts set this consistently +#define STBTT_MACSTYLE_DONTCARE 0 +#define STBTT_MACSTYLE_BOLD 1 +#define STBTT_MACSTYLE_ITALIC 2 +#define STBTT_MACSTYLE_UNDERSCORE 4 +#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 + +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); +// returns 1/0 whether the first string interpreted as utf8 is identical to +// the second string interpreted as big-endian utf16... useful for strings from next func + +STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); +// returns the string (which may be big-endian double byte, e.g. for unicode) +// and puts the length in bytes in *length. +// +// some of the values for the IDs are below; for more see the truetype spec: +// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html +// http://www.microsoft.com/typography/otspec/name.htm + +enum { // platformID + STBTT_PLATFORM_ID_UNICODE =0, + STBTT_PLATFORM_ID_MAC =1, + STBTT_PLATFORM_ID_ISO =2, + STBTT_PLATFORM_ID_MICROSOFT =3 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_UNICODE + STBTT_UNICODE_EID_UNICODE_1_0 =0, + STBTT_UNICODE_EID_UNICODE_1_1 =1, + STBTT_UNICODE_EID_ISO_10646 =2, + STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, + STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT + STBTT_MS_EID_SYMBOL =0, + STBTT_MS_EID_UNICODE_BMP =1, + STBTT_MS_EID_SHIFTJIS =2, + STBTT_MS_EID_UNICODE_FULL =10 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes + STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, + STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, + STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, + STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 +}; + +enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... + // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs + STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, + STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, + STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, + STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, + STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, + STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D +}; + +enum { // languageID for STBTT_PLATFORM_ID_MAC + STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, + STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, + STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, + STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , + STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , + STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, + STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 +}; + +#ifdef __cplusplus +} +#endif + +#endif // __STB_INCLUDE_STB_TRUETYPE_H__ + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// IMPLEMENTATION +//// +//// + +#ifdef STB_TRUETYPE_IMPLEMENTATION + +#ifndef STBTT_MAX_OVERSAMPLE +#define STBTT_MAX_OVERSAMPLE 8 +#endif + +#if STBTT_MAX_OVERSAMPLE > 255 +#error "STBTT_MAX_OVERSAMPLE cannot be > 255" +#endif + +typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1]; + +#ifndef STBTT_RASTERIZER_VERSION +#define STBTT_RASTERIZER_VERSION 2 +#endif + +#ifdef _MSC_VER +#define STBTT__NOTUSED(v) (void)(v) +#else +#define STBTT__NOTUSED(v) (void)sizeof(v) +#endif + +////////////////////////////////////////////////////////////////////////// +// +// stbtt__buf helpers to parse data from file +// + +static stbtt_uint8 stbtt__buf_get8(stbtt__buf *b) +{ + if (b->cursor >= b->size) + return 0; + return b->data[b->cursor++]; +} + +static stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b) +{ + if (b->cursor >= b->size) + return 0; + return b->data[b->cursor]; +} + +static void stbtt__buf_seek(stbtt__buf *b, int o) +{ + STBTT_assert(!(o > b->size || o < 0)); + b->cursor = (o > b->size || o < 0) ? b->size : o; +} + +static void stbtt__buf_skip(stbtt__buf *b, int o) +{ + stbtt__buf_seek(b, b->cursor + o); +} + +static stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n) +{ + stbtt_uint32 v = 0; + int i; + STBTT_assert(n >= 1 && n <= 4); + for (i = 0; i < n; i++) + v = (v << 8) | stbtt__buf_get8(b); + return v; +} + +static stbtt__buf stbtt__new_buf(const void *p, size_t size) +{ + stbtt__buf r; + STBTT_assert(size < 0x40000000); + r.data = (stbtt_uint8*) p; + r.size = (int) size; + r.cursor = 0; + return r; +} + +#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) +#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) + +static stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s) +{ + stbtt__buf r = stbtt__new_buf(NULL, 0); + if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r; + r.data = b->data + o; + r.size = s; + return r; +} + +static stbtt__buf stbtt__cff_get_index(stbtt__buf *b) +{ + int count, start, offsize; + start = b->cursor; + count = stbtt__buf_get16(b); + if (count) { + offsize = stbtt__buf_get8(b); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(b, offsize * count); + stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); + } + return stbtt__buf_range(b, start, b->cursor - start); +} + +static stbtt_uint32 stbtt__cff_int(stbtt__buf *b) +{ + int b0 = stbtt__buf_get8(b); + if (b0 >= 32 && b0 <= 246) return b0 - 139; + else if (b0 >= 247 && b0 <= 250) return (b0 - 247)*256 + stbtt__buf_get8(b) + 108; + else if (b0 >= 251 && b0 <= 254) return -(b0 - 251)*256 - stbtt__buf_get8(b) - 108; + else if (b0 == 28) return stbtt__buf_get16(b); + else if (b0 == 29) return stbtt__buf_get32(b); + STBTT_assert(0); + return 0; +} + +static void stbtt__cff_skip_operand(stbtt__buf *b) { + int v, b0 = stbtt__buf_peek8(b); + STBTT_assert(b0 >= 28); + if (b0 == 30) { + stbtt__buf_skip(b, 1); + while (b->cursor < b->size) { + v = stbtt__buf_get8(b); + if ((v & 0xF) == 0xF || (v >> 4) == 0xF) + break; + } + } else { + stbtt__cff_int(b); + } +} + +static stbtt__buf stbtt__dict_get(stbtt__buf *b, int key) +{ + stbtt__buf_seek(b, 0); + while (b->cursor < b->size) { + int start = b->cursor, end, op; + while (stbtt__buf_peek8(b) >= 28) + stbtt__cff_skip_operand(b); + end = b->cursor; + op = stbtt__buf_get8(b); + if (op == 12) op = stbtt__buf_get8(b) | 0x100; + if (op == key) return stbtt__buf_range(b, start, end-start); + } + return stbtt__buf_range(b, 0, 0); +} + +static void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, stbtt_uint32 *out) +{ + int i; + stbtt__buf operands = stbtt__dict_get(b, key); + for (i = 0; i < outcount && operands.cursor < operands.size; i++) + out[i] = stbtt__cff_int(&operands); +} + +static int stbtt__cff_index_count(stbtt__buf *b) +{ + stbtt__buf_seek(b, 0); + return stbtt__buf_get16(b); +} + +static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) +{ + int count, offsize, start, end; + stbtt__buf_seek(&b, 0); + count = stbtt__buf_get16(&b); + offsize = stbtt__buf_get8(&b); + STBTT_assert(i >= 0 && i < count); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(&b, i*offsize); + start = stbtt__buf_get(&b, offsize); + end = stbtt__buf_get(&b, offsize); + return stbtt__buf_range(&b, 2+(count+1)*offsize+start, end - start); +} + +////////////////////////////////////////////////////////////////////////// +// +// accessors to parse data from file +// + +// on platforms that don't allow misaligned reads, if we want to allow +// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE + +#define ttBYTE(p) (* (stbtt_uint8 *) (p)) +#define ttCHAR(p) (* (stbtt_int8 *) (p)) +#define ttFixed(p) ttLONG(p) + +static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } +static stbtt_int16 ttSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } +static stbtt_uint32 ttULONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } +static stbtt_int32 ttLONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } + +#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) +#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) + +static int stbtt__isfont(stbtt_uint8 *font) +{ + // check the version number + if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 + if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! + if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF + if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 + if (stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts + return 0; +} + +// @OPTIMIZE: binary search +static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) +{ + stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); + stbtt_uint32 tabledir = fontstart + 12; + stbtt_int32 i; + for (i=0; i < num_tables; ++i) { + stbtt_uint32 loc = tabledir + 16*i; + if (stbtt_tag(data+loc+0, tag)) + return ttULONG(data+loc+8); + } + return 0; +} + +static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index) +{ + // if it's just a font, there's only one valid index + if (stbtt__isfont(font_collection)) + return index == 0 ? 0 : -1; + + // check if it's a TTC + if (stbtt_tag(font_collection, "ttcf")) { + // version 1? + if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { + stbtt_int32 n = ttLONG(font_collection+8); + if (index >= n) + return -1; + return ttULONG(font_collection+12+index*4); + } + } + return -1; +} + +static int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection) +{ + // if it's just a font, there's only one valid font + if (stbtt__isfont(font_collection)) + return 1; + + // check if it's a TTC + if (stbtt_tag(font_collection, "ttcf")) { + // version 1? + if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { + return ttLONG(font_collection+8); + } + } + return 0; +} + +static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) +{ + stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; + stbtt__buf pdict; + stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); + if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); + pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); + stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); + if (!subrsoff) return stbtt__new_buf(NULL, 0); + stbtt__buf_seek(&cff, private_loc[1]+subrsoff); + return stbtt__cff_get_index(&cff); +} + +// since most people won't use this, find this table the first time it's needed +static int stbtt__get_svg(stbtt_fontinfo *info) +{ + stbtt_uint32 t; + if (info->svg < 0) { + t = stbtt__find_table(info->data, info->fontstart, "SVG "); + if (t) { + stbtt_uint32 offset = ttULONG(info->data + t + 2); + info->svg = t + offset; + } else { + info->svg = 0; + } + } + return info->svg; +} + +static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart) +{ + stbtt_uint32 cmap, t; + stbtt_int32 i,numTables; + + info->data = data; + info->fontstart = fontstart; + info->cff = stbtt__new_buf(NULL, 0); + + cmap = stbtt__find_table(data, fontstart, "cmap"); // required + info->loca = stbtt__find_table(data, fontstart, "loca"); // required + info->head = stbtt__find_table(data, fontstart, "head"); // required + info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required + info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required + info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required + info->kern = stbtt__find_table(data, fontstart, "kern"); // not required + info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required + + if (!cmap || !info->head || !info->hhea || !info->hmtx) + return 0; + if (info->glyf) { + // required for truetype + if (!info->loca) return 0; + } else { + // initialization for CFF / Type2 fonts (OTF) + stbtt__buf b, topdict, topdictidx; + stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; + stbtt_uint32 cff; + + cff = stbtt__find_table(data, fontstart, "CFF "); + if (!cff) return 0; + + info->fontdicts = stbtt__new_buf(NULL, 0); + info->fdselect = stbtt__new_buf(NULL, 0); + + // @TODO this should use size from table (not 512MB) + info->cff = stbtt__new_buf(data+cff, 512*1024*1024); + b = info->cff; + + // read the header + stbtt__buf_skip(&b, 2); + stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize + + // @TODO the name INDEX could list multiple fonts, + // but we just use the first one. + stbtt__cff_get_index(&b); // name INDEX + topdictidx = stbtt__cff_get_index(&b); + topdict = stbtt__cff_index_get(topdictidx, 0); + stbtt__cff_get_index(&b); // string INDEX + info->gsubrs = stbtt__cff_get_index(&b); + + stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); + stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); + stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); + stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); + info->subrs = stbtt__get_subrs(b, topdict); + + // we only support Type 2 charstrings + if (cstype != 2) return 0; + if (charstrings == 0) return 0; + + if (fdarrayoff) { + // looks like a CID font + if (!fdselectoff) return 0; + stbtt__buf_seek(&b, fdarrayoff); + info->fontdicts = stbtt__cff_get_index(&b); + info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size-fdselectoff); + } + + stbtt__buf_seek(&b, charstrings); + info->charstrings = stbtt__cff_get_index(&b); + } + + t = stbtt__find_table(data, fontstart, "maxp"); + if (t) + info->numGlyphs = ttUSHORT(data+t+4); + else + info->numGlyphs = 0xffff; + + info->svg = -1; + + // find a cmap encoding table we understand *now* to avoid searching + // later. (todo: could make this installable) + // the same regardless of glyph. + numTables = ttUSHORT(data + cmap + 2); + info->index_map = 0; + for (i=0; i < numTables; ++i) { + stbtt_uint32 encoding_record = cmap + 4 + 8 * i; + // find an encoding we understand: + switch(ttUSHORT(data+encoding_record)) { + case STBTT_PLATFORM_ID_MICROSOFT: + switch (ttUSHORT(data+encoding_record+2)) { + case STBTT_MS_EID_UNICODE_BMP: + case STBTT_MS_EID_UNICODE_FULL: + // MS/Unicode + info->index_map = cmap + ttULONG(data+encoding_record+4); + break; + } + break; + case STBTT_PLATFORM_ID_UNICODE: + // Mac/iOS has these + // all the encodingIDs are unicode, so we don't bother to check it + info->index_map = cmap + ttULONG(data+encoding_record+4); + break; + } + } + if (info->index_map == 0) + return 0; + + info->indexToLocFormat = ttUSHORT(data+info->head + 50); + return 1; +} + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) +{ + stbtt_uint8 *data = info->data; + stbtt_uint32 index_map = info->index_map; + + stbtt_uint16 format = ttUSHORT(data + index_map + 0); + if (format == 0) { // apple byte encoding + stbtt_int32 bytes = ttUSHORT(data + index_map + 2); + if (unicode_codepoint < bytes-6) + return ttBYTE(data + index_map + 6 + unicode_codepoint); + return 0; + } else if (format == 6) { + stbtt_uint32 first = ttUSHORT(data + index_map + 6); + stbtt_uint32 count = ttUSHORT(data + index_map + 8); + if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) + return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); + return 0; + } else if (format == 2) { + STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean + return 0; + } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges + stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; + stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; + stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); + stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; + + // do a binary search of the segments + stbtt_uint32 endCount = index_map + 14; + stbtt_uint32 search = endCount; + + if (unicode_codepoint > 0xffff) + return 0; + + // they lie from endCount .. endCount + segCount + // but searchRange is the nearest power of two, so... + if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) + search += rangeShift*2; + + // now decrement to bias correctly to find smallest + search -= 2; + while (entrySelector) { + stbtt_uint16 end; + searchRange >>= 1; + end = ttUSHORT(data + search + searchRange*2); + if (unicode_codepoint > end) + search += searchRange*2; + --entrySelector; + } + search += 2; + + { + stbtt_uint16 offset, start, last; + stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1); + + start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); + last = ttUSHORT(data + endCount + 2*item); + if (unicode_codepoint < start || unicode_codepoint > last) + return 0; + + offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); + if (offset == 0) + return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); + + return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); + } + } else if (format == 12 || format == 13) { + stbtt_uint32 ngroups = ttULONG(data+index_map+12); + stbtt_int32 low,high; + low = 0; high = (stbtt_int32)ngroups; + // Binary search the right group. + while (low < high) { + stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high + stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); + stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); + if ((stbtt_uint32) unicode_codepoint < start_char) + high = mid; + else if ((stbtt_uint32) unicode_codepoint > end_char) + low = mid+1; + else { + stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); + if (format == 12) + return start_glyph + unicode_codepoint-start_char; + else // format == 13 + return start_glyph; + } + } + return 0; // not found + } + // @TODO + STBTT_assert(0); + return 0; +} + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) +{ + return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); +} + +static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) +{ + v->type = type; + v->x = (stbtt_int16) x; + v->y = (stbtt_int16) y; + v->cx = (stbtt_int16) cx; + v->cy = (stbtt_int16) cy; +} + +static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) +{ + int g1,g2; + + STBTT_assert(!info->cff.size); + + if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range + if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format + + if (info->indexToLocFormat == 0) { + g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; + g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; + } else { + g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); + g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); + } + + return g1==g2 ? -1 : g1; // if length is 0, return -1 +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); + +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) +{ + if (info->cff.size) { + stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); + } else { + int g = stbtt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 0; + + if (x0) *x0 = ttSHORT(info->data + g + 2); + if (y0) *y0 = ttSHORT(info->data + g + 4); + if (x1) *x1 = ttSHORT(info->data + g + 6); + if (y1) *y1 = ttSHORT(info->data + g + 8); + } + return 1; +} + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) +{ + return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); +} + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) +{ + stbtt_int16 numberOfContours; + int g; + if (info->cff.size) + return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; + g = stbtt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 1; + numberOfContours = ttSHORT(info->data + g); + return numberOfContours == 0; +} + +static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, + stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) +{ + if (start_off) { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); + } else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); + } + return num_vertices; +} + +static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) +{ + stbtt_int16 numberOfContours; + stbtt_uint8 *endPtsOfContours; + stbtt_uint8 *data = info->data; + stbtt_vertex *vertices=0; + int num_vertices=0; + int g = stbtt__GetGlyfOffset(info, glyph_index); + + *pvertices = NULL; + + if (g < 0) return 0; + + numberOfContours = ttSHORT(data + g); + + if (numberOfContours > 0) { + stbtt_uint8 flags=0,flagcount; + stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; + stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; + stbtt_uint8 *points; + endPtsOfContours = (data + g + 10); + ins = ttUSHORT(data + g + 10 + numberOfContours * 2); + points = data + g + 10 + numberOfContours * 2 + 2 + ins; + + n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); + + m = n + 2*numberOfContours; // a loose bound on how many vertices we might need + vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); + if (vertices == 0) + return 0; + + next_move = 0; + flagcount=0; + + // in first pass, we load uninterpreted data into the allocated array + // above, shifted to the end of the array so we won't overwrite it when + // we create our final data starting from the front + + off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated + + // first load flags + + for (i=0; i < n; ++i) { + if (flagcount == 0) { + flags = *points++; + if (flags & 8) + flagcount = *points++; + } else + --flagcount; + vertices[off+i].type = flags; + } + + // now load x coordinates + x=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 2) { + stbtt_int16 dx = *points++; + x += (flags & 16) ? dx : -dx; // ??? + } else { + if (!(flags & 16)) { + x = x + (stbtt_int16) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].x = (stbtt_int16) x; + } + + // now load y coordinates + y=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 4) { + stbtt_int16 dy = *points++; + y += (flags & 32) ? dy : -dy; // ??? + } else { + if (!(flags & 32)) { + y = y + (stbtt_int16) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].y = (stbtt_int16) y; + } + + // now convert them to our format + num_vertices=0; + sx = sy = cx = cy = scx = scy = 0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + x = (stbtt_int16) vertices[off+i].x; + y = (stbtt_int16) vertices[off+i].y; + + if (next_move == i) { + if (i != 0) + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + + // now start the new one + start_off = !(flags & 1); + if (start_off) { + // if we start off with an off-curve point, then when we need to find a point on the curve + // where we can start, and we need to save some state for when we wraparound. + scx = x; + scy = y; + if (!(vertices[off+i+1].type & 1)) { + // next point is also a curve point, so interpolate an on-point curve + sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; + sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; + } else { + // otherwise just use the next point as our start point + sx = (stbtt_int32) vertices[off+i+1].x; + sy = (stbtt_int32) vertices[off+i+1].y; + ++i; // we're using point i+1 as the starting point, so skip it + } + } else { + sx = x; + sy = y; + } + stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); + was_off = 0; + next_move = 1 + ttUSHORT(endPtsOfContours+j*2); + ++j; + } else { + if (!(flags & 1)) { // if it's a curve + if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); + cx = x; + cy = y; + was_off = 1; + } else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); + was_off = 0; + } + } + } + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + } else if (numberOfContours < 0) { + // Compound shapes. + int more = 1; + stbtt_uint8 *comp = data + g + 10; + num_vertices = 0; + vertices = 0; + while (more) { + stbtt_uint16 flags, gidx; + int comp_num_verts = 0, i; + stbtt_vertex *comp_verts = 0, *tmp = 0; + float mtx[6] = {1,0,0,1,0,0}, m, n; + + flags = ttSHORT(comp); comp+=2; + gidx = ttSHORT(comp); comp+=2; + + if (flags & 2) { // XY values + if (flags & 1) { // shorts + mtx[4] = ttSHORT(comp); comp+=2; + mtx[5] = ttSHORT(comp); comp+=2; + } else { + mtx[4] = ttCHAR(comp); comp+=1; + mtx[5] = ttCHAR(comp); comp+=1; + } + } + else { + // @TODO handle matching point + STBTT_assert(0); + } + if (flags & (1<<3)) { // WE_HAVE_A_SCALE + mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE + mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO + mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + } + + // Find transformation scales. + m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); + n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); + + // Get indexed glyph. + comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); + if (comp_num_verts > 0) { + // Transform vertices. + for (i = 0; i < comp_num_verts; ++i) { + stbtt_vertex* v = &comp_verts[i]; + stbtt_vertex_type x,y; + x=v->x; y=v->y; + v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + x=v->cx; y=v->cy; + v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + } + // Append vertices. + tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); + if (!tmp) { + if (vertices) STBTT_free(vertices, info->userdata); + if (comp_verts) STBTT_free(comp_verts, info->userdata); + return 0; + } + if (num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); + STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); + if (vertices) STBTT_free(vertices, info->userdata); + vertices = tmp; + STBTT_free(comp_verts, info->userdata); + num_vertices += comp_num_verts; + } + // More components ? + more = flags & (1<<5); + } + } else { + // numberOfCounters == 0, do nothing + } + + *pvertices = vertices; + return num_vertices; +} + +typedef struct +{ + int bounds; + int started; + float first_x, first_y; + float x, y; + stbtt_int32 min_x, max_x, min_y, max_y; + + stbtt_vertex *pvertices; + int num_vertices; +} stbtt__csctx; + +#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} + +static void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_int32 y) +{ + if (x > c->max_x || !c->started) c->max_x = x; + if (y > c->max_y || !c->started) c->max_y = y; + if (x < c->min_x || !c->started) c->min_x = x; + if (y < c->min_y || !c->started) c->min_y = y; + c->started = 1; +} + +static void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) +{ + if (c->bounds) { + stbtt__track_vertex(c, x, y); + if (type == STBTT_vcubic) { + stbtt__track_vertex(c, cx, cy); + stbtt__track_vertex(c, cx1, cy1); + } + } else { + stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); + c->pvertices[c->num_vertices].cx1 = (stbtt_int16) cx1; + c->pvertices[c->num_vertices].cy1 = (stbtt_int16) cy1; + } + c->num_vertices++; +} + +static void stbtt__csctx_close_shape(stbtt__csctx *ctx) +{ + if (ctx->first_x != ctx->x || ctx->first_y != ctx->y) + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy) +{ + stbtt__csctx_close_shape(ctx); + ctx->first_x = ctx->x = ctx->x + dx; + ctx->first_y = ctx->y = ctx->y + dy; + stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy) +{ + ctx->x += dx; + ctx->y += dy; + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) +{ + float cx1 = ctx->x + dx1; + float cy1 = ctx->y + dy1; + float cx2 = cx1 + dx2; + float cy2 = cy1 + dy2; + ctx->x = cx2 + dx3; + ctx->y = cy2 + dy3; + stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); +} + +static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) +{ + int count = stbtt__cff_index_count(&idx); + int bias = 107; + if (count >= 33900) + bias = 32768; + else if (count >= 1240) + bias = 1131; + n += bias; + if (n < 0 || n >= count) + return stbtt__new_buf(NULL, 0); + return stbtt__cff_index_get(idx, n); +} + +static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int glyph_index) +{ + stbtt__buf fdselect = info->fdselect; + int nranges, start, end, v, fmt, fdselector = -1, i; + + stbtt__buf_seek(&fdselect, 0); + fmt = stbtt__buf_get8(&fdselect); + if (fmt == 0) { + // untested + stbtt__buf_skip(&fdselect, glyph_index); + fdselector = stbtt__buf_get8(&fdselect); + } else if (fmt == 3) { + nranges = stbtt__buf_get16(&fdselect); + start = stbtt__buf_get16(&fdselect); + for (i = 0; i < nranges; i++) { + v = stbtt__buf_get8(&fdselect); + end = stbtt__buf_get16(&fdselect); + if (glyph_index >= start && glyph_index < end) { + fdselector = v; + break; + } + start = end; + } + } + if (fdselector == -1) stbtt__new_buf(NULL, 0); + return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); +} + +static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, stbtt__csctx *c) +{ + int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; + int has_subrs = 0, clear_stack; + float s[48]; + stbtt__buf subr_stack[10], subrs = info->subrs, b; + float f; + +#define STBTT__CSERR(s) (0) + + // this currently ignores the initial width value, which isn't needed if we have hmtx + b = stbtt__cff_index_get(info->charstrings, glyph_index); + while (b.cursor < b.size) { + i = 0; + clear_stack = 1; + b0 = stbtt__buf_get8(&b); + switch (b0) { + // @TODO implement hinting + case 0x13: // hintmask + case 0x14: // cntrmask + if (in_header) + maskbits += (sp / 2); // implicit "vstem" + in_header = 0; + stbtt__buf_skip(&b, (maskbits + 7) / 8); + break; + + case 0x01: // hstem + case 0x03: // vstem + case 0x12: // hstemhm + case 0x17: // vstemhm + maskbits += (sp / 2); + break; + + case 0x15: // rmoveto + in_header = 0; + if (sp < 2) return STBTT__CSERR("rmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp-2], s[sp-1]); + break; + case 0x04: // vmoveto + in_header = 0; + if (sp < 1) return STBTT__CSERR("vmoveto stack"); + stbtt__csctx_rmove_to(c, 0, s[sp-1]); + break; + case 0x16: // hmoveto + in_header = 0; + if (sp < 1) return STBTT__CSERR("hmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp-1], 0); + break; + + case 0x05: // rlineto + if (sp < 2) return STBTT__CSERR("rlineto stack"); + for (; i + 1 < sp; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i+1]); + break; + + // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical + // starting from a different place. + + case 0x07: // vlineto + if (sp < 1) return STBTT__CSERR("vlineto stack"); + goto vlineto; + case 0x06: // hlineto + if (sp < 1) return STBTT__CSERR("hlineto stack"); + for (;;) { + if (i >= sp) break; + stbtt__csctx_rline_to(c, s[i], 0); + i++; + vlineto: + if (i >= sp) break; + stbtt__csctx_rline_to(c, 0, s[i]); + i++; + } + break; + + case 0x1F: // hvcurveto + if (sp < 4) return STBTT__CSERR("hvcurveto stack"); + goto hvcurveto; + case 0x1E: // vhcurveto + if (sp < 4) return STBTT__CSERR("vhcurveto stack"); + for (;;) { + if (i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, 0, s[i], s[i+1], s[i+2], s[i+3], (sp - i == 5) ? s[i + 4] : 0.0f); + i += 4; + hvcurveto: + if (i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, s[i], 0, s[i+1], s[i+2], (sp - i == 5) ? s[i+4] : 0.0f, s[i+3]); + i += 4; + } + break; + + case 0x08: // rrcurveto + if (sp < 6) return STBTT__CSERR("rcurveline stack"); + for (; i + 5 < sp; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); + break; + + case 0x18: // rcurveline + if (sp < 8) return STBTT__CSERR("rcurveline stack"); + for (; i + 5 < sp - 2; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); + if (i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); + stbtt__csctx_rline_to(c, s[i], s[i+1]); + break; + + case 0x19: // rlinecurve + if (sp < 8) return STBTT__CSERR("rlinecurve stack"); + for (; i + 1 < sp - 6; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i+1]); + if (i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); + stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); + break; + + case 0x1A: // vvcurveto + case 0x1B: // hhcurveto + if (sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); + f = 0.0; + if (sp & 1) { f = s[i]; i++; } + for (; i + 3 < sp; i += 4) { + if (b0 == 0x1B) + stbtt__csctx_rccurve_to(c, s[i], f, s[i+1], s[i+2], s[i+3], 0.0); + else + stbtt__csctx_rccurve_to(c, f, s[i], s[i+1], s[i+2], 0.0, s[i+3]); + f = 0.0; + } + break; + + case 0x0A: // callsubr + if (!has_subrs) { + if (info->fdselect.size) + subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); + has_subrs = 1; + } + // FALLTHROUGH + case 0x1D: // callgsubr + if (sp < 1) return STBTT__CSERR("call(g|)subr stack"); + v = (int) s[--sp]; + if (subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); + subr_stack[subr_stack_height++] = b; + b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); + if (b.size == 0) return STBTT__CSERR("subr not found"); + b.cursor = 0; + clear_stack = 0; + break; + + case 0x0B: // return + if (subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); + b = subr_stack[--subr_stack_height]; + clear_stack = 0; + break; + + case 0x0E: // endchar + stbtt__csctx_close_shape(c); + return 1; + + case 0x0C: { // two-byte escape + float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; + float dx, dy; + int b1 = stbtt__buf_get8(&b); + switch (b1) { + // @TODO These "flex" implementations ignore the flex-depth and resolution, + // and always draw beziers. + case 0x22: // hflex + if (sp < 7) return STBTT__CSERR("hflex stack"); + dx1 = s[0]; + dx2 = s[1]; + dy2 = s[2]; + dx3 = s[3]; + dx4 = s[4]; + dx5 = s[5]; + dx6 = s[6]; + stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); + break; + + case 0x23: // flex + if (sp < 13) return STBTT__CSERR("flex stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = s[10]; + dy6 = s[11]; + //fd is s[12] + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + case 0x24: // hflex1 + if (sp < 9) return STBTT__CSERR("hflex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dx4 = s[5]; + dx5 = s[6]; + dy5 = s[7]; + dx6 = s[8]; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1+dy2+dy5)); + break; + + case 0x25: // flex1 + if (sp < 11) return STBTT__CSERR("flex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = dy6 = s[10]; + dx = dx1+dx2+dx3+dx4+dx5; + dy = dy1+dy2+dy3+dy4+dy5; + if (STBTT_fabs(dx) > STBTT_fabs(dy)) + dy6 = -dy; + else + dx6 = -dx; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + default: + return STBTT__CSERR("unimplemented"); + } + } break; + + default: + if (b0 != 255 && b0 != 28 && b0 < 32) + return STBTT__CSERR("reserved operator"); + + // push immediate + if (b0 == 255) { + f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; + } else { + stbtt__buf_skip(&b, -1); + f = (float)(stbtt_int16)stbtt__cff_int(&b); + } + if (sp >= 48) return STBTT__CSERR("push stack overflow"); + s[sp++] = f; + clear_stack = 0; + break; + } + if (clear_stack) sp = 0; + } + return STBTT__CSERR("no endchar"); + +#undef STBTT__CSERR +} + +static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) +{ + // runs the charstring twice, once to count and once to output (to avoid realloc) + stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); + stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); + if (stbtt__run_charstring(info, glyph_index, &count_ctx)) { + *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices*sizeof(stbtt_vertex), info->userdata); + output_ctx.pvertices = *pvertices; + if (stbtt__run_charstring(info, glyph_index, &output_ctx)) { + STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); + return output_ctx.num_vertices; + } + } + *pvertices = NULL; + return 0; +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) +{ + stbtt__csctx c = STBTT__CSCTX_INIT(1); + int r = stbtt__run_charstring(info, glyph_index, &c); + if (x0) *x0 = r ? c.min_x : 0; + if (y0) *y0 = r ? c.min_y : 0; + if (x1) *x1 = r ? c.max_x : 0; + if (y1) *y1 = r ? c.max_y : 0; + return r ? c.num_vertices : 0; +} + +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) +{ + if (!info->cff.size) + return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); + else + return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); +} + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) +{ + stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); + if (glyph_index < numOfLongHorMetrics) { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); + } else { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); + } +} + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info) +{ + stbtt_uint8 *data = info->data + info->kern; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format + return 0; + + return ttUSHORT(data+10); +} + +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length) +{ + stbtt_uint8 *data = info->data + info->kern; + int k, length; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format + return 0; + + length = ttUSHORT(data+10); + if (table_length < length) + length = table_length; + + for (k = 0; k < length; k++) + { + table[k].glyph1 = ttUSHORT(data+18+(k*6)); + table[k].glyph2 = ttUSHORT(data+20+(k*6)); + table[k].advance = ttSHORT(data+22+(k*6)); + } + + return length; +} + +static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) +{ + stbtt_uint8 *data = info->data + info->kern; + stbtt_uint32 needle, straw; + int l, r, m; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format + return 0; + + l = 0; + r = ttUSHORT(data+10) - 1; + needle = glyph1 << 16 | glyph2; + while (l <= r) { + m = (l + r) >> 1; + straw = ttULONG(data+18+(m*6)); // note: unaligned read + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else + return ttSHORT(data+22+(m*6)); + } + return 0; +} + +static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, int glyph) +{ + stbtt_uint16 coverageFormat = ttUSHORT(coverageTable); + switch (coverageFormat) { + case 1: { + stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2); + + // Binary search. + stbtt_int32 l=0, r=glyphCount-1, m; + int straw, needle=glyph; + while (l <= r) { + stbtt_uint8 *glyphArray = coverageTable + 4; + stbtt_uint16 glyphID; + m = (l + r) >> 1; + glyphID = ttUSHORT(glyphArray + 2 * m); + straw = glyphID; + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else { + return m; + } + } + break; + } + + case 2: { + stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2); + stbtt_uint8 *rangeArray = coverageTable + 4; + + // Binary search. + stbtt_int32 l=0, r=rangeCount-1, m; + int strawStart, strawEnd, needle=glyph; + while (l <= r) { + stbtt_uint8 *rangeRecord; + m = (l + r) >> 1; + rangeRecord = rangeArray + 6 * m; + strawStart = ttUSHORT(rangeRecord); + strawEnd = ttUSHORT(rangeRecord + 2); + if (needle < strawStart) + r = m - 1; + else if (needle > strawEnd) + l = m + 1; + else { + stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4); + return startCoverageIndex + glyph - strawStart; + } + } + break; + } + + default: return -1; // unsupported + } + + return -1; +} + +static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph) +{ + stbtt_uint16 classDefFormat = ttUSHORT(classDefTable); + switch (classDefFormat) + { + case 1: { + stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2); + stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4); + stbtt_uint8 *classDef1ValueArray = classDefTable + 6; + + if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount) + return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID)); + break; + } + + case 2: { + stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2); + stbtt_uint8 *classRangeRecords = classDefTable + 4; + + // Binary search. + stbtt_int32 l=0, r=classRangeCount-1, m; + int strawStart, strawEnd, needle=glyph; + while (l <= r) { + stbtt_uint8 *classRangeRecord; + m = (l + r) >> 1; + classRangeRecord = classRangeRecords + 6 * m; + strawStart = ttUSHORT(classRangeRecord); + strawEnd = ttUSHORT(classRangeRecord + 2); + if (needle < strawStart) + r = m - 1; + else if (needle > strawEnd) + l = m + 1; + else + return (stbtt_int32)ttUSHORT(classRangeRecord + 4); + } + break; + } + + default: + return -1; // Unsupported definition type, return an error. + } + + // "All glyphs not assigned to a class fall into class 0". (OpenType spec) + return 0; +} + +// Define to STBTT_assert(x) if you want to break on unimplemented formats. +#define STBTT_GPOS_TODO_assert(x) + +static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) +{ + stbtt_uint16 lookupListOffset; + stbtt_uint8 *lookupList; + stbtt_uint16 lookupCount; + stbtt_uint8 *data; + stbtt_int32 i, sti; + + if (!info->gpos) return 0; + + data = info->data + info->gpos; + + if (ttUSHORT(data+0) != 1) return 0; // Major version 1 + if (ttUSHORT(data+2) != 0) return 0; // Minor version 0 + + lookupListOffset = ttUSHORT(data+8); + lookupList = data + lookupListOffset; + lookupCount = ttUSHORT(lookupList); + + for (i=0; i= pairSetCount) return 0; + + needle=glyph2; + r=pairValueCount-1; + l=0; + + // Binary search. + while (l <= r) { + stbtt_uint16 secondGlyph; + stbtt_uint8 *pairValue; + m = (l + r) >> 1; + pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; + secondGlyph = ttUSHORT(pairValue); + straw = secondGlyph; + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else { + stbtt_int16 xAdvance = ttSHORT(pairValue + 2); + return xAdvance; + } + } + } else + return 0; + break; + } + + case 2: { + stbtt_uint16 valueFormat1 = ttUSHORT(table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(table + 6); + if (valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? + stbtt_uint16 classDef1Offset = ttUSHORT(table + 8); + stbtt_uint16 classDef2Offset = ttUSHORT(table + 10); + int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1); + int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2); + + stbtt_uint16 class1Count = ttUSHORT(table + 12); + stbtt_uint16 class2Count = ttUSHORT(table + 14); + stbtt_uint8 *class1Records, *class2Records; + stbtt_int16 xAdvance; + + if (glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed + if (glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed + + class1Records = table + 16; + class2Records = class1Records + 2 * (glyph1class * class2Count); + xAdvance = ttSHORT(class2Records + 2 * glyph2class); + return xAdvance; + } else + return 0; + break; + } + + default: + return 0; // Unsupported position format + } + } + } + + return 0; +} + +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int g1, int g2) +{ + int xAdvance = 0; + + if (info->gpos) + xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); + else if (info->kern) + xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); + + return xAdvance; +} + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) +{ + if (!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs + return 0; + return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); +} + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) +{ + stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); +} + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) +{ + if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); + if (descent) *descent = ttSHORT(info->data+info->hhea + 6); + if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); +} + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap) +{ + int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); + if (!tab) + return 0; + if (typoAscent ) *typoAscent = ttSHORT(info->data+tab + 68); + if (typoDescent) *typoDescent = ttSHORT(info->data+tab + 70); + if (typoLineGap) *typoLineGap = ttSHORT(info->data+tab + 72); + return 1; +} + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) +{ + *x0 = ttSHORT(info->data + info->head + 36); + *y0 = ttSHORT(info->data + info->head + 38); + *x1 = ttSHORT(info->data + info->head + 40); + *y1 = ttSHORT(info->data + info->head + 42); +} + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) +{ + int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); + return (float) height / fheight; +} + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) +{ + int unitsPerEm = ttUSHORT(info->data + info->head + 18); + return pixels / unitsPerEm; +} + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) +{ + STBTT_free(v, info->userdata); +} + +STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl) +{ + int i; + stbtt_uint8 *data = info->data; + stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info); + + int numEntries = ttUSHORT(svg_doc_list); + stbtt_uint8 *svg_docs = svg_doc_list + 2; + + for(i=0; i= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2))) + return svg_doc; + } + return 0; +} + +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg) +{ + stbtt_uint8 *data = info->data; + stbtt_uint8 *svg_doc; + + if (info->svg == 0) + return 0; + + svg_doc = stbtt_FindSVGDoc(info, gl); + if (svg_doc != NULL) { + *svg = (char *) data + info->svg + ttULONG(svg_doc + 4); + return ttULONG(svg_doc + 8); + } else { + return 0; + } +} + +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg) +{ + return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg); +} + +////////////////////////////////////////////////////////////////////////////// +// +// antialiasing software rasterizer +// + +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning + if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) { + // e.g. space character + if (ix0) *ix0 = 0; + if (iy0) *iy0 = 0; + if (ix1) *ix1 = 0; + if (iy1) *iy1 = 0; + } else { + // move to integral bboxes (treating pixels as little squares, what pixels get touched)? + if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x); + if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); + if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x); + if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y); + } +} + +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); +} + +////////////////////////////////////////////////////////////////////////////// +// +// Rasterizer + +typedef struct stbtt__hheap_chunk +{ + struct stbtt__hheap_chunk *next; +} stbtt__hheap_chunk; + +typedef struct stbtt__hheap +{ + struct stbtt__hheap_chunk *head; + void *first_free; + int num_remaining_in_head_chunk; +} stbtt__hheap; + +static void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata) +{ + if (hh->first_free) { + void *p = hh->first_free; + hh->first_free = * (void **) p; + return p; + } else { + if (hh->num_remaining_in_head_chunk == 0) { + int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); + stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); + if (c == NULL) + return NULL; + c->next = hh->head; + hh->head = c; + hh->num_remaining_in_head_chunk = count; + } + --hh->num_remaining_in_head_chunk; + return (char *) (hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; + } +} + +static void stbtt__hheap_free(stbtt__hheap *hh, void *p) +{ + *(void **) p = hh->first_free; + hh->first_free = p; +} + +static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata) +{ + stbtt__hheap_chunk *c = hh->head; + while (c) { + stbtt__hheap_chunk *n = c->next; + STBTT_free(c, userdata); + c = n; + } +} + +typedef struct stbtt__edge { + float x0,y0, x1,y1; + int invert; +} stbtt__edge; + + +typedef struct stbtt__active_edge +{ + struct stbtt__active_edge *next; + #if STBTT_RASTERIZER_VERSION==1 + int x,dx; + float ey; + int direction; + #elif STBTT_RASTERIZER_VERSION==2 + float fx,fdx,fdy; + float direction; + float sy; + float ey; + #else + #error "Unrecognized value of STBTT_RASTERIZER_VERSION" + #endif +} stbtt__active_edge; + +#if STBTT_RASTERIZER_VERSION == 1 +#define STBTT_FIXSHIFT 10 +#define STBTT_FIX (1 << STBTT_FIXSHIFT) +#define STBTT_FIXMASK (STBTT_FIX-1) + +static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) +{ + stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + if (!z) return z; + + // round dx down to avoid overshooting + if (dxdy < 0) + z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); + else + z->dx = STBTT_ifloor(STBTT_FIX * dxdy); + + z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount + z->x -= off_x * STBTT_FIX; + + z->ey = e->y1; + z->next = 0; + z->direction = e->invert ? 1 : -1; + return z; +} +#elif STBTT_RASTERIZER_VERSION == 2 +static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) +{ + stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + //STBTT_assert(e->y0 <= start_point); + if (!z) return z; + z->fdx = dxdy; + z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f; + z->fx = e->x0 + dxdy * (start_point - e->y0); + z->fx -= off_x; + z->direction = e->invert ? 1.0f : -1.0f; + z->sy = e->y0; + z->ey = e->y1; + z->next = 0; + return z; +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#if STBTT_RASTERIZER_VERSION == 1 +// note: this routine clips fills that extend off the edges... ideally this +// wouldn't happen, but it could happen if the truetype glyph bounding boxes +// are wrong, or if the user supplies a too-small bitmap +static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) +{ + // non-zero winding fill + int x0=0, w=0; + + while (e) { + if (w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; w += e->direction; + } else { + int x1 = e->x; w += e->direction; + // if we went to zero, we need to draw + if (w == 0) { + int i = x0 >> STBTT_FIXSHIFT; + int j = x1 >> STBTT_FIXSHIFT; + + if (i < len && j >= 0) { + if (i == j) { + // x0,x1 are the same pixel, so compute combined coverage + scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT); + } else { + if (i >= 0) // add antialiasing for x0 + scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); + else + i = -1; // clip + + if (j < len) // add antialiasing for x1 + scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); + else + j = len; // clip + + for (++i; i < j; ++i) // fill pixels between x0 and x1 + scanline[i] = scanline[i] + (stbtt_uint8) max_weight; + } + } + } + } + + e = e->next; + } +} + +static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge *active = NULL; + int y,j=0; + int max_weight = (255 / vsubsample); // weight per vertical scanline + int s; // vertical subsample index + unsigned char scanline_data[512], *scanline; + + if (result->w > 512) + scanline = (unsigned char *) STBTT_malloc(result->w, userdata); + else + scanline = scanline_data; + + y = off_y * vsubsample; + e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; + + while (j < result->h) { + STBTT_memset(scanline, 0, result->w); + for (s=0; s < vsubsample; ++s) { + // find center of pixel for this scanline + float scan_y = y + 0.5f; + stbtt__active_edge **step = &active; + + // update all active edges; + // remove all active edges that terminate before the center of this scanline + while (*step) { + stbtt__active_edge * z = *step; + if (z->ey <= scan_y) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } else { + z->x += z->dx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + } + + // resort the list if needed + for(;;) { + int changed=0; + step = &active; + while (*step && (*step)->next) { + if ((*step)->x > (*step)->next->x) { + stbtt__active_edge *t = *step; + stbtt__active_edge *q = t->next; + + t->next = q->next; + q->next = t; + *step = q; + changed = 1; + } + step = &(*step)->next; + } + if (!changed) break; + } + + // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline + while (e->y0 <= scan_y) { + if (e->y1 > scan_y) { + stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); + if (z != NULL) { + // find insertion point + if (active == NULL) + active = z; + else if (z->x < active->x) { + // insert at front + z->next = active; + active = z; + } else { + // find thing to insert AFTER + stbtt__active_edge *p = active; + while (p->next && p->next->x < z->x) + p = p->next; + // at this point, p->next->x is NOT < z->x + z->next = p->next; + p->next = z; + } + } + } + ++e; + } + + // now process all active edges in XOR fashion + if (active) + stbtt__fill_active_edges(scanline, result->w, active, max_weight); + + ++y; + } + STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if (scanline != scanline_data) + STBTT_free(scanline, userdata); +} + +#elif STBTT_RASTERIZER_VERSION == 2 + +// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 +// (i.e. it has already been clipped to those) +static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1) +{ + if (y0 == y1) return; + STBTT_assert(y0 < y1); + STBTT_assert(e->sy <= e->ey); + if (y0 > e->ey) return; + if (y1 < e->sy) return; + if (y0 < e->sy) { + x0 += (x1-x0) * (e->sy - y0) / (y1-y0); + y0 = e->sy; + } + if (y1 > e->ey) { + x1 += (x1-x0) * (e->ey - y1) / (y1-y0); + y1 = e->ey; + } + + if (x0 == x) + STBTT_assert(x1 <= x+1); + else if (x0 == x+1) + STBTT_assert(x1 >= x); + else if (x0 <= x) + STBTT_assert(x1 <= x); + else if (x0 >= x+1) + STBTT_assert(x1 >= x+1); + else + STBTT_assert(x1 >= x && x1 <= x+1); + + if (x0 <= x && x1 <= x) + scanline[x] += e->direction * (y1-y0); + else if (x0 >= x+1 && x1 >= x+1) + ; + else { + STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); + scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); // coverage = 1 - average x position + } +} + +static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) +{ + STBTT_assert(top_width >= 0); + STBTT_assert(bottom_width >= 0); + return (top_width + bottom_width) / 2.0f * height; +} + +static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) +{ + return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); +} + +static float stbtt__sized_triangle_area(float height, float width) +{ + return height * width / 2; +} + +static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top) +{ + float y_bottom = y_top+1; + + while (e) { + // brute force every pixel + + // compute intersection points with top & bottom + STBTT_assert(e->ey >= y_top); + + if (e->fdx == 0) { + float x0 = e->fx; + if (x0 < len) { + if (x0 >= 0) { + stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom); + stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom); + } else { + stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom); + } + } + } else { + float x0 = e->fx; + float dx = e->fdx; + float xb = x0 + dx; + float x_top, x_bottom; + float sy0,sy1; + float dy = e->fdy; + STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); + + // compute endpoints of line segment clipped to this scanline (if the + // line segment starts on this scanline. x0 is the intersection of the + // line with y_top, but that may be off the line segment. + if (e->sy > y_top) { + x_top = x0 + dx * (e->sy - y_top); + sy0 = e->sy; + } else { + x_top = x0; + sy0 = y_top; + } + if (e->ey < y_bottom) { + x_bottom = x0 + dx * (e->ey - y_top); + sy1 = e->ey; + } else { + x_bottom = xb; + sy1 = y_bottom; + } + + if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { + // from here on, we don't have to range check x values + + if ((int) x_top == (int) x_bottom) { + float height; + // simple case, only spans one pixel + int x = (int) x_top; + height = (sy1 - sy0) * e->direction; + STBTT_assert(x >= 0 && x < len); + scanline[x] += stbtt__position_trapezoid_area(height, x_top, x+1.0f, x_bottom, x+1.0f); + scanline_fill[x] += height; // everything right of this pixel is filled + } else { + int x,x1,x2; + float y_crossing, y_final, step, sign, area; + // covers 2+ pixels + if (x_top > x_bottom) { + // flip scanline vertically; signed area is the same + float t; + sy0 = y_bottom - (sy0 - y_top); + sy1 = y_bottom - (sy1 - y_top); + t = sy0, sy0 = sy1, sy1 = t; + t = x_bottom, x_bottom = x_top, x_top = t; + dx = -dx; + dy = -dy; + t = x0, x0 = xb, xb = t; + } + STBTT_assert(dy >= 0); + STBTT_assert(dx >= 0); + + x1 = (int) x_top; + x2 = (int) x_bottom; + // compute intersection with y axis at x1+1 + y_crossing = y_top + dy * (x1+1 - x0); + + // compute intersection with y axis at x2 + y_final = y_top + dy * (x2 - x0); + + // x1 x_top x2 x_bottom + // y_top +------|-----+------------+------------+--------|---+------------+ + // | | | | | | + // | | | | | | + // sy0 | Txxxxx|............|............|............|............| + // y_crossing | *xxxxx.......|............|............|............| + // | | xxxxx..|............|............|............| + // | | /- xx*xxxx........|............|............| + // | | dy < | xxxxxx..|............|............| + // y_final | | \- | xx*xxx.........|............| + // sy1 | | | | xxxxxB...|............| + // | | | | | | + // | | | | | | + // y_bottom +------------+------------+------------+------------+------------+ + // + // goal is to measure the area covered by '.' in each pixel + + // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 + // @TODO: maybe test against sy1 rather than y_bottom? + if (y_crossing > y_bottom) + y_crossing = y_bottom; + + sign = e->direction; + + // area of the rectangle covered from sy0..y_crossing + area = sign * (y_crossing-sy0); + + // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) + scanline[x1] += stbtt__sized_triangle_area(area, x1+1 - x_top); + + // check if final y_crossing is blown up; no test case for this + if (y_final > y_bottom) { + y_final = y_bottom; + dy = (y_final - y_crossing ) / (x2 - (x1+1)); // if denom=0, y_final = y_crossing, so y_final <= y_bottom + } + + // in second pixel, area covered by line segment found in first pixel + // is always a rectangle 1 wide * the height of that line segment; this + // is exactly what the variable 'area' stores. it also gets a contribution + // from the line segment within it. the THIRD pixel will get the first + // pixel's rectangle contribution, the second pixel's rectangle contribution, + // and its own contribution. the 'own contribution' is the same in every pixel except + // the leftmost and rightmost, a trapezoid that slides down in each pixel. + // the second pixel's contribution to the third pixel will be the + // rectangle 1 wide times the height change in the second pixel, which is dy. + + step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, + // which multiplied by 1-pixel-width is how much pixel area changes for each step in x + // so the area advances by 'step' every time + + for (x = x1+1; x < x2; ++x) { + scanline[x] += area + step/2; // area of trapezoid is 1*step/2 + area += step; + } + STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down + STBTT_assert(sy1 > y_final-0.01f); + + // area covered in the last pixel is the rectangle from all the pixels to the left, + // plus the trapezoid filled by the line segment in this pixel all the way to the right edge + scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1-y_final, (float) x2, x2+1.0f, x_bottom, x2+1.0f); + + // the rest of the line is filled based on the total height of the line segment in this pixel + scanline_fill[x2] += sign * (sy1-sy0); + } + } else { + // if edge goes outside of box we're drawing, we require + // clipping logic. since this does not match the intended use + // of this library, we use a different, very slow brute + // force implementation + // note though that this does happen some of the time because + // x_top and x_bottom can be extrapolated at the top & bottom of + // the shape and actually lie outside the bounding box + int x; + for (x=0; x < len; ++x) { + // cases: + // + // there can be up to two intersections with the pixel. any intersection + // with left or right edges can be handled by splitting into two (or three) + // regions. intersections with top & bottom do not necessitate case-wise logic. + // + // the old way of doing this found the intersections with the left & right edges, + // then used some simple logic to produce up to three segments in sorted order + // from top-to-bottom. however, this had a problem: if an x edge was epsilon + // across the x border, then the corresponding y position might not be distinct + // from the other y segment, and it might ignored as an empty segment. to avoid + // that, we need to explicitly produce segments based on x positions. + + // rename variables to clearly-defined pairs + float y0 = y_top; + float x1 = (float) (x); + float x2 = (float) (x+1); + float x3 = xb; + float y3 = y_bottom; + + // x = e->x + e->dx * (y-y_top) + // (y-y_top) = (x - e->x) / e->dx + // y = (x - e->x) / e->dx + y_top + float y1 = (x - x0) / dx + y_top; + float y2 = (x+1 - x0) / dx + y_top; + + if (x0 < x1 && x3 > x2) { // three segments descending down-right + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else if (x3 < x1 && x0 > x2) { // three segments descending down-left + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); + } else if (x0 < x1 && x3 > x1) { // two segments across x, down-right + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); + } else if (x3 < x1 && x0 > x1) { // two segments across x, down-left + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); + } else if (x0 < x2 && x3 > x2) { // two segments across x+1, down-right + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else if (x3 < x2 && x0 > x2) { // two segments across x+1, down-left + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else { // one segment + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3); + } + } + } + } + e = e->next; + } +} + +// directly AA rasterize edges w/o supersampling +static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge *active = NULL; + int y,j=0, i; + float scanline_data[129], *scanline, *scanline2; + + STBTT__NOTUSED(vsubsample); + + if (result->w > 64) + scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata); + else + scanline = scanline_data; + + scanline2 = scanline + result->w; + + y = off_y; + e[n].y0 = (float) (off_y + result->h) + 1; + + while (j < result->h) { + // find center of pixel for this scanline + float scan_y_top = y + 0.0f; + float scan_y_bottom = y + 1.0f; + stbtt__active_edge **step = &active; + + STBTT_memset(scanline , 0, result->w*sizeof(scanline[0])); + STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0])); + + // update all active edges; + // remove all active edges that terminate before the top of this scanline + while (*step) { + stbtt__active_edge * z = *step; + if (z->ey <= scan_y_top) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } else { + step = &((*step)->next); // advance through list + } + } + + // insert all edges that start before the bottom of this scanline + while (e->y0 <= scan_y_bottom) { + if (e->y0 != e->y1) { + stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); + if (z != NULL) { + if (j == 0 && off_y != 0) { + if (z->ey < scan_y_top) { + // this can happen due to subpixel positioning and some kind of fp rounding error i think + z->ey = scan_y_top; + } + } + STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds + // insert at front + z->next = active; + active = z; + } + } + ++e; + } + + // now process all active edges + if (active) + stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top); + + { + float sum = 0; + for (i=0; i < result->w; ++i) { + float k; + int m; + sum += scanline2[i]; + k = scanline[i] + sum; + k = (float) STBTT_fabs(k)*255 + 0.5f; + m = (int) k; + if (m > 255) m = 255; + result->pixels[j*result->stride + i] = (unsigned char) m; + } + } + // advance all the edges + step = &active; + while (*step) { + stbtt__active_edge *z = *step; + z->fx += z->fdx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + + ++y; + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if (scanline != scanline_data) + STBTT_free(scanline, userdata); +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) + +static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n) +{ + int i,j; + for (i=1; i < n; ++i) { + stbtt__edge t = p[i], *a = &t; + j = i; + while (j > 0) { + stbtt__edge *b = &p[j-1]; + int c = STBTT__COMPARE(a,b); + if (!c) break; + p[j] = p[j-1]; + --j; + } + if (i != j) + p[j] = t; + } +} + +static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n) +{ + /* threshold for transitioning to insertion sort */ + while (n > 12) { + stbtt__edge t; + int c01,c12,c,m,i,j; + + /* compute median of three */ + m = n >> 1; + c01 = STBTT__COMPARE(&p[0],&p[m]); + c12 = STBTT__COMPARE(&p[m],&p[n-1]); + /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ + if (c01 != c12) { + /* otherwise, we'll need to swap something else to middle */ + int z; + c = STBTT__COMPARE(&p[0],&p[n-1]); + /* 0>mid && midn => n; 0 0 */ + /* 0n: 0>n => 0; 0 n */ + z = (c == c12) ? 0 : n-1; + t = p[z]; + p[z] = p[m]; + p[m] = t; + } + /* now p[m] is the median-of-three */ + /* swap it to the beginning so it won't move around */ + t = p[0]; + p[0] = p[m]; + p[m] = t; + + /* partition loop */ + i=1; + j=n-1; + for(;;) { + /* handling of equality is crucial here */ + /* for sentinels & efficiency with duplicates */ + for (;;++i) { + if (!STBTT__COMPARE(&p[i], &p[0])) break; + } + for (;;--j) { + if (!STBTT__COMPARE(&p[0], &p[j])) break; + } + /* make sure we haven't crossed */ + if (i >= j) break; + t = p[i]; + p[i] = p[j]; + p[j] = t; + + ++i; + --j; + } + /* recurse on smaller side, iterate on larger */ + if (j < (n-i)) { + stbtt__sort_edges_quicksort(p,j); + p = p+i; + n = n-i; + } else { + stbtt__sort_edges_quicksort(p+i, n-i); + n = j; + } + } +} + +static void stbtt__sort_edges(stbtt__edge *p, int n) +{ + stbtt__sort_edges_quicksort(p, n); + stbtt__sort_edges_ins_sort(p, n); +} + +typedef struct +{ + float x,y; +} stbtt__point; + +static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) +{ + float y_scale_inv = invert ? -scale_y : scale_y; + stbtt__edge *e; + int n,i,j,k,m; +#if STBTT_RASTERIZER_VERSION == 1 + int vsubsample = result->h < 8 ? 15 : 5; +#elif STBTT_RASTERIZER_VERSION == 2 + int vsubsample = 1; +#else + #error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + // vsubsample should divide 255 evenly; otherwise we won't reach full opacity + + // now we have to blow out the windings into explicit edge lists + n = 0; + for (i=0; i < windings; ++i) + n += wcount[i]; + + e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel + if (e == 0) return; + n = 0; + + m=0; + for (i=0; i < windings; ++i) { + stbtt__point *p = pts + m; + m += wcount[i]; + j = wcount[i]-1; + for (k=0; k < wcount[i]; j=k++) { + int a=k,b=j; + // skip the edge if horizontal + if (p[j].y == p[k].y) + continue; + // add edge from j to k to the list + e[n].invert = 0; + if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { + e[n].invert = 1; + a=j,b=k; + } + e[n].x0 = p[a].x * scale_x + shift_x; + e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; + e[n].x1 = p[b].x * scale_x + shift_x; + e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; + ++n; + } + } + + // now sort the edges by their highest point (should snap to integer, and then by x) + //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); + stbtt__sort_edges(e, n); + + // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule + stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); + + STBTT_free(e, userdata); +} + +static void stbtt__add_point(stbtt__point *points, int n, float x, float y) +{ + if (!points) return; // during first pass, it's unallocated + points[n].x = x; + points[n].y = y; +} + +// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching +static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) +{ + // midpoint + float mx = (x0 + 2*x1 + x2)/4; + float my = (y0 + 2*y1 + y2)/4; + // versus directly drawn line + float dx = (x0+x2)/2 - mx; + float dy = (y0+y2)/2 - my; + if (n > 16) // 65536 segments on one curve better be enough! + return 1; + if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA + stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); + stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); + } else { + stbtt__add_point(points, *num_points,x2,y2); + *num_points = *num_points+1; + } + return 1; +} + +static void stbtt__tesselate_cubic(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) +{ + // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough + float dx0 = x1-x0; + float dy0 = y1-y0; + float dx1 = x2-x1; + float dy1 = y2-y1; + float dx2 = x3-x2; + float dy2 = y3-y2; + float dx = x3-x0; + float dy = y3-y0; + float longlen = (float) (STBTT_sqrt(dx0*dx0+dy0*dy0)+STBTT_sqrt(dx1*dx1+dy1*dy1)+STBTT_sqrt(dx2*dx2+dy2*dy2)); + float shortlen = (float) STBTT_sqrt(dx*dx+dy*dy); + float flatness_squared = longlen*longlen-shortlen*shortlen; + + if (n > 16) // 65536 segments on one curve better be enough! + return; + + if (flatness_squared > objspace_flatness_squared) { + float x01 = (x0+x1)/2; + float y01 = (y0+y1)/2; + float x12 = (x1+x2)/2; + float y12 = (y1+y2)/2; + float x23 = (x2+x3)/2; + float y23 = (y2+y3)/2; + + float xa = (x01+x12)/2; + float ya = (y01+y12)/2; + float xb = (x12+x23)/2; + float yb = (y12+y23)/2; + + float mx = (xa+xb)/2; + float my = (ya+yb)/2; + + stbtt__tesselate_cubic(points, num_points, x0,y0, x01,y01, xa,ya, mx,my, objspace_flatness_squared,n+1); + stbtt__tesselate_cubic(points, num_points, mx,my, xb,yb, x23,y23, x3,y3, objspace_flatness_squared,n+1); + } else { + stbtt__add_point(points, *num_points,x3,y3); + *num_points = *num_points+1; + } +} + +// returns number of contours +static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) +{ + stbtt__point *points=0; + int num_points=0; + + float objspace_flatness_squared = objspace_flatness * objspace_flatness; + int i,n=0,start=0, pass; + + // count how many "moves" there are to get the contour count + for (i=0; i < num_verts; ++i) + if (vertices[i].type == STBTT_vmove) + ++n; + + *num_contours = n; + if (n == 0) return 0; + + *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); + + if (*contour_lengths == 0) { + *num_contours = 0; + return 0; + } + + // make two passes through the points so we don't need to realloc + for (pass=0; pass < 2; ++pass) { + float x=0,y=0; + if (pass == 1) { + points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); + if (points == NULL) goto error; + } + num_points = 0; + n= -1; + for (i=0; i < num_verts; ++i) { + switch (vertices[i].type) { + case STBTT_vmove: + // start the next contour + if (n >= 0) + (*contour_lengths)[n] = num_points - start; + ++n; + start = num_points; + + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x,y); + break; + case STBTT_vline: + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vcurve: + stbtt__tesselate_curve(points, &num_points, x,y, + vertices[i].cx, vertices[i].cy, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + case STBTT_vcubic: + stbtt__tesselate_cubic(points, &num_points, x,y, + vertices[i].cx, vertices[i].cy, + vertices[i].cx1, vertices[i].cy1, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + } + } + (*contour_lengths)[n] = num_points - start; + } + + return points; +error: + STBTT_free(points, userdata); + STBTT_free(*contour_lengths, userdata); + *contour_lengths = 0; + *num_contours = 0; + return NULL; +} + +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) +{ + float scale = scale_x > scale_y ? scale_y : scale_x; + int winding_count = 0; + int *winding_lengths = NULL; + stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); + if (windings) { + stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); + STBTT_free(winding_lengths, userdata); + STBTT_free(windings, userdata); + } +} + +STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) +{ + STBTT_free(bitmap, userdata); +} + +STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) +{ + int ix0,iy0,ix1,iy1; + stbtt__bitmap gbm; + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + + if (scale_x == 0) scale_x = scale_y; + if (scale_y == 0) { + if (scale_x == 0) { + STBTT_free(vertices, info->userdata); + return NULL; + } + scale_y = scale_x; + } + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); + + // now we get the size + gbm.w = (ix1 - ix0); + gbm.h = (iy1 - iy0); + gbm.pixels = NULL; // in case we error + + if (width ) *width = gbm.w; + if (height) *height = gbm.h; + if (xoff ) *xoff = ix0; + if (yoff ) *yoff = iy0; + + if (gbm.w && gbm.h) { + gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); + if (gbm.pixels) { + gbm.stride = gbm.w; + + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + } + } + STBTT_free(vertices, info->userdata); + return gbm.pixels; +} + +STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) +{ + int ix0,iy0; + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + stbtt__bitmap gbm; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); + gbm.pixels = output; + gbm.w = out_w; + gbm.h = out_h; + gbm.stride = out_stride; + + if (gbm.w && gbm.h) + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); + + STBTT_free(vertices, info->userdata); +} + +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); +} + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info,codepoint)); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); +} + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) +{ + stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); +} + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-CRAPPY packing to keep source code small + +static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char *pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar *chardata) +{ + float scale; + int x,y,bottom_y, i; + stbtt_fontinfo f; + f.userdata = NULL; + if (!stbtt_InitFont(&f, data, offset)) + return -1; + STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels + x=y=1; + bottom_y = 1; + + scale = stbtt_ScaleForPixelHeight(&f, pixel_height); + + for (i=0; i < num_chars; ++i) { + int advance, lsb, x0,y0,x1,y1,gw,gh; + int g = stbtt_FindGlyphIndex(&f, first_char + i); + stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); + gw = x1-x0; + gh = y1-y0; + if (x + gw + 1 >= pw) + y = bottom_y, x = 1; // advance to next row + if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row + return -i; + STBTT_assert(x+gw < pw); + STBTT_assert(y+gh < ph); + stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); + chardata[i].x0 = (stbtt_int16) x; + chardata[i].y0 = (stbtt_int16) y; + chardata[i].x1 = (stbtt_int16) (x + gw); + chardata[i].y1 = (stbtt_int16) (y + gh); + chardata[i].xadvance = scale * advance; + chardata[i].xoff = (float) x0; + chardata[i].yoff = (float) y0; + x = x + gw + 1; + if (y+gh+1 > bottom_y) + bottom_y = y+gh+1; + } + return bottom_y; +} + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) +{ + float d3d_bias = opengl_fillrule ? 0 : -0.5f; + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_bakedchar *b = chardata + char_index; + int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); + int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); + + q->x0 = round_x + d3d_bias; + q->y0 = round_y + d3d_bias; + q->x1 = round_x + b->x1 - b->x0 + d3d_bias; + q->y1 = round_y + b->y1 - b->y0 + d3d_bias; + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// rectangle packing replacement routines if you don't have stb_rect_pack.h +// + +#ifndef STB_RECT_PACK_VERSION + +typedef int stbrp_coord; + +//////////////////////////////////////////////////////////////////////////////////// +// // +// // +// COMPILER WARNING ?!?!? // +// // +// // +// if you get a compile warning due to these symbols being defined more than // +// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // +// // +//////////////////////////////////////////////////////////////////////////////////// + +typedef struct +{ + int width,height; + int x,y,bottom_y; +} stbrp_context; + +typedef struct +{ + unsigned char x; +} stbrp_node; + +struct stbrp_rect +{ + stbrp_coord x,y; + int id,w,h,was_packed; +}; + +static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes) +{ + con->width = pw; + con->height = ph; + con->x = 0; + con->y = 0; + con->bottom_y = 0; + STBTT__NOTUSED(nodes); + STBTT__NOTUSED(num_nodes); +} + +static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects) +{ + int i; + for (i=0; i < num_rects; ++i) { + if (con->x + rects[i].w > con->width) { + con->x = 0; + con->y = con->bottom_y; + } + if (con->y + rects[i].h > con->height) + break; + rects[i].x = con->x; + rects[i].y = con->y; + rects[i].was_packed = 1; + con->x += rects[i].w; + if (con->y + rects[i].h > con->bottom_y) + con->bottom_y = con->y + rects[i].h; + } + for ( ; i < num_rects; ++i) + rects[i].was_packed = 0; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If +// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. + +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context) +{ + stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context) ,alloc_context); + int num_nodes = pw - padding; + stbrp_node *nodes = (stbrp_node *) STBTT_malloc(sizeof(*nodes ) * num_nodes,alloc_context); + + if (context == NULL || nodes == NULL) { + if (context != NULL) STBTT_free(context, alloc_context); + if (nodes != NULL) STBTT_free(nodes , alloc_context); + return 0; + } + + spc->user_allocator_context = alloc_context; + spc->width = pw; + spc->height = ph; + spc->pixels = pixels; + spc->pack_info = context; + spc->nodes = nodes; + spc->padding = padding; + spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; + spc->h_oversample = 1; + spc->v_oversample = 1; + spc->skip_missing = 0; + + stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes); + + if (pixels) + STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels + + return 1; +} + +STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc) +{ + STBTT_free(spc->nodes , spc->user_allocator_context); + STBTT_free(spc->pack_info, spc->user_allocator_context); +} + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample) +{ + STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); + STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); + if (h_oversample <= STBTT_MAX_OVERSAMPLE) + spc->h_oversample = h_oversample; + if (v_oversample <= STBTT_MAX_OVERSAMPLE) + spc->v_oversample = v_oversample; +} + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip) +{ + spc->skip_missing = skip; +} + +#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) + +static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_w = w - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for (j=0; j < h; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch (kernel_width) { + case 2: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 2); + } + break; + case 3: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 3); + } + break; + case 4: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 4); + } + break; + case 5: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 5); + } + break; + default: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / kernel_width); + } + break; + } + + for (; i < w; ++i) { + STBTT_assert(pixels[i] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i] = (unsigned char) (total / kernel_width); + } + + pixels += stride_in_bytes; + } +} + +static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_h = h - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for (j=0; j < w; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch (kernel_width) { + case 2: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 2); + } + break; + case 3: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 3); + } + break; + case 4: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 4); + } + break; + case 5: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 5); + } + break; + default: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); + } + break; + } + + for (; i < h; ++i) { + STBTT_assert(pixels[i*stride_in_bytes] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); + } + + pixels += 1; + } +} + +static float stbtt__oversample_shift(int oversample) +{ + if (!oversample) + return 0.0f; + + // The prefilter is a box filter of width "oversample", + // which shifts phase by (oversample - 1)/2 pixels in + // oversampled space. We want to shift in the opposite + // direction to counter this. + return (float)-(oversample - 1) / (2.0f * (float)oversample); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) +{ + int i,j,k; + int missing_glyph_added = 0; + + k=0; + for (i=0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + ranges[i].h_oversample = (unsigned char) spc->h_oversample; + ranges[i].v_oversample = (unsigned char) spc->v_oversample; + for (j=0; j < ranges[i].num_chars; ++j) { + int x0,y0,x1,y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + if (glyph == 0 && (spc->skip_missing || missing_glyph_added)) { + rects[k].w = rects[k].h = 0; + } else { + stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0,0, + &x0,&y0,&x1,&y1); + rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); + rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); + if (glyph == 0) + missing_glyph_added = 1; + } + ++k; + } + } + + return k; +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, float *sub_x, float *sub_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, + output, + out_w - (prefilter_x - 1), + out_h - (prefilter_y - 1), + out_stride, + scale_x, + scale_y, + shift_x, + shift_y, + glyph); + + if (prefilter_x > 1) + stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); + + if (prefilter_y > 1) + stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); + + *sub_x = stbtt__oversample_shift(prefilter_x); + *sub_y = stbtt__oversample_shift(prefilter_y); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) +{ + int i,j,k, missing_glyph = -1, return_value = 1; + + // save current values + int old_h_over = spc->h_oversample; + int old_v_over = spc->v_oversample; + + k = 0; + for (i=0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + float recip_h,recip_v,sub_x,sub_y; + spc->h_oversample = ranges[i].h_oversample; + spc->v_oversample = ranges[i].v_oversample; + recip_h = 1.0f / spc->h_oversample; + recip_v = 1.0f / spc->v_oversample; + sub_x = stbtt__oversample_shift(spc->h_oversample); + sub_y = stbtt__oversample_shift(spc->v_oversample); + for (j=0; j < ranges[i].num_chars; ++j) { + stbrp_rect *r = &rects[k]; + if (r->was_packed && r->w != 0 && r->h != 0) { + stbtt_packedchar *bc = &ranges[i].chardata_for_range[j]; + int advance, lsb, x0,y0,x1,y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + stbrp_coord pad = (stbrp_coord) spc->padding; + + // pad on left and top + r->x += pad; + r->y += pad; + r->w -= pad; + r->h -= pad; + stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); + stbtt_GetGlyphBitmapBox(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + &x0,&y0,&x1,&y1); + stbtt_MakeGlyphBitmapSubpixel(info, + spc->pixels + r->x + r->y*spc->stride_in_bytes, + r->w - spc->h_oversample+1, + r->h - spc->v_oversample+1, + spc->stride_in_bytes, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0,0, + glyph); + + if (spc->h_oversample > 1) + stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->h_oversample); + + if (spc->v_oversample > 1) + stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->v_oversample); + + bc->x0 = (stbtt_int16) r->x; + bc->y0 = (stbtt_int16) r->y; + bc->x1 = (stbtt_int16) (r->x + r->w); + bc->y1 = (stbtt_int16) (r->y + r->h); + bc->xadvance = scale * advance; + bc->xoff = (float) x0 * recip_h + sub_x; + bc->yoff = (float) y0 * recip_v + sub_y; + bc->xoff2 = (x0 + r->w) * recip_h + sub_x; + bc->yoff2 = (y0 + r->h) * recip_v + sub_y; + + if (glyph == 0) + missing_glyph = j; + } else if (spc->skip_missing) { + return_value = 0; + } else if (r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { + ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; + } else { + return_value = 0; // if any fail, report failure + } + + ++k; + } + } + + // restore original values + spc->h_oversample = old_h_over; + spc->v_oversample = old_v_over; + + return return_value; +} + +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects) +{ + stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects); +} + +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges) +{ + stbtt_fontinfo info; + int i,j,n, return_value = 1; + //stbrp_context *context = (stbrp_context *) spc->pack_info; + stbrp_rect *rects; + + // flag all characters as NOT packed + for (i=0; i < num_ranges; ++i) + for (j=0; j < ranges[i].num_chars; ++j) + ranges[i].chardata_for_range[j].x0 = + ranges[i].chardata_for_range[j].y0 = + ranges[i].chardata_for_range[j].x1 = + ranges[i].chardata_for_range[j].y1 = 0; + + n = 0; + for (i=0; i < num_ranges; ++i) + n += ranges[i].num_chars; + + rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); + if (rects == NULL) + return 0; + + info.userdata = spc->user_allocator_context; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index)); + + n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); + + stbtt_PackFontRangesPackRects(spc, rects, n); + + return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); + + STBTT_free(rects, spc->user_allocator_context); + return return_value; +} + +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range) +{ + stbtt_pack_range range; + range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; + range.array_of_unicode_codepoints = NULL; + range.num_chars = num_chars_in_range; + range.chardata_for_range = chardata_for_range; + range.font_size = font_size; + return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); +} + +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap) +{ + int i_ascent, i_descent, i_lineGap; + float scale; + stbtt_fontinfo info; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); + scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); + stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); + *ascent = (float) i_ascent * scale; + *descent = (float) i_descent * scale; + *lineGap = (float) i_lineGap * scale; +} + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer) +{ + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_packedchar *b = chardata + char_index; + + if (align_to_integer) { + float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f); + float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f); + q->x0 = x; + q->y0 = y; + q->x1 = x + b->xoff2 - b->xoff; + q->y1 = y + b->yoff2 - b->yoff; + } else { + q->x0 = *xpos + b->xoff; + q->y0 = *ypos + b->yoff; + q->x1 = *xpos + b->xoff2; + q->y1 = *ypos + b->yoff2; + } + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// sdf computation +// + +#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) +#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) + +static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], float hits[2][2]) +{ + float q0perp = q0[1]*ray[0] - q0[0]*ray[1]; + float q1perp = q1[1]*ray[0] - q1[0]*ray[1]; + float q2perp = q2[1]*ray[0] - q2[0]*ray[1]; + float roperp = orig[1]*ray[0] - orig[0]*ray[1]; + + float a = q0perp - 2*q1perp + q2perp; + float b = q1perp - q0perp; + float c = q0perp - roperp; + + float s0 = 0., s1 = 0.; + int num_s = 0; + + if (a != 0.0) { + float discr = b*b - a*c; + if (discr > 0.0) { + float rcpna = -1 / a; + float d = (float) STBTT_sqrt(discr); + s0 = (b+d) * rcpna; + s1 = (b-d) * rcpna; + if (s0 >= 0.0 && s0 <= 1.0) + num_s = 1; + if (d > 0.0 && s1 >= 0.0 && s1 <= 1.0) { + if (num_s == 0) s0 = s1; + ++num_s; + } + } + } else { + // 2*b*s + c = 0 + // s = -c / (2*b) + s0 = c / (-2 * b); + if (s0 >= 0.0 && s0 <= 1.0) + num_s = 1; + } + + if (num_s == 0) + return 0; + else { + float rcp_len2 = 1 / (ray[0]*ray[0] + ray[1]*ray[1]); + float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; + + float q0d = q0[0]*rayn_x + q0[1]*rayn_y; + float q1d = q1[0]*rayn_x + q1[1]*rayn_y; + float q2d = q2[0]*rayn_x + q2[1]*rayn_y; + float rod = orig[0]*rayn_x + orig[1]*rayn_y; + + float q10d = q1d - q0d; + float q20d = q2d - q0d; + float q0rd = q0d - rod; + + hits[0][0] = q0rd + s0*(2.0f - 2.0f*s0)*q10d + s0*s0*q20d; + hits[0][1] = a*s0+b; + + if (num_s > 1) { + hits[1][0] = q0rd + s1*(2.0f - 2.0f*s1)*q10d + s1*s1*q20d; + hits[1][1] = a*s1+b; + return 2; + } else { + return 1; + } + } +} + +static int equal(float *a, float *b) +{ + return (a[0] == b[0] && a[1] == b[1]); +} + +static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex *verts) +{ + int i; + float orig[2], ray[2] = { 1, 0 }; + float y_frac; + int winding = 0; + + // make sure y never passes through a vertex of the shape + y_frac = (float) STBTT_fmod(y, 1.0f); + if (y_frac < 0.01f) + y += 0.01f; + else if (y_frac > 0.99f) + y -= 0.01f; + + orig[0] = x; + orig[1] = y; + + // test a ray from (-infinity,y) to (x,y) + for (i=0; i < nverts; ++i) { + if (verts[i].type == STBTT_vline) { + int x0 = (int) verts[i-1].x, y0 = (int) verts[i-1].y; + int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y; + if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; + if (x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + if (verts[i].type == STBTT_vcurve) { + int x0 = (int) verts[i-1].x , y0 = (int) verts[i-1].y ; + int x1 = (int) verts[i ].cx, y1 = (int) verts[i ].cy; + int x2 = (int) verts[i ].x , y2 = (int) verts[i ].y ; + int ax = STBTT_min(x0,STBTT_min(x1,x2)), ay = STBTT_min(y0,STBTT_min(y1,y2)); + int by = STBTT_max(y0,STBTT_max(y1,y2)); + if (y > ay && y < by && x > ax) { + float q0[2],q1[2],q2[2]; + float hits[2][2]; + q0[0] = (float)x0; + q0[1] = (float)y0; + q1[0] = (float)x1; + q1[1] = (float)y1; + q2[0] = (float)x2; + q2[1] = (float)y2; + if (equal(q0,q1) || equal(q1,q2)) { + x0 = (int)verts[i-1].x; + y0 = (int)verts[i-1].y; + x1 = (int)verts[i ].x; + y1 = (int)verts[i ].y; + if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; + if (x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } else { + int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); + if (num_hits >= 1) + if (hits[0][0] < 0) + winding += (hits[0][1] < 0 ? -1 : 1); + if (num_hits >= 2) + if (hits[1][0] < 0) + winding += (hits[1][1] < 0 ? -1 : 1); + } + } + } + } + return winding; +} + +static float stbtt__cuberoot( float x ) +{ + if (x<0) + return -(float) STBTT_pow(-x,1.0f/3.0f); + else + return (float) STBTT_pow( x,1.0f/3.0f); +} + +// x^3 + a*x^2 + b*x + c = 0 +static int stbtt__solve_cubic(float a, float b, float c, float* r) +{ + float s = -a / 3; + float p = b - a*a / 3; + float q = a * (2*a*a - 9*b) / 27 + c; + float p3 = p*p*p; + float d = q*q + 4*p3 / 27; + if (d >= 0) { + float z = (float) STBTT_sqrt(d); + float u = (-q + z) / 2; + float v = (-q - z) / 2; + u = stbtt__cuberoot(u); + v = stbtt__cuberoot(v); + r[0] = s + u + v; + return 1; + } else { + float u = (float) STBTT_sqrt(-p/3); + float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative + float m = (float) STBTT_cos(v); + float n = (float) STBTT_cos(v-3.141592/2)*1.732050808f; + r[0] = s + u * 2 * m; + r[1] = s - u * (m + n); + r[2] = s - u * (m - n); + + //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? + //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); + //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); + return 3; + } +} + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) +{ + float scale_x = scale, scale_y = scale; + int ix0,iy0,ix1,iy1; + int w,h; + unsigned char *data; + + if (scale == 0) return NULL; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f,0.0f, &ix0,&iy0,&ix1,&iy1); + + // if empty, return NULL + if (ix0 == ix1 || iy0 == iy1) + return NULL; + + ix0 -= padding; + iy0 -= padding; + ix1 += padding; + iy1 += padding; + + w = (ix1 - ix0); + h = (iy1 - iy0); + + if (width ) *width = w; + if (height) *height = h; + if (xoff ) *xoff = ix0; + if (yoff ) *yoff = iy0; + + // invert for y-downwards bitmaps + scale_y = -scale_y; + + { + int x,y,i,j; + float *precompute; + stbtt_vertex *verts; + int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); + data = (unsigned char *) STBTT_malloc(w * h, info->userdata); + precompute = (float *) STBTT_malloc(num_verts * sizeof(float), info->userdata); + + for (i=0,j=num_verts-1; i < num_verts; j=i++) { + if (verts[i].type == STBTT_vline) { + float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; + float x1 = verts[j].x*scale_x, y1 = verts[j].y*scale_y; + float dist = (float) STBTT_sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); + precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; + } else if (verts[i].type == STBTT_vcurve) { + float x2 = verts[j].x *scale_x, y2 = verts[j].y *scale_y; + float x1 = verts[i].cx*scale_x, y1 = verts[i].cy*scale_y; + float x0 = verts[i].x *scale_x, y0 = verts[i].y *scale_y; + float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; + float len2 = bx*bx + by*by; + if (len2 != 0.0f) + precompute[i] = 1.0f / (bx*bx + by*by); + else + precompute[i] = 0.0f; + } else + precompute[i] = 0.0f; + } + + for (y=iy0; y < iy1; ++y) { + for (x=ix0; x < ix1; ++x) { + float val; + float min_dist = 999999.0f; + float sx = (float) x + 0.5f; + float sy = (float) y + 0.5f; + float x_gspace = (sx / scale_x); + float y_gspace = (sy / scale_y); + + int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path + + for (i=0; i < num_verts; ++i) { + float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; + + if (verts[i].type == STBTT_vline && precompute[i] != 0.0f) { + float x1 = verts[i-1].x*scale_x, y1 = verts[i-1].y*scale_y; + + float dist,dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); + if (dist2 < min_dist*min_dist) + min_dist = (float) STBTT_sqrt(dist2); + + // coarse culling against bbox + //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && + // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) + dist = (float) STBTT_fabs((x1-x0)*(y0-sy) - (y1-y0)*(x0-sx)) * precompute[i]; + STBTT_assert(i != 0); + if (dist < min_dist) { + // check position along line + // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) + // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) + float dx = x1-x0, dy = y1-y0; + float px = x0-sx, py = y0-sy; + // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy + // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve + float t = -(px*dx + py*dy) / (dx*dx + dy*dy); + if (t >= 0.0f && t <= 1.0f) + min_dist = dist; + } + } else if (verts[i].type == STBTT_vcurve) { + float x2 = verts[i-1].x *scale_x, y2 = verts[i-1].y *scale_y; + float x1 = verts[i ].cx*scale_x, y1 = verts[i ].cy*scale_y; + float box_x0 = STBTT_min(STBTT_min(x0,x1),x2); + float box_y0 = STBTT_min(STBTT_min(y0,y1),y2); + float box_x1 = STBTT_max(STBTT_max(x0,x1),x2); + float box_y1 = STBTT_max(STBTT_max(y0,y1),y2); + // coarse culling against bbox to avoid computing cubic unnecessarily + if (sx > box_x0-min_dist && sx < box_x1+min_dist && sy > box_y0-min_dist && sy < box_y1+min_dist) { + int num=0; + float ax = x1-x0, ay = y1-y0; + float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; + float mx = x0 - sx, my = y0 - sy; + float res[3] = {0.f,0.f,0.f}; + float px,py,t,it,dist2; + float a_inv = precompute[i]; + if (a_inv == 0.0) { // if a_inv is 0, it's 2nd degree so use quadratic formula + float a = 3*(ax*bx + ay*by); + float b = 2*(ax*ax + ay*ay) + (mx*bx+my*by); + float c = mx*ax+my*ay; + if (a == 0.0) { // if a is 0, it's linear + if (b != 0.0) { + res[num++] = -c/b; + } + } else { + float discriminant = b*b - 4*a*c; + if (discriminant < 0) + num = 0; + else { + float root = (float) STBTT_sqrt(discriminant); + res[0] = (-b - root)/(2*a); + res[1] = (-b + root)/(2*a); + num = 2; // don't bother distinguishing 1-solution case, as code below will still work + } + } + } else { + float b = 3*(ax*bx + ay*by) * a_inv; // could precompute this as it doesn't depend on sample point + float c = (2*(ax*ax + ay*ay) + (mx*bx+my*by)) * a_inv; + float d = (mx*ax+my*ay) * a_inv; + num = stbtt__solve_cubic(b, c, d, res); + } + dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); + if (dist2 < min_dist*min_dist) + min_dist = (float) STBTT_sqrt(dist2); + + if (num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { + t = res[0], it = 1.0f - t; + px = it*it*x0 + 2*t*it*x1 + t*t*x2; + py = it*it*y0 + 2*t*it*y1 + t*t*y2; + dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); + if (dist2 < min_dist * min_dist) + min_dist = (float) STBTT_sqrt(dist2); + } + if (num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { + t = res[1], it = 1.0f - t; + px = it*it*x0 + 2*t*it*x1 + t*t*x2; + py = it*it*y0 + 2*t*it*y1 + t*t*y2; + dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); + if (dist2 < min_dist * min_dist) + min_dist = (float) STBTT_sqrt(dist2); + } + if (num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { + t = res[2], it = 1.0f - t; + px = it*it*x0 + 2*t*it*x1 + t*t*x2; + py = it*it*y0 + 2*t*it*y1 + t*t*y2; + dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); + if (dist2 < min_dist * min_dist) + min_dist = (float) STBTT_sqrt(dist2); + } + } + } + } + if (winding == 0) + min_dist = -min_dist; // if outside the shape, value is negative + val = onedge_value + pixel_dist_scale * min_dist; + if (val < 0) + val = 0; + else if (val > 255) + val = 255; + data[(y-iy0)*w+(x-ix0)] = (unsigned char) val; + } + } + STBTT_free(precompute, info->userdata); + STBTT_free(verts, info->userdata); + } + return data; +} + +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata) +{ + STBTT_free(bitmap, userdata); +} + +////////////////////////////////////////////////////////////////////////////// +// +// font name matching -- recommended not to use this +// + +// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2) +{ + stbtt_int32 i=0; + + // convert utf16 to utf8 and compare the results while converting + while (len2) { + stbtt_uint16 ch = s2[0]*256 + s2[1]; + if (ch < 0x80) { + if (i >= len1) return -1; + if (s1[i++] != ch) return -1; + } else if (ch < 0x800) { + if (i+1 >= len1) return -1; + if (s1[i++] != 0xc0 + (ch >> 6)) return -1; + if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; + } else if (ch >= 0xd800 && ch < 0xdc00) { + stbtt_uint32 c; + stbtt_uint16 ch2 = s2[2]*256 + s2[3]; + if (i+3 >= len1) return -1; + c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; + if (s1[i++] != 0xf0 + (c >> 18)) return -1; + if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; + s2 += 2; // plus another 2 below + len2 -= 2; + } else if (ch >= 0xdc00 && ch < 0xe000) { + return -1; + } else { + if (i+2 >= len1) return -1; + if (s1[i++] != 0xe0 + (ch >> 12)) return -1; + if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; + } + s2 += 2; + len2 -= 2; + } + return i; +} + +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2); +} + +// returns results in whatever encoding you request... but note that 2-byte encodings +// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare +STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) +{ + stbtt_int32 i,count,stringOffset; + stbtt_uint8 *fc = font->data; + stbtt_uint32 offset = font->fontstart; + stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return NULL; + + count = ttUSHORT(fc+nm+2); + stringOffset = nm + ttUSHORT(fc+nm+4); + for (i=0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) + && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { + *length = ttUSHORT(fc+loc+8); + return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); + } + } + return NULL; +} + +static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) +{ + stbtt_int32 i; + stbtt_int32 count = ttUSHORT(fc+nm+2); + stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); + + for (i=0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + stbtt_int32 id = ttUSHORT(fc+loc+6); + if (id == target_id) { + // find the encoding + stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); + + // is this a Unicode encoding? + if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { + stbtt_int32 slen = ttUSHORT(fc+loc+8); + stbtt_int32 off = ttUSHORT(fc+loc+10); + + // check if there's a prefix match + stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); + if (matchlen >= 0) { + // check for target_id+1 immediately following, with same encoding & language + if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { + slen = ttUSHORT(fc+loc+12+8); + off = ttUSHORT(fc+loc+12+10); + if (slen == 0) { + if (matchlen == nlen) + return 1; + } else if (matchlen < nlen && name[matchlen] == ' ') { + ++matchlen; + if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) + return 1; + } + } else { + // if nothing immediately following + if (matchlen == nlen) + return 1; + } + } + } + + // @TODO handle other encodings + } + } + return 0; +} + +static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) +{ + stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); + stbtt_uint32 nm,hd; + if (!stbtt__isfont(fc+offset)) return 0; + + // check italics/bold/underline flags in macStyle... + if (flags) { + hd = stbtt__find_table(fc, offset, "head"); + if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; + } + + nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return 0; + + if (flags) { + // if we checked the macStyle flags, then just check the family and ignore the subfamily + if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } else { + if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + + return 0; +} + +static int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags) +{ + stbtt_int32 i; + for (i=0;;++i) { + stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); + if (off < 0) return off; + if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) + return off; + } +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, + float pixel_height, unsigned char *pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar *chardata) +{ + return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); +} + +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index); +} + +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data) +{ + return stbtt_GetNumberOfFonts_internal((unsigned char *) data); +} + +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset) +{ + return stbtt_InitFont_internal(info, (unsigned char *) data, offset); +} + +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags) +{ + return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags); +} + +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2); +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif + +#endif // STB_TRUETYPE_IMPLEMENTATION + + +// FULL VERSION HISTORY +// +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) allow user-defined fabs() replacement +// fix memory leak if fontsize=0.0 +// fix warning from duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// allow PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) +// also more precise AA rasterizer, except if shapes overlap +// remove need for STBTT_sort +// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC +// 1.04 (2015-04-15) typo in example +// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes +// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ +// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match +// non-oversampled; STBTT_POINT_SIZE for packed case only +// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling +// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) +// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID +// 0.8b (2014-07-07) fix a warning +// 0.8 (2014-05-25) fix a few more warnings +// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back +// 0.6c (2012-07-24) improve documentation +// 0.6b (2012-07-20) fix a few more warnings +// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, +// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty +// 0.5 (2011-12-09) bugfixes: +// subpixel glyph renderer computed wrong bounding box +// first vertex of shape can be off-curve (FreeSans) +// 0.4b (2011-12-03) fixed an error in the font baking example +// 0.4 (2011-12-01) kerning, subpixel rendering (tor) +// bugfixes for: +// codepoint-to-glyph conversion using table fmt=12 +// codepoint-to-glyph conversion using table fmt=4 +// stbtt_GetBakedQuad with non-square texture (Zer) +// updated Hello World! sample to use kerning and subpixel +// fixed some warnings +// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) +// userdata, malloc-from-userdata, non-zero fill (stb) +// 0.2 (2009-03-11) Fix unsigned/signed char warnings +// 0.1 (2009-03-09) First public release +// + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +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: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the 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 +AUTHORS 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 IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +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 +AUTHORS 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 IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/libmui/mui/stb_ttc.h b/libmui/mui/stb_ttc.h new file mode 100644 index 0000000..6d828be --- /dev/null +++ b/libmui/mui/stb_ttc.h @@ -0,0 +1,660 @@ +/* + * stb_ttc.h + * + * Copyright (C) 2020 Michel Pollet + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef STB_TTC_H_ +#define STB_TTC_H_ + +#include "stb_truetype.h" + +#define STB_TTC_PACKED __attribute__((packed)) +/* Number of bins in the hash table(s) */ +#define STB_TTC_BINCOUNT 16 +/* Number of structures we prealocate when resizing arrays */ +#define STB_TTC_PAGESIZE 16 + +/* + * This is used in the hash table mapping the glyph/scale pair to the + * primary array of cached glyphs. + */ +typedef struct stb_ttc_index { + unsigned int intscale, glyph, index; +} STB_TTC_PACKED stb_ttc_index; + +/* + * This is used by MeasureText. Returns the number os glyphs in the string, + * the ascent and descent /of that text/ and the bounding box of that text. + * Note that x0 can be negative, if the first character is for example, a 'j' + */ +typedef struct stb_ttc_measure { + short glyph_count; + short ascent, descent; + short x0,y0,x1,y1; +} STB_TTC_PACKED stb_ttc_measure; + +/* + * A glyph info for a certain scale. You can have the same glyph at multiple + * scales in one cache. + */ +typedef struct stb_ttc_g { + unsigned int intscale; // for comparison purpose + float scale; + unsigned int glyph; + int advance, lsb; + short x0,y0,x1,y1; + // position in the pixel cache, or 0xffff if not yet cached. + unsigned short p_x, p_y; +} STB_TTC_PACKED stb_ttc_g; + +/* + * Used to cache the codepoints to glyphs map in a hash table + */ +typedef struct stb_ttc_cp_gl { + unsigned int cp; + unsigned int glyph; +} STB_TTC_PACKED stb_ttc_cp_gl; + +/* + * Used to cache the kerning between cp1 and cp2 in a hash + */ +typedef struct stb_ttc_cp_kern { + unsigned int hash; + unsigned int cp1, cp2; + int kern; +} STB_TTC_PACKED stb_ttc_cp_kern; + +// to remap codepoint->glyph without calling back into stb +struct _stb_ttc_cp_bin { + unsigned int cp_count; + stb_ttc_cp_gl * cp_gl; +}; +// to remap codepoint pairs to associated kerning +struct _stb_ttc_kn_bin { + unsigned int kn_count; + stb_ttc_cp_kern * cp_kn; +}; +// for glyph -> position in the glyph array +struct _stb_ttc_g_bin { + unsigned int i_count; + stb_ttc_index * index; +}; + +/* + * Main STB TrueType Cache structure. + */ +typedef struct stb_ttc_info { + stbtt_fontinfo font; + unsigned int font_size; + unsigned font_mmap: 1; // is font from a file + int ascent, descent; + // hash to remap codepoint->glyph without calling back into stb + struct _stb_ttc_cp_bin cp_bin[STB_TTC_BINCOUNT]; + // hash to remap codepoint pairs to associated kerning + struct _stb_ttc_kn_bin kn_bin[STB_TTC_BINCOUNT]; + // hash that for glyph -> position in the glyph array + struct _stb_ttc_g_bin g_bin[STB_TTC_BINCOUNT]; + // glyph array, contains glyph dimensions, and x,y of pixel in cache + unsigned int g_count; + stb_ttc_g * glyph; + // pixels cache for glyphs + unsigned int p_stride; + unsigned int p_height; // current total height + unsigned int p_line_height; // current glyph line height + unsigned int p_line_x, p_line_y; // current x,y position in pixels + unsigned char * pixels; +} stb_ttc_info; + + +#ifdef STBTTC_STATIC +#define STBTTC_DEF static +#else +#define STBTTC_DEF extern +#endif + +/* + * Preload a range of codepoints into the glyph cache. This doesn't add the + * pixels, it just load the glyph measurement, advance, lsb into the cache + */ +STBTTC_DEF int +stb_ttc_CacheCodepointRange( + struct stb_ttc_info * ttc, + unsigned int cp, + unsigned int count, + float scale ); +/* + * This walks the cache for glyphs that haven't been pre-rendered and + * render them in the cache. Also, it attempts to sort the glyphs by height + * into the cache to save a little bit of memory + * Note: This call is optional, the glyph renderer will populate the pixel + * cache lazily on the fly. + */ +STBTTC_DEF int +stb_ttc_RenderAllCachedGlyphs( + struct stb_ttc_info * ttc ); + +STBTTC_DEF int +stb_ttc_MeasureText( + struct stb_ttc_info * ttc, + float scale, + const char * text, + stb_ttc_measure *out); + +STBTTC_DEF int +stb_ttc_DrawText( + struct stb_ttc_info * ttc, + float scale, + const char * text, + unsigned int dx, + unsigned int base_dy, + unsigned char * pixels, + unsigned int p_w, + unsigned int p_h, + unsigned int p_stride); +// load a font from a file +STBTTC_DEF int +stb_ttc_MapFont( + struct stb_ttc_info * ttc, + const char * font_file); +// load a font from memory +STBTTC_DEF int +stb_ttc_LoadFont( + struct stb_ttc_info * ttc, + const void * font_data, + unsigned int font_size); +STBTTC_DEF void +stb_ttc_Free( + struct stb_ttc_info * ttc); + +#ifdef STB_TTC_IMPLEMENTATION +/* + * return font glyph index from codepoint, cache the result if it wasn't. + */ +static int +stb_ttc__CodepointGetGlyph( + struct stb_ttc_info *fi, + unsigned int cp ) +{ + struct _stb_ttc_cp_bin *b = &fi->cp_bin[cp & (STB_TTC_BINCOUNT - 1)]; + int di = 0; + for (unsigned int gi = 0; gi < b->cp_count; gi++, di++) + if (b->cp_gl[gi].cp == cp) + return b->cp_gl[gi].glyph; + else if (b->cp_gl[gi].cp > cp) + break; + int gl = stbtt_FindGlyphIndex(&fi->font, cp); + if (gl == 0) + return -1; + if (!(b->cp_count % STB_TTC_PAGESIZE)) + b->cp_gl = realloc(b->cp_gl, + sizeof(b->cp_gl[0]) * (b->cp_count + STB_TTC_PAGESIZE)); + memmove(b->cp_gl + di + 1, b->cp_gl + di, + sizeof(b->cp_gl[0]) * (b->cp_count - di)); + b->cp_count++; + b->cp_gl[di].cp = cp; + b->cp_gl[di].glyph = gl; + return gl; +} + +/* + * return kerning for 2 codepoints, cache the result. + */ +static int +stb_ttc__CodepointsGetKerning( + struct stb_ttc_info *fi, + unsigned int cp1, + unsigned int cp2 ) +{ + unsigned int hash = cp1 + ((cp1 * 100) * cp2); + struct _stb_ttc_kn_bin *b = &fi->kn_bin[hash & (STB_TTC_BINCOUNT - 1)]; + int di = 0; + for (unsigned int gi = 0; gi < b->kn_count; gi++, di++) + if (b->cp_kn[gi].hash == hash && + b->cp_kn[gi].cp1 == cp1 && + b->cp_kn[gi].cp2 == cp2) + return b->cp_kn[gi].kern; + else if (b->cp_kn[gi].hash > hash) + break; + int kern = stbtt_GetCodepointKernAdvance(&fi->font, cp1, cp2); + + if (!(b->kn_count % STB_TTC_PAGESIZE)) + b->cp_kn = realloc(b->cp_kn, + sizeof(b->cp_kn[0]) * (b->kn_count + STB_TTC_PAGESIZE)); + memmove(b->cp_kn + di + 1, b->cp_kn + di, + sizeof(b->cp_kn[0]) * (b->kn_count - di)); + stb_ttc_cp_kern k = { + .hash = hash, + .cp1 = cp1, + .cp2 = cp2, + .kern = kern, + }; + b->kn_count++; + b->cp_kn[di] = k; + return kern; +} + +/* + * returns the index of glyph in the glyph table, or -1 + */ +static int +stb_ttc__ScaledGlyphGetOffset( + struct stb_ttc_info *fi, + unsigned int glyph, + float scale ) +{ + unsigned int intscale = 1.0f / scale * 1000; + unsigned int hash = glyph + (glyph * intscale); + struct _stb_ttc_g_bin *b = &fi->g_bin[hash & (STB_TTC_BINCOUNT - 1)]; + for (unsigned int gi = 0; gi < b->i_count; gi++) + if (b->index[gi].intscale == intscale && + b->index[gi].glyph == glyph) + return b->index[gi].index; + else if (b->index[gi].glyph > glyph) + break; + return -1; +} + +static struct stb_ttc_g * +stb_ttc__ScaledGlyphGetCache( + struct stb_ttc_info *ttc, + unsigned int glyph, + float scale ) +{ + if (glyph == (unsigned int)-1) + return NULL; + int cached_index = stb_ttc__ScaledGlyphGetOffset(ttc, glyph, scale); + if (cached_index != -1) + return &ttc->glyph[cached_index]; + + stb_ttc_g gc = { }; + + gc.glyph = glyph; + gc.intscale = 1.0f / scale * 1000; + gc.scale = scale; + gc.p_x = gc.p_y = -1; // not initialised yet + // we use locals, as we are storing values in shorter types + { + int advance, lsb, x0, y0, x1, y1; + stbtt_GetGlyphHMetrics(&ttc->font, glyph, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&ttc->font, glyph, scale, scale, &x0, &y0, &x1, + &y1); + gc.advance = advance; + gc.lsb = lsb; + gc.x0 = x0; + gc.y0 = y0; + gc.x1 = x1; + gc.y1 = y1; + } + if (!(ttc->g_count % STB_TTC_PAGESIZE)) + ttc->glyph = realloc(ttc->glyph, + sizeof(ttc->glyph[0]) * (ttc->g_count + STB_TTC_PAGESIZE)); + stb_ttc_index gh = { + .intscale = gc.intscale, + .glyph = glyph, + .index = ttc->g_count + }; + ttc->g_count++; + + unsigned int hash = glyph + (glyph * gc.intscale); + struct _stb_ttc_g_bin *b = &ttc->g_bin[hash & (STB_TTC_BINCOUNT - 1)]; + + if (!(b->i_count % STB_TTC_PAGESIZE)) + b->index = realloc(b->index, + sizeof(b->index[0]) * (b->i_count + STB_TTC_PAGESIZE)); + unsigned int di = b->i_count; + for (unsigned int i = 0; i < b->i_count; i++) + if (b->index[i].glyph > glyph) { + di = i; + break; + } + if (b->i_count - di) + memmove(&b->index[di + 1], &b->index[di], + sizeof(b->index[0]) * (b->i_count - di)); + b->index[di] = gh; + b->i_count++; + ttc->glyph[gh.index] = gc; + return &ttc->glyph[gh.index]; +} + +static void +stb_ttc__ScaledGlyphRenderToCache( + struct stb_ttc_info *fi, + struct stb_ttc_g *g ) +{ + int wt = g->x1 - g->x0; + wt = (wt + 3) & ~3; + unsigned int ht = g->y1 - g->y0; + // find the new horizontal position for glyph, "wrap" next line if needed + if (fi->p_line_x + wt > fi->p_stride) { + fi->p_line_x = 0; + fi->p_line_y += fi->p_line_height; + fi->p_line_height = 0; + } + if (ht > fi->p_line_height) + fi->p_line_height = ht; + // reallocate the pixel cache to accommodate more lines, if needed + if (fi->p_line_y + ht > fi->p_height) { + int add = fi->p_line_y + ht - fi->p_height; + fi->pixels = realloc(fi->pixels, (fi->p_height + add) * fi->p_stride); + memset(fi->pixels + (fi->p_height * fi->p_stride), 0xff, + add * fi->p_stride); + fi->p_height += add; + } + g->p_x = fi->p_line_x; + g->p_y = fi->p_line_y; + stbtt_MakeGlyphBitmap(&fi->font, + fi->pixels + (g->p_y * fi->p_stride) + g->p_x, g->x1 - g->x0, + g->y1 - g->y0, fi->p_stride, g->scale, g->scale, g->glyph); + fi->p_line_x += wt; +} + +static void +stb_ttc__GlyphRenderFromCache( + struct stb_ttc_info * fi, + struct stb_ttc_g * g, + unsigned int dx, + unsigned int base_dy, + unsigned char * pixels, + unsigned int p_w, + unsigned int p_h, + unsigned int p_stride) +{ + int _dy = base_dy + g->y0; + int _sy = 0; + + if (_dy >= (int)p_h || dx >= p_w || (int)base_dy + (g->y1 - g->y0) < 0) + return; + unsigned char * src = fi->pixels + (g->p_y * fi->p_stride); + + // skip lines that would be over the top of dst pixels + if (_dy < 0) { + _sy -= _dy; + src += (-_dy) * fi->p_stride; + _dy = 0; + } + unsigned char * dst = pixels + (_dy * p_stride); // beginning of line in pixels + while (_dy < (int)p_h && _sy < (g->y1 - g->y0)) { + int rw = g->x1 - g->x0; // remaining width of glyph line + int line_dx = (int)dx - g->x0; + unsigned char * src_p = src + g->p_x; + // skip what would be before the left border of pixels + if (line_dx < 0) { + src_p += -line_dx; + rw += line_dx; + line_dx = 0; + } + if (line_dx + rw >= (int)p_w) + rw = p_w - line_dx; + unsigned char * dst_p = dst + line_dx; + for (; rw > 0; rw--) { + unsigned short s = *dst_p + *src_p; + unsigned char d = -(s >> 8) | (unsigned char)s; + *dst_p++ = d; + src_p++; + } + dst += p_stride; + src += fi->p_stride; + _dy++; + _sy++; + } +} + +/* + * Preload a range of codepoints into the glyph cache. This doesn't add the + * pixels, it just load the glyph measurement, advance, lsb into the cache + */ +STBTTC_DEF int +stb_ttc_CacheCodepointRange( + struct stb_ttc_info * ttc, + unsigned int cp, + unsigned int count, + float scale ) +{ + int res = 0; + for (unsigned int c = cp; c < cp + count; c++) { + int gl = stb_ttc__CodepointGetGlyph(ttc, c); + if (gl == -1) + continue; + stb_ttc__ScaledGlyphGetCache(ttc, gl, scale); + res++; + } + return res; +} + +static stb_ttc_info * _ttc; +static int +_compare( + const void *a, + const void *b) +{ + stb_ttc_info *ttc = _ttc; + int g1 = *((int*)a), g2 = *((int*)b); + return (((ttc->glyph[g1].y1 - ttc->glyph[g1].y0) * 500) + ttc->glyph[g1].glyph) - + (((ttc->glyph[g2].y1 - ttc->glyph[g2].y0) * 500) + ttc->glyph[g2].glyph); +} + +/* + * This walks the cache for glyphs that haven't been pre-rendered and + * render them in the cache. Also, it attempts to sort the glyphs by height + * into the cache to save a little bit of memory + * Note: This call is optional, the glyph renderer will populate the pixel + * cache lazily on the fly. + */ +STBTTC_DEF int +stb_ttc_RenderAllCachedGlyphs( + struct stb_ttc_info * ttc ) +{ + // go on and sort the glyph indexes by height + int * to_sort = malloc(ttc->g_count * sizeof(int)); + for (int i = 0; i < (int)ttc->g_count; i++) + to_sort[i] = i; + _ttc = ttc; + qsort(to_sort, ttc->g_count, sizeof(int), _compare); + int count = 0; + // now load all the glyph pixels to the pixel cache + for (int i = 0; i < (int)ttc->g_count; i++) { + stb_ttc_g * g = &ttc->glyph[to_sort[i]]; + if (g->p_y == (unsigned short)-1) { + stb_ttc__ScaledGlyphRenderToCache(ttc, &ttc->glyph[to_sort[i]]); + count++; + } + } + free(to_sort); + return count; +} + +// Copyright (c) 2008-2010 Bjoern Hoehrmann +// See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. +#define UTF8_ACCEPT 0 +#define UTF8_REJECT 12 + +static inline unsigned int +stb_ttc__UTF8_Decode( + unsigned int* state, + unsigned int* codep, + unsigned char byte) +{ + static const unsigned char utf8d[] = { + // The first part of the table maps bytes to character classes that + // to reduce the size of the transition table and create bitmasks. + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + + // The second part is a transition table that maps a combination + // of a state of the automaton and a character class to a state. + 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, + 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, + 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, + 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, + 12,36,12,12,12,12,12,12,12,12,12,12, + }; + unsigned int type = utf8d[byte]; + *codep = (*state != UTF8_ACCEPT) ? + (byte & 0x3fu) | (*codep << 6) : + (0xff >> type) & (byte); + *state = utf8d[256 + *state + type]; + return *state; +} + +STBTTC_DEF int +stb_ttc_MeasureText( + struct stb_ttc_info * ttc, + float scale, + const char * text, + stb_ttc_measure *out) +{ + unsigned int state = 0; + int xpos = 0; + unsigned int last = 0; + stb_ttc_measure m = { .ascent = ttc->ascent * scale, + .descent = ttc->descent * scale}; + unsigned int cp = 0; + + for (int ch = 0; text[ch]; ch++) { + if (stb_ttc__UTF8_Decode(&state, &cp, text[ch]) != UTF8_ACCEPT) + continue; + if (last) { + int kern = scale * stb_ttc__CodepointsGetKerning(ttc, last, cp); + xpos += kern; + } + last = cp; + int gl = stb_ttc__CodepointGetGlyph(ttc, cp); + if (gl == -1) + continue; + stb_ttc_g *gc = stb_ttc__ScaledGlyphGetCache(ttc, gl, scale); + if (!gc) + continue; + if (m.glyph_count == 0) + m.x0 = gc->x0; + if (gc->y0 < m.y0) m.y0 = gc->y0; + if (gc->y1 > m.y1) m.y1 = gc->y1; + m.glyph_count++; + xpos += gc->advance; + } + m.x1 = xpos * scale; + if (out) *out = m; + return m.x1 - m.x0; +} + +STBTTC_DEF int +stb_ttc_DrawText( + struct stb_ttc_info * ttc, + float scale, + const char * text, + unsigned int dx, + unsigned int base_dy, + unsigned char * pixels, + unsigned int p_w, + unsigned int p_h, + unsigned int p_stride) +{ + unsigned int state = 0; + int xpos = dx / scale; + unsigned int last = 0; + int glyph_count = 0; + unsigned int cp = 0; + + for (int ch = 0; text[ch]; ch++) { + if (stb_ttc__UTF8_Decode(&state, &cp, text[ch]) != UTF8_ACCEPT) + continue; + if (last) { + int kern = scale * stb_ttc__CodepointsGetKerning(ttc, last, cp); + xpos += kern; + } + glyph_count++; + last = cp; + int gl = stb_ttc__CodepointGetGlyph(ttc, cp); + if (gl == -1) + continue; + stb_ttc_g *gc = stb_ttc__ScaledGlyphGetCache(ttc, gl, scale); + if (!gc) + continue; + // if (glyph_count == 1) + // xpos += -gc->x0 / scale; + if (gc->p_y == (unsigned short) -1) + stb_ttc__ScaledGlyphRenderToCache(ttc, gc); + + int pxpos = gc->x0 + ((xpos + gc->lsb) * scale); + stb_ttc__GlyphRenderFromCache(ttc, gc, pxpos, base_dy, + pixels, p_w, p_h, p_stride); + xpos += gc->advance; + } + return glyph_count; +} + +#include +#include +#include +#include +#include + +STBTTC_DEF int +stb_ttc_MapFont( + struct stb_ttc_info * ttc, + const char * font_file) +{ + int fd = open(font_file, O_RDONLY); + if (fd == -1) + return -1; + struct stat st; + if (fstat(fd, &st) == -1) { + close(fd); + return -1; + } + ttc->font_size = st.st_size; + unsigned char *map = mmap(NULL, ttc->font_size, PROT_READ, MAP_PRIVATE, fd, 0); + close(fd); + if (map == MAP_FAILED) + return -1; + ttc->font_mmap = 1; + ttc->p_stride = 100; // default value; + // this make the code work for both ttf and ttc files + int offset = stbtt_GetFontOffsetForIndex(map, 0); + stbtt_InitFont(&ttc->font, map, offset); + stbtt_GetFontVMetrics(&ttc->font, &ttc->ascent, &ttc->descent, 0); + return 0; +} + +STBTTC_DEF int +stb_ttc_LoadFont( + struct stb_ttc_info * ttc, + const void * font_data, + unsigned int font_size) +{ + ttc->font_size = font_size; + unsigned char *map = (unsigned char *)font_data; + ttc->font_mmap = 0; + ttc->p_stride = 100; // default value; + // this make the code work for both ttf and ttc files + int offset = stbtt_GetFontOffsetForIndex(map, 0); + stbtt_InitFont(&ttc->font, map, offset); + stbtt_GetFontVMetrics(&ttc->font, &ttc->ascent, &ttc->descent, 0); + return 0; +} + +STBTTC_DEF void +stb_ttc_Free( + struct stb_ttc_info * ttc) +{ + for (int i = 0; i < STB_TTC_BINCOUNT; i++) { + free(ttc->cp_bin[i].cp_gl); + free(ttc->kn_bin[i].cp_kn); + free(ttc->g_bin[i].index); + } + free(ttc->pixels); + free(ttc->glyph); + if (ttc->font_mmap) + munmap(ttc->font.data, ttc->font_size); +} +#endif /* STB_TTC_IMPLEMENTATION */ + +#endif /* STB_TTC_H_ */ diff --git a/libmui/mui/xft.c b/libmui/mui/xft.c new file mode 100644 index 0000000..714c85f --- /dev/null +++ b/libmui/mui/xft.c @@ -0,0 +1,2874 @@ +/* + * xft.c + * + * Copyright(c) 2007-2023 Jianjun Jiang <8192542@qq.com> + * Mobile phone: +86-18665388956 + * QQ: 8192542 + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in 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: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the 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 + * AUTHORS 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 IN THE + * SOFTWARE. + * + */ + +#include "xft.h" + +/* + * type + */ +typedef int64_t XCG_FT_Int64; +typedef uint64_t XCG_FT_UInt64; +typedef int32_t XCG_FT_Int32; +typedef uint32_t XCG_FT_UInt32; + +#define XCG_FT_BOOL(x) ((XCG_FT_Bool)(x)) +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +/* + * math + */ +#define XCG_FT_MIN(a, b) ((a) < (b) ? (a) : (b)) +#define XCG_FT_MAX(a, b) ((a) > (b) ? (a) : (b)) +#define XCG_FT_ABS(a) ((a) < 0 ? -(a) : (a)) +#define XCG_FT_HYPOT(x, y) (x = XCG_FT_ABS(x), y = XCG_FT_ABS(y), x > y ? x + (3 * y >> 3) : y + (3 * x >> 3)) +#define XCG_FT_ANGLE_PI (180L << 16) +#define XCG_FT_ANGLE_2PI (XCG_FT_ANGLE_PI * 2) +#define XCG_FT_ANGLE_PI2 (XCG_FT_ANGLE_PI / 2) +#define XCG_FT_ANGLE_PI4 (XCG_FT_ANGLE_PI / 4) + +#define XCG_FT_MSB(x) (31 - __builtin_clz(x)) +#define XCG_FT_PAD_FLOOR(x, n) ((x) & ~((n)-1)) +#define XCG_FT_PAD_ROUND(x, n) XCG_FT_PAD_FLOOR((x) + ((n) / 2), n) +#define XCG_FT_PAD_CEIL(x, n) XCG_FT_PAD_FLOOR((x) + ((n) - 1), n) + +#define XCG_FT_MOVE_SIGN(x, s) \ + do { \ + if(x < 0) { \ + x = -x; \ + s = -s; \ + } \ + } while(0) + +XCG_FT_Long XCG_FT_MulFix(XCG_FT_Long a, XCG_FT_Long b) +{ + XCG_FT_Int s = 1; + XCG_FT_Long c; + + XCG_FT_MOVE_SIGN(a, s); + XCG_FT_MOVE_SIGN(b, s); + c = (XCG_FT_Long)(((XCG_FT_Int64)a * b + 0x8000L) >> 16); + + return (s > 0) ? c : -c; +} + +XCG_FT_Long XCG_FT_MulDiv(XCG_FT_Long a, XCG_FT_Long b, XCG_FT_Long c) +{ + XCG_FT_Int s = 1; + XCG_FT_Long d; + + XCG_FT_MOVE_SIGN(a, s); + XCG_FT_MOVE_SIGN(b, s); + XCG_FT_MOVE_SIGN(c, s); + d = (XCG_FT_Long)(c > 0 ? ((XCG_FT_Int64)a * b + (c >> 1)) / c : 0x7FFFFFFFL); + return (s > 0) ? d : -d; +} + +XCG_FT_Long XCG_FT_DivFix(XCG_FT_Long a, XCG_FT_Long b) +{ + XCG_FT_Int s = 1; + XCG_FT_Long q; + + XCG_FT_MOVE_SIGN(a, s); + XCG_FT_MOVE_SIGN(b, s); + q = (XCG_FT_Long)(b > 0 ? (((XCG_FT_UInt64)a << 16) + (b >> 1)) / b : 0x7FFFFFFFL); + return (s < 0 ? -q : q); +} + +#define XCG_FT_TRIG_SCALE (0xDBD95B16UL) +#define XCG_FT_TRIG_SAFE_MSB (29) +#define XCG_FT_TRIG_MAX_ITERS (23) + +static const XCG_FT_Fixed ft_trig_arctan_table[] = { + 1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L, 14668L, + 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L, 57L, + 29L, 14L, 7L, 4L, 2L, 1L +}; + +static XCG_FT_Fixed ft_trig_downscale(XCG_FT_Fixed val) +{ + XCG_FT_Fixed s; + XCG_FT_Int64 v; + + s = val; + val = XCG_FT_ABS(val); + v = (val * (XCG_FT_Int64)XCG_FT_TRIG_SCALE) + 0x100000000UL; + val = (XCG_FT_Fixed)(v >> 32); + return (s >= 0) ? val : -val; +} + +static XCG_FT_Int ft_trig_prenorm(XCG_FT_Vector *vec) +{ + XCG_FT_Pos x, y; + XCG_FT_Int shift; + + x = vec->x; + y = vec->y; + + shift = XCG_FT_MSB(XCG_FT_ABS(x) | XCG_FT_ABS(y)); + + if(shift <= XCG_FT_TRIG_SAFE_MSB) + { + shift = XCG_FT_TRIG_SAFE_MSB - shift; + vec->x = (XCG_FT_Pos)((XCG_FT_ULong)x << shift); + vec->y = (XCG_FT_Pos)((XCG_FT_ULong)y << shift); + } + else + { + shift -= XCG_FT_TRIG_SAFE_MSB; + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; + } + return shift; +} + +static void ft_trig_pseudo_rotate(XCG_FT_Vector *vec, XCG_FT_Angle theta) +{ + XCG_FT_Int i; + XCG_FT_Fixed x, y, xtemp, b; + const XCG_FT_Fixed *arctanptr; + + x = vec->x; + y = vec->y; + while(theta < -XCG_FT_ANGLE_PI4) + { + xtemp = y; + y = -x; + x = xtemp; + theta += XCG_FT_ANGLE_PI2; + } + while(theta > XCG_FT_ANGLE_PI4) + { + xtemp = -y; + y = x; + x = xtemp; + theta -= XCG_FT_ANGLE_PI2; + } + arctanptr = ft_trig_arctan_table; + for(i = 1, b = 1; i < XCG_FT_TRIG_MAX_ITERS; b <<= 1, i++) + { + XCG_FT_Fixed v1 = ((y + b) >> i); + XCG_FT_Fixed v2 = ((x + b) >> i); + if(theta < 0) + { + xtemp = x + v1; + y = y - v2; + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - v1; + y = y + v2; + x = xtemp; + theta -= *arctanptr++; + } + } + vec->x = x; + vec->y = y; +} + +static void ft_trig_pseudo_polarize(XCG_FT_Vector *vec) +{ + XCG_FT_Angle theta; + XCG_FT_Int i; + XCG_FT_Fixed x, y, xtemp, b; + const XCG_FT_Fixed *arctanptr; + + x = vec->x; + y = vec->y; + if(y > x) + { + if(y > -x) + { + theta = XCG_FT_ANGLE_PI2; + xtemp = y; + y = -x; + x = xtemp; + } + else + { + theta = y > 0 ? XCG_FT_ANGLE_PI : -XCG_FT_ANGLE_PI; + x = -x; + y = -y; + } + } + else + { + if(y < -x) + { + theta = -XCG_FT_ANGLE_PI2; + xtemp = -y; + y = x; + x = xtemp; + } + else + { + theta = 0; + } + } + arctanptr = ft_trig_arctan_table; + for(i = 1, b = 1; i < XCG_FT_TRIG_MAX_ITERS; b <<= 1, i++) + { + XCG_FT_Fixed v1 = ((y + b) >> i); + XCG_FT_Fixed v2 = ((x + b) >> i); + if(y > 0) + { + xtemp = x + v1; + y = y - v2; + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - v1; + y = y + v2; + x = xtemp; + theta -= *arctanptr++; + } + } + if(theta >= 0) + theta = XCG_FT_PAD_ROUND(theta, 32); + else + theta = -XCG_FT_PAD_ROUND(-theta, 32); + vec->x = x; + vec->y = theta; +} + +XCG_FT_Fixed XCG_FT_Cos(XCG_FT_Angle angle) +{ + XCG_FT_Vector v; + + v.x = XCG_FT_TRIG_SCALE >> 8; + v.y = 0; + ft_trig_pseudo_rotate(&v, angle); + return (v.x + 0x80L) >> 8; +} + +XCG_FT_Fixed XCG_FT_Sin(XCG_FT_Angle angle) +{ + return XCG_FT_Cos(XCG_FT_ANGLE_PI2 - angle); +} + +XCG_FT_Fixed XCG_FT_Tan(XCG_FT_Angle angle) +{ + XCG_FT_Vector v; + + v.x = XCG_FT_TRIG_SCALE >> 8; + v.y = 0; + ft_trig_pseudo_rotate(&v, angle); + return XCG_FT_DivFix(v.y, v.x); +} + +XCG_FT_Angle XCG_FT_Atan2(XCG_FT_Fixed dx, XCG_FT_Fixed dy) +{ + XCG_FT_Vector v; + + if(dx == 0 && dy == 0) + return 0; + v.x = dx; + v.y = dy; + ft_trig_prenorm(&v); + ft_trig_pseudo_polarize(&v); + return v.y; +} + +void XCG_FT_Vector_Unit(XCG_FT_Vector *vec, XCG_FT_Angle angle) +{ + vec->x = XCG_FT_TRIG_SCALE >> 8; + vec->y = 0; + ft_trig_pseudo_rotate(vec, angle); + vec->x = (vec->x + 0x80L) >> 8; + vec->y = (vec->y + 0x80L) >> 8; +} + +void XCG_FT_Vector_Rotate(XCG_FT_Vector *vec, XCG_FT_Angle angle) +{ + XCG_FT_Int shift; + XCG_FT_Vector v = *vec; + + if(v.x == 0 && v.y == 0) + return; + shift = ft_trig_prenorm(&v); + ft_trig_pseudo_rotate(&v, angle); + v.x = ft_trig_downscale(v.x); + v.y = ft_trig_downscale(v.y); + + if(shift > 0) + { + XCG_FT_Int32 half = (XCG_FT_Int32)1L << (shift - 1); + + vec->x = (v.x + half - (v.x < 0)) >> shift; + vec->y = (v.y + half - (v.y < 0)) >> shift; + } + else + { + shift = -shift; + vec->x = (XCG_FT_Pos)((XCG_FT_ULong)v.x << shift); + vec->y = (XCG_FT_Pos)((XCG_FT_ULong)v.y << shift); + } +} + +XCG_FT_Fixed XCG_FT_Vector_Length(XCG_FT_Vector *vec) +{ + XCG_FT_Int shift; + XCG_FT_Vector v; + + v = *vec; + if(v.x == 0) + { + return XCG_FT_ABS(v.y); + } + else if(v.y == 0) + { + return XCG_FT_ABS(v.x); + } + + shift = ft_trig_prenorm(&v); + ft_trig_pseudo_polarize(&v); + v.x = ft_trig_downscale(v.x); + if(shift > 0) + return (v.x + (1 << (shift - 1))) >> shift; + + return (XCG_FT_Fixed)((XCG_FT_UInt32)v.x << -shift); +} + +void XCG_FT_Vector_Polarize(XCG_FT_Vector *vec, XCG_FT_Fixed *length, XCG_FT_Angle *angle) +{ + XCG_FT_Int shift; + XCG_FT_Vector v; + + v = *vec; + if(v.x == 0 && v.y == 0) + return; + shift = ft_trig_prenorm(&v); + ft_trig_pseudo_polarize(&v); + v.x = ft_trig_downscale(v.x); + + *length = (shift >= 0) ? (v.x >> shift) : (XCG_FT_Fixed)((XCG_FT_UInt32)v.x << -shift); + *angle = v.y; +} + +void XCG_FT_Vector_From_Polar(XCG_FT_Vector *vec, XCG_FT_Fixed length, XCG_FT_Angle angle) +{ + vec->x = length; + vec->y = 0; + + XCG_FT_Vector_Rotate(vec, angle); +} + +XCG_FT_Angle XCG_FT_Angle_Diff(XCG_FT_Angle angle1, XCG_FT_Angle angle2) +{ + XCG_FT_Angle delta = angle2 - angle1; + + while(delta <= -XCG_FT_ANGLE_PI) + delta += XCG_FT_ANGLE_2PI; + + while(delta > XCG_FT_ANGLE_PI) + delta -= XCG_FT_ANGLE_2PI; + + return delta; +} + +/* + * raster + */ +typedef long TCoord; +typedef long TPos; +typedef long TArea; +typedef ptrdiff_t XCG_FT_PtrDist; + +#define xcg_ft_setjmp setjmp +#define xcg_ft_longjmp longjmp +#define xcg_ft_jmp_buf jmp_buf + +#define ErrRaster_Invalid_Mode -2 +#define ErrRaster_Invalid_Outline -1 +#define ErrRaster_Invalid_Argument -3 +#define ErrRaster_Memory_Overflow -4 +#define ErrRaster_OutOfMemory -6 + +#define XCG_FT_MINIMUM_POOL_SIZE 8192 +#define XCG_FT_MAX_GRAY_SPANS 256 + +#define RAS_ARG PWorker worker +#define RAS_ARG_ PWorker worker, +#define RAS_VAR worker +#define RAS_VAR_ worker, +#define ras (*worker) + +#define PIXEL_BITS 8 +#define ONE_PIXEL (1L << PIXEL_BITS) +#define TRUNC(x) (TCoord)((x) >> PIXEL_BITS) +#define FRACT(x) (TCoord)((x) & (ONE_PIXEL - 1)) +#if PIXEL_BITS >= 6 +#define UPSCALE(x) ((x) * (ONE_PIXEL >> 6)) +#define DOWNSCALE(x) ((x) >> (PIXEL_BITS - 6)) +#else +#define UPSCALE(x) ((x) >> (6 - PIXEL_BITS)) +#define DOWNSCALE(x) ((x) * (64 >> PIXEL_BITS)) +#endif + +#define XCG_FT_DIV_MOD(type, dividend, divisor, quotient, remainder) \ + do { \ + (quotient) = (type)((dividend) / (divisor)); \ + (remainder) = (type)((dividend) % (divisor)); \ + if((remainder) < 0) \ + { \ + (quotient)--; \ + (remainder) += (type)(divisor); \ + } \ + } while(0) + +typedef struct TCell_ * PCell; +typedef struct TCell_ { + int x; + int cover; + TArea area; + PCell next; +} TCell; + +typedef struct TWorker_ { + TCoord ex, ey; + TPos min_ex, max_ex; + TPos min_ey, max_ey; + TPos count_ex, count_ey; + TArea area; + int cover; + int invalid; + PCell cells; + XCG_FT_PtrDist max_cells; + XCG_FT_PtrDist num_cells; + TPos x, y; + XCG_FT_Outline outline; + XCG_FT_BBox clip_box; + XCG_FT_Span gray_spans[XCG_FT_MAX_GRAY_SPANS]; + int num_gray_spans; + int skip_spans; + XCG_FT_Raster_Span_Func render_span; + void *render_span_data; + int band_size; + int band_shoot; + xcg_ft_jmp_buf jump_buffer; + void *buffer; + long buffer_size; + PCell *ycells; + TPos ycount; +} TWorker, *PWorker; + +static void gray_init_cells(RAS_ARG_ void* buffer, long byte_size) +{ + ras.buffer = buffer; + ras.buffer_size = byte_size; + ras.ycells = (PCell*)buffer; + ras.cells = NULL; + ras.max_cells = 0; + ras.num_cells = 0; + ras.area = 0; + ras.cover = 0; + ras.invalid = 1; +} + +static void gray_compute_cbox( RAS_ARG) +{ + XCG_FT_Outline *outline = &ras.outline; + XCG_FT_Vector *vec = outline->points; + XCG_FT_Vector *limit = vec + outline->n_points; + + if(outline->n_points <= 0) + { + ras.min_ex = ras.max_ex = 0; + ras.min_ey = ras.max_ey = 0; + return; + } + ras.min_ex = ras.max_ex = vec->x; + ras.min_ey = ras.max_ey = vec->y; + vec++; + for(; vec < limit; vec++) + { + TPos x = vec->x; + TPos y = vec->y; + if(x < ras.min_ex) + ras.min_ex = x; + if(x > ras.max_ex) + ras.max_ex = x; + if(y < ras.min_ey) + ras.min_ey = y; + if(y > ras.max_ey) + ras.max_ey = y; + } + ras.min_ex = ras.min_ex >> 6; + ras.min_ey = ras.min_ey >> 6; + ras.max_ex = (ras.max_ex + 63) >> 6; + ras.max_ey = (ras.max_ey + 63) >> 6; +} + +static PCell gray_find_cell(RAS_ARG) +{ + PCell *pcell, cell; + TPos x = ras.ex; + + if(x > ras.count_ex) + x = ras.count_ex; + pcell = &ras.ycells[ras.ey]; + for(;;) + { + cell = *pcell; + if(cell == NULL || cell->x > x) + break; + if(cell->x == x) + goto Exit; + pcell = &cell->next; + } + if(ras.num_cells >= ras.max_cells) + xcg_ft_longjmp(ras.jump_buffer, 1); + cell = ras.cells + ras.num_cells++; + cell->x = x; + cell->area = 0; + cell->cover = 0; + cell->next = *pcell; + *pcell = cell; +Exit: + return cell; +} + +static void gray_record_cell( RAS_ARG) +{ + if( ras.area | ras.cover) + { + PCell cell = gray_find_cell( RAS_VAR); + cell->area += ras.area; + cell->cover += ras.cover; + } +} + +static void gray_set_cell( RAS_ARG_ TCoord ex, TCoord ey) +{ + ey -= ras.min_ey; + if(ex > ras.max_ex) + ex = ras.max_ex; + ex -= ras.min_ex; + if(ex < 0) + ex = -1; + if(ex != ras.ex || ey != ras.ey) + { + if(!ras.invalid) + gray_record_cell( RAS_VAR); + ras.area = 0; + ras.cover = 0; + ras.ex = ex; + ras.ey = ey; + } + ras.invalid = ((unsigned int)ey >= (unsigned int)ras.count_ey || ex >= ras.count_ex); +} + +static void gray_start_cell( RAS_ARG_ TCoord ex, TCoord ey) +{ + if(ex > ras.max_ex) + ex = (TCoord)( ras.max_ex); + if(ex < ras.min_ex) + ex = (TCoord)( ras.min_ex - 1); + ras.area = 0; + ras.cover = 0; + ras.ex = ex - ras.min_ex; + ras.ey = ey - ras.min_ey; + ras.invalid = 0; + gray_set_cell( RAS_VAR_ ex, ey); +} + +static void gray_render_scanline( RAS_ARG_ TCoord ey, TPos x1, TCoord y1, TPos x2, TCoord y2) +{ + TCoord ex1, ex2, fx1, fx2, first, dy, delta, mod; + TPos p, dx; + int incr; + + ex1 = TRUNC(x1); + ex2 = TRUNC(x2); + if(y1 == y2) + { + gray_set_cell( RAS_VAR_ ex2, ey); + return; + } + fx1 = FRACT(x1); + fx2 = FRACT(x2); + if(ex1 == ex2) + goto End; + dx = x2 - x1; + dy = y2 - y1; + if(dx > 0) + { + p = ( ONE_PIXEL - fx1) * dy; + first = ONE_PIXEL; + incr = 1; + } + else + { + p = fx1 * dy; + first = 0; + incr = -1; + dx = -dx; + } + XCG_FT_DIV_MOD(TCoord, p, dx, delta, mod); + ras.area += (TArea)(fx1 + first) * delta; + ras.cover += delta; + y1 += delta; + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey); + if(ex1 != ex2) + { + TCoord lift, rem; + p = ONE_PIXEL * dy; + XCG_FT_DIV_MOD(TCoord, p, dx, lift, rem); + do { + delta = lift; + mod += rem; + if(mod >= (TCoord)dx) + { + mod -= (TCoord)dx; + delta++; + } + ras.area += (TArea)( ONE_PIXEL * delta); + ras.cover += delta; + y1 += delta; + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey); + } while(ex1 != ex2); + } + fx1 = ONE_PIXEL - first; +End: + dy = y2 - y1; + ras.area += (TArea)((fx1 + fx2) * dy); + ras.cover += dy; +} + +static void gray_render_line( RAS_ARG_ TPos to_x, TPos to_y) +{ + TCoord ey1, ey2, fy1, fy2, first, delta, mod; + TPos p, dx, dy, x, x2; + int incr; + + ey1 = TRUNC(ras.y); + ey2 = TRUNC(to_y); + if((ey1 >= ras.max_ey && ey2 >= ras.max_ey) || (ey1 < ras.min_ey && ey2 < ras.min_ey)) + goto End; + fy1 = FRACT(ras.y); + fy2 = FRACT(to_y); + if(ey1 == ey2) + { + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2); + goto End; + } + dx = to_x - ras.x; + dy = to_y - ras.y; + if(dx == 0) + { + TCoord ex = TRUNC(ras.x); + TCoord two_fx = FRACT( ras.x ) << 1; + TPos area, max_ey1; + + if(dy > 0) + { + first = ONE_PIXEL; + } + else + { + first = 0; + } + delta = first - fy1; + ras.area += (TArea)two_fx * delta; + ras.cover += delta; + delta = first + first - ONE_PIXEL; + area = (TArea)two_fx * delta; + max_ey1 = ras.count_ey + ras.min_ey; + if(dy < 0) + { + if(ey1 > max_ey1) + { + ey1 = (max_ey1 > ey2) ? max_ey1 : ey2; + gray_set_cell(&ras, ex, ey1); + } + else + { + ey1--; + gray_set_cell(&ras, ex, ey1); + } + while(ey1 > ey2 && ey1 >= ras.min_ey) + { + ras.area += area; + ras.cover += delta; + ey1--; + + gray_set_cell(&ras, ex, ey1); + } + if(ey1 != ey2) + { + ey1 = ey2; + gray_set_cell(&ras, ex, ey1); + } + } + else + { + if(ey1 < ras.min_ey) + { + ey1 = (ras.min_ey < ey2) ? ras.min_ey : ey2; + gray_set_cell(&ras, ex, ey1); + } + else + { + ey1++; + gray_set_cell(&ras, ex, ey1); + } + while(ey1 < ey2 && ey1 < max_ey1) + { + ras.area += area; + ras.cover += delta; + ey1++; + + gray_set_cell(&ras, ex, ey1); + } + if(ey1 != ey2) + { + ey1 = ey2; + gray_set_cell(&ras, ex, ey1); + } + } + delta = (int)(fy2 - ONE_PIXEL + first); + ras.area += (TArea)two_fx * delta; + ras.cover += delta; + goto End; + } + if(dy > 0) + { + p = ( ONE_PIXEL - fy1) * dx; + first = ONE_PIXEL; + incr = 1; + } + else + { + p = fy1 * dx; + first = 0; + incr = -1; + dy = -dy; + } + XCG_FT_DIV_MOD(TCoord, p, dy, delta, mod); + x = ras.x + delta; + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first); + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1); + if(ey1 != ey2) + { + TCoord lift, rem; + p = ONE_PIXEL * dx; + XCG_FT_DIV_MOD(TCoord, p, dy, lift, rem); + do { + delta = lift; + mod += rem; + if(mod >= (TCoord)dy) + { + mod -= (TCoord)dy; + delta++; + } + x2 = x + delta; + gray_render_scanline( RAS_VAR_ ey1, x, ONE_PIXEL - first, x2, first); + x = x2; + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1); + } while(ey1 != ey2); + } + gray_render_scanline( RAS_VAR_ ey1, x, ONE_PIXEL - first, to_x, fy2); +End: + ras.x = to_x; + ras.y = to_y; +} + +static void gray_split_conic(XCG_FT_Vector * base) +{ + TPos a, b; + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = (base[2].x + b) / 2; + b = base[1].x = (base[0].x + b) / 2; + base[2].x = (a + b) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = (base[2].y + b) / 2; + b = base[1].y = (base[0].y + b) / 2; + base[2].y = (a + b) / 2; +} + +static void gray_render_conic( RAS_ARG_ const XCG_FT_Vector * control, const XCG_FT_Vector * to) +{ + XCG_FT_Vector bez_stack[16 * 2 + 1]; + XCG_FT_Vector *arc = bez_stack; + TPos dx, dy; + int draw, split; + + arc[0].x = UPSCALE(to->x); + arc[0].y = UPSCALE(to->y); + arc[1].x = UPSCALE(control->x); + arc[1].y = UPSCALE(control->y); + arc[2].x = ras.x; + arc[2].y = ras.y; + + if(( TRUNC( arc[0].y ) >= ras.max_ey && + TRUNC( arc[1].y ) >= ras.max_ey && + TRUNC( arc[2].y ) >= ras.max_ey) || ( TRUNC( arc[0].y ) < ras.min_ey && + TRUNC( arc[1].y ) < ras.min_ey && + TRUNC( arc[2].y ) < ras.min_ey)) + { + ras.x = arc[0].x; + ras.y = arc[0].y; + return; + } + dx = XCG_FT_ABS(arc[2].x + arc[0].x - 2 * arc[1].x); + dy = XCG_FT_ABS(arc[2].y + arc[0].y - 2 * arc[1].y); + if(dx < dy) + dx = dy; + draw = 1; + while(dx > ONE_PIXEL / 4) + { + dx >>= 2; + draw <<= 1; + } + do { + split = 1; + while((draw & split) == 0) + { + gray_split_conic(arc); + arc += 2; + split <<= 1; + } + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y); + arc -= 2; + } while(--draw); +} + +static void gray_split_cubic(XCG_FT_Vector * base) +{ + TPos a, b, c, d; + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = (base[0].x + c) / 2; + base[5].x = b = (base[3].x + d) / 2; + c = (c + d) / 2; + base[2].x = a = (a + c) / 2; + base[4].x = b = (b + c) / 2; + base[3].x = (a + b) / 2; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = (base[0].y + c) / 2; + base[5].y = b = (base[3].y + d) / 2; + c = (c + d) / 2; + base[2].y = a = (a + c) / 2; + base[4].y = b = (b + c) / 2; + base[3].y = (a + b) / 2; +} + +static void gray_render_cubic(RAS_ARG_ const XCG_FT_Vector * control1, const XCG_FT_Vector * control2, const XCG_FT_Vector * to) +{ + XCG_FT_Vector bez_stack[16 * 3 + 1]; + XCG_FT_Vector * arc = bez_stack; + TPos dx, dy, dx_, dy_; + TPos dx1, dy1, dx2, dy2; + TPos L, s, s_limit; + + arc[0].x = UPSCALE(to->x); + arc[0].y = UPSCALE(to->y); + arc[1].x = UPSCALE(control2->x); + arc[1].y = UPSCALE(control2->y); + arc[2].x = UPSCALE(control1->x); + arc[2].y = UPSCALE(control1->y); + arc[3].x = ras.x; + arc[3].y = ras.y; + + if(( TRUNC( arc[0].y ) >= ras.max_ey && + TRUNC( arc[1].y ) >= ras.max_ey && + TRUNC( arc[2].y ) >= ras.max_ey && + TRUNC( arc[3].y ) >= ras.max_ey) || ( TRUNC( arc[0].y ) < ras.min_ey && + TRUNC( arc[1].y ) < ras.min_ey && + TRUNC( arc[2].y ) < ras.min_ey && + TRUNC( arc[3].y ) < ras.min_ey)) + { + ras.x = arc[0].x; + ras.y = arc[0].y; + return; + } + for(;;) + { + dx = dx_ = arc[3].x - arc[0].x; + dy = dy_ = arc[3].y - arc[0].y; + L = XCG_FT_HYPOT(dx_, dy_); + if(L >= (1 << 23)) + goto Split; + s_limit = L * (TPos)( ONE_PIXEL / 6); + dx1 = arc[1].x - arc[0].x; + dy1 = arc[1].y - arc[0].y; + s = XCG_FT_ABS(dy * dx1 - dx * dy1); + if(s > s_limit) + goto Split; + dx2 = arc[2].x - arc[0].x; + dy2 = arc[2].y - arc[0].y; + s = XCG_FT_ABS(dy * dx2 - dx * dy2); + if(s > s_limit) + goto Split; + if(dx1 * (dx1 - dx) + dy1 * (dy1 - dy) > 0 || dx2 * (dx2 - dx) + dy2 * (dy2 - dy) > 0) + goto Split; + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y); + if(arc == bez_stack) + return; + arc -= 3; + continue; +Split: + gray_split_cubic(arc); + arc += 3; + } +} + +static int gray_move_to(const XCG_FT_Vector *to, PWorker worker) +{ + TPos x, y; + + if(!ras.invalid) + gray_record_cell(worker); + x = UPSCALE(to->x); + y = UPSCALE(to->y); + gray_start_cell(worker, TRUNC(x), TRUNC(y)); + ras.x = x; + ras.y = y; + return 0; +} + +static void gray_hline( RAS_ARG_ TCoord x, TCoord y, TPos area, int acount) +{ + int coverage; + + coverage = (int)(area >> ( PIXEL_BITS * 2 + 1 - 8)); + if(coverage < 0) + coverage = -coverage; + if( ras.outline.flags & XCG_FT_OUTLINE_EVEN_ODD_FILL) + { + coverage &= 511; + if(coverage > 256) + coverage = 512 - coverage; + else if(coverage == 256) + coverage = 255; + } + else + { + if(coverage >= 256) + coverage = 255; + } + y += (TCoord)ras.min_ey; + x += (TCoord)ras.min_ex; + if(x >= (1 << 23)) + x = (1 << 23) - 1; + if(y >= (1 << 23)) + y = (1 << 23) - 1; + if(coverage) + { + XCG_FT_Span *span; + int count; + int skip; + count = ras.num_gray_spans; + span = ras.gray_spans + count - 1; + if(count > 0 && span->y == y && span->x + span->len == x && span->coverage == coverage) + { + span->len = span->len + acount; + return; + } + if(count >= XCG_FT_MAX_GRAY_SPANS) + { + if( ras.render_span && count > ras.skip_spans) + { + skip = ras.skip_spans > 0 ? ras.skip_spans : 0; + ras.render_span( ras.num_gray_spans - skip, + ras.gray_spans + skip, + ras.render_span_data); + } + ras.skip_spans -= ras.num_gray_spans; + ras.num_gray_spans = 0; + span = ras.gray_spans; + } + else + span++; + span->x = x; + span->len = acount; + span->y = y; + span->coverage = (unsigned char)coverage; + ras.num_gray_spans++; + } +} + +static void gray_sweep(RAS_ARG) +{ + int yindex; + + if( ras.num_cells == 0) + return; + for(yindex = 0; yindex < ras.ycount; yindex++) + { + PCell cell = ras.ycells[yindex]; + TCoord cover = 0; + TCoord x = 0; + + for(; cell != NULL; cell = cell->next) + { + TArea area; + if(cell->x > x && cover != 0) + gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2), cell->x - x); + cover += cell->cover; + area = cover * ( ONE_PIXEL * 2) - cell->area; + if(area != 0 && cell->x >= 0) + gray_hline( RAS_VAR_ cell->x, yindex, area, 1); + x = cell->x + 1; + } + if( ras.count_ex > x && cover != 0) + gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2), ras.count_ex - x); + } +} + +static int XCG_FT_Outline_Decompose(const XCG_FT_Outline * outline, void * user) +{ +#undef SCALED +#define SCALED( x ) (x) + XCG_FT_Vector v_last; + XCG_FT_Vector v_control; + XCG_FT_Vector v_start; + XCG_FT_Vector * point; + XCG_FT_Vector * limit; + char * tags; + int n; + int first; + int error; + char tag; + + if(!outline) + return ErrRaster_Invalid_Outline; + first = 0; + for(n = 0; n < outline->n_contours; n++) + { + int last; + last = outline->contours[n]; + if(last < 0) + goto Invalid_Outline; + limit = outline->points + last; + v_start = outline->points[first]; + v_start.x = SCALED(v_start.x); + v_start.y = SCALED(v_start.y); + v_last = outline->points[last]; + v_last.x = SCALED(v_last.x); + v_last.y = SCALED(v_last.y); + v_control = v_start; + point = outline->points + first; + tags = outline->tags + first; + tag = XCG_FT_CURVE_TAG(tags[0]); + if(tag == XCG_FT_CURVE_TAG_CUBIC) + goto Invalid_Outline; + if(tag == XCG_FT_CURVE_TAG_CONIC) + { + if( XCG_FT_CURVE_TAG( outline->tags[last] ) == XCG_FT_CURVE_TAG_ON) + { + v_start = v_last; + limit--; + } + else + { + v_start.x = (v_start.x + v_last.x) / 2; + v_start.y = (v_start.y + v_last.y) / 2; + v_last = v_start; + } + point--; + tags--; + } + error = gray_move_to(&v_start, user); + if(error) + goto Exit; + while(point < limit) + { + point++; + tags++; + tag = XCG_FT_CURVE_TAG(tags[0]); + switch(tag) + { + case XCG_FT_CURVE_TAG_ON: + { + XCG_FT_Vector vec; + vec.x = SCALED(point->x); + vec.y = SCALED(point->y); + gray_render_line(user, UPSCALE(vec.x), UPSCALE(vec.y)); + continue; + } + case XCG_FT_CURVE_TAG_CONIC: + { + v_control.x = SCALED(point->x); + v_control.y = SCALED(point->y); +Do_Conic: + if(point < limit) + { + XCG_FT_Vector vec; + XCG_FT_Vector v_middle; + point++; + tags++; + tag = XCG_FT_CURVE_TAG(tags[0]); + vec.x = SCALED(point->x); + vec.y = SCALED(point->y); + if(tag == XCG_FT_CURVE_TAG_ON) + { + gray_render_conic(user, &v_control, &vec); + continue; + } + if(tag != XCG_FT_CURVE_TAG_CONIC) + goto Invalid_Outline; + v_middle.x = (v_control.x + vec.x) / 2; + v_middle.y = (v_control.y + vec.y) / 2; + gray_render_conic(user, &v_control, &v_middle); + v_control = vec; + goto Do_Conic; + } + gray_render_conic(user, &v_control, &v_start); + goto Close; + } + default: + { + XCG_FT_Vector vec1, vec2; + if(point + 1 > limit || + XCG_FT_CURVE_TAG( tags[1] ) != XCG_FT_CURVE_TAG_CUBIC) + goto Invalid_Outline; + point += 2; + tags += 2; + vec1.x = SCALED(point[-2].x); + vec1.y = SCALED(point[-2].y); + vec2.x = SCALED(point[-1].x); + vec2.y = SCALED(point[-1].y); + if(point <= limit) + { + XCG_FT_Vector vec; + vec.x = SCALED(point->x); + vec.y = SCALED(point->y); + gray_render_cubic(user, &vec1, &vec2, &vec); + continue; + } + gray_render_cubic(user, &vec1, &vec2, &v_start); + goto Close; + } + } + } + gray_render_line(user, UPSCALE(v_start.x), UPSCALE(v_start.y)); +Close: + first = last + 1; + } + return 0; +Exit: + return error; +Invalid_Outline: + return ErrRaster_Invalid_Outline; +} + +typedef struct TBand_ { + TPos min, max; +} TBand; + +static int gray_convert_glyph_inner(RAS_ARG) +{ + volatile int error = 0; + + if( xcg_ft_setjmp( ras.jump_buffer) == 0) + { + error = XCG_FT_Outline_Decompose(&ras.outline, &ras); + if(!ras.invalid) + gray_record_cell( RAS_VAR); + } + else + { + error = ErrRaster_Memory_Overflow; + } + return error; +} + +static int gray_convert_glyph(RAS_ARG) +{ + TBand bands[40]; + TBand *volatile band; + int volatile n, num_bands; + TPos volatile min, max, max_y; + XCG_FT_BBox *clip; + int skip; + + ras.num_gray_spans = 0; + gray_compute_cbox( RAS_VAR); + clip = &ras.clip_box; + if( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax || ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax) + return 0; + if( ras.min_ex < clip->xMin) + ras.min_ex = clip->xMin; + if( ras.min_ey < clip->yMin) + ras.min_ey = clip->yMin; + if( ras.max_ex > clip->xMax) + ras.max_ex = clip->xMax; + if( ras.max_ey > clip->yMax) + ras.max_ey = clip->yMax; + ras.count_ex = ras.max_ex - ras.min_ex; + ras.count_ey = ras.max_ey - ras.min_ey; + num_bands = (int)(( ras.max_ey - ras.min_ey) / ras.band_size); + if(num_bands == 0) + num_bands = 1; + if(num_bands >= 39) + num_bands = 39; + ras.band_shoot = 0; + min = ras.min_ey; + max_y = ras.max_ey; + for(n = 0; n < num_bands; n++, min = max) + { + max = min + ras.band_size; + if(n == num_bands - 1 || max > max_y) + max = max_y; + bands[0].min = min; + bands[0].max = max; + band = bands; + while(band >= bands) + { + TPos bottom, top, middle; + int error; + { + PCell cells_max; + int yindex; + int cell_start, cell_end, cell_mod; + ras.ycells = (PCell*)ras.buffer; + ras.ycount = band->max - band->min; + cell_start = sizeof(PCell) * ras.ycount; + cell_mod = cell_start % sizeof(TCell); + if(cell_mod > 0) + cell_start += sizeof(TCell) - cell_mod; + cell_end = ras.buffer_size; + cell_end -= cell_end % sizeof(TCell); + cells_max = (PCell)((char*)ras.buffer + cell_end); + ras.cells = (PCell)((char*)ras.buffer + cell_start); + if( ras.cells >= cells_max) + goto ReduceBands; + ras.max_cells = (int)(cells_max - ras.cells); + if( ras.max_cells < 2) + goto ReduceBands; + for(yindex = 0; yindex < ras.ycount; yindex++) + ras.ycells[yindex] = NULL; + } + ras.num_cells = 0; + ras.invalid = 1; + ras.min_ey = band->min; + ras.max_ey = band->max; + ras.count_ey = band->max - band->min; + error = gray_convert_glyph_inner( RAS_VAR); + if(!error) + { + gray_sweep( RAS_VAR); + band--; + continue; + } + else if(error != ErrRaster_Memory_Overflow) + return 1; +ReduceBands: + bottom = band->min; + top = band->max; + middle = bottom + ((top - bottom) >> 1); + if(middle == bottom) + { + return ErrRaster_OutOfMemory; + } + if(bottom - top >= ras.band_size) + ras.band_shoot++; + band[1].min = bottom; + band[1].max = middle; + band[0].min = middle; + band[0].max = top; + band++; + } + } + if( ras.render_span && ras.num_gray_spans > ras.skip_spans) + { + skip = ras.skip_spans > 0 ? ras.skip_spans : 0; + ras.render_span( ras.num_gray_spans - skip, + ras.gray_spans + skip, + ras.render_span_data); + } + ras.skip_spans -= ras.num_gray_spans; + if( ras.band_shoot > 8 && ras.band_size > 16) + ras.band_size = ras.band_size / 2; + return 0; +} + +static int gray_raster_render(RAS_ARG_ void * buffer, long buffer_size, const XCG_FT_Raster_Params * params) +{ + const XCG_FT_Outline *outline = (const XCG_FT_Outline*)params->source; + if(outline == NULL) + return ErrRaster_Invalid_Outline; + if(outline->n_points == 0 || outline->n_contours <= 0) + return 0; + if(!outline->contours || !outline->points) + return ErrRaster_Invalid_Outline; + if(outline->n_points != outline->contours[outline->n_contours - 1] + 1) + return ErrRaster_Invalid_Outline; + if(!(params->flags & XCG_FT_RASTER_FLAG_AA)) + return ErrRaster_Invalid_Mode; + if(!(params->flags & XCG_FT_RASTER_FLAG_DIRECT)) + return ErrRaster_Invalid_Mode; + if(params->flags & XCG_FT_RASTER_FLAG_CLIP) + { + ras.clip_box = params->clip_box; + } + else + { + ras.clip_box.xMin = -(1 << 23); + ras.clip_box.yMin = -(1 << 23); + ras.clip_box.xMax = (1 << 23) - 1; + ras.clip_box.yMax = (1 << 23) - 1; + } + gray_init_cells( RAS_VAR_ buffer, buffer_size); + ras.outline = *outline; + ras.num_cells = 0; + ras.invalid = 1; + ras.band_size = (int)(buffer_size / (long)(sizeof(TCell) * 8)); + ras.render_span = (XCG_FT_Raster_Span_Func)params->gray_spans; + ras.render_span_data = params->user; + return gray_convert_glyph( RAS_VAR); +} + +void XCG_FT_Raster_Render(const XCG_FT_Raster_Params * params) +{ + char stack[XCG_FT_MINIMUM_POOL_SIZE]; + size_t length = XCG_FT_MINIMUM_POOL_SIZE; + + TWorker worker; + worker.skip_spans = 0; + int rendered_spans = 0; + int error = gray_raster_render(&worker, stack, length, params); + while(error == ErrRaster_OutOfMemory) + { + if(worker.skip_spans < 0) + rendered_spans += -worker.skip_spans; + worker.skip_spans = rendered_spans; + length *= 2; + void *heap = malloc(length); + error = gray_raster_render(&worker, heap, length, params); + free(heap); + } +} + +/* + * stroker + */ +#define XCG_FT_SMALL_CONIC_THRESHOLD (XCG_FT_ANGLE_PI / 6) +#define XCG_FT_SMALL_CUBIC_THRESHOLD (XCG_FT_ANGLE_PI / 8) +#define XCG_FT_IS_SMALL(x) ((x) > -2 && (x) < 2) + +static XCG_FT_Pos ft_pos_abs(XCG_FT_Pos x) +{ + return x >= 0 ? x : -x; +} + +static void ft_conic_split(XCG_FT_Vector *base) +{ + XCG_FT_Pos a, b; + + base[4].x = base[2].x; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + base[3].x = b >> 1; + base[2].x = (a + b) >> 2; + base[1].x = a >> 1; + + base[4].y = base[2].y; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + base[3].y = b >> 1; + base[2].y = (a + b) >> 2; + base[1].y = a >> 1; +} + +static XCG_FT_Bool ft_conic_is_small_enough(XCG_FT_Vector *base, XCG_FT_Angle *angle_in, XCG_FT_Angle *angle_out) +{ + XCG_FT_Vector d1, d2; + XCG_FT_Angle theta; + XCG_FT_Int close1, close2; + + d1.x = base[1].x - base[2].x; + d1.y = base[1].y - base[2].y; + d2.x = base[0].x - base[1].x; + d2.y = base[0].y - base[1].y; + close1 = XCG_FT_IS_SMALL(d1.x) && XCG_FT_IS_SMALL(d1.y); + close2 = XCG_FT_IS_SMALL(d2.x) && XCG_FT_IS_SMALL(d2.y); + if(close1) + { + if(close2) + { + } + else + { + *angle_in = *angle_out = XCG_FT_Atan2(d2.x, d2.y); + } + } + else + { + if(close2) + { + *angle_in = *angle_out = XCG_FT_Atan2(d1.x, d1.y); + } + else + { + *angle_in = XCG_FT_Atan2(d1.x, d1.y); + *angle_out = XCG_FT_Atan2(d2.x, d2.y); + } + } + theta = ft_pos_abs(XCG_FT_Angle_Diff(*angle_in, *angle_out)); + return XCG_FT_BOOL(theta < XCG_FT_SMALL_CONIC_THRESHOLD); +} + +static void ft_cubic_split(XCG_FT_Vector * base) +{ + XCG_FT_Pos a, b, c; + + base[6].x = base[3].x; + a = base[0].x + base[1].x; + b = base[1].x + base[2].x; + c = base[2].x + base[3].x; + base[5].x = c >> 1; + c += b; + base[4].x = c >> 2; + base[1].x = a >> 1; + a += b; + base[2].x = a >> 2; + base[3].x = (a + c) >> 3; + + base[6].y = base[3].y; + a = base[0].y + base[1].y; + b = base[1].y + base[2].y; + c = base[2].y + base[3].y; + base[5].y = c >> 1; + c += b; + base[4].y = c >> 2; + base[1].y = a >> 1; + a += b; + base[2].y = a >> 2; + base[3].y = (a + c) >> 3; +} + +static XCG_FT_Angle ft_angle_mean(XCG_FT_Angle angle1, XCG_FT_Angle angle2) +{ + return angle1 + XCG_FT_Angle_Diff(angle1, angle2) / 2; +} + +static XCG_FT_Bool ft_cubic_is_small_enough(XCG_FT_Vector *base, XCG_FT_Angle *angle_in, XCG_FT_Angle *angle_mid, XCG_FT_Angle *angle_out) +{ + XCG_FT_Vector d1, d2, d3; + XCG_FT_Angle theta1, theta2; + XCG_FT_Int close1, close2, close3; + + d1.x = base[2].x - base[3].x; + d1.y = base[2].y - base[3].y; + d2.x = base[1].x - base[2].x; + d2.y = base[1].y - base[2].y; + d3.x = base[0].x - base[1].x; + d3.y = base[0].y - base[1].y; + close1 = XCG_FT_IS_SMALL(d1.x) && XCG_FT_IS_SMALL(d1.y); + close2 = XCG_FT_IS_SMALL(d2.x) && XCG_FT_IS_SMALL(d2.y); + close3 = XCG_FT_IS_SMALL(d3.x) && XCG_FT_IS_SMALL(d3.y); + + if(close1) + { + if(close2) + { + if(close3) + { + } + else + { + *angle_in = *angle_mid = *angle_out = XCG_FT_Atan2(d3.x, d3.y); + } + } + else + { + if(close3) + { + *angle_in = *angle_mid = *angle_out = XCG_FT_Atan2(d2.x, d2.y); + } + else + { + *angle_in = *angle_mid = XCG_FT_Atan2(d2.x, d2.y); + *angle_out = XCG_FT_Atan2(d3.x, d3.y); + } + } + } + else + { + if(close2) + { + if(close3) + { + *angle_in = *angle_mid = *angle_out = XCG_FT_Atan2(d1.x, d1.y); + } + else + { + *angle_in = XCG_FT_Atan2(d1.x, d1.y); + *angle_out = XCG_FT_Atan2(d3.x, d3.y); + *angle_mid = ft_angle_mean(*angle_in, *angle_out); + } + } + else + { + if(close3) + { + *angle_in = XCG_FT_Atan2(d1.x, d1.y); + *angle_mid = *angle_out = XCG_FT_Atan2(d2.x, d2.y); + } + else + { + *angle_in = XCG_FT_Atan2(d1.x, d1.y); + *angle_mid = XCG_FT_Atan2(d2.x, d2.y); + *angle_out = XCG_FT_Atan2(d3.x, d3.y); + } + } + } + theta1 = ft_pos_abs(XCG_FT_Angle_Diff(*angle_in, *angle_mid)); + theta2 = ft_pos_abs(XCG_FT_Angle_Diff(*angle_mid, *angle_out)); + return XCG_FT_BOOL(theta1 < XCG_FT_SMALL_CUBIC_THRESHOLD && theta2 < XCG_FT_SMALL_CUBIC_THRESHOLD); +} + +typedef enum XCG_FT_StrokeTags_ { + XCG_FT_STROKE_TAG_ON = 1, + XCG_FT_STROKE_TAG_CUBIC = 2, + XCG_FT_STROKE_TAG_BEGIN = 4, + XCG_FT_STROKE_TAG_END = 8, +} XCG_FT_StrokeTags; + +#define XCG_FT_STROKE_TAG_BEGIN_END (XCG_FT_STROKE_TAG_BEGIN | XCG_FT_STROKE_TAG_END) + +typedef struct XCG_FT_StrokeBorderRec_ { + XCG_FT_UInt num_points; + XCG_FT_UInt max_points; + XCG_FT_Vector * points; + XCG_FT_Byte * tags; + XCG_FT_Bool movable; + XCG_FT_Int start; + XCG_FT_Bool valid; +} XCG_FT_StrokeBorderRec, *XCG_FT_StrokeBorder; + +XCG_FT_Error XCG_FT_Outline_Check(XCG_FT_Outline * outline) +{ + if(outline) + { + XCG_FT_Int n_points = outline->n_points; + XCG_FT_Int n_contours = outline->n_contours; + XCG_FT_Int end0, end; + XCG_FT_Int n; + + if(n_points == 0 && n_contours == 0) + return 0; + if(n_points <= 0 || n_contours <= 0) + goto Bad; + end0 = end = -1; + for(n = 0; n < n_contours; n++) + { + end = outline->contours[n]; + if(end <= end0 || end >= n_points) + goto Bad; + end0 = end; + } + if(end != n_points - 1) + goto Bad; + return 0; + } +Bad: + return -1; +} + +void XCG_FT_Outline_Get_CBox(const XCG_FT_Outline * outline, XCG_FT_BBox * acbox) +{ + XCG_FT_Pos xMin, yMin, xMax, yMax; + + if(outline && acbox) + { + if(outline->n_points == 0) + { + xMin = 0; + yMin = 0; + xMax = 0; + yMax = 0; + } + else + { + XCG_FT_Vector *vec = outline->points; + XCG_FT_Vector *limit = vec + outline->n_points; + xMin = xMax = vec->x; + yMin = yMax = vec->y; + vec++; + for(; vec < limit; vec++) + { + XCG_FT_Pos x, y; + x = vec->x; + if(x < xMin) + xMin = x; + if(x > xMax) + xMax = x; + y = vec->y; + if(y < yMin) + yMin = y; + if(y > yMax) + yMax = y; + } + } + acbox->xMin = xMin; + acbox->xMax = xMax; + acbox->yMin = yMin; + acbox->yMax = yMax; + } +} + +static XCG_FT_Error ft_stroke_border_grow(XCG_FT_StrokeBorder border, XCG_FT_UInt new_points) +{ + XCG_FT_UInt old_max = border->max_points; + XCG_FT_UInt new_max = border->num_points + new_points; + XCG_FT_Error error = 0; + + if(new_max > old_max) + { + XCG_FT_UInt cur_max = old_max; + while(cur_max < new_max) + cur_max += (cur_max >> 1) + 16; + border->points = (XCG_FT_Vector*)realloc(border->points, cur_max * sizeof(XCG_FT_Vector)); + border->tags = (XCG_FT_Byte*)realloc(border->tags, cur_max * sizeof(XCG_FT_Byte)); + if(!border->points || !border->tags) + goto Exit; + border->max_points = cur_max; + } +Exit: + return error; +} + +static void ft_stroke_border_close(XCG_FT_StrokeBorder border, XCG_FT_Bool reverse) +{ + XCG_FT_UInt start = border->start; + XCG_FT_UInt count = border->num_points; + + if(count <= start + 1U) + border->num_points = start; + else + { + border->num_points = --count; + border->points[start] = border->points[count]; + border->tags[start] = border->tags[count]; + if(reverse) + { + { + XCG_FT_Vector *vec1 = border->points + start + 1; + XCG_FT_Vector *vec2 = border->points + count - 1; + for(; vec1 < vec2; vec1++, vec2--) + { + XCG_FT_Vector tmp; + tmp = *vec1; + *vec1 = *vec2; + *vec2 = tmp; + } + } + { + XCG_FT_Byte *tag1 = border->tags + start + 1; + XCG_FT_Byte *tag2 = border->tags + count - 1; + + for(; tag1 < tag2; tag1++, tag2--) + { + XCG_FT_Byte tmp; + tmp = *tag1; + *tag1 = *tag2; + *tag2 = tmp; + } + } + } + border->tags[start] |= XCG_FT_STROKE_TAG_BEGIN; + border->tags[count - 1] |= XCG_FT_STROKE_TAG_END; + } + border->start = -1; + border->movable = FALSE; +} + +static XCG_FT_Error ft_stroke_border_lineto(XCG_FT_StrokeBorder border, XCG_FT_Vector * to, XCG_FT_Bool movable) +{ + XCG_FT_Error error = 0; + + if(border->movable) + { + border->points[border->num_points - 1] = *to; + } + else + { + if(border->num_points > 0&& + XCG_FT_IS_SMALL(border->points[border->num_points - 1].x - to->x) && + XCG_FT_IS_SMALL(border->points[border->num_points - 1].y - to->y)) + return error; + error = ft_stroke_border_grow(border, 1); + if(!error) + { + XCG_FT_Vector *vec = border->points + border->num_points; + XCG_FT_Byte *tag = border->tags + border->num_points; + vec[0] = *to; + tag[0] = XCG_FT_STROKE_TAG_ON; + border->num_points += 1; + } + } + border->movable = movable; + return error; +} + +static XCG_FT_Error ft_stroke_border_conicto(XCG_FT_StrokeBorder border, XCG_FT_Vector * control, XCG_FT_Vector * to) +{ + XCG_FT_Error error; + + error = ft_stroke_border_grow(border, 2); + if(!error) + { + XCG_FT_Vector *vec = border->points + border->num_points; + XCG_FT_Byte *tag = border->tags + border->num_points; + + vec[0] = *control; + vec[1] = *to; + tag[0] = 0; + tag[1] = XCG_FT_STROKE_TAG_ON; + border->num_points += 2; + } + border->movable = FALSE; + return error; +} + +static XCG_FT_Error ft_stroke_border_cubicto(XCG_FT_StrokeBorder border, XCG_FT_Vector * control1, XCG_FT_Vector * control2, XCG_FT_Vector * to) +{ + XCG_FT_Error error; + + error = ft_stroke_border_grow(border, 3); + if(!error) + { + XCG_FT_Vector *vec = border->points + border->num_points; + XCG_FT_Byte *tag = border->tags + border->num_points; + + vec[0] = *control1; + vec[1] = *control2; + vec[2] = *to; + tag[0] = XCG_FT_STROKE_TAG_CUBIC; + tag[1] = XCG_FT_STROKE_TAG_CUBIC; + tag[2] = XCG_FT_STROKE_TAG_ON; + border->num_points += 3; + } + border->movable = FALSE; + return error; +} + +#define XCG_FT_ARC_CUBIC_ANGLE (XCG_FT_ANGLE_PI / 2) + +static XCG_FT_Error ft_stroke_border_arcto(XCG_FT_StrokeBorder border, XCG_FT_Vector *center, XCG_FT_Fixed radius, XCG_FT_Angle angle_start, XCG_FT_Angle angle_diff) +{ + XCG_FT_Fixed coef; + XCG_FT_Vector a0, a1, a2, a3; + XCG_FT_Int i, arcs = 1; + XCG_FT_Error error = 0; + + while(angle_diff > XCG_FT_ARC_CUBIC_ANGLE * arcs || -angle_diff > XCG_FT_ARC_CUBIC_ANGLE * arcs) + arcs++; + coef = XCG_FT_Tan(angle_diff / (4 * arcs)); + coef += coef / 3; + XCG_FT_Vector_From_Polar(&a0, radius, angle_start); + a1.x = XCG_FT_MulFix(-a0.y, coef); + a1.y = XCG_FT_MulFix(a0.x, coef); + a0.x += center->x; + a0.y += center->y; + a1.x += a0.x; + a1.y += a0.y; + for(i = 1; i <= arcs; i++) + { + XCG_FT_Vector_From_Polar(&a3, radius, angle_start + i * angle_diff / arcs); + a2.x = XCG_FT_MulFix(a3.y, coef); + a2.y = XCG_FT_MulFix(-a3.x, coef); + a3.x += center->x; + a3.y += center->y; + a2.x += a3.x; + a2.y += a3.y; + error = ft_stroke_border_cubicto(border, &a1, &a2, &a3); + if(error) + break; + a1.x = a3.x - a2.x + a3.x; + a1.y = a3.y - a2.y + a3.y; + } + return error; +} + +static XCG_FT_Error ft_stroke_border_moveto(XCG_FT_StrokeBorder border, XCG_FT_Vector * to) +{ + if(border->start >= 0) + ft_stroke_border_close(border, FALSE); + border->start = border->num_points; + border->movable = FALSE; + return ft_stroke_border_lineto(border, to, FALSE); +} + +static void ft_stroke_border_init(XCG_FT_StrokeBorder border) +{ + border->points = NULL; + border->tags = NULL; + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; +} + +static void ft_stroke_border_reset(XCG_FT_StrokeBorder border) +{ + border->num_points = 0; + border->start = -1; + border->valid = FALSE; +} + +static void ft_stroke_border_done(XCG_FT_StrokeBorder border) +{ + free(border->points); + free(border->tags); + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; +} + +static XCG_FT_Error ft_stroke_border_get_counts(XCG_FT_StrokeBorder border, XCG_FT_UInt * anum_points, XCG_FT_UInt * anum_contours) +{ + XCG_FT_Error error = 0; + XCG_FT_UInt num_points = 0; + XCG_FT_UInt num_contours = 0; + XCG_FT_UInt count = border->num_points; + XCG_FT_Vector *point = border->points; + XCG_FT_Byte *tags = border->tags; + XCG_FT_Int in_contour = 0; + + for(; count > 0; count--, num_points++, point++, tags++) + { + if(tags[0] & XCG_FT_STROKE_TAG_BEGIN) + { + if(in_contour != 0) + goto Fail; + in_contour = 1; + } + else if(in_contour == 0) + goto Fail; + if(tags[0] & XCG_FT_STROKE_TAG_END) + { + in_contour = 0; + num_contours++; + } + } + if(in_contour != 0) + goto Fail; + border->valid = TRUE; +Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; +Fail: + num_points = 0; + num_contours = 0; + goto Exit; +} + +static void ft_stroke_border_export(XCG_FT_StrokeBorder border, XCG_FT_Outline * outline) +{ + if(outline->points != NULL && border->points != NULL) + memcpy(outline->points + outline->n_points, border->points, border->num_points * sizeof(XCG_FT_Vector)); + if(outline->tags) + { + XCG_FT_UInt count = border->num_points; + XCG_FT_Byte *read = border->tags; + XCG_FT_Byte *write = (XCG_FT_Byte*)outline->tags + outline->n_points; + for(; count > 0; count--, read++, write++) + { + if(*read & XCG_FT_STROKE_TAG_ON) + *write = XCG_FT_CURVE_TAG_ON; + else if(*read & XCG_FT_STROKE_TAG_CUBIC) + *write = XCG_FT_CURVE_TAG_CUBIC; + else + *write = XCG_FT_CURVE_TAG_CONIC; + } + } + if(outline->contours) + { + XCG_FT_UInt count = border->num_points; + XCG_FT_Byte *tags = border->tags; + XCG_FT_Int *write = outline->contours + outline->n_contours; + XCG_FT_Int idx = (XCG_FT_Int)outline->n_points; + for(; count > 0; count--, tags++, idx++) + { + if(*tags & XCG_FT_STROKE_TAG_END) + { + *write++ = idx; + outline->n_contours++; + } + } + } + outline->n_points = (int)(outline->n_points + border->num_points); + XCG_FT_Outline_Check(outline); +} + +#define XCG_FT_SIDE_TO_ROTATE(s) (XCG_FT_ANGLE_PI2 - (s) * XCG_FT_ANGLE_PI) + +typedef struct XCG_FT_StrokerRec_ { + XCG_FT_Angle angle_in; + XCG_FT_Angle angle_out; + XCG_FT_Vector center; + XCG_FT_Fixed line_length; + XCG_FT_Bool first_point; + XCG_FT_Bool subpath_open; + XCG_FT_Angle subpath_angle; + XCG_FT_Vector subpath_start; + XCG_FT_Fixed subpath_line_length; + XCG_FT_Bool handle_wide_strokes; + XCG_FT_Stroker_LineCap line_cap; + XCG_FT_Stroker_LineJoin line_join; + XCG_FT_Stroker_LineJoin line_join_saved; + XCG_FT_Fixed miter_limit; + XCG_FT_Fixed radius; + XCG_FT_StrokeBorderRec borders[2]; +} XCG_FT_StrokerRec; + +XCG_FT_Error XCG_FT_Stroker_New(XCG_FT_Stroker * astroker) +{ + XCG_FT_Error error = 0; + XCG_FT_Stroker stroker = NULL; + stroker = (XCG_FT_StrokerRec*)calloc(1, sizeof(XCG_FT_StrokerRec)); + if(stroker) + { + ft_stroke_border_init(&stroker->borders[0]); + ft_stroke_border_init(&stroker->borders[1]); + } + *astroker = stroker; + return error; +} + +void XCG_FT_Stroker_Rewind(XCG_FT_Stroker stroker) +{ + if(stroker) + { + ft_stroke_border_reset(&stroker->borders[0]); + ft_stroke_border_reset(&stroker->borders[1]); + } +} + +void XCG_FT_Stroker_Set(XCG_FT_Stroker stroker, XCG_FT_Fixed radius, XCG_FT_Stroker_LineCap line_cap, XCG_FT_Stroker_LineJoin line_join, XCG_FT_Fixed miter_limit) +{ + stroker->radius = radius; + stroker->line_cap = line_cap; + stroker->line_join = line_join; + stroker->miter_limit = miter_limit; + if(stroker->miter_limit < 0x10000) + stroker->miter_limit = 0x10000; + stroker->line_join_saved = line_join; + XCG_FT_Stroker_Rewind(stroker); +} + +void XCG_FT_Stroker_Done(XCG_FT_Stroker stroker) +{ + if(stroker) + { + ft_stroke_border_done(&stroker->borders[0]); + ft_stroke_border_done(&stroker->borders[1]); + free(stroker); + } +} + +static XCG_FT_Error ft_stroker_arcto(XCG_FT_Stroker stroker, XCG_FT_Int side) +{ + XCG_FT_Angle total, rotate; + XCG_FT_Fixed radius = stroker->radius; + XCG_FT_Error error = 0; + XCG_FT_StrokeBorder border = stroker->borders + side; + + rotate = XCG_FT_SIDE_TO_ROTATE(side); + total = XCG_FT_Angle_Diff(stroker->angle_in, stroker->angle_out); + if(total == XCG_FT_ANGLE_PI) + total = -rotate * 2; + error = ft_stroke_border_arcto(border, &stroker->center, radius, stroker->angle_in + rotate, total); + border->movable = FALSE; + return error; +} + +static XCG_FT_Error ft_stroker_cap(XCG_FT_Stroker stroker, XCG_FT_Angle angle, XCG_FT_Int side) +{ + XCG_FT_Error error = 0; + + if(stroker->line_cap == XCG_FT_STROKER_LINECAP_ROUND) + { + stroker->angle_in = angle; + stroker->angle_out = angle + XCG_FT_ANGLE_PI; + error = ft_stroker_arcto(stroker, side); + } + else + { + XCG_FT_Vector middle, delta; + XCG_FT_Fixed radius = stroker->radius; + XCG_FT_StrokeBorder border = stroker->borders + side; + XCG_FT_Vector_From_Polar(&middle, radius, angle); + delta.x = side ? middle.y : -middle.y; + delta.y = side ? -middle.x : middle.x; + if(stroker->line_cap == XCG_FT_STROKER_LINECAP_SQUARE) + { + middle.x += stroker->center.x; + middle.y += stroker->center.y; + } + else + { + middle.x = stroker->center.x; + middle.y = stroker->center.y; + } + delta.x += middle.x; + delta.y += middle.y; + error = ft_stroke_border_lineto(border, &delta, FALSE); + if(error) + goto Exit; + delta.x = middle.x - delta.x + middle.x; + delta.y = middle.y - delta.y + middle.y; + error = ft_stroke_border_lineto(border, &delta, FALSE); + } +Exit: + return error; +} + +static XCG_FT_Error ft_stroker_inside(XCG_FT_Stroker stroker, XCG_FT_Int side, XCG_FT_Fixed line_length) +{ + XCG_FT_StrokeBorder border = stroker->borders + side; + XCG_FT_Angle phi, theta, rotate; + XCG_FT_Fixed length; + XCG_FT_Vector sigma = { 0, 0 }; + XCG_FT_Vector delta; + XCG_FT_Error error = 0; + XCG_FT_Bool intersect; + + rotate = XCG_FT_SIDE_TO_ROTATE(side); + theta = XCG_FT_Angle_Diff(stroker->angle_in, stroker->angle_out) / 2; + if(!border->movable || line_length == 0 || theta > 0x59C000 || theta < -0x59C000) + intersect = FALSE; + else + { + XCG_FT_Fixed min_length; + XCG_FT_Vector_Unit(&sigma, theta); + min_length = ft_pos_abs(XCG_FT_MulDiv(stroker->radius, sigma.y, sigma.x)); + intersect = XCG_FT_BOOL(min_length && stroker->line_length >= min_length && line_length >= min_length); + } + if(!intersect) + { + XCG_FT_Vector_From_Polar(&delta, stroker->radius, stroker->angle_out + rotate); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + border->movable = FALSE; + } + else + { + phi = stroker->angle_in + theta + rotate; + length = XCG_FT_DivFix(stroker->radius, sigma.x); + XCG_FT_Vector_From_Polar(&delta, length, phi); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + } + error = ft_stroke_border_lineto(border, &delta, FALSE); + return error; +} + +static XCG_FT_Error ft_stroker_outside(XCG_FT_Stroker stroker, XCG_FT_Int side, XCG_FT_Fixed line_length) +{ + XCG_FT_StrokeBorder border = stroker->borders + side; + XCG_FT_Error error; + XCG_FT_Angle rotate; + + if(stroker->line_join == XCG_FT_STROKER_LINEJOIN_ROUND) + error = ft_stroker_arcto(stroker, side); + else + { + XCG_FT_Fixed radius = stroker->radius; + XCG_FT_Vector sigma = { 0, 0 }; + XCG_FT_Angle theta = 0, phi = 0; + XCG_FT_Bool bevel, fixed_bevel; + + rotate = XCG_FT_SIDE_TO_ROTATE(side); + bevel = XCG_FT_BOOL(stroker->line_join == XCG_FT_STROKER_LINEJOIN_BEVEL); + fixed_bevel = XCG_FT_BOOL(stroker->line_join != XCG_FT_STROKER_LINEJOIN_MITER_VARIABLE); + +if(!bevel) + { + theta = XCG_FT_Angle_Diff(stroker->angle_in, stroker->angle_out) / 2; + if(theta == XCG_FT_ANGLE_PI2) + theta = -rotate; + phi = stroker->angle_in + theta + rotate; + XCG_FT_Vector_From_Polar(&sigma, stroker->miter_limit, theta); + if(sigma.x < 0x10000L) + { + if(fixed_bevel || ft_pos_abs(theta) > 57) + bevel = TRUE; + } + } + if(bevel) + { + if(fixed_bevel) + { + XCG_FT_Vector delta; + XCG_FT_Vector_From_Polar(&delta, radius, stroker->angle_out + rotate); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + border->movable = FALSE; + error = ft_stroke_border_lineto(border, &delta, FALSE); + } + else + { + XCG_FT_Vector middle, delta; + XCG_FT_Fixed coef; + + XCG_FT_Vector_From_Polar(&middle, XCG_FT_MulFix(radius, stroker->miter_limit), phi); + coef = XCG_FT_DivFix(0x10000L - sigma.x, sigma.y); + delta.x = XCG_FT_MulFix(middle.y, coef); + delta.y = XCG_FT_MulFix(-middle.x, coef); + middle.x += stroker->center.x; + middle.y += stroker->center.y; + delta.x += middle.x; + delta.y += middle.y; + error = ft_stroke_border_lineto(border, &delta, FALSE); + if(error) + goto Exit; + delta.x = middle.x - delta.x + middle.x; + delta.y = middle.y - delta.y + middle.y; + error = ft_stroke_border_lineto(border, &delta, FALSE); + if(error) + goto Exit; + if(line_length == 0) + { + XCG_FT_Vector_From_Polar(&delta, radius, stroker->angle_out + rotate); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + error = ft_stroke_border_lineto(border, &delta, FALSE); + } + } + } + else + { + XCG_FT_Fixed length; + XCG_FT_Vector delta; + length = XCG_FT_MulDiv(stroker->radius, stroker->miter_limit, sigma.x); + XCG_FT_Vector_From_Polar(&delta, length, phi); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + error = ft_stroke_border_lineto(border, &delta, FALSE); + if(error) + goto Exit; + if(line_length == 0) + { + XCG_FT_Vector_From_Polar(&delta, stroker->radius, stroker->angle_out + rotate); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + error = ft_stroke_border_lineto(border, &delta, FALSE); + } + } + } +Exit: + return error; +} + +static XCG_FT_Error ft_stroker_process_corner(XCG_FT_Stroker stroker, XCG_FT_Fixed line_length) +{ + XCG_FT_Error error = 0; + XCG_FT_Angle turn; + XCG_FT_Int inside_side; + + turn = XCG_FT_Angle_Diff(stroker->angle_in, stroker->angle_out); + if(turn == 0) + goto Exit; + inside_side = 0; + if(turn < 0) + inside_side = 1; + error = ft_stroker_inside(stroker, inside_side, line_length); + if(error) + goto Exit; + error = ft_stroker_outside(stroker, 1 - inside_side, line_length); +Exit: + return error; +} + +static XCG_FT_Error ft_stroker_subpath_start(XCG_FT_Stroker stroker, XCG_FT_Angle start_angle, XCG_FT_Fixed line_length) +{ + XCG_FT_Vector delta; + XCG_FT_Vector point; + XCG_FT_Error error; + XCG_FT_StrokeBorder border; + + XCG_FT_Vector_From_Polar(&delta, stroker->radius, start_angle + XCG_FT_ANGLE_PI2); + point.x = stroker->center.x + delta.x; + point.y = stroker->center.y + delta.y; + border = stroker->borders; + error = ft_stroke_border_moveto(border, &point); + if(error) + goto Exit; + point.x = stroker->center.x - delta.x; + point.y = stroker->center.y - delta.y; + border++; + error = ft_stroke_border_moveto(border, &point); + stroker->subpath_angle = start_angle; + stroker->first_point = FALSE; + stroker->subpath_line_length = line_length; +Exit: + return error; +} + +XCG_FT_Error XCG_FT_Stroker_LineTo(XCG_FT_Stroker stroker, XCG_FT_Vector * to) +{ + XCG_FT_Error error = 0; + XCG_FT_StrokeBorder border; + XCG_FT_Vector delta; + XCG_FT_Angle angle; + XCG_FT_Int side; + XCG_FT_Fixed line_length; + + delta.x = to->x - stroker->center.x; + delta.y = to->y - stroker->center.y; + if(delta.x == 0 && delta.y == 0) + goto Exit; + line_length = XCG_FT_Vector_Length(&delta); + angle = XCG_FT_Atan2(delta.x, delta.y); + XCG_FT_Vector_From_Polar(&delta, stroker->radius, angle + XCG_FT_ANGLE_PI2); + if(stroker->first_point) + { + error = ft_stroker_subpath_start(stroker, angle, line_length); + if(error) + goto Exit; + } + else + { + stroker->angle_out = angle; + error = ft_stroker_process_corner(stroker, line_length); + if(error) + goto Exit; + } + for(border = stroker->borders, side = 1; side >= 0; side--, border++) + { + XCG_FT_Vector point; + point.x = to->x + delta.x; + point.y = to->y + delta.y; + error = ft_stroke_border_lineto(border, &point, TRUE); + if(error) + goto Exit; + delta.x = -delta.x; + delta.y = -delta.y; + } + stroker->angle_in = angle; + stroker->center = *to; + stroker->line_length = line_length; +Exit: + return error; +} + +XCG_FT_Error XCG_FT_Stroker_ConicTo(XCG_FT_Stroker stroker, XCG_FT_Vector * control, XCG_FT_Vector * to) +{ + XCG_FT_Error error = 0; + XCG_FT_Vector bez_stack[34]; + XCG_FT_Vector *arc; + XCG_FT_Vector *limit = bez_stack + 30; + XCG_FT_Bool first_arc = TRUE; + + if(XCG_FT_IS_SMALL(stroker->center.x - control->x) && + XCG_FT_IS_SMALL(stroker->center.y - control->y) && + XCG_FT_IS_SMALL(control->x - to->x) && + XCG_FT_IS_SMALL(control->y - to->y)) + { + stroker->center = *to; + goto Exit; + } + arc = bez_stack; + arc[0] = *to; + arc[1] = *control; + arc[2] = stroker->center; + while(arc >= bez_stack) + { + XCG_FT_Angle angle_in, angle_out; + angle_in = angle_out = stroker->angle_in; + if(arc < limit && !ft_conic_is_small_enough(arc, &angle_in, &angle_out)) + { + if(stroker->first_point) + stroker->angle_in = angle_in; + ft_conic_split(arc); + arc += 2; + continue; + } + if(first_arc) + { + first_arc = FALSE; + if(stroker->first_point) + error = ft_stroker_subpath_start(stroker, angle_in, 0); + else + { + stroker->angle_out = angle_in; + error = ft_stroker_process_corner(stroker, 0); + } + } + else if(ft_pos_abs(XCG_FT_Angle_Diff(stroker->angle_in, angle_in)) > XCG_FT_SMALL_CONIC_THRESHOLD / 4) + { + stroker->center = arc[2]; + stroker->angle_out = angle_in; + stroker->line_join = XCG_FT_STROKER_LINEJOIN_ROUND; + error = ft_stroker_process_corner(stroker, 0); + stroker->line_join = stroker->line_join_saved; + } + if(error) + goto Exit; + { + XCG_FT_Vector ctrl, end; + XCG_FT_Angle theta, phi, rotate, alpha0 = 0; + XCG_FT_Fixed length; + XCG_FT_StrokeBorder border; + XCG_FT_Int side; + + theta = XCG_FT_Angle_Diff(angle_in, angle_out) / 2; + phi = angle_in + theta; + length = XCG_FT_DivFix(stroker->radius, XCG_FT_Cos(theta)); + if(stroker->handle_wide_strokes) + alpha0 = XCG_FT_Atan2(arc[0].x - arc[2].x, arc[0].y - arc[2].y); + for(border = stroker->borders, side = 0; side <= 1; side++, border++) + { + rotate = XCG_FT_SIDE_TO_ROTATE(side); + XCG_FT_Vector_From_Polar(&ctrl, length, phi + rotate); + ctrl.x += arc[1].x; + ctrl.y += arc[1].y; + XCG_FT_Vector_From_Polar(&end, stroker->radius, angle_out + rotate); + end.x += arc[0].x; + end.y += arc[0].y; + + if(stroker->handle_wide_strokes) + { + XCG_FT_Vector start; + XCG_FT_Angle alpha1; + + start = border->points[border->num_points - 1]; + alpha1 = XCG_FT_Atan2(end.x - start.x, end.y - start.y); + if(ft_pos_abs(XCG_FT_Angle_Diff(alpha0, alpha1)) > + XCG_FT_ANGLE_PI / 2) + { + XCG_FT_Angle beta, gamma; + XCG_FT_Vector bvec, delta; + XCG_FT_Fixed blen, sinA, sinB, alen; + + beta = XCG_FT_Atan2(arc[2].x - start.x, arc[2].y - start.y); + gamma = XCG_FT_Atan2(arc[0].x - end.x, arc[0].y - end.y); + + bvec.x = end.x - start.x; + bvec.y = end.y - start.y; + blen = XCG_FT_Vector_Length(&bvec); + sinA = ft_pos_abs(XCG_FT_Sin(alpha1 - gamma)); + sinB = ft_pos_abs(XCG_FT_Sin(beta - gamma)); + alen = XCG_FT_MulDiv(blen, sinA, sinB); + XCG_FT_Vector_From_Polar(&delta, alen, beta); + delta.x += start.x; + delta.y += start.y; + border->movable = FALSE; + error = ft_stroke_border_lineto(border, &delta, FALSE); + if(error) + goto Exit; + error = ft_stroke_border_lineto(border, &end, FALSE); + if(error) + goto Exit; + error = ft_stroke_border_conicto(border, &ctrl, &start); + if(error) + goto Exit; + error = ft_stroke_border_lineto(border, &end, FALSE); + if(error) + goto Exit; + continue; + } + } + error = ft_stroke_border_conicto(border, &ctrl, &end); + if(error) + goto Exit; + } + } + arc -= 2; + stroker->angle_in = angle_out; + } + stroker->center = *to; + stroker->line_length = 0; +Exit: + return error; +} + +XCG_FT_Error XCG_FT_Stroker_CubicTo(XCG_FT_Stroker stroker, XCG_FT_Vector *control1, XCG_FT_Vector *control2, XCG_FT_Vector *to) +{ + XCG_FT_Error error = 0; + XCG_FT_Vector bez_stack[37]; + XCG_FT_Vector *arc; + XCG_FT_Vector *limit = bez_stack + 32; + XCG_FT_Bool first_arc = TRUE; + + if(XCG_FT_IS_SMALL(stroker->center.x - control1->x) && + XCG_FT_IS_SMALL(stroker->center.y - control1->y) && + XCG_FT_IS_SMALL(control1->x - control2->x) && + XCG_FT_IS_SMALL(control1->y - control2->y) && + XCG_FT_IS_SMALL(control2->x - to->x) && + XCG_FT_IS_SMALL(control2->y - to->y)) + { + stroker->center = *to; + goto Exit; + } + arc = bez_stack; + arc[0] = *to; + arc[1] = *control2; + arc[2] = *control1; + arc[3] = stroker->center; + while(arc >= bez_stack) + { + XCG_FT_Angle angle_in, angle_mid, angle_out; + angle_in = angle_out = angle_mid = stroker->angle_in; + if(arc < limit && !ft_cubic_is_small_enough(arc, &angle_in, &angle_mid, &angle_out)) + { + if(stroker->first_point) + stroker->angle_in = angle_in; + ft_cubic_split(arc); + arc += 3; + continue; + } + if(first_arc) + { + first_arc = FALSE; + if(stroker->first_point) + error = ft_stroker_subpath_start(stroker, angle_in, 0); + else + { + stroker->angle_out = angle_in; + error = ft_stroker_process_corner(stroker, 0); + } + } + else if(ft_pos_abs(XCG_FT_Angle_Diff(stroker->angle_in, angle_in)) > XCG_FT_SMALL_CUBIC_THRESHOLD / 4) + { + stroker->center = arc[3]; + stroker->angle_out = angle_in; + stroker->line_join = XCG_FT_STROKER_LINEJOIN_ROUND; + error = ft_stroker_process_corner(stroker, 0); + stroker->line_join = stroker->line_join_saved; + } + if(error) + goto Exit; + { + XCG_FT_Vector ctrl1, ctrl2, end; + XCG_FT_Angle theta1, phi1, theta2, phi2, rotate, alpha0 = 0; + XCG_FT_Fixed length1, length2; + XCG_FT_StrokeBorder border; + XCG_FT_Int side; + + theta1 = XCG_FT_Angle_Diff(angle_in, angle_mid) / 2; + theta2 = XCG_FT_Angle_Diff(angle_mid, angle_out) / 2; + phi1 = ft_angle_mean(angle_in, angle_mid); + phi2 = ft_angle_mean(angle_mid, angle_out); + length1 = XCG_FT_DivFix(stroker->radius, XCG_FT_Cos(theta1)); + length2 = XCG_FT_DivFix(stroker->radius, XCG_FT_Cos(theta2)); + if(stroker->handle_wide_strokes) + alpha0 = XCG_FT_Atan2(arc[0].x - arc[3].x, arc[0].y - arc[3].y); + for(border = stroker->borders, side = 0; side <= 1; side++, border++) + { + rotate = XCG_FT_SIDE_TO_ROTATE(side); + XCG_FT_Vector_From_Polar(&ctrl1, length1, phi1 + rotate); + ctrl1.x += arc[2].x; + ctrl1.y += arc[2].y; + XCG_FT_Vector_From_Polar(&ctrl2, length2, phi2 + rotate); + ctrl2.x += arc[1].x; + ctrl2.y += arc[1].y; + XCG_FT_Vector_From_Polar(&end, stroker->radius, angle_out + rotate); + end.x += arc[0].x; + end.y += arc[0].y; + if(stroker->handle_wide_strokes) + { + XCG_FT_Vector start; + XCG_FT_Angle alpha1; + start = border->points[border->num_points - 1]; + alpha1 = XCG_FT_Atan2(end.x - start.x, end.y - start.y); + if(ft_pos_abs(XCG_FT_Angle_Diff(alpha0, alpha1)) > + XCG_FT_ANGLE_PI / 2) + { + XCG_FT_Angle beta, gamma; + XCG_FT_Vector bvec, delta; + XCG_FT_Fixed blen, sinA, sinB, alen; + beta = XCG_FT_Atan2(arc[3].x - start.x, arc[3].y - start.y); + gamma = XCG_FT_Atan2(arc[0].x - end.x, arc[0].y - end.y); + bvec.x = end.x - start.x; + bvec.y = end.y - start.y; + blen = XCG_FT_Vector_Length(&bvec); + sinA = ft_pos_abs(XCG_FT_Sin(alpha1 - gamma)); + sinB = ft_pos_abs(XCG_FT_Sin(beta - gamma)); + alen = XCG_FT_MulDiv(blen, sinA, sinB); + XCG_FT_Vector_From_Polar(&delta, alen, beta); + delta.x += start.x; + delta.y += start.y; + border->movable = FALSE; + error = ft_stroke_border_lineto(border, &delta, FALSE); + if(error) + goto Exit; + error = ft_stroke_border_lineto(border, &end, FALSE); + if(error) + goto Exit; + error = ft_stroke_border_cubicto(border, &ctrl2, &ctrl1, &start); + if(error) + goto Exit; + error = ft_stroke_border_lineto(border, &end, FALSE); + if(error) + goto Exit; + continue; + } + } + error = ft_stroke_border_cubicto(border, &ctrl1, &ctrl2, &end); + if(error) + goto Exit; + } + } + arc -= 3; + stroker->angle_in = angle_out; + } + stroker->center = *to; + stroker->line_length = 0; +Exit: + return error; +} + +XCG_FT_Error XCG_FT_Stroker_BeginSubPath(XCG_FT_Stroker stroker, XCG_FT_Vector * to, XCG_FT_Bool open) +{ + stroker->first_point = TRUE; + stroker->center = *to; + stroker->subpath_open = open; + stroker->handle_wide_strokes = XCG_FT_BOOL(stroker->line_join != XCG_FT_STROKER_LINEJOIN_ROUND || (stroker->subpath_open && stroker->line_cap == XCG_FT_STROKER_LINECAP_BUTT)); + stroker->subpath_start = *to; + stroker->angle_in = 0; + return 0; +} + +static XCG_FT_Error ft_stroker_add_reverse_left(XCG_FT_Stroker stroker, XCG_FT_Bool open) +{ + XCG_FT_StrokeBorder right = stroker->borders + 0; + XCG_FT_StrokeBorder left = stroker->borders + 1; + XCG_FT_Int new_points; + XCG_FT_Error error = 0; + + new_points = left->num_points - left->start; + if(new_points > 0) + { + error = ft_stroke_border_grow(right, (XCG_FT_UInt)new_points); + if(error) + goto Exit; + { + XCG_FT_Vector *dst_point = right->points + right->num_points; + XCG_FT_Byte *dst_tag = right->tags + right->num_points; + XCG_FT_Vector *src_point = left->points + left->num_points - 1; + XCG_FT_Byte *src_tag = left->tags + left->num_points - 1; + while(src_point >= left->points + left->start) + { + *dst_point = *src_point; + *dst_tag = *src_tag; + if(open) + dst_tag[0] &= ~XCG_FT_STROKE_TAG_BEGIN_END; + else + { + XCG_FT_Byte ttag = (XCG_FT_Byte)(dst_tag[0] & XCG_FT_STROKE_TAG_BEGIN_END); + if(ttag == XCG_FT_STROKE_TAG_BEGIN || ttag == XCG_FT_STROKE_TAG_END) + dst_tag[0] ^= XCG_FT_STROKE_TAG_BEGIN_END; + } + src_point--; + src_tag--; + dst_point++; + dst_tag++; + } + } + left->num_points = left->start; + right->num_points += new_points; + right->movable = FALSE; + left->movable = FALSE; + } +Exit: + return error; +} + +XCG_FT_Error XCG_FT_Stroker_EndSubPath(XCG_FT_Stroker stroker) +{ + XCG_FT_Error error = 0; + + if(stroker->subpath_open) + { + XCG_FT_StrokeBorder right = stroker->borders; + error = ft_stroker_cap(stroker, stroker->angle_in, 0); + if(error) + goto Exit; + error = ft_stroker_add_reverse_left(stroker, TRUE); + if(error) + goto Exit; + stroker->center = stroker->subpath_start; + error = ft_stroker_cap(stroker, stroker->subpath_angle + XCG_FT_ANGLE_PI, 0); + if(error) + goto Exit; + ft_stroke_border_close(right, FALSE); + } + else + { + XCG_FT_Angle turn; + XCG_FT_Int inside_side; + if(stroker->center.x != stroker->subpath_start.x || stroker->center.y != stroker->subpath_start.y) + { + error = XCG_FT_Stroker_LineTo(stroker, &stroker->subpath_start); + if(error) + goto Exit; + } + stroker->angle_out = stroker->subpath_angle; + turn = XCG_FT_Angle_Diff(stroker->angle_in, stroker->angle_out); + if(turn != 0) + { + inside_side = 0; + if(turn < 0) + inside_side = 1; + error = ft_stroker_inside(stroker, inside_side, stroker->subpath_line_length); + if(error) + goto Exit; + error = ft_stroker_outside(stroker, 1 - inside_side, stroker->subpath_line_length); + if(error) + goto Exit; + } + ft_stroke_border_close(stroker->borders + 0, FALSE); + ft_stroke_border_close(stroker->borders + 1, TRUE); + } +Exit: + return error; +} + +XCG_FT_Error XCG_FT_Stroker_GetBorderCounts(XCG_FT_Stroker stroker, XCG_FT_StrokerBorder border, XCG_FT_UInt * anum_points, XCG_FT_UInt * anum_contours) +{ + XCG_FT_UInt num_points = 0, num_contours = 0; + XCG_FT_Error error; + + if(!stroker || border > 1) + { + error = -1; + goto Exit; + } + error = ft_stroke_border_get_counts(stroker->borders + border, &num_points, &num_contours); +Exit: + if(anum_points) + *anum_points = num_points; + if(anum_contours) + *anum_contours = num_contours; + return error; +} + +XCG_FT_Error XCG_FT_Stroker_GetCounts(XCG_FT_Stroker stroker, XCG_FT_UInt * anum_points, XCG_FT_UInt * anum_contours) +{ + XCG_FT_UInt count1, count2, num_points = 0; + XCG_FT_UInt count3, count4, num_contours = 0; + XCG_FT_Error error; + + error = ft_stroke_border_get_counts(stroker->borders + 0, &count1, &count2); + if(error) + goto Exit; + error = ft_stroke_border_get_counts(stroker->borders + 1, &count3, &count4); + if(error) + goto Exit; + num_points = count1 + count3; + num_contours = count2 + count4; +Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; +} + +void XCG_FT_Stroker_ExportBorder(XCG_FT_Stroker stroker, XCG_FT_StrokerBorder border, XCG_FT_Outline * outline) +{ + if(border == XCG_FT_STROKER_BORDER_LEFT || border == XCG_FT_STROKER_BORDER_RIGHT) + { + XCG_FT_StrokeBorder sborder = &stroker->borders[border]; + if(sborder->valid) + ft_stroke_border_export(sborder, outline); + } +} + +void XCG_FT_Stroker_Export(XCG_FT_Stroker stroker, XCG_FT_Outline * outline) +{ + XCG_FT_Stroker_ExportBorder(stroker, XCG_FT_STROKER_BORDER_LEFT, outline); + XCG_FT_Stroker_ExportBorder(stroker, XCG_FT_STROKER_BORDER_RIGHT, outline); +} + +XCG_FT_Error XCG_FT_Stroker_ParseOutline(XCG_FT_Stroker stroker, const XCG_FT_Outline *outline) +{ + XCG_FT_Vector v_last; + XCG_FT_Vector v_control; + XCG_FT_Vector v_start; + XCG_FT_Vector * point; + XCG_FT_Vector * limit; + char * tags; + XCG_FT_Error error; + XCG_FT_Int n; + XCG_FT_UInt first; + XCG_FT_Int tag; + + if(!outline || !stroker) + return -1; + XCG_FT_Stroker_Rewind(stroker); + first = 0; + for(n = 0; n < outline->n_contours; n++) + { + XCG_FT_UInt last; + last = outline->contours[n]; + limit = outline->points + last; + if(last <= first) + { + first = last + 1; + continue; + } + v_start = outline->points[first]; + v_last = outline->points[last]; + v_control = v_start; + point = outline->points + first; + tags = outline->tags + first; + tag = XCG_FT_CURVE_TAG(tags[0]); + if(tag == XCG_FT_CURVE_TAG_CUBIC) + goto Invalid_Outline; + if(tag == XCG_FT_CURVE_TAG_CONIC) + { + if(XCG_FT_CURVE_TAG(outline->tags[last]) == XCG_FT_CURVE_TAG_ON) + { + v_start = v_last; + limit--; + } + else + { + v_start.x = (v_start.x + v_last.x) / 2; + v_start.y = (v_start.y + v_last.y) / 2; + } + point--; + tags--; + } + error = XCG_FT_Stroker_BeginSubPath(stroker, &v_start, outline->contours_flag[n]); + if(error) + goto Exit; + while(point < limit) + { + point++; + tags++; + tag = XCG_FT_CURVE_TAG(tags[0]); + switch(tag) + { + case XCG_FT_CURVE_TAG_ON: + { + XCG_FT_Vector vec; + vec.x = point->x; + vec.y = point->y; + error = XCG_FT_Stroker_LineTo(stroker, &vec); + if(error) + goto Exit; + continue; + } + + case XCG_FT_CURVE_TAG_CONIC: + v_control.x = point->x; + v_control.y = point->y; +Do_Conic: + if(point < limit) + { + XCG_FT_Vector vec; + XCG_FT_Vector v_middle; + point++; + tags++; + tag = XCG_FT_CURVE_TAG(tags[0]); + vec = point[0]; + if(tag == XCG_FT_CURVE_TAG_ON) + { + error = XCG_FT_Stroker_ConicTo(stroker, &v_control, &vec); + if(error) + goto Exit; + continue; + } + if(tag != XCG_FT_CURVE_TAG_CONIC) + goto Invalid_Outline; + v_middle.x = (v_control.x + vec.x) / 2; + v_middle.y = (v_control.y + vec.y) / 2; + error = XCG_FT_Stroker_ConicTo(stroker, &v_control, &v_middle); + if(error) + goto Exit; + v_control = vec; + goto Do_Conic; + } + error = XCG_FT_Stroker_ConicTo(stroker, &v_control, &v_start); + goto Close; + + default: + { + XCG_FT_Vector vec1, vec2; + if(point + 1 > limit || + XCG_FT_CURVE_TAG(tags[1]) != XCG_FT_CURVE_TAG_CUBIC) + goto Invalid_Outline; + point += 2; + tags += 2; + vec1 = point[-2]; + vec2 = point[-1]; + if(point <= limit) + { + XCG_FT_Vector vec; + vec = point[0]; + error = XCG_FT_Stroker_CubicTo(stroker, &vec1, &vec2, &vec); + if(error) + goto Exit; + continue; + } + error = XCG_FT_Stroker_CubicTo(stroker, &vec1, &vec2, &v_start); + goto Close; + } + } + } +Close: + if(error) + goto Exit; + if(stroker->first_point) + { + stroker->subpath_open = TRUE; + error = ft_stroker_subpath_start(stroker, 0, 0); + if(error) + goto Exit; + } + error = XCG_FT_Stroker_EndSubPath(stroker); + if(error) + goto Exit; + first = last + 1; + } + return 0; +Exit: + return error; +Invalid_Outline: + return -2; +} diff --git a/libmui/mui/xft.h b/libmui/mui/xft.h new file mode 100644 index 0000000..df9cc68 --- /dev/null +++ b/libmui/mui/xft.h @@ -0,0 +1,141 @@ +#ifndef __XFT_H__ +#define __XFT_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * type + */ +typedef signed long XCG_FT_Fixed; +typedef signed int XCG_FT_Int; +typedef unsigned int XCG_FT_UInt; +typedef signed long XCG_FT_Long; +typedef unsigned long XCG_FT_ULong; +typedef signed short XCG_FT_Short; +typedef unsigned char XCG_FT_Byte; +typedef unsigned char XCG_FT_Bool; +typedef int XCG_FT_Error; +typedef signed long XCG_FT_Pos; + +typedef struct XCG_FT_Vector_ { + XCG_FT_Pos x; + XCG_FT_Pos y; +} XCG_FT_Vector; + +/* + * math + */ +typedef XCG_FT_Fixed XCG_FT_Angle; + +XCG_FT_Long XCG_FT_MulFix(XCG_FT_Long a, XCG_FT_Long b); +XCG_FT_Long XCG_FT_MulDiv(XCG_FT_Long a, XCG_FT_Long b, XCG_FT_Long c); +XCG_FT_Long XCG_FT_DivFix(XCG_FT_Long a, XCG_FT_Long b); +XCG_FT_Fixed XCG_FT_Sin(XCG_FT_Angle angle); +XCG_FT_Fixed XCG_FT_Cos(XCG_FT_Angle angle); +XCG_FT_Fixed XCG_FT_Tan(XCG_FT_Angle angle); +XCG_FT_Angle XCG_FT_Atan2(XCG_FT_Fixed x, XCG_FT_Fixed y); +XCG_FT_Angle XCG_FT_Angle_Diff(XCG_FT_Angle angle1, XCG_FT_Angle angle2); +void XCG_FT_Vector_Unit(XCG_FT_Vector *vec, XCG_FT_Angle angle); +void XCG_FT_Vector_Rotate(XCG_FT_Vector *vec, XCG_FT_Angle angle); +XCG_FT_Fixed XCG_FT_Vector_Length(XCG_FT_Vector *vec); +void XCG_FT_Vector_Polarize(XCG_FT_Vector *vec, XCG_FT_Fixed *length, XCG_FT_Angle *angle); +void XCG_FT_Vector_From_Polar(XCG_FT_Vector *vec, XCG_FT_Fixed length, XCG_FT_Angle angle); + +/* + * raster + */ +typedef struct XCG_FT_BBox_ { + XCG_FT_Pos xMin, yMin; + XCG_FT_Pos xMax, yMax; +} XCG_FT_BBox; + +typedef struct XCG_FT_Outline_ { + int n_contours; + int n_points; + XCG_FT_Vector * points; + char * tags; + int * contours; + char * contours_flag; + int flags; +} XCG_FT_Outline; + +#define XCG_FT_OUTLINE_NONE 0x0 +#define XCG_FT_OUTLINE_OWNER 0x1 +#define XCG_FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define XCG_FT_OUTLINE_REVERSE_FILL 0x4 +#define XCG_FT_CURVE_TAG(flag) (flag & 3) +#define XCG_FT_CURVE_TAG_ON 1 +#define XCG_FT_CURVE_TAG_CONIC 0 +#define XCG_FT_CURVE_TAG_CUBIC 2 +#define XCG_FT_Curve_Tag_On XCG_FT_CURVE_TAG_ON +#define XCG_FT_Curve_Tag_Conic XCG_FT_CURVE_TAG_CONIC +#define XCG_FT_Curve_Tag_Cubic XCG_FT_CURVE_TAG_CUBIC + +typedef struct XCG_FT_Span_ { + int x; + int len; + int y; + unsigned char coverage; +} XCG_FT_Span; + +typedef void (*XCG_FT_SpanFunc)(int count, const XCG_FT_Span * spans, void * user); +#define XCG_FT_Raster_Span_Func XCG_FT_SpanFunc + +#define XCG_FT_RASTER_FLAG_DEFAULT 0x0 +#define XCG_FT_RASTER_FLAG_AA 0x1 +#define XCG_FT_RASTER_FLAG_DIRECT 0x2 +#define XCG_FT_RASTER_FLAG_CLIP 0x4 + +typedef struct XCG_FT_Raster_Params_ { + const void * source; + int flags; + XCG_FT_SpanFunc gray_spans; + void * user; + XCG_FT_BBox clip_box; +} XCG_FT_Raster_Params; + +XCG_FT_Error XCG_FT_Outline_Check(XCG_FT_Outline * outline); +void XCG_FT_Outline_Get_CBox(const XCG_FT_Outline * outline, XCG_FT_BBox * acbox); +void XCG_FT_Raster_Render(const XCG_FT_Raster_Params * params); + +/* + * stroker + */ +typedef struct XCG_FT_StrokerRec_ * XCG_FT_Stroker; + +typedef enum XCG_FT_Stroker_LineJoin_ { + XCG_FT_STROKER_LINEJOIN_ROUND = 0, + XCG_FT_STROKER_LINEJOIN_BEVEL = 1, + XCG_FT_STROKER_LINEJOIN_MITER_VARIABLE = 2, + XCG_FT_STROKER_LINEJOIN_MITER = XCG_FT_STROKER_LINEJOIN_MITER_VARIABLE, + XCG_FT_STROKER_LINEJOIN_MITER_FIXED = 3, +} XCG_FT_Stroker_LineJoin; + +typedef enum XCG_FT_Stroker_LineCap_ { + XCG_FT_STROKER_LINECAP_BUTT = 0, + XCG_FT_STROKER_LINECAP_ROUND = 1, + XCG_FT_STROKER_LINECAP_SQUARE = 2, +} XCG_FT_Stroker_LineCap; + +typedef enum XCG_FT_StrokerBorder_ { + XCG_FT_STROKER_BORDER_LEFT = 0, + XCG_FT_STROKER_BORDER_RIGHT = 1, +} XCG_FT_StrokerBorder; + +XCG_FT_Error XCG_FT_Stroker_New(XCG_FT_Stroker * astroker); +void XCG_FT_Stroker_Set(XCG_FT_Stroker stroker, XCG_FT_Fixed radius, XCG_FT_Stroker_LineCap line_cap, XCG_FT_Stroker_LineJoin line_join, XCG_FT_Fixed miter_limit); +XCG_FT_Error XCG_FT_Stroker_ParseOutline(XCG_FT_Stroker stroker, const XCG_FT_Outline * outline); +XCG_FT_Error XCG_FT_Stroker_GetCounts(XCG_FT_Stroker stroker, XCG_FT_UInt * anum_points, XCG_FT_UInt * anum_contours); +void XCG_FT_Stroker_Export(XCG_FT_Stroker stroker, XCG_FT_Outline * outline); +void XCG_FT_Stroker_Done(XCG_FT_Stroker stroker); + +#endif /* __XFT_H__ */ diff --git a/libmui/tests/mui_playground.c b/libmui/tests/mui_playground.c new file mode 100644 index 0000000..b7ed530 --- /dev/null +++ b/libmui/tests/mui_playground.c @@ -0,0 +1,616 @@ +/* + * mui_playground.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ +#define MUI_HAS_XCB 1 +#define MUI_HAS_XKB 1 + +#if MUI_HAS_XCB +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#if MUI_HAS_XKB +#include +#include +#include +#include +#else +struct xkb_state; +#endif + +#include "mui.h" +#include "mui_plugin.h" + +typedef struct mui_xcb_t { + mui_t ui; + mui_plug_t * plug; + void * plug_data; + + float ui_scale_x, ui_scale_y; + c2_pt_t size; + xcb_connection_t * xcb; + xcb_shm_segment_info_t shm; + xcb_window_t window; + xcb_pixmap_t xcb_pix; + xcb_gcontext_t xcb_context; + struct xkb_state * xkb_state; + + int redraw; +} mui_xcb_t; + + +int +_mui_xcb_init_keyboard( + mui_xcb_t *ui) +{ +#if MUI_HAS_XKB + uint8_t xkb_event_base, xkb_error_base; + if (!xkb_x11_setup_xkb_extension (ui->xcb, + XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION, + XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS, + NULL, NULL, + &xkb_event_base, &xkb_error_base)) { + fprintf(stderr, "%s needs version %d.%d or newer\n", __func__, + XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION); + goto error; + } + struct xkb_context *ctx = + xkb_context_new(XKB_CONTEXT_NO_FLAGS); + int32_t device_id = + xkb_x11_get_core_keyboard_device_id(ui->xcb); + if (device_id == -1) { + fprintf(stderr, "%s xkb_x11_get_core_keyboard_device_id\n", __func__); + goto error; + } + struct xkb_keymap *keymap = + xkb_x11_keymap_new_from_device(ctx, ui->xcb, + device_id, XKB_KEYMAP_COMPILE_NO_FLAGS); + ui->xkb_state = + xkb_x11_state_new_from_device(keymap, ui->xcb, device_id); + xkb_context_unref(ctx); + return 0; +#endif +error: + printf("XCB Keyboard initialisation: %s\n", ui->xkb_state ? "OK" : "Failed"); + ui->xkb_state = NULL; + return -1; +} + +/* + * xmodmap -pke or -pk will print the list of keycodes + */ +static bool +_mui_xcb_convert_keycode( + mui_xcb_t *ui, + xkb_keysym_t sym, + mui_event_t *out ) +{ + switch (sym) { + case XKB_KEY_F1 ... XKB_KEY_F12: + out->key.key = MUI_KEY_F1 + (sym - XKB_KEY_F1); + break; + case XKB_KEY_Escape: out->key.key = MUI_KEY_ESCAPE; break; + case XKB_KEY_Left: out->key.key = MUI_KEY_LEFT; break; + case XKB_KEY_Up: out->key.key = MUI_KEY_UP; break; + case XKB_KEY_Right: out->key.key = MUI_KEY_RIGHT; break; + case XKB_KEY_Down: out->key.key = MUI_KEY_DOWN; break; + // XKB_KEY_Begin + case XKB_KEY_Insert: out->key.key = MUI_KEY_INSERT; break; + case XKB_KEY_Home: out->key.key = MUI_KEY_HOME; break; + case XKB_KEY_End: out->key.key = MUI_KEY_END; break; + case XKB_KEY_Page_Up: out->key.key = MUI_KEY_PAGEUP; break; + case XKB_KEY_Page_Down: out->key.key = MUI_KEY_PAGEDOWN; break; + + case XKB_KEY_Shift_R: out->key.key = MUI_KEY_RSHIFT; break; + case XKB_KEY_Shift_L: out->key.key = MUI_KEY_LSHIFT; break; + case XKB_KEY_Control_R: out->key.key = MUI_KEY_RCTRL; break; + case XKB_KEY_Control_L: out->key.key = MUI_KEY_LCTRL; break; + case XKB_KEY_Alt_L: out->key.key = MUI_KEY_LALT; break; + case XKB_KEY_Alt_R: out->key.key = MUI_KEY_RALT; break; + case XKB_KEY_Super_L: out->key.key = MUI_KEY_LSUPER; break; + case XKB_KEY_Super_R: out->key.key = MUI_KEY_RSUPER; break; + default: + out->key.key = sym & 0xff; + break; + } +// printf("%s %08x to %04x\n", __func__, sym, out->key.key); + return true; +} + +int +mui_xcb_list_physical_screens( + struct xcb_connection_t * xcb, + struct c2_rect_array_t *out) +{ + if (!xcb || !out) + return -1; + c2_rect_array_clear(out); + xcb_screen_t *screen = xcb_setup_roots_iterator( + xcb_get_setup(xcb)).data; + xcb_randr_get_screen_resources_current_reply_t *reply = + xcb_randr_get_screen_resources_current_reply( + xcb, + xcb_randr_get_screen_resources_current( + xcb, screen->root), + NULL); + xcb_timestamp_t timestamp = reply->config_timestamp; + int len = xcb_randr_get_screen_resources_current_outputs_length(reply); + xcb_randr_output_t *randr_outputs = + xcb_randr_get_screen_resources_current_outputs(reply); + for (int i = 0; i < len; i++) { + xcb_randr_get_output_info_reply_t *output = + xcb_randr_get_output_info_reply( + xcb, + xcb_randr_get_output_info( + xcb, randr_outputs[i], timestamp), + NULL); + if (!output || output->crtc == XCB_NONE || + output->connection == XCB_RANDR_CONNECTION_DISCONNECTED) + continue; + xcb_randr_get_crtc_info_reply_t *crtc = + xcb_randr_get_crtc_info_reply(xcb, + xcb_randr_get_crtc_info( + xcb, output->crtc, timestamp), + NULL); + c2_rect_t r = C2_RECT(crtc->x, crtc->y, + crtc->x +crtc->width, crtc->y + crtc->height); + c2_rect_array_add(out, r); + free(crtc); + free(output); + } + free(reply); + return 0; +} + +static bool +_cui_match_physical_screen( + xcb_connection_t *xcb, + c2_pt_t want_size, + c2_pt_p found_pos ) +{ + bool res = false; + c2_rect_array_t sc = {}; + + mui_xcb_list_physical_screens(xcb, &sc); + + for (unsigned int i = 0; i < sc.count; i++) { + if (c2_rect_width(&sc.e[i]) == want_size.x && + c2_rect_height(&sc.e[i]) == want_size.y) { + *found_pos = sc.e[i].tl; + res = true; + } + } + return res; +} + +struct mui_t * +mui_xcb_init( + struct mui_t *mui, + struct mui_pixmap_t * pix ) +{ + mui_xcb_t *ui = (mui_xcb_t *)mui; + + pix->size.y = 720; + pix->size.x = 1280; + ui->ui.screen_size = pix->size; + ui->ui_scale_x = ui->ui_scale_y = 1; + printf("XCB: Starting on %dx%d window\n", + pix->size.x, pix->size.y); + + pix->size.x *= ui->ui_scale_x; + pix->size.y *= ui->ui_scale_y; + ui->size = pix->size; + + uint32_t value_mask; + uint32_t value_list[6]; + + ui->xcb = xcb_connect(NULL, NULL); + + bool windowed = 1; + bool opaque = 1; + c2_pt_t found_position = {}; + bool has_position = !windowed && _cui_match_physical_screen( + ui->xcb, ui->size, &found_position); + + xcb_screen_iterator_t iter = xcb_setup_roots_iterator( + xcb_get_setup(ui->xcb)); + printf("%s %d screens\n", __func__, iter.rem); + xcb_screen_t *screen = NULL; + while (iter.rem) { + screen = iter.data; + printf("%s screen %d: width: %d, height: %d\n", __func__, + iter.index, + screen->width_in_pixels, screen->height_in_pixels); + xcb_screen_next(&iter); + } + printf("XCB Screen depth %d\n", screen->root_depth); + + /* + * This walks thru the 'visual', looking for a true colour *32 bits* one + * which means it handles ARGB colors, which we can draw into. Also find + * one which color bit masks matches libcui & libpixman. + */ + xcb_visualtype_t *argb_visual = NULL; + xcb_depth_iterator_t depth_iter = + xcb_screen_allowed_depths_iterator(screen); + for (; depth_iter.rem; xcb_depth_next(&depth_iter)) { + xcb_visualtype_iterator_t visual_iter = + xcb_depth_visuals_iterator(depth_iter.data); + // printf("XCB Depth %d\n", depth_iter.data->depth); + if (depth_iter.data->depth != 32) + continue; + for (; visual_iter.rem; xcb_visualtype_next(&visual_iter)) { + if (visual_iter.data->_class == XCB_VISUAL_CLASS_TRUE_COLOR + && visual_iter.data->red_mask == 0xff0000 + && visual_iter.data->green_mask == 0x00ff00 + && visual_iter.data->blue_mask == 0x0000ff) { + argb_visual = visual_iter.data; + break; + } + } + } + printf("XCB ARGB Transparency %s\n", + argb_visual ? "Supported" : "Not available"); + if (windowed || opaque) + argb_visual = NULL; + + xcb_shm_query_version_reply_t *xcb_shm_present; + xcb_shm_present = xcb_shm_query_version_reply( + ui->xcb, xcb_shm_query_version(ui->xcb), NULL); + if (!xcb_shm_present || !xcb_shm_present->shared_pixmaps) { + printf("xcb_shm error... %p\n", xcb_shm_present); + printf("If using nvidia driver, you need\n" + " Option \"AllowSHMPixmaps\" \"1\"\n" + " In your /etc/X11/xorg.conf file\n"); + exit(0); + } + printf("XCB Shared memory present\n"); + + _mui_xcb_init_keyboard(ui); + + value_mask = XCB_CW_BACK_PIXEL | + XCB_CW_BORDER_PIXEL | + XCB_CW_OVERRIDE_REDIRECT | + XCB_CW_EVENT_MASK; + + xcb_colormap_t cmap = xcb_generate_id(ui->xcb); + /* required for having transparent windows */ + if (argb_visual) { + xcb_create_colormap(ui->xcb, XCB_COLORMAP_ALLOC_NONE, cmap, + screen->root, argb_visual->visual_id); + value_mask |= XCB_CW_COLORMAP; + } + uint32_t w_mask[] = { + screen->black_pixel, + // Border Pixel; not really needed for anything, but needed + // for ARGB window otherwise it doesn't get created properly + 0x88888888, + // if we found a screen of the exact size, remove the border + has_position ? 1 : 0, + XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS | + XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_POINTER_MOTION | + XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_LEAVE_WINDOW | + XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE, + cmap + }; + ui->window = xcb_generate_id(ui->xcb); + xcb_create_window( + ui->xcb, + argb_visual ? 32 : XCB_COPY_FROM_PARENT, + ui->window, screen->root, + found_position.x, found_position.y, + pix->size.x, pix->size.y, 0, + XCB_WINDOW_CLASS_INPUT_OUTPUT, + argb_visual ? argb_visual->visual_id : screen->root_visual, + value_mask, w_mask); + xcb_free_colormap(ui->xcb, cmap); + + const char * title = "MII UI Playground"; + xcb_change_property(ui->xcb, XCB_PROP_MODE_REPLACE, + ui->window, XCB_ATOM_WM_NAME, XCB_ATOM_STRING, 8, + strlen(title), title); + + // create a graphic context + value_mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES; + value_list[0] = screen->white_pixel; + value_list[1] = 0; + ui->xcb_context = xcb_generate_id(ui->xcb); + xcb_create_gc( + ui->xcb, ui->xcb_context, ui->window, value_mask, value_list); + // map the window onto the screen + xcb_map_window(ui->xcb, ui->window); + // wont show unless I do this + xcb_flush(ui->xcb); + ui->shm.shmid = shmget(IPC_PRIVATE, + pix->size.x * pix->size.y * 4, IPC_CREAT | 0777); + ui->shm.shmaddr = shmat(ui->shm.shmid, 0, 0); + ui->shm.shmseg = xcb_generate_id(ui->xcb); + xcb_shm_attach(ui->xcb, ui->shm.shmseg, ui->shm.shmid, 0); + shmctl(ui->shm.shmid, IPC_RMID, 0); + + ui->xcb_pix = xcb_generate_id(ui->xcb); + xcb_shm_create_pixmap( + ui->xcb, ui->xcb_pix, ui->window, + pix->size.x, pix->size.y, + argb_visual ? 32 : screen->root_depth, + ui->shm.shmseg, 0); + + pix->pixels = ui->shm.shmaddr; + pix->row_bytes = pix->size.x * 4; +// printf("%s pix is %p\n", __func__, pix->pixels); + ui->redraw = 1; + return &ui->ui; +} + +int +mui_xcb_poll( + struct mui_t * mui, + bool redrawn) +{ + mui_xcb_t * ui = (mui_xcb_t *)mui; + int gameover = 0; + xcb_generic_event_t *event; + static bool buttondown = false; + static mui_event_t key_ev; + + while (!gameover && (event = xcb_poll_for_event(ui->xcb)) != NULL) { + switch (event->response_type & ~0x80) { + case XCB_KEY_RELEASE: { + xcb_key_release_event_t *key = + (xcb_key_press_event_t*) event; + xkb_state_update_key(ui->xkb_state, + key->detail, XKB_KEY_UP); + xkb_keysym_t keysym = xkb_state_key_get_one_sym( + ui->xkb_state, key->detail); + key_ev.type = MUI_EVENT_KEYUP; + key_ev.key.up = 1; + if (_mui_xcb_convert_keycode(ui, keysym, &key_ev)) { + if (key_ev.key.key >= MUI_KEY_MODIFIERS && + key_ev.key.key <= MUI_KEY_MODIFIERS_LAST) { + mui->modifier_keys &= ~(1 << (key_ev.key.key - MUI_KEY_MODIFIERS)); + } + key_ev.modifiers = mui->modifier_keys; + // key_ev.modifiers |= MUI_MODIFIER_EVENT_TRACE; + if (ui->plug && ui->plug->event) + ui->plug->event(mui, ui->plug_data, &key_ev); + } + } break; + case XCB_KEY_PRESS: { + xcb_key_press_event_t *key = + (xcb_key_press_event_t*) event; + if (key->same_screen == 0) // repeat key + break; + xkb_state_update_key(ui->xkb_state, + key->detail, XKB_KEY_DOWN); + xkb_keysym_t keysym = xkb_state_key_get_one_sym( + ui->xkb_state, key->detail); + key_ev.type = MUI_EVENT_KEYDOWN; + key_ev.key.up = 0; + // printf("%s %08x\n", __func__, keysym); + if (_mui_xcb_convert_keycode(ui, keysym, &key_ev)) { + if (key_ev.key.key >= MUI_KEY_MODIFIERS && + key_ev.key.key <= MUI_KEY_MODIFIERS_LAST) { + mui->modifier_keys |= (1 << (key_ev.key.key - MUI_KEY_MODIFIERS)); + } + key_ev.modifiers = mui->modifier_keys; + // key_ev.modifiers |= MUI_MODIFIER_EVENT_TRACE; + // gameover = key_ev.key.key == 'q'; + if (ui->plug && ui->plug->event) + ui->plug->event(mui, ui->plug_data, &key_ev); + } + } break; + case XCB_BUTTON_RELEASE: + buttondown = false; + // fall through + case XCB_BUTTON_PRESS: { + xcb_button_press_event_t *m = + (xcb_button_press_event_t *)event; +#if 0 + printf("%s %s %02x %d at %4dx%4d\n", __func__, + (event->response_type & ~0x80) == XCB_BUTTON_PRESS ? + "down" : "up", + event->response_type, + m->detail, m->event_x, m->event_y); +#endif + switch (m->detail) { + case XCB_BUTTON_INDEX_1: { + case XCB_BUTTON_INDEX_3: + buttondown = (event->response_type & ~0x80) == XCB_BUTTON_PRESS; + mui_event_t ev = { + .type = buttondown ? + MUI_EVENT_BUTTONDOWN : + MUI_EVENT_BUTTONUP, + .mouse.button = m->detail, + .mouse.where.x = (float)m->event_x / ui->ui_scale_x, + .mouse.where.y = (float)m->event_y / ui->ui_scale_y, + .modifiers = mui->modifier_keys, + }; + if (ui->plug && ui->plug->event) + ui->plug->event(mui, ui->plug_data, &ev); + } break; + case XCB_BUTTON_INDEX_4: + case XCB_BUTTON_INDEX_5: { + mui_event_t ev = { + .type = MUI_EVENT_WHEEL, + .wheel.delta = m->detail == XCB_BUTTON_INDEX_4 ? + -1 : 1, + .wheel.where.x = (float)m->event_x / ui->ui_scale_x, + .wheel.where.y = (float)m->event_y / ui->ui_scale_y, + .modifiers = mui->modifier_keys, + }; + if (ui->plug && ui->plug->event) + ui->plug->event(mui, ui->plug_data, &ev); + } break; + } + } break; + case XCB_MOTION_NOTIFY: { + xcb_motion_notify_event_t *m = + (xcb_motion_notify_event_t*)event; +// if (buttondown) { + // printf("x=%d y=%d\n", event.motion.x, event.motion.y); + mui_event_t ev = { + .type = MUI_EVENT_DRAG, + .mouse.button = buttondown ? 1 : 0, + .mouse.where.x = (float)m->event_x / ui->ui_scale_x, + .mouse.where.y = (float)m->event_y / ui->ui_scale_y, + .modifiers = mui->modifier_keys, + }; + if (ui->plug && ui->plug->event) + ui->plug->event(mui, ui->plug_data, &ev); +// } + } break; + case XCB_ENTER_NOTIFY: + case XCB_LEAVE_NOTIFY: + break; + case XCB_EXPOSE: { + // xcb_expose_event_t *expose_event = (xcb_expose_event_t*) event; + ui->redraw++; + } break; + default: + // Handle other events + break; + } + free(event); + } + if (redrawn || ui->redraw || pixman_region32_not_empty(&mui->redraw)) { + // Handle window refresh event + int rc = 0; + c2_rect_t whole = C2_RECT(0, 0, ui->size.x, ui->size.y); + c2_rect_t *ra = (c2_rect_t*)pixman_region32_rectangles(&mui->redraw, &rc); + if (ui->redraw) { + ui->redraw = 0; + rc = 1; + ra = &whole; + } + if (rc) { + // printf("XCB: %d rects to redraw\n", rc); + for (int i = 0; i < rc; i++) { + c2_rect_t r = ra[i]; + // printf("XCB: %d,%d %dx%d\n", r.l, r.t, c2_rect_width(&r), c2_rect_height(&r)); + xcb_copy_area( + ui->xcb, ui->xcb_pix, ui->window, ui->xcb_context, + r.l, r.t, r.l, r.t, c2_rect_width(&r), c2_rect_height(&r)); + } + } + pixman_region32_clear(&mui->redraw); + } + xcb_flush(ui->xcb); + return gameover; +} + +void +mui_xcb_terminate( + struct mui_t * mui) +{ + mui_xcb_t * ui = (mui_xcb_t *)mui; + xcb_shm_detach(ui->xcb, ui->shm.shmseg); + shmdt(ui->shm.shmaddr); + xcb_free_pixmap(ui->xcb, ui->xcb_pix); + xcb_destroy_window(ui->xcb, ui->window); + xcb_disconnect(ui->xcb); +} + +#endif + +#include +#include +#include +#include +#include +#include + +int main() +{ + mui_xcb_t xcb_ui = {}; + mui_drawable_t dr = {}; + + // note: the mui_t is *not* initialized yet, it will be done + // in the _init() of the plugin. This is just to get the + // init/dispose done in the plugin to check for leaks etc + mui_t *mui = mui_xcb_init((struct mui_t *)&xcb_ui, &dr.pix); + mui_xcb_t * ui = &xcb_ui; + void * dynload = NULL; + char * filename = "build-x86_64-linux-gnu/lib/ui_tests.so"; + struct stat st_current = {}, st = {}; + + mui_time_t stamp = 0; + do { + if (stat(filename, &st) == 0 && st.st_mtime != st_current.st_mtime) { + st_current = st; + if (dynload) { + if (ui->plug_data && ui->plug && ui->plug->dispose) { + ui->plug->dispose(ui->plug_data); + ui->plug = NULL; + ui->plug_data = NULL; + } + printf("Closed %s\n", filename); + dlclose(dynload); + dynload = NULL; + } + } + if (!dynload) { + dynload = dlopen(filename, RTLD_NOW); + printf("Loading %s\n", filename); + if (!dynload) { + printf("Failed to load %s : %s\n", filename, dlerror()); + perror(filename); + sleep(2); + continue; + } + ui->plug = dlsym(dynload, "mui_plug"); + if (!ui->plug) { + printf("Failed to find mui_plug in %s\n", filename); + dlclose(dynload); + dynload = NULL; + sleep(10); + continue; + } + if (ui->plug->init) { + ui->plug_data = ui->plug->init(mui, ui->plug, &dr); + if (!ui->plug_data) { + printf("Failed to init plugin %s\n", filename); + dlclose(dynload); + dynload = NULL; + sleep(10); + continue; + } + } + stamp = mui_get_time(); + } + bool draw = false; + mui_run(mui); + if (ui->plug && ui->plug->draw) + draw = ui->plug->draw(mui, ui->plug_data, &dr, false); + if (mui_xcb_poll(mui, draw)) + break; + mui_time_t now = mui_get_time(); + while (stamp < now) + stamp += (MUI_TIME_SECOND / 60); + usleep(stamp-now); + } while (1); + if (dynload) { + if (ui->plug_data && ui->plug && ui->plug->dispose) { + ui->plug->dispose(ui->plug_data); + ui->plug = NULL; + ui->plug_data = NULL; + } + printf("Closed %s\n", filename); + dlclose(dynload); + } + mui_drawable_dispose(&dr); + mui_xcb_terminate(mui); + return 0; +} \ No newline at end of file diff --git a/libmui/tests/mui_plugin.h b/libmui/tests/mui_plugin.h new file mode 100644 index 0000000..75d0224 --- /dev/null +++ b/libmui/tests/mui_plugin.h @@ -0,0 +1,33 @@ +/* + * mui_plugin.h + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include + +struct mui_t; +struct mui_drawable_t; + +typedef struct mui_plug_t { + void * (*init)( + struct mui_t * ui, + struct mui_plug_t * plug, + struct mui_drawable_t * dr ); + void (*dispose)( + void * plug ); + int (*draw)( + struct mui_t *ui, + void *param, + struct mui_drawable_t * dr, + uint16_t all ); + int (*event)( + struct mui_t *ui, + void *param, + struct mui_event_t * event ); +} mui_plug_t; diff --git a/libmui/tests/ui_tests.c b/libmui/tests/ui_tests.c new file mode 100644 index 0000000..7f07b5e --- /dev/null +++ b/libmui/tests/ui_tests.c @@ -0,0 +1,236 @@ +/* + * ui_tests.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ +#define _GNU_SOURCE // for asprintf +#include +#include +#include +#include +#include + +#include "mui.h" +#include "mui_plugin.h" +#include "c2_geometry.h" + +typedef struct cg_ui_t { + mui_t *ui; +} cg_ui_t; + +#define MII_MUI_MENUS_C +#include "mii_mui_menus.h" +#include "mii_mui_settings.h" + + +#ifndef UI_VERSION +#define UI_VERSION "0.0.0" +#endif + +static void +_test_show_about( + cg_ui_t *g) +{ + mui_window_t *w = mui_window_get_by_id(g->ui, FCC('a','b','o','t')); + if (w) { + mui_window_select(w); + return; + } + w = mui_alert(g->ui, C2_PT(0,0), + "About MII", + "Version " UI_VERSION "\n" + "Build " __DATE__ " " __TIME__, + MUI_ALERT_INFO); + mui_window_set_id(w, FCC('a','b','o','t')); +} + +static mii_machine_config_t g_machine_conf = {}; +static mii_loadbin_conf_t g_loadbin_conf = {}; + +/* this is heavily endian dependend, as is the FCC macro */ +#define FCC_INDEX(_fcc) (isdigit(_fcc>>24) ? ((_fcc >> 24) - '0') : 0) + +int +_test_menubar_action( + mui_window_t *win, + void * cb_param, + uint32_t what, + void * param) +{ + cg_ui_t *g = cb_param; + + printf("%s %4.4s\n", __func__, (char*)&what); + + static int video_mode = 0; + static int audio_mute = 0; + switch (what) { + case MUI_MENUBAR_ACTION_PREPARE: { + mui_menu_item_t * items = param; + if (items == m_video_menu) { + printf("%s prepare video %d\n", __func__, video_mode); + for (int i = 0; m_video_menu[i].title; i++) { + switch (m_video_menu[i].uid) { + case FCC('v','d','c','0'): + case FCC('v','d','c','1'): + case FCC('v','d','c','2'): { + int idx = FCC_INDEX(m_video_menu[i].uid); + if (video_mode == idx) + strcpy(m_video_menu[i].mark, MUI_GLYPH_TICK); + else + m_video_menu[i].mark[0] = 0; + } break; + } + } + } else if (items == m_audio_menu) { + printf("%s prepare audio %d\n", __func__, audio_mute); + for (int i = 0; m_audio_menu[i].title; i++) { + switch (m_audio_menu[i].uid) { + case FCC('a','u','d','0'): + if (audio_mute) + strcpy(m_audio_menu[i].mark, MUI_GLYPH_TICK); + else + m_audio_menu[i].mark[0] = 0; + break; + } + } + } else { + printf("%s prepare (%s)\n", __func__, items[0].title); + } + } break; + case MUI_MENUBAR_ACTION_SELECT: { + mui_menu_item_t * item = param; + printf("%s Selected %4.4s '%s'\n", __func__, + (char*)&item->uid, item->title); + switch (item->uid) { + case FCC('a','b','o','t'): { + _test_show_about(g); + } break; + case FCC('q','u','i','t'): { + printf("%s Quit\n", __func__); + } break; + case FCC('s','l','o','t'): { + mii_mui_configure_slots(g->ui, &g_machine_conf); + } break; + case FCC('l', 'r', 'u', 'n'): { + mii_mui_load_binary(g->ui, &g_loadbin_conf); + } break; + case FCC('a','u','d','0'): + audio_mute = !audio_mute; + break; + case FCC('v','d','C','l'): { +// printf("%s Cycle video\n", __func__); + video_mode = (video_mode + 1) % 3; + } break; + case FCC('v','d','c','0'): + case FCC('v','d','c','1'): + case FCC('v','d','c','2'): + video_mode = FCC_INDEX(item->uid); + break; + default: + printf("%s menu item %4.4s %s IGNORED\n", + __func__, (char*)&item->uid, item->title); + break; + } + } break; + default: + printf("%s %4.4s IGNORED?\n", __func__, (char*)&what); + break; + } + + return 0; +} + +static void * +_init( + struct mui_t * ui, + struct mui_plug_t * plug, + mui_drawable_t * pix) +{ + mui_init(ui); + ui->screen_size = pix->pix.size; + asprintf(&ui->pref_directory, "%s/.local/share/mii", getenv("HOME")); + + cg_ui_t *g = calloc(1, sizeof(*g)); + g->ui = ui; + printf("%s\n", __func__); + mui_window_t * mbar = mui_menubar_new(ui); + mui_window_set_action(mbar, _test_menubar_action, g); + + mui_menubar_add_simple(mbar, MUI_GLYPH_APPLE, + FCC('a','p','p','l'), + m_apple_menu); + mui_menubar_add_simple(mbar, "File", + FCC('f','i','l','e'), + m_file_menu); + mui_menubar_add_simple(mbar, "Machine", + FCC('m','a','c','h'), + m_machine_menu); + mui_menubar_add_simple(mbar, "CPU", + FCC('c','p','u','m'), + m_cpu_menu); + +// mii_mui_configure_slots(g->ui, &g_machine_conf); +// mii_mui_load_binary(g->ui, &g_loadbin_conf); +// mii_mui_load_1mbrom(g->ui, &g_machine_conf.slot[0].conf.rom1mb); +// mii_mui_load_2dsk(g->ui, +// &g_machine_conf.slot[0].conf.disk2, MII_2DSK_DISKII); +#if 0 + mui_alert(ui, C2_PT(0,0), + "Testing one Two", + "Do you really want the printer to catch fire?\n" + "This operation cannot be cancelled.", + MUI_ALERT_WARN); +#endif +#if 1 + mui_stdfile_get(ui, + C2_PT(0, 0), + "Select image for SmartPort card", + "\\.(hdv|po|2mg)$", + getenv("HOME")); +#endif + + return g; +} + +static void +_dispose( + void *_ui) +{ + cg_ui_t *ui = _ui; + mui_dispose(ui->ui); + free(ui); +} + +static int +_draw( + struct mui_t *ui, + void *param, + mui_drawable_t *dr, + uint16_t all) +{ +// cg_ui_t *g = param; + mui_draw(ui, dr, all); + return 1; +} + +static int +_event( + struct mui_t *ui, + void *param, + mui_event_t *event) +{ +// cg_ui_t *g = param; +// printf("%s %d\n", __func__, event->type); + mui_handle_event(ui, event); + return 0; +} + + +mui_plug_t mui_plug = { + .init = _init, + .dispose = _dispose, + .draw = _draw, + .event = _event, +}; \ No newline at end of file diff --git a/nuklear/mii_emu.c b/nuklear/mii_emu.c deleted file mode 100644 index 1f4a320..0000000 --- a/nuklear/mii_emu.c +++ /dev/null @@ -1,323 +0,0 @@ -/* - * mii_emu.c - * - * Copyright (C) 2023 Michel Pollet - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NK_INCLUDE_FIXED_TYPES -#define NK_INCLUDE_STANDARD_IO -#define NK_INCLUDE_STANDARD_VARARGS -#define NK_INCLUDE_DEFAULT_ALLOCATOR -#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT -#define NK_INCLUDE_FONT_BAKING -#define NK_INCLUDE_DEFAULT_FONT -#define NK_BUTTON_TRIGGER_ON_RELEASE -#include "nuklear.h" - -#define NK_XLIB_GL3_IMPLEMENTATION -#define NK_XLIB_LOAD_OPENGL_EXTENSIONS -#include "nuklear_xlib_gl3.h" - -#include "mii.h" -#include "mish.h" - -#define WINDOW_WIDTH 1280 -#define WINDOW_HEIGHT 720 // (10 + (192) * 3) - -#define MAX_VERTEX_BUFFER 512 * 1024 -#define MAX_ELEMENT_BUFFER 128 * 1024 - -void -mii_nuklear( - mii_t *mii, - struct nk_context *ctx); -void -mii_nuklear_init( - mii_t *mii, - struct nk_context *ctx); -/* =============================================================== - * - * DEMO - * - * ===============================================================*/ -struct XWindow { - Display *dpy; - Window win; - XVisualInfo *vis; - Colormap cmap; - XSetWindowAttributes swa; - XWindowAttributes attr; - GLXFBConfig fbc; - Atom wm_delete_window; - int width, height; -}; -static int gl_err = nk_false; -static int gl_error_handler(Display *dpy, XErrorEvent *ev) -{NK_UNUSED(dpy); NK_UNUSED(ev); gl_err = nk_true;return 0;} - -static void -die(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - fputs("\n", stderr); - exit(EXIT_FAILURE); -} - -static int -has_extension(const char *string, const char *ext) -{ - const char *start, *where, *term; - where = strchr(ext, ' '); - if (where || *ext == '\0') - return nk_false; - - for (start = string;;) { - where = strstr((const char*)start, ext); - if (!where) break; - term = where + strlen(ext); - if (where == start || *(where - 1) == ' ') { - if (*term == ' ' || *term == '\0') - return nk_true; - } - start = term; - } - return nk_false; -} - -struct nk_font *nk_main_font = NULL; - -/* global now, mish commands use it */ -mii_t g_mii = {}; - -int -main( - int argc, - const char *argv[]) -{ - /* Platform */ - int running = 1; - struct XWindow win; - GLXContext glContext; - struct nk_context *ctx; - struct nk_colorf bg; - - mii_init(&g_mii); - int idx = 1; - uint32_t flags = MII_INIT_DEFAULT; - int r = mii_argv_parse(&g_mii, argc, argv, &idx, &flags); - if (r == 0) { - printf("mii: Invalid argument %s, skipped\n", argv[idx]); - } else if (r == -1) - exit(1); - mii_prepare(&g_mii, flags); - mish_prepare(1); - mish_set_command_parameter(MISH_FCC('m','i','i',' '), &g_mii); - printf("MISH_TELNET_PORT = %s\n", getenv("MISH_TELNET_PORT")); - - memset(&win, 0, sizeof(win)); - win.dpy = XOpenDisplay(NULL); - if (!win.dpy) die("Failed to open X display\n"); - { - /* check glx version */ - int glx_major, glx_minor; - if (!glXQueryVersion(win.dpy, &glx_major, &glx_minor)) - die("[X11]: Error: Failed to query OpenGL version\n"); - if ((glx_major == 1 && glx_minor < 3) || (glx_major < 1)) - die("[X11]: Error: Invalid GLX version!\n"); - } - { - /* find and pick matching framebuffer visual */ - int fb_count; - static GLint attr[] = { - GLX_X_RENDERABLE, True, - GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR, - GLX_RED_SIZE, 8, - GLX_GREEN_SIZE, 8, - GLX_BLUE_SIZE, 8, - GLX_ALPHA_SIZE, 8, - GLX_DEPTH_SIZE, 24, - GLX_STENCIL_SIZE, 8, - GLX_DOUBLEBUFFER, True, - None - }; - GLXFBConfig *fbc; - fbc = glXChooseFBConfig(win.dpy, DefaultScreen(win.dpy), attr, &fb_count); - if (!fbc) die("[X11]: Error: failed to retrieve framebuffer configuration\n"); - { - /* pick framebuffer with most samples per pixel */ - int i; - int fb_best = -1, best_num_samples = -1; - for (i = 0; i < fb_count; ++i) { - XVisualInfo *vi = glXGetVisualFromFBConfig(win.dpy, fbc[i]); - if (vi) { - int sample_buffer, samples; - glXGetFBConfigAttrib(win.dpy, fbc[i], GLX_SAMPLE_BUFFERS, &sample_buffer); - glXGetFBConfigAttrib(win.dpy, fbc[i], GLX_SAMPLES, &samples); - if ((fb_best < 0) || (sample_buffer && samples > best_num_samples)) - fb_best = i, best_num_samples = samples; - XFree(vi); - } - } - win.fbc = fbc[fb_best]; - XFree(fbc); - win.vis = glXGetVisualFromFBConfig(win.dpy, win.fbc); - } - } - { - /* create window */ - win.cmap = XCreateColormap(win.dpy, RootWindow(win.dpy, win.vis->screen), win.vis->visual, AllocNone); - win.swa.colormap = win.cmap; - win.swa.background_pixmap = None; - win.swa.border_pixel = 0; - win.swa.event_mask = - ExposureMask | KeyPressMask | KeyReleaseMask | - ButtonPress | ButtonReleaseMask| ButtonMotionMask | - Button1MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask| - PointerMotionMask| StructureNotifyMask; - win.win = XCreateWindow(win.dpy, RootWindow(win.dpy, win.vis->screen), 0, 0, - WINDOW_WIDTH, WINDOW_HEIGHT, 0, win.vis->depth, InputOutput, - win.vis->visual, CWBorderPixel|CWColormap|CWEventMask, &win.swa); - if (!win.win) die("[X11]: Failed to create window\n"); - XFree(win.vis); - - char title[128]; - sprintf(title, "MII //e Emulator"); - char *telnet = getenv("MISH_TELNET_PORT"); - if (telnet) - sprintf(title + strlen(title), " (telnet port %s)", telnet); - else - sprintf(title + strlen(title), " (telnet disabled)"); - XStoreName(win.dpy, win.win, title); - XMapWindow(win.dpy, win.win); - win.wm_delete_window = XInternAtom(win.dpy, "WM_DELETE_WINDOW", False); - XSetWMProtocols(win.dpy, win.win, &win.wm_delete_window, 1); - } - { - /* create opengl context */ - typedef GLXContext(*glxCreateContext)(Display*, GLXFBConfig, GLXContext, Bool, const int*); - int(*old_handler)(Display*, XErrorEvent*) = XSetErrorHandler(gl_error_handler); - const char *extensions_str = glXQueryExtensionsString(win.dpy, DefaultScreen(win.dpy)); - glxCreateContext create_context = (glxCreateContext) - glXGetProcAddressARB((const GLubyte*)"glXCreateContextAttribsARB"); - - gl_err = nk_false; - if (!has_extension(extensions_str, "GLX_ARB_create_context") || !create_context) { - fprintf(stdout, "[X11]: glXCreateContextAttribARB() not found...\n"); - fprintf(stdout, "[X11]: ... using old-style GLX context\n"); - glContext = glXCreateNewContext(win.dpy, win.fbc, GLX_RGBA_TYPE, 0, True); - } else { - GLint attr[] = { - GLX_CONTEXT_MAJOR_VERSION_ARB, 3, - GLX_CONTEXT_MINOR_VERSION_ARB, 0, - None - }; - glContext = create_context(win.dpy, win.fbc, 0, True, attr); - XSync(win.dpy, False); - if (gl_err || !glContext) { - /* Could not create GL 3.0 context. Fallback to old 2.x context. - * If a version below 3.0 is requested, implementations will - * return the newest context version compatible with OpenGL - * version less than version 3.0.*/ - attr[1] = 1; attr[3] = 0; - gl_err = nk_false; - fprintf(stdout, "[X11] Failed to create OpenGL 3.0 context\n"); - fprintf(stdout, "[X11] ... using old-style GLX context!\n"); - glContext = create_context(win.dpy, win.fbc, 0, True, attr); - } - } - XSync(win.dpy, False); - XSetErrorHandler(old_handler); - if (gl_err || !glContext) - die("[X11]: Failed to create an OpenGL context\n"); - glXMakeCurrent(win.dpy, win.win, glContext); - } -//extern const unsigned char mii_proggy_data[]; -//extern const unsigned int mii_proggy_size; -extern const unsigned char mii_droid_data[]; -extern const unsigned int mii_droid_size; - - ctx = nk_x11_init(win.dpy, win.win); - /* Load Fonts: if none of these are loaded a default font will be used */ - { - struct nk_font_atlas *atlas; - nk_x11_font_stash_begin(&atlas); - struct nk_font_config cfg = nk_font_config(0); -#if 0 - nk_rune ranges[] = { - 0x0020, 0x007E, /* Ascii */ - 0x00A1, 0x00FF, /* Symbols + Umlaute */ - 0 - }; -#endif - cfg.range = nk_font_default_glyph_ranges(); - cfg.oversample_h = cfg.oversample_v = 1; - cfg.pixel_snap = true; - nk_main_font = nk_font_atlas_add_from_memory(atlas, - (void*)mii_droid_data, mii_droid_size, 20, &cfg); - nk_x11_font_stash_end(); - /*nk_style_load_all_cursors(ctx, atlas->cursors);*/ - if (nk_main_font) - nk_style_set_font(ctx, &nk_main_font->handle); - } - - mii_nuklear_init(&g_mii, ctx); - - bg.r = 0.0f; bg.g = 0.0f; bg.b = 0.0f; bg.a = 1.0f; -// bg.r = 0.8f; bg.g = 0.8f; bg.b = 0.8f; bg.a = 1.0f; - while (running) { - /* Input */ - XEvent evt; - nk_input_begin(ctx); - while (XPending(win.dpy)) { - XNextEvent(win.dpy, &evt); - if (evt.type == ClientMessage) goto cleanup; - if (XFilterEvent(&evt, win.win)) continue; - nk_x11_handle_event(&evt); - } - nk_input_end(ctx); - - /* GUI */ - mii_nuklear(&g_mii, ctx); - - /* Draw */ - XGetWindowAttributes(win.dpy, win.win, &win.attr); - glViewport(0, 0, win.width, win.height); - glClear(GL_COLOR_BUFFER_BIT); - glClearColor(bg.r, bg.g, bg.b, bg.a); - /* IMPORTANT: `nk_x11_render` modifies some global OpenGL state - * with blending, scissor, face culling, depth test and viewport and - * defaults everything back into a default state. - * Make sure to either a.) save and restore or b.) reset your own state after - * rendering the UI. */ - nk_x11_render(NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER); - glXSwapBuffers(win.dpy, win.win); - } - mii_dispose(&g_mii); -cleanup: - nk_x11_shutdown(); - glXMakeCurrent(win.dpy, 0, 0); - glXDestroyContext(win.dpy, glContext); - XUnmapWindow(win.dpy, win.win); - XFreeColormap(win.dpy, win.cmap); - XDestroyWindow(win.dpy, win.win); - XCloseDisplay(win.dpy); - return 0; - -} diff --git a/nuklear/mii_fonts.c b/nuklear/mii_fonts.c deleted file mode 100644 index c6cc735..0000000 --- a/nuklear/mii_fonts.c +++ /dev/null @@ -1,9 +0,0 @@ - - -#define INCBIN_STYLE INCBIN_STYLE_SNAKE -#define INCBIN_PREFIX mii_ -#include "incbin.h" - -INCBIN(proggy, "fonts/ProggyClean.ttf"); -INCBIN(droid, "fonts/DroidSans.ttf"); - diff --git a/nuklear/mii_nuklear.c b/nuklear/mii_nuklear.c deleted file mode 100644 index 28939dc..0000000 --- a/nuklear/mii_nuklear.c +++ /dev/null @@ -1,500 +0,0 @@ -/* - * mii_nuklear.c - * - * Copyright (C) 2023 Michel Pollet - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include -#include - -#include "mii.h" -#include "mii_bank.h" -#include "mii_sw.h" -#include "mii_thread.h" - -#define NK_INCLUDE_FIXED_TYPES -#define NK_INCLUDE_STANDARD_IO -#define NK_INCLUDE_STANDARD_VARARGS -#define NK_INCLUDE_DEFAULT_ALLOCATOR -#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT -#define NK_INCLUDE_FONT_BAKING -#define NK_INCLUDE_DEFAULT_FONT -#define NK_BUTTON_TRIGGER_ON_RELEASE -#include "nuklear.h" -#include "nuklear_xlib_gl3.h" -//#include "stb_image_write.h" -#include -#include - -#define _NK_RGBA(_r,_g,_b,_a) {.r=_r,.g=_g,.b=_b,.a=_a} -static const struct nk_color style[NK_COLOR_COUNT] = { - [NK_COLOR_TEXT] = _NK_RGBA(0, 0, 0, 255), - [NK_COLOR_WINDOW] = _NK_RGBA(175, 175, 175, 255), - [NK_COLOR_HEADER] = _NK_RGBA(175, 175, 175, 255), - [NK_COLOR_BORDER] = _NK_RGBA(0, 0, 0, 255), - [NK_COLOR_BUTTON] = _NK_RGBA(185, 185, 185, 255), - [NK_COLOR_BUTTON_HOVER] = _NK_RGBA(170, 170, 170, 255), - [NK_COLOR_BUTTON_ACTIVE] = _NK_RGBA(160, 160, 160, 255), - [NK_COLOR_TOGGLE] = _NK_RGBA(150, 150, 150, 255), - [NK_COLOR_TOGGLE_HOVER] = _NK_RGBA(120, 120, 120, 255), - [NK_COLOR_TOGGLE_CURSOR] = _NK_RGBA(175, 175, 175, 255), - [NK_COLOR_SELECT] = _NK_RGBA(190, 190, 190, 255), - [NK_COLOR_SELECT_ACTIVE] = _NK_RGBA(175, 175, 175, 255), - [NK_COLOR_SLIDER] = _NK_RGBA(190, 190, 190, 255), - [NK_COLOR_SLIDER_CURSOR] = _NK_RGBA(80, 80, 80, 255), - [NK_COLOR_SLIDER_CURSOR_HOVER] = _NK_RGBA(70, 70, 70, 255), - [NK_COLOR_SLIDER_CURSOR_ACTIVE] = _NK_RGBA(60, 60, 60, 255), - [NK_COLOR_PROPERTY] = _NK_RGBA(175, 175, 175, 255), - [NK_COLOR_EDIT] = _NK_RGBA(150, 150, 150, 255), - [NK_COLOR_EDIT_CURSOR] = _NK_RGBA(0, 0, 0, 255), - [NK_COLOR_COMBO] = _NK_RGBA(175, 175, 175, 255), - [NK_COLOR_CHART] = _NK_RGBA(160, 160, 160, 255), - [NK_COLOR_CHART_COLOR] = _NK_RGBA(45, 45, 45, 255), - [NK_COLOR_CHART_COLOR_HIGHLIGHT] = _NK_RGBA( 255, 0, 0, 255), - [NK_COLOR_SCROLLBAR] = _NK_RGBA(180, 180, 180, 255), - [NK_COLOR_SCROLLBAR_CURSOR] = _NK_RGBA(140, 140, 140, 255), - [NK_COLOR_SCROLLBAR_CURSOR_HOVER] = _NK_RGBA(150, 150, 150, 255), - [NK_COLOR_SCROLLBAR_CURSOR_ACTIVE] = _NK_RGBA(160, 160, 160, 255), - [NK_COLOR_TAB_HEADER] = _NK_RGBA(180, 180, 180, 255), -}; - -static GLuint screen_texture; -static struct nk_image screen_nk; - - -extern struct nk_font *nk_main_font; -struct nk_font *nk_mono_font = NULL; - -extern const unsigned char mii_proggy_data[]; -extern const unsigned int mii_proggy_size; -extern const unsigned char mii_droid_data[]; -extern const unsigned int mii_droid_size; - -void -mii_nuklear_init( - mii_t *mii, - struct nk_context *ctx) -{ - nk_style_from_table(ctx, style); - - { - struct nk_font_atlas *atlas; - nk_x11_font_stash_begin(&atlas); - struct nk_font_config cfg = nk_font_config(0); - #if 0 - nk_rune ranges[] = { - 0x0020, 0x007E, /* Ascii */ - 0x00A1, 0x00FF, /* Symbols + Umlaute */ - 0 - }; - #endif - cfg.range = nk_font_default_glyph_ranges(); - cfg.oversample_h = cfg.oversample_v = 1; - cfg.pixel_snap = true; - struct nk_font *nkf = nk_font_atlas_add_from_memory(atlas, - (void*)mii_proggy_data, mii_proggy_size, 20, &cfg); - nk_x11_font_stash_end(); - nk_mono_font = nkf; - } - - glGenTextures(1, &screen_texture); - glBindTexture(GL_TEXTURE_2D, screen_texture); - - glTexImage2D(GL_TEXTURE_2D, 0, 4, - MII_VRAM_WIDTH, - MII_VRAM_HEIGHT, 0, GL_RGBA, - GL_UNSIGNED_BYTE, - mii->video.pixels); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -// printf("%s texture created %d\n", __func__, screen_texture); -// display opengl error - GLenum err = glGetError(); - if (err != GL_NO_ERROR) { - printf("Error creating texture: %d\n", err); - } - screen_nk = nk_subimage_id( - screen_texture, MII_VRAM_WIDTH, MII_VRAM_HEIGHT, - nk_rect(0, 0, MII_VIDEO_WIDTH, MII_VIDEO_HEIGHT)); - - /* start the CPU/emulator thread */ - mii_thread_start(mii); - -} - - -extern int disk2_debug; -int show_zero_page = 0; - -static void -mii_nuklear_handle_input( - mii_t *mii, - struct nk_context *ctx) -{ - struct nk_input *in = &ctx->input; - if (in->keyboard.text_len) { - // printf("INPUT %d %02x %s\n", - // in->keyboard.text_len, in->keyboard.text[0], in->keyboard.text); - if (in->keyboard.text_len < 4) { - mii_keypress(mii, in->keyboard.text[0]); - } else if (in->keyboard.text_len > 1) { - uint32_t *raw = ((uint32_t *) in->keyboard.text); - for (int ki = 0; ki < in->keyboard.text_len / 4; ki ++) { - uint32_t key = (raw[ki] >> 16) & 0xffff; - uint8_t down = raw[ki] & 0xff; - printf("KEY %04x %s\n", key, down ? "down" : "up"); - if (down) { - if (key == 0xffc9) { // F12 - if (nk_input_is_key_down(in, NK_KEY_CTRL)) { - mii_th_signal_t sig = { - .cmd = SIGNAL_RESET, - .data = nk_input_is_key_down(in, NK_KEY_SHIFT) - }; - mii_th_fifo_write(mii_thread_get_fifo(mii), sig); - printf("RESET\n"); - } - } else if (key == 0xffc8) { // F11 - if (nk_input_is_key_down(in, NK_KEY_CTRL)) { - mii_th_signal_t sig = { - .cmd = SIGNAL_STOP, - }; - mii_th_fifo_write(mii_thread_get_fifo(mii), sig); - printf("STOP\n"); - } - } else if (key == 0xffc7) { // F10 - if (nk_input_is_key_down(in, NK_KEY_CTRL)) { - mii_th_signal_t sig = { - .cmd = SIGNAL_STEP, - }; - mii_th_fifo_write(mii_thread_get_fifo(mii), sig); - printf("STEP\n"); - } - } else if (key == 0xffc6) { // F9 - if (nk_input_is_key_down(in, NK_KEY_CTRL)) { - mii_th_signal_t sig = { - .cmd = SIGNAL_RUN, - }; - mii_th_fifo_write(mii_thread_get_fifo(mii), sig); - printf("RUN\n"); - } - } else if (key == 0xffc2) { // F5 - mii->speed = 1.0; - printf("Speed Normal (1MHz)\n"); - } else if (key == 0xffc3) { // F6 - mii->speed = 4; - printf("Speed Fast (4MHz)\n"); - } - } - if (key == 0xffeb || key == 0xffec) { // super left/right - key -= 0xffeb; - mii_bank_t *bank = &mii->bank[MII_BANK_MAIN]; - uint8_t old = mii_bank_peek(bank, 0xc061 + key); - mii_bank_poke(bank, 0xc061 + key, down ? 0x80 : 0); - if (!!down != !!old) { - printf("Apple %s %s\n", key ? "Open" : "Close", - down ? "down" : "up"); - } - } - } - } - in->keyboard.text_len = 0; - } else { - mii_th_signal_t sig = {.cmd = -1 }; - if (nk_input_is_key_pressed(in, NK_KEY_ENTER)) - sig.data = 0x0d; - else if (nk_input_is_key_pressed(in, NK_KEY_BACKSPACE)) - sig.data = 0x08; - else if (nk_input_is_key_pressed(in, NK_KEY_DEL)) - sig.data = 0x7f; - else if (nk_input_is_key_pressed(in, NK_KEY_UP)) - sig.data = 'K' - 'A' + 1; - else if (nk_input_is_key_pressed(in, NK_KEY_DOWN)) - sig.data = 'J' - 'A' + 1; - else if (nk_input_is_key_pressed(in, NK_KEY_LEFT)) - sig.data = 'H' - 'A' + 1; - else if (nk_input_is_key_pressed(in, NK_KEY_RIGHT)) - sig.data = 'U' - 'A' + 1; - else if (nk_input_is_key_pressed(in, NK_KEY_ESCAPE)) - sig.data = 0x1b; - if (sig.data) { - // mii_th_fifo_write(mii_thread_get_fifo(mii), sig); - // printf("Key %d\n", sig.data); - mii_keypress(mii, sig.data); - } - } -} - -void -mii_nuklear( - mii_t *mii, - struct nk_context *ctx) -{ - if (mii->video.frame_count != mii->video.frame_drawn) { - mii->video.frame_drawn = mii->video.frame_count; - // update texture with new pixels; we only need 192 lines, the others - // are padding for the power of 2 texture - glBindTexture(GL_TEXTURE_2D, screen_texture); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, - MII_VRAM_WIDTH, - MII_VIDEO_HEIGHT, GL_RGBA, - GL_UNSIGNED_BYTE, - mii->video.pixels); - } - mii_nuklear_handle_input(mii, ctx); - int height = 720 - 8; - int width = MII_VIDEO_WIDTH * (height / (float)MII_VIDEO_HEIGHT); - int xpos = 1280 / 2 - width / 2; - { - struct nk_style *s = &ctx->style; - nk_style_push_color(ctx, &s->window.background, - nk_rgba(0,0,0, 255)); - nk_style_push_style_item(ctx, &s->window.fixed_background, - nk_style_item_color(nk_rgba(0,0,0, 255))); - if (nk_begin(ctx, "Apple //e Enhanced", - nk_rect(xpos, 0, width + 10, height + 20), - NK_WINDOW_NO_SCROLLBAR)) { - nk_layout_row_static(ctx, height, width, 1); - static int was_in = -1; - if (nk_widget_is_hovered(ctx) && mii->mouse.enabled) { - if (was_in != 1) { - was_in = 1; - ctx->input.mouse.grab = 1; - // printf("IN\n"); - } - struct nk_rect bounds = nk_widget_bounds(ctx); - // normalize mouse coordinates - double x = ctx->input.mouse.pos.x - bounds.x; - double y = ctx->input.mouse.pos.y - bounds.y; - // get mouse button state - int button = ctx->input.mouse.buttons[NK_BUTTON_LEFT].down; - // clamp coordinates inside bounds - double vw = bounds.w; - double vh = bounds.h; - double mw = mii->mouse.max_x - mii->mouse.min_x; - double mh = mii->mouse.max_y - mii->mouse.min_y; - mii->mouse.x = mii->mouse.min_x + (x * mw / vw) + 0.5; - mii->mouse.y = mii->mouse.min_y + (y * mh / vh) + 0.5; - mii->mouse.button = button; - // printf("Mouse is %d %d\n", (int)mii->mouse.x, (int)mii->mouse.y); - } else { - if (was_in == 1) { - was_in = 0; - ctx->input.mouse.ungrab = 1; - // printf("OUT\n"); - } - } - nk_image(ctx, screen_nk); - nk_end(ctx); - nk_style_pop_color(ctx); - nk_style_pop_style_item(ctx); - } - } - - struct nk_rect bounds = { .x = 0, .y = 0, .w = xpos, .h = height }; -// nk_window_get_bounds(ctx); - bool in = nk_input_is_mouse_hovering_rect(&ctx->input, bounds); - static bool menu_open = false; - - if (in || menu_open) { - struct nk_style *s = &ctx->style; - nk_style_push_color(ctx, &s->window.background, - nk_rgba(175, 175, 175, 255)); - nk_style_push_style_item(ctx, &s->window.fixed_background, - nk_style_item_color(nk_rgba(175, 175, 175, 255))); - - if (nk_begin(ctx, "Left Bar", - nk_rect(0, 0, xpos, height + 20), - NK_WINDOW_NO_SCROLLBAR)) { -#if 0 - nk_menubar_begin(ctx); - nk_layout_row_begin(ctx, NK_STATIC, 25, 2); - nk_layout_row_push(ctx, 60); - bool menu = false; - if (nk_menu_begin_label(ctx, "MII", NK_TEXT_LEFT, - nk_vec2(140, 200))) { - static size_t prog = 40; - static float slider = 0.5; - static int check = nk_true; - nk_layout_row_dynamic(ctx, 25, 1); - if (nk_menu_item_label(ctx, "Hide", NK_TEXT_LEFT)) - ;//show_menu = nk_false; - if (nk_menu_item_label(ctx, "About", NK_TEXT_LEFT)) - ;//show_app_about = nk_true; - nk_progress(ctx, &prog, 100, NK_MODIFIABLE); - nk_slider_float(ctx, 0.01, &slider, 1.0, 0.05); - nk_checkbox_label(ctx, "Mute", &check); - nk_menu_end(ctx); - menu = true; - } - menu_open = menu; - nk_menubar_end(ctx); - nk_layout_space_end(ctx); -#endif - int rw = xpos - 8; - // nk_layout_row_dynamic(ctx, 4, 1); - // nk_spacing(ctx, 1); - - nk_layout_row_static(ctx, 30, rw, 1); - if (nk_button_label(ctx, "C-RESET")) - mii_reset(mii, false); - if (nk_button_label(ctx, "C-OA-RESET")) - mii_reset(mii, true); -// nk_layout_row_dynamic(ctx, 0, 1); - nk_layout_row_begin(ctx, NK_STATIC, 30, 2); - nk_layout_row_push(ctx, 20); - nk_label(ctx, "V:", NK_TEXT_LEFT); - nk_layout_row_push(ctx, rw - 20 - 4); - const char *video_modes[] = { - "Color", - "Green", - "Amber", - }; - mii->video.color_mode = nk_combo(ctx, - video_modes, NK_LEN(video_modes), - mii->video.color_mode, 25, nk_vec2(80,200)); - nk_layout_space_end(ctx); - - nk_layout_row_begin(ctx, NK_STATIC, 30, 1); - nk_layout_row_push(ctx, rw); - const char *speed[] = { - "1 MHz", - "Slow", - "Fast", - }; - nk_label(ctx, "Speed:", NK_TEXT_LEFT); - nk_layout_row_push(ctx, 100); - int spi = mii->speed > .95 && mii->speed < 1.05 ? 0 : - mii->speed < 0.9 ? 1 : 2; - spi = nk_combo(ctx, - speed, NK_LEN(speed), - spi, 25, nk_vec2(80,200)); - mii->speed = spi == 0 ? 1.0 : spi == 1 ? 0.2 : 4.0; - nk_layout_space_end(ctx); - } - nk_end(ctx); - nk_style_pop_color(ctx); - nk_style_pop_style_item(ctx); - } - if ( 0 && nk_begin(ctx, "Controls", - nk_rect(width, 0, 350, 10 + 192 * 3), - NK_WINDOW_NO_SCROLLBAR)) { - nk_layout_row_static(ctx, 30, 110, 2); - if (nk_button_label(ctx, "C-RESET")) - mii_reset(mii, false); - if (nk_button_label(ctx, "C-OA-RESET")) - mii_reset(mii, true); - #if 0 - if (nk_button_label(ctx, "Screenshot")) { - stbi_write_png("screen.png", - MII_VIDEO_WIDTH, MII_VIDEO_HEIGHT, 4, mii->video.pixels, - MII_VRAM_WIDTH * 4); - printf("Screenshot taken\n"); - } - #endif - nk_layout_row_dynamic(ctx, 30, 4); - nk_label(ctx, "Speed:", NK_TEXT_CENTERED); - if (nk_option_label(ctx, "Slow", mii->speed < 0.9)) mii->speed = 0.2; - if (nk_option_label(ctx, "1 MHz", mii->speed > .95 && mii->speed < 1.05)) mii->speed = 1.0; - if (nk_option_label(ctx, "Fast", mii->speed > 1.1 && mii->speed < 4.1)) mii->speed = 4.0; - - nk_layout_row_dynamic(ctx, 30, 4); - nk_label(ctx, "Video:", NK_TEXT_CENTERED); - if (nk_option_label(ctx, "Color", mii->video.color_mode == MII_VIDEO_COLOR)) - mii->video.color_mode = MII_VIDEO_COLOR; - if (nk_option_label(ctx, "Green", mii->video.color_mode == MII_VIDEO_GREEN)) - mii->video.color_mode = MII_VIDEO_GREEN; - if (nk_option_label(ctx, "Amber", mii->video.color_mode == MII_VIDEO_AMBER)) - mii->video.color_mode = MII_VIDEO_AMBER; - -#if 0 - nk_layout_row_dynamic(ctx, 20, 1); - nk_style_set_font(ctx, &nk_mono_font->handle); - struct nk_color save = ctx->style.window.background; - - ctx->style.window.background = (struct nk_color)_NK_RGBA(0, 0, 0, 255); - struct nk_color fore = (struct nk_color)_NK_RGBA(0, 255, 0, 255); - char label[64]; - mii_dasm_t _dasm = {}; - mii_dasm_t *dasm = &_dasm; - mii_dasm_init(dasm, mii, 0); - dasm->mii = mii; - // display the last few cycles up to the PC - for (int di = 0; di < 3; di++) { - int pci = (mii_trace.idx + MII_PC_LOG_SIZE - 3 + di) % MII_PC_LOG_SIZE; - dasm->pc = mii_trace.log[pci]; - mii_dasm_step(dasm, label, sizeof(label)); - if (di == 2) - label[0] = '*'; - nk_label_colored(ctx, label, NK_TEXT_LEFT, fore); - } - // and the (potentially) next instruction here - mii_dasm_step(dasm, label, sizeof(label)); - nk_label_colored(ctx, label, NK_TEXT_LEFT, fore); - - sprintf(label, "A:%02X X:%02X Y:%02X S:%02X", - mii->cpu.A, mii->cpu.X, mii->cpu.Y, mii->cpu.S); - nk_label_colored(ctx, label, NK_TEXT_CENTERED, fore); - char n[] = {'C','Z','I','D','B','V','N'}; - label[0] = 0; - sprintf(label, "%04x ", mii->cpu.PC); - for (int i = 0; i < 7; i++) - sprintf(label + strlen(label), "%c%d ", n[i], - mii->cpu.P.P[i]); - nk_label_colored(ctx, label, NK_TEXT_CENTERED, fore); - - ctx->style.window.background = save; - nk_style_set_font(ctx, &nk_main_font->handle); -#endif - nk_layout_row_static(ctx, 30, 30, 3); - - if (nk_button_symbol(ctx, NK_SYMBOL_RECT_SOLID)) { - mii_th_fifo_write(mii_thread_get_fifo(mii), (mii_th_signal_t){.cmd = SIGNAL_STOP}); - } - if (nk_button_symbol(ctx, NK_SYMBOL_PLUS)) { - mii_th_fifo_write(mii_thread_get_fifo(mii), (mii_th_signal_t){.cmd = SIGNAL_STEP}); - } - if (nk_button_symbol(ctx, NK_SYMBOL_TRIANGLE_RIGHT)) { - mii_th_fifo_write(mii_thread_get_fifo(mii), (mii_th_signal_t){.cmd = SIGNAL_RUN}); - } - nk_layout_row_dynamic(ctx, 20, 3); - { - char label[32]; - sprintf(label, "CPU: %.1fMHz", mii->speed_current); - nk_label(ctx, label, NK_TEXT_CENTERED); - } -#if 0 - nk_layout_row_dynamic(ctx, 20, 2); - nk_checkbox_label(ctx, "Disk II Debug", &disk2_debug); - nk_checkbox_label(ctx, "Slowmo", &mii_SLOW); -// nk_checkbox_label(ctx, "Zero Page", &show_zero_page); -#endif - nk_end(ctx); - } - if (show_zero_page) { - if (nk_begin(ctx, "Zero Page", - nk_rect(0, 10 + 192 * 3, 600, 10 + 16 * 20), - 0 )) { - nk_layout_row_dynamic(ctx, 20, 1); - nk_style_set_font(ctx, &nk_mono_font->handle); - struct nk_color fore = (struct nk_color)_NK_RGBA(0, 255, 0, 255); - uint8_t *zp = mii->bank[0].mem; - char label[128]; - for (int ri = 0; ri < (256 / 16); ri++) { - sprintf(label, "%02x: ", ri * 16); - for (int ci = 0; ci < 16; ci++) { - sprintf(label + strlen(label), "%02X ", - zp[ri * 16 + ci]); - } - nk_label_colored(ctx, label, NK_TEXT_LEFT, fore); - } - nk_style_set_font(ctx, &nk_main_font->handle); - nk_end(ctx); - } - } -} diff --git a/nuklear/mii_stb_implement.c b/nuklear/mii_stb_implement.c deleted file mode 100644 index 32fa1f8..0000000 --- a/nuklear/mii_stb_implement.c +++ /dev/null @@ -1,22 +0,0 @@ -/* - * mii_stb.h - * - * Copyright (C) 2023 Michel Pollet - * - * SPDX-License-Identifier: MIT - */ - - -#define NK_INCLUDE_FIXED_TYPES -#define NK_INCLUDE_STANDARD_IO -#define NK_INCLUDE_STANDARD_VARARGS -#define NK_INCLUDE_DEFAULT_ALLOCATOR -#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT -#define NK_INCLUDE_FONT_BAKING -#define NK_INCLUDE_DEFAULT_FONT -#define NK_BUTTON_TRIGGER_ON_RELEASE -#define NK_IMPLEMENTATION -#include "nuklear.h" - -#define STB_IMAGE_WRITE_IMPLEMENTATION -#include "stb_image_write.h" diff --git a/nuklear/nuklear.h b/nuklear/nuklear.h deleted file mode 100644 index 4012fda..0000000 --- a/nuklear/nuklear.h +++ /dev/null @@ -1,30034 +0,0 @@ -/* -/// # Nuklear -/// ![](https://cloud.githubusercontent.com/assets/8057201/11761525/ae06f0ca-a0c6-11e5-819d-5610b25f6ef4.gif) -/// -/// ## Contents -/// 1. About section -/// 2. Highlights section -/// 3. Features section -/// 4. Usage section -/// 1. Flags section -/// 2. Constants section -/// 3. Dependencies section -/// 5. Example section -/// 6. API section -/// 1. Context section -/// 2. Input section -/// 3. Drawing section -/// 4. Window section -/// 5. Layouting section -/// 6. Groups section -/// 7. Tree section -/// 8. Properties section -/// 7. License section -/// 8. Changelog section -/// 9. Gallery section -/// 10. Credits section -/// -/// ## About -/// This is a minimal state immediate mode graphical user interface toolkit -/// written in ANSI C and licensed under public domain. It was designed as a simple -/// embeddable user interface for application and does not have any dependencies, -/// a default renderbackend or OS window and input handling but instead provides a very modular -/// library approach by using simple input state for input and draw -/// commands describing primitive shapes as output. So instead of providing a -/// layered library that tries to abstract over a number of platform and -/// render backends it only focuses on the actual UI. -/// -/// ## Highlights -/// - Graphical user interface toolkit -/// - Single header library -/// - Written in C89 (a.k.a. ANSI C or ISO C90) -/// - Small codebase (~18kLOC) -/// - Focus on portability, efficiency and simplicity -/// - No dependencies (not even the standard library if not wanted) -/// - Fully skinnable and customizable -/// - Low memory footprint with total memory control if needed or wanted -/// - UTF-8 support -/// - No global or hidden state -/// - Customizable library modules (you can compile and use only what you need) -/// - Optional font baker and vertex buffer output -/// - [Code available on github](https://github.com/Immediate-Mode-UI/Nuklear/) -/// -/// ## Features -/// - Absolutely no platform dependent code -/// - Memory management control ranging from/to -/// - Ease of use by allocating everything from standard library -/// - Control every byte of memory inside the library -/// - Font handling control ranging from/to -/// - Use your own font implementation for everything -/// - Use this libraries internal font baking and handling API -/// - Drawing output control ranging from/to -/// - Simple shapes for more high level APIs which already have drawing capabilities -/// - Hardware accessible anti-aliased vertex buffer output -/// - Customizable colors and properties ranging from/to -/// - Simple changes to color by filling a simple color table -/// - Complete control with ability to use skinning to decorate widgets -/// - Bendable UI library with widget ranging from/to -/// - Basic widgets like buttons, checkboxes, slider, ... -/// - Advanced widget like abstract comboboxes, contextual menus,... -/// - Compile time configuration to only compile what you need -/// - Subset which can be used if you do not want to link or use the standard library -/// - Can be easily modified to only update on user input instead of frame updates -/// -/// ## Usage -/// This library is self contained in one single header file and can be used either -/// in header only mode or in implementation mode. The header only mode is used -/// by default when included and allows including this header in other headers -/// and does not contain the actual implementation.

-/// -/// The implementation mode requires to define the preprocessor macro -/// NK_IMPLEMENTATION in *one* .c/.cpp file before #including this file, e.g.: -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~C -/// #define NK_IMPLEMENTATION -/// #include "nuklear.h" -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Also optionally define the symbols listed in the section "OPTIONAL DEFINES" -/// below in header and implementation mode if you want to use additional functionality -/// or need more control over the library. -/// -/// !!! WARNING -/// Every time nuklear is included define the same compiler flags. This very important not doing so could lead to compiler errors or even worse stack corruptions. -/// -/// ### Flags -/// Flag | Description -/// --------------------------------|------------------------------------------ -/// NK_PRIVATE | If defined declares all functions as static, so they can only be accessed inside the file that contains the implementation -/// NK_INCLUDE_FIXED_TYPES | If defined it will include header `` for fixed sized types otherwise nuklear tries to select the correct type. If that fails it will throw a compiler error and you have to select the correct types yourself. -/// NK_INCLUDE_DEFAULT_ALLOCATOR | If defined it will include header `` and provide additional functions to use this library without caring for memory allocation control and therefore ease memory management. -/// NK_INCLUDE_STANDARD_IO | If defined it will include header `` and provide additional functions depending on file loading. -/// NK_INCLUDE_STANDARD_VARARGS | If defined it will include header and provide additional functions depending on file loading. -/// NK_INCLUDE_STANDARD_BOOL | If defined it will include header `` for nk_bool otherwise nuklear defines nk_bool as int. -/// NK_INCLUDE_VERTEX_BUFFER_OUTPUT | Defining this adds a vertex draw command list backend to this library, which allows you to convert queue commands into vertex draw commands. This is mainly if you need a hardware accessible format for OpenGL, DirectX, Vulkan, Metal,... -/// NK_INCLUDE_FONT_BAKING | Defining this adds `stb_truetype` and `stb_rect_pack` implementation to this library and provides font baking and rendering. If you already have font handling or do not want to use this font handler you don't have to define it. -/// NK_INCLUDE_DEFAULT_FONT | Defining this adds the default font: ProggyClean.ttf into this library which can be loaded into a font atlas and allows using this library without having a truetype font -/// NK_INCLUDE_COMMAND_USERDATA | Defining this adds a userdata pointer into each command. Can be useful for example if you want to provide custom shaders depending on the used widget. Can be combined with the style structures. -/// NK_BUTTON_TRIGGER_ON_RELEASE | Different platforms require button clicks occurring either on buttons being pressed (up to down) or released (down to up). By default this library will react on buttons being pressed, but if you define this it will only trigger if a button is released. -/// NK_ZERO_COMMAND_MEMORY | Defining this will zero out memory for each drawing command added to a drawing queue (inside nk_command_buffer_push). Zeroing command memory is very useful for fast checking (using memcmp) if command buffers are equal and avoid drawing frames when nothing on screen has changed since previous frame. -/// NK_UINT_DRAW_INDEX | Defining this will set the size of vertex index elements when using NK_VERTEX_BUFFER_OUTPUT to 32bit instead of the default of 16bit -/// NK_KEYSTATE_BASED_INPUT | Define this if your backend uses key state for each frame rather than key press/release events -/// -/// !!! WARNING -/// The following flags will pull in the standard C library: -/// - NK_INCLUDE_DEFAULT_ALLOCATOR -/// - NK_INCLUDE_STANDARD_IO -/// - NK_INCLUDE_STANDARD_VARARGS -/// -/// !!! WARNING -/// The following flags if defined need to be defined for both header and implementation: -/// - NK_INCLUDE_FIXED_TYPES -/// - NK_INCLUDE_DEFAULT_ALLOCATOR -/// - NK_INCLUDE_STANDARD_VARARGS -/// - NK_INCLUDE_STANDARD_BOOL -/// - NK_INCLUDE_VERTEX_BUFFER_OUTPUT -/// - NK_INCLUDE_FONT_BAKING -/// - NK_INCLUDE_DEFAULT_FONT -/// - NK_INCLUDE_STANDARD_VARARGS -/// - NK_INCLUDE_COMMAND_USERDATA -/// - NK_UINT_DRAW_INDEX -/// -/// ### Constants -/// Define | Description -/// --------------------------------|--------------------------------------- -/// NK_BUFFER_DEFAULT_INITIAL_SIZE | Initial buffer size allocated by all buffers while using the default allocator functions included by defining NK_INCLUDE_DEFAULT_ALLOCATOR. If you don't want to allocate the default 4k memory then redefine it. -/// NK_MAX_NUMBER_BUFFER | Maximum buffer size for the conversion buffer between float and string Under normal circumstances this should be more than sufficient. -/// NK_INPUT_MAX | Defines the max number of bytes which can be added as text input in one frame. Under normal circumstances this should be more than sufficient. -/// -/// !!! WARNING -/// The following constants if defined need to be defined for both header and implementation: -/// - NK_MAX_NUMBER_BUFFER -/// - NK_BUFFER_DEFAULT_INITIAL_SIZE -/// - NK_INPUT_MAX -/// -/// ### Dependencies -/// Function | Description -/// ------------|--------------------------------------------------------------- -/// NK_ASSERT | If you don't define this, nuklear will use with assert(). -/// NK_MEMSET | You can define this to 'memset' or your own memset implementation replacement. If not nuklear will use its own version. -/// NK_MEMCPY | You can define this to 'memcpy' or your own memcpy implementation replacement. If not nuklear will use its own version. -/// NK_INV_SQRT | You can define this to your own inverse sqrt implementation replacement. If not nuklear will use its own slow and not highly accurate version. -/// NK_SIN | You can define this to 'sinf' or your own sine implementation replacement. If not nuklear will use its own approximation implementation. -/// NK_COS | You can define this to 'cosf' or your own cosine implementation replacement. If not nuklear will use its own approximation implementation. -/// NK_STRTOD | You can define this to `strtod` or your own string to double conversion implementation replacement. If not defined nuklear will use its own imprecise and possibly unsafe version (does not handle nan or infinity!). -/// NK_DTOA | You can define this to `dtoa` or your own double to string conversion implementation replacement. If not defined nuklear will use its own imprecise and possibly unsafe version (does not handle nan or infinity!). -/// NK_VSNPRINTF| If you define `NK_INCLUDE_STANDARD_VARARGS` as well as `NK_INCLUDE_STANDARD_IO` and want to be safe define this to `vsnprintf` on compilers supporting later versions of C or C++. By default nuklear will check for your stdlib version in C as well as compiler version in C++. if `vsnprintf` is available it will define it to `vsnprintf` directly. If not defined and if you have older versions of C or C++ it will be defined to `vsprintf` which is unsafe. -/// -/// !!! WARNING -/// The following dependencies will pull in the standard C library if not redefined: -/// - NK_ASSERT -/// -/// !!! WARNING -/// The following dependencies if defined need to be defined for both header and implementation: -/// - NK_ASSERT -/// -/// !!! WARNING -/// The following dependencies if defined need to be defined only for the implementation part: -/// - NK_MEMSET -/// - NK_MEMCPY -/// - NK_SQRT -/// - NK_SIN -/// - NK_COS -/// - NK_STRTOD -/// - NK_DTOA -/// - NK_VSNPRINTF -/// -/// ## Example -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// // init gui state -/// enum {EASY, HARD}; -/// static int op = EASY; -/// static float value = 0.6f; -/// static int i = 20; -/// struct nk_context ctx; -/// -/// nk_init_fixed(&ctx, calloc(1, MAX_MEMORY), MAX_MEMORY, &font); -/// if (nk_begin(&ctx, "Show", nk_rect(50, 50, 220, 220), -/// NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_CLOSABLE)) { -/// // fixed widget pixel width -/// nk_layout_row_static(&ctx, 30, 80, 1); -/// if (nk_button_label(&ctx, "button")) { -/// // event handling -/// } -/// -/// // fixed widget window ratio width -/// nk_layout_row_dynamic(&ctx, 30, 2); -/// if (nk_option_label(&ctx, "easy", op == EASY)) op = EASY; -/// if (nk_option_label(&ctx, "hard", op == HARD)) op = HARD; -/// -/// // custom widget pixel width -/// nk_layout_row_begin(&ctx, NK_STATIC, 30, 2); -/// { -/// nk_layout_row_push(&ctx, 50); -/// nk_label(&ctx, "Volume:", NK_TEXT_LEFT); -/// nk_layout_row_push(&ctx, 110); -/// nk_slider_float(&ctx, 0, &value, 1.0f, 0.1f); -/// } -/// nk_layout_row_end(&ctx); -/// } -/// nk_end(&ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// ![](https://cloud.githubusercontent.com/assets/8057201/10187981/584ecd68-675c-11e5-897c-822ef534a876.png) -/// -/// ## API -/// -*/ -#ifndef NK_SINGLE_FILE - #define NK_SINGLE_FILE -#endif - -#ifndef NK_NUKLEAR_H_ -#define NK_NUKLEAR_H_ - -#ifdef __cplusplus -extern "C" { -#endif -/* - * ============================================================== - * - * CONSTANTS - * - * =============================================================== - */ -#define NK_UNDEFINED (-1.0f) -#define NK_UTF_INVALID 0xFFFD /* internal invalid utf8 rune */ -#define NK_UTF_SIZE 4 /* describes the number of bytes a glyph consists of*/ -#ifndef NK_INPUT_MAX - #define NK_INPUT_MAX 16 -#endif -#ifndef NK_MAX_NUMBER_BUFFER - #define NK_MAX_NUMBER_BUFFER 64 -#endif -#ifndef NK_SCROLLBAR_HIDING_TIMEOUT - #define NK_SCROLLBAR_HIDING_TIMEOUT 4.0f -#endif -/* - * ============================================================== - * - * HELPER - * - * =============================================================== - */ -#ifndef NK_API - #ifdef NK_PRIVATE - #if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199409L)) - #define NK_API static inline - #elif defined(__cplusplus) - #define NK_API static inline - #else - #define NK_API static - #endif - #else - #define NK_API extern - #endif -#endif -#ifndef NK_LIB - #ifdef NK_SINGLE_FILE - #define NK_LIB static - #else - #define NK_LIB extern - #endif -#endif - -#define NK_INTERN static -#define NK_STORAGE static -#define NK_GLOBAL static - -#define NK_FLAG(x) (1 << (x)) -#define NK_STRINGIFY(x) #x -#define NK_MACRO_STRINGIFY(x) NK_STRINGIFY(x) -#define NK_STRING_JOIN_IMMEDIATE(arg1, arg2) arg1 ## arg2 -#define NK_STRING_JOIN_DELAY(arg1, arg2) NK_STRING_JOIN_IMMEDIATE(arg1, arg2) -#define NK_STRING_JOIN(arg1, arg2) NK_STRING_JOIN_DELAY(arg1, arg2) - -#ifdef _MSC_VER - #define NK_UNIQUE_NAME(name) NK_STRING_JOIN(name,__COUNTER__) -#else - #define NK_UNIQUE_NAME(name) NK_STRING_JOIN(name,__LINE__) -#endif - -#ifndef NK_STATIC_ASSERT - #define NK_STATIC_ASSERT(exp) typedef char NK_UNIQUE_NAME(_dummy_array)[(exp)?1:-1] -#endif - -#ifndef NK_FILE_LINE -#ifdef _MSC_VER - #define NK_FILE_LINE __FILE__ ":" NK_MACRO_STRINGIFY(__COUNTER__) -#else - #define NK_FILE_LINE __FILE__ ":" NK_MACRO_STRINGIFY(__LINE__) -#endif -#endif - -#define NK_MIN(a,b) ((a) < (b) ? (a) : (b)) -#define NK_MAX(a,b) ((a) < (b) ? (b) : (a)) -#define NK_CLAMP(i,v,x) (NK_MAX(NK_MIN(v,x), i)) - -#ifdef NK_INCLUDE_STANDARD_VARARGS - #include - #if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */ - #include - #define NK_PRINTF_FORMAT_STRING _Printf_format_string_ - #else - #define NK_PRINTF_FORMAT_STRING - #endif - #if defined(__GNUC__) - #define NK_PRINTF_VARARG_FUNC(fmtargnumber) __attribute__((format(__printf__, fmtargnumber, fmtargnumber+1))) - #define NK_PRINTF_VALIST_FUNC(fmtargnumber) __attribute__((format(__printf__, fmtargnumber, 0))) - #else - #define NK_PRINTF_VARARG_FUNC(fmtargnumber) - #define NK_PRINTF_VALIST_FUNC(fmtargnumber) - #endif -#endif - -/* - * =============================================================== - * - * BASIC - * - * =============================================================== - */ -#ifdef NK_INCLUDE_FIXED_TYPES - #include - #define NK_INT8 int8_t - #define NK_UINT8 uint8_t - #define NK_INT16 int16_t - #define NK_UINT16 uint16_t - #define NK_INT32 int32_t - #define NK_UINT32 uint32_t - #define NK_SIZE_TYPE uintptr_t - #define NK_POINTER_TYPE uintptr_t -#else - #ifndef NK_INT8 - #define NK_INT8 signed char - #endif - #ifndef NK_UINT8 - #define NK_UINT8 unsigned char - #endif - #ifndef NK_INT16 - #define NK_INT16 signed short - #endif - #ifndef NK_UINT16 - #define NK_UINT16 unsigned short - #endif - #ifndef NK_INT32 - #if defined(_MSC_VER) - #define NK_INT32 __int32 - #else - #define NK_INT32 signed int - #endif - #endif - #ifndef NK_UINT32 - #if defined(_MSC_VER) - #define NK_UINT32 unsigned __int32 - #else - #define NK_UINT32 unsigned int - #endif - #endif - #ifndef NK_SIZE_TYPE - #if defined(_WIN64) && defined(_MSC_VER) - #define NK_SIZE_TYPE unsigned __int64 - #elif (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER) - #define NK_SIZE_TYPE unsigned __int32 - #elif defined(__GNUC__) || defined(__clang__) - #if defined(__x86_64__) || defined(__ppc64__) || defined(__aarch64__) - #define NK_SIZE_TYPE unsigned long - #else - #define NK_SIZE_TYPE unsigned int - #endif - #else - #define NK_SIZE_TYPE unsigned long - #endif - #endif - #ifndef NK_POINTER_TYPE - #if defined(_WIN64) && defined(_MSC_VER) - #define NK_POINTER_TYPE unsigned __int64 - #elif (defined(_WIN32) || defined(WIN32)) && defined(_MSC_VER) - #define NK_POINTER_TYPE unsigned __int32 - #elif defined(__GNUC__) || defined(__clang__) - #if defined(__x86_64__) || defined(__ppc64__) || defined(__aarch64__) - #define NK_POINTER_TYPE unsigned long - #else - #define NK_POINTER_TYPE unsigned int - #endif - #else - #define NK_POINTER_TYPE unsigned long - #endif - #endif -#endif - -#ifndef NK_BOOL - #ifdef NK_INCLUDE_STANDARD_BOOL - #include - #define NK_BOOL bool - #else - #define NK_BOOL int /* could be char, use int for drop-in replacement backwards compatibility */ - #endif -#endif - -typedef NK_INT8 nk_char; -typedef NK_UINT8 nk_uchar; -typedef NK_UINT8 nk_byte; -typedef NK_INT16 nk_short; -typedef NK_UINT16 nk_ushort; -typedef NK_INT32 nk_int; -typedef NK_UINT32 nk_uint; -typedef NK_SIZE_TYPE nk_size; -typedef NK_POINTER_TYPE nk_ptr; -typedef NK_BOOL nk_bool; - -typedef nk_uint nk_hash; -typedef nk_uint nk_flags; -typedef nk_uint nk_rune; - -/* Make sure correct type size: - * This will fire with a negative subscript error if the type sizes - * are set incorrectly by the compiler, and compile out if not */ -NK_STATIC_ASSERT(sizeof(nk_short) == 2); -NK_STATIC_ASSERT(sizeof(nk_ushort) == 2); -NK_STATIC_ASSERT(sizeof(nk_uint) == 4); -NK_STATIC_ASSERT(sizeof(nk_int) == 4); -NK_STATIC_ASSERT(sizeof(nk_byte) == 1); -NK_STATIC_ASSERT(sizeof(nk_flags) >= 4); -NK_STATIC_ASSERT(sizeof(nk_rune) >= 4); -NK_STATIC_ASSERT(sizeof(nk_size) >= sizeof(void*)); -NK_STATIC_ASSERT(sizeof(nk_ptr) >= sizeof(void*)); -#ifdef NK_INCLUDE_STANDARD_BOOL -NK_STATIC_ASSERT(sizeof(nk_bool) == sizeof(bool)); -#else -NK_STATIC_ASSERT(sizeof(nk_bool) >= 2); -#endif - -/* ============================================================================ - * - * API - * - * =========================================================================== */ -struct nk_buffer; -struct nk_allocator; -struct nk_command_buffer; -struct nk_draw_command; -struct nk_convert_config; -struct nk_style_item; -struct nk_text_edit; -struct nk_draw_list; -struct nk_user_font; -struct nk_panel; -struct nk_context; -struct nk_draw_vertex_layout_element; -struct nk_style_button; -struct nk_style_toggle; -struct nk_style_selectable; -struct nk_style_slide; -struct nk_style_progress; -struct nk_style_scrollbar; -struct nk_style_edit; -struct nk_style_property; -struct nk_style_chart; -struct nk_style_combo; -struct nk_style_tab; -struct nk_style_window_header; -struct nk_style_window; - -enum {nk_false, nk_true}; -struct nk_color {nk_byte r,g,b,a;}; -struct nk_colorf {float r,g,b,a;}; -struct nk_vec2 {float x,y;}; -struct nk_vec2i {short x, y;}; -struct nk_rect {float x,y,w,h;}; -struct nk_recti {short x,y,w,h;}; -typedef char nk_glyph[NK_UTF_SIZE]; -typedef union {void *ptr; int id;} nk_handle; -struct nk_image {nk_handle handle; nk_handle unit; nk_ushort w, h; nk_ushort region[4];}; -struct nk_nine_slice {struct nk_image img; nk_ushort l, t, r, b;}; -struct nk_cursor {struct nk_image img; struct nk_vec2 size, offset;}; -struct nk_scroll {nk_uint x, y;}; - -enum nk_heading {NK_UP, NK_RIGHT, NK_DOWN, NK_LEFT}; -enum nk_button_behavior {NK_BUTTON_DEFAULT, NK_BUTTON_REPEATER}; -enum nk_modify {NK_FIXED = nk_false, NK_MODIFIABLE = nk_true}; -enum nk_orientation {NK_VERTICAL, NK_HORIZONTAL}; -enum nk_collapse_states {NK_MINIMIZED = nk_false, NK_MAXIMIZED = nk_true}; -enum nk_show_states {NK_HIDDEN = nk_false, NK_SHOWN = nk_true}; -enum nk_chart_type {NK_CHART_LINES, NK_CHART_COLUMN, NK_CHART_MAX}; -enum nk_chart_event {NK_CHART_HOVERING = 0x01, NK_CHART_CLICKED = 0x02}; -enum nk_color_format {NK_RGB, NK_RGBA}; -enum nk_popup_type {NK_POPUP_STATIC, NK_POPUP_DYNAMIC}; -enum nk_layout_format {NK_DYNAMIC, NK_STATIC}; -enum nk_tree_type {NK_TREE_NODE, NK_TREE_TAB}; - -typedef void*(*nk_plugin_alloc)(nk_handle, void *old, nk_size); -typedef void (*nk_plugin_free)(nk_handle, void *old); -typedef nk_bool(*nk_plugin_filter)(const struct nk_text_edit*, nk_rune unicode); -typedef void(*nk_plugin_paste)(nk_handle, struct nk_text_edit*); -typedef void(*nk_plugin_copy)(nk_handle, const char*, int len); - -struct nk_allocator { - nk_handle userdata; - nk_plugin_alloc alloc; - nk_plugin_free free; -}; -enum nk_symbol_type { - NK_SYMBOL_NONE, - NK_SYMBOL_X, - NK_SYMBOL_UNDERSCORE, - NK_SYMBOL_CIRCLE_SOLID, - NK_SYMBOL_CIRCLE_OUTLINE, - NK_SYMBOL_RECT_SOLID, - NK_SYMBOL_RECT_OUTLINE, - NK_SYMBOL_TRIANGLE_UP, - NK_SYMBOL_TRIANGLE_DOWN, - NK_SYMBOL_TRIANGLE_LEFT, - NK_SYMBOL_TRIANGLE_RIGHT, - NK_SYMBOL_PLUS, - NK_SYMBOL_MINUS, - NK_SYMBOL_MAX -}; -/* ============================================================================= - * - * CONTEXT - * - * =============================================================================*/ -/*/// ### Context -/// Contexts are the main entry point and the majestro of nuklear and contain all required state. -/// They are used for window, memory, input, style, stack, commands and time management and need -/// to be passed into all nuklear GUI specific functions. -/// -/// #### Usage -/// To use a context it first has to be initialized which can be achieved by calling -/// one of either `nk_init_default`, `nk_init_fixed`, `nk_init`, `nk_init_custom`. -/// Each takes in a font handle and a specific way of handling memory. Memory control -/// hereby ranges from standard library to just specifying a fixed sized block of memory -/// which nuklear has to manage itself from. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_context ctx; -/// nk_init_xxx(&ctx, ...); -/// while (1) { -/// // [...] -/// nk_clear(&ctx); -/// } -/// nk_free(&ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// #### Reference -/// Function | Description -/// --------------------|------------------------------------------------------- -/// __nk_init_default__ | Initializes context with standard library memory allocation (malloc,free) -/// __nk_init_fixed__ | Initializes context from single fixed size memory block -/// __nk_init__ | Initializes context with memory allocator callbacks for alloc and free -/// __nk_init_custom__ | Initializes context from two buffers. One for draw commands the other for window/panel/table allocations -/// __nk_clear__ | Called at the end of the frame to reset and prepare the context for the next frame -/// __nk_free__ | Shutdown and free all memory allocated inside the context -/// __nk_set_user_data__| Utility function to pass user data to draw command - */ -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -/*/// #### nk_init_default -/// Initializes a `nk_context` struct with a default standard library allocator. -/// Should be used if you don't want to be bothered with memory management in nuklear. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_init_default(struct nk_context *ctx, const struct nk_user_font *font); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|--------------------------------------------------------------- -/// __ctx__ | Must point to an either stack or heap allocated `nk_context` struct -/// __font__ | Must point to a previously initialized font handle for more info look at font documentation -/// -/// Returns either `false(0)` on failure or `true(1)` on success. -/// -*/ -NK_API nk_bool nk_init_default(struct nk_context*, const struct nk_user_font*); -#endif -/*/// #### nk_init_fixed -/// Initializes a `nk_context` struct from single fixed size memory block -/// Should be used if you want complete control over nuklear's memory management. -/// Especially recommended for system with little memory or systems with virtual memory. -/// For the later case you can just allocate for example 16MB of virtual memory -/// and only the required amount of memory will actually be committed. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_init_fixed(struct nk_context *ctx, void *memory, nk_size size, const struct nk_user_font *font); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// !!! Warning -/// make sure the passed memory block is aligned correctly for `nk_draw_commands`. -/// -/// Parameter | Description -/// ------------|-------------------------------------------------------------- -/// __ctx__ | Must point to an either stack or heap allocated `nk_context` struct -/// __memory__ | Must point to a previously allocated memory block -/// __size__ | Must contain the total size of __memory__ -/// __font__ | Must point to a previously initialized font handle for more info look at font documentation -/// -/// Returns either `false(0)` on failure or `true(1)` on success. -*/ -NK_API nk_bool nk_init_fixed(struct nk_context*, void *memory, nk_size size, const struct nk_user_font*); -/*/// #### nk_init -/// Initializes a `nk_context` struct with memory allocation callbacks for nuklear to allocate -/// memory from. Used internally for `nk_init_default` and provides a kitchen sink allocation -/// interface to nuklear. Can be useful for cases like monitoring memory consumption. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_init(struct nk_context *ctx, struct nk_allocator *alloc, const struct nk_user_font *font); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|--------------------------------------------------------------- -/// __ctx__ | Must point to an either stack or heap allocated `nk_context` struct -/// __alloc__ | Must point to a previously allocated memory allocator -/// __font__ | Must point to a previously initialized font handle for more info look at font documentation -/// -/// Returns either `false(0)` on failure or `true(1)` on success. -*/ -NK_API nk_bool nk_init(struct nk_context*, struct nk_allocator*, const struct nk_user_font*); -/*/// #### nk_init_custom -/// Initializes a `nk_context` struct from two different either fixed or growing -/// buffers. The first buffer is for allocating draw commands while the second buffer is -/// used for allocating windows, panels and state tables. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_init_custom(struct nk_context *ctx, struct nk_buffer *cmds, struct nk_buffer *pool, const struct nk_user_font *font); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|--------------------------------------------------------------- -/// __ctx__ | Must point to an either stack or heap allocated `nk_context` struct -/// __cmds__ | Must point to a previously initialized memory buffer either fixed or dynamic to store draw commands into -/// __pool__ | Must point to a previously initialized memory buffer either fixed or dynamic to store windows, panels and tables -/// __font__ | Must point to a previously initialized font handle for more info look at font documentation -/// -/// Returns either `false(0)` on failure or `true(1)` on success. -*/ -NK_API nk_bool nk_init_custom(struct nk_context*, struct nk_buffer *cmds, struct nk_buffer *pool, const struct nk_user_font*); -/*/// #### nk_clear -/// Resets the context state at the end of the frame. This includes mostly -/// garbage collector tasks like removing windows or table not called and therefore -/// used anymore. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_clear(struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -*/ -NK_API void nk_clear(struct nk_context*); -/*/// #### nk_free -/// Frees all memory allocated by nuklear. Not needed if context was -/// initialized with `nk_init_fixed`. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_free(struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -*/ -NK_API void nk_free(struct nk_context*); -#ifdef NK_INCLUDE_COMMAND_USERDATA -/*/// #### nk_set_user_data -/// Sets the currently passed userdata passed down into each draw command. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_set_user_data(struct nk_context *ctx, nk_handle data); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|-------------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -/// __data__ | Handle with either pointer or index to be passed into every draw commands -*/ -NK_API void nk_set_user_data(struct nk_context*, nk_handle handle); -#endif -/* ============================================================================= - * - * INPUT - * - * =============================================================================*/ -/*/// ### Input -/// The input API is responsible for holding the current input state composed of -/// mouse, key and text input states. -/// It is worth noting that no direct OS or window handling is done in nuklear. -/// Instead all input state has to be provided by platform specific code. This on one hand -/// expects more work from the user and complicates usage but on the other hand -/// provides simple abstraction over a big number of platforms, libraries and other -/// already provided functionality. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_input_begin(&ctx); -/// while (GetEvent(&evt)) { -/// if (evt.type == MOUSE_MOVE) -/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); -/// else if (evt.type == [...]) { -/// // [...] -/// } -/// } nk_input_end(&ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// #### Usage -/// Input state needs to be provided to nuklear by first calling `nk_input_begin` -/// which resets internal state like delta mouse position and button transitions. -/// After `nk_input_begin` all current input state needs to be provided. This includes -/// mouse motion, button and key pressed and released, text input and scrolling. -/// Both event- or state-based input handling are supported by this API -/// and should work without problems. Finally after all input state has been -/// mirrored `nk_input_end` needs to be called to finish input process. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_context ctx; -/// nk_init_xxx(&ctx, ...); -/// while (1) { -/// Event evt; -/// nk_input_begin(&ctx); -/// while (GetEvent(&evt)) { -/// if (evt.type == MOUSE_MOVE) -/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); -/// else if (evt.type == [...]) { -/// // [...] -/// } -/// } -/// nk_input_end(&ctx); -/// // [...] -/// nk_clear(&ctx); -/// } nk_free(&ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// #### Reference -/// Function | Description -/// --------------------|------------------------------------------------------- -/// __nk_input_begin__ | Begins the input mirroring process. Needs to be called before all other `nk_input_xxx` calls -/// __nk_input_motion__ | Mirrors mouse cursor position -/// __nk_input_key__ | Mirrors key state with either pressed or released -/// __nk_input_button__ | Mirrors mouse button state with either pressed or released -/// __nk_input_scroll__ | Mirrors mouse scroll values -/// __nk_input_char__ | Adds a single ASCII text character into an internal text buffer -/// __nk_input_glyph__ | Adds a single multi-byte UTF-8 character into an internal text buffer -/// __nk_input_unicode__| Adds a single unicode rune into an internal text buffer -/// __nk_input_end__ | Ends the input mirroring process by calculating state changes. Don't call any `nk_input_xxx` function referenced above after this call -*/ -enum nk_keys { - NK_KEY_NONE, - NK_KEY_SHIFT, - NK_KEY_CTRL, - NK_KEY_ALT, - NK_KEY_DEL, - NK_KEY_ENTER, - NK_KEY_TAB, - NK_KEY_BACKSPACE, - NK_KEY_ESCAPE, - NK_KEY_COPY, - NK_KEY_CUT, - NK_KEY_PASTE, - NK_KEY_UP, - NK_KEY_DOWN, - NK_KEY_LEFT, - NK_KEY_RIGHT, - /* Shortcuts: text field */ - NK_KEY_TEXT_INSERT_MODE, - NK_KEY_TEXT_REPLACE_MODE, - NK_KEY_TEXT_RESET_MODE, - NK_KEY_TEXT_LINE_START, - NK_KEY_TEXT_LINE_END, - NK_KEY_TEXT_START, - NK_KEY_TEXT_END, - NK_KEY_TEXT_UNDO, - NK_KEY_TEXT_REDO, - NK_KEY_TEXT_SELECT_ALL, - NK_KEY_TEXT_WORD_LEFT, - NK_KEY_TEXT_WORD_RIGHT, - /* Shortcuts: scrollbar */ - NK_KEY_SCROLL_START, - NK_KEY_SCROLL_END, - NK_KEY_SCROLL_DOWN, - NK_KEY_SCROLL_UP, - NK_KEY_MAX -}; -enum nk_buttons { - NK_BUTTON_LEFT, - NK_BUTTON_MIDDLE, - NK_BUTTON_RIGHT, - NK_BUTTON_DOUBLE, - NK_BUTTON_MAX -}; -/*/// #### nk_input_begin -/// Begins the input mirroring process by resetting text, scroll -/// mouse, previous mouse position and movement as well as key state transitions, -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_input_begin(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -*/ -NK_API void nk_input_begin(struct nk_context*); -/*/// #### nk_input_motion -/// Mirrors current mouse position to nuklear -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_input_motion(struct nk_context *ctx, int x, int y); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -/// __x__ | Must hold an integer describing the current mouse cursor x-position -/// __y__ | Must hold an integer describing the current mouse cursor y-position -*/ -NK_API void nk_input_motion(struct nk_context*, int x, int y); -/*/// #### nk_input_key -/// Mirrors the state of a specific key to nuklear -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_input_key(struct nk_context*, enum nk_keys key, nk_bool down); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -/// __key__ | Must be any value specified in enum `nk_keys` that needs to be mirrored -/// __down__ | Must be 0 for key is up and 1 for key is down -*/ -NK_API void nk_input_key(struct nk_context*, enum nk_keys, nk_bool down); -/*/// #### nk_input_button -/// Mirrors the state of a specific mouse button to nuklear -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_input_button(struct nk_context *ctx, enum nk_buttons btn, int x, int y, nk_bool down); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -/// __btn__ | Must be any value specified in enum `nk_buttons` that needs to be mirrored -/// __x__ | Must contain an integer describing mouse cursor x-position on click up/down -/// __y__ | Must contain an integer describing mouse cursor y-position on click up/down -/// __down__ | Must be 0 for key is up and 1 for key is down -*/ -NK_API void nk_input_button(struct nk_context*, enum nk_buttons, int x, int y, nk_bool down); -/*/// #### nk_input_scroll -/// Copies the last mouse scroll value to nuklear. Is generally -/// a scroll value. So does not have to come from mouse and could also originate -/// TODO finish this sentence -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_input_scroll(struct nk_context *ctx, struct nk_vec2 val); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -/// __val__ | vector with both X- as well as Y-scroll value -*/ -NK_API void nk_input_scroll(struct nk_context*, struct nk_vec2 val); -/*/// #### nk_input_char -/// Copies a single ASCII character into an internal text buffer -/// This is basically a helper function to quickly push ASCII characters into -/// nuklear. -/// -/// !!! Note -/// Stores up to NK_INPUT_MAX bytes between `nk_input_begin` and `nk_input_end`. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_input_char(struct nk_context *ctx, char c); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -/// __c__ | Must be a single ASCII character preferable one that can be printed -*/ -NK_API void nk_input_char(struct nk_context*, char); -/*/// #### nk_input_glyph -/// Converts an encoded unicode rune into UTF-8 and copies the result into an -/// internal text buffer. -/// -/// !!! Note -/// Stores up to NK_INPUT_MAX bytes between `nk_input_begin` and `nk_input_end`. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_input_glyph(struct nk_context *ctx, const nk_glyph g); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -/// __g__ | UTF-32 unicode codepoint -*/ -NK_API void nk_input_glyph(struct nk_context*, const nk_glyph); -/*/// #### nk_input_unicode -/// Converts a unicode rune into UTF-8 and copies the result -/// into an internal text buffer. -/// !!! Note -/// Stores up to NK_INPUT_MAX bytes between `nk_input_begin` and `nk_input_end`. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_input_unicode(struct nk_context*, nk_rune rune); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -/// __rune__ | UTF-32 unicode codepoint -*/ -NK_API void nk_input_unicode(struct nk_context*, nk_rune); -/*/// #### nk_input_end -/// End the input mirroring process by resetting mouse grabbing -/// state to ensure the mouse cursor is not grabbed indefinitely. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_input_end(struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to a previously initialized `nk_context` struct -*/ -NK_API void nk_input_end(struct nk_context*); -/* ============================================================================= - * - * DRAWING - * - * =============================================================================*/ -/*/// ### Drawing -/// This library was designed to be render backend agnostic so it does -/// not draw anything to screen directly. Instead all drawn shapes, widgets -/// are made of, are buffered into memory and make up a command queue. -/// Each frame therefore fills the command buffer with draw commands -/// that then need to be executed by the user and his own render backend. -/// After that the command buffer needs to be cleared and a new frame can be -/// started. It is probably important to note that the command buffer is the main -/// drawing API and the optional vertex buffer API only takes this format and -/// converts it into a hardware accessible format. -/// -/// #### Usage -/// To draw all draw commands accumulated over a frame you need your own render -/// backend able to draw a number of 2D primitives. This includes at least -/// filled and stroked rectangles, circles, text, lines, triangles and scissors. -/// As soon as this criterion is met you can iterate over each draw command -/// and execute each draw command in a interpreter like fashion: -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// const struct nk_command *cmd = 0; -/// nk_foreach(cmd, &ctx) { -/// switch (cmd->type) { -/// case NK_COMMAND_LINE: -/// your_draw_line_function(...) -/// break; -/// case NK_COMMAND_RECT -/// your_draw_rect_function(...) -/// break; -/// case //...: -/// //[...] -/// } -/// } -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// In program flow context draw commands need to be executed after input has been -/// gathered and the complete UI with windows and their contained widgets have -/// been executed and before calling `nk_clear` which frees all previously -/// allocated draw commands. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_context ctx; -/// nk_init_xxx(&ctx, ...); -/// while (1) { -/// Event evt; -/// nk_input_begin(&ctx); -/// while (GetEvent(&evt)) { -/// if (evt.type == MOUSE_MOVE) -/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); -/// else if (evt.type == [...]) { -/// [...] -/// } -/// } -/// nk_input_end(&ctx); -/// // -/// // [...] -/// // -/// const struct nk_command *cmd = 0; -/// nk_foreach(cmd, &ctx) { -/// switch (cmd->type) { -/// case NK_COMMAND_LINE: -/// your_draw_line_function(...) -/// break; -/// case NK_COMMAND_RECT -/// your_draw_rect_function(...) -/// break; -/// case ...: -/// // [...] -/// } -/// nk_clear(&ctx); -/// } -/// nk_free(&ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// You probably noticed that you have to draw all of the UI each frame which is -/// quite wasteful. While the actual UI updating loop is quite fast rendering -/// without actually needing it is not. So there are multiple things you could do. -/// -/// First is only update on input. This of course is only an option if your -/// application only depends on the UI and does not require any outside calculations. -/// If you actually only update on input make sure to update the UI two times each -/// frame and call `nk_clear` directly after the first pass and only draw in -/// the second pass. In addition it is recommended to also add additional timers -/// to make sure the UI is not drawn more than a fixed number of frames per second. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_context ctx; -/// nk_init_xxx(&ctx, ...); -/// while (1) { -/// // [...wait for input ] -/// // [...do two UI passes ...] -/// do_ui(...) -/// nk_clear(&ctx); -/// do_ui(...) -/// // -/// // draw -/// const struct nk_command *cmd = 0; -/// nk_foreach(cmd, &ctx) { -/// switch (cmd->type) { -/// case NK_COMMAND_LINE: -/// your_draw_line_function(...) -/// break; -/// case NK_COMMAND_RECT -/// your_draw_rect_function(...) -/// break; -/// case ...: -/// //[...] -/// } -/// nk_clear(&ctx); -/// } -/// nk_free(&ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// The second probably more applicable trick is to only draw if anything changed. -/// It is not really useful for applications with continuous draw loop but -/// quite useful for desktop applications. To actually get nuklear to only -/// draw on changes you first have to define `NK_ZERO_COMMAND_MEMORY` and -/// allocate a memory buffer that will store each unique drawing output. -/// After each frame you compare the draw command memory inside the library -/// with your allocated buffer by memcmp. If memcmp detects differences -/// you have to copy the command buffer into the allocated buffer -/// and then draw like usual (this example uses fixed memory but you could -/// use dynamically allocated memory). -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// //[... other defines ...] -/// #define NK_ZERO_COMMAND_MEMORY -/// #include "nuklear.h" -/// // -/// // setup context -/// struct nk_context ctx; -/// void *last = calloc(1,64*1024); -/// void *buf = calloc(1,64*1024); -/// nk_init_fixed(&ctx, buf, 64*1024); -/// // -/// // loop -/// while (1) { -/// // [...input...] -/// // [...ui...] -/// void *cmds = nk_buffer_memory(&ctx.memory); -/// if (memcmp(cmds, last, ctx.memory.allocated)) { -/// memcpy(last,cmds,ctx.memory.allocated); -/// const struct nk_command *cmd = 0; -/// nk_foreach(cmd, &ctx) { -/// switch (cmd->type) { -/// case NK_COMMAND_LINE: -/// your_draw_line_function(...) -/// break; -/// case NK_COMMAND_RECT -/// your_draw_rect_function(...) -/// break; -/// case ...: -/// // [...] -/// } -/// } -/// } -/// nk_clear(&ctx); -/// } -/// nk_free(&ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Finally while using draw commands makes sense for higher abstracted platforms like -/// X11 and Win32 or drawing libraries it is often desirable to use graphics -/// hardware directly. Therefore it is possible to just define -/// `NK_INCLUDE_VERTEX_BUFFER_OUTPUT` which includes optional vertex output. -/// To access the vertex output you first have to convert all draw commands into -/// vertexes by calling `nk_convert` which takes in your preferred vertex format. -/// After successfully converting all draw commands just iterate over and execute all -/// vertex draw commands: -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// // fill configuration -/// struct your_vertex -/// { -/// float pos[2]; // important to keep it to 2 floats -/// float uv[2]; -/// unsigned char col[4]; -/// }; -/// struct nk_convert_config cfg = {}; -/// static const struct nk_draw_vertex_layout_element vertex_layout[] = { -/// {NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct your_vertex, pos)}, -/// {NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct your_vertex, uv)}, -/// {NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct your_vertex, col)}, -/// {NK_VERTEX_LAYOUT_END} -/// }; -/// cfg.shape_AA = NK_ANTI_ALIASING_ON; -/// cfg.line_AA = NK_ANTI_ALIASING_ON; -/// cfg.vertex_layout = vertex_layout; -/// cfg.vertex_size = sizeof(struct your_vertex); -/// cfg.vertex_alignment = NK_ALIGNOF(struct your_vertex); -/// cfg.circle_segment_count = 22; -/// cfg.curve_segment_count = 22; -/// cfg.arc_segment_count = 22; -/// cfg.global_alpha = 1.0f; -/// cfg.tex_null = dev->tex_null; -/// // -/// // setup buffers and convert -/// struct nk_buffer cmds, verts, idx; -/// nk_buffer_init_default(&cmds); -/// nk_buffer_init_default(&verts); -/// nk_buffer_init_default(&idx); -/// nk_convert(&ctx, &cmds, &verts, &idx, &cfg); -/// // -/// // draw -/// nk_draw_foreach(cmd, &ctx, &cmds) { -/// if (!cmd->elem_count) continue; -/// //[...] -/// } -/// nk_buffer_free(&cms); -/// nk_buffer_free(&verts); -/// nk_buffer_free(&idx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// #### Reference -/// Function | Description -/// --------------------|------------------------------------------------------- -/// __nk__begin__ | Returns the first draw command in the context draw command list to be drawn -/// __nk__next__ | Increments the draw command iterator to the next command inside the context draw command list -/// __nk_foreach__ | Iterates over each draw command inside the context draw command list -/// __nk_convert__ | Converts from the abstract draw commands list into a hardware accessible vertex format -/// __nk_draw_begin__ | Returns the first vertex command in the context vertex draw list to be executed -/// __nk__draw_next__ | Increments the vertex command iterator to the next command inside the context vertex command list -/// __nk__draw_end__ | Returns the end of the vertex draw list -/// __nk_draw_foreach__ | Iterates over each vertex draw command inside the vertex draw list -*/ -enum nk_anti_aliasing {NK_ANTI_ALIASING_OFF, NK_ANTI_ALIASING_ON}; -enum nk_convert_result { - NK_CONVERT_SUCCESS = 0, - NK_CONVERT_INVALID_PARAM = 1, - NK_CONVERT_COMMAND_BUFFER_FULL = NK_FLAG(1), - NK_CONVERT_VERTEX_BUFFER_FULL = NK_FLAG(2), - NK_CONVERT_ELEMENT_BUFFER_FULL = NK_FLAG(3) -}; -struct nk_draw_null_texture { - nk_handle texture; /* texture handle to a texture with a white pixel */ - struct nk_vec2 uv; /* coordinates to a white pixel in the texture */ -}; -struct nk_convert_config { - float global_alpha; /* global alpha value */ - enum nk_anti_aliasing line_AA; /* line anti-aliasing flag can be turned off if you are tight on memory */ - enum nk_anti_aliasing shape_AA; /* shape anti-aliasing flag can be turned off if you are tight on memory */ - unsigned circle_segment_count; /* number of segments used for circles: default to 22 */ - unsigned arc_segment_count; /* number of segments used for arcs: default to 22 */ - unsigned curve_segment_count; /* number of segments used for curves: default to 22 */ - struct nk_draw_null_texture tex_null; /* handle to texture with a white pixel for shape drawing */ - const struct nk_draw_vertex_layout_element *vertex_layout; /* describes the vertex output format and packing */ - nk_size vertex_size; /* sizeof one vertex for vertex packing */ - nk_size vertex_alignment; /* vertex alignment: Can be obtained by NK_ALIGNOF */ -}; -/*/// #### nk__begin -/// Returns a draw command list iterator to iterate all draw -/// commands accumulated over one frame. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// const struct nk_command* nk__begin(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | must point to an previously initialized `nk_context` struct at the end of a frame -/// -/// Returns draw command pointer pointing to the first command inside the draw command list -*/ -NK_API const struct nk_command* nk__begin(struct nk_context*); -/*/// #### nk__next -/// Returns draw command pointer pointing to the next command inside the draw command list -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// const struct nk_command* nk__next(struct nk_context*, const struct nk_command*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame -/// __cmd__ | Must point to an previously a draw command either returned by `nk__begin` or `nk__next` -/// -/// Returns draw command pointer pointing to the next command inside the draw command list -*/ -NK_API const struct nk_command* nk__next(struct nk_context*, const struct nk_command*); -/*/// #### nk_foreach -/// Iterates over each draw command inside the context draw command list -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// #define nk_foreach(c, ctx) -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame -/// __cmd__ | Command pointer initialized to NULL -/// -/// Iterates over each draw command inside the context draw command list -*/ -#define nk_foreach(c, ctx) for((c) = nk__begin(ctx); (c) != 0; (c) = nk__next(ctx,c)) -#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT -/*/// #### nk_convert -/// Converts all internal draw commands into vertex draw commands and fills -/// three buffers with vertexes, vertex draw commands and vertex indices. The vertex format -/// as well as some other configuration values have to be configured by filling out a -/// `nk_convert_config` struct. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_flags nk_convert(struct nk_context *ctx, struct nk_buffer *cmds, -/// struct nk_buffer *vertices, struct nk_buffer *elements, const struct nk_convert_config*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame -/// __cmds__ | Must point to a previously initialized buffer to hold converted vertex draw commands -/// __vertices__| Must point to a previously initialized buffer to hold all produced vertices -/// __elements__| Must point to a previously initialized buffer to hold all produced vertex indices -/// __config__ | Must point to a filled out `nk_config` struct to configure the conversion process -/// -/// Returns one of enum nk_convert_result error codes -/// -/// Parameter | Description -/// --------------------------------|----------------------------------------------------------- -/// NK_CONVERT_SUCCESS | Signals a successful draw command to vertex buffer conversion -/// NK_CONVERT_INVALID_PARAM | An invalid argument was passed in the function call -/// NK_CONVERT_COMMAND_BUFFER_FULL | The provided buffer for storing draw commands is full or failed to allocate more memory -/// NK_CONVERT_VERTEX_BUFFER_FULL | The provided buffer for storing vertices is full or failed to allocate more memory -/// NK_CONVERT_ELEMENT_BUFFER_FULL | The provided buffer for storing indices is full or failed to allocate more memory -*/ -NK_API nk_flags nk_convert(struct nk_context*, struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements, const struct nk_convert_config*); -/*/// #### nk__draw_begin -/// Returns a draw vertex command buffer iterator to iterate over the vertex draw command buffer -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// const struct nk_draw_command* nk__draw_begin(const struct nk_context*, const struct nk_buffer*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame -/// __buf__ | Must point to an previously by `nk_convert` filled out vertex draw command buffer -/// -/// Returns vertex draw command pointer pointing to the first command inside the vertex draw command buffer -*/ -NK_API const struct nk_draw_command* nk__draw_begin(const struct nk_context*, const struct nk_buffer*); -/*/// #### nk__draw_end -/// Returns the vertex draw command at the end of the vertex draw command buffer -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// const struct nk_draw_command* nk__draw_end(const struct nk_context *ctx, const struct nk_buffer *buf); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame -/// __buf__ | Must point to an previously by `nk_convert` filled out vertex draw command buffer -/// -/// Returns vertex draw command pointer pointing to the end of the last vertex draw command inside the vertex draw command buffer -*/ -NK_API const struct nk_draw_command* nk__draw_end(const struct nk_context*, const struct nk_buffer*); -/*/// #### nk__draw_next -/// Increments the vertex draw command buffer iterator -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*, const struct nk_buffer*, const struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __cmd__ | Must point to an previously either by `nk__draw_begin` or `nk__draw_next` returned vertex draw command -/// __buf__ | Must point to an previously by `nk_convert` filled out vertex draw command buffer -/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame -/// -/// Returns vertex draw command pointer pointing to the end of the last vertex draw command inside the vertex draw command buffer -*/ -NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*, const struct nk_buffer*, const struct nk_context*); -/*/// #### nk_draw_foreach -/// Iterates over each vertex draw command inside a vertex draw command buffer -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// #define nk_draw_foreach(cmd,ctx, b) -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __cmd__ | `nk_draw_command`iterator set to NULL -/// __buf__ | Must point to an previously by `nk_convert` filled out vertex draw command buffer -/// __ctx__ | Must point to an previously initialized `nk_context` struct at the end of a frame -*/ -#define nk_draw_foreach(cmd,ctx, b) for((cmd)=nk__draw_begin(ctx, b); (cmd)!=0; (cmd)=nk__draw_next(cmd, b, ctx)) -#endif -/* ============================================================================= - * - * WINDOW - * - * ============================================================================= -/// ### Window -/// Windows are the main persistent state used inside nuklear and are life time -/// controlled by simply "retouching" (i.e. calling) each window each frame. -/// All widgets inside nuklear can only be added inside the function pair `nk_begin_xxx` -/// and `nk_end`. Calling any widgets outside these two functions will result in an -/// assert in debug or no state change in release mode.

-/// -/// Each window holds frame persistent state like position, size, flags, state tables, -/// and some garbage collected internal persistent widget state. Each window -/// is linked into a window stack list which determines the drawing and overlapping -/// order. The topmost window thereby is the currently active window.

-/// -/// To change window position inside the stack occurs either automatically by -/// user input by being clicked on or programmatically by calling `nk_window_focus`. -/// Windows by default are visible unless explicitly being defined with flag -/// `NK_WINDOW_HIDDEN`, the user clicked the close button on windows with flag -/// `NK_WINDOW_CLOSABLE` or if a window was explicitly hidden by calling -/// `nk_window_show`. To explicitly close and destroy a window call `nk_window_close`.

-/// -/// #### Usage -/// To create and keep a window you have to call one of the two `nk_begin_xxx` -/// functions to start window declarations and `nk_end` at the end. Furthermore it -/// is recommended to check the return value of `nk_begin_xxx` and only process -/// widgets inside the window if the value is not 0. Either way you have to call -/// `nk_end` at the end of window declarations. Furthermore, do not attempt to -/// nest `nk_begin_xxx` calls which will hopefully result in an assert or if not -/// in a segmentation fault. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// if (nk_begin_xxx(...) { -/// // [... widgets ...] -/// } -/// nk_end(ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// In the grand concept window and widget declarations need to occur after input -/// handling and before drawing to screen. Not doing so can result in higher -/// latency or at worst invalid behavior. Furthermore make sure that `nk_clear` -/// is called at the end of the frame. While nuklear's default platform backends -/// already call `nk_clear` for you if you write your own backend not calling -/// `nk_clear` can cause asserts or even worse undefined behavior. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_context ctx; -/// nk_init_xxx(&ctx, ...); -/// while (1) { -/// Event evt; -/// nk_input_begin(&ctx); -/// while (GetEvent(&evt)) { -/// if (evt.type == MOUSE_MOVE) -/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); -/// else if (evt.type == [...]) { -/// nk_input_xxx(...); -/// } -/// } -/// nk_input_end(&ctx); -/// -/// if (nk_begin_xxx(...) { -/// //[...] -/// } -/// nk_end(ctx); -/// -/// const struct nk_command *cmd = 0; -/// nk_foreach(cmd, &ctx) { -/// case NK_COMMAND_LINE: -/// your_draw_line_function(...) -/// break; -/// case NK_COMMAND_RECT -/// your_draw_rect_function(...) -/// break; -/// case //...: -/// //[...] -/// } -/// nk_clear(&ctx); -/// } -/// nk_free(&ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// #### Reference -/// Function | Description -/// ------------------------------------|---------------------------------------- -/// nk_begin | Starts a new window; needs to be called every frame for every window (unless hidden) or otherwise the window gets removed -/// nk_begin_titled | Extended window start with separated title and identifier to allow multiple windows with same name but not title -/// nk_end | Needs to be called at the end of the window building process to process scaling, scrollbars and general cleanup -// -/// nk_window_find | Finds and returns the window with give name -/// nk_window_get_bounds | Returns a rectangle with screen position and size of the currently processed window. -/// nk_window_get_position | Returns the position of the currently processed window -/// nk_window_get_size | Returns the size with width and height of the currently processed window -/// nk_window_get_width | Returns the width of the currently processed window -/// nk_window_get_height | Returns the height of the currently processed window -/// nk_window_get_panel | Returns the underlying panel which contains all processing state of the current window -/// nk_window_get_content_region | Returns the position and size of the currently visible and non-clipped space inside the currently processed window -/// nk_window_get_content_region_min | Returns the upper rectangle position of the currently visible and non-clipped space inside the currently processed window -/// nk_window_get_content_region_max | Returns the upper rectangle position of the currently visible and non-clipped space inside the currently processed window -/// nk_window_get_content_region_size | Returns the size of the currently visible and non-clipped space inside the currently processed window -/// nk_window_get_canvas | Returns the draw command buffer. Can be used to draw custom widgets -/// nk_window_get_scroll | Gets the scroll offset of the current window -/// nk_window_has_focus | Returns if the currently processed window is currently active -/// nk_window_is_collapsed | Returns if the window with given name is currently minimized/collapsed -/// nk_window_is_closed | Returns if the currently processed window was closed -/// nk_window_is_hidden | Returns if the currently processed window was hidden -/// nk_window_is_active | Same as nk_window_has_focus for some reason -/// nk_window_is_hovered | Returns if the currently processed window is currently being hovered by mouse -/// nk_window_is_any_hovered | Return if any window currently hovered -/// nk_item_is_any_active | Returns if any window or widgets is currently hovered or active -// -/// nk_window_set_bounds | Updates position and size of the currently processed window -/// nk_window_set_position | Updates position of the currently process window -/// nk_window_set_size | Updates the size of the currently processed window -/// nk_window_set_focus | Set the currently processed window as active window -/// nk_window_set_scroll | Sets the scroll offset of the current window -// -/// nk_window_close | Closes the window with given window name which deletes the window at the end of the frame -/// nk_window_collapse | Collapses the window with given window name -/// nk_window_collapse_if | Collapses the window with given window name if the given condition was met -/// nk_window_show | Hides a visible or reshows a hidden window -/// nk_window_show_if | Hides/shows a window depending on condition -*/ -/* -/// #### nk_panel_flags -/// Flag | Description -/// ----------------------------|---------------------------------------- -/// NK_WINDOW_BORDER | Draws a border around the window to visually separate window from the background -/// NK_WINDOW_MOVABLE | The movable flag indicates that a window can be moved by user input or by dragging the window header -/// NK_WINDOW_SCALABLE | The scalable flag indicates that a window can be scaled by user input by dragging a scaler icon at the button of the window -/// NK_WINDOW_CLOSABLE | Adds a closable icon into the header -/// NK_WINDOW_MINIMIZABLE | Adds a minimize icon into the header -/// NK_WINDOW_NO_SCROLLBAR | Removes the scrollbar from the window -/// NK_WINDOW_TITLE | Forces a header at the top at the window showing the title -/// NK_WINDOW_SCROLL_AUTO_HIDE | Automatically hides the window scrollbar if no user interaction: also requires delta time in `nk_context` to be set each frame -/// NK_WINDOW_BACKGROUND | Always keep window in the background -/// NK_WINDOW_SCALE_LEFT | Puts window scaler in the left-bottom corner instead right-bottom -/// NK_WINDOW_NO_INPUT | Prevents window of scaling, moving or getting focus -/// -/// #### nk_collapse_states -/// State | Description -/// ----------------|----------------------------------------------------------- -/// __NK_MINIMIZED__| UI section is collased and not visible until maximized -/// __NK_MAXIMIZED__| UI section is extended and visible until minimized -///

-*/ -enum nk_panel_flags { - NK_WINDOW_BORDER = NK_FLAG(0), - NK_WINDOW_MOVABLE = NK_FLAG(1), - NK_WINDOW_SCALABLE = NK_FLAG(2), - NK_WINDOW_CLOSABLE = NK_FLAG(3), - NK_WINDOW_MINIMIZABLE = NK_FLAG(4), - NK_WINDOW_NO_SCROLLBAR = NK_FLAG(5), - NK_WINDOW_TITLE = NK_FLAG(6), - NK_WINDOW_SCROLL_AUTO_HIDE = NK_FLAG(7), - NK_WINDOW_BACKGROUND = NK_FLAG(8), - NK_WINDOW_SCALE_LEFT = NK_FLAG(9), - NK_WINDOW_NO_INPUT = NK_FLAG(10) -}; -/*/// #### nk_begin -/// Starts a new window; needs to be called every frame for every -/// window (unless hidden) or otherwise the window gets removed -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_begin(struct nk_context *ctx, const char *title, struct nk_rect bounds, nk_flags flags); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __title__ | Window title and identifier. Needs to be persistent over frames to identify the window -/// __bounds__ | Initial position and window size. However if you do not define `NK_WINDOW_SCALABLE` or `NK_WINDOW_MOVABLE` you can set window position and size every frame -/// __flags__ | Window flags defined in the nk_panel_flags section with a number of different window behaviors -/// -/// Returns `true(1)` if the window can be filled up with widgets from this point -/// until `nk_end` or `false(0)` otherwise for example if minimized -*/ -NK_API nk_bool nk_begin(struct nk_context *ctx, const char *title, struct nk_rect bounds, nk_flags flags); -/*/// #### nk_begin_titled -/// Extended window start with separated title and identifier to allow multiple -/// windows with same title but not name -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_begin_titled(struct nk_context *ctx, const char *name, const char *title, struct nk_rect bounds, nk_flags flags); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Window identifier. Needs to be persistent over frames to identify the window -/// __title__ | Window title displayed inside header if flag `NK_WINDOW_TITLE` or either `NK_WINDOW_CLOSABLE` or `NK_WINDOW_MINIMIZED` was set -/// __bounds__ | Initial position and window size. However if you do not define `NK_WINDOW_SCALABLE` or `NK_WINDOW_MOVABLE` you can set window position and size every frame -/// __flags__ | Window flags defined in the nk_panel_flags section with a number of different window behaviors -/// -/// Returns `true(1)` if the window can be filled up with widgets from this point -/// until `nk_end` or `false(0)` otherwise for example if minimized -*/ -NK_API nk_bool nk_begin_titled(struct nk_context *ctx, const char *name, const char *title, struct nk_rect bounds, nk_flags flags); -/*/// #### nk_end -/// Needs to be called at the end of the window building process to process scaling, scrollbars and general cleanup. -/// All widget calls after this functions will result in asserts or no state changes -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_end(struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -*/ -NK_API void nk_end(struct nk_context *ctx); -/*/// #### nk_window_find -/// Finds and returns a window from passed name -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_window *nk_window_find(struct nk_context *ctx, const char *name); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Window identifier -/// -/// Returns a `nk_window` struct pointing to the identified window or NULL if -/// no window with the given name was found -*/ -NK_API struct nk_window *nk_window_find(struct nk_context *ctx, const char *name); -/*/// #### nk_window_get_bounds -/// Returns a rectangle with screen position and size of the currently processed window -/// -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_rect nk_window_get_bounds(const struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns a `nk_rect` struct with window upper left window position and size -*/ -NK_API struct nk_rect nk_window_get_bounds(const struct nk_context *ctx); -/*/// #### nk_window_get_position -/// Returns the position of the currently processed window. -/// -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_vec2 nk_window_get_position(const struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns a `nk_vec2` struct with window upper left position -*/ -NK_API struct nk_vec2 nk_window_get_position(const struct nk_context *ctx); -/*/// #### nk_window_get_size -/// Returns the size with width and height of the currently processed window. -/// -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_vec2 nk_window_get_size(const struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns a `nk_vec2` struct with window width and height -*/ -NK_API struct nk_vec2 nk_window_get_size(const struct nk_context*); -/*/// #### nk_window_get_width -/// Returns the width of the currently processed window. -/// -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// float nk_window_get_width(const struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns the current window width -*/ -NK_API float nk_window_get_width(const struct nk_context*); -/*/// #### nk_window_get_height -/// Returns the height of the currently processed window. -/// -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// float nk_window_get_height(const struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns the current window height -*/ -NK_API float nk_window_get_height(const struct nk_context*); -/*/// #### nk_window_get_panel -/// Returns the underlying panel which contains all processing state of the current window. -/// -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// !!! WARNING -/// Do not keep the returned panel pointer around, it is only valid until `nk_end` -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_panel* nk_window_get_panel(struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns a pointer to window internal `nk_panel` state. -*/ -NK_API struct nk_panel* nk_window_get_panel(struct nk_context*); -/*/// #### nk_window_get_content_region -/// Returns the position and size of the currently visible and non-clipped space -/// inside the currently processed window. -/// -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_rect nk_window_get_content_region(struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns `nk_rect` struct with screen position and size (no scrollbar offset) -/// of the visible space inside the current window -*/ -NK_API struct nk_rect nk_window_get_content_region(struct nk_context*); -/*/// #### nk_window_get_content_region_min -/// Returns the upper left position of the currently visible and non-clipped -/// space inside the currently processed window. -/// -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_vec2 nk_window_get_content_region_min(struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// returns `nk_vec2` struct with upper left screen position (no scrollbar offset) -/// of the visible space inside the current window -*/ -NK_API struct nk_vec2 nk_window_get_content_region_min(struct nk_context*); -/*/// #### nk_window_get_content_region_max -/// Returns the lower right screen position of the currently visible and -/// non-clipped space inside the currently processed window. -/// -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_vec2 nk_window_get_content_region_max(struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns `nk_vec2` struct with lower right screen position (no scrollbar offset) -/// of the visible space inside the current window -*/ -NK_API struct nk_vec2 nk_window_get_content_region_max(struct nk_context*); -/*/// #### nk_window_get_content_region_size -/// Returns the size of the currently visible and non-clipped space inside the -/// currently processed window -/// -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_vec2 nk_window_get_content_region_size(struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns `nk_vec2` struct with size the visible space inside the current window -*/ -NK_API struct nk_vec2 nk_window_get_content_region_size(struct nk_context*); -/*/// #### nk_window_get_canvas -/// Returns the draw command buffer. Can be used to draw custom widgets -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// !!! WARNING -/// Do not keep the returned command buffer pointer around it is only valid until `nk_end` -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_command_buffer* nk_window_get_canvas(struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns a pointer to window internal `nk_command_buffer` struct used as -/// drawing canvas. Can be used to do custom drawing. -*/ -NK_API struct nk_command_buffer* nk_window_get_canvas(struct nk_context*); -/*/// #### nk_window_get_scroll -/// Gets the scroll offset for the current window -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_window_get_scroll(struct nk_context *ctx, nk_uint *offset_x, nk_uint *offset_y); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// -------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __offset_x__ | A pointer to the x offset output (or NULL to ignore) -/// __offset_y__ | A pointer to the y offset output (or NULL to ignore) -*/ -NK_API void nk_window_get_scroll(struct nk_context*, nk_uint *offset_x, nk_uint *offset_y); -/*/// #### nk_window_has_focus -/// Returns if the currently processed window is currently active -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_window_has_focus(const struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns `false(0)` if current window is not active or `true(1)` if it is -*/ -NK_API nk_bool nk_window_has_focus(const struct nk_context*); -/*/// #### nk_window_is_hovered -/// Return if the current window is being hovered -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_window_is_hovered(struct nk_context *ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns `true(1)` if current window is hovered or `false(0)` otherwise -*/ -NK_API nk_bool nk_window_is_hovered(struct nk_context*); -/*/// #### nk_window_is_collapsed -/// Returns if the window with given name is currently minimized/collapsed -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_window_is_collapsed(struct nk_context *ctx, const char *name); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of window you want to check if it is collapsed -/// -/// Returns `true(1)` if current window is minimized and `false(0)` if window not -/// found or is not minimized -*/ -NK_API nk_bool nk_window_is_collapsed(struct nk_context *ctx, const char *name); -/*/// #### nk_window_is_closed -/// Returns if the window with given name was closed by calling `nk_close` -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_window_is_closed(struct nk_context *ctx, const char *name); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of window you want to check if it is closed -/// -/// Returns `true(1)` if current window was closed or `false(0)` window not found or not closed -*/ -NK_API nk_bool nk_window_is_closed(struct nk_context*, const char*); -/*/// #### nk_window_is_hidden -/// Returns if the window with given name is hidden -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_window_is_hidden(struct nk_context *ctx, const char *name); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of window you want to check if it is hidden -/// -/// Returns `true(1)` if current window is hidden or `false(0)` window not found or visible -*/ -NK_API nk_bool nk_window_is_hidden(struct nk_context*, const char*); -/*/// #### nk_window_is_active -/// Same as nk_window_has_focus for some reason -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_window_is_active(struct nk_context *ctx, const char *name); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of window you want to check if it is active -/// -/// Returns `true(1)` if current window is active or `false(0)` window not found or not active -*/ -NK_API nk_bool nk_window_is_active(struct nk_context*, const char*); -/*/// #### nk_window_is_any_hovered -/// Returns if the any window is being hovered -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_window_is_any_hovered(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns `true(1)` if any window is hovered or `false(0)` otherwise -*/ -NK_API nk_bool nk_window_is_any_hovered(struct nk_context*); -/*/// #### nk_item_is_any_active -/// Returns if the any window is being hovered or any widget is currently active. -/// Can be used to decide if input should be processed by UI or your specific input handling. -/// Example could be UI and 3D camera to move inside a 3D space. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_item_is_any_active(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// -/// Returns `true(1)` if any window is hovered or any item is active or `false(0)` otherwise -*/ -NK_API nk_bool nk_item_is_any_active(struct nk_context*); -/*/// #### nk_window_set_bounds -/// Updates position and size of window with passed in name -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_window_set_bounds(struct nk_context*, const char *name, struct nk_rect bounds); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of the window to modify both position and size -/// __bounds__ | Must point to a `nk_rect` struct with the new position and size -*/ -NK_API void nk_window_set_bounds(struct nk_context*, const char *name, struct nk_rect bounds); -/*/// #### nk_window_set_position -/// Updates position of window with passed name -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_window_set_position(struct nk_context*, const char *name, struct nk_vec2 pos); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of the window to modify both position -/// __pos__ | Must point to a `nk_vec2` struct with the new position -*/ -NK_API void nk_window_set_position(struct nk_context*, const char *name, struct nk_vec2 pos); -/*/// #### nk_window_set_size -/// Updates size of window with passed in name -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_window_set_size(struct nk_context*, const char *name, struct nk_vec2); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of the window to modify both window size -/// __size__ | Must point to a `nk_vec2` struct with new window size -*/ -NK_API void nk_window_set_size(struct nk_context*, const char *name, struct nk_vec2); -/*/// #### nk_window_set_focus -/// Sets the window with given name as active -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_window_set_focus(struct nk_context*, const char *name); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of the window to set focus on -*/ -NK_API void nk_window_set_focus(struct nk_context*, const char *name); -/*/// #### nk_window_set_scroll -/// Sets the scroll offset for the current window -/// !!! WARNING -/// Only call this function between calls `nk_begin_xxx` and `nk_end` -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_window_set_scroll(struct nk_context *ctx, nk_uint offset_x, nk_uint offset_y); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// -------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __offset_x__ | The x offset to scroll to -/// __offset_y__ | The y offset to scroll to -*/ -NK_API void nk_window_set_scroll(struct nk_context*, nk_uint offset_x, nk_uint offset_y); -/*/// #### nk_window_close -/// Closes a window and marks it for being freed at the end of the frame -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_window_close(struct nk_context *ctx, const char *name); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of the window to close -*/ -NK_API void nk_window_close(struct nk_context *ctx, const char *name); -/*/// #### nk_window_collapse -/// Updates collapse state of a window with given name -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_window_collapse(struct nk_context*, const char *name, enum nk_collapse_states state); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of the window to close -/// __state__ | value out of nk_collapse_states section -*/ -NK_API void nk_window_collapse(struct nk_context*, const char *name, enum nk_collapse_states state); -/*/// #### nk_window_collapse_if -/// Updates collapse state of a window with given name if given condition is met -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_window_collapse_if(struct nk_context*, const char *name, enum nk_collapse_states, int cond); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of the window to either collapse or maximize -/// __state__ | value out of nk_collapse_states section the window should be put into -/// __cond__ | condition that has to be met to actually commit the collapse state change -*/ -NK_API void nk_window_collapse_if(struct nk_context*, const char *name, enum nk_collapse_states, int cond); -/*/// #### nk_window_show -/// updates visibility state of a window with given name -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_window_show(struct nk_context*, const char *name, enum nk_show_states); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of the window to either collapse or maximize -/// __state__ | state with either visible or hidden to modify the window with -*/ -NK_API void nk_window_show(struct nk_context*, const char *name, enum nk_show_states); -/*/// #### nk_window_show_if -/// Updates visibility state of a window with given name if a given condition is met -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_window_show_if(struct nk_context*, const char *name, enum nk_show_states, int cond); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __name__ | Identifier of the window to either hide or show -/// __state__ | state with either visible or hidden to modify the window with -/// __cond__ | condition that has to be met to actually commit the visbility state change -*/ -NK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show_states, int cond); -/* ============================================================================= - * - * LAYOUT - * - * ============================================================================= -/// ### Layouting -/// Layouting in general describes placing widget inside a window with position and size. -/// While in this particular implementation there are five different APIs for layouting -/// each with different trade offs between control and ease of use.

-/// -/// All layouting methods in this library are based around the concept of a row. -/// A row has a height the window content grows by and a number of columns and each -/// layouting method specifies how each widget is placed inside the row. -/// After a row has been allocated by calling a layouting functions and then -/// filled with widgets will advance an internal pointer over the allocated row.

-/// -/// To actually define a layout you just call the appropriate layouting function -/// and each subsequent widget call will place the widget as specified. Important -/// here is that if you define more widgets then columns defined inside the layout -/// functions it will allocate the next row without you having to make another layouting

-/// call. -/// -/// Biggest limitation with using all these APIs outside the `nk_layout_space_xxx` API -/// is that you have to define the row height for each. However the row height -/// often depends on the height of the font.

-/// -/// To fix that internally nuklear uses a minimum row height that is set to the -/// height plus padding of currently active font and overwrites the row height -/// value if zero.

-/// -/// If you manually want to change the minimum row height then -/// use nk_layout_set_min_row_height, and use nk_layout_reset_min_row_height to -/// reset it back to be derived from font height.

-/// -/// Also if you change the font in nuklear it will automatically change the minimum -/// row height for you and. This means if you change the font but still want -/// a minimum row height smaller than the font you have to repush your value.

-/// -/// For actually more advanced UI I would even recommend using the `nk_layout_space_xxx` -/// layouting method in combination with a cassowary constraint solver (there are -/// some versions on github with permissive license model) to take over all control over widget -/// layouting yourself. However for quick and dirty layouting using all the other layouting -/// functions should be fine. -/// -/// #### Usage -/// 1. __nk_layout_row_dynamic__

-/// The easiest layouting function is `nk_layout_row_dynamic`. It provides each -/// widgets with same horizontal space inside the row and dynamically grows -/// if the owning window grows in width. So the number of columns dictates -/// the size of each widget dynamically by formula: -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// widget_width = (window_width - padding - spacing) * (1/colum_count) -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Just like all other layouting APIs if you define more widget than columns this -/// library will allocate a new row and keep all layouting parameters previously -/// defined. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// if (nk_begin_xxx(...) { -/// // first row with height: 30 composed of two widgets -/// nk_layout_row_dynamic(&ctx, 30, 2); -/// nk_widget(...); -/// nk_widget(...); -/// // -/// // second row with same parameter as defined above -/// nk_widget(...); -/// nk_widget(...); -/// // -/// // third row uses 0 for height which will use auto layouting -/// nk_layout_row_dynamic(&ctx, 0, 2); -/// nk_widget(...); -/// nk_widget(...); -/// } -/// nk_end(...); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// 2. __nk_layout_row_static__

-/// Another easy layouting function is `nk_layout_row_static`. It provides each -/// widget with same horizontal pixel width inside the row and does not grow -/// if the owning window scales smaller or bigger. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// if (nk_begin_xxx(...) { -/// // first row with height: 30 composed of two widgets with width: 80 -/// nk_layout_row_static(&ctx, 30, 80, 2); -/// nk_widget(...); -/// nk_widget(...); -/// // -/// // second row with same parameter as defined above -/// nk_widget(...); -/// nk_widget(...); -/// // -/// // third row uses 0 for height which will use auto layouting -/// nk_layout_row_static(&ctx, 0, 80, 2); -/// nk_widget(...); -/// nk_widget(...); -/// } -/// nk_end(...); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// 3. __nk_layout_row_xxx__

-/// A little bit more advanced layouting API are functions `nk_layout_row_begin`, -/// `nk_layout_row_push` and `nk_layout_row_end`. They allow to directly -/// specify each column pixel or window ratio in a row. It supports either -/// directly setting per column pixel width or widget window ratio but not -/// both. Furthermore it is a immediate mode API so each value is directly -/// pushed before calling a widget. Therefore the layout is not automatically -/// repeating like the last two layouting functions. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// if (nk_begin_xxx(...) { -/// // first row with height: 25 composed of two widgets with width 60 and 40 -/// nk_layout_row_begin(ctx, NK_STATIC, 25, 2); -/// nk_layout_row_push(ctx, 60); -/// nk_widget(...); -/// nk_layout_row_push(ctx, 40); -/// nk_widget(...); -/// nk_layout_row_end(ctx); -/// // -/// // second row with height: 25 composed of two widgets with window ratio 0.25 and 0.75 -/// nk_layout_row_begin(ctx, NK_DYNAMIC, 25, 2); -/// nk_layout_row_push(ctx, 0.25f); -/// nk_widget(...); -/// nk_layout_row_push(ctx, 0.75f); -/// nk_widget(...); -/// nk_layout_row_end(ctx); -/// // -/// // third row with auto generated height: composed of two widgets with window ratio 0.25 and 0.75 -/// nk_layout_row_begin(ctx, NK_DYNAMIC, 0, 2); -/// nk_layout_row_push(ctx, 0.25f); -/// nk_widget(...); -/// nk_layout_row_push(ctx, 0.75f); -/// nk_widget(...); -/// nk_layout_row_end(ctx); -/// } -/// nk_end(...); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// 4. __nk_layout_row__

-/// The array counterpart to API nk_layout_row_xxx is the single nk_layout_row -/// functions. Instead of pushing either pixel or window ratio for every widget -/// it allows to define it by array. The trade of for less control is that -/// `nk_layout_row` is automatically repeating. Otherwise the behavior is the -/// same. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// if (nk_begin_xxx(...) { -/// // two rows with height: 30 composed of two widgets with width 60 and 40 -/// const float ratio[] = {60,40}; -/// nk_layout_row(ctx, NK_STATIC, 30, 2, ratio); -/// nk_widget(...); -/// nk_widget(...); -/// nk_widget(...); -/// nk_widget(...); -/// // -/// // two rows with height: 30 composed of two widgets with window ratio 0.25 and 0.75 -/// const float ratio[] = {0.25, 0.75}; -/// nk_layout_row(ctx, NK_DYNAMIC, 30, 2, ratio); -/// nk_widget(...); -/// nk_widget(...); -/// nk_widget(...); -/// nk_widget(...); -/// // -/// // two rows with auto generated height composed of two widgets with window ratio 0.25 and 0.75 -/// const float ratio[] = {0.25, 0.75}; -/// nk_layout_row(ctx, NK_DYNAMIC, 30, 2, ratio); -/// nk_widget(...); -/// nk_widget(...); -/// nk_widget(...); -/// nk_widget(...); -/// } -/// nk_end(...); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// 5. __nk_layout_row_template_xxx__

-/// The most complex and second most flexible API is a simplified flexbox version without -/// line wrapping and weights for dynamic widgets. It is an immediate mode API but -/// unlike `nk_layout_row_xxx` it has auto repeat behavior and needs to be called -/// before calling the templated widgets. -/// The row template layout has three different per widget size specifier. The first -/// one is the `nk_layout_row_template_push_static` with fixed widget pixel width. -/// They do not grow if the row grows and will always stay the same. -/// The second size specifier is `nk_layout_row_template_push_variable` -/// which defines a minimum widget size but it also can grow if more space is available -/// not taken by other widgets. -/// Finally there are dynamic widgets with `nk_layout_row_template_push_dynamic` -/// which are completely flexible and unlike variable widgets can even shrink -/// to zero if not enough space is provided. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// if (nk_begin_xxx(...) { -/// // two rows with height: 30 composed of three widgets -/// nk_layout_row_template_begin(ctx, 30); -/// nk_layout_row_template_push_dynamic(ctx); -/// nk_layout_row_template_push_variable(ctx, 80); -/// nk_layout_row_template_push_static(ctx, 80); -/// nk_layout_row_template_end(ctx); -/// // -/// // first row -/// nk_widget(...); // dynamic widget can go to zero if not enough space -/// nk_widget(...); // variable widget with min 80 pixel but can grow bigger if enough space -/// nk_widget(...); // static widget with fixed 80 pixel width -/// // -/// // second row same layout -/// nk_widget(...); -/// nk_widget(...); -/// nk_widget(...); -/// } -/// nk_end(...); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// 6. __nk_layout_space_xxx__

-/// Finally the most flexible API directly allows you to place widgets inside the -/// window. The space layout API is an immediate mode API which does not support -/// row auto repeat and directly sets position and size of a widget. Position -/// and size hereby can be either specified as ratio of allocated space or -/// allocated space local position and pixel size. Since this API is quite -/// powerful there are a number of utility functions to get the available space -/// and convert between local allocated space and screen space. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// if (nk_begin_xxx(...) { -/// // static row with height: 500 (you can set column count to INT_MAX if you don't want to be bothered) -/// nk_layout_space_begin(ctx, NK_STATIC, 500, INT_MAX); -/// nk_layout_space_push(ctx, nk_rect(0,0,150,200)); -/// nk_widget(...); -/// nk_layout_space_push(ctx, nk_rect(200,200,100,200)); -/// nk_widget(...); -/// nk_layout_space_end(ctx); -/// // -/// // dynamic row with height: 500 (you can set column count to INT_MAX if you don't want to be bothered) -/// nk_layout_space_begin(ctx, NK_DYNAMIC, 500, INT_MAX); -/// nk_layout_space_push(ctx, nk_rect(0.5,0.5,0.1,0.1)); -/// nk_widget(...); -/// nk_layout_space_push(ctx, nk_rect(0.7,0.6,0.1,0.1)); -/// nk_widget(...); -/// } -/// nk_end(...); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// #### Reference -/// Function | Description -/// ----------------------------------------|------------------------------------ -/// nk_layout_set_min_row_height | Set the currently used minimum row height to a specified value -/// nk_layout_reset_min_row_height | Resets the currently used minimum row height to font height -/// nk_layout_widget_bounds | Calculates current width a static layout row can fit inside a window -/// nk_layout_ratio_from_pixel | Utility functions to calculate window ratio from pixel size -// -/// nk_layout_row_dynamic | Current layout is divided into n same sized growing columns -/// nk_layout_row_static | Current layout is divided into n same fixed sized columns -/// nk_layout_row_begin | Starts a new row with given height and number of columns -/// nk_layout_row_push | Pushes another column with given size or window ratio -/// nk_layout_row_end | Finished previously started row -/// nk_layout_row | Specifies row columns in array as either window ratio or size -// -/// nk_layout_row_template_begin | Begins the row template declaration -/// nk_layout_row_template_push_dynamic | Adds a dynamic column that dynamically grows and can go to zero if not enough space -/// nk_layout_row_template_push_variable | Adds a variable column that dynamically grows but does not shrink below specified pixel width -/// nk_layout_row_template_push_static | Adds a static column that does not grow and will always have the same size -/// nk_layout_row_template_end | Marks the end of the row template -// -/// nk_layout_space_begin | Begins a new layouting space that allows to specify each widgets position and size -/// nk_layout_space_push | Pushes position and size of the next widget in own coordinate space either as pixel or ratio -/// nk_layout_space_end | Marks the end of the layouting space -// -/// nk_layout_space_bounds | Callable after nk_layout_space_begin and returns total space allocated -/// nk_layout_space_to_screen | Converts vector from nk_layout_space coordinate space into screen space -/// nk_layout_space_to_local | Converts vector from screen space into nk_layout_space coordinates -/// nk_layout_space_rect_to_screen | Converts rectangle from nk_layout_space coordinate space into screen space -/// nk_layout_space_rect_to_local | Converts rectangle from screen space into nk_layout_space coordinates -*/ -/*/// #### nk_layout_set_min_row_height -/// Sets the currently used minimum row height. -/// !!! WARNING -/// The passed height needs to include both your preferred row height -/// as well as padding. No internal padding is added. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_set_min_row_height(struct nk_context*, float height); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __height__ | New minimum row height to be used for auto generating the row height -*/ -NK_API void nk_layout_set_min_row_height(struct nk_context*, float height); -/*/// #### nk_layout_reset_min_row_height -/// Reset the currently used minimum row height back to `font_height + text_padding + padding` -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_reset_min_row_height(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -*/ -NK_API void nk_layout_reset_min_row_height(struct nk_context*); -/*/// #### nk_layout_widget_bounds -/// Returns the width of the next row allocate by one of the layouting functions -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_rect nk_layout_widget_bounds(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// -/// Return `nk_rect` with both position and size of the next row -*/ -NK_API struct nk_rect nk_layout_widget_bounds(struct nk_context*); -/*/// #### nk_layout_ratio_from_pixel -/// Utility functions to calculate window ratio from pixel size -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// float nk_layout_ratio_from_pixel(struct nk_context*, float pixel_width); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __pixel__ | Pixel_width to convert to window ratio -/// -/// Returns `nk_rect` with both position and size of the next row -*/ -NK_API float nk_layout_ratio_from_pixel(struct nk_context*, float pixel_width); -/*/// #### nk_layout_row_dynamic -/// Sets current row layout to share horizontal space -/// between @cols number of widgets evenly. Once called all subsequent widget -/// calls greater than @cols will allocate a new row with same layout. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_row_dynamic(struct nk_context *ctx, float height, int cols); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __height__ | Holds height of each widget in row or zero for auto layouting -/// __columns__ | Number of widget inside row -*/ -NK_API void nk_layout_row_dynamic(struct nk_context *ctx, float height, int cols); -/*/// #### nk_layout_row_static -/// Sets current row layout to fill @cols number of widgets -/// in row with same @item_width horizontal size. Once called all subsequent widget -/// calls greater than @cols will allocate a new row with same layout. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_row_static(struct nk_context *ctx, float height, int item_width, int cols); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __height__ | Holds height of each widget in row or zero for auto layouting -/// __width__ | Holds pixel width of each widget in the row -/// __columns__ | Number of widget inside row -*/ -NK_API void nk_layout_row_static(struct nk_context *ctx, float height, int item_width, int cols); -/*/// #### nk_layout_row_begin -/// Starts a new dynamic or fixed row with given height and columns. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_row_begin(struct nk_context *ctx, enum nk_layout_format fmt, float row_height, int cols); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __fmt__ | either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns -/// __height__ | holds height of each widget in row or zero for auto layouting -/// __columns__ | Number of widget inside row -*/ -NK_API void nk_layout_row_begin(struct nk_context *ctx, enum nk_layout_format fmt, float row_height, int cols); -/*/// #### nk_layout_row_push -/// Specifies either window ratio or width of a single column -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_row_push(struct nk_context*, float value); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __value__ | either a window ratio or fixed width depending on @fmt in previous `nk_layout_row_begin` call -*/ -NK_API void nk_layout_row_push(struct nk_context*, float value); -/*/// #### nk_layout_row_end -/// Finished previously started row -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_row_end(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -*/ -NK_API void nk_layout_row_end(struct nk_context*); -/*/// #### nk_layout_row -/// Specifies row columns in array as either window ratio or size -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_row(struct nk_context*, enum nk_layout_format, float height, int cols, const float *ratio); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __fmt__ | Either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns -/// __height__ | Holds height of each widget in row or zero for auto layouting -/// __columns__ | Number of widget inside row -*/ -NK_API void nk_layout_row(struct nk_context*, enum nk_layout_format, float height, int cols, const float *ratio); -/*/// #### nk_layout_row_template_begin -/// Begins the row template declaration -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_row_template_begin(struct nk_context*, float row_height); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __height__ | Holds height of each widget in row or zero for auto layouting -*/ -NK_API void nk_layout_row_template_begin(struct nk_context*, float row_height); -/*/// #### nk_layout_row_template_push_dynamic -/// Adds a dynamic column that dynamically grows and can go to zero if not enough space -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_row_template_push_dynamic(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __height__ | Holds height of each widget in row or zero for auto layouting -*/ -NK_API void nk_layout_row_template_push_dynamic(struct nk_context*); -/*/// #### nk_layout_row_template_push_variable -/// Adds a variable column that dynamically grows but does not shrink below specified pixel width -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_row_template_push_variable(struct nk_context*, float min_width); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __width__ | Holds the minimum pixel width the next column must always be -*/ -NK_API void nk_layout_row_template_push_variable(struct nk_context*, float min_width); -/*/// #### nk_layout_row_template_push_static -/// Adds a static column that does not grow and will always have the same size -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_row_template_push_static(struct nk_context*, float width); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __width__ | Holds the absolute pixel width value the next column must be -*/ -NK_API void nk_layout_row_template_push_static(struct nk_context*, float width); -/*/// #### nk_layout_row_template_end -/// Marks the end of the row template -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_row_template_end(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -*/ -NK_API void nk_layout_row_template_end(struct nk_context*); -/*/// #### nk_layout_space_begin -/// Begins a new layouting space that allows to specify each widgets position and size. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_space_begin(struct nk_context*, enum nk_layout_format, float height, int widget_count); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` -/// __fmt__ | Either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns -/// __height__ | Holds height of each widget in row or zero for auto layouting -/// __columns__ | Number of widgets inside row -*/ -NK_API void nk_layout_space_begin(struct nk_context*, enum nk_layout_format, float height, int widget_count); -/*/// #### nk_layout_space_push -/// Pushes position and size of the next widget in own coordinate space either as pixel or ratio -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_space_push(struct nk_context *ctx, struct nk_rect bounds); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` -/// __bounds__ | Position and size in laoyut space local coordinates -*/ -NK_API void nk_layout_space_push(struct nk_context*, struct nk_rect bounds); -/*/// #### nk_layout_space_end -/// Marks the end of the layout space -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_layout_space_end(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` -*/ -NK_API void nk_layout_space_end(struct nk_context*); -/*/// #### nk_layout_space_bounds -/// Utility function to calculate total space allocated for `nk_layout_space` -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_rect nk_layout_space_bounds(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` -/// -/// Returns `nk_rect` holding the total space allocated -*/ -NK_API struct nk_rect nk_layout_space_bounds(struct nk_context*); -/*/// #### nk_layout_space_to_screen -/// Converts vector from nk_layout_space coordinate space into screen space -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_vec2 nk_layout_space_to_screen(struct nk_context*, struct nk_vec2); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` -/// __vec__ | Position to convert from layout space into screen coordinate space -/// -/// Returns transformed `nk_vec2` in screen space coordinates -*/ -NK_API struct nk_vec2 nk_layout_space_to_screen(struct nk_context*, struct nk_vec2); -/*/// #### nk_layout_space_to_local -/// Converts vector from layout space into screen space -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_vec2 nk_layout_space_to_local(struct nk_context*, struct nk_vec2); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` -/// __vec__ | Position to convert from screen space into layout coordinate space -/// -/// Returns transformed `nk_vec2` in layout space coordinates -*/ -NK_API struct nk_vec2 nk_layout_space_to_local(struct nk_context*, struct nk_vec2); -/*/// #### nk_layout_space_rect_to_screen -/// Converts rectangle from screen space into layout space -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_rect nk_layout_space_rect_to_screen(struct nk_context*, struct nk_rect); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` -/// __bounds__ | Rectangle to convert from layout space into screen space -/// -/// Returns transformed `nk_rect` in screen space coordinates -*/ -NK_API struct nk_rect nk_layout_space_rect_to_screen(struct nk_context*, struct nk_rect); -/*/// #### nk_layout_space_rect_to_local -/// Converts rectangle from layout space into screen space -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_rect nk_layout_space_rect_to_local(struct nk_context*, struct nk_rect); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` -/// __bounds__ | Rectangle to convert from layout space into screen space -/// -/// Returns transformed `nk_rect` in layout space coordinates -*/ -NK_API struct nk_rect nk_layout_space_rect_to_local(struct nk_context*, struct nk_rect); - -/*/// #### nk_spacer -/// Spacer is a dummy widget that consumes space as usual but doesn't draw anything -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_spacer(struct nk_context* ); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` -/// -*/ -NK_API void nk_spacer(struct nk_context* ); - - -/* ============================================================================= - * - * GROUP - * - * ============================================================================= -/// ### Groups -/// Groups are basically windows inside windows. They allow to subdivide space -/// in a window to layout widgets as a group. Almost all more complex widget -/// layouting requirements can be solved using groups and basic layouting -/// fuctionality. Groups just like windows are identified by an unique name and -/// internally keep track of scrollbar offsets by default. However additional -/// versions are provided to directly manage the scrollbar. -/// -/// #### Usage -/// To create a group you have to call one of the three `nk_group_begin_xxx` -/// functions to start group declarations and `nk_group_end` at the end. Furthermore it -/// is required to check the return value of `nk_group_begin_xxx` and only process -/// widgets inside the window if the value is not 0. -/// Nesting groups is possible and even encouraged since many layouting schemes -/// can only be achieved by nesting. Groups, unlike windows, need `nk_group_end` -/// to be only called if the corresponding `nk_group_begin_xxx` call does not return 0: -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// if (nk_group_begin_xxx(ctx, ...) { -/// // [... widgets ...] -/// nk_group_end(ctx); -/// } -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// In the grand concept groups can be called after starting a window -/// with `nk_begin_xxx` and before calling `nk_end`: -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// struct nk_context ctx; -/// nk_init_xxx(&ctx, ...); -/// while (1) { -/// // Input -/// Event evt; -/// nk_input_begin(&ctx); -/// while (GetEvent(&evt)) { -/// if (evt.type == MOUSE_MOVE) -/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); -/// else if (evt.type == [...]) { -/// nk_input_xxx(...); -/// } -/// } -/// nk_input_end(&ctx); -/// // -/// // Window -/// if (nk_begin_xxx(...) { -/// // [...widgets...] -/// nk_layout_row_dynamic(...); -/// if (nk_group_begin_xxx(ctx, ...) { -/// //[... widgets ...] -/// nk_group_end(ctx); -/// } -/// } -/// nk_end(ctx); -/// // -/// // Draw -/// const struct nk_command *cmd = 0; -/// nk_foreach(cmd, &ctx) { -/// switch (cmd->type) { -/// case NK_COMMAND_LINE: -/// your_draw_line_function(...) -/// break; -/// case NK_COMMAND_RECT -/// your_draw_rect_function(...) -/// break; -/// case ...: -/// // [...] -/// } -/// nk_clear(&ctx); -/// } -/// nk_free(&ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// #### Reference -/// Function | Description -/// --------------------------------|------------------------------------------- -/// nk_group_begin | Start a new group with internal scrollbar handling -/// nk_group_begin_titled | Start a new group with separated name and title and internal scrollbar handling -/// nk_group_end | Ends a group. Should only be called if nk_group_begin returned non-zero -/// nk_group_scrolled_offset_begin | Start a new group with manual separated handling of scrollbar x- and y-offset -/// nk_group_scrolled_begin | Start a new group with manual scrollbar handling -/// nk_group_scrolled_end | Ends a group with manual scrollbar handling. Should only be called if nk_group_begin returned non-zero -/// nk_group_get_scroll | Gets the scroll offset for the given group -/// nk_group_set_scroll | Sets the scroll offset for the given group -*/ -/*/// #### nk_group_begin -/// Starts a new widget group. Requires a previous layouting function to specify a pos/size. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_group_begin(struct nk_context*, const char *title, nk_flags); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __title__ | Must be an unique identifier for this group that is also used for the group header -/// __flags__ | Window flags defined in the nk_panel_flags section with a number of different group behaviors -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -NK_API nk_bool nk_group_begin(struct nk_context*, const char *title, nk_flags); -/*/// #### nk_group_begin_titled -/// Starts a new widget group. Requires a previous layouting function to specify a pos/size. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_group_begin_titled(struct nk_context*, const char *name, const char *title, nk_flags); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __id__ | Must be an unique identifier for this group -/// __title__ | Group header title -/// __flags__ | Window flags defined in the nk_panel_flags section with a number of different group behaviors -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -NK_API nk_bool nk_group_begin_titled(struct nk_context*, const char *name, const char *title, nk_flags); -/*/// #### nk_group_end -/// Ends a widget group -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_group_end(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -*/ -NK_API void nk_group_end(struct nk_context*); -/*/// #### nk_group_scrolled_offset_begin -/// starts a new widget group. requires a previous layouting function to specify -/// a size. Does not keep track of scrollbar. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_group_scrolled_offset_begin(struct nk_context*, nk_uint *x_offset, nk_uint *y_offset, const char *title, nk_flags flags); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __x_offset__| Scrollbar x-offset to offset all widgets inside the group horizontally. -/// __y_offset__| Scrollbar y-offset to offset all widgets inside the group vertically -/// __title__ | Window unique group title used to both identify and display in the group header -/// __flags__ | Window flags from the nk_panel_flags section -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -NK_API nk_bool nk_group_scrolled_offset_begin(struct nk_context*, nk_uint *x_offset, nk_uint *y_offset, const char *title, nk_flags flags); -/*/// #### nk_group_scrolled_begin -/// Starts a new widget group. requires a previous -/// layouting function to specify a size. Does not keep track of scrollbar. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_group_scrolled_begin(struct nk_context*, struct nk_scroll *off, const char *title, nk_flags); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __off__ | Both x- and y- scroll offset. Allows for manual scrollbar control -/// __title__ | Window unique group title used to both identify and display in the group header -/// __flags__ | Window flags from nk_panel_flags section -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -NK_API nk_bool nk_group_scrolled_begin(struct nk_context*, struct nk_scroll *off, const char *title, nk_flags); -/*/// #### nk_group_scrolled_end -/// Ends a widget group after calling nk_group_scrolled_offset_begin or nk_group_scrolled_begin. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_group_scrolled_end(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -*/ -NK_API void nk_group_scrolled_end(struct nk_context*); -/*/// #### nk_group_get_scroll -/// Gets the scroll position of the given group. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_group_get_scroll(struct nk_context*, const char *id, nk_uint *x_offset, nk_uint *y_offset); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// -------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __id__ | The id of the group to get the scroll position of -/// __x_offset__ | A pointer to the x offset output (or NULL to ignore) -/// __y_offset__ | A pointer to the y offset output (or NULL to ignore) -*/ -NK_API void nk_group_get_scroll(struct nk_context*, const char *id, nk_uint *x_offset, nk_uint *y_offset); -/*/// #### nk_group_set_scroll -/// Sets the scroll position of the given group. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_group_set_scroll(struct nk_context*, const char *id, nk_uint x_offset, nk_uint y_offset); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// -------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __id__ | The id of the group to scroll -/// __x_offset__ | The x offset to scroll to -/// __y_offset__ | The y offset to scroll to -*/ -NK_API void nk_group_set_scroll(struct nk_context*, const char *id, nk_uint x_offset, nk_uint y_offset); -/* ============================================================================= - * - * TREE - * - * ============================================================================= -/// ### Tree -/// Trees represent two different concept. First the concept of a collapsible -/// UI section that can be either in a hidden or visible state. They allow the UI -/// user to selectively minimize the current set of visible UI to comprehend. -/// The second concept are tree widgets for visual UI representation of trees.

-/// -/// Trees thereby can be nested for tree representations and multiple nested -/// collapsible UI sections. All trees are started by calling of the -/// `nk_tree_xxx_push_tree` functions and ended by calling one of the -/// `nk_tree_xxx_pop_xxx()` functions. Each starting functions takes a title label -/// and optionally an image to be displayed and the initial collapse state from -/// the nk_collapse_states section.

-/// -/// The runtime state of the tree is either stored outside the library by the caller -/// or inside which requires a unique ID. The unique ID can either be generated -/// automatically from `__FILE__` and `__LINE__` with function `nk_tree_push`, -/// by `__FILE__` and a user provided ID generated for example by loop index with -/// function `nk_tree_push_id` or completely provided from outside by user with -/// function `nk_tree_push_hashed`. -/// -/// #### Usage -/// To create a tree you have to call one of the seven `nk_tree_xxx_push_xxx` -/// functions to start a collapsible UI section and `nk_tree_xxx_pop` to mark the -/// end. -/// Each starting function will either return `false(0)` if the tree is collapsed -/// or hidden and therefore does not need to be filled with content or `true(1)` -/// if visible and required to be filled. -/// -/// !!! Note -/// The tree header does not require and layouting function and instead -/// calculates a auto height based on the currently used font size -/// -/// The tree ending functions only need to be called if the tree content is -/// actually visible. So make sure the tree push function is guarded by `if` -/// and the pop call is only taken if the tree is visible. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// if (nk_tree_push(ctx, NK_TREE_TAB, "Tree", NK_MINIMIZED)) { -/// nk_layout_row_dynamic(...); -/// nk_widget(...); -/// nk_tree_pop(ctx); -/// } -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// #### Reference -/// Function | Description -/// ----------------------------|------------------------------------------- -/// nk_tree_push | Start a collapsible UI section with internal state management -/// nk_tree_push_id | Start a collapsible UI section with internal state management callable in a look -/// nk_tree_push_hashed | Start a collapsible UI section with internal state management with full control over internal unique ID use to store state -/// nk_tree_image_push | Start a collapsible UI section with image and label header -/// nk_tree_image_push_id | Start a collapsible UI section with image and label header and internal state management callable in a look -/// nk_tree_image_push_hashed | Start a collapsible UI section with image and label header and internal state management with full control over internal unique ID use to store state -/// nk_tree_pop | Ends a collapsible UI section -// -/// nk_tree_state_push | Start a collapsible UI section with external state management -/// nk_tree_state_image_push | Start a collapsible UI section with image and label header and external state management -/// nk_tree_state_pop | Ends a collapsabale UI section -/// -/// #### nk_tree_type -/// Flag | Description -/// ----------------|---------------------------------------- -/// NK_TREE_NODE | Highlighted tree header to mark a collapsible UI section -/// NK_TREE_TAB | Non-highlighted tree header closer to tree representations -*/ -/*/// #### nk_tree_push -/// Starts a collapsible UI section with internal state management -/// !!! WARNING -/// To keep track of the runtime tree collapsible state this function uses -/// defines `__FILE__` and `__LINE__` to generate a unique ID. If you want -/// to call this function in a loop please use `nk_tree_push_id` or -/// `nk_tree_push_hashed` instead. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// #define nk_tree_push(ctx, type, title, state) -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node -/// __title__ | Label printed in the tree header -/// __state__ | Initial tree state value out of nk_collapse_states -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -#define nk_tree_push(ctx, type, title, state) nk_tree_push_hashed(ctx, type, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),__LINE__) -/*/// #### nk_tree_push_id -/// Starts a collapsible UI section with internal state management callable in a look -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// #define nk_tree_push_id(ctx, type, title, state, id) -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node -/// __title__ | Label printed in the tree header -/// __state__ | Initial tree state value out of nk_collapse_states -/// __id__ | Loop counter index if this function is called in a loop -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -#define nk_tree_push_id(ctx, type, title, state, id) nk_tree_push_hashed(ctx, type, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),id) -/*/// #### nk_tree_push_hashed -/// Start a collapsible UI section with internal state management with full -/// control over internal unique ID used to store state -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_tree_push_hashed(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node -/// __title__ | Label printed in the tree header -/// __state__ | Initial tree state value out of nk_collapse_states -/// __hash__ | Memory block or string to generate the ID from -/// __len__ | Size of passed memory block or string in __hash__ -/// __seed__ | Seeding value if this function is called in a loop or default to `0` -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -NK_API nk_bool nk_tree_push_hashed(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed); -/*/// #### nk_tree_image_push -/// Start a collapsible UI section with image and label header -/// !!! WARNING -/// To keep track of the runtime tree collapsible state this function uses -/// defines `__FILE__` and `__LINE__` to generate a unique ID. If you want -/// to call this function in a loop please use `nk_tree_image_push_id` or -/// `nk_tree_image_push_hashed` instead. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// #define nk_tree_image_push(ctx, type, img, title, state) -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node -/// __img__ | Image to display inside the header on the left of the label -/// __title__ | Label printed in the tree header -/// __state__ | Initial tree state value out of nk_collapse_states -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -#define nk_tree_image_push(ctx, type, img, title, state) nk_tree_image_push_hashed(ctx, type, img, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),__LINE__) -/*/// #### nk_tree_image_push_id -/// Start a collapsible UI section with image and label header and internal state -/// management callable in a look -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// #define nk_tree_image_push_id(ctx, type, img, title, state, id) -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node -/// __img__ | Image to display inside the header on the left of the label -/// __title__ | Label printed in the tree header -/// __state__ | Initial tree state value out of nk_collapse_states -/// __id__ | Loop counter index if this function is called in a loop -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -#define nk_tree_image_push_id(ctx, type, img, title, state, id) nk_tree_image_push_hashed(ctx, type, img, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),id) -/*/// #### nk_tree_image_push_hashed -/// Start a collapsible UI section with internal state management with full -/// control over internal unique ID used to store state -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_tree_image_push_hashed(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct -/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node -/// __img__ | Image to display inside the header on the left of the label -/// __title__ | Label printed in the tree header -/// __state__ | Initial tree state value out of nk_collapse_states -/// __hash__ | Memory block or string to generate the ID from -/// __len__ | Size of passed memory block or string in __hash__ -/// __seed__ | Seeding value if this function is called in a loop or default to `0` -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -NK_API nk_bool nk_tree_image_push_hashed(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed); -/*/// #### nk_tree_pop -/// Ends a collapsabale UI section -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_tree_pop(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling `nk_tree_xxx_push_xxx` -*/ -NK_API void nk_tree_pop(struct nk_context*); -/*/// #### nk_tree_state_push -/// Start a collapsible UI section with external state management -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_tree_state_push(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states *state); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling `nk_tree_xxx_push_xxx` -/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node -/// __title__ | Label printed in the tree header -/// __state__ | Persistent state to update -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -NK_API nk_bool nk_tree_state_push(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states *state); -/*/// #### nk_tree_state_image_push -/// Start a collapsible UI section with image and label header and external state management -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// nk_bool nk_tree_state_image_push(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states *state); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling `nk_tree_xxx_push_xxx` -/// __img__ | Image to display inside the header on the left of the label -/// __type__ | Value from the nk_tree_type section to visually mark a tree node header as either a collapseable UI section or tree node -/// __title__ | Label printed in the tree header -/// __state__ | Persistent state to update -/// -/// Returns `true(1)` if visible and fillable with widgets or `false(0)` otherwise -*/ -NK_API nk_bool nk_tree_state_image_push(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states *state); -/*/// #### nk_tree_state_pop -/// Ends a collapsabale UI section -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_tree_state_pop(struct nk_context*); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// ------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling `nk_tree_xxx_push_xxx` -*/ -NK_API void nk_tree_state_pop(struct nk_context*); - -#define nk_tree_element_push(ctx, type, title, state, sel) nk_tree_element_push_hashed(ctx, type, title, state, sel, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),__LINE__) -#define nk_tree_element_push_id(ctx, type, title, state, sel, id) nk_tree_element_push_hashed(ctx, type, title, state, sel, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),id) -NK_API nk_bool nk_tree_element_push_hashed(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states initial_state, nk_bool *selected, const char *hash, int len, int seed); -NK_API nk_bool nk_tree_element_image_push_hashed(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states initial_state, nk_bool *selected, const char *hash, int len,int seed); -NK_API void nk_tree_element_pop(struct nk_context*); - -/* ============================================================================= - * - * LIST VIEW - * - * ============================================================================= */ -struct nk_list_view { -/* public: */ - int begin, end, count; -/* private: */ - int total_height; - struct nk_context *ctx; - nk_uint *scroll_pointer; - nk_uint scroll_value; -}; -NK_API nk_bool nk_list_view_begin(struct nk_context*, struct nk_list_view *out, const char *id, nk_flags, int row_height, int row_count); -NK_API void nk_list_view_end(struct nk_list_view*); -/* ============================================================================= - * - * WIDGET - * - * ============================================================================= */ -enum nk_widget_layout_states { - NK_WIDGET_INVALID, /* The widget cannot be seen and is completely out of view */ - NK_WIDGET_VALID, /* The widget is completely inside the window and can be updated and drawn */ - NK_WIDGET_ROM /* The widget is partially visible and cannot be updated */ -}; -enum nk_widget_states { - NK_WIDGET_STATE_MODIFIED = NK_FLAG(1), - NK_WIDGET_STATE_INACTIVE = NK_FLAG(2), /* widget is neither active nor hovered */ - NK_WIDGET_STATE_ENTERED = NK_FLAG(3), /* widget has been hovered on the current frame */ - NK_WIDGET_STATE_HOVER = NK_FLAG(4), /* widget is being hovered */ - NK_WIDGET_STATE_ACTIVED = NK_FLAG(5),/* widget is currently activated */ - NK_WIDGET_STATE_LEFT = NK_FLAG(6), /* widget is from this frame on not hovered anymore */ - NK_WIDGET_STATE_HOVERED = NK_WIDGET_STATE_HOVER|NK_WIDGET_STATE_MODIFIED, /* widget is being hovered */ - NK_WIDGET_STATE_ACTIVE = NK_WIDGET_STATE_ACTIVED|NK_WIDGET_STATE_MODIFIED /* widget is currently activated */ -}; -NK_API enum nk_widget_layout_states nk_widget(struct nk_rect*, const struct nk_context*); -NK_API enum nk_widget_layout_states nk_widget_fitting(struct nk_rect*, struct nk_context*, struct nk_vec2); -NK_API struct nk_rect nk_widget_bounds(struct nk_context*); -NK_API struct nk_vec2 nk_widget_position(struct nk_context*); -NK_API struct nk_vec2 nk_widget_size(struct nk_context*); -NK_API float nk_widget_width(struct nk_context*); -NK_API float nk_widget_height(struct nk_context*); -NK_API nk_bool nk_widget_is_hovered(struct nk_context*); -NK_API nk_bool nk_widget_is_mouse_clicked(struct nk_context*, enum nk_buttons); -NK_API nk_bool nk_widget_has_mouse_click_down(struct nk_context*, enum nk_buttons, nk_bool down); -NK_API void nk_spacing(struct nk_context*, int cols); -/* ============================================================================= - * - * TEXT - * - * ============================================================================= */ -enum nk_text_align { - NK_TEXT_ALIGN_LEFT = 0x01, - NK_TEXT_ALIGN_CENTERED = 0x02, - NK_TEXT_ALIGN_RIGHT = 0x04, - NK_TEXT_ALIGN_TOP = 0x08, - NK_TEXT_ALIGN_MIDDLE = 0x10, - NK_TEXT_ALIGN_BOTTOM = 0x20 -}; -enum nk_text_alignment { - NK_TEXT_LEFT = NK_TEXT_ALIGN_MIDDLE|NK_TEXT_ALIGN_LEFT, - NK_TEXT_CENTERED = NK_TEXT_ALIGN_MIDDLE|NK_TEXT_ALIGN_CENTERED, - NK_TEXT_RIGHT = NK_TEXT_ALIGN_MIDDLE|NK_TEXT_ALIGN_RIGHT -}; -NK_API void nk_text(struct nk_context*, const char*, int, nk_flags); -NK_API void nk_text_colored(struct nk_context*, const char*, int, nk_flags, struct nk_color); -NK_API void nk_text_wrap(struct nk_context*, const char*, int); -NK_API void nk_text_wrap_colored(struct nk_context*, const char*, int, struct nk_color); -NK_API void nk_label(struct nk_context*, const char*, nk_flags align); -NK_API void nk_label_colored(struct nk_context*, const char*, nk_flags align, struct nk_color); -NK_API void nk_label_wrap(struct nk_context*, const char*); -NK_API void nk_label_colored_wrap(struct nk_context*, const char*, struct nk_color); -NK_API void nk_image(struct nk_context*, struct nk_image); -NK_API void nk_image_color(struct nk_context*, struct nk_image, struct nk_color); -#ifdef NK_INCLUDE_STANDARD_VARARGS -NK_API void nk_labelf(struct nk_context*, nk_flags, NK_PRINTF_FORMAT_STRING const char*, ...) NK_PRINTF_VARARG_FUNC(3); -NK_API void nk_labelf_colored(struct nk_context*, nk_flags, struct nk_color, NK_PRINTF_FORMAT_STRING const char*,...) NK_PRINTF_VARARG_FUNC(4); -NK_API void nk_labelf_wrap(struct nk_context*, NK_PRINTF_FORMAT_STRING const char*,...) NK_PRINTF_VARARG_FUNC(2); -NK_API void nk_labelf_colored_wrap(struct nk_context*, struct nk_color, NK_PRINTF_FORMAT_STRING const char*,...) NK_PRINTF_VARARG_FUNC(3); -NK_API void nk_labelfv(struct nk_context*, nk_flags, NK_PRINTF_FORMAT_STRING const char*, va_list) NK_PRINTF_VALIST_FUNC(3); -NK_API void nk_labelfv_colored(struct nk_context*, nk_flags, struct nk_color, NK_PRINTF_FORMAT_STRING const char*, va_list) NK_PRINTF_VALIST_FUNC(4); -NK_API void nk_labelfv_wrap(struct nk_context*, NK_PRINTF_FORMAT_STRING const char*, va_list) NK_PRINTF_VALIST_FUNC(2); -NK_API void nk_labelfv_colored_wrap(struct nk_context*, struct nk_color, NK_PRINTF_FORMAT_STRING const char*, va_list) NK_PRINTF_VALIST_FUNC(3); -NK_API void nk_value_bool(struct nk_context*, const char *prefix, int); -NK_API void nk_value_int(struct nk_context*, const char *prefix, int); -NK_API void nk_value_uint(struct nk_context*, const char *prefix, unsigned int); -NK_API void nk_value_float(struct nk_context*, const char *prefix, float); -NK_API void nk_value_color_byte(struct nk_context*, const char *prefix, struct nk_color); -NK_API void nk_value_color_float(struct nk_context*, const char *prefix, struct nk_color); -NK_API void nk_value_color_hex(struct nk_context*, const char *prefix, struct nk_color); -#endif -/* ============================================================================= - * - * BUTTON - * - * ============================================================================= */ -NK_API nk_bool nk_button_text(struct nk_context*, const char *title, int len); -NK_API nk_bool nk_button_label(struct nk_context*, const char *title); -NK_API nk_bool nk_button_color(struct nk_context*, struct nk_color); -NK_API nk_bool nk_button_symbol(struct nk_context*, enum nk_symbol_type); -NK_API nk_bool nk_button_image(struct nk_context*, struct nk_image img); -NK_API nk_bool nk_button_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags text_alignment); -NK_API nk_bool nk_button_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment); -NK_API nk_bool nk_button_image_label(struct nk_context*, struct nk_image img, const char*, nk_flags text_alignment); -NK_API nk_bool nk_button_image_text(struct nk_context*, struct nk_image img, const char*, int, nk_flags alignment); -NK_API nk_bool nk_button_text_styled(struct nk_context*, const struct nk_style_button*, const char *title, int len); -NK_API nk_bool nk_button_label_styled(struct nk_context*, const struct nk_style_button*, const char *title); -NK_API nk_bool nk_button_symbol_styled(struct nk_context*, const struct nk_style_button*, enum nk_symbol_type); -NK_API nk_bool nk_button_image_styled(struct nk_context*, const struct nk_style_button*, struct nk_image img); -NK_API nk_bool nk_button_symbol_text_styled(struct nk_context*,const struct nk_style_button*, enum nk_symbol_type, const char*, int, nk_flags alignment); -NK_API nk_bool nk_button_symbol_label_styled(struct nk_context *ctx, const struct nk_style_button *style, enum nk_symbol_type symbol, const char *title, nk_flags align); -NK_API nk_bool nk_button_image_label_styled(struct nk_context*,const struct nk_style_button*, struct nk_image img, const char*, nk_flags text_alignment); -NK_API nk_bool nk_button_image_text_styled(struct nk_context*,const struct nk_style_button*, struct nk_image img, const char*, int, nk_flags alignment); -NK_API void nk_button_set_behavior(struct nk_context*, enum nk_button_behavior); -NK_API nk_bool nk_button_push_behavior(struct nk_context*, enum nk_button_behavior); -NK_API nk_bool nk_button_pop_behavior(struct nk_context*); -/* ============================================================================= - * - * CHECKBOX - * - * ============================================================================= */ -NK_API nk_bool nk_check_label(struct nk_context*, const char*, nk_bool active); -NK_API nk_bool nk_check_text(struct nk_context*, const char*, int, nk_bool active); -NK_API unsigned nk_check_flags_label(struct nk_context*, const char*, unsigned int flags, unsigned int value); -NK_API unsigned nk_check_flags_text(struct nk_context*, const char*, int, unsigned int flags, unsigned int value); -NK_API nk_bool nk_checkbox_label(struct nk_context*, const char*, nk_bool *active); -NK_API nk_bool nk_checkbox_text(struct nk_context*, const char*, int, nk_bool *active); -NK_API nk_bool nk_checkbox_flags_label(struct nk_context*, const char*, unsigned int *flags, unsigned int value); -NK_API nk_bool nk_checkbox_flags_text(struct nk_context*, const char*, int, unsigned int *flags, unsigned int value); -/* ============================================================================= - * - * RADIO BUTTON - * - * ============================================================================= */ -NK_API nk_bool nk_radio_label(struct nk_context*, const char*, nk_bool *active); -NK_API nk_bool nk_radio_text(struct nk_context*, const char*, int, nk_bool *active); -NK_API nk_bool nk_option_label(struct nk_context*, const char*, nk_bool active); -NK_API nk_bool nk_option_text(struct nk_context*, const char*, int, nk_bool active); -/* ============================================================================= - * - * SELECTABLE - * - * ============================================================================= */ -NK_API nk_bool nk_selectable_label(struct nk_context*, const char*, nk_flags align, nk_bool *value); -NK_API nk_bool nk_selectable_text(struct nk_context*, const char*, int, nk_flags align, nk_bool *value); -NK_API nk_bool nk_selectable_image_label(struct nk_context*,struct nk_image, const char*, nk_flags align, nk_bool *value); -NK_API nk_bool nk_selectable_image_text(struct nk_context*,struct nk_image, const char*, int, nk_flags align, nk_bool *value); -NK_API nk_bool nk_selectable_symbol_label(struct nk_context*,enum nk_symbol_type, const char*, nk_flags align, nk_bool *value); -NK_API nk_bool nk_selectable_symbol_text(struct nk_context*,enum nk_symbol_type, const char*, int, nk_flags align, nk_bool *value); - -NK_API nk_bool nk_select_label(struct nk_context*, const char*, nk_flags align, nk_bool value); -NK_API nk_bool nk_select_text(struct nk_context*, const char*, int, nk_flags align, nk_bool value); -NK_API nk_bool nk_select_image_label(struct nk_context*, struct nk_image,const char*, nk_flags align, nk_bool value); -NK_API nk_bool nk_select_image_text(struct nk_context*, struct nk_image,const char*, int, nk_flags align, nk_bool value); -NK_API nk_bool nk_select_symbol_label(struct nk_context*,enum nk_symbol_type, const char*, nk_flags align, nk_bool value); -NK_API nk_bool nk_select_symbol_text(struct nk_context*,enum nk_symbol_type, const char*, int, nk_flags align, nk_bool value); - -/* ============================================================================= - * - * SLIDER - * - * ============================================================================= */ -NK_API float nk_slide_float(struct nk_context*, float min, float val, float max, float step); -NK_API int nk_slide_int(struct nk_context*, int min, int val, int max, int step); -NK_API nk_bool nk_slider_float(struct nk_context*, float min, float *val, float max, float step); -NK_API nk_bool nk_slider_int(struct nk_context*, int min, int *val, int max, int step); -/* ============================================================================= - * - * PROGRESSBAR - * - * ============================================================================= */ -NK_API nk_bool nk_progress(struct nk_context*, nk_size *cur, nk_size max, nk_bool modifyable); -NK_API nk_size nk_prog(struct nk_context*, nk_size cur, nk_size max, nk_bool modifyable); - -/* ============================================================================= - * - * COLOR PICKER - * - * ============================================================================= */ -NK_API struct nk_colorf nk_color_picker(struct nk_context*, struct nk_colorf, enum nk_color_format); -NK_API nk_bool nk_color_pick(struct nk_context*, struct nk_colorf*, enum nk_color_format); -/* ============================================================================= - * - * PROPERTIES - * - * ============================================================================= -/// ### Properties -/// Properties are the main value modification widgets in Nuklear. Changing a value -/// can be achieved by dragging, adding/removing incremental steps on button click -/// or by directly typing a number. -/// -/// #### Usage -/// Each property requires a unique name for identification that is also used for -/// displaying a label. If you want to use the same name multiple times make sure -/// add a '#' before your name. The '#' will not be shown but will generate a -/// unique ID. Each property also takes in a minimum and maximum value. If you want -/// to make use of the complete number range of a type just use the provided -/// type limits from `limits.h`. For example `INT_MIN` and `INT_MAX` for -/// `nk_property_int` and `nk_propertyi`. In additional each property takes in -/// a increment value that will be added or subtracted if either the increment -/// decrement button is clicked. Finally there is a value for increment per pixel -/// dragged that is added or subtracted from the value. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// int value = 0; -/// struct nk_context ctx; -/// nk_init_xxx(&ctx, ...); -/// while (1) { -/// // Input -/// Event evt; -/// nk_input_begin(&ctx); -/// while (GetEvent(&evt)) { -/// if (evt.type == MOUSE_MOVE) -/// nk_input_motion(&ctx, evt.motion.x, evt.motion.y); -/// else if (evt.type == [...]) { -/// nk_input_xxx(...); -/// } -/// } -/// nk_input_end(&ctx); -/// // -/// // Window -/// if (nk_begin_xxx(...) { -/// // Property -/// nk_layout_row_dynamic(...); -/// nk_property_int(ctx, "ID", INT_MIN, &value, INT_MAX, 1, 1); -/// } -/// nk_end(ctx); -/// // -/// // Draw -/// const struct nk_command *cmd = 0; -/// nk_foreach(cmd, &ctx) { -/// switch (cmd->type) { -/// case NK_COMMAND_LINE: -/// your_draw_line_function(...) -/// break; -/// case NK_COMMAND_RECT -/// your_draw_rect_function(...) -/// break; -/// case ...: -/// // [...] -/// } -/// nk_clear(&ctx); -/// } -/// nk_free(&ctx); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// #### Reference -/// Function | Description -/// --------------------|------------------------------------------- -/// nk_property_int | Integer property directly modifying a passed in value -/// nk_property_float | Float property directly modifying a passed in value -/// nk_property_double | Double property directly modifying a passed in value -/// nk_propertyi | Integer property returning the modified int value -/// nk_propertyf | Float property returning the modified float value -/// nk_propertyd | Double property returning the modified double value -/// -*/ -/*/// #### nk_property_int -/// Integer property directly modifying a passed in value -/// !!! WARNING -/// To generate a unique property ID using the same label make sure to insert -/// a `#` at the beginning. It will not be shown but guarantees correct behavior. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_property_int(struct nk_context *ctx, const char *name, int min, int *val, int max, int step, float inc_per_pixel); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// --------------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function -/// __name__ | String used both as a label as well as a unique identifier -/// __min__ | Minimum value not allowed to be underflown -/// __val__ | Integer pointer to be modified -/// __max__ | Maximum value not allowed to be overflown -/// __step__ | Increment added and subtracted on increment and decrement button -/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging -*/ -NK_API void nk_property_int(struct nk_context*, const char *name, int min, int *val, int max, int step, float inc_per_pixel); -/*/// #### nk_property_float -/// Float property directly modifying a passed in value -/// !!! WARNING -/// To generate a unique property ID using the same label make sure to insert -/// a `#` at the beginning. It will not be shown but guarantees correct behavior. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_property_float(struct nk_context *ctx, const char *name, float min, float *val, float max, float step, float inc_per_pixel); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// --------------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function -/// __name__ | String used both as a label as well as a unique identifier -/// __min__ | Minimum value not allowed to be underflown -/// __val__ | Float pointer to be modified -/// __max__ | Maximum value not allowed to be overflown -/// __step__ | Increment added and subtracted on increment and decrement button -/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging -*/ -NK_API void nk_property_float(struct nk_context*, const char *name, float min, float *val, float max, float step, float inc_per_pixel); -/*/// #### nk_property_double -/// Double property directly modifying a passed in value -/// !!! WARNING -/// To generate a unique property ID using the same label make sure to insert -/// a `#` at the beginning. It will not be shown but guarantees correct behavior. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// void nk_property_double(struct nk_context *ctx, const char *name, double min, double *val, double max, double step, double inc_per_pixel); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// --------------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function -/// __name__ | String used both as a label as well as a unique identifier -/// __min__ | Minimum value not allowed to be underflown -/// __val__ | Double pointer to be modified -/// __max__ | Maximum value not allowed to be overflown -/// __step__ | Increment added and subtracted on increment and decrement button -/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging -*/ -NK_API void nk_property_double(struct nk_context*, const char *name, double min, double *val, double max, double step, float inc_per_pixel); -/*/// #### nk_propertyi -/// Integer property modifying a passed in value and returning the new value -/// !!! WARNING -/// To generate a unique property ID using the same label make sure to insert -/// a `#` at the beginning. It will not be shown but guarantees correct behavior. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// int nk_propertyi(struct nk_context *ctx, const char *name, int min, int val, int max, int step, float inc_per_pixel); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// --------------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function -/// __name__ | String used both as a label as well as a unique identifier -/// __min__ | Minimum value not allowed to be underflown -/// __val__ | Current integer value to be modified and returned -/// __max__ | Maximum value not allowed to be overflown -/// __step__ | Increment added and subtracted on increment and decrement button -/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging -/// -/// Returns the new modified integer value -*/ -NK_API int nk_propertyi(struct nk_context*, const char *name, int min, int val, int max, int step, float inc_per_pixel); -/*/// #### nk_propertyf -/// Float property modifying a passed in value and returning the new value -/// !!! WARNING -/// To generate a unique property ID using the same label make sure to insert -/// a `#` at the beginning. It will not be shown but guarantees correct behavior. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// float nk_propertyf(struct nk_context *ctx, const char *name, float min, float val, float max, float step, float inc_per_pixel); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// --------------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function -/// __name__ | String used both as a label as well as a unique identifier -/// __min__ | Minimum value not allowed to be underflown -/// __val__ | Current float value to be modified and returned -/// __max__ | Maximum value not allowed to be overflown -/// __step__ | Increment added and subtracted on increment and decrement button -/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging -/// -/// Returns the new modified float value -*/ -NK_API float nk_propertyf(struct nk_context*, const char *name, float min, float val, float max, float step, float inc_per_pixel); -/*/// #### nk_propertyd -/// Float property modifying a passed in value and returning the new value -/// !!! WARNING -/// To generate a unique property ID using the same label make sure to insert -/// a `#` at the beginning. It will not be shown but guarantees correct behavior. -/// -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c -/// float nk_propertyd(struct nk_context *ctx, const char *name, double min, double val, double max, double step, double inc_per_pixel); -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// -/// Parameter | Description -/// --------------------|----------------------------------------------------------- -/// __ctx__ | Must point to an previously initialized `nk_context` struct after calling a layouting function -/// __name__ | String used both as a label as well as a unique identifier -/// __min__ | Minimum value not allowed to be underflown -/// __val__ | Current double value to be modified and returned -/// __max__ | Maximum value not allowed to be overflown -/// __step__ | Increment added and subtracted on increment and decrement button -/// __inc_per_pixel__ | Value per pixel added or subtracted on dragging -/// -/// Returns the new modified double value -*/ -NK_API double nk_propertyd(struct nk_context*, const char *name, double min, double val, double max, double step, float inc_per_pixel); -/* ============================================================================= - * - * TEXT EDIT - * - * ============================================================================= */ -enum nk_edit_flags { - NK_EDIT_DEFAULT = 0, - NK_EDIT_READ_ONLY = NK_FLAG(0), - NK_EDIT_AUTO_SELECT = NK_FLAG(1), - NK_EDIT_SIG_ENTER = NK_FLAG(2), - NK_EDIT_ALLOW_TAB = NK_FLAG(3), - NK_EDIT_NO_CURSOR = NK_FLAG(4), - NK_EDIT_SELECTABLE = NK_FLAG(5), - NK_EDIT_CLIPBOARD = NK_FLAG(6), - NK_EDIT_CTRL_ENTER_NEWLINE = NK_FLAG(7), - NK_EDIT_NO_HORIZONTAL_SCROLL = NK_FLAG(8), - NK_EDIT_ALWAYS_INSERT_MODE = NK_FLAG(9), - NK_EDIT_MULTILINE = NK_FLAG(10), - NK_EDIT_GOTO_END_ON_ACTIVATE = NK_FLAG(11) -}; -enum nk_edit_types { - NK_EDIT_SIMPLE = NK_EDIT_ALWAYS_INSERT_MODE, - NK_EDIT_FIELD = NK_EDIT_SIMPLE|NK_EDIT_SELECTABLE|NK_EDIT_CLIPBOARD, - NK_EDIT_BOX = NK_EDIT_ALWAYS_INSERT_MODE| NK_EDIT_SELECTABLE| NK_EDIT_MULTILINE|NK_EDIT_ALLOW_TAB|NK_EDIT_CLIPBOARD, - NK_EDIT_EDITOR = NK_EDIT_SELECTABLE|NK_EDIT_MULTILINE|NK_EDIT_ALLOW_TAB| NK_EDIT_CLIPBOARD -}; -enum nk_edit_events { - NK_EDIT_ACTIVE = NK_FLAG(0), /* edit widget is currently being modified */ - NK_EDIT_INACTIVE = NK_FLAG(1), /* edit widget is not active and is not being modified */ - NK_EDIT_ACTIVATED = NK_FLAG(2), /* edit widget went from state inactive to state active */ - NK_EDIT_DEACTIVATED = NK_FLAG(3), /* edit widget went from state active to state inactive */ - NK_EDIT_COMMITED = NK_FLAG(4) /* edit widget has received an enter and lost focus */ -}; -NK_API nk_flags nk_edit_string(struct nk_context*, nk_flags, char *buffer, int *len, int max, nk_plugin_filter); -NK_API nk_flags nk_edit_string_zero_terminated(struct nk_context*, nk_flags, char *buffer, int max, nk_plugin_filter); -NK_API nk_flags nk_edit_buffer(struct nk_context*, nk_flags, struct nk_text_edit*, nk_plugin_filter); -NK_API void nk_edit_focus(struct nk_context*, nk_flags flags); -NK_API void nk_edit_unfocus(struct nk_context*); -/* ============================================================================= - * - * CHART - * - * ============================================================================= */ -NK_API nk_bool nk_chart_begin(struct nk_context*, enum nk_chart_type, int num, float min, float max); -NK_API nk_bool nk_chart_begin_colored(struct nk_context*, enum nk_chart_type, struct nk_color, struct nk_color active, int num, float min, float max); -NK_API void nk_chart_add_slot(struct nk_context *ctx, const enum nk_chart_type, int count, float min_value, float max_value); -NK_API void nk_chart_add_slot_colored(struct nk_context *ctx, const enum nk_chart_type, struct nk_color, struct nk_color active, int count, float min_value, float max_value); -NK_API nk_flags nk_chart_push(struct nk_context*, float); -NK_API nk_flags nk_chart_push_slot(struct nk_context*, float, int); -NK_API void nk_chart_end(struct nk_context*); -NK_API void nk_plot(struct nk_context*, enum nk_chart_type, const float *values, int count, int offset); -NK_API void nk_plot_function(struct nk_context*, enum nk_chart_type, void *userdata, float(*value_getter)(void* user, int index), int count, int offset); -/* ============================================================================= - * - * POPUP - * - * ============================================================================= */ -NK_API nk_bool nk_popup_begin(struct nk_context*, enum nk_popup_type, const char*, nk_flags, struct nk_rect bounds); -NK_API void nk_popup_close(struct nk_context*); -NK_API void nk_popup_end(struct nk_context*); -NK_API void nk_popup_get_scroll(struct nk_context*, nk_uint *offset_x, nk_uint *offset_y); -NK_API void nk_popup_set_scroll(struct nk_context*, nk_uint offset_x, nk_uint offset_y); -/* ============================================================================= - * - * COMBOBOX - * - * ============================================================================= */ -NK_API int nk_combo(struct nk_context*, const char **items, int count, int selected, int item_height, struct nk_vec2 size); -NK_API int nk_combo_separator(struct nk_context*, const char *items_separated_by_separator, int separator, int selected, int count, int item_height, struct nk_vec2 size); -NK_API int nk_combo_string(struct nk_context*, const char *items_separated_by_zeros, int selected, int count, int item_height, struct nk_vec2 size); -NK_API int nk_combo_callback(struct nk_context*, void(*item_getter)(void*, int, const char**), void *userdata, int selected, int count, int item_height, struct nk_vec2 size); -NK_API void nk_combobox(struct nk_context*, const char **items, int count, int *selected, int item_height, struct nk_vec2 size); -NK_API void nk_combobox_string(struct nk_context*, const char *items_separated_by_zeros, int *selected, int count, int item_height, struct nk_vec2 size); -NK_API void nk_combobox_separator(struct nk_context*, const char *items_separated_by_separator, int separator, int *selected, int count, int item_height, struct nk_vec2 size); -NK_API void nk_combobox_callback(struct nk_context*, void(*item_getter)(void*, int, const char**), void*, int *selected, int count, int item_height, struct nk_vec2 size); -/* ============================================================================= - * - * ABSTRACT COMBOBOX - * - * ============================================================================= */ -NK_API nk_bool nk_combo_begin_text(struct nk_context*, const char *selected, int, struct nk_vec2 size); -NK_API nk_bool nk_combo_begin_label(struct nk_context*, const char *selected, struct nk_vec2 size); -NK_API nk_bool nk_combo_begin_color(struct nk_context*, struct nk_color color, struct nk_vec2 size); -NK_API nk_bool nk_combo_begin_symbol(struct nk_context*, enum nk_symbol_type, struct nk_vec2 size); -NK_API nk_bool nk_combo_begin_symbol_label(struct nk_context*, const char *selected, enum nk_symbol_type, struct nk_vec2 size); -NK_API nk_bool nk_combo_begin_symbol_text(struct nk_context*, const char *selected, int, enum nk_symbol_type, struct nk_vec2 size); -NK_API nk_bool nk_combo_begin_image(struct nk_context*, struct nk_image img, struct nk_vec2 size); -NK_API nk_bool nk_combo_begin_image_label(struct nk_context*, const char *selected, struct nk_image, struct nk_vec2 size); -NK_API nk_bool nk_combo_begin_image_text(struct nk_context*, const char *selected, int, struct nk_image, struct nk_vec2 size); -NK_API nk_bool nk_combo_item_label(struct nk_context*, const char*, nk_flags alignment); -NK_API nk_bool nk_combo_item_text(struct nk_context*, const char*,int, nk_flags alignment); -NK_API nk_bool nk_combo_item_image_label(struct nk_context*, struct nk_image, const char*, nk_flags alignment); -NK_API nk_bool nk_combo_item_image_text(struct nk_context*, struct nk_image, const char*, int,nk_flags alignment); -NK_API nk_bool nk_combo_item_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags alignment); -NK_API nk_bool nk_combo_item_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment); -NK_API void nk_combo_close(struct nk_context*); -NK_API void nk_combo_end(struct nk_context*); -/* ============================================================================= - * - * CONTEXTUAL - * - * ============================================================================= */ -NK_API nk_bool nk_contextual_begin(struct nk_context*, nk_flags, struct nk_vec2, struct nk_rect trigger_bounds); -NK_API nk_bool nk_contextual_item_text(struct nk_context*, const char*, int,nk_flags align); -NK_API nk_bool nk_contextual_item_label(struct nk_context*, const char*, nk_flags align); -NK_API nk_bool nk_contextual_item_image_label(struct nk_context*, struct nk_image, const char*, nk_flags alignment); -NK_API nk_bool nk_contextual_item_image_text(struct nk_context*, struct nk_image, const char*, int len, nk_flags alignment); -NK_API nk_bool nk_contextual_item_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags alignment); -NK_API nk_bool nk_contextual_item_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment); -NK_API void nk_contextual_close(struct nk_context*); -NK_API void nk_contextual_end(struct nk_context*); -/* ============================================================================= - * - * TOOLTIP - * - * ============================================================================= */ -NK_API void nk_tooltip(struct nk_context*, const char*); -#ifdef NK_INCLUDE_STANDARD_VARARGS -NK_API void nk_tooltipf(struct nk_context*, NK_PRINTF_FORMAT_STRING const char*, ...) NK_PRINTF_VARARG_FUNC(2); -NK_API void nk_tooltipfv(struct nk_context*, NK_PRINTF_FORMAT_STRING const char*, va_list) NK_PRINTF_VALIST_FUNC(2); -#endif -NK_API nk_bool nk_tooltip_begin(struct nk_context*, float width); -NK_API void nk_tooltip_end(struct nk_context*); -/* ============================================================================= - * - * MENU - * - * ============================================================================= */ -NK_API void nk_menubar_begin(struct nk_context*); -NK_API void nk_menubar_end(struct nk_context*); -NK_API nk_bool nk_menu_begin_text(struct nk_context*, const char* title, int title_len, nk_flags align, struct nk_vec2 size); -NK_API nk_bool nk_menu_begin_label(struct nk_context*, const char*, nk_flags align, struct nk_vec2 size); -NK_API nk_bool nk_menu_begin_image(struct nk_context*, const char*, struct nk_image, struct nk_vec2 size); -NK_API nk_bool nk_menu_begin_image_text(struct nk_context*, const char*, int,nk_flags align,struct nk_image, struct nk_vec2 size); -NK_API nk_bool nk_menu_begin_image_label(struct nk_context*, const char*, nk_flags align,struct nk_image, struct nk_vec2 size); -NK_API nk_bool nk_menu_begin_symbol(struct nk_context*, const char*, enum nk_symbol_type, struct nk_vec2 size); -NK_API nk_bool nk_menu_begin_symbol_text(struct nk_context*, const char*, int,nk_flags align,enum nk_symbol_type, struct nk_vec2 size); -NK_API nk_bool nk_menu_begin_symbol_label(struct nk_context*, const char*, nk_flags align,enum nk_symbol_type, struct nk_vec2 size); -NK_API nk_bool nk_menu_item_text(struct nk_context*, const char*, int,nk_flags align); -NK_API nk_bool nk_menu_item_label(struct nk_context*, const char*, nk_flags alignment); -NK_API nk_bool nk_menu_item_image_label(struct nk_context*, struct nk_image, const char*, nk_flags alignment); -NK_API nk_bool nk_menu_item_image_text(struct nk_context*, struct nk_image, const char*, int len, nk_flags alignment); -NK_API nk_bool nk_menu_item_symbol_text(struct nk_context*, enum nk_symbol_type, const char*, int, nk_flags alignment); -NK_API nk_bool nk_menu_item_symbol_label(struct nk_context*, enum nk_symbol_type, const char*, nk_flags alignment); -NK_API void nk_menu_close(struct nk_context*); -NK_API void nk_menu_end(struct nk_context*); -/* ============================================================================= - * - * STYLE - * - * ============================================================================= */ -enum nk_style_colors { - NK_COLOR_TEXT, - NK_COLOR_WINDOW, - NK_COLOR_HEADER, - NK_COLOR_BORDER, - NK_COLOR_BUTTON, - NK_COLOR_BUTTON_HOVER, - NK_COLOR_BUTTON_ACTIVE, - NK_COLOR_TOGGLE, - NK_COLOR_TOGGLE_HOVER, - NK_COLOR_TOGGLE_CURSOR, - NK_COLOR_SELECT, - NK_COLOR_SELECT_ACTIVE, - NK_COLOR_SLIDER, - NK_COLOR_SLIDER_CURSOR, - NK_COLOR_SLIDER_CURSOR_HOVER, - NK_COLOR_SLIDER_CURSOR_ACTIVE, - NK_COLOR_PROPERTY, - NK_COLOR_EDIT, - NK_COLOR_EDIT_CURSOR, - NK_COLOR_COMBO, - NK_COLOR_CHART, - NK_COLOR_CHART_COLOR, - NK_COLOR_CHART_COLOR_HIGHLIGHT, - NK_COLOR_SCROLLBAR, - NK_COLOR_SCROLLBAR_CURSOR, - NK_COLOR_SCROLLBAR_CURSOR_HOVER, - NK_COLOR_SCROLLBAR_CURSOR_ACTIVE, - NK_COLOR_TAB_HEADER, - NK_COLOR_COUNT -}; -enum nk_style_cursor { - NK_CURSOR_ARROW, - NK_CURSOR_TEXT, - NK_CURSOR_MOVE, - NK_CURSOR_RESIZE_VERTICAL, - NK_CURSOR_RESIZE_HORIZONTAL, - NK_CURSOR_RESIZE_TOP_LEFT_DOWN_RIGHT, - NK_CURSOR_RESIZE_TOP_RIGHT_DOWN_LEFT, - NK_CURSOR_COUNT -}; -NK_API void nk_style_default(struct nk_context*); -NK_API void nk_style_from_table(struct nk_context*, const struct nk_color*); -NK_API void nk_style_load_cursor(struct nk_context*, enum nk_style_cursor, const struct nk_cursor*); -NK_API void nk_style_load_all_cursors(struct nk_context*, struct nk_cursor*); -NK_API const char* nk_style_get_color_by_name(enum nk_style_colors); -NK_API void nk_style_set_font(struct nk_context*, const struct nk_user_font*); -NK_API nk_bool nk_style_set_cursor(struct nk_context*, enum nk_style_cursor); -NK_API void nk_style_show_cursor(struct nk_context*); -NK_API void nk_style_hide_cursor(struct nk_context*); - -NK_API nk_bool nk_style_push_font(struct nk_context*, const struct nk_user_font*); -NK_API nk_bool nk_style_push_float(struct nk_context*, float*, float); -NK_API nk_bool nk_style_push_vec2(struct nk_context*, struct nk_vec2*, struct nk_vec2); -NK_API nk_bool nk_style_push_style_item(struct nk_context*, struct nk_style_item*, struct nk_style_item); -NK_API nk_bool nk_style_push_flags(struct nk_context*, nk_flags*, nk_flags); -NK_API nk_bool nk_style_push_color(struct nk_context*, struct nk_color*, struct nk_color); - -NK_API nk_bool nk_style_pop_font(struct nk_context*); -NK_API nk_bool nk_style_pop_float(struct nk_context*); -NK_API nk_bool nk_style_pop_vec2(struct nk_context*); -NK_API nk_bool nk_style_pop_style_item(struct nk_context*); -NK_API nk_bool nk_style_pop_flags(struct nk_context*); -NK_API nk_bool nk_style_pop_color(struct nk_context*); -/* ============================================================================= - * - * COLOR - * - * ============================================================================= */ -NK_API struct nk_color nk_rgb(int r, int g, int b); -NK_API struct nk_color nk_rgb_iv(const int *rgb); -NK_API struct nk_color nk_rgb_bv(const nk_byte* rgb); -NK_API struct nk_color nk_rgb_f(float r, float g, float b); -NK_API struct nk_color nk_rgb_fv(const float *rgb); -NK_API struct nk_color nk_rgb_cf(struct nk_colorf c); -NK_API struct nk_color nk_rgb_hex(const char *rgb); - -NK_API struct nk_color nk_rgba(int r, int g, int b, int a); -NK_API struct nk_color nk_rgba_u32(nk_uint); -NK_API struct nk_color nk_rgba_iv(const int *rgba); -NK_API struct nk_color nk_rgba_bv(const nk_byte *rgba); -NK_API struct nk_color nk_rgba_f(float r, float g, float b, float a); -NK_API struct nk_color nk_rgba_fv(const float *rgba); -NK_API struct nk_color nk_rgba_cf(struct nk_colorf c); -NK_API struct nk_color nk_rgba_hex(const char *rgb); - -NK_API struct nk_colorf nk_hsva_colorf(float h, float s, float v, float a); -NK_API struct nk_colorf nk_hsva_colorfv(float *c); -NK_API void nk_colorf_hsva_f(float *out_h, float *out_s, float *out_v, float *out_a, struct nk_colorf in); -NK_API void nk_colorf_hsva_fv(float *hsva, struct nk_colorf in); - -NK_API struct nk_color nk_hsv(int h, int s, int v); -NK_API struct nk_color nk_hsv_iv(const int *hsv); -NK_API struct nk_color nk_hsv_bv(const nk_byte *hsv); -NK_API struct nk_color nk_hsv_f(float h, float s, float v); -NK_API struct nk_color nk_hsv_fv(const float *hsv); - -NK_API struct nk_color nk_hsva(int h, int s, int v, int a); -NK_API struct nk_color nk_hsva_iv(const int *hsva); -NK_API struct nk_color nk_hsva_bv(const nk_byte *hsva); -NK_API struct nk_color nk_hsva_f(float h, float s, float v, float a); -NK_API struct nk_color nk_hsva_fv(const float *hsva); - -/* color (conversion nuklear --> user) */ -NK_API void nk_color_f(float *r, float *g, float *b, float *a, struct nk_color); -NK_API void nk_color_fv(float *rgba_out, struct nk_color); -NK_API struct nk_colorf nk_color_cf(struct nk_color); -NK_API void nk_color_d(double *r, double *g, double *b, double *a, struct nk_color); -NK_API void nk_color_dv(double *rgba_out, struct nk_color); - -NK_API nk_uint nk_color_u32(struct nk_color); -NK_API void nk_color_hex_rgba(char *output, struct nk_color); -NK_API void nk_color_hex_rgb(char *output, struct nk_color); - -NK_API void nk_color_hsv_i(int *out_h, int *out_s, int *out_v, struct nk_color); -NK_API void nk_color_hsv_b(nk_byte *out_h, nk_byte *out_s, nk_byte *out_v, struct nk_color); -NK_API void nk_color_hsv_iv(int *hsv_out, struct nk_color); -NK_API void nk_color_hsv_bv(nk_byte *hsv_out, struct nk_color); -NK_API void nk_color_hsv_f(float *out_h, float *out_s, float *out_v, struct nk_color); -NK_API void nk_color_hsv_fv(float *hsv_out, struct nk_color); - -NK_API void nk_color_hsva_i(int *h, int *s, int *v, int *a, struct nk_color); -NK_API void nk_color_hsva_b(nk_byte *h, nk_byte *s, nk_byte *v, nk_byte *a, struct nk_color); -NK_API void nk_color_hsva_iv(int *hsva_out, struct nk_color); -NK_API void nk_color_hsva_bv(nk_byte *hsva_out, struct nk_color); -NK_API void nk_color_hsva_f(float *out_h, float *out_s, float *out_v, float *out_a, struct nk_color); -NK_API void nk_color_hsva_fv(float *hsva_out, struct nk_color); -/* ============================================================================= - * - * IMAGE - * - * ============================================================================= */ -NK_API nk_handle nk_handle_ptr(void*); -NK_API nk_handle nk_handle_id(int); -NK_API struct nk_image nk_image_handle(nk_handle); -NK_API struct nk_image nk_image_ptr(void*); -NK_API struct nk_image nk_image_id(int); -NK_API nk_bool nk_image_is_subimage(const struct nk_image* img); -NK_API struct nk_image nk_subimage_ptr(void*, nk_ushort w, nk_ushort h, struct nk_rect sub_region); -NK_API struct nk_image nk_subimage_id(int, nk_ushort w, nk_ushort h, struct nk_rect sub_region); -NK_API struct nk_image nk_subimage_handle(nk_handle, nk_ushort w, nk_ushort h, struct nk_rect sub_region); -/* ============================================================================= - * - * 9-SLICE - * - * ============================================================================= */ -NK_API struct nk_nine_slice nk_nine_slice_handle(nk_handle, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b); -NK_API struct nk_nine_slice nk_nine_slice_ptr(void*, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b); -NK_API struct nk_nine_slice nk_nine_slice_id(int, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b); -NK_API int nk_nine_slice_is_sub9slice(const struct nk_nine_slice* img); -NK_API struct nk_nine_slice nk_sub9slice_ptr(void*, nk_ushort w, nk_ushort h, struct nk_rect sub_region, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b); -NK_API struct nk_nine_slice nk_sub9slice_id(int, nk_ushort w, nk_ushort h, struct nk_rect sub_region, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b); -NK_API struct nk_nine_slice nk_sub9slice_handle(nk_handle, nk_ushort w, nk_ushort h, struct nk_rect sub_region, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b); -/* ============================================================================= - * - * MATH - * - * ============================================================================= */ -NK_API nk_hash nk_murmur_hash(const void *key, int len, nk_hash seed); -NK_API void nk_triangle_from_direction(struct nk_vec2 *result, struct nk_rect r, float pad_x, float pad_y, enum nk_heading); - -NK_API struct nk_vec2 nk_vec2(float x, float y); -NK_API struct nk_vec2 nk_vec2i(int x, int y); -NK_API struct nk_vec2 nk_vec2v(const float *xy); -NK_API struct nk_vec2 nk_vec2iv(const int *xy); - -NK_API struct nk_rect nk_get_null_rect(void); -NK_API struct nk_rect nk_rect(float x, float y, float w, float h); -NK_API struct nk_rect nk_recti(int x, int y, int w, int h); -NK_API struct nk_rect nk_recta(struct nk_vec2 pos, struct nk_vec2 size); -NK_API struct nk_rect nk_rectv(const float *xywh); -NK_API struct nk_rect nk_rectiv(const int *xywh); -NK_API struct nk_vec2 nk_rect_pos(struct nk_rect); -NK_API struct nk_vec2 nk_rect_size(struct nk_rect); -/* ============================================================================= - * - * STRING - * - * ============================================================================= */ -NK_API int nk_strlen(const char *str); -NK_API int nk_stricmp(const char *s1, const char *s2); -NK_API int nk_stricmpn(const char *s1, const char *s2, int n); -NK_API int nk_strtoi(const char *str, const char **endptr); -NK_API float nk_strtof(const char *str, const char **endptr); -#ifndef NK_STRTOD -#define NK_STRTOD nk_strtod -NK_API double nk_strtod(const char *str, const char **endptr); -#endif -NK_API int nk_strfilter(const char *text, const char *regexp); -NK_API int nk_strmatch_fuzzy_string(char const *str, char const *pattern, int *out_score); -NK_API int nk_strmatch_fuzzy_text(const char *txt, int txt_len, const char *pattern, int *out_score); -/* ============================================================================= - * - * UTF-8 - * - * ============================================================================= */ -NK_API int nk_utf_decode(const char*, nk_rune*, int); -NK_API int nk_utf_encode(nk_rune, char*, int); -NK_API int nk_utf_len(const char*, int byte_len); -NK_API const char* nk_utf_at(const char *buffer, int length, int index, nk_rune *unicode, int *len); -/* =============================================================== - * - * FONT - * - * ===============================================================*/ -/*/// ### Font -/// Font handling in this library was designed to be quite customizable and lets -/// you decide what you want to use and what you want to provide. There are three -/// different ways to use the font atlas. The first two will use your font -/// handling scheme and only requires essential data to run nuklear. The next -/// slightly more advanced features is font handling with vertex buffer output. -/// Finally the most complex API wise is using nuklear's font baking API. -// -/// #### Using your own implementation without vertex buffer output -/// -/// So first up the easiest way to do font handling is by just providing a -/// `nk_user_font` struct which only requires the height in pixel of the used -/// font and a callback to calculate the width of a string. This way of handling -/// fonts is best fitted for using the normal draw shape command API where you -/// do all the text drawing yourself and the library does not require any kind -/// of deeper knowledge about which font handling mechanism you use. -/// IMPORTANT: the `nk_user_font` pointer provided to nuklear has to persist -/// over the complete life time! I know this sucks but it is currently the only -/// way to switch between fonts. -/// -/// ```c -/// float your_text_width_calculation(nk_handle handle, float height, const char *text, int len) -/// { -/// your_font_type *type = handle.ptr; -/// float text_width = ...; -/// return text_width; -/// } -/// -/// struct nk_user_font font; -/// font.userdata.ptr = &your_font_class_or_struct; -/// font.height = your_font_height; -/// font.width = your_text_width_calculation; -/// -/// struct nk_context ctx; -/// nk_init_default(&ctx, &font); -/// ``` -/// #### Using your own implementation with vertex buffer output -/// -/// While the first approach works fine if you don't want to use the optional -/// vertex buffer output it is not enough if you do. To get font handling working -/// for these cases you have to provide two additional parameters inside the -/// `nk_user_font`. First a texture atlas handle used to draw text as subimages -/// of a bigger font atlas texture and a callback to query a character's glyph -/// information (offset, size, ...). So it is still possible to provide your own -/// font and use the vertex buffer output. -/// -/// ```c -/// float your_text_width_calculation(nk_handle handle, float height, const char *text, int len) -/// { -/// your_font_type *type = handle.ptr; -/// float text_width = ...; -/// return text_width; -/// } -/// void query_your_font_glyph(nk_handle handle, float font_height, struct nk_user_font_glyph *glyph, nk_rune codepoint, nk_rune next_codepoint) -/// { -/// your_font_type *type = handle.ptr; -/// glyph.width = ...; -/// glyph.height = ...; -/// glyph.xadvance = ...; -/// glyph.uv[0].x = ...; -/// glyph.uv[0].y = ...; -/// glyph.uv[1].x = ...; -/// glyph.uv[1].y = ...; -/// glyph.offset.x = ...; -/// glyph.offset.y = ...; -/// } -/// -/// struct nk_user_font font; -/// font.userdata.ptr = &your_font_class_or_struct; -/// font.height = your_font_height; -/// font.width = your_text_width_calculation; -/// font.query = query_your_font_glyph; -/// font.texture.id = your_font_texture; -/// -/// struct nk_context ctx; -/// nk_init_default(&ctx, &font); -/// ``` -/// -/// #### Nuklear font baker -/// -/// The final approach if you do not have a font handling functionality or don't -/// want to use it in this library is by using the optional font baker. -/// The font baker APIs can be used to create a font plus font atlas texture -/// and can be used with or without the vertex buffer output. -/// -/// It still uses the `nk_user_font` struct and the two different approaches -/// previously stated still work. The font baker is not located inside -/// `nk_context` like all other systems since it can be understood as more of -/// an extension to nuklear and does not really depend on any `nk_context` state. -/// -/// Font baker need to be initialized first by one of the nk_font_atlas_init_xxx -/// functions. If you don't care about memory just call the default version -/// `nk_font_atlas_init_default` which will allocate all memory from the standard library. -/// If you want to control memory allocation but you don't care if the allocated -/// memory is temporary and therefore can be freed directly after the baking process -/// is over or permanent you can call `nk_font_atlas_init`. -/// -/// After successfully initializing the font baker you can add Truetype(.ttf) fonts from -/// different sources like memory or from file by calling one of the `nk_font_atlas_add_xxx`. -/// functions. Adding font will permanently store each font, font config and ttf memory block(!) -/// inside the font atlas and allows to reuse the font atlas. If you don't want to reuse -/// the font baker by for example adding additional fonts you can call -/// `nk_font_atlas_cleanup` after the baking process is over (after calling nk_font_atlas_end). -/// -/// As soon as you added all fonts you wanted you can now start the baking process -/// for every selected glyph to image by calling `nk_font_atlas_bake`. -/// The baking process returns image memory, width and height which can be used to -/// either create your own image object or upload it to any graphics library. -/// No matter which case you finally have to call `nk_font_atlas_end` which -/// will free all temporary memory including the font atlas image so make sure -/// you created our texture beforehand. `nk_font_atlas_end` requires a handle -/// to your font texture or object and optionally fills a `struct nk_draw_null_texture` -/// which can be used for the optional vertex output. If you don't want it just -/// set the argument to `NULL`. -/// -/// At this point you are done and if you don't want to reuse the font atlas you -/// can call `nk_font_atlas_cleanup` to free all truetype blobs and configuration -/// memory. Finally if you don't use the font atlas and any of it's fonts anymore -/// you need to call `nk_font_atlas_clear` to free all memory still being used. -/// -/// ```c -/// struct nk_font_atlas atlas; -/// nk_font_atlas_init_default(&atlas); -/// nk_font_atlas_begin(&atlas); -/// nk_font *font = nk_font_atlas_add_from_file(&atlas, "Path/To/Your/TTF_Font.ttf", 13, 0); -/// nk_font *font2 = nk_font_atlas_add_from_file(&atlas, "Path/To/Your/TTF_Font2.ttf", 16, 0); -/// const void* img = nk_font_atlas_bake(&atlas, &img_width, &img_height, NK_FONT_ATLAS_RGBA32); -/// nk_font_atlas_end(&atlas, nk_handle_id(texture), 0); -/// -/// struct nk_context ctx; -/// nk_init_default(&ctx, &font->handle); -/// while (1) { -/// -/// } -/// nk_font_atlas_clear(&atlas); -/// ``` -/// The font baker API is probably the most complex API inside this library and -/// I would suggest reading some of my examples `example/` to get a grip on how -/// to use the font atlas. There are a number of details I left out. For example -/// how to merge fonts, configure a font with `nk_font_config` to use other languages, -/// use another texture coordinate format and a lot more: -/// -/// ```c -/// struct nk_font_config cfg = nk_font_config(font_pixel_height); -/// cfg.merge_mode = nk_false or nk_true; -/// cfg.range = nk_font_korean_glyph_ranges(); -/// cfg.coord_type = NK_COORD_PIXEL; -/// nk_font *font = nk_font_atlas_add_from_file(&atlas, "Path/To/Your/TTF_Font.ttf", 13, &cfg); -/// ``` -*/ -struct nk_user_font_glyph; -typedef float(*nk_text_width_f)(nk_handle, float h, const char*, int len); -typedef void(*nk_query_font_glyph_f)(nk_handle handle, float font_height, - struct nk_user_font_glyph *glyph, - nk_rune codepoint, nk_rune next_codepoint); - -#if defined(NK_INCLUDE_VERTEX_BUFFER_OUTPUT) || defined(NK_INCLUDE_SOFTWARE_FONT) -struct nk_user_font_glyph { - struct nk_vec2 uv[2]; - /* texture coordinates */ - struct nk_vec2 offset; - /* offset between top left and glyph */ - float width, height; - /* size of the glyph */ - float xadvance; - /* offset to the next glyph */ -}; -#endif - -struct nk_user_font { - nk_handle userdata; - /* user provided font handle */ - float height; - /* max height of the font */ - nk_text_width_f width; - /* font string width in pixel callback */ -#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT - nk_query_font_glyph_f query; - /* font glyph callback to query drawing info */ - nk_handle texture; - /* texture handle to the used font atlas or texture */ -#endif -}; - -#ifdef NK_INCLUDE_FONT_BAKING -enum nk_font_coord_type { - NK_COORD_UV, /* texture coordinates inside font glyphs are clamped between 0-1 */ - NK_COORD_PIXEL /* texture coordinates inside font glyphs are in absolute pixel */ -}; - -struct nk_font; -struct nk_baked_font { - float height; - /* height of the font */ - float ascent, descent; - /* font glyphs ascent and descent */ - nk_rune glyph_offset; - /* glyph array offset inside the font glyph baking output array */ - nk_rune glyph_count; - /* number of glyphs of this font inside the glyph baking array output */ - const nk_rune *ranges; - /* font codepoint ranges as pairs of (from/to) and 0 as last element */ -}; - -struct nk_font_config { - struct nk_font_config *next; - /* NOTE: only used internally */ - void *ttf_blob; - /* pointer to loaded TTF file memory block. - * NOTE: not needed for nk_font_atlas_add_from_memory and nk_font_atlas_add_from_file. */ - nk_size ttf_size; - /* size of the loaded TTF file memory block - * NOTE: not needed for nk_font_atlas_add_from_memory and nk_font_atlas_add_from_file. */ - - unsigned char ttf_data_owned_by_atlas; - /* used inside font atlas: default to: 0*/ - unsigned char merge_mode; - /* merges this font into the last font */ - unsigned char pixel_snap; - /* align every character to pixel boundary (if true set oversample (1,1)) */ - unsigned char oversample_v, oversample_h; - /* rasterize at high quality for sub-pixel position */ - unsigned char padding[3]; - - float size; - /* baked pixel height of the font */ - enum nk_font_coord_type coord_type; - /* texture coordinate format with either pixel or UV coordinates */ - struct nk_vec2 spacing; - /* extra pixel spacing between glyphs */ - const nk_rune *range; - /* list of unicode ranges (2 values per range, zero terminated) */ - struct nk_baked_font *font; - /* font to setup in the baking process: NOTE: not needed for font atlas */ - nk_rune fallback_glyph; - /* fallback glyph to use if a given rune is not found */ - struct nk_font_config *n; - struct nk_font_config *p; -}; - -struct nk_font_glyph { - nk_rune codepoint; - float xadvance; - float x0, y0, x1, y1, w, h; - float u0, v0, u1, v1; -}; - -struct nk_font { - struct nk_font *next; - struct nk_user_font handle; - struct nk_baked_font info; - float scale; - struct nk_font_glyph *glyphs; - const struct nk_font_glyph *fallback; - nk_rune fallback_codepoint; - nk_handle texture; - struct nk_font_config *config; -}; - -enum nk_font_atlas_format { - NK_FONT_ATLAS_ALPHA8, - NK_FONT_ATLAS_RGBA32 -}; - -struct nk_font_atlas { - void *pixel; - int tex_width; - int tex_height; - - struct nk_allocator permanent; - struct nk_allocator temporary; - - struct nk_recti custom; - struct nk_cursor cursors[NK_CURSOR_COUNT]; - - int glyph_count; - struct nk_font_glyph *glyphs; - struct nk_font *default_font; - struct nk_font *fonts; - struct nk_font_config *config; - int font_num; -}; - -/* some language glyph codepoint ranges */ -NK_API const nk_rune *nk_font_default_glyph_ranges(void); -NK_API const nk_rune *nk_font_chinese_glyph_ranges(void); -NK_API const nk_rune *nk_font_cyrillic_glyph_ranges(void); -NK_API const nk_rune *nk_font_korean_glyph_ranges(void); - -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -NK_API void nk_font_atlas_init_default(struct nk_font_atlas*); -#endif -NK_API void nk_font_atlas_init(struct nk_font_atlas*, struct nk_allocator*); -NK_API void nk_font_atlas_init_custom(struct nk_font_atlas*, struct nk_allocator *persistent, struct nk_allocator *transient); -NK_API void nk_font_atlas_begin(struct nk_font_atlas*); -NK_API struct nk_font_config nk_font_config(float pixel_height); -NK_API struct nk_font *nk_font_atlas_add(struct nk_font_atlas*, const struct nk_font_config*); -#ifdef NK_INCLUDE_DEFAULT_FONT -NK_API struct nk_font* nk_font_atlas_add_default(struct nk_font_atlas*, float height, const struct nk_font_config*); -#endif -NK_API struct nk_font* nk_font_atlas_add_from_memory(struct nk_font_atlas *atlas, void *memory, nk_size size, float height, const struct nk_font_config *config); -#ifdef NK_INCLUDE_STANDARD_IO -NK_API struct nk_font* nk_font_atlas_add_from_file(struct nk_font_atlas *atlas, const char *file_path, float height, const struct nk_font_config*); -#endif -NK_API struct nk_font *nk_font_atlas_add_compressed(struct nk_font_atlas*, void *memory, nk_size size, float height, const struct nk_font_config*); -NK_API struct nk_font* nk_font_atlas_add_compressed_base85(struct nk_font_atlas*, const char *data, float height, const struct nk_font_config *config); -NK_API const void* nk_font_atlas_bake(struct nk_font_atlas*, int *width, int *height, enum nk_font_atlas_format); -NK_API void nk_font_atlas_end(struct nk_font_atlas*, nk_handle tex, struct nk_draw_null_texture*); -NK_API const struct nk_font_glyph* nk_font_find_glyph(struct nk_font*, nk_rune unicode); -NK_API void nk_font_atlas_cleanup(struct nk_font_atlas *atlas); -NK_API void nk_font_atlas_clear(struct nk_font_atlas*); - -#endif - -/* ============================================================== - * - * MEMORY BUFFER - * - * ===============================================================*/ -/*/// ### Memory Buffer -/// A basic (double)-buffer with linear allocation and resetting as only -/// freeing policy. The buffer's main purpose is to control all memory management -/// inside the GUI toolkit and still leave memory control as much as possible in -/// the hand of the user while also making sure the library is easy to use if -/// not as much control is needed. -/// In general all memory inside this library can be provided from the user in -/// three different ways. -/// -/// The first way and the one providing most control is by just passing a fixed -/// size memory block. In this case all control lies in the hand of the user -/// since he can exactly control where the memory comes from and how much memory -/// the library should consume. Of course using the fixed size API removes the -/// ability to automatically resize a buffer if not enough memory is provided so -/// you have to take over the resizing. While being a fixed sized buffer sounds -/// quite limiting, it is very effective in this library since the actual memory -/// consumption is quite stable and has a fixed upper bound for a lot of cases. -/// -/// If you don't want to think about how much memory the library should allocate -/// at all time or have a very dynamic UI with unpredictable memory consumption -/// habits but still want control over memory allocation you can use the dynamic -/// allocator based API. The allocator consists of two callbacks for allocating -/// and freeing memory and optional userdata so you can plugin your own allocator. -/// -/// The final and easiest way can be used by defining -/// NK_INCLUDE_DEFAULT_ALLOCATOR which uses the standard library memory -/// allocation functions malloc and free and takes over complete control over -/// memory in this library. -*/ -struct nk_memory_status { - void *memory; - unsigned int type; - nk_size size; - nk_size allocated; - nk_size needed; - nk_size calls; -}; - -enum nk_allocation_type { - NK_BUFFER_FIXED, - NK_BUFFER_DYNAMIC -}; - -enum nk_buffer_allocation_type { - NK_BUFFER_FRONT, - NK_BUFFER_BACK, - NK_BUFFER_MAX -}; - -struct nk_buffer_marker { - nk_bool active; - nk_size offset; -}; - -struct nk_memory {void *ptr;nk_size size;}; -struct nk_buffer { - struct nk_buffer_marker marker[NK_BUFFER_MAX]; - /* buffer marker to free a buffer to a certain offset */ - struct nk_allocator pool; - /* allocator callback for dynamic buffers */ - enum nk_allocation_type type; - /* memory management type */ - struct nk_memory memory; - /* memory and size of the current memory block */ - float grow_factor; - /* growing factor for dynamic memory management */ - nk_size allocated; - /* total amount of memory allocated */ - nk_size needed; - /* totally consumed memory given that enough memory is present */ - nk_size calls; - /* number of allocation calls */ - nk_size size; - /* current size of the buffer */ -}; - -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -NK_API void nk_buffer_init_default(struct nk_buffer*); -#endif -NK_API void nk_buffer_init(struct nk_buffer*, const struct nk_allocator*, nk_size size); -NK_API void nk_buffer_init_fixed(struct nk_buffer*, void *memory, nk_size size); -NK_API void nk_buffer_info(struct nk_memory_status*, struct nk_buffer*); -NK_API void nk_buffer_push(struct nk_buffer*, enum nk_buffer_allocation_type type, const void *memory, nk_size size, nk_size align); -NK_API void nk_buffer_mark(struct nk_buffer*, enum nk_buffer_allocation_type type); -NK_API void nk_buffer_reset(struct nk_buffer*, enum nk_buffer_allocation_type type); -NK_API void nk_buffer_clear(struct nk_buffer*); -NK_API void nk_buffer_free(struct nk_buffer*); -NK_API void *nk_buffer_memory(struct nk_buffer*); -NK_API const void *nk_buffer_memory_const(const struct nk_buffer*); -NK_API nk_size nk_buffer_total(struct nk_buffer*); - -/* ============================================================== - * - * STRING - * - * ===============================================================*/ -/* Basic string buffer which is only used in context with the text editor - * to manage and manipulate dynamic or fixed size string content. This is _NOT_ - * the default string handling method. The only instance you should have any contact - * with this API is if you interact with an `nk_text_edit` object inside one of the - * copy and paste functions and even there only for more advanced cases. */ -struct nk_str { - struct nk_buffer buffer; - int len; /* in codepoints/runes/glyphs */ -}; - -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -NK_API void nk_str_init_default(struct nk_str*); -#endif -NK_API void nk_str_init(struct nk_str*, const struct nk_allocator*, nk_size size); -NK_API void nk_str_init_fixed(struct nk_str*, void *memory, nk_size size); -NK_API void nk_str_clear(struct nk_str*); -NK_API void nk_str_free(struct nk_str*); - -NK_API int nk_str_append_text_char(struct nk_str*, const char*, int); -NK_API int nk_str_append_str_char(struct nk_str*, const char*); -NK_API int nk_str_append_text_utf8(struct nk_str*, const char*, int); -NK_API int nk_str_append_str_utf8(struct nk_str*, const char*); -NK_API int nk_str_append_text_runes(struct nk_str*, const nk_rune*, int); -NK_API int nk_str_append_str_runes(struct nk_str*, const nk_rune*); - -NK_API int nk_str_insert_at_char(struct nk_str*, int pos, const char*, int); -NK_API int nk_str_insert_at_rune(struct nk_str*, int pos, const char*, int); - -NK_API int nk_str_insert_text_char(struct nk_str*, int pos, const char*, int); -NK_API int nk_str_insert_str_char(struct nk_str*, int pos, const char*); -NK_API int nk_str_insert_text_utf8(struct nk_str*, int pos, const char*, int); -NK_API int nk_str_insert_str_utf8(struct nk_str*, int pos, const char*); -NK_API int nk_str_insert_text_runes(struct nk_str*, int pos, const nk_rune*, int); -NK_API int nk_str_insert_str_runes(struct nk_str*, int pos, const nk_rune*); - -NK_API void nk_str_remove_chars(struct nk_str*, int len); -NK_API void nk_str_remove_runes(struct nk_str *str, int len); -NK_API void nk_str_delete_chars(struct nk_str*, int pos, int len); -NK_API void nk_str_delete_runes(struct nk_str*, int pos, int len); - -NK_API char *nk_str_at_char(struct nk_str*, int pos); -NK_API char *nk_str_at_rune(struct nk_str*, int pos, nk_rune *unicode, int *len); -NK_API nk_rune nk_str_rune_at(const struct nk_str*, int pos); -NK_API const char *nk_str_at_char_const(const struct nk_str*, int pos); -NK_API const char *nk_str_at_const(const struct nk_str*, int pos, nk_rune *unicode, int *len); - -NK_API char *nk_str_get(struct nk_str*); -NK_API const char *nk_str_get_const(const struct nk_str*); -NK_API int nk_str_len(struct nk_str*); -NK_API int nk_str_len_char(struct nk_str*); - -/*=============================================================== - * - * TEXT EDITOR - * - * ===============================================================*/ -/*/// ### Text Editor -/// Editing text in this library is handled by either `nk_edit_string` or -/// `nk_edit_buffer`. But like almost everything in this library there are multiple -/// ways of doing it and a balance between control and ease of use with memory -/// as well as functionality controlled by flags. -/// -/// This library generally allows three different levels of memory control: -/// First of is the most basic way of just providing a simple char array with -/// string length. This method is probably the easiest way of handling simple -/// user text input. Main upside is complete control over memory while the biggest -/// downside in comparison with the other two approaches is missing undo/redo. -/// -/// For UIs that require undo/redo the second way was created. It is based on -/// a fixed size nk_text_edit struct, which has an internal undo/redo stack. -/// This is mainly useful if you want something more like a text editor but don't want -/// to have a dynamically growing buffer. -/// -/// The final way is using a dynamically growing nk_text_edit struct, which -/// has both a default version if you don't care where memory comes from and an -/// allocator version if you do. While the text editor is quite powerful for its -/// complexity I would not recommend editing gigabytes of data with it. -/// It is rather designed for uses cases which make sense for a GUI library not for -/// an full blown text editor. - */ -#ifndef NK_TEXTEDIT_UNDOSTATECOUNT -#define NK_TEXTEDIT_UNDOSTATECOUNT 99 -#endif - -#ifndef NK_TEXTEDIT_UNDOCHARCOUNT -#define NK_TEXTEDIT_UNDOCHARCOUNT 999 -#endif - -struct nk_text_edit; -struct nk_clipboard { - nk_handle userdata; - nk_plugin_paste paste; - nk_plugin_copy copy; -}; - -struct nk_text_undo_record { - int where; - short insert_length; - short delete_length; - short char_storage; -}; - -struct nk_text_undo_state { - struct nk_text_undo_record undo_rec[NK_TEXTEDIT_UNDOSTATECOUNT]; - nk_rune undo_char[NK_TEXTEDIT_UNDOCHARCOUNT]; - short undo_point; - short redo_point; - short undo_char_point; - short redo_char_point; -}; - -enum nk_text_edit_type { - NK_TEXT_EDIT_SINGLE_LINE, - NK_TEXT_EDIT_MULTI_LINE -}; - -enum nk_text_edit_mode { - NK_TEXT_EDIT_MODE_VIEW, - NK_TEXT_EDIT_MODE_INSERT, - NK_TEXT_EDIT_MODE_REPLACE -}; - -struct nk_text_edit { - struct nk_clipboard clip; - struct nk_str string; - nk_plugin_filter filter; - struct nk_vec2 scrollbar; - - int cursor; - int select_start; - int select_end; - unsigned char mode; - unsigned char cursor_at_end_of_line; - unsigned char initialized; - unsigned char has_preferred_x; - unsigned char single_line; - unsigned char active; - unsigned char padding1; - float preferred_x; - struct nk_text_undo_state undo; -}; - -/* filter function */ -NK_API nk_bool nk_filter_default(const struct nk_text_edit*, nk_rune unicode); -NK_API nk_bool nk_filter_ascii(const struct nk_text_edit*, nk_rune unicode); -NK_API nk_bool nk_filter_float(const struct nk_text_edit*, nk_rune unicode); -NK_API nk_bool nk_filter_decimal(const struct nk_text_edit*, nk_rune unicode); -NK_API nk_bool nk_filter_hex(const struct nk_text_edit*, nk_rune unicode); -NK_API nk_bool nk_filter_oct(const struct nk_text_edit*, nk_rune unicode); -NK_API nk_bool nk_filter_binary(const struct nk_text_edit*, nk_rune unicode); - -/* text editor */ -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -NK_API void nk_textedit_init_default(struct nk_text_edit*); -#endif -NK_API void nk_textedit_init(struct nk_text_edit*, struct nk_allocator*, nk_size size); -NK_API void nk_textedit_init_fixed(struct nk_text_edit*, void *memory, nk_size size); -NK_API void nk_textedit_free(struct nk_text_edit*); -NK_API void nk_textedit_text(struct nk_text_edit*, const char*, int total_len); -NK_API void nk_textedit_delete(struct nk_text_edit*, int where, int len); -NK_API void nk_textedit_delete_selection(struct nk_text_edit*); -NK_API void nk_textedit_select_all(struct nk_text_edit*); -NK_API nk_bool nk_textedit_cut(struct nk_text_edit*); -NK_API nk_bool nk_textedit_paste(struct nk_text_edit*, char const*, int len); -NK_API void nk_textedit_undo(struct nk_text_edit*); -NK_API void nk_textedit_redo(struct nk_text_edit*); - -/* =============================================================== - * - * DRAWING - * - * ===============================================================*/ -/*/// ### Drawing -/// This library was designed to be render backend agnostic so it does -/// not draw anything to screen. Instead all drawn shapes, widgets -/// are made of, are buffered into memory and make up a command queue. -/// Each frame therefore fills the command buffer with draw commands -/// that then need to be executed by the user and his own render backend. -/// After that the command buffer needs to be cleared and a new frame can be -/// started. It is probably important to note that the command buffer is the main -/// drawing API and the optional vertex buffer API only takes this format and -/// converts it into a hardware accessible format. -/// -/// To use the command queue to draw your own widgets you can access the -/// command buffer of each window by calling `nk_window_get_canvas` after -/// previously having called `nk_begin`: -/// -/// ```c -/// void draw_red_rectangle_widget(struct nk_context *ctx) -/// { -/// struct nk_command_buffer *canvas; -/// struct nk_input *input = &ctx->input; -/// canvas = nk_window_get_canvas(ctx); -/// -/// struct nk_rect space; -/// enum nk_widget_layout_states state; -/// state = nk_widget(&space, ctx); -/// if (!state) return; -/// -/// if (state != NK_WIDGET_ROM) -/// update_your_widget_by_user_input(...); -/// nk_fill_rect(canvas, space, 0, nk_rgb(255,0,0)); -/// } -/// -/// if (nk_begin(...)) { -/// nk_layout_row_dynamic(ctx, 25, 1); -/// draw_red_rectangle_widget(ctx); -/// } -/// nk_end(..) -/// -/// ``` -/// Important to know if you want to create your own widgets is the `nk_widget` -/// call. It allocates space on the panel reserved for this widget to be used, -/// but also returns the state of the widget space. If your widget is not seen and does -/// not have to be updated it is '0' and you can just return. If it only has -/// to be drawn the state will be `NK_WIDGET_ROM` otherwise you can do both -/// update and draw your widget. The reason for separating is to only draw and -/// update what is actually necessary which is crucial for performance. -*/ -enum nk_command_type { - NK_COMMAND_NOP, - NK_COMMAND_SCISSOR, - NK_COMMAND_LINE, - NK_COMMAND_CURVE, - NK_COMMAND_RECT, - NK_COMMAND_RECT_FILLED, - NK_COMMAND_RECT_MULTI_COLOR, - NK_COMMAND_CIRCLE, - NK_COMMAND_CIRCLE_FILLED, - NK_COMMAND_ARC, - NK_COMMAND_ARC_FILLED, - NK_COMMAND_TRIANGLE, - NK_COMMAND_TRIANGLE_FILLED, - NK_COMMAND_POLYGON, - NK_COMMAND_POLYGON_FILLED, - NK_COMMAND_POLYLINE, - NK_COMMAND_TEXT, - NK_COMMAND_IMAGE, - NK_COMMAND_CUSTOM -}; - -/* command base and header of every command inside the buffer */ -struct nk_command { - enum nk_command_type type; - nk_size next; -#ifdef NK_INCLUDE_COMMAND_USERDATA - nk_handle userdata; -#endif -}; - -struct nk_command_scissor { - struct nk_command header; - short x, y; - unsigned short w, h; -}; - -struct nk_command_line { - struct nk_command header; - unsigned short line_thickness; - struct nk_vec2i begin; - struct nk_vec2i end; - struct nk_color color; -}; - -struct nk_command_curve { - struct nk_command header; - unsigned short line_thickness; - struct nk_vec2i begin; - struct nk_vec2i end; - struct nk_vec2i ctrl[2]; - struct nk_color color; -}; - -struct nk_command_rect { - struct nk_command header; - unsigned short rounding; - unsigned short line_thickness; - short x, y; - unsigned short w, h; - struct nk_color color; -}; - -struct nk_command_rect_filled { - struct nk_command header; - unsigned short rounding; - short x, y; - unsigned short w, h; - struct nk_color color; -}; - -struct nk_command_rect_multi_color { - struct nk_command header; - short x, y; - unsigned short w, h; - struct nk_color left; - struct nk_color top; - struct nk_color bottom; - struct nk_color right; -}; - -struct nk_command_triangle { - struct nk_command header; - unsigned short line_thickness; - struct nk_vec2i a; - struct nk_vec2i b; - struct nk_vec2i c; - struct nk_color color; -}; - -struct nk_command_triangle_filled { - struct nk_command header; - struct nk_vec2i a; - struct nk_vec2i b; - struct nk_vec2i c; - struct nk_color color; -}; - -struct nk_command_circle { - struct nk_command header; - short x, y; - unsigned short line_thickness; - unsigned short w, h; - struct nk_color color; -}; - -struct nk_command_circle_filled { - struct nk_command header; - short x, y; - unsigned short w, h; - struct nk_color color; -}; - -struct nk_command_arc { - struct nk_command header; - short cx, cy; - unsigned short r; - unsigned short line_thickness; - float a[2]; - struct nk_color color; -}; - -struct nk_command_arc_filled { - struct nk_command header; - short cx, cy; - unsigned short r; - float a[2]; - struct nk_color color; -}; - -struct nk_command_polygon { - struct nk_command header; - struct nk_color color; - unsigned short line_thickness; - unsigned short point_count; - struct nk_vec2i points[1]; -}; - -struct nk_command_polygon_filled { - struct nk_command header; - struct nk_color color; - unsigned short point_count; - struct nk_vec2i points[1]; -}; - -struct nk_command_polyline { - struct nk_command header; - struct nk_color color; - unsigned short line_thickness; - unsigned short point_count; - struct nk_vec2i points[1]; -}; - -struct nk_command_image { - struct nk_command header; - short x, y; - unsigned short w, h; - struct nk_image img; - struct nk_color col; -}; - -typedef void (*nk_command_custom_callback)(void *canvas, short x,short y, - unsigned short w, unsigned short h, nk_handle callback_data); -struct nk_command_custom { - struct nk_command header; - short x, y; - unsigned short w, h; - nk_handle callback_data; - nk_command_custom_callback callback; -}; - -struct nk_command_text { - struct nk_command header; - const struct nk_user_font *font; - struct nk_color background; - struct nk_color foreground; - short x, y; - unsigned short w, h; - float height; - int length; - char string[1]; -}; - -enum nk_command_clipping { - NK_CLIPPING_OFF = nk_false, - NK_CLIPPING_ON = nk_true -}; - -struct nk_command_buffer { - struct nk_buffer *base; - struct nk_rect clip; - int use_clipping; - nk_handle userdata; - nk_size begin, end, last; -}; - -/* shape outlines */ -NK_API void nk_stroke_line(struct nk_command_buffer *b, float x0, float y0, float x1, float y1, float line_thickness, struct nk_color); -NK_API void nk_stroke_curve(struct nk_command_buffer*, float, float, float, float, float, float, float, float, float line_thickness, struct nk_color); -NK_API void nk_stroke_rect(struct nk_command_buffer*, struct nk_rect, float rounding, float line_thickness, struct nk_color); -NK_API void nk_stroke_circle(struct nk_command_buffer*, struct nk_rect, float line_thickness, struct nk_color); -NK_API void nk_stroke_arc(struct nk_command_buffer*, float cx, float cy, float radius, float a_min, float a_max, float line_thickness, struct nk_color); -NK_API void nk_stroke_triangle(struct nk_command_buffer*, float, float, float, float, float, float, float line_thichness, struct nk_color); -NK_API void nk_stroke_polyline(struct nk_command_buffer*, float *points, int point_count, float line_thickness, struct nk_color col); -NK_API void nk_stroke_polygon(struct nk_command_buffer*, float*, int point_count, float line_thickness, struct nk_color); - -/* filled shades */ -NK_API void nk_fill_rect(struct nk_command_buffer*, struct nk_rect, float rounding, struct nk_color); -NK_API void nk_fill_rect_multi_color(struct nk_command_buffer*, struct nk_rect, struct nk_color left, struct nk_color top, struct nk_color right, struct nk_color bottom); -NK_API void nk_fill_circle(struct nk_command_buffer*, struct nk_rect, struct nk_color); -NK_API void nk_fill_arc(struct nk_command_buffer*, float cx, float cy, float radius, float a_min, float a_max, struct nk_color); -NK_API void nk_fill_triangle(struct nk_command_buffer*, float x0, float y0, float x1, float y1, float x2, float y2, struct nk_color); -NK_API void nk_fill_polygon(struct nk_command_buffer*, float*, int point_count, struct nk_color); - -/* misc */ -NK_API void nk_draw_image(struct nk_command_buffer*, struct nk_rect, const struct nk_image*, struct nk_color); -NK_API void nk_draw_nine_slice(struct nk_command_buffer*, struct nk_rect, const struct nk_nine_slice*, struct nk_color); -NK_API void nk_draw_text(struct nk_command_buffer*, struct nk_rect, const char *text, int len, const struct nk_user_font*, struct nk_color, struct nk_color); -NK_API void nk_push_scissor(struct nk_command_buffer*, struct nk_rect); -NK_API void nk_push_custom(struct nk_command_buffer*, struct nk_rect, nk_command_custom_callback, nk_handle usr); - -/* =============================================================== - * - * INPUT - * - * ===============================================================*/ -struct nk_mouse_button { - nk_bool down; - unsigned int clicked; - struct nk_vec2 clicked_pos; -}; -struct nk_mouse { - struct nk_mouse_button buttons[NK_BUTTON_MAX]; - struct nk_vec2 pos; -#ifdef NK_BUTTON_TRIGGER_ON_RELEASE - struct nk_vec2 down_pos; -#endif - struct nk_vec2 prev; - struct nk_vec2 delta; - struct nk_vec2 scroll_delta; - unsigned char grab; - unsigned char grabbed; - unsigned char ungrab; -}; - -struct nk_key { - nk_bool down; - unsigned int clicked; -}; -struct nk_keyboard { - struct nk_key keys[NK_KEY_MAX]; - char text[NK_INPUT_MAX]; - int text_len; -}; - -struct nk_input { - struct nk_keyboard keyboard; - struct nk_mouse mouse; -}; - -NK_API nk_bool nk_input_has_mouse_click(const struct nk_input*, enum nk_buttons); -NK_API nk_bool nk_input_has_mouse_click_in_rect(const struct nk_input*, enum nk_buttons, struct nk_rect); -NK_API nk_bool nk_input_has_mouse_click_in_button_rect(const struct nk_input*, enum nk_buttons, struct nk_rect); -NK_API nk_bool nk_input_has_mouse_click_down_in_rect(const struct nk_input*, enum nk_buttons, struct nk_rect, nk_bool down); -NK_API nk_bool nk_input_is_mouse_click_in_rect(const struct nk_input*, enum nk_buttons, struct nk_rect); -NK_API nk_bool nk_input_is_mouse_click_down_in_rect(const struct nk_input *i, enum nk_buttons id, struct nk_rect b, nk_bool down); -NK_API nk_bool nk_input_any_mouse_click_in_rect(const struct nk_input*, struct nk_rect); -NK_API nk_bool nk_input_is_mouse_prev_hovering_rect(const struct nk_input*, struct nk_rect); -NK_API nk_bool nk_input_is_mouse_hovering_rect(const struct nk_input*, struct nk_rect); -NK_API nk_bool nk_input_mouse_clicked(const struct nk_input*, enum nk_buttons, struct nk_rect); -NK_API nk_bool nk_input_is_mouse_down(const struct nk_input*, enum nk_buttons); -NK_API nk_bool nk_input_is_mouse_pressed(const struct nk_input*, enum nk_buttons); -NK_API nk_bool nk_input_is_mouse_released(const struct nk_input*, enum nk_buttons); -NK_API nk_bool nk_input_is_key_pressed(const struct nk_input*, enum nk_keys); -NK_API nk_bool nk_input_is_key_released(const struct nk_input*, enum nk_keys); -NK_API nk_bool nk_input_is_key_down(const struct nk_input*, enum nk_keys); - -/* =============================================================== - * - * DRAW LIST - * - * ===============================================================*/ -#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT -/* ### Draw List -/// The optional vertex buffer draw list provides a 2D drawing context -/// with antialiasing functionality which takes basic filled or outlined shapes -/// or a path and outputs vertexes, elements and draw commands. -/// The actual draw list API is not required to be used directly while using this -/// library since converting the default library draw command output is done by -/// just calling `nk_convert` but I decided to still make this library accessible -/// since it can be useful. -/// -/// The draw list is based on a path buffering and polygon and polyline -/// rendering API which allows a lot of ways to draw 2D content to screen. -/// In fact it is probably more powerful than needed but allows even more crazy -/// things than this library provides by default. -*/ -#ifdef NK_UINT_DRAW_INDEX -typedef nk_uint nk_draw_index; -#else -typedef nk_ushort nk_draw_index; -#endif -enum nk_draw_list_stroke { - NK_STROKE_OPEN = nk_false, - /* build up path has no connection back to the beginning */ - NK_STROKE_CLOSED = nk_true - /* build up path has a connection back to the beginning */ -}; - -enum nk_draw_vertex_layout_attribute { - NK_VERTEX_POSITION, - NK_VERTEX_COLOR, - NK_VERTEX_TEXCOORD, - NK_VERTEX_ATTRIBUTE_COUNT -}; - -enum nk_draw_vertex_layout_format { - NK_FORMAT_SCHAR, - NK_FORMAT_SSHORT, - NK_FORMAT_SINT, - NK_FORMAT_UCHAR, - NK_FORMAT_USHORT, - NK_FORMAT_UINT, - NK_FORMAT_FLOAT, - NK_FORMAT_DOUBLE, - -NK_FORMAT_COLOR_BEGIN, - NK_FORMAT_R8G8B8 = NK_FORMAT_COLOR_BEGIN, - NK_FORMAT_R16G15B16, - NK_FORMAT_R32G32B32, - - NK_FORMAT_R8G8B8A8, - NK_FORMAT_B8G8R8A8, - NK_FORMAT_R16G15B16A16, - NK_FORMAT_R32G32B32A32, - NK_FORMAT_R32G32B32A32_FLOAT, - NK_FORMAT_R32G32B32A32_DOUBLE, - - NK_FORMAT_RGB32, - NK_FORMAT_RGBA32, -NK_FORMAT_COLOR_END = NK_FORMAT_RGBA32, - NK_FORMAT_COUNT -}; - -#define NK_VERTEX_LAYOUT_END NK_VERTEX_ATTRIBUTE_COUNT,NK_FORMAT_COUNT,0 -struct nk_draw_vertex_layout_element { - enum nk_draw_vertex_layout_attribute attribute; - enum nk_draw_vertex_layout_format format; - nk_size offset; -}; - -struct nk_draw_command { - unsigned int elem_count; - /* number of elements in the current draw batch */ - struct nk_rect clip_rect; - /* current screen clipping rectangle */ - nk_handle texture; - /* current texture to set */ -#ifdef NK_INCLUDE_COMMAND_USERDATA - nk_handle userdata; -#endif -}; - -struct nk_draw_list { - struct nk_rect clip_rect; - struct nk_vec2 circle_vtx[12]; - struct nk_convert_config config; - - struct nk_buffer *buffer; - struct nk_buffer *vertices; - struct nk_buffer *elements; - - unsigned int element_count; - unsigned int vertex_count; - unsigned int cmd_count; - nk_size cmd_offset; - - unsigned int path_count; - unsigned int path_offset; - - enum nk_anti_aliasing line_AA; - enum nk_anti_aliasing shape_AA; - -#ifdef NK_INCLUDE_COMMAND_USERDATA - nk_handle userdata; -#endif -}; - -/* draw list */ -NK_API void nk_draw_list_init(struct nk_draw_list*); -NK_API void nk_draw_list_setup(struct nk_draw_list*, const struct nk_convert_config*, struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements, enum nk_anti_aliasing line_aa,enum nk_anti_aliasing shape_aa); - -/* drawing */ -#define nk_draw_list_foreach(cmd, can, b) for((cmd)=nk__draw_list_begin(can, b); (cmd)!=0; (cmd)=nk__draw_list_next(cmd, b, can)) -NK_API const struct nk_draw_command* nk__draw_list_begin(const struct nk_draw_list*, const struct nk_buffer*); -NK_API const struct nk_draw_command* nk__draw_list_next(const struct nk_draw_command*, const struct nk_buffer*, const struct nk_draw_list*); -NK_API const struct nk_draw_command* nk__draw_list_end(const struct nk_draw_list*, const struct nk_buffer*); - -/* path */ -NK_API void nk_draw_list_path_clear(struct nk_draw_list*); -NK_API void nk_draw_list_path_line_to(struct nk_draw_list*, struct nk_vec2 pos); -NK_API void nk_draw_list_path_arc_to_fast(struct nk_draw_list*, struct nk_vec2 center, float radius, int a_min, int a_max); -NK_API void nk_draw_list_path_arc_to(struct nk_draw_list*, struct nk_vec2 center, float radius, float a_min, float a_max, unsigned int segments); -NK_API void nk_draw_list_path_rect_to(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, float rounding); -NK_API void nk_draw_list_path_curve_to(struct nk_draw_list*, struct nk_vec2 p2, struct nk_vec2 p3, struct nk_vec2 p4, unsigned int num_segments); -NK_API void nk_draw_list_path_fill(struct nk_draw_list*, struct nk_color); -NK_API void nk_draw_list_path_stroke(struct nk_draw_list*, struct nk_color, enum nk_draw_list_stroke closed, float thickness); - -/* stroke */ -NK_API void nk_draw_list_stroke_line(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, struct nk_color, float thickness); -NK_API void nk_draw_list_stroke_rect(struct nk_draw_list*, struct nk_rect rect, struct nk_color, float rounding, float thickness); -NK_API void nk_draw_list_stroke_triangle(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, struct nk_vec2 c, struct nk_color, float thickness); -NK_API void nk_draw_list_stroke_circle(struct nk_draw_list*, struct nk_vec2 center, float radius, struct nk_color, unsigned int segs, float thickness); -NK_API void nk_draw_list_stroke_curve(struct nk_draw_list*, struct nk_vec2 p0, struct nk_vec2 cp0, struct nk_vec2 cp1, struct nk_vec2 p1, struct nk_color, unsigned int segments, float thickness); -NK_API void nk_draw_list_stroke_poly_line(struct nk_draw_list*, const struct nk_vec2 *pnts, const unsigned int cnt, struct nk_color, enum nk_draw_list_stroke, float thickness, enum nk_anti_aliasing); - -/* fill */ -NK_API void nk_draw_list_fill_rect(struct nk_draw_list*, struct nk_rect rect, struct nk_color, float rounding); -NK_API void nk_draw_list_fill_rect_multi_color(struct nk_draw_list*, struct nk_rect rect, struct nk_color left, struct nk_color top, struct nk_color right, struct nk_color bottom); -NK_API void nk_draw_list_fill_triangle(struct nk_draw_list*, struct nk_vec2 a, struct nk_vec2 b, struct nk_vec2 c, struct nk_color); -NK_API void nk_draw_list_fill_circle(struct nk_draw_list*, struct nk_vec2 center, float radius, struct nk_color col, unsigned int segs); -NK_API void nk_draw_list_fill_poly_convex(struct nk_draw_list*, const struct nk_vec2 *points, const unsigned int count, struct nk_color, enum nk_anti_aliasing); - -/* misc */ -NK_API void nk_draw_list_add_image(struct nk_draw_list*, struct nk_image texture, struct nk_rect rect, struct nk_color); -NK_API void nk_draw_list_add_text(struct nk_draw_list*, const struct nk_user_font*, struct nk_rect, const char *text, int len, float font_height, struct nk_color); -#ifdef NK_INCLUDE_COMMAND_USERDATA -NK_API void nk_draw_list_push_userdata(struct nk_draw_list*, nk_handle userdata); -#endif - -#endif - -/* =============================================================== - * - * GUI - * - * ===============================================================*/ -enum nk_style_item_type { - NK_STYLE_ITEM_COLOR, - NK_STYLE_ITEM_IMAGE, - NK_STYLE_ITEM_NINE_SLICE -}; - -union nk_style_item_data { - struct nk_color color; - struct nk_image image; - struct nk_nine_slice slice; -}; - -struct nk_style_item { - enum nk_style_item_type type; - union nk_style_item_data data; -}; - -struct nk_style_text { - struct nk_color color; - struct nk_vec2 padding; -}; - -struct nk_style_button { - /* background */ - struct nk_style_item normal; - struct nk_style_item hover; - struct nk_style_item active; - struct nk_color border_color; - - /* text */ - struct nk_color text_background; - struct nk_color text_normal; - struct nk_color text_hover; - struct nk_color text_active; - nk_flags text_alignment; - - /* properties */ - float border; - float rounding; - struct nk_vec2 padding; - struct nk_vec2 image_padding; - struct nk_vec2 touch_padding; - - /* optional user callbacks */ - nk_handle userdata; - void(*draw_begin)(struct nk_command_buffer*, nk_handle userdata); - void(*draw_end)(struct nk_command_buffer*, nk_handle userdata); -}; - -struct nk_style_toggle { - /* background */ - struct nk_style_item normal; - struct nk_style_item hover; - struct nk_style_item active; - struct nk_color border_color; - - /* cursor */ - struct nk_style_item cursor_normal; - struct nk_style_item cursor_hover; - - /* text */ - struct nk_color text_normal; - struct nk_color text_hover; - struct nk_color text_active; - struct nk_color text_background; - nk_flags text_alignment; - - /* properties */ - struct nk_vec2 padding; - struct nk_vec2 touch_padding; - float spacing; - float border; - - /* optional user callbacks */ - nk_handle userdata; - void(*draw_begin)(struct nk_command_buffer*, nk_handle); - void(*draw_end)(struct nk_command_buffer*, nk_handle); -}; - -struct nk_style_selectable { - /* background (inactive) */ - struct nk_style_item normal; - struct nk_style_item hover; - struct nk_style_item pressed; - - /* background (active) */ - struct nk_style_item normal_active; - struct nk_style_item hover_active; - struct nk_style_item pressed_active; - - /* text color (inactive) */ - struct nk_color text_normal; - struct nk_color text_hover; - struct nk_color text_pressed; - - /* text color (active) */ - struct nk_color text_normal_active; - struct nk_color text_hover_active; - struct nk_color text_pressed_active; - struct nk_color text_background; - nk_flags text_alignment; - - /* properties */ - float rounding; - struct nk_vec2 padding; - struct nk_vec2 touch_padding; - struct nk_vec2 image_padding; - - /* optional user callbacks */ - nk_handle userdata; - void(*draw_begin)(struct nk_command_buffer*, nk_handle); - void(*draw_end)(struct nk_command_buffer*, nk_handle); -}; - -struct nk_style_slider { - /* background */ - struct nk_style_item normal; - struct nk_style_item hover; - struct nk_style_item active; - struct nk_color border_color; - - /* background bar */ - struct nk_color bar_normal; - struct nk_color bar_hover; - struct nk_color bar_active; - struct nk_color bar_filled; - - /* cursor */ - struct nk_style_item cursor_normal; - struct nk_style_item cursor_hover; - struct nk_style_item cursor_active; - - /* properties */ - float border; - float rounding; - float bar_height; - struct nk_vec2 padding; - struct nk_vec2 spacing; - struct nk_vec2 cursor_size; - - /* optional buttons */ - int show_buttons; - struct nk_style_button inc_button; - struct nk_style_button dec_button; - enum nk_symbol_type inc_symbol; - enum nk_symbol_type dec_symbol; - - /* optional user callbacks */ - nk_handle userdata; - void(*draw_begin)(struct nk_command_buffer*, nk_handle); - void(*draw_end)(struct nk_command_buffer*, nk_handle); -}; - -struct nk_style_progress { - /* background */ - struct nk_style_item normal; - struct nk_style_item hover; - struct nk_style_item active; - struct nk_color border_color; - - /* cursor */ - struct nk_style_item cursor_normal; - struct nk_style_item cursor_hover; - struct nk_style_item cursor_active; - struct nk_color cursor_border_color; - - /* properties */ - float rounding; - float border; - float cursor_border; - float cursor_rounding; - struct nk_vec2 padding; - - /* optional user callbacks */ - nk_handle userdata; - void(*draw_begin)(struct nk_command_buffer*, nk_handle); - void(*draw_end)(struct nk_command_buffer*, nk_handle); -}; - -struct nk_style_scrollbar { - /* background */ - struct nk_style_item normal; - struct nk_style_item hover; - struct nk_style_item active; - struct nk_color border_color; - - /* cursor */ - struct nk_style_item cursor_normal; - struct nk_style_item cursor_hover; - struct nk_style_item cursor_active; - struct nk_color cursor_border_color; - - /* properties */ - float border; - float rounding; - float border_cursor; - float rounding_cursor; - struct nk_vec2 padding; - - /* optional buttons */ - int show_buttons; - struct nk_style_button inc_button; - struct nk_style_button dec_button; - enum nk_symbol_type inc_symbol; - enum nk_symbol_type dec_symbol; - - /* optional user callbacks */ - nk_handle userdata; - void(*draw_begin)(struct nk_command_buffer*, nk_handle); - void(*draw_end)(struct nk_command_buffer*, nk_handle); -}; - -struct nk_style_edit { - /* background */ - struct nk_style_item normal; - struct nk_style_item hover; - struct nk_style_item active; - struct nk_color border_color; - struct nk_style_scrollbar scrollbar; - - /* cursor */ - struct nk_color cursor_normal; - struct nk_color cursor_hover; - struct nk_color cursor_text_normal; - struct nk_color cursor_text_hover; - - /* text (unselected) */ - struct nk_color text_normal; - struct nk_color text_hover; - struct nk_color text_active; - - /* text (selected) */ - struct nk_color selected_normal; - struct nk_color selected_hover; - struct nk_color selected_text_normal; - struct nk_color selected_text_hover; - - /* properties */ - float border; - float rounding; - float cursor_size; - struct nk_vec2 scrollbar_size; - struct nk_vec2 padding; - float row_padding; -}; - -struct nk_style_property { - /* background */ - struct nk_style_item normal; - struct nk_style_item hover; - struct nk_style_item active; - struct nk_color border_color; - - /* text */ - struct nk_color label_normal; - struct nk_color label_hover; - struct nk_color label_active; - - /* symbols */ - enum nk_symbol_type sym_left; - enum nk_symbol_type sym_right; - - /* properties */ - float border; - float rounding; - struct nk_vec2 padding; - - struct nk_style_edit edit; - struct nk_style_button inc_button; - struct nk_style_button dec_button; - - /* optional user callbacks */ - nk_handle userdata; - void(*draw_begin)(struct nk_command_buffer*, nk_handle); - void(*draw_end)(struct nk_command_buffer*, nk_handle); -}; - -struct nk_style_chart { - /* colors */ - struct nk_style_item background; - struct nk_color border_color; - struct nk_color selected_color; - struct nk_color color; - - /* properties */ - float border; - float rounding; - struct nk_vec2 padding; -}; - -struct nk_style_combo { - /* background */ - struct nk_style_item normal; - struct nk_style_item hover; - struct nk_style_item active; - struct nk_color border_color; - - /* label */ - struct nk_color label_normal; - struct nk_color label_hover; - struct nk_color label_active; - - /* symbol */ - struct nk_color symbol_normal; - struct nk_color symbol_hover; - struct nk_color symbol_active; - - /* button */ - struct nk_style_button button; - enum nk_symbol_type sym_normal; - enum nk_symbol_type sym_hover; - enum nk_symbol_type sym_active; - - /* properties */ - float border; - float rounding; - struct nk_vec2 content_padding; - struct nk_vec2 button_padding; - struct nk_vec2 spacing; -}; - -struct nk_style_tab { - /* background */ - struct nk_style_item background; - struct nk_color border_color; - struct nk_color text; - - /* button */ - struct nk_style_button tab_maximize_button; - struct nk_style_button tab_minimize_button; - struct nk_style_button node_maximize_button; - struct nk_style_button node_minimize_button; - enum nk_symbol_type sym_minimize; - enum nk_symbol_type sym_maximize; - - /* properties */ - float border; - float rounding; - float indent; - struct nk_vec2 padding; - struct nk_vec2 spacing; -}; - -enum nk_style_header_align { - NK_HEADER_LEFT, - NK_HEADER_RIGHT -}; -struct nk_style_window_header { - /* background */ - struct nk_style_item normal; - struct nk_style_item hover; - struct nk_style_item active; - - /* button */ - struct nk_style_button close_button; - struct nk_style_button minimize_button; - enum nk_symbol_type close_symbol; - enum nk_symbol_type minimize_symbol; - enum nk_symbol_type maximize_symbol; - - /* title */ - struct nk_color label_normal; - struct nk_color label_hover; - struct nk_color label_active; - - /* properties */ - enum nk_style_header_align align; - struct nk_vec2 padding; - struct nk_vec2 label_padding; - struct nk_vec2 spacing; -}; - -struct nk_style_window { - struct nk_style_window_header header; - struct nk_style_item fixed_background; - struct nk_color background; - - struct nk_color border_color; - struct nk_color popup_border_color; - struct nk_color combo_border_color; - struct nk_color contextual_border_color; - struct nk_color menu_border_color; - struct nk_color group_border_color; - struct nk_color tooltip_border_color; - struct nk_style_item scaler; - - float border; - float combo_border; - float contextual_border; - float menu_border; - float group_border; - float tooltip_border; - float popup_border; - float min_row_height_padding; - - float rounding; - struct nk_vec2 spacing; - struct nk_vec2 scrollbar_size; - struct nk_vec2 min_size; - - struct nk_vec2 padding; - struct nk_vec2 group_padding; - struct nk_vec2 popup_padding; - struct nk_vec2 combo_padding; - struct nk_vec2 contextual_padding; - struct nk_vec2 menu_padding; - struct nk_vec2 tooltip_padding; -}; - -struct nk_style { - const struct nk_user_font *font; - const struct nk_cursor *cursors[NK_CURSOR_COUNT]; - const struct nk_cursor *cursor_active; - struct nk_cursor *cursor_last; - int cursor_visible; - - struct nk_style_text text; - struct nk_style_button button; - struct nk_style_button contextual_button; - struct nk_style_button menu_button; - struct nk_style_toggle option; - struct nk_style_toggle checkbox; - struct nk_style_selectable selectable; - struct nk_style_slider slider; - struct nk_style_progress progress; - struct nk_style_property property; - struct nk_style_edit edit; - struct nk_style_chart chart; - struct nk_style_scrollbar scrollh; - struct nk_style_scrollbar scrollv; - struct nk_style_tab tab; - struct nk_style_combo combo; - struct nk_style_window window; -}; - -NK_API struct nk_style_item nk_style_item_color(struct nk_color); -NK_API struct nk_style_item nk_style_item_image(struct nk_image img); -NK_API struct nk_style_item nk_style_item_nine_slice(struct nk_nine_slice slice); -NK_API struct nk_style_item nk_style_item_hide(void); - -/*============================================================== - * PANEL - * =============================================================*/ -#ifndef NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS -#define NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS 16 -#endif -#ifndef NK_CHART_MAX_SLOT -#define NK_CHART_MAX_SLOT 4 -#endif - -enum nk_panel_type { - NK_PANEL_NONE = 0, - NK_PANEL_WINDOW = NK_FLAG(0), - NK_PANEL_GROUP = NK_FLAG(1), - NK_PANEL_POPUP = NK_FLAG(2), - NK_PANEL_CONTEXTUAL = NK_FLAG(4), - NK_PANEL_COMBO = NK_FLAG(5), - NK_PANEL_MENU = NK_FLAG(6), - NK_PANEL_TOOLTIP = NK_FLAG(7) -}; -enum nk_panel_set { - NK_PANEL_SET_NONBLOCK = NK_PANEL_CONTEXTUAL|NK_PANEL_COMBO|NK_PANEL_MENU|NK_PANEL_TOOLTIP, - NK_PANEL_SET_POPUP = NK_PANEL_SET_NONBLOCK|NK_PANEL_POPUP, - NK_PANEL_SET_SUB = NK_PANEL_SET_POPUP|NK_PANEL_GROUP -}; - -struct nk_chart_slot { - enum nk_chart_type type; - struct nk_color color; - struct nk_color highlight; - float min, max, range; - int count; - struct nk_vec2 last; - int index; -}; - -struct nk_chart { - int slot; - float x, y, w, h; - struct nk_chart_slot slots[NK_CHART_MAX_SLOT]; -}; - -enum nk_panel_row_layout_type { - NK_LAYOUT_DYNAMIC_FIXED = 0, - NK_LAYOUT_DYNAMIC_ROW, - NK_LAYOUT_DYNAMIC_FREE, - NK_LAYOUT_DYNAMIC, - NK_LAYOUT_STATIC_FIXED, - NK_LAYOUT_STATIC_ROW, - NK_LAYOUT_STATIC_FREE, - NK_LAYOUT_STATIC, - NK_LAYOUT_TEMPLATE, - NK_LAYOUT_COUNT -}; -struct nk_row_layout { - enum nk_panel_row_layout_type type; - int index; - float height; - float min_height; - int columns; - const float *ratio; - float item_width; - float item_height; - float item_offset; - float filled; - struct nk_rect item; - int tree_depth; - float templates[NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS]; -}; - -struct nk_popup_buffer { - nk_size begin; - nk_size parent; - nk_size last; - nk_size end; - nk_bool active; -}; - -struct nk_menu_state { - float x, y, w, h; - struct nk_scroll offset; -}; - -struct nk_panel { - enum nk_panel_type type; - nk_flags flags; - struct nk_rect bounds; - nk_uint *offset_x; - nk_uint *offset_y; - float at_x, at_y, max_x; - float footer_height; - float header_height; - float border; - unsigned int has_scrolling; - struct nk_rect clip; - struct nk_menu_state menu; - struct nk_row_layout row; - struct nk_chart chart; - struct nk_command_buffer *buffer; - struct nk_panel *parent; -}; - -/*============================================================== - * WINDOW - * =============================================================*/ -#ifndef NK_WINDOW_MAX_NAME -#define NK_WINDOW_MAX_NAME 64 -#endif - -struct nk_table; -enum nk_window_flags { - NK_WINDOW_PRIVATE = NK_FLAG(11), - NK_WINDOW_DYNAMIC = NK_WINDOW_PRIVATE, - /* special window type growing up in height while being filled to a certain maximum height */ - NK_WINDOW_ROM = NK_FLAG(12), - /* sets window widgets into a read only mode and does not allow input changes */ - NK_WINDOW_NOT_INTERACTIVE = NK_WINDOW_ROM|NK_WINDOW_NO_INPUT, - /* prevents all interaction caused by input to either window or widgets inside */ - NK_WINDOW_HIDDEN = NK_FLAG(13), - /* Hides window and stops any window interaction and drawing */ - NK_WINDOW_CLOSED = NK_FLAG(14), - /* Directly closes and frees the window at the end of the frame */ - NK_WINDOW_MINIMIZED = NK_FLAG(15), - /* marks the window as minimized */ - NK_WINDOW_REMOVE_ROM = NK_FLAG(16) - /* Removes read only mode at the end of the window */ -}; - -struct nk_popup_state { - struct nk_window *win; - enum nk_panel_type type; - struct nk_popup_buffer buf; - nk_hash name; - nk_bool active; - unsigned combo_count; - unsigned con_count, con_old; - unsigned active_con; - struct nk_rect header; -}; - -struct nk_edit_state { - nk_hash name; - unsigned int seq; - unsigned int old; - int active, prev; - int cursor; - int sel_start; - int sel_end; - struct nk_scroll scrollbar; - unsigned char mode; - unsigned char single_line; -}; - -struct nk_property_state { - int active, prev; - char buffer[NK_MAX_NUMBER_BUFFER]; - int length; - int cursor; - int select_start; - int select_end; - nk_hash name; - unsigned int seq; - unsigned int old; - int state; -}; - -struct nk_window { - unsigned int seq; - nk_hash name; - char name_string[NK_WINDOW_MAX_NAME]; - nk_flags flags; - - struct nk_rect bounds; - struct nk_scroll scrollbar; - struct nk_command_buffer buffer; - struct nk_panel *layout; - float scrollbar_hiding_timer; - - /* persistent widget state */ - struct nk_property_state property; - struct nk_popup_state popup; - struct nk_edit_state edit; - unsigned int scrolled; - - struct nk_table *tables; - unsigned int table_count; - - /* window list hooks */ - struct nk_window *next; - struct nk_window *prev; - struct nk_window *parent; -}; - -/*============================================================== - * STACK - * =============================================================*/ -/*/// ### Stack -/// The style modifier stack can be used to temporarily change a -/// property inside `nk_style`. For example if you want a special -/// red button you can temporarily push the old button color onto a stack -/// draw the button with a red color and then you just pop the old color -/// back from the stack: -/// -/// nk_style_push_style_item(ctx, &ctx->style.button.normal, nk_style_item_color(nk_rgb(255,0,0))); -/// nk_style_push_style_item(ctx, &ctx->style.button.hover, nk_style_item_color(nk_rgb(255,0,0))); -/// nk_style_push_style_item(ctx, &ctx->style.button.active, nk_style_item_color(nk_rgb(255,0,0))); -/// nk_style_push_vec2(ctx, &cx->style.button.padding, nk_vec2(2,2)); -/// -/// nk_button(...); -/// -/// nk_style_pop_style_item(ctx); -/// nk_style_pop_style_item(ctx); -/// nk_style_pop_style_item(ctx); -/// nk_style_pop_vec2(ctx); -/// -/// Nuklear has a stack for style_items, float properties, vector properties, -/// flags, colors, fonts and for button_behavior. Each has it's own fixed size stack -/// which can be changed at compile time. - */ -#ifndef NK_BUTTON_BEHAVIOR_STACK_SIZE -#define NK_BUTTON_BEHAVIOR_STACK_SIZE 8 -#endif - -#ifndef NK_FONT_STACK_SIZE -#define NK_FONT_STACK_SIZE 8 -#endif - -#ifndef NK_STYLE_ITEM_STACK_SIZE -#define NK_STYLE_ITEM_STACK_SIZE 16 -#endif - -#ifndef NK_FLOAT_STACK_SIZE -#define NK_FLOAT_STACK_SIZE 32 -#endif - -#ifndef NK_VECTOR_STACK_SIZE -#define NK_VECTOR_STACK_SIZE 16 -#endif - -#ifndef NK_FLAGS_STACK_SIZE -#define NK_FLAGS_STACK_SIZE 32 -#endif - -#ifndef NK_COLOR_STACK_SIZE -#define NK_COLOR_STACK_SIZE 32 -#endif - -#define NK_CONFIGURATION_STACK_TYPE(prefix, name, type)\ - struct nk_config_stack_##name##_element {\ - prefix##_##type *address;\ - prefix##_##type old_value;\ - } -#define NK_CONFIG_STACK(type,size)\ - struct nk_config_stack_##type {\ - int head;\ - struct nk_config_stack_##type##_element elements[size];\ - } - -#define nk_float float -NK_CONFIGURATION_STACK_TYPE(struct nk, style_item, style_item); -NK_CONFIGURATION_STACK_TYPE(nk ,float, float); -NK_CONFIGURATION_STACK_TYPE(struct nk, vec2, vec2); -NK_CONFIGURATION_STACK_TYPE(nk ,flags, flags); -NK_CONFIGURATION_STACK_TYPE(struct nk, color, color); -NK_CONFIGURATION_STACK_TYPE(const struct nk, user_font, user_font*); -NK_CONFIGURATION_STACK_TYPE(enum nk, button_behavior, button_behavior); - -NK_CONFIG_STACK(style_item, NK_STYLE_ITEM_STACK_SIZE); -NK_CONFIG_STACK(float, NK_FLOAT_STACK_SIZE); -NK_CONFIG_STACK(vec2, NK_VECTOR_STACK_SIZE); -NK_CONFIG_STACK(flags, NK_FLAGS_STACK_SIZE); -NK_CONFIG_STACK(color, NK_COLOR_STACK_SIZE); -NK_CONFIG_STACK(user_font, NK_FONT_STACK_SIZE); -NK_CONFIG_STACK(button_behavior, NK_BUTTON_BEHAVIOR_STACK_SIZE); - -struct nk_configuration_stacks { - struct nk_config_stack_style_item style_items; - struct nk_config_stack_float floats; - struct nk_config_stack_vec2 vectors; - struct nk_config_stack_flags flags; - struct nk_config_stack_color colors; - struct nk_config_stack_user_font fonts; - struct nk_config_stack_button_behavior button_behaviors; -}; - -/*============================================================== - * CONTEXT - * =============================================================*/ -#define NK_VALUE_PAGE_CAPACITY \ - (((NK_MAX(sizeof(struct nk_window),sizeof(struct nk_panel)) / sizeof(nk_uint))) / 2) - -struct nk_table { - unsigned int seq; - unsigned int size; - nk_hash keys[NK_VALUE_PAGE_CAPACITY]; - nk_uint values[NK_VALUE_PAGE_CAPACITY]; - struct nk_table *next, *prev; -}; - -union nk_page_data { - struct nk_table tbl; - struct nk_panel pan; - struct nk_window win; -}; - -struct nk_page_element { - union nk_page_data data; - struct nk_page_element *next; - struct nk_page_element *prev; -}; - -struct nk_page { - unsigned int size; - struct nk_page *next; - struct nk_page_element win[1]; -}; - -struct nk_pool { - struct nk_allocator alloc; - enum nk_allocation_type type; - unsigned int page_count; - struct nk_page *pages; - struct nk_page_element *freelist; - unsigned capacity; - nk_size size; - nk_size cap; -}; - -struct nk_context { -/* public: can be accessed freely */ - struct nk_input input; - struct nk_style style; - struct nk_buffer memory; - struct nk_clipboard clip; - nk_flags last_widget_state; - enum nk_button_behavior button_behavior; - struct nk_configuration_stacks stacks; - float delta_time_seconds; - -/* private: - should only be accessed if you - know what you are doing */ -#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT - struct nk_draw_list draw_list; -#endif -#ifdef NK_INCLUDE_COMMAND_USERDATA - nk_handle userdata; -#endif - /* text editor objects are quite big because of an internal - * undo/redo stack. Therefore it does not make sense to have one for - * each window for temporary use cases, so I only provide *one* instance - * for all windows. This works because the content is cleared anyway */ - struct nk_text_edit text_edit; - /* draw buffer used for overlay drawing operation like cursor */ - struct nk_command_buffer overlay; - - /* windows */ - int build; - int use_pool; - struct nk_pool pool; - struct nk_window *begin; - struct nk_window *end; - struct nk_window *active; - struct nk_window *current; - struct nk_page_element *freelist; - unsigned int count; - unsigned int seq; -}; - -/* ============================================================== - * MATH - * =============================================================== */ -#define NK_PI 3.141592654f -#define NK_UTF_INVALID 0xFFFD -#define NK_MAX_FLOAT_PRECISION 2 - -#define NK_UNUSED(x) ((void)(x)) -#define NK_SATURATE(x) (NK_MAX(0, NK_MIN(1.0f, x))) -#define NK_LEN(a) (sizeof(a)/sizeof(a)[0]) -#define NK_ABS(a) (((a) < 0) ? -(a) : (a)) -#define NK_BETWEEN(x, a, b) ((a) <= (x) && (x) < (b)) -#define NK_INBOX(px, py, x, y, w, h)\ - (NK_BETWEEN(px,x,x+w) && NK_BETWEEN(py,y,y+h)) -#define NK_INTERSECT(x0, y0, w0, h0, x1, y1, w1, h1) \ - ((x1 < (x0 + w0)) && (x0 < (x1 + w1)) && \ - (y1 < (y0 + h0)) && (y0 < (y1 + h1))) -#define NK_CONTAINS(x, y, w, h, bx, by, bw, bh)\ - (NK_INBOX(x,y, bx, by, bw, bh) && NK_INBOX(x+w,y+h, bx, by, bw, bh)) - -#define nk_vec2_sub(a, b) nk_vec2((a).x - (b).x, (a).y - (b).y) -#define nk_vec2_add(a, b) nk_vec2((a).x + (b).x, (a).y + (b).y) -#define nk_vec2_len_sqr(a) ((a).x*(a).x+(a).y*(a).y) -#define nk_vec2_muls(a, t) nk_vec2((a).x * (t), (a).y * (t)) - -#define nk_ptr_add(t, p, i) ((t*)((void*)((nk_byte*)(p) + (i)))) -#define nk_ptr_add_const(t, p, i) ((const t*)((const void*)((const nk_byte*)(p) + (i)))) -#define nk_zero_struct(s) nk_zero(&s, sizeof(s)) - -/* ============================================================== - * ALIGNMENT - * =============================================================== */ -/* Pointer to Integer type conversion for pointer alignment */ -#if defined(__PTRDIFF_TYPE__) /* This case should work for GCC*/ -# define NK_UINT_TO_PTR(x) ((void*)(__PTRDIFF_TYPE__)(x)) -# define NK_PTR_TO_UINT(x) ((nk_size)(__PTRDIFF_TYPE__)(x)) -#elif !defined(__GNUC__) /* works for compilers other than LLVM */ -# define NK_UINT_TO_PTR(x) ((void*)&((char*)0)[x]) -# define NK_PTR_TO_UINT(x) ((nk_size)(((char*)x)-(char*)0)) -#elif defined(NK_USE_FIXED_TYPES) /* used if we have */ -# define NK_UINT_TO_PTR(x) ((void*)(uintptr_t)(x)) -# define NK_PTR_TO_UINT(x) ((uintptr_t)(x)) -#else /* generates warning but works */ -# define NK_UINT_TO_PTR(x) ((void*)(x)) -# define NK_PTR_TO_UINT(x) ((nk_size)(x)) -#endif - -#define NK_ALIGN_PTR(x, mask)\ - (NK_UINT_TO_PTR((NK_PTR_TO_UINT((nk_byte*)(x) + (mask-1)) & ~(mask-1)))) -#define NK_ALIGN_PTR_BACK(x, mask)\ - (NK_UINT_TO_PTR((NK_PTR_TO_UINT((nk_byte*)(x)) & ~(mask-1)))) - -#if (defined(__GNUC__) && __GNUC__ >= 4) || defined(__clang__) -#define NK_OFFSETOF(st,m) (__builtin_offsetof(st,m)) -#else -#define NK_OFFSETOF(st,m) ((nk_ptr)&(((st*)0)->m)) -#endif - -#ifdef __cplusplus -} -#endif - -#ifdef __cplusplus -template struct nk_alignof; -template struct nk_helper{enum {value = size_diff};}; -template struct nk_helper{enum {value = nk_alignof::value};}; -template struct nk_alignof{struct Big {T x; char c;}; enum { - diff = sizeof(Big) - sizeof(T), value = nk_helper::value};}; -#define NK_ALIGNOF(t) (nk_alignof::value) -#else -#define NK_ALIGNOF(t) NK_OFFSETOF(struct {char c; t _h;}, _h) -#endif - -#define NK_CONTAINER_OF(ptr,type,member)\ - (type*)((void*)((char*)(1 ? (ptr): &((type*)0)->member) - NK_OFFSETOF(type, member))) - - - -#endif /* NK_NUKLEAR_H_ */ - -#ifdef NK_IMPLEMENTATION - -#ifndef NK_INTERNAL_H -#define NK_INTERNAL_H - -#ifndef NK_POOL_DEFAULT_CAPACITY -#define NK_POOL_DEFAULT_CAPACITY 16 -#endif - -#ifndef NK_DEFAULT_COMMAND_BUFFER_SIZE -#define NK_DEFAULT_COMMAND_BUFFER_SIZE (4*1024) -#endif - -#ifndef NK_BUFFER_DEFAULT_INITIAL_SIZE -#define NK_BUFFER_DEFAULT_INITIAL_SIZE (4*1024) -#endif - -/* standard library headers */ -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -#include /* malloc, free */ -#endif -#ifdef NK_INCLUDE_STANDARD_IO -#include /* fopen, fclose,... */ -#endif -#ifdef NK_INCLUDE_STANDARD_VARARGS -#include /* valist, va_start, va_end, ... */ -#endif -#ifndef NK_ASSERT -#include -#define NK_ASSERT(expr) assert(expr) -#endif - -#define NK_DEFAULT (-1) - -#ifndef NK_VSNPRINTF -/* If your compiler does support `vsnprintf` I would highly recommend - * defining this to vsnprintf instead since `vsprintf` is basically - * unbelievable unsafe and should *NEVER* be used. But I have to support - * it since C89 only provides this unsafe version. */ - #if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) ||\ - (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ - (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L)) ||\ - (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500)) ||\ - defined(_ISOC99_SOURCE) || defined(_BSD_SOURCE) - #define NK_VSNPRINTF(s,n,f,a) vsnprintf(s,n,f,a) - #else - #define NK_VSNPRINTF(s,n,f,a) vsprintf(s,f,a) - #endif -#endif - -#define NK_SCHAR_MIN (-127) -#define NK_SCHAR_MAX 127 -#define NK_UCHAR_MIN 0 -#define NK_UCHAR_MAX 256 -#define NK_SSHORT_MIN (-32767) -#define NK_SSHORT_MAX 32767 -#define NK_USHORT_MIN 0 -#define NK_USHORT_MAX 65535 -#define NK_SINT_MIN (-2147483647) -#define NK_SINT_MAX 2147483647 -#define NK_UINT_MIN 0 -#define NK_UINT_MAX 4294967295u - -/* Make sure correct type size: - * This will fire with a negative subscript error if the type sizes - * are set incorrectly by the compiler, and compile out if not */ -NK_STATIC_ASSERT(sizeof(nk_size) >= sizeof(void*)); -NK_STATIC_ASSERT(sizeof(nk_ptr) == sizeof(void*)); -NK_STATIC_ASSERT(sizeof(nk_flags) >= 4); -NK_STATIC_ASSERT(sizeof(nk_rune) >= 4); -NK_STATIC_ASSERT(sizeof(nk_ushort) == 2); -NK_STATIC_ASSERT(sizeof(nk_short) == 2); -NK_STATIC_ASSERT(sizeof(nk_uint) == 4); -NK_STATIC_ASSERT(sizeof(nk_int) == 4); -NK_STATIC_ASSERT(sizeof(nk_byte) == 1); -#ifdef NK_INCLUDE_STANDARD_BOOL -NK_STATIC_ASSERT(sizeof(nk_bool) == sizeof(bool)); -#else -NK_STATIC_ASSERT(sizeof(nk_bool) == 4); -#endif - -NK_GLOBAL const struct nk_rect nk_null_rect = {-8192.0f, -8192.0f, 16384, 16384}; -#define NK_FLOAT_PRECISION 0.00000000000001 - -NK_GLOBAL const struct nk_color nk_red = {255,0,0,255}; -NK_GLOBAL const struct nk_color nk_green = {0,255,0,255}; -NK_GLOBAL const struct nk_color nk_blue = {0,0,255,255}; -NK_GLOBAL const struct nk_color nk_white = {255,255,255,255}; -NK_GLOBAL const struct nk_color nk_black = {0,0,0,255}; -NK_GLOBAL const struct nk_color nk_yellow = {255,255,0,255}; - -/* widget */ -#define nk_widget_state_reset(s)\ - if ((*(s)) & NK_WIDGET_STATE_MODIFIED)\ - (*(s)) = NK_WIDGET_STATE_INACTIVE|NK_WIDGET_STATE_MODIFIED;\ - else (*(s)) = NK_WIDGET_STATE_INACTIVE; - -/* math */ -#ifndef NK_INV_SQRT -NK_LIB float nk_inv_sqrt(float n); -#endif -#ifndef NK_SIN -NK_LIB float nk_sin(float x); -#endif -#ifndef NK_COS -NK_LIB float nk_cos(float x); -#endif -NK_LIB nk_uint nk_round_up_pow2(nk_uint v); -NK_LIB struct nk_rect nk_shrink_rect(struct nk_rect r, float amount); -NK_LIB struct nk_rect nk_pad_rect(struct nk_rect r, struct nk_vec2 pad); -NK_LIB void nk_unify(struct nk_rect *clip, const struct nk_rect *a, float x0, float y0, float x1, float y1); -NK_LIB double nk_pow(double x, int n); -NK_LIB int nk_ifloord(double x); -NK_LIB int nk_ifloorf(float x); -NK_LIB int nk_iceilf(float x); -NK_LIB int nk_log10(double n); - -/* util */ -enum {NK_DO_NOT_STOP_ON_NEW_LINE, NK_STOP_ON_NEW_LINE}; -NK_LIB nk_bool nk_is_lower(int c); -NK_LIB nk_bool nk_is_upper(int c); -NK_LIB int nk_to_upper(int c); -NK_LIB int nk_to_lower(int c); - -#ifndef NK_MEMCPY -NK_LIB void* nk_memcopy(void *dst, const void *src, nk_size n); -#endif -#ifndef NK_MEMSET -NK_LIB void nk_memset(void *ptr, int c0, nk_size size); -#endif -NK_LIB void nk_zero(void *ptr, nk_size size); -NK_LIB char *nk_itoa(char *s, long n); -NK_LIB int nk_string_float_limit(char *string, int prec); -#ifndef NK_DTOA -NK_LIB char *nk_dtoa(char *s, double n); -#endif -NK_LIB int nk_text_clamp(const struct nk_user_font *font, const char *text, int text_len, float space, int *glyphs, float *text_width, nk_rune *sep_list, int sep_count); -NK_LIB struct nk_vec2 nk_text_calculate_text_bounds(const struct nk_user_font *font, const char *begin, int byte_len, float row_height, const char **remaining, struct nk_vec2 *out_offset, int *glyphs, int op); -#ifdef NK_INCLUDE_STANDARD_VARARGS -NK_LIB int nk_strfmt(char *buf, int buf_size, const char *fmt, va_list args); -#endif -#ifdef NK_INCLUDE_STANDARD_IO -NK_LIB char *nk_file_load(const char* path, nk_size* siz, struct nk_allocator *alloc); -#endif - -/* buffer */ -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -NK_LIB void* nk_malloc(nk_handle unused, void *old,nk_size size); -NK_LIB void nk_mfree(nk_handle unused, void *ptr); -#endif -NK_LIB void* nk_buffer_align(void *unaligned, nk_size align, nk_size *alignment, enum nk_buffer_allocation_type type); -NK_LIB void* nk_buffer_alloc(struct nk_buffer *b, enum nk_buffer_allocation_type type, nk_size size, nk_size align); -NK_LIB void* nk_buffer_realloc(struct nk_buffer *b, nk_size capacity, nk_size *size); - -/* draw */ -NK_LIB void nk_command_buffer_init(struct nk_command_buffer *cb, struct nk_buffer *b, enum nk_command_clipping clip); -NK_LIB void nk_command_buffer_reset(struct nk_command_buffer *b); -NK_LIB void* nk_command_buffer_push(struct nk_command_buffer* b, enum nk_command_type t, nk_size size); -NK_LIB void nk_draw_symbol(struct nk_command_buffer *out, enum nk_symbol_type type, struct nk_rect content, struct nk_color background, struct nk_color foreground, float border_width, const struct nk_user_font *font); - -/* buffering */ -NK_LIB void nk_start_buffer(struct nk_context *ctx, struct nk_command_buffer *b); -NK_LIB void nk_start(struct nk_context *ctx, struct nk_window *win); -NK_LIB void nk_start_popup(struct nk_context *ctx, struct nk_window *win); -NK_LIB void nk_finish_popup(struct nk_context *ctx, struct nk_window*); -NK_LIB void nk_finish_buffer(struct nk_context *ctx, struct nk_command_buffer *b); -NK_LIB void nk_finish(struct nk_context *ctx, struct nk_window *w); -NK_LIB void nk_build(struct nk_context *ctx); - -/* text editor */ -NK_LIB void nk_textedit_clear_state(struct nk_text_edit *state, enum nk_text_edit_type type, nk_plugin_filter filter); -NK_LIB void nk_textedit_click(struct nk_text_edit *state, float x, float y, const struct nk_user_font *font, float row_height); -NK_LIB void nk_textedit_drag(struct nk_text_edit *state, float x, float y, const struct nk_user_font *font, float row_height); -NK_LIB void nk_textedit_key(struct nk_text_edit *state, enum nk_keys key, int shift_mod, const struct nk_user_font *font, float row_height); - -/* window */ -enum nk_window_insert_location { - NK_INSERT_BACK, /* inserts window into the back of list (front of screen) */ - NK_INSERT_FRONT /* inserts window into the front of list (back of screen) */ -}; -NK_LIB void *nk_create_window(struct nk_context *ctx); -NK_LIB void nk_remove_window(struct nk_context*, struct nk_window*); -NK_LIB void nk_free_window(struct nk_context *ctx, struct nk_window *win); -NK_LIB struct nk_window *nk_find_window(struct nk_context *ctx, nk_hash hash, const char *name); -NK_LIB void nk_insert_window(struct nk_context *ctx, struct nk_window *win, enum nk_window_insert_location loc); - -/* pool */ -NK_LIB void nk_pool_init(struct nk_pool *pool, struct nk_allocator *alloc, unsigned int capacity); -NK_LIB void nk_pool_free(struct nk_pool *pool); -NK_LIB void nk_pool_init_fixed(struct nk_pool *pool, void *memory, nk_size size); -NK_LIB struct nk_page_element *nk_pool_alloc(struct nk_pool *pool); - -/* page-element */ -NK_LIB struct nk_page_element* nk_create_page_element(struct nk_context *ctx); -NK_LIB void nk_link_page_element_into_freelist(struct nk_context *ctx, struct nk_page_element *elem); -NK_LIB void nk_free_page_element(struct nk_context *ctx, struct nk_page_element *elem); - -/* table */ -NK_LIB struct nk_table* nk_create_table(struct nk_context *ctx); -NK_LIB void nk_remove_table(struct nk_window *win, struct nk_table *tbl); -NK_LIB void nk_free_table(struct nk_context *ctx, struct nk_table *tbl); -NK_LIB void nk_push_table(struct nk_window *win, struct nk_table *tbl); -NK_LIB nk_uint *nk_add_value(struct nk_context *ctx, struct nk_window *win, nk_hash name, nk_uint value); -NK_LIB nk_uint *nk_find_value(struct nk_window *win, nk_hash name); - -/* panel */ -NK_LIB void *nk_create_panel(struct nk_context *ctx); -NK_LIB void nk_free_panel(struct nk_context*, struct nk_panel *pan); -NK_LIB nk_bool nk_panel_has_header(nk_flags flags, const char *title); -NK_LIB struct nk_vec2 nk_panel_get_padding(const struct nk_style *style, enum nk_panel_type type); -NK_LIB float nk_panel_get_border(const struct nk_style *style, nk_flags flags, enum nk_panel_type type); -NK_LIB struct nk_color nk_panel_get_border_color(const struct nk_style *style, enum nk_panel_type type); -NK_LIB nk_bool nk_panel_is_sub(enum nk_panel_type type); -NK_LIB nk_bool nk_panel_is_nonblock(enum nk_panel_type type); -NK_LIB nk_bool nk_panel_begin(struct nk_context *ctx, const char *title, enum nk_panel_type panel_type); -NK_LIB void nk_panel_end(struct nk_context *ctx); - -/* layout */ -NK_LIB float nk_layout_row_calculate_usable_space(const struct nk_style *style, enum nk_panel_type type, float total_space, int columns); -NK_LIB void nk_panel_layout(const struct nk_context *ctx, struct nk_window *win, float height, int cols); -NK_LIB void nk_row_layout(struct nk_context *ctx, enum nk_layout_format fmt, float height, int cols, int width); -NK_LIB void nk_panel_alloc_row(const struct nk_context *ctx, struct nk_window *win); -NK_LIB void nk_layout_widget_space(struct nk_rect *bounds, const struct nk_context *ctx, struct nk_window *win, int modify); -NK_LIB void nk_panel_alloc_space(struct nk_rect *bounds, const struct nk_context *ctx); -NK_LIB void nk_layout_peek(struct nk_rect *bounds, struct nk_context *ctx); - -/* popup */ -NK_LIB nk_bool nk_nonblock_begin(struct nk_context *ctx, nk_flags flags, struct nk_rect body, struct nk_rect header, enum nk_panel_type panel_type); - -/* text */ -struct nk_text { - struct nk_vec2 padding; - struct nk_color background; - struct nk_color text; -}; -NK_LIB void nk_widget_text(struct nk_command_buffer *o, struct nk_rect b, const char *string, int len, const struct nk_text *t, nk_flags a, const struct nk_user_font *f); -NK_LIB void nk_widget_text_wrap(struct nk_command_buffer *o, struct nk_rect b, const char *string, int len, const struct nk_text *t, const struct nk_user_font *f); - -/* button */ -NK_LIB nk_bool nk_button_behavior(nk_flags *state, struct nk_rect r, const struct nk_input *i, enum nk_button_behavior behavior); -NK_LIB const struct nk_style_item* nk_draw_button(struct nk_command_buffer *out, const struct nk_rect *bounds, nk_flags state, const struct nk_style_button *style); -NK_LIB nk_bool nk_do_button(nk_flags *state, struct nk_command_buffer *out, struct nk_rect r, const struct nk_style_button *style, const struct nk_input *in, enum nk_button_behavior behavior, struct nk_rect *content); -NK_LIB void nk_draw_button_text(struct nk_command_buffer *out, const struct nk_rect *bounds, const struct nk_rect *content, nk_flags state, const struct nk_style_button *style, const char *txt, int len, nk_flags text_alignment, const struct nk_user_font *font); -NK_LIB nk_bool nk_do_button_text(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, const char *string, int len, nk_flags align, enum nk_button_behavior behavior, const struct nk_style_button *style, const struct nk_input *in, const struct nk_user_font *font); -NK_LIB void nk_draw_button_symbol(struct nk_command_buffer *out, const struct nk_rect *bounds, const struct nk_rect *content, nk_flags state, const struct nk_style_button *style, enum nk_symbol_type type, const struct nk_user_font *font); -NK_LIB nk_bool nk_do_button_symbol(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, enum nk_symbol_type symbol, enum nk_button_behavior behavior, const struct nk_style_button *style, const struct nk_input *in, const struct nk_user_font *font); -NK_LIB void nk_draw_button_image(struct nk_command_buffer *out, const struct nk_rect *bounds, const struct nk_rect *content, nk_flags state, const struct nk_style_button *style, const struct nk_image *img); -NK_LIB nk_bool nk_do_button_image(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, struct nk_image img, enum nk_button_behavior b, const struct nk_style_button *style, const struct nk_input *in); -NK_LIB void nk_draw_button_text_symbol(struct nk_command_buffer *out, const struct nk_rect *bounds, const struct nk_rect *label, const struct nk_rect *symbol, nk_flags state, const struct nk_style_button *style, const char *str, int len, enum nk_symbol_type type, const struct nk_user_font *font); -NK_LIB nk_bool nk_do_button_text_symbol(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, enum nk_symbol_type symbol, const char *str, int len, nk_flags align, enum nk_button_behavior behavior, const struct nk_style_button *style, const struct nk_user_font *font, const struct nk_input *in); -NK_LIB void nk_draw_button_text_image(struct nk_command_buffer *out, const struct nk_rect *bounds, const struct nk_rect *label, const struct nk_rect *image, nk_flags state, const struct nk_style_button *style, const char *str, int len, const struct nk_user_font *font, const struct nk_image *img); -NK_LIB nk_bool nk_do_button_text_image(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, struct nk_image img, const char* str, int len, nk_flags align, enum nk_button_behavior behavior, const struct nk_style_button *style, const struct nk_user_font *font, const struct nk_input *in); - -/* toggle */ -enum nk_toggle_type { - NK_TOGGLE_CHECK, - NK_TOGGLE_OPTION -}; -NK_LIB nk_bool nk_toggle_behavior(const struct nk_input *in, struct nk_rect select, nk_flags *state, nk_bool active); -NK_LIB void nk_draw_checkbox(struct nk_command_buffer *out, nk_flags state, const struct nk_style_toggle *style, nk_bool active, const struct nk_rect *label, const struct nk_rect *selector, const struct nk_rect *cursors, const char *string, int len, const struct nk_user_font *font); -NK_LIB void nk_draw_option(struct nk_command_buffer *out, nk_flags state, const struct nk_style_toggle *style, nk_bool active, const struct nk_rect *label, const struct nk_rect *selector, const struct nk_rect *cursors, const char *string, int len, const struct nk_user_font *font); -NK_LIB nk_bool nk_do_toggle(nk_flags *state, struct nk_command_buffer *out, struct nk_rect r, nk_bool *active, const char *str, int len, enum nk_toggle_type type, const struct nk_style_toggle *style, const struct nk_input *in, const struct nk_user_font *font); - -/* progress */ -NK_LIB nk_size nk_progress_behavior(nk_flags *state, struct nk_input *in, struct nk_rect r, struct nk_rect cursor, nk_size max, nk_size value, nk_bool modifiable); -NK_LIB void nk_draw_progress(struct nk_command_buffer *out, nk_flags state, const struct nk_style_progress *style, const struct nk_rect *bounds, const struct nk_rect *scursor, nk_size value, nk_size max); -NK_LIB nk_size nk_do_progress(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, nk_size value, nk_size max, nk_bool modifiable, const struct nk_style_progress *style, struct nk_input *in); - -/* slider */ -NK_LIB float nk_slider_behavior(nk_flags *state, struct nk_rect *logical_cursor, struct nk_rect *visual_cursor, struct nk_input *in, struct nk_rect bounds, float slider_min, float slider_max, float slider_value, float slider_step, float slider_steps); -NK_LIB void nk_draw_slider(struct nk_command_buffer *out, nk_flags state, const struct nk_style_slider *style, const struct nk_rect *bounds, const struct nk_rect *visual_cursor, float min, float value, float max); -NK_LIB float nk_do_slider(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, float min, float val, float max, float step, const struct nk_style_slider *style, struct nk_input *in, const struct nk_user_font *font); - -/* scrollbar */ -NK_LIB float nk_scrollbar_behavior(nk_flags *state, struct nk_input *in, int has_scrolling, const struct nk_rect *scroll, const struct nk_rect *cursor, const struct nk_rect *empty0, const struct nk_rect *empty1, float scroll_offset, float target, float scroll_step, enum nk_orientation o); -NK_LIB void nk_draw_scrollbar(struct nk_command_buffer *out, nk_flags state, const struct nk_style_scrollbar *style, const struct nk_rect *bounds, const struct nk_rect *scroll); -NK_LIB float nk_do_scrollbarv(nk_flags *state, struct nk_command_buffer *out, struct nk_rect scroll, int has_scrolling, float offset, float target, float step, float button_pixel_inc, const struct nk_style_scrollbar *style, struct nk_input *in, const struct nk_user_font *font); -NK_LIB float nk_do_scrollbarh(nk_flags *state, struct nk_command_buffer *out, struct nk_rect scroll, int has_scrolling, float offset, float target, float step, float button_pixel_inc, const struct nk_style_scrollbar *style, struct nk_input *in, const struct nk_user_font *font); - -/* selectable */ -NK_LIB void nk_draw_selectable(struct nk_command_buffer *out, nk_flags state, const struct nk_style_selectable *style, nk_bool active, const struct nk_rect *bounds, const struct nk_rect *icon, const struct nk_image *img, enum nk_symbol_type sym, const char *string, int len, nk_flags align, const struct nk_user_font *font); -NK_LIB nk_bool nk_do_selectable(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, const char *str, int len, nk_flags align, nk_bool *value, const struct nk_style_selectable *style, const struct nk_input *in, const struct nk_user_font *font); -NK_LIB nk_bool nk_do_selectable_image(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, const char *str, int len, nk_flags align, nk_bool *value, const struct nk_image *img, const struct nk_style_selectable *style, const struct nk_input *in, const struct nk_user_font *font); - -/* edit */ -NK_LIB void nk_edit_draw_text(struct nk_command_buffer *out, const struct nk_style_edit *style, float pos_x, float pos_y, float x_offset, const char *text, int byte_len, float row_height, const struct nk_user_font *font, struct nk_color background, struct nk_color foreground, nk_bool is_selected); -NK_LIB nk_flags nk_do_edit(nk_flags *state, struct nk_command_buffer *out, struct nk_rect bounds, nk_flags flags, nk_plugin_filter filter, struct nk_text_edit *edit, const struct nk_style_edit *style, struct nk_input *in, const struct nk_user_font *font); - -/* color-picker */ -NK_LIB nk_bool nk_color_picker_behavior(nk_flags *state, const struct nk_rect *bounds, const struct nk_rect *matrix, const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar, struct nk_colorf *color, const struct nk_input *in); -NK_LIB void nk_draw_color_picker(struct nk_command_buffer *o, const struct nk_rect *matrix, const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar, struct nk_colorf col); -NK_LIB nk_bool nk_do_color_picker(nk_flags *state, struct nk_command_buffer *out, struct nk_colorf *col, enum nk_color_format fmt, struct nk_rect bounds, struct nk_vec2 padding, const struct nk_input *in, const struct nk_user_font *font); - -/* property */ -enum nk_property_status { - NK_PROPERTY_DEFAULT, - NK_PROPERTY_EDIT, - NK_PROPERTY_DRAG -}; -enum nk_property_filter { - NK_FILTER_INT, - NK_FILTER_FLOAT -}; -enum nk_property_kind { - NK_PROPERTY_INT, - NK_PROPERTY_FLOAT, - NK_PROPERTY_DOUBLE -}; -union nk_property { - int i; - float f; - double d; -}; -struct nk_property_variant { - enum nk_property_kind kind; - union nk_property value; - union nk_property min_value; - union nk_property max_value; - union nk_property step; -}; -NK_LIB struct nk_property_variant nk_property_variant_int(int value, int min_value, int max_value, int step); -NK_LIB struct nk_property_variant nk_property_variant_float(float value, float min_value, float max_value, float step); -NK_LIB struct nk_property_variant nk_property_variant_double(double value, double min_value, double max_value, double step); - -NK_LIB void nk_drag_behavior(nk_flags *state, const struct nk_input *in, struct nk_rect drag, struct nk_property_variant *variant, float inc_per_pixel); -NK_LIB void nk_property_behavior(nk_flags *ws, const struct nk_input *in, struct nk_rect property, struct nk_rect label, struct nk_rect edit, struct nk_rect empty, int *state, struct nk_property_variant *variant, float inc_per_pixel); -NK_LIB void nk_draw_property(struct nk_command_buffer *out, const struct nk_style_property *style, const struct nk_rect *bounds, const struct nk_rect *label, nk_flags state, const char *name, int len, const struct nk_user_font *font); -NK_LIB void nk_do_property(nk_flags *ws, struct nk_command_buffer *out, struct nk_rect property, const char *name, struct nk_property_variant *variant, float inc_per_pixel, char *buffer, int *len, int *state, int *cursor, int *select_begin, int *select_end, const struct nk_style_property *style, enum nk_property_filter filter, struct nk_input *in, const struct nk_user_font *font, struct nk_text_edit *text_edit, enum nk_button_behavior behavior); -NK_LIB void nk_property(struct nk_context *ctx, const char *name, struct nk_property_variant *variant, float inc_per_pixel, const enum nk_property_filter filter); - -#ifdef NK_INCLUDE_FONT_BAKING - -#define STB_RECT_PACK_IMPLEMENTATION -#define STB_TRUETYPE_IMPLEMENTATION - -/* Allow consumer to define own STBTT_malloc/STBTT_free, and use the font atlas' allocator otherwise */ -#ifndef STBTT_malloc -static void* -nk_stbtt_malloc(nk_size size, void *user_data) { - struct nk_allocator *alloc = (struct nk_allocator *) user_data; - return alloc->alloc(alloc->userdata, 0, size); -} - -static void -nk_stbtt_free(void *ptr, void *user_data) { - struct nk_allocator *alloc = (struct nk_allocator *) user_data; - alloc->free(alloc->userdata, ptr); -} - -#define STBTT_malloc(x,u) nk_stbtt_malloc(x,u) -#define STBTT_free(x,u) nk_stbtt_free(x,u) - -#endif /* STBTT_malloc */ - -#endif /* NK_INCLUDE_FONT_BAKING */ - -#endif - - - - - -/* =============================================================== - * - * MATH - * - * ===============================================================*/ -/*/// ### Math -/// Since nuklear is supposed to work on all systems providing floating point -/// math without any dependencies I also had to implement my own math functions -/// for sqrt, sin and cos. Since the actual highly accurate implementations for -/// the standard library functions are quite complex and I do not need high -/// precision for my use cases I use approximations. -/// -/// Sqrt -/// ---- -/// For square root nuklear uses the famous fast inverse square root: -/// https://en.wikipedia.org/wiki/Fast_inverse_square_root with -/// slightly tweaked magic constant. While on today's hardware it is -/// probably not faster it is still fast and accurate enough for -/// nuklear's use cases. IMPORTANT: this requires float format IEEE 754 -/// -/// Sine/Cosine -/// ----------- -/// All constants inside both function are generated Remez's minimax -/// approximations for value range 0...2*PI. The reason why I decided to -/// approximate exactly that range is that nuklear only needs sine and -/// cosine to generate circles which only requires that exact range. -/// In addition I used Remez instead of Taylor for additional precision: -/// www.lolengine.net/blog/2011/12/21/better-function-approximations. -/// -/// The tool I used to generate constants for both sine and cosine -/// (it can actually approximate a lot more functions) can be -/// found here: www.lolengine.net/wiki/oss/lolremez -*/ -#ifndef NK_INV_SQRT -#define NK_INV_SQRT nk_inv_sqrt -NK_LIB float -nk_inv_sqrt(float n) -{ - float x2; - const float threehalfs = 1.5f; - union {nk_uint i; float f;} conv = {0}; - conv.f = n; - x2 = n * 0.5f; - conv.i = 0x5f375A84 - (conv.i >> 1); - conv.f = conv.f * (threehalfs - (x2 * conv.f * conv.f)); - return conv.f; -} -#endif -#ifndef NK_SIN -#define NK_SIN nk_sin -NK_LIB float -nk_sin(float x) -{ - NK_STORAGE const float a0 = +1.91059300966915117e-31f; - NK_STORAGE const float a1 = +1.00086760103908896f; - NK_STORAGE const float a2 = -1.21276126894734565e-2f; - NK_STORAGE const float a3 = -1.38078780785773762e-1f; - NK_STORAGE const float a4 = -2.67353392911981221e-2f; - NK_STORAGE const float a5 = +2.08026600266304389e-2f; - NK_STORAGE const float a6 = -3.03996055049204407e-3f; - NK_STORAGE const float a7 = +1.38235642404333740e-4f; - return a0 + x*(a1 + x*(a2 + x*(a3 + x*(a4 + x*(a5 + x*(a6 + x*a7)))))); -} -#endif -#ifndef NK_COS -#define NK_COS nk_cos -NK_LIB float -nk_cos(float x) -{ - /* New implementation. Also generated using lolremez. */ - /* Old version significantly deviated from expected results. */ - NK_STORAGE const float a0 = 9.9995999154986614e-1f; - NK_STORAGE const float a1 = 1.2548995793001028e-3f; - NK_STORAGE const float a2 = -5.0648546280678015e-1f; - NK_STORAGE const float a3 = 1.2942246466519995e-2f; - NK_STORAGE const float a4 = 2.8668384702547972e-2f; - NK_STORAGE const float a5 = 7.3726485210586547e-3f; - NK_STORAGE const float a6 = -3.8510875386947414e-3f; - NK_STORAGE const float a7 = 4.7196604604366623e-4f; - NK_STORAGE const float a8 = -1.8776444013090451e-5f; - return a0 + x*(a1 + x*(a2 + x*(a3 + x*(a4 + x*(a5 + x*(a6 + x*(a7 + x*a8))))))); -} -#endif -NK_LIB nk_uint -nk_round_up_pow2(nk_uint v) -{ - v--; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - v++; - return v; -} -NK_LIB double -nk_pow(double x, int n) -{ - /* check the sign of n */ - double r = 1; - int plus = n >= 0; - n = (plus) ? n : -n; - while (n > 0) { - if ((n & 1) == 1) - r *= x; - n /= 2; - x *= x; - } - return plus ? r : 1.0 / r; -} -NK_LIB int -nk_ifloord(double x) -{ - x = (double)((int)x - ((x < 0.0) ? 1 : 0)); - return (int)x; -} -NK_LIB int -nk_ifloorf(float x) -{ - x = (float)((int)x - ((x < 0.0f) ? 1 : 0)); - return (int)x; -} -NK_LIB int -nk_iceilf(float x) -{ - if (x >= 0) { - int i = (int)x; - return (x > i) ? i+1: i; - } else { - int t = (int)x; - float r = x - (float)t; - return (r > 0.0f) ? t+1: t; - } -} -NK_LIB int -nk_log10(double n) -{ - int neg; - int ret; - int exp = 0; - - neg = (n < 0) ? 1 : 0; - ret = (neg) ? (int)-n : (int)n; - while ((ret / 10) > 0) { - ret /= 10; - exp++; - } - if (neg) exp = -exp; - return exp; -} -NK_API struct nk_rect -nk_get_null_rect(void) -{ - return nk_null_rect; -} -NK_API struct nk_rect -nk_rect(float x, float y, float w, float h) -{ - struct nk_rect r; - r.x = x; r.y = y; - r.w = w; r.h = h; - return r; -} -NK_API struct nk_rect -nk_recti(int x, int y, int w, int h) -{ - struct nk_rect r; - r.x = (float)x; - r.y = (float)y; - r.w = (float)w; - r.h = (float)h; - return r; -} -NK_API struct nk_rect -nk_recta(struct nk_vec2 pos, struct nk_vec2 size) -{ - return nk_rect(pos.x, pos.y, size.x, size.y); -} -NK_API struct nk_rect -nk_rectv(const float *r) -{ - return nk_rect(r[0], r[1], r[2], r[3]); -} -NK_API struct nk_rect -nk_rectiv(const int *r) -{ - return nk_recti(r[0], r[1], r[2], r[3]); -} -NK_API struct nk_vec2 -nk_rect_pos(struct nk_rect r) -{ - struct nk_vec2 ret; - ret.x = r.x; ret.y = r.y; - return ret; -} -NK_API struct nk_vec2 -nk_rect_size(struct nk_rect r) -{ - struct nk_vec2 ret; - ret.x = r.w; ret.y = r.h; - return ret; -} -NK_LIB struct nk_rect -nk_shrink_rect(struct nk_rect r, float amount) -{ - struct nk_rect res; - r.w = NK_MAX(r.w, 2 * amount); - r.h = NK_MAX(r.h, 2 * amount); - res.x = r.x + amount; - res.y = r.y + amount; - res.w = r.w - 2 * amount; - res.h = r.h - 2 * amount; - return res; -} -NK_LIB struct nk_rect -nk_pad_rect(struct nk_rect r, struct nk_vec2 pad) -{ - r.w = NK_MAX(r.w, 2 * pad.x); - r.h = NK_MAX(r.h, 2 * pad.y); - r.x += pad.x; r.y += pad.y; - r.w -= 2 * pad.x; - r.h -= 2 * pad.y; - return r; -} -NK_API struct nk_vec2 -nk_vec2(float x, float y) -{ - struct nk_vec2 ret; - ret.x = x; ret.y = y; - return ret; -} -NK_API struct nk_vec2 -nk_vec2i(int x, int y) -{ - struct nk_vec2 ret; - ret.x = (float)x; - ret.y = (float)y; - return ret; -} -NK_API struct nk_vec2 -nk_vec2v(const float *v) -{ - return nk_vec2(v[0], v[1]); -} -NK_API struct nk_vec2 -nk_vec2iv(const int *v) -{ - return nk_vec2i(v[0], v[1]); -} -NK_LIB void -nk_unify(struct nk_rect *clip, const struct nk_rect *a, float x0, float y0, - float x1, float y1) -{ - NK_ASSERT(a); - NK_ASSERT(clip); - clip->x = NK_MAX(a->x, x0); - clip->y = NK_MAX(a->y, y0); - clip->w = NK_MIN(a->x + a->w, x1) - clip->x; - clip->h = NK_MIN(a->y + a->h, y1) - clip->y; - clip->w = NK_MAX(0, clip->w); - clip->h = NK_MAX(0, clip->h); -} - -NK_API void -nk_triangle_from_direction(struct nk_vec2 *result, struct nk_rect r, - float pad_x, float pad_y, enum nk_heading direction) -{ - float w_half, h_half; - NK_ASSERT(result); - - r.w = NK_MAX(2 * pad_x, r.w); - r.h = NK_MAX(2 * pad_y, r.h); - r.w = r.w - 2 * pad_x; - r.h = r.h - 2 * pad_y; - - r.x = r.x + pad_x; - r.y = r.y + pad_y; - - w_half = r.w / 2.0f; - h_half = r.h / 2.0f; - - if (direction == NK_UP) { - result[0] = nk_vec2(r.x + w_half, r.y); - result[1] = nk_vec2(r.x + r.w, r.y + r.h); - result[2] = nk_vec2(r.x, r.y + r.h); - } else if (direction == NK_RIGHT) { - result[0] = nk_vec2(r.x, r.y); - result[1] = nk_vec2(r.x + r.w, r.y + h_half); - result[2] = nk_vec2(r.x, r.y + r.h); - } else if (direction == NK_DOWN) { - result[0] = nk_vec2(r.x, r.y); - result[1] = nk_vec2(r.x + r.w, r.y); - result[2] = nk_vec2(r.x + w_half, r.y + r.h); - } else { - result[0] = nk_vec2(r.x, r.y + h_half); - result[1] = nk_vec2(r.x + r.w, r.y); - result[2] = nk_vec2(r.x + r.w, r.y + r.h); - } -} - - - - - -/* =============================================================== - * - * UTIL - * - * ===============================================================*/ -NK_INTERN int nk_str_match_here(const char *regexp, const char *text); -NK_INTERN int nk_str_match_star(int c, const char *regexp, const char *text); -NK_LIB nk_bool nk_is_lower(int c) {return (c >= 'a' && c <= 'z') || (c >= 0xE0 && c <= 0xFF);} -NK_LIB nk_bool nk_is_upper(int c){return (c >= 'A' && c <= 'Z') || (c >= 0xC0 && c <= 0xDF);} -NK_LIB int nk_to_upper(int c) {return (c >= 'a' && c <= 'z') ? (c - ('a' - 'A')) : c;} -NK_LIB int nk_to_lower(int c) {return (c >= 'A' && c <= 'Z') ? (c - ('a' + 'A')) : c;} - -#ifndef NK_MEMCPY -#define NK_MEMCPY nk_memcopy -NK_LIB void* -nk_memcopy(void *dst0, const void *src0, nk_size length) -{ - nk_ptr t; - char *dst = (char*)dst0; - const char *src = (const char*)src0; - if (length == 0 || dst == src) - goto done; - - #define nk_word int - #define nk_wsize sizeof(nk_word) - #define nk_wmask (nk_wsize-1) - #define NK_TLOOP(s) if (t) NK_TLOOP1(s) - #define NK_TLOOP1(s) do { s; } while (--t) - - if (dst < src) { - t = (nk_ptr)src; /* only need low bits */ - if ((t | (nk_ptr)dst) & nk_wmask) { - if ((t ^ (nk_ptr)dst) & nk_wmask || length < nk_wsize) - t = length; - else - t = nk_wsize - (t & nk_wmask); - length -= t; - NK_TLOOP1(*dst++ = *src++); - } - t = length / nk_wsize; - NK_TLOOP(*(nk_word*)(void*)dst = *(const nk_word*)(const void*)src; - src += nk_wsize; dst += nk_wsize); - t = length & nk_wmask; - NK_TLOOP(*dst++ = *src++); - } else { - src += length; - dst += length; - t = (nk_ptr)src; - if ((t | (nk_ptr)dst) & nk_wmask) { - if ((t ^ (nk_ptr)dst) & nk_wmask || length <= nk_wsize) - t = length; - else - t &= nk_wmask; - length -= t; - NK_TLOOP1(*--dst = *--src); - } - t = length / nk_wsize; - NK_TLOOP(src -= nk_wsize; dst -= nk_wsize; - *(nk_word*)(void*)dst = *(const nk_word*)(const void*)src); - t = length & nk_wmask; - NK_TLOOP(*--dst = *--src); - } - #undef nk_word - #undef nk_wsize - #undef nk_wmask - #undef NK_TLOOP - #undef NK_TLOOP1 -done: - return (dst0); -} -#endif -#ifndef NK_MEMSET -#define NK_MEMSET nk_memset -NK_LIB void -nk_memset(void *ptr, int c0, nk_size size) -{ - #define nk_word unsigned - #define nk_wsize sizeof(nk_word) - #define nk_wmask (nk_wsize - 1) - nk_byte *dst = (nk_byte*)ptr; - unsigned c = 0; - nk_size t = 0; - - if ((c = (nk_byte)c0) != 0) { - c = (c << 8) | c; /* at least 16-bits */ - if (sizeof(unsigned int) > 2) - c = (c << 16) | c; /* at least 32-bits*/ - } - - /* too small of a word count */ - dst = (nk_byte*)ptr; - if (size < 3 * nk_wsize) { - while (size--) *dst++ = (nk_byte)c0; - return; - } - - /* align destination */ - if ((t = NK_PTR_TO_UINT(dst) & nk_wmask) != 0) { - t = nk_wsize -t; - size -= t; - do { - *dst++ = (nk_byte)c0; - } while (--t != 0); - } - - /* fill word */ - t = size / nk_wsize; - do { - *(nk_word*)((void*)dst) = c; - dst += nk_wsize; - } while (--t != 0); - - /* fill trailing bytes */ - t = (size & nk_wmask); - if (t != 0) { - do { - *dst++ = (nk_byte)c0; - } while (--t != 0); - } - - #undef nk_word - #undef nk_wsize - #undef nk_wmask -} -#endif -NK_LIB void -nk_zero(void *ptr, nk_size size) -{ - NK_ASSERT(ptr); - NK_MEMSET(ptr, 0, size); -} -NK_API int -nk_strlen(const char *str) -{ - int siz = 0; - NK_ASSERT(str); - while (str && *str++ != '\0') siz++; - return siz; -} -NK_API int -nk_strtoi(const char *str, const char **endptr) -{ - int neg = 1; - const char *p = str; - int value = 0; - - NK_ASSERT(str); - if (!str) return 0; - - /* skip whitespace */ - while (*p == ' ') p++; - if (*p == '-') { - neg = -1; - p++; - } - while (*p && *p >= '0' && *p <= '9') { - value = value * 10 + (int) (*p - '0'); - p++; - } - if (endptr) - *endptr = p; - return neg*value; -} -NK_API double -nk_strtod(const char *str, const char **endptr) -{ - double m; - double neg = 1.0; - const char *p = str; - double value = 0; - double number = 0; - - NK_ASSERT(str); - if (!str) return 0; - - /* skip whitespace */ - while (*p == ' ') p++; - if (*p == '-') { - neg = -1.0; - p++; - } - - while (*p && *p != '.' && *p != 'e') { - value = value * 10.0 + (double) (*p - '0'); - p++; - } - - if (*p == '.') { - p++; - for(m = 0.1; *p && *p != 'e'; p++ ) { - value = value + (double) (*p - '0') * m; - m *= 0.1; - } - } - if (*p == 'e') { - int i, pow, div; - p++; - if (*p == '-') { - div = nk_true; - p++; - } else if (*p == '+') { - div = nk_false; - p++; - } else div = nk_false; - - for (pow = 0; *p; p++) - pow = pow * 10 + (int) (*p - '0'); - - for (m = 1.0, i = 0; i < pow; i++) - m *= 10.0; - - if (div) - value /= m; - else value *= m; - } - number = value * neg; - if (endptr) - *endptr = p; - return number; -} -NK_API float -nk_strtof(const char *str, const char **endptr) -{ - float float_value; - double double_value; - double_value = NK_STRTOD(str, endptr); - float_value = (float)double_value; - return float_value; -} -NK_API int -nk_stricmp(const char *s1, const char *s2) -{ - nk_int c1,c2,d; - do { - c1 = *s1++; - c2 = *s2++; - d = c1 - c2; - while (d) { - if (c1 <= 'Z' && c1 >= 'A') { - d += ('a' - 'A'); - if (!d) break; - } - if (c2 <= 'Z' && c2 >= 'A') { - d -= ('a' - 'A'); - if (!d) break; - } - return ((d >= 0) << 1) - 1; - } - } while (c1); - return 0; -} -NK_API int -nk_stricmpn(const char *s1, const char *s2, int n) -{ - int c1,c2,d; - NK_ASSERT(n >= 0); - do { - c1 = *s1++; - c2 = *s2++; - if (!n--) return 0; - - d = c1 - c2; - while (d) { - if (c1 <= 'Z' && c1 >= 'A') { - d += ('a' - 'A'); - if (!d) break; - } - if (c2 <= 'Z' && c2 >= 'A') { - d -= ('a' - 'A'); - if (!d) break; - } - return ((d >= 0) << 1) - 1; - } - } while (c1); - return 0; -} -NK_INTERN int -nk_str_match_here(const char *regexp, const char *text) -{ - if (regexp[0] == '\0') - return 1; - if (regexp[1] == '*') - return nk_str_match_star(regexp[0], regexp+2, text); - if (regexp[0] == '$' && regexp[1] == '\0') - return *text == '\0'; - if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text)) - return nk_str_match_here(regexp+1, text+1); - return 0; -} -NK_INTERN int -nk_str_match_star(int c, const char *regexp, const char *text) -{ - do {/* a '* matches zero or more instances */ - if (nk_str_match_here(regexp, text)) - return 1; - } while (*text != '\0' && (*text++ == c || c == '.')); - return 0; -} -NK_API int -nk_strfilter(const char *text, const char *regexp) -{ - /* - c matches any literal character c - . matches any single character - ^ matches the beginning of the input string - $ matches the end of the input string - * matches zero or more occurrences of the previous character*/ - if (regexp[0] == '^') - return nk_str_match_here(regexp+1, text); - do { /* must look even if string is empty */ - if (nk_str_match_here(regexp, text)) - return 1; - } while (*text++ != '\0'); - return 0; -} -NK_API int -nk_strmatch_fuzzy_text(const char *str, int str_len, - const char *pattern, int *out_score) -{ - /* Returns true if each character in pattern is found sequentially within str - * if found then out_score is also set. Score value has no intrinsic meaning. - * Range varies with pattern. Can only compare scores with same search pattern. */ - - /* bonus for adjacent matches */ - #define NK_ADJACENCY_BONUS 5 - /* bonus if match occurs after a separator */ - #define NK_SEPARATOR_BONUS 10 - /* bonus if match is uppercase and prev is lower */ - #define NK_CAMEL_BONUS 10 - /* penalty applied for every letter in str before the first match */ - #define NK_LEADING_LETTER_PENALTY (-3) - /* maximum penalty for leading letters */ - #define NK_MAX_LEADING_LETTER_PENALTY (-9) - /* penalty for every letter that doesn't matter */ - #define NK_UNMATCHED_LETTER_PENALTY (-1) - - /* loop variables */ - int score = 0; - char const * pattern_iter = pattern; - int str_iter = 0; - int prev_matched = nk_false; - int prev_lower = nk_false; - /* true so if first letter match gets separator bonus*/ - int prev_separator = nk_true; - - /* use "best" matched letter if multiple string letters match the pattern */ - char const * best_letter = 0; - int best_letter_score = 0; - - /* loop over strings */ - NK_ASSERT(str); - NK_ASSERT(pattern); - if (!str || !str_len || !pattern) return 0; - while (str_iter < str_len) - { - const char pattern_letter = *pattern_iter; - const char str_letter = str[str_iter]; - - int next_match = *pattern_iter != '\0' && - nk_to_lower(pattern_letter) == nk_to_lower(str_letter); - int rematch = best_letter && nk_to_upper(*best_letter) == nk_to_upper(str_letter); - - int advanced = next_match && best_letter; - int pattern_repeat = best_letter && *pattern_iter != '\0'; - pattern_repeat = pattern_repeat && - nk_to_lower(*best_letter) == nk_to_lower(pattern_letter); - - if (advanced || pattern_repeat) { - score += best_letter_score; - best_letter = 0; - best_letter_score = 0; - } - - if (next_match || rematch) - { - int new_score = 0; - /* Apply penalty for each letter before the first pattern match */ - if (pattern_iter == pattern) { - int count = (int)(&str[str_iter] - str); - int penalty = NK_LEADING_LETTER_PENALTY * count; - if (penalty < NK_MAX_LEADING_LETTER_PENALTY) - penalty = NK_MAX_LEADING_LETTER_PENALTY; - - score += penalty; - } - - /* apply bonus for consecutive bonuses */ - if (prev_matched) - new_score += NK_ADJACENCY_BONUS; - - /* apply bonus for matches after a separator */ - if (prev_separator) - new_score += NK_SEPARATOR_BONUS; - - /* apply bonus across camel case boundaries */ - if (prev_lower && nk_is_upper(str_letter)) - new_score += NK_CAMEL_BONUS; - - /* update pattern iter IFF the next pattern letter was matched */ - if (next_match) - ++pattern_iter; - - /* update best letter in str which may be for a "next" letter or a rematch */ - if (new_score >= best_letter_score) { - /* apply penalty for now skipped letter */ - if (best_letter != 0) - score += NK_UNMATCHED_LETTER_PENALTY; - - best_letter = &str[str_iter]; - best_letter_score = new_score; - } - prev_matched = nk_true; - } else { - score += NK_UNMATCHED_LETTER_PENALTY; - prev_matched = nk_false; - } - - /* separators should be more easily defined */ - prev_lower = nk_is_lower(str_letter) != 0; - prev_separator = str_letter == '_' || str_letter == ' '; - - ++str_iter; - } - - /* apply score for last match */ - if (best_letter) - score += best_letter_score; - - /* did not match full pattern */ - if (*pattern_iter != '\0') - return nk_false; - - if (out_score) - *out_score = score; - return nk_true; -} -NK_API int -nk_strmatch_fuzzy_string(char const *str, char const *pattern, int *out_score) -{ - return nk_strmatch_fuzzy_text(str, nk_strlen(str), pattern, out_score); -} -NK_LIB int -nk_string_float_limit(char *string, int prec) -{ - int dot = 0; - char *c = string; - while (*c) { - if (*c == '.') { - dot = 1; - c++; - continue; - } - if (dot == (prec+1)) { - *c = 0; - break; - } - if (dot > 0) dot++; - c++; - } - return (int)(c - string); -} -NK_INTERN void -nk_strrev_ascii(char *s) -{ - int len = nk_strlen(s); - int end = len / 2; - int i = 0; - char t; - for (; i < end; ++i) { - t = s[i]; - s[i] = s[len - 1 - i]; - s[len -1 - i] = t; - } -} -NK_LIB char* -nk_itoa(char *s, long n) -{ - long i = 0; - if (n == 0) { - s[i++] = '0'; - s[i] = 0; - return s; - } - if (n < 0) { - s[i++] = '-'; - n = -n; - } - while (n > 0) { - s[i++] = (char)('0' + (n % 10)); - n /= 10; - } - s[i] = 0; - if (s[0] == '-') - ++s; - - nk_strrev_ascii(s); - return s; -} -#ifndef NK_DTOA -#define NK_DTOA nk_dtoa -NK_LIB char* -nk_dtoa(char *s, double n) -{ - int useExp = 0; - int digit = 0, m = 0, m1 = 0; - char *c = s; - int neg = 0; - - NK_ASSERT(s); - if (!s) return 0; - - if (n == 0.0) { - s[0] = '0'; s[1] = '\0'; - return s; - } - - neg = (n < 0); - if (neg) n = -n; - - /* calculate magnitude */ - m = nk_log10(n); - useExp = (m >= 14 || (neg && m >= 9) || m <= -9); - if (neg) *(c++) = '-'; - - /* set up for scientific notation */ - if (useExp) { - if (m < 0) - m -= 1; - n = n / (double)nk_pow(10.0, m); - m1 = m; - m = 0; - } - if (m < 1.0) { - m = 0; - } - - /* convert the number */ - while (n > NK_FLOAT_PRECISION || m >= 0) { - double weight = nk_pow(10.0, m); - if (weight > 0) { - double t = (double)n / weight; - digit = nk_ifloord(t); - n -= ((double)digit * weight); - *(c++) = (char)('0' + (char)digit); - } - if (m == 0 && n > 0) - *(c++) = '.'; - m--; - } - - if (useExp) { - /* convert the exponent */ - int i, j; - *(c++) = 'e'; - if (m1 > 0) { - *(c++) = '+'; - } else { - *(c++) = '-'; - m1 = -m1; - } - m = 0; - while (m1 > 0) { - *(c++) = (char)('0' + (char)(m1 % 10)); - m1 /= 10; - m++; - } - c -= m; - for (i = 0, j = m-1; i= buf_size) break; - iter++; - - /* flag arguments */ - while (*iter) { - if (*iter == '-') flag |= NK_ARG_FLAG_LEFT; - else if (*iter == '+') flag |= NK_ARG_FLAG_PLUS; - else if (*iter == ' ') flag |= NK_ARG_FLAG_SPACE; - else if (*iter == '#') flag |= NK_ARG_FLAG_NUM; - else if (*iter == '0') flag |= NK_ARG_FLAG_ZERO; - else break; - iter++; - } - - /* width argument */ - width = NK_DEFAULT; - if (*iter >= '1' && *iter <= '9') { - const char *end; - width = nk_strtoi(iter, &end); - if (end == iter) - width = -1; - else iter = end; - } else if (*iter == '*') { - width = va_arg(args, int); - iter++; - } - - /* precision argument */ - precision = NK_DEFAULT; - if (*iter == '.') { - iter++; - if (*iter == '*') { - precision = va_arg(args, int); - iter++; - } else { - const char *end; - precision = nk_strtoi(iter, &end); - if (end == iter) - precision = -1; - else iter = end; - } - } - - /* length modifier */ - if (*iter == 'h') { - if (*(iter+1) == 'h') { - arg_type = NK_ARG_TYPE_CHAR; - iter++; - } else arg_type = NK_ARG_TYPE_SHORT; - iter++; - } else if (*iter == 'l') { - arg_type = NK_ARG_TYPE_LONG; - iter++; - } else arg_type = NK_ARG_TYPE_DEFAULT; - - /* specifier */ - if (*iter == '%') { - NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT); - NK_ASSERT(precision == NK_DEFAULT); - NK_ASSERT(width == NK_DEFAULT); - if (len < buf_size) - buf[len++] = '%'; - } else if (*iter == 's') { - /* string */ - const char *str = va_arg(args, const char*); - NK_ASSERT(str != buf && "buffer and argument are not allowed to overlap!"); - NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT); - NK_ASSERT(precision == NK_DEFAULT); - NK_ASSERT(width == NK_DEFAULT); - if (str == buf) return -1; - while (str && *str && len < buf_size) - buf[len++] = *str++; - } else if (*iter == 'n') { - /* current length callback */ - signed int *n = va_arg(args, int*); - NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT); - NK_ASSERT(precision == NK_DEFAULT); - NK_ASSERT(width == NK_DEFAULT); - if (n) *n = len; - } else if (*iter == 'c' || *iter == 'i' || *iter == 'd') { - /* signed integer */ - long value = 0; - const char *num_iter; - int num_len, num_print, padding; - int cur_precision = NK_MAX(precision, 1); - int cur_width = NK_MAX(width, 0); - - /* retrieve correct value type */ - if (arg_type == NK_ARG_TYPE_CHAR) - value = (signed char)va_arg(args, int); - else if (arg_type == NK_ARG_TYPE_SHORT) - value = (signed short)va_arg(args, int); - else if (arg_type == NK_ARG_TYPE_LONG) - value = va_arg(args, signed long); - else if (*iter == 'c') - value = (unsigned char)va_arg(args, int); - else value = va_arg(args, signed int); - - /* convert number to string */ - nk_itoa(number_buffer, value); - num_len = nk_strlen(number_buffer); - padding = NK_MAX(cur_width - NK_MAX(cur_precision, num_len), 0); - if ((flag & NK_ARG_FLAG_PLUS) || (flag & NK_ARG_FLAG_SPACE)) - padding = NK_MAX(padding-1, 0); - - /* fill left padding up to a total of `width` characters */ - if (!(flag & NK_ARG_FLAG_LEFT)) { - while (padding-- > 0 && (len < buf_size)) { - if ((flag & NK_ARG_FLAG_ZERO) && (precision == NK_DEFAULT)) - buf[len++] = '0'; - else buf[len++] = ' '; - } - } - - /* copy string value representation into buffer */ - if ((flag & NK_ARG_FLAG_PLUS) && value >= 0 && len < buf_size) - buf[len++] = '+'; - else if ((flag & NK_ARG_FLAG_SPACE) && value >= 0 && len < buf_size) - buf[len++] = ' '; - - /* fill up to precision number of digits with '0' */ - num_print = NK_MAX(cur_precision, num_len); - while (precision && (num_print > num_len) && (len < buf_size)) { - buf[len++] = '0'; - num_print--; - } - - /* copy string value representation into buffer */ - num_iter = number_buffer; - while (precision && *num_iter && len < buf_size) - buf[len++] = *num_iter++; - - /* fill right padding up to width characters */ - if (flag & NK_ARG_FLAG_LEFT) { - while ((padding-- > 0) && (len < buf_size)) - buf[len++] = ' '; - } - } else if (*iter == 'o' || *iter == 'x' || *iter == 'X' || *iter == 'u') { - /* unsigned integer */ - unsigned long value = 0; - int num_len = 0, num_print, padding = 0; - int cur_precision = NK_MAX(precision, 1); - int cur_width = NK_MAX(width, 0); - unsigned int base = (*iter == 'o') ? 8: (*iter == 'u')? 10: 16; - - /* print oct/hex/dec value */ - const char *upper_output_format = "0123456789ABCDEF"; - const char *lower_output_format = "0123456789abcdef"; - const char *output_format = (*iter == 'x') ? - lower_output_format: upper_output_format; - - /* retrieve correct value type */ - if (arg_type == NK_ARG_TYPE_CHAR) - value = (unsigned char)va_arg(args, int); - else if (arg_type == NK_ARG_TYPE_SHORT) - value = (unsigned short)va_arg(args, int); - else if (arg_type == NK_ARG_TYPE_LONG) - value = va_arg(args, unsigned long); - else value = va_arg(args, unsigned int); - - do { - /* convert decimal number into hex/oct number */ - int digit = output_format[value % base]; - if (num_len < NK_MAX_NUMBER_BUFFER) - number_buffer[num_len++] = (char)digit; - value /= base; - } while (value > 0); - - num_print = NK_MAX(cur_precision, num_len); - padding = NK_MAX(cur_width - NK_MAX(cur_precision, num_len), 0); - if (flag & NK_ARG_FLAG_NUM) - padding = NK_MAX(padding-1, 0); - - /* fill left padding up to a total of `width` characters */ - if (!(flag & NK_ARG_FLAG_LEFT)) { - while ((padding-- > 0) && (len < buf_size)) { - if ((flag & NK_ARG_FLAG_ZERO) && (precision == NK_DEFAULT)) - buf[len++] = '0'; - else buf[len++] = ' '; - } - } - - /* fill up to precision number of digits */ - if (num_print && (flag & NK_ARG_FLAG_NUM)) { - if ((*iter == 'o') && (len < buf_size)) { - buf[len++] = '0'; - } else if ((*iter == 'x') && ((len+1) < buf_size)) { - buf[len++] = '0'; - buf[len++] = 'x'; - } else if ((*iter == 'X') && ((len+1) < buf_size)) { - buf[len++] = '0'; - buf[len++] = 'X'; - } - } - while (precision && (num_print > num_len) && (len < buf_size)) { - buf[len++] = '0'; - num_print--; - } - - /* reverse number direction */ - while (num_len > 0) { - if (precision && (len < buf_size)) - buf[len++] = number_buffer[num_len-1]; - num_len--; - } - - /* fill right padding up to width characters */ - if (flag & NK_ARG_FLAG_LEFT) { - while ((padding-- > 0) && (len < buf_size)) - buf[len++] = ' '; - } - } else if (*iter == 'f') { - /* floating point */ - const char *num_iter; - int cur_precision = (precision < 0) ? 6: precision; - int prefix, cur_width = NK_MAX(width, 0); - double value = va_arg(args, double); - int num_len = 0, frac_len = 0, dot = 0; - int padding = 0; - - NK_ASSERT(arg_type == NK_ARG_TYPE_DEFAULT); - NK_DTOA(number_buffer, value); - num_len = nk_strlen(number_buffer); - - /* calculate padding */ - num_iter = number_buffer; - while (*num_iter && *num_iter != '.') - num_iter++; - - prefix = (*num_iter == '.')?(int)(num_iter - number_buffer)+1:0; - padding = NK_MAX(cur_width - (prefix + NK_MIN(cur_precision, num_len - prefix)) , 0); - if ((flag & NK_ARG_FLAG_PLUS) || (flag & NK_ARG_FLAG_SPACE)) - padding = NK_MAX(padding-1, 0); - - /* fill left padding up to a total of `width` characters */ - if (!(flag & NK_ARG_FLAG_LEFT)) { - while (padding-- > 0 && (len < buf_size)) { - if (flag & NK_ARG_FLAG_ZERO) - buf[len++] = '0'; - else buf[len++] = ' '; - } - } - - /* copy string value representation into buffer */ - num_iter = number_buffer; - if ((flag & NK_ARG_FLAG_PLUS) && (value >= 0) && (len < buf_size)) - buf[len++] = '+'; - else if ((flag & NK_ARG_FLAG_SPACE) && (value >= 0) && (len < buf_size)) - buf[len++] = ' '; - while (*num_iter) { - if (dot) frac_len++; - if (len < buf_size) - buf[len++] = *num_iter; - if (*num_iter == '.') dot = 1; - if (frac_len >= cur_precision) break; - num_iter++; - } - - /* fill number up to precision */ - while (frac_len < cur_precision) { - if (!dot && len < buf_size) { - buf[len++] = '.'; - dot = 1; - } - if (len < buf_size) - buf[len++] = '0'; - frac_len++; - } - - /* fill right padding up to width characters */ - if (flag & NK_ARG_FLAG_LEFT) { - while ((padding-- > 0) && (len < buf_size)) - buf[len++] = ' '; - } - } else { - /* Specifier not supported: g,G,e,E,p,z */ - NK_ASSERT(0 && "specifier is not supported!"); - return result; - } - } - buf[(len >= buf_size)?(buf_size-1):len] = 0; - result = (len >= buf_size)?-1:len; - return result; -} -#endif -NK_LIB int -nk_strfmt(char *buf, int buf_size, const char *fmt, va_list args) -{ - int result = -1; - NK_ASSERT(buf); - NK_ASSERT(buf_size); - if (!buf || !buf_size || !fmt) return 0; -#ifdef NK_INCLUDE_STANDARD_IO - result = NK_VSNPRINTF(buf, (nk_size)buf_size, fmt, args); - result = (result >= buf_size) ? -1: result; - buf[buf_size-1] = 0; -#else - result = nk_vsnprintf(buf, buf_size, fmt, args); -#endif - return result; -} -#endif -NK_API nk_hash -nk_murmur_hash(const void * key, int len, nk_hash seed) -{ - /* 32-Bit MurmurHash3: https://code.google.com/p/smhasher/wiki/MurmurHash3*/ - #define NK_ROTL(x,r) ((x) << (r) | ((x) >> (32 - r))) - - nk_uint h1 = seed; - nk_uint k1; - const nk_byte *data = (const nk_byte*)key; - const nk_byte *keyptr = data; - nk_byte *k1ptr; - const int bsize = sizeof(k1); - const int nblocks = len/4; - - const nk_uint c1 = 0xcc9e2d51; - const nk_uint c2 = 0x1b873593; - const nk_byte *tail; - int i; - - /* body */ - if (!key) return 0; - for (i = 0; i < nblocks; ++i, keyptr += bsize) { - k1ptr = (nk_byte*)&k1; - k1ptr[0] = keyptr[0]; - k1ptr[1] = keyptr[1]; - k1ptr[2] = keyptr[2]; - k1ptr[3] = keyptr[3]; - - k1 *= c1; - k1 = NK_ROTL(k1,15); - k1 *= c2; - - h1 ^= k1; - h1 = NK_ROTL(h1,13); - h1 = h1*5+0xe6546b64; - } - - /* tail */ - tail = (const nk_byte*)(data + nblocks*4); - k1 = 0; - switch (len & 3) { - case 3: k1 ^= (nk_uint)(tail[2] << 16); /* fallthrough */ - case 2: k1 ^= (nk_uint)(tail[1] << 8u); /* fallthrough */ - case 1: k1 ^= tail[0]; - k1 *= c1; - k1 = NK_ROTL(k1,15); - k1 *= c2; - h1 ^= k1; - break; - default: break; - } - - /* finalization */ - h1 ^= (nk_uint)len; - /* fmix32 */ - h1 ^= h1 >> 16; - h1 *= 0x85ebca6b; - h1 ^= h1 >> 13; - h1 *= 0xc2b2ae35; - h1 ^= h1 >> 16; - - #undef NK_ROTL - return h1; -} -#ifdef NK_INCLUDE_STANDARD_IO -NK_LIB char* -nk_file_load(const char* path, nk_size* siz, struct nk_allocator *alloc) -{ - char *buf; - FILE *fd; - long ret; - - NK_ASSERT(path); - NK_ASSERT(siz); - NK_ASSERT(alloc); - if (!path || !siz || !alloc) - return 0; - - fd = fopen(path, "rb"); - if (!fd) return 0; - fseek(fd, 0, SEEK_END); - ret = ftell(fd); - if (ret < 0) { - fclose(fd); - return 0; - } - *siz = (nk_size)ret; - fseek(fd, 0, SEEK_SET); - buf = (char*)alloc->alloc(alloc->userdata,0, *siz); - NK_ASSERT(buf); - if (!buf) { - fclose(fd); - return 0; - } - *siz = (nk_size)fread(buf, 1,*siz, fd); - fclose(fd); - return buf; -} -#endif -NK_LIB int -nk_text_clamp(const struct nk_user_font *font, const char *text, - int text_len, float space, int *glyphs, float *text_width, - nk_rune *sep_list, int sep_count) -{ - int i = 0; - int glyph_len = 0; - float last_width = 0; - nk_rune unicode = 0; - float width = 0; - int len = 0; - int g = 0; - float s; - - int sep_len = 0; - int sep_g = 0; - float sep_width = 0; - sep_count = NK_MAX(sep_count,0); - - glyph_len = nk_utf_decode(text, &unicode, text_len); - while (glyph_len && (width < space) && (len < text_len)) { - len += glyph_len; - s = font->width(font->userdata, font->height, text, len); - for (i = 0; i < sep_count; ++i) { - if (unicode != sep_list[i]) continue; - sep_width = last_width = width; - sep_g = g+1; - sep_len = len; - break; - } - if (i == sep_count){ - last_width = sep_width = width; - sep_g = g+1; - } - width = s; - glyph_len = nk_utf_decode(&text[len], &unicode, text_len - len); - g++; - } - if (len >= text_len) { - *glyphs = g; - *text_width = last_width; - return len; - } else { - *glyphs = sep_g; - *text_width = sep_width; - return (!sep_len) ? len: sep_len; - } -} -NK_LIB struct nk_vec2 -nk_text_calculate_text_bounds(const struct nk_user_font *font, - const char *begin, int byte_len, float row_height, const char **remaining, - struct nk_vec2 *out_offset, int *glyphs, int op) -{ - float line_height = row_height; - struct nk_vec2 text_size = nk_vec2(0,0); - float line_width = 0.0f; - - float glyph_width; - int glyph_len = 0; - nk_rune unicode = 0; - int text_len = 0; - if (!begin || byte_len <= 0 || !font) - return nk_vec2(0,row_height); - - glyph_len = nk_utf_decode(begin, &unicode, byte_len); - if (!glyph_len) return text_size; - glyph_width = font->width(font->userdata, font->height, begin, glyph_len); - - *glyphs = 0; - while ((text_len < byte_len) && glyph_len) { - if (unicode == '\n') { - text_size.x = NK_MAX(text_size.x, line_width); - text_size.y += line_height; - line_width = 0; - *glyphs+=1; - if (op == NK_STOP_ON_NEW_LINE) - break; - - text_len++; - glyph_len = nk_utf_decode(begin + text_len, &unicode, byte_len-text_len); - continue; - } - - if (unicode == '\r') { - text_len++; - *glyphs+=1; - glyph_len = nk_utf_decode(begin + text_len, &unicode, byte_len-text_len); - continue; - } - - *glyphs = *glyphs + 1; - text_len += glyph_len; - line_width += (float)glyph_width; - glyph_len = nk_utf_decode(begin + text_len, &unicode, byte_len-text_len); - glyph_width = font->width(font->userdata, font->height, begin+text_len, glyph_len); - continue; - } - - if (text_size.x < line_width) - text_size.x = line_width; - if (out_offset) - *out_offset = nk_vec2(line_width, text_size.y + line_height); - if (line_width > 0 || text_size.y == 0.0f) - text_size.y += line_height; - if (remaining) - *remaining = begin+text_len; - return text_size; -} - - - - - -/* ============================================================== - * - * COLOR - * - * ===============================================================*/ -NK_INTERN int -nk_parse_hex(const char *p, int length) -{ - int i = 0; - int len = 0; - while (len < length) { - i <<= 4; - if (p[len] >= 'a' && p[len] <= 'f') - i += ((p[len] - 'a') + 10); - else if (p[len] >= 'A' && p[len] <= 'F') - i += ((p[len] - 'A') + 10); - else i += (p[len] - '0'); - len++; - } - return i; -} -NK_API struct nk_color -nk_rgba(int r, int g, int b, int a) -{ - struct nk_color ret; - ret.r = (nk_byte)NK_CLAMP(0, r, 255); - ret.g = (nk_byte)NK_CLAMP(0, g, 255); - ret.b = (nk_byte)NK_CLAMP(0, b, 255); - ret.a = (nk_byte)NK_CLAMP(0, a, 255); - return ret; -} -NK_API struct nk_color -nk_rgb_hex(const char *rgb) -{ - struct nk_color col; - const char *c = rgb; - if (*c == '#') c++; - col.r = (nk_byte)nk_parse_hex(c, 2); - col.g = (nk_byte)nk_parse_hex(c+2, 2); - col.b = (nk_byte)nk_parse_hex(c+4, 2); - col.a = 255; - return col; -} -NK_API struct nk_color -nk_rgba_hex(const char *rgb) -{ - struct nk_color col; - const char *c = rgb; - if (*c == '#') c++; - col.r = (nk_byte)nk_parse_hex(c, 2); - col.g = (nk_byte)nk_parse_hex(c+2, 2); - col.b = (nk_byte)nk_parse_hex(c+4, 2); - col.a = (nk_byte)nk_parse_hex(c+6, 2); - return col; -} -NK_API void -nk_color_hex_rgba(char *output, struct nk_color col) -{ - #define NK_TO_HEX(i) ((i) <= 9 ? '0' + (i): 'A' - 10 + (i)) - output[0] = (char)NK_TO_HEX((col.r & 0xF0) >> 4); - output[1] = (char)NK_TO_HEX((col.r & 0x0F)); - output[2] = (char)NK_TO_HEX((col.g & 0xF0) >> 4); - output[3] = (char)NK_TO_HEX((col.g & 0x0F)); - output[4] = (char)NK_TO_HEX((col.b & 0xF0) >> 4); - output[5] = (char)NK_TO_HEX((col.b & 0x0F)); - output[6] = (char)NK_TO_HEX((col.a & 0xF0) >> 4); - output[7] = (char)NK_TO_HEX((col.a & 0x0F)); - output[8] = '\0'; - #undef NK_TO_HEX -} -NK_API void -nk_color_hex_rgb(char *output, struct nk_color col) -{ - #define NK_TO_HEX(i) ((i) <= 9 ? '0' + (i): 'A' - 10 + (i)) - output[0] = (char)NK_TO_HEX((col.r & 0xF0) >> 4); - output[1] = (char)NK_TO_HEX((col.r & 0x0F)); - output[2] = (char)NK_TO_HEX((col.g & 0xF0) >> 4); - output[3] = (char)NK_TO_HEX((col.g & 0x0F)); - output[4] = (char)NK_TO_HEX((col.b & 0xF0) >> 4); - output[5] = (char)NK_TO_HEX((col.b & 0x0F)); - output[6] = '\0'; - #undef NK_TO_HEX -} -NK_API struct nk_color -nk_rgba_iv(const int *c) -{ - return nk_rgba(c[0], c[1], c[2], c[3]); -} -NK_API struct nk_color -nk_rgba_bv(const nk_byte *c) -{ - return nk_rgba(c[0], c[1], c[2], c[3]); -} -NK_API struct nk_color -nk_rgb(int r, int g, int b) -{ - struct nk_color ret; - ret.r = (nk_byte)NK_CLAMP(0, r, 255); - ret.g = (nk_byte)NK_CLAMP(0, g, 255); - ret.b = (nk_byte)NK_CLAMP(0, b, 255); - ret.a = (nk_byte)255; - return ret; -} -NK_API struct nk_color -nk_rgb_iv(const int *c) -{ - return nk_rgb(c[0], c[1], c[2]); -} -NK_API struct nk_color -nk_rgb_bv(const nk_byte* c) -{ - return nk_rgb(c[0], c[1], c[2]); -} -NK_API struct nk_color -nk_rgba_u32(nk_uint in) -{ - struct nk_color ret; - ret.r = (in & 0xFF); - ret.g = ((in >> 8) & 0xFF); - ret.b = ((in >> 16) & 0xFF); - ret.a = (nk_byte)((in >> 24) & 0xFF); - return ret; -} -NK_API struct nk_color -nk_rgba_f(float r, float g, float b, float a) -{ - struct nk_color ret; - ret.r = (nk_byte)(NK_SATURATE(r) * 255.0f); - ret.g = (nk_byte)(NK_SATURATE(g) * 255.0f); - ret.b = (nk_byte)(NK_SATURATE(b) * 255.0f); - ret.a = (nk_byte)(NK_SATURATE(a) * 255.0f); - return ret; -} -NK_API struct nk_color -nk_rgba_fv(const float *c) -{ - return nk_rgba_f(c[0], c[1], c[2], c[3]); -} -NK_API struct nk_color -nk_rgba_cf(struct nk_colorf c) -{ - return nk_rgba_f(c.r, c.g, c.b, c.a); -} -NK_API struct nk_color -nk_rgb_f(float r, float g, float b) -{ - struct nk_color ret; - ret.r = (nk_byte)(NK_SATURATE(r) * 255.0f); - ret.g = (nk_byte)(NK_SATURATE(g) * 255.0f); - ret.b = (nk_byte)(NK_SATURATE(b) * 255.0f); - ret.a = 255; - return ret; -} -NK_API struct nk_color -nk_rgb_fv(const float *c) -{ - return nk_rgb_f(c[0], c[1], c[2]); -} -NK_API struct nk_color -nk_rgb_cf(struct nk_colorf c) -{ - return nk_rgb_f(c.r, c.g, c.b); -} -NK_API struct nk_color -nk_hsv(int h, int s, int v) -{ - return nk_hsva(h, s, v, 255); -} -NK_API struct nk_color -nk_hsv_iv(const int *c) -{ - return nk_hsv(c[0], c[1], c[2]); -} -NK_API struct nk_color -nk_hsv_bv(const nk_byte *c) -{ - return nk_hsv(c[0], c[1], c[2]); -} -NK_API struct nk_color -nk_hsv_f(float h, float s, float v) -{ - return nk_hsva_f(h, s, v, 1.0f); -} -NK_API struct nk_color -nk_hsv_fv(const float *c) -{ - return nk_hsv_f(c[0], c[1], c[2]); -} -NK_API struct nk_color -nk_hsva(int h, int s, int v, int a) -{ - float hf = ((float)NK_CLAMP(0, h, 255)) / 255.0f; - float sf = ((float)NK_CLAMP(0, s, 255)) / 255.0f; - float vf = ((float)NK_CLAMP(0, v, 255)) / 255.0f; - float af = ((float)NK_CLAMP(0, a, 255)) / 255.0f; - return nk_hsva_f(hf, sf, vf, af); -} -NK_API struct nk_color -nk_hsva_iv(const int *c) -{ - return nk_hsva(c[0], c[1], c[2], c[3]); -} -NK_API struct nk_color -nk_hsva_bv(const nk_byte *c) -{ - return nk_hsva(c[0], c[1], c[2], c[3]); -} -NK_API struct nk_colorf -nk_hsva_colorf(float h, float s, float v, float a) -{ - int i; - float p, q, t, f; - struct nk_colorf out = {0,0,0,0}; - if (s <= 0.0f) { - out.r = v; out.g = v; out.b = v; out.a = a; - return out; - } - h = h / (60.0f/360.0f); - i = (int)h; - f = h - (float)i; - p = v * (1.0f - s); - q = v * (1.0f - (s * f)); - t = v * (1.0f - s * (1.0f - f)); - - switch (i) { - case 0: default: out.r = v; out.g = t; out.b = p; break; - case 1: out.r = q; out.g = v; out.b = p; break; - case 2: out.r = p; out.g = v; out.b = t; break; - case 3: out.r = p; out.g = q; out.b = v; break; - case 4: out.r = t; out.g = p; out.b = v; break; - case 5: out.r = v; out.g = p; out.b = q; break;} - out.a = a; - return out; -} -NK_API struct nk_colorf -nk_hsva_colorfv(float *c) -{ - return nk_hsva_colorf(c[0], c[1], c[2], c[3]); -} -NK_API struct nk_color -nk_hsva_f(float h, float s, float v, float a) -{ - struct nk_colorf c = nk_hsva_colorf(h, s, v, a); - return nk_rgba_f(c.r, c.g, c.b, c.a); -} -NK_API struct nk_color -nk_hsva_fv(const float *c) -{ - return nk_hsva_f(c[0], c[1], c[2], c[3]); -} -NK_API nk_uint -nk_color_u32(struct nk_color in) -{ - nk_uint out = (nk_uint)in.r; - out |= ((nk_uint)in.g << 8); - out |= ((nk_uint)in.b << 16); - out |= ((nk_uint)in.a << 24); - return out; -} -NK_API void -nk_color_f(float *r, float *g, float *b, float *a, struct nk_color in) -{ - NK_STORAGE const float s = 1.0f/255.0f; - *r = (float)in.r * s; - *g = (float)in.g * s; - *b = (float)in.b * s; - *a = (float)in.a * s; -} -NK_API void -nk_color_fv(float *c, struct nk_color in) -{ - nk_color_f(&c[0], &c[1], &c[2], &c[3], in); -} -NK_API struct nk_colorf -nk_color_cf(struct nk_color in) -{ - struct nk_colorf o; - nk_color_f(&o.r, &o.g, &o.b, &o.a, in); - return o; -} -NK_API void -nk_color_d(double *r, double *g, double *b, double *a, struct nk_color in) -{ - NK_STORAGE const double s = 1.0/255.0; - *r = (double)in.r * s; - *g = (double)in.g * s; - *b = (double)in.b * s; - *a = (double)in.a * s; -} -NK_API void -nk_color_dv(double *c, struct nk_color in) -{ - nk_color_d(&c[0], &c[1], &c[2], &c[3], in); -} -NK_API void -nk_color_hsv_f(float *out_h, float *out_s, float *out_v, struct nk_color in) -{ - float a; - nk_color_hsva_f(out_h, out_s, out_v, &a, in); -} -NK_API void -nk_color_hsv_fv(float *out, struct nk_color in) -{ - float a; - nk_color_hsva_f(&out[0], &out[1], &out[2], &a, in); -} -NK_API void -nk_colorf_hsva_f(float *out_h, float *out_s, - float *out_v, float *out_a, struct nk_colorf in) -{ - float chroma; - float K = 0.0f; - if (in.g < in.b) { - const float t = in.g; in.g = in.b; in.b = t; - K = -1.f; - } - if (in.r < in.g) { - const float t = in.r; in.r = in.g; in.g = t; - K = -2.f/6.0f - K; - } - chroma = in.r - ((in.g < in.b) ? in.g: in.b); - *out_h = NK_ABS(K + (in.g - in.b)/(6.0f * chroma + 1e-20f)); - *out_s = chroma / (in.r + 1e-20f); - *out_v = in.r; - *out_a = in.a; - -} -NK_API void -nk_colorf_hsva_fv(float *hsva, struct nk_colorf in) -{ - nk_colorf_hsva_f(&hsva[0], &hsva[1], &hsva[2], &hsva[3], in); -} -NK_API void -nk_color_hsva_f(float *out_h, float *out_s, - float *out_v, float *out_a, struct nk_color in) -{ - struct nk_colorf col; - nk_color_f(&col.r,&col.g,&col.b,&col.a, in); - nk_colorf_hsva_f(out_h, out_s, out_v, out_a, col); -} -NK_API void -nk_color_hsva_fv(float *out, struct nk_color in) -{ - nk_color_hsva_f(&out[0], &out[1], &out[2], &out[3], in); -} -NK_API void -nk_color_hsva_i(int *out_h, int *out_s, int *out_v, - int *out_a, struct nk_color in) -{ - float h,s,v,a; - nk_color_hsva_f(&h, &s, &v, &a, in); - *out_h = (nk_byte)(h * 255.0f); - *out_s = (nk_byte)(s * 255.0f); - *out_v = (nk_byte)(v * 255.0f); - *out_a = (nk_byte)(a * 255.0f); -} -NK_API void -nk_color_hsva_iv(int *out, struct nk_color in) -{ - nk_color_hsva_i(&out[0], &out[1], &out[2], &out[3], in); -} -NK_API void -nk_color_hsva_bv(nk_byte *out, struct nk_color in) -{ - int tmp[4]; - nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in); - out[0] = (nk_byte)tmp[0]; - out[1] = (nk_byte)tmp[1]; - out[2] = (nk_byte)tmp[2]; - out[3] = (nk_byte)tmp[3]; -} -NK_API void -nk_color_hsva_b(nk_byte *h, nk_byte *s, nk_byte *v, nk_byte *a, struct nk_color in) -{ - int tmp[4]; - nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in); - *h = (nk_byte)tmp[0]; - *s = (nk_byte)tmp[1]; - *v = (nk_byte)tmp[2]; - *a = (nk_byte)tmp[3]; -} -NK_API void -nk_color_hsv_i(int *out_h, int *out_s, int *out_v, struct nk_color in) -{ - int a; - nk_color_hsva_i(out_h, out_s, out_v, &a, in); -} -NK_API void -nk_color_hsv_b(nk_byte *out_h, nk_byte *out_s, nk_byte *out_v, struct nk_color in) -{ - int tmp[4]; - nk_color_hsva_i(&tmp[0], &tmp[1], &tmp[2], &tmp[3], in); - *out_h = (nk_byte)tmp[0]; - *out_s = (nk_byte)tmp[1]; - *out_v = (nk_byte)tmp[2]; -} -NK_API void -nk_color_hsv_iv(int *out, struct nk_color in) -{ - nk_color_hsv_i(&out[0], &out[1], &out[2], in); -} -NK_API void -nk_color_hsv_bv(nk_byte *out, struct nk_color in) -{ - int tmp[4]; - nk_color_hsv_i(&tmp[0], &tmp[1], &tmp[2], in); - out[0] = (nk_byte)tmp[0]; - out[1] = (nk_byte)tmp[1]; - out[2] = (nk_byte)tmp[2]; -} - - - - - -/* =============================================================== - * - * UTF-8 - * - * ===============================================================*/ -NK_GLOBAL const nk_byte nk_utfbyte[NK_UTF_SIZE+1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -NK_GLOBAL const nk_byte nk_utfmask[NK_UTF_SIZE+1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -NK_GLOBAL const nk_uint nk_utfmin[NK_UTF_SIZE+1] = {0, 0, 0x80, 0x800, 0x10000}; -NK_GLOBAL const nk_uint nk_utfmax[NK_UTF_SIZE+1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -NK_INTERN int -nk_utf_validate(nk_rune *u, int i) -{ - NK_ASSERT(u); - if (!u) return 0; - if (!NK_BETWEEN(*u, nk_utfmin[i], nk_utfmax[i]) || - NK_BETWEEN(*u, 0xD800, 0xDFFF)) - *u = NK_UTF_INVALID; - for (i = 1; *u > nk_utfmax[i]; ++i); - return i; -} -NK_INTERN nk_rune -nk_utf_decode_byte(char c, int *i) -{ - NK_ASSERT(i); - if (!i) return 0; - for(*i = 0; *i < (int)NK_LEN(nk_utfmask); ++(*i)) { - if (((nk_byte)c & nk_utfmask[*i]) == nk_utfbyte[*i]) - return (nk_byte)(c & ~nk_utfmask[*i]); - } - return 0; -} -NK_API int -nk_utf_decode(const char *c, nk_rune *u, int clen) -{ - int i, j, len, type=0; - nk_rune udecoded; - - NK_ASSERT(c); - NK_ASSERT(u); - - if (!c || !u) return 0; - if (!clen) return 0; - *u = NK_UTF_INVALID; - - udecoded = nk_utf_decode_byte(c[0], &len); - if (!NK_BETWEEN(len, 1, NK_UTF_SIZE)) - return 1; - - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | nk_utf_decode_byte(c[i], &type); - if (type != 0) - return j; - } - if (j < len) - return 0; - *u = udecoded; - nk_utf_validate(u, len); - return len; -} -NK_INTERN char -nk_utf_encode_byte(nk_rune u, int i) -{ - return (char)((nk_utfbyte[i]) | ((nk_byte)u & ~nk_utfmask[i])); -} -NK_API int -nk_utf_encode(nk_rune u, char *c, int clen) -{ - int len, i; - len = nk_utf_validate(&u, 0); - if (clen < len || !len || len > NK_UTF_SIZE) - return 0; - - for (i = len - 1; i != 0; --i) { - c[i] = nk_utf_encode_byte(u, 0); - u >>= 6; - } - c[0] = nk_utf_encode_byte(u, len); - return len; -} -NK_API int -nk_utf_len(const char *str, int len) -{ - const char *text; - int glyphs = 0; - int text_len; - int glyph_len; - int src_len = 0; - nk_rune unicode; - - NK_ASSERT(str); - if (!str || !len) return 0; - - text = str; - text_len = len; - glyph_len = nk_utf_decode(text, &unicode, text_len); - while (glyph_len && src_len < len) { - glyphs++; - src_len = src_len + glyph_len; - glyph_len = nk_utf_decode(text + src_len, &unicode, text_len - src_len); - } - return glyphs; -} -NK_API const char* -nk_utf_at(const char *buffer, int length, int index, - nk_rune *unicode, int *len) -{ - int i = 0; - int src_len = 0; - int glyph_len = 0; - const char *text; - int text_len; - - NK_ASSERT(buffer); - NK_ASSERT(unicode); - NK_ASSERT(len); - - if (!buffer || !unicode || !len) return 0; - if (index < 0) { - *unicode = NK_UTF_INVALID; - *len = 0; - return 0; - } - - text = buffer; - text_len = length; - glyph_len = nk_utf_decode(text, unicode, text_len); - while (glyph_len) { - if (i == index) { - *len = glyph_len; - break; - } - - i++; - src_len = src_len + glyph_len; - glyph_len = nk_utf_decode(text + src_len, unicode, text_len - src_len); - } - if (i != index) return 0; - return buffer + src_len; -} - - - - - -/* ============================================================== - * - * BUFFER - * - * ===============================================================*/ -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -NK_LIB void* -nk_malloc(nk_handle unused, void *old,nk_size size) -{ - NK_UNUSED(unused); - NK_UNUSED(old); - return malloc(size); -} -NK_LIB void -nk_mfree(nk_handle unused, void *ptr) -{ - NK_UNUSED(unused); - free(ptr); -} -NK_API void -nk_buffer_init_default(struct nk_buffer *buffer) -{ - struct nk_allocator alloc; - alloc.userdata.ptr = 0; - alloc.alloc = nk_malloc; - alloc.free = nk_mfree; - nk_buffer_init(buffer, &alloc, NK_BUFFER_DEFAULT_INITIAL_SIZE); -} -#endif - -NK_API void -nk_buffer_init(struct nk_buffer *b, const struct nk_allocator *a, - nk_size initial_size) -{ - NK_ASSERT(b); - NK_ASSERT(a); - NK_ASSERT(initial_size); - if (!b || !a || !initial_size) return; - - nk_zero(b, sizeof(*b)); - b->type = NK_BUFFER_DYNAMIC; - b->memory.ptr = a->alloc(a->userdata,0, initial_size); - b->memory.size = initial_size; - b->size = initial_size; - b->grow_factor = 2.0f; - b->pool = *a; -} -NK_API void -nk_buffer_init_fixed(struct nk_buffer *b, void *m, nk_size size) -{ - NK_ASSERT(b); - NK_ASSERT(m); - NK_ASSERT(size); - if (!b || !m || !size) return; - - nk_zero(b, sizeof(*b)); - b->type = NK_BUFFER_FIXED; - b->memory.ptr = m; - b->memory.size = size; - b->size = size; -} -NK_LIB void* -nk_buffer_align(void *unaligned, - nk_size align, nk_size *alignment, - enum nk_buffer_allocation_type type) -{ - void *memory = 0; - switch (type) { - default: - case NK_BUFFER_MAX: - case NK_BUFFER_FRONT: - if (align) { - memory = NK_ALIGN_PTR(unaligned, align); - *alignment = (nk_size)((nk_byte*)memory - (nk_byte*)unaligned); - } else { - memory = unaligned; - *alignment = 0; - } - break; - case NK_BUFFER_BACK: - if (align) { - memory = NK_ALIGN_PTR_BACK(unaligned, align); - *alignment = (nk_size)((nk_byte*)unaligned - (nk_byte*)memory); - } else { - memory = unaligned; - *alignment = 0; - } - break; - } - return memory; -} -NK_LIB void* -nk_buffer_realloc(struct nk_buffer *b, nk_size capacity, nk_size *size) -{ - void *temp; - nk_size buffer_size; - - NK_ASSERT(b); - NK_ASSERT(size); - if (!b || !size || !b->pool.alloc || !b->pool.free) - return 0; - - buffer_size = b->memory.size; - temp = b->pool.alloc(b->pool.userdata, b->memory.ptr, capacity); - NK_ASSERT(temp); - if (!temp) return 0; - - *size = capacity; - if (temp != b->memory.ptr) { - NK_MEMCPY(temp, b->memory.ptr, buffer_size); - b->pool.free(b->pool.userdata, b->memory.ptr); - } - - if (b->size == buffer_size) { - /* no back buffer so just set correct size */ - b->size = capacity; - return temp; - } else { - /* copy back buffer to the end of the new buffer */ - void *dst, *src; - nk_size back_size; - back_size = buffer_size - b->size; - dst = nk_ptr_add(void, temp, capacity - back_size); - src = nk_ptr_add(void, temp, b->size); - NK_MEMCPY(dst, src, back_size); - b->size = capacity - back_size; - } - return temp; -} -NK_LIB void* -nk_buffer_alloc(struct nk_buffer *b, enum nk_buffer_allocation_type type, - nk_size size, nk_size align) -{ - int full; - nk_size alignment; - void *unaligned; - void *memory; - - NK_ASSERT(b); - NK_ASSERT(size); - if (!b || !size) return 0; - b->needed += size; - - /* calculate total size with needed alignment + size */ - if (type == NK_BUFFER_FRONT) - unaligned = nk_ptr_add(void, b->memory.ptr, b->allocated); - else unaligned = nk_ptr_add(void, b->memory.ptr, b->size - size); - memory = nk_buffer_align(unaligned, align, &alignment, type); - - /* check if buffer has enough memory*/ - if (type == NK_BUFFER_FRONT) - full = ((b->allocated + size + alignment) > b->size); - else full = ((b->size - NK_MIN(b->size,(size + alignment))) <= b->allocated); - - if (full) { - nk_size capacity; - if (b->type != NK_BUFFER_DYNAMIC) - return 0; - NK_ASSERT(b->pool.alloc && b->pool.free); - if (b->type != NK_BUFFER_DYNAMIC || !b->pool.alloc || !b->pool.free) - return 0; - - /* buffer is full so allocate bigger buffer if dynamic */ - capacity = (nk_size)((float)b->memory.size * b->grow_factor); - capacity = NK_MAX(capacity, nk_round_up_pow2((nk_uint)(b->allocated + size))); - b->memory.ptr = nk_buffer_realloc(b, capacity, &b->memory.size); - if (!b->memory.ptr) return 0; - - /* align newly allocated pointer */ - if (type == NK_BUFFER_FRONT) - unaligned = nk_ptr_add(void, b->memory.ptr, b->allocated); - else unaligned = nk_ptr_add(void, b->memory.ptr, b->size - size); - memory = nk_buffer_align(unaligned, align, &alignment, type); - } - if (type == NK_BUFFER_FRONT) - b->allocated += size + alignment; - else b->size -= (size + alignment); - b->needed += alignment; - b->calls++; - return memory; -} -NK_API void -nk_buffer_push(struct nk_buffer *b, enum nk_buffer_allocation_type type, - const void *memory, nk_size size, nk_size align) -{ - void *mem = nk_buffer_alloc(b, type, size, align); - if (!mem) return; - NK_MEMCPY(mem, memory, size); -} -NK_API void -nk_buffer_mark(struct nk_buffer *buffer, enum nk_buffer_allocation_type type) -{ - NK_ASSERT(buffer); - if (!buffer) return; - buffer->marker[type].active = nk_true; - if (type == NK_BUFFER_BACK) - buffer->marker[type].offset = buffer->size; - else buffer->marker[type].offset = buffer->allocated; -} -NK_API void -nk_buffer_reset(struct nk_buffer *buffer, enum nk_buffer_allocation_type type) -{ - NK_ASSERT(buffer); - if (!buffer) return; - if (type == NK_BUFFER_BACK) { - /* reset back buffer either back to marker or empty */ - buffer->needed -= (buffer->memory.size - buffer->marker[type].offset); - if (buffer->marker[type].active) - buffer->size = buffer->marker[type].offset; - else buffer->size = buffer->memory.size; - buffer->marker[type].active = nk_false; - } else { - /* reset front buffer either back to back marker or empty */ - buffer->needed -= (buffer->allocated - buffer->marker[type].offset); - if (buffer->marker[type].active) - buffer->allocated = buffer->marker[type].offset; - else buffer->allocated = 0; - buffer->marker[type].active = nk_false; - } -} -NK_API void -nk_buffer_clear(struct nk_buffer *b) -{ - NK_ASSERT(b); - if (!b) return; - b->allocated = 0; - b->size = b->memory.size; - b->calls = 0; - b->needed = 0; -} -NK_API void -nk_buffer_free(struct nk_buffer *b) -{ - NK_ASSERT(b); - if (!b || !b->memory.ptr) return; - if (b->type == NK_BUFFER_FIXED) return; - if (!b->pool.free) return; - NK_ASSERT(b->pool.free); - b->pool.free(b->pool.userdata, b->memory.ptr); -} -NK_API void -nk_buffer_info(struct nk_memory_status *s, struct nk_buffer *b) -{ - NK_ASSERT(b); - NK_ASSERT(s); - if (!s || !b) return; - s->allocated = b->allocated; - s->size = b->memory.size; - s->needed = b->needed; - s->memory = b->memory.ptr; - s->calls = b->calls; -} -NK_API void* -nk_buffer_memory(struct nk_buffer *buffer) -{ - NK_ASSERT(buffer); - if (!buffer) return 0; - return buffer->memory.ptr; -} -NK_API const void* -nk_buffer_memory_const(const struct nk_buffer *buffer) -{ - NK_ASSERT(buffer); - if (!buffer) return 0; - return buffer->memory.ptr; -} -NK_API nk_size -nk_buffer_total(struct nk_buffer *buffer) -{ - NK_ASSERT(buffer); - if (!buffer) return 0; - return buffer->memory.size; -} - - - - - -/* =============================================================== - * - * STRING - * - * ===============================================================*/ -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -NK_API void -nk_str_init_default(struct nk_str *str) -{ - struct nk_allocator alloc; - alloc.userdata.ptr = 0; - alloc.alloc = nk_malloc; - alloc.free = nk_mfree; - nk_buffer_init(&str->buffer, &alloc, 32); - str->len = 0; -} -#endif - -NK_API void -nk_str_init(struct nk_str *str, const struct nk_allocator *alloc, nk_size size) -{ - nk_buffer_init(&str->buffer, alloc, size); - str->len = 0; -} -NK_API void -nk_str_init_fixed(struct nk_str *str, void *memory, nk_size size) -{ - nk_buffer_init_fixed(&str->buffer, memory, size); - str->len = 0; -} -NK_API int -nk_str_append_text_char(struct nk_str *s, const char *str, int len) -{ - char *mem; - NK_ASSERT(s); - NK_ASSERT(str); - if (!s || !str || !len) return 0; - mem = (char*)nk_buffer_alloc(&s->buffer, NK_BUFFER_FRONT, (nk_size)len * sizeof(char), 0); - if (!mem) return 0; - NK_MEMCPY(mem, str, (nk_size)len * sizeof(char)); - s->len += nk_utf_len(str, len); - return len; -} -NK_API int -nk_str_append_str_char(struct nk_str *s, const char *str) -{ - return nk_str_append_text_char(s, str, nk_strlen(str)); -} -NK_API int -nk_str_append_text_utf8(struct nk_str *str, const char *text, int len) -{ - int i = 0; - int byte_len = 0; - nk_rune unicode; - if (!str || !text || !len) return 0; - for (i = 0; i < len; ++i) - byte_len += nk_utf_decode(text+byte_len, &unicode, 4); - nk_str_append_text_char(str, text, byte_len); - return len; -} -NK_API int -nk_str_append_str_utf8(struct nk_str *str, const char *text) -{ - int byte_len = 0; - int num_runes = 0; - int glyph_len = 0; - nk_rune unicode; - if (!str || !text) return 0; - - glyph_len = byte_len = nk_utf_decode(text+byte_len, &unicode, 4); - while (unicode != '\0' && glyph_len) { - glyph_len = nk_utf_decode(text+byte_len, &unicode, 4); - byte_len += glyph_len; - num_runes++; - } - nk_str_append_text_char(str, text, byte_len); - return num_runes; -} -NK_API int -nk_str_append_text_runes(struct nk_str *str, const nk_rune *text, int len) -{ - int i = 0; - int byte_len = 0; - nk_glyph glyph; - - NK_ASSERT(str); - if (!str || !text || !len) return 0; - for (i = 0; i < len; ++i) { - byte_len = nk_utf_encode(text[i], glyph, NK_UTF_SIZE); - if (!byte_len) break; - nk_str_append_text_char(str, glyph, byte_len); - } - return len; -} -NK_API int -nk_str_append_str_runes(struct nk_str *str, const nk_rune *runes) -{ - int i = 0; - nk_glyph glyph; - int byte_len; - NK_ASSERT(str); - if (!str || !runes) return 0; - while (runes[i] != '\0') { - byte_len = nk_utf_encode(runes[i], glyph, NK_UTF_SIZE); - nk_str_append_text_char(str, glyph, byte_len); - i++; - } - return i; -} -NK_API int -nk_str_insert_at_char(struct nk_str *s, int pos, const char *str, int len) -{ - int i; - void *mem; - char *src; - char *dst; - - int copylen; - NK_ASSERT(s); - NK_ASSERT(str); - NK_ASSERT(len >= 0); - if (!s || !str || !len || (nk_size)pos > s->buffer.allocated) return 0; - if ((s->buffer.allocated + (nk_size)len >= s->buffer.memory.size) && - (s->buffer.type == NK_BUFFER_FIXED)) return 0; - - copylen = (int)s->buffer.allocated - pos; - if (!copylen) { - nk_str_append_text_char(s, str, len); - return 1; - } - mem = nk_buffer_alloc(&s->buffer, NK_BUFFER_FRONT, (nk_size)len * sizeof(char), 0); - if (!mem) return 0; - - /* memmove */ - NK_ASSERT(((int)pos + (int)len + ((int)copylen - 1)) >= 0); - NK_ASSERT(((int)pos + ((int)copylen - 1)) >= 0); - dst = nk_ptr_add(char, s->buffer.memory.ptr, pos + len + (copylen - 1)); - src = nk_ptr_add(char, s->buffer.memory.ptr, pos + (copylen-1)); - for (i = 0; i < copylen; ++i) *dst-- = *src--; - mem = nk_ptr_add(void, s->buffer.memory.ptr, pos); - NK_MEMCPY(mem, str, (nk_size)len * sizeof(char)); - s->len = nk_utf_len((char *)s->buffer.memory.ptr, (int)s->buffer.allocated); - return 1; -} -NK_API int -nk_str_insert_at_rune(struct nk_str *str, int pos, const char *cstr, int len) -{ - int glyph_len; - nk_rune unicode; - const char *begin; - const char *buffer; - - NK_ASSERT(str); - NK_ASSERT(cstr); - NK_ASSERT(len); - if (!str || !cstr || !len) return 0; - begin = nk_str_at_rune(str, pos, &unicode, &glyph_len); - if (!str->len) - return nk_str_append_text_char(str, cstr, len); - buffer = nk_str_get_const(str); - if (!begin) return 0; - return nk_str_insert_at_char(str, (int)(begin - buffer), cstr, len); -} -NK_API int -nk_str_insert_text_char(struct nk_str *str, int pos, const char *text, int len) -{ - return nk_str_insert_text_utf8(str, pos, text, len); -} -NK_API int -nk_str_insert_str_char(struct nk_str *str, int pos, const char *text) -{ - return nk_str_insert_text_utf8(str, pos, text, nk_strlen(text)); -} -NK_API int -nk_str_insert_text_utf8(struct nk_str *str, int pos, const char *text, int len) -{ - int i = 0; - int byte_len = 0; - nk_rune unicode; - - NK_ASSERT(str); - NK_ASSERT(text); - if (!str || !text || !len) return 0; - for (i = 0; i < len; ++i) - byte_len += nk_utf_decode(text+byte_len, &unicode, 4); - nk_str_insert_at_rune(str, pos, text, byte_len); - return len; -} -NK_API int -nk_str_insert_str_utf8(struct nk_str *str, int pos, const char *text) -{ - int byte_len = 0; - int num_runes = 0; - int glyph_len = 0; - nk_rune unicode; - if (!str || !text) return 0; - - glyph_len = byte_len = nk_utf_decode(text+byte_len, &unicode, 4); - while (unicode != '\0' && glyph_len) { - glyph_len = nk_utf_decode(text+byte_len, &unicode, 4); - byte_len += glyph_len; - num_runes++; - } - nk_str_insert_at_rune(str, pos, text, byte_len); - return num_runes; -} -NK_API int -nk_str_insert_text_runes(struct nk_str *str, int pos, const nk_rune *runes, int len) -{ - int i = 0; - int byte_len = 0; - nk_glyph glyph; - - NK_ASSERT(str); - if (!str || !runes || !len) return 0; - for (i = 0; i < len; ++i) { - byte_len = nk_utf_encode(runes[i], glyph, NK_UTF_SIZE); - if (!byte_len) break; - nk_str_insert_at_rune(str, pos+i, glyph, byte_len); - } - return len; -} -NK_API int -nk_str_insert_str_runes(struct nk_str *str, int pos, const nk_rune *runes) -{ - int i = 0; - nk_glyph glyph; - int byte_len; - NK_ASSERT(str); - if (!str || !runes) return 0; - while (runes[i] != '\0') { - byte_len = nk_utf_encode(runes[i], glyph, NK_UTF_SIZE); - nk_str_insert_at_rune(str, pos+i, glyph, byte_len); - i++; - } - return i; -} -NK_API void -nk_str_remove_chars(struct nk_str *s, int len) -{ - NK_ASSERT(s); - NK_ASSERT(len >= 0); - if (!s || len < 0 || (nk_size)len > s->buffer.allocated) return; - NK_ASSERT(((int)s->buffer.allocated - (int)len) >= 0); - s->buffer.allocated -= (nk_size)len; - s->len = nk_utf_len((char *)s->buffer.memory.ptr, (int)s->buffer.allocated); -} -NK_API void -nk_str_remove_runes(struct nk_str *str, int len) -{ - int index; - const char *begin; - const char *end; - nk_rune unicode; - - NK_ASSERT(str); - NK_ASSERT(len >= 0); - if (!str || len < 0) return; - if (len >= str->len) { - str->len = 0; - return; - } - - index = str->len - len; - begin = nk_str_at_rune(str, index, &unicode, &len); - end = (const char*)str->buffer.memory.ptr + str->buffer.allocated; - nk_str_remove_chars(str, (int)(end-begin)+1); -} -NK_API void -nk_str_delete_chars(struct nk_str *s, int pos, int len) -{ - NK_ASSERT(s); - if (!s || !len || (nk_size)pos > s->buffer.allocated || - (nk_size)(pos + len) > s->buffer.allocated) return; - - if ((nk_size)(pos + len) < s->buffer.allocated) { - /* memmove */ - char *dst = nk_ptr_add(char, s->buffer.memory.ptr, pos); - char *src = nk_ptr_add(char, s->buffer.memory.ptr, pos + len); - NK_MEMCPY(dst, src, s->buffer.allocated - (nk_size)(pos + len)); - NK_ASSERT(((int)s->buffer.allocated - (int)len) >= 0); - s->buffer.allocated -= (nk_size)len; - } else nk_str_remove_chars(s, len); - s->len = nk_utf_len((char *)s->buffer.memory.ptr, (int)s->buffer.allocated); -} -NK_API void -nk_str_delete_runes(struct nk_str *s, int pos, int len) -{ - char *temp; - nk_rune unicode; - char *begin; - char *end; - int unused; - - NK_ASSERT(s); - NK_ASSERT(s->len >= pos + len); - if (s->len < pos + len) - len = NK_CLAMP(0, (s->len - pos), s->len); - if (!len) return; - - temp = (char *)s->buffer.memory.ptr; - begin = nk_str_at_rune(s, pos, &unicode, &unused); - if (!begin) return; - s->buffer.memory.ptr = begin; - end = nk_str_at_rune(s, len, &unicode, &unused); - s->buffer.memory.ptr = temp; - if (!end) return; - nk_str_delete_chars(s, (int)(begin - temp), (int)(end - begin)); -} -NK_API char* -nk_str_at_char(struct nk_str *s, int pos) -{ - NK_ASSERT(s); - if (!s || pos > (int)s->buffer.allocated) return 0; - return nk_ptr_add(char, s->buffer.memory.ptr, pos); -} -NK_API char* -nk_str_at_rune(struct nk_str *str, int pos, nk_rune *unicode, int *len) -{ - int i = 0; - int src_len = 0; - int glyph_len = 0; - char *text; - int text_len; - - NK_ASSERT(str); - NK_ASSERT(unicode); - NK_ASSERT(len); - - if (!str || !unicode || !len) return 0; - if (pos < 0) { - *unicode = 0; - *len = 0; - return 0; - } - - text = (char*)str->buffer.memory.ptr; - text_len = (int)str->buffer.allocated; - glyph_len = nk_utf_decode(text, unicode, text_len); - while (glyph_len) { - if (i == pos) { - *len = glyph_len; - break; - } - - i++; - src_len = src_len + glyph_len; - glyph_len = nk_utf_decode(text + src_len, unicode, text_len - src_len); - } - if (i != pos) return 0; - return text + src_len; -} -NK_API const char* -nk_str_at_char_const(const struct nk_str *s, int pos) -{ - NK_ASSERT(s); - if (!s || pos > (int)s->buffer.allocated) return 0; - return nk_ptr_add(char, s->buffer.memory.ptr, pos); -} -NK_API const char* -nk_str_at_const(const struct nk_str *str, int pos, nk_rune *unicode, int *len) -{ - int i = 0; - int src_len = 0; - int glyph_len = 0; - char *text; - int text_len; - - NK_ASSERT(str); - NK_ASSERT(unicode); - NK_ASSERT(len); - - if (!str || !unicode || !len) return 0; - if (pos < 0) { - *unicode = 0; - *len = 0; - return 0; - } - - text = (char*)str->buffer.memory.ptr; - text_len = (int)str->buffer.allocated; - glyph_len = nk_utf_decode(text, unicode, text_len); - while (glyph_len) { - if (i == pos) { - *len = glyph_len; - break; - } - - i++; - src_len = src_len + glyph_len; - glyph_len = nk_utf_decode(text + src_len, unicode, text_len - src_len); - } - if (i != pos) return 0; - return text + src_len; -} -NK_API nk_rune -nk_str_rune_at(const struct nk_str *str, int pos) -{ - int len; - nk_rune unicode = 0; - nk_str_at_const(str, pos, &unicode, &len); - return unicode; -} -NK_API char* -nk_str_get(struct nk_str *s) -{ - NK_ASSERT(s); - if (!s || !s->len || !s->buffer.allocated) return 0; - return (char*)s->buffer.memory.ptr; -} -NK_API const char* -nk_str_get_const(const struct nk_str *s) -{ - NK_ASSERT(s); - if (!s || !s->len || !s->buffer.allocated) return 0; - return (const char*)s->buffer.memory.ptr; -} -NK_API int -nk_str_len(struct nk_str *s) -{ - NK_ASSERT(s); - if (!s || !s->len || !s->buffer.allocated) return 0; - return s->len; -} -NK_API int -nk_str_len_char(struct nk_str *s) -{ - NK_ASSERT(s); - if (!s || !s->len || !s->buffer.allocated) return 0; - return (int)s->buffer.allocated; -} -NK_API void -nk_str_clear(struct nk_str *str) -{ - NK_ASSERT(str); - nk_buffer_clear(&str->buffer); - str->len = 0; -} -NK_API void -nk_str_free(struct nk_str *str) -{ - NK_ASSERT(str); - nk_buffer_free(&str->buffer); - str->len = 0; -} - - - - - -/* ============================================================== - * - * DRAW - * - * ===============================================================*/ -NK_LIB void -nk_command_buffer_init(struct nk_command_buffer *cb, - struct nk_buffer *b, enum nk_command_clipping clip) -{ - NK_ASSERT(cb); - NK_ASSERT(b); - if (!cb || !b) return; - cb->base = b; - cb->use_clipping = (int)clip; - cb->begin = b->allocated; - cb->end = b->allocated; - cb->last = b->allocated; -} -NK_LIB void -nk_command_buffer_reset(struct nk_command_buffer *b) -{ - NK_ASSERT(b); - if (!b) return; - b->begin = 0; - b->end = 0; - b->last = 0; - b->clip = nk_null_rect; -#ifdef NK_INCLUDE_COMMAND_USERDATA - b->userdata.ptr = 0; -#endif -} -NK_LIB void* -nk_command_buffer_push(struct nk_command_buffer* b, - enum nk_command_type t, nk_size size) -{ - NK_STORAGE const nk_size align = NK_ALIGNOF(struct nk_command); - struct nk_command *cmd; - nk_size alignment; - void *unaligned; - void *memory; - - NK_ASSERT(b); - NK_ASSERT(b->base); - if (!b) return 0; - cmd = (struct nk_command*)nk_buffer_alloc(b->base,NK_BUFFER_FRONT,size,align); - if (!cmd) return 0; - - /* make sure the offset to the next command is aligned */ - b->last = (nk_size)((nk_byte*)cmd - (nk_byte*)b->base->memory.ptr); - unaligned = (nk_byte*)cmd + size; - memory = NK_ALIGN_PTR(unaligned, align); - alignment = (nk_size)((nk_byte*)memory - (nk_byte*)unaligned); -#ifdef NK_ZERO_COMMAND_MEMORY - NK_MEMSET(cmd, 0, size + alignment); -#endif - - cmd->type = t; - cmd->next = b->base->allocated + alignment; -#ifdef NK_INCLUDE_COMMAND_USERDATA - cmd->userdata = b->userdata; -#endif - b->end = cmd->next; - return cmd; -} -NK_API void -nk_push_scissor(struct nk_command_buffer *b, struct nk_rect r) -{ - struct nk_command_scissor *cmd; - NK_ASSERT(b); - if (!b) return; - - b->clip.x = r.x; - b->clip.y = r.y; - b->clip.w = r.w; - b->clip.h = r.h; - cmd = (struct nk_command_scissor*) - nk_command_buffer_push(b, NK_COMMAND_SCISSOR, sizeof(*cmd)); - - if (!cmd) return; - cmd->x = (short)r.x; - cmd->y = (short)r.y; - cmd->w = (unsigned short)NK_MAX(0, r.w); - cmd->h = (unsigned short)NK_MAX(0, r.h); -} -NK_API void -nk_stroke_line(struct nk_command_buffer *b, float x0, float y0, - float x1, float y1, float line_thickness, struct nk_color c) -{ - struct nk_command_line *cmd; - NK_ASSERT(b); - if (!b || line_thickness <= 0) return; - cmd = (struct nk_command_line*) - nk_command_buffer_push(b, NK_COMMAND_LINE, sizeof(*cmd)); - if (!cmd) return; - cmd->line_thickness = (unsigned short)line_thickness; - cmd->begin.x = (short)x0; - cmd->begin.y = (short)y0; - cmd->end.x = (short)x1; - cmd->end.y = (short)y1; - cmd->color = c; -} -NK_API void -nk_stroke_curve(struct nk_command_buffer *b, float ax, float ay, - float ctrl0x, float ctrl0y, float ctrl1x, float ctrl1y, - float bx, float by, float line_thickness, struct nk_color col) -{ - struct nk_command_curve *cmd; - NK_ASSERT(b); - if (!b || col.a == 0 || line_thickness <= 0) return; - - cmd = (struct nk_command_curve*) - nk_command_buffer_push(b, NK_COMMAND_CURVE, sizeof(*cmd)); - if (!cmd) return; - cmd->line_thickness = (unsigned short)line_thickness; - cmd->begin.x = (short)ax; - cmd->begin.y = (short)ay; - cmd->ctrl[0].x = (short)ctrl0x; - cmd->ctrl[0].y = (short)ctrl0y; - cmd->ctrl[1].x = (short)ctrl1x; - cmd->ctrl[1].y = (short)ctrl1y; - cmd->end.x = (short)bx; - cmd->end.y = (short)by; - cmd->color = col; -} -NK_API void -nk_stroke_rect(struct nk_command_buffer *b, struct nk_rect rect, - float rounding, float line_thickness, struct nk_color c) -{ - struct nk_command_rect *cmd; - NK_ASSERT(b); - if (!b || c.a == 0 || rect.w == 0 || rect.h == 0 || line_thickness <= 0) return; - if (b->use_clipping) { - const struct nk_rect *clip = &b->clip; - if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h, - clip->x, clip->y, clip->w, clip->h)) return; - } - cmd = (struct nk_command_rect*) - nk_command_buffer_push(b, NK_COMMAND_RECT, sizeof(*cmd)); - if (!cmd) return; - cmd->rounding = (unsigned short)rounding; - cmd->line_thickness = (unsigned short)line_thickness; - cmd->x = (short)rect.x; - cmd->y = (short)rect.y; - cmd->w = (unsigned short)NK_MAX(0, rect.w); - cmd->h = (unsigned short)NK_MAX(0, rect.h); - cmd->color = c; -} -NK_API void -nk_fill_rect(struct nk_command_buffer *b, struct nk_rect rect, - float rounding, struct nk_color c) -{ - struct nk_command_rect_filled *cmd; - NK_ASSERT(b); - if (!b || c.a == 0 || rect.w == 0 || rect.h == 0) return; - if (b->use_clipping) { - const struct nk_rect *clip = &b->clip; - if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h, - clip->x, clip->y, clip->w, clip->h)) return; - } - - cmd = (struct nk_command_rect_filled*) - nk_command_buffer_push(b, NK_COMMAND_RECT_FILLED, sizeof(*cmd)); - if (!cmd) return; - cmd->rounding = (unsigned short)rounding; - cmd->x = (short)rect.x; - cmd->y = (short)rect.y; - cmd->w = (unsigned short)NK_MAX(0, rect.w); - cmd->h = (unsigned short)NK_MAX(0, rect.h); - cmd->color = c; -} -NK_API void -nk_fill_rect_multi_color(struct nk_command_buffer *b, struct nk_rect rect, - struct nk_color left, struct nk_color top, struct nk_color right, - struct nk_color bottom) -{ - struct nk_command_rect_multi_color *cmd; - NK_ASSERT(b); - if (!b || rect.w == 0 || rect.h == 0) return; - if (b->use_clipping) { - const struct nk_rect *clip = &b->clip; - if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h, - clip->x, clip->y, clip->w, clip->h)) return; - } - - cmd = (struct nk_command_rect_multi_color*) - nk_command_buffer_push(b, NK_COMMAND_RECT_MULTI_COLOR, sizeof(*cmd)); - if (!cmd) return; - cmd->x = (short)rect.x; - cmd->y = (short)rect.y; - cmd->w = (unsigned short)NK_MAX(0, rect.w); - cmd->h = (unsigned short)NK_MAX(0, rect.h); - cmd->left = left; - cmd->top = top; - cmd->right = right; - cmd->bottom = bottom; -} -NK_API void -nk_stroke_circle(struct nk_command_buffer *b, struct nk_rect r, - float line_thickness, struct nk_color c) -{ - struct nk_command_circle *cmd; - if (!b || r.w == 0 || r.h == 0 || line_thickness <= 0) return; - if (b->use_clipping) { - const struct nk_rect *clip = &b->clip; - if (!NK_INTERSECT(r.x, r.y, r.w, r.h, clip->x, clip->y, clip->w, clip->h)) - return; - } - - cmd = (struct nk_command_circle*) - nk_command_buffer_push(b, NK_COMMAND_CIRCLE, sizeof(*cmd)); - if (!cmd) return; - cmd->line_thickness = (unsigned short)line_thickness; - cmd->x = (short)r.x; - cmd->y = (short)r.y; - cmd->w = (unsigned short)NK_MAX(r.w, 0); - cmd->h = (unsigned short)NK_MAX(r.h, 0); - cmd->color = c; -} -NK_API void -nk_fill_circle(struct nk_command_buffer *b, struct nk_rect r, struct nk_color c) -{ - struct nk_command_circle_filled *cmd; - NK_ASSERT(b); - if (!b || c.a == 0 || r.w == 0 || r.h == 0) return; - if (b->use_clipping) { - const struct nk_rect *clip = &b->clip; - if (!NK_INTERSECT(r.x, r.y, r.w, r.h, clip->x, clip->y, clip->w, clip->h)) - return; - } - - cmd = (struct nk_command_circle_filled*) - nk_command_buffer_push(b, NK_COMMAND_CIRCLE_FILLED, sizeof(*cmd)); - if (!cmd) return; - cmd->x = (short)r.x; - cmd->y = (short)r.y; - cmd->w = (unsigned short)NK_MAX(r.w, 0); - cmd->h = (unsigned short)NK_MAX(r.h, 0); - cmd->color = c; -} -NK_API void -nk_stroke_arc(struct nk_command_buffer *b, float cx, float cy, float radius, - float a_min, float a_max, float line_thickness, struct nk_color c) -{ - struct nk_command_arc *cmd; - if (!b || c.a == 0 || line_thickness <= 0) return; - cmd = (struct nk_command_arc*) - nk_command_buffer_push(b, NK_COMMAND_ARC, sizeof(*cmd)); - if (!cmd) return; - cmd->line_thickness = (unsigned short)line_thickness; - cmd->cx = (short)cx; - cmd->cy = (short)cy; - cmd->r = (unsigned short)radius; - cmd->a[0] = a_min; - cmd->a[1] = a_max; - cmd->color = c; -} -NK_API void -nk_fill_arc(struct nk_command_buffer *b, float cx, float cy, float radius, - float a_min, float a_max, struct nk_color c) -{ - struct nk_command_arc_filled *cmd; - NK_ASSERT(b); - if (!b || c.a == 0) return; - cmd = (struct nk_command_arc_filled*) - nk_command_buffer_push(b, NK_COMMAND_ARC_FILLED, sizeof(*cmd)); - if (!cmd) return; - cmd->cx = (short)cx; - cmd->cy = (short)cy; - cmd->r = (unsigned short)radius; - cmd->a[0] = a_min; - cmd->a[1] = a_max; - cmd->color = c; -} -NK_API void -nk_stroke_triangle(struct nk_command_buffer *b, float x0, float y0, float x1, - float y1, float x2, float y2, float line_thickness, struct nk_color c) -{ - struct nk_command_triangle *cmd; - NK_ASSERT(b); - if (!b || c.a == 0 || line_thickness <= 0) return; - if (b->use_clipping) { - const struct nk_rect *clip = &b->clip; - if (!NK_INBOX(x0, y0, clip->x, clip->y, clip->w, clip->h) && - !NK_INBOX(x1, y1, clip->x, clip->y, clip->w, clip->h) && - !NK_INBOX(x2, y2, clip->x, clip->y, clip->w, clip->h)) - return; - } - - cmd = (struct nk_command_triangle*) - nk_command_buffer_push(b, NK_COMMAND_TRIANGLE, sizeof(*cmd)); - if (!cmd) return; - cmd->line_thickness = (unsigned short)line_thickness; - cmd->a.x = (short)x0; - cmd->a.y = (short)y0; - cmd->b.x = (short)x1; - cmd->b.y = (short)y1; - cmd->c.x = (short)x2; - cmd->c.y = (short)y2; - cmd->color = c; -} -NK_API void -nk_fill_triangle(struct nk_command_buffer *b, float x0, float y0, float x1, - float y1, float x2, float y2, struct nk_color c) -{ - struct nk_command_triangle_filled *cmd; - NK_ASSERT(b); - if (!b || c.a == 0) return; - if (!b) return; - if (b->use_clipping) { - const struct nk_rect *clip = &b->clip; - if (!NK_INBOX(x0, y0, clip->x, clip->y, clip->w, clip->h) && - !NK_INBOX(x1, y1, clip->x, clip->y, clip->w, clip->h) && - !NK_INBOX(x2, y2, clip->x, clip->y, clip->w, clip->h)) - return; - } - - cmd = (struct nk_command_triangle_filled*) - nk_command_buffer_push(b, NK_COMMAND_TRIANGLE_FILLED, sizeof(*cmd)); - if (!cmd) return; - cmd->a.x = (short)x0; - cmd->a.y = (short)y0; - cmd->b.x = (short)x1; - cmd->b.y = (short)y1; - cmd->c.x = (short)x2; - cmd->c.y = (short)y2; - cmd->color = c; -} -NK_API void -nk_stroke_polygon(struct nk_command_buffer *b, float *points, int point_count, - float line_thickness, struct nk_color col) -{ - int i; - nk_size size = 0; - struct nk_command_polygon *cmd; - - NK_ASSERT(b); - if (!b || col.a == 0 || line_thickness <= 0) return; - size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count; - cmd = (struct nk_command_polygon*) nk_command_buffer_push(b, NK_COMMAND_POLYGON, size); - if (!cmd) return; - cmd->color = col; - cmd->line_thickness = (unsigned short)line_thickness; - cmd->point_count = (unsigned short)point_count; - for (i = 0; i < point_count; ++i) { - cmd->points[i].x = (short)points[i*2]; - cmd->points[i].y = (short)points[i*2+1]; - } -} -NK_API void -nk_fill_polygon(struct nk_command_buffer *b, float *points, int point_count, - struct nk_color col) -{ - int i; - nk_size size = 0; - struct nk_command_polygon_filled *cmd; - - NK_ASSERT(b); - if (!b || col.a == 0) return; - size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count; - cmd = (struct nk_command_polygon_filled*) - nk_command_buffer_push(b, NK_COMMAND_POLYGON_FILLED, size); - if (!cmd) return; - cmd->color = col; - cmd->point_count = (unsigned short)point_count; - for (i = 0; i < point_count; ++i) { - cmd->points[i].x = (short)points[i*2+0]; - cmd->points[i].y = (short)points[i*2+1]; - } -} -NK_API void -nk_stroke_polyline(struct nk_command_buffer *b, float *points, int point_count, - float line_thickness, struct nk_color col) -{ - int i; - nk_size size = 0; - struct nk_command_polyline *cmd; - - NK_ASSERT(b); - if (!b || col.a == 0 || line_thickness <= 0) return; - size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count; - cmd = (struct nk_command_polyline*) nk_command_buffer_push(b, NK_COMMAND_POLYLINE, size); - if (!cmd) return; - cmd->color = col; - cmd->point_count = (unsigned short)point_count; - cmd->line_thickness = (unsigned short)line_thickness; - for (i = 0; i < point_count; ++i) { - cmd->points[i].x = (short)points[i*2]; - cmd->points[i].y = (short)points[i*2+1]; - } -} -NK_API void -nk_draw_image(struct nk_command_buffer *b, struct nk_rect r, - const struct nk_image *img, struct nk_color col) -{ - struct nk_command_image *cmd; - NK_ASSERT(b); - if (!b) return; - if (b->use_clipping) { - const struct nk_rect *c = &b->clip; - if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h)) - return; - } - - cmd = (struct nk_command_image*) - nk_command_buffer_push(b, NK_COMMAND_IMAGE, sizeof(*cmd)); - if (!cmd) return; - cmd->x = (short)r.x; - cmd->y = (short)r.y; - cmd->w = (unsigned short)NK_MAX(0, r.w); - cmd->h = (unsigned short)NK_MAX(0, r.h); - cmd->img = *img; - cmd->col = col; -} -NK_API void -nk_draw_nine_slice(struct nk_command_buffer *b, struct nk_rect r, - const struct nk_nine_slice *slc, struct nk_color col) -{ - struct nk_image img; - const struct nk_image *slcimg = (const struct nk_image*)slc; - nk_ushort rgnX, rgnY, rgnW, rgnH; - rgnX = slcimg->region[0]; - rgnY = slcimg->region[1]; - rgnW = slcimg->region[2]; - rgnH = slcimg->region[3]; - - /* top-left */ - img.handle = slcimg->handle; - img.w = slcimg->w; - img.h = slcimg->h; - img.region[0] = rgnX; - img.region[1] = rgnY; - img.region[2] = slc->l; - img.region[3] = slc->t; - - nk_draw_image(b, - nk_rect(r.x, r.y, (float)slc->l, (float)slc->t), - &img, col); - -#define IMG_RGN(x, y, w, h) img.region[0] = (nk_ushort)(x); img.region[1] = (nk_ushort)(y); img.region[2] = (nk_ushort)(w); img.region[3] = (nk_ushort)(h); - - /* top-center */ - IMG_RGN(rgnX + slc->l, rgnY, rgnW - slc->l - slc->r, slc->t); - nk_draw_image(b, - nk_rect(r.x + (float)slc->l, r.y, (float)(r.w - slc->l - slc->r), (float)slc->t), - &img, col); - - /* top-right */ - IMG_RGN(rgnX + rgnW - slc->r, rgnY, slc->r, slc->t); - nk_draw_image(b, - nk_rect(r.x + r.w - (float)slc->r, r.y, (float)slc->r, (float)slc->t), - &img, col); - - /* center-left */ - IMG_RGN(rgnX, rgnY + slc->t, slc->l, rgnH - slc->t - slc->b); - nk_draw_image(b, - nk_rect(r.x, r.y + (float)slc->t, (float)slc->l, (float)(r.h - slc->t - slc->b)), - &img, col); - - /* center */ - IMG_RGN(rgnX + slc->l, rgnY + slc->t, rgnW - slc->l - slc->r, rgnH - slc->t - slc->b); - nk_draw_image(b, - nk_rect(r.x + (float)slc->l, r.y + (float)slc->t, (float)(r.w - slc->l - slc->r), (float)(r.h - slc->t - slc->b)), - &img, col); - - /* center-right */ - IMG_RGN(rgnX + rgnW - slc->r, rgnY + slc->t, slc->r, rgnH - slc->t - slc->b); - nk_draw_image(b, - nk_rect(r.x + r.w - (float)slc->r, r.y + (float)slc->t, (float)slc->r, (float)(r.h - slc->t - slc->b)), - &img, col); - - /* bottom-left */ - IMG_RGN(rgnX, rgnY + rgnH - slc->b, slc->l, slc->b); - nk_draw_image(b, - nk_rect(r.x, r.y + r.h - (float)slc->b, (float)slc->l, (float)slc->b), - &img, col); - - /* bottom-center */ - IMG_RGN(rgnX + slc->l, rgnY + rgnH - slc->b, rgnW - slc->l - slc->r, slc->b); - nk_draw_image(b, - nk_rect(r.x + (float)slc->l, r.y + r.h - (float)slc->b, (float)(r.w - slc->l - slc->r), (float)slc->b), - &img, col); - - /* bottom-right */ - IMG_RGN(rgnX + rgnW - slc->r, rgnY + rgnH - slc->b, slc->r, slc->b); - nk_draw_image(b, - nk_rect(r.x + r.w - (float)slc->r, r.y + r.h - (float)slc->b, (float)slc->r, (float)slc->b), - &img, col); - -#undef IMG_RGN -} -NK_API void -nk_push_custom(struct nk_command_buffer *b, struct nk_rect r, - nk_command_custom_callback cb, nk_handle usr) -{ - struct nk_command_custom *cmd; - NK_ASSERT(b); - if (!b) return; - if (b->use_clipping) { - const struct nk_rect *c = &b->clip; - if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h)) - return; - } - - cmd = (struct nk_command_custom*) - nk_command_buffer_push(b, NK_COMMAND_CUSTOM, sizeof(*cmd)); - if (!cmd) return; - cmd->x = (short)r.x; - cmd->y = (short)r.y; - cmd->w = (unsigned short)NK_MAX(0, r.w); - cmd->h = (unsigned short)NK_MAX(0, r.h); - cmd->callback_data = usr; - cmd->callback = cb; -} -NK_API void -nk_draw_text(struct nk_command_buffer *b, struct nk_rect r, - const char *string, int length, const struct nk_user_font *font, - struct nk_color bg, struct nk_color fg) -{ - float text_width = 0; - struct nk_command_text *cmd; - - NK_ASSERT(b); - NK_ASSERT(font); - if (!b || !string || !length || (bg.a == 0 && fg.a == 0)) return; - if (b->use_clipping) { - const struct nk_rect *c = &b->clip; - if (c->w == 0 || c->h == 0 || !NK_INTERSECT(r.x, r.y, r.w, r.h, c->x, c->y, c->w, c->h)) - return; - } - - /* make sure text fits inside bounds */ - text_width = font->width(font->userdata, font->height, string, length); - if (text_width > r.w){ - int glyphs = 0; - float txt_width = (float)text_width; - length = nk_text_clamp(font, string, length, r.w, &glyphs, &txt_width, 0,0); - } - - if (!length) return; - cmd = (struct nk_command_text*) - nk_command_buffer_push(b, NK_COMMAND_TEXT, sizeof(*cmd) + (nk_size)(length + 1)); - if (!cmd) return; - cmd->x = (short)r.x; - cmd->y = (short)r.y; - cmd->w = (unsigned short)r.w; - cmd->h = (unsigned short)r.h; - cmd->background = bg; - cmd->foreground = fg; - cmd->font = font; - cmd->length = length; - cmd->height = font->height; - NK_MEMCPY(cmd->string, string, (nk_size)length); - cmd->string[length] = '\0'; -} - - - - - -/* =============================================================== - * - * VERTEX - * - * ===============================================================*/ -#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT -NK_API void -nk_draw_list_init(struct nk_draw_list *list) -{ - nk_size i = 0; - NK_ASSERT(list); - if (!list) return; - nk_zero(list, sizeof(*list)); - for (i = 0; i < NK_LEN(list->circle_vtx); ++i) { - const float a = ((float)i / (float)NK_LEN(list->circle_vtx)) * 2 * NK_PI; - list->circle_vtx[i].x = (float)NK_COS(a); - list->circle_vtx[i].y = (float)NK_SIN(a); - } -} -NK_API void -nk_draw_list_setup(struct nk_draw_list *canvas, const struct nk_convert_config *config, - struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements, - enum nk_anti_aliasing line_aa, enum nk_anti_aliasing shape_aa) -{ - NK_ASSERT(canvas); - NK_ASSERT(config); - NK_ASSERT(cmds); - NK_ASSERT(vertices); - NK_ASSERT(elements); - if (!canvas || !config || !cmds || !vertices || !elements) - return; - - canvas->buffer = cmds; - canvas->config = *config; - canvas->elements = elements; - canvas->vertices = vertices; - canvas->line_AA = line_aa; - canvas->shape_AA = shape_aa; - canvas->clip_rect = nk_null_rect; - - canvas->cmd_offset = 0; - canvas->element_count = 0; - canvas->vertex_count = 0; - canvas->cmd_offset = 0; - canvas->cmd_count = 0; - canvas->path_count = 0; -} -NK_API const struct nk_draw_command* -nk__draw_list_begin(const struct nk_draw_list *canvas, const struct nk_buffer *buffer) -{ - nk_byte *memory; - nk_size offset; - const struct nk_draw_command *cmd; - - NK_ASSERT(buffer); - if (!buffer || !buffer->size || !canvas->cmd_count) - return 0; - - memory = (nk_byte*)buffer->memory.ptr; - offset = buffer->memory.size - canvas->cmd_offset; - cmd = nk_ptr_add(const struct nk_draw_command, memory, offset); - return cmd; -} -NK_API const struct nk_draw_command* -nk__draw_list_end(const struct nk_draw_list *canvas, const struct nk_buffer *buffer) -{ - nk_size size; - nk_size offset; - nk_byte *memory; - const struct nk_draw_command *end; - - NK_ASSERT(buffer); - NK_ASSERT(canvas); - if (!buffer || !canvas) - return 0; - - memory = (nk_byte*)buffer->memory.ptr; - size = buffer->memory.size; - offset = size - canvas->cmd_offset; - end = nk_ptr_add(const struct nk_draw_command, memory, offset); - end -= (canvas->cmd_count-1); - return end; -} -NK_API const struct nk_draw_command* -nk__draw_list_next(const struct nk_draw_command *cmd, - const struct nk_buffer *buffer, const struct nk_draw_list *canvas) -{ - const struct nk_draw_command *end; - NK_ASSERT(buffer); - NK_ASSERT(canvas); - if (!cmd || !buffer || !canvas) - return 0; - - end = nk__draw_list_end(canvas, buffer); - if (cmd <= end) return 0; - return (cmd-1); -} -NK_INTERN struct nk_vec2* -nk_draw_list_alloc_path(struct nk_draw_list *list, int count) -{ - struct nk_vec2 *points; - NK_STORAGE const nk_size point_align = NK_ALIGNOF(struct nk_vec2); - NK_STORAGE const nk_size point_size = sizeof(struct nk_vec2); - points = (struct nk_vec2*) - nk_buffer_alloc(list->buffer, NK_BUFFER_FRONT, - point_size * (nk_size)count, point_align); - - if (!points) return 0; - if (!list->path_offset) { - void *memory = nk_buffer_memory(list->buffer); - list->path_offset = (unsigned int)((nk_byte*)points - (nk_byte*)memory); - } - list->path_count += (unsigned int)count; - return points; -} -NK_INTERN struct nk_vec2 -nk_draw_list_path_last(struct nk_draw_list *list) -{ - void *memory; - struct nk_vec2 *point; - NK_ASSERT(list->path_count); - memory = nk_buffer_memory(list->buffer); - point = nk_ptr_add(struct nk_vec2, memory, list->path_offset); - point += (list->path_count-1); - return *point; -} -NK_INTERN struct nk_draw_command* -nk_draw_list_push_command(struct nk_draw_list *list, struct nk_rect clip, - nk_handle texture) -{ - NK_STORAGE const nk_size cmd_align = NK_ALIGNOF(struct nk_draw_command); - NK_STORAGE const nk_size cmd_size = sizeof(struct nk_draw_command); - struct nk_draw_command *cmd; - - NK_ASSERT(list); - cmd = (struct nk_draw_command*) - nk_buffer_alloc(list->buffer, NK_BUFFER_BACK, cmd_size, cmd_align); - - if (!cmd) return 0; - if (!list->cmd_count) { - nk_byte *memory = (nk_byte*)nk_buffer_memory(list->buffer); - nk_size total = nk_buffer_total(list->buffer); - memory = nk_ptr_add(nk_byte, memory, total); - list->cmd_offset = (nk_size)(memory - (nk_byte*)cmd); - } - - cmd->elem_count = 0; - cmd->clip_rect = clip; - cmd->texture = texture; -#ifdef NK_INCLUDE_COMMAND_USERDATA - cmd->userdata = list->userdata; -#endif - - list->cmd_count++; - list->clip_rect = clip; - return cmd; -} -NK_INTERN struct nk_draw_command* -nk_draw_list_command_last(struct nk_draw_list *list) -{ - void *memory; - nk_size size; - struct nk_draw_command *cmd; - NK_ASSERT(list->cmd_count); - - memory = nk_buffer_memory(list->buffer); - size = nk_buffer_total(list->buffer); - cmd = nk_ptr_add(struct nk_draw_command, memory, size - list->cmd_offset); - return (cmd - (list->cmd_count-1)); -} -NK_INTERN void -nk_draw_list_add_clip(struct nk_draw_list *list, struct nk_rect rect) -{ - NK_ASSERT(list); - if (!list) return; - if (!list->cmd_count) { - nk_draw_list_push_command(list, rect, list->config.tex_null.texture); - } else { - struct nk_draw_command *prev = nk_draw_list_command_last(list); - if (prev->elem_count == 0) - prev->clip_rect = rect; - nk_draw_list_push_command(list, rect, prev->texture); - } -} -NK_INTERN void -nk_draw_list_push_image(struct nk_draw_list *list, nk_handle texture) -{ - NK_ASSERT(list); - if (!list) return; - if (!list->cmd_count) { - nk_draw_list_push_command(list, nk_null_rect, texture); - } else { - struct nk_draw_command *prev = nk_draw_list_command_last(list); - if (prev->elem_count == 0) { - prev->texture = texture; - #ifdef NK_INCLUDE_COMMAND_USERDATA - prev->userdata = list->userdata; - #endif - } else if (prev->texture.id != texture.id - #ifdef NK_INCLUDE_COMMAND_USERDATA - || prev->userdata.id != list->userdata.id - #endif - ) nk_draw_list_push_command(list, prev->clip_rect, texture); - } -} -#ifdef NK_INCLUDE_COMMAND_USERDATA -NK_API void -nk_draw_list_push_userdata(struct nk_draw_list *list, nk_handle userdata) -{ - list->userdata = userdata; -} -#endif -NK_INTERN void* -nk_draw_list_alloc_vertices(struct nk_draw_list *list, nk_size count) -{ - void *vtx; - NK_ASSERT(list); - if (!list) return 0; - vtx = nk_buffer_alloc(list->vertices, NK_BUFFER_FRONT, - list->config.vertex_size*count, list->config.vertex_alignment); - if (!vtx) return 0; - list->vertex_count += (unsigned int)count; - - /* This assert triggers because your are drawing a lot of stuff and nuklear - * defined `nk_draw_index` as `nk_ushort` to safe space be default. - * - * So you reached the maximum number of indices or rather vertexes. - * To solve this issue please change typedef `nk_draw_index` to `nk_uint` - * and don't forget to specify the new element size in your drawing - * backend (OpenGL, DirectX, ...). For example in OpenGL for `glDrawElements` - * instead of specifying `GL_UNSIGNED_SHORT` you have to define `GL_UNSIGNED_INT`. - * Sorry for the inconvenience. */ - if(sizeof(nk_draw_index)==2) NK_ASSERT((list->vertex_count < NK_USHORT_MAX && - "To many vertices for 16-bit vertex indices. Please read comment above on how to solve this problem")); - return vtx; -} -NK_INTERN nk_draw_index* -nk_draw_list_alloc_elements(struct nk_draw_list *list, nk_size count) -{ - nk_draw_index *ids; - struct nk_draw_command *cmd; - NK_STORAGE const nk_size elem_align = NK_ALIGNOF(nk_draw_index); - NK_STORAGE const nk_size elem_size = sizeof(nk_draw_index); - NK_ASSERT(list); - if (!list) return 0; - - ids = (nk_draw_index*) - nk_buffer_alloc(list->elements, NK_BUFFER_FRONT, elem_size*count, elem_align); - if (!ids) return 0; - cmd = nk_draw_list_command_last(list); - list->element_count += (unsigned int)count; - cmd->elem_count += (unsigned int)count; - return ids; -} -NK_INTERN int -nk_draw_vertex_layout_element_is_end_of_layout( - const struct nk_draw_vertex_layout_element *element) -{ - return (element->attribute == NK_VERTEX_ATTRIBUTE_COUNT || - element->format == NK_FORMAT_COUNT); -} -NK_INTERN void -nk_draw_vertex_color(void *attr, const float *vals, - enum nk_draw_vertex_layout_format format) -{ - /* if this triggers you tried to provide a value format for a color */ - float val[4]; - NK_ASSERT(format >= NK_FORMAT_COLOR_BEGIN); - NK_ASSERT(format <= NK_FORMAT_COLOR_END); - if (format < NK_FORMAT_COLOR_BEGIN || format > NK_FORMAT_COLOR_END) return; - - val[0] = NK_SATURATE(vals[0]); - val[1] = NK_SATURATE(vals[1]); - val[2] = NK_SATURATE(vals[2]); - val[3] = NK_SATURATE(vals[3]); - - switch (format) { - default: NK_ASSERT(0 && "Invalid vertex layout color format"); break; - case NK_FORMAT_R8G8B8A8: - case NK_FORMAT_R8G8B8: { - struct nk_color col = nk_rgba_fv(val); - NK_MEMCPY(attr, &col.r, sizeof(col)); - } break; - case NK_FORMAT_B8G8R8A8: { - struct nk_color col = nk_rgba_fv(val); - struct nk_color bgra = nk_rgba(col.b, col.g, col.r, col.a); - NK_MEMCPY(attr, &bgra, sizeof(bgra)); - } break; - case NK_FORMAT_R16G15B16: { - nk_ushort col[3]; - col[0] = (nk_ushort)(val[0]*(float)NK_USHORT_MAX); - col[1] = (nk_ushort)(val[1]*(float)NK_USHORT_MAX); - col[2] = (nk_ushort)(val[2]*(float)NK_USHORT_MAX); - NK_MEMCPY(attr, col, sizeof(col)); - } break; - case NK_FORMAT_R16G15B16A16: { - nk_ushort col[4]; - col[0] = (nk_ushort)(val[0]*(float)NK_USHORT_MAX); - col[1] = (nk_ushort)(val[1]*(float)NK_USHORT_MAX); - col[2] = (nk_ushort)(val[2]*(float)NK_USHORT_MAX); - col[3] = (nk_ushort)(val[3]*(float)NK_USHORT_MAX); - NK_MEMCPY(attr, col, sizeof(col)); - } break; - case NK_FORMAT_R32G32B32: { - nk_uint col[3]; - col[0] = (nk_uint)(val[0]*(float)NK_UINT_MAX); - col[1] = (nk_uint)(val[1]*(float)NK_UINT_MAX); - col[2] = (nk_uint)(val[2]*(float)NK_UINT_MAX); - NK_MEMCPY(attr, col, sizeof(col)); - } break; - case NK_FORMAT_R32G32B32A32: { - nk_uint col[4]; - col[0] = (nk_uint)(val[0]*(float)NK_UINT_MAX); - col[1] = (nk_uint)(val[1]*(float)NK_UINT_MAX); - col[2] = (nk_uint)(val[2]*(float)NK_UINT_MAX); - col[3] = (nk_uint)(val[3]*(float)NK_UINT_MAX); - NK_MEMCPY(attr, col, sizeof(col)); - } break; - case NK_FORMAT_R32G32B32A32_FLOAT: - NK_MEMCPY(attr, val, sizeof(float)*4); - break; - case NK_FORMAT_R32G32B32A32_DOUBLE: { - double col[4]; - col[0] = (double)val[0]; - col[1] = (double)val[1]; - col[2] = (double)val[2]; - col[3] = (double)val[3]; - NK_MEMCPY(attr, col, sizeof(col)); - } break; - case NK_FORMAT_RGB32: - case NK_FORMAT_RGBA32: { - struct nk_color col = nk_rgba_fv(val); - nk_uint color = nk_color_u32(col); - NK_MEMCPY(attr, &color, sizeof(color)); - } break; } -} -NK_INTERN void -nk_draw_vertex_element(void *dst, const float *values, int value_count, - enum nk_draw_vertex_layout_format format) -{ - int value_index; - void *attribute = dst; - /* if this triggers you tried to provide a color format for a value */ - NK_ASSERT(format < NK_FORMAT_COLOR_BEGIN); - if (format >= NK_FORMAT_COLOR_BEGIN && format <= NK_FORMAT_COLOR_END) return; - for (value_index = 0; value_index < value_count; ++value_index) { - switch (format) { - default: NK_ASSERT(0 && "invalid vertex layout format"); break; - case NK_FORMAT_SCHAR: { - char value = (char)NK_CLAMP((float)NK_SCHAR_MIN, values[value_index], (float)NK_SCHAR_MAX); - NK_MEMCPY(attribute, &value, sizeof(value)); - attribute = (void*)((char*)attribute + sizeof(char)); - } break; - case NK_FORMAT_SSHORT: { - nk_short value = (nk_short)NK_CLAMP((float)NK_SSHORT_MIN, values[value_index], (float)NK_SSHORT_MAX); - NK_MEMCPY(attribute, &value, sizeof(value)); - attribute = (void*)((char*)attribute + sizeof(value)); - } break; - case NK_FORMAT_SINT: { - nk_int value = (nk_int)NK_CLAMP((float)NK_SINT_MIN, values[value_index], (float)NK_SINT_MAX); - NK_MEMCPY(attribute, &value, sizeof(value)); - attribute = (void*)((char*)attribute + sizeof(nk_int)); - } break; - case NK_FORMAT_UCHAR: { - unsigned char value = (unsigned char)NK_CLAMP((float)NK_UCHAR_MIN, values[value_index], (float)NK_UCHAR_MAX); - NK_MEMCPY(attribute, &value, sizeof(value)); - attribute = (void*)((char*)attribute + sizeof(unsigned char)); - } break; - case NK_FORMAT_USHORT: { - nk_ushort value = (nk_ushort)NK_CLAMP((float)NK_USHORT_MIN, values[value_index], (float)NK_USHORT_MAX); - NK_MEMCPY(attribute, &value, sizeof(value)); - attribute = (void*)((char*)attribute + sizeof(value)); - } break; - case NK_FORMAT_UINT: { - nk_uint value = (nk_uint)NK_CLAMP((float)NK_UINT_MIN, values[value_index], (float)NK_UINT_MAX); - NK_MEMCPY(attribute, &value, sizeof(value)); - attribute = (void*)((char*)attribute + sizeof(nk_uint)); - } break; - case NK_FORMAT_FLOAT: - NK_MEMCPY(attribute, &values[value_index], sizeof(values[value_index])); - attribute = (void*)((char*)attribute + sizeof(float)); - break; - case NK_FORMAT_DOUBLE: { - double value = (double)values[value_index]; - NK_MEMCPY(attribute, &value, sizeof(value)); - attribute = (void*)((char*)attribute + sizeof(double)); - } break; - } - } -} -NK_INTERN void* -nk_draw_vertex(void *dst, const struct nk_convert_config *config, - struct nk_vec2 pos, struct nk_vec2 uv, struct nk_colorf color) -{ - void *result = (void*)((char*)dst + config->vertex_size); - const struct nk_draw_vertex_layout_element *elem_iter = config->vertex_layout; - while (!nk_draw_vertex_layout_element_is_end_of_layout(elem_iter)) { - void *address = (void*)((char*)dst + elem_iter->offset); - switch (elem_iter->attribute) { - case NK_VERTEX_ATTRIBUTE_COUNT: - default: NK_ASSERT(0 && "wrong element attribute"); break; - case NK_VERTEX_POSITION: nk_draw_vertex_element(address, &pos.x, 2, elem_iter->format); break; - case NK_VERTEX_TEXCOORD: nk_draw_vertex_element(address, &uv.x, 2, elem_iter->format); break; - case NK_VERTEX_COLOR: nk_draw_vertex_color(address, &color.r, elem_iter->format); break; - } - elem_iter++; - } - return result; -} -NK_API void -nk_draw_list_stroke_poly_line(struct nk_draw_list *list, const struct nk_vec2 *points, - const unsigned int points_count, struct nk_color color, enum nk_draw_list_stroke closed, - float thickness, enum nk_anti_aliasing aliasing) -{ - nk_size count; - int thick_line; - struct nk_colorf col; - struct nk_colorf col_trans; - NK_ASSERT(list); - if (!list || points_count < 2) return; - - color.a = (nk_byte)((float)color.a * list->config.global_alpha); - count = points_count; - if (!closed) count = points_count-1; - thick_line = thickness > 1.0f; - -#ifdef NK_INCLUDE_COMMAND_USERDATA - nk_draw_list_push_userdata(list, list->userdata); -#endif - - color.a = (nk_byte)((float)color.a * list->config.global_alpha); - nk_color_fv(&col.r, color); - col_trans = col; - col_trans.a = 0; - - if (aliasing == NK_ANTI_ALIASING_ON) { - /* ANTI-ALIASED STROKE */ - const float AA_SIZE = 1.0f; - NK_STORAGE const nk_size pnt_align = NK_ALIGNOF(struct nk_vec2); - NK_STORAGE const nk_size pnt_size = sizeof(struct nk_vec2); - - /* allocate vertices and elements */ - nk_size i1 = 0; - nk_size vertex_offset; - nk_size index = list->vertex_count; - - const nk_size idx_count = (thick_line) ? (count * 18) : (count * 12); - const nk_size vtx_count = (thick_line) ? (points_count * 4): (points_count *3); - - void *vtx = nk_draw_list_alloc_vertices(list, vtx_count); - nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count); - - nk_size size; - struct nk_vec2 *normals, *temp; - if (!vtx || !ids) return; - - /* temporary allocate normals + points */ - vertex_offset = (nk_size)((nk_byte*)vtx - (nk_byte*)list->vertices->memory.ptr); - nk_buffer_mark(list->vertices, NK_BUFFER_FRONT); - size = pnt_size * ((thick_line) ? 5 : 3) * points_count; - normals = (struct nk_vec2*) nk_buffer_alloc(list->vertices, NK_BUFFER_FRONT, size, pnt_align); - if (!normals) return; - temp = normals + points_count; - - /* make sure vertex pointer is still correct */ - vtx = (void*)((nk_byte*)list->vertices->memory.ptr + vertex_offset); - - /* calculate normals */ - for (i1 = 0; i1 < count; ++i1) { - const nk_size i2 = ((i1 + 1) == points_count) ? 0 : (i1 + 1); - struct nk_vec2 diff = nk_vec2_sub(points[i2], points[i1]); - float len; - - /* vec2 inverted length */ - len = nk_vec2_len_sqr(diff); - if (len != 0.0f) - len = NK_INV_SQRT(len); - else len = 1.0f; - - diff = nk_vec2_muls(diff, len); - normals[i1].x = diff.y; - normals[i1].y = -diff.x; - } - - if (!closed) - normals[points_count-1] = normals[points_count-2]; - - if (!thick_line) { - nk_size idx1, i; - if (!closed) { - struct nk_vec2 d; - temp[0] = nk_vec2_add(points[0], nk_vec2_muls(normals[0], AA_SIZE)); - temp[1] = nk_vec2_sub(points[0], nk_vec2_muls(normals[0], AA_SIZE)); - d = nk_vec2_muls(normals[points_count-1], AA_SIZE); - temp[(points_count-1) * 2 + 0] = nk_vec2_add(points[points_count-1], d); - temp[(points_count-1) * 2 + 1] = nk_vec2_sub(points[points_count-1], d); - } - - /* fill elements */ - idx1 = index; - for (i1 = 0; i1 < count; i1++) { - struct nk_vec2 dm; - float dmr2; - nk_size i2 = ((i1 + 1) == points_count) ? 0 : (i1 + 1); - nk_size idx2 = ((i1+1) == points_count) ? index: (idx1 + 3); - - /* average normals */ - dm = nk_vec2_muls(nk_vec2_add(normals[i1], normals[i2]), 0.5f); - dmr2 = dm.x * dm.x + dm.y* dm.y; - if (dmr2 > 0.000001f) { - float scale = 1.0f/dmr2; - scale = NK_MIN(100.0f, scale); - dm = nk_vec2_muls(dm, scale); - } - - dm = nk_vec2_muls(dm, AA_SIZE); - temp[i2*2+0] = nk_vec2_add(points[i2], dm); - temp[i2*2+1] = nk_vec2_sub(points[i2], dm); - - ids[0] = (nk_draw_index)(idx2 + 0); ids[1] = (nk_draw_index)(idx1+0); - ids[2] = (nk_draw_index)(idx1 + 2); ids[3] = (nk_draw_index)(idx1+2); - ids[4] = (nk_draw_index)(idx2 + 2); ids[5] = (nk_draw_index)(idx2+0); - ids[6] = (nk_draw_index)(idx2 + 1); ids[7] = (nk_draw_index)(idx1+1); - ids[8] = (nk_draw_index)(idx1 + 0); ids[9] = (nk_draw_index)(idx1+0); - ids[10]= (nk_draw_index)(idx2 + 0); ids[11]= (nk_draw_index)(idx2+1); - ids += 12; - idx1 = idx2; - } - - /* fill vertices */ - for (i = 0; i < points_count; ++i) { - const struct nk_vec2 uv = list->config.tex_null.uv; - vtx = nk_draw_vertex(vtx, &list->config, points[i], uv, col); - vtx = nk_draw_vertex(vtx, &list->config, temp[i*2+0], uv, col_trans); - vtx = nk_draw_vertex(vtx, &list->config, temp[i*2+1], uv, col_trans); - } - } else { - nk_size idx1, i; - const float half_inner_thickness = (thickness - AA_SIZE) * 0.5f; - if (!closed) { - struct nk_vec2 d1 = nk_vec2_muls(normals[0], half_inner_thickness + AA_SIZE); - struct nk_vec2 d2 = nk_vec2_muls(normals[0], half_inner_thickness); - - temp[0] = nk_vec2_add(points[0], d1); - temp[1] = nk_vec2_add(points[0], d2); - temp[2] = nk_vec2_sub(points[0], d2); - temp[3] = nk_vec2_sub(points[0], d1); - - d1 = nk_vec2_muls(normals[points_count-1], half_inner_thickness + AA_SIZE); - d2 = nk_vec2_muls(normals[points_count-1], half_inner_thickness); - - temp[(points_count-1)*4+0] = nk_vec2_add(points[points_count-1], d1); - temp[(points_count-1)*4+1] = nk_vec2_add(points[points_count-1], d2); - temp[(points_count-1)*4+2] = nk_vec2_sub(points[points_count-1], d2); - temp[(points_count-1)*4+3] = nk_vec2_sub(points[points_count-1], d1); - } - - /* add all elements */ - idx1 = index; - for (i1 = 0; i1 < count; ++i1) { - struct nk_vec2 dm_out, dm_in; - const nk_size i2 = ((i1+1) == points_count) ? 0: (i1 + 1); - nk_size idx2 = ((i1+1) == points_count) ? index: (idx1 + 4); - - /* average normals */ - struct nk_vec2 dm = nk_vec2_muls(nk_vec2_add(normals[i1], normals[i2]), 0.5f); - float dmr2 = dm.x * dm.x + dm.y* dm.y; - if (dmr2 > 0.000001f) { - float scale = 1.0f/dmr2; - scale = NK_MIN(100.0f, scale); - dm = nk_vec2_muls(dm, scale); - } - - dm_out = nk_vec2_muls(dm, ((half_inner_thickness) + AA_SIZE)); - dm_in = nk_vec2_muls(dm, half_inner_thickness); - temp[i2*4+0] = nk_vec2_add(points[i2], dm_out); - temp[i2*4+1] = nk_vec2_add(points[i2], dm_in); - temp[i2*4+2] = nk_vec2_sub(points[i2], dm_in); - temp[i2*4+3] = nk_vec2_sub(points[i2], dm_out); - - /* add indexes */ - ids[0] = (nk_draw_index)(idx2 + 1); ids[1] = (nk_draw_index)(idx1+1); - ids[2] = (nk_draw_index)(idx1 + 2); ids[3] = (nk_draw_index)(idx1+2); - ids[4] = (nk_draw_index)(idx2 + 2); ids[5] = (nk_draw_index)(idx2+1); - ids[6] = (nk_draw_index)(idx2 + 1); ids[7] = (nk_draw_index)(idx1+1); - ids[8] = (nk_draw_index)(idx1 + 0); ids[9] = (nk_draw_index)(idx1+0); - ids[10]= (nk_draw_index)(idx2 + 0); ids[11] = (nk_draw_index)(idx2+1); - ids[12]= (nk_draw_index)(idx2 + 2); ids[13] = (nk_draw_index)(idx1+2); - ids[14]= (nk_draw_index)(idx1 + 3); ids[15] = (nk_draw_index)(idx1+3); - ids[16]= (nk_draw_index)(idx2 + 3); ids[17] = (nk_draw_index)(idx2+2); - ids += 18; - idx1 = idx2; - } - - /* add vertices */ - for (i = 0; i < points_count; ++i) { - const struct nk_vec2 uv = list->config.tex_null.uv; - vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+0], uv, col_trans); - vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+1], uv, col); - vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+2], uv, col); - vtx = nk_draw_vertex(vtx, &list->config, temp[i*4+3], uv, col_trans); - } - } - /* free temporary normals + points */ - nk_buffer_reset(list->vertices, NK_BUFFER_FRONT); - } else { - /* NON ANTI-ALIASED STROKE */ - nk_size i1 = 0; - nk_size idx = list->vertex_count; - const nk_size idx_count = count * 6; - const nk_size vtx_count = count * 4; - void *vtx = nk_draw_list_alloc_vertices(list, vtx_count); - nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count); - if (!vtx || !ids) return; - - for (i1 = 0; i1 < count; ++i1) { - float dx, dy; - const struct nk_vec2 uv = list->config.tex_null.uv; - const nk_size i2 = ((i1+1) == points_count) ? 0 : i1 + 1; - const struct nk_vec2 p1 = points[i1]; - const struct nk_vec2 p2 = points[i2]; - struct nk_vec2 diff = nk_vec2_sub(p2, p1); - float len; - - /* vec2 inverted length */ - len = nk_vec2_len_sqr(diff); - if (len != 0.0f) - len = NK_INV_SQRT(len); - else len = 1.0f; - diff = nk_vec2_muls(diff, len); - - /* add vertices */ - dx = diff.x * (thickness * 0.5f); - dy = diff.y * (thickness * 0.5f); - - vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p1.x + dy, p1.y - dx), uv, col); - vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p2.x + dy, p2.y - dx), uv, col); - vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p2.x - dy, p2.y + dx), uv, col); - vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(p1.x - dy, p1.y + dx), uv, col); - - ids[0] = (nk_draw_index)(idx+0); ids[1] = (nk_draw_index)(idx+1); - ids[2] = (nk_draw_index)(idx+2); ids[3] = (nk_draw_index)(idx+0); - ids[4] = (nk_draw_index)(idx+2); ids[5] = (nk_draw_index)(idx+3); - - ids += 6; - idx += 4; - } - } -} -NK_API void -nk_draw_list_fill_poly_convex(struct nk_draw_list *list, - const struct nk_vec2 *points, const unsigned int points_count, - struct nk_color color, enum nk_anti_aliasing aliasing) -{ - struct nk_colorf col; - struct nk_colorf col_trans; - - NK_STORAGE const nk_size pnt_align = NK_ALIGNOF(struct nk_vec2); - NK_STORAGE const nk_size pnt_size = sizeof(struct nk_vec2); - NK_ASSERT(list); - if (!list || points_count < 3) return; - -#ifdef NK_INCLUDE_COMMAND_USERDATA - nk_draw_list_push_userdata(list, list->userdata); -#endif - - color.a = (nk_byte)((float)color.a * list->config.global_alpha); - nk_color_fv(&col.r, color); - col_trans = col; - col_trans.a = 0; - - if (aliasing == NK_ANTI_ALIASING_ON) { - nk_size i = 0; - nk_size i0 = 0; - nk_size i1 = 0; - - const float AA_SIZE = 1.0f; - nk_size vertex_offset = 0; - nk_size index = list->vertex_count; - - const nk_size idx_count = (points_count-2)*3 + points_count*6; - const nk_size vtx_count = (points_count*2); - - void *vtx = nk_draw_list_alloc_vertices(list, vtx_count); - nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count); - - nk_size size = 0; - struct nk_vec2 *normals = 0; - unsigned int vtx_inner_idx = (unsigned int)(index + 0); - unsigned int vtx_outer_idx = (unsigned int)(index + 1); - if (!vtx || !ids) return; - - /* temporary allocate normals */ - vertex_offset = (nk_size)((nk_byte*)vtx - (nk_byte*)list->vertices->memory.ptr); - nk_buffer_mark(list->vertices, NK_BUFFER_FRONT); - size = pnt_size * points_count; - normals = (struct nk_vec2*) nk_buffer_alloc(list->vertices, NK_BUFFER_FRONT, size, pnt_align); - if (!normals) return; - vtx = (void*)((nk_byte*)list->vertices->memory.ptr + vertex_offset); - - /* add elements */ - for (i = 2; i < points_count; i++) { - ids[0] = (nk_draw_index)(vtx_inner_idx); - ids[1] = (nk_draw_index)(vtx_inner_idx + ((i-1) << 1)); - ids[2] = (nk_draw_index)(vtx_inner_idx + (i << 1)); - ids += 3; - } - - /* compute normals */ - for (i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++) { - struct nk_vec2 p0 = points[i0]; - struct nk_vec2 p1 = points[i1]; - struct nk_vec2 diff = nk_vec2_sub(p1, p0); - - /* vec2 inverted length */ - float len = nk_vec2_len_sqr(diff); - if (len != 0.0f) - len = NK_INV_SQRT(len); - else len = 1.0f; - diff = nk_vec2_muls(diff, len); - - normals[i0].x = diff.y; - normals[i0].y = -diff.x; - } - - /* add vertices + indexes */ - for (i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++) { - const struct nk_vec2 uv = list->config.tex_null.uv; - struct nk_vec2 n0 = normals[i0]; - struct nk_vec2 n1 = normals[i1]; - struct nk_vec2 dm = nk_vec2_muls(nk_vec2_add(n0, n1), 0.5f); - float dmr2 = dm.x*dm.x + dm.y*dm.y; - if (dmr2 > 0.000001f) { - float scale = 1.0f / dmr2; - scale = NK_MIN(scale, 100.0f); - dm = nk_vec2_muls(dm, scale); - } - dm = nk_vec2_muls(dm, AA_SIZE * 0.5f); - - /* add vertices */ - vtx = nk_draw_vertex(vtx, &list->config, nk_vec2_sub(points[i1], dm), uv, col); - vtx = nk_draw_vertex(vtx, &list->config, nk_vec2_add(points[i1], dm), uv, col_trans); - - /* add indexes */ - ids[0] = (nk_draw_index)(vtx_inner_idx+(i1<<1)); - ids[1] = (nk_draw_index)(vtx_inner_idx+(i0<<1)); - ids[2] = (nk_draw_index)(vtx_outer_idx+(i0<<1)); - ids[3] = (nk_draw_index)(vtx_outer_idx+(i0<<1)); - ids[4] = (nk_draw_index)(vtx_outer_idx+(i1<<1)); - ids[5] = (nk_draw_index)(vtx_inner_idx+(i1<<1)); - ids += 6; - } - /* free temporary normals + points */ - nk_buffer_reset(list->vertices, NK_BUFFER_FRONT); - } else { - nk_size i = 0; - nk_size index = list->vertex_count; - const nk_size idx_count = (points_count-2)*3; - const nk_size vtx_count = points_count; - void *vtx = nk_draw_list_alloc_vertices(list, vtx_count); - nk_draw_index *ids = nk_draw_list_alloc_elements(list, idx_count); - - if (!vtx || !ids) return; - for (i = 0; i < vtx_count; ++i) - vtx = nk_draw_vertex(vtx, &list->config, points[i], list->config.tex_null.uv, col); - for (i = 2; i < points_count; ++i) { - ids[0] = (nk_draw_index)index; - ids[1] = (nk_draw_index)(index+ i - 1); - ids[2] = (nk_draw_index)(index+i); - ids += 3; - } - } -} -NK_API void -nk_draw_list_path_clear(struct nk_draw_list *list) -{ - NK_ASSERT(list); - if (!list) return; - nk_buffer_reset(list->buffer, NK_BUFFER_FRONT); - list->path_count = 0; - list->path_offset = 0; -} -NK_API void -nk_draw_list_path_line_to(struct nk_draw_list *list, struct nk_vec2 pos) -{ - struct nk_vec2 *points = 0; - struct nk_draw_command *cmd = 0; - NK_ASSERT(list); - if (!list) return; - if (!list->cmd_count) - nk_draw_list_add_clip(list, nk_null_rect); - - cmd = nk_draw_list_command_last(list); - if (cmd && cmd->texture.ptr != list->config.tex_null.texture.ptr) - nk_draw_list_push_image(list, list->config.tex_null.texture); - - points = nk_draw_list_alloc_path(list, 1); - if (!points) return; - points[0] = pos; -} -NK_API void -nk_draw_list_path_arc_to_fast(struct nk_draw_list *list, struct nk_vec2 center, - float radius, int a_min, int a_max) -{ - int a = 0; - NK_ASSERT(list); - if (!list) return; - if (a_min <= a_max) { - for (a = a_min; a <= a_max; a++) { - const struct nk_vec2 c = list->circle_vtx[(nk_size)a % NK_LEN(list->circle_vtx)]; - const float x = center.x + c.x * radius; - const float y = center.y + c.y * radius; - nk_draw_list_path_line_to(list, nk_vec2(x, y)); - } - } -} -NK_API void -nk_draw_list_path_arc_to(struct nk_draw_list *list, struct nk_vec2 center, - float radius, float a_min, float a_max, unsigned int segments) -{ - unsigned int i = 0; - NK_ASSERT(list); - if (!list) return; - if (radius == 0.0f) return; - - /* This algorithm for arc drawing relies on these two trigonometric identities[1]: - sin(a + b) = sin(a) * cos(b) + cos(a) * sin(b) - cos(a + b) = cos(a) * cos(b) - sin(a) * sin(b) - - Two coordinates (x, y) of a point on a circle centered on - the origin can be written in polar form as: - x = r * cos(a) - y = r * sin(a) - where r is the radius of the circle, - a is the angle between (x, y) and the origin. - - This allows us to rotate the coordinates around the - origin by an angle b using the following transformation: - x' = r * cos(a + b) = x * cos(b) - y * sin(b) - y' = r * sin(a + b) = y * cos(b) + x * sin(b) - - [1] https://en.wikipedia.org/wiki/List_of_trigonometric_identities#Angle_sum_and_difference_identities - */ - {const float d_angle = (a_max - a_min) / (float)segments; - const float sin_d = (float)NK_SIN(d_angle); - const float cos_d = (float)NK_COS(d_angle); - - float cx = (float)NK_COS(a_min) * radius; - float cy = (float)NK_SIN(a_min) * radius; - for(i = 0; i <= segments; ++i) { - float new_cx, new_cy; - const float x = center.x + cx; - const float y = center.y + cy; - nk_draw_list_path_line_to(list, nk_vec2(x, y)); - - new_cx = cx * cos_d - cy * sin_d; - new_cy = cy * cos_d + cx * sin_d; - cx = new_cx; - cy = new_cy; - }} -} -NK_API void -nk_draw_list_path_rect_to(struct nk_draw_list *list, struct nk_vec2 a, - struct nk_vec2 b, float rounding) -{ - float r; - NK_ASSERT(list); - if (!list) return; - r = rounding; - r = NK_MIN(r, ((b.x-a.x) < 0) ? -(b.x-a.x): (b.x-a.x)); - r = NK_MIN(r, ((b.y-a.y) < 0) ? -(b.y-a.y): (b.y-a.y)); - - if (r == 0.0f) { - nk_draw_list_path_line_to(list, a); - nk_draw_list_path_line_to(list, nk_vec2(b.x,a.y)); - nk_draw_list_path_line_to(list, b); - nk_draw_list_path_line_to(list, nk_vec2(a.x,b.y)); - } else { - nk_draw_list_path_arc_to_fast(list, nk_vec2(a.x + r, a.y + r), r, 6, 9); - nk_draw_list_path_arc_to_fast(list, nk_vec2(b.x - r, a.y + r), r, 9, 12); - nk_draw_list_path_arc_to_fast(list, nk_vec2(b.x - r, b.y - r), r, 0, 3); - nk_draw_list_path_arc_to_fast(list, nk_vec2(a.x + r, b.y - r), r, 3, 6); - } -} -NK_API void -nk_draw_list_path_curve_to(struct nk_draw_list *list, struct nk_vec2 p2, - struct nk_vec2 p3, struct nk_vec2 p4, unsigned int num_segments) -{ - float t_step; - unsigned int i_step; - struct nk_vec2 p1; - - NK_ASSERT(list); - NK_ASSERT(list->path_count); - if (!list || !list->path_count) return; - num_segments = NK_MAX(num_segments, 1); - - p1 = nk_draw_list_path_last(list); - t_step = 1.0f/(float)num_segments; - for (i_step = 1; i_step <= num_segments; ++i_step) { - float t = t_step * (float)i_step; - float u = 1.0f - t; - float w1 = u*u*u; - float w2 = 3*u*u*t; - float w3 = 3*u*t*t; - float w4 = t * t *t; - float x = w1 * p1.x + w2 * p2.x + w3 * p3.x + w4 * p4.x; - float y = w1 * p1.y + w2 * p2.y + w3 * p3.y + w4 * p4.y; - nk_draw_list_path_line_to(list, nk_vec2(x,y)); - } -} -NK_API void -nk_draw_list_path_fill(struct nk_draw_list *list, struct nk_color color) -{ - struct nk_vec2 *points; - NK_ASSERT(list); - if (!list) return; - points = (struct nk_vec2*)nk_buffer_memory(list->buffer); - nk_draw_list_fill_poly_convex(list, points, list->path_count, color, list->config.shape_AA); - nk_draw_list_path_clear(list); -} -NK_API void -nk_draw_list_path_stroke(struct nk_draw_list *list, struct nk_color color, - enum nk_draw_list_stroke closed, float thickness) -{ - struct nk_vec2 *points; - NK_ASSERT(list); - if (!list) return; - points = (struct nk_vec2*)nk_buffer_memory(list->buffer); - nk_draw_list_stroke_poly_line(list, points, list->path_count, color, - closed, thickness, list->config.line_AA); - nk_draw_list_path_clear(list); -} -NK_API void -nk_draw_list_stroke_line(struct nk_draw_list *list, struct nk_vec2 a, - struct nk_vec2 b, struct nk_color col, float thickness) -{ - NK_ASSERT(list); - if (!list || !col.a) return; - if (list->line_AA == NK_ANTI_ALIASING_ON) { - nk_draw_list_path_line_to(list, a); - nk_draw_list_path_line_to(list, b); - } else { - nk_draw_list_path_line_to(list, nk_vec2_sub(a,nk_vec2(0.5f,0.5f))); - nk_draw_list_path_line_to(list, nk_vec2_sub(b,nk_vec2(0.5f,0.5f))); - } - nk_draw_list_path_stroke(list, col, NK_STROKE_OPEN, thickness); -} -NK_API void -nk_draw_list_fill_rect(struct nk_draw_list *list, struct nk_rect rect, - struct nk_color col, float rounding) -{ - NK_ASSERT(list); - if (!list || !col.a) return; - - if (list->line_AA == NK_ANTI_ALIASING_ON) { - nk_draw_list_path_rect_to(list, nk_vec2(rect.x, rect.y), - nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding); - } else { - nk_draw_list_path_rect_to(list, nk_vec2(rect.x-0.5f, rect.y-0.5f), - nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding); - } nk_draw_list_path_fill(list, col); -} -NK_API void -nk_draw_list_stroke_rect(struct nk_draw_list *list, struct nk_rect rect, - struct nk_color col, float rounding, float thickness) -{ - NK_ASSERT(list); - if (!list || !col.a) return; - if (list->line_AA == NK_ANTI_ALIASING_ON) { - nk_draw_list_path_rect_to(list, nk_vec2(rect.x, rect.y), - nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding); - } else { - nk_draw_list_path_rect_to(list, nk_vec2(rect.x-0.5f, rect.y-0.5f), - nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding); - } nk_draw_list_path_stroke(list, col, NK_STROKE_CLOSED, thickness); -} -NK_API void -nk_draw_list_fill_rect_multi_color(struct nk_draw_list *list, struct nk_rect rect, - struct nk_color left, struct nk_color top, struct nk_color right, - struct nk_color bottom) -{ - void *vtx; - struct nk_colorf col_left, col_top; - struct nk_colorf col_right, col_bottom; - nk_draw_index *idx; - nk_draw_index index; - - nk_color_fv(&col_left.r, left); - nk_color_fv(&col_right.r, right); - nk_color_fv(&col_top.r, top); - nk_color_fv(&col_bottom.r, bottom); - - NK_ASSERT(list); - if (!list) return; - - nk_draw_list_push_image(list, list->config.tex_null.texture); - index = (nk_draw_index)list->vertex_count; - vtx = nk_draw_list_alloc_vertices(list, 4); - idx = nk_draw_list_alloc_elements(list, 6); - if (!vtx || !idx) return; - - idx[0] = (nk_draw_index)(index+0); idx[1] = (nk_draw_index)(index+1); - idx[2] = (nk_draw_index)(index+2); idx[3] = (nk_draw_index)(index+0); - idx[4] = (nk_draw_index)(index+2); idx[5] = (nk_draw_index)(index+3); - - vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x, rect.y), list->config.tex_null.uv, col_left); - vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x + rect.w, rect.y), list->config.tex_null.uv, col_top); - vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x + rect.w, rect.y + rect.h), list->config.tex_null.uv, col_right); - vtx = nk_draw_vertex(vtx, &list->config, nk_vec2(rect.x, rect.y + rect.h), list->config.tex_null.uv, col_bottom); -} -NK_API void -nk_draw_list_fill_triangle(struct nk_draw_list *list, struct nk_vec2 a, - struct nk_vec2 b, struct nk_vec2 c, struct nk_color col) -{ - NK_ASSERT(list); - if (!list || !col.a) return; - nk_draw_list_path_line_to(list, a); - nk_draw_list_path_line_to(list, b); - nk_draw_list_path_line_to(list, c); - nk_draw_list_path_fill(list, col); -} -NK_API void -nk_draw_list_stroke_triangle(struct nk_draw_list *list, struct nk_vec2 a, - struct nk_vec2 b, struct nk_vec2 c, struct nk_color col, float thickness) -{ - NK_ASSERT(list); - if (!list || !col.a) return; - nk_draw_list_path_line_to(list, a); - nk_draw_list_path_line_to(list, b); - nk_draw_list_path_line_to(list, c); - nk_draw_list_path_stroke(list, col, NK_STROKE_CLOSED, thickness); -} -NK_API void -nk_draw_list_fill_circle(struct nk_draw_list *list, struct nk_vec2 center, - float radius, struct nk_color col, unsigned int segs) -{ - float a_max; - NK_ASSERT(list); - if (!list || !col.a) return; - a_max = NK_PI * 2.0f * ((float)segs - 1.0f) / (float)segs; - nk_draw_list_path_arc_to(list, center, radius, 0.0f, a_max, segs); - nk_draw_list_path_fill(list, col); -} -NK_API void -nk_draw_list_stroke_circle(struct nk_draw_list *list, struct nk_vec2 center, - float radius, struct nk_color col, unsigned int segs, float thickness) -{ - float a_max; - NK_ASSERT(list); - if (!list || !col.a) return; - a_max = NK_PI * 2.0f * ((float)segs - 1.0f) / (float)segs; - nk_draw_list_path_arc_to(list, center, radius, 0.0f, a_max, segs); - nk_draw_list_path_stroke(list, col, NK_STROKE_CLOSED, thickness); -} -NK_API void -nk_draw_list_stroke_curve(struct nk_draw_list *list, struct nk_vec2 p0, - struct nk_vec2 cp0, struct nk_vec2 cp1, struct nk_vec2 p1, - struct nk_color col, unsigned int segments, float thickness) -{ - NK_ASSERT(list); - if (!list || !col.a) return; - nk_draw_list_path_line_to(list, p0); - nk_draw_list_path_curve_to(list, cp0, cp1, p1, segments); - nk_draw_list_path_stroke(list, col, NK_STROKE_OPEN, thickness); -} -NK_INTERN void -nk_draw_list_push_rect_uv(struct nk_draw_list *list, struct nk_vec2 a, - struct nk_vec2 c, struct nk_vec2 uva, struct nk_vec2 uvc, - struct nk_color color) -{ - void *vtx; - struct nk_vec2 uvb; - struct nk_vec2 uvd; - struct nk_vec2 b; - struct nk_vec2 d; - - struct nk_colorf col; - nk_draw_index *idx; - nk_draw_index index; - NK_ASSERT(list); - if (!list) return; - - nk_color_fv(&col.r, color); - uvb = nk_vec2(uvc.x, uva.y); - uvd = nk_vec2(uva.x, uvc.y); - b = nk_vec2(c.x, a.y); - d = nk_vec2(a.x, c.y); - - index = (nk_draw_index)list->vertex_count; - vtx = nk_draw_list_alloc_vertices(list, 4); - idx = nk_draw_list_alloc_elements(list, 6); - if (!vtx || !idx) return; - - idx[0] = (nk_draw_index)(index+0); idx[1] = (nk_draw_index)(index+1); - idx[2] = (nk_draw_index)(index+2); idx[3] = (nk_draw_index)(index+0); - idx[4] = (nk_draw_index)(index+2); idx[5] = (nk_draw_index)(index+3); - - vtx = nk_draw_vertex(vtx, &list->config, a, uva, col); - vtx = nk_draw_vertex(vtx, &list->config, b, uvb, col); - vtx = nk_draw_vertex(vtx, &list->config, c, uvc, col); - vtx = nk_draw_vertex(vtx, &list->config, d, uvd, col); -} -NK_API void -nk_draw_list_add_image(struct nk_draw_list *list, struct nk_image texture, - struct nk_rect rect, struct nk_color color) -{ - NK_ASSERT(list); - if (!list) return; - /* push new command with given texture */ - nk_draw_list_push_image(list, texture.handle); - if (nk_image_is_subimage(&texture)) { - /* add region inside of the texture */ - struct nk_vec2 uv[2]; - uv[0].x = (float)texture.region[0]/(float)texture.w; - uv[0].y = (float)texture.region[1]/(float)texture.h; - uv[1].x = (float)(texture.region[0] + texture.region[2])/(float)texture.w; - uv[1].y = (float)(texture.region[1] + texture.region[3])/(float)texture.h; - nk_draw_list_push_rect_uv(list, nk_vec2(rect.x, rect.y), - nk_vec2(rect.x + rect.w, rect.y + rect.h), uv[0], uv[1], color); - } else nk_draw_list_push_rect_uv(list, nk_vec2(rect.x, rect.y), - nk_vec2(rect.x + rect.w, rect.y + rect.h), - nk_vec2(0.0f, 0.0f), nk_vec2(1.0f, 1.0f),color); -} -NK_API void -nk_draw_list_add_text(struct nk_draw_list *list, const struct nk_user_font *font, - struct nk_rect rect, const char *text, int len, float font_height, - struct nk_color fg) -{ - float x = 0; - int text_len = 0; - nk_rune unicode = 0; - nk_rune next = 0; - int glyph_len = 0; - int next_glyph_len = 0; - struct nk_user_font_glyph g; - - NK_ASSERT(list); - if (!list || !len || !text) return; - if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h, - list->clip_rect.x, list->clip_rect.y, list->clip_rect.w, list->clip_rect.h)) return; - - nk_draw_list_push_image(list, font->texture); - x = rect.x; - glyph_len = nk_utf_decode(text, &unicode, len); - if (!glyph_len) return; - - /* draw every glyph image */ - fg.a = (nk_byte)((float)fg.a * list->config.global_alpha); - while (text_len < len && glyph_len) { - float gx, gy, gh, gw; - float char_width = 0; - if (unicode == NK_UTF_INVALID) break; - - /* query currently drawn glyph information */ - next_glyph_len = nk_utf_decode(text + text_len + glyph_len, &next, (int)len - text_len); - font->query(font->userdata, font_height, &g, unicode, - (next == NK_UTF_INVALID) ? '\0' : next); - - /* calculate and draw glyph drawing rectangle and image */ - gx = x + g.offset.x; - gy = rect.y + g.offset.y; - gw = g.width; gh = g.height; - char_width = g.xadvance; - nk_draw_list_push_rect_uv(list, nk_vec2(gx,gy), nk_vec2(gx + gw, gy+ gh), - g.uv[0], g.uv[1], fg); - - /* offset next glyph */ - text_len += glyph_len; - x += char_width; - glyph_len = next_glyph_len; - unicode = next; - } -} -NK_API nk_flags -nk_convert(struct nk_context *ctx, struct nk_buffer *cmds, - struct nk_buffer *vertices, struct nk_buffer *elements, - const struct nk_convert_config *config) -{ - nk_flags res = NK_CONVERT_SUCCESS; - const struct nk_command *cmd; - NK_ASSERT(ctx); - NK_ASSERT(cmds); - NK_ASSERT(vertices); - NK_ASSERT(elements); - NK_ASSERT(config); - NK_ASSERT(config->vertex_layout); - NK_ASSERT(config->vertex_size); - if (!ctx || !cmds || !vertices || !elements || !config || !config->vertex_layout) - return NK_CONVERT_INVALID_PARAM; - - nk_draw_list_setup(&ctx->draw_list, config, cmds, vertices, elements, - config->line_AA, config->shape_AA); - nk_foreach(cmd, ctx) - { -#ifdef NK_INCLUDE_COMMAND_USERDATA - ctx->draw_list.userdata = cmd->userdata; -#endif - switch (cmd->type) { - case NK_COMMAND_NOP: break; - case NK_COMMAND_SCISSOR: { - const struct nk_command_scissor *s = (const struct nk_command_scissor*)cmd; - nk_draw_list_add_clip(&ctx->draw_list, nk_rect(s->x, s->y, s->w, s->h)); - } break; - case NK_COMMAND_LINE: { - const struct nk_command_line *l = (const struct nk_command_line*)cmd; - nk_draw_list_stroke_line(&ctx->draw_list, nk_vec2(l->begin.x, l->begin.y), - nk_vec2(l->end.x, l->end.y), l->color, l->line_thickness); - } break; - case NK_COMMAND_CURVE: { - const struct nk_command_curve *q = (const struct nk_command_curve*)cmd; - nk_draw_list_stroke_curve(&ctx->draw_list, nk_vec2(q->begin.x, q->begin.y), - nk_vec2(q->ctrl[0].x, q->ctrl[0].y), nk_vec2(q->ctrl[1].x, - q->ctrl[1].y), nk_vec2(q->end.x, q->end.y), q->color, - config->curve_segment_count, q->line_thickness); - } break; - case NK_COMMAND_RECT: { - const struct nk_command_rect *r = (const struct nk_command_rect*)cmd; - nk_draw_list_stroke_rect(&ctx->draw_list, nk_rect(r->x, r->y, r->w, r->h), - r->color, (float)r->rounding, r->line_thickness); - } break; - case NK_COMMAND_RECT_FILLED: { - const struct nk_command_rect_filled *r = (const struct nk_command_rect_filled*)cmd; - nk_draw_list_fill_rect(&ctx->draw_list, nk_rect(r->x, r->y, r->w, r->h), - r->color, (float)r->rounding); - } break; - case NK_COMMAND_RECT_MULTI_COLOR: { - const struct nk_command_rect_multi_color *r = (const struct nk_command_rect_multi_color*)cmd; - nk_draw_list_fill_rect_multi_color(&ctx->draw_list, nk_rect(r->x, r->y, r->w, r->h), - r->left, r->top, r->right, r->bottom); - } break; - case NK_COMMAND_CIRCLE: { - const struct nk_command_circle *c = (const struct nk_command_circle*)cmd; - nk_draw_list_stroke_circle(&ctx->draw_list, nk_vec2((float)c->x + (float)c->w/2, - (float)c->y + (float)c->h/2), (float)c->w/2, c->color, - config->circle_segment_count, c->line_thickness); - } break; - case NK_COMMAND_CIRCLE_FILLED: { - const struct nk_command_circle_filled *c = (const struct nk_command_circle_filled *)cmd; - nk_draw_list_fill_circle(&ctx->draw_list, nk_vec2((float)c->x + (float)c->w/2, - (float)c->y + (float)c->h/2), (float)c->w/2, c->color, - config->circle_segment_count); - } break; - case NK_COMMAND_ARC: { - const struct nk_command_arc *c = (const struct nk_command_arc*)cmd; - nk_draw_list_path_line_to(&ctx->draw_list, nk_vec2(c->cx, c->cy)); - nk_draw_list_path_arc_to(&ctx->draw_list, nk_vec2(c->cx, c->cy), c->r, - c->a[0], c->a[1], config->arc_segment_count); - nk_draw_list_path_stroke(&ctx->draw_list, c->color, NK_STROKE_CLOSED, c->line_thickness); - } break; - case NK_COMMAND_ARC_FILLED: { - const struct nk_command_arc_filled *c = (const struct nk_command_arc_filled*)cmd; - nk_draw_list_path_line_to(&ctx->draw_list, nk_vec2(c->cx, c->cy)); - nk_draw_list_path_arc_to(&ctx->draw_list, nk_vec2(c->cx, c->cy), c->r, - c->a[0], c->a[1], config->arc_segment_count); - nk_draw_list_path_fill(&ctx->draw_list, c->color); - } break; - case NK_COMMAND_TRIANGLE: { - const struct nk_command_triangle *t = (const struct nk_command_triangle*)cmd; - nk_draw_list_stroke_triangle(&ctx->draw_list, nk_vec2(t->a.x, t->a.y), - nk_vec2(t->b.x, t->b.y), nk_vec2(t->c.x, t->c.y), t->color, - t->line_thickness); - } break; - case NK_COMMAND_TRIANGLE_FILLED: { - const struct nk_command_triangle_filled *t = (const struct nk_command_triangle_filled*)cmd; - nk_draw_list_fill_triangle(&ctx->draw_list, nk_vec2(t->a.x, t->a.y), - nk_vec2(t->b.x, t->b.y), nk_vec2(t->c.x, t->c.y), t->color); - } break; - case NK_COMMAND_POLYGON: { - int i; - const struct nk_command_polygon*p = (const struct nk_command_polygon*)cmd; - for (i = 0; i < p->point_count; ++i) { - struct nk_vec2 pnt = nk_vec2((float)p->points[i].x, (float)p->points[i].y); - nk_draw_list_path_line_to(&ctx->draw_list, pnt); - } - nk_draw_list_path_stroke(&ctx->draw_list, p->color, NK_STROKE_CLOSED, p->line_thickness); - } break; - case NK_COMMAND_POLYGON_FILLED: { - int i; - const struct nk_command_polygon_filled *p = (const struct nk_command_polygon_filled*)cmd; - for (i = 0; i < p->point_count; ++i) { - struct nk_vec2 pnt = nk_vec2((float)p->points[i].x, (float)p->points[i].y); - nk_draw_list_path_line_to(&ctx->draw_list, pnt); - } - nk_draw_list_path_fill(&ctx->draw_list, p->color); - } break; - case NK_COMMAND_POLYLINE: { - int i; - const struct nk_command_polyline *p = (const struct nk_command_polyline*)cmd; - for (i = 0; i < p->point_count; ++i) { - struct nk_vec2 pnt = nk_vec2((float)p->points[i].x, (float)p->points[i].y); - nk_draw_list_path_line_to(&ctx->draw_list, pnt); - } - nk_draw_list_path_stroke(&ctx->draw_list, p->color, NK_STROKE_OPEN, p->line_thickness); - } break; - case NK_COMMAND_TEXT: { - const struct nk_command_text *t = (const struct nk_command_text*)cmd; - nk_draw_list_add_text(&ctx->draw_list, t->font, nk_rect(t->x, t->y, t->w, t->h), - t->string, t->length, t->height, t->foreground); - } break; - case NK_COMMAND_IMAGE: { - const struct nk_command_image *i = (const struct nk_command_image*)cmd; - nk_draw_list_add_image(&ctx->draw_list, i->img, nk_rect(i->x, i->y, i->w, i->h), i->col); - } break; - case NK_COMMAND_CUSTOM: { - const struct nk_command_custom *c = (const struct nk_command_custom*)cmd; - c->callback(&ctx->draw_list, c->x, c->y, c->w, c->h, c->callback_data); - } break; - default: break; - } - } - res |= (cmds->needed > cmds->allocated + (cmds->memory.size - cmds->size)) ? NK_CONVERT_COMMAND_BUFFER_FULL: 0; - res |= (vertices->needed > vertices->allocated) ? NK_CONVERT_VERTEX_BUFFER_FULL: 0; - res |= (elements->needed > elements->allocated) ? NK_CONVERT_ELEMENT_BUFFER_FULL: 0; - return res; -} -NK_API const struct nk_draw_command* -nk__draw_begin(const struct nk_context *ctx, - const struct nk_buffer *buffer) -{ - return nk__draw_list_begin(&ctx->draw_list, buffer); -} -NK_API const struct nk_draw_command* -nk__draw_end(const struct nk_context *ctx, const struct nk_buffer *buffer) -{ - return nk__draw_list_end(&ctx->draw_list, buffer); -} -NK_API const struct nk_draw_command* -nk__draw_next(const struct nk_draw_command *cmd, - const struct nk_buffer *buffer, const struct nk_context *ctx) -{ - return nk__draw_list_next(cmd, buffer, &ctx->draw_list); -} -#endif - - -/* stb_rect_pack.h - v1.01 - public domain - rectangle packing */ -/* Sean Barrett 2014 */ -/* */ -/* Useful for e.g. packing rectangular textures into an atlas. */ -/* Does not do rotation. */ -/* */ -/* Before #including, */ -/* */ -/* #define STB_RECT_PACK_IMPLEMENTATION */ -/* */ -/* in the file that you want to have the implementation. */ -/* */ -/* Not necessarily the awesomest packing method, but better than */ -/* the totally naive one in stb_truetype (which is primarily what */ -/* this is meant to replace). */ -/* */ -/* Has only had a few tests run, may have issues. */ -/* */ -/* More docs to come. */ -/* */ -/* No memory allocations; uses qsort() and assert() from stdlib. */ -/* Can override those by defining STBRP_SORT and STBRP_ASSERT. */ -/* */ -/* This library currently uses the Skyline Bottom-Left algorithm. */ -/* */ -/* Please note: better rectangle packers are welcome! Please */ -/* implement them to the same API, but with a different init */ -/* function. */ -/* */ -/* Credits */ -/* */ -/* Library */ -/* Sean Barrett */ -/* Minor features */ -/* Martins Mozeiko */ -/* github:IntellectualKitty */ -/* */ -/* Bugfixes / warning fixes */ -/* Jeremy Jaussaud */ -/* Fabian Giesen */ -/* */ -/* Version history: */ -/* */ -/* 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section */ -/* 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles */ -/* 0.99 (2019-02-07) warning fixes */ -/* 0.11 (2017-03-03) return packing success/fail result */ -/* 0.10 (2016-10-25) remove cast-away-const to avoid warnings */ -/* 0.09 (2016-08-27) fix compiler warnings */ -/* 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0) */ -/* 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0) */ -/* 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort */ -/* 0.05: added STBRP_ASSERT to allow replacing assert */ -/* 0.04: fixed minor bug in STBRP_LARGE_RECTS support */ -/* 0.01: initial release */ -/* */ -/* LICENSE */ -/* */ -/* See end of file for license information. */ - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* INCLUDE SECTION */ -/* */ - -#ifndef STB_INCLUDE_STB_RECT_PACK_H -#define STB_INCLUDE_STB_RECT_PACK_H - -#define STB_RECT_PACK_VERSION 1 - -#ifdef STBRP_STATIC -#define STBRP_DEF static -#else -#define STBRP_DEF extern -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct stbrp_context stbrp_context; -typedef struct stbrp_node stbrp_node; -typedef struct stbrp_rect stbrp_rect; - -typedef int stbrp_coord; - -#define STBRP__MAXVAL 0x7fffffff -/* Mostly for internal use, but this is the maximum supported coordinate value. */ - -STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects); -/* Assign packed locations to rectangles. The rectangles are of type */ -/* 'stbrp_rect' defined below, stored in the array 'rects', and there */ -/* are 'num_rects' many of them. */ -/* */ -/* Rectangles which are successfully packed have the 'was_packed' flag */ -/* set to a non-zero value and 'x' and 'y' store the minimum location */ -/* on each axis (i.e. bottom-left in cartesian coordinates, top-left */ -/* if you imagine y increasing downwards). Rectangles which do not fit */ -/* have the 'was_packed' flag set to 0. */ -/* */ -/* You should not try to access the 'rects' array from another thread */ -/* while this function is running, as the function temporarily reorders */ -/* the array while it executes. */ -/* */ -/* To pack into another rectangle, you need to call stbrp_init_target */ -/* again. To continue packing into the same rectangle, you can call */ -/* this function again. Calling this multiple times with multiple rect */ -/* arrays will probably produce worse packing results than calling it */ -/* a single time with the full rectangle array, but the option is */ -/* available. */ -/* */ -/* The function returns 1 if all of the rectangles were successfully */ -/* packed and 0 otherwise. */ - -struct stbrp_rect -{ - /* reserved for your use: */ - int id; - - /* input: */ - stbrp_coord w, h; - - /* output: */ - stbrp_coord x, y; - int was_packed; /* non-zero if valid packing */ - -}; /* 16 bytes, nominally */ - - -STBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes); -/* Initialize a rectangle packer to: */ -/* pack a rectangle that is 'width' by 'height' in dimensions */ -/* using temporary storage provided by the array 'nodes', which is 'num_nodes' long */ -/* */ -/* You must call this function every time you start packing into a new target. */ -/* */ -/* There is no "shutdown" function. The 'nodes' memory must stay valid for */ -/* the following stbrp_pack_rects() call (or calls), but can be freed after */ -/* the call (or calls) finish. */ -/* */ -/* Note: to guarantee best results, either: */ -/* 1. make sure 'num_nodes' >= 'width' */ -/* or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1' */ -/* */ -/* If you don't do either of the above things, widths will be quantized to multiples */ -/* of small integers to guarantee the algorithm doesn't run out of temporary storage. */ -/* */ -/* If you do #2, then the non-quantized algorithm will be used, but the algorithm */ -/* may run out of temporary storage and be unable to pack some rectangles. */ - -STBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem); -/* Optionally call this function after init but before doing any packing to */ -/* change the handling of the out-of-temp-memory scenario, described above. */ -/* If you call init again, this will be reset to the default (false). */ - - -STBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic); -/* Optionally select which packing heuristic the library should use. Different */ -/* heuristics will produce better/worse results for different data sets. */ -/* If you call init again, this will be reset to the default. */ - -enum -{ - STBRP_HEURISTIC_Skyline_default=0, - STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, - STBRP_HEURISTIC_Skyline_BF_sortHeight -}; - - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* the details of the following structures don't matter to you, but they must */ -/* be visible so you can handle the memory allocations for them */ - -struct stbrp_node -{ - stbrp_coord x,y; - stbrp_node *next; -}; - -struct stbrp_context -{ - int width; - int height; - int align; - int init_mode; - int heuristic; - int num_nodes; - stbrp_node *active_head; - stbrp_node *free_head; - stbrp_node extra[2]; /* we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' */ -}; - -#ifdef __cplusplus -} -#endif - -#endif - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* IMPLEMENTATION SECTION */ -/* */ - -#ifdef STB_RECT_PACK_IMPLEMENTATION -#ifndef STBRP_SORT -#include -#define STBRP_SORT qsort -#endif - -#ifndef STBRP_ASSERT -#include -#define STBRP_ASSERT assert -#endif - -#ifdef _MSC_VER -#define STBRP__NOTUSED(v) (void)(v) -#define STBRP__CDECL __cdecl -#else -#define STBRP__NOTUSED(v) (void)sizeof(v) -#define STBRP__CDECL -#endif - -enum -{ - STBRP__INIT_skyline = 1 -}; - -STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic) -{ - switch (context->init_mode) { - case STBRP__INIT_skyline: - STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); - context->heuristic = heuristic; - break; - default: - STBRP_ASSERT(0); - } -} - -STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem) -{ - if (allow_out_of_mem) - /* if it's ok to run out of memory, then don't bother aligning them; */ - /* this gives better packing, but may fail due to OOM (even though */ - /* the rectangles easily fit). @TODO a smarter approach would be to only */ - /* quantize once we've hit OOM, then we could get rid of this parameter. */ - context->align = 1; - else { - /* if it's not ok to run out of memory, then quantize the widths */ - /* so that num_nodes is always enough nodes. */ - /* */ - /* I.e. num_nodes * align >= width */ - /* align >= width / num_nodes */ - /* align = ceil(width/num_nodes) */ - - context->align = (context->width + context->num_nodes-1) / context->num_nodes; - } -} - -STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes) -{ - int i; - - for (i=0; i < num_nodes-1; ++i) - nodes[i].next = &nodes[i+1]; - nodes[i].next = NULL; - context->init_mode = STBRP__INIT_skyline; - context->heuristic = STBRP_HEURISTIC_Skyline_default; - context->free_head = &nodes[0]; - context->active_head = &context->extra[0]; - context->width = width; - context->height = height; - context->num_nodes = num_nodes; - stbrp_setup_allow_out_of_mem(context, 0); - - /* node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) */ - context->extra[0].x = 0; - context->extra[0].y = 0; - context->extra[0].next = &context->extra[1]; - context->extra[1].x = (stbrp_coord) width; - context->extra[1].y = (1<<30); - context->extra[1].next = NULL; -} - -/* find minimum y position if it starts at x1 */ -static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste) -{ - stbrp_node *node = first; - int x1 = x0 + width; - int min_y, visited_width, waste_area; - - STBRP__NOTUSED(c); - - STBRP_ASSERT(first->x <= x0); - - #if 0 - /* skip in case we're past the node */ - while (node->next->x <= x0) - ++node; - #else - STBRP_ASSERT(node->next->x > x0); /* we ended up handling this in the caller for efficiency */ - #endif - - STBRP_ASSERT(node->x <= x0); - - min_y = 0; - waste_area = 0; - visited_width = 0; - while (node->x < x1) { - if (node->y > min_y) { - /* raise min_y higher. */ - /* we've accounted for all waste up to min_y, */ - /* but we'll now add more waste for everything we've visted */ - waste_area += visited_width * (node->y - min_y); - min_y = node->y; - /* the first time through, visited_width might be reduced */ - if (node->x < x0) - visited_width += node->next->x - x0; - else - visited_width += node->next->x - node->x; - } else { - /* add waste area */ - int under_width = node->next->x - node->x; - if (under_width + visited_width > width) - under_width = width - visited_width; - waste_area += under_width * (min_y - node->y); - visited_width += under_width; - } - node = node->next; - } - - *pwaste = waste_area; - return min_y; -} - -typedef struct -{ - int x,y; - stbrp_node **prev_link; -} stbrp__findresult; - -static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height) -{ - int best_waste = (1<<30), best_x, best_y = (1 << 30); - stbrp__findresult fr; - stbrp_node **prev, *node, *tail, **best = NULL; - - /* align to multiple of c->align */ - width = (width + c->align - 1); - width -= width % c->align; - STBRP_ASSERT(width % c->align == 0); - - /* if it can't possibly fit, bail immediately */ - if (width > c->width || height > c->height) { - fr.prev_link = NULL; - fr.x = fr.y = 0; - return fr; - } - - node = c->active_head; - prev = &c->active_head; - while (node->x + width <= c->width) { - int y,waste; - y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); - if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { /* actually just want to test BL */ - /* bottom left */ - if (y < best_y) { - best_y = y; - best = prev; - } - } else { - /* best-fit */ - if (y + height <= c->height) { - /* can only use it if it first vertically */ - if (y < best_y || (y == best_y && waste < best_waste)) { - best_y = y; - best_waste = waste; - best = prev; - } - } - } - prev = &node->next; - node = node->next; - } - - best_x = (best == NULL) ? 0 : (*best)->x; - - /* if doing best-fit (BF), we also have to try aligning right edge to each node position */ - /* */ - /* e.g, if fitting */ - /* */ - /* ____________________ */ - /* |____________________| */ - /* */ - /* into */ - /* */ - /* | | */ - /* | ____________| */ - /* |____________| */ - /* */ - /* then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned */ - /* */ - /* This makes BF take about 2x the time */ - - if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) { - tail = c->active_head; - node = c->active_head; - prev = &c->active_head; - /* find first node that's admissible */ - while (tail->x < width) - tail = tail->next; - while (tail) { - int xpos = tail->x - width; - int y,waste; - STBRP_ASSERT(xpos >= 0); - /* find the left position that matches this */ - while (node->next->x <= xpos) { - prev = &node->next; - node = node->next; - } - STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); - y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); - if (y + height <= c->height) { - if (y <= best_y) { - if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) { - best_x = xpos; - STBRP_ASSERT(y <= best_y); - best_y = y; - best_waste = waste; - best = prev; - } - } - } - tail = tail->next; - } - } - - fr.prev_link = best; - fr.x = best_x; - fr.y = best_y; - return fr; -} - -static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height) -{ - /* find best position according to heuristic */ - stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); - stbrp_node *node, *cur; - - /* bail if: */ - /* 1. it failed */ - /* 2. the best node doesn't fit (we don't always check this) */ - /* 3. we're out of memory */ - if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) { - res.prev_link = NULL; - return res; - } - - /* on success, create new node */ - node = context->free_head; - node->x = (stbrp_coord) res.x; - node->y = (stbrp_coord) (res.y + height); - - context->free_head = node->next; - - /* insert the new node into the right starting point, and */ - /* let 'cur' point to the remaining nodes needing to be */ - /* stiched back in */ - - cur = *res.prev_link; - if (cur->x < res.x) { - /* preserve the existing one, so start testing with the next one */ - stbrp_node *next = cur->next; - cur->next = node; - cur = next; - } else { - *res.prev_link = node; - } - - /* from here, traverse cur and free the nodes, until we get to one */ - /* that shouldn't be freed */ - while (cur->next && cur->next->x <= res.x + width) { - stbrp_node *next = cur->next; - /* move the current node to the free list */ - cur->next = context->free_head; - context->free_head = cur; - cur = next; - } - - /* stitch the list back in */ - node->next = cur; - - if (cur->x < res.x + width) - cur->x = (stbrp_coord) (res.x + width); - -#ifdef _DEBUG - cur = context->active_head; - while (cur->x < context->width) { - STBRP_ASSERT(cur->x < cur->next->x); - cur = cur->next; - } - STBRP_ASSERT(cur->next == NULL); - - { - int count=0; - cur = context->active_head; - while (cur) { - cur = cur->next; - ++count; - } - cur = context->free_head; - while (cur) { - cur = cur->next; - ++count; - } - STBRP_ASSERT(count == context->num_nodes+2); - } -#endif - - return res; -} - -static int STBRP__CDECL rect_height_compare(const void *a, const void *b) -{ - const stbrp_rect *p = (const stbrp_rect *) a; - const stbrp_rect *q = (const stbrp_rect *) b; - if (p->h > q->h) - return -1; - if (p->h < q->h) - return 1; - return (p->w > q->w) ? -1 : (p->w < q->w); -} - -static int STBRP__CDECL rect_original_order(const void *a, const void *b) -{ - const stbrp_rect *p = (const stbrp_rect *) a; - const stbrp_rect *q = (const stbrp_rect *) b; - return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); -} - -STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects) -{ - int i, all_rects_packed = 1; - - /* we use the 'was_packed' field internally to allow sorting/unsorting */ - for (i=0; i < num_rects; ++i) { - rects[i].was_packed = i; - } - - /* sort according to heuristic */ - STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); - - for (i=0; i < num_rects; ++i) { - if (rects[i].w == 0 || rects[i].h == 0) { - rects[i].x = rects[i].y = 0; /* empty rect needs no space */ - } else { - stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); - if (fr.prev_link) { - rects[i].x = (stbrp_coord) fr.x; - rects[i].y = (stbrp_coord) fr.y; - } else { - rects[i].x = rects[i].y = STBRP__MAXVAL; - } - } - } - - /* unsort */ - STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); - - /* set was_packed flags and all_rects_packed status */ - for (i=0; i < num_rects; ++i) { - rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); - if (!rects[i].was_packed) - all_rects_packed = 0; - } - - /* return the all_rects_packed status */ - return all_rects_packed; -} -#endif - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -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: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the 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 -AUTHORS 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 IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -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 -AUTHORS 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 IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ - -/* stb_truetype.h - v1.26 - public domain */ -/* authored from 2009-2021 by Sean Barrett / RAD Game Tools */ -/* */ -/* ======================================================================= */ -/* */ -/* NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES */ -/* */ -/* This library does no range checking of the offsets found in the file, */ -/* meaning an attacker can use it to read arbitrary memory. */ -/* */ -/* ======================================================================= */ -/* */ -/* This library processes TrueType files: */ -/* parse files */ -/* extract glyph metrics */ -/* extract glyph shapes */ -/* render glyphs to one-channel bitmaps with antialiasing (box filter) */ -/* render glyphs to one-channel SDF bitmaps (signed-distance field/function) */ -/* */ -/* Todo: */ -/* non-MS cmaps */ -/* crashproof on bad data */ -/* hinting? (no longer patented) */ -/* cleartype-style AA? */ -/* optimize: use simple memory allocator for intermediates */ -/* optimize: build edge-list directly from curves */ -/* optimize: rasterize directly from curves? */ -/* */ -/* ADDITIONAL CONTRIBUTORS */ -/* */ -/* Mikko Mononen: compound shape support, more cmap formats */ -/* Tor Andersson: kerning, subpixel rendering */ -/* Dougall Johnson: OpenType / Type 2 font handling */ -/* Daniel Ribeiro Maciel: basic GPOS-based kerning */ -/* */ -/* Misc other: */ -/* Ryan Gordon */ -/* Simon Glass */ -/* github:IntellectualKitty */ -/* Imanol Celaya */ -/* Daniel Ribeiro Maciel */ -/* */ -/* Bug/warning reports/fixes: */ -/* "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe */ -/* Cass Everitt Martins Mozeiko github:aloucks */ -/* stoiko (Haemimont Games) Cap Petschulat github:oyvindjam */ -/* Brian Hook Omar Cornut github:vassvik */ -/* Walter van Niftrik Ryan Griege */ -/* David Gow Peter LaValle */ -/* David Given Sergey Popov */ -/* Ivan-Assen Ivanov Giumo X. Clanjor */ -/* Anthony Pesch Higor Euripedes */ -/* Johan Duparc Thomas Fields */ -/* Hou Qiming Derek Vinyard */ -/* Rob Loach Cort Stratton */ -/* Kenney Phillis Jr. Brian Costabile */ -/* Ken Voskuil (kaesve) */ -/* */ -/* VERSION HISTORY */ -/* */ -/* 1.26 (2021-08-28) fix broken rasterizer */ -/* 1.25 (2021-07-11) many fixes */ -/* 1.24 (2020-02-05) fix warning */ -/* 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) */ -/* 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined */ -/* 1.21 (2019-02-25) fix warning */ -/* 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() */ -/* 1.19 (2018-02-11) GPOS kerning, STBTT_fmod */ -/* 1.18 (2018-01-29) add missing function */ -/* 1.17 (2017-07-23) make more arguments const; doc fix */ -/* 1.16 (2017-07-12) SDF support */ -/* 1.15 (2017-03-03) make more arguments const */ -/* 1.14 (2017-01-16) num-fonts-in-TTC function */ -/* 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts */ -/* 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual */ -/* 1.11 (2016-04-02) fix unused-variable warning */ -/* 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef */ -/* 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly */ -/* 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges */ -/* 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; */ -/* variant PackFontRanges to pack and render in separate phases; */ -/* fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); */ -/* fixed an assert() bug in the new rasterizer */ -/* replace assert() with STBTT_assert() in new rasterizer */ -/* */ -/* Full history can be found at the end of this file. */ -/* */ -/* LICENSE */ -/* */ -/* See end of file for license information. */ -/* */ -/* USAGE */ -/* */ -/* Include this file in whatever places need to refer to it. In ONE C/C++ */ -/* file, write: */ -/* #define STB_TRUETYPE_IMPLEMENTATION */ -/* before the #include of this file. This expands out the actual */ -/* implementation into that C/C++ file. */ -/* */ -/* To make the implementation private to the file that generates the implementation, */ -/* #define STBTT_STATIC */ -/* */ -/* Simple 3D API (don't ship this, but it's fine for tools and quick start) */ -/* stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture */ -/* stbtt_GetBakedQuad() -- compute quad to draw for a given char */ -/* */ -/* Improved 3D API (more shippable): */ -/* #include "stb_rect_pack.h" -- optional, but you really want it */ -/* stbtt_PackBegin() */ -/* stbtt_PackSetOversampling() -- for improved quality on small fonts */ -/* stbtt_PackFontRanges() -- pack and renders */ -/* stbtt_PackEnd() */ -/* stbtt_GetPackedQuad() */ -/* */ -/* "Load" a font file from a memory buffer (you have to keep the buffer loaded) */ -/* stbtt_InitFont() */ -/* stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections */ -/* stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections */ -/* */ -/* Render a unicode codepoint to a bitmap */ -/* stbtt_GetCodepointBitmap() -- allocates and returns a bitmap */ -/* stbtt_MakeCodepointBitmap() -- renders into bitmap you provide */ -/* stbtt_GetCodepointBitmapBox() -- how big the bitmap must be */ -/* */ -/* Character advance/positioning */ -/* stbtt_GetCodepointHMetrics() */ -/* stbtt_GetFontVMetrics() */ -/* stbtt_GetFontVMetricsOS2() */ -/* stbtt_GetCodepointKernAdvance() */ -/* */ -/* Starting with version 1.06, the rasterizer was replaced with a new, */ -/* faster and generally-more-precise rasterizer. The new rasterizer more */ -/* accurately measures pixel coverage for anti-aliasing, except in the case */ -/* where multiple shapes overlap, in which case it overestimates the AA pixel */ -/* coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If */ -/* this turns out to be a problem, you can re-enable the old rasterizer with */ -/* #define STBTT_RASTERIZER_VERSION 1 */ -/* which will incur about a 15% speed hit. */ -/* */ -/* ADDITIONAL DOCUMENTATION */ -/* */ -/* Immediately after this block comment are a series of sample programs. */ -/* */ -/* After the sample programs is the "header file" section. This section */ -/* includes documentation for each API function. */ -/* */ -/* Some important concepts to understand to use this library: */ -/* */ -/* Codepoint */ -/* Characters are defined by unicode codepoints, e.g. 65 is */ -/* uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is */ -/* the hiragana for "ma". */ -/* */ -/* Glyph */ -/* A visual character shape (every codepoint is rendered as */ -/* some glyph) */ -/* */ -/* Glyph index */ -/* A font-specific integer ID representing a glyph */ -/* */ -/* Baseline */ -/* Glyph shapes are defined relative to a baseline, which is the */ -/* bottom of uppercase characters. Characters extend both above */ -/* and below the baseline. */ -/* */ -/* Current Point */ -/* As you draw text to the screen, you keep track of a "current point" */ -/* which is the origin of each character. The current point's vertical */ -/* position is the baseline. Even "baked fonts" use this model. */ -/* */ -/* Vertical Font Metrics */ -/* The vertical qualities of the font, used to vertically position */ -/* and space the characters. See docs for stbtt_GetFontVMetrics. */ -/* */ -/* Font Size in Pixels or Points */ -/* The preferred interface for specifying font sizes in stb_truetype */ -/* is to specify how tall the font's vertical extent should be in pixels. */ -/* If that sounds good enough, skip the next paragraph. */ -/* */ -/* Most font APIs instead use "points", which are a common typographic */ -/* measurement for describing font size, defined as 72 points per inch. */ -/* stb_truetype provides a point API for compatibility. However, true */ -/* "per inch" conventions don't make much sense on computer displays */ -/* since different monitors have different number of pixels per */ -/* inch. For example, Windows traditionally uses a convention that */ -/* there are 96 pixels per inch, thus making 'inch' measurements have */ -/* nothing to do with inches, and thus effectively defining a point to */ -/* be 1.333 pixels. Additionally, the TrueType font data provides */ -/* an explicit scale factor to scale a given font's glyphs to points, */ -/* but the author has observed that this scale factor is often wrong */ -/* for non-commercial fonts, thus making fonts scaled in points */ -/* according to the TrueType spec incoherently sized in practice. */ -/* */ -/* DETAILED USAGE: */ -/* */ -/* Scale: */ -/* Select how high you want the font to be, in points or pixels. */ -/* Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute */ -/* a scale factor SF that will be used by all other functions. */ -/* */ -/* Baseline: */ -/* You need to select a y-coordinate that is the baseline of where */ -/* your text will appear. Call GetFontBoundingBox to get the baseline-relative */ -/* bounding box for all characters. SF*-y0 will be the distance in pixels */ -/* that the worst-case character could extend above the baseline, so if */ -/* you want the top edge of characters to appear at the top of the */ -/* screen where y=0, then you would set the baseline to SF*-y0. */ -/* */ -/* Current point: */ -/* Set the current point where the first character will appear. The */ -/* first character could extend left of the current point; this is font */ -/* dependent. You can either choose a current point that is the leftmost */ -/* point and hope, or add some padding, or check the bounding box or */ -/* left-side-bearing of the first character to be displayed and set */ -/* the current point based on that. */ -/* */ -/* Displaying a character: */ -/* Compute the bounding box of the character. It will contain signed values */ -/* relative to . I.e. if it returns x0,y0,x1,y1, */ -/* then the character should be displayed in the rectangle from */ -/* to = 32 && *text < 128) { - stbtt_aligned_quad q; - stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);/* 1=opengl & d3d10+,0=d3d9 */ - glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y0); - glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y0); - glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y1); - glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y1); - } - ++text; - } - glEnd(); -} -#endif -/* */ -/* */ -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* Complete program (this compiles): get a single bitmap, print as ASCII art */ -/* */ -#if 0 -#include -#define STB_TRUETYPE_IMPLEMENTATION /* force following include to generate implementation */ -#include "stb_truetype.h" - -char ttf_buffer[1<<25]; - -int main(int argc, char **argv) -{ - stbtt_fontinfo font; - unsigned char *bitmap; - int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); - - fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); - - stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); - bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); - - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) - putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); - putchar('\n'); - } - return 0; -} -#endif -/* */ -/* Output: */ -/* */ -/* .ii. */ -/* @@@@@@. */ -/* V@Mio@@o */ -/* :i. V@V */ -/* :oM@@M */ -/* :@@@MM@M */ -/* @@o o@M */ -/* :@@. M@M */ -/* @@@o@@@@ */ -/* :M@@V:@@. */ -/* */ -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* Complete program: print "Hello World!" banner, with bugs */ -/* */ -#if 0 -char buffer[24<<20]; -unsigned char screen[20][79]; - -int main(int arg, char **argv) -{ - stbtt_fontinfo font; - int i,j,ascent,baseline,ch=0; - float scale, xpos=2; /* leave a little padding in case the character extends left */ - char *text = "Heljo World!"; /* intentionally misspelled to show 'lj' brokenness */ - - fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); - stbtt_InitFont(&font, buffer, 0); - - scale = stbtt_ScaleForPixelHeight(&font, 15); - stbtt_GetFontVMetrics(&font, &ascent,0,0); - baseline = (int) (ascent*scale); - - while (text[ch]) { - int advance,lsb,x0,y0,x1,y1; - float x_shift = xpos - (float) floor(xpos); - stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); - stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); - stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); - /* note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong */ - /* because this API is really for baking character bitmaps into textures. if you want to render */ - /* a sequence of characters, you really need to render each bitmap to a temp buffer, then */ - /* "alpha blend" that into the working buffer */ - xpos += (advance * scale); - if (text[ch+1]) - xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); - ++ch; - } - - for (j=0; j < 20; ++j) { - for (i=0; i < 78; ++i) - putchar(" .:ioVM@"[screen[j][i]>>5]); - putchar('\n'); - } - - return 0; -} -#endif - - -/* //////////////////////////////////////////////////////////////////////////// */ -/* //////////////////////////////////////////////////////////////////////////// */ -/* // */ -/* // INTEGRATION WITH YOUR CODEBASE */ -/* // */ -/* // The following sections allow you to supply alternate definitions */ -/* // of C library functions used by stb_truetype, e.g. if you don't */ -/* // link with the C runtime library. */ - -#ifdef STB_TRUETYPE_IMPLEMENTATION - /* #define your own (u)stbtt_int8/16/32 before including to override this */ - #ifndef stbtt_uint8 - typedef unsigned char stbtt_uint8; - typedef signed char stbtt_int8; - typedef unsigned short stbtt_uint16; - typedef signed short stbtt_int16; - typedef unsigned int stbtt_uint32; - typedef signed int stbtt_int32; - #endif - - typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; - typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; - - /* e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h */ - #ifndef STBTT_ifloor - #include - #define STBTT_ifloor(x) ((int) floor(x)) - #define STBTT_iceil(x) ((int) ceil(x)) - #endif - - #ifndef STBTT_sqrt - #include - #define STBTT_sqrt(x) sqrt(x) - #define STBTT_pow(x,y) pow(x,y) - #endif - - #ifndef STBTT_fmod - #include - #define STBTT_fmod(x,y) fmod(x,y) - #endif - - #ifndef STBTT_cos - #include - #define STBTT_cos(x) cos(x) - #define STBTT_acos(x) acos(x) - #endif - - #ifndef STBTT_fabs - #include - #define STBTT_fabs(x) fabs(x) - #endif - - /* #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h */ - #ifndef STBTT_malloc - #include - #define STBTT_malloc(x,u) ((void)(u),malloc(x)) - #define STBTT_free(x,u) ((void)(u),free(x)) - #endif - - #ifndef STBTT_assert - #include - #define STBTT_assert(x) assert(x) - #endif - - #ifndef STBTT_strlen - #include - #define STBTT_strlen(x) strlen(x) - #endif - - #ifndef STBTT_memcpy - #include - #define STBTT_memcpy memcpy - #define STBTT_memset memset - #endif -#endif - -/* ///////////////////////////////////////////////////////////////////////////// */ -/* ///////////////////////////////////////////////////////////////////////////// */ -/* // */ -/* // INTERFACE */ -/* // */ -/* // */ - -#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ -#define __STB_INCLUDE_STB_TRUETYPE_H__ - -#ifdef STBTT_STATIC -#define STBTT_DEF static -#else -#define STBTT_DEF extern -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* private structure */ -typedef struct -{ - unsigned char *data; - int cursor; - int size; -} stbtt__buf; - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* TEXTURE BAKING API */ -/* */ -/* If you use this API, you only have to call two functions ever. */ -/* */ - -typedef struct -{ - unsigned short x0,y0,x1,y1; /* coordinates of bbox in bitmap */ - float xoff,yoff,xadvance; -} stbtt_bakedchar; - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, /* font location (use offset=0 for plain .ttf) */ - float pixel_height, /* height of font in pixels */ - unsigned char *pixels, int pw, int ph, /* bitmap to be filled in */ - int first_char, int num_chars, /* characters to bake */ - stbtt_bakedchar *chardata); /* you allocate this, it's num_chars long */ -/* if return is positive, the first unused row of the bitmap */ -/* if return is negative, returns the negative of the number of characters that fit */ -/* if return is 0, no characters fit and no rows were used */ -/* This uses a very crappy packing. */ - -typedef struct -{ - float x0,y0,s0,t0; /* top-left */ - float x1,y1,s1,t1; /* bottom-right */ -} stbtt_aligned_quad; - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, /* same data as above */ - int char_index, /* character to display */ - float *xpos, float *ypos, /* pointers to current position in screen pixel space */ - stbtt_aligned_quad *q, /* output: quad to draw */ - int opengl_fillrule); /* true if opengl fill rule; false if DX9 or earlier */ -/* Call GetBakedQuad with char_index = 'character - first_char', and it */ -/* creates the quad you need to draw and advances the current position. */ -/* */ -/* The coordinate system used assumes y increases downwards. */ -/* */ -/* Characters will extend both above and below the current position; */ -/* see discussion of "BASELINE" above. */ -/* */ -/* It's inefficient; you might want to c&p it and optimize it. */ - -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap); -/* Query the font vertical metrics without having to create a font first. */ - - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* NEW TEXTURE BAKING API */ -/* */ -/* This provides options for packing multiple fonts into one atlas, not */ -/* perfectly but better than nothing. */ - -typedef struct -{ - unsigned short x0,y0,x1,y1; /* coordinates of bbox in bitmap */ - float xoff,yoff,xadvance; - float xoff2,yoff2; -} stbtt_packedchar; - -typedef struct stbtt_pack_context stbtt_pack_context; -typedef struct stbtt_fontinfo stbtt_fontinfo; -#ifndef STB_RECT_PACK_VERSION -typedef struct stbrp_rect stbrp_rect; -#endif - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context); -/* Initializes a packing context stored in the passed-in stbtt_pack_context. */ -/* Future calls using this context will pack characters into the bitmap passed */ -/* in here: a 1-channel bitmap that is width * height. stride_in_bytes is */ -/* the distance from one row to the next (or 0 to mean they are packed tightly */ -/* together). "padding" is the amount of padding to leave between each */ -/* character (normally you want '1' for bitmaps you'll use as textures with */ -/* bilinear filtering). */ -/* */ -/* Returns 0 on failure, 1 on success. */ - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc); -/* Cleans up the packing context and frees all memory. */ - -#define STBTT_POINT_SIZE(x) (-(x)) - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, - int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); -/* Creates character bitmaps from the font_index'th font found in fontdata (use */ -/* font_index=0 if you don't know what that is). It creates num_chars_in_range */ -/* bitmaps for characters with unicode values starting at first_unicode_char_in_range */ -/* and increasing. Data for how to render them is stored in chardata_for_range; */ -/* pass these to stbtt_GetPackedQuad to get back renderable quads. */ -/* */ -/* font_size is the full height of the character from ascender to descender, */ -/* as computed by stbtt_ScaleForPixelHeight. To use a point size as computed */ -/* by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE() */ -/* and pass that result as 'font_size': */ -/* ..., 20 , ... // font max minus min y is 20 pixels tall */ -/* ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall */ - -typedef struct -{ - float font_size; - int first_unicode_codepoint_in_range; /* if non-zero, then the chars are continuous, and this is the first codepoint */ - int *array_of_unicode_codepoints; /* if non-zero, then this is an array of unicode codepoints */ - int num_chars; - stbtt_packedchar *chardata_for_range; /* output */ - unsigned char h_oversample, v_oversample; /* don't set these, they're used internally */ -} stbtt_pack_range; - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); -/* Creates character bitmaps from multiple ranges of characters stored in */ -/* ranges. This will usually create a better-packed bitmap than multiple */ -/* calls to stbtt_PackFontRange. Note that you can call this multiple */ -/* times within a single PackBegin/PackEnd. */ - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample); -/* Oversampling a font increases the quality by allowing higher-quality subpixel */ -/* positioning, and is especially valuable at smaller text sizes. */ -/* */ -/* This function sets the amount of oversampling for all following calls to */ -/* stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given */ -/* pack context. The default (no oversampling) is achieved by h_oversample=1 */ -/* and v_oversample=1. The total number of pixels required is */ -/* h_oversample*v_oversample larger than the default; for example, 2x2 */ -/* oversampling requires 4x the storage of 1x1. For best results, render */ -/* oversampled textures with bilinear filtering. Look at the readme in */ -/* stb/tests/oversample for information about oversampled fonts */ -/* */ -/* To use with PackFontRangesGather etc., you must set it before calls */ -/* call to PackFontRangesGatherRects. */ - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip); -/* If skip != 0, this tells stb_truetype to skip any codepoints for which */ -/* there is no corresponding glyph. If skip=0, which is the default, then */ -/* codepoints without a glyph recived the font's "missing character" glyph, */ -/* typically an empty box by convention. */ - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, /* same data as above */ - int char_index, /* character to display */ - float *xpos, float *ypos, /* pointers to current position in screen pixel space */ - stbtt_aligned_quad *q, /* output: quad to draw */ - int align_to_integer); - -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects); -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -/* Calling these functions in sequence is roughly equivalent to calling */ -/* stbtt_PackFontRanges(). If you more control over the packing of multiple */ -/* fonts, or if you want to pack custom data into a font texture, take a look */ -/* at the source to of stbtt_PackFontRanges() and create a custom version */ -/* using these functions, e.g. call GatherRects multiple times, */ -/* building up a single array of rects, then call PackRects once, */ -/* then call RenderIntoRects repeatedly. This may result in a */ -/* better packing than calling PackFontRanges multiple times */ -/* (or it may not). */ - -/* this is an opaque structure that you shouldn't mess with which holds */ -/* all the context needed from PackBegin to PackEnd. */ -struct stbtt_pack_context { - void *user_allocator_context; - void *pack_info; - int width; - int height; - int stride_in_bytes; - int padding; - int skip_missing; - unsigned int h_oversample, v_oversample; - unsigned char *pixels; - void *nodes; -}; - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* FONT LOADING */ -/* */ -/* */ - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data); -/* This function will determine the number of fonts in a font file. TrueType */ -/* collection (.ttc) files may contain multiple fonts, while TrueType font */ -/* (.ttf) files only contain one font. The number of fonts can be used for */ -/* indexing with the previous function where the index is between zero and one */ -/* less than the total fonts. If an error occurs, -1 is returned. */ - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); -/* Each .ttf/.ttc file may have more than one font. Each font has a sequential */ -/* index number starting from 0. Call this function to get the font offset for */ -/* a given index; it returns -1 if the index is out of range. A regular .ttf */ -/* file will only define one font and it always be at offset 0, so it will */ -/* return '0' for index 0, and -1 for all other indices. */ - -/* The following structure is defined publicly so you can declare one on */ -/* the stack or as a global or etc, but you should treat it as opaque. */ -struct stbtt_fontinfo -{ - void * userdata; - unsigned char * data; /* pointer to .ttf file */ - int fontstart; /* offset of start of font */ - - int numGlyphs; /* number of glyphs, needed for range checking */ - - int loca,head,glyf,hhea,hmtx,kern,gpos,svg; /* table locations as offset from start of .ttf */ - int index_map; /* a cmap mapping for our chosen character encoding */ - int indexToLocFormat; /* format needed to map from glyph index to glyph */ - - stbtt__buf cff; /* cff font data */ - stbtt__buf charstrings; /* the charstring index */ - stbtt__buf gsubrs; /* global charstring subroutines index */ - stbtt__buf subrs; /* private charstring subroutines index */ - stbtt__buf fontdicts; /* array of font dicts */ - stbtt__buf fdselect; /* map from glyph to fontdict */ -}; - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); -/* Given an offset into the file that defines a font, this function builds */ -/* the necessary cached info for the rest of the system. You must allocate */ -/* the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't */ -/* need to do anything special to free it, because the contents are pure */ -/* value data with no additional data structures. Returns 0 on failure. */ - - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* CHARACTER TO GLYPH-INDEX CONVERSIOn */ - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); -/* If you're going to perform multiple operations on the same character */ -/* and you want a speed-up, call this function with the character you're */ -/* going to process, then use glyph-based functions instead of the */ -/* codepoint-based functions. */ -/* Returns 0 if the character codepoint is not defined in the font. */ - - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* CHARACTER PROPERTIES */ -/* */ - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); -/* computes a scale factor to produce a font whose "height" is 'pixels' tall. */ -/* Height is measured as the distance from the highest ascender to the lowest */ -/* descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics */ -/* and computing: */ -/* scale = pixels / (ascent - descent) */ -/* so if you prefer to measure height by the ascent only, use a similar calculation. */ - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); -/* computes a scale factor to produce a font whose EM size is mapped to */ -/* 'pixels' tall. This is probably what traditional APIs compute, but */ -/* I'm not positive. */ - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); -/* ascent is the coordinate above the baseline the font extends; descent */ -/* is the coordinate below the baseline the font extends (i.e. it is typically negative) */ -/* lineGap is the spacing between one row's descent and the next row's ascent... */ -/* so you should advance the vertical position by "*ascent - *descent + *lineGap" */ -/* these are expressed in unscaled coordinates, so you must multiply by */ -/* the scale factor for a given size */ - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap); -/* analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 */ -/* table (specific to MS/Windows TTF files). */ -/* */ -/* Returns 1 on success (table present), 0 on failure. */ - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); -/* the bounding box around all possible characters */ - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); -/* leftSideBearing is the offset from the current horizontal position to the left edge of the character */ -/* advanceWidth is the offset from the current horizontal position to the next horizontal position */ -/* these are expressed in unscaled coordinates */ - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); -/* an additional amount to add to the 'advance' value between ch1 and ch2 */ - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); -/* Gets the bounding box of the visible part of the glyph, in unscaled coordinates */ - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); -/* as above, but takes one or more glyph indices for greater efficiency */ - -typedef struct stbtt_kerningentry -{ - int glyph1; /* use stbtt_FindGlyphIndex */ - int glyph2; - int advance; -} stbtt_kerningentry; - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info); -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length); -/* Retrieves a complete list of all of the kerning pairs provided by the font */ -/* stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. */ -/* The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) */ - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* GLYPH SHAPES (you probably don't need these, but they have to go before */ -/* the bitmaps for C declaration-order reasons) */ -/* */ - -#ifndef STBTT_vmove /* you can predefine these to use different values (but why?) */ - enum { - STBTT_vmove=1, - STBTT_vline, - STBTT_vcurve, - STBTT_vcubic - }; -#endif - -#ifndef stbtt_vertex /* you can predefine this to use different values */ - /* (we share this with other code at RAD) */ - #define stbtt_vertex_type short /* can't use stbtt_int16 because that's not visible in the header file */ - typedef struct - { - stbtt_vertex_type x,y,cx,cy,cx1,cy1; - unsigned char type,padding; - } stbtt_vertex; -#endif - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); -/* returns non-zero if nothing is drawn for this glyph */ - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); -/* returns # of vertices and fills *vertices with the pointer to them */ -/* these are expressed in "unscaled" coordinates */ -/* */ -/* The shape is a series of contours. Each one starts with */ -/* a STBTT_moveto, then consists of a series of mixed */ -/* STBTT_lineto and STBTT_curveto segments. A lineto */ -/* draws a line from previous endpoint to its x,y; a curveto */ -/* draws a quadratic bezier from previous endpoint to */ -/* its x,y, using cx,cy as the bezier control point. */ - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); -/* frees the data allocated above */ - -STBTT_DEF unsigned char *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl); -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg); -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg); -/* fills svg with the character's SVG data. */ -/* returns data size or 0 if SVG not found. */ - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* BITMAP RENDERING */ -/* */ - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); -/* frees the bitmap allocated below */ - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -/* allocates a large-enough single-channel 8bpp bitmap and renders the */ -/* specified character/glyph at the specified scale into it, with */ -/* antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). */ -/* *width & *height are filled out with the width & height of the bitmap, */ -/* which is stored left-to-right, top-to-bottom. */ -/* */ -/* xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap */ - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -/* the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel */ -/* shift for the character */ - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); -/* the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap */ -/* in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap */ -/* is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the */ -/* width and height and positioning info for it first. */ - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); -/* same as stbtt_MakeCodepointBitmap, but you can specify a subpixel */ -/* shift for the character */ - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint); -/* same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering */ -/* is performed (see stbtt_PackSetOversampling) */ - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -/* get the bbox of the bitmap centered around the glyph origin; so the */ -/* bitmap width is ix1-ix0, height is iy1-iy0, and location to place */ -/* the bitmap top left is (leftSideBearing*scale,iy0). */ -/* (Note that the bitmap uses y-increases-down, but the shape uses */ -/* y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) */ - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); -/* same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel */ -/* shift for the character */ - -/* the following functions are equivalent to the above functions, but operate */ -/* on glyph indices instead of Unicode codepoints (for efficiency) */ -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int glyph); -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); - - -/* @TODO: don't expose this structure */ -typedef struct -{ - int w,h,stride; - unsigned char *pixels; -} stbtt__bitmap; - -/* rasterize a shape with quadratic beziers into a bitmap */ -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, /* 1-channel bitmap to draw into */ - float flatness_in_pixels, /* allowable error of curve in pixels */ - stbtt_vertex *vertices, /* array of vertices defining shape */ - int num_verts, /* number of vertices in above array */ - float scale_x, float scale_y, /* scale applied to input vertices */ - float shift_x, float shift_y, /* translation applied to input vertices */ - int x_off, int y_off, /* another translation applied to input */ - int invert, /* if non-zero, vertically flip shape */ - void *userdata); /* context for to STBTT_MALLOC */ - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* Signed Distance Function (or Field) rendering */ - -STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata); -/* frees the SDF bitmap allocated below */ - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); -/* These functions compute a discretized SDF field for a single character, suitable for storing */ -/* in a single-channel texture, sampling with bilinear filtering, and testing against */ -/* larger than some threshold to produce scalable fonts. */ -/* info -- the font */ -/* scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap */ -/* glyph/codepoint -- the character to generate the SDF for */ -/* padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), */ -/* which allows effects like bit outlines */ -/* onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) */ -/* pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) */ -/* if positive, > onedge_value is inside; if negative, < onedge_value is inside */ -/* width,height -- output height & width of the SDF bitmap (including padding) */ -/* xoff,yoff -- output origin of the character */ -/* return value -- a 2D array of bytes 0..255, width*height in size */ -/* */ -/* pixel_dist_scale & onedge_value are a scale & bias that allows you to make */ -/* optimal use of the limited 0..255 for your application, trading off precision */ -/* and special effects. SDF values outside the range 0..255 are clamped to 0..255. */ -/* */ -/* Example: */ -/* scale = stbtt_ScaleForPixelHeight(22) */ -/* padding = 5 */ -/* onedge_value = 180 */ -/* pixel_dist_scale = 180/5.0 = 36.0 */ -/* */ -/* This will create an SDF bitmap in which the character is about 22 pixels */ -/* high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled */ -/* shape, sample the SDF at each pixel and fill the pixel if the SDF value */ -/* is greater than or equal to 180/255. (You'll actually want to antialias, */ -/* which is beyond the scope of this example.) Additionally, you can compute */ -/* offset outlines (e.g. to stroke the character border inside & outside, */ -/* or only outside). For example, to fill outside the character up to 3 SDF */ -/* pixels, you would compare against (180-36.0*3)/255 = 72/255. The above */ -/* choice of variables maps a range from 5 pixels outside the shape to */ -/* 2 pixels inside the shape to 0..255; this is intended primarily for apply */ -/* outside effects only (the interior range is needed to allow proper */ -/* antialiasing of the font at *smaller* sizes) */ -/* */ -/* The function computes the SDF analytically at each SDF pixel, not by e.g. */ -/* building a higher-res bitmap and approximating it. In theory the quality */ -/* should be as high as possible for an SDF of this size & representation, but */ -/* unclear if this is true in practice (perhaps building a higher-res bitmap */ -/* and computing from that can allow drop-out prevention). */ -/* */ -/* The algorithm has not been optimized at all, so expect it to be slow */ -/* if computing lots of characters or very large sizes. */ - - - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* Finding the right font... */ -/* */ -/* You should really just solve this offline, keep your own tables */ -/* of what font is what, and don't try to get it out of the .ttf file. */ -/* That's because getting it out of the .ttf file is really hard, because */ -/* the names in the file can appear in many possible encodings, in many */ -/* possible languages, and e.g. if you need a case-insensitive comparison, */ -/* the details of that depend on the encoding & language in a complex way */ -/* (actually underspecified in truetype, but also gigantic). */ -/* */ -/* But you can use the provided functions in two possible ways: */ -/* stbtt_FindMatchingFont() will use *case-sensitive* comparisons on */ -/* unicode-encoded names to try to find the font you want; */ -/* you can run this before calling stbtt_InitFont() */ -/* */ -/* stbtt_GetFontNameString() lets you get any of the various strings */ -/* from the file yourself and do your own comparisons on them. */ -/* You have to have called stbtt_InitFont() first. */ - - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); -/* returns the offset (not index) of the font that matches, or -1 if none */ -/* if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". */ -/* if you use any other flag, use a font name like "Arial"; this checks */ -/* the 'macStyle' header field; i don't know if fonts set this consistently */ -#define STBTT_MACSTYLE_DONTCARE 0 -#define STBTT_MACSTYLE_BOLD 1 -#define STBTT_MACSTYLE_ITALIC 2 -#define STBTT_MACSTYLE_UNDERSCORE 4 -#define STBTT_MACSTYLE_NONE 8 /* <= not same as 0, this makes us check the bitfield is 0 */ - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); -/* returns 1/0 whether the first string interpreted as utf8 is identical to */ -/* the second string interpreted as big-endian utf16... useful for strings from next func */ - -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); -/* returns the string (which may be big-endian double byte, e.g. for unicode) */ -/* and puts the length in bytes in *length. */ -/* */ -/* some of the values for the IDs are below; for more see the truetype spec: */ -/* http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html */ -/* http://www.microsoft.com/typography/otspec/name.htm */ - -enum { /* platformID */ - STBTT_PLATFORM_ID_UNICODE =0, - STBTT_PLATFORM_ID_MAC =1, - STBTT_PLATFORM_ID_ISO =2, - STBTT_PLATFORM_ID_MICROSOFT =3 -}; - -enum { /* encodingID for STBTT_PLATFORM_ID_UNICODE */ - STBTT_UNICODE_EID_UNICODE_1_0 =0, - STBTT_UNICODE_EID_UNICODE_1_1 =1, - STBTT_UNICODE_EID_ISO_10646 =2, - STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, - STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 -}; - -enum { /* encodingID for STBTT_PLATFORM_ID_MICROSOFT */ - STBTT_MS_EID_SYMBOL =0, - STBTT_MS_EID_UNICODE_BMP =1, - STBTT_MS_EID_SHIFTJIS =2, - STBTT_MS_EID_UNICODE_FULL =10 -}; - -enum { /* encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes */ - STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, - STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, - STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, - STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 -}; - -enum { /* languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... */ - /* problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs */ - STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, - STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, - STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, - STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, - STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, - STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D -}; - -enum { /* languageID for STBTT_PLATFORM_ID_MAC */ - STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, - STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, - STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, - STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , - STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , - STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, - STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 -}; - -#ifdef __cplusplus -} -#endif - -#endif /* __STB_INCLUDE_STB_TRUETYPE_H__ */ - -/* ///////////////////////////////////////////////////////////////////////////// */ -/* ///////////////////////////////////////////////////////////////////////////// */ -/* // */ -/* // IMPLEMENTATION */ -/* // */ -/* // */ - -#ifdef STB_TRUETYPE_IMPLEMENTATION - -#ifndef STBTT_MAX_OVERSAMPLE -#define STBTT_MAX_OVERSAMPLE 8 -#endif - -#if STBTT_MAX_OVERSAMPLE > 255 -#error "STBTT_MAX_OVERSAMPLE cannot be > 255" -#endif - -typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1]; - -#ifndef STBTT_RASTERIZER_VERSION -#define STBTT_RASTERIZER_VERSION 2 -#endif - -#ifdef _MSC_VER -#define STBTT__NOTUSED(v) (void)(v) -#else -#define STBTT__NOTUSED(v) (void)sizeof(v) -#endif - -/* //////////////////////////////////////////////////////////////////////// */ -/* */ -/* stbtt__buf helpers to parse data from file */ -/* */ - -static stbtt_uint8 stbtt__buf_get8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor++]; -} - -static stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor]; -} - -static void stbtt__buf_seek(stbtt__buf *b, int o) -{ - STBTT_assert(!(o > b->size || o < 0)); - b->cursor = (o > b->size || o < 0) ? b->size : o; -} - -static void stbtt__buf_skip(stbtt__buf *b, int o) -{ - stbtt__buf_seek(b, b->cursor + o); -} - -static stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n) -{ - stbtt_uint32 v = 0; - int i; - STBTT_assert(n >= 1 && n <= 4); - for (i = 0; i < n; i++) - v = (v << 8) | stbtt__buf_get8(b); - return v; -} - -static stbtt__buf stbtt__new_buf(const void *p, size_t size) -{ - stbtt__buf r; - STBTT_assert(size < 0x40000000); - r.data = (stbtt_uint8*) p; - r.size = (int) size; - r.cursor = 0; - return r; -} - -#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) -#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) - -static stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s) -{ - stbtt__buf r = stbtt__new_buf(NULL, 0); - if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r; - r.data = b->data + o; - r.size = s; - return r; -} - -static stbtt__buf stbtt__cff_get_index(stbtt__buf *b) -{ - int count, start, offsize; - start = b->cursor; - count = stbtt__buf_get16(b); - if (count) { - offsize = stbtt__buf_get8(b); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(b, offsize * count); - stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); - } - return stbtt__buf_range(b, start, b->cursor - start); -} - -static stbtt_uint32 stbtt__cff_int(stbtt__buf *b) -{ - int b0 = stbtt__buf_get8(b); - if (b0 >= 32 && b0 <= 246) return b0 - 139; - else if (b0 >= 247 && b0 <= 250) return (b0 - 247)*256 + stbtt__buf_get8(b) + 108; - else if (b0 >= 251 && b0 <= 254) return -(b0 - 251)*256 - stbtt__buf_get8(b) - 108; - else if (b0 == 28) return stbtt__buf_get16(b); - else if (b0 == 29) return stbtt__buf_get32(b); - STBTT_assert(0); - return 0; -} - -static void stbtt__cff_skip_operand(stbtt__buf *b) { - int v, b0 = stbtt__buf_peek8(b); - STBTT_assert(b0 >= 28); - if (b0 == 30) { - stbtt__buf_skip(b, 1); - while (b->cursor < b->size) { - v = stbtt__buf_get8(b); - if ((v & 0xF) == 0xF || (v >> 4) == 0xF) - break; - } - } else { - stbtt__cff_int(b); - } -} - -static stbtt__buf stbtt__dict_get(stbtt__buf *b, int key) -{ - stbtt__buf_seek(b, 0); - while (b->cursor < b->size) { - int start = b->cursor, end, op; - while (stbtt__buf_peek8(b) >= 28) - stbtt__cff_skip_operand(b); - end = b->cursor; - op = stbtt__buf_get8(b); - if (op == 12) op = stbtt__buf_get8(b) | 0x100; - if (op == key) return stbtt__buf_range(b, start, end-start); - } - return stbtt__buf_range(b, 0, 0); -} - -static void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, stbtt_uint32 *out) -{ - int i; - stbtt__buf operands = stbtt__dict_get(b, key); - for (i = 0; i < outcount && operands.cursor < operands.size; i++) - out[i] = stbtt__cff_int(&operands); -} - -static int stbtt__cff_index_count(stbtt__buf *b) -{ - stbtt__buf_seek(b, 0); - return stbtt__buf_get16(b); -} - -static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) -{ - int count, offsize, start, end; - stbtt__buf_seek(&b, 0); - count = stbtt__buf_get16(&b); - offsize = stbtt__buf_get8(&b); - STBTT_assert(i >= 0 && i < count); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(&b, i*offsize); - start = stbtt__buf_get(&b, offsize); - end = stbtt__buf_get(&b, offsize); - return stbtt__buf_range(&b, 2+(count+1)*offsize+start, end - start); -} - -/* //////////////////////////////////////////////////////////////////////// */ -/* */ -/* accessors to parse data from file */ -/* */ - -/* on platforms that don't allow misaligned reads, if we want to allow */ -/* truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE */ - -#define ttBYTE(p) (* (stbtt_uint8 *) (p)) -#define ttCHAR(p) (* (stbtt_int8 *) (p)) -#define ttFixed(p) ttLONG(p) - -static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_int16 ttSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_uint32 ttULONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } -static stbtt_int32 ttLONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } - -#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) -#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) - -static int stbtt__isfont(stbtt_uint8 *font) -{ - /* check the version number */ - if (stbtt_tag4(font, '1',0,0,0)) return 1; /* TrueType 1 */ - if (stbtt_tag(font, "typ1")) return 1; /* TrueType with type 1 font -- we don't support this! */ - if (stbtt_tag(font, "OTTO")) return 1; /* OpenType with CFF */ - if (stbtt_tag4(font, 0,1,0,0)) return 1; /* OpenType 1.0 */ - if (stbtt_tag(font, "true")) return 1; /* Apple specification for TrueType fonts */ - return 0; -} - -/* @OPTIMIZE: binary search */ -static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) -{ - stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); - stbtt_uint32 tabledir = fontstart + 12; - stbtt_int32 i; - for (i=0; i < num_tables; ++i) { - stbtt_uint32 loc = tabledir + 16*i; - if (stbtt_tag(data+loc+0, tag)) - return ttULONG(data+loc+8); - } - return 0; -} - -static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index) -{ - /* if it's just a font, there's only one valid index */ - if (stbtt__isfont(font_collection)) - return index == 0 ? 0 : -1; - - /* check if it's a TTC */ - if (stbtt_tag(font_collection, "ttcf")) { - /* version 1? */ - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - stbtt_int32 n = ttLONG(font_collection+8); - if (index >= n) - return -1; - return ttULONG(font_collection+12+index*4); - } - } - return -1; -} - -static int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection) -{ - /* if it's just a font, there's only one valid font */ - if (stbtt__isfont(font_collection)) - return 1; - - /* check if it's a TTC */ - if (stbtt_tag(font_collection, "ttcf")) { - /* version 1? */ - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - return ttLONG(font_collection+8); - } - } - return 0; -} - -static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) -{ - stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; - stbtt__buf pdict; - stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); - if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); - pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); - stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); - if (!subrsoff) return stbtt__new_buf(NULL, 0); - stbtt__buf_seek(&cff, private_loc[1]+subrsoff); - return stbtt__cff_get_index(&cff); -} - -/* since most people won't use this, find this table the first time it's needed */ -static int stbtt__get_svg(stbtt_fontinfo *info) -{ - stbtt_uint32 t; - if (info->svg < 0) { - t = stbtt__find_table(info->data, info->fontstart, "SVG "); - if (t) { - stbtt_uint32 offset = ttULONG(info->data + t + 2); - info->svg = t + offset; - } else { - info->svg = 0; - } - } - return info->svg; -} - -static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart) -{ - stbtt_uint32 cmap, t; - stbtt_int32 i,numTables; - - info->data = data; - info->fontstart = fontstart; - info->cff = stbtt__new_buf(NULL, 0); - - cmap = stbtt__find_table(data, fontstart, "cmap"); /* required */ - info->loca = stbtt__find_table(data, fontstart, "loca"); /* required */ - info->head = stbtt__find_table(data, fontstart, "head"); /* required */ - info->glyf = stbtt__find_table(data, fontstart, "glyf"); /* required */ - info->hhea = stbtt__find_table(data, fontstart, "hhea"); /* required */ - info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); /* required */ - info->kern = stbtt__find_table(data, fontstart, "kern"); /* not required */ - info->gpos = stbtt__find_table(data, fontstart, "GPOS"); /* not required */ - - if (!cmap || !info->head || !info->hhea || !info->hmtx) - return 0; - if (info->glyf) { - /* required for truetype */ - if (!info->loca) return 0; - } else { - /* initialization for CFF / Type2 fonts (OTF) */ - stbtt__buf b, topdict, topdictidx; - stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; - stbtt_uint32 cff; - - cff = stbtt__find_table(data, fontstart, "CFF "); - if (!cff) return 0; - - info->fontdicts = stbtt__new_buf(NULL, 0); - info->fdselect = stbtt__new_buf(NULL, 0); - - /* @TODO this should use size from table (not 512MB) */ - info->cff = stbtt__new_buf(data+cff, 512*1024*1024); - b = info->cff; - - /* read the header */ - stbtt__buf_skip(&b, 2); - stbtt__buf_seek(&b, stbtt__buf_get8(&b)); /* hdrsize */ - - /* @TODO the name INDEX could list multiple fonts, */ - /* but we just use the first one. */ - stbtt__cff_get_index(&b); /* name INDEX */ - topdictidx = stbtt__cff_get_index(&b); - topdict = stbtt__cff_index_get(topdictidx, 0); - stbtt__cff_get_index(&b); /* string INDEX */ - info->gsubrs = stbtt__cff_get_index(&b); - - stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); - stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); - stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); - stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); - info->subrs = stbtt__get_subrs(b, topdict); - - /* we only support Type 2 charstrings */ - if (cstype != 2) return 0; - if (charstrings == 0) return 0; - - if (fdarrayoff) { - /* looks like a CID font */ - if (!fdselectoff) return 0; - stbtt__buf_seek(&b, fdarrayoff); - info->fontdicts = stbtt__cff_get_index(&b); - info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size-fdselectoff); - } - - stbtt__buf_seek(&b, charstrings); - info->charstrings = stbtt__cff_get_index(&b); - } - - t = stbtt__find_table(data, fontstart, "maxp"); - if (t) - info->numGlyphs = ttUSHORT(data+t+4); - else - info->numGlyphs = 0xffff; - - info->svg = -1; - - /* find a cmap encoding table we understand *now* to avoid searching */ - /* later. (todo: could make this installable) */ - /* the same regardless of glyph. */ - numTables = ttUSHORT(data + cmap + 2); - info->index_map = 0; - for (i=0; i < numTables; ++i) { - stbtt_uint32 encoding_record = cmap + 4 + 8 * i; - /* find an encoding we understand: */ - switch(ttUSHORT(data+encoding_record)) { - case STBTT_PLATFORM_ID_MICROSOFT: - switch (ttUSHORT(data+encoding_record+2)) { - case STBTT_MS_EID_UNICODE_BMP: - case STBTT_MS_EID_UNICODE_FULL: - /* MS/Unicode */ - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - break; - case STBTT_PLATFORM_ID_UNICODE: - /* Mac/iOS has these */ - /* all the encodingIDs are unicode, so we don't bother to check it */ - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - } - if (info->index_map == 0) - return 0; - - info->indexToLocFormat = ttUSHORT(data+info->head + 50); - return 1; -} - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) -{ - stbtt_uint8 *data = info->data; - stbtt_uint32 index_map = info->index_map; - - stbtt_uint16 format = ttUSHORT(data + index_map + 0); - if (format == 0) { /* apple byte encoding */ - stbtt_int32 bytes = ttUSHORT(data + index_map + 2); - if (unicode_codepoint < bytes-6) - return ttBYTE(data + index_map + 6 + unicode_codepoint); - return 0; - } else if (format == 6) { - stbtt_uint32 first = ttUSHORT(data + index_map + 6); - stbtt_uint32 count = ttUSHORT(data + index_map + 8); - if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) - return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); - return 0; - } else if (format == 2) { - STBTT_assert(0); /* @TODO: high-byte mapping for japanese/chinese/korean */ - return 0; - } else if (format == 4) { /* standard mapping for windows fonts: binary search collection of ranges */ - stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; - stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; - stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); - stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; - - /* do a binary search of the segments */ - stbtt_uint32 endCount = index_map + 14; - stbtt_uint32 search = endCount; - - if (unicode_codepoint > 0xffff) - return 0; - - /* they lie from endCount .. endCount + segCount */ - /* but searchRange is the nearest power of two, so... */ - if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) - search += rangeShift*2; - - /* now decrement to bias correctly to find smallest */ - search -= 2; - while (entrySelector) { - stbtt_uint16 end; - searchRange >>= 1; - end = ttUSHORT(data + search + searchRange*2); - if (unicode_codepoint > end) - search += searchRange*2; - --entrySelector; - } - search += 2; - - { - stbtt_uint16 offset, start, last; - stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1); - - start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); - last = ttUSHORT(data + endCount + 2*item); - if (unicode_codepoint < start || unicode_codepoint > last) - return 0; - - offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); - if (offset == 0) - return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); - - return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); - } - } else if (format == 12 || format == 13) { - stbtt_uint32 ngroups = ttULONG(data+index_map+12); - stbtt_int32 low,high; - low = 0; high = (stbtt_int32)ngroups; - /* Binary search the right group. */ - while (low < high) { - stbtt_int32 mid = low + ((high-low) >> 1); /* rounds down, so low <= mid < high */ - stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); - stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); - if ((stbtt_uint32) unicode_codepoint < start_char) - high = mid; - else if ((stbtt_uint32) unicode_codepoint > end_char) - low = mid+1; - else { - stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); - if (format == 12) - return start_glyph + unicode_codepoint-start_char; - else /* format == 13 */ - return start_glyph; - } - } - return 0; /* not found */ - } - /* @TODO */ - STBTT_assert(0); - return 0; -} - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) -{ - return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); -} - -static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) -{ - v->type = type; - v->x = (stbtt_int16) x; - v->y = (stbtt_int16) y; - v->cx = (stbtt_int16) cx; - v->cy = (stbtt_int16) cy; -} - -static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) -{ - int g1,g2; - - STBTT_assert(!info->cff.size); - - if (glyph_index >= info->numGlyphs) return -1; /* glyph index out of range */ - if (info->indexToLocFormat >= 2) return -1; /* unknown index->glyph map format */ - - if (info->indexToLocFormat == 0) { - g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; - g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; - } else { - g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); - g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); - } - - return g1==g2 ? -1 : g1; /* if length is 0, return -1 */ -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); - -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - if (info->cff.size) { - stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); - } else { - int g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 0; - - if (x0) *x0 = ttSHORT(info->data + g + 2); - if (y0) *y0 = ttSHORT(info->data + g + 4); - if (x1) *x1 = ttSHORT(info->data + g + 6); - if (y1) *y1 = ttSHORT(info->data + g + 8); - } - return 1; -} - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) -{ - return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); -} - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt_int16 numberOfContours; - int g; - if (info->cff.size) - return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; - g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 1; - numberOfContours = ttSHORT(info->data + g); - return numberOfContours == 0; -} - -static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, - stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) -{ - if (start_off) { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); - } - return num_vertices; -} - -static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - stbtt_int16 numberOfContours; - stbtt_uint8 *endPtsOfContours; - stbtt_uint8 *data = info->data; - stbtt_vertex *vertices=0; - int num_vertices=0; - int g = stbtt__GetGlyfOffset(info, glyph_index); - - *pvertices = NULL; - - if (g < 0) return 0; - - numberOfContours = ttSHORT(data + g); - - if (numberOfContours > 0) { - stbtt_uint8 flags=0,flagcount; - stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; - stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; - stbtt_uint8 *points; - endPtsOfContours = (data + g + 10); - ins = ttUSHORT(data + g + 10 + numberOfContours * 2); - points = data + g + 10 + numberOfContours * 2 + 2 + ins; - - n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); - - m = n + 2*numberOfContours; /* a loose bound on how many vertices we might need */ - vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); - if (vertices == 0) - return 0; - - next_move = 0; - flagcount=0; - - /* in first pass, we load uninterpreted data into the allocated array */ - /* above, shifted to the end of the array so we won't overwrite it when */ - /* we create our final data starting from the front */ - - off = m - n; /* starting offset for uninterpreted data, regardless of how m ends up being calculated */ - - /* first load flags */ - - for (i=0; i < n; ++i) { - if (flagcount == 0) { - flags = *points++; - if (flags & 8) - flagcount = *points++; - } else - --flagcount; - vertices[off+i].type = flags; - } - - /* now load x coordinates */ - x=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 2) { - stbtt_int16 dx = *points++; - x += (flags & 16) ? dx : -dx; /* ??? */ - } else { - if (!(flags & 16)) { - x = x + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].x = (stbtt_int16) x; - } - - /* now load y coordinates */ - y=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 4) { - stbtt_int16 dy = *points++; - y += (flags & 32) ? dy : -dy; /* ??? */ - } else { - if (!(flags & 32)) { - y = y + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].y = (stbtt_int16) y; - } - - /* now convert them to our format */ - num_vertices=0; - sx = sy = cx = cy = scx = scy = 0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - x = (stbtt_int16) vertices[off+i].x; - y = (stbtt_int16) vertices[off+i].y; - - if (next_move == i) { - if (i != 0) - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - - /* now start the new one */ - start_off = !(flags & 1); - if (start_off) { - /* if we start off with an off-curve point, then when we need to find a point on the curve */ - /* where we can start, and we need to save some state for when we wraparound. */ - scx = x; - scy = y; - if (!(vertices[off+i+1].type & 1)) { - /* next point is also a curve point, so interpolate an on-point curve */ - sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; - sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; - } else { - /* otherwise just use the next point as our start point */ - sx = (stbtt_int32) vertices[off+i+1].x; - sy = (stbtt_int32) vertices[off+i+1].y; - ++i; /* we're using point i+1 as the starting point, so skip it */ - } - } else { - sx = x; - sy = y; - } - stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); - was_off = 0; - next_move = 1 + ttUSHORT(endPtsOfContours+j*2); - ++j; - } else { - if (!(flags & 1)) { /* if it's a curve */ - if (was_off) /* two off-curve control points in a row means interpolate an on-curve midpoint */ - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); - cx = x; - cy = y; - was_off = 1; - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); - was_off = 0; - } - } - } - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - } else if (numberOfContours < 0) { - /* Compound shapes. */ - int more = 1; - stbtt_uint8 *comp = data + g + 10; - num_vertices = 0; - vertices = 0; - while (more) { - stbtt_uint16 flags, gidx; - int comp_num_verts = 0, i; - stbtt_vertex *comp_verts = 0, *tmp = 0; - float mtx[6] = {1,0,0,1,0,0}, m, n; - - flags = ttSHORT(comp); comp+=2; - gidx = ttSHORT(comp); comp+=2; - - if (flags & 2) { /* XY values */ - if (flags & 1) { /* shorts */ - mtx[4] = ttSHORT(comp); comp+=2; - mtx[5] = ttSHORT(comp); comp+=2; - } else { - mtx[4] = ttCHAR(comp); comp+=1; - mtx[5] = ttCHAR(comp); comp+=1; - } - } - else { - /* @TODO handle matching point */ - STBTT_assert(0); - } - if (flags & (1<<3)) { /* WE_HAVE_A_SCALE */ - mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - } else if (flags & (1<<6)) { /* WE_HAVE_AN_X_AND_YSCALE */ - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } else if (flags & (1<<7)) { /* WE_HAVE_A_TWO_BY_TWO */ - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } - - /* Find transformation scales. */ - m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); - n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); - - /* Get indexed glyph. */ - comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); - if (comp_num_verts > 0) { - /* Transform vertices. */ - for (i = 0; i < comp_num_verts; ++i) { - stbtt_vertex* v = &comp_verts[i]; - stbtt_vertex_type x,y; - x=v->x; y=v->y; - v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - x=v->cx; y=v->cy; - v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - } - /* Append vertices. */ - tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); - if (!tmp) { - if (vertices) STBTT_free(vertices, info->userdata); - if (comp_verts) STBTT_free(comp_verts, info->userdata); - return 0; - } - if (num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); - STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); - if (vertices) STBTT_free(vertices, info->userdata); - vertices = tmp; - STBTT_free(comp_verts, info->userdata); - num_vertices += comp_num_verts; - } - /* More components ? */ - more = flags & (1<<5); - } - } else { - /* numberOfCounters == 0, do nothing */ - } - - *pvertices = vertices; - return num_vertices; -} - -typedef struct -{ - int bounds; - int started; - float first_x, first_y; - float x, y; - stbtt_int32 min_x, max_x, min_y, max_y; - - stbtt_vertex *pvertices; - int num_vertices; -} stbtt__csctx; - -#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} - -static void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_int32 y) -{ - if (x > c->max_x || !c->started) c->max_x = x; - if (y > c->max_y || !c->started) c->max_y = y; - if (x < c->min_x || !c->started) c->min_x = x; - if (y < c->min_y || !c->started) c->min_y = y; - c->started = 1; -} - -static void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) -{ - if (c->bounds) { - stbtt__track_vertex(c, x, y); - if (type == STBTT_vcubic) { - stbtt__track_vertex(c, cx, cy); - stbtt__track_vertex(c, cx1, cy1); - } - } else { - stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); - c->pvertices[c->num_vertices].cx1 = (stbtt_int16) cx1; - c->pvertices[c->num_vertices].cy1 = (stbtt_int16) cy1; - } - c->num_vertices++; -} - -static void stbtt__csctx_close_shape(stbtt__csctx *ctx) -{ - if (ctx->first_x != ctx->x || ctx->first_y != ctx->y) - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy) -{ - stbtt__csctx_close_shape(ctx); - ctx->first_x = ctx->x = ctx->x + dx; - ctx->first_y = ctx->y = ctx->y + dy; - stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy) -{ - ctx->x += dx; - ctx->y += dy; - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) -{ - float cx1 = ctx->x + dx1; - float cy1 = ctx->y + dy1; - float cx2 = cx1 + dx2; - float cy2 = cy1 + dy2; - ctx->x = cx2 + dx3; - ctx->y = cy2 + dy3; - stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); -} - -static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) -{ - int count = stbtt__cff_index_count(&idx); - int bias = 107; - if (count >= 33900) - bias = 32768; - else if (count >= 1240) - bias = 1131; - n += bias; - if (n < 0 || n >= count) - return stbtt__new_buf(NULL, 0); - return stbtt__cff_index_get(idx, n); -} - -static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt__buf fdselect = info->fdselect; - int nranges, start, end, v, fmt, fdselector = -1, i; - - stbtt__buf_seek(&fdselect, 0); - fmt = stbtt__buf_get8(&fdselect); - if (fmt == 0) { - /* untested */ - stbtt__buf_skip(&fdselect, glyph_index); - fdselector = stbtt__buf_get8(&fdselect); - } else if (fmt == 3) { - nranges = stbtt__buf_get16(&fdselect); - start = stbtt__buf_get16(&fdselect); - for (i = 0; i < nranges; i++) { - v = stbtt__buf_get8(&fdselect); - end = stbtt__buf_get16(&fdselect); - if (glyph_index >= start && glyph_index < end) { - fdselector = v; - break; - } - start = end; - } - } - if (fdselector == -1) stbtt__new_buf(NULL, 0); - return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); -} - -static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, stbtt__csctx *c) -{ - int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; - int has_subrs = 0, clear_stack; - float s[48]; - stbtt__buf subr_stack[10], subrs = info->subrs, b; - float f; - -#define STBTT__CSERR(s) (0) - - /* this currently ignores the initial width value, which isn't needed if we have hmtx */ - b = stbtt__cff_index_get(info->charstrings, glyph_index); - while (b.cursor < b.size) { - i = 0; - clear_stack = 1; - b0 = stbtt__buf_get8(&b); - switch (b0) { - /* @TODO implement hinting */ - case 0x13: /* hintmask */ - case 0x14: /* cntrmask */ - if (in_header) - maskbits += (sp / 2); /* implicit "vstem" */ - in_header = 0; - stbtt__buf_skip(&b, (maskbits + 7) / 8); - break; - - case 0x01: /* hstem */ - case 0x03: /* vstem */ - case 0x12: /* hstemhm */ - case 0x17: /* vstemhm */ - maskbits += (sp / 2); - break; - - case 0x15: /* rmoveto */ - in_header = 0; - if (sp < 2) return STBTT__CSERR("rmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-2], s[sp-1]); - break; - case 0x04: /* vmoveto */ - in_header = 0; - if (sp < 1) return STBTT__CSERR("vmoveto stack"); - stbtt__csctx_rmove_to(c, 0, s[sp-1]); - break; - case 0x16: /* hmoveto */ - in_header = 0; - if (sp < 1) return STBTT__CSERR("hmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-1], 0); - break; - - case 0x05: /* rlineto */ - if (sp < 2) return STBTT__CSERR("rlineto stack"); - for (; i + 1 < sp; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - /* hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical */ - /* starting from a different place. */ - - case 0x07: /* vlineto */ - if (sp < 1) return STBTT__CSERR("vlineto stack"); - goto vlineto; - case 0x06: /* hlineto */ - if (sp < 1) return STBTT__CSERR("hlineto stack"); - for (;;) { - if (i >= sp) break; - stbtt__csctx_rline_to(c, s[i], 0); - i++; - vlineto: - if (i >= sp) break; - stbtt__csctx_rline_to(c, 0, s[i]); - i++; - } - break; - - case 0x1F: /* hvcurveto */ - if (sp < 4) return STBTT__CSERR("hvcurveto stack"); - goto hvcurveto; - case 0x1E: /* vhcurveto */ - if (sp < 4) return STBTT__CSERR("vhcurveto stack"); - for (;;) { - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, 0, s[i], s[i+1], s[i+2], s[i+3], (sp - i == 5) ? s[i + 4] : 0.0f); - i += 4; - hvcurveto: - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, s[i], 0, s[i+1], s[i+2], (sp - i == 5) ? s[i+4] : 0.0f, s[i+3]); - i += 4; - } - break; - - case 0x08: /* rrcurveto */ - if (sp < 6) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x18: /* rcurveline */ - if (sp < 8) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp - 2; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - if (i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - case 0x19: /* rlinecurve */ - if (sp < 8) return STBTT__CSERR("rlinecurve stack"); - for (; i + 1 < sp - 6; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - if (i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x1A: /* vvcurveto */ - case 0x1B: /* hhcurveto */ - if (sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); - f = 0.0; - if (sp & 1) { f = s[i]; i++; } - for (; i + 3 < sp; i += 4) { - if (b0 == 0x1B) - stbtt__csctx_rccurve_to(c, s[i], f, s[i+1], s[i+2], s[i+3], 0.0); - else - stbtt__csctx_rccurve_to(c, f, s[i], s[i+1], s[i+2], 0.0, s[i+3]); - f = 0.0; - } - break; - - case 0x0A: /* callsubr */ - if (!has_subrs) { - if (info->fdselect.size) - subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); - has_subrs = 1; - } - /* FALLTHROUGH */ - case 0x1D: /* callgsubr */ - if (sp < 1) return STBTT__CSERR("call(g|)subr stack"); - v = (int) s[--sp]; - if (subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); - subr_stack[subr_stack_height++] = b; - b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); - if (b.size == 0) return STBTT__CSERR("subr not found"); - b.cursor = 0; - clear_stack = 0; - break; - - case 0x0B: /* return */ - if (subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); - b = subr_stack[--subr_stack_height]; - clear_stack = 0; - break; - - case 0x0E: /* endchar */ - stbtt__csctx_close_shape(c); - return 1; - - case 0x0C: { /* two-byte escape */ - float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; - float dx, dy; - int b1 = stbtt__buf_get8(&b); - switch (b1) { - /* @TODO These "flex" implementations ignore the flex-depth and resolution, */ - /* and always draw beziers. */ - case 0x22: /* hflex */ - if (sp < 7) return STBTT__CSERR("hflex stack"); - dx1 = s[0]; - dx2 = s[1]; - dy2 = s[2]; - dx3 = s[3]; - dx4 = s[4]; - dx5 = s[5]; - dx6 = s[6]; - stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); - break; - - case 0x23: /* flex */ - if (sp < 13) return STBTT__CSERR("flex stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = s[10]; - dy6 = s[11]; - /* fd is s[12] */ - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - case 0x24: /* hflex1 */ - if (sp < 9) return STBTT__CSERR("hflex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dx4 = s[5]; - dx5 = s[6]; - dy5 = s[7]; - dx6 = s[8]; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1+dy2+dy5)); - break; - - case 0x25: /* flex1 */ - if (sp < 11) return STBTT__CSERR("flex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = dy6 = s[10]; - dx = dx1+dx2+dx3+dx4+dx5; - dy = dy1+dy2+dy3+dy4+dy5; - if (STBTT_fabs(dx) > STBTT_fabs(dy)) - dy6 = -dy; - else - dx6 = -dx; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - default: - return STBTT__CSERR("unimplemented"); - } - } break; - - default: - if (b0 != 255 && b0 != 28 && b0 < 32) - return STBTT__CSERR("reserved operator"); - - /* push immediate */ - if (b0 == 255) { - f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; - } else { - stbtt__buf_skip(&b, -1); - f = (float)(stbtt_int16)stbtt__cff_int(&b); - } - if (sp >= 48) return STBTT__CSERR("push stack overflow"); - s[sp++] = f; - clear_stack = 0; - break; - } - if (clear_stack) sp = 0; - } - return STBTT__CSERR("no endchar"); - -#undef STBTT__CSERR -} - -static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - /* runs the charstring twice, once to count and once to output (to avoid realloc) */ - stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); - stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); - if (stbtt__run_charstring(info, glyph_index, &count_ctx)) { - *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices*sizeof(stbtt_vertex), info->userdata); - output_ctx.pvertices = *pvertices; - if (stbtt__run_charstring(info, glyph_index, &output_ctx)) { - STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); - return output_ctx.num_vertices; - } - } - *pvertices = NULL; - return 0; -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - stbtt__csctx c = STBTT__CSCTX_INIT(1); - int r = stbtt__run_charstring(info, glyph_index, &c); - if (x0) *x0 = r ? c.min_x : 0; - if (y0) *y0 = r ? c.min_y : 0; - if (x1) *x1 = r ? c.max_x : 0; - if (y1) *y1 = r ? c.max_y : 0; - return r ? c.num_vertices : 0; -} - -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - if (!info->cff.size) - return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); - else - return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); -} - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) -{ - stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); - if (glyph_index < numOfLongHorMetrics) { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); - } else { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); - } -} - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info) -{ - stbtt_uint8 *data = info->data + info->kern; - - /* we only look at the first table. it must be 'horizontal' and format 0. */ - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) /* number of tables, need at least 1 */ - return 0; - if (ttUSHORT(data+8) != 1) /* horizontal flag must be set in format */ - return 0; - - return ttUSHORT(data+10); -} - -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length) -{ - stbtt_uint8 *data = info->data + info->kern; - int k, length; - - /* we only look at the first table. it must be 'horizontal' and format 0. */ - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) /* number of tables, need at least 1 */ - return 0; - if (ttUSHORT(data+8) != 1) /* horizontal flag must be set in format */ - return 0; - - length = ttUSHORT(data+10); - if (table_length < length) - length = table_length; - - for (k = 0; k < length; k++) - { - table[k].glyph1 = ttUSHORT(data+18+(k*6)); - table[k].glyph2 = ttUSHORT(data+20+(k*6)); - table[k].advance = ttSHORT(data+22+(k*6)); - } - - return length; -} - -static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) -{ - stbtt_uint8 *data = info->data + info->kern; - stbtt_uint32 needle, straw; - int l, r, m; - - /* we only look at the first table. it must be 'horizontal' and format 0. */ - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) /* number of tables, need at least 1 */ - return 0; - if (ttUSHORT(data+8) != 1) /* horizontal flag must be set in format */ - return 0; - - l = 0; - r = ttUSHORT(data+10) - 1; - needle = glyph1 << 16 | glyph2; - while (l <= r) { - m = (l + r) >> 1; - straw = ttULONG(data+18+(m*6)); /* note: unaligned read */ - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else - return ttSHORT(data+22+(m*6)); - } - return 0; -} - -static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, int glyph) -{ - stbtt_uint16 coverageFormat = ttUSHORT(coverageTable); - switch (coverageFormat) { - case 1: { - stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2); - - /* Binary search. */ - stbtt_int32 l=0, r=glyphCount-1, m; - int straw, needle=glyph; - while (l <= r) { - stbtt_uint8 *glyphArray = coverageTable + 4; - stbtt_uint16 glyphID; - m = (l + r) >> 1; - glyphID = ttUSHORT(glyphArray + 2 * m); - straw = glyphID; - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else { - return m; - } - } - break; - } - - case 2: { - stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2); - stbtt_uint8 *rangeArray = coverageTable + 4; - - /* Binary search. */ - stbtt_int32 l=0, r=rangeCount-1, m; - int strawStart, strawEnd, needle=glyph; - while (l <= r) { - stbtt_uint8 *rangeRecord; - m = (l + r) >> 1; - rangeRecord = rangeArray + 6 * m; - strawStart = ttUSHORT(rangeRecord); - strawEnd = ttUSHORT(rangeRecord + 2); - if (needle < strawStart) - r = m - 1; - else if (needle > strawEnd) - l = m + 1; - else { - stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4); - return startCoverageIndex + glyph - strawStart; - } - } - break; - } - - default: return -1; /* unsupported */ - } - - return -1; -} - -static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph) -{ - stbtt_uint16 classDefFormat = ttUSHORT(classDefTable); - switch (classDefFormat) - { - case 1: { - stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2); - stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4); - stbtt_uint8 *classDef1ValueArray = classDefTable + 6; - - if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount) - return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID)); - break; - } - - case 2: { - stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2); - stbtt_uint8 *classRangeRecords = classDefTable + 4; - - /* Binary search. */ - stbtt_int32 l=0, r=classRangeCount-1, m; - int strawStart, strawEnd, needle=glyph; - while (l <= r) { - stbtt_uint8 *classRangeRecord; - m = (l + r) >> 1; - classRangeRecord = classRangeRecords + 6 * m; - strawStart = ttUSHORT(classRangeRecord); - strawEnd = ttUSHORT(classRangeRecord + 2); - if (needle < strawStart) - r = m - 1; - else if (needle > strawEnd) - l = m + 1; - else - return (stbtt_int32)ttUSHORT(classRangeRecord + 4); - } - break; - } - - default: - return -1; /* Unsupported definition type, return an error. */ - } - - /* "All glyphs not assigned to a class fall into class 0". (OpenType spec) */ - return 0; -} - -/* Define to STBTT_assert(x) if you want to break on unimplemented formats. */ -#define STBTT_GPOS_TODO_assert(x) - -static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) -{ - stbtt_uint16 lookupListOffset; - stbtt_uint8 *lookupList; - stbtt_uint16 lookupCount; - stbtt_uint8 *data; - stbtt_int32 i, sti; - - if (!info->gpos) return 0; - - data = info->data + info->gpos; - - if (ttUSHORT(data+0) != 1) return 0; /* Major version 1 */ - if (ttUSHORT(data+2) != 0) return 0; /* Minor version 0 */ - - lookupListOffset = ttUSHORT(data+8); - lookupList = data + lookupListOffset; - lookupCount = ttUSHORT(lookupList); - - for (i=0; i= pairSetCount) return 0; - - needle=glyph2; - r=pairValueCount-1; - l=0; - - /* Binary search. */ - while (l <= r) { - stbtt_uint16 secondGlyph; - stbtt_uint8 *pairValue; - m = (l + r) >> 1; - pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; - secondGlyph = ttUSHORT(pairValue); - straw = secondGlyph; - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else { - stbtt_int16 xAdvance = ttSHORT(pairValue + 2); - return xAdvance; - } - } - } else - return 0; - break; - } - - case 2: { - stbtt_uint16 valueFormat1 = ttUSHORT(table + 4); - stbtt_uint16 valueFormat2 = ttUSHORT(table + 6); - if (valueFormat1 == 4 && valueFormat2 == 0) { /* Support more formats? */ - stbtt_uint16 classDef1Offset = ttUSHORT(table + 8); - stbtt_uint16 classDef2Offset = ttUSHORT(table + 10); - int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1); - int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2); - - stbtt_uint16 class1Count = ttUSHORT(table + 12); - stbtt_uint16 class2Count = ttUSHORT(table + 14); - stbtt_uint8 *class1Records, *class2Records; - stbtt_int16 xAdvance; - - if (glyph1class < 0 || glyph1class >= class1Count) return 0; /* malformed */ - if (glyph2class < 0 || glyph2class >= class2Count) return 0; /* malformed */ - - class1Records = table + 16; - class2Records = class1Records + 2 * (glyph1class * class2Count); - xAdvance = ttSHORT(class2Records + 2 * glyph2class); - return xAdvance; - } else - return 0; - break; - } - - default: - return 0; /* Unsupported position format */ - } - } - } - - return 0; -} - -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int g1, int g2) -{ - int xAdvance = 0; - - if (info->gpos) - xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); - else if (info->kern) - xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); - - return xAdvance; -} - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) -{ - if (!info->kern && !info->gpos) /* if no kerning table, don't waste time looking up both codepoint->glyphs */ - return 0; - return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); -} - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) -{ - stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); -} - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) -{ - if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); - if (descent) *descent = ttSHORT(info->data+info->hhea + 6); - if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); -} - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap) -{ - int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); - if (!tab) - return 0; - if (typoAscent ) *typoAscent = ttSHORT(info->data+tab + 68); - if (typoDescent) *typoDescent = ttSHORT(info->data+tab + 70); - if (typoLineGap) *typoLineGap = ttSHORT(info->data+tab + 72); - return 1; -} - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) -{ - *x0 = ttSHORT(info->data + info->head + 36); - *y0 = ttSHORT(info->data + info->head + 38); - *x1 = ttSHORT(info->data + info->head + 40); - *y1 = ttSHORT(info->data + info->head + 42); -} - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) -{ - int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); - return (float) height / fheight; -} - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) -{ - int unitsPerEm = ttUSHORT(info->data + info->head + 18); - return pixels / unitsPerEm; -} - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) -{ - STBTT_free(v, info->userdata); -} - -STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl) -{ - int i; - stbtt_uint8 *data = info->data; - stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info); - - int numEntries = ttUSHORT(svg_doc_list); - stbtt_uint8 *svg_docs = svg_doc_list + 2; - - for(i=0; i= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2))) - return svg_doc; - } - return 0; -} - -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg) -{ - stbtt_uint8 *data = info->data; - stbtt_uint8 *svg_doc; - - if (info->svg == 0) - return 0; - - svg_doc = stbtt_FindSVGDoc(info, gl); - if (svg_doc != NULL) { - *svg = (char *) data + info->svg + ttULONG(svg_doc + 4); - return ttULONG(svg_doc + 8); - } else { - return 0; - } -} - -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg) -{ - return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg); -} - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* antialiasing software rasterizer */ -/* */ - -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - int x0=0,y0=0,x1,y1; /* =0 suppresses compiler warning */ - if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) { - /* e.g. space character */ - if (ix0) *ix0 = 0; - if (iy0) *iy0 = 0; - if (ix1) *ix1 = 0; - if (iy1) *iy1 = 0; - } else { - /* move to integral bboxes (treating pixels as little squares, what pixels get touched)? */ - if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x); - if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); - if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x); - if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y); - } -} - -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); -} - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* Rasterizer */ - -typedef struct stbtt__hheap_chunk -{ - struct stbtt__hheap_chunk *next; -} stbtt__hheap_chunk; - -typedef struct stbtt__hheap -{ - struct stbtt__hheap_chunk *head; - void *first_free; - int num_remaining_in_head_chunk; -} stbtt__hheap; - -static void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata) -{ - if (hh->first_free) { - void *p = hh->first_free; - hh->first_free = * (void **) p; - return p; - } else { - if (hh->num_remaining_in_head_chunk == 0) { - int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); - stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); - if (c == NULL) - return NULL; - c->next = hh->head; - hh->head = c; - hh->num_remaining_in_head_chunk = count; - } - --hh->num_remaining_in_head_chunk; - return (char *) (hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; - } -} - -static void stbtt__hheap_free(stbtt__hheap *hh, void *p) -{ - *(void **) p = hh->first_free; - hh->first_free = p; -} - -static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata) -{ - stbtt__hheap_chunk *c = hh->head; - while (c) { - stbtt__hheap_chunk *n = c->next; - STBTT_free(c, userdata); - c = n; - } -} - -typedef struct stbtt__edge { - float x0,y0, x1,y1; - int invert; -} stbtt__edge; - - -typedef struct stbtt__active_edge -{ - struct stbtt__active_edge *next; - #if STBTT_RASTERIZER_VERSION==1 - int x,dx; - float ey; - int direction; - #elif STBTT_RASTERIZER_VERSION==2 - float fx,fdx,fdy; - float direction; - float sy; - float ey; - #else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" - #endif -} stbtt__active_edge; - -#if STBTT_RASTERIZER_VERSION == 1 -#define STBTT_FIXSHIFT 10 -#define STBTT_FIX (1 << STBTT_FIXSHIFT) -#define STBTT_FIXMASK (STBTT_FIX-1) - -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - if (!z) return z; - - /* round dx down to avoid overshooting */ - if (dxdy < 0) - z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); - else - z->dx = STBTT_ifloor(STBTT_FIX * dxdy); - - z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); /* use z->dx so when we offset later it's by the same amount */ - z->x -= off_x * STBTT_FIX; - - z->ey = e->y1; - z->next = 0; - z->direction = e->invert ? 1 : -1; - return z; -} -#elif STBTT_RASTERIZER_VERSION == 2 -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - /* STBTT_assert(e->y0 <= start_point); */ - if (!z) return z; - z->fdx = dxdy; - z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f; - z->fx = e->x0 + dxdy * (start_point - e->y0); - z->fx -= off_x; - z->direction = e->invert ? 1.0f : -1.0f; - z->sy = e->y0; - z->ey = e->y1; - z->next = 0; - return z; -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#if STBTT_RASTERIZER_VERSION == 1 -/* note: this routine clips fills that extend off the edges... ideally this */ -/* wouldn't happen, but it could happen if the truetype glyph bounding boxes */ -/* are wrong, or if the user supplies a too-small bitmap */ -static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) -{ - /* non-zero winding fill */ - int x0=0, w=0; - - while (e) { - if (w == 0) { - /* if we're currently at zero, we need to record the edge start point */ - x0 = e->x; w += e->direction; - } else { - int x1 = e->x; w += e->direction; - /* if we went to zero, we need to draw */ - if (w == 0) { - int i = x0 >> STBTT_FIXSHIFT; - int j = x1 >> STBTT_FIXSHIFT; - - if (i < len && j >= 0) { - if (i == j) { - /* x0,x1 are the same pixel, so compute combined coverage */ - scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT); - } else { - if (i >= 0) /* add antialiasing for x0 */ - scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); - else - i = -1; /* clip */ - - if (j < len) /* add antialiasing for x1 */ - scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); - else - j = len; /* clip */ - - for (++i; i < j; ++i) /* fill pixels between x0 and x1 */ - scanline[i] = scanline[i] + (stbtt_uint8) max_weight; - } - } - } - } - - e = e->next; - } -} - -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0; - int max_weight = (255 / vsubsample); /* weight per vertical scanline */ - int s; /* vertical subsample index */ - unsigned char scanline_data[512], *scanline; - - if (result->w > 512) - scanline = (unsigned char *) STBTT_malloc(result->w, userdata); - else - scanline = scanline_data; - - y = off_y * vsubsample; - e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; - - while (j < result->h) { - STBTT_memset(scanline, 0, result->w); - for (s=0; s < vsubsample; ++s) { - /* find center of pixel for this scanline */ - float scan_y = y + 0.5f; - stbtt__active_edge **step = &active; - - /* update all active edges; */ - /* remove all active edges that terminate before the center of this scanline */ - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y) { - *step = z->next; /* delete from list */ - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - z->x += z->dx; /* advance to position for current scanline */ - step = &((*step)->next); /* advance through list */ - } - } - - /* resort the list if needed */ - for(;;) { - int changed=0; - step = &active; - while (*step && (*step)->next) { - if ((*step)->x > (*step)->next->x) { - stbtt__active_edge *t = *step; - stbtt__active_edge *q = t->next; - - t->next = q->next; - q->next = t; - *step = q; - changed = 1; - } - step = &(*step)->next; - } - if (!changed) break; - } - - /* insert all edges that start before the center of this scanline -- omit ones that also end on this scanline */ - while (e->y0 <= scan_y) { - if (e->y1 > scan_y) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); - if (z != NULL) { - /* find insertion point */ - if (active == NULL) - active = z; - else if (z->x < active->x) { - /* insert at front */ - z->next = active; - active = z; - } else { - /* find thing to insert AFTER */ - stbtt__active_edge *p = active; - while (p->next && p->next->x < z->x) - p = p->next; - /* at this point, p->next->x is NOT < z->x */ - z->next = p->next; - p->next = z; - } - } - } - ++e; - } - - /* now process all active edges in XOR fashion */ - if (active) - stbtt__fill_active_edges(scanline, result->w, active, max_weight); - - ++y; - } - STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} - -#elif STBTT_RASTERIZER_VERSION == 2 - -/* the edge passed in here does not cross the vertical line at x or the vertical line at x+1 */ -/* (i.e. it has already been clipped to those) */ -static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1) -{ - if (y0 == y1) return; - STBTT_assert(y0 < y1); - STBTT_assert(e->sy <= e->ey); - if (y0 > e->ey) return; - if (y1 < e->sy) return; - if (y0 < e->sy) { - x0 += (x1-x0) * (e->sy - y0) / (y1-y0); - y0 = e->sy; - } - if (y1 > e->ey) { - x1 += (x1-x0) * (e->ey - y1) / (y1-y0); - y1 = e->ey; - } - - if (x0 == x) - STBTT_assert(x1 <= x+1); - else if (x0 == x+1) - STBTT_assert(x1 >= x); - else if (x0 <= x) - STBTT_assert(x1 <= x); - else if (x0 >= x+1) - STBTT_assert(x1 >= x+1); - else - STBTT_assert(x1 >= x && x1 <= x+1); - - if (x0 <= x && x1 <= x) - scanline[x] += e->direction * (y1-y0); - else if (x0 >= x+1 && x1 >= x+1) - ; - else { - STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); - scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); /* coverage = 1 - average x position */ - } -} - -static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) -{ - STBTT_assert(top_width >= 0); - STBTT_assert(bottom_width >= 0); - return (top_width + bottom_width) / 2.0f * height; -} - -static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) -{ - return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); -} - -static float stbtt__sized_triangle_area(float height, float width) -{ - return height * width / 2; -} - -static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top) -{ - float y_bottom = y_top+1; - - while (e) { - /* brute force every pixel */ - - /* compute intersection points with top & bottom */ - STBTT_assert(e->ey >= y_top); - - if (e->fdx == 0) { - float x0 = e->fx; - if (x0 < len) { - if (x0 >= 0) { - stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom); - stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom); - } else { - stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom); - } - } - } else { - float x0 = e->fx; - float dx = e->fdx; - float xb = x0 + dx; - float x_top, x_bottom; - float sy0,sy1; - float dy = e->fdy; - STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); - - /* compute endpoints of line segment clipped to this scanline (if the */ - /* line segment starts on this scanline. x0 is the intersection of the */ - /* line with y_top, but that may be off the line segment. */ - if (e->sy > y_top) { - x_top = x0 + dx * (e->sy - y_top); - sy0 = e->sy; - } else { - x_top = x0; - sy0 = y_top; - } - if (e->ey < y_bottom) { - x_bottom = x0 + dx * (e->ey - y_top); - sy1 = e->ey; - } else { - x_bottom = xb; - sy1 = y_bottom; - } - - if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { - /* from here on, we don't have to range check x values */ - - if ((int) x_top == (int) x_bottom) { - float height; - /* simple case, only spans one pixel */ - int x = (int) x_top; - height = (sy1 - sy0) * e->direction; - STBTT_assert(x >= 0 && x < len); - scanline[x] += stbtt__position_trapezoid_area(height, x_top, x+1.0f, x_bottom, x+1.0f); - scanline_fill[x] += height; /* everything right of this pixel is filled */ - } else { - int x,x1,x2; - float y_crossing, y_final, step, sign, area; - /* covers 2+ pixels */ - if (x_top > x_bottom) { - /* flip scanline vertically; signed area is the same */ - float t; - sy0 = y_bottom - (sy0 - y_top); - sy1 = y_bottom - (sy1 - y_top); - t = sy0, sy0 = sy1, sy1 = t; - t = x_bottom, x_bottom = x_top, x_top = t; - dx = -dx; - dy = -dy; - t = x0, x0 = xb, xb = t; - } - STBTT_assert(dy >= 0); - STBTT_assert(dx >= 0); - - x1 = (int) x_top; - x2 = (int) x_bottom; - /* compute intersection with y axis at x1+1 */ - y_crossing = y_top + dy * (x1+1 - x0); - - /* compute intersection with y axis at x2 */ - y_final = y_top + dy * (x2 - x0); - - /* x1 x_top x2 x_bottom */ - /* y_top +------|-----+------------+------------+--------|---+------------+ */ - /* | | | | | | */ - /* | | | | | | */ - /* sy0 | Txxxxx|............|............|............|............| */ - /* y_crossing | *xxxxx.......|............|............|............| */ - /* | | xxxxx..|............|............|............| */ - /* | | /- xx*xxxx........|............|............| */ - /* | | dy < | xxxxxx..|............|............| */ - /* y_final | | \- | xx*xxx.........|............| */ - /* sy1 | | | | xxxxxB...|............| */ - /* | | | | | | */ - /* | | | | | | */ - /* y_bottom +------------+------------+------------+------------+------------+ */ - /* */ - /* goal is to measure the area covered by '.' in each pixel */ - - /* if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 */ - /* @TODO: maybe test against sy1 rather than y_bottom? */ - if (y_crossing > y_bottom) - y_crossing = y_bottom; - - sign = e->direction; - - /* area of the rectangle covered from sy0..y_crossing */ - area = sign * (y_crossing-sy0); - - /* area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) */ - scanline[x1] += stbtt__sized_triangle_area(area, x1+1 - x_top); - - /* check if final y_crossing is blown up; no test case for this */ - if (y_final > y_bottom) { - y_final = y_bottom; - dy = (y_final - y_crossing ) / (x2 - (x1+1)); /* if denom=0, y_final = y_crossing, so y_final <= y_bottom */ - } - - /* in second pixel, area covered by line segment found in first pixel */ - /* is always a rectangle 1 wide * the height of that line segment; this */ - /* is exactly what the variable 'area' stores. it also gets a contribution */ - /* from the line segment within it. the THIRD pixel will get the first */ - /* pixel's rectangle contribution, the second pixel's rectangle contribution, */ - /* and its own contribution. the 'own contribution' is the same in every pixel except */ - /* the leftmost and rightmost, a trapezoid that slides down in each pixel. */ - /* the second pixel's contribution to the third pixel will be the */ - /* rectangle 1 wide times the height change in the second pixel, which is dy. */ - - step = sign * dy * 1; /* dy is dy/dx, change in y for every 1 change in x, */ - /* which multiplied by 1-pixel-width is how much pixel area changes for each step in x */ - /* so the area advances by 'step' every time */ - - for (x = x1+1; x < x2; ++x) { - scanline[x] += area + step/2; /* area of trapezoid is 1*step/2 */ - area += step; - } - STBTT_assert(STBTT_fabs(area) <= 1.01f); /* accumulated error from area += step unless we round step down */ - STBTT_assert(sy1 > y_final-0.01f); - - /* area covered in the last pixel is the rectangle from all the pixels to the left, */ - /* plus the trapezoid filled by the line segment in this pixel all the way to the right edge */ - scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1-y_final, (float) x2, x2+1.0f, x_bottom, x2+1.0f); - - /* the rest of the line is filled based on the total height of the line segment in this pixel */ - scanline_fill[x2] += sign * (sy1-sy0); - } - } else { - /* if edge goes outside of box we're drawing, we require */ - /* clipping logic. since this does not match the intended use */ - /* of this library, we use a different, very slow brute */ - /* force implementation */ - /* note though that this does happen some of the time because */ - /* x_top and x_bottom can be extrapolated at the top & bottom of */ - /* the shape and actually lie outside the bounding box */ - int x; - for (x=0; x < len; ++x) { - /* cases: */ - /* */ - /* there can be up to two intersections with the pixel. any intersection */ - /* with left or right edges can be handled by splitting into two (or three) */ - /* regions. intersections with top & bottom do not necessitate case-wise logic. */ - /* */ - /* the old way of doing this found the intersections with the left & right edges, */ - /* then used some simple logic to produce up to three segments in sorted order */ - /* from top-to-bottom. however, this had a problem: if an x edge was epsilon */ - /* across the x border, then the corresponding y position might not be distinct */ - /* from the other y segment, and it might ignored as an empty segment. to avoid */ - /* that, we need to explicitly produce segments based on x positions. */ - - /* rename variables to clearly-defined pairs */ - float y0 = y_top; - float x1 = (float) (x); - float x2 = (float) (x+1); - float x3 = xb; - float y3 = y_bottom; - - /* x = e->x + e->dx * (y-y_top) */ - /* (y-y_top) = (x - e->x) / e->dx */ - /* y = (x - e->x) / e->dx + y_top */ - float y1 = (x - x0) / dx + y_top; - float y2 = (x+1 - x0) / dx + y_top; - - if (x0 < x1 && x3 > x2) { /* three segments descending down-right */ - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x1 && x0 > x2) { /* three segments descending down-left */ - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x1 && x3 > x1) { /* two segments across x, down-right */ - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x3 < x1 && x0 > x1) { /* two segments across x, down-left */ - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x2 && x3 > x2) { /* two segments across x+1, down-right */ - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x2 && x0 > x2) { /* two segments across x+1, down-left */ - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else { /* one segment */ - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3); - } - } - } - } - e = e->next; - } -} - -/* directly AA rasterize edges w/o supersampling */ -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0, i; - float scanline_data[129], *scanline, *scanline2; - - STBTT__NOTUSED(vsubsample); - - if (result->w > 64) - scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata); - else - scanline = scanline_data; - - scanline2 = scanline + result->w; - - y = off_y; - e[n].y0 = (float) (off_y + result->h) + 1; - - while (j < result->h) { - /* find center of pixel for this scanline */ - float scan_y_top = y + 0.0f; - float scan_y_bottom = y + 1.0f; - stbtt__active_edge **step = &active; - - STBTT_memset(scanline , 0, result->w*sizeof(scanline[0])); - STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0])); - - /* update all active edges; */ - /* remove all active edges that terminate before the top of this scanline */ - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y_top) { - *step = z->next; /* delete from list */ - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - step = &((*step)->next); /* advance through list */ - } - } - - /* insert all edges that start before the bottom of this scanline */ - while (e->y0 <= scan_y_bottom) { - if (e->y0 != e->y1) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); - if (z != NULL) { - if (j == 0 && off_y != 0) { - if (z->ey < scan_y_top) { - /* this can happen due to subpixel positioning and some kind of fp rounding error i think */ - z->ey = scan_y_top; - } - } - STBTT_assert(z->ey >= scan_y_top); /* if we get really unlucky a tiny bit of an edge can be out of bounds */ - /* insert at front */ - z->next = active; - active = z; - } - } - ++e; - } - - /* now process all active edges */ - if (active) - stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top); - - { - float sum = 0; - for (i=0; i < result->w; ++i) { - float k; - int m; - sum += scanline2[i]; - k = scanline[i] + sum; - k = (float) STBTT_fabs(k)*255 + 0.5f; - m = (int) k; - if (m > 255) m = 255; - result->pixels[j*result->stride + i] = (unsigned char) m; - } - } - /* advance all the edges */ - step = &active; - while (*step) { - stbtt__active_edge *z = *step; - z->fx += z->fdx; /* advance to position for current scanline */ - step = &((*step)->next); /* advance through list */ - } - - ++y; - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) - -static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n) -{ - int i,j; - for (i=1; i < n; ++i) { - stbtt__edge t = p[i], *a = &t; - j = i; - while (j > 0) { - stbtt__edge *b = &p[j-1]; - int c = STBTT__COMPARE(a,b); - if (!c) break; - p[j] = p[j-1]; - --j; - } - if (i != j) - p[j] = t; - } -} - -static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n) -{ - /* threshold for transitioning to insertion sort */ - while (n > 12) { - stbtt__edge t; - int c01,c12,c,m,i,j; - - /* compute median of three */ - m = n >> 1; - c01 = STBTT__COMPARE(&p[0],&p[m]); - c12 = STBTT__COMPARE(&p[m],&p[n-1]); - /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ - if (c01 != c12) { - /* otherwise, we'll need to swap something else to middle */ - int z; - c = STBTT__COMPARE(&p[0],&p[n-1]); - /* 0>mid && midn => n; 0 0 */ - /* 0n: 0>n => 0; 0 n */ - z = (c == c12) ? 0 : n-1; - t = p[z]; - p[z] = p[m]; - p[m] = t; - } - /* now p[m] is the median-of-three */ - /* swap it to the beginning so it won't move around */ - t = p[0]; - p[0] = p[m]; - p[m] = t; - - /* partition loop */ - i=1; - j=n-1; - for(;;) { - /* handling of equality is crucial here */ - /* for sentinels & efficiency with duplicates */ - for (;;++i) { - if (!STBTT__COMPARE(&p[i], &p[0])) break; - } - for (;;--j) { - if (!STBTT__COMPARE(&p[0], &p[j])) break; - } - /* make sure we haven't crossed */ - if (i >= j) break; - t = p[i]; - p[i] = p[j]; - p[j] = t; - - ++i; - --j; - } - /* recurse on smaller side, iterate on larger */ - if (j < (n-i)) { - stbtt__sort_edges_quicksort(p,j); - p = p+i; - n = n-i; - } else { - stbtt__sort_edges_quicksort(p+i, n-i); - n = j; - } - } -} - -static void stbtt__sort_edges(stbtt__edge *p, int n) -{ - stbtt__sort_edges_quicksort(p, n); - stbtt__sort_edges_ins_sort(p, n); -} - -typedef struct -{ - float x,y; -} stbtt__point; - -static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) -{ - float y_scale_inv = invert ? -scale_y : scale_y; - stbtt__edge *e; - int n,i,j,k,m; -#if STBTT_RASTERIZER_VERSION == 1 - int vsubsample = result->h < 8 ? 15 : 5; -#elif STBTT_RASTERIZER_VERSION == 2 - int vsubsample = 1; -#else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - /* vsubsample should divide 255 evenly; otherwise we won't reach full opacity */ - - /* now we have to blow out the windings into explicit edge lists */ - n = 0; - for (i=0; i < windings; ++i) - n += wcount[i]; - - e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); /* add an extra one as a sentinel */ - if (e == 0) return; - n = 0; - - m=0; - for (i=0; i < windings; ++i) { - stbtt__point *p = pts + m; - m += wcount[i]; - j = wcount[i]-1; - for (k=0; k < wcount[i]; j=k++) { - int a=k,b=j; - /* skip the edge if horizontal */ - if (p[j].y == p[k].y) - continue; - /* add edge from j to k to the list */ - e[n].invert = 0; - if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { - e[n].invert = 1; - a=j,b=k; - } - e[n].x0 = p[a].x * scale_x + shift_x; - e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; - e[n].x1 = p[b].x * scale_x + shift_x; - e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; - ++n; - } - } - - /* now sort the edges by their highest point (should snap to integer, and then by x) */ - /* STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); */ - stbtt__sort_edges(e, n); - - /* now, traverse the scanlines and find the intersections on each scanline, use xor winding rule */ - stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); - - STBTT_free(e, userdata); -} - -static void stbtt__add_point(stbtt__point *points, int n, float x, float y) -{ - if (!points) return; /* during first pass, it's unallocated */ - points[n].x = x; - points[n].y = y; -} - -/* tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching */ -static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) -{ - /* midpoint */ - float mx = (x0 + 2*x1 + x2)/4; - float my = (y0 + 2*y1 + y2)/4; - /* versus directly drawn line */ - float dx = (x0+x2)/2 - mx; - float dy = (y0+y2)/2 - my; - if (n > 16) /* 65536 segments on one curve better be enough! */ - return 1; - if (dx*dx+dy*dy > objspace_flatness_squared) { /* half-pixel error allowed... need to be smaller if AA */ - stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x2,y2); - *num_points = *num_points+1; - } - return 1; -} - -static void stbtt__tesselate_cubic(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) -{ - /* @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough */ - float dx0 = x1-x0; - float dy0 = y1-y0; - float dx1 = x2-x1; - float dy1 = y2-y1; - float dx2 = x3-x2; - float dy2 = y3-y2; - float dx = x3-x0; - float dy = y3-y0; - float longlen = (float) (STBTT_sqrt(dx0*dx0+dy0*dy0)+STBTT_sqrt(dx1*dx1+dy1*dy1)+STBTT_sqrt(dx2*dx2+dy2*dy2)); - float shortlen = (float) STBTT_sqrt(dx*dx+dy*dy); - float flatness_squared = longlen*longlen-shortlen*shortlen; - - if (n > 16) /* 65536 segments on one curve better be enough! */ - return; - - if (flatness_squared > objspace_flatness_squared) { - float x01 = (x0+x1)/2; - float y01 = (y0+y1)/2; - float x12 = (x1+x2)/2; - float y12 = (y1+y2)/2; - float x23 = (x2+x3)/2; - float y23 = (y2+y3)/2; - - float xa = (x01+x12)/2; - float ya = (y01+y12)/2; - float xb = (x12+x23)/2; - float yb = (y12+y23)/2; - - float mx = (xa+xb)/2; - float my = (ya+yb)/2; - - stbtt__tesselate_cubic(points, num_points, x0,y0, x01,y01, xa,ya, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_cubic(points, num_points, mx,my, xb,yb, x23,y23, x3,y3, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x3,y3); - *num_points = *num_points+1; - } -} - -/* returns number of contours */ -static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) -{ - stbtt__point *points=0; - int num_points=0; - - float objspace_flatness_squared = objspace_flatness * objspace_flatness; - int i,n=0,start=0, pass; - - /* count how many "moves" there are to get the contour count */ - for (i=0; i < num_verts; ++i) - if (vertices[i].type == STBTT_vmove) - ++n; - - *num_contours = n; - if (n == 0) return 0; - - *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); - - if (*contour_lengths == 0) { - *num_contours = 0; - return 0; - } - - /* make two passes through the points so we don't need to realloc */ - for (pass=0; pass < 2; ++pass) { - float x=0,y=0; - if (pass == 1) { - points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); - if (points == NULL) goto error; - } - num_points = 0; - n= -1; - for (i=0; i < num_verts; ++i) { - switch (vertices[i].type) { - case STBTT_vmove: - /* start the next contour */ - if (n >= 0) - (*contour_lengths)[n] = num_points - start; - ++n; - start = num_points; - - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x,y); - break; - case STBTT_vline: - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x, y); - break; - case STBTT_vcurve: - stbtt__tesselate_curve(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - case STBTT_vcubic: - stbtt__tesselate_cubic(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].cx1, vertices[i].cy1, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - } - } - (*contour_lengths)[n] = num_points - start; - } - - return points; -error: - STBTT_free(points, userdata); - STBTT_free(*contour_lengths, userdata); - *contour_lengths = 0; - *num_contours = 0; - return NULL; -} - -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) -{ - float scale = scale_x > scale_y ? scale_y : scale_x; - int winding_count = 0; - int *winding_lengths = NULL; - stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); - if (windings) { - stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); - STBTT_free(winding_lengths, userdata); - STBTT_free(windings, userdata); - } -} - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) -{ - STBTT_free(bitmap, userdata); -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - int ix0,iy0,ix1,iy1; - stbtt__bitmap gbm; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - - if (scale_x == 0) scale_x = scale_y; - if (scale_y == 0) { - if (scale_x == 0) { - STBTT_free(vertices, info->userdata); - return NULL; - } - scale_y = scale_x; - } - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); - - /* now we get the size */ - gbm.w = (ix1 - ix0); - gbm.h = (iy1 - iy0); - gbm.pixels = NULL; /* in case we error */ - - if (width ) *width = gbm.w; - if (height) *height = gbm.h; - if (xoff ) *xoff = ix0; - if (yoff ) *yoff = iy0; - - if (gbm.w && gbm.h) { - gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); - if (gbm.pixels) { - gbm.stride = gbm.w; - - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); - } - } - STBTT_free(vertices, info->userdata); - return gbm.pixels; -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) -{ - int ix0,iy0; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - stbtt__bitmap gbm; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); - gbm.pixels = output; - gbm.w = out_w; - gbm.h = out_h; - gbm.stride = out_stride; - - if (gbm.w && gbm.h) - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); - - STBTT_free(vertices, info->userdata); -} - -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info,codepoint)); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) -{ - stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); -} - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* bitmap baking */ -/* */ -/* This is SUPER-CRAPPY packing to keep source code small */ - -static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset, /* font location (use offset=0 for plain .ttf) */ - float pixel_height, /* height of font in pixels */ - unsigned char *pixels, int pw, int ph, /* bitmap to be filled in */ - int first_char, int num_chars, /* characters to bake */ - stbtt_bakedchar *chardata) -{ - float scale; - int x,y,bottom_y, i; - stbtt_fontinfo f; - f.userdata = NULL; - if (!stbtt_InitFont(&f, data, offset)) - return -1; - STBTT_memset(pixels, 0, pw*ph); /* background of 0 around pixels */ - x=y=1; - bottom_y = 1; - - scale = stbtt_ScaleForPixelHeight(&f, pixel_height); - - for (i=0; i < num_chars; ++i) { - int advance, lsb, x0,y0,x1,y1,gw,gh; - int g = stbtt_FindGlyphIndex(&f, first_char + i); - stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); - stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); - gw = x1-x0; - gh = y1-y0; - if (x + gw + 1 >= pw) - y = bottom_y, x = 1; /* advance to next row */ - if (y + gh + 1 >= ph) /* check if it fits vertically AFTER potentially moving to next row */ - return -i; - STBTT_assert(x+gw < pw); - STBTT_assert(y+gh < ph); - stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); - chardata[i].x0 = (stbtt_int16) x; - chardata[i].y0 = (stbtt_int16) y; - chardata[i].x1 = (stbtt_int16) (x + gw); - chardata[i].y1 = (stbtt_int16) (y + gh); - chardata[i].xadvance = scale * advance; - chardata[i].xoff = (float) x0; - chardata[i].yoff = (float) y0; - x = x + gw + 1; - if (y+gh+1 > bottom_y) - bottom_y = y+gh+1; - } - return bottom_y; -} - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) -{ - float d3d_bias = opengl_fillrule ? 0 : -0.5f; - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_bakedchar *b = chardata + char_index; - int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); - int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); - - q->x0 = round_x + d3d_bias; - q->y0 = round_y + d3d_bias; - q->x1 = round_x + b->x1 - b->x0 + d3d_bias; - q->y1 = round_y + b->y1 - b->y0 + d3d_bias; - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* rectangle packing replacement routines if you don't have stb_rect_pack.h */ -/* */ - -#ifndef STB_RECT_PACK_VERSION - -typedef int stbrp_coord; - -/* ////////////////////////////////////////////////////////////////////////////////// */ -/* // */ -/* // */ -/* COMPILER WARNING ?!?!? // */ -/* // */ -/* // */ -/* if you get a compile warning due to these symbols being defined more than // */ -/* once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // */ -/* // */ -/* ////////////////////////////////////////////////////////////////////////////////// */ - -typedef struct -{ - int width,height; - int x,y,bottom_y; -} stbrp_context; - -typedef struct -{ - unsigned char x; -} stbrp_node; - -struct stbrp_rect -{ - stbrp_coord x,y; - int id,w,h,was_packed; -}; - -static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes) -{ - con->width = pw; - con->height = ph; - con->x = 0; - con->y = 0; - con->bottom_y = 0; - STBTT__NOTUSED(nodes); - STBTT__NOTUSED(num_nodes); -} - -static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects) -{ - int i; - for (i=0; i < num_rects; ++i) { - if (con->x + rects[i].w > con->width) { - con->x = 0; - con->y = con->bottom_y; - } - if (con->y + rects[i].h > con->height) - break; - rects[i].x = con->x; - rects[i].y = con->y; - rects[i].was_packed = 1; - con->x += rects[i].w; - if (con->y + rects[i].h > con->bottom_y) - con->bottom_y = con->y + rects[i].h; - } - for ( ; i < num_rects; ++i) - rects[i].was_packed = 0; -} -#endif - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* bitmap baking */ -/* */ -/* This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If */ -/* stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. */ - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context) -{ - stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context) ,alloc_context); - int num_nodes = pw - padding; - stbrp_node *nodes = (stbrp_node *) STBTT_malloc(sizeof(*nodes ) * num_nodes,alloc_context); - - if (context == NULL || nodes == NULL) { - if (context != NULL) STBTT_free(context, alloc_context); - if (nodes != NULL) STBTT_free(nodes , alloc_context); - return 0; - } - - spc->user_allocator_context = alloc_context; - spc->width = pw; - spc->height = ph; - spc->pixels = pixels; - spc->pack_info = context; - spc->nodes = nodes; - spc->padding = padding; - spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; - spc->h_oversample = 1; - spc->v_oversample = 1; - spc->skip_missing = 0; - - stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes); - - if (pixels) - STBTT_memset(pixels, 0, pw*ph); /* background of 0 around pixels */ - - return 1; -} - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc) -{ - STBTT_free(spc->nodes , spc->user_allocator_context); - STBTT_free(spc->pack_info, spc->user_allocator_context); -} - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample) -{ - STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); - STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); - if (h_oversample <= STBTT_MAX_OVERSAMPLE) - spc->h_oversample = h_oversample; - if (v_oversample <= STBTT_MAX_OVERSAMPLE) - spc->v_oversample = v_oversample; -} - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip) -{ - spc->skip_missing = skip; -} - -#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) - -static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_w = w - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); /* suppress bogus warning from VS2013 -analyze */ - for (j=0; j < h; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - /* make kernel_width a constant in common cases so compiler can optimize out the divide */ - switch (kernel_width) { - case 2: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < w; ++i) { - STBTT_assert(pixels[i] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i] = (unsigned char) (total / kernel_width); - } - - pixels += stride_in_bytes; - } -} - -static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_h = h - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); /* suppress bogus warning from VS2013 -analyze */ - for (j=0; j < w; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - /* make kernel_width a constant in common cases so compiler can optimize out the divide */ - switch (kernel_width) { - case 2: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < h; ++i) { - STBTT_assert(pixels[i*stride_in_bytes] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - - pixels += 1; - } -} - -static float stbtt__oversample_shift(int oversample) -{ - if (!oversample) - return 0.0f; - - /* The prefilter is a box filter of width "oversample", */ - /* which shifts phase by (oversample - 1)/2 pixels in */ - /* oversampled space. We want to shift in the opposite */ - /* direction to counter this. */ - return (float)-(oversample - 1) / (2.0f * (float)oversample); -} - -/* rects array must be big enough to accommodate all characters in the given ranges */ -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k; - int missing_glyph_added = 0; - - k=0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - ranges[i].h_oversample = (unsigned char) spc->h_oversample; - ranges[i].v_oversample = (unsigned char) spc->v_oversample; - for (j=0; j < ranges[i].num_chars; ++j) { - int x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - if (glyph == 0 && (spc->skip_missing || missing_glyph_added)) { - rects[k].w = rects[k].h = 0; - } else { - stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - &x0,&y0,&x1,&y1); - rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); - rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); - if (glyph == 0) - missing_glyph_added = 1; - } - ++k; - } - } - - return k; -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, float *sub_x, float *sub_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, - output, - out_w - (prefilter_x - 1), - out_h - (prefilter_y - 1), - out_stride, - scale_x, - scale_y, - shift_x, - shift_y, - glyph); - - if (prefilter_x > 1) - stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); - - if (prefilter_y > 1) - stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); - - *sub_x = stbtt__oversample_shift(prefilter_x); - *sub_y = stbtt__oversample_shift(prefilter_y); -} - -/* rects array must be big enough to accommodate all characters in the given ranges */ -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k, missing_glyph = -1, return_value = 1; - - /* save current values */ - int old_h_over = spc->h_oversample; - int old_v_over = spc->v_oversample; - - k = 0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - float recip_h,recip_v,sub_x,sub_y; - spc->h_oversample = ranges[i].h_oversample; - spc->v_oversample = ranges[i].v_oversample; - recip_h = 1.0f / spc->h_oversample; - recip_v = 1.0f / spc->v_oversample; - sub_x = stbtt__oversample_shift(spc->h_oversample); - sub_y = stbtt__oversample_shift(spc->v_oversample); - for (j=0; j < ranges[i].num_chars; ++j) { - stbrp_rect *r = &rects[k]; - if (r->was_packed && r->w != 0 && r->h != 0) { - stbtt_packedchar *bc = &ranges[i].chardata_for_range[j]; - int advance, lsb, x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - stbrp_coord pad = (stbrp_coord) spc->padding; - - /* pad on left and top */ - r->x += pad; - r->y += pad; - r->w -= pad; - r->h -= pad; - stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); - stbtt_GetGlyphBitmapBox(info, glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - &x0,&y0,&x1,&y1); - stbtt_MakeGlyphBitmapSubpixel(info, - spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w - spc->h_oversample+1, - r->h - spc->v_oversample+1, - spc->stride_in_bytes, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - glyph); - - if (spc->h_oversample > 1) - stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->h_oversample); - - if (spc->v_oversample > 1) - stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->v_oversample); - - bc->x0 = (stbtt_int16) r->x; - bc->y0 = (stbtt_int16) r->y; - bc->x1 = (stbtt_int16) (r->x + r->w); - bc->y1 = (stbtt_int16) (r->y + r->h); - bc->xadvance = scale * advance; - bc->xoff = (float) x0 * recip_h + sub_x; - bc->yoff = (float) y0 * recip_v + sub_y; - bc->xoff2 = (x0 + r->w) * recip_h + sub_x; - bc->yoff2 = (y0 + r->h) * recip_v + sub_y; - - if (glyph == 0) - missing_glyph = j; - } else if (spc->skip_missing) { - return_value = 0; - } else if (r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { - ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; - } else { - return_value = 0; /* if any fail, report failure */ - } - - ++k; - } - } - - /* restore original values */ - spc->h_oversample = old_h_over; - spc->v_oversample = old_v_over; - - return return_value; -} - -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects) -{ - stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects); -} - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges) -{ - stbtt_fontinfo info; - int i,j,n, return_value = 1; - /* stbrp_context *context = (stbrp_context *) spc->pack_info; */ - stbrp_rect *rects; - - /* flag all characters as NOT packed */ - for (i=0; i < num_ranges; ++i) - for (j=0; j < ranges[i].num_chars; ++j) - ranges[i].chardata_for_range[j].x0 = - ranges[i].chardata_for_range[j].y0 = - ranges[i].chardata_for_range[j].x1 = - ranges[i].chardata_for_range[j].y1 = 0; - - n = 0; - for (i=0; i < num_ranges; ++i) - n += ranges[i].num_chars; - - rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); - if (rects == NULL) - return 0; - - info.userdata = spc->user_allocator_context; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index)); - - n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); - - stbtt_PackFontRangesPackRects(spc, rects, n); - - return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); - - STBTT_free(rects, spc->user_allocator_context); - return return_value; -} - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, - int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range) -{ - stbtt_pack_range range; - range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; - range.array_of_unicode_codepoints = NULL; - range.num_chars = num_chars_in_range; - range.chardata_for_range = chardata_for_range; - range.font_size = font_size; - return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); -} - -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap) -{ - int i_ascent, i_descent, i_lineGap; - float scale; - stbtt_fontinfo info; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); - scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); - stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); - *ascent = (float) i_ascent * scale; - *descent = (float) i_descent * scale; - *lineGap = (float) i_lineGap * scale; -} - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer) -{ - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_packedchar *b = chardata + char_index; - - if (align_to_integer) { - float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f); - float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f); - q->x0 = x; - q->y0 = y; - q->x1 = x + b->xoff2 - b->xoff; - q->y1 = y + b->yoff2 - b->yoff; - } else { - q->x0 = *xpos + b->xoff; - q->y0 = *ypos + b->yoff; - q->x1 = *xpos + b->xoff2; - q->y1 = *ypos + b->yoff2; - } - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* sdf computation */ -/* */ - -#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) -#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) - -static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], float hits[2][2]) -{ - float q0perp = q0[1]*ray[0] - q0[0]*ray[1]; - float q1perp = q1[1]*ray[0] - q1[0]*ray[1]; - float q2perp = q2[1]*ray[0] - q2[0]*ray[1]; - float roperp = orig[1]*ray[0] - orig[0]*ray[1]; - - float a = q0perp - 2*q1perp + q2perp; - float b = q1perp - q0perp; - float c = q0perp - roperp; - - float s0 = 0., s1 = 0.; - int num_s = 0; - - if (a != 0.0) { - float discr = b*b - a*c; - if (discr > 0.0) { - float rcpna = -1 / a; - float d = (float) STBTT_sqrt(discr); - s0 = (b+d) * rcpna; - s1 = (b-d) * rcpna; - if (s0 >= 0.0 && s0 <= 1.0) - num_s = 1; - if (d > 0.0 && s1 >= 0.0 && s1 <= 1.0) { - if (num_s == 0) s0 = s1; - ++num_s; - } - } - } else { - /* 2*b*s + c = 0 */ - /* s = -c / (2*b) */ - s0 = c / (-2 * b); - if (s0 >= 0.0 && s0 <= 1.0) - num_s = 1; - } - - if (num_s == 0) - return 0; - else { - float rcp_len2 = 1 / (ray[0]*ray[0] + ray[1]*ray[1]); - float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; - - float q0d = q0[0]*rayn_x + q0[1]*rayn_y; - float q1d = q1[0]*rayn_x + q1[1]*rayn_y; - float q2d = q2[0]*rayn_x + q2[1]*rayn_y; - float rod = orig[0]*rayn_x + orig[1]*rayn_y; - - float q10d = q1d - q0d; - float q20d = q2d - q0d; - float q0rd = q0d - rod; - - hits[0][0] = q0rd + s0*(2.0f - 2.0f*s0)*q10d + s0*s0*q20d; - hits[0][1] = a*s0+b; - - if (num_s > 1) { - hits[1][0] = q0rd + s1*(2.0f - 2.0f*s1)*q10d + s1*s1*q20d; - hits[1][1] = a*s1+b; - return 2; - } else { - return 1; - } - } -} - -static int equal(float *a, float *b) -{ - return (a[0] == b[0] && a[1] == b[1]); -} - -static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex *verts) -{ - int i; - float orig[2], ray[2] = { 1, 0 }; - float y_frac; - int winding = 0; - - /* make sure y never passes through a vertex of the shape */ - y_frac = (float) STBTT_fmod(y, 1.0f); - if (y_frac < 0.01f) - y += 0.01f; - else if (y_frac > 0.99f) - y -= 0.01f; - - orig[0] = x; - orig[1] = y; - - /* test a ray from (-infinity,y) to (x,y) */ - for (i=0; i < nverts; ++i) { - if (verts[i].type == STBTT_vline) { - int x0 = (int) verts[i-1].x, y0 = (int) verts[i-1].y; - int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y; - if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; - if (x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } - if (verts[i].type == STBTT_vcurve) { - int x0 = (int) verts[i-1].x , y0 = (int) verts[i-1].y ; - int x1 = (int) verts[i ].cx, y1 = (int) verts[i ].cy; - int x2 = (int) verts[i ].x , y2 = (int) verts[i ].y ; - int ax = STBTT_min(x0,STBTT_min(x1,x2)), ay = STBTT_min(y0,STBTT_min(y1,y2)); - int by = STBTT_max(y0,STBTT_max(y1,y2)); - if (y > ay && y < by && x > ax) { - float q0[2],q1[2],q2[2]; - float hits[2][2]; - q0[0] = (float)x0; - q0[1] = (float)y0; - q1[0] = (float)x1; - q1[1] = (float)y1; - q2[0] = (float)x2; - q2[1] = (float)y2; - if (equal(q0,q1) || equal(q1,q2)) { - x0 = (int)verts[i-1].x; - y0 = (int)verts[i-1].y; - x1 = (int)verts[i ].x; - y1 = (int)verts[i ].y; - if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; - if (x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } else { - int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); - if (num_hits >= 1) - if (hits[0][0] < 0) - winding += (hits[0][1] < 0 ? -1 : 1); - if (num_hits >= 2) - if (hits[1][0] < 0) - winding += (hits[1][1] < 0 ? -1 : 1); - } - } - } - } - return winding; -} - -static float stbtt__cuberoot( float x ) -{ - if (x<0) - return -(float) STBTT_pow(-x,1.0f/3.0f); - else - return (float) STBTT_pow( x,1.0f/3.0f); -} - -/* x^3 + a*x^2 + b*x + c = 0 */ -static int stbtt__solve_cubic(float a, float b, float c, float* r) -{ - float s = -a / 3; - float p = b - a*a / 3; - float q = a * (2*a*a - 9*b) / 27 + c; - float p3 = p*p*p; - float d = q*q + 4*p3 / 27; - if (d >= 0) { - float z = (float) STBTT_sqrt(d); - float u = (-q + z) / 2; - float v = (-q - z) / 2; - u = stbtt__cuberoot(u); - v = stbtt__cuberoot(v); - r[0] = s + u + v; - return 1; - } else { - float u = (float) STBTT_sqrt(-p/3); - float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; /* p3 must be negative, since d is negative */ - float m = (float) STBTT_cos(v); - float n = (float) STBTT_cos(v-3.141592/2)*1.732050808f; - r[0] = s + u * 2 * m; - r[1] = s - u * (m + n); - r[2] = s - u * (m - n); - - /* STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? */ - /* STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); */ - /* STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); */ - return 3; - } -} - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) -{ - float scale_x = scale, scale_y = scale; - int ix0,iy0,ix1,iy1; - int w,h; - unsigned char *data; - - if (scale == 0) return NULL; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f,0.0f, &ix0,&iy0,&ix1,&iy1); - - /* if empty, return NULL */ - if (ix0 == ix1 || iy0 == iy1) - return NULL; - - ix0 -= padding; - iy0 -= padding; - ix1 += padding; - iy1 += padding; - - w = (ix1 - ix0); - h = (iy1 - iy0); - - if (width ) *width = w; - if (height) *height = h; - if (xoff ) *xoff = ix0; - if (yoff ) *yoff = iy0; - - /* invert for y-downwards bitmaps */ - scale_y = -scale_y; - - { - int x,y,i,j; - float *precompute; - stbtt_vertex *verts; - int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); - data = (unsigned char *) STBTT_malloc(w * h, info->userdata); - precompute = (float *) STBTT_malloc(num_verts * sizeof(float), info->userdata); - - for (i=0,j=num_verts-1; i < num_verts; j=i++) { - if (verts[i].type == STBTT_vline) { - float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; - float x1 = verts[j].x*scale_x, y1 = verts[j].y*scale_y; - float dist = (float) STBTT_sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); - precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; - } else if (verts[i].type == STBTT_vcurve) { - float x2 = verts[j].x *scale_x, y2 = verts[j].y *scale_y; - float x1 = verts[i].cx*scale_x, y1 = verts[i].cy*scale_y; - float x0 = verts[i].x *scale_x, y0 = verts[i].y *scale_y; - float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; - float len2 = bx*bx + by*by; - if (len2 != 0.0f) - precompute[i] = 1.0f / (bx*bx + by*by); - else - precompute[i] = 0.0f; - } else - precompute[i] = 0.0f; - } - - for (y=iy0; y < iy1; ++y) { - for (x=ix0; x < ix1; ++x) { - float val; - float min_dist = 999999.0f; - float sx = (float) x + 0.5f; - float sy = (float) y + 0.5f; - float x_gspace = (sx / scale_x); - float y_gspace = (sy / scale_y); - - int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, verts); /* @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path */ - - for (i=0; i < num_verts; ++i) { - float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; - - if (verts[i].type == STBTT_vline && precompute[i] != 0.0f) { - float x1 = verts[i-1].x*scale_x, y1 = verts[i-1].y*scale_y; - - float dist,dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); - if (dist2 < min_dist*min_dist) - min_dist = (float) STBTT_sqrt(dist2); - - /* coarse culling against bbox */ - /* if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && */ - /* sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) */ - dist = (float) STBTT_fabs((x1-x0)*(y0-sy) - (y1-y0)*(x0-sx)) * precompute[i]; - STBTT_assert(i != 0); - if (dist < min_dist) { - /* check position along line */ - /* x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) */ - /* minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) */ - float dx = x1-x0, dy = y1-y0; - float px = x0-sx, py = y0-sy; - /* minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy */ - /* derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve */ - float t = -(px*dx + py*dy) / (dx*dx + dy*dy); - if (t >= 0.0f && t <= 1.0f) - min_dist = dist; - } - } else if (verts[i].type == STBTT_vcurve) { - float x2 = verts[i-1].x *scale_x, y2 = verts[i-1].y *scale_y; - float x1 = verts[i ].cx*scale_x, y1 = verts[i ].cy*scale_y; - float box_x0 = STBTT_min(STBTT_min(x0,x1),x2); - float box_y0 = STBTT_min(STBTT_min(y0,y1),y2); - float box_x1 = STBTT_max(STBTT_max(x0,x1),x2); - float box_y1 = STBTT_max(STBTT_max(y0,y1),y2); - /* coarse culling against bbox to avoid computing cubic unnecessarily */ - if (sx > box_x0-min_dist && sx < box_x1+min_dist && sy > box_y0-min_dist && sy < box_y1+min_dist) { - int num=0; - float ax = x1-x0, ay = y1-y0; - float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; - float mx = x0 - sx, my = y0 - sy; - float res[3] = {0.f,0.f,0.f}; - float px,py,t,it,dist2; - float a_inv = precompute[i]; - if (a_inv == 0.0) { /* if a_inv is 0, it's 2nd degree so use quadratic formula */ - float a = 3*(ax*bx + ay*by); - float b = 2*(ax*ax + ay*ay) + (mx*bx+my*by); - float c = mx*ax+my*ay; - if (a == 0.0) { /* if a is 0, it's linear */ - if (b != 0.0) { - res[num++] = -c/b; - } - } else { - float discriminant = b*b - 4*a*c; - if (discriminant < 0) - num = 0; - else { - float root = (float) STBTT_sqrt(discriminant); - res[0] = (-b - root)/(2*a); - res[1] = (-b + root)/(2*a); - num = 2; /* don't bother distinguishing 1-solution case, as code below will still work */ - } - } - } else { - float b = 3*(ax*bx + ay*by) * a_inv; /* could precompute this as it doesn't depend on sample point */ - float c = (2*(ax*ax + ay*ay) + (mx*bx+my*by)) * a_inv; - float d = (mx*ax+my*ay) * a_inv; - num = stbtt__solve_cubic(b, c, d, res); - } - dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); - if (dist2 < min_dist*min_dist) - min_dist = (float) STBTT_sqrt(dist2); - - if (num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { - t = res[0], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - if (num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { - t = res[1], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - if (num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { - t = res[2], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - } - } - } - if (winding == 0) - min_dist = -min_dist; /* if outside the shape, value is negative */ - val = onedge_value + pixel_dist_scale * min_dist; - if (val < 0) - val = 0; - else if (val > 255) - val = 255; - data[(y-iy0)*w+(x-ix0)] = (unsigned char) val; - } - } - STBTT_free(precompute, info->userdata); - STBTT_free(verts, info->userdata); - } - return data; -} - -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata) -{ - STBTT_free(bitmap, userdata); -} - -/* //////////////////////////////////////////////////////////////////////////// */ -/* */ -/* font name matching -- recommended not to use this */ -/* */ - -/* check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string */ -static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2) -{ - stbtt_int32 i=0; - - /* convert utf16 to utf8 and compare the results while converting */ - while (len2) { - stbtt_uint16 ch = s2[0]*256 + s2[1]; - if (ch < 0x80) { - if (i >= len1) return -1; - if (s1[i++] != ch) return -1; - } else if (ch < 0x800) { - if (i+1 >= len1) return -1; - if (s1[i++] != 0xc0 + (ch >> 6)) return -1; - if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; - } else if (ch >= 0xd800 && ch < 0xdc00) { - stbtt_uint32 c; - stbtt_uint16 ch2 = s2[2]*256 + s2[3]; - if (i+3 >= len1) return -1; - c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; - if (s1[i++] != 0xf0 + (c >> 18)) return -1; - if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; - s2 += 2; /* plus another 2 below */ - len2 -= 2; - } else if (ch >= 0xdc00 && ch < 0xe000) { - return -1; - } else { - if (i+2 >= len1) return -1; - if (s1[i++] != 0xe0 + (ch >> 12)) return -1; - if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; - } - s2 += 2; - len2 -= 2; - } - return i; -} - -static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2) -{ - return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2); -} - -/* returns results in whatever encoding you request... but note that 2-byte encodings */ -/* will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare */ -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) -{ - stbtt_int32 i,count,stringOffset; - stbtt_uint8 *fc = font->data; - stbtt_uint32 offset = font->fontstart; - stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return NULL; - - count = ttUSHORT(fc+nm+2); - stringOffset = nm + ttUSHORT(fc+nm+4); - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) - && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { - *length = ttUSHORT(fc+loc+8); - return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); - } - } - return NULL; -} - -static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) -{ - stbtt_int32 i; - stbtt_int32 count = ttUSHORT(fc+nm+2); - stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); - - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - stbtt_int32 id = ttUSHORT(fc+loc+6); - if (id == target_id) { - /* find the encoding */ - stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); - - /* is this a Unicode encoding? */ - if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { - stbtt_int32 slen = ttUSHORT(fc+loc+8); - stbtt_int32 off = ttUSHORT(fc+loc+10); - - /* check if there's a prefix match */ - stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); - if (matchlen >= 0) { - /* check for target_id+1 immediately following, with same encoding & language */ - if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { - slen = ttUSHORT(fc+loc+12+8); - off = ttUSHORT(fc+loc+12+10); - if (slen == 0) { - if (matchlen == nlen) - return 1; - } else if (matchlen < nlen && name[matchlen] == ' ') { - ++matchlen; - if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) - return 1; - } - } else { - /* if nothing immediately following */ - if (matchlen == nlen) - return 1; - } - } - } - - /* @TODO handle other encodings */ - } - } - return 0; -} - -static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) -{ - stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); - stbtt_uint32 nm,hd; - if (!stbtt__isfont(fc+offset)) return 0; - - /* check italics/bold/underline flags in macStyle... */ - if (flags) { - hd = stbtt__find_table(fc, offset, "head"); - if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; - } - - nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return 0; - - if (flags) { - /* if we checked the macStyle flags, then just check the family and ignore the subfamily */ - if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } else { - if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } - - return 0; -} - -static int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags) -{ - stbtt_int32 i; - for (i=0;;++i) { - stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); - if (off < 0) return off; - if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) - return off; - } -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-qual" -#endif - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, - float pixel_height, unsigned char *pixels, int pw, int ph, - int first_char, int num_chars, stbtt_bakedchar *chardata) -{ - return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); -} - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index) -{ - return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index); -} - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data) -{ - return stbtt_GetNumberOfFonts_internal((unsigned char *) data); -} - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset) -{ - return stbtt_InitFont_internal(info, (unsigned char *) data, offset); -} - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags) -{ - return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags); -} - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) -{ - return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2); -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#endif /* STB_TRUETYPE_IMPLEMENTATION */ - - -/* FULL VERSION HISTORY */ -/* */ -/* 1.25 (2021-07-11) many fixes */ -/* 1.24 (2020-02-05) fix warning */ -/* 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) */ -/* 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined */ -/* 1.21 (2019-02-25) fix warning */ -/* 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() */ -/* 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod */ -/* 1.18 (2018-01-29) add missing function */ -/* 1.17 (2017-07-23) make more arguments const; doc fix */ -/* 1.16 (2017-07-12) SDF support */ -/* 1.15 (2017-03-03) make more arguments const */ -/* 1.14 (2017-01-16) num-fonts-in-TTC function */ -/* 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts */ -/* 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual */ -/* 1.11 (2016-04-02) fix unused-variable warning */ -/* 1.10 (2016-04-02) allow user-defined fabs() replacement */ -/* fix memory leak if fontsize=0.0 */ -/* fix warning from duplicate typedef */ -/* 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges */ -/* 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges */ -/* 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; */ -/* allow PackFontRanges to pack and render in separate phases; */ -/* fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); */ -/* fixed an assert() bug in the new rasterizer */ -/* replace assert() with STBTT_assert() in new rasterizer */ -/* 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) */ -/* also more precise AA rasterizer, except if shapes overlap */ -/* remove need for STBTT_sort */ -/* 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC */ -/* 1.04 (2015-04-15) typo in example */ -/* 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes */ -/* 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ */ -/* 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match */ -/* non-oversampled; STBTT_POINT_SIZE for packed case only */ -/* 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling */ -/* 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) */ -/* 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID */ -/* 0.8b (2014-07-07) fix a warning */ -/* 0.8 (2014-05-25) fix a few more warnings */ -/* 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back */ -/* 0.6c (2012-07-24) improve documentation */ -/* 0.6b (2012-07-20) fix a few more warnings */ -/* 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, */ -/* stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty */ -/* 0.5 (2011-12-09) bugfixes: */ -/* subpixel glyph renderer computed wrong bounding box */ -/* first vertex of shape can be off-curve (FreeSans) */ -/* 0.4b (2011-12-03) fixed an error in the font baking example */ -/* 0.4 (2011-12-01) kerning, subpixel rendering (tor) */ -/* bugfixes for: */ -/* codepoint-to-glyph conversion using table fmt=12 */ -/* codepoint-to-glyph conversion using table fmt=4 */ -/* stbtt_GetBakedQuad with non-square texture (Zer) */ -/* updated Hello World! sample to use kerning and subpixel */ -/* fixed some warnings */ -/* 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) */ -/* userdata, malloc-from-userdata, non-zero fill (stb) */ -/* 0.2 (2009-03-11) Fix unsigned/signed char warnings */ -/* 0.1 (2009-03-09) First public release */ -/* */ - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -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: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the 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 -AUTHORS 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 IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -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 -AUTHORS 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 IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ - - - - -#ifdef NK_INCLUDE_FONT_BAKING -/* ------------------------------------------------------------- - * - * RECT PACK - * - * --------------------------------------------------------------*/ - - - -/* - * ============================================================== - * - * TRUETYPE - * - * =============================================================== - */ -#define STBTT_MAX_OVERSAMPLE 8 - - -/* ------------------------------------------------------------- - * - * FONT BAKING - * - * --------------------------------------------------------------*/ -struct nk_font_bake_data { - struct stbtt_fontinfo info; - struct stbrp_rect *rects; - stbtt_pack_range *ranges; - nk_rune range_count; -}; - -struct nk_font_baker { - struct nk_allocator alloc; - struct stbtt_pack_context spc; - struct nk_font_bake_data *build; - stbtt_packedchar *packed_chars; - struct stbrp_rect *rects; - stbtt_pack_range *ranges; -}; - -NK_GLOBAL const nk_size nk_rect_align = NK_ALIGNOF(struct stbrp_rect); -NK_GLOBAL const nk_size nk_range_align = NK_ALIGNOF(stbtt_pack_range); -NK_GLOBAL const nk_size nk_char_align = NK_ALIGNOF(stbtt_packedchar); -NK_GLOBAL const nk_size nk_build_align = NK_ALIGNOF(struct nk_font_bake_data); -NK_GLOBAL const nk_size nk_baker_align = NK_ALIGNOF(struct nk_font_baker); - -NK_INTERN int -nk_range_count(const nk_rune *range) -{ - const nk_rune *iter = range; - NK_ASSERT(range); - if (!range) return 0; - while (*(iter++) != 0); - return (iter == range) ? 0 : (int)((iter - range)/2); -} -NK_INTERN int -nk_range_glyph_count(const nk_rune *range, int count) -{ - int i = 0; - int total_glyphs = 0; - for (i = 0; i < count; ++i) { - int diff; - nk_rune f = range[(i*2)+0]; - nk_rune t = range[(i*2)+1]; - NK_ASSERT(t >= f); - diff = (int)((t - f) + 1); - total_glyphs += diff; - } - return total_glyphs; -} -NK_API const nk_rune* -nk_font_default_glyph_ranges(void) -{ - NK_STORAGE const nk_rune ranges[] = {0x0020, 0x00FF, 0}; - return ranges; -} -NK_API const nk_rune* -nk_font_chinese_glyph_ranges(void) -{ - NK_STORAGE const nk_rune ranges[] = { - 0x0020, 0x00FF, - 0x3000, 0x30FF, - 0x31F0, 0x31FF, - 0xFF00, 0xFFEF, - 0x4E00, 0x9FAF, - 0 - }; - return ranges; -} -NK_API const nk_rune* -nk_font_cyrillic_glyph_ranges(void) -{ - NK_STORAGE const nk_rune ranges[] = { - 0x0020, 0x00FF, - 0x0400, 0x052F, - 0x2DE0, 0x2DFF, - 0xA640, 0xA69F, - 0 - }; - return ranges; -} -NK_API const nk_rune* -nk_font_korean_glyph_ranges(void) -{ - NK_STORAGE const nk_rune ranges[] = { - 0x0020, 0x00FF, - 0x3131, 0x3163, - 0xAC00, 0xD79D, - 0 - }; - return ranges; -} -NK_INTERN void -nk_font_baker_memory(nk_size *temp, int *glyph_count, - struct nk_font_config *config_list, int count) -{ - int range_count = 0; - int total_range_count = 0; - struct nk_font_config *iter, *i; - - NK_ASSERT(config_list); - NK_ASSERT(glyph_count); - if (!config_list) { - *temp = 0; - *glyph_count = 0; - return; - } - *glyph_count = 0; - for (iter = config_list; iter; iter = iter->next) { - i = iter; - do {if (!i->range) iter->range = nk_font_default_glyph_ranges(); - range_count = nk_range_count(i->range); - total_range_count += range_count; - *glyph_count += nk_range_glyph_count(i->range, range_count); - } while ((i = i->n) != iter); - } - *temp = (nk_size)*glyph_count * sizeof(struct stbrp_rect); - *temp += (nk_size)total_range_count * sizeof(stbtt_pack_range); - *temp += (nk_size)*glyph_count * sizeof(stbtt_packedchar); - *temp += (nk_size)count * sizeof(struct nk_font_bake_data); - *temp += sizeof(struct nk_font_baker); - *temp += nk_rect_align + nk_range_align + nk_char_align; - *temp += nk_build_align + nk_baker_align; -} -NK_INTERN struct nk_font_baker* -nk_font_baker(void *memory, int glyph_count, int count, struct nk_allocator *alloc) -{ - struct nk_font_baker *baker; - if (!memory) return 0; - /* setup baker inside a memory block */ - baker = (struct nk_font_baker*)NK_ALIGN_PTR(memory, nk_baker_align); - baker->build = (struct nk_font_bake_data*)NK_ALIGN_PTR((baker + 1), nk_build_align); - baker->packed_chars = (stbtt_packedchar*)NK_ALIGN_PTR((baker->build + count), nk_char_align); - baker->rects = (struct stbrp_rect*)NK_ALIGN_PTR((baker->packed_chars + glyph_count), nk_rect_align); - baker->ranges = (stbtt_pack_range*)NK_ALIGN_PTR((baker->rects + glyph_count), nk_range_align); - baker->alloc = *alloc; - return baker; -} -NK_INTERN int -nk_font_bake_pack(struct nk_font_baker *baker, - nk_size *image_memory, int *width, int *height, struct nk_recti *custom, - const struct nk_font_config *config_list, int count, - struct nk_allocator *alloc) -{ - NK_STORAGE const nk_size max_height = 1024 * 32; - const struct nk_font_config *config_iter, *it; - int total_glyph_count = 0; - int total_range_count = 0; - int range_count = 0; - int i = 0; - - NK_ASSERT(image_memory); - NK_ASSERT(width); - NK_ASSERT(height); - NK_ASSERT(config_list); - NK_ASSERT(count); - NK_ASSERT(alloc); - - if (!image_memory || !width || !height || !config_list || !count) return nk_false; - for (config_iter = config_list; config_iter; config_iter = config_iter->next) { - it = config_iter; - do {range_count = nk_range_count(it->range); - total_range_count += range_count; - total_glyph_count += nk_range_glyph_count(it->range, range_count); - } while ((it = it->n) != config_iter); - } - /* setup font baker from temporary memory */ - for (config_iter = config_list; config_iter; config_iter = config_iter->next) { - it = config_iter; - do { - struct stbtt_fontinfo *font_info = &baker->build[i++].info; - font_info->userdata = alloc; - - if (!stbtt_InitFont(font_info, (const unsigned char*)it->ttf_blob, stbtt_GetFontOffsetForIndex((const unsigned char*)it->ttf_blob, 0))) - return nk_false; - } while ((it = it->n) != config_iter); - } - *height = 0; - *width = (total_glyph_count > 1000) ? 1024 : 512; - stbtt_PackBegin(&baker->spc, 0, (int)*width, (int)max_height, 0, 1, alloc); - { - int input_i = 0; - int range_n = 0; - int rect_n = 0; - int char_n = 0; - - if (custom) { - /* pack custom user data first so it will be in the upper left corner*/ - struct stbrp_rect custom_space; - nk_zero(&custom_space, sizeof(custom_space)); - custom_space.w = (stbrp_coord)(custom->w); - custom_space.h = (stbrp_coord)(custom->h); - - stbtt_PackSetOversampling(&baker->spc, 1, 1); - stbrp_pack_rects((struct stbrp_context*)baker->spc.pack_info, &custom_space, 1); - *height = NK_MAX(*height, (int)(custom_space.y + custom_space.h)); - - custom->x = (short)custom_space.x; - custom->y = (short)custom_space.y; - custom->w = (short)custom_space.w; - custom->h = (short)custom_space.h; - } - - /* first font pass: pack all glyphs */ - for (input_i = 0, config_iter = config_list; input_i < count && config_iter; - config_iter = config_iter->next) { - it = config_iter; - do {int n = 0; - int glyph_count; - const nk_rune *in_range; - const struct nk_font_config *cfg = it; - struct nk_font_bake_data *tmp = &baker->build[input_i++]; - - /* count glyphs + ranges in current font */ - glyph_count = 0; range_count = 0; - for (in_range = cfg->range; in_range[0] && in_range[1]; in_range += 2) { - glyph_count += (int)(in_range[1] - in_range[0]) + 1; - range_count++; - } - - /* setup ranges */ - tmp->ranges = baker->ranges + range_n; - tmp->range_count = (nk_rune)range_count; - range_n += range_count; - for (i = 0; i < range_count; ++i) { - in_range = &cfg->range[i * 2]; - tmp->ranges[i].font_size = cfg->size; - tmp->ranges[i].first_unicode_codepoint_in_range = (int)in_range[0]; - tmp->ranges[i].num_chars = (int)(in_range[1]- in_range[0]) + 1; - tmp->ranges[i].chardata_for_range = baker->packed_chars + char_n; - char_n += tmp->ranges[i].num_chars; - } - - /* pack */ - tmp->rects = baker->rects + rect_n; - rect_n += glyph_count; - stbtt_PackSetOversampling(&baker->spc, cfg->oversample_h, cfg->oversample_v); - n = stbtt_PackFontRangesGatherRects(&baker->spc, &tmp->info, - tmp->ranges, (int)tmp->range_count, tmp->rects); - stbrp_pack_rects((struct stbrp_context*)baker->spc.pack_info, tmp->rects, (int)n); - - /* texture height */ - for (i = 0; i < n; ++i) { - if (tmp->rects[i].was_packed) - *height = NK_MAX(*height, tmp->rects[i].y + tmp->rects[i].h); - } - } while ((it = it->n) != config_iter); - } - NK_ASSERT(rect_n == total_glyph_count); - NK_ASSERT(char_n == total_glyph_count); - NK_ASSERT(range_n == total_range_count); - } - *height = (int)nk_round_up_pow2((nk_uint)*height); - *image_memory = (nk_size)(*width) * (nk_size)(*height); - return nk_true; -} -NK_INTERN void -nk_font_bake(struct nk_font_baker *baker, void *image_memory, int width, int height, - struct nk_font_glyph *glyphs, int glyphs_count, - const struct nk_font_config *config_list, int font_count) -{ - int input_i = 0; - nk_rune glyph_n = 0; - const struct nk_font_config *config_iter; - const struct nk_font_config *it; - - NK_ASSERT(image_memory); - NK_ASSERT(width); - NK_ASSERT(height); - NK_ASSERT(config_list); - NK_ASSERT(baker); - NK_ASSERT(font_count); - NK_ASSERT(glyphs_count); - if (!image_memory || !width || !height || !config_list || - !font_count || !glyphs || !glyphs_count) - return; - - /* second font pass: render glyphs */ - nk_zero(image_memory, (nk_size)((nk_size)width * (nk_size)height)); - baker->spc.pixels = (unsigned char*)image_memory; - baker->spc.height = (int)height; - for (input_i = 0, config_iter = config_list; input_i < font_count && config_iter; - config_iter = config_iter->next) { - it = config_iter; - do {const struct nk_font_config *cfg = it; - struct nk_font_bake_data *tmp = &baker->build[input_i++]; - stbtt_PackSetOversampling(&baker->spc, cfg->oversample_h, cfg->oversample_v); - stbtt_PackFontRangesRenderIntoRects(&baker->spc, &tmp->info, tmp->ranges, (int)tmp->range_count, tmp->rects); - } while ((it = it->n) != config_iter); - } stbtt_PackEnd(&baker->spc); - - /* third pass: setup font and glyphs */ - for (input_i = 0, config_iter = config_list; input_i < font_count && config_iter; - config_iter = config_iter->next) { - it = config_iter; - do {nk_size i = 0; - int char_idx = 0; - nk_rune glyph_count = 0; - const struct nk_font_config *cfg = it; - struct nk_font_bake_data *tmp = &baker->build[input_i++]; - struct nk_baked_font *dst_font = cfg->font; - - float font_scale = stbtt_ScaleForPixelHeight(&tmp->info, cfg->size); - int unscaled_ascent, unscaled_descent, unscaled_line_gap; - stbtt_GetFontVMetrics(&tmp->info, &unscaled_ascent, &unscaled_descent, - &unscaled_line_gap); - - /* fill baked font */ - if (!cfg->merge_mode) { - dst_font->ranges = cfg->range; - dst_font->height = cfg->size; - dst_font->ascent = ((float)unscaled_ascent * font_scale); - dst_font->descent = ((float)unscaled_descent * font_scale); - dst_font->glyph_offset = glyph_n; - /* - Need to zero this, or it will carry over from a previous - bake, and cause a segfault when accessing glyphs[]. - */ - dst_font->glyph_count = 0; - } - - /* fill own baked font glyph array */ - for (i = 0; i < tmp->range_count; ++i) { - stbtt_pack_range *range = &tmp->ranges[i]; - for (char_idx = 0; char_idx < range->num_chars; char_idx++) - { - nk_rune codepoint = 0; - float dummy_x = 0, dummy_y = 0; - stbtt_aligned_quad q; - struct nk_font_glyph *glyph; - - /* query glyph bounds from stb_truetype */ - const stbtt_packedchar *pc = &range->chardata_for_range[char_idx]; - codepoint = (nk_rune)(range->first_unicode_codepoint_in_range + char_idx); - stbtt_GetPackedQuad(range->chardata_for_range, (int)width, - (int)height, char_idx, &dummy_x, &dummy_y, &q, 0); - - /* fill own glyph type with data */ - glyph = &glyphs[dst_font->glyph_offset + dst_font->glyph_count + (unsigned int)glyph_count]; - glyph->codepoint = codepoint; - glyph->x0 = q.x0; glyph->y0 = q.y0; - glyph->x1 = q.x1; glyph->y1 = q.y1; - glyph->y0 += (dst_font->ascent + 0.5f); - glyph->y1 += (dst_font->ascent + 0.5f); - glyph->w = glyph->x1 - glyph->x0 + 0.5f; - glyph->h = glyph->y1 - glyph->y0; - - if (cfg->coord_type == NK_COORD_PIXEL) { - glyph->u0 = q.s0 * (float)width; - glyph->v0 = q.t0 * (float)height; - glyph->u1 = q.s1 * (float)width; - glyph->v1 = q.t1 * (float)height; - } else { - glyph->u0 = q.s0; - glyph->v0 = q.t0; - glyph->u1 = q.s1; - glyph->v1 = q.t1; - } - glyph->xadvance = (pc->xadvance + cfg->spacing.x); - if (cfg->pixel_snap) - glyph->xadvance = (float)(int)(glyph->xadvance + 0.5f); - glyph_count++; - } - } - dst_font->glyph_count += glyph_count; - glyph_n += glyph_count; - } while ((it = it->n) != config_iter); - } -} -NK_INTERN void -nk_font_bake_custom_data(void *img_memory, int img_width, int img_height, - struct nk_recti img_dst, const char *texture_data_mask, int tex_width, - int tex_height, char white, char black) -{ - nk_byte *pixels; - int y = 0; - int x = 0; - int n = 0; - - NK_ASSERT(img_memory); - NK_ASSERT(img_width); - NK_ASSERT(img_height); - NK_ASSERT(texture_data_mask); - NK_UNUSED(tex_height); - if (!img_memory || !img_width || !img_height || !texture_data_mask) - return; - - pixels = (nk_byte*)img_memory; - for (y = 0, n = 0; y < tex_height; ++y) { - for (x = 0; x < tex_width; ++x, ++n) { - const int off0 = ((img_dst.x + x) + (img_dst.y + y) * img_width); - const int off1 = off0 + 1 + tex_width; - pixels[off0] = (texture_data_mask[n] == white) ? 0xFF : 0x00; - pixels[off1] = (texture_data_mask[n] == black) ? 0xFF : 0x00; - } - } -} -NK_INTERN void -nk_font_bake_convert(void *out_memory, int img_width, int img_height, - const void *in_memory) -{ - int n = 0; - nk_rune *dst; - const nk_byte *src; - - NK_ASSERT(out_memory); - NK_ASSERT(in_memory); - NK_ASSERT(img_width); - NK_ASSERT(img_height); - if (!out_memory || !in_memory || !img_height || !img_width) return; - - dst = (nk_rune*)out_memory; - src = (const nk_byte*)in_memory; - for (n = (int)(img_width * img_height); n > 0; n--) - *dst++ = ((nk_rune)(*src++) << 24) | 0x00FFFFFF; -} - -/* ------------------------------------------------------------- - * - * FONT - * - * --------------------------------------------------------------*/ -NK_INTERN float -nk_font_text_width(nk_handle handle, float height, const char *text, int len) -{ - nk_rune unicode; - int text_len = 0; - float text_width = 0; - int glyph_len = 0; - float scale = 0; - - struct nk_font *font = (struct nk_font*)handle.ptr; - NK_ASSERT(font); - NK_ASSERT(font->glyphs); - if (!font || !text || !len) - return 0; - - scale = height/font->info.height; - glyph_len = text_len = nk_utf_decode(text, &unicode, (int)len); - if (!glyph_len) return 0; - while (text_len <= (int)len && glyph_len) { - const struct nk_font_glyph *g; - if (unicode == NK_UTF_INVALID) break; - - /* query currently drawn glyph information */ - g = nk_font_find_glyph(font, unicode); - text_width += g->xadvance * scale; - - /* offset next glyph */ - glyph_len = nk_utf_decode(text + text_len, &unicode, (int)len - text_len); - text_len += glyph_len; - } - return text_width; -} -#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT -NK_INTERN void -nk_font_query_font_glyph(nk_handle handle, float height, - struct nk_user_font_glyph *glyph, nk_rune codepoint, nk_rune next_codepoint) -{ - float scale; - const struct nk_font_glyph *g; - struct nk_font *font; - - NK_ASSERT(glyph); - NK_UNUSED(next_codepoint); - - font = (struct nk_font*)handle.ptr; - NK_ASSERT(font); - NK_ASSERT(font->glyphs); - if (!font || !glyph) - return; - - scale = height/font->info.height; - g = nk_font_find_glyph(font, codepoint); - glyph->width = (g->x1 - g->x0) * scale; - glyph->height = (g->y1 - g->y0) * scale; - glyph->offset = nk_vec2(g->x0 * scale, g->y0 * scale); - glyph->xadvance = (g->xadvance * scale); - glyph->uv[0] = nk_vec2(g->u0, g->v0); - glyph->uv[1] = nk_vec2(g->u1, g->v1); -} -#endif -NK_API const struct nk_font_glyph* -nk_font_find_glyph(struct nk_font *font, nk_rune unicode) -{ - int i = 0; - int count; - int total_glyphs = 0; - const struct nk_font_glyph *glyph = 0; - const struct nk_font_config *iter = 0; - - NK_ASSERT(font); - NK_ASSERT(font->glyphs); - NK_ASSERT(font->info.ranges); - if (!font || !font->glyphs) return 0; - - glyph = font->fallback; - iter = font->config; - do {count = nk_range_count(iter->range); - for (i = 0; i < count; ++i) { - nk_rune f = iter->range[(i*2)+0]; - nk_rune t = iter->range[(i*2)+1]; - int diff = (int)((t - f) + 1); - if (unicode >= f && unicode <= t) - return &font->glyphs[((nk_rune)total_glyphs + (unicode - f))]; - total_glyphs += diff; - } - } while ((iter = iter->n) != font->config); - return glyph; -} -NK_INTERN void -nk_font_init(struct nk_font *font, float pixel_height, - nk_rune fallback_codepoint, struct nk_font_glyph *glyphs, - const struct nk_baked_font *baked_font, nk_handle atlas) -{ - struct nk_baked_font baked; - NK_ASSERT(font); - NK_ASSERT(glyphs); - NK_ASSERT(baked_font); - if (!font || !glyphs || !baked_font) - return; - - baked = *baked_font; - font->fallback = 0; - font->info = baked; - font->scale = (float)pixel_height / (float)font->info.height; - font->glyphs = &glyphs[baked_font->glyph_offset]; - font->texture = atlas; - font->fallback_codepoint = fallback_codepoint; - font->fallback = nk_font_find_glyph(font, fallback_codepoint); - - font->handle.height = font->info.height * font->scale; - font->handle.width = nk_font_text_width; - font->handle.userdata.ptr = font; -#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT - font->handle.query = nk_font_query_font_glyph; - font->handle.texture = font->texture; -#endif -} - -/* --------------------------------------------------------------------------- - * - * DEFAULT FONT - * - * ProggyClean.ttf - * Copyright (c) 2004, 2005 Tristan Grimmer - * MIT license (see License.txt in http://www.upperbounds.net/download/ProggyClean.ttf.zip) - * Download and more information at http://upperbounds.net - *-----------------------------------------------------------------------------*/ -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Woverlength-strings" -#elif defined(__GNUC__) || defined(__GNUG__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Woverlength-strings" -#endif - -#ifdef NK_INCLUDE_DEFAULT_FONT - -NK_GLOBAL const char nk_proggy_clean_ttf_compressed_data_base85[11980+1] = - "7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/" - "2*>]b(MC;$jPfY.;h^`IWM9Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1=Ke$$'5F%)]0^#0X@U.a$FBjVQTSDgEKnIS7EM9>ZY9w0#L;>>#Mx&4Mvt//L[MkA#W@lK.N'[0#7RL_&#w+F%HtG9M#XL`N&.,GM4Pg;--VsM.M0rJfLH2eTM`*oJMHRC`N" - "kfimM2J,W-jXS:)r0wK#@Fge$U>`w'N7G#$#fB#$E^$#:9:hk+eOe--6x)F7*E%?76%^GMHePW-Z5l'&GiF#$956:rS?dA#fiK:)Yr+`�j@'DbG&#^$PG.Ll+DNa&VZ>1i%h1S9u5o@YaaW$e+bROPOpxTO7Stwi1::iB1q)C_=dV26J;2,]7op$]uQr@_V7$q^%lQwtuHY]=DX,n3L#0PHDO4f9>dC@O>HBuKPpP*E,N+b3L#lpR/MrTEH.IAQk.a>D[.e;mc." - "x]Ip.PH^'/aqUO/$1WxLoW0[iLAw=4h(9.`G" - "CRUxHPeR`5Mjol(dUWxZa(>STrPkrJiWx`5U7F#.g*jrohGg`cg:lSTvEY/EV_7H4Q9[Z%cnv;JQYZ5q.l7Zeas:HOIZOB?Ggv:[7MI2k).'2($5FNP&EQ(,)" - "U]W]+fh18.vsai00);D3@4ku5P?DP8aJt+;qUM]=+b'8@;mViBKx0DE[-auGl8:PJ&Dj+M6OC]O^((##]`0i)drT;-7X`=-H3[igUnPG-NZlo.#k@h#=Ork$m>a>$-?Tm$UV(?#P6YY#" - "'/###xe7q.73rI3*pP/$1>s9)W,JrM7SN]'/4C#v$U`0#V.[0>xQsH$fEmPMgY2u7Kh(G%siIfLSoS+MK2eTM$=5,M8p`A.;_R%#u[K#$x4AG8.kK/HSB==-'Ie/QTtG?-.*^N-4B/ZM" - "_3YlQC7(p7q)&](`6_c)$/*JL(L-^(]$wIM`dPtOdGA,U3:w2M-0+WomX2u7lqM2iEumMTcsF?-aT=Z-97UEnXglEn1K-bnEO`gu" - "Ft(c%=;Am_Qs@jLooI&NX;]0#j4#F14;gl8-GQpgwhrq8'=l_f-b49'UOqkLu7-##oDY2L(te+Mch&gLYtJ,MEtJfLh'x'M=$CS-ZZ%P]8bZ>#S?YY#%Q&q'3^Fw&?D)UDNrocM3A76/" - "/oL?#h7gl85[qW/NDOk%16ij;+:1a'iNIdb-ou8.P*w,v5#EI$TWS>Pot-R*H'-SEpA:g)f+O$%%`kA#G=8RMmG1&O`>to8bC]T&$,n.LoO>29sp3dt-52U%VM#q7'DHpg+#Z9%H[Ket`e;)f#Km8&+DC$I46>#Kr]]u-[=99tts1.qb#q72g1WJO81q+eN'03'eM>&1XxY-caEnO" - "j%2n8)),?ILR5^.Ibn<-X-Mq7[a82Lq:F&#ce+S9wsCK*x`569E8ew'He]h:sI[2LM$[guka3ZRd6:t%IG:;$%YiJ:Nq=?eAw;/:nnDq0(CYcMpG)qLN4$##&J-XTt,%OVU4)S1+R-#dg0/Nn?Ku1^0f$B*P:Rowwm-`0PKjYDDM'3]d39VZHEl4,.j']Pk-M.h^&:0FACm$maq-&sgw0t7/6(^xtk%" - "LuH88Fj-ekm>GA#_>568x6(OFRl-IZp`&b,_P'$MhLbxfc$mj`,O;&%W2m`Zh:/)Uetw:aJ%]K9h:TcF]u_-Sj9,VK3M.*'&0D[Ca]J9gp8,kAW]" - "%(?A%R$f<->Zts'^kn=-^@c4%-pY6qI%J%1IGxfLU9CP8cbPlXv);C=b),<2mOvP8up,UVf3839acAWAW-W?#ao/^#%KYo8fRULNd2.>%m]UK:n%r$'sw]J;5pAoO_#2mO3n,'=H5(et" - "Hg*`+RLgv>=4U8guD$I%D:W>-r5V*%j*W:Kvej.Lp$'?;++O'>()jLR-^u68PHm8ZFWe+ej8h:9r6L*0//c&iH&R8pRbA#Kjm%upV1g:" - "a_#Ur7FuA#(tRh#.Y5K+@?3<-8m0$PEn;J:rh6?I6uG<-`wMU'ircp0LaE_OtlMb&1#6T.#FDKu#1Lw%u%+GM+X'e?YLfjM[VO0MbuFp7;>Q&#WIo)0@F%q7c#4XAXN-U&VBpqB>0ie&jhZ[?iLR@@_AvA-iQC(=ksRZRVp7`.=+NpBC%rh&3]R:8XDmE5^V8O(x<-+k?'(^](H.aREZSi,#1:[IXaZFOm<-ui#qUq2$##Ri;u75OK#(RtaW-K-F`S+cF]uN`-KMQ%rP/Xri.LRcB##=YL3BgM/3M" - "D?@f&1'BW-)Ju#bmmWCMkk&#TR`C,5d>g)F;t,4:@_l8G/5h4vUd%&%950:VXD'QdWoY-F$BtUwmfe$YqL'8(PWX(" - "P?^@Po3$##`MSs?DWBZ/S>+4%>fX,VWv/w'KD`LP5IbH;rTV>n3cEK8U#bX]l-/V+^lj3;vlMb&[5YQ8#pekX9JP3XUC72L,,?+Ni&co7ApnO*5NK,((W-i:$,kp'UDAO(G0Sq7MVjJs" - "bIu)'Z,*[>br5fX^:FPAWr-m2KgLQ_nN6'8uTGT5g)uLv:873UpTLgH+#FgpH'_o1780Ph8KmxQJ8#H72L4@768@Tm&Q" - "h4CB/5OvmA&,Q&QbUoi$a_%3M01H)4x7I^&KQVgtFnV+;[Pc>[m4k//,]1?#`VY[Jr*3&&slRfLiVZJ:]?=K3Sw=[$=uRB?3xk48@aege0jT6'N#(q%.O=?2S]u*(m<-" - "V8J'(1)G][68hW$5'q[GC&5j`TE?m'esFGNRM)j,ffZ?-qx8;->g4t*:CIP/[Qap7/9'#(1sao7w-.qNUdkJ)tCF&#B^;xGvn2r9FEPFFFcL@.iFNkTve$m%#QvQS8U@)2Z+3K:AKM5i" - "sZ88+dKQ)W6>J%CL`.d*(B`-n8D9oK-XV1q['-5k'cAZ69e;D_?$ZPP&s^+7])$*$#@QYi9,5P r+$%CE=68>K8r0=dSC%%(@p7" - ".m7jilQ02'0-VWAgTlGW'b)Tq7VT9q^*^$$.:&N@@" - "$&)WHtPm*5_rO0&e%K&#-30j(E4#'Zb.o/(Tpm$>K'f@[PvFl,hfINTNU6u'0pao7%XUp9]5.>%h`8_=VYbxuel.NTSsJfLacFu3B'lQSu/m6-Oqem8T+oE--$0a/k]uj9EwsG>%veR*" - "hv^BFpQj:K'#SJ,sB-'#](j.Lg92rTw-*n%@/;39rrJF,l#qV%OrtBeC6/,;qB3ebNW[?,Hqj2L.1NP&GjUR=1D8QaS3Up&@*9wP?+lo7b?@%'k4`p0Z$22%K3+iCZj?XJN4Nm&+YF]u" - "@-W$U%VEQ/,,>>#)D#%8cY#YZ?=,`Wdxu/ae&#" - "w6)R89tI#6@s'(6Bf7a&?S=^ZI_kS&ai`&=tE72L_D,;^R)7[$so8lKN%5/$(vdfq7+ebA#" - "u1p]ovUKW&Y%q]'>$1@-[xfn$7ZTp7mM,G,Ko7a&Gu%G[RMxJs[0MM%wci.LFDK)(%:_i2B5CsR8&9Z&#=mPEnm0f`<&c)QL5uJ#%u%lJj+D-r;BoFDoS97h5g)E#o:&S4weDF,9^Hoe`h*L+_a*NrLW-1pG_&2UdB8" - "6e%B/:=>)N4xeW.*wft-;$'58-ESqr#U`'6AQ]m&6/`Z>#S?YY#Vc;r7U2&326d=w&H####?TZ`*4?&.MK?LP8Vxg>$[QXc%QJv92.(Db*B)gb*BM9dM*hJMAo*c&#" - "b0v=Pjer]$gG&JXDf->'StvU7505l9$AFvgYRI^&<^b68?j#q9QX4SM'RO#&sL1IM.rJfLUAj221]d##DW=m83u5;'bYx,*Sl0hL(W;;$doB&O/TQ:(Z^xBdLjLV#*8U_72Lh+2Q8Cj0i:6hp&$C/:p(HK>T8Y[gHQ4`4)'$Ab(Nof%V'8hL&#SfD07&6D@M.*J:;$-rv29'M]8qMv-tLp,'886iaC=Hb*YJoKJ,(j%K=H`K.v9HggqBIiZu'QvBT.#=)0ukruV&.)3=(^1`o*Pj4<-#MJ+gLq9-##@HuZPN0]u:h7.T..G:;$/Usj(T7`Q8tT72LnYl<-qx8;-HV7Q-&Xdx%1a,hC=0u+HlsV>nuIQL-5" - "_>@kXQtMacfD.m-VAb8;IReM3$wf0''hra*so568'Ip&vRs849'MRYSp%:t:h5qSgwpEr$B>Q,;s(C#$)`svQuF$##-D,##,g68@2[T;.XSdN9Qe)rpt._K-#5wF)sP'##p#C0c%-Gb%" - "hd+<-j'Ai*x&&HMkT]C'OSl##5RG[JXaHN;d'uA#x._U;.`PU@(Z3dt4r152@:v,'R.Sj'w#0<-;kPI)FfJ&#AYJ&#//)>-k=m=*XnK$>=)72L]0I%>.G690a:$##<,);?;72#?x9+d;" - "^V'9;jY@;)br#q^YQpx:X#Te$Z^'=-=bGhLf:D6&bNwZ9-ZD#n^9HhLMr5G;']d&6'wYmTFmLq9wI>P(9mI[>kC-ekLC/R&CH+s'B;K-M6$EB%is00:" - "+A4[7xks.LrNk0&E)wILYF@2L'0Nb$+pv<(2.768/FrY&h$^3i&@+G%JT'<-,v`3;_)I9M^AE]CN?Cl2AZg+%4iTpT3$U4O]GKx'm9)b@p7YsvK3w^YR-" - "CdQ*:Ir<($u&)#(&?L9Rg3H)4fiEp^iI9O8KnTj,]H?D*r7'M;PwZ9K0E^k&-cpI;.p/6_vwoFMV<->#%Xi.LxVnrU(4&8/P+:hLSKj$#U%]49t'I:rgMi'FL@a:0Y-uA[39',(vbma*" - "hU%<-SRF`Tt:542R_VV$p@[p8DV[A,?1839FWdFTi1O*H&#(AL8[_P%.M>v^-))qOT*F5Cq0`Ye%+$B6i:7@0IXSsDiWP,##P`%/L-" - "S(qw%sf/@%#B6;/U7K]uZbi^Oc^2n%t<)'mEVE''n`WnJra$^TKvX5B>;_aSEK',(hwa0:i4G?.Bci.(X[?b*($,=-n<.Q%`(X=?+@Am*Js0&=3bh8K]mL69=Lb,OcZV/);TTm8VI;?%OtJ<(b4mq7M6:u?KRdFl*:xP?Yb.5)%w_I?7uk5JC+FS(m#i'k.'a0i)9<7b'fs'59hq$*5Uhv##pi^8+hIEBF`nvo`;'l0.^S1<-wUK2/Coh58KKhLj" - "M=SO*rfO`+qC`W-On.=AJ56>>i2@2LH6A:&5q`?9I3@@'04&p2/LVa*T-4<-i3;M9UvZd+N7>b*eIwg:CC)c<>nO&#$(>.Z-I&J(Q0Hd5Q%7Co-b`-cP)hI;*_F]u`Rb[.j8_Q/<&>uu+VsH$sM9TA%?)(vmJ80),P7E>)tjD%2L=-t#fK[%`v=Q8WlA2);Sa" - ">gXm8YB`1d@K#n]76-a$U,mF%Ul:#/'xoFM9QX-$.QN'>" - "[%$Z$uF6pA6Ki2O5:8w*vP1<-1`[G,)-m#>0`P&#eb#.3i)rtB61(o'$?X3B2Qft^ae_5tKL9MUe9b*sLEQ95C&`=G?@Mj=wh*'3E>=-<)Gt*Iw)'QG:`@I" - "wOf7&]1i'S01B+Ev/Nac#9S;=;YQpg_6U`*kVY39xK,[/6Aj7:'1Bm-_1EYfa1+o&o4hp7KN_Q(OlIo@S%;jVdn0'1h19w,WQhLI)3S#f$2(eb,jr*b;3Vw]*7NH%$c4Vs,eD9>XW8?N]o+(*pgC%/72LV-uW%iewS8W6m2rtCpo'RS1R84=@paTKt)>=%&1[)*vp'u+x,VrwN;&]kuO9JDbg=pO$J*.jVe;u'm0dr9l,<*wMK*Oe=g8lV_KEBFkO'oU]^=[-792#ok,)" - "i]lR8qQ2oA8wcRCZ^7w/Njh;?.stX?Q1>S1q4Bn$)K1<-rGdO'$Wr.Lc.CG)$/*JL4tNR/,SVO3,aUw'DJN:)Ss;wGn9A32ijw%FL+Z0Fn.U9;reSq)bmI32U==5ALuG&#Vf1398/pVo" - "1*c-(aY168o<`JsSbk-,1N;$>0:OUas(3:8Z972LSfF8eb=c-;>SPw7.6hn3m`9^Xkn(r.qS[0;T%&Qc=+STRxX'q1BNk3&*eu2;&8q$&x>Q#Q7^Tf+6<(d%ZVmj2bDi%.3L2n+4W'$P" - "iDDG)g,r%+?,$@?uou5tSe2aN_AQU*'IAO" - "URQ##V^Fv-XFbGM7Fl(N<3DhLGF%q.1rC$#:T__&Pi68%0xi_&[qFJ(77j_&JWoF.V735&T,[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&n`kr-#GJcM6X;uM6X;uM(.a..^2TkL%oR(#" - ";u.T%fAr%4tJ8&><1=GHZ_+m9/#H1F^R#SC#*N=BA9(D?v[UiFY>>^8p,KKF.W]L29uLkLlu/+4T" - "w$)F./^n3+rlo+DB;5sIYGNk+i1t-69Jg--0pao7Sm#K)pdHW&;LuDNH@H>#/X-TI(;P>#,Gc>#0Su>#4`1?#8lC?#xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4^Rh%Sflr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4" - "A1OY5EI0;6Ibgr6M$HS7Q<)58C5w,;WoA*#[%T*#`1g*#d=#+#hI5+#lUG+#pbY+#tnl+#x$),#&1;,#*=M,#.I`,#2Ur,#6b.-#;w[H#iQtA#m^0B#qjBB#uvTB##-hB#'9$C#+E6C#" - "/QHC#3^ZC#7jmC#;v)D#?,)4kMYD4lVu`4m`:&5niUA5@(A5BA1]PBB:xlBCC=2CDLXMCEUtiCf&0g2'tN?PGT4CPGT4CPGT4CPGT4CPGT4CPGT4CPGT4CP" - "GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp" - "O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#"; - -#endif /* NK_INCLUDE_DEFAULT_FONT */ - -#define NK_CURSOR_DATA_W 90 -#define NK_CURSOR_DATA_H 27 -NK_GLOBAL const char nk_custom_cursor_data[NK_CURSOR_DATA_W * NK_CURSOR_DATA_H + 1] = -{ - "..- -XXXXXXX- X - X -XXXXXXX - XXXXXXX" - "..- -X.....X- X.X - X.X -X.....X - X.....X" - "--- -XXX.XXX- X...X - X...X -X....X - X....X" - "X - 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 -XXXX.XXXX- XXXX.XXXX -X.X X.X - X.X X.X" - "X..X - X.X - X.X - X.X -XX X.X - X.X XX" - "X...X - X.X - X.X - 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 - X..X X.X X..X - X.X - X.X " - "X......X - X.X - X.X - X...XXXXXX.XXXXXX...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...XXXXXX.XXXXXX...X - X.X..X-X..X.X " - "X.........X -XXX.XXX- 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......XXXXX-XXXXXXX- X.X - XX X.X XX - X.....X-X.....X " - "X...X..X --------- X.X - X.X - XXXXXXX-XXXXXXX " - "X..X X..X - -XXXX.XXXX- XXXX.XXXX ------------------------------------" - "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 - X..X X..X - " - " XX - X.X - X.X - X...XXXXXXXXXXXXX...X - " - "------------ - X - X -X.....................X- " - " ----------------------------------- X...XXXXXXXXXXXXX...X - " - " - X..X X..X - " - " - X.X X.X - " - " - XX XX - " -}; - -#ifdef __clang__ -#pragma clang diagnostic pop -#elif defined(__GNUC__) || defined(__GNUG__) -#pragma GCC diagnostic pop -#endif - -NK_GLOBAL unsigned char *nk__barrier; -NK_GLOBAL unsigned char *nk__barrier2; -NK_GLOBAL unsigned char *nk__barrier3; -NK_GLOBAL unsigned char *nk__barrier4; -NK_GLOBAL unsigned char *nk__dout; - -NK_INTERN unsigned int -nk_decompress_length(unsigned char *input) -{ - return (unsigned int)((input[8] << 24) + (input[9] << 16) + (input[10] << 8) + input[11]); -} -NK_INTERN void -nk__match(unsigned char *data, unsigned int length) -{ - /* INVERSE of memmove... write each byte before copying the next...*/ - NK_ASSERT (nk__dout + length <= nk__barrier); - if (nk__dout + length > nk__barrier) { nk__dout += length; return; } - if (data < nk__barrier4) { nk__dout = nk__barrier+1; return; } - while (length--) *nk__dout++ = *data++; -} -NK_INTERN void -nk__lit(unsigned char *data, unsigned int length) -{ - NK_ASSERT (nk__dout + length <= nk__barrier); - if (nk__dout + length > nk__barrier) { nk__dout += length; return; } - if (data < nk__barrier2) { nk__dout = nk__barrier+1; return; } - NK_MEMCPY(nk__dout, data, length); - nk__dout += length; -} -NK_INTERN unsigned char* -nk_decompress_token(unsigned char *i) -{ - #define nk__in2(x) ((i[x] << 8) + i[(x)+1]) - #define nk__in3(x) ((i[x] << 16) + nk__in2((x)+1)) - #define nk__in4(x) ((i[x] << 24) + nk__in3((x)+1)) - - if (*i >= 0x20) { /* use fewer if's for cases that expand small */ - if (*i >= 0x80) nk__match(nk__dout-i[1]-1, (unsigned int)i[0] - 0x80 + 1), i += 2; - else if (*i >= 0x40) nk__match(nk__dout-(nk__in2(0) - 0x4000 + 1), (unsigned int)i[2]+1), i += 3; - else /* *i >= 0x20 */ nk__lit(i+1, (unsigned int)i[0] - 0x20 + 1), i += 1 + (i[0] - 0x20 + 1); - } else { /* more ifs for cases that expand large, since overhead is amortized */ - if (*i >= 0x18) nk__match(nk__dout-(unsigned int)(nk__in3(0) - 0x180000 + 1), (unsigned int)i[3]+1), i += 4; - else if (*i >= 0x10) nk__match(nk__dout-(unsigned int)(nk__in3(0) - 0x100000 + 1), (unsigned int)nk__in2(3)+1), i += 5; - else if (*i >= 0x08) nk__lit(i+2, (unsigned int)nk__in2(0) - 0x0800 + 1), i += 2 + (nk__in2(0) - 0x0800 + 1); - else if (*i == 0x07) nk__lit(i+3, (unsigned int)nk__in2(1) + 1), i += 3 + (nk__in2(1) + 1); - else if (*i == 0x06) nk__match(nk__dout-(unsigned int)(nk__in3(1)+1), i[4]+1u), i += 5; - else if (*i == 0x04) nk__match(nk__dout-(unsigned int)(nk__in3(1)+1), (unsigned int)nk__in2(4)+1u), i += 6; - } - return i; -} -NK_INTERN unsigned int -nk_adler32(unsigned int adler32, unsigned char *buffer, unsigned int buflen) -{ - const unsigned long ADLER_MOD = 65521; - unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16; - unsigned long blocklen, i; - - blocklen = buflen % 5552; - while (buflen) { - for (i=0; i + 7 < blocklen; i += 8) { - s1 += buffer[0]; s2 += s1; - s1 += buffer[1]; s2 += s1; - s1 += buffer[2]; s2 += s1; - s1 += buffer[3]; s2 += s1; - s1 += buffer[4]; s2 += s1; - s1 += buffer[5]; s2 += s1; - s1 += buffer[6]; s2 += s1; - s1 += buffer[7]; s2 += s1; - buffer += 8; - } - for (; i < blocklen; ++i) { - s1 += *buffer++; s2 += s1; - } - - s1 %= ADLER_MOD; s2 %= ADLER_MOD; - buflen -= (unsigned int)blocklen; - blocklen = 5552; - } - return (unsigned int)(s2 << 16) + (unsigned int)s1; -} -NK_INTERN unsigned int -nk_decompress(unsigned char *output, unsigned char *i, unsigned int length) -{ - unsigned int olen; - if (nk__in4(0) != 0x57bC0000) return 0; - if (nk__in4(4) != 0) return 0; /* error! stream is > 4GB */ - olen = nk_decompress_length(i); - nk__barrier2 = i; - nk__barrier3 = i+length; - nk__barrier = output + olen; - nk__barrier4 = output; - i += 16; - - nk__dout = output; - for (;;) { - unsigned char *old_i = i; - i = nk_decompress_token(i); - if (i == old_i) { - if (*i == 0x05 && i[1] == 0xfa) { - NK_ASSERT(nk__dout == output + olen); - if (nk__dout != output + olen) return 0; - if (nk_adler32(1, output, olen) != (unsigned int) nk__in4(2)) - return 0; - return olen; - } else { - NK_ASSERT(0); /* NOTREACHED */ - return 0; - } - } - NK_ASSERT(nk__dout <= output + olen); - if (nk__dout > output + olen) - return 0; - } -} -NK_INTERN unsigned int -nk_decode_85_byte(char c) -{ - return (unsigned int)((c >= '\\') ? c-36 : c-35); -} -NK_INTERN void -nk_decode_85(unsigned char* dst, const unsigned char* src) -{ - while (*src) - { - unsigned int tmp = - nk_decode_85_byte((char)src[0]) + - 85 * (nk_decode_85_byte((char)src[1]) + - 85 * (nk_decode_85_byte((char)src[2]) + - 85 * (nk_decode_85_byte((char)src[3]) + - 85 * nk_decode_85_byte((char)src[4])))); - - /* we can't assume little-endianess. */ - dst[0] = (unsigned char)((tmp >> 0) & 0xFF); - dst[1] = (unsigned char)((tmp >> 8) & 0xFF); - dst[2] = (unsigned char)((tmp >> 16) & 0xFF); - dst[3] = (unsigned char)((tmp >> 24) & 0xFF); - - src += 5; - dst += 4; - } -} - -/* ------------------------------------------------------------- - * - * FONT ATLAS - * - * --------------------------------------------------------------*/ -NK_API struct nk_font_config -nk_font_config(float pixel_height) -{ - struct nk_font_config cfg; - nk_zero_struct(cfg); - cfg.ttf_blob = 0; - cfg.ttf_size = 0; - cfg.ttf_data_owned_by_atlas = 0; - cfg.size = pixel_height; - cfg.oversample_h = 3; - cfg.oversample_v = 1; - cfg.pixel_snap = 0; - cfg.coord_type = NK_COORD_UV; - cfg.spacing = nk_vec2(0,0); - cfg.range = nk_font_default_glyph_ranges(); - cfg.merge_mode = 0; - cfg.fallback_glyph = '?'; - cfg.font = 0; - cfg.n = 0; - return cfg; -} -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -NK_API void -nk_font_atlas_init_default(struct nk_font_atlas *atlas) -{ - NK_ASSERT(atlas); - if (!atlas) return; - nk_zero_struct(*atlas); - atlas->temporary.userdata.ptr = 0; - atlas->temporary.alloc = nk_malloc; - atlas->temporary.free = nk_mfree; - atlas->permanent.userdata.ptr = 0; - atlas->permanent.alloc = nk_malloc; - atlas->permanent.free = nk_mfree; -} -#endif -NK_API void -nk_font_atlas_init(struct nk_font_atlas *atlas, struct nk_allocator *alloc) -{ - NK_ASSERT(atlas); - NK_ASSERT(alloc); - if (!atlas || !alloc) return; - nk_zero_struct(*atlas); - atlas->permanent = *alloc; - atlas->temporary = *alloc; -} -NK_API void -nk_font_atlas_init_custom(struct nk_font_atlas *atlas, - struct nk_allocator *permanent, struct nk_allocator *temporary) -{ - NK_ASSERT(atlas); - NK_ASSERT(permanent); - NK_ASSERT(temporary); - if (!atlas || !permanent || !temporary) return; - nk_zero_struct(*atlas); - atlas->permanent = *permanent; - atlas->temporary = *temporary; -} -NK_API void -nk_font_atlas_begin(struct nk_font_atlas *atlas) -{ - NK_ASSERT(atlas); - NK_ASSERT(atlas->temporary.alloc && atlas->temporary.free); - NK_ASSERT(atlas->permanent.alloc && atlas->permanent.free); - if (!atlas || !atlas->permanent.alloc || !atlas->permanent.free || - !atlas->temporary.alloc || !atlas->temporary.free) return; - if (atlas->glyphs) { - atlas->permanent.free(atlas->permanent.userdata, atlas->glyphs); - atlas->glyphs = 0; - } - if (atlas->pixel) { - atlas->permanent.free(atlas->permanent.userdata, atlas->pixel); - atlas->pixel = 0; - } -} -NK_API struct nk_font* -nk_font_atlas_add(struct nk_font_atlas *atlas, const struct nk_font_config *config) -{ - struct nk_font *font = 0; - struct nk_font_config *cfg; - - NK_ASSERT(atlas); - NK_ASSERT(atlas->permanent.alloc); - NK_ASSERT(atlas->permanent.free); - NK_ASSERT(atlas->temporary.alloc); - NK_ASSERT(atlas->temporary.free); - - NK_ASSERT(config); - NK_ASSERT(config->ttf_blob); - NK_ASSERT(config->ttf_size); - NK_ASSERT(config->size > 0.0f); - - if (!atlas || !config || !config->ttf_blob || !config->ttf_size || config->size <= 0.0f|| - !atlas->permanent.alloc || !atlas->permanent.free || - !atlas->temporary.alloc || !atlas->temporary.free) - return 0; - - /* allocate font config */ - cfg = (struct nk_font_config*) - atlas->permanent.alloc(atlas->permanent.userdata,0, sizeof(struct nk_font_config)); - NK_MEMCPY(cfg, config, sizeof(*config)); - cfg->n = cfg; - cfg->p = cfg; - - if (!config->merge_mode) { - /* insert font config into list */ - if (!atlas->config) { - atlas->config = cfg; - cfg->next = 0; - } else { - struct nk_font_config *i = atlas->config; - while (i->next) i = i->next; - i->next = cfg; - cfg->next = 0; - } - /* allocate new font */ - font = (struct nk_font*) - atlas->permanent.alloc(atlas->permanent.userdata,0, sizeof(struct nk_font)); - NK_ASSERT(font); - nk_zero(font, sizeof(*font)); - if (!font) return 0; - font->config = cfg; - - /* insert font into list */ - if (!atlas->fonts) { - atlas->fonts = font; - font->next = 0; - } else { - struct nk_font *i = atlas->fonts; - while (i->next) i = i->next; - i->next = font; - font->next = 0; - } - cfg->font = &font->info; - } else { - /* extend previously added font */ - struct nk_font *f = 0; - struct nk_font_config *c = 0; - NK_ASSERT(atlas->font_num); - f = atlas->fonts; - c = f->config; - cfg->font = &f->info; - - cfg->n = c; - cfg->p = c->p; - c->p->n = cfg; - c->p = cfg; - } - /* create own copy of .TTF font blob */ - if (!config->ttf_data_owned_by_atlas) { - cfg->ttf_blob = atlas->permanent.alloc(atlas->permanent.userdata,0, cfg->ttf_size); - NK_ASSERT(cfg->ttf_blob); - if (!cfg->ttf_blob) { - atlas->font_num++; - return 0; - } - NK_MEMCPY(cfg->ttf_blob, config->ttf_blob, cfg->ttf_size); - cfg->ttf_data_owned_by_atlas = 1; - } - atlas->font_num++; - return font; -} -NK_API struct nk_font* -nk_font_atlas_add_from_memory(struct nk_font_atlas *atlas, void *memory, - nk_size size, float height, const struct nk_font_config *config) -{ - struct nk_font_config cfg; - NK_ASSERT(memory); - NK_ASSERT(size); - - NK_ASSERT(atlas); - NK_ASSERT(atlas->temporary.alloc); - NK_ASSERT(atlas->temporary.free); - NK_ASSERT(atlas->permanent.alloc); - NK_ASSERT(atlas->permanent.free); - if (!atlas || !atlas->temporary.alloc || !atlas->temporary.free || !memory || !size || - !atlas->permanent.alloc || !atlas->permanent.free) - return 0; - - cfg = (config) ? *config: nk_font_config(height); - cfg.ttf_blob = memory; - cfg.ttf_size = size; - cfg.size = height; - cfg.ttf_data_owned_by_atlas = 0; - return nk_font_atlas_add(atlas, &cfg); -} -#ifdef NK_INCLUDE_STANDARD_IO -NK_API struct nk_font* -nk_font_atlas_add_from_file(struct nk_font_atlas *atlas, const char *file_path, - float height, const struct nk_font_config *config) -{ - nk_size size; - char *memory; - struct nk_font_config cfg; - - NK_ASSERT(atlas); - NK_ASSERT(atlas->temporary.alloc); - NK_ASSERT(atlas->temporary.free); - NK_ASSERT(atlas->permanent.alloc); - NK_ASSERT(atlas->permanent.free); - - if (!atlas || !file_path) return 0; - memory = nk_file_load(file_path, &size, &atlas->permanent); - if (!memory) return 0; - - cfg = (config) ? *config: nk_font_config(height); - cfg.ttf_blob = memory; - cfg.ttf_size = size; - cfg.size = height; - cfg.ttf_data_owned_by_atlas = 1; - return nk_font_atlas_add(atlas, &cfg); -} -#endif -NK_API struct nk_font* -nk_font_atlas_add_compressed(struct nk_font_atlas *atlas, - void *compressed_data, nk_size compressed_size, float height, - const struct nk_font_config *config) -{ - unsigned int decompressed_size; - void *decompressed_data; - struct nk_font_config cfg; - - NK_ASSERT(atlas); - NK_ASSERT(atlas->temporary.alloc); - NK_ASSERT(atlas->temporary.free); - NK_ASSERT(atlas->permanent.alloc); - NK_ASSERT(atlas->permanent.free); - - NK_ASSERT(compressed_data); - NK_ASSERT(compressed_size); - if (!atlas || !compressed_data || !atlas->temporary.alloc || !atlas->temporary.free || - !atlas->permanent.alloc || !atlas->permanent.free) - return 0; - - decompressed_size = nk_decompress_length((unsigned char*)compressed_data); - decompressed_data = atlas->permanent.alloc(atlas->permanent.userdata,0,decompressed_size); - NK_ASSERT(decompressed_data); - if (!decompressed_data) return 0; - nk_decompress((unsigned char*)decompressed_data, (unsigned char*)compressed_data, - (unsigned int)compressed_size); - - cfg = (config) ? *config: nk_font_config(height); - cfg.ttf_blob = decompressed_data; - cfg.ttf_size = decompressed_size; - cfg.size = height; - cfg.ttf_data_owned_by_atlas = 1; - return nk_font_atlas_add(atlas, &cfg); -} -NK_API struct nk_font* -nk_font_atlas_add_compressed_base85(struct nk_font_atlas *atlas, - const char *data_base85, float height, const struct nk_font_config *config) -{ - int compressed_size; - void *compressed_data; - struct nk_font *font; - - NK_ASSERT(atlas); - NK_ASSERT(atlas->temporary.alloc); - NK_ASSERT(atlas->temporary.free); - NK_ASSERT(atlas->permanent.alloc); - NK_ASSERT(atlas->permanent.free); - - NK_ASSERT(data_base85); - if (!atlas || !data_base85 || !atlas->temporary.alloc || !atlas->temporary.free || - !atlas->permanent.alloc || !atlas->permanent.free) - return 0; - - compressed_size = (((int)nk_strlen(data_base85) + 4) / 5) * 4; - compressed_data = atlas->temporary.alloc(atlas->temporary.userdata,0, (nk_size)compressed_size); - NK_ASSERT(compressed_data); - if (!compressed_data) return 0; - nk_decode_85((unsigned char*)compressed_data, (const unsigned char*)data_base85); - font = nk_font_atlas_add_compressed(atlas, compressed_data, - (nk_size)compressed_size, height, config); - atlas->temporary.free(atlas->temporary.userdata, compressed_data); - return font; -} - -#ifdef NK_INCLUDE_DEFAULT_FONT -NK_API struct nk_font* -nk_font_atlas_add_default(struct nk_font_atlas *atlas, - float pixel_height, const struct nk_font_config *config) -{ - NK_ASSERT(atlas); - NK_ASSERT(atlas->temporary.alloc); - NK_ASSERT(atlas->temporary.free); - NK_ASSERT(atlas->permanent.alloc); - NK_ASSERT(atlas->permanent.free); - return nk_font_atlas_add_compressed_base85(atlas, - nk_proggy_clean_ttf_compressed_data_base85, pixel_height, config); -} -#endif -NK_API const void* -nk_font_atlas_bake(struct nk_font_atlas *atlas, int *width, int *height, - enum nk_font_atlas_format fmt) -{ - int i = 0; - void *tmp = 0; - nk_size tmp_size, img_size; - struct nk_font *font_iter; - struct nk_font_baker *baker; - - NK_ASSERT(atlas); - NK_ASSERT(atlas->temporary.alloc); - NK_ASSERT(atlas->temporary.free); - NK_ASSERT(atlas->permanent.alloc); - NK_ASSERT(atlas->permanent.free); - - NK_ASSERT(width); - NK_ASSERT(height); - if (!atlas || !width || !height || - !atlas->temporary.alloc || !atlas->temporary.free || - !atlas->permanent.alloc || !atlas->permanent.free) - return 0; - -#ifdef NK_INCLUDE_DEFAULT_FONT - /* no font added so just use default font */ - if (!atlas->font_num) - atlas->default_font = nk_font_atlas_add_default(atlas, 13.0f, 0); -#endif - NK_ASSERT(atlas->font_num); - if (!atlas->font_num) return 0; - - /* allocate temporary baker memory required for the baking process */ - nk_font_baker_memory(&tmp_size, &atlas->glyph_count, atlas->config, atlas->font_num); - tmp = atlas->temporary.alloc(atlas->temporary.userdata,0, tmp_size); - NK_ASSERT(tmp); - if (!tmp) goto failed; - NK_MEMSET(tmp,0,tmp_size); - - /* allocate glyph memory for all fonts */ - baker = nk_font_baker(tmp, atlas->glyph_count, atlas->font_num, &atlas->temporary); - atlas->glyphs = (struct nk_font_glyph*)atlas->permanent.alloc( - atlas->permanent.userdata,0, sizeof(struct nk_font_glyph)*(nk_size)atlas->glyph_count); - NK_ASSERT(atlas->glyphs); - if (!atlas->glyphs) - goto failed; - - /* pack all glyphs into a tight fit space */ - atlas->custom.w = (NK_CURSOR_DATA_W*2)+1; - atlas->custom.h = NK_CURSOR_DATA_H + 1; - if (!nk_font_bake_pack(baker, &img_size, width, height, &atlas->custom, - atlas->config, atlas->font_num, &atlas->temporary)) - goto failed; - - /* allocate memory for the baked image font atlas */ - atlas->pixel = atlas->temporary.alloc(atlas->temporary.userdata,0, img_size); - NK_ASSERT(atlas->pixel); - if (!atlas->pixel) - goto failed; - - /* bake glyphs and custom white pixel into image */ - nk_font_bake(baker, atlas->pixel, *width, *height, - atlas->glyphs, atlas->glyph_count, atlas->config, atlas->font_num); - nk_font_bake_custom_data(atlas->pixel, *width, *height, atlas->custom, - nk_custom_cursor_data, NK_CURSOR_DATA_W, NK_CURSOR_DATA_H, '.', 'X'); - - if (fmt == NK_FONT_ATLAS_RGBA32) { - /* convert alpha8 image into rgba32 image */ - void *img_rgba = atlas->temporary.alloc(atlas->temporary.userdata,0, - (nk_size)(*width * *height * 4)); - NK_ASSERT(img_rgba); - if (!img_rgba) goto failed; - nk_font_bake_convert(img_rgba, *width, *height, atlas->pixel); - atlas->temporary.free(atlas->temporary.userdata, atlas->pixel); - atlas->pixel = img_rgba; - } - atlas->tex_width = *width; - atlas->tex_height = *height; - - /* initialize each font */ - for (font_iter = atlas->fonts; font_iter; font_iter = font_iter->next) { - struct nk_font *font = font_iter; - struct nk_font_config *config = font->config; - nk_font_init(font, config->size, config->fallback_glyph, atlas->glyphs, - config->font, nk_handle_ptr(0)); - } - - /* initialize each cursor */ - {NK_STORAGE const struct nk_vec2 nk_cursor_data[NK_CURSOR_COUNT][3] = { - /* Pos Size Offset */ - {{ 0, 3}, {12,19}, { 0, 0}}, - {{13, 0}, { 7,16}, { 4, 8}}, - {{31, 0}, {23,23}, {11,11}}, - {{21, 0}, { 9, 23}, { 5,11}}, - {{55,18}, {23, 9}, {11, 5}}, - {{73, 0}, {17,17}, { 9, 9}}, - {{55, 0}, {17,17}, { 9, 9}} - }; - for (i = 0; i < NK_CURSOR_COUNT; ++i) { - struct nk_cursor *cursor = &atlas->cursors[i]; - cursor->img.w = (unsigned short)*width; - cursor->img.h = (unsigned short)*height; - cursor->img.region[0] = (unsigned short)(atlas->custom.x + nk_cursor_data[i][0].x); - cursor->img.region[1] = (unsigned short)(atlas->custom.y + nk_cursor_data[i][0].y); - cursor->img.region[2] = (unsigned short)nk_cursor_data[i][1].x; - cursor->img.region[3] = (unsigned short)nk_cursor_data[i][1].y; - cursor->size = nk_cursor_data[i][1]; - cursor->offset = nk_cursor_data[i][2]; - }} - /* free temporary memory */ - atlas->temporary.free(atlas->temporary.userdata, tmp); - return atlas->pixel; - -failed: - /* error so cleanup all memory */ - if (tmp) atlas->temporary.free(atlas->temporary.userdata, tmp); - if (atlas->glyphs) { - atlas->permanent.free(atlas->permanent.userdata, atlas->glyphs); - atlas->glyphs = 0; - } - if (atlas->pixel) { - atlas->temporary.free(atlas->temporary.userdata, atlas->pixel); - atlas->pixel = 0; - } - return 0; -} -NK_API void -nk_font_atlas_end(struct nk_font_atlas *atlas, nk_handle texture, - struct nk_draw_null_texture *tex_null) -{ - int i = 0; - struct nk_font *font_iter; - NK_ASSERT(atlas); - if (!atlas) { - if (!tex_null) return; - tex_null->texture = texture; - tex_null->uv = nk_vec2(0.5f,0.5f); - } - if (tex_null) { - tex_null->texture = texture; - tex_null->uv.x = (atlas->custom.x + 0.5f)/(float)atlas->tex_width; - tex_null->uv.y = (atlas->custom.y + 0.5f)/(float)atlas->tex_height; - } - for (font_iter = atlas->fonts; font_iter; font_iter = font_iter->next) { - font_iter->texture = texture; -#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT - font_iter->handle.texture = texture; -#endif - } - for (i = 0; i < NK_CURSOR_COUNT; ++i) - atlas->cursors[i].img.handle = texture; - - atlas->temporary.free(atlas->temporary.userdata, atlas->pixel); - atlas->pixel = 0; - atlas->tex_width = 0; - atlas->tex_height = 0; - atlas->custom.x = 0; - atlas->custom.y = 0; - atlas->custom.w = 0; - atlas->custom.h = 0; -} -NK_API void -nk_font_atlas_cleanup(struct nk_font_atlas *atlas) -{ - NK_ASSERT(atlas); - NK_ASSERT(atlas->temporary.alloc); - NK_ASSERT(atlas->temporary.free); - NK_ASSERT(atlas->permanent.alloc); - NK_ASSERT(atlas->permanent.free); - if (!atlas || !atlas->permanent.alloc || !atlas->permanent.free) return; - if (atlas->config) { - struct nk_font_config *iter; - for (iter = atlas->config; iter; iter = iter->next) { - struct nk_font_config *i; - for (i = iter->n; i != iter; i = i->n) { - atlas->permanent.free(atlas->permanent.userdata, i->ttf_blob); - i->ttf_blob = 0; - } - atlas->permanent.free(atlas->permanent.userdata, iter->ttf_blob); - iter->ttf_blob = 0; - } - } -} -NK_API void -nk_font_atlas_clear(struct nk_font_atlas *atlas) -{ - NK_ASSERT(atlas); - NK_ASSERT(atlas->temporary.alloc); - NK_ASSERT(atlas->temporary.free); - NK_ASSERT(atlas->permanent.alloc); - NK_ASSERT(atlas->permanent.free); - if (!atlas || !atlas->permanent.alloc || !atlas->permanent.free) return; - - if (atlas->config) { - struct nk_font_config *iter, *next; - for (iter = atlas->config; iter; iter = next) { - struct nk_font_config *i, *n; - for (i = iter->n; i != iter; i = n) { - n = i->n; - if (i->ttf_blob) - atlas->permanent.free(atlas->permanent.userdata, i->ttf_blob); - atlas->permanent.free(atlas->permanent.userdata, i); - } - next = iter->next; - if (i->ttf_blob) - atlas->permanent.free(atlas->permanent.userdata, iter->ttf_blob); - atlas->permanent.free(atlas->permanent.userdata, iter); - } - atlas->config = 0; - } - if (atlas->fonts) { - struct nk_font *iter, *next; - for (iter = atlas->fonts; iter; iter = next) { - next = iter->next; - atlas->permanent.free(atlas->permanent.userdata, iter); - } - atlas->fonts = 0; - } - if (atlas->glyphs) - atlas->permanent.free(atlas->permanent.userdata, atlas->glyphs); - nk_zero_struct(*atlas); -} -#endif - - - - - -/* =============================================================== - * - * INPUT - * - * ===============================================================*/ -NK_API void -nk_input_begin(struct nk_context *ctx) -{ - int i; - struct nk_input *in; - NK_ASSERT(ctx); - if (!ctx) return; - in = &ctx->input; - for (i = 0; i < NK_BUTTON_MAX; ++i) - in->mouse.buttons[i].clicked = 0; - - in->keyboard.text_len = 0; - in->mouse.scroll_delta = nk_vec2(0,0); - in->mouse.prev.x = in->mouse.pos.x; - in->mouse.prev.y = in->mouse.pos.y; - in->mouse.delta.x = 0; - in->mouse.delta.y = 0; - for (i = 0; i < NK_KEY_MAX; i++) - in->keyboard.keys[i].clicked = 0; -} -NK_API void -nk_input_end(struct nk_context *ctx) -{ - struct nk_input *in; - NK_ASSERT(ctx); - if (!ctx) return; - in = &ctx->input; - if (in->mouse.grab) - in->mouse.grab = 0; - if (in->mouse.ungrab) { - in->mouse.grabbed = 0; - in->mouse.ungrab = 0; - in->mouse.grab = 0; - } -} -NK_API void -nk_input_motion(struct nk_context *ctx, int x, int y) -{ - struct nk_input *in; - NK_ASSERT(ctx); - if (!ctx) return; - in = &ctx->input; - in->mouse.pos.x = (float)x; - in->mouse.pos.y = (float)y; - in->mouse.delta.x = in->mouse.pos.x - in->mouse.prev.x; - in->mouse.delta.y = in->mouse.pos.y - in->mouse.prev.y; -} -NK_API void -nk_input_key(struct nk_context *ctx, enum nk_keys key, nk_bool down) -{ - struct nk_input *in; - NK_ASSERT(ctx); - if (!ctx) return; - in = &ctx->input; -#ifdef NK_KEYSTATE_BASED_INPUT - if (in->keyboard.keys[key].down != down) - in->keyboard.keys[key].clicked++; -#else - in->keyboard.keys[key].clicked++; -#endif - in->keyboard.keys[key].down = down; -} -NK_API void -nk_input_button(struct nk_context *ctx, enum nk_buttons id, int x, int y, nk_bool down) -{ - struct nk_mouse_button *btn; - struct nk_input *in; - NK_ASSERT(ctx); - if (!ctx) return; - in = &ctx->input; - if (in->mouse.buttons[id].down == down) return; - - btn = &in->mouse.buttons[id]; - btn->clicked_pos.x = (float)x; - btn->clicked_pos.y = (float)y; - btn->down = down; - btn->clicked++; - - /* Fix Click-Drag for touch events. */ - in->mouse.delta.x = 0; - in->mouse.delta.y = 0; -#ifdef NK_BUTTON_TRIGGER_ON_RELEASE - if (down == 1 && id == NK_BUTTON_LEFT) - { - in->mouse.down_pos.x = btn->clicked_pos.x; - in->mouse.down_pos.y = btn->clicked_pos.y; - } -#endif -} -NK_API void -nk_input_scroll(struct nk_context *ctx, struct nk_vec2 val) -{ - NK_ASSERT(ctx); - if (!ctx) return; - ctx->input.mouse.scroll_delta.x += val.x; - ctx->input.mouse.scroll_delta.y += val.y; -} -NK_API void -nk_input_glyph(struct nk_context *ctx, const nk_glyph glyph) -{ - int len = 0; - nk_rune unicode; - struct nk_input *in; - - NK_ASSERT(ctx); - if (!ctx) return; - in = &ctx->input; - - len = nk_utf_decode(glyph, &unicode, NK_UTF_SIZE); - if (len && ((in->keyboard.text_len + len) < NK_INPUT_MAX)) { - nk_utf_encode(unicode, &in->keyboard.text[in->keyboard.text_len], - NK_INPUT_MAX - in->keyboard.text_len); - in->keyboard.text_len += len; - } -} -NK_API void -nk_input_char(struct nk_context *ctx, char c) -{ - nk_glyph glyph; - NK_ASSERT(ctx); - if (!ctx) return; - glyph[0] = c; - nk_input_glyph(ctx, glyph); -} -NK_API void -nk_input_unicode(struct nk_context *ctx, nk_rune unicode) -{ - nk_glyph rune; - NK_ASSERT(ctx); - if (!ctx) return; - nk_utf_encode(unicode, rune, NK_UTF_SIZE); - nk_input_glyph(ctx, rune); -} -NK_API nk_bool -nk_input_has_mouse_click(const struct nk_input *i, enum nk_buttons id) -{ - const struct nk_mouse_button *btn; - if (!i) return nk_false; - btn = &i->mouse.buttons[id]; - return (btn->clicked && btn->down == nk_false) ? nk_true : nk_false; -} -NK_API nk_bool -nk_input_has_mouse_click_in_rect(const struct nk_input *i, enum nk_buttons id, - struct nk_rect b) -{ - const struct nk_mouse_button *btn; - if (!i) return nk_false; - btn = &i->mouse.buttons[id]; - if (!NK_INBOX(btn->clicked_pos.x,btn->clicked_pos.y,b.x,b.y,b.w,b.h)) - return nk_false; - return nk_true; -} -NK_API nk_bool -nk_input_has_mouse_click_in_button_rect(const struct nk_input *i, enum nk_buttons id, - struct nk_rect b) -{ - const struct nk_mouse_button *btn; - if (!i) return nk_false; - btn = &i->mouse.buttons[id]; -#ifdef NK_BUTTON_TRIGGER_ON_RELEASE - if (!NK_INBOX(btn->clicked_pos.x,btn->clicked_pos.y,b.x,b.y,b.w,b.h) - || !NK_INBOX(i->mouse.down_pos.x,i->mouse.down_pos.y,b.x,b.y,b.w,b.h)) -#else - if (!NK_INBOX(btn->clicked_pos.x,btn->clicked_pos.y,b.x,b.y,b.w,b.h)) -#endif - return nk_false; - return nk_true; -} -NK_API nk_bool -nk_input_has_mouse_click_down_in_rect(const struct nk_input *i, enum nk_buttons id, - struct nk_rect b, nk_bool down) -{ - const struct nk_mouse_button *btn; - if (!i) return nk_false; - btn = &i->mouse.buttons[id]; - return nk_input_has_mouse_click_in_rect(i, id, b) && (btn->down == down); -} -NK_API nk_bool -nk_input_is_mouse_click_in_rect(const struct nk_input *i, enum nk_buttons id, - struct nk_rect b) -{ - const struct nk_mouse_button *btn; - if (!i) return nk_false; - btn = &i->mouse.buttons[id]; - return (nk_input_has_mouse_click_down_in_rect(i, id, b, nk_false) && - btn->clicked) ? nk_true : nk_false; -} -NK_API nk_bool -nk_input_is_mouse_click_down_in_rect(const struct nk_input *i, enum nk_buttons id, - struct nk_rect b, nk_bool down) -{ - const struct nk_mouse_button *btn; - if (!i) return nk_false; - btn = &i->mouse.buttons[id]; - return (nk_input_has_mouse_click_down_in_rect(i, id, b, down) && - btn->clicked) ? nk_true : nk_false; -} -NK_API nk_bool -nk_input_any_mouse_click_in_rect(const struct nk_input *in, struct nk_rect b) -{ - int i, down = 0; - for (i = 0; i < NK_BUTTON_MAX; ++i) - down = down || nk_input_is_mouse_click_in_rect(in, (enum nk_buttons)i, b); - return down; -} -NK_API nk_bool -nk_input_is_mouse_hovering_rect(const struct nk_input *i, struct nk_rect rect) -{ - if (!i) return nk_false; - return NK_INBOX(i->mouse.pos.x, i->mouse.pos.y, rect.x, rect.y, rect.w, rect.h); -} -NK_API nk_bool -nk_input_is_mouse_prev_hovering_rect(const struct nk_input *i, struct nk_rect rect) -{ - if (!i) return nk_false; - return NK_INBOX(i->mouse.prev.x, i->mouse.prev.y, rect.x, rect.y, rect.w, rect.h); -} -NK_API nk_bool -nk_input_mouse_clicked(const struct nk_input *i, enum nk_buttons id, struct nk_rect rect) -{ - if (!i) return nk_false; - if (!nk_input_is_mouse_hovering_rect(i, rect)) return nk_false; - return nk_input_is_mouse_click_in_rect(i, id, rect); -} -NK_API nk_bool -nk_input_is_mouse_down(const struct nk_input *i, enum nk_buttons id) -{ - if (!i) return nk_false; - return i->mouse.buttons[id].down; -} -NK_API nk_bool -nk_input_is_mouse_pressed(const struct nk_input *i, enum nk_buttons id) -{ - const struct nk_mouse_button *b; - if (!i) return nk_false; - b = &i->mouse.buttons[id]; - if (b->down && b->clicked) - return nk_true; - return nk_false; -} -NK_API nk_bool -nk_input_is_mouse_released(const struct nk_input *i, enum nk_buttons id) -{ - if (!i) return nk_false; - return (!i->mouse.buttons[id].down && i->mouse.buttons[id].clicked); -} -NK_API nk_bool -nk_input_is_key_pressed(const struct nk_input *i, enum nk_keys key) -{ - const struct nk_key *k; - if (!i) return nk_false; - k = &i->keyboard.keys[key]; - if ((k->down && k->clicked) || (!k->down && k->clicked >= 2)) - return nk_true; - return nk_false; -} -NK_API nk_bool -nk_input_is_key_released(const struct nk_input *i, enum nk_keys key) -{ - const struct nk_key *k; - if (!i) return nk_false; - k = &i->keyboard.keys[key]; - if ((!k->down && k->clicked) || (k->down && k->clicked >= 2)) - return nk_true; - return nk_false; -} -NK_API nk_bool -nk_input_is_key_down(const struct nk_input *i, enum nk_keys key) -{ - const struct nk_key *k; - if (!i) return nk_false; - k = &i->keyboard.keys[key]; - if (k->down) return nk_true; - return nk_false; -} - - - - - -/* =============================================================== - * - * STYLE - * - * ===============================================================*/ -NK_API void nk_style_default(struct nk_context *ctx){nk_style_from_table(ctx, 0);} -#define NK_COLOR_MAP(NK_COLOR)\ - NK_COLOR(NK_COLOR_TEXT, 175,175,175,255) \ - NK_COLOR(NK_COLOR_WINDOW, 45, 45, 45, 255) \ - NK_COLOR(NK_COLOR_HEADER, 40, 40, 40, 255) \ - NK_COLOR(NK_COLOR_BORDER, 65, 65, 65, 255) \ - NK_COLOR(NK_COLOR_BUTTON, 50, 50, 50, 255) \ - NK_COLOR(NK_COLOR_BUTTON_HOVER, 40, 40, 40, 255) \ - NK_COLOR(NK_COLOR_BUTTON_ACTIVE, 35, 35, 35, 255) \ - NK_COLOR(NK_COLOR_TOGGLE, 100,100,100,255) \ - NK_COLOR(NK_COLOR_TOGGLE_HOVER, 120,120,120,255) \ - NK_COLOR(NK_COLOR_TOGGLE_CURSOR, 45, 45, 45, 255) \ - NK_COLOR(NK_COLOR_SELECT, 45, 45, 45, 255) \ - NK_COLOR(NK_COLOR_SELECT_ACTIVE, 35, 35, 35,255) \ - NK_COLOR(NK_COLOR_SLIDER, 38, 38, 38, 255) \ - NK_COLOR(NK_COLOR_SLIDER_CURSOR, 100,100,100,255) \ - NK_COLOR(NK_COLOR_SLIDER_CURSOR_HOVER, 120,120,120,255) \ - NK_COLOR(NK_COLOR_SLIDER_CURSOR_ACTIVE, 150,150,150,255) \ - NK_COLOR(NK_COLOR_PROPERTY, 38, 38, 38, 255) \ - NK_COLOR(NK_COLOR_EDIT, 38, 38, 38, 255) \ - NK_COLOR(NK_COLOR_EDIT_CURSOR, 175,175,175,255) \ - NK_COLOR(NK_COLOR_COMBO, 45, 45, 45, 255) \ - NK_COLOR(NK_COLOR_CHART, 120,120,120,255) \ - NK_COLOR(NK_COLOR_CHART_COLOR, 45, 45, 45, 255) \ - NK_COLOR(NK_COLOR_CHART_COLOR_HIGHLIGHT, 255, 0, 0, 255) \ - NK_COLOR(NK_COLOR_SCROLLBAR, 40, 40, 40, 255) \ - NK_COLOR(NK_COLOR_SCROLLBAR_CURSOR, 100,100,100,255) \ - NK_COLOR(NK_COLOR_SCROLLBAR_CURSOR_HOVER, 120,120,120,255) \ - NK_COLOR(NK_COLOR_SCROLLBAR_CURSOR_ACTIVE, 150,150,150,255) \ - NK_COLOR(NK_COLOR_TAB_HEADER, 40, 40, 40,255) - -NK_GLOBAL const struct nk_color -nk_default_color_style[NK_COLOR_COUNT] = { -#define NK_COLOR(a,b,c,d,e) {b,c,d,e}, - NK_COLOR_MAP(NK_COLOR) -#undef NK_COLOR -}; -NK_GLOBAL const char *nk_color_names[NK_COLOR_COUNT] = { -#define NK_COLOR(a,b,c,d,e) #a, - NK_COLOR_MAP(NK_COLOR) -#undef NK_COLOR -}; - -NK_API const char* -nk_style_get_color_by_name(enum nk_style_colors c) -{ - return nk_color_names[c]; -} -NK_API struct nk_style_item -nk_style_item_color(struct nk_color col) -{ - struct nk_style_item i; - i.type = NK_STYLE_ITEM_COLOR; - i.data.color = col; - return i; -} -NK_API struct nk_style_item -nk_style_item_image(struct nk_image img) -{ - struct nk_style_item i; - i.type = NK_STYLE_ITEM_IMAGE; - i.data.image = img; - return i; -} -NK_API struct nk_style_item -nk_style_item_nine_slice(struct nk_nine_slice slice) -{ - struct nk_style_item i; - i.type = NK_STYLE_ITEM_NINE_SLICE; - i.data.slice = slice; - return i; -} -NK_API struct nk_style_item -nk_style_item_hide(void) -{ - struct nk_style_item i; - i.type = NK_STYLE_ITEM_COLOR; - i.data.color = nk_rgba(0,0,0,0); - return i; -} -NK_API void -nk_style_from_table(struct nk_context *ctx, const struct nk_color *table) -{ - struct nk_style *style; - struct nk_style_text *text; - struct nk_style_button *button; - struct nk_style_toggle *toggle; - struct nk_style_selectable *select; - struct nk_style_slider *slider; - struct nk_style_progress *prog; - struct nk_style_scrollbar *scroll; - struct nk_style_edit *edit; - struct nk_style_property *property; - struct nk_style_combo *combo; - struct nk_style_chart *chart; - struct nk_style_tab *tab; - struct nk_style_window *win; - - NK_ASSERT(ctx); - if (!ctx) return; - style = &ctx->style; - table = (!table) ? nk_default_color_style: table; - - /* default text */ - text = &style->text; - text->color = table[NK_COLOR_TEXT]; - text->padding = nk_vec2(0,0); - - /* default button */ - button = &style->button; - nk_zero_struct(*button); - button->normal = nk_style_item_color(table[NK_COLOR_BUTTON]); - button->hover = nk_style_item_color(table[NK_COLOR_BUTTON_HOVER]); - button->active = nk_style_item_color(table[NK_COLOR_BUTTON_ACTIVE]); - button->border_color = table[NK_COLOR_BORDER]; - button->text_background = table[NK_COLOR_BUTTON]; - button->text_normal = table[NK_COLOR_TEXT]; - button->text_hover = table[NK_COLOR_TEXT]; - button->text_active = table[NK_COLOR_TEXT]; - button->padding = nk_vec2(2.0f,2.0f); - button->image_padding = nk_vec2(0.0f,0.0f); - button->touch_padding = nk_vec2(0.0f, 0.0f); - button->userdata = nk_handle_ptr(0); - button->text_alignment = NK_TEXT_CENTERED; - button->border = 1.0f; - button->rounding = 4.0f; - button->draw_begin = 0; - button->draw_end = 0; - - /* contextual button */ - button = &style->contextual_button; - nk_zero_struct(*button); - button->normal = nk_style_item_color(table[NK_COLOR_WINDOW]); - button->hover = nk_style_item_color(table[NK_COLOR_BUTTON_HOVER]); - button->active = nk_style_item_color(table[NK_COLOR_BUTTON_ACTIVE]); - button->border_color = table[NK_COLOR_WINDOW]; - button->text_background = table[NK_COLOR_WINDOW]; - button->text_normal = table[NK_COLOR_TEXT]; - button->text_hover = table[NK_COLOR_TEXT]; - button->text_active = table[NK_COLOR_TEXT]; - button->padding = nk_vec2(2.0f,2.0f); - button->touch_padding = nk_vec2(0.0f,0.0f); - button->userdata = nk_handle_ptr(0); - button->text_alignment = NK_TEXT_CENTERED; - button->border = 0.0f; - button->rounding = 0.0f; - button->draw_begin = 0; - button->draw_end = 0; - - /* menu button */ - button = &style->menu_button; - nk_zero_struct(*button); - button->normal = nk_style_item_color(table[NK_COLOR_WINDOW]); - button->hover = nk_style_item_color(table[NK_COLOR_WINDOW]); - button->active = nk_style_item_color(table[NK_COLOR_WINDOW]); - button->border_color = table[NK_COLOR_WINDOW]; - button->text_background = table[NK_COLOR_WINDOW]; - button->text_normal = table[NK_COLOR_TEXT]; - button->text_hover = table[NK_COLOR_TEXT]; - button->text_active = table[NK_COLOR_TEXT]; - button->padding = nk_vec2(2.0f,2.0f); - button->touch_padding = nk_vec2(0.0f,0.0f); - button->userdata = nk_handle_ptr(0); - button->text_alignment = NK_TEXT_CENTERED; - button->border = 0.0f; - button->rounding = 1.0f; - button->draw_begin = 0; - button->draw_end = 0; - - /* checkbox toggle */ - toggle = &style->checkbox; - nk_zero_struct(*toggle); - toggle->normal = nk_style_item_color(table[NK_COLOR_TOGGLE]); - toggle->hover = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]); - toggle->active = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]); - toggle->cursor_normal = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]); - toggle->cursor_hover = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]); - toggle->userdata = nk_handle_ptr(0); - toggle->text_background = table[NK_COLOR_WINDOW]; - toggle->text_normal = table[NK_COLOR_TEXT]; - toggle->text_hover = table[NK_COLOR_TEXT]; - toggle->text_active = table[NK_COLOR_TEXT]; - toggle->padding = nk_vec2(2.0f, 2.0f); - toggle->touch_padding = nk_vec2(0,0); - toggle->border_color = nk_rgba(0,0,0,0); - toggle->border = 0.0f; - toggle->spacing = 4; - - /* option toggle */ - toggle = &style->option; - nk_zero_struct(*toggle); - toggle->normal = nk_style_item_color(table[NK_COLOR_TOGGLE]); - toggle->hover = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]); - toggle->active = nk_style_item_color(table[NK_COLOR_TOGGLE_HOVER]); - toggle->cursor_normal = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]); - toggle->cursor_hover = nk_style_item_color(table[NK_COLOR_TOGGLE_CURSOR]); - toggle->userdata = nk_handle_ptr(0); - toggle->text_background = table[NK_COLOR_WINDOW]; - toggle->text_normal = table[NK_COLOR_TEXT]; - toggle->text_hover = table[NK_COLOR_TEXT]; - toggle->text_active = table[NK_COLOR_TEXT]; - toggle->padding = nk_vec2(3.0f, 3.0f); - toggle->touch_padding = nk_vec2(0,0); - toggle->border_color = nk_rgba(0,0,0,0); - toggle->border = 0.0f; - toggle->spacing = 4; - - /* selectable */ - select = &style->selectable; - nk_zero_struct(*select); - select->normal = nk_style_item_color(table[NK_COLOR_SELECT]); - select->hover = nk_style_item_color(table[NK_COLOR_SELECT]); - select->pressed = nk_style_item_color(table[NK_COLOR_SELECT]); - select->normal_active = nk_style_item_color(table[NK_COLOR_SELECT_ACTIVE]); - select->hover_active = nk_style_item_color(table[NK_COLOR_SELECT_ACTIVE]); - select->pressed_active = nk_style_item_color(table[NK_COLOR_SELECT_ACTIVE]); - select->text_normal = table[NK_COLOR_TEXT]; - select->text_hover = table[NK_COLOR_TEXT]; - select->text_pressed = table[NK_COLOR_TEXT]; - select->text_normal_active = table[NK_COLOR_TEXT]; - select->text_hover_active = table[NK_COLOR_TEXT]; - select->text_pressed_active = table[NK_COLOR_TEXT]; - select->padding = nk_vec2(2.0f,2.0f); - select->image_padding = nk_vec2(2.0f,2.0f); - select->touch_padding = nk_vec2(0,0); - select->userdata = nk_handle_ptr(0); - select->rounding = 0.0f; - select->draw_begin = 0; - select->draw_end = 0; - - /* slider */ - slider = &style->slider; - nk_zero_struct(*slider); - slider->normal = nk_style_item_hide(); - slider->hover = nk_style_item_hide(); - slider->active = nk_style_item_hide(); - slider->bar_normal = table[NK_COLOR_SLIDER]; - slider->bar_hover = table[NK_COLOR_SLIDER]; - slider->bar_active = table[NK_COLOR_SLIDER]; - slider->bar_filled = table[NK_COLOR_SLIDER_CURSOR]; - slider->cursor_normal = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR]); - slider->cursor_hover = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_HOVER]); - slider->cursor_active = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_ACTIVE]); - slider->inc_symbol = NK_SYMBOL_TRIANGLE_RIGHT; - slider->dec_symbol = NK_SYMBOL_TRIANGLE_LEFT; - slider->cursor_size = nk_vec2(16,16); - slider->padding = nk_vec2(2,2); - slider->spacing = nk_vec2(2,2); - slider->userdata = nk_handle_ptr(0); - slider->show_buttons = nk_false; - slider->bar_height = 8; - slider->rounding = 0; - slider->draw_begin = 0; - slider->draw_end = 0; - - /* slider buttons */ - button = &style->slider.inc_button; - button->normal = nk_style_item_color(nk_rgb(40,40,40)); - button->hover = nk_style_item_color(nk_rgb(42,42,42)); - button->active = nk_style_item_color(nk_rgb(44,44,44)); - button->border_color = nk_rgb(65,65,65); - button->text_background = nk_rgb(40,40,40); - button->text_normal = nk_rgb(175,175,175); - button->text_hover = nk_rgb(175,175,175); - button->text_active = nk_rgb(175,175,175); - button->padding = nk_vec2(8.0f,8.0f); - button->touch_padding = nk_vec2(0.0f,0.0f); - button->userdata = nk_handle_ptr(0); - button->text_alignment = NK_TEXT_CENTERED; - button->border = 1.0f; - button->rounding = 0.0f; - button->draw_begin = 0; - button->draw_end = 0; - style->slider.dec_button = style->slider.inc_button; - - /* progressbar */ - prog = &style->progress; - nk_zero_struct(*prog); - prog->normal = nk_style_item_color(table[NK_COLOR_SLIDER]); - prog->hover = nk_style_item_color(table[NK_COLOR_SLIDER]); - prog->active = nk_style_item_color(table[NK_COLOR_SLIDER]); - prog->cursor_normal = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR]); - prog->cursor_hover = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_HOVER]); - prog->cursor_active = nk_style_item_color(table[NK_COLOR_SLIDER_CURSOR_ACTIVE]); - prog->border_color = nk_rgba(0,0,0,0); - prog->cursor_border_color = nk_rgba(0,0,0,0); - prog->userdata = nk_handle_ptr(0); - prog->padding = nk_vec2(4,4); - prog->rounding = 0; - prog->border = 0; - prog->cursor_rounding = 0; - prog->cursor_border = 0; - prog->draw_begin = 0; - prog->draw_end = 0; - - /* scrollbars */ - scroll = &style->scrollh; - nk_zero_struct(*scroll); - scroll->normal = nk_style_item_color(table[NK_COLOR_SCROLLBAR]); - scroll->hover = nk_style_item_color(table[NK_COLOR_SCROLLBAR]); - scroll->active = nk_style_item_color(table[NK_COLOR_SCROLLBAR]); - scroll->cursor_normal = nk_style_item_color(table[NK_COLOR_SCROLLBAR_CURSOR]); - scroll->cursor_hover = nk_style_item_color(table[NK_COLOR_SCROLLBAR_CURSOR_HOVER]); - scroll->cursor_active = nk_style_item_color(table[NK_COLOR_SCROLLBAR_CURSOR_ACTIVE]); - scroll->dec_symbol = NK_SYMBOL_CIRCLE_SOLID; - scroll->inc_symbol = NK_SYMBOL_CIRCLE_SOLID; - scroll->userdata = nk_handle_ptr(0); - scroll->border_color = table[NK_COLOR_SCROLLBAR]; - scroll->cursor_border_color = table[NK_COLOR_SCROLLBAR]; - scroll->padding = nk_vec2(0,0); - scroll->show_buttons = nk_false; - scroll->border = 0; - scroll->rounding = 0; - scroll->border_cursor = 0; - scroll->rounding_cursor = 0; - scroll->draw_begin = 0; - scroll->draw_end = 0; - style->scrollv = style->scrollh; - - /* scrollbars buttons */ - button = &style->scrollh.inc_button; - button->normal = nk_style_item_color(nk_rgb(40,40,40)); - button->hover = nk_style_item_color(nk_rgb(42,42,42)); - button->active = nk_style_item_color(nk_rgb(44,44,44)); - button->border_color = nk_rgb(65,65,65); - button->text_background = nk_rgb(40,40,40); - button->text_normal = nk_rgb(175,175,175); - button->text_hover = nk_rgb(175,175,175); - button->text_active = nk_rgb(175,175,175); - button->padding = nk_vec2(4.0f,4.0f); - button->touch_padding = nk_vec2(0.0f,0.0f); - button->userdata = nk_handle_ptr(0); - button->text_alignment = NK_TEXT_CENTERED; - button->border = 1.0f; - button->rounding = 0.0f; - button->draw_begin = 0; - button->draw_end = 0; - style->scrollh.dec_button = style->scrollh.inc_button; - style->scrollv.inc_button = style->scrollh.inc_button; - style->scrollv.dec_button = style->scrollh.inc_button; - - /* edit */ - edit = &style->edit; - nk_zero_struct(*edit); - edit->normal = nk_style_item_color(table[NK_COLOR_EDIT]); - edit->hover = nk_style_item_color(table[NK_COLOR_EDIT]); - edit->active = nk_style_item_color(table[NK_COLOR_EDIT]); - edit->cursor_normal = table[NK_COLOR_TEXT]; - edit->cursor_hover = table[NK_COLOR_TEXT]; - edit->cursor_text_normal= table[NK_COLOR_EDIT]; - edit->cursor_text_hover = table[NK_COLOR_EDIT]; - edit->border_color = table[NK_COLOR_BORDER]; - edit->text_normal = table[NK_COLOR_TEXT]; - edit->text_hover = table[NK_COLOR_TEXT]; - edit->text_active = table[NK_COLOR_TEXT]; - edit->selected_normal = table[NK_COLOR_TEXT]; - edit->selected_hover = table[NK_COLOR_TEXT]; - edit->selected_text_normal = table[NK_COLOR_EDIT]; - edit->selected_text_hover = table[NK_COLOR_EDIT]; - edit->scrollbar_size = nk_vec2(10,10); - edit->scrollbar = style->scrollv; - edit->padding = nk_vec2(4,4); - edit->row_padding = 2; - edit->cursor_size = 4; - edit->border = 1; - edit->rounding = 0; - - /* property */ - property = &style->property; - nk_zero_struct(*property); - property->normal = nk_style_item_color(table[NK_COLOR_PROPERTY]); - property->hover = nk_style_item_color(table[NK_COLOR_PROPERTY]); - property->active = nk_style_item_color(table[NK_COLOR_PROPERTY]); - property->border_color = table[NK_COLOR_BORDER]; - property->label_normal = table[NK_COLOR_TEXT]; - property->label_hover = table[NK_COLOR_TEXT]; - property->label_active = table[NK_COLOR_TEXT]; - property->sym_left = NK_SYMBOL_TRIANGLE_LEFT; - property->sym_right = NK_SYMBOL_TRIANGLE_RIGHT; - property->userdata = nk_handle_ptr(0); - property->padding = nk_vec2(4,4); - property->border = 1; - property->rounding = 10; - property->draw_begin = 0; - property->draw_end = 0; - - /* property buttons */ - button = &style->property.dec_button; - nk_zero_struct(*button); - button->normal = nk_style_item_color(table[NK_COLOR_PROPERTY]); - button->hover = nk_style_item_color(table[NK_COLOR_PROPERTY]); - button->active = nk_style_item_color(table[NK_COLOR_PROPERTY]); - button->border_color = nk_rgba(0,0,0,0); - button->text_background = table[NK_COLOR_PROPERTY]; - button->text_normal = table[NK_COLOR_TEXT]; - button->text_hover = table[NK_COLOR_TEXT]; - button->text_active = table[NK_COLOR_TEXT]; - button->padding = nk_vec2(0.0f,0.0f); - button->touch_padding = nk_vec2(0.0f,0.0f); - button->userdata = nk_handle_ptr(0); - button->text_alignment = NK_TEXT_CENTERED; - button->border = 0.0f; - button->rounding = 0.0f; - button->draw_begin = 0; - button->draw_end = 0; - style->property.inc_button = style->property.dec_button; - - /* property edit */ - edit = &style->property.edit; - nk_zero_struct(*edit); - edit->normal = nk_style_item_color(table[NK_COLOR_PROPERTY]); - edit->hover = nk_style_item_color(table[NK_COLOR_PROPERTY]); - edit->active = nk_style_item_color(table[NK_COLOR_PROPERTY]); - edit->border_color = nk_rgba(0,0,0,0); - edit->cursor_normal = table[NK_COLOR_TEXT]; - edit->cursor_hover = table[NK_COLOR_TEXT]; - edit->cursor_text_normal= table[NK_COLOR_EDIT]; - edit->cursor_text_hover = table[NK_COLOR_EDIT]; - edit->text_normal = table[NK_COLOR_TEXT]; - edit->text_hover = table[NK_COLOR_TEXT]; - edit->text_active = table[NK_COLOR_TEXT]; - edit->selected_normal = table[NK_COLOR_TEXT]; - edit->selected_hover = table[NK_COLOR_TEXT]; - edit->selected_text_normal = table[NK_COLOR_EDIT]; - edit->selected_text_hover = table[NK_COLOR_EDIT]; - edit->padding = nk_vec2(0,0); - edit->cursor_size = 8; - edit->border = 0; - edit->rounding = 0; - - /* chart */ - chart = &style->chart; - nk_zero_struct(*chart); - chart->background = nk_style_item_color(table[NK_COLOR_CHART]); - chart->border_color = table[NK_COLOR_BORDER]; - chart->selected_color = table[NK_COLOR_CHART_COLOR_HIGHLIGHT]; - chart->color = table[NK_COLOR_CHART_COLOR]; - chart->padding = nk_vec2(4,4); - chart->border = 0; - chart->rounding = 0; - - /* combo */ - combo = &style->combo; - combo->normal = nk_style_item_color(table[NK_COLOR_COMBO]); - combo->hover = nk_style_item_color(table[NK_COLOR_COMBO]); - combo->active = nk_style_item_color(table[NK_COLOR_COMBO]); - combo->border_color = table[NK_COLOR_BORDER]; - combo->label_normal = table[NK_COLOR_TEXT]; - combo->label_hover = table[NK_COLOR_TEXT]; - combo->label_active = table[NK_COLOR_TEXT]; - combo->sym_normal = NK_SYMBOL_TRIANGLE_DOWN; - combo->sym_hover = NK_SYMBOL_TRIANGLE_DOWN; - combo->sym_active = NK_SYMBOL_TRIANGLE_DOWN; - combo->content_padding = nk_vec2(4,4); - combo->button_padding = nk_vec2(0,4); - combo->spacing = nk_vec2(4,0); - combo->border = 1; - combo->rounding = 0; - - /* combo button */ - button = &style->combo.button; - nk_zero_struct(*button); - button->normal = nk_style_item_color(table[NK_COLOR_COMBO]); - button->hover = nk_style_item_color(table[NK_COLOR_COMBO]); - button->active = nk_style_item_color(table[NK_COLOR_COMBO]); - button->border_color = nk_rgba(0,0,0,0); - button->text_background = table[NK_COLOR_COMBO]; - button->text_normal = table[NK_COLOR_TEXT]; - button->text_hover = table[NK_COLOR_TEXT]; - button->text_active = table[NK_COLOR_TEXT]; - button->padding = nk_vec2(2.0f,2.0f); - button->touch_padding = nk_vec2(0.0f,0.0f); - button->userdata = nk_handle_ptr(0); - button->text_alignment = NK_TEXT_CENTERED; - button->border = 0.0f; - button->rounding = 0.0f; - button->draw_begin = 0; - button->draw_end = 0; - - /* tab */ - tab = &style->tab; - tab->background = nk_style_item_color(table[NK_COLOR_TAB_HEADER]); - tab->border_color = table[NK_COLOR_BORDER]; - tab->text = table[NK_COLOR_TEXT]; - tab->sym_minimize = NK_SYMBOL_TRIANGLE_RIGHT; - tab->sym_maximize = NK_SYMBOL_TRIANGLE_DOWN; - tab->padding = nk_vec2(4,4); - tab->spacing = nk_vec2(4,4); - tab->indent = 10.0f; - tab->border = 1; - tab->rounding = 0; - - /* tab button */ - button = &style->tab.tab_minimize_button; - nk_zero_struct(*button); - button->normal = nk_style_item_color(table[NK_COLOR_TAB_HEADER]); - button->hover = nk_style_item_color(table[NK_COLOR_TAB_HEADER]); - button->active = nk_style_item_color(table[NK_COLOR_TAB_HEADER]); - button->border_color = nk_rgba(0,0,0,0); - button->text_background = table[NK_COLOR_TAB_HEADER]; - button->text_normal = table[NK_COLOR_TEXT]; - button->text_hover = table[NK_COLOR_TEXT]; - button->text_active = table[NK_COLOR_TEXT]; - button->padding = nk_vec2(2.0f,2.0f); - button->touch_padding = nk_vec2(0.0f,0.0f); - button->userdata = nk_handle_ptr(0); - button->text_alignment = NK_TEXT_CENTERED; - button->border = 0.0f; - button->rounding = 0.0f; - button->draw_begin = 0; - button->draw_end = 0; - style->tab.tab_maximize_button =*button; - - /* node button */ - button = &style->tab.node_minimize_button; - nk_zero_struct(*button); - button->normal = nk_style_item_color(table[NK_COLOR_WINDOW]); - button->hover = nk_style_item_color(table[NK_COLOR_WINDOW]); - button->active = nk_style_item_color(table[NK_COLOR_WINDOW]); - button->border_color = nk_rgba(0,0,0,0); - button->text_background = table[NK_COLOR_TAB_HEADER]; - button->text_normal = table[NK_COLOR_TEXT]; - button->text_hover = table[NK_COLOR_TEXT]; - button->text_active = table[NK_COLOR_TEXT]; - button->padding = nk_vec2(2.0f,2.0f); - button->touch_padding = nk_vec2(0.0f,0.0f); - button->userdata = nk_handle_ptr(0); - button->text_alignment = NK_TEXT_CENTERED; - button->border = 0.0f; - button->rounding = 0.0f; - button->draw_begin = 0; - button->draw_end = 0; - style->tab.node_maximize_button =*button; - - /* window header */ - win = &style->window; - win->header.align = NK_HEADER_RIGHT; - win->header.close_symbol = NK_SYMBOL_X; - win->header.minimize_symbol = NK_SYMBOL_MINUS; - win->header.maximize_symbol = NK_SYMBOL_PLUS; - win->header.normal = nk_style_item_color(table[NK_COLOR_HEADER]); - win->header.hover = nk_style_item_color(table[NK_COLOR_HEADER]); - win->header.active = nk_style_item_color(table[NK_COLOR_HEADER]); - win->header.label_normal = table[NK_COLOR_TEXT]; - win->header.label_hover = table[NK_COLOR_TEXT]; - win->header.label_active = table[NK_COLOR_TEXT]; - win->header.label_padding = nk_vec2(4,4); - win->header.padding = nk_vec2(4,4); - win->header.spacing = nk_vec2(0,0); - - /* window header close button */ - button = &style->window.header.close_button; - nk_zero_struct(*button); - button->normal = nk_style_item_color(table[NK_COLOR_HEADER]); - button->hover = nk_style_item_color(table[NK_COLOR_HEADER]); - button->active = nk_style_item_color(table[NK_COLOR_HEADER]); - button->border_color = nk_rgba(0,0,0,0); - button->text_background = table[NK_COLOR_HEADER]; - button->text_normal = table[NK_COLOR_TEXT]; - button->text_hover = table[NK_COLOR_TEXT]; - button->text_active = table[NK_COLOR_TEXT]; - button->padding = nk_vec2(0.0f,0.0f); - button->touch_padding = nk_vec2(0.0f,0.0f); - button->userdata = nk_handle_ptr(0); - button->text_alignment = NK_TEXT_CENTERED; - button->border = 0.0f; - button->rounding = 0.0f; - button->draw_begin = 0; - button->draw_end = 0; - - /* window header minimize button */ - button = &style->window.header.minimize_button; - nk_zero_struct(*button); - button->normal = nk_style_item_color(table[NK_COLOR_HEADER]); - button->hover = nk_style_item_color(table[NK_COLOR_HEADER]); - button->active = nk_style_item_color(table[NK_COLOR_HEADER]); - button->border_color = nk_rgba(0,0,0,0); - button->text_background = table[NK_COLOR_HEADER]; - button->text_normal = table[NK_COLOR_TEXT]; - button->text_hover = table[NK_COLOR_TEXT]; - button->text_active = table[NK_COLOR_TEXT]; - button->padding = nk_vec2(0.0f,0.0f); - button->touch_padding = nk_vec2(0.0f,0.0f); - button->userdata = nk_handle_ptr(0); - button->text_alignment = NK_TEXT_CENTERED; - button->border = 0.0f; - button->rounding = 0.0f; - button->draw_begin = 0; - button->draw_end = 0; - - /* window */ - win->background = table[NK_COLOR_WINDOW]; - win->fixed_background = nk_style_item_color(table[NK_COLOR_WINDOW]); - win->border_color = table[NK_COLOR_BORDER]; - win->popup_border_color = table[NK_COLOR_BORDER]; - win->combo_border_color = table[NK_COLOR_BORDER]; - win->contextual_border_color = table[NK_COLOR_BORDER]; - win->menu_border_color = table[NK_COLOR_BORDER]; - win->group_border_color = table[NK_COLOR_BORDER]; - win->tooltip_border_color = table[NK_COLOR_BORDER]; - win->scaler = nk_style_item_color(table[NK_COLOR_TEXT]); - - win->rounding = 0.0f; - win->spacing = nk_vec2(4,4); - win->scrollbar_size = nk_vec2(10,10); - win->min_size = nk_vec2(64,64); - - win->combo_border = 1.0f; - win->contextual_border = 1.0f; - win->menu_border = 1.0f; - win->group_border = 1.0f; - win->tooltip_border = 1.0f; - win->popup_border = 1.0f; - win->border = 2.0f; - win->min_row_height_padding = 8; - - win->padding = nk_vec2(4,4); - win->group_padding = nk_vec2(4,4); - win->popup_padding = nk_vec2(4,4); - win->combo_padding = nk_vec2(4,4); - win->contextual_padding = nk_vec2(4,4); - win->menu_padding = nk_vec2(4,4); - win->tooltip_padding = nk_vec2(4,4); -} -NK_API void -nk_style_set_font(struct nk_context *ctx, const struct nk_user_font *font) -{ - struct nk_style *style; - NK_ASSERT(ctx); - - if (!ctx) return; - style = &ctx->style; - style->font = font; - ctx->stacks.fonts.head = 0; - if (ctx->current) - nk_layout_reset_min_row_height(ctx); -} -NK_API nk_bool -nk_style_push_font(struct nk_context *ctx, const struct nk_user_font *font) -{ - struct nk_config_stack_user_font *font_stack; - struct nk_config_stack_user_font_element *element; - - NK_ASSERT(ctx); - if (!ctx) return 0; - - font_stack = &ctx->stacks.fonts; - NK_ASSERT(font_stack->head < (int)NK_LEN(font_stack->elements)); - if (font_stack->head >= (int)NK_LEN(font_stack->elements)) - return 0; - - element = &font_stack->elements[font_stack->head++]; - element->address = &ctx->style.font; - element->old_value = ctx->style.font; - ctx->style.font = font; - return 1; -} -NK_API nk_bool -nk_style_pop_font(struct nk_context *ctx) -{ - struct nk_config_stack_user_font *font_stack; - struct nk_config_stack_user_font_element *element; - - NK_ASSERT(ctx); - if (!ctx) return 0; - - font_stack = &ctx->stacks.fonts; - NK_ASSERT(font_stack->head > 0); - if (font_stack->head < 1) - return 0; - - element = &font_stack->elements[--font_stack->head]; - *element->address = element->old_value; - return 1; -} -#define NK_STYLE_PUSH_IMPLEMENATION(prefix, type, stack) \ -nk_style_push_##type(struct nk_context *ctx, prefix##_##type *address, prefix##_##type value)\ -{\ - struct nk_config_stack_##type * type_stack;\ - struct nk_config_stack_##type##_element *element;\ - NK_ASSERT(ctx);\ - if (!ctx) return 0;\ - type_stack = &ctx->stacks.stack;\ - NK_ASSERT(type_stack->head < (int)NK_LEN(type_stack->elements));\ - if (type_stack->head >= (int)NK_LEN(type_stack->elements))\ - return 0;\ - element = &type_stack->elements[type_stack->head++];\ - element->address = address;\ - element->old_value = *address;\ - *address = value;\ - return 1;\ -} -#define NK_STYLE_POP_IMPLEMENATION(type, stack) \ -nk_style_pop_##type(struct nk_context *ctx)\ -{\ - struct nk_config_stack_##type *type_stack;\ - struct nk_config_stack_##type##_element *element;\ - NK_ASSERT(ctx);\ - if (!ctx) return 0;\ - type_stack = &ctx->stacks.stack;\ - NK_ASSERT(type_stack->head > 0);\ - if (type_stack->head < 1)\ - return 0;\ - element = &type_stack->elements[--type_stack->head];\ - *element->address = element->old_value;\ - return 1;\ -} -NK_API nk_bool NK_STYLE_PUSH_IMPLEMENATION(struct nk, style_item, style_items) -NK_API nk_bool NK_STYLE_PUSH_IMPLEMENATION(nk,float, floats) -NK_API nk_bool NK_STYLE_PUSH_IMPLEMENATION(struct nk, vec2, vectors) -NK_API nk_bool NK_STYLE_PUSH_IMPLEMENATION(nk,flags, flags) -NK_API nk_bool NK_STYLE_PUSH_IMPLEMENATION(struct nk,color, colors) - -NK_API nk_bool NK_STYLE_POP_IMPLEMENATION(style_item, style_items) -NK_API nk_bool NK_STYLE_POP_IMPLEMENATION(float,floats) -NK_API nk_bool NK_STYLE_POP_IMPLEMENATION(vec2, vectors) -NK_API nk_bool NK_STYLE_POP_IMPLEMENATION(flags,flags) -NK_API nk_bool NK_STYLE_POP_IMPLEMENATION(color,colors) - -NK_API nk_bool -nk_style_set_cursor(struct nk_context *ctx, enum nk_style_cursor c) -{ - struct nk_style *style; - NK_ASSERT(ctx); - if (!ctx) return 0; - style = &ctx->style; - if (style->cursors[c]) { - style->cursor_active = style->cursors[c]; - return 1; - } - return 0; -} -NK_API void -nk_style_show_cursor(struct nk_context *ctx) -{ - ctx->style.cursor_visible = nk_true; -} -NK_API void -nk_style_hide_cursor(struct nk_context *ctx) -{ - ctx->style.cursor_visible = nk_false; -} -NK_API void -nk_style_load_cursor(struct nk_context *ctx, enum nk_style_cursor cursor, - const struct nk_cursor *c) -{ - struct nk_style *style; - NK_ASSERT(ctx); - if (!ctx) return; - style = &ctx->style; - style->cursors[cursor] = c; -} -NK_API void -nk_style_load_all_cursors(struct nk_context *ctx, struct nk_cursor *cursors) -{ - int i = 0; - struct nk_style *style; - NK_ASSERT(ctx); - if (!ctx) return; - style = &ctx->style; - for (i = 0; i < NK_CURSOR_COUNT; ++i) - style->cursors[i] = &cursors[i]; - style->cursor_visible = nk_true; -} - - - - - -/* ============================================================== - * - * CONTEXT - * - * ===============================================================*/ -NK_INTERN void -nk_setup(struct nk_context *ctx, const struct nk_user_font *font) -{ - NK_ASSERT(ctx); - if (!ctx) return; - nk_zero_struct(*ctx); - nk_style_default(ctx); - ctx->seq = 1; - if (font) ctx->style.font = font; -#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT - nk_draw_list_init(&ctx->draw_list); -#endif -} -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -NK_API nk_bool -nk_init_default(struct nk_context *ctx, const struct nk_user_font *font) -{ - struct nk_allocator alloc; - alloc.userdata.ptr = 0; - alloc.alloc = nk_malloc; - alloc.free = nk_mfree; - return nk_init(ctx, &alloc, font); -} -#endif -NK_API nk_bool -nk_init_fixed(struct nk_context *ctx, void *memory, nk_size size, - const struct nk_user_font *font) -{ - NK_ASSERT(memory); - if (!memory) return 0; - nk_setup(ctx, font); - nk_buffer_init_fixed(&ctx->memory, memory, size); - ctx->use_pool = nk_false; - return 1; -} -NK_API nk_bool -nk_init_custom(struct nk_context *ctx, struct nk_buffer *cmds, - struct nk_buffer *pool, const struct nk_user_font *font) -{ - NK_ASSERT(cmds); - NK_ASSERT(pool); - if (!cmds || !pool) return 0; - - nk_setup(ctx, font); - ctx->memory = *cmds; - if (pool->type == NK_BUFFER_FIXED) { - /* take memory from buffer and alloc fixed pool */ - nk_pool_init_fixed(&ctx->pool, pool->memory.ptr, pool->memory.size); - } else { - /* create dynamic pool from buffer allocator */ - struct nk_allocator *alloc = &pool->pool; - nk_pool_init(&ctx->pool, alloc, NK_POOL_DEFAULT_CAPACITY); - } - ctx->use_pool = nk_true; - return 1; -} -NK_API nk_bool -nk_init(struct nk_context *ctx, struct nk_allocator *alloc, - const struct nk_user_font *font) -{ - NK_ASSERT(alloc); - if (!alloc) return 0; - nk_setup(ctx, font); - nk_buffer_init(&ctx->memory, alloc, NK_DEFAULT_COMMAND_BUFFER_SIZE); - nk_pool_init(&ctx->pool, alloc, NK_POOL_DEFAULT_CAPACITY); - ctx->use_pool = nk_true; - return 1; -} -#ifdef NK_INCLUDE_COMMAND_USERDATA -NK_API void -nk_set_user_data(struct nk_context *ctx, nk_handle handle) -{ - if (!ctx) return; - ctx->userdata = handle; - if (ctx->current) - ctx->current->buffer.userdata = handle; -} -#endif -NK_API void -nk_free(struct nk_context *ctx) -{ - NK_ASSERT(ctx); - if (!ctx) return; - nk_buffer_free(&ctx->memory); - if (ctx->use_pool) - nk_pool_free(&ctx->pool); - - nk_zero(&ctx->input, sizeof(ctx->input)); - nk_zero(&ctx->style, sizeof(ctx->style)); - nk_zero(&ctx->memory, sizeof(ctx->memory)); - - ctx->seq = 0; - ctx->build = 0; - ctx->begin = 0; - ctx->end = 0; - ctx->active = 0; - ctx->current = 0; - ctx->freelist = 0; - ctx->count = 0; -} -NK_API void -nk_clear(struct nk_context *ctx) -{ - struct nk_window *iter; - struct nk_window *next; - NK_ASSERT(ctx); - - if (!ctx) return; - if (ctx->use_pool) - nk_buffer_clear(&ctx->memory); - else nk_buffer_reset(&ctx->memory, NK_BUFFER_FRONT); - - ctx->build = 0; - ctx->memory.calls = 0; - ctx->last_widget_state = 0; - ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_ARROW]; - NK_MEMSET(&ctx->overlay, 0, sizeof(ctx->overlay)); - - /* garbage collector */ - iter = ctx->begin; - while (iter) { - /* make sure valid minimized windows do not get removed */ - if ((iter->flags & NK_WINDOW_MINIMIZED) && - !(iter->flags & NK_WINDOW_CLOSED) && - iter->seq == ctx->seq) { - iter = iter->next; - continue; - } - /* remove hotness from hidden or closed windows*/ - if (((iter->flags & NK_WINDOW_HIDDEN) || - (iter->flags & NK_WINDOW_CLOSED)) && - iter == ctx->active) { - ctx->active = iter->prev; - ctx->end = iter->prev; - if (!ctx->end) - ctx->begin = 0; - if (ctx->active) - ctx->active->flags &= ~(unsigned)NK_WINDOW_ROM; - } - /* free unused popup windows */ - if (iter->popup.win && iter->popup.win->seq != ctx->seq) { - nk_free_window(ctx, iter->popup.win); - iter->popup.win = 0; - } - /* remove unused window state tables */ - {struct nk_table *n, *it = iter->tables; - while (it) { - n = it->next; - if (it->seq != ctx->seq) { - nk_remove_table(iter, it); - nk_zero(it, sizeof(union nk_page_data)); - nk_free_table(ctx, it); - if (it == iter->tables) - iter->tables = n; - } it = n; - }} - /* window itself is not used anymore so free */ - if (iter->seq != ctx->seq || iter->flags & NK_WINDOW_CLOSED) { - next = iter->next; - nk_remove_window(ctx, iter); - nk_free_window(ctx, iter); - iter = next; - } else iter = iter->next; - } - ctx->seq++; -} -NK_LIB void -nk_start_buffer(struct nk_context *ctx, struct nk_command_buffer *buffer) -{ - NK_ASSERT(ctx); - NK_ASSERT(buffer); - if (!ctx || !buffer) return; - buffer->begin = ctx->memory.allocated; - buffer->end = buffer->begin; - buffer->last = buffer->begin; - buffer->clip = nk_null_rect; -} -NK_LIB void -nk_start(struct nk_context *ctx, struct nk_window *win) -{ - NK_ASSERT(ctx); - NK_ASSERT(win); - nk_start_buffer(ctx, &win->buffer); -} -NK_LIB void -nk_start_popup(struct nk_context *ctx, struct nk_window *win) -{ - struct nk_popup_buffer *buf; - NK_ASSERT(ctx); - NK_ASSERT(win); - if (!ctx || !win) return; - - /* save buffer fill state for popup */ - buf = &win->popup.buf; - buf->begin = win->buffer.end; - buf->end = win->buffer.end; - buf->parent = win->buffer.last; - buf->last = buf->begin; - buf->active = nk_true; -} -NK_LIB void -nk_finish_popup(struct nk_context *ctx, struct nk_window *win) -{ - struct nk_popup_buffer *buf; - NK_ASSERT(ctx); - NK_ASSERT(win); - if (!ctx || !win) return; - - buf = &win->popup.buf; - buf->last = win->buffer.last; - buf->end = win->buffer.end; -} -NK_LIB void -nk_finish_buffer(struct nk_context *ctx, struct nk_command_buffer *buffer) -{ - NK_ASSERT(ctx); - NK_ASSERT(buffer); - if (!ctx || !buffer) return; - buffer->end = ctx->memory.allocated; -} -NK_LIB void -nk_finish(struct nk_context *ctx, struct nk_window *win) -{ - struct nk_popup_buffer *buf; - struct nk_command *parent_last; - void *memory; - - NK_ASSERT(ctx); - NK_ASSERT(win); - if (!ctx || !win) return; - nk_finish_buffer(ctx, &win->buffer); - if (!win->popup.buf.active) return; - - buf = &win->popup.buf; - memory = ctx->memory.memory.ptr; - parent_last = nk_ptr_add(struct nk_command, memory, buf->parent); - parent_last->next = buf->end; -} -NK_LIB void -nk_build(struct nk_context *ctx) -{ - struct nk_window *it = 0; - struct nk_command *cmd = 0; - nk_byte *buffer = 0; - - /* draw cursor overlay */ - if (!ctx->style.cursor_active) - ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_ARROW]; - if (ctx->style.cursor_active && !ctx->input.mouse.grabbed && ctx->style.cursor_visible) { - struct nk_rect mouse_bounds; - const struct nk_cursor *cursor = ctx->style.cursor_active; - nk_command_buffer_init(&ctx->overlay, &ctx->memory, NK_CLIPPING_OFF); - nk_start_buffer(ctx, &ctx->overlay); - - mouse_bounds.x = ctx->input.mouse.pos.x - cursor->offset.x; - mouse_bounds.y = ctx->input.mouse.pos.y - cursor->offset.y; - mouse_bounds.w = cursor->size.x; - mouse_bounds.h = cursor->size.y; - - nk_draw_image(&ctx->overlay, mouse_bounds, &cursor->img, nk_white); - nk_finish_buffer(ctx, &ctx->overlay); - } - /* build one big draw command list out of all window buffers */ - it = ctx->begin; - buffer = (nk_byte*)ctx->memory.memory.ptr; - while (it != 0) { - struct nk_window *next = it->next; - if (it->buffer.last == it->buffer.begin || (it->flags & NK_WINDOW_HIDDEN)|| - it->seq != ctx->seq) - goto cont; - - cmd = nk_ptr_add(struct nk_command, buffer, it->buffer.last); - while (next && ((next->buffer.last == next->buffer.begin) || - (next->flags & NK_WINDOW_HIDDEN) || next->seq != ctx->seq)) - next = next->next; /* skip empty command buffers */ - - if (next) cmd->next = next->buffer.begin; - cont: it = next; - } - /* append all popup draw commands into lists */ - it = ctx->begin; - while (it != 0) { - struct nk_window *next = it->next; - struct nk_popup_buffer *buf; - if (!it->popup.buf.active) - goto skip; - - buf = &it->popup.buf; - cmd->next = buf->begin; - cmd = nk_ptr_add(struct nk_command, buffer, buf->last); - buf->active = nk_false; - skip: it = next; - } - if (cmd) { - /* append overlay commands */ - if (ctx->overlay.end != ctx->overlay.begin) - cmd->next = ctx->overlay.begin; - else cmd->next = ctx->memory.allocated; - } -} -NK_API const struct nk_command* -nk__begin(struct nk_context *ctx) -{ - struct nk_window *iter; - nk_byte *buffer; - NK_ASSERT(ctx); - if (!ctx) return 0; - if (!ctx->count) return 0; - - buffer = (nk_byte*)ctx->memory.memory.ptr; - if (!ctx->build) { - nk_build(ctx); - ctx->build = nk_true; - } - iter = ctx->begin; - while (iter && ((iter->buffer.begin == iter->buffer.end) || - (iter->flags & NK_WINDOW_HIDDEN) || iter->seq != ctx->seq)) - iter = iter->next; - if (!iter) return 0; - return nk_ptr_add_const(struct nk_command, buffer, iter->buffer.begin); -} - -NK_API const struct nk_command* -nk__next(struct nk_context *ctx, const struct nk_command *cmd) -{ - nk_byte *buffer; - const struct nk_command *next; - NK_ASSERT(ctx); - if (!ctx || !cmd || !ctx->count) return 0; - if (cmd->next >= ctx->memory.allocated) return 0; - buffer = (nk_byte*)ctx->memory.memory.ptr; - next = nk_ptr_add_const(struct nk_command, buffer, cmd->next); - return next; -} - - - - - - -/* =============================================================== - * - * POOL - * - * ===============================================================*/ -NK_LIB void -nk_pool_init(struct nk_pool *pool, struct nk_allocator *alloc, - unsigned int capacity) -{ - NK_ASSERT(capacity >= 1); - nk_zero(pool, sizeof(*pool)); - pool->alloc = *alloc; - pool->capacity = capacity; - pool->type = NK_BUFFER_DYNAMIC; - pool->pages = 0; -} -NK_LIB void -nk_pool_free(struct nk_pool *pool) -{ - struct nk_page *iter; - if (!pool) return; - iter = pool->pages; - if (pool->type == NK_BUFFER_FIXED) return; - while (iter) { - struct nk_page *next = iter->next; - pool->alloc.free(pool->alloc.userdata, iter); - iter = next; - } -} -NK_LIB void -nk_pool_init_fixed(struct nk_pool *pool, void *memory, nk_size size) -{ - nk_zero(pool, sizeof(*pool)); - NK_ASSERT(size >= sizeof(struct nk_page)); - if (size < sizeof(struct nk_page)) return; - /* first nk_page_element is embedded in nk_page, additional elements follow in adjacent space */ - pool->capacity = (unsigned)(1 + (size - sizeof(struct nk_page)) / sizeof(struct nk_page_element)); - pool->pages = (struct nk_page*)memory; - pool->type = NK_BUFFER_FIXED; - pool->size = size; -} -NK_LIB struct nk_page_element* -nk_pool_alloc(struct nk_pool *pool) -{ - if (!pool->pages || pool->pages->size >= pool->capacity) { - /* allocate new page */ - struct nk_page *page; - if (pool->type == NK_BUFFER_FIXED) { - NK_ASSERT(pool->pages); - if (!pool->pages) return 0; - NK_ASSERT(pool->pages->size < pool->capacity); - return 0; - } else { - nk_size size = sizeof(struct nk_page); - size += (pool->capacity - 1) * sizeof(struct nk_page_element); - page = (struct nk_page*)pool->alloc.alloc(pool->alloc.userdata,0, size); - page->next = pool->pages; - pool->pages = page; - page->size = 0; - } - } return &pool->pages->win[pool->pages->size++]; -} - - - - - -/* =============================================================== - * - * PAGE ELEMENT - * - * ===============================================================*/ -NK_LIB struct nk_page_element* -nk_create_page_element(struct nk_context *ctx) -{ - struct nk_page_element *elem; - if (ctx->freelist) { - /* unlink page element from free list */ - elem = ctx->freelist; - ctx->freelist = elem->next; - } else if (ctx->use_pool) { - /* allocate page element from memory pool */ - elem = nk_pool_alloc(&ctx->pool); - NK_ASSERT(elem); - if (!elem) return 0; - } else { - /* allocate new page element from back of fixed size memory buffer */ - NK_STORAGE const nk_size size = sizeof(struct nk_page_element); - NK_STORAGE const nk_size align = NK_ALIGNOF(struct nk_page_element); - elem = (struct nk_page_element*)nk_buffer_alloc(&ctx->memory, NK_BUFFER_BACK, size, align); - NK_ASSERT(elem); - if (!elem) return 0; - } - nk_zero_struct(*elem); - elem->next = 0; - elem->prev = 0; - return elem; -} -NK_LIB void -nk_link_page_element_into_freelist(struct nk_context *ctx, - struct nk_page_element *elem) -{ - /* link table into freelist */ - if (!ctx->freelist) { - ctx->freelist = elem; - } else { - elem->next = ctx->freelist; - ctx->freelist = elem; - } -} -NK_LIB void -nk_free_page_element(struct nk_context *ctx, struct nk_page_element *elem) -{ - /* we have a pool so just add to free list */ - if (ctx->use_pool) { - nk_link_page_element_into_freelist(ctx, elem); - return; - } - /* if possible remove last element from back of fixed memory buffer */ - {void *elem_end = (void*)(elem + 1); - void *buffer_end = (nk_byte*)ctx->memory.memory.ptr + ctx->memory.size; - if (elem_end == buffer_end) - ctx->memory.size -= sizeof(struct nk_page_element); - else nk_link_page_element_into_freelist(ctx, elem);} -} - - - - - -/* =============================================================== - * - * TABLE - * - * ===============================================================*/ -NK_LIB struct nk_table* -nk_create_table(struct nk_context *ctx) -{ - struct nk_page_element *elem; - elem = nk_create_page_element(ctx); - if (!elem) return 0; - nk_zero_struct(*elem); - return &elem->data.tbl; -} -NK_LIB void -nk_free_table(struct nk_context *ctx, struct nk_table *tbl) -{ - union nk_page_data *pd = NK_CONTAINER_OF(tbl, union nk_page_data, tbl); - struct nk_page_element *pe = NK_CONTAINER_OF(pd, struct nk_page_element, data); - nk_free_page_element(ctx, pe); -} -NK_LIB void -nk_push_table(struct nk_window *win, struct nk_table *tbl) -{ - if (!win->tables) { - win->tables = tbl; - tbl->next = 0; - tbl->prev = 0; - tbl->size = 0; - win->table_count = 1; - return; - } - win->tables->prev = tbl; - tbl->next = win->tables; - tbl->prev = 0; - tbl->size = 0; - win->tables = tbl; - win->table_count++; -} -NK_LIB void -nk_remove_table(struct nk_window *win, struct nk_table *tbl) -{ - if (win->tables == tbl) - win->tables = tbl->next; - if (tbl->next) - tbl->next->prev = tbl->prev; - if (tbl->prev) - tbl->prev->next = tbl->next; - tbl->next = 0; - tbl->prev = 0; -} -NK_LIB nk_uint* -nk_add_value(struct nk_context *ctx, struct nk_window *win, - nk_hash name, nk_uint value) -{ - NK_ASSERT(ctx); - NK_ASSERT(win); - if (!win || !ctx) return 0; - if (!win->tables || win->tables->size >= NK_VALUE_PAGE_CAPACITY) { - struct nk_table *tbl = nk_create_table(ctx); - NK_ASSERT(tbl); - if (!tbl) return 0; - nk_push_table(win, tbl); - } - win->tables->seq = win->seq; - win->tables->keys[win->tables->size] = name; - win->tables->values[win->tables->size] = value; - return &win->tables->values[win->tables->size++]; -} -NK_LIB nk_uint* -nk_find_value(struct nk_window *win, nk_hash name) -{ - struct nk_table *iter = win->tables; - while (iter) { - unsigned int i = 0; - unsigned int size = iter->size; - for (i = 0; i < size; ++i) { - if (iter->keys[i] == name) { - iter->seq = win->seq; - return &iter->values[i]; - } - } size = NK_VALUE_PAGE_CAPACITY; - iter = iter->next; - } - return 0; -} - - - - - -/* =============================================================== - * - * PANEL - * - * ===============================================================*/ -NK_LIB void* -nk_create_panel(struct nk_context *ctx) -{ - struct nk_page_element *elem; - elem = nk_create_page_element(ctx); - if (!elem) return 0; - nk_zero_struct(*elem); - return &elem->data.pan; -} -NK_LIB void -nk_free_panel(struct nk_context *ctx, struct nk_panel *pan) -{ - union nk_page_data *pd = NK_CONTAINER_OF(pan, union nk_page_data, pan); - struct nk_page_element *pe = NK_CONTAINER_OF(pd, struct nk_page_element, data); - nk_free_page_element(ctx, pe); -} -NK_LIB nk_bool -nk_panel_has_header(nk_flags flags, const char *title) -{ - nk_bool active = 0; - active = (flags & (NK_WINDOW_CLOSABLE|NK_WINDOW_MINIMIZABLE)); - active = active || (flags & NK_WINDOW_TITLE); - active = active && !(flags & NK_WINDOW_HIDDEN) && title; - return active; -} -NK_LIB struct nk_vec2 -nk_panel_get_padding(const struct nk_style *style, enum nk_panel_type type) -{ - switch (type) { - default: - case NK_PANEL_WINDOW: return style->window.padding; - case NK_PANEL_GROUP: return style->window.group_padding; - case NK_PANEL_POPUP: return style->window.popup_padding; - case NK_PANEL_CONTEXTUAL: return style->window.contextual_padding; - case NK_PANEL_COMBO: return style->window.combo_padding; - case NK_PANEL_MENU: return style->window.menu_padding; - case NK_PANEL_TOOLTIP: return style->window.menu_padding;} -} -NK_LIB float -nk_panel_get_border(const struct nk_style *style, nk_flags flags, - enum nk_panel_type type) -{ - if (flags & NK_WINDOW_BORDER) { - switch (type) { - default: - case NK_PANEL_WINDOW: return style->window.border; - case NK_PANEL_GROUP: return style->window.group_border; - case NK_PANEL_POPUP: return style->window.popup_border; - case NK_PANEL_CONTEXTUAL: return style->window.contextual_border; - case NK_PANEL_COMBO: return style->window.combo_border; - case NK_PANEL_MENU: return style->window.menu_border; - case NK_PANEL_TOOLTIP: return style->window.menu_border; - }} else return 0; -} -NK_LIB struct nk_color -nk_panel_get_border_color(const struct nk_style *style, enum nk_panel_type type) -{ - switch (type) { - default: - case NK_PANEL_WINDOW: return style->window.border_color; - case NK_PANEL_GROUP: return style->window.group_border_color; - case NK_PANEL_POPUP: return style->window.popup_border_color; - case NK_PANEL_CONTEXTUAL: return style->window.contextual_border_color; - case NK_PANEL_COMBO: return style->window.combo_border_color; - case NK_PANEL_MENU: return style->window.menu_border_color; - case NK_PANEL_TOOLTIP: return style->window.menu_border_color;} -} -NK_LIB nk_bool -nk_panel_is_sub(enum nk_panel_type type) -{ - return (type & NK_PANEL_SET_SUB)?1:0; -} -NK_LIB nk_bool -nk_panel_is_nonblock(enum nk_panel_type type) -{ - return (type & NK_PANEL_SET_NONBLOCK)?1:0; -} -NK_LIB nk_bool -nk_panel_begin(struct nk_context *ctx, const char *title, enum nk_panel_type panel_type) -{ - struct nk_input *in; - struct nk_window *win; - struct nk_panel *layout; - struct nk_command_buffer *out; - const struct nk_style *style; - const struct nk_user_font *font; - - struct nk_vec2 scrollbar_size; - struct nk_vec2 panel_padding; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) return 0; - nk_zero(ctx->current->layout, sizeof(*ctx->current->layout)); - if ((ctx->current->flags & NK_WINDOW_HIDDEN) || (ctx->current->flags & NK_WINDOW_CLOSED)) { - nk_zero(ctx->current->layout, sizeof(struct nk_panel)); - ctx->current->layout->type = panel_type; - return 0; - } - /* pull state into local stack */ - style = &ctx->style; - font = style->font; - win = ctx->current; - layout = win->layout; - out = &win->buffer; - in = (win->flags & NK_WINDOW_NO_INPUT) ? 0: &ctx->input; -#ifdef NK_INCLUDE_COMMAND_USERDATA - win->buffer.userdata = ctx->userdata; -#endif - /* pull style configuration into local stack */ - scrollbar_size = style->window.scrollbar_size; - panel_padding = nk_panel_get_padding(style, panel_type); - - /* window movement */ - if ((win->flags & NK_WINDOW_MOVABLE) && !(win->flags & NK_WINDOW_ROM)) { - nk_bool left_mouse_down; - unsigned int left_mouse_clicked; - int left_mouse_click_in_cursor; - - /* calculate draggable window space */ - struct nk_rect header; - header.x = win->bounds.x; - header.y = win->bounds.y; - header.w = win->bounds.w; - if (nk_panel_has_header(win->flags, title)) { - header.h = font->height + 2.0f * style->window.header.padding.y; - header.h += 2.0f * style->window.header.label_padding.y; - } else header.h = panel_padding.y; - - /* window movement by dragging */ - left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down; - left_mouse_clicked = in->mouse.buttons[NK_BUTTON_LEFT].clicked; - left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in, - NK_BUTTON_LEFT, header, nk_true); - if (left_mouse_down && left_mouse_click_in_cursor && !left_mouse_clicked) { - win->bounds.x = win->bounds.x + in->mouse.delta.x; - win->bounds.y = win->bounds.y + in->mouse.delta.y; - in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x += in->mouse.delta.x; - in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y += in->mouse.delta.y; - ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_MOVE]; - } - } - - /* setup panel */ - layout->type = panel_type; - layout->flags = win->flags; - layout->bounds = win->bounds; - layout->bounds.x += panel_padding.x; - layout->bounds.w -= 2*panel_padding.x; - if (win->flags & NK_WINDOW_BORDER) { - layout->border = nk_panel_get_border(style, win->flags, panel_type); - layout->bounds = nk_shrink_rect(layout->bounds, layout->border); - } else layout->border = 0; - layout->at_y = layout->bounds.y; - layout->at_x = layout->bounds.x; - layout->max_x = 0; - layout->header_height = 0; - layout->footer_height = 0; - nk_layout_reset_min_row_height(ctx); - layout->row.index = 0; - layout->row.columns = 0; - layout->row.ratio = 0; - layout->row.item_width = 0; - layout->row.tree_depth = 0; - layout->row.height = panel_padding.y; - layout->has_scrolling = nk_true; - if (!(win->flags & NK_WINDOW_NO_SCROLLBAR)) - layout->bounds.w -= scrollbar_size.x; - if (!nk_panel_is_nonblock(panel_type)) { - layout->footer_height = 0; - if (!(win->flags & NK_WINDOW_NO_SCROLLBAR) || win->flags & NK_WINDOW_SCALABLE) - layout->footer_height = scrollbar_size.y; - layout->bounds.h -= layout->footer_height; - } - - /* panel header */ - if (nk_panel_has_header(win->flags, title)) - { - struct nk_text text; - struct nk_rect header; - const struct nk_style_item *background = 0; - - /* calculate header bounds */ - header.x = win->bounds.x; - header.y = win->bounds.y; - header.w = win->bounds.w; - header.h = font->height + 2.0f * style->window.header.padding.y; - header.h += (2.0f * style->window.header.label_padding.y); - - /* shrink panel by header */ - layout->header_height = header.h; - layout->bounds.y += header.h; - layout->bounds.h -= header.h; - layout->at_y += header.h; - - /* select correct header background and text color */ - if (ctx->active == win) { - background = &style->window.header.active; - text.text = style->window.header.label_active; - } else if (nk_input_is_mouse_hovering_rect(&ctx->input, header)) { - background = &style->window.header.hover; - text.text = style->window.header.label_hover; - } else { - background = &style->window.header.normal; - text.text = style->window.header.label_normal; - } - - /* draw header background */ - header.h += 1.0f; - - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - text.background = nk_rgba(0,0,0,0); - nk_draw_image(&win->buffer, header, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - text.background = nk_rgba(0, 0, 0, 0); - nk_draw_nine_slice(&win->buffer, header, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - text.background = background->data.color; - nk_fill_rect(out, header, 0, background->data.color); - break; - } - - /* window close button */ - {struct nk_rect button; - button.y = header.y + style->window.header.padding.y; - button.h = header.h - 2 * style->window.header.padding.y; - button.w = button.h; - if (win->flags & NK_WINDOW_CLOSABLE) { - nk_flags ws = 0; - if (style->window.header.align == NK_HEADER_RIGHT) { - button.x = (header.w + header.x) - (button.w + style->window.header.padding.x); - header.w -= button.w + style->window.header.spacing.x + style->window.header.padding.x; - } else { - button.x = header.x + style->window.header.padding.x; - header.x += button.w + style->window.header.spacing.x + style->window.header.padding.x; - } - - if (nk_do_button_symbol(&ws, &win->buffer, button, - style->window.header.close_symbol, NK_BUTTON_DEFAULT, - &style->window.header.close_button, in, style->font) && !(win->flags & NK_WINDOW_ROM)) - { - layout->flags |= NK_WINDOW_HIDDEN; - layout->flags &= (nk_flags)~NK_WINDOW_MINIMIZED; - } - } - - /* window minimize button */ - if (win->flags & NK_WINDOW_MINIMIZABLE) { - nk_flags ws = 0; - if (style->window.header.align == NK_HEADER_RIGHT) { - button.x = (header.w + header.x) - button.w; - if (!(win->flags & NK_WINDOW_CLOSABLE)) { - button.x -= style->window.header.padding.x; - header.w -= style->window.header.padding.x; - } - header.w -= button.w + style->window.header.spacing.x; - } else { - button.x = header.x; - header.x += button.w + style->window.header.spacing.x + style->window.header.padding.x; - } - if (nk_do_button_symbol(&ws, &win->buffer, button, (layout->flags & NK_WINDOW_MINIMIZED)? - style->window.header.maximize_symbol: style->window.header.minimize_symbol, - NK_BUTTON_DEFAULT, &style->window.header.minimize_button, in, style->font) && !(win->flags & NK_WINDOW_ROM)) - layout->flags = (layout->flags & NK_WINDOW_MINIMIZED) ? - layout->flags & (nk_flags)~NK_WINDOW_MINIMIZED: - layout->flags | NK_WINDOW_MINIMIZED; - }} - - {/* window header title */ - int text_len = nk_strlen(title); - struct nk_rect label = {0,0,0,0}; - float t = font->width(font->userdata, font->height, title, text_len); - text.padding = nk_vec2(0,0); - - label.x = header.x + style->window.header.padding.x; - label.x += style->window.header.label_padding.x; - label.y = header.y + style->window.header.label_padding.y; - label.h = font->height + 2 * style->window.header.label_padding.y; - label.w = t + 2 * style->window.header.spacing.x; - label.w = NK_CLAMP(0, label.w, header.x + header.w - label.x); - nk_widget_text(out, label, (const char*)title, text_len, &text, NK_TEXT_LEFT, font);} - } - - /* draw window background */ - if (!(layout->flags & NK_WINDOW_MINIMIZED) && !(layout->flags & NK_WINDOW_DYNAMIC)) { - struct nk_rect body; - body.x = win->bounds.x; - body.w = win->bounds.w; - body.y = (win->bounds.y + layout->header_height); - body.h = (win->bounds.h - layout->header_height); - - switch(style->window.fixed_background.type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(out, body, &style->window.fixed_background.data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(out, body, &style->window.fixed_background.data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(out, body, 0, style->window.fixed_background.data.color); - break; - } - } - - /* set clipping rectangle */ - {struct nk_rect clip; - layout->clip = layout->bounds; - nk_unify(&clip, &win->buffer.clip, layout->clip.x, layout->clip.y, - layout->clip.x + layout->clip.w, layout->clip.y + layout->clip.h); - nk_push_scissor(out, clip); - layout->clip = clip;} - return !(layout->flags & NK_WINDOW_HIDDEN) && !(layout->flags & NK_WINDOW_MINIMIZED); -} -NK_LIB void -nk_panel_end(struct nk_context *ctx) -{ - struct nk_input *in; - struct nk_window *window; - struct nk_panel *layout; - const struct nk_style *style; - struct nk_command_buffer *out; - - struct nk_vec2 scrollbar_size; - struct nk_vec2 panel_padding; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - window = ctx->current; - layout = window->layout; - style = &ctx->style; - out = &window->buffer; - in = (layout->flags & NK_WINDOW_ROM || layout->flags & NK_WINDOW_NO_INPUT) ? 0 :&ctx->input; - if (!nk_panel_is_sub(layout->type)) - nk_push_scissor(out, nk_null_rect); - - /* cache configuration data */ - scrollbar_size = style->window.scrollbar_size; - panel_padding = nk_panel_get_padding(style, layout->type); - - /* update the current cursor Y-position to point over the last added widget */ - layout->at_y += layout->row.height; - - /* dynamic panels */ - if (layout->flags & NK_WINDOW_DYNAMIC && !(layout->flags & NK_WINDOW_MINIMIZED)) - { - /* update panel height to fit dynamic growth */ - struct nk_rect empty_space; - if (layout->at_y < (layout->bounds.y + layout->bounds.h)) - layout->bounds.h = layout->at_y - layout->bounds.y; - - /* fill top empty space */ - empty_space.x = window->bounds.x; - empty_space.y = layout->bounds.y; - empty_space.h = panel_padding.y; - empty_space.w = window->bounds.w; - nk_fill_rect(out, empty_space, 0, style->window.background); - - /* fill left empty space */ - empty_space.x = window->bounds.x; - empty_space.y = layout->bounds.y; - empty_space.w = panel_padding.x + layout->border; - empty_space.h = layout->bounds.h; - nk_fill_rect(out, empty_space, 0, style->window.background); - - /* fill right empty space */ - empty_space.x = layout->bounds.x + layout->bounds.w; - empty_space.y = layout->bounds.y; - empty_space.w = panel_padding.x + layout->border; - empty_space.h = layout->bounds.h; - if (*layout->offset_y == 0 && !(layout->flags & NK_WINDOW_NO_SCROLLBAR)) - empty_space.w += scrollbar_size.x; - nk_fill_rect(out, empty_space, 0, style->window.background); - - /* fill bottom empty space */ - if (layout->footer_height > 0) { - empty_space.x = window->bounds.x; - empty_space.y = layout->bounds.y + layout->bounds.h; - empty_space.w = window->bounds.w; - empty_space.h = layout->footer_height; - nk_fill_rect(out, empty_space, 0, style->window.background); - } - } - - /* scrollbars */ - if (!(layout->flags & NK_WINDOW_NO_SCROLLBAR) && - !(layout->flags & NK_WINDOW_MINIMIZED) && - window->scrollbar_hiding_timer < NK_SCROLLBAR_HIDING_TIMEOUT) - { - struct nk_rect scroll; - int scroll_has_scrolling; - float scroll_target; - float scroll_offset; - float scroll_step; - float scroll_inc; - - /* mouse wheel scrolling */ - if (nk_panel_is_sub(layout->type)) - { - /* sub-window mouse wheel scrolling */ - struct nk_window *root_window = window; - struct nk_panel *root_panel = window->layout; - while (root_panel->parent) - root_panel = root_panel->parent; - while (root_window->parent) - root_window = root_window->parent; - - /* only allow scrolling if parent window is active */ - scroll_has_scrolling = 0; - if ((root_window == ctx->active) && layout->has_scrolling) { - /* and panel is being hovered and inside clip rect*/ - if (nk_input_is_mouse_hovering_rect(in, layout->bounds) && - NK_INTERSECT(layout->bounds.x, layout->bounds.y, layout->bounds.w, layout->bounds.h, - root_panel->clip.x, root_panel->clip.y, root_panel->clip.w, root_panel->clip.h)) - { - /* deactivate all parent scrolling */ - root_panel = window->layout; - while (root_panel->parent) { - root_panel->has_scrolling = nk_false; - root_panel = root_panel->parent; - } - root_panel->has_scrolling = nk_false; - scroll_has_scrolling = nk_true; - } - } - } else if (!nk_panel_is_sub(layout->type)) { - /* window mouse wheel scrolling */ - scroll_has_scrolling = (window == ctx->active) && layout->has_scrolling; - if (in && (in->mouse.scroll_delta.y > 0 || in->mouse.scroll_delta.x > 0) && scroll_has_scrolling) - window->scrolled = nk_true; - else window->scrolled = nk_false; - } else scroll_has_scrolling = nk_false; - - { - /* vertical scrollbar */ - nk_flags state = 0; - scroll.x = layout->bounds.x + layout->bounds.w + panel_padding.x; - scroll.y = layout->bounds.y; - scroll.w = scrollbar_size.x; - scroll.h = layout->bounds.h; - - scroll_offset = (float)*layout->offset_y; - scroll_step = scroll.h * 0.10f; - scroll_inc = scroll.h * 0.01f; - scroll_target = (float)(int)(layout->at_y - scroll.y); - scroll_offset = nk_do_scrollbarv(&state, out, scroll, scroll_has_scrolling, - scroll_offset, scroll_target, scroll_step, scroll_inc, - &ctx->style.scrollv, in, style->font); - *layout->offset_y = (nk_uint)scroll_offset; - if (in && scroll_has_scrolling) - in->mouse.scroll_delta.y = 0; - } - { - /* horizontal scrollbar */ - nk_flags state = 0; - scroll.x = layout->bounds.x; - scroll.y = layout->bounds.y + layout->bounds.h; - scroll.w = layout->bounds.w; - scroll.h = scrollbar_size.y; - - scroll_offset = (float)*layout->offset_x; - scroll_target = (float)(int)(layout->max_x - scroll.x); - scroll_step = layout->max_x * 0.05f; - scroll_inc = layout->max_x * 0.005f; - scroll_offset = nk_do_scrollbarh(&state, out, scroll, scroll_has_scrolling, - scroll_offset, scroll_target, scroll_step, scroll_inc, - &ctx->style.scrollh, in, style->font); - *layout->offset_x = (nk_uint)scroll_offset; - } - } - - /* hide scroll if no user input */ - if (window->flags & NK_WINDOW_SCROLL_AUTO_HIDE) { - int has_input = ctx->input.mouse.delta.x != 0 || ctx->input.mouse.delta.y != 0 || ctx->input.mouse.scroll_delta.y != 0; - int is_window_hovered = nk_window_is_hovered(ctx); - int any_item_active = (ctx->last_widget_state & NK_WIDGET_STATE_MODIFIED); - if ((!has_input && is_window_hovered) || (!is_window_hovered && !any_item_active)) - window->scrollbar_hiding_timer += ctx->delta_time_seconds; - else window->scrollbar_hiding_timer = 0; - } else window->scrollbar_hiding_timer = 0; - - /* window border */ - if (layout->flags & NK_WINDOW_BORDER) - { - struct nk_color border_color = nk_panel_get_border_color(style, layout->type); - const float padding_y = (layout->flags & NK_WINDOW_MINIMIZED) - ? (style->window.border + window->bounds.y + layout->header_height) - : ((layout->flags & NK_WINDOW_DYNAMIC) - ? (layout->bounds.y + layout->bounds.h + layout->footer_height) - : (window->bounds.y + window->bounds.h)); - struct nk_rect b = window->bounds; - b.h = padding_y - window->bounds.y; - nk_stroke_rect(out, b, 0, layout->border, border_color); - } - - /* scaler */ - if ((layout->flags & NK_WINDOW_SCALABLE) && in && !(layout->flags & NK_WINDOW_MINIMIZED)) - { - /* calculate scaler bounds */ - struct nk_rect scaler; - scaler.w = scrollbar_size.x; - scaler.h = scrollbar_size.y; - scaler.y = layout->bounds.y + layout->bounds.h; - if (layout->flags & NK_WINDOW_SCALE_LEFT) - scaler.x = layout->bounds.x - panel_padding.x * 0.5f; - else scaler.x = layout->bounds.x + layout->bounds.w + panel_padding.x; - if (layout->flags & NK_WINDOW_NO_SCROLLBAR) - scaler.x -= scaler.w; - - /* draw scaler */ - {const struct nk_style_item *item = &style->window.scaler; - if (item->type == NK_STYLE_ITEM_IMAGE) - nk_draw_image(out, scaler, &item->data.image, nk_white); - else { - if (layout->flags & NK_WINDOW_SCALE_LEFT) { - nk_fill_triangle(out, scaler.x, scaler.y, scaler.x, - scaler.y + scaler.h, scaler.x + scaler.w, - scaler.y + scaler.h, item->data.color); - } else { - nk_fill_triangle(out, scaler.x + scaler.w, scaler.y, scaler.x + scaler.w, - scaler.y + scaler.h, scaler.x, scaler.y + scaler.h, item->data.color); - } - }} - - /* do window scaling */ - if (!(window->flags & NK_WINDOW_ROM)) { - struct nk_vec2 window_size = style->window.min_size; - int left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down; - int left_mouse_click_in_scaler = nk_input_has_mouse_click_down_in_rect(in, - NK_BUTTON_LEFT, scaler, nk_true); - - if (left_mouse_down && left_mouse_click_in_scaler) { - float delta_x = in->mouse.delta.x; - if (layout->flags & NK_WINDOW_SCALE_LEFT) { - delta_x = -delta_x; - window->bounds.x += in->mouse.delta.x; - } - /* dragging in x-direction */ - if (window->bounds.w + delta_x >= window_size.x) { - if ((delta_x < 0) || (delta_x > 0 && in->mouse.pos.x >= scaler.x)) { - window->bounds.w = window->bounds.w + delta_x; - scaler.x += in->mouse.delta.x; - } - } - /* dragging in y-direction (only possible if static window) */ - if (!(layout->flags & NK_WINDOW_DYNAMIC)) { - if (window_size.y < window->bounds.h + in->mouse.delta.y) { - if ((in->mouse.delta.y < 0) || (in->mouse.delta.y > 0 && in->mouse.pos.y >= scaler.y)) { - window->bounds.h = window->bounds.h + in->mouse.delta.y; - scaler.y += in->mouse.delta.y; - } - } - } - ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_RESIZE_TOP_RIGHT_DOWN_LEFT]; - in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = scaler.x + scaler.w/2.0f; - in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y = scaler.y + scaler.h/2.0f; - } - } - } - if (!nk_panel_is_sub(layout->type)) { - /* window is hidden so clear command buffer */ - if (layout->flags & NK_WINDOW_HIDDEN) - nk_command_buffer_reset(&window->buffer); - /* window is visible and not tab */ - else nk_finish(ctx, window); - } - - /* NK_WINDOW_REMOVE_ROM flag was set so remove NK_WINDOW_ROM */ - if (layout->flags & NK_WINDOW_REMOVE_ROM) { - layout->flags &= ~(nk_flags)NK_WINDOW_ROM; - layout->flags &= ~(nk_flags)NK_WINDOW_REMOVE_ROM; - } - window->flags = layout->flags; - - /* property garbage collector */ - if (window->property.active && window->property.old != window->property.seq && - window->property.active == window->property.prev) { - nk_zero(&window->property, sizeof(window->property)); - } else { - window->property.old = window->property.seq; - window->property.prev = window->property.active; - window->property.seq = 0; - } - /* edit garbage collector */ - if (window->edit.active && window->edit.old != window->edit.seq && - window->edit.active == window->edit.prev) { - nk_zero(&window->edit, sizeof(window->edit)); - } else { - window->edit.old = window->edit.seq; - window->edit.prev = window->edit.active; - window->edit.seq = 0; - } - /* contextual garbage collector */ - if (window->popup.active_con && window->popup.con_old != window->popup.con_count) { - window->popup.con_count = 0; - window->popup.con_old = 0; - window->popup.active_con = 0; - } else { - window->popup.con_old = window->popup.con_count; - window->popup.con_count = 0; - } - window->popup.combo_count = 0; - /* helper to make sure you have a 'nk_tree_push' for every 'nk_tree_pop' */ - NK_ASSERT(!layout->row.tree_depth); -} - - - - - -/* =============================================================== - * - * WINDOW - * - * ===============================================================*/ -NK_LIB void* -nk_create_window(struct nk_context *ctx) -{ - struct nk_page_element *elem; - elem = nk_create_page_element(ctx); - if (!elem) return 0; - elem->data.win.seq = ctx->seq; - return &elem->data.win; -} -NK_LIB void -nk_free_window(struct nk_context *ctx, struct nk_window *win) -{ - /* unlink windows from list */ - struct nk_table *it = win->tables; - if (win->popup.win) { - nk_free_window(ctx, win->popup.win); - win->popup.win = 0; - } - win->next = 0; - win->prev = 0; - - while (it) { - /*free window state tables */ - struct nk_table *n = it->next; - nk_remove_table(win, it); - nk_free_table(ctx, it); - if (it == win->tables) - win->tables = n; - it = n; - } - - /* link windows into freelist */ - {union nk_page_data *pd = NK_CONTAINER_OF(win, union nk_page_data, win); - struct nk_page_element *pe = NK_CONTAINER_OF(pd, struct nk_page_element, data); - nk_free_page_element(ctx, pe);} -} -NK_LIB struct nk_window* -nk_find_window(struct nk_context *ctx, nk_hash hash, const char *name) -{ - struct nk_window *iter; - iter = ctx->begin; - while (iter) { - NK_ASSERT(iter != iter->next); - if (iter->name == hash) { - int max_len = nk_strlen(iter->name_string); - if (!nk_stricmpn(iter->name_string, name, max_len)) - return iter; - } - iter = iter->next; - } - return 0; -} -NK_LIB void -nk_insert_window(struct nk_context *ctx, struct nk_window *win, - enum nk_window_insert_location loc) -{ - const struct nk_window *iter; - NK_ASSERT(ctx); - NK_ASSERT(win); - if (!win || !ctx) return; - - iter = ctx->begin; - while (iter) { - NK_ASSERT(iter != iter->next); - NK_ASSERT(iter != win); - if (iter == win) return; - iter = iter->next; - } - - if (!ctx->begin) { - win->next = 0; - win->prev = 0; - ctx->begin = win; - ctx->end = win; - ctx->count = 1; - return; - } - if (loc == NK_INSERT_BACK) { - struct nk_window *end; - end = ctx->end; - end->flags |= NK_WINDOW_ROM; - end->next = win; - win->prev = ctx->end; - win->next = 0; - ctx->end = win; - ctx->active = ctx->end; - ctx->end->flags &= ~(nk_flags)NK_WINDOW_ROM; - } else { - /*ctx->end->flags |= NK_WINDOW_ROM;*/ - ctx->begin->prev = win; - win->next = ctx->begin; - win->prev = 0; - ctx->begin = win; - ctx->begin->flags &= ~(nk_flags)NK_WINDOW_ROM; - } - ctx->count++; -} -NK_LIB void -nk_remove_window(struct nk_context *ctx, struct nk_window *win) -{ - if (win == ctx->begin || win == ctx->end) { - if (win == ctx->begin) { - ctx->begin = win->next; - if (win->next) - win->next->prev = 0; - } - if (win == ctx->end) { - ctx->end = win->prev; - if (win->prev) - win->prev->next = 0; - } - } else { - if (win->next) - win->next->prev = win->prev; - if (win->prev) - win->prev->next = win->next; - } - if (win == ctx->active || !ctx->active) { - ctx->active = ctx->end; - if (ctx->end) - ctx->end->flags &= ~(nk_flags)NK_WINDOW_ROM; - } - win->next = 0; - win->prev = 0; - ctx->count--; -} -NK_API nk_bool -nk_begin(struct nk_context *ctx, const char *title, - struct nk_rect bounds, nk_flags flags) -{ - return nk_begin_titled(ctx, title, title, bounds, flags); -} -NK_API nk_bool -nk_begin_titled(struct nk_context *ctx, const char *name, const char *title, - struct nk_rect bounds, nk_flags flags) -{ - struct nk_window *win; - struct nk_style *style; - nk_hash name_hash; - int name_len; - int ret = 0; - - NK_ASSERT(ctx); - NK_ASSERT(name); - NK_ASSERT(title); - NK_ASSERT(ctx->style.font && ctx->style.font->width && "if this triggers you forgot to add a font"); - NK_ASSERT(!ctx->current && "if this triggers you missed a `nk_end` call"); - if (!ctx || ctx->current || !title || !name) - return 0; - - /* find or create window */ - style = &ctx->style; - name_len = (int)nk_strlen(name); - name_hash = nk_murmur_hash(name, (int)name_len, NK_WINDOW_TITLE); - win = nk_find_window(ctx, name_hash, name); - if (!win) { - /* create new window */ - nk_size name_length = (nk_size)name_len; - win = (struct nk_window*)nk_create_window(ctx); - NK_ASSERT(win); - if (!win) return 0; - - if (flags & NK_WINDOW_BACKGROUND) - nk_insert_window(ctx, win, NK_INSERT_FRONT); - else nk_insert_window(ctx, win, NK_INSERT_BACK); - nk_command_buffer_init(&win->buffer, &ctx->memory, NK_CLIPPING_ON); - - win->flags = flags; - win->bounds = bounds; - win->name = name_hash; - name_length = NK_MIN(name_length, NK_WINDOW_MAX_NAME-1); - NK_MEMCPY(win->name_string, name, name_length); - win->name_string[name_length] = 0; - win->popup.win = 0; - if (!ctx->active) - ctx->active = win; - } else { - /* update window */ - win->flags &= ~(nk_flags)(NK_WINDOW_PRIVATE-1); - win->flags |= flags; - if (!(win->flags & (NK_WINDOW_MOVABLE | NK_WINDOW_SCALABLE))) - win->bounds = bounds; - /* If this assert triggers you either: - * - * I.) Have more than one window with the same name or - * II.) You forgot to actually draw the window. - * More specific you did not call `nk_clear` (nk_clear will be - * automatically called for you if you are using one of the - * provided demo backends). */ - NK_ASSERT(win->seq != ctx->seq); - win->seq = ctx->seq; - if (!ctx->active && !(win->flags & NK_WINDOW_HIDDEN)) { - ctx->active = win; - ctx->end = win; - } - } - if (win->flags & NK_WINDOW_HIDDEN) { - ctx->current = win; - win->layout = 0; - return 0; - } else nk_start(ctx, win); - - /* window overlapping */ - if (!(win->flags & NK_WINDOW_HIDDEN) && !(win->flags & NK_WINDOW_NO_INPUT)) - { - int inpanel, ishovered; - struct nk_window *iter = win; - float h = ctx->style.font->height + 2.0f * style->window.header.padding.y + - (2.0f * style->window.header.label_padding.y); - struct nk_rect win_bounds = (!(win->flags & NK_WINDOW_MINIMIZED))? - win->bounds: nk_rect(win->bounds.x, win->bounds.y, win->bounds.w, h); - - /* activate window if hovered and no other window is overlapping this window */ - inpanel = nk_input_has_mouse_click_down_in_rect(&ctx->input, NK_BUTTON_LEFT, win_bounds, nk_true); - inpanel = inpanel && ctx->input.mouse.buttons[NK_BUTTON_LEFT].clicked; - ishovered = nk_input_is_mouse_hovering_rect(&ctx->input, win_bounds); - if ((win != ctx->active) && ishovered && !ctx->input.mouse.buttons[NK_BUTTON_LEFT].down) { - iter = win->next; - while (iter) { - struct nk_rect iter_bounds = (!(iter->flags & NK_WINDOW_MINIMIZED))? - iter->bounds: nk_rect(iter->bounds.x, iter->bounds.y, iter->bounds.w, h); - if (NK_INTERSECT(win_bounds.x, win_bounds.y, win_bounds.w, win_bounds.h, - iter_bounds.x, iter_bounds.y, iter_bounds.w, iter_bounds.h) && - (!(iter->flags & NK_WINDOW_HIDDEN))) - break; - - if (iter->popup.win && iter->popup.active && !(iter->flags & NK_WINDOW_HIDDEN) && - NK_INTERSECT(win->bounds.x, win_bounds.y, win_bounds.w, win_bounds.h, - iter->popup.win->bounds.x, iter->popup.win->bounds.y, - iter->popup.win->bounds.w, iter->popup.win->bounds.h)) - break; - iter = iter->next; - } - } - - /* activate window if clicked */ - if (iter && inpanel && (win != ctx->end)) { - iter = win->next; - while (iter) { - /* try to find a panel with higher priority in the same position */ - struct nk_rect iter_bounds = (!(iter->flags & NK_WINDOW_MINIMIZED))? - iter->bounds: nk_rect(iter->bounds.x, iter->bounds.y, iter->bounds.w, h); - if (NK_INBOX(ctx->input.mouse.pos.x, ctx->input.mouse.pos.y, - iter_bounds.x, iter_bounds.y, iter_bounds.w, iter_bounds.h) && - !(iter->flags & NK_WINDOW_HIDDEN)) - break; - if (iter->popup.win && iter->popup.active && !(iter->flags & NK_WINDOW_HIDDEN) && - NK_INTERSECT(win_bounds.x, win_bounds.y, win_bounds.w, win_bounds.h, - iter->popup.win->bounds.x, iter->popup.win->bounds.y, - iter->popup.win->bounds.w, iter->popup.win->bounds.h)) - break; - iter = iter->next; - } - } - if (iter && !(win->flags & NK_WINDOW_ROM) && (win->flags & NK_WINDOW_BACKGROUND)) { - win->flags |= (nk_flags)NK_WINDOW_ROM; - iter->flags &= ~(nk_flags)NK_WINDOW_ROM; - ctx->active = iter; - if (!(iter->flags & NK_WINDOW_BACKGROUND)) { - /* current window is active in that position so transfer to top - * at the highest priority in stack */ - nk_remove_window(ctx, iter); - nk_insert_window(ctx, iter, NK_INSERT_BACK); - } - } else { - if (!iter && ctx->end != win) { - if (!(win->flags & NK_WINDOW_BACKGROUND)) { - /* current window is active in that position so transfer to top - * at the highest priority in stack */ - nk_remove_window(ctx, win); - nk_insert_window(ctx, win, NK_INSERT_BACK); - } - win->flags &= ~(nk_flags)NK_WINDOW_ROM; - ctx->active = win; - } - if (ctx->end != win && !(win->flags & NK_WINDOW_BACKGROUND)) - win->flags |= NK_WINDOW_ROM; - } - } - win->layout = (struct nk_panel*)nk_create_panel(ctx); - ctx->current = win; - ret = nk_panel_begin(ctx, title, NK_PANEL_WINDOW); - win->layout->offset_x = &win->scrollbar.x; - win->layout->offset_y = &win->scrollbar.y; - return ret; -} -NK_API void -nk_end(struct nk_context *ctx) -{ - struct nk_panel *layout; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current && "if this triggers you forgot to call `nk_begin`"); - if (!ctx || !ctx->current) - return; - - layout = ctx->current->layout; - if (!layout || (layout->type == NK_PANEL_WINDOW && (ctx->current->flags & NK_WINDOW_HIDDEN))) { - ctx->current = 0; - return; - } - nk_panel_end(ctx); - nk_free_panel(ctx, ctx->current->layout); - ctx->current = 0; -} -NK_API struct nk_rect -nk_window_get_bounds(const struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) return nk_rect(0,0,0,0); - return ctx->current->bounds; -} -NK_API struct nk_vec2 -nk_window_get_position(const struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) return nk_vec2(0,0); - return nk_vec2(ctx->current->bounds.x, ctx->current->bounds.y); -} -NK_API struct nk_vec2 -nk_window_get_size(const struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) return nk_vec2(0,0); - return nk_vec2(ctx->current->bounds.w, ctx->current->bounds.h); -} -NK_API float -nk_window_get_width(const struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) return 0; - return ctx->current->bounds.w; -} -NK_API float -nk_window_get_height(const struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) return 0; - return ctx->current->bounds.h; -} -NK_API struct nk_rect -nk_window_get_content_region(struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) return nk_rect(0,0,0,0); - return ctx->current->layout->clip; -} -NK_API struct nk_vec2 -nk_window_get_content_region_min(struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current) return nk_vec2(0,0); - return nk_vec2(ctx->current->layout->clip.x, ctx->current->layout->clip.y); -} -NK_API struct nk_vec2 -nk_window_get_content_region_max(struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current) return nk_vec2(0,0); - return nk_vec2(ctx->current->layout->clip.x + ctx->current->layout->clip.w, - ctx->current->layout->clip.y + ctx->current->layout->clip.h); -} -NK_API struct nk_vec2 -nk_window_get_content_region_size(struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current) return nk_vec2(0,0); - return nk_vec2(ctx->current->layout->clip.w, ctx->current->layout->clip.h); -} -NK_API struct nk_command_buffer* -nk_window_get_canvas(struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current) return 0; - return &ctx->current->buffer; -} -NK_API struct nk_panel* -nk_window_get_panel(struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) return 0; - return ctx->current->layout; -} -NK_API void -nk_window_get_scroll(struct nk_context *ctx, nk_uint *offset_x, nk_uint *offset_y) -{ - struct nk_window *win; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) - return ; - win = ctx->current; - if (offset_x) - *offset_x = win->scrollbar.x; - if (offset_y) - *offset_y = win->scrollbar.y; -} -NK_API nk_bool -nk_window_has_focus(const struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current) return 0; - return ctx->current == ctx->active; -} -NK_API nk_bool -nk_window_is_hovered(struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current || (ctx->current->flags & NK_WINDOW_HIDDEN)) - return 0; - else { - struct nk_rect actual_bounds = ctx->current->bounds; - if (ctx->begin->flags & NK_WINDOW_MINIMIZED) { - actual_bounds.h = ctx->current->layout->header_height; - } - return nk_input_is_mouse_hovering_rect(&ctx->input, actual_bounds); - } -} -NK_API nk_bool -nk_window_is_any_hovered(struct nk_context *ctx) -{ - struct nk_window *iter; - NK_ASSERT(ctx); - if (!ctx) return 0; - iter = ctx->begin; - while (iter) { - /* check if window is being hovered */ - if(!(iter->flags & NK_WINDOW_HIDDEN)) { - /* check if window popup is being hovered */ - if (iter->popup.active && iter->popup.win && nk_input_is_mouse_hovering_rect(&ctx->input, iter->popup.win->bounds)) - return 1; - - if (iter->flags & NK_WINDOW_MINIMIZED) { - struct nk_rect header = iter->bounds; - header.h = ctx->style.font->height + 2 * ctx->style.window.header.padding.y; - if (nk_input_is_mouse_hovering_rect(&ctx->input, header)) - return 1; - } else if (nk_input_is_mouse_hovering_rect(&ctx->input, iter->bounds)) { - return 1; - } - } - iter = iter->next; - } - return 0; -} -NK_API nk_bool -nk_item_is_any_active(struct nk_context *ctx) -{ - int any_hovered = nk_window_is_any_hovered(ctx); - int any_active = (ctx->last_widget_state & NK_WIDGET_STATE_MODIFIED); - return any_hovered || any_active; -} -NK_API nk_bool -nk_window_is_collapsed(struct nk_context *ctx, const char *name) -{ - int title_len; - nk_hash title_hash; - struct nk_window *win; - NK_ASSERT(ctx); - if (!ctx) return 0; - - title_len = (int)nk_strlen(name); - title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); - win = nk_find_window(ctx, title_hash, name); - if (!win) return 0; - return win->flags & NK_WINDOW_MINIMIZED; -} -NK_API nk_bool -nk_window_is_closed(struct nk_context *ctx, const char *name) -{ - int title_len; - nk_hash title_hash; - struct nk_window *win; - NK_ASSERT(ctx); - if (!ctx) return 1; - - title_len = (int)nk_strlen(name); - title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); - win = nk_find_window(ctx, title_hash, name); - if (!win) return 1; - return (win->flags & NK_WINDOW_CLOSED); -} -NK_API nk_bool -nk_window_is_hidden(struct nk_context *ctx, const char *name) -{ - int title_len; - nk_hash title_hash; - struct nk_window *win; - NK_ASSERT(ctx); - if (!ctx) return 1; - - title_len = (int)nk_strlen(name); - title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); - win = nk_find_window(ctx, title_hash, name); - if (!win) return 1; - return (win->flags & NK_WINDOW_HIDDEN); -} -NK_API nk_bool -nk_window_is_active(struct nk_context *ctx, const char *name) -{ - int title_len; - nk_hash title_hash; - struct nk_window *win; - NK_ASSERT(ctx); - if (!ctx) return 0; - - title_len = (int)nk_strlen(name); - title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); - win = nk_find_window(ctx, title_hash, name); - if (!win) return 0; - return win == ctx->active; -} -NK_API struct nk_window* -nk_window_find(struct nk_context *ctx, const char *name) -{ - int title_len; - nk_hash title_hash; - title_len = (int)nk_strlen(name); - title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); - return nk_find_window(ctx, title_hash, name); -} -NK_API void -nk_window_close(struct nk_context *ctx, const char *name) -{ - struct nk_window *win; - NK_ASSERT(ctx); - if (!ctx) return; - win = nk_window_find(ctx, name); - if (!win) return; - NK_ASSERT(ctx->current != win && "You cannot close a currently active window"); - if (ctx->current == win) return; - win->flags |= NK_WINDOW_HIDDEN; - win->flags |= NK_WINDOW_CLOSED; -} -NK_API void -nk_window_set_bounds(struct nk_context *ctx, - const char *name, struct nk_rect bounds) -{ - struct nk_window *win; - NK_ASSERT(ctx); - if (!ctx) return; - win = nk_window_find(ctx, name); - if (!win) return; - NK_ASSERT(ctx->current != win && "You cannot update a currently in procecss window"); - win->bounds = bounds; -} -NK_API void -nk_window_set_position(struct nk_context *ctx, - const char *name, struct nk_vec2 pos) -{ - struct nk_window *win = nk_window_find(ctx, name); - if (!win) return; - win->bounds.x = pos.x; - win->bounds.y = pos.y; -} -NK_API void -nk_window_set_size(struct nk_context *ctx, - const char *name, struct nk_vec2 size) -{ - struct nk_window *win = nk_window_find(ctx, name); - if (!win) return; - win->bounds.w = size.x; - win->bounds.h = size.y; -} -NK_API void -nk_window_set_scroll(struct nk_context *ctx, nk_uint offset_x, nk_uint offset_y) -{ - struct nk_window *win; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) - return; - win = ctx->current; - win->scrollbar.x = offset_x; - win->scrollbar.y = offset_y; -} -NK_API void -nk_window_collapse(struct nk_context *ctx, const char *name, - enum nk_collapse_states c) -{ - int title_len; - nk_hash title_hash; - struct nk_window *win; - NK_ASSERT(ctx); - if (!ctx) return; - - title_len = (int)nk_strlen(name); - title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); - win = nk_find_window(ctx, title_hash, name); - if (!win) return; - if (c == NK_MINIMIZED) - win->flags |= NK_WINDOW_MINIMIZED; - else win->flags &= ~(nk_flags)NK_WINDOW_MINIMIZED; -} -NK_API void -nk_window_collapse_if(struct nk_context *ctx, const char *name, - enum nk_collapse_states c, int cond) -{ - NK_ASSERT(ctx); - if (!ctx || !cond) return; - nk_window_collapse(ctx, name, c); -} -NK_API void -nk_window_show(struct nk_context *ctx, const char *name, enum nk_show_states s) -{ - int title_len; - nk_hash title_hash; - struct nk_window *win; - NK_ASSERT(ctx); - if (!ctx) return; - - title_len = (int)nk_strlen(name); - title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); - win = nk_find_window(ctx, title_hash, name); - if (!win) return; - if (s == NK_HIDDEN) { - win->flags |= NK_WINDOW_HIDDEN; - } else win->flags &= ~(nk_flags)NK_WINDOW_HIDDEN; -} -NK_API void -nk_window_show_if(struct nk_context *ctx, const char *name, - enum nk_show_states s, int cond) -{ - NK_ASSERT(ctx); - if (!ctx || !cond) return; - nk_window_show(ctx, name, s); -} - -NK_API void -nk_window_set_focus(struct nk_context *ctx, const char *name) -{ - int title_len; - nk_hash title_hash; - struct nk_window *win; - NK_ASSERT(ctx); - if (!ctx) return; - - title_len = (int)nk_strlen(name); - title_hash = nk_murmur_hash(name, (int)title_len, NK_WINDOW_TITLE); - win = nk_find_window(ctx, title_hash, name); - if (win && ctx->end != win) { - nk_remove_window(ctx, win); - nk_insert_window(ctx, win, NK_INSERT_BACK); - } - ctx->active = win; -} - - - - -/* =============================================================== - * - * POPUP - * - * ===============================================================*/ -NK_API nk_bool -nk_popup_begin(struct nk_context *ctx, enum nk_popup_type type, - const char *title, nk_flags flags, struct nk_rect rect) -{ - struct nk_window *popup; - struct nk_window *win; - struct nk_panel *panel; - - int title_len; - nk_hash title_hash; - nk_size allocated; - - NK_ASSERT(ctx); - NK_ASSERT(title); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - panel = win->layout; - NK_ASSERT(!(panel->type & NK_PANEL_SET_POPUP) && "popups are not allowed to have popups"); - (void)panel; - title_len = (int)nk_strlen(title); - title_hash = nk_murmur_hash(title, (int)title_len, NK_PANEL_POPUP); - - popup = win->popup.win; - if (!popup) { - popup = (struct nk_window*)nk_create_window(ctx); - popup->parent = win; - win->popup.win = popup; - win->popup.active = 0; - win->popup.type = NK_PANEL_POPUP; - } - - /* make sure we have correct popup */ - if (win->popup.name != title_hash) { - if (!win->popup.active) { - nk_zero(popup, sizeof(*popup)); - win->popup.name = title_hash; - win->popup.active = 1; - win->popup.type = NK_PANEL_POPUP; - } else return 0; - } - - /* popup position is local to window */ - ctx->current = popup; - rect.x += win->layout->clip.x; - rect.y += win->layout->clip.y; - - /* setup popup data */ - popup->parent = win; - popup->bounds = rect; - popup->seq = ctx->seq; - popup->layout = (struct nk_panel*)nk_create_panel(ctx); - popup->flags = flags; - popup->flags |= NK_WINDOW_BORDER; - if (type == NK_POPUP_DYNAMIC) - popup->flags |= NK_WINDOW_DYNAMIC; - - popup->buffer = win->buffer; - nk_start_popup(ctx, win); - allocated = ctx->memory.allocated; - nk_push_scissor(&popup->buffer, nk_null_rect); - - if (nk_panel_begin(ctx, title, NK_PANEL_POPUP)) { - /* popup is running therefore invalidate parent panels */ - struct nk_panel *root; - root = win->layout; - while (root) { - root->flags |= NK_WINDOW_ROM; - root->flags &= ~(nk_flags)NK_WINDOW_REMOVE_ROM; - root = root->parent; - } - win->popup.active = 1; - popup->layout->offset_x = &popup->scrollbar.x; - popup->layout->offset_y = &popup->scrollbar.y; - popup->layout->parent = win->layout; - return 1; - } else { - /* popup was closed/is invalid so cleanup */ - struct nk_panel *root; - root = win->layout; - while (root) { - root->flags |= NK_WINDOW_REMOVE_ROM; - root = root->parent; - } - win->popup.buf.active = 0; - win->popup.active = 0; - ctx->memory.allocated = allocated; - ctx->current = win; - nk_free_panel(ctx, popup->layout); - popup->layout = 0; - return 0; - } -} -NK_LIB nk_bool -nk_nonblock_begin(struct nk_context *ctx, - nk_flags flags, struct nk_rect body, struct nk_rect header, - enum nk_panel_type panel_type) -{ - struct nk_window *popup; - struct nk_window *win; - struct nk_panel *panel; - int is_active = nk_true; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - /* popups cannot have popups */ - win = ctx->current; - panel = win->layout; - NK_ASSERT(!(panel->type & NK_PANEL_SET_POPUP)); - (void)panel; - popup = win->popup.win; - if (!popup) { - /* create window for nonblocking popup */ - popup = (struct nk_window*)nk_create_window(ctx); - popup->parent = win; - win->popup.win = popup; - win->popup.type = panel_type; - nk_command_buffer_init(&popup->buffer, &ctx->memory, NK_CLIPPING_ON); - } else { - /* close the popup if user pressed outside or in the header */ - int pressed, in_body, in_header; -#ifdef NK_BUTTON_TRIGGER_ON_RELEASE - pressed = nk_input_is_mouse_released(&ctx->input, NK_BUTTON_LEFT); -#else - pressed = nk_input_is_mouse_pressed(&ctx->input, NK_BUTTON_LEFT); -#endif - in_body = nk_input_is_mouse_hovering_rect(&ctx->input, body); - in_header = nk_input_is_mouse_hovering_rect(&ctx->input, header); - if (pressed && (!in_body || in_header)) - is_active = nk_false; - } - win->popup.header = header; - - if (!is_active) { - /* remove read only mode from all parent panels */ - struct nk_panel *root = win->layout; - while (root) { - root->flags |= NK_WINDOW_REMOVE_ROM; - root = root->parent; - } - return is_active; - } - popup->bounds = body; - popup->parent = win; - popup->layout = (struct nk_panel*)nk_create_panel(ctx); - popup->flags = flags; - popup->flags |= NK_WINDOW_BORDER; - popup->flags |= NK_WINDOW_DYNAMIC; - popup->seq = ctx->seq; - win->popup.active = 1; - NK_ASSERT(popup->layout); - - nk_start_popup(ctx, win); - popup->buffer = win->buffer; - nk_push_scissor(&popup->buffer, nk_null_rect); - ctx->current = popup; - - nk_panel_begin(ctx, 0, panel_type); - win->buffer = popup->buffer; - popup->layout->parent = win->layout; - popup->layout->offset_x = &popup->scrollbar.x; - popup->layout->offset_y = &popup->scrollbar.y; - - /* set read only mode to all parent panels */ - {struct nk_panel *root; - root = win->layout; - while (root) { - root->flags |= NK_WINDOW_ROM; - root = root->parent; - }} - return is_active; -} -NK_API void -nk_popup_close(struct nk_context *ctx) -{ - struct nk_window *popup; - NK_ASSERT(ctx); - if (!ctx || !ctx->current) return; - - popup = ctx->current; - NK_ASSERT(popup->parent); - NK_ASSERT(popup->layout->type & NK_PANEL_SET_POPUP); - popup->flags |= NK_WINDOW_HIDDEN; -} -NK_API void -nk_popup_end(struct nk_context *ctx) -{ - struct nk_window *win; - struct nk_window *popup; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - popup = ctx->current; - if (!popup->parent) return; - win = popup->parent; - if (popup->flags & NK_WINDOW_HIDDEN) { - struct nk_panel *root; - root = win->layout; - while (root) { - root->flags |= NK_WINDOW_REMOVE_ROM; - root = root->parent; - } - win->popup.active = 0; - } - nk_push_scissor(&popup->buffer, nk_null_rect); - nk_end(ctx); - - win->buffer = popup->buffer; - nk_finish_popup(ctx, win); - ctx->current = win; - nk_push_scissor(&win->buffer, win->layout->clip); -} -NK_API void -nk_popup_get_scroll(struct nk_context *ctx, nk_uint *offset_x, nk_uint *offset_y) -{ - struct nk_window *popup; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - popup = ctx->current; - if (offset_x) - *offset_x = popup->scrollbar.x; - if (offset_y) - *offset_y = popup->scrollbar.y; -} -NK_API void -nk_popup_set_scroll(struct nk_context *ctx, nk_uint offset_x, nk_uint offset_y) -{ - struct nk_window *popup; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - popup = ctx->current; - popup->scrollbar.x = offset_x; - popup->scrollbar.y = offset_y; -} - - - - -/* ============================================================== - * - * CONTEXTUAL - * - * ===============================================================*/ -NK_API nk_bool -nk_contextual_begin(struct nk_context *ctx, nk_flags flags, struct nk_vec2 size, - struct nk_rect trigger_bounds) -{ - struct nk_window *win; - struct nk_window *popup; - struct nk_rect body; - - NK_STORAGE const struct nk_rect null_rect = {-1,-1,0,0}; - int is_clicked = 0; - int is_open = 0; - int ret = 0; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - ++win->popup.con_count; - if (ctx->current != ctx->active) - return 0; - - /* check if currently active contextual is active */ - popup = win->popup.win; - is_open = (popup && win->popup.type == NK_PANEL_CONTEXTUAL); - is_clicked = nk_input_mouse_clicked(&ctx->input, NK_BUTTON_RIGHT, trigger_bounds); - if (win->popup.active_con && win->popup.con_count != win->popup.active_con) - return 0; - if (!is_open && win->popup.active_con) - win->popup.active_con = 0; - if ((!is_open && !is_clicked)) - return 0; - - /* calculate contextual position on click */ - win->popup.active_con = win->popup.con_count; - if (is_clicked) { - body.x = ctx->input.mouse.pos.x; - body.y = ctx->input.mouse.pos.y; - } else { - body.x = popup->bounds.x; - body.y = popup->bounds.y; - } - body.w = size.x; - body.h = size.y; - - /* start nonblocking contextual popup */ - ret = nk_nonblock_begin(ctx, flags|NK_WINDOW_NO_SCROLLBAR, body, - null_rect, NK_PANEL_CONTEXTUAL); - if (ret) win->popup.type = NK_PANEL_CONTEXTUAL; - else { - win->popup.active_con = 0; - win->popup.type = NK_PANEL_NONE; - if (win->popup.win) - win->popup.win->flags = 0; - } - return ret; -} -NK_API nk_bool -nk_contextual_item_text(struct nk_context *ctx, const char *text, int len, - nk_flags alignment) -{ - struct nk_window *win; - const struct nk_input *in; - const struct nk_style *style; - - struct nk_rect bounds; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - style = &ctx->style; - state = nk_widget_fitting(&bounds, ctx, style->contextual_button.padding); - if (!state) return nk_false; - - in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - if (nk_do_button_text(&ctx->last_widget_state, &win->buffer, bounds, - text, len, alignment, NK_BUTTON_DEFAULT, &style->contextual_button, in, style->font)) { - nk_contextual_close(ctx); - return nk_true; - } - return nk_false; -} -NK_API nk_bool -nk_contextual_item_label(struct nk_context *ctx, const char *label, nk_flags align) -{ - return nk_contextual_item_text(ctx, label, nk_strlen(label), align); -} -NK_API nk_bool -nk_contextual_item_image_text(struct nk_context *ctx, struct nk_image img, - const char *text, int len, nk_flags align) -{ - struct nk_window *win; - const struct nk_input *in; - const struct nk_style *style; - - struct nk_rect bounds; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - style = &ctx->style; - state = nk_widget_fitting(&bounds, ctx, style->contextual_button.padding); - if (!state) return nk_false; - - in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - if (nk_do_button_text_image(&ctx->last_widget_state, &win->buffer, bounds, - img, text, len, align, NK_BUTTON_DEFAULT, &style->contextual_button, style->font, in)){ - nk_contextual_close(ctx); - return nk_true; - } - return nk_false; -} -NK_API nk_bool -nk_contextual_item_image_label(struct nk_context *ctx, struct nk_image img, - const char *label, nk_flags align) -{ - return nk_contextual_item_image_text(ctx, img, label, nk_strlen(label), align); -} -NK_API nk_bool -nk_contextual_item_symbol_text(struct nk_context *ctx, enum nk_symbol_type symbol, - const char *text, int len, nk_flags align) -{ - struct nk_window *win; - const struct nk_input *in; - const struct nk_style *style; - - struct nk_rect bounds; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - style = &ctx->style; - state = nk_widget_fitting(&bounds, ctx, style->contextual_button.padding); - if (!state) return nk_false; - - in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - if (nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer, bounds, - symbol, text, len, align, NK_BUTTON_DEFAULT, &style->contextual_button, style->font, in)) { - nk_contextual_close(ctx); - return nk_true; - } - return nk_false; -} -NK_API nk_bool -nk_contextual_item_symbol_label(struct nk_context *ctx, enum nk_symbol_type symbol, - const char *text, nk_flags align) -{ - return nk_contextual_item_symbol_text(ctx, symbol, text, nk_strlen(text), align); -} -NK_API void -nk_contextual_close(struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) return; - nk_popup_close(ctx); -} -NK_API void -nk_contextual_end(struct nk_context *ctx) -{ - struct nk_window *popup; - struct nk_panel *panel; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) return; - - popup = ctx->current; - panel = popup->layout; - NK_ASSERT(popup->parent); - NK_ASSERT(panel->type & NK_PANEL_SET_POPUP); - if (panel->flags & NK_WINDOW_DYNAMIC) { - /* Close behavior - This is a bit of a hack solution since we do not know before we end our popup - how big it will be. We therefore do not directly know when a - click outside the non-blocking popup must close it at that direct frame. - Instead it will be closed in the next frame.*/ - struct nk_rect body = {0,0,0,0}; - if (panel->at_y < (panel->bounds.y + panel->bounds.h)) { - struct nk_vec2 padding = nk_panel_get_padding(&ctx->style, panel->type); - body = panel->bounds; - body.y = (panel->at_y + panel->footer_height + panel->border + padding.y + panel->row.height); - body.h = (panel->bounds.y + panel->bounds.h) - body.y; - } - {int pressed = nk_input_is_mouse_pressed(&ctx->input, NK_BUTTON_LEFT); - int in_body = nk_input_is_mouse_hovering_rect(&ctx->input, body); - if (pressed && in_body) - popup->flags |= NK_WINDOW_HIDDEN; - } - } - if (popup->flags & NK_WINDOW_HIDDEN) - popup->seq = 0; - nk_popup_end(ctx); - return; -} - - - - - -/* =============================================================== - * - * MENU - * - * ===============================================================*/ -NK_API void -nk_menubar_begin(struct nk_context *ctx) -{ - struct nk_panel *layout; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - layout = ctx->current->layout; - NK_ASSERT(layout->at_y == layout->bounds.y); - /* if this assert triggers you allocated space between nk_begin and nk_menubar_begin. - If you want a menubar the first nuklear function after `nk_begin` has to be a - `nk_menubar_begin` call. Inside the menubar you then have to allocate space for - widgets (also supports multiple rows). - Example: - if (nk_begin(...)) { - nk_menubar_begin(...); - nk_layout_xxxx(...); - nk_button(...); - nk_layout_xxxx(...); - nk_button(...); - nk_menubar_end(...); - } - nk_end(...); - */ - if (layout->flags & NK_WINDOW_HIDDEN || layout->flags & NK_WINDOW_MINIMIZED) - return; - - layout->menu.x = layout->at_x; - layout->menu.y = layout->at_y + layout->row.height; - layout->menu.w = layout->bounds.w; - layout->menu.offset.x = *layout->offset_x; - layout->menu.offset.y = *layout->offset_y; - *layout->offset_y = 0; -} -NK_API void -nk_menubar_end(struct nk_context *ctx) -{ - struct nk_window *win; - struct nk_panel *layout; - struct nk_command_buffer *out; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - out = &win->buffer; - layout = win->layout; - if (layout->flags & NK_WINDOW_HIDDEN || layout->flags & NK_WINDOW_MINIMIZED) - return; - - layout->menu.h = layout->at_y - layout->menu.y; - layout->menu.h += layout->row.height + ctx->style.window.spacing.y; - - layout->bounds.y += layout->menu.h; - layout->bounds.h -= layout->menu.h; - - *layout->offset_x = layout->menu.offset.x; - *layout->offset_y = layout->menu.offset.y; - layout->at_y = layout->bounds.y - layout->row.height; - - layout->clip.y = layout->bounds.y; - layout->clip.h = layout->bounds.h; - nk_push_scissor(out, layout->clip); -} -NK_INTERN int -nk_menu_begin(struct nk_context *ctx, struct nk_window *win, - const char *id, int is_clicked, struct nk_rect header, struct nk_vec2 size) -{ - int is_open = 0; - int is_active = 0; - struct nk_rect body; - struct nk_window *popup; - nk_hash hash = nk_murmur_hash(id, (int)nk_strlen(id), NK_PANEL_MENU); - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - body.x = header.x; - body.w = size.x; - body.y = header.y + header.h; - body.h = size.y; - - popup = win->popup.win; - is_open = popup ? nk_true : nk_false; - is_active = (popup && (win->popup.name == hash) && win->popup.type == NK_PANEL_MENU); - if ((is_clicked && is_open && !is_active) || (is_open && !is_active) || - (!is_open && !is_active && !is_clicked)) return 0; - if (!nk_nonblock_begin(ctx, NK_WINDOW_NO_SCROLLBAR, body, header, NK_PANEL_MENU)) - return 0; - - win->popup.type = NK_PANEL_MENU; - win->popup.name = hash; - return 1; -} -NK_API nk_bool -nk_menu_begin_text(struct nk_context *ctx, const char *title, int len, - nk_flags align, struct nk_vec2 size) -{ - struct nk_window *win; - const struct nk_input *in; - struct nk_rect header; - int is_clicked = nk_false; - nk_flags state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - state = nk_widget(&header, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || win->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - if (nk_do_button_text(&ctx->last_widget_state, &win->buffer, header, - title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in, ctx->style.font)) - is_clicked = nk_true; - return nk_menu_begin(ctx, win, title, is_clicked, header, size); -} -NK_API nk_bool nk_menu_begin_label(struct nk_context *ctx, - const char *text, nk_flags align, struct nk_vec2 size) -{ - return nk_menu_begin_text(ctx, text, nk_strlen(text), align, size); -} -NK_API nk_bool -nk_menu_begin_image(struct nk_context *ctx, const char *id, struct nk_image img, - struct nk_vec2 size) -{ - struct nk_window *win; - struct nk_rect header; - const struct nk_input *in; - int is_clicked = nk_false; - nk_flags state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - state = nk_widget(&header, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - if (nk_do_button_image(&ctx->last_widget_state, &win->buffer, header, - img, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in)) - is_clicked = nk_true; - return nk_menu_begin(ctx, win, id, is_clicked, header, size); -} -NK_API nk_bool -nk_menu_begin_symbol(struct nk_context *ctx, const char *id, - enum nk_symbol_type sym, struct nk_vec2 size) -{ - struct nk_window *win; - const struct nk_input *in; - struct nk_rect header; - int is_clicked = nk_false; - nk_flags state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - state = nk_widget(&header, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - if (nk_do_button_symbol(&ctx->last_widget_state, &win->buffer, header, - sym, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in, ctx->style.font)) - is_clicked = nk_true; - return nk_menu_begin(ctx, win, id, is_clicked, header, size); -} -NK_API nk_bool -nk_menu_begin_image_text(struct nk_context *ctx, const char *title, int len, - nk_flags align, struct nk_image img, struct nk_vec2 size) -{ - struct nk_window *win; - struct nk_rect header; - const struct nk_input *in; - int is_clicked = nk_false; - nk_flags state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - state = nk_widget(&header, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - if (nk_do_button_text_image(&ctx->last_widget_state, &win->buffer, - header, img, title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button, - ctx->style.font, in)) - is_clicked = nk_true; - return nk_menu_begin(ctx, win, title, is_clicked, header, size); -} -NK_API nk_bool -nk_menu_begin_image_label(struct nk_context *ctx, - const char *title, nk_flags align, struct nk_image img, struct nk_vec2 size) -{ - return nk_menu_begin_image_text(ctx, title, nk_strlen(title), align, img, size); -} -NK_API nk_bool -nk_menu_begin_symbol_text(struct nk_context *ctx, const char *title, int len, - nk_flags align, enum nk_symbol_type sym, struct nk_vec2 size) -{ - struct nk_window *win; - struct nk_rect header; - const struct nk_input *in; - int is_clicked = nk_false; - nk_flags state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - state = nk_widget(&header, ctx); - if (!state) return 0; - - in = (state == NK_WIDGET_ROM || win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - if (nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer, - header, sym, title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button, - ctx->style.font, in)) is_clicked = nk_true; - return nk_menu_begin(ctx, win, title, is_clicked, header, size); -} -NK_API nk_bool -nk_menu_begin_symbol_label(struct nk_context *ctx, - const char *title, nk_flags align, enum nk_symbol_type sym, struct nk_vec2 size ) -{ - return nk_menu_begin_symbol_text(ctx, title, nk_strlen(title), align,sym,size); -} -NK_API nk_bool -nk_menu_item_text(struct nk_context *ctx, const char *title, int len, nk_flags align) -{ - return nk_contextual_item_text(ctx, title, len, align); -} -NK_API nk_bool -nk_menu_item_label(struct nk_context *ctx, const char *label, nk_flags align) -{ - return nk_contextual_item_label(ctx, label, align); -} -NK_API nk_bool -nk_menu_item_image_label(struct nk_context *ctx, struct nk_image img, - const char *label, nk_flags align) -{ - return nk_contextual_item_image_label(ctx, img, label, align); -} -NK_API nk_bool -nk_menu_item_image_text(struct nk_context *ctx, struct nk_image img, - const char *text, int len, nk_flags align) -{ - return nk_contextual_item_image_text(ctx, img, text, len, align); -} -NK_API nk_bool nk_menu_item_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym, - const char *text, int len, nk_flags align) -{ - return nk_contextual_item_symbol_text(ctx, sym, text, len, align); -} -NK_API nk_bool nk_menu_item_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym, - const char *label, nk_flags align) -{ - return nk_contextual_item_symbol_label(ctx, sym, label, align); -} -NK_API void nk_menu_close(struct nk_context *ctx) -{ - nk_contextual_close(ctx); -} -NK_API void -nk_menu_end(struct nk_context *ctx) -{ - nk_contextual_end(ctx); -} - - - - - -/* =============================================================== - * - * LAYOUT - * - * ===============================================================*/ -NK_API void -nk_layout_set_min_row_height(struct nk_context *ctx, float height) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - layout->row.min_height = height; -} -NK_API void -nk_layout_reset_min_row_height(struct nk_context *ctx) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - layout->row.min_height = ctx->style.font->height; - layout->row.min_height += ctx->style.text.padding.y*2; - layout->row.min_height += ctx->style.window.min_row_height_padding*2; -} -NK_LIB float -nk_layout_row_calculate_usable_space(const struct nk_style *style, enum nk_panel_type type, - float total_space, int columns) -{ - float panel_spacing; - float panel_space; - - struct nk_vec2 spacing; - - NK_UNUSED(type); - - spacing = style->window.spacing; - - /* calculate the usable panel space */ - panel_spacing = (float)NK_MAX(columns - 1, 0) * spacing.x; - panel_space = total_space - panel_spacing; - return panel_space; -} -NK_LIB void -nk_panel_layout(const struct nk_context *ctx, struct nk_window *win, - float height, int cols) -{ - struct nk_panel *layout; - const struct nk_style *style; - struct nk_command_buffer *out; - - struct nk_vec2 item_spacing; - struct nk_color color; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - /* prefetch some configuration data */ - layout = win->layout; - style = &ctx->style; - out = &win->buffer; - color = style->window.background; - item_spacing = style->window.spacing; - - /* if one of these triggers you forgot to add an `if` condition around either - a window, group, popup, combobox or contextual menu `begin` and `end` block. - Example: - if (nk_begin(...) {...} nk_end(...); or - if (nk_group_begin(...) { nk_group_end(...);} */ - NK_ASSERT(!(layout->flags & NK_WINDOW_MINIMIZED)); - NK_ASSERT(!(layout->flags & NK_WINDOW_HIDDEN)); - NK_ASSERT(!(layout->flags & NK_WINDOW_CLOSED)); - - /* update the current row and set the current row layout */ - layout->row.index = 0; - layout->at_y += layout->row.height; - layout->row.columns = cols; - if (height == 0.0f) - layout->row.height = NK_MAX(height, layout->row.min_height) + item_spacing.y; - else layout->row.height = height + item_spacing.y; - - layout->row.item_offset = 0; - if (layout->flags & NK_WINDOW_DYNAMIC) { - /* draw background for dynamic panels */ - struct nk_rect background; - background.x = win->bounds.x; - background.w = win->bounds.w; - background.y = layout->at_y - 1.0f; - background.h = layout->row.height + 1.0f; - nk_fill_rect(out, background, 0, color); - } -} -NK_LIB void -nk_row_layout(struct nk_context *ctx, enum nk_layout_format fmt, - float height, int cols, int width) -{ - /* update the current row and set the current row layout */ - struct nk_window *win; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - nk_panel_layout(ctx, win, height, cols); - if (fmt == NK_DYNAMIC) - win->layout->row.type = NK_LAYOUT_DYNAMIC_FIXED; - else win->layout->row.type = NK_LAYOUT_STATIC_FIXED; - - win->layout->row.ratio = 0; - win->layout->row.filled = 0; - win->layout->row.item_offset = 0; - win->layout->row.item_width = (float)width; -} -NK_API float -nk_layout_ratio_from_pixel(struct nk_context *ctx, float pixel_width) -{ - struct nk_window *win; - NK_ASSERT(ctx); - NK_ASSERT(pixel_width); - if (!ctx || !ctx->current || !ctx->current->layout) return 0; - win = ctx->current; - return NK_CLAMP(0.0f, pixel_width/win->bounds.x, 1.0f); -} -NK_API void -nk_layout_row_dynamic(struct nk_context *ctx, float height, int cols) -{ - nk_row_layout(ctx, NK_DYNAMIC, height, cols, 0); -} -NK_API void -nk_layout_row_static(struct nk_context *ctx, float height, int item_width, int cols) -{ - nk_row_layout(ctx, NK_STATIC, height, cols, item_width); -} -NK_API void -nk_layout_row_begin(struct nk_context *ctx, enum nk_layout_format fmt, - float row_height, int cols) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - nk_panel_layout(ctx, win, row_height, cols); - if (fmt == NK_DYNAMIC) - layout->row.type = NK_LAYOUT_DYNAMIC_ROW; - else layout->row.type = NK_LAYOUT_STATIC_ROW; - - layout->row.ratio = 0; - layout->row.filled = 0; - layout->row.item_width = 0; - layout->row.item_offset = 0; - layout->row.columns = cols; -} -NK_API void -nk_layout_row_push(struct nk_context *ctx, float ratio_or_width) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - NK_ASSERT(layout->row.type == NK_LAYOUT_STATIC_ROW || layout->row.type == NK_LAYOUT_DYNAMIC_ROW); - if (layout->row.type != NK_LAYOUT_STATIC_ROW && layout->row.type != NK_LAYOUT_DYNAMIC_ROW) - return; - - if (layout->row.type == NK_LAYOUT_DYNAMIC_ROW) { - float ratio = ratio_or_width; - if ((ratio + layout->row.filled) > 1.0f) return; - if (ratio > 0.0f) - layout->row.item_width = NK_SATURATE(ratio); - else layout->row.item_width = 1.0f - layout->row.filled; - } else layout->row.item_width = ratio_or_width; -} -NK_API void -nk_layout_row_end(struct nk_context *ctx) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - NK_ASSERT(layout->row.type == NK_LAYOUT_STATIC_ROW || layout->row.type == NK_LAYOUT_DYNAMIC_ROW); - if (layout->row.type != NK_LAYOUT_STATIC_ROW && layout->row.type != NK_LAYOUT_DYNAMIC_ROW) - return; - layout->row.item_width = 0; - layout->row.item_offset = 0; -} -NK_API void -nk_layout_row(struct nk_context *ctx, enum nk_layout_format fmt, - float height, int cols, const float *ratio) -{ - int i; - int n_undef = 0; - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - nk_panel_layout(ctx, win, height, cols); - if (fmt == NK_DYNAMIC) { - /* calculate width of undefined widget ratios */ - float r = 0; - layout->row.ratio = ratio; - for (i = 0; i < cols; ++i) { - if (ratio[i] < 0.0f) - n_undef++; - else r += ratio[i]; - } - r = NK_SATURATE(1.0f - r); - layout->row.type = NK_LAYOUT_DYNAMIC; - layout->row.item_width = (r > 0 && n_undef > 0) ? (r / (float)n_undef):0; - } else { - layout->row.ratio = ratio; - layout->row.type = NK_LAYOUT_STATIC; - layout->row.item_width = 0; - layout->row.item_offset = 0; - } - layout->row.item_offset = 0; - layout->row.filled = 0; -} -NK_API void -nk_layout_row_template_begin(struct nk_context *ctx, float height) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - nk_panel_layout(ctx, win, height, 1); - layout->row.type = NK_LAYOUT_TEMPLATE; - layout->row.columns = 0; - layout->row.ratio = 0; - layout->row.item_width = 0; - layout->row.item_height = 0; - layout->row.item_offset = 0; - layout->row.filled = 0; - layout->row.item.x = 0; - layout->row.item.y = 0; - layout->row.item.w = 0; - layout->row.item.h = 0; -} -NK_API void -nk_layout_row_template_push_dynamic(struct nk_context *ctx) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE); - NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS); - if (layout->row.type != NK_LAYOUT_TEMPLATE) return; - if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return; - layout->row.templates[layout->row.columns++] = -1.0f; -} -NK_API void -nk_layout_row_template_push_variable(struct nk_context *ctx, float min_width) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE); - NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS); - if (layout->row.type != NK_LAYOUT_TEMPLATE) return; - if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return; - layout->row.templates[layout->row.columns++] = -min_width; -} -NK_API void -nk_layout_row_template_push_static(struct nk_context *ctx, float width) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE); - NK_ASSERT(layout->row.columns < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS); - if (layout->row.type != NK_LAYOUT_TEMPLATE) return; - if (layout->row.columns >= NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS) return; - layout->row.templates[layout->row.columns++] = width; -} -NK_API void -nk_layout_row_template_end(struct nk_context *ctx) -{ - struct nk_window *win; - struct nk_panel *layout; - - int i = 0; - int variable_count = 0; - int min_variable_count = 0; - float min_fixed_width = 0.0f; - float total_fixed_width = 0.0f; - float max_variable_width = 0.0f; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - NK_ASSERT(layout->row.type == NK_LAYOUT_TEMPLATE); - if (layout->row.type != NK_LAYOUT_TEMPLATE) return; - for (i = 0; i < layout->row.columns; ++i) { - float width = layout->row.templates[i]; - if (width >= 0.0f) { - total_fixed_width += width; - min_fixed_width += width; - } else if (width < -1.0f) { - width = -width; - total_fixed_width += width; - max_variable_width = NK_MAX(max_variable_width, width); - variable_count++; - } else { - min_variable_count++; - variable_count++; - } - } - if (variable_count) { - float space = nk_layout_row_calculate_usable_space(&ctx->style, layout->type, - layout->bounds.w, layout->row.columns); - float var_width = (NK_MAX(space-min_fixed_width,0.0f)) / (float)variable_count; - int enough_space = var_width >= max_variable_width; - if (!enough_space) - var_width = (NK_MAX(space-total_fixed_width,0)) / (float)min_variable_count; - for (i = 0; i < layout->row.columns; ++i) { - float *width = &layout->row.templates[i]; - *width = (*width >= 0.0f)? *width: (*width < -1.0f && !enough_space)? -(*width): var_width; - } - } -} -NK_API void -nk_layout_space_begin(struct nk_context *ctx, enum nk_layout_format fmt, - float height, int widget_count) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - nk_panel_layout(ctx, win, height, widget_count); - if (fmt == NK_STATIC) - layout->row.type = NK_LAYOUT_STATIC_FREE; - else layout->row.type = NK_LAYOUT_DYNAMIC_FREE; - - layout->row.ratio = 0; - layout->row.filled = 0; - layout->row.item_width = 0; - layout->row.item_offset = 0; -} -NK_API void -nk_layout_space_end(struct nk_context *ctx) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - layout->row.item_width = 0; - layout->row.item_height = 0; - layout->row.item_offset = 0; - nk_zero(&layout->row.item, sizeof(layout->row.item)); -} -NK_API void -nk_layout_space_push(struct nk_context *ctx, struct nk_rect rect) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - layout->row.item = rect; -} -NK_API struct nk_rect -nk_layout_space_bounds(struct nk_context *ctx) -{ - struct nk_rect ret; - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - win = ctx->current; - layout = win->layout; - - ret.x = layout->clip.x; - ret.y = layout->clip.y; - ret.w = layout->clip.w; - ret.h = layout->row.height; - return ret; -} -NK_API struct nk_rect -nk_layout_widget_bounds(struct nk_context *ctx) -{ - struct nk_rect ret; - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - win = ctx->current; - layout = win->layout; - - ret.x = layout->at_x; - ret.y = layout->at_y; - ret.w = layout->bounds.w - NK_MAX(layout->at_x - layout->bounds.x,0); - ret.h = layout->row.height; - return ret; -} -NK_API struct nk_vec2 -nk_layout_space_to_screen(struct nk_context *ctx, struct nk_vec2 ret) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - win = ctx->current; - layout = win->layout; - - ret.x += layout->at_x - (float)*layout->offset_x; - ret.y += layout->at_y - (float)*layout->offset_y; - return ret; -} -NK_API struct nk_vec2 -nk_layout_space_to_local(struct nk_context *ctx, struct nk_vec2 ret) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - win = ctx->current; - layout = win->layout; - - ret.x += -layout->at_x + (float)*layout->offset_x; - ret.y += -layout->at_y + (float)*layout->offset_y; - return ret; -} -NK_API struct nk_rect -nk_layout_space_rect_to_screen(struct nk_context *ctx, struct nk_rect ret) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - win = ctx->current; - layout = win->layout; - - ret.x += layout->at_x - (float)*layout->offset_x; - ret.y += layout->at_y - (float)*layout->offset_y; - return ret; -} -NK_API struct nk_rect -nk_layout_space_rect_to_local(struct nk_context *ctx, struct nk_rect ret) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - win = ctx->current; - layout = win->layout; - - ret.x += -layout->at_x + (float)*layout->offset_x; - ret.y += -layout->at_y + (float)*layout->offset_y; - return ret; -} -NK_LIB void -nk_panel_alloc_row(const struct nk_context *ctx, struct nk_window *win) -{ - struct nk_panel *layout = win->layout; - struct nk_vec2 spacing = ctx->style.window.spacing; - const float row_height = layout->row.height - spacing.y; - nk_panel_layout(ctx, win, row_height, layout->row.columns); -} -NK_LIB void -nk_layout_widget_space(struct nk_rect *bounds, const struct nk_context *ctx, - struct nk_window *win, int modify) -{ - struct nk_panel *layout; - const struct nk_style *style; - - struct nk_vec2 spacing; - - float item_offset = 0; - float item_width = 0; - float item_spacing = 0; - float panel_space = 0; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - style = &ctx->style; - NK_ASSERT(bounds); - - spacing = style->window.spacing; - panel_space = nk_layout_row_calculate_usable_space(&ctx->style, layout->type, - layout->bounds.w, layout->row.columns); - - #define NK_FRAC(x) (x - (float)(int)x) /* will be used to remove fookin gaps */ - /* calculate the width of one item inside the current layout space */ - switch (layout->row.type) { - case NK_LAYOUT_DYNAMIC_FIXED: { - /* scaling fixed size widgets item width */ - float w = NK_MAX(1.0f,panel_space) / (float)layout->row.columns; - item_offset = (float)layout->row.index * w; - item_width = w + NK_FRAC(item_offset); - item_spacing = (float)layout->row.index * spacing.x; - } break; - case NK_LAYOUT_DYNAMIC_ROW: { - /* scaling single ratio widget width */ - float w = layout->row.item_width * panel_space; - item_offset = layout->row.item_offset; - item_width = w + NK_FRAC(item_offset); - item_spacing = 0; - - if (modify) { - layout->row.item_offset += w + spacing.x; - layout->row.filled += layout->row.item_width; - layout->row.index = 0; - } - } break; - case NK_LAYOUT_DYNAMIC_FREE: { - /* panel width depended free widget placing */ - bounds->x = layout->at_x + (layout->bounds.w * layout->row.item.x); - bounds->x -= (float)*layout->offset_x; - bounds->y = layout->at_y + (layout->row.height * layout->row.item.y); - bounds->y -= (float)*layout->offset_y; - bounds->w = layout->bounds.w * layout->row.item.w + NK_FRAC(bounds->x); - bounds->h = layout->row.height * layout->row.item.h + NK_FRAC(bounds->y); - return; - } - case NK_LAYOUT_DYNAMIC: { - /* scaling arrays of panel width ratios for every widget */ - float ratio, w; - NK_ASSERT(layout->row.ratio); - ratio = (layout->row.ratio[layout->row.index] < 0) ? - layout->row.item_width : layout->row.ratio[layout->row.index]; - - w = (ratio * panel_space); - item_spacing = (float)layout->row.index * spacing.x; - item_offset = layout->row.item_offset; - item_width = w + NK_FRAC(item_offset); - - if (modify) { - layout->row.item_offset += w; - layout->row.filled += ratio; - } - } break; - case NK_LAYOUT_STATIC_FIXED: { - /* non-scaling fixed widgets item width */ - item_width = layout->row.item_width; - item_offset = (float)layout->row.index * item_width; - item_spacing = (float)layout->row.index * spacing.x; - } break; - case NK_LAYOUT_STATIC_ROW: { - /* scaling single ratio widget width */ - item_width = layout->row.item_width; - item_offset = layout->row.item_offset; - item_spacing = (float)layout->row.index * spacing.x; - if (modify) layout->row.item_offset += item_width; - } break; - case NK_LAYOUT_STATIC_FREE: { - /* free widget placing */ - bounds->x = layout->at_x + layout->row.item.x; - bounds->w = layout->row.item.w; - if (((bounds->x + bounds->w) > layout->max_x) && modify) - layout->max_x = (bounds->x + bounds->w); - bounds->x -= (float)*layout->offset_x; - bounds->y = layout->at_y + layout->row.item.y; - bounds->y -= (float)*layout->offset_y; - bounds->h = layout->row.item.h; - return; - } - case NK_LAYOUT_STATIC: { - /* non-scaling array of panel pixel width for every widget */ - item_spacing = (float)layout->row.index * spacing.x; - item_width = layout->row.ratio[layout->row.index]; - item_offset = layout->row.item_offset; - if (modify) layout->row.item_offset += item_width; - } break; - case NK_LAYOUT_TEMPLATE: { - /* stretchy row layout with combined dynamic/static widget width*/ - float w; - NK_ASSERT(layout->row.index < layout->row.columns); - NK_ASSERT(layout->row.index < NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS); - w = layout->row.templates[layout->row.index]; - item_offset = layout->row.item_offset; - item_width = w + NK_FRAC(item_offset); - item_spacing = (float)layout->row.index * spacing.x; - if (modify) layout->row.item_offset += w; - } break; - #undef NK_FRAC - default: NK_ASSERT(0); break; - }; - - /* set the bounds of the newly allocated widget */ - bounds->w = item_width; - bounds->h = layout->row.height - spacing.y; - bounds->y = layout->at_y - (float)*layout->offset_y; - bounds->x = layout->at_x + item_offset + item_spacing; - if (((bounds->x + bounds->w) > layout->max_x) && modify) - layout->max_x = bounds->x + bounds->w; - bounds->x -= (float)*layout->offset_x; -} -NK_LIB void -nk_panel_alloc_space(struct nk_rect *bounds, const struct nk_context *ctx) -{ - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - /* check if the end of the row has been hit and begin new row if so */ - win = ctx->current; - layout = win->layout; - if (layout->row.index >= layout->row.columns) - nk_panel_alloc_row(ctx, win); - - /* calculate widget position and size */ - nk_layout_widget_space(bounds, ctx, win, nk_true); - layout->row.index++; -} -NK_LIB void -nk_layout_peek(struct nk_rect *bounds, struct nk_context *ctx) -{ - float y; - int index; - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) { - *bounds = nk_rect(0,0,0,0); - return; - } - - win = ctx->current; - layout = win->layout; - y = layout->at_y; - index = layout->row.index; - if (layout->row.index >= layout->row.columns) { - layout->at_y += layout->row.height; - layout->row.index = 0; - } - nk_layout_widget_space(bounds, ctx, win, nk_false); - if (!layout->row.index) { - bounds->x -= layout->row.item_offset; - } - layout->at_y = y; - layout->row.index = index; -} -NK_API void -nk_spacer(struct nk_context *ctx ) -{ - struct nk_rect dummy_rect = { 0, 0, 0, 0 }; - nk_panel_alloc_space( &dummy_rect, ctx ); -} - - - - -/* =============================================================== - * - * TREE - * - * ===============================================================*/ -NK_INTERN int -nk_tree_state_base(struct nk_context *ctx, enum nk_tree_type type, - struct nk_image *img, const char *title, enum nk_collapse_states *state) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_style *style; - struct nk_command_buffer *out; - const struct nk_input *in; - const struct nk_style_button *button; - enum nk_symbol_type symbol; - float row_height; - - struct nk_vec2 item_spacing; - struct nk_rect header = {0,0,0,0}; - struct nk_rect sym = {0,0,0,0}; - struct nk_text text; - - nk_flags ws = 0; - enum nk_widget_layout_states widget_state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - /* cache some data */ - win = ctx->current; - layout = win->layout; - out = &win->buffer; - style = &ctx->style; - item_spacing = style->window.spacing; - - /* calculate header bounds and draw background */ - row_height = style->font->height + 2 * style->tab.padding.y; - nk_layout_set_min_row_height(ctx, row_height); - nk_layout_row_dynamic(ctx, row_height, 1); - nk_layout_reset_min_row_height(ctx); - - widget_state = nk_widget(&header, ctx); - if (type == NK_TREE_TAB) { - const struct nk_style_item *background = &style->tab.background; - - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(out, header, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(out, header, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(out, header, 0, style->tab.border_color); - nk_fill_rect(out, nk_shrink_rect(header, style->tab.border), - style->tab.rounding, background->data.color); - break; - } - } else text.background = style->window.background; - - /* update node state */ - in = (!(layout->flags & NK_WINDOW_ROM)) ? &ctx->input: 0; - in = (in && widget_state == NK_WIDGET_VALID) ? &ctx->input : 0; - if (nk_button_behavior(&ws, header, in, NK_BUTTON_DEFAULT)) - *state = (*state == NK_MAXIMIZED) ? NK_MINIMIZED : NK_MAXIMIZED; - - /* select correct button style */ - if (*state == NK_MAXIMIZED) { - symbol = style->tab.sym_maximize; - if (type == NK_TREE_TAB) - button = &style->tab.tab_maximize_button; - else button = &style->tab.node_maximize_button; - } else { - symbol = style->tab.sym_minimize; - if (type == NK_TREE_TAB) - button = &style->tab.tab_minimize_button; - else button = &style->tab.node_minimize_button; - } - - {/* draw triangle button */ - sym.w = sym.h = style->font->height; - sym.y = header.y + style->tab.padding.y; - sym.x = header.x + style->tab.padding.x; - nk_do_button_symbol(&ws, &win->buffer, sym, symbol, NK_BUTTON_DEFAULT, - button, 0, style->font); - - if (img) { - /* draw optional image icon */ - sym.x = sym.x + sym.w + 4 * item_spacing.x; - nk_draw_image(&win->buffer, sym, img, nk_white); - sym.w = style->font->height + style->tab.spacing.x;} - } - - {/* draw label */ - struct nk_rect label; - header.w = NK_MAX(header.w, sym.w + item_spacing.x); - label.x = sym.x + sym.w + item_spacing.x; - label.y = sym.y; - label.w = header.w - (sym.w + item_spacing.y + style->tab.indent); - label.h = style->font->height; - text.text = style->tab.text; - text.padding = nk_vec2(0,0); - nk_widget_text(out, label, title, nk_strlen(title), &text, - NK_TEXT_LEFT, style->font);} - - /* increase x-axis cursor widget position pointer */ - if (*state == NK_MAXIMIZED) { - layout->at_x = header.x + (float)*layout->offset_x + style->tab.indent; - layout->bounds.w = NK_MAX(layout->bounds.w, style->tab.indent); - layout->bounds.w -= (style->tab.indent + style->window.padding.x); - layout->row.tree_depth++; - return nk_true; - } else return nk_false; -} -NK_INTERN int -nk_tree_base(struct nk_context *ctx, enum nk_tree_type type, - struct nk_image *img, const char *title, enum nk_collapse_states initial_state, - const char *hash, int len, int line) -{ - struct nk_window *win = ctx->current; - int title_len = 0; - nk_hash tree_hash = 0; - nk_uint *state = 0; - - /* retrieve tree state from internal widget state tables */ - if (!hash) { - title_len = (int)nk_strlen(title); - tree_hash = nk_murmur_hash(title, (int)title_len, (nk_hash)line); - } else tree_hash = nk_murmur_hash(hash, len, (nk_hash)line); - state = nk_find_value(win, tree_hash); - if (!state) { - state = nk_add_value(ctx, win, tree_hash, 0); - *state = initial_state; - } - return nk_tree_state_base(ctx, type, img, title, (enum nk_collapse_states*)state); -} -NK_API nk_bool -nk_tree_state_push(struct nk_context *ctx, enum nk_tree_type type, - const char *title, enum nk_collapse_states *state) -{ - return nk_tree_state_base(ctx, type, 0, title, state); -} -NK_API nk_bool -nk_tree_state_image_push(struct nk_context *ctx, enum nk_tree_type type, - struct nk_image img, const char *title, enum nk_collapse_states *state) -{ - return nk_tree_state_base(ctx, type, &img, title, state); -} -NK_API void -nk_tree_state_pop(struct nk_context *ctx) -{ - struct nk_window *win = 0; - struct nk_panel *layout = 0; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - layout->at_x -= ctx->style.tab.indent + (float)*layout->offset_x; - layout->bounds.w += ctx->style.tab.indent + ctx->style.window.padding.x; - NK_ASSERT(layout->row.tree_depth); - layout->row.tree_depth--; -} -NK_API nk_bool -nk_tree_push_hashed(struct nk_context *ctx, enum nk_tree_type type, - const char *title, enum nk_collapse_states initial_state, - const char *hash, int len, int line) -{ - return nk_tree_base(ctx, type, 0, title, initial_state, hash, len, line); -} -NK_API nk_bool -nk_tree_image_push_hashed(struct nk_context *ctx, enum nk_tree_type type, - struct nk_image img, const char *title, enum nk_collapse_states initial_state, - const char *hash, int len,int seed) -{ - return nk_tree_base(ctx, type, &img, title, initial_state, hash, len, seed); -} -NK_API void -nk_tree_pop(struct nk_context *ctx) -{ - nk_tree_state_pop(ctx); -} -NK_INTERN int -nk_tree_element_image_push_hashed_base(struct nk_context *ctx, enum nk_tree_type type, - struct nk_image *img, const char *title, int title_len, - enum nk_collapse_states *state, nk_bool *selected) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_style *style; - struct nk_command_buffer *out; - const struct nk_input *in; - const struct nk_style_button *button; - enum nk_symbol_type symbol; - float row_height; - struct nk_vec2 padding; - - int text_len; - float text_width; - - struct nk_vec2 item_spacing; - struct nk_rect header = {0,0,0,0}; - struct nk_rect sym = {0,0,0,0}; - - nk_flags ws = 0; - enum nk_widget_layout_states widget_state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - /* cache some data */ - win = ctx->current; - layout = win->layout; - out = &win->buffer; - style = &ctx->style; - item_spacing = style->window.spacing; - padding = style->selectable.padding; - - /* calculate header bounds and draw background */ - row_height = style->font->height + 2 * style->tab.padding.y; - nk_layout_set_min_row_height(ctx, row_height); - nk_layout_row_dynamic(ctx, row_height, 1); - nk_layout_reset_min_row_height(ctx); - - widget_state = nk_widget(&header, ctx); - if (type == NK_TREE_TAB) { - const struct nk_style_item *background = &style->tab.background; - - switch (background->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(out, header, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(out, header, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(out, header, 0, style->tab.border_color); - nk_fill_rect(out, nk_shrink_rect(header, style->tab.border), - style->tab.rounding, background->data.color); - break; - } - } - - in = (!(layout->flags & NK_WINDOW_ROM)) ? &ctx->input: 0; - in = (in && widget_state == NK_WIDGET_VALID) ? &ctx->input : 0; - - /* select correct button style */ - if (*state == NK_MAXIMIZED) { - symbol = style->tab.sym_maximize; - if (type == NK_TREE_TAB) - button = &style->tab.tab_maximize_button; - else button = &style->tab.node_maximize_button; - } else { - symbol = style->tab.sym_minimize; - if (type == NK_TREE_TAB) - button = &style->tab.tab_minimize_button; - else button = &style->tab.node_minimize_button; - } - {/* draw triangle button */ - sym.w = sym.h = style->font->height; - sym.y = header.y + style->tab.padding.y; - sym.x = header.x + style->tab.padding.x; - if (nk_do_button_symbol(&ws, &win->buffer, sym, symbol, NK_BUTTON_DEFAULT, button, in, style->font)) - *state = (*state == NK_MAXIMIZED) ? NK_MINIMIZED : NK_MAXIMIZED;} - - /* draw label */ - {nk_flags dummy = 0; - struct nk_rect label; - /* calculate size of the text and tooltip */ - text_len = nk_strlen(title); - text_width = style->font->width(style->font->userdata, style->font->height, title, text_len); - text_width += (4 * padding.x); - - header.w = NK_MAX(header.w, sym.w + item_spacing.x); - label.x = sym.x + sym.w + item_spacing.x; - label.y = sym.y; - label.w = NK_MIN(header.w - (sym.w + item_spacing.y + style->tab.indent), text_width); - label.h = style->font->height; - - if (img) { - nk_do_selectable_image(&dummy, &win->buffer, label, title, title_len, NK_TEXT_LEFT, - selected, img, &style->selectable, in, style->font); - } else nk_do_selectable(&dummy, &win->buffer, label, title, title_len, NK_TEXT_LEFT, - selected, &style->selectable, in, style->font); - } - /* increase x-axis cursor widget position pointer */ - if (*state == NK_MAXIMIZED) { - layout->at_x = header.x + (float)*layout->offset_x + style->tab.indent; - layout->bounds.w = NK_MAX(layout->bounds.w, style->tab.indent); - layout->bounds.w -= (style->tab.indent + style->window.padding.x); - layout->row.tree_depth++; - return nk_true; - } else return nk_false; -} -NK_INTERN int -nk_tree_element_base(struct nk_context *ctx, enum nk_tree_type type, - struct nk_image *img, const char *title, enum nk_collapse_states initial_state, - nk_bool *selected, const char *hash, int len, int line) -{ - struct nk_window *win = ctx->current; - int title_len = 0; - nk_hash tree_hash = 0; - nk_uint *state = 0; - - /* retrieve tree state from internal widget state tables */ - if (!hash) { - title_len = (int)nk_strlen(title); - tree_hash = nk_murmur_hash(title, (int)title_len, (nk_hash)line); - } else tree_hash = nk_murmur_hash(hash, len, (nk_hash)line); - state = nk_find_value(win, tree_hash); - if (!state) { - state = nk_add_value(ctx, win, tree_hash, 0); - *state = initial_state; - } return nk_tree_element_image_push_hashed_base(ctx, type, img, title, - nk_strlen(title), (enum nk_collapse_states*)state, selected); -} -NK_API nk_bool -nk_tree_element_push_hashed(struct nk_context *ctx, enum nk_tree_type type, - const char *title, enum nk_collapse_states initial_state, - nk_bool *selected, const char *hash, int len, int seed) -{ - return nk_tree_element_base(ctx, type, 0, title, initial_state, selected, hash, len, seed); -} -NK_API nk_bool -nk_tree_element_image_push_hashed(struct nk_context *ctx, enum nk_tree_type type, - struct nk_image img, const char *title, enum nk_collapse_states initial_state, - nk_bool *selected, const char *hash, int len,int seed) -{ - return nk_tree_element_base(ctx, type, &img, title, initial_state, selected, hash, len, seed); -} -NK_API void -nk_tree_element_pop(struct nk_context *ctx) -{ - nk_tree_state_pop(ctx); -} - - - - - -/* =============================================================== - * - * GROUP - * - * ===============================================================*/ -NK_API nk_bool -nk_group_scrolled_offset_begin(struct nk_context *ctx, - nk_uint *x_offset, nk_uint *y_offset, const char *title, nk_flags flags) -{ - struct nk_rect bounds; - struct nk_window panel; - struct nk_window *win; - - win = ctx->current; - nk_panel_alloc_space(&bounds, ctx); - {const struct nk_rect *c = &win->layout->clip; - if (!NK_INTERSECT(c->x, c->y, c->w, c->h, bounds.x, bounds.y, bounds.w, bounds.h) && - !(flags & NK_WINDOW_MOVABLE)) { - return 0; - }} - if (win->flags & NK_WINDOW_ROM) - flags |= NK_WINDOW_ROM; - - /* initialize a fake window to create the panel from */ - nk_zero(&panel, sizeof(panel)); - panel.bounds = bounds; - panel.flags = flags; - panel.scrollbar.x = *x_offset; - panel.scrollbar.y = *y_offset; - panel.buffer = win->buffer; - panel.layout = (struct nk_panel*)nk_create_panel(ctx); - ctx->current = &panel; - nk_panel_begin(ctx, (flags & NK_WINDOW_TITLE) ? title: 0, NK_PANEL_GROUP); - - win->buffer = panel.buffer; - win->buffer.clip = panel.layout->clip; - panel.layout->offset_x = x_offset; - panel.layout->offset_y = y_offset; - panel.layout->parent = win->layout; - win->layout = panel.layout; - - ctx->current = win; - if ((panel.layout->flags & NK_WINDOW_CLOSED) || - (panel.layout->flags & NK_WINDOW_MINIMIZED)) - { - nk_flags f = panel.layout->flags; - nk_group_scrolled_end(ctx); - if (f & NK_WINDOW_CLOSED) - return NK_WINDOW_CLOSED; - if (f & NK_WINDOW_MINIMIZED) - return NK_WINDOW_MINIMIZED; - } - return 1; -} -NK_API void -nk_group_scrolled_end(struct nk_context *ctx) -{ - struct nk_window *win; - struct nk_panel *parent; - struct nk_panel *g; - - struct nk_rect clip; - struct nk_window pan; - struct nk_vec2 panel_padding; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) - return; - - /* make sure nk_group_begin was called correctly */ - NK_ASSERT(ctx->current); - win = ctx->current; - NK_ASSERT(win->layout); - g = win->layout; - NK_ASSERT(g->parent); - parent = g->parent; - - /* dummy window */ - nk_zero_struct(pan); - panel_padding = nk_panel_get_padding(&ctx->style, NK_PANEL_GROUP); - pan.bounds.y = g->bounds.y - (g->header_height + g->menu.h); - pan.bounds.x = g->bounds.x - panel_padding.x; - pan.bounds.w = g->bounds.w + 2 * panel_padding.x; - pan.bounds.h = g->bounds.h + g->header_height + g->menu.h; - if (g->flags & NK_WINDOW_BORDER) { - pan.bounds.x -= g->border; - pan.bounds.y -= g->border; - pan.bounds.w += 2*g->border; - pan.bounds.h += 2*g->border; - } - if (!(g->flags & NK_WINDOW_NO_SCROLLBAR)) { - pan.bounds.w += ctx->style.window.scrollbar_size.x; - pan.bounds.h += ctx->style.window.scrollbar_size.y; - } - pan.scrollbar.x = *g->offset_x; - pan.scrollbar.y = *g->offset_y; - pan.flags = g->flags; - pan.buffer = win->buffer; - pan.layout = g; - pan.parent = win; - ctx->current = &pan; - - /* make sure group has correct clipping rectangle */ - nk_unify(&clip, &parent->clip, pan.bounds.x, pan.bounds.y, - pan.bounds.x + pan.bounds.w, pan.bounds.y + pan.bounds.h + panel_padding.x); - nk_push_scissor(&pan.buffer, clip); - nk_end(ctx); - - win->buffer = pan.buffer; - nk_push_scissor(&win->buffer, parent->clip); - ctx->current = win; - win->layout = parent; - g->bounds = pan.bounds; - return; -} -NK_API nk_bool -nk_group_scrolled_begin(struct nk_context *ctx, - struct nk_scroll *scroll, const char *title, nk_flags flags) -{ - return nk_group_scrolled_offset_begin(ctx, &scroll->x, &scroll->y, title, flags); -} -NK_API nk_bool -nk_group_begin_titled(struct nk_context *ctx, const char *id, - const char *title, nk_flags flags) -{ - int id_len; - nk_hash id_hash; - struct nk_window *win; - nk_uint *x_offset; - nk_uint *y_offset; - - NK_ASSERT(ctx); - NK_ASSERT(id); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout || !id) - return 0; - - /* find persistent group scrollbar value */ - win = ctx->current; - id_len = (int)nk_strlen(id); - id_hash = nk_murmur_hash(id, (int)id_len, NK_PANEL_GROUP); - x_offset = nk_find_value(win, id_hash); - if (!x_offset) { - x_offset = nk_add_value(ctx, win, id_hash, 0); - y_offset = nk_add_value(ctx, win, id_hash+1, 0); - - NK_ASSERT(x_offset); - NK_ASSERT(y_offset); - if (!x_offset || !y_offset) return 0; - *x_offset = *y_offset = 0; - } else y_offset = nk_find_value(win, id_hash+1); - return nk_group_scrolled_offset_begin(ctx, x_offset, y_offset, title, flags); -} -NK_API nk_bool -nk_group_begin(struct nk_context *ctx, const char *title, nk_flags flags) -{ - return nk_group_begin_titled(ctx, title, title, flags); -} -NK_API void -nk_group_end(struct nk_context *ctx) -{ - nk_group_scrolled_end(ctx); -} -NK_API void -nk_group_get_scroll(struct nk_context *ctx, const char *id, nk_uint *x_offset, nk_uint *y_offset) -{ - int id_len; - nk_hash id_hash; - struct nk_window *win; - nk_uint *x_offset_ptr; - nk_uint *y_offset_ptr; - - NK_ASSERT(ctx); - NK_ASSERT(id); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout || !id) - return; - - /* find persistent group scrollbar value */ - win = ctx->current; - id_len = (int)nk_strlen(id); - id_hash = nk_murmur_hash(id, (int)id_len, NK_PANEL_GROUP); - x_offset_ptr = nk_find_value(win, id_hash); - if (!x_offset_ptr) { - x_offset_ptr = nk_add_value(ctx, win, id_hash, 0); - y_offset_ptr = nk_add_value(ctx, win, id_hash+1, 0); - - NK_ASSERT(x_offset_ptr); - NK_ASSERT(y_offset_ptr); - if (!x_offset_ptr || !y_offset_ptr) return; - *x_offset_ptr = *y_offset_ptr = 0; - } else y_offset_ptr = nk_find_value(win, id_hash+1); - if (x_offset) - *x_offset = *x_offset_ptr; - if (y_offset) - *y_offset = *y_offset_ptr; -} -NK_API void -nk_group_set_scroll(struct nk_context *ctx, const char *id, nk_uint x_offset, nk_uint y_offset) -{ - int id_len; - nk_hash id_hash; - struct nk_window *win; - nk_uint *x_offset_ptr; - nk_uint *y_offset_ptr; - - NK_ASSERT(ctx); - NK_ASSERT(id); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout || !id) - return; - - /* find persistent group scrollbar value */ - win = ctx->current; - id_len = (int)nk_strlen(id); - id_hash = nk_murmur_hash(id, (int)id_len, NK_PANEL_GROUP); - x_offset_ptr = nk_find_value(win, id_hash); - if (!x_offset_ptr) { - x_offset_ptr = nk_add_value(ctx, win, id_hash, 0); - y_offset_ptr = nk_add_value(ctx, win, id_hash+1, 0); - - NK_ASSERT(x_offset_ptr); - NK_ASSERT(y_offset_ptr); - if (!x_offset_ptr || !y_offset_ptr) return; - *x_offset_ptr = *y_offset_ptr = 0; - } else y_offset_ptr = nk_find_value(win, id_hash+1); - *x_offset_ptr = x_offset; - *y_offset_ptr = y_offset; -} - - - - -/* =============================================================== - * - * LIST VIEW - * - * ===============================================================*/ -NK_API nk_bool -nk_list_view_begin(struct nk_context *ctx, struct nk_list_view *view, - const char *title, nk_flags flags, int row_height, int row_count) -{ - int title_len; - nk_hash title_hash; - nk_uint *x_offset; - nk_uint *y_offset; - - int result; - struct nk_window *win; - struct nk_panel *layout; - const struct nk_style *style; - struct nk_vec2 item_spacing; - - NK_ASSERT(ctx); - NK_ASSERT(view); - NK_ASSERT(title); - if (!ctx || !view || !title) return 0; - - win = ctx->current; - style = &ctx->style; - item_spacing = style->window.spacing; - row_height += NK_MAX(0, (int)item_spacing.y); - - /* find persistent list view scrollbar offset */ - title_len = (int)nk_strlen(title); - title_hash = nk_murmur_hash(title, (int)title_len, NK_PANEL_GROUP); - x_offset = nk_find_value(win, title_hash); - if (!x_offset) { - x_offset = nk_add_value(ctx, win, title_hash, 0); - y_offset = nk_add_value(ctx, win, title_hash+1, 0); - - NK_ASSERT(x_offset); - NK_ASSERT(y_offset); - if (!x_offset || !y_offset) return 0; - *x_offset = *y_offset = 0; - } else y_offset = nk_find_value(win, title_hash+1); - view->scroll_value = *y_offset; - view->scroll_pointer = y_offset; - - *y_offset = 0; - result = nk_group_scrolled_offset_begin(ctx, x_offset, y_offset, title, flags); - win = ctx->current; - layout = win->layout; - - view->total_height = row_height * NK_MAX(row_count,1); - view->begin = (int)NK_MAX(((float)view->scroll_value / (float)row_height), 0.0f); - view->count = (int)NK_MAX(nk_iceilf((layout->clip.h)/(float)row_height),0); - view->count = NK_MIN(view->count, row_count - view->begin); - view->end = view->begin + view->count; - view->ctx = ctx; - return result; -} -NK_API void -nk_list_view_end(struct nk_list_view *view) -{ - struct nk_context *ctx; - struct nk_window *win; - struct nk_panel *layout; - - NK_ASSERT(view); - NK_ASSERT(view->ctx); - NK_ASSERT(view->scroll_pointer); - if (!view || !view->ctx) return; - - ctx = view->ctx; - win = ctx->current; - layout = win->layout; - layout->at_y = layout->bounds.y + (float)view->total_height; - *view->scroll_pointer = *view->scroll_pointer + view->scroll_value; - nk_group_end(view->ctx); -} - - - - - -/* =============================================================== - * - * WIDGET - * - * ===============================================================*/ -NK_API struct nk_rect -nk_widget_bounds(struct nk_context *ctx) -{ - struct nk_rect bounds; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) - return nk_rect(0,0,0,0); - nk_layout_peek(&bounds, ctx); - return bounds; -} -NK_API struct nk_vec2 -nk_widget_position(struct nk_context *ctx) -{ - struct nk_rect bounds; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) - return nk_vec2(0,0); - - nk_layout_peek(&bounds, ctx); - return nk_vec2(bounds.x, bounds.y); -} -NK_API struct nk_vec2 -nk_widget_size(struct nk_context *ctx) -{ - struct nk_rect bounds; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) - return nk_vec2(0,0); - - nk_layout_peek(&bounds, ctx); - return nk_vec2(bounds.w, bounds.h); -} -NK_API float -nk_widget_width(struct nk_context *ctx) -{ - struct nk_rect bounds; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) - return 0; - - nk_layout_peek(&bounds, ctx); - return bounds.w; -} -NK_API float -nk_widget_height(struct nk_context *ctx) -{ - struct nk_rect bounds; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) - return 0; - - nk_layout_peek(&bounds, ctx); - return bounds.h; -} -NK_API nk_bool -nk_widget_is_hovered(struct nk_context *ctx) -{ - struct nk_rect c, v; - struct nk_rect bounds; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current || ctx->active != ctx->current) - return 0; - - c = ctx->current->layout->clip; - c.x = (float)((int)c.x); - c.y = (float)((int)c.y); - c.w = (float)((int)c.w); - c.h = (float)((int)c.h); - - nk_layout_peek(&bounds, ctx); - nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h); - if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h)) - return 0; - return nk_input_is_mouse_hovering_rect(&ctx->input, bounds); -} -NK_API nk_bool -nk_widget_is_mouse_clicked(struct nk_context *ctx, enum nk_buttons btn) -{ - struct nk_rect c, v; - struct nk_rect bounds; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current || ctx->active != ctx->current) - return 0; - - c = ctx->current->layout->clip; - c.x = (float)((int)c.x); - c.y = (float)((int)c.y); - c.w = (float)((int)c.w); - c.h = (float)((int)c.h); - - nk_layout_peek(&bounds, ctx); - nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h); - if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h)) - return 0; - return nk_input_mouse_clicked(&ctx->input, btn, bounds); -} -NK_API nk_bool -nk_widget_has_mouse_click_down(struct nk_context *ctx, enum nk_buttons btn, nk_bool down) -{ - struct nk_rect c, v; - struct nk_rect bounds; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current || ctx->active != ctx->current) - return 0; - - c = ctx->current->layout->clip; - c.x = (float)((int)c.x); - c.y = (float)((int)c.y); - c.w = (float)((int)c.w); - c.h = (float)((int)c.h); - - nk_layout_peek(&bounds, ctx); - nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h); - if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h)) - return 0; - return nk_input_has_mouse_click_down_in_rect(&ctx->input, btn, bounds, down); -} -NK_API enum nk_widget_layout_states -nk_widget(struct nk_rect *bounds, const struct nk_context *ctx) -{ - struct nk_rect c, v; - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return NK_WIDGET_INVALID; - - /* allocate space and check if the widget needs to be updated and drawn */ - nk_panel_alloc_space(bounds, ctx); - win = ctx->current; - layout = win->layout; - in = &ctx->input; - c = layout->clip; - - /* if one of these triggers you forgot to add an `if` condition around either - a window, group, popup, combobox or contextual menu `begin` and `end` block. - Example: - if (nk_begin(...) {...} nk_end(...); or - if (nk_group_begin(...) { nk_group_end(...);} */ - NK_ASSERT(!(layout->flags & NK_WINDOW_MINIMIZED)); - NK_ASSERT(!(layout->flags & NK_WINDOW_HIDDEN)); - NK_ASSERT(!(layout->flags & NK_WINDOW_CLOSED)); - - /* need to convert to int here to remove floating point errors */ - bounds->x = (float)((int)bounds->x); - bounds->y = (float)((int)bounds->y); - bounds->w = (float)((int)bounds->w); - bounds->h = (float)((int)bounds->h); - - c.x = (float)((int)c.x); - c.y = (float)((int)c.y); - c.w = (float)((int)c.w); - c.h = (float)((int)c.h); - - nk_unify(&v, &c, bounds->x, bounds->y, bounds->x + bounds->w, bounds->y + bounds->h); - if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds->x, bounds->y, bounds->w, bounds->h)) - return NK_WIDGET_INVALID; - if (!NK_INBOX(in->mouse.pos.x, in->mouse.pos.y, v.x, v.y, v.w, v.h)) - return NK_WIDGET_ROM; - return NK_WIDGET_VALID; -} -NK_API enum nk_widget_layout_states -nk_widget_fitting(struct nk_rect *bounds, struct nk_context *ctx, - struct nk_vec2 item_padding) -{ - /* update the bounds to stand without padding */ - enum nk_widget_layout_states state; - NK_UNUSED(item_padding); - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return NK_WIDGET_INVALID; - - state = nk_widget(bounds, ctx); - return state; -} -NK_API void -nk_spacing(struct nk_context *ctx, int cols) -{ - struct nk_window *win; - struct nk_panel *layout; - struct nk_rect none; - int i, index, rows; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - /* spacing over row boundaries */ - win = ctx->current; - layout = win->layout; - index = (layout->row.index + cols) % layout->row.columns; - rows = (layout->row.index + cols) / layout->row.columns; - if (rows) { - for (i = 0; i < rows; ++i) - nk_panel_alloc_row(ctx, win); - cols = index; - } - /* non table layout need to allocate space */ - if (layout->row.type != NK_LAYOUT_DYNAMIC_FIXED && - layout->row.type != NK_LAYOUT_STATIC_FIXED) { - for (i = 0; i < cols; ++i) - nk_panel_alloc_space(&none, ctx); - } layout->row.index = index; -} - - - - - -/* =============================================================== - * - * TEXT - * - * ===============================================================*/ -NK_LIB void -nk_widget_text(struct nk_command_buffer *o, struct nk_rect b, - const char *string, int len, const struct nk_text *t, - nk_flags a, const struct nk_user_font *f) -{ - struct nk_rect label; - float text_width; - - NK_ASSERT(o); - NK_ASSERT(t); - if (!o || !t) return; - - b.h = NK_MAX(b.h, 2 * t->padding.y); - label.x = 0; label.w = 0; - label.y = b.y + t->padding.y; - label.h = NK_MIN(f->height, b.h - 2 * t->padding.y); - - text_width = f->width(f->userdata, f->height, (const char*)string, len); - text_width += (2.0f * t->padding.x); - - /* align in x-axis */ - if (a & NK_TEXT_ALIGN_LEFT) { - label.x = b.x + t->padding.x; - label.w = NK_MAX(0, b.w - 2 * t->padding.x); - } else if (a & NK_TEXT_ALIGN_CENTERED) { - label.w = NK_MAX(1, 2 * t->padding.x + (float)text_width); - label.x = (b.x + t->padding.x + ((b.w - 2 * t->padding.x) - label.w) / 2); - label.x = NK_MAX(b.x + t->padding.x, label.x); - label.w = NK_MIN(b.x + b.w, label.x + label.w); - if (label.w >= label.x) label.w -= label.x; - } else if (a & NK_TEXT_ALIGN_RIGHT) { - label.x = NK_MAX(b.x + t->padding.x, (b.x + b.w) - (2 * t->padding.x + (float)text_width)); - label.w = (float)text_width + 2 * t->padding.x; - } else return; - - /* align in y-axis */ - if (a & NK_TEXT_ALIGN_MIDDLE) { - label.y = b.y + b.h/2.0f - (float)f->height/2.0f; - label.h = NK_MAX(b.h/2.0f, b.h - (b.h/2.0f + f->height/2.0f)); - } else if (a & NK_TEXT_ALIGN_BOTTOM) { - label.y = b.y + b.h - f->height; - label.h = f->height; - } - nk_draw_text(o, label, (const char*)string, len, f, t->background, t->text); -} -NK_LIB void -nk_widget_text_wrap(struct nk_command_buffer *o, struct nk_rect b, - const char *string, int len, const struct nk_text *t, - const struct nk_user_font *f) -{ - float width; - int glyphs = 0; - int fitting = 0; - int done = 0; - struct nk_rect line; - struct nk_text text; - NK_INTERN nk_rune seperator[] = {' '}; - - NK_ASSERT(o); - NK_ASSERT(t); - if (!o || !t) return; - - text.padding = nk_vec2(0,0); - text.background = t->background; - text.text = t->text; - - b.w = NK_MAX(b.w, 2 * t->padding.x); - b.h = NK_MAX(b.h, 2 * t->padding.y); - b.h = b.h - 2 * t->padding.y; - - line.x = b.x + t->padding.x; - line.y = b.y + t->padding.y; - line.w = b.w - 2 * t->padding.x; - line.h = 2 * t->padding.y + f->height; - - fitting = nk_text_clamp(f, string, len, line.w, &glyphs, &width, seperator,NK_LEN(seperator)); - while (done < len) { - if (!fitting || line.y + line.h >= (b.y + b.h)) break; - nk_widget_text(o, line, &string[done], fitting, &text, NK_TEXT_LEFT, f); - done += fitting; - line.y += f->height + 2 * t->padding.y; - fitting = nk_text_clamp(f, &string[done], len - done, line.w, &glyphs, &width, seperator,NK_LEN(seperator)); - } -} -NK_API void -nk_text_colored(struct nk_context *ctx, const char *str, int len, - nk_flags alignment, struct nk_color color) -{ - struct nk_window *win; - const struct nk_style *style; - - struct nk_vec2 item_padding; - struct nk_rect bounds; - struct nk_text text; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) return; - - win = ctx->current; - style = &ctx->style; - nk_panel_alloc_space(&bounds, ctx); - item_padding = style->text.padding; - - text.padding.x = item_padding.x; - text.padding.y = item_padding.y; - text.background = style->window.background; - text.text = color; - nk_widget_text(&win->buffer, bounds, str, len, &text, alignment, style->font); -} -NK_API void -nk_text_wrap_colored(struct nk_context *ctx, const char *str, - int len, struct nk_color color) -{ - struct nk_window *win; - const struct nk_style *style; - - struct nk_vec2 item_padding; - struct nk_rect bounds; - struct nk_text text; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) return; - - win = ctx->current; - style = &ctx->style; - nk_panel_alloc_space(&bounds, ctx); - item_padding = style->text.padding; - - text.padding.x = item_padding.x; - text.padding.y = item_padding.y; - text.background = style->window.background; - text.text = color; - nk_widget_text_wrap(&win->buffer, bounds, str, len, &text, style->font); -} -#ifdef NK_INCLUDE_STANDARD_VARARGS -NK_API void -nk_labelf_colored(struct nk_context *ctx, nk_flags flags, - struct nk_color color, const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - nk_labelfv_colored(ctx, flags, color, fmt, args); - va_end(args); -} -NK_API void -nk_labelf_colored_wrap(struct nk_context *ctx, struct nk_color color, - const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - nk_labelfv_colored_wrap(ctx, color, fmt, args); - va_end(args); -} -NK_API void -nk_labelf(struct nk_context *ctx, nk_flags flags, const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - nk_labelfv(ctx, flags, fmt, args); - va_end(args); -} -NK_API void -nk_labelf_wrap(struct nk_context *ctx, const char *fmt,...) -{ - va_list args; - va_start(args, fmt); - nk_labelfv_wrap(ctx, fmt, args); - va_end(args); -} -NK_API void -nk_labelfv_colored(struct nk_context *ctx, nk_flags flags, - struct nk_color color, const char *fmt, va_list args) -{ - char buf[256]; - nk_strfmt(buf, NK_LEN(buf), fmt, args); - nk_label_colored(ctx, buf, flags, color); -} - -NK_API void -nk_labelfv_colored_wrap(struct nk_context *ctx, struct nk_color color, - const char *fmt, va_list args) -{ - char buf[256]; - nk_strfmt(buf, NK_LEN(buf), fmt, args); - nk_label_colored_wrap(ctx, buf, color); -} - -NK_API void -nk_labelfv(struct nk_context *ctx, nk_flags flags, const char *fmt, va_list args) -{ - char buf[256]; - nk_strfmt(buf, NK_LEN(buf), fmt, args); - nk_label(ctx, buf, flags); -} - -NK_API void -nk_labelfv_wrap(struct nk_context *ctx, const char *fmt, va_list args) -{ - char buf[256]; - nk_strfmt(buf, NK_LEN(buf), fmt, args); - nk_label_wrap(ctx, buf); -} - -NK_API void -nk_value_bool(struct nk_context *ctx, const char *prefix, int value) -{ - nk_labelf(ctx, NK_TEXT_LEFT, "%s: %s", prefix, ((value) ? "true": "false")); -} -NK_API void -nk_value_int(struct nk_context *ctx, const char *prefix, int value) -{ - nk_labelf(ctx, NK_TEXT_LEFT, "%s: %d", prefix, value); -} -NK_API void -nk_value_uint(struct nk_context *ctx, const char *prefix, unsigned int value) -{ - nk_labelf(ctx, NK_TEXT_LEFT, "%s: %u", prefix, value); -} -NK_API void -nk_value_float(struct nk_context *ctx, const char *prefix, float value) -{ - double double_value = (double)value; - nk_labelf(ctx, NK_TEXT_LEFT, "%s: %.3f", prefix, double_value); -} -NK_API void -nk_value_color_byte(struct nk_context *ctx, const char *p, struct nk_color c) -{ - nk_labelf(ctx, NK_TEXT_LEFT, "%s: (%d, %d, %d, %d)", p, c.r, c.g, c.b, c.a); -} -NK_API void -nk_value_color_float(struct nk_context *ctx, const char *p, struct nk_color color) -{ - double c[4]; nk_color_dv(c, color); - nk_labelf(ctx, NK_TEXT_LEFT, "%s: (%.2f, %.2f, %.2f, %.2f)", - p, c[0], c[1], c[2], c[3]); -} -NK_API void -nk_value_color_hex(struct nk_context *ctx, const char *prefix, struct nk_color color) -{ - char hex[16]; - nk_color_hex_rgba(hex, color); - nk_labelf(ctx, NK_TEXT_LEFT, "%s: %s", prefix, hex); -} -#endif -NK_API void -nk_text(struct nk_context *ctx, const char *str, int len, nk_flags alignment) -{ - NK_ASSERT(ctx); - if (!ctx) return; - nk_text_colored(ctx, str, len, alignment, ctx->style.text.color); -} -NK_API void -nk_text_wrap(struct nk_context *ctx, const char *str, int len) -{ - NK_ASSERT(ctx); - if (!ctx) return; - nk_text_wrap_colored(ctx, str, len, ctx->style.text.color); -} -NK_API void -nk_label(struct nk_context *ctx, const char *str, nk_flags alignment) -{ - nk_text(ctx, str, nk_strlen(str), alignment); -} -NK_API void -nk_label_colored(struct nk_context *ctx, const char *str, nk_flags align, - struct nk_color color) -{ - nk_text_colored(ctx, str, nk_strlen(str), align, color); -} -NK_API void -nk_label_wrap(struct nk_context *ctx, const char *str) -{ - nk_text_wrap(ctx, str, nk_strlen(str)); -} -NK_API void -nk_label_colored_wrap(struct nk_context *ctx, const char *str, struct nk_color color) -{ - nk_text_wrap_colored(ctx, str, nk_strlen(str), color); -} - - - - - -/* =============================================================== - * - * IMAGE - * - * ===============================================================*/ -NK_API nk_handle -nk_handle_ptr(void *ptr) -{ - nk_handle handle = {0}; - handle.ptr = ptr; - return handle; -} -NK_API nk_handle -nk_handle_id(int id) -{ - nk_handle handle; - nk_zero_struct(handle); - handle.id = id; - return handle; -} -NK_API struct nk_image -nk_subimage_ptr(void *ptr, nk_ushort w, nk_ushort h, struct nk_rect r) -{ - struct nk_image s; - nk_zero(&s, sizeof(s)); - s.handle.ptr = ptr; - s.w = w; s.h = h; - s.region[0] = (nk_ushort)r.x; - s.region[1] = (nk_ushort)r.y; - s.region[2] = (nk_ushort)r.w; - s.region[3] = (nk_ushort)r.h; - return s; -} -NK_API struct nk_image -nk_subimage_id(int id, nk_ushort w, nk_ushort h, struct nk_rect r) -{ - struct nk_image s; - nk_zero(&s, sizeof(s)); - s.handle.id = id; - s.w = w; s.h = h; - s.region[0] = (nk_ushort)r.x; - s.region[1] = (nk_ushort)r.y; - s.region[2] = (nk_ushort)r.w; - s.region[3] = (nk_ushort)r.h; - return s; -} -NK_API struct nk_image -nk_subimage_handle(nk_handle handle, nk_ushort w, nk_ushort h, struct nk_rect r) -{ - struct nk_image s; - nk_zero(&s, sizeof(s)); - s.handle = handle; - s.w = w; s.h = h; - s.region[0] = (nk_ushort)r.x; - s.region[1] = (nk_ushort)r.y; - s.region[2] = (nk_ushort)r.w; - s.region[3] = (nk_ushort)r.h; - return s; -} -NK_API struct nk_image -nk_image_handle(nk_handle handle) -{ - struct nk_image s; - nk_zero(&s, sizeof(s)); - s.handle = handle; - s.w = 0; s.h = 0; - s.region[0] = 0; - s.region[1] = 0; - s.region[2] = 0; - s.region[3] = 0; - return s; -} -NK_API struct nk_image -nk_image_ptr(void *ptr) -{ - struct nk_image s; - nk_zero(&s, sizeof(s)); - NK_ASSERT(ptr); - s.handle.ptr = ptr; - s.w = 0; s.h = 0; - s.region[0] = 0; - s.region[1] = 0; - s.region[2] = 0; - s.region[3] = 0; - return s; -} -NK_API struct nk_image -nk_image_id(int id) -{ - struct nk_image s; - nk_zero(&s, sizeof(s)); - s.handle.id = id; - s.w = 0; s.h = 0; - s.region[0] = 0; - s.region[1] = 0; - s.region[2] = 0; - s.region[3] = 0; - return s; -} -NK_API nk_bool -nk_image_is_subimage(const struct nk_image* img) -{ - NK_ASSERT(img); - return !(img->w == 0 && img->h == 0); -} -NK_API void -nk_image(struct nk_context *ctx, struct nk_image img) -{ - struct nk_window *win; - struct nk_rect bounds; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) return; - - win = ctx->current; - if (!nk_widget(&bounds, ctx)) return; - nk_draw_image(&win->buffer, bounds, &img, nk_white); -} -NK_API void -nk_image_color(struct nk_context *ctx, struct nk_image img, struct nk_color col) -{ - struct nk_window *win; - struct nk_rect bounds; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) return; - - win = ctx->current; - if (!nk_widget(&bounds, ctx)) return; - nk_draw_image(&win->buffer, bounds, &img, col); -} - - - - - -/* =============================================================== - * - * 9-SLICE - * - * ===============================================================*/ -NK_API struct nk_nine_slice -nk_sub9slice_ptr(void *ptr, nk_ushort w, nk_ushort h, struct nk_rect rgn, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b) -{ - struct nk_nine_slice s; - struct nk_image *i = &s.img; - nk_zero(&s, sizeof(s)); - i->handle.ptr = ptr; - i->w = w; i->h = h; - i->region[0] = (nk_ushort)rgn.x; - i->region[1] = (nk_ushort)rgn.y; - i->region[2] = (nk_ushort)rgn.w; - i->region[3] = (nk_ushort)rgn.h; - s.l = l; s.t = t; s.r = r; s.b = b; - return s; -} -NK_API struct nk_nine_slice -nk_sub9slice_id(int id, nk_ushort w, nk_ushort h, struct nk_rect rgn, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b) -{ - struct nk_nine_slice s; - struct nk_image *i = &s.img; - nk_zero(&s, sizeof(s)); - i->handle.id = id; - i->w = w; i->h = h; - i->region[0] = (nk_ushort)rgn.x; - i->region[1] = (nk_ushort)rgn.y; - i->region[2] = (nk_ushort)rgn.w; - i->region[3] = (nk_ushort)rgn.h; - s.l = l; s.t = t; s.r = r; s.b = b; - return s; -} -NK_API struct nk_nine_slice -nk_sub9slice_handle(nk_handle handle, nk_ushort w, nk_ushort h, struct nk_rect rgn, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b) -{ - struct nk_nine_slice s; - struct nk_image *i = &s.img; - nk_zero(&s, sizeof(s)); - i->handle = handle; - i->w = w; i->h = h; - i->region[0] = (nk_ushort)rgn.x; - i->region[1] = (nk_ushort)rgn.y; - i->region[2] = (nk_ushort)rgn.w; - i->region[3] = (nk_ushort)rgn.h; - s.l = l; s.t = t; s.r = r; s.b = b; - return s; -} -NK_API struct nk_nine_slice -nk_nine_slice_handle(nk_handle handle, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b) -{ - struct nk_nine_slice s; - struct nk_image *i = &s.img; - nk_zero(&s, sizeof(s)); - i->handle = handle; - i->w = 0; i->h = 0; - i->region[0] = 0; - i->region[1] = 0; - i->region[2] = 0; - i->region[3] = 0; - s.l = l; s.t = t; s.r = r; s.b = b; - return s; -} -NK_API struct nk_nine_slice -nk_nine_slice_ptr(void *ptr, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b) -{ - struct nk_nine_slice s; - struct nk_image *i = &s.img; - nk_zero(&s, sizeof(s)); - NK_ASSERT(ptr); - i->handle.ptr = ptr; - i->w = 0; i->h = 0; - i->region[0] = 0; - i->region[1] = 0; - i->region[2] = 0; - i->region[3] = 0; - s.l = l; s.t = t; s.r = r; s.b = b; - return s; -} -NK_API struct nk_nine_slice -nk_nine_slice_id(int id, nk_ushort l, nk_ushort t, nk_ushort r, nk_ushort b) -{ - struct nk_nine_slice s; - struct nk_image *i = &s.img; - nk_zero(&s, sizeof(s)); - i->handle.id = id; - i->w = 0; i->h = 0; - i->region[0] = 0; - i->region[1] = 0; - i->region[2] = 0; - i->region[3] = 0; - s.l = l; s.t = t; s.r = r; s.b = b; - return s; -} -NK_API int -nk_nine_slice_is_sub9slice(const struct nk_nine_slice* slice) -{ - NK_ASSERT(slice); - return !(slice->img.w == 0 && slice->img.h == 0); -} - - - - - -/* ============================================================== - * - * BUTTON - * - * ===============================================================*/ -NK_LIB void -nk_draw_symbol(struct nk_command_buffer *out, enum nk_symbol_type type, - struct nk_rect content, struct nk_color background, struct nk_color foreground, - float border_width, const struct nk_user_font *font) -{ - switch (type) { - case NK_SYMBOL_X: - case NK_SYMBOL_UNDERSCORE: - case NK_SYMBOL_PLUS: - case NK_SYMBOL_MINUS: { - /* single character text symbol */ - const char *X = (type == NK_SYMBOL_X) ? "x": - (type == NK_SYMBOL_UNDERSCORE) ? "_": - (type == NK_SYMBOL_PLUS) ? "+": "-"; - struct nk_text text; - text.padding = nk_vec2(0,0); - text.background = background; - text.text = foreground; - nk_widget_text(out, content, X, 1, &text, NK_TEXT_CENTERED, font); - } break; - case NK_SYMBOL_CIRCLE_SOLID: - case NK_SYMBOL_CIRCLE_OUTLINE: - case NK_SYMBOL_RECT_SOLID: - case NK_SYMBOL_RECT_OUTLINE: { - /* simple empty/filled shapes */ - if (type == NK_SYMBOL_RECT_SOLID || type == NK_SYMBOL_RECT_OUTLINE) { - nk_fill_rect(out, content, 0, foreground); - if (type == NK_SYMBOL_RECT_OUTLINE) - nk_fill_rect(out, nk_shrink_rect(content, border_width), 0, background); - } else { - nk_fill_circle(out, content, foreground); - if (type == NK_SYMBOL_CIRCLE_OUTLINE) - nk_fill_circle(out, nk_shrink_rect(content, 1), background); - } - } break; - case NK_SYMBOL_TRIANGLE_UP: - case NK_SYMBOL_TRIANGLE_DOWN: - case NK_SYMBOL_TRIANGLE_LEFT: - case NK_SYMBOL_TRIANGLE_RIGHT: { - enum nk_heading heading; - struct nk_vec2 points[3]; - heading = (type == NK_SYMBOL_TRIANGLE_RIGHT) ? NK_RIGHT : - (type == NK_SYMBOL_TRIANGLE_LEFT) ? NK_LEFT: - (type == NK_SYMBOL_TRIANGLE_UP) ? NK_UP: NK_DOWN; - nk_triangle_from_direction(points, content, 0, 0, heading); - nk_fill_triangle(out, points[0].x, points[0].y, points[1].x, points[1].y, - points[2].x, points[2].y, foreground); - } break; - default: - case NK_SYMBOL_NONE: - case NK_SYMBOL_MAX: break; - } -} -NK_LIB nk_bool -nk_button_behavior(nk_flags *state, struct nk_rect r, - const struct nk_input *i, enum nk_button_behavior behavior) -{ - int ret = 0; - nk_widget_state_reset(state); - if (!i) return 0; - if (nk_input_is_mouse_hovering_rect(i, r)) { - *state = NK_WIDGET_STATE_HOVERED; - if (nk_input_is_mouse_down(i, NK_BUTTON_LEFT)) - *state = NK_WIDGET_STATE_ACTIVE; - if (nk_input_has_mouse_click_in_button_rect(i, NK_BUTTON_LEFT, r)) { - ret = (behavior != NK_BUTTON_DEFAULT) ? - nk_input_is_mouse_down(i, NK_BUTTON_LEFT): -#ifdef NK_BUTTON_TRIGGER_ON_RELEASE - nk_input_is_mouse_released(i, NK_BUTTON_LEFT); -#else - nk_input_is_mouse_pressed(i, NK_BUTTON_LEFT); -#endif - } - } - if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(i, r)) - *state |= NK_WIDGET_STATE_ENTERED; - else if (nk_input_is_mouse_prev_hovering_rect(i, r)) - *state |= NK_WIDGET_STATE_LEFT; - return ret; -} -NK_LIB const struct nk_style_item* -nk_draw_button(struct nk_command_buffer *out, - const struct nk_rect *bounds, nk_flags state, - const struct nk_style_button *style) -{ - const struct nk_style_item *background; - if (state & NK_WIDGET_STATE_HOVER) - background = &style->hover; - else if (state & NK_WIDGET_STATE_ACTIVED) - background = &style->active; - else background = &style->normal; - - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(out, *bounds, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(out, *bounds, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(out, *bounds, style->rounding, background->data.color); - nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color); - break; - } - return background; -} -NK_LIB nk_bool -nk_do_button(nk_flags *state, struct nk_command_buffer *out, struct nk_rect r, - const struct nk_style_button *style, const struct nk_input *in, - enum nk_button_behavior behavior, struct nk_rect *content) -{ - struct nk_rect bounds; - NK_ASSERT(style); - NK_ASSERT(state); - NK_ASSERT(out); - if (!out || !style) - return nk_false; - - /* calculate button content space */ - content->x = r.x + style->padding.x + style->border + style->rounding; - content->y = r.y + style->padding.y + style->border + style->rounding; - content->w = r.w - (2 * style->padding.x + style->border + style->rounding*2); - content->h = r.h - (2 * style->padding.y + style->border + style->rounding*2); - - /* execute button behavior */ - bounds.x = r.x - style->touch_padding.x; - bounds.y = r.y - style->touch_padding.y; - bounds.w = r.w + 2 * style->touch_padding.x; - bounds.h = r.h + 2 * style->touch_padding.y; - return nk_button_behavior(state, bounds, in, behavior); -} -NK_LIB void -nk_draw_button_text(struct nk_command_buffer *out, - const struct nk_rect *bounds, const struct nk_rect *content, nk_flags state, - const struct nk_style_button *style, const char *txt, int len, - nk_flags text_alignment, const struct nk_user_font *font) -{ - struct nk_text text; - const struct nk_style_item *background; - background = nk_draw_button(out, bounds, state, style); - - /* select correct colors/images */ - if (background->type == NK_STYLE_ITEM_COLOR) - text.background = background->data.color; - else text.background = style->text_background; - if (state & NK_WIDGET_STATE_HOVER) - text.text = style->text_hover; - else if (state & NK_WIDGET_STATE_ACTIVED) - text.text = style->text_active; - else text.text = style->text_normal; - - text.padding = nk_vec2(0,0); - nk_widget_text(out, *content, txt, len, &text, text_alignment, font); -} -NK_LIB nk_bool -nk_do_button_text(nk_flags *state, - struct nk_command_buffer *out, struct nk_rect bounds, - const char *string, int len, nk_flags align, enum nk_button_behavior behavior, - const struct nk_style_button *style, const struct nk_input *in, - const struct nk_user_font *font) -{ - struct nk_rect content; - int ret = nk_false; - - NK_ASSERT(state); - NK_ASSERT(style); - NK_ASSERT(out); - NK_ASSERT(string); - NK_ASSERT(font); - if (!out || !style || !font || !string) - return nk_false; - - ret = nk_do_button(state, out, bounds, style, in, behavior, &content); - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_button_text(out, &bounds, &content, *state, style, string, len, align, font); - if (style->draw_end) style->draw_end(out, style->userdata); - return ret; -} -NK_LIB void -nk_draw_button_symbol(struct nk_command_buffer *out, - const struct nk_rect *bounds, const struct nk_rect *content, - nk_flags state, const struct nk_style_button *style, - enum nk_symbol_type type, const struct nk_user_font *font) -{ - struct nk_color sym, bg; - const struct nk_style_item *background; - - /* select correct colors/images */ - background = nk_draw_button(out, bounds, state, style); - if (background->type == NK_STYLE_ITEM_COLOR) - bg = background->data.color; - else bg = style->text_background; - - if (state & NK_WIDGET_STATE_HOVER) - sym = style->text_hover; - else if (state & NK_WIDGET_STATE_ACTIVED) - sym = style->text_active; - else sym = style->text_normal; - nk_draw_symbol(out, type, *content, bg, sym, 1, font); -} -NK_LIB nk_bool -nk_do_button_symbol(nk_flags *state, - struct nk_command_buffer *out, struct nk_rect bounds, - enum nk_symbol_type symbol, enum nk_button_behavior behavior, - const struct nk_style_button *style, const struct nk_input *in, - const struct nk_user_font *font) -{ - int ret; - struct nk_rect content; - - NK_ASSERT(state); - NK_ASSERT(style); - NK_ASSERT(font); - NK_ASSERT(out); - if (!out || !style || !font || !state) - return nk_false; - - ret = nk_do_button(state, out, bounds, style, in, behavior, &content); - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_button_symbol(out, &bounds, &content, *state, style, symbol, font); - if (style->draw_end) style->draw_end(out, style->userdata); - return ret; -} -NK_LIB void -nk_draw_button_image(struct nk_command_buffer *out, - const struct nk_rect *bounds, const struct nk_rect *content, - nk_flags state, const struct nk_style_button *style, const struct nk_image *img) -{ - nk_draw_button(out, bounds, state, style); - nk_draw_image(out, *content, img, nk_white); -} -NK_LIB nk_bool -nk_do_button_image(nk_flags *state, - struct nk_command_buffer *out, struct nk_rect bounds, - struct nk_image img, enum nk_button_behavior b, - const struct nk_style_button *style, const struct nk_input *in) -{ - int ret; - struct nk_rect content; - - NK_ASSERT(state); - NK_ASSERT(style); - NK_ASSERT(out); - if (!out || !style || !state) - return nk_false; - - ret = nk_do_button(state, out, bounds, style, in, b, &content); - content.x += style->image_padding.x; - content.y += style->image_padding.y; - content.w -= 2 * style->image_padding.x; - content.h -= 2 * style->image_padding.y; - - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_button_image(out, &bounds, &content, *state, style, &img); - if (style->draw_end) style->draw_end(out, style->userdata); - return ret; -} -NK_LIB void -nk_draw_button_text_symbol(struct nk_command_buffer *out, - const struct nk_rect *bounds, const struct nk_rect *label, - const struct nk_rect *symbol, nk_flags state, const struct nk_style_button *style, - const char *str, int len, enum nk_symbol_type type, - const struct nk_user_font *font) -{ - struct nk_color sym; - struct nk_text text; - const struct nk_style_item *background; - - /* select correct background colors/images */ - background = nk_draw_button(out, bounds, state, style); - if (background->type == NK_STYLE_ITEM_COLOR) - text.background = background->data.color; - else text.background = style->text_background; - - /* select correct text colors */ - if (state & NK_WIDGET_STATE_HOVER) { - sym = style->text_hover; - text.text = style->text_hover; - } else if (state & NK_WIDGET_STATE_ACTIVED) { - sym = style->text_active; - text.text = style->text_active; - } else { - sym = style->text_normal; - text.text = style->text_normal; - } - - text.padding = nk_vec2(0,0); - nk_draw_symbol(out, type, *symbol, style->text_background, sym, 0, font); - nk_widget_text(out, *label, str, len, &text, NK_TEXT_CENTERED, font); -} -NK_LIB nk_bool -nk_do_button_text_symbol(nk_flags *state, - struct nk_command_buffer *out, struct nk_rect bounds, - enum nk_symbol_type symbol, const char *str, int len, nk_flags align, - enum nk_button_behavior behavior, const struct nk_style_button *style, - const struct nk_user_font *font, const struct nk_input *in) -{ - int ret; - struct nk_rect tri = {0,0,0,0}; - struct nk_rect content; - - NK_ASSERT(style); - NK_ASSERT(out); - NK_ASSERT(font); - if (!out || !style || !font) - return nk_false; - - ret = nk_do_button(state, out, bounds, style, in, behavior, &content); - tri.y = content.y + (content.h/2) - font->height/2; - tri.w = font->height; tri.h = font->height; - if (align & NK_TEXT_ALIGN_LEFT) { - tri.x = (content.x + content.w) - (2 * style->padding.x + tri.w); - tri.x = NK_MAX(tri.x, 0); - } else tri.x = content.x + 2 * style->padding.x; - - /* draw button */ - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_button_text_symbol(out, &bounds, &content, &tri, - *state, style, str, len, symbol, font); - if (style->draw_end) style->draw_end(out, style->userdata); - return ret; -} -NK_LIB void -nk_draw_button_text_image(struct nk_command_buffer *out, - const struct nk_rect *bounds, const struct nk_rect *label, - const struct nk_rect *image, nk_flags state, const struct nk_style_button *style, - const char *str, int len, const struct nk_user_font *font, - const struct nk_image *img) -{ - struct nk_text text; - const struct nk_style_item *background; - background = nk_draw_button(out, bounds, state, style); - - /* select correct colors */ - if (background->type == NK_STYLE_ITEM_COLOR) - text.background = background->data.color; - else text.background = style->text_background; - if (state & NK_WIDGET_STATE_HOVER) - text.text = style->text_hover; - else if (state & NK_WIDGET_STATE_ACTIVED) - text.text = style->text_active; - else text.text = style->text_normal; - - text.padding = nk_vec2(0,0); - nk_widget_text(out, *label, str, len, &text, NK_TEXT_CENTERED, font); - nk_draw_image(out, *image, img, nk_white); -} -NK_LIB nk_bool -nk_do_button_text_image(nk_flags *state, - struct nk_command_buffer *out, struct nk_rect bounds, - struct nk_image img, const char* str, int len, nk_flags align, - enum nk_button_behavior behavior, const struct nk_style_button *style, - const struct nk_user_font *font, const struct nk_input *in) -{ - int ret; - struct nk_rect icon; - struct nk_rect content; - - NK_ASSERT(style); - NK_ASSERT(state); - NK_ASSERT(font); - NK_ASSERT(out); - if (!out || !font || !style || !str) - return nk_false; - - ret = nk_do_button(state, out, bounds, style, in, behavior, &content); - icon.y = bounds.y + style->padding.y; - icon.w = icon.h = bounds.h - 2 * style->padding.y; - if (align & NK_TEXT_ALIGN_LEFT) { - icon.x = (bounds.x + bounds.w) - (2 * style->padding.x + icon.w); - icon.x = NK_MAX(icon.x, 0); - } else icon.x = bounds.x + 2 * style->padding.x; - - icon.x += style->image_padding.x; - icon.y += style->image_padding.y; - icon.w -= 2 * style->image_padding.x; - icon.h -= 2 * style->image_padding.y; - - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_button_text_image(out, &bounds, &content, &icon, *state, style, str, len, font, &img); - if (style->draw_end) style->draw_end(out, style->userdata); - return ret; -} -NK_API void -nk_button_set_behavior(struct nk_context *ctx, enum nk_button_behavior behavior) -{ - NK_ASSERT(ctx); - if (!ctx) return; - ctx->button_behavior = behavior; -} -NK_API nk_bool -nk_button_push_behavior(struct nk_context *ctx, enum nk_button_behavior behavior) -{ - struct nk_config_stack_button_behavior *button_stack; - struct nk_config_stack_button_behavior_element *element; - - NK_ASSERT(ctx); - if (!ctx) return 0; - - button_stack = &ctx->stacks.button_behaviors; - NK_ASSERT(button_stack->head < (int)NK_LEN(button_stack->elements)); - if (button_stack->head >= (int)NK_LEN(button_stack->elements)) - return 0; - - element = &button_stack->elements[button_stack->head++]; - element->address = &ctx->button_behavior; - element->old_value = ctx->button_behavior; - ctx->button_behavior = behavior; - return 1; -} -NK_API nk_bool -nk_button_pop_behavior(struct nk_context *ctx) -{ - struct nk_config_stack_button_behavior *button_stack; - struct nk_config_stack_button_behavior_element *element; - - NK_ASSERT(ctx); - if (!ctx) return 0; - - button_stack = &ctx->stacks.button_behaviors; - NK_ASSERT(button_stack->head > 0); - if (button_stack->head < 1) - return 0; - - element = &button_stack->elements[--button_stack->head]; - *element->address = element->old_value; - return 1; -} -NK_API nk_bool -nk_button_text_styled(struct nk_context *ctx, - const struct nk_style_button *style, const char *title, int len) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - - struct nk_rect bounds; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(style); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!style || !ctx || !ctx->current || !ctx->current->layout) return 0; - - win = ctx->current; - layout = win->layout; - state = nk_widget(&bounds, ctx); - - if (!state) return 0; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - return nk_do_button_text(&ctx->last_widget_state, &win->buffer, bounds, - title, len, style->text_alignment, ctx->button_behavior, - style, in, ctx->style.font); -} -NK_API nk_bool -nk_button_text(struct nk_context *ctx, const char *title, int len) -{ - NK_ASSERT(ctx); - if (!ctx) return 0; - return nk_button_text_styled(ctx, &ctx->style.button, title, len); -} -NK_API nk_bool nk_button_label_styled(struct nk_context *ctx, - const struct nk_style_button *style, const char *title) -{ - return nk_button_text_styled(ctx, style, title, nk_strlen(title)); -} -NK_API nk_bool nk_button_label(struct nk_context *ctx, const char *title) -{ - return nk_button_text(ctx, title, nk_strlen(title)); -} -NK_API nk_bool -nk_button_color(struct nk_context *ctx, struct nk_color color) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - struct nk_style_button button; - - int ret = 0; - struct nk_rect bounds; - struct nk_rect content; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - layout = win->layout; - - state = nk_widget(&bounds, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - - button = ctx->style.button; - button.normal = nk_style_item_color(color); - button.hover = nk_style_item_color(color); - button.active = nk_style_item_color(color); - ret = nk_do_button(&ctx->last_widget_state, &win->buffer, bounds, - &button, in, ctx->button_behavior, &content); - nk_draw_button(&win->buffer, &bounds, ctx->last_widget_state, &button); - return ret; -} -NK_API nk_bool -nk_button_symbol_styled(struct nk_context *ctx, - const struct nk_style_button *style, enum nk_symbol_type symbol) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - - struct nk_rect bounds; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - layout = win->layout; - state = nk_widget(&bounds, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - return nk_do_button_symbol(&ctx->last_widget_state, &win->buffer, bounds, - symbol, ctx->button_behavior, style, in, ctx->style.font); -} -NK_API nk_bool -nk_button_symbol(struct nk_context *ctx, enum nk_symbol_type symbol) -{ - NK_ASSERT(ctx); - if (!ctx) return 0; - return nk_button_symbol_styled(ctx, &ctx->style.button, symbol); -} -NK_API nk_bool -nk_button_image_styled(struct nk_context *ctx, const struct nk_style_button *style, - struct nk_image img) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - - struct nk_rect bounds; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - layout = win->layout; - - state = nk_widget(&bounds, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - return nk_do_button_image(&ctx->last_widget_state, &win->buffer, bounds, - img, ctx->button_behavior, style, in); -} -NK_API nk_bool -nk_button_image(struct nk_context *ctx, struct nk_image img) -{ - NK_ASSERT(ctx); - if (!ctx) return 0; - return nk_button_image_styled(ctx, &ctx->style.button, img); -} -NK_API nk_bool -nk_button_symbol_text_styled(struct nk_context *ctx, - const struct nk_style_button *style, enum nk_symbol_type symbol, - const char *text, int len, nk_flags align) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - - struct nk_rect bounds; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - layout = win->layout; - - state = nk_widget(&bounds, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - return nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer, bounds, - symbol, text, len, align, ctx->button_behavior, - style, ctx->style.font, in); -} -NK_API nk_bool -nk_button_symbol_text(struct nk_context *ctx, enum nk_symbol_type symbol, - const char* text, int len, nk_flags align) -{ - NK_ASSERT(ctx); - if (!ctx) return 0; - return nk_button_symbol_text_styled(ctx, &ctx->style.button, symbol, text, len, align); -} -NK_API nk_bool nk_button_symbol_label(struct nk_context *ctx, enum nk_symbol_type symbol, - const char *label, nk_flags align) -{ - return nk_button_symbol_text(ctx, symbol, label, nk_strlen(label), align); -} -NK_API nk_bool nk_button_symbol_label_styled(struct nk_context *ctx, - const struct nk_style_button *style, enum nk_symbol_type symbol, - const char *title, nk_flags align) -{ - return nk_button_symbol_text_styled(ctx, style, symbol, title, nk_strlen(title), align); -} -NK_API nk_bool -nk_button_image_text_styled(struct nk_context *ctx, - const struct nk_style_button *style, struct nk_image img, const char *text, - int len, nk_flags align) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - - struct nk_rect bounds; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - layout = win->layout; - - state = nk_widget(&bounds, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - return nk_do_button_text_image(&ctx->last_widget_state, &win->buffer, - bounds, img, text, len, align, ctx->button_behavior, - style, ctx->style.font, in); -} -NK_API nk_bool -nk_button_image_text(struct nk_context *ctx, struct nk_image img, - const char *text, int len, nk_flags align) -{ - return nk_button_image_text_styled(ctx, &ctx->style.button,img, text, len, align); -} -NK_API nk_bool nk_button_image_label(struct nk_context *ctx, struct nk_image img, - const char *label, nk_flags align) -{ - return nk_button_image_text(ctx, img, label, nk_strlen(label), align); -} -NK_API nk_bool nk_button_image_label_styled(struct nk_context *ctx, - const struct nk_style_button *style, struct nk_image img, - const char *label, nk_flags text_alignment) -{ - return nk_button_image_text_styled(ctx, style, img, label, nk_strlen(label), text_alignment); -} - - - - - -/* =============================================================== - * - * TOGGLE - * - * ===============================================================*/ -NK_LIB nk_bool -nk_toggle_behavior(const struct nk_input *in, struct nk_rect select, - nk_flags *state, nk_bool active) -{ - nk_widget_state_reset(state); - if (nk_button_behavior(state, select, in, NK_BUTTON_DEFAULT)) { - *state = NK_WIDGET_STATE_ACTIVE; - active = !active; - } - if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, select)) - *state |= NK_WIDGET_STATE_ENTERED; - else if (nk_input_is_mouse_prev_hovering_rect(in, select)) - *state |= NK_WIDGET_STATE_LEFT; - return active; -} -NK_LIB void -nk_draw_checkbox(struct nk_command_buffer *out, - nk_flags state, const struct nk_style_toggle *style, nk_bool active, - const struct nk_rect *label, const struct nk_rect *selector, - const struct nk_rect *cursors, const char *string, int len, - const struct nk_user_font *font) -{ - const struct nk_style_item *background; - const struct nk_style_item *cursor; - struct nk_text text; - - /* select correct colors/images */ - if (state & NK_WIDGET_STATE_HOVER) { - background = &style->hover; - cursor = &style->cursor_hover; - text.text = style->text_hover; - } else if (state & NK_WIDGET_STATE_ACTIVED) { - background = &style->hover; - cursor = &style->cursor_hover; - text.text = style->text_active; - } else { - background = &style->normal; - cursor = &style->cursor_normal; - text.text = style->text_normal; - } - - /* draw background and cursor */ - if (background->type == NK_STYLE_ITEM_COLOR) { - nk_fill_rect(out, *selector, 0, style->border_color); - nk_fill_rect(out, nk_shrink_rect(*selector, style->border), 0, background->data.color); - } else nk_draw_image(out, *selector, &background->data.image, nk_white); - if (active) { - if (cursor->type == NK_STYLE_ITEM_IMAGE) - nk_draw_image(out, *cursors, &cursor->data.image, nk_white); - else nk_fill_rect(out, *cursors, 0, cursor->data.color); - } - - text.padding.x = 0; - text.padding.y = 0; - text.background = style->text_background; - nk_widget_text(out, *label, string, len, &text, NK_TEXT_LEFT, font); -} -NK_LIB void -nk_draw_option(struct nk_command_buffer *out, - nk_flags state, const struct nk_style_toggle *style, nk_bool active, - const struct nk_rect *label, const struct nk_rect *selector, - const struct nk_rect *cursors, const char *string, int len, - const struct nk_user_font *font) -{ - const struct nk_style_item *background; - const struct nk_style_item *cursor; - struct nk_text text; - - /* select correct colors/images */ - if (state & NK_WIDGET_STATE_HOVER) { - background = &style->hover; - cursor = &style->cursor_hover; - text.text = style->text_hover; - } else if (state & NK_WIDGET_STATE_ACTIVED) { - background = &style->hover; - cursor = &style->cursor_hover; - text.text = style->text_active; - } else { - background = &style->normal; - cursor = &style->cursor_normal; - text.text = style->text_normal; - } - - /* draw background and cursor */ - if (background->type == NK_STYLE_ITEM_COLOR) { - nk_fill_circle(out, *selector, style->border_color); - nk_fill_circle(out, nk_shrink_rect(*selector, style->border), background->data.color); - } else nk_draw_image(out, *selector, &background->data.image, nk_white); - if (active) { - if (cursor->type == NK_STYLE_ITEM_IMAGE) - nk_draw_image(out, *cursors, &cursor->data.image, nk_white); - else nk_fill_circle(out, *cursors, cursor->data.color); - } - - text.padding.x = 0; - text.padding.y = 0; - text.background = style->text_background; - nk_widget_text(out, *label, string, len, &text, NK_TEXT_LEFT, font); -} -NK_LIB nk_bool -nk_do_toggle(nk_flags *state, - struct nk_command_buffer *out, struct nk_rect r, - nk_bool *active, const char *str, int len, enum nk_toggle_type type, - const struct nk_style_toggle *style, const struct nk_input *in, - const struct nk_user_font *font) -{ - int was_active; - struct nk_rect bounds; - struct nk_rect select; - struct nk_rect cursor; - struct nk_rect label; - - NK_ASSERT(style); - NK_ASSERT(out); - NK_ASSERT(font); - if (!out || !style || !font || !active) - return 0; - - r.w = NK_MAX(r.w, font->height + 2 * style->padding.x); - r.h = NK_MAX(r.h, font->height + 2 * style->padding.y); - - /* add additional touch padding for touch screen devices */ - bounds.x = r.x - style->touch_padding.x; - bounds.y = r.y - style->touch_padding.y; - bounds.w = r.w + 2 * style->touch_padding.x; - bounds.h = r.h + 2 * style->touch_padding.y; - - /* calculate the selector space */ - select.w = font->height; - select.h = select.w; - select.y = r.y + r.h/2.0f - select.h/2.0f; - select.x = r.x; - - /* calculate the bounds of the cursor inside the selector */ - cursor.x = select.x + style->padding.x + style->border; - cursor.y = select.y + style->padding.y + style->border; - cursor.w = select.w - (2 * style->padding.x + 2 * style->border); - cursor.h = select.h - (2 * style->padding.y + 2 * style->border); - - /* label behind the selector */ - label.x = select.x + select.w + style->spacing; - label.y = select.y; - label.w = NK_MAX(r.x + r.w, label.x) - label.x; - label.h = select.w; - - /* update selector */ - was_active = *active; - *active = nk_toggle_behavior(in, bounds, state, *active); - - /* draw selector */ - if (style->draw_begin) - style->draw_begin(out, style->userdata); - if (type == NK_TOGGLE_CHECK) { - nk_draw_checkbox(out, *state, style, *active, &label, &select, &cursor, str, len, font); - } else { - nk_draw_option(out, *state, style, *active, &label, &select, &cursor, str, len, font); - } - if (style->draw_end) - style->draw_end(out, style->userdata); - return (was_active != *active); -} -/*---------------------------------------------------------------- - * - * CHECKBOX - * - * --------------------------------------------------------------*/ -NK_API nk_bool -nk_check_text(struct nk_context *ctx, const char *text, int len, nk_bool active) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - const struct nk_style *style; - - struct nk_rect bounds; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return active; - - win = ctx->current; - style = &ctx->style; - layout = win->layout; - - state = nk_widget(&bounds, ctx); - if (!state) return active; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - nk_do_toggle(&ctx->last_widget_state, &win->buffer, bounds, &active, - text, len, NK_TOGGLE_CHECK, &style->checkbox, in, style->font); - return active; -} -NK_API unsigned int -nk_check_flags_text(struct nk_context *ctx, const char *text, int len, - unsigned int flags, unsigned int value) -{ - int old_active; - NK_ASSERT(ctx); - NK_ASSERT(text); - if (!ctx || !text) return flags; - old_active = (int)((flags & value) & value); - if (nk_check_text(ctx, text, len, old_active)) - flags |= value; - else flags &= ~value; - return flags; -} -NK_API nk_bool -nk_checkbox_text(struct nk_context *ctx, const char *text, int len, nk_bool *active) -{ - int old_val; - NK_ASSERT(ctx); - NK_ASSERT(text); - NK_ASSERT(active); - if (!ctx || !text || !active) return 0; - old_val = *active; - *active = nk_check_text(ctx, text, len, *active); - return old_val != *active; -} -NK_API nk_bool -nk_checkbox_flags_text(struct nk_context *ctx, const char *text, int len, - unsigned int *flags, unsigned int value) -{ - nk_bool active; - NK_ASSERT(ctx); - NK_ASSERT(text); - NK_ASSERT(flags); - if (!ctx || !text || !flags) return 0; - - active = (int)((*flags & value) & value); - if (nk_checkbox_text(ctx, text, len, &active)) { - if (active) *flags |= value; - else *flags &= ~value; - return 1; - } - return 0; -} -NK_API nk_bool nk_check_label(struct nk_context *ctx, const char *label, nk_bool active) -{ - return nk_check_text(ctx, label, nk_strlen(label), active); -} -NK_API unsigned int nk_check_flags_label(struct nk_context *ctx, const char *label, - unsigned int flags, unsigned int value) -{ - return nk_check_flags_text(ctx, label, nk_strlen(label), flags, value); -} -NK_API nk_bool nk_checkbox_label(struct nk_context *ctx, const char *label, nk_bool *active) -{ - return nk_checkbox_text(ctx, label, nk_strlen(label), active); -} -NK_API nk_bool nk_checkbox_flags_label(struct nk_context *ctx, const char *label, - unsigned int *flags, unsigned int value) -{ - return nk_checkbox_flags_text(ctx, label, nk_strlen(label), flags, value); -} -/*---------------------------------------------------------------- - * - * OPTION - * - * --------------------------------------------------------------*/ -NK_API nk_bool -nk_option_text(struct nk_context *ctx, const char *text, int len, nk_bool is_active) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - const struct nk_style *style; - - struct nk_rect bounds; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return is_active; - - win = ctx->current; - style = &ctx->style; - layout = win->layout; - - state = nk_widget(&bounds, ctx); - if (!state) return (int)state; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - nk_do_toggle(&ctx->last_widget_state, &win->buffer, bounds, &is_active, - text, len, NK_TOGGLE_OPTION, &style->option, in, style->font); - return is_active; -} -NK_API nk_bool -nk_radio_text(struct nk_context *ctx, const char *text, int len, nk_bool *active) -{ - int old_value; - NK_ASSERT(ctx); - NK_ASSERT(text); - NK_ASSERT(active); - if (!ctx || !text || !active) return 0; - old_value = *active; - *active = nk_option_text(ctx, text, len, old_value); - return old_value != *active; -} -NK_API nk_bool -nk_option_label(struct nk_context *ctx, const char *label, nk_bool active) -{ - return nk_option_text(ctx, label, nk_strlen(label), active); -} -NK_API nk_bool -nk_radio_label(struct nk_context *ctx, const char *label, nk_bool *active) -{ - return nk_radio_text(ctx, label, nk_strlen(label), active); -} - - - - - -/* =============================================================== - * - * SELECTABLE - * - * ===============================================================*/ -NK_LIB void -nk_draw_selectable(struct nk_command_buffer *out, - nk_flags state, const struct nk_style_selectable *style, nk_bool active, - const struct nk_rect *bounds, - const struct nk_rect *icon, const struct nk_image *img, enum nk_symbol_type sym, - const char *string, int len, nk_flags align, const struct nk_user_font *font) -{ - const struct nk_style_item *background; - struct nk_text text; - text.padding = style->padding; - - /* select correct colors/images */ - if (!active) { - if (state & NK_WIDGET_STATE_ACTIVED) { - background = &style->pressed; - text.text = style->text_pressed; - } else if (state & NK_WIDGET_STATE_HOVER) { - background = &style->hover; - text.text = style->text_hover; - } else { - background = &style->normal; - text.text = style->text_normal; - } - } else { - if (state & NK_WIDGET_STATE_ACTIVED) { - background = &style->pressed_active; - text.text = style->text_pressed_active; - } else if (state & NK_WIDGET_STATE_HOVER) { - background = &style->hover_active; - text.text = style->text_hover_active; - } else { - background = &style->normal_active; - text.text = style->text_normal_active; - } - } - /* draw selectable background and text */ - switch (background->type) { - case NK_STYLE_ITEM_IMAGE: - text.background = nk_rgba(0, 0, 0, 0); - nk_draw_image(out, *bounds, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - text.background = nk_rgba(0, 0, 0, 0); - nk_draw_nine_slice(out, *bounds, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - text.background = background->data.color; - nk_fill_rect(out, *bounds, style->rounding, background->data.color); - break; - } - if (icon) { - if (img) nk_draw_image(out, *icon, img, nk_white); - else nk_draw_symbol(out, sym, *icon, text.background, text.text, 1, font); - } - nk_widget_text(out, *bounds, string, len, &text, align, font); -} -NK_LIB nk_bool -nk_do_selectable(nk_flags *state, struct nk_command_buffer *out, - struct nk_rect bounds, const char *str, int len, nk_flags align, nk_bool *value, - const struct nk_style_selectable *style, const struct nk_input *in, - const struct nk_user_font *font) -{ - int old_value; - struct nk_rect touch; - - NK_ASSERT(state); - NK_ASSERT(out); - NK_ASSERT(str); - NK_ASSERT(len); - NK_ASSERT(value); - NK_ASSERT(style); - NK_ASSERT(font); - - if (!state || !out || !str || !len || !value || !style || !font) return 0; - old_value = *value; - - /* remove padding */ - touch.x = bounds.x - style->touch_padding.x; - touch.y = bounds.y - style->touch_padding.y; - touch.w = bounds.w + style->touch_padding.x * 2; - touch.h = bounds.h + style->touch_padding.y * 2; - - /* update button */ - if (nk_button_behavior(state, touch, in, NK_BUTTON_DEFAULT)) - *value = !(*value); - - /* draw selectable */ - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_selectable(out, *state, style, *value, &bounds, 0,0,NK_SYMBOL_NONE, str, len, align, font); - if (style->draw_end) style->draw_end(out, style->userdata); - return old_value != *value; -} -NK_LIB nk_bool -nk_do_selectable_image(nk_flags *state, struct nk_command_buffer *out, - struct nk_rect bounds, const char *str, int len, nk_flags align, nk_bool *value, - const struct nk_image *img, const struct nk_style_selectable *style, - const struct nk_input *in, const struct nk_user_font *font) -{ - nk_bool old_value; - struct nk_rect touch; - struct nk_rect icon; - - NK_ASSERT(state); - NK_ASSERT(out); - NK_ASSERT(str); - NK_ASSERT(len); - NK_ASSERT(value); - NK_ASSERT(style); - NK_ASSERT(font); - - if (!state || !out || !str || !len || !value || !style || !font) return 0; - old_value = *value; - - /* toggle behavior */ - touch.x = bounds.x - style->touch_padding.x; - touch.y = bounds.y - style->touch_padding.y; - touch.w = bounds.w + style->touch_padding.x * 2; - touch.h = bounds.h + style->touch_padding.y * 2; - if (nk_button_behavior(state, touch, in, NK_BUTTON_DEFAULT)) - *value = !(*value); - - icon.y = bounds.y + style->padding.y; - icon.w = icon.h = bounds.h - 2 * style->padding.y; - if (align & NK_TEXT_ALIGN_LEFT) { - icon.x = (bounds.x + bounds.w) - (2 * style->padding.x + icon.w); - icon.x = NK_MAX(icon.x, 0); - } else icon.x = bounds.x + 2 * style->padding.x; - - icon.x += style->image_padding.x; - icon.y += style->image_padding.y; - icon.w -= 2 * style->image_padding.x; - icon.h -= 2 * style->image_padding.y; - - /* draw selectable */ - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_selectable(out, *state, style, *value, &bounds, &icon, img, NK_SYMBOL_NONE, str, len, align, font); - if (style->draw_end) style->draw_end(out, style->userdata); - return old_value != *value; -} -NK_LIB nk_bool -nk_do_selectable_symbol(nk_flags *state, struct nk_command_buffer *out, - struct nk_rect bounds, const char *str, int len, nk_flags align, nk_bool *value, - enum nk_symbol_type sym, const struct nk_style_selectable *style, - const struct nk_input *in, const struct nk_user_font *font) -{ - int old_value; - struct nk_rect touch; - struct nk_rect icon; - - NK_ASSERT(state); - NK_ASSERT(out); - NK_ASSERT(str); - NK_ASSERT(len); - NK_ASSERT(value); - NK_ASSERT(style); - NK_ASSERT(font); - - if (!state || !out || !str || !len || !value || !style || !font) return 0; - old_value = *value; - - /* toggle behavior */ - touch.x = bounds.x - style->touch_padding.x; - touch.y = bounds.y - style->touch_padding.y; - touch.w = bounds.w + style->touch_padding.x * 2; - touch.h = bounds.h + style->touch_padding.y * 2; - if (nk_button_behavior(state, touch, in, NK_BUTTON_DEFAULT)) - *value = !(*value); - - icon.y = bounds.y + style->padding.y; - icon.w = icon.h = bounds.h - 2 * style->padding.y; - if (align & NK_TEXT_ALIGN_LEFT) { - icon.x = (bounds.x + bounds.w) - (2 * style->padding.x + icon.w); - icon.x = NK_MAX(icon.x, 0); - } else icon.x = bounds.x + 2 * style->padding.x; - - icon.x += style->image_padding.x; - icon.y += style->image_padding.y; - icon.w -= 2 * style->image_padding.x; - icon.h -= 2 * style->image_padding.y; - - /* draw selectable */ - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_selectable(out, *state, style, *value, &bounds, &icon, 0, sym, str, len, align, font); - if (style->draw_end) style->draw_end(out, style->userdata); - return old_value != *value; -} - -NK_API nk_bool -nk_selectable_text(struct nk_context *ctx, const char *str, int len, - nk_flags align, nk_bool *value) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - const struct nk_style *style; - - enum nk_widget_layout_states state; - struct nk_rect bounds; - - NK_ASSERT(ctx); - NK_ASSERT(value); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout || !value) - return 0; - - win = ctx->current; - layout = win->layout; - style = &ctx->style; - - state = nk_widget(&bounds, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - return nk_do_selectable(&ctx->last_widget_state, &win->buffer, bounds, - str, len, align, value, &style->selectable, in, style->font); -} -NK_API nk_bool -nk_selectable_image_text(struct nk_context *ctx, struct nk_image img, - const char *str, int len, nk_flags align, nk_bool *value) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - const struct nk_style *style; - - enum nk_widget_layout_states state; - struct nk_rect bounds; - - NK_ASSERT(ctx); - NK_ASSERT(value); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout || !value) - return 0; - - win = ctx->current; - layout = win->layout; - style = &ctx->style; - - state = nk_widget(&bounds, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - return nk_do_selectable_image(&ctx->last_widget_state, &win->buffer, bounds, - str, len, align, value, &img, &style->selectable, in, style->font); -} -NK_API nk_bool -nk_selectable_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym, - const char *str, int len, nk_flags align, nk_bool *value) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_input *in; - const struct nk_style *style; - - enum nk_widget_layout_states state; - struct nk_rect bounds; - - NK_ASSERT(ctx); - NK_ASSERT(value); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout || !value) - return 0; - - win = ctx->current; - layout = win->layout; - style = &ctx->style; - - state = nk_widget(&bounds, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - return nk_do_selectable_symbol(&ctx->last_widget_state, &win->buffer, bounds, - str, len, align, value, sym, &style->selectable, in, style->font); -} -NK_API nk_bool -nk_selectable_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym, - const char *title, nk_flags align, nk_bool *value) -{ - return nk_selectable_symbol_text(ctx, sym, title, nk_strlen(title), align, value); -} -NK_API nk_bool nk_select_text(struct nk_context *ctx, const char *str, int len, - nk_flags align, nk_bool value) -{ - nk_selectable_text(ctx, str, len, align, &value);return value; -} -NK_API nk_bool nk_selectable_label(struct nk_context *ctx, const char *str, nk_flags align, nk_bool *value) -{ - return nk_selectable_text(ctx, str, nk_strlen(str), align, value); -} -NK_API nk_bool nk_selectable_image_label(struct nk_context *ctx,struct nk_image img, - const char *str, nk_flags align, nk_bool *value) -{ - return nk_selectable_image_text(ctx, img, str, nk_strlen(str), align, value); -} -NK_API nk_bool nk_select_label(struct nk_context *ctx, const char *str, nk_flags align, nk_bool value) -{ - nk_selectable_text(ctx, str, nk_strlen(str), align, &value);return value; -} -NK_API nk_bool nk_select_image_label(struct nk_context *ctx, struct nk_image img, - const char *str, nk_flags align, nk_bool value) -{ - nk_selectable_image_text(ctx, img, str, nk_strlen(str), align, &value);return value; -} -NK_API nk_bool nk_select_image_text(struct nk_context *ctx, struct nk_image img, - const char *str, int len, nk_flags align, nk_bool value) -{ - nk_selectable_image_text(ctx, img, str, len, align, &value);return value; -} -NK_API nk_bool -nk_select_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym, - const char *title, int title_len, nk_flags align, nk_bool value) -{ - nk_selectable_symbol_text(ctx, sym, title, title_len, align, &value);return value; -} -NK_API nk_bool -nk_select_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym, - const char *title, nk_flags align, nk_bool value) -{ - return nk_select_symbol_text(ctx, sym, title, nk_strlen(title), align, value); -} - - - - - -/* =============================================================== - * - * SLIDER - * - * ===============================================================*/ -NK_LIB float -nk_slider_behavior(nk_flags *state, struct nk_rect *logical_cursor, - struct nk_rect *visual_cursor, struct nk_input *in, - struct nk_rect bounds, float slider_min, float slider_max, float slider_value, - float slider_step, float slider_steps) -{ - int left_mouse_down; - int left_mouse_click_in_cursor; - - /* check if visual cursor is being dragged */ - nk_widget_state_reset(state); - left_mouse_down = in && in->mouse.buttons[NK_BUTTON_LEFT].down; - left_mouse_click_in_cursor = in && nk_input_has_mouse_click_down_in_rect(in, - NK_BUTTON_LEFT, *visual_cursor, nk_true); - - if (left_mouse_down && left_mouse_click_in_cursor) { - float ratio = 0; - const float d = in->mouse.pos.x - (visual_cursor->x+visual_cursor->w*0.5f); - const float pxstep = bounds.w / slider_steps; - - /* only update value if the next slider step is reached */ - *state = NK_WIDGET_STATE_ACTIVE; - if (NK_ABS(d) >= pxstep) { - const float steps = (float)((int)(NK_ABS(d) / pxstep)); - slider_value += (d > 0) ? (slider_step*steps) : -(slider_step*steps); - slider_value = NK_CLAMP(slider_min, slider_value, slider_max); - ratio = (slider_value - slider_min)/slider_step; - logical_cursor->x = bounds.x + (logical_cursor->w * ratio); - in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = logical_cursor->x; - } - } - - /* slider widget state */ - if (nk_input_is_mouse_hovering_rect(in, bounds)) - *state = NK_WIDGET_STATE_HOVERED; - if (*state & NK_WIDGET_STATE_HOVER && - !nk_input_is_mouse_prev_hovering_rect(in, bounds)) - *state |= NK_WIDGET_STATE_ENTERED; - else if (nk_input_is_mouse_prev_hovering_rect(in, bounds)) - *state |= NK_WIDGET_STATE_LEFT; - return slider_value; -} -NK_LIB void -nk_draw_slider(struct nk_command_buffer *out, nk_flags state, - const struct nk_style_slider *style, const struct nk_rect *bounds, - const struct nk_rect *visual_cursor, float min, float value, float max) -{ - struct nk_rect fill; - struct nk_rect bar; - const struct nk_style_item *background; - - /* select correct slider images/colors */ - struct nk_color bar_color; - const struct nk_style_item *cursor; - - NK_UNUSED(min); - NK_UNUSED(max); - NK_UNUSED(value); - - if (state & NK_WIDGET_STATE_ACTIVED) { - background = &style->active; - bar_color = style->bar_active; - cursor = &style->cursor_active; - } else if (state & NK_WIDGET_STATE_HOVER) { - background = &style->hover; - bar_color = style->bar_hover; - cursor = &style->cursor_hover; - } else { - background = &style->normal; - bar_color = style->bar_normal; - cursor = &style->cursor_normal; - } - /* calculate slider background bar */ - bar.x = bounds->x; - bar.y = (visual_cursor->y + visual_cursor->h/2) - bounds->h/12; - bar.w = bounds->w; - bar.h = bounds->h/6; - - /* filled background bar style */ - fill.w = (visual_cursor->x + (visual_cursor->w/2.0f)) - bar.x; - fill.x = bar.x; - fill.y = bar.y; - fill.h = bar.h; - - /* draw background */ - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(out, *bounds, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(out, *bounds, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(out, *bounds, style->rounding, background->data.color); - nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color); - break; - } - - /* draw slider bar */ - nk_fill_rect(out, bar, style->rounding, bar_color); - nk_fill_rect(out, fill, style->rounding, style->bar_filled); - - /* draw cursor */ - if (cursor->type == NK_STYLE_ITEM_IMAGE) - nk_draw_image(out, *visual_cursor, &cursor->data.image, nk_white); - else - nk_fill_circle(out, *visual_cursor, cursor->data.color); -} -NK_LIB float -nk_do_slider(nk_flags *state, - struct nk_command_buffer *out, struct nk_rect bounds, - float min, float val, float max, float step, - const struct nk_style_slider *style, struct nk_input *in, - const struct nk_user_font *font) -{ - float slider_range; - float slider_min; - float slider_max; - float slider_value; - float slider_steps; - float cursor_offset; - - struct nk_rect visual_cursor; - struct nk_rect logical_cursor; - - NK_ASSERT(style); - NK_ASSERT(out); - if (!out || !style) - return 0; - - /* remove padding from slider bounds */ - bounds.x = bounds.x + style->padding.x; - bounds.y = bounds.y + style->padding.y; - bounds.h = NK_MAX(bounds.h, 2*style->padding.y); - bounds.w = NK_MAX(bounds.w, 2*style->padding.x + style->cursor_size.x); - bounds.w -= 2 * style->padding.x; - bounds.h -= 2 * style->padding.y; - - /* optional buttons */ - if (style->show_buttons) { - nk_flags ws; - struct nk_rect button; - button.y = bounds.y; - button.w = bounds.h; - button.h = bounds.h; - - /* decrement button */ - button.x = bounds.x; - if (nk_do_button_symbol(&ws, out, button, style->dec_symbol, NK_BUTTON_DEFAULT, - &style->dec_button, in, font)) - val -= step; - - /* increment button */ - button.x = (bounds.x + bounds.w) - button.w; - if (nk_do_button_symbol(&ws, out, button, style->inc_symbol, NK_BUTTON_DEFAULT, - &style->inc_button, in, font)) - val += step; - - bounds.x = bounds.x + button.w + style->spacing.x; - bounds.w = bounds.w - (2*button.w + 2*style->spacing.x); - } - - /* remove one cursor size to support visual cursor */ - bounds.x += style->cursor_size.x*0.5f; - bounds.w -= style->cursor_size.x; - - /* make sure the provided values are correct */ - slider_max = NK_MAX(min, max); - slider_min = NK_MIN(min, max); - slider_value = NK_CLAMP(slider_min, val, slider_max); - slider_range = slider_max - slider_min; - slider_steps = slider_range / step; - cursor_offset = (slider_value - slider_min) / step; - - /* calculate cursor - Basically you have two cursors. One for visual representation and interaction - and one for updating the actual cursor value. */ - logical_cursor.h = bounds.h; - logical_cursor.w = bounds.w / slider_steps; - logical_cursor.x = bounds.x + (logical_cursor.w * cursor_offset); - logical_cursor.y = bounds.y; - - visual_cursor.h = style->cursor_size.y; - visual_cursor.w = style->cursor_size.x; - visual_cursor.y = (bounds.y + bounds.h*0.5f) - visual_cursor.h*0.5f; - visual_cursor.x = logical_cursor.x - visual_cursor.w*0.5f; - - slider_value = nk_slider_behavior(state, &logical_cursor, &visual_cursor, - in, bounds, slider_min, slider_max, slider_value, step, slider_steps); - visual_cursor.x = logical_cursor.x - visual_cursor.w*0.5f; - - /* draw slider */ - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_slider(out, *state, style, &bounds, &visual_cursor, slider_min, slider_value, slider_max); - if (style->draw_end) style->draw_end(out, style->userdata); - return slider_value; -} -NK_API nk_bool -nk_slider_float(struct nk_context *ctx, float min_value, float *value, float max_value, - float value_step) -{ - struct nk_window *win; - struct nk_panel *layout; - struct nk_input *in; - const struct nk_style *style; - - int ret = 0; - float old_value; - struct nk_rect bounds; - enum nk_widget_layout_states state; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - NK_ASSERT(value); - if (!ctx || !ctx->current || !ctx->current->layout || !value) - return ret; - - win = ctx->current; - style = &ctx->style; - layout = win->layout; - - state = nk_widget(&bounds, ctx); - if (!state) return ret; - in = (/*state == NK_WIDGET_ROM || */ layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - - old_value = *value; - *value = nk_do_slider(&ctx->last_widget_state, &win->buffer, bounds, min_value, - old_value, max_value, value_step, &style->slider, in, style->font); - return (old_value > *value || old_value < *value); -} -NK_API float -nk_slide_float(struct nk_context *ctx, float min, float val, float max, float step) -{ - nk_slider_float(ctx, min, &val, max, step); return val; -} -NK_API int -nk_slide_int(struct nk_context *ctx, int min, int val, int max, int step) -{ - float value = (float)val; - nk_slider_float(ctx, (float)min, &value, (float)max, (float)step); - return (int)value; -} -NK_API nk_bool -nk_slider_int(struct nk_context *ctx, int min, int *val, int max, int step) -{ - int ret; - float value = (float)*val; - ret = nk_slider_float(ctx, (float)min, &value, (float)max, (float)step); - *val = (int)value; - return ret; -} - - - - - -/* =============================================================== - * - * PROGRESS - * - * ===============================================================*/ -NK_LIB nk_size -nk_progress_behavior(nk_flags *state, struct nk_input *in, - struct nk_rect r, struct nk_rect cursor, nk_size max, nk_size value, nk_bool modifiable) -{ - int left_mouse_down = 0; - int left_mouse_click_in_cursor = 0; - - nk_widget_state_reset(state); - if (!in || !modifiable) return value; - left_mouse_down = in && in->mouse.buttons[NK_BUTTON_LEFT].down; - left_mouse_click_in_cursor = in && nk_input_has_mouse_click_down_in_rect(in, - NK_BUTTON_LEFT, cursor, nk_true); - if (nk_input_is_mouse_hovering_rect(in, r)) - *state = NK_WIDGET_STATE_HOVERED; - - if (in && left_mouse_down && left_mouse_click_in_cursor) { - if (left_mouse_down && left_mouse_click_in_cursor) { - float ratio = NK_MAX(0, (float)(in->mouse.pos.x - cursor.x)) / (float)cursor.w; - value = (nk_size)NK_CLAMP(0, (float)max * ratio, (float)max); - in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = cursor.x + cursor.w/2.0f; - *state |= NK_WIDGET_STATE_ACTIVE; - } - } - /* set progressbar widget state */ - if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, r)) - *state |= NK_WIDGET_STATE_ENTERED; - else if (nk_input_is_mouse_prev_hovering_rect(in, r)) - *state |= NK_WIDGET_STATE_LEFT; - return value; -} -NK_LIB void -nk_draw_progress(struct nk_command_buffer *out, nk_flags state, - const struct nk_style_progress *style, const struct nk_rect *bounds, - const struct nk_rect *scursor, nk_size value, nk_size max) -{ - const struct nk_style_item *background; - const struct nk_style_item *cursor; - - NK_UNUSED(max); - NK_UNUSED(value); - - /* select correct colors/images to draw */ - if (state & NK_WIDGET_STATE_ACTIVED) { - background = &style->active; - cursor = &style->cursor_active; - } else if (state & NK_WIDGET_STATE_HOVER){ - background = &style->hover; - cursor = &style->cursor_hover; - } else { - background = &style->normal; - cursor = &style->cursor_normal; - } - - /* draw background */ - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(out, *bounds, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(out, *bounds, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(out, *bounds, style->rounding, background->data.color); - nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color); - break; - } - - /* draw cursor */ - switch(cursor->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(out, *scursor, &cursor->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(out, *scursor, &cursor->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(out, *scursor, style->rounding, cursor->data.color); - nk_stroke_rect(out, *scursor, style->rounding, style->border, style->border_color); - break; - } -} -NK_LIB nk_size -nk_do_progress(nk_flags *state, - struct nk_command_buffer *out, struct nk_rect bounds, - nk_size value, nk_size max, nk_bool modifiable, - const struct nk_style_progress *style, struct nk_input *in) -{ - float prog_scale; - nk_size prog_value; - struct nk_rect cursor; - - NK_ASSERT(style); - NK_ASSERT(out); - if (!out || !style) return 0; - - /* calculate progressbar cursor */ - cursor.w = NK_MAX(bounds.w, 2 * style->padding.x + 2 * style->border); - cursor.h = NK_MAX(bounds.h, 2 * style->padding.y + 2 * style->border); - cursor = nk_pad_rect(bounds, nk_vec2(style->padding.x + style->border, style->padding.y + style->border)); - prog_scale = (float)value / (float)max; - - /* update progressbar */ - prog_value = NK_MIN(value, max); - prog_value = nk_progress_behavior(state, in, bounds, cursor,max, prog_value, modifiable); - cursor.w = cursor.w * prog_scale; - - /* draw progressbar */ - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_progress(out, *state, style, &bounds, &cursor, value, max); - if (style->draw_end) style->draw_end(out, style->userdata); - return prog_value; -} -NK_API nk_bool -nk_progress(struct nk_context *ctx, nk_size *cur, nk_size max, nk_bool is_modifyable) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_style *style; - struct nk_input *in; - - struct nk_rect bounds; - enum nk_widget_layout_states state; - nk_size old_value; - - NK_ASSERT(ctx); - NK_ASSERT(cur); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout || !cur) - return 0; - - win = ctx->current; - style = &ctx->style; - layout = win->layout; - state = nk_widget(&bounds, ctx); - if (!state) return 0; - - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - old_value = *cur; - *cur = nk_do_progress(&ctx->last_widget_state, &win->buffer, bounds, - *cur, max, is_modifyable, &style->progress, in); - return (*cur != old_value); -} -NK_API nk_size -nk_prog(struct nk_context *ctx, nk_size cur, nk_size max, nk_bool modifyable) -{ - nk_progress(ctx, &cur, max, modifyable); - return cur; -} - - - - - -/* =============================================================== - * - * SCROLLBAR - * - * ===============================================================*/ -NK_LIB float -nk_scrollbar_behavior(nk_flags *state, struct nk_input *in, - int has_scrolling, const struct nk_rect *scroll, - const struct nk_rect *cursor, const struct nk_rect *empty0, - const struct nk_rect *empty1, float scroll_offset, - float target, float scroll_step, enum nk_orientation o) -{ - nk_flags ws = 0; - int left_mouse_down; - unsigned int left_mouse_clicked; - int left_mouse_click_in_cursor; - float scroll_delta; - - nk_widget_state_reset(state); - if (!in) return scroll_offset; - - left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down; - left_mouse_clicked = in->mouse.buttons[NK_BUTTON_LEFT].clicked; - left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in, - NK_BUTTON_LEFT, *cursor, nk_true); - if (nk_input_is_mouse_hovering_rect(in, *scroll)) - *state = NK_WIDGET_STATE_HOVERED; - - scroll_delta = (o == NK_VERTICAL) ? in->mouse.scroll_delta.y: in->mouse.scroll_delta.x; - if (left_mouse_down && left_mouse_click_in_cursor && !left_mouse_clicked) { - /* update cursor by mouse dragging */ - float pixel, delta; - *state = NK_WIDGET_STATE_ACTIVE; - if (o == NK_VERTICAL) { - float cursor_y; - pixel = in->mouse.delta.y; - delta = (pixel / scroll->h) * target; - scroll_offset = NK_CLAMP(0, scroll_offset + delta, target - scroll->h); - cursor_y = scroll->y + ((scroll_offset/target) * scroll->h); - in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y = cursor_y + cursor->h/2.0f; - } else { - float cursor_x; - pixel = in->mouse.delta.x; - delta = (pixel / scroll->w) * target; - scroll_offset = NK_CLAMP(0, scroll_offset + delta, target - scroll->w); - cursor_x = scroll->x + ((scroll_offset/target) * scroll->w); - in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = cursor_x + cursor->w/2.0f; - } - } else if ((nk_input_is_key_pressed(in, NK_KEY_SCROLL_UP) && o == NK_VERTICAL && has_scrolling)|| - nk_button_behavior(&ws, *empty0, in, NK_BUTTON_DEFAULT)) { - /* scroll page up by click on empty space or shortcut */ - if (o == NK_VERTICAL) - scroll_offset = NK_MAX(0, scroll_offset - scroll->h); - else scroll_offset = NK_MAX(0, scroll_offset - scroll->w); - } else if ((nk_input_is_key_pressed(in, NK_KEY_SCROLL_DOWN) && o == NK_VERTICAL && has_scrolling) || - nk_button_behavior(&ws, *empty1, in, NK_BUTTON_DEFAULT)) { - /* scroll page down by click on empty space or shortcut */ - if (o == NK_VERTICAL) - scroll_offset = NK_MIN(scroll_offset + scroll->h, target - scroll->h); - else scroll_offset = NK_MIN(scroll_offset + scroll->w, target - scroll->w); - } else if (has_scrolling) { - if ((scroll_delta < 0 || (scroll_delta > 0))) { - /* update cursor by mouse scrolling */ - scroll_offset = scroll_offset + scroll_step * (-scroll_delta); - if (o == NK_VERTICAL) - scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->h); - else scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->w); - } else if (nk_input_is_key_pressed(in, NK_KEY_SCROLL_START)) { - /* update cursor to the beginning */ - if (o == NK_VERTICAL) scroll_offset = 0; - } else if (nk_input_is_key_pressed(in, NK_KEY_SCROLL_END)) { - /* update cursor to the end */ - if (o == NK_VERTICAL) scroll_offset = target - scroll->h; - } - } - if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, *scroll)) - *state |= NK_WIDGET_STATE_ENTERED; - else if (nk_input_is_mouse_prev_hovering_rect(in, *scroll)) - *state |= NK_WIDGET_STATE_LEFT; - return scroll_offset; -} -NK_LIB void -nk_draw_scrollbar(struct nk_command_buffer *out, nk_flags state, - const struct nk_style_scrollbar *style, const struct nk_rect *bounds, - const struct nk_rect *scroll) -{ - const struct nk_style_item *background; - const struct nk_style_item *cursor; - - /* select correct colors/images to draw */ - if (state & NK_WIDGET_STATE_ACTIVED) { - background = &style->active; - cursor = &style->cursor_active; - } else if (state & NK_WIDGET_STATE_HOVER) { - background = &style->hover; - cursor = &style->cursor_hover; - } else { - background = &style->normal; - cursor = &style->cursor_normal; - } - - /* draw background */ - switch (background->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(out, *bounds, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(out, *bounds, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(out, *bounds, style->rounding, background->data.color); - nk_stroke_rect(out, *bounds, style->rounding, style->border, style->border_color); - break; - } - - /* draw cursor */ - switch (cursor->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(out, *scroll, &cursor->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(out, *scroll, &cursor->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(out, *scroll, style->rounding_cursor, cursor->data.color); - nk_stroke_rect(out, *scroll, style->rounding_cursor, style->border_cursor, style->cursor_border_color); - break; - } -} -NK_LIB float -nk_do_scrollbarv(nk_flags *state, - struct nk_command_buffer *out, struct nk_rect scroll, int has_scrolling, - float offset, float target, float step, float button_pixel_inc, - const struct nk_style_scrollbar *style, struct nk_input *in, - const struct nk_user_font *font) -{ - struct nk_rect empty_north; - struct nk_rect empty_south; - struct nk_rect cursor; - - float scroll_step; - float scroll_offset; - float scroll_off; - float scroll_ratio; - - NK_ASSERT(out); - NK_ASSERT(style); - NK_ASSERT(state); - if (!out || !style) return 0; - - scroll.w = NK_MAX(scroll.w, 1); - scroll.h = NK_MAX(scroll.h, 0); - if (target <= scroll.h) return 0; - - /* optional scrollbar buttons */ - if (style->show_buttons) { - nk_flags ws; - float scroll_h; - struct nk_rect button; - - button.x = scroll.x; - button.w = scroll.w; - button.h = scroll.w; - - scroll_h = NK_MAX(scroll.h - 2 * button.h,0); - scroll_step = NK_MIN(step, button_pixel_inc); - - /* decrement button */ - button.y = scroll.y; - if (nk_do_button_symbol(&ws, out, button, style->dec_symbol, - NK_BUTTON_REPEATER, &style->dec_button, in, font)) - offset = offset - scroll_step; - - /* increment button */ - button.y = scroll.y + scroll.h - button.h; - if (nk_do_button_symbol(&ws, out, button, style->inc_symbol, - NK_BUTTON_REPEATER, &style->inc_button, in, font)) - offset = offset + scroll_step; - - scroll.y = scroll.y + button.h; - scroll.h = scroll_h; - } - - /* calculate scrollbar constants */ - scroll_step = NK_MIN(step, scroll.h); - scroll_offset = NK_CLAMP(0, offset, target - scroll.h); - scroll_ratio = scroll.h / target; - scroll_off = scroll_offset / target; - - /* calculate scrollbar cursor bounds */ - cursor.h = NK_MAX((scroll_ratio * scroll.h) - (2*style->border + 2*style->padding.y), 0); - cursor.y = scroll.y + (scroll_off * scroll.h) + style->border + style->padding.y; - cursor.w = scroll.w - (2 * style->border + 2 * style->padding.x); - cursor.x = scroll.x + style->border + style->padding.x; - - /* calculate empty space around cursor */ - empty_north.x = scroll.x; - empty_north.y = scroll.y; - empty_north.w = scroll.w; - empty_north.h = NK_MAX(cursor.y - scroll.y, 0); - - empty_south.x = scroll.x; - empty_south.y = cursor.y + cursor.h; - empty_south.w = scroll.w; - empty_south.h = NK_MAX((scroll.y + scroll.h) - (cursor.y + cursor.h), 0); - - /* update scrollbar */ - scroll_offset = nk_scrollbar_behavior(state, in, has_scrolling, &scroll, &cursor, - &empty_north, &empty_south, scroll_offset, target, scroll_step, NK_VERTICAL); - scroll_off = scroll_offset / target; - cursor.y = scroll.y + (scroll_off * scroll.h) + style->border_cursor + style->padding.y; - - /* draw scrollbar */ - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_scrollbar(out, *state, style, &scroll, &cursor); - if (style->draw_end) style->draw_end(out, style->userdata); - return scroll_offset; -} -NK_LIB float -nk_do_scrollbarh(nk_flags *state, - struct nk_command_buffer *out, struct nk_rect scroll, int has_scrolling, - float offset, float target, float step, float button_pixel_inc, - const struct nk_style_scrollbar *style, struct nk_input *in, - const struct nk_user_font *font) -{ - struct nk_rect cursor; - struct nk_rect empty_west; - struct nk_rect empty_east; - - float scroll_step; - float scroll_offset; - float scroll_off; - float scroll_ratio; - - NK_ASSERT(out); - NK_ASSERT(style); - if (!out || !style) return 0; - - /* scrollbar background */ - scroll.h = NK_MAX(scroll.h, 1); - scroll.w = NK_MAX(scroll.w, 2 * scroll.h); - if (target <= scroll.w) return 0; - - /* optional scrollbar buttons */ - if (style->show_buttons) { - nk_flags ws; - float scroll_w; - struct nk_rect button; - button.y = scroll.y; - button.w = scroll.h; - button.h = scroll.h; - - scroll_w = scroll.w - 2 * button.w; - scroll_step = NK_MIN(step, button_pixel_inc); - - /* decrement button */ - button.x = scroll.x; - if (nk_do_button_symbol(&ws, out, button, style->dec_symbol, - NK_BUTTON_REPEATER, &style->dec_button, in, font)) - offset = offset - scroll_step; - - /* increment button */ - button.x = scroll.x + scroll.w - button.w; - if (nk_do_button_symbol(&ws, out, button, style->inc_symbol, - NK_BUTTON_REPEATER, &style->inc_button, in, font)) - offset = offset + scroll_step; - - scroll.x = scroll.x + button.w; - scroll.w = scroll_w; - } - - /* calculate scrollbar constants */ - scroll_step = NK_MIN(step, scroll.w); - scroll_offset = NK_CLAMP(0, offset, target - scroll.w); - scroll_ratio = scroll.w / target; - scroll_off = scroll_offset / target; - - /* calculate cursor bounds */ - cursor.w = (scroll_ratio * scroll.w) - (2*style->border + 2*style->padding.x); - cursor.x = scroll.x + (scroll_off * scroll.w) + style->border + style->padding.x; - cursor.h = scroll.h - (2 * style->border + 2 * style->padding.y); - cursor.y = scroll.y + style->border + style->padding.y; - - /* calculate empty space around cursor */ - empty_west.x = scroll.x; - empty_west.y = scroll.y; - empty_west.w = cursor.x - scroll.x; - empty_west.h = scroll.h; - - empty_east.x = cursor.x + cursor.w; - empty_east.y = scroll.y; - empty_east.w = (scroll.x + scroll.w) - (cursor.x + cursor.w); - empty_east.h = scroll.h; - - /* update scrollbar */ - scroll_offset = nk_scrollbar_behavior(state, in, has_scrolling, &scroll, &cursor, - &empty_west, &empty_east, scroll_offset, target, scroll_step, NK_HORIZONTAL); - scroll_off = scroll_offset / target; - cursor.x = scroll.x + (scroll_off * scroll.w); - - /* draw scrollbar */ - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_scrollbar(out, *state, style, &scroll, &cursor); - if (style->draw_end) style->draw_end(out, style->userdata); - return scroll_offset; -} - - - - - -/* =============================================================== - * - * TEXT EDITOR - * - * ===============================================================*/ -/* stb_textedit.h - v1.8 - public domain - Sean Barrett */ -struct nk_text_find { - float x,y; /* position of n'th character */ - float height; /* height of line */ - int first_char, length; /* first char of row, and length */ - int prev_first; /*_ first char of previous row */ -}; - -struct nk_text_edit_row { - float x0,x1; - /* starting x location, end x location (allows for align=right, etc) */ - float baseline_y_delta; - /* position of baseline relative to previous row's baseline*/ - float ymin,ymax; - /* height of row above and below baseline */ - int num_chars; -}; - -/* forward declarations */ -NK_INTERN void nk_textedit_makeundo_delete(struct nk_text_edit*, int, int); -NK_INTERN void nk_textedit_makeundo_insert(struct nk_text_edit*, int, int); -NK_INTERN void nk_textedit_makeundo_replace(struct nk_text_edit*, int, int, int); -#define NK_TEXT_HAS_SELECTION(s) ((s)->select_start != (s)->select_end) - -NK_INTERN float -nk_textedit_get_width(const struct nk_text_edit *edit, int line_start, int char_id, - const struct nk_user_font *font) -{ - int len = 0; - nk_rune unicode = 0; - const char *str = nk_str_at_const(&edit->string, line_start + char_id, &unicode, &len); - return font->width(font->userdata, font->height, str, len); -} -NK_INTERN void -nk_textedit_layout_row(struct nk_text_edit_row *r, struct nk_text_edit *edit, - int line_start_id, float row_height, const struct nk_user_font *font) -{ - int l; - int glyphs = 0; - nk_rune unicode; - const char *remaining; - int len = nk_str_len_char(&edit->string); - const char *end = nk_str_get_const(&edit->string) + len; - const char *text = nk_str_at_const(&edit->string, line_start_id, &unicode, &l); - const struct nk_vec2 size = nk_text_calculate_text_bounds(font, - text, (int)(end - text), row_height, &remaining, 0, &glyphs, NK_STOP_ON_NEW_LINE); - - r->x0 = 0.0f; - r->x1 = size.x; - r->baseline_y_delta = size.y; - r->ymin = 0.0f; - r->ymax = size.y; - r->num_chars = glyphs; -} -NK_INTERN int -nk_textedit_locate_coord(struct nk_text_edit *edit, float x, float y, - const struct nk_user_font *font, float row_height) -{ - struct nk_text_edit_row r; - int n = edit->string.len; - float base_y = 0, prev_x; - int i=0, k; - - r.x0 = r.x1 = 0; - r.ymin = r.ymax = 0; - r.num_chars = 0; - - /* search rows to find one that straddles 'y' */ - while (i < n) { - nk_textedit_layout_row(&r, edit, i, row_height, font); - if (r.num_chars <= 0) - return n; - - if (i==0 && y < base_y + r.ymin) - return 0; - - if (y < base_y + r.ymax) - break; - - i += r.num_chars; - base_y += r.baseline_y_delta; - } - - /* below all text, return 'after' last character */ - if (i >= n) - return n; - - /* check if it's before the beginning of the line */ - if (x < r.x0) - return i; - - /* check if it's before the end of the line */ - if (x < r.x1) { - /* search characters in row for one that straddles 'x' */ - k = i; - prev_x = r.x0; - for (i=0; i < r.num_chars; ++i) { - float w = nk_textedit_get_width(edit, k, i, font); - if (x < prev_x+w) { - if (x < prev_x+w/2) - return k+i; - else return k+i+1; - } - prev_x += w; - } - /* shouldn't happen, but if it does, fall through to end-of-line case */ - } - - /* if the last character is a newline, return that. - * otherwise return 'after' the last character */ - if (nk_str_rune_at(&edit->string, i+r.num_chars-1) == '\n') - return i+r.num_chars-1; - else return i+r.num_chars; -} -NK_LIB void -nk_textedit_click(struct nk_text_edit *state, float x, float y, - const struct nk_user_font *font, float row_height) -{ - /* API click: on mouse down, move the cursor to the clicked location, - * and reset the selection */ - state->cursor = nk_textedit_locate_coord(state, x, y, font, row_height); - state->select_start = state->cursor; - state->select_end = state->cursor; - state->has_preferred_x = 0; -} -NK_LIB void -nk_textedit_drag(struct nk_text_edit *state, float x, float y, - const struct nk_user_font *font, float row_height) -{ - /* API drag: on mouse drag, move the cursor and selection endpoint - * to the clicked location */ - int p = nk_textedit_locate_coord(state, x, y, font, row_height); - if (state->select_start == state->select_end) - state->select_start = state->cursor; - state->cursor = state->select_end = p; -} -NK_INTERN void -nk_textedit_find_charpos(struct nk_text_find *find, struct nk_text_edit *state, - int n, int single_line, const struct nk_user_font *font, float row_height) -{ - /* find the x/y location of a character, and remember info about the previous - * row in case we get a move-up event (for page up, we'll have to rescan) */ - struct nk_text_edit_row r; - int prev_start = 0; - int z = state->string.len; - int i=0, first; - - nk_zero_struct(r); - if (n == z) { - /* if it's at the end, then find the last line -- simpler than trying to - explicitly handle this case in the regular code */ - nk_textedit_layout_row(&r, state, 0, row_height, font); - if (single_line) { - find->first_char = 0; - find->length = z; - } else { - while (i < z) { - prev_start = i; - i += r.num_chars; - nk_textedit_layout_row(&r, state, i, row_height, font); - } - - find->first_char = i; - find->length = r.num_chars; - } - find->x = r.x1; - find->y = r.ymin; - find->height = r.ymax - r.ymin; - find->prev_first = prev_start; - return; - } - - /* search rows to find the one that straddles character n */ - find->y = 0; - - for(;;) { - nk_textedit_layout_row(&r, state, i, row_height, font); - if (n < i + r.num_chars) break; - prev_start = i; - i += r.num_chars; - find->y += r.baseline_y_delta; - } - - find->first_char = first = i; - find->length = r.num_chars; - find->height = r.ymax - r.ymin; - find->prev_first = prev_start; - - /* now scan to find xpos */ - find->x = r.x0; - for (i=0; first+i < n; ++i) - find->x += nk_textedit_get_width(state, first, i, font); -} -NK_INTERN void -nk_textedit_clamp(struct nk_text_edit *state) -{ - /* make the selection/cursor state valid if client altered the string */ - int n = state->string.len; - if (NK_TEXT_HAS_SELECTION(state)) { - if (state->select_start > n) state->select_start = n; - if (state->select_end > n) state->select_end = n; - /* if clamping forced them to be equal, move the cursor to match */ - if (state->select_start == state->select_end) - state->cursor = state->select_start; - } - if (state->cursor > n) state->cursor = n; -} -NK_API void -nk_textedit_delete(struct nk_text_edit *state, int where, int len) -{ - /* delete characters while updating undo */ - nk_textedit_makeundo_delete(state, where, len); - nk_str_delete_runes(&state->string, where, len); - state->has_preferred_x = 0; -} -NK_API void -nk_textedit_delete_selection(struct nk_text_edit *state) -{ - /* delete the section */ - nk_textedit_clamp(state); - if (NK_TEXT_HAS_SELECTION(state)) { - if (state->select_start < state->select_end) { - nk_textedit_delete(state, state->select_start, - state->select_end - state->select_start); - state->select_end = state->cursor = state->select_start; - } else { - nk_textedit_delete(state, state->select_end, - state->select_start - state->select_end); - state->select_start = state->cursor = state->select_end; - } - state->has_preferred_x = 0; - } -} -NK_INTERN void -nk_textedit_sortselection(struct nk_text_edit *state) -{ - /* canonicalize the selection so start <= end */ - if (state->select_end < state->select_start) { - int temp = state->select_end; - state->select_end = state->select_start; - state->select_start = temp; - } -} -NK_INTERN void -nk_textedit_move_to_first(struct nk_text_edit *state) -{ - /* move cursor to first character of selection */ - if (NK_TEXT_HAS_SELECTION(state)) { - nk_textedit_sortselection(state); - state->cursor = state->select_start; - state->select_end = state->select_start; - state->has_preferred_x = 0; - } -} -NK_INTERN void -nk_textedit_move_to_last(struct nk_text_edit *state) -{ - /* move cursor to last character of selection */ - if (NK_TEXT_HAS_SELECTION(state)) { - nk_textedit_sortselection(state); - nk_textedit_clamp(state); - state->cursor = state->select_end; - state->select_start = state->select_end; - state->has_preferred_x = 0; - } -} -NK_INTERN int -nk_is_word_boundary( struct nk_text_edit *state, int idx) -{ - int len; - nk_rune c; - if (idx <= 0) return 1; - if (!nk_str_at_rune(&state->string, idx, &c, &len)) return 1; - return (c == ' ' || c == '\t' ||c == 0x3000 || c == ',' || c == ';' || - c == '(' || c == ')' || c == '{' || c == '}' || c == '[' || c == ']' || - c == '|'); -} -NK_INTERN int -nk_textedit_move_to_word_previous(struct nk_text_edit *state) -{ - int c = state->cursor - 1; - while( c >= 0 && !nk_is_word_boundary(state, c)) - --c; - - if( c < 0 ) - c = 0; - - return c; -} -NK_INTERN int -nk_textedit_move_to_word_next(struct nk_text_edit *state) -{ - const int len = state->string.len; - int c = state->cursor+1; - while( c < len && !nk_is_word_boundary(state, c)) - ++c; - - if( c > len ) - c = len; - - return c; -} -NK_INTERN void -nk_textedit_prep_selection_at_cursor(struct nk_text_edit *state) -{ - /* update selection and cursor to match each other */ - if (!NK_TEXT_HAS_SELECTION(state)) - state->select_start = state->select_end = state->cursor; - else state->cursor = state->select_end; -} -NK_API nk_bool -nk_textedit_cut(struct nk_text_edit *state) -{ - /* API cut: delete selection */ - if (state->mode == NK_TEXT_EDIT_MODE_VIEW) - return 0; - if (NK_TEXT_HAS_SELECTION(state)) { - nk_textedit_delete_selection(state); /* implicitly clamps */ - state->has_preferred_x = 0; - return 1; - } - return 0; -} -NK_API nk_bool -nk_textedit_paste(struct nk_text_edit *state, char const *ctext, int len) -{ - /* API paste: replace existing selection with passed-in text */ - int glyphs; - const char *text = (const char *) ctext; - if (state->mode == NK_TEXT_EDIT_MODE_VIEW) return 0; - - /* if there's a selection, the paste should delete it */ - nk_textedit_clamp(state); - nk_textedit_delete_selection(state); - - /* try to insert the characters */ - glyphs = nk_utf_len(ctext, len); - if (nk_str_insert_text_char(&state->string, state->cursor, text, len)) { - nk_textedit_makeundo_insert(state, state->cursor, glyphs); - state->cursor += len; - state->has_preferred_x = 0; - return 1; - } - /* remove the undo since we didn't actually insert the characters */ - if (state->undo.undo_point) - --state->undo.undo_point; - return 0; -} -NK_API void -nk_textedit_text(struct nk_text_edit *state, const char *text, int total_len) -{ - nk_rune unicode; - int glyph_len; - int text_len = 0; - - NK_ASSERT(state); - NK_ASSERT(text); - if (!text || !total_len || state->mode == NK_TEXT_EDIT_MODE_VIEW) return; - - glyph_len = nk_utf_decode(text, &unicode, total_len); - while ((text_len < total_len) && glyph_len) - { - /* don't insert a backward delete, just process the event */ - if (unicode == 127) goto next; - /* can't add newline in single-line mode */ - if (unicode == '\n' && state->single_line) goto next; - /* filter incoming text */ - if (state->filter && !state->filter(state, unicode)) goto next; - - if (!NK_TEXT_HAS_SELECTION(state) && - state->cursor < state->string.len) - { - if (state->mode == NK_TEXT_EDIT_MODE_REPLACE) { - nk_textedit_makeundo_replace(state, state->cursor, 1, 1); - nk_str_delete_runes(&state->string, state->cursor, 1); - } - if (nk_str_insert_text_utf8(&state->string, state->cursor, - text+text_len, 1)) - { - ++state->cursor; - state->has_preferred_x = 0; - } - } else { - nk_textedit_delete_selection(state); /* implicitly clamps */ - if (nk_str_insert_text_utf8(&state->string, state->cursor, - text+text_len, 1)) - { - nk_textedit_makeundo_insert(state, state->cursor, 1); - state->cursor = NK_MIN(state->cursor + 1, state->string.len); - state->has_preferred_x = 0; - } - } - next: - text_len += glyph_len; - glyph_len = nk_utf_decode(text + text_len, &unicode, total_len-text_len); - } -} -NK_LIB void -nk_textedit_key(struct nk_text_edit *state, enum nk_keys key, int shift_mod, - const struct nk_user_font *font, float row_height) -{ -retry: - switch (key) - { - case NK_KEY_NONE: - case NK_KEY_CTRL: - case NK_KEY_ENTER: - case NK_KEY_SHIFT: - case NK_KEY_TAB: - case NK_KEY_COPY: - case NK_KEY_CUT: - case NK_KEY_PASTE: - case NK_KEY_MAX: - default: break; - case NK_KEY_TEXT_UNDO: - nk_textedit_undo(state); - state->has_preferred_x = 0; - break; - - case NK_KEY_TEXT_REDO: - nk_textedit_redo(state); - state->has_preferred_x = 0; - break; - - case NK_KEY_TEXT_SELECT_ALL: - nk_textedit_select_all(state); - state->has_preferred_x = 0; - break; - - case NK_KEY_TEXT_INSERT_MODE: - if (state->mode == NK_TEXT_EDIT_MODE_VIEW) - state->mode = NK_TEXT_EDIT_MODE_INSERT; - break; - case NK_KEY_TEXT_REPLACE_MODE: - if (state->mode == NK_TEXT_EDIT_MODE_VIEW) - state->mode = NK_TEXT_EDIT_MODE_REPLACE; - break; - case NK_KEY_TEXT_RESET_MODE: - if (state->mode == NK_TEXT_EDIT_MODE_INSERT || - state->mode == NK_TEXT_EDIT_MODE_REPLACE) - state->mode = NK_TEXT_EDIT_MODE_VIEW; - break; - - case NK_KEY_LEFT: - if (shift_mod) { - nk_textedit_clamp(state); - nk_textedit_prep_selection_at_cursor(state); - /* move selection left */ - if (state->select_end > 0) - --state->select_end; - state->cursor = state->select_end; - state->has_preferred_x = 0; - } else { - /* if currently there's a selection, - * move cursor to start of selection */ - if (NK_TEXT_HAS_SELECTION(state)) - nk_textedit_move_to_first(state); - else if (state->cursor > 0) - --state->cursor; - state->has_preferred_x = 0; - } break; - - case NK_KEY_RIGHT: - if (shift_mod) { - nk_textedit_prep_selection_at_cursor(state); - /* move selection right */ - ++state->select_end; - nk_textedit_clamp(state); - state->cursor = state->select_end; - state->has_preferred_x = 0; - } else { - /* if currently there's a selection, - * move cursor to end of selection */ - if (NK_TEXT_HAS_SELECTION(state)) - nk_textedit_move_to_last(state); - else ++state->cursor; - nk_textedit_clamp(state); - state->has_preferred_x = 0; - } break; - - case NK_KEY_TEXT_WORD_LEFT: - if (shift_mod) { - if( !NK_TEXT_HAS_SELECTION( state ) ) - nk_textedit_prep_selection_at_cursor(state); - state->cursor = nk_textedit_move_to_word_previous(state); - state->select_end = state->cursor; - nk_textedit_clamp(state ); - } else { - if (NK_TEXT_HAS_SELECTION(state)) - nk_textedit_move_to_first(state); - else { - state->cursor = nk_textedit_move_to_word_previous(state); - nk_textedit_clamp(state ); - } - } break; - - case NK_KEY_TEXT_WORD_RIGHT: - if (shift_mod) { - if( !NK_TEXT_HAS_SELECTION( state ) ) - nk_textedit_prep_selection_at_cursor(state); - state->cursor = nk_textedit_move_to_word_next(state); - state->select_end = state->cursor; - nk_textedit_clamp(state); - } else { - if (NK_TEXT_HAS_SELECTION(state)) - nk_textedit_move_to_last(state); - else { - state->cursor = nk_textedit_move_to_word_next(state); - nk_textedit_clamp(state ); - } - } break; - - case NK_KEY_DOWN: { - struct nk_text_find find; - struct nk_text_edit_row row; - int i, sel = shift_mod; - - if (state->single_line) { - /* on windows, up&down in single-line behave like left&right */ - key = NK_KEY_RIGHT; - goto retry; - } - - if (sel) - nk_textedit_prep_selection_at_cursor(state); - else if (NK_TEXT_HAS_SELECTION(state)) - nk_textedit_move_to_last(state); - - /* compute current position of cursor point */ - nk_textedit_clamp(state); - nk_textedit_find_charpos(&find, state, state->cursor, state->single_line, - font, row_height); - - /* now find character position down a row */ - if (find.length) - { - float x; - float goal_x = state->has_preferred_x ? state->preferred_x : find.x; - int start = find.first_char + find.length; - - state->cursor = start; - nk_textedit_layout_row(&row, state, state->cursor, row_height, font); - x = row.x0; - - for (i=0; i < row.num_chars && x < row.x1; ++i) { - float dx = nk_textedit_get_width(state, start, i, font); - x += dx; - if (x > goal_x) - break; - ++state->cursor; - } - nk_textedit_clamp(state); - - state->has_preferred_x = 1; - state->preferred_x = goal_x; - if (sel) - state->select_end = state->cursor; - } - } break; - - case NK_KEY_UP: { - struct nk_text_find find; - struct nk_text_edit_row row; - int i, sel = shift_mod; - - if (state->single_line) { - /* on windows, up&down become left&right */ - key = NK_KEY_LEFT; - goto retry; - } - - if (sel) - nk_textedit_prep_selection_at_cursor(state); - else if (NK_TEXT_HAS_SELECTION(state)) - nk_textedit_move_to_first(state); - - /* compute current position of cursor point */ - nk_textedit_clamp(state); - nk_textedit_find_charpos(&find, state, state->cursor, state->single_line, - font, row_height); - - /* can only go up if there's a previous row */ - if (find.prev_first != find.first_char) { - /* now find character position up a row */ - float x; - float goal_x = state->has_preferred_x ? state->preferred_x : find.x; - - state->cursor = find.prev_first; - nk_textedit_layout_row(&row, state, state->cursor, row_height, font); - x = row.x0; - - for (i=0; i < row.num_chars && x < row.x1; ++i) { - float dx = nk_textedit_get_width(state, find.prev_first, i, font); - x += dx; - if (x > goal_x) - break; - ++state->cursor; - } - nk_textedit_clamp(state); - - state->has_preferred_x = 1; - state->preferred_x = goal_x; - if (sel) state->select_end = state->cursor; - } - } break; - - case NK_KEY_DEL: - if (state->mode == NK_TEXT_EDIT_MODE_VIEW) - break; - if (NK_TEXT_HAS_SELECTION(state)) - nk_textedit_delete_selection(state); - else { - int n = state->string.len; - if (state->cursor < n) - nk_textedit_delete(state, state->cursor, 1); - } - state->has_preferred_x = 0; - break; - - case NK_KEY_BACKSPACE: - if (state->mode == NK_TEXT_EDIT_MODE_VIEW) - break; - if (NK_TEXT_HAS_SELECTION(state)) - nk_textedit_delete_selection(state); - else { - nk_textedit_clamp(state); - if (state->cursor > 0) { - nk_textedit_delete(state, state->cursor-1, 1); - --state->cursor; - } - } - state->has_preferred_x = 0; - break; - - case NK_KEY_TEXT_START: - if (shift_mod) { - nk_textedit_prep_selection_at_cursor(state); - state->cursor = state->select_end = 0; - state->has_preferred_x = 0; - } else { - state->cursor = state->select_start = state->select_end = 0; - state->has_preferred_x = 0; - } - break; - - case NK_KEY_TEXT_END: - if (shift_mod) { - nk_textedit_prep_selection_at_cursor(state); - state->cursor = state->select_end = state->string.len; - state->has_preferred_x = 0; - } else { - state->cursor = state->string.len; - state->select_start = state->select_end = 0; - state->has_preferred_x = 0; - } - break; - - case NK_KEY_TEXT_LINE_START: { - if (shift_mod) { - struct nk_text_find find; - nk_textedit_clamp(state); - nk_textedit_prep_selection_at_cursor(state); - if (state->string.len && state->cursor == state->string.len) - --state->cursor; - nk_textedit_find_charpos(&find, state,state->cursor, state->single_line, - font, row_height); - state->cursor = state->select_end = find.first_char; - state->has_preferred_x = 0; - } else { - struct nk_text_find find; - if (state->string.len && state->cursor == state->string.len) - --state->cursor; - nk_textedit_clamp(state); - nk_textedit_move_to_first(state); - nk_textedit_find_charpos(&find, state, state->cursor, state->single_line, - font, row_height); - state->cursor = find.first_char; - state->has_preferred_x = 0; - } - } break; - - case NK_KEY_TEXT_LINE_END: { - if (shift_mod) { - struct nk_text_find find; - nk_textedit_clamp(state); - nk_textedit_prep_selection_at_cursor(state); - nk_textedit_find_charpos(&find, state, state->cursor, state->single_line, - font, row_height); - state->has_preferred_x = 0; - state->cursor = find.first_char + find.length; - if (find.length > 0 && nk_str_rune_at(&state->string, state->cursor-1) == '\n') - --state->cursor; - state->select_end = state->cursor; - } else { - struct nk_text_find find; - nk_textedit_clamp(state); - nk_textedit_move_to_first(state); - nk_textedit_find_charpos(&find, state, state->cursor, state->single_line, - font, row_height); - - state->has_preferred_x = 0; - state->cursor = find.first_char + find.length; - if (find.length > 0 && nk_str_rune_at(&state->string, state->cursor-1) == '\n') - --state->cursor; - }} break; - } -} -NK_INTERN void -nk_textedit_flush_redo(struct nk_text_undo_state *state) -{ - state->redo_point = NK_TEXTEDIT_UNDOSTATECOUNT; - state->redo_char_point = NK_TEXTEDIT_UNDOCHARCOUNT; -} -NK_INTERN void -nk_textedit_discard_undo(struct nk_text_undo_state *state) -{ - /* discard the oldest entry in the undo list */ - if (state->undo_point > 0) { - /* if the 0th undo state has characters, clean those up */ - if (state->undo_rec[0].char_storage >= 0) { - int n = state->undo_rec[0].insert_length, i; - /* delete n characters from all other records */ - state->undo_char_point = (short)(state->undo_char_point - n); - NK_MEMCPY(state->undo_char, state->undo_char + n, - (nk_size)state->undo_char_point*sizeof(nk_rune)); - for (i=0; i < state->undo_point; ++i) { - if (state->undo_rec[i].char_storage >= 0) - state->undo_rec[i].char_storage = (short) - (state->undo_rec[i].char_storage - n); - } - } - --state->undo_point; - NK_MEMCPY(state->undo_rec, state->undo_rec+1, - (nk_size)((nk_size)state->undo_point * sizeof(state->undo_rec[0]))); - } -} -NK_INTERN void -nk_textedit_discard_redo(struct nk_text_undo_state *state) -{ -/* discard the oldest entry in the redo list--it's bad if this - ever happens, but because undo & redo have to store the actual - characters in different cases, the redo character buffer can - fill up even though the undo buffer didn't */ - nk_size num; - int k = NK_TEXTEDIT_UNDOSTATECOUNT-1; - if (state->redo_point <= k) { - /* if the k'th undo state has characters, clean those up */ - if (state->undo_rec[k].char_storage >= 0) { - int n = state->undo_rec[k].insert_length, i; - /* delete n characters from all other records */ - state->redo_char_point = (short)(state->redo_char_point + n); - num = (nk_size)(NK_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point); - NK_MEMCPY(state->undo_char + state->redo_char_point, - state->undo_char + state->redo_char_point-n, num * sizeof(char)); - for (i = state->redo_point; i < k; ++i) { - if (state->undo_rec[i].char_storage >= 0) { - state->undo_rec[i].char_storage = (short) - (state->undo_rec[i].char_storage + n); - } - } - } - ++state->redo_point; - num = (nk_size)(NK_TEXTEDIT_UNDOSTATECOUNT - state->redo_point); - if (num) NK_MEMCPY(state->undo_rec + state->redo_point-1, - state->undo_rec + state->redo_point, num * sizeof(state->undo_rec[0])); - } -} -NK_INTERN struct nk_text_undo_record* -nk_textedit_create_undo_record(struct nk_text_undo_state *state, int numchars) -{ - /* any time we create a new undo record, we discard redo*/ - nk_textedit_flush_redo(state); - - /* if we have no free records, we have to make room, - * by sliding the existing records down */ - if (state->undo_point == NK_TEXTEDIT_UNDOSTATECOUNT) - nk_textedit_discard_undo(state); - - /* if the characters to store won't possibly fit in the buffer, - * we can't undo */ - if (numchars > NK_TEXTEDIT_UNDOCHARCOUNT) { - state->undo_point = 0; - state->undo_char_point = 0; - return 0; - } - - /* if we don't have enough free characters in the buffer, - * we have to make room */ - while (state->undo_char_point + numchars > NK_TEXTEDIT_UNDOCHARCOUNT) - nk_textedit_discard_undo(state); - return &state->undo_rec[state->undo_point++]; -} -NK_INTERN nk_rune* -nk_textedit_createundo(struct nk_text_undo_state *state, int pos, - int insert_len, int delete_len) -{ - struct nk_text_undo_record *r = nk_textedit_create_undo_record(state, insert_len); - if (r == 0) - return 0; - - r->where = pos; - r->insert_length = (short) insert_len; - r->delete_length = (short) delete_len; - - if (insert_len == 0) { - r->char_storage = -1; - return 0; - } else { - r->char_storage = state->undo_char_point; - state->undo_char_point = (short)(state->undo_char_point + insert_len); - return &state->undo_char[r->char_storage]; - } -} -NK_API void -nk_textedit_undo(struct nk_text_edit *state) -{ - struct nk_text_undo_state *s = &state->undo; - struct nk_text_undo_record u, *r; - if (s->undo_point == 0) - return; - - /* we need to do two things: apply the undo record, and create a redo record */ - u = s->undo_rec[s->undo_point-1]; - r = &s->undo_rec[s->redo_point-1]; - r->char_storage = -1; - - r->insert_length = u.delete_length; - r->delete_length = u.insert_length; - r->where = u.where; - - if (u.delete_length) - { - /* if the undo record says to delete characters, then the redo record will - need to re-insert the characters that get deleted, so we need to store - them. - there are three cases: - - there's enough room to store the characters - - characters stored for *redoing* don't leave room for redo - - characters stored for *undoing* don't leave room for redo - if the last is true, we have to bail */ - if (s->undo_char_point + u.delete_length >= NK_TEXTEDIT_UNDOCHARCOUNT) { - /* the undo records take up too much character space; there's no space - * to store the redo characters */ - r->insert_length = 0; - } else { - int i; - /* there's definitely room to store the characters eventually */ - while (s->undo_char_point + u.delete_length > s->redo_char_point) { - /* there's currently not enough room, so discard a redo record */ - nk_textedit_discard_redo(s); - /* should never happen: */ - if (s->redo_point == NK_TEXTEDIT_UNDOSTATECOUNT) - return; - } - - r = &s->undo_rec[s->redo_point-1]; - r->char_storage = (short)(s->redo_char_point - u.delete_length); - s->redo_char_point = (short)(s->redo_char_point - u.delete_length); - - /* now save the characters */ - for (i=0; i < u.delete_length; ++i) - s->undo_char[r->char_storage + i] = - nk_str_rune_at(&state->string, u.where + i); - } - /* now we can carry out the deletion */ - nk_str_delete_runes(&state->string, u.where, u.delete_length); - } - - /* check type of recorded action: */ - if (u.insert_length) { - /* easy case: was a deletion, so we need to insert n characters */ - nk_str_insert_text_runes(&state->string, u.where, - &s->undo_char[u.char_storage], u.insert_length); - s->undo_char_point = (short)(s->undo_char_point - u.insert_length); - } - state->cursor = (short)(u.where + u.insert_length); - - s->undo_point--; - s->redo_point--; -} -NK_API void -nk_textedit_redo(struct nk_text_edit *state) -{ - struct nk_text_undo_state *s = &state->undo; - struct nk_text_undo_record *u, r; - if (s->redo_point == NK_TEXTEDIT_UNDOSTATECOUNT) - return; - - /* we need to do two things: apply the redo record, and create an undo record */ - u = &s->undo_rec[s->undo_point]; - r = s->undo_rec[s->redo_point]; - - /* we KNOW there must be room for the undo record, because the redo record - was derived from an undo record */ - u->delete_length = r.insert_length; - u->insert_length = r.delete_length; - u->where = r.where; - u->char_storage = -1; - - if (r.delete_length) { - /* the redo record requires us to delete characters, so the undo record - needs to store the characters */ - if (s->undo_char_point + u->insert_length > s->redo_char_point) { - u->insert_length = 0; - u->delete_length = 0; - } else { - int i; - u->char_storage = s->undo_char_point; - s->undo_char_point = (short)(s->undo_char_point + u->insert_length); - - /* now save the characters */ - for (i=0; i < u->insert_length; ++i) { - s->undo_char[u->char_storage + i] = - nk_str_rune_at(&state->string, u->where + i); - } - } - nk_str_delete_runes(&state->string, r.where, r.delete_length); - } - - if (r.insert_length) { - /* easy case: need to insert n characters */ - nk_str_insert_text_runes(&state->string, r.where, - &s->undo_char[r.char_storage], r.insert_length); - } - state->cursor = r.where + r.insert_length; - - s->undo_point++; - s->redo_point++; -} -NK_INTERN void -nk_textedit_makeundo_insert(struct nk_text_edit *state, int where, int length) -{ - nk_textedit_createundo(&state->undo, where, 0, length); -} -NK_INTERN void -nk_textedit_makeundo_delete(struct nk_text_edit *state, int where, int length) -{ - int i; - nk_rune *p = nk_textedit_createundo(&state->undo, where, length, 0); - if (p) { - for (i=0; i < length; ++i) - p[i] = nk_str_rune_at(&state->string, where+i); - } -} -NK_INTERN void -nk_textedit_makeundo_replace(struct nk_text_edit *state, int where, - int old_length, int new_length) -{ - int i; - nk_rune *p = nk_textedit_createundo(&state->undo, where, old_length, new_length); - if (p) { - for (i=0; i < old_length; ++i) - p[i] = nk_str_rune_at(&state->string, where+i); - } -} -NK_LIB void -nk_textedit_clear_state(struct nk_text_edit *state, enum nk_text_edit_type type, - nk_plugin_filter filter) -{ - /* reset the state to default */ - state->undo.undo_point = 0; - state->undo.undo_char_point = 0; - state->undo.redo_point = NK_TEXTEDIT_UNDOSTATECOUNT; - state->undo.redo_char_point = NK_TEXTEDIT_UNDOCHARCOUNT; - state->select_end = state->select_start = 0; - state->cursor = 0; - state->has_preferred_x = 0; - state->preferred_x = 0; - state->cursor_at_end_of_line = 0; - state->initialized = 1; - state->single_line = (unsigned char)(type == NK_TEXT_EDIT_SINGLE_LINE); - state->mode = NK_TEXT_EDIT_MODE_VIEW; - state->filter = filter; - state->scrollbar = nk_vec2(0,0); -} -NK_API void -nk_textedit_init_fixed(struct nk_text_edit *state, void *memory, nk_size size) -{ - NK_ASSERT(state); - NK_ASSERT(memory); - if (!state || !memory || !size) return; - NK_MEMSET(state, 0, sizeof(struct nk_text_edit)); - nk_textedit_clear_state(state, NK_TEXT_EDIT_SINGLE_LINE, 0); - nk_str_init_fixed(&state->string, memory, size); -} -NK_API void -nk_textedit_init(struct nk_text_edit *state, struct nk_allocator *alloc, nk_size size) -{ - NK_ASSERT(state); - NK_ASSERT(alloc); - if (!state || !alloc) return; - NK_MEMSET(state, 0, sizeof(struct nk_text_edit)); - nk_textedit_clear_state(state, NK_TEXT_EDIT_SINGLE_LINE, 0); - nk_str_init(&state->string, alloc, size); -} -#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR -NK_API void -nk_textedit_init_default(struct nk_text_edit *state) -{ - NK_ASSERT(state); - if (!state) return; - NK_MEMSET(state, 0, sizeof(struct nk_text_edit)); - nk_textedit_clear_state(state, NK_TEXT_EDIT_SINGLE_LINE, 0); - nk_str_init_default(&state->string); -} -#endif -NK_API void -nk_textedit_select_all(struct nk_text_edit *state) -{ - NK_ASSERT(state); - state->select_start = 0; - state->select_end = state->string.len; -} -NK_API void -nk_textedit_free(struct nk_text_edit *state) -{ - NK_ASSERT(state); - if (!state) return; - nk_str_free(&state->string); -} - - - - - -/* =============================================================== - * - * FILTER - * - * ===============================================================*/ -NK_API nk_bool -nk_filter_default(const struct nk_text_edit *box, nk_rune unicode) -{ - NK_UNUSED(unicode); - NK_UNUSED(box); - return nk_true; -} -NK_API nk_bool -nk_filter_ascii(const struct nk_text_edit *box, nk_rune unicode) -{ - NK_UNUSED(box); - if (unicode > 128) return nk_false; - else return nk_true; -} -NK_API nk_bool -nk_filter_float(const struct nk_text_edit *box, nk_rune unicode) -{ - NK_UNUSED(box); - if ((unicode < '0' || unicode > '9') && unicode != '.' && unicode != '-') - return nk_false; - else return nk_true; -} -NK_API nk_bool -nk_filter_decimal(const struct nk_text_edit *box, nk_rune unicode) -{ - NK_UNUSED(box); - if ((unicode < '0' || unicode > '9') && unicode != '-') - return nk_false; - else return nk_true; -} -NK_API nk_bool -nk_filter_hex(const struct nk_text_edit *box, nk_rune unicode) -{ - NK_UNUSED(box); - if ((unicode < '0' || unicode > '9') && - (unicode < 'a' || unicode > 'f') && - (unicode < 'A' || unicode > 'F')) - return nk_false; - else return nk_true; -} -NK_API nk_bool -nk_filter_oct(const struct nk_text_edit *box, nk_rune unicode) -{ - NK_UNUSED(box); - if (unicode < '0' || unicode > '7') - return nk_false; - else return nk_true; -} -NK_API nk_bool -nk_filter_binary(const struct nk_text_edit *box, nk_rune unicode) -{ - NK_UNUSED(box); - if (unicode != '0' && unicode != '1') - return nk_false; - else return nk_true; -} - -/* =============================================================== - * - * EDIT - * - * ===============================================================*/ -NK_LIB void -nk_edit_draw_text(struct nk_command_buffer *out, - const struct nk_style_edit *style, float pos_x, float pos_y, - float x_offset, const char *text, int byte_len, float row_height, - const struct nk_user_font *font, struct nk_color background, - struct nk_color foreground, nk_bool is_selected) -{ - NK_ASSERT(out); - NK_ASSERT(font); - NK_ASSERT(style); - if (!text || !byte_len || !out || !style) return; - - {int glyph_len = 0; - nk_rune unicode = 0; - int text_len = 0; - float line_width = 0; - float glyph_width; - const char *line = text; - float line_offset = 0; - int line_count = 0; - - struct nk_text txt; - txt.padding = nk_vec2(0,0); - txt.background = background; - txt.text = foreground; - - glyph_len = nk_utf_decode(text+text_len, &unicode, byte_len-text_len); - if (!glyph_len) return; - while ((text_len < byte_len) && glyph_len) - { - if (unicode == '\n') { - /* new line separator so draw previous line */ - struct nk_rect label; - label.y = pos_y + line_offset; - label.h = row_height; - label.w = line_width; - label.x = pos_x; - if (!line_count) - label.x += x_offset; - - if (is_selected) /* selection needs to draw different background color */ - nk_fill_rect(out, label, 0, background); - nk_widget_text(out, label, line, (int)((text + text_len) - line), - &txt, NK_TEXT_CENTERED, font); - - text_len++; - line_count++; - line_width = 0; - line = text + text_len; - line_offset += row_height; - glyph_len = nk_utf_decode(text + text_len, &unicode, (int)(byte_len-text_len)); - continue; - } - if (unicode == '\r') { - text_len++; - glyph_len = nk_utf_decode(text + text_len, &unicode, byte_len-text_len); - continue; - } - glyph_width = font->width(font->userdata, font->height, text+text_len, glyph_len); - line_width += (float)glyph_width; - text_len += glyph_len; - glyph_len = nk_utf_decode(text + text_len, &unicode, byte_len-text_len); - continue; - } - if (line_width > 0) { - /* draw last line */ - struct nk_rect label; - label.y = pos_y + line_offset; - label.h = row_height; - label.w = line_width; - label.x = pos_x; - if (!line_count) - label.x += x_offset; - - if (is_selected) - nk_fill_rect(out, label, 0, background); - nk_widget_text(out, label, line, (int)((text + text_len) - line), - &txt, NK_TEXT_LEFT, font); - }} -} -NK_LIB nk_flags -nk_do_edit(nk_flags *state, struct nk_command_buffer *out, - struct nk_rect bounds, nk_flags flags, nk_plugin_filter filter, - struct nk_text_edit *edit, const struct nk_style_edit *style, - struct nk_input *in, const struct nk_user_font *font) -{ - struct nk_rect area; - nk_flags ret = 0; - float row_height; - char prev_state = 0; - char is_hovered = 0; - char select_all = 0; - char cursor_follow = 0; - struct nk_rect old_clip; - struct nk_rect clip; - - NK_ASSERT(state); - NK_ASSERT(out); - NK_ASSERT(style); - if (!state || !out || !style) - return ret; - - /* visible text area calculation */ - area.x = bounds.x + style->padding.x + style->border; - area.y = bounds.y + style->padding.y + style->border; - area.w = bounds.w - (2.0f * style->padding.x + 2 * style->border); - area.h = bounds.h - (2.0f * style->padding.y + 2 * style->border); - if (flags & NK_EDIT_MULTILINE) - area.w = NK_MAX(0, area.w - style->scrollbar_size.x); - row_height = (flags & NK_EDIT_MULTILINE)? font->height + style->row_padding: area.h; - - /* calculate clipping rectangle */ - old_clip = out->clip; - nk_unify(&clip, &old_clip, area.x, area.y, area.x + area.w, area.y + area.h); - - /* update edit state */ - prev_state = (char)edit->active; - is_hovered = (char)nk_input_is_mouse_hovering_rect(in, bounds); - if (in && in->mouse.buttons[NK_BUTTON_LEFT].clicked && in->mouse.buttons[NK_BUTTON_LEFT].down) { - edit->active = NK_INBOX(in->mouse.pos.x, in->mouse.pos.y, - bounds.x, bounds.y, bounds.w, bounds.h); - } - - /* (de)activate text editor */ - if (!prev_state && edit->active) { - const enum nk_text_edit_type type = (flags & NK_EDIT_MULTILINE) ? - NK_TEXT_EDIT_MULTI_LINE: NK_TEXT_EDIT_SINGLE_LINE; - /* keep scroll position when re-activating edit widget */ - struct nk_vec2 oldscrollbar = edit->scrollbar; - nk_textedit_clear_state(edit, type, filter); - edit->scrollbar = oldscrollbar; - if (flags & NK_EDIT_AUTO_SELECT) - select_all = nk_true; - if (flags & NK_EDIT_GOTO_END_ON_ACTIVATE) { - edit->cursor = edit->string.len; - in = 0; - } - } else if (!edit->active) edit->mode = NK_TEXT_EDIT_MODE_VIEW; - if (flags & NK_EDIT_READ_ONLY) - edit->mode = NK_TEXT_EDIT_MODE_VIEW; - else if (flags & NK_EDIT_ALWAYS_INSERT_MODE) - edit->mode = NK_TEXT_EDIT_MODE_INSERT; - - ret = (edit->active) ? NK_EDIT_ACTIVE: NK_EDIT_INACTIVE; - if (prev_state != edit->active) - ret |= (edit->active) ? NK_EDIT_ACTIVATED: NK_EDIT_DEACTIVATED; - - /* handle user input */ - if (edit->active && in) - { - int shift_mod = in->keyboard.keys[NK_KEY_SHIFT].down; - const float mouse_x = (in->mouse.pos.x - area.x) + edit->scrollbar.x; - const float mouse_y = (in->mouse.pos.y - area.y) + edit->scrollbar.y; - - /* mouse click handler */ - is_hovered = (char)nk_input_is_mouse_hovering_rect(in, area); - if (select_all) { - nk_textedit_select_all(edit); - } else if (is_hovered && in->mouse.buttons[NK_BUTTON_LEFT].down && - in->mouse.buttons[NK_BUTTON_LEFT].clicked) { - nk_textedit_click(edit, mouse_x, mouse_y, font, row_height); - } else if (is_hovered && in->mouse.buttons[NK_BUTTON_LEFT].down && - (in->mouse.delta.x != 0.0f || in->mouse.delta.y != 0.0f)) { - nk_textedit_drag(edit, mouse_x, mouse_y, font, row_height); - cursor_follow = nk_true; - } else if (is_hovered && in->mouse.buttons[NK_BUTTON_RIGHT].clicked && - in->mouse.buttons[NK_BUTTON_RIGHT].down) { - nk_textedit_key(edit, NK_KEY_TEXT_WORD_LEFT, nk_false, font, row_height); - nk_textedit_key(edit, NK_KEY_TEXT_WORD_RIGHT, nk_true, font, row_height); - cursor_follow = nk_true; - } - - {int i; /* keyboard input */ - int old_mode = edit->mode; - for (i = 0; i < NK_KEY_MAX; ++i) { - if (i == NK_KEY_ENTER || i == NK_KEY_TAB) continue; /* special case */ - if (nk_input_is_key_pressed(in, (enum nk_keys)i)) { - nk_textedit_key(edit, (enum nk_keys)i, shift_mod, font, row_height); - cursor_follow = nk_true; - } - } - if (old_mode != edit->mode) { - in->keyboard.text_len = 0; - }} - - /* text input */ - edit->filter = filter; - if (in->keyboard.text_len) { - nk_textedit_text(edit, in->keyboard.text, in->keyboard.text_len); - cursor_follow = nk_true; - in->keyboard.text_len = 0; - } - - /* enter key handler */ - if (nk_input_is_key_pressed(in, NK_KEY_ENTER)) { - cursor_follow = nk_true; - if (flags & NK_EDIT_CTRL_ENTER_NEWLINE && shift_mod) - nk_textedit_text(edit, "\n", 1); - else if (flags & NK_EDIT_SIG_ENTER) - ret |= NK_EDIT_COMMITED; - else nk_textedit_text(edit, "\n", 1); - } - - /* cut & copy handler */ - {int copy= nk_input_is_key_pressed(in, NK_KEY_COPY); - int cut = nk_input_is_key_pressed(in, NK_KEY_CUT); - if ((copy || cut) && (flags & NK_EDIT_CLIPBOARD)) - { - int glyph_len; - nk_rune unicode; - const char *text; - int b = edit->select_start; - int e = edit->select_end; - - int begin = NK_MIN(b, e); - int end = NK_MAX(b, e); - text = nk_str_at_const(&edit->string, begin, &unicode, &glyph_len); - if (edit->clip.copy) - edit->clip.copy(edit->clip.userdata, text, end - begin); - if (cut && !(flags & NK_EDIT_READ_ONLY)){ - nk_textedit_cut(edit); - cursor_follow = nk_true; - } - }} - - /* paste handler */ - {int paste = nk_input_is_key_pressed(in, NK_KEY_PASTE); - if (paste && (flags & NK_EDIT_CLIPBOARD) && edit->clip.paste) { - edit->clip.paste(edit->clip.userdata, edit); - cursor_follow = nk_true; - }} - - /* tab handler */ - {int tab = nk_input_is_key_pressed(in, NK_KEY_TAB); - if (tab && (flags & NK_EDIT_ALLOW_TAB)) { - nk_textedit_text(edit, " ", 4); - cursor_follow = nk_true; - }} - } - - /* set widget state */ - if (edit->active) - *state = NK_WIDGET_STATE_ACTIVE; - else nk_widget_state_reset(state); - - if (is_hovered) - *state |= NK_WIDGET_STATE_HOVERED; - - /* DRAW EDIT */ - {const char *text = nk_str_get_const(&edit->string); - int len = nk_str_len_char(&edit->string); - - {/* select background colors/images */ - const struct nk_style_item *background; - if (*state & NK_WIDGET_STATE_ACTIVED) - background = &style->active; - else if (*state & NK_WIDGET_STATE_HOVER) - background = &style->hover; - else background = &style->normal; - - /* draw background frame */ - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(out, bounds, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(out, bounds, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(out, bounds, style->rounding, background->data.color); - nk_stroke_rect(out, bounds, style->rounding, style->border, style->border_color); - break; - }} - - - area.w = NK_MAX(0, area.w - style->cursor_size); - if (edit->active) - { - int total_lines = 1; - struct nk_vec2 text_size = nk_vec2(0,0); - - /* text pointer positions */ - const char *cursor_ptr = 0; - const char *select_begin_ptr = 0; - const char *select_end_ptr = 0; - - /* 2D pixel positions */ - struct nk_vec2 cursor_pos = nk_vec2(0,0); - struct nk_vec2 selection_offset_start = nk_vec2(0,0); - struct nk_vec2 selection_offset_end = nk_vec2(0,0); - - int selection_begin = NK_MIN(edit->select_start, edit->select_end); - int selection_end = NK_MAX(edit->select_start, edit->select_end); - - /* calculate total line count + total space + cursor/selection position */ - float line_width = 0.0f; - if (text && len) - { - /* utf8 encoding */ - float glyph_width; - int glyph_len = 0; - nk_rune unicode = 0; - int text_len = 0; - int glyphs = 0; - int row_begin = 0; - - glyph_len = nk_utf_decode(text, &unicode, len); - glyph_width = font->width(font->userdata, font->height, text, glyph_len); - line_width = 0; - - /* iterate all lines */ - while ((text_len < len) && glyph_len) - { - /* set cursor 2D position and line */ - if (!cursor_ptr && glyphs == edit->cursor) - { - int glyph_offset; - struct nk_vec2 out_offset; - struct nk_vec2 row_size; - const char *remaining; - - /* calculate 2d position */ - cursor_pos.y = (float)(total_lines-1) * row_height; - row_size = nk_text_calculate_text_bounds(font, text+row_begin, - text_len-row_begin, row_height, &remaining, - &out_offset, &glyph_offset, NK_STOP_ON_NEW_LINE); - cursor_pos.x = row_size.x; - cursor_ptr = text + text_len; - } - - /* set start selection 2D position and line */ - if (!select_begin_ptr && edit->select_start != edit->select_end && - glyphs == selection_begin) - { - int glyph_offset; - struct nk_vec2 out_offset; - struct nk_vec2 row_size; - const char *remaining; - - /* calculate 2d position */ - selection_offset_start.y = (float)(NK_MAX(total_lines-1,0)) * row_height; - row_size = nk_text_calculate_text_bounds(font, text+row_begin, - text_len-row_begin, row_height, &remaining, - &out_offset, &glyph_offset, NK_STOP_ON_NEW_LINE); - selection_offset_start.x = row_size.x; - select_begin_ptr = text + text_len; - } - - /* set end selection 2D position and line */ - if (!select_end_ptr && edit->select_start != edit->select_end && - glyphs == selection_end) - { - int glyph_offset; - struct nk_vec2 out_offset; - struct nk_vec2 row_size; - const char *remaining; - - /* calculate 2d position */ - selection_offset_end.y = (float)(total_lines-1) * row_height; - row_size = nk_text_calculate_text_bounds(font, text+row_begin, - text_len-row_begin, row_height, &remaining, - &out_offset, &glyph_offset, NK_STOP_ON_NEW_LINE); - selection_offset_end.x = row_size.x; - select_end_ptr = text + text_len; - } - if (unicode == '\n') { - text_size.x = NK_MAX(text_size.x, line_width); - total_lines++; - line_width = 0; - text_len++; - glyphs++; - row_begin = text_len; - glyph_len = nk_utf_decode(text + text_len, &unicode, len-text_len); - glyph_width = font->width(font->userdata, font->height, text+text_len, glyph_len); - continue; - } - - glyphs++; - text_len += glyph_len; - line_width += (float)glyph_width; - - glyph_len = nk_utf_decode(text + text_len, &unicode, len-text_len); - glyph_width = font->width(font->userdata, font->height, - text+text_len, glyph_len); - continue; - } - text_size.y = (float)total_lines * row_height; - - /* handle case when cursor is at end of text buffer */ - if (!cursor_ptr && edit->cursor == edit->string.len) { - cursor_pos.x = line_width; - cursor_pos.y = text_size.y - row_height; - } - } - { - /* scrollbar */ - if (cursor_follow) - { - /* update scrollbar to follow cursor */ - if (!(flags & NK_EDIT_NO_HORIZONTAL_SCROLL)) { - /* horizontal scroll */ - const float scroll_increment = area.w * 0.25f; - if (cursor_pos.x < edit->scrollbar.x) - edit->scrollbar.x = (float)(int)NK_MAX(0.0f, cursor_pos.x - scroll_increment); - if (cursor_pos.x >= edit->scrollbar.x + area.w) - edit->scrollbar.x = (float)(int)NK_MAX(0.0f, cursor_pos.x - area.w + scroll_increment); - } else edit->scrollbar.x = 0; - - if (flags & NK_EDIT_MULTILINE) { - /* vertical scroll */ - if (cursor_pos.y < edit->scrollbar.y) - edit->scrollbar.y = NK_MAX(0.0f, cursor_pos.y - row_height); - if (cursor_pos.y >= edit->scrollbar.y + row_height) - edit->scrollbar.y = edit->scrollbar.y + row_height; - } else edit->scrollbar.y = 0; - } - - /* scrollbar widget */ - if (flags & NK_EDIT_MULTILINE) - { - nk_flags ws; - struct nk_rect scroll; - float scroll_target; - float scroll_offset; - float scroll_step; - float scroll_inc; - - scroll = area; - scroll.x = (bounds.x + bounds.w - style->border) - style->scrollbar_size.x; - scroll.w = style->scrollbar_size.x; - - scroll_offset = edit->scrollbar.y; - scroll_step = scroll.h * 0.10f; - scroll_inc = scroll.h * 0.01f; - scroll_target = text_size.y; - edit->scrollbar.y = nk_do_scrollbarv(&ws, out, scroll, 0, - scroll_offset, scroll_target, scroll_step, scroll_inc, - &style->scrollbar, in, font); - } - } - - /* draw text */ - {struct nk_color background_color; - struct nk_color text_color; - struct nk_color sel_background_color; - struct nk_color sel_text_color; - struct nk_color cursor_color; - struct nk_color cursor_text_color; - const struct nk_style_item *background; - nk_push_scissor(out, clip); - - /* select correct colors to draw */ - if (*state & NK_WIDGET_STATE_ACTIVED) { - background = &style->active; - text_color = style->text_active; - sel_text_color = style->selected_text_hover; - sel_background_color = style->selected_hover; - cursor_color = style->cursor_hover; - cursor_text_color = style->cursor_text_hover; - } else if (*state & NK_WIDGET_STATE_HOVER) { - background = &style->hover; - text_color = style->text_hover; - sel_text_color = style->selected_text_hover; - sel_background_color = style->selected_hover; - cursor_text_color = style->cursor_text_hover; - cursor_color = style->cursor_hover; - } else { - background = &style->normal; - text_color = style->text_normal; - sel_text_color = style->selected_text_normal; - sel_background_color = style->selected_normal; - cursor_color = style->cursor_normal; - cursor_text_color = style->cursor_text_normal; - } - if (background->type == NK_STYLE_ITEM_IMAGE) - background_color = nk_rgba(0,0,0,0); - else - background_color = background->data.color; - - - if (edit->select_start == edit->select_end) { - /* no selection so just draw the complete text */ - const char *begin = nk_str_get_const(&edit->string); - int l = nk_str_len_char(&edit->string); - nk_edit_draw_text(out, style, area.x - edit->scrollbar.x, - area.y - edit->scrollbar.y, 0, begin, l, row_height, font, - background_color, text_color, nk_false); - } else { - /* edit has selection so draw 1-3 text chunks */ - if (edit->select_start != edit->select_end && selection_begin > 0){ - /* draw unselected text before selection */ - const char *begin = nk_str_get_const(&edit->string); - NK_ASSERT(select_begin_ptr); - nk_edit_draw_text(out, style, area.x - edit->scrollbar.x, - area.y - edit->scrollbar.y, 0, begin, (int)(select_begin_ptr - begin), - row_height, font, background_color, text_color, nk_false); - } - if (edit->select_start != edit->select_end) { - /* draw selected text */ - NK_ASSERT(select_begin_ptr); - if (!select_end_ptr) { - const char *begin = nk_str_get_const(&edit->string); - select_end_ptr = begin + nk_str_len_char(&edit->string); - } - nk_edit_draw_text(out, style, - area.x - edit->scrollbar.x, - area.y + selection_offset_start.y - edit->scrollbar.y, - selection_offset_start.x, - select_begin_ptr, (int)(select_end_ptr - select_begin_ptr), - row_height, font, sel_background_color, sel_text_color, nk_true); - } - if ((edit->select_start != edit->select_end && - selection_end < edit->string.len)) - { - /* draw unselected text after selected text */ - const char *begin = select_end_ptr; - const char *end = nk_str_get_const(&edit->string) + - nk_str_len_char(&edit->string); - NK_ASSERT(select_end_ptr); - nk_edit_draw_text(out, style, - area.x - edit->scrollbar.x, - area.y + selection_offset_end.y - edit->scrollbar.y, - selection_offset_end.x, - begin, (int)(end - begin), row_height, font, - background_color, text_color, nk_true); - } - } - - /* cursor */ - if (edit->select_start == edit->select_end) - { - if (edit->cursor >= nk_str_len(&edit->string) || - (cursor_ptr && *cursor_ptr == '\n')) { - /* draw cursor at end of line */ - struct nk_rect cursor; - cursor.w = style->cursor_size; - cursor.h = font->height; - cursor.x = area.x + cursor_pos.x - edit->scrollbar.x; - cursor.y = area.y + cursor_pos.y + row_height/2.0f - cursor.h/2.0f; - cursor.y -= edit->scrollbar.y; - nk_fill_rect(out, cursor, 0, cursor_color); - } else { - /* draw cursor inside text */ - int glyph_len; - struct nk_rect label; - struct nk_text txt; - - nk_rune unicode; - NK_ASSERT(cursor_ptr); - glyph_len = nk_utf_decode(cursor_ptr, &unicode, 4); - - label.x = area.x + cursor_pos.x - edit->scrollbar.x; - label.y = area.y + cursor_pos.y - edit->scrollbar.y; - label.w = font->width(font->userdata, font->height, cursor_ptr, glyph_len); - label.h = row_height; - - txt.padding = nk_vec2(0,0); - txt.background = cursor_color;; - txt.text = cursor_text_color; - nk_fill_rect(out, label, 0, cursor_color); - nk_widget_text(out, label, cursor_ptr, glyph_len, &txt, NK_TEXT_LEFT, font); - } - }} - } else { - /* not active so just draw text */ - int l = nk_str_len_char(&edit->string); - const char *begin = nk_str_get_const(&edit->string); - - const struct nk_style_item *background; - struct nk_color background_color; - struct nk_color text_color; - nk_push_scissor(out, clip); - if (*state & NK_WIDGET_STATE_ACTIVED) { - background = &style->active; - text_color = style->text_active; - } else if (*state & NK_WIDGET_STATE_HOVER) { - background = &style->hover; - text_color = style->text_hover; - } else { - background = &style->normal; - text_color = style->text_normal; - } - if (background->type == NK_STYLE_ITEM_IMAGE) - background_color = nk_rgba(0,0,0,0); - else - background_color = background->data.color; - nk_edit_draw_text(out, style, area.x - edit->scrollbar.x, - area.y - edit->scrollbar.y, 0, begin, l, row_height, font, - background_color, text_color, nk_false); - } - nk_push_scissor(out, old_clip);} - return ret; -} -NK_API void -nk_edit_focus(struct nk_context *ctx, nk_flags flags) -{ - nk_hash hash; - struct nk_window *win; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) return; - - win = ctx->current; - hash = win->edit.seq; - win->edit.active = nk_true; - win->edit.name = hash; - if (flags & NK_EDIT_ALWAYS_INSERT_MODE) - win->edit.mode = NK_TEXT_EDIT_MODE_INSERT; -} -NK_API void -nk_edit_unfocus(struct nk_context *ctx) -{ - struct nk_window *win; - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) return; - - win = ctx->current; - win->edit.active = nk_false; - win->edit.name = 0; -} -NK_API nk_flags -nk_edit_string(struct nk_context *ctx, nk_flags flags, - char *memory, int *len, int max, nk_plugin_filter filter) -{ - nk_hash hash; - nk_flags state; - struct nk_text_edit *edit; - struct nk_window *win; - - NK_ASSERT(ctx); - NK_ASSERT(memory); - NK_ASSERT(len); - if (!ctx || !memory || !len) - return 0; - - filter = (!filter) ? nk_filter_default: filter; - win = ctx->current; - hash = win->edit.seq; - edit = &ctx->text_edit; - nk_textedit_clear_state(&ctx->text_edit, (flags & NK_EDIT_MULTILINE)? - NK_TEXT_EDIT_MULTI_LINE: NK_TEXT_EDIT_SINGLE_LINE, filter); - - if (win->edit.active && hash == win->edit.name) { - if (flags & NK_EDIT_NO_CURSOR) - edit->cursor = nk_utf_len(memory, *len); - else edit->cursor = win->edit.cursor; - if (!(flags & NK_EDIT_SELECTABLE)) { - edit->select_start = win->edit.cursor; - edit->select_end = win->edit.cursor; - } else { - edit->select_start = win->edit.sel_start; - edit->select_end = win->edit.sel_end; - } - edit->mode = win->edit.mode; - edit->scrollbar.x = (float)win->edit.scrollbar.x; - edit->scrollbar.y = (float)win->edit.scrollbar.y; - edit->active = nk_true; - } else edit->active = nk_false; - - max = NK_MAX(1, max); - *len = NK_MIN(*len, max-1); - nk_str_init_fixed(&edit->string, memory, (nk_size)max); - edit->string.buffer.allocated = (nk_size)*len; - edit->string.len = nk_utf_len(memory, *len); - state = nk_edit_buffer(ctx, flags, edit, filter); - *len = (int)edit->string.buffer.allocated; - - if (edit->active) { - win->edit.cursor = edit->cursor; - win->edit.sel_start = edit->select_start; - win->edit.sel_end = edit->select_end; - win->edit.mode = edit->mode; - win->edit.scrollbar.x = (nk_uint)edit->scrollbar.x; - win->edit.scrollbar.y = (nk_uint)edit->scrollbar.y; - } return state; -} -NK_API nk_flags -nk_edit_buffer(struct nk_context *ctx, nk_flags flags, - struct nk_text_edit *edit, nk_plugin_filter filter) -{ - struct nk_window *win; - struct nk_style *style; - struct nk_input *in; - - enum nk_widget_layout_states state; - struct nk_rect bounds; - - nk_flags ret_flags = 0; - unsigned char prev_state; - nk_hash hash; - - /* make sure correct values */ - NK_ASSERT(ctx); - NK_ASSERT(edit); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - style = &ctx->style; - state = nk_widget(&bounds, ctx); - if (!state) return state; - in = (win->layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - - /* check if edit is currently hot item */ - hash = win->edit.seq++; - if (win->edit.active && hash == win->edit.name) { - if (flags & NK_EDIT_NO_CURSOR) - edit->cursor = edit->string.len; - if (!(flags & NK_EDIT_SELECTABLE)) { - edit->select_start = edit->cursor; - edit->select_end = edit->cursor; - } - if (flags & NK_EDIT_CLIPBOARD) - edit->clip = ctx->clip; - edit->active = (unsigned char)win->edit.active; - } else edit->active = nk_false; - edit->mode = win->edit.mode; - - filter = (!filter) ? nk_filter_default: filter; - prev_state = (unsigned char)edit->active; - in = (flags & NK_EDIT_READ_ONLY) ? 0: in; - ret_flags = nk_do_edit(&ctx->last_widget_state, &win->buffer, bounds, flags, - filter, edit, &style->edit, in, style->font); - - if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) - ctx->style.cursor_active = ctx->style.cursors[NK_CURSOR_TEXT]; - if (edit->active && prev_state != edit->active) { - /* current edit is now hot */ - win->edit.active = nk_true; - win->edit.name = hash; - } else if (prev_state && !edit->active) { - /* current edit is now cold */ - win->edit.active = nk_false; - } return ret_flags; -} -NK_API nk_flags -nk_edit_string_zero_terminated(struct nk_context *ctx, nk_flags flags, - char *buffer, int max, nk_plugin_filter filter) -{ - nk_flags result; - int len = nk_strlen(buffer); - result = nk_edit_string(ctx, flags, buffer, &len, max, filter); - buffer[NK_MIN(NK_MAX(max-1,0), len)] = '\0'; - return result; -} - - - - - -/* =============================================================== - * - * PROPERTY - * - * ===============================================================*/ -NK_LIB void -nk_drag_behavior(nk_flags *state, const struct nk_input *in, - struct nk_rect drag, struct nk_property_variant *variant, - float inc_per_pixel) -{ - int left_mouse_down = in && in->mouse.buttons[NK_BUTTON_LEFT].down; - int left_mouse_click_in_cursor = in && - nk_input_has_mouse_click_down_in_rect(in, NK_BUTTON_LEFT, drag, nk_true); - - nk_widget_state_reset(state); - if (nk_input_is_mouse_hovering_rect(in, drag)) - *state = NK_WIDGET_STATE_HOVERED; - - if (left_mouse_down && left_mouse_click_in_cursor) { - float delta, pixels; - pixels = in->mouse.delta.x; - delta = pixels * inc_per_pixel; - switch (variant->kind) { - default: break; - case NK_PROPERTY_INT: - variant->value.i = variant->value.i + (int)delta; - variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i, variant->max_value.i); - break; - case NK_PROPERTY_FLOAT: - variant->value.f = variant->value.f + (float)delta; - variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f, variant->max_value.f); - break; - case NK_PROPERTY_DOUBLE: - variant->value.d = variant->value.d + (double)delta; - variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d, variant->max_value.d); - break; - } - *state = NK_WIDGET_STATE_ACTIVE; - } - if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, drag)) - *state |= NK_WIDGET_STATE_ENTERED; - else if (nk_input_is_mouse_prev_hovering_rect(in, drag)) - *state |= NK_WIDGET_STATE_LEFT; -} -NK_LIB void -nk_property_behavior(nk_flags *ws, const struct nk_input *in, - struct nk_rect property, struct nk_rect label, struct nk_rect edit, - struct nk_rect empty, int *state, struct nk_property_variant *variant, - float inc_per_pixel) -{ - nk_widget_state_reset(ws); - if (in && *state == NK_PROPERTY_DEFAULT) { - if (nk_button_behavior(ws, edit, in, NK_BUTTON_DEFAULT)) - *state = NK_PROPERTY_EDIT; - else if (nk_input_is_mouse_click_down_in_rect(in, NK_BUTTON_LEFT, label, nk_true)) - *state = NK_PROPERTY_DRAG; - else if (nk_input_is_mouse_click_down_in_rect(in, NK_BUTTON_LEFT, empty, nk_true)) - *state = NK_PROPERTY_DRAG; - } - if (*state == NK_PROPERTY_DRAG) { - nk_drag_behavior(ws, in, property, variant, inc_per_pixel); - if (!(*ws & NK_WIDGET_STATE_ACTIVED)) *state = NK_PROPERTY_DEFAULT; - } -} -NK_LIB void -nk_draw_property(struct nk_command_buffer *out, const struct nk_style_property *style, - const struct nk_rect *bounds, const struct nk_rect *label, nk_flags state, - const char *name, int len, const struct nk_user_font *font) -{ - struct nk_text text; - const struct nk_style_item *background; - - /* select correct background and text color */ - if (state & NK_WIDGET_STATE_ACTIVED) { - background = &style->active; - text.text = style->label_active; - } else if (state & NK_WIDGET_STATE_HOVER) { - background = &style->hover; - text.text = style->label_hover; - } else { - background = &style->normal; - text.text = style->label_normal; - } - - /* draw background */ - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - text.background = nk_rgba(0, 0, 0, 0); - nk_draw_image(out, *bounds, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - text.background = nk_rgba(0, 0, 0, 0); - nk_draw_nine_slice(out, *bounds, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - text.background = background->data.color; - nk_fill_rect(out, *bounds, style->rounding, background->data.color); - nk_stroke_rect(out, *bounds, style->rounding, style->border, background->data.color); - break; - } - - /* draw label */ - text.padding = nk_vec2(0,0); - nk_widget_text(out, *label, name, len, &text, NK_TEXT_CENTERED, font); -} -NK_LIB void -nk_do_property(nk_flags *ws, - struct nk_command_buffer *out, struct nk_rect property, - const char *name, struct nk_property_variant *variant, - float inc_per_pixel, char *buffer, int *len, - int *state, int *cursor, int *select_begin, int *select_end, - const struct nk_style_property *style, - enum nk_property_filter filter, struct nk_input *in, - const struct nk_user_font *font, struct nk_text_edit *text_edit, - enum nk_button_behavior behavior) -{ - const nk_plugin_filter filters[] = { - nk_filter_decimal, - nk_filter_float - }; - nk_bool active, old; - int num_len = 0, name_len; - char string[NK_MAX_NUMBER_BUFFER]; - float size; - - char *dst = 0; - int *length; - - struct nk_rect left; - struct nk_rect right; - struct nk_rect label; - struct nk_rect edit; - struct nk_rect empty; - - /* left decrement button */ - left.h = font->height/2; - left.w = left.h; - left.x = property.x + style->border + style->padding.x; - left.y = property.y + style->border + property.h/2.0f - left.h/2; - - /* text label */ - name_len = nk_strlen(name); - size = font->width(font->userdata, font->height, name, name_len); - label.x = left.x + left.w + style->padding.x; - label.w = (float)size + 2 * style->padding.x; - label.y = property.y + style->border + style->padding.y; - label.h = property.h - (2 * style->border + 2 * style->padding.y); - - /* right increment button */ - right.y = left.y; - right.w = left.w; - right.h = left.h; - right.x = property.x + property.w - (right.w + style->padding.x); - - /* edit */ - if (*state == NK_PROPERTY_EDIT) { - size = font->width(font->userdata, font->height, buffer, *len); - size += style->edit.cursor_size; - length = len; - dst = buffer; - } else { - switch (variant->kind) { - default: break; - case NK_PROPERTY_INT: - nk_itoa(string, variant->value.i); - num_len = nk_strlen(string); - break; - case NK_PROPERTY_FLOAT: - NK_DTOA(string, (double)variant->value.f); - num_len = nk_string_float_limit(string, NK_MAX_FLOAT_PRECISION); - break; - case NK_PROPERTY_DOUBLE: - NK_DTOA(string, variant->value.d); - num_len = nk_string_float_limit(string, NK_MAX_FLOAT_PRECISION); - break; - } - size = font->width(font->userdata, font->height, string, num_len); - dst = string; - length = &num_len; - } - - edit.w = (float)size + 2 * style->padding.x; - edit.w = NK_MIN(edit.w, right.x - (label.x + label.w)); - edit.x = right.x - (edit.w + style->padding.x); - edit.y = property.y + style->border; - edit.h = property.h - (2 * style->border); - - /* empty left space activator */ - empty.w = edit.x - (label.x + label.w); - empty.x = label.x + label.w; - empty.y = property.y; - empty.h = property.h; - - /* update property */ - old = (*state == NK_PROPERTY_EDIT); - nk_property_behavior(ws, in, property, label, edit, empty, state, variant, inc_per_pixel); - - /* draw property */ - if (style->draw_begin) style->draw_begin(out, style->userdata); - nk_draw_property(out, style, &property, &label, *ws, name, name_len, font); - if (style->draw_end) style->draw_end(out, style->userdata); - - /* execute right button */ - if (nk_do_button_symbol(ws, out, left, style->sym_left, behavior, &style->dec_button, in, font)) { - switch (variant->kind) { - default: break; - case NK_PROPERTY_INT: - variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i - variant->step.i, variant->max_value.i); break; - case NK_PROPERTY_FLOAT: - variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f - variant->step.f, variant->max_value.f); break; - case NK_PROPERTY_DOUBLE: - variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d - variant->step.d, variant->max_value.d); break; - } - } - /* execute left button */ - if (nk_do_button_symbol(ws, out, right, style->sym_right, behavior, &style->inc_button, in, font)) { - switch (variant->kind) { - default: break; - case NK_PROPERTY_INT: - variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i + variant->step.i, variant->max_value.i); break; - case NK_PROPERTY_FLOAT: - variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f + variant->step.f, variant->max_value.f); break; - case NK_PROPERTY_DOUBLE: - variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d + variant->step.d, variant->max_value.d); break; - } - } - if (old != NK_PROPERTY_EDIT && (*state == NK_PROPERTY_EDIT)) { - /* property has been activated so setup buffer */ - NK_MEMCPY(buffer, dst, (nk_size)*length); - *cursor = nk_utf_len(buffer, *length); - *len = *length; - length = len; - dst = buffer; - active = 0; - } else active = (*state == NK_PROPERTY_EDIT); - - /* execute and run text edit field */ - nk_textedit_clear_state(text_edit, NK_TEXT_EDIT_SINGLE_LINE, filters[filter]); - text_edit->active = (unsigned char)active; - text_edit->string.len = *length; - text_edit->cursor = NK_CLAMP(0, *cursor, *length); - text_edit->select_start = NK_CLAMP(0,*select_begin, *length); - text_edit->select_end = NK_CLAMP(0,*select_end, *length); - text_edit->string.buffer.allocated = (nk_size)*length; - text_edit->string.buffer.memory.size = NK_MAX_NUMBER_BUFFER; - text_edit->string.buffer.memory.ptr = dst; - text_edit->string.buffer.size = NK_MAX_NUMBER_BUFFER; - text_edit->mode = NK_TEXT_EDIT_MODE_INSERT; - nk_do_edit(ws, out, edit, NK_EDIT_FIELD|NK_EDIT_AUTO_SELECT, - filters[filter], text_edit, &style->edit, (*state == NK_PROPERTY_EDIT) ? in: 0, font); - - *length = text_edit->string.len; - *cursor = text_edit->cursor; - *select_begin = text_edit->select_start; - *select_end = text_edit->select_end; - if (text_edit->active && nk_input_is_key_pressed(in, NK_KEY_ENTER)) - text_edit->active = nk_false; - - if (active && !text_edit->active) { - /* property is now not active so convert edit text to value*/ - *state = NK_PROPERTY_DEFAULT; - buffer[*len] = '\0'; - switch (variant->kind) { - default: break; - case NK_PROPERTY_INT: - variant->value.i = nk_strtoi(buffer, 0); - variant->value.i = NK_CLAMP(variant->min_value.i, variant->value.i, variant->max_value.i); - break; - case NK_PROPERTY_FLOAT: - nk_string_float_limit(buffer, NK_MAX_FLOAT_PRECISION); - variant->value.f = nk_strtof(buffer, 0); - variant->value.f = NK_CLAMP(variant->min_value.f, variant->value.f, variant->max_value.f); - break; - case NK_PROPERTY_DOUBLE: - nk_string_float_limit(buffer, NK_MAX_FLOAT_PRECISION); - variant->value.d = nk_strtod(buffer, 0); - variant->value.d = NK_CLAMP(variant->min_value.d, variant->value.d, variant->max_value.d); - break; - } - } -} -NK_LIB struct nk_property_variant -nk_property_variant_int(int value, int min_value, int max_value, int step) -{ - struct nk_property_variant result; - result.kind = NK_PROPERTY_INT; - result.value.i = value; - result.min_value.i = min_value; - result.max_value.i = max_value; - result.step.i = step; - return result; -} -NK_LIB struct nk_property_variant -nk_property_variant_float(float value, float min_value, float max_value, float step) -{ - struct nk_property_variant result; - result.kind = NK_PROPERTY_FLOAT; - result.value.f = value; - result.min_value.f = min_value; - result.max_value.f = max_value; - result.step.f = step; - return result; -} -NK_LIB struct nk_property_variant -nk_property_variant_double(double value, double min_value, double max_value, - double step) -{ - struct nk_property_variant result; - result.kind = NK_PROPERTY_DOUBLE; - result.value.d = value; - result.min_value.d = min_value; - result.max_value.d = max_value; - result.step.d = step; - return result; -} -NK_LIB void -nk_property(struct nk_context *ctx, const char *name, struct nk_property_variant *variant, - float inc_per_pixel, const enum nk_property_filter filter) -{ - struct nk_window *win; - struct nk_panel *layout; - struct nk_input *in; - const struct nk_style *style; - - struct nk_rect bounds; - enum nk_widget_layout_states s; - - int *state = 0; - nk_hash hash = 0; - char *buffer = 0; - int *len = 0; - int *cursor = 0; - int *select_begin = 0; - int *select_end = 0; - int old_state; - - char dummy_buffer[NK_MAX_NUMBER_BUFFER]; - int dummy_state = NK_PROPERTY_DEFAULT; - int dummy_length = 0; - int dummy_cursor = 0; - int dummy_select_begin = 0; - int dummy_select_end = 0; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return; - - win = ctx->current; - layout = win->layout; - style = &ctx->style; - s = nk_widget(&bounds, ctx); - if (!s) return; - - /* calculate hash from name */ - if (name[0] == '#') { - hash = nk_murmur_hash(name, (int)nk_strlen(name), win->property.seq++); - name++; /* special number hash */ - } else hash = nk_murmur_hash(name, (int)nk_strlen(name), 42); - - /* check if property is currently hot item */ - if (win->property.active && hash == win->property.name) { - buffer = win->property.buffer; - len = &win->property.length; - cursor = &win->property.cursor; - state = &win->property.state; - select_begin = &win->property.select_start; - select_end = &win->property.select_end; - } else { - buffer = dummy_buffer; - len = &dummy_length; - cursor = &dummy_cursor; - state = &dummy_state; - select_begin = &dummy_select_begin; - select_end = &dummy_select_end; - } - - /* execute property widget */ - old_state = *state; - ctx->text_edit.clip = ctx->clip; - in = ((s == NK_WIDGET_ROM && !win->property.active) || - layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - nk_do_property(&ctx->last_widget_state, &win->buffer, bounds, name, - variant, inc_per_pixel, buffer, len, state, cursor, select_begin, - select_end, &style->property, filter, in, style->font, &ctx->text_edit, - ctx->button_behavior); - - if (in && *state != NK_PROPERTY_DEFAULT && !win->property.active) { - /* current property is now hot */ - win->property.active = 1; - NK_MEMCPY(win->property.buffer, buffer, (nk_size)*len); - win->property.length = *len; - win->property.cursor = *cursor; - win->property.state = *state; - win->property.name = hash; - win->property.select_start = *select_begin; - win->property.select_end = *select_end; - if (*state == NK_PROPERTY_DRAG) { - ctx->input.mouse.grab = nk_true; - ctx->input.mouse.grabbed = nk_true; - } - } - /* check if previously active property is now inactive */ - if (*state == NK_PROPERTY_DEFAULT && old_state != NK_PROPERTY_DEFAULT) { - if (old_state == NK_PROPERTY_DRAG) { - ctx->input.mouse.grab = nk_false; - ctx->input.mouse.grabbed = nk_false; - ctx->input.mouse.ungrab = nk_true; - } - win->property.select_start = 0; - win->property.select_end = 0; - win->property.active = 0; - } -} -NK_API void -nk_property_int(struct nk_context *ctx, const char *name, - int min, int *val, int max, int step, float inc_per_pixel) -{ - struct nk_property_variant variant; - NK_ASSERT(ctx); - NK_ASSERT(name); - NK_ASSERT(val); - - if (!ctx || !ctx->current || !name || !val) return; - variant = nk_property_variant_int(*val, min, max, step); - nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_INT); - *val = variant.value.i; -} -NK_API void -nk_property_float(struct nk_context *ctx, const char *name, - float min, float *val, float max, float step, float inc_per_pixel) -{ - struct nk_property_variant variant; - NK_ASSERT(ctx); - NK_ASSERT(name); - NK_ASSERT(val); - - if (!ctx || !ctx->current || !name || !val) return; - variant = nk_property_variant_float(*val, min, max, step); - nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT); - *val = variant.value.f; -} -NK_API void -nk_property_double(struct nk_context *ctx, const char *name, - double min, double *val, double max, double step, float inc_per_pixel) -{ - struct nk_property_variant variant; - NK_ASSERT(ctx); - NK_ASSERT(name); - NK_ASSERT(val); - - if (!ctx || !ctx->current || !name || !val) return; - variant = nk_property_variant_double(*val, min, max, step); - nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT); - *val = variant.value.d; -} -NK_API int -nk_propertyi(struct nk_context *ctx, const char *name, int min, int val, - int max, int step, float inc_per_pixel) -{ - struct nk_property_variant variant; - NK_ASSERT(ctx); - NK_ASSERT(name); - - if (!ctx || !ctx->current || !name) return val; - variant = nk_property_variant_int(val, min, max, step); - nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_INT); - val = variant.value.i; - return val; -} -NK_API float -nk_propertyf(struct nk_context *ctx, const char *name, float min, - float val, float max, float step, float inc_per_pixel) -{ - struct nk_property_variant variant; - NK_ASSERT(ctx); - NK_ASSERT(name); - - if (!ctx || !ctx->current || !name) return val; - variant = nk_property_variant_float(val, min, max, step); - nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT); - val = variant.value.f; - return val; -} -NK_API double -nk_propertyd(struct nk_context *ctx, const char *name, double min, - double val, double max, double step, float inc_per_pixel) -{ - struct nk_property_variant variant; - NK_ASSERT(ctx); - NK_ASSERT(name); - - if (!ctx || !ctx->current || !name) return val; - variant = nk_property_variant_double(val, min, max, step); - nk_property(ctx, name, &variant, inc_per_pixel, NK_FILTER_FLOAT); - val = variant.value.d; - return val; -} - - - - - -/* ============================================================== - * - * CHART - * - * ===============================================================*/ -NK_API nk_bool -nk_chart_begin_colored(struct nk_context *ctx, enum nk_chart_type type, - struct nk_color color, struct nk_color highlight, - int count, float min_value, float max_value) -{ - struct nk_window *win; - struct nk_chart *chart; - const struct nk_style *config; - const struct nk_style_chart *style; - - const struct nk_style_item *background; - struct nk_rect bounds = {0, 0, 0, 0}; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - - if (!ctx || !ctx->current || !ctx->current->layout) return 0; - if (!nk_widget(&bounds, ctx)) { - chart = &ctx->current->layout->chart; - nk_zero(chart, sizeof(*chart)); - return 0; - } - - win = ctx->current; - config = &ctx->style; - chart = &win->layout->chart; - style = &config->chart; - - /* setup basic generic chart */ - nk_zero(chart, sizeof(*chart)); - chart->x = bounds.x + style->padding.x; - chart->y = bounds.y + style->padding.y; - chart->w = bounds.w - 2 * style->padding.x; - chart->h = bounds.h - 2 * style->padding.y; - chart->w = NK_MAX(chart->w, 2 * style->padding.x); - chart->h = NK_MAX(chart->h, 2 * style->padding.y); - - /* add first slot into chart */ - {struct nk_chart_slot *slot = &chart->slots[chart->slot++]; - slot->type = type; - slot->count = count; - slot->color = color; - slot->highlight = highlight; - slot->min = NK_MIN(min_value, max_value); - slot->max = NK_MAX(min_value, max_value); - slot->range = slot->max - slot->min;} - - /* draw chart background */ - background = &style->background; - - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(&win->buffer, bounds, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(&win->buffer, bounds, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(&win->buffer, bounds, style->rounding, style->border_color); - nk_fill_rect(&win->buffer, nk_shrink_rect(bounds, style->border), - style->rounding, style->background.data.color); - break; - } - return 1; -} -NK_API nk_bool -nk_chart_begin(struct nk_context *ctx, const enum nk_chart_type type, - int count, float min_value, float max_value) -{ - return nk_chart_begin_colored(ctx, type, ctx->style.chart.color, - ctx->style.chart.selected_color, count, min_value, max_value); -} -NK_API void -nk_chart_add_slot_colored(struct nk_context *ctx, const enum nk_chart_type type, - struct nk_color color, struct nk_color highlight, - int count, float min_value, float max_value) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - NK_ASSERT(ctx->current->layout->chart.slot < NK_CHART_MAX_SLOT); - if (!ctx || !ctx->current || !ctx->current->layout) return; - if (ctx->current->layout->chart.slot >= NK_CHART_MAX_SLOT) return; - - /* add another slot into the graph */ - {struct nk_chart *chart = &ctx->current->layout->chart; - struct nk_chart_slot *slot = &chart->slots[chart->slot++]; - slot->type = type; - slot->count = count; - slot->color = color; - slot->highlight = highlight; - slot->min = NK_MIN(min_value, max_value); - slot->max = NK_MAX(min_value, max_value); - slot->range = slot->max - slot->min;} -} -NK_API void -nk_chart_add_slot(struct nk_context *ctx, const enum nk_chart_type type, - int count, float min_value, float max_value) -{ - nk_chart_add_slot_colored(ctx, type, ctx->style.chart.color, - ctx->style.chart.selected_color, count, min_value, max_value); -} -NK_INTERN nk_flags -nk_chart_push_line(struct nk_context *ctx, struct nk_window *win, - struct nk_chart *g, float value, int slot) -{ - struct nk_panel *layout = win->layout; - const struct nk_input *i = &ctx->input; - struct nk_command_buffer *out = &win->buffer; - - nk_flags ret = 0; - struct nk_vec2 cur; - struct nk_rect bounds; - struct nk_color color; - float step; - float range; - float ratio; - - NK_ASSERT(slot >= 0 && slot < NK_CHART_MAX_SLOT); - step = g->w / (float)g->slots[slot].count; - range = g->slots[slot].max - g->slots[slot].min; - ratio = (value - g->slots[slot].min) / range; - - if (g->slots[slot].index == 0) { - /* first data point does not have a connection */ - g->slots[slot].last.x = g->x; - g->slots[slot].last.y = (g->y + g->h) - ratio * (float)g->h; - - bounds.x = g->slots[slot].last.x - 2; - bounds.y = g->slots[slot].last.y - 2; - bounds.w = bounds.h = 4; - - color = g->slots[slot].color; - if (!(layout->flags & NK_WINDOW_ROM) && - NK_INBOX(i->mouse.pos.x,i->mouse.pos.y, g->slots[slot].last.x-3, g->slots[slot].last.y-3, 6, 6)){ - ret = nk_input_is_mouse_hovering_rect(i, bounds) ? NK_CHART_HOVERING : 0; - ret |= (i->mouse.buttons[NK_BUTTON_LEFT].down && - i->mouse.buttons[NK_BUTTON_LEFT].clicked) ? NK_CHART_CLICKED: 0; - color = g->slots[slot].highlight; - } - nk_fill_rect(out, bounds, 0, color); - g->slots[slot].index += 1; - return ret; - } - - /* draw a line between the last data point and the new one */ - color = g->slots[slot].color; - cur.x = g->x + (float)(step * (float)g->slots[slot].index); - cur.y = (g->y + g->h) - (ratio * (float)g->h); - nk_stroke_line(out, g->slots[slot].last.x, g->slots[slot].last.y, cur.x, cur.y, 1.0f, color); - - bounds.x = cur.x - 3; - bounds.y = cur.y - 3; - bounds.w = bounds.h = 6; - - /* user selection of current data point */ - if (!(layout->flags & NK_WINDOW_ROM)) { - if (nk_input_is_mouse_hovering_rect(i, bounds)) { - ret = NK_CHART_HOVERING; - ret |= (!i->mouse.buttons[NK_BUTTON_LEFT].down && - i->mouse.buttons[NK_BUTTON_LEFT].clicked) ? NK_CHART_CLICKED: 0; - color = g->slots[slot].highlight; - } - } - nk_fill_rect(out, nk_rect(cur.x - 2, cur.y - 2, 4, 4), 0, color); - - /* save current data point position */ - g->slots[slot].last.x = cur.x; - g->slots[slot].last.y = cur.y; - g->slots[slot].index += 1; - return ret; -} -NK_INTERN nk_flags -nk_chart_push_column(const struct nk_context *ctx, struct nk_window *win, - struct nk_chart *chart, float value, int slot) -{ - struct nk_command_buffer *out = &win->buffer; - const struct nk_input *in = &ctx->input; - struct nk_panel *layout = win->layout; - - float ratio; - nk_flags ret = 0; - struct nk_color color; - struct nk_rect item = {0,0,0,0}; - - NK_ASSERT(slot >= 0 && slot < NK_CHART_MAX_SLOT); - if (chart->slots[slot].index >= chart->slots[slot].count) - return nk_false; - if (chart->slots[slot].count) { - float padding = (float)(chart->slots[slot].count-1); - item.w = (chart->w - padding) / (float)(chart->slots[slot].count); - } - - /* calculate bounds of current bar chart entry */ - color = chart->slots[slot].color;; - item.h = chart->h * NK_ABS((value/chart->slots[slot].range)); - if (value >= 0) { - ratio = (value + NK_ABS(chart->slots[slot].min)) / NK_ABS(chart->slots[slot].range); - item.y = (chart->y + chart->h) - chart->h * ratio; - } else { - ratio = (value - chart->slots[slot].max) / chart->slots[slot].range; - item.y = chart->y + (chart->h * NK_ABS(ratio)) - item.h; - } - item.x = chart->x + ((float)chart->slots[slot].index * item.w); - item.x = item.x + ((float)chart->slots[slot].index); - - /* user chart bar selection */ - if (!(layout->flags & NK_WINDOW_ROM) && - NK_INBOX(in->mouse.pos.x,in->mouse.pos.y,item.x,item.y,item.w,item.h)) { - ret = NK_CHART_HOVERING; - ret |= (!in->mouse.buttons[NK_BUTTON_LEFT].down && - in->mouse.buttons[NK_BUTTON_LEFT].clicked) ? NK_CHART_CLICKED: 0; - color = chart->slots[slot].highlight; - } - nk_fill_rect(out, item, 0, color); - chart->slots[slot].index += 1; - return ret; -} -NK_API nk_flags -nk_chart_push_slot(struct nk_context *ctx, float value, int slot) -{ - nk_flags flags; - struct nk_window *win; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(slot >= 0 && slot < NK_CHART_MAX_SLOT); - NK_ASSERT(slot < ctx->current->layout->chart.slot); - if (!ctx || !ctx->current || slot >= NK_CHART_MAX_SLOT) return nk_false; - if (slot >= ctx->current->layout->chart.slot) return nk_false; - - win = ctx->current; - if (win->layout->chart.slot < slot) return nk_false; - switch (win->layout->chart.slots[slot].type) { - case NK_CHART_LINES: - flags = nk_chart_push_line(ctx, win, &win->layout->chart, value, slot); break; - case NK_CHART_COLUMN: - flags = nk_chart_push_column(ctx, win, &win->layout->chart, value, slot); break; - default: - case NK_CHART_MAX: - flags = 0; - } - return flags; -} -NK_API nk_flags -nk_chart_push(struct nk_context *ctx, float value) -{ - return nk_chart_push_slot(ctx, value, 0); -} -NK_API void -nk_chart_end(struct nk_context *ctx) -{ - struct nk_window *win; - struct nk_chart *chart; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) - return; - - win = ctx->current; - chart = &win->layout->chart; - NK_MEMSET(chart, 0, sizeof(*chart)); - return; -} -NK_API void -nk_plot(struct nk_context *ctx, enum nk_chart_type type, const float *values, - int count, int offset) -{ - int i = 0; - float min_value; - float max_value; - - NK_ASSERT(ctx); - NK_ASSERT(values); - if (!ctx || !values || !count) return; - - min_value = values[offset]; - max_value = values[offset]; - for (i = 0; i < count; ++i) { - min_value = NK_MIN(values[i + offset], min_value); - max_value = NK_MAX(values[i + offset], max_value); - } - - if (nk_chart_begin(ctx, type, count, min_value, max_value)) { - for (i = 0; i < count; ++i) - nk_chart_push(ctx, values[i + offset]); - nk_chart_end(ctx); - } -} -NK_API void -nk_plot_function(struct nk_context *ctx, enum nk_chart_type type, void *userdata, - float(*value_getter)(void* user, int index), int count, int offset) -{ - int i = 0; - float min_value; - float max_value; - - NK_ASSERT(ctx); - NK_ASSERT(value_getter); - if (!ctx || !value_getter || !count) return; - - max_value = min_value = value_getter(userdata, offset); - for (i = 0; i < count; ++i) { - float value = value_getter(userdata, i + offset); - min_value = NK_MIN(value, min_value); - max_value = NK_MAX(value, max_value); - } - - if (nk_chart_begin(ctx, type, count, min_value, max_value)) { - for (i = 0; i < count; ++i) - nk_chart_push(ctx, value_getter(userdata, i + offset)); - nk_chart_end(ctx); - } -} - - - - - -/* ============================================================== - * - * COLOR PICKER - * - * ===============================================================*/ -NK_LIB nk_bool -nk_color_picker_behavior(nk_flags *state, - const struct nk_rect *bounds, const struct nk_rect *matrix, - const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar, - struct nk_colorf *color, const struct nk_input *in) -{ - float hsva[4]; - nk_bool value_changed = 0; - nk_bool hsv_changed = 0; - - NK_ASSERT(state); - NK_ASSERT(matrix); - NK_ASSERT(hue_bar); - NK_ASSERT(color); - - /* color matrix */ - nk_colorf_hsva_fv(hsva, *color); - if (nk_button_behavior(state, *matrix, in, NK_BUTTON_REPEATER)) { - hsva[1] = NK_SATURATE((in->mouse.pos.x - matrix->x) / (matrix->w-1)); - hsva[2] = 1.0f - NK_SATURATE((in->mouse.pos.y - matrix->y) / (matrix->h-1)); - value_changed = hsv_changed = 1; - } - /* hue bar */ - if (nk_button_behavior(state, *hue_bar, in, NK_BUTTON_REPEATER)) { - hsva[0] = NK_SATURATE((in->mouse.pos.y - hue_bar->y) / (hue_bar->h-1)); - value_changed = hsv_changed = 1; - } - /* alpha bar */ - if (alpha_bar) { - if (nk_button_behavior(state, *alpha_bar, in, NK_BUTTON_REPEATER)) { - hsva[3] = 1.0f - NK_SATURATE((in->mouse.pos.y - alpha_bar->y) / (alpha_bar->h-1)); - value_changed = 1; - } - } - nk_widget_state_reset(state); - if (hsv_changed) { - *color = nk_hsva_colorfv(hsva); - *state = NK_WIDGET_STATE_ACTIVE; - } - if (value_changed) { - color->a = hsva[3]; - *state = NK_WIDGET_STATE_ACTIVE; - } - /* set color picker widget state */ - if (nk_input_is_mouse_hovering_rect(in, *bounds)) - *state = NK_WIDGET_STATE_HOVERED; - if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, *bounds)) - *state |= NK_WIDGET_STATE_ENTERED; - else if (nk_input_is_mouse_prev_hovering_rect(in, *bounds)) - *state |= NK_WIDGET_STATE_LEFT; - return value_changed; -} -NK_LIB void -nk_draw_color_picker(struct nk_command_buffer *o, const struct nk_rect *matrix, - const struct nk_rect *hue_bar, const struct nk_rect *alpha_bar, - struct nk_colorf col) -{ - NK_STORAGE const struct nk_color black = {0,0,0,255}; - NK_STORAGE const struct nk_color white = {255, 255, 255, 255}; - NK_STORAGE const struct nk_color black_trans = {0,0,0,0}; - - const float crosshair_size = 7.0f; - struct nk_color temp; - float hsva[4]; - float line_y; - int i; - - NK_ASSERT(o); - NK_ASSERT(matrix); - NK_ASSERT(hue_bar); - - /* draw hue bar */ - nk_colorf_hsva_fv(hsva, col); - for (i = 0; i < 6; ++i) { - NK_GLOBAL const struct nk_color hue_colors[] = { - {255, 0, 0, 255}, {255,255,0,255}, {0,255,0,255}, {0, 255,255,255}, - {0,0,255,255}, {255, 0, 255, 255}, {255, 0, 0, 255} - }; - nk_fill_rect_multi_color(o, - nk_rect(hue_bar->x, hue_bar->y + (float)i * (hue_bar->h/6.0f) + 0.5f, - hue_bar->w, (hue_bar->h/6.0f) + 0.5f), hue_colors[i], hue_colors[i], - hue_colors[i+1], hue_colors[i+1]); - } - line_y = (float)(int)(hue_bar->y + hsva[0] * matrix->h + 0.5f); - nk_stroke_line(o, hue_bar->x-1, line_y, hue_bar->x + hue_bar->w + 2, - line_y, 1, nk_rgb(255,255,255)); - - /* draw alpha bar */ - if (alpha_bar) { - float alpha = NK_SATURATE(col.a); - line_y = (float)(int)(alpha_bar->y + (1.0f - alpha) * matrix->h + 0.5f); - - nk_fill_rect_multi_color(o, *alpha_bar, white, white, black, black); - nk_stroke_line(o, alpha_bar->x-1, line_y, alpha_bar->x + alpha_bar->w + 2, - line_y, 1, nk_rgb(255,255,255)); - } - - /* draw color matrix */ - temp = nk_hsv_f(hsva[0], 1.0f, 1.0f); - nk_fill_rect_multi_color(o, *matrix, white, temp, temp, white); - nk_fill_rect_multi_color(o, *matrix, black_trans, black_trans, black, black); - - /* draw cross-hair */ - {struct nk_vec2 p; float S = hsva[1]; float V = hsva[2]; - p.x = (float)(int)(matrix->x + S * matrix->w); - p.y = (float)(int)(matrix->y + (1.0f - V) * matrix->h); - nk_stroke_line(o, p.x - crosshair_size, p.y, p.x-2, p.y, 1.0f, white); - nk_stroke_line(o, p.x + crosshair_size + 1, p.y, p.x+3, p.y, 1.0f, white); - nk_stroke_line(o, p.x, p.y + crosshair_size + 1, p.x, p.y+3, 1.0f, white); - nk_stroke_line(o, p.x, p.y - crosshair_size, p.x, p.y-2, 1.0f, white);} -} -NK_LIB nk_bool -nk_do_color_picker(nk_flags *state, - struct nk_command_buffer *out, struct nk_colorf *col, - enum nk_color_format fmt, struct nk_rect bounds, - struct nk_vec2 padding, const struct nk_input *in, - const struct nk_user_font *font) -{ - int ret = 0; - struct nk_rect matrix; - struct nk_rect hue_bar; - struct nk_rect alpha_bar; - float bar_w; - - NK_ASSERT(out); - NK_ASSERT(col); - NK_ASSERT(state); - NK_ASSERT(font); - if (!out || !col || !state || !font) - return ret; - - bar_w = font->height; - bounds.x += padding.x; - bounds.y += padding.x; - bounds.w -= 2 * padding.x; - bounds.h -= 2 * padding.y; - - matrix.x = bounds.x; - matrix.y = bounds.y; - matrix.h = bounds.h; - matrix.w = bounds.w - (3 * padding.x + 2 * bar_w); - - hue_bar.w = bar_w; - hue_bar.y = bounds.y; - hue_bar.h = matrix.h; - hue_bar.x = matrix.x + matrix.w + padding.x; - - alpha_bar.x = hue_bar.x + hue_bar.w + padding.x; - alpha_bar.y = bounds.y; - alpha_bar.w = bar_w; - alpha_bar.h = matrix.h; - - ret = nk_color_picker_behavior(state, &bounds, &matrix, &hue_bar, - (fmt == NK_RGBA) ? &alpha_bar:0, col, in); - nk_draw_color_picker(out, &matrix, &hue_bar, (fmt == NK_RGBA) ? &alpha_bar:0, *col); - return ret; -} -NK_API nk_bool -nk_color_pick(struct nk_context * ctx, struct nk_colorf *color, - enum nk_color_format fmt) -{ - struct nk_window *win; - struct nk_panel *layout; - const struct nk_style *config; - const struct nk_input *in; - - enum nk_widget_layout_states state; - struct nk_rect bounds; - - NK_ASSERT(ctx); - NK_ASSERT(color); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout || !color) - return 0; - - win = ctx->current; - config = &ctx->style; - layout = win->layout; - state = nk_widget(&bounds, ctx); - if (!state) return 0; - in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input; - return nk_do_color_picker(&ctx->last_widget_state, &win->buffer, color, fmt, bounds, - nk_vec2(0,0), in, config->font); -} -NK_API struct nk_colorf -nk_color_picker(struct nk_context *ctx, struct nk_colorf color, - enum nk_color_format fmt) -{ - nk_color_pick(ctx, &color, fmt); - return color; -} - - - - - -/* ============================================================== - * - * COMBO - * - * ===============================================================*/ -NK_INTERN nk_bool -nk_combo_begin(struct nk_context *ctx, struct nk_window *win, - struct nk_vec2 size, nk_bool is_clicked, struct nk_rect header) -{ - struct nk_window *popup; - int is_open = 0; - int is_active = 0; - struct nk_rect body; - nk_hash hash; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - popup = win->popup.win; - body.x = header.x; - body.w = size.x; - body.y = header.y + header.h-ctx->style.window.combo_border; - body.h = size.y; - - hash = win->popup.combo_count++; - is_open = (popup) ? nk_true:nk_false; - is_active = (popup && (win->popup.name == hash) && win->popup.type == NK_PANEL_COMBO); - if ((is_clicked && is_open && !is_active) || (is_open && !is_active) || - (!is_open && !is_active && !is_clicked)) return 0; - if (!nk_nonblock_begin(ctx, 0, body, - (is_clicked && is_open)?nk_rect(0,0,0,0):header, NK_PANEL_COMBO)) return 0; - - win->popup.type = NK_PANEL_COMBO; - win->popup.name = hash; - return 1; -} -NK_API nk_bool -nk_combo_begin_text(struct nk_context *ctx, const char *selected, int len, - struct nk_vec2 size) -{ - const struct nk_input *in; - struct nk_window *win; - struct nk_style *style; - - enum nk_widget_layout_states s; - int is_clicked = nk_false; - struct nk_rect header; - const struct nk_style_item *background; - struct nk_text text; - - NK_ASSERT(ctx); - NK_ASSERT(selected); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout || !selected) - return 0; - - win = ctx->current; - style = &ctx->style; - s = nk_widget(&header, ctx); - if (s == NK_WIDGET_INVALID) - return 0; - - in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; - if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) - is_clicked = nk_true; - - /* draw combo box header background and border */ - if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) { - background = &style->combo.active; - text.text = style->combo.label_active; - } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) { - background = &style->combo.hover; - text.text = style->combo.label_hover; - } else { - background = &style->combo.normal; - text.text = style->combo.label_normal; - } - - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - text.background = nk_rgba(0, 0, 0, 0); - nk_draw_image(&win->buffer, header, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - text.background = nk_rgba(0, 0, 0, 0); - nk_draw_nine_slice(&win->buffer, header, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - text.background = background->data.color; - nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); - nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); - break; - } - { - /* print currently selected text item */ - struct nk_rect label; - struct nk_rect button; - struct nk_rect content; - int draw_button_symbol; - - enum nk_symbol_type sym; - if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) - sym = style->combo.sym_hover; - else if (is_clicked) - sym = style->combo.sym_active; - else - sym = style->combo.sym_normal; - - /* represents whether or not the combo's button symbol should be drawn */ - draw_button_symbol = sym != NK_SYMBOL_NONE; - - /* calculate button */ - button.w = header.h - 2 * style->combo.button_padding.y; - button.x = (header.x + header.w - header.h) - style->combo.button_padding.x; - button.y = header.y + style->combo.button_padding.y; - button.h = button.w; - - content.x = button.x + style->combo.button.padding.x; - content.y = button.y + style->combo.button.padding.y; - content.w = button.w - 2 * style->combo.button.padding.x; - content.h = button.h - 2 * style->combo.button.padding.y; - - /* draw selected label */ - text.padding = nk_vec2(0,0); - label.x = header.x + style->combo.content_padding.x; - label.y = header.y + style->combo.content_padding.y; - label.h = header.h - 2 * style->combo.content_padding.y; - if (draw_button_symbol) - label.w = button.x - (style->combo.content_padding.x + style->combo.spacing.x) - label.x; - else - label.w = header.w - 2 * style->combo.content_padding.x; - nk_widget_text(&win->buffer, label, selected, len, &text, - NK_TEXT_LEFT, ctx->style.font); - - /* draw open/close button */ - if (draw_button_symbol) - nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state, - &ctx->style.combo.button, sym, style->font); - } - return nk_combo_begin(ctx, win, size, is_clicked, header); -} -NK_API nk_bool -nk_combo_begin_label(struct nk_context *ctx, const char *selected, struct nk_vec2 size) -{ - return nk_combo_begin_text(ctx, selected, nk_strlen(selected), size); -} -NK_API nk_bool -nk_combo_begin_color(struct nk_context *ctx, struct nk_color color, struct nk_vec2 size) -{ - struct nk_window *win; - struct nk_style *style; - const struct nk_input *in; - - struct nk_rect header; - int is_clicked = nk_false; - enum nk_widget_layout_states s; - const struct nk_style_item *background; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - style = &ctx->style; - s = nk_widget(&header, ctx); - if (s == NK_WIDGET_INVALID) - return 0; - - in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; - if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) - is_clicked = nk_true; - - /* draw combo box header background and border */ - if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) - background = &style->combo.active; - else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) - background = &style->combo.hover; - else background = &style->combo.normal; - - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(&win->buffer, header, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(&win->buffer, header, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); - nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); - break; - } - { - struct nk_rect content; - struct nk_rect button; - struct nk_rect bounds; - int draw_button_symbol; - - enum nk_symbol_type sym; - if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) - sym = style->combo.sym_hover; - else if (is_clicked) - sym = style->combo.sym_active; - else sym = style->combo.sym_normal; - - /* represents whether or not the combo's button symbol should be drawn */ - draw_button_symbol = sym != NK_SYMBOL_NONE; - - /* calculate button */ - button.w = header.h - 2 * style->combo.button_padding.y; - button.x = (header.x + header.w - header.h) - style->combo.button_padding.x; - button.y = header.y + style->combo.button_padding.y; - button.h = button.w; - - content.x = button.x + style->combo.button.padding.x; - content.y = button.y + style->combo.button.padding.y; - content.w = button.w - 2 * style->combo.button.padding.x; - content.h = button.h - 2 * style->combo.button.padding.y; - - /* draw color */ - bounds.h = header.h - 4 * style->combo.content_padding.y; - bounds.y = header.y + 2 * style->combo.content_padding.y; - bounds.x = header.x + 2 * style->combo.content_padding.x; - if (draw_button_symbol) - bounds.w = (button.x - (style->combo.content_padding.x + style->combo.spacing.x)) - bounds.x; - else - bounds.w = header.w - 4 * style->combo.content_padding.x; - nk_fill_rect(&win->buffer, bounds, 0, color); - - /* draw open/close button */ - if (draw_button_symbol) - nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state, - &ctx->style.combo.button, sym, style->font); - } - return nk_combo_begin(ctx, win, size, is_clicked, header); -} -NK_API nk_bool -nk_combo_begin_symbol(struct nk_context *ctx, enum nk_symbol_type symbol, struct nk_vec2 size) -{ - struct nk_window *win; - struct nk_style *style; - const struct nk_input *in; - - struct nk_rect header; - int is_clicked = nk_false; - enum nk_widget_layout_states s; - const struct nk_style_item *background; - struct nk_color sym_background; - struct nk_color symbol_color; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - style = &ctx->style; - s = nk_widget(&header, ctx); - if (s == NK_WIDGET_INVALID) - return 0; - - in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; - if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) - is_clicked = nk_true; - - /* draw combo box header background and border */ - if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) { - background = &style->combo.active; - symbol_color = style->combo.symbol_active; - } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) { - background = &style->combo.hover; - symbol_color = style->combo.symbol_hover; - } else { - background = &style->combo.normal; - symbol_color = style->combo.symbol_hover; - } - - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - sym_background = nk_rgba(0, 0, 0, 0); - nk_draw_image(&win->buffer, header, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - sym_background = nk_rgba(0, 0, 0, 0); - nk_draw_nine_slice(&win->buffer, header, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - sym_background = background->data.color; - nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); - nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); - break; - } - { - struct nk_rect bounds = {0,0,0,0}; - struct nk_rect content; - struct nk_rect button; - - enum nk_symbol_type sym; - if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) - sym = style->combo.sym_hover; - else if (is_clicked) - sym = style->combo.sym_active; - else sym = style->combo.sym_normal; - - /* calculate button */ - button.w = header.h - 2 * style->combo.button_padding.y; - button.x = (header.x + header.w - header.h) - style->combo.button_padding.y; - button.y = header.y + style->combo.button_padding.y; - button.h = button.w; - - content.x = button.x + style->combo.button.padding.x; - content.y = button.y + style->combo.button.padding.y; - content.w = button.w - 2 * style->combo.button.padding.x; - content.h = button.h - 2 * style->combo.button.padding.y; - - /* draw symbol */ - bounds.h = header.h - 2 * style->combo.content_padding.y; - bounds.y = header.y + style->combo.content_padding.y; - bounds.x = header.x + style->combo.content_padding.x; - bounds.w = (button.x - style->combo.content_padding.y) - bounds.x; - nk_draw_symbol(&win->buffer, symbol, bounds, sym_background, symbol_color, - 1.0f, style->font); - - /* draw open/close button */ - nk_draw_button_symbol(&win->buffer, &bounds, &content, ctx->last_widget_state, - &ctx->style.combo.button, sym, style->font); - } - return nk_combo_begin(ctx, win, size, is_clicked, header); -} -NK_API nk_bool -nk_combo_begin_symbol_text(struct nk_context *ctx, const char *selected, int len, - enum nk_symbol_type symbol, struct nk_vec2 size) -{ - struct nk_window *win; - struct nk_style *style; - struct nk_input *in; - - struct nk_rect header; - int is_clicked = nk_false; - enum nk_widget_layout_states s; - const struct nk_style_item *background; - struct nk_color symbol_color; - struct nk_text text; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - style = &ctx->style; - s = nk_widget(&header, ctx); - if (!s) return 0; - - in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; - if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) - is_clicked = nk_true; - - /* draw combo box header background and border */ - if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) { - background = &style->combo.active; - symbol_color = style->combo.symbol_active; - text.text = style->combo.label_active; - } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) { - background = &style->combo.hover; - symbol_color = style->combo.symbol_hover; - text.text = style->combo.label_hover; - } else { - background = &style->combo.normal; - symbol_color = style->combo.symbol_normal; - text.text = style->combo.label_normal; - } - - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - text.background = nk_rgba(0, 0, 0, 0); - nk_draw_image(&win->buffer, header, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - text.background = nk_rgba(0, 0, 0, 0); - nk_draw_nine_slice(&win->buffer, header, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - text.background = background->data.color; - nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); - nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); - break; - } - { - struct nk_rect content; - struct nk_rect button; - struct nk_rect label; - struct nk_rect image; - - enum nk_symbol_type sym; - if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) - sym = style->combo.sym_hover; - else if (is_clicked) - sym = style->combo.sym_active; - else sym = style->combo.sym_normal; - - /* calculate button */ - button.w = header.h - 2 * style->combo.button_padding.y; - button.x = (header.x + header.w - header.h) - style->combo.button_padding.x; - button.y = header.y + style->combo.button_padding.y; - button.h = button.w; - - content.x = button.x + style->combo.button.padding.x; - content.y = button.y + style->combo.button.padding.y; - content.w = button.w - 2 * style->combo.button.padding.x; - content.h = button.h - 2 * style->combo.button.padding.y; - nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state, - &ctx->style.combo.button, sym, style->font); - - /* draw symbol */ - image.x = header.x + style->combo.content_padding.x; - image.y = header.y + style->combo.content_padding.y; - image.h = header.h - 2 * style->combo.content_padding.y; - image.w = image.h; - nk_draw_symbol(&win->buffer, symbol, image, text.background, symbol_color, - 1.0f, style->font); - - /* draw label */ - text.padding = nk_vec2(0,0); - label.x = image.x + image.w + style->combo.spacing.x + style->combo.content_padding.x; - label.y = header.y + style->combo.content_padding.y; - label.w = (button.x - style->combo.content_padding.x) - label.x; - label.h = header.h - 2 * style->combo.content_padding.y; - nk_widget_text(&win->buffer, label, selected, len, &text, NK_TEXT_LEFT, style->font); - } - return nk_combo_begin(ctx, win, size, is_clicked, header); -} -NK_API nk_bool -nk_combo_begin_image(struct nk_context *ctx, struct nk_image img, struct nk_vec2 size) -{ - struct nk_window *win; - struct nk_style *style; - const struct nk_input *in; - - struct nk_rect header; - int is_clicked = nk_false; - enum nk_widget_layout_states s; - const struct nk_style_item *background; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - style = &ctx->style; - s = nk_widget(&header, ctx); - if (s == NK_WIDGET_INVALID) - return 0; - - in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; - if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) - is_clicked = nk_true; - - /* draw combo box header background and border */ - if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) - background = &style->combo.active; - else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) - background = &style->combo.hover; - else background = &style->combo.normal; - - switch (background->type) { - case NK_STYLE_ITEM_IMAGE: - nk_draw_image(&win->buffer, header, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - nk_draw_nine_slice(&win->buffer, header, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); - nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); - break; - } - { - struct nk_rect bounds = {0,0,0,0}; - struct nk_rect content; - struct nk_rect button; - int draw_button_symbol; - - enum nk_symbol_type sym; - if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) - sym = style->combo.sym_hover; - else if (is_clicked) - sym = style->combo.sym_active; - else sym = style->combo.sym_normal; - - /* represents whether or not the combo's button symbol should be drawn */ - draw_button_symbol = sym != NK_SYMBOL_NONE; - - /* calculate button */ - button.w = header.h - 2 * style->combo.button_padding.y; - button.x = (header.x + header.w - header.h) - style->combo.button_padding.y; - button.y = header.y + style->combo.button_padding.y; - button.h = button.w; - - content.x = button.x + style->combo.button.padding.x; - content.y = button.y + style->combo.button.padding.y; - content.w = button.w - 2 * style->combo.button.padding.x; - content.h = button.h - 2 * style->combo.button.padding.y; - - /* draw image */ - bounds.h = header.h - 2 * style->combo.content_padding.y; - bounds.y = header.y + style->combo.content_padding.y; - bounds.x = header.x + style->combo.content_padding.x; - if (draw_button_symbol) - bounds.w = (button.x - style->combo.content_padding.y) - bounds.x; - else - bounds.w = header.w - 2 * style->combo.content_padding.x; - nk_draw_image(&win->buffer, bounds, &img, nk_white); - - /* draw open/close button */ - if (draw_button_symbol) - nk_draw_button_symbol(&win->buffer, &bounds, &content, ctx->last_widget_state, - &ctx->style.combo.button, sym, style->font); - } - return nk_combo_begin(ctx, win, size, is_clicked, header); -} -NK_API nk_bool -nk_combo_begin_image_text(struct nk_context *ctx, const char *selected, int len, - struct nk_image img, struct nk_vec2 size) -{ - struct nk_window *win; - struct nk_style *style; - struct nk_input *in; - - struct nk_rect header; - int is_clicked = nk_false; - enum nk_widget_layout_states s; - const struct nk_style_item *background; - struct nk_text text; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - win = ctx->current; - style = &ctx->style; - s = nk_widget(&header, ctx); - if (!s) return 0; - - in = (win->layout->flags & NK_WINDOW_ROM || s == NK_WIDGET_ROM)? 0: &ctx->input; - if (nk_button_behavior(&ctx->last_widget_state, header, in, NK_BUTTON_DEFAULT)) - is_clicked = nk_true; - - /* draw combo box header background and border */ - if (ctx->last_widget_state & NK_WIDGET_STATE_ACTIVED) { - background = &style->combo.active; - text.text = style->combo.label_active; - } else if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) { - background = &style->combo.hover; - text.text = style->combo.label_hover; - } else { - background = &style->combo.normal; - text.text = style->combo.label_normal; - } - - switch(background->type) { - case NK_STYLE_ITEM_IMAGE: - text.background = nk_rgba(0, 0, 0, 0); - nk_draw_image(&win->buffer, header, &background->data.image, nk_white); - break; - case NK_STYLE_ITEM_NINE_SLICE: - text.background = nk_rgba(0, 0, 0, 0); - nk_draw_nine_slice(&win->buffer, header, &background->data.slice, nk_white); - break; - case NK_STYLE_ITEM_COLOR: - text.background = background->data.color; - nk_fill_rect(&win->buffer, header, style->combo.rounding, background->data.color); - nk_stroke_rect(&win->buffer, header, style->combo.rounding, style->combo.border, style->combo.border_color); - break; - } - { - struct nk_rect content; - struct nk_rect button; - struct nk_rect label; - struct nk_rect image; - int draw_button_symbol; - - enum nk_symbol_type sym; - if (ctx->last_widget_state & NK_WIDGET_STATE_HOVER) - sym = style->combo.sym_hover; - else if (is_clicked) - sym = style->combo.sym_active; - else sym = style->combo.sym_normal; - - /* represents whether or not the combo's button symbol should be drawn */ - draw_button_symbol = sym != NK_SYMBOL_NONE; - - /* calculate button */ - button.w = header.h - 2 * style->combo.button_padding.y; - button.x = (header.x + header.w - header.h) - style->combo.button_padding.x; - button.y = header.y + style->combo.button_padding.y; - button.h = button.w; - - content.x = button.x + style->combo.button.padding.x; - content.y = button.y + style->combo.button.padding.y; - content.w = button.w - 2 * style->combo.button.padding.x; - content.h = button.h - 2 * style->combo.button.padding.y; - if (draw_button_symbol) - nk_draw_button_symbol(&win->buffer, &button, &content, ctx->last_widget_state, - &ctx->style.combo.button, sym, style->font); - - /* draw image */ - image.x = header.x + style->combo.content_padding.x; - image.y = header.y + style->combo.content_padding.y; - image.h = header.h - 2 * style->combo.content_padding.y; - image.w = image.h; - nk_draw_image(&win->buffer, image, &img, nk_white); - - /* draw label */ - text.padding = nk_vec2(0,0); - label.x = image.x + image.w + style->combo.spacing.x + style->combo.content_padding.x; - label.y = header.y + style->combo.content_padding.y; - label.h = header.h - 2 * style->combo.content_padding.y; - if (draw_button_symbol) - label.w = (button.x - style->combo.content_padding.x) - label.x; - else - label.w = (header.x + header.w - style->combo.content_padding.x) - label.x; - nk_widget_text(&win->buffer, label, selected, len, &text, NK_TEXT_LEFT, style->font); - } - return nk_combo_begin(ctx, win, size, is_clicked, header); -} -NK_API nk_bool -nk_combo_begin_symbol_label(struct nk_context *ctx, - const char *selected, enum nk_symbol_type type, struct nk_vec2 size) -{ - return nk_combo_begin_symbol_text(ctx, selected, nk_strlen(selected), type, size); -} -NK_API nk_bool -nk_combo_begin_image_label(struct nk_context *ctx, - const char *selected, struct nk_image img, struct nk_vec2 size) -{ - return nk_combo_begin_image_text(ctx, selected, nk_strlen(selected), img, size); -} -NK_API nk_bool -nk_combo_item_text(struct nk_context *ctx, const char *text, int len,nk_flags align) -{ - return nk_contextual_item_text(ctx, text, len, align); -} -NK_API nk_bool -nk_combo_item_label(struct nk_context *ctx, const char *label, nk_flags align) -{ - return nk_contextual_item_label(ctx, label, align); -} -NK_API nk_bool -nk_combo_item_image_text(struct nk_context *ctx, struct nk_image img, const char *text, - int len, nk_flags alignment) -{ - return nk_contextual_item_image_text(ctx, img, text, len, alignment); -} -NK_API nk_bool -nk_combo_item_image_label(struct nk_context *ctx, struct nk_image img, - const char *text, nk_flags alignment) -{ - return nk_contextual_item_image_label(ctx, img, text, alignment); -} -NK_API nk_bool -nk_combo_item_symbol_text(struct nk_context *ctx, enum nk_symbol_type sym, - const char *text, int len, nk_flags alignment) -{ - return nk_contextual_item_symbol_text(ctx, sym, text, len, alignment); -} -NK_API nk_bool -nk_combo_item_symbol_label(struct nk_context *ctx, enum nk_symbol_type sym, - const char *label, nk_flags alignment) -{ - return nk_contextual_item_symbol_label(ctx, sym, label, alignment); -} -NK_API void nk_combo_end(struct nk_context *ctx) -{ - nk_contextual_end(ctx); -} -NK_API void nk_combo_close(struct nk_context *ctx) -{ - nk_contextual_close(ctx); -} -NK_API int -nk_combo(struct nk_context *ctx, const char **items, int count, - int selected, int item_height, struct nk_vec2 size) -{ - int i = 0; - int max_height; - struct nk_vec2 item_spacing; - struct nk_vec2 window_padding; - - NK_ASSERT(ctx); - NK_ASSERT(items); - NK_ASSERT(ctx->current); - if (!ctx || !items ||!count) - return selected; - - item_spacing = ctx->style.window.spacing; - window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type); - max_height = count * item_height + count * (int)item_spacing.y; - max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2; - size.y = NK_MIN(size.y, (float)max_height); - if (nk_combo_begin_label(ctx, items[selected], size)) { - nk_layout_row_dynamic(ctx, (float)item_height, 1); - for (i = 0; i < count; ++i) { - if (nk_combo_item_label(ctx, items[i], NK_TEXT_LEFT)) - selected = i; - } - nk_combo_end(ctx); - } - return selected; -} -NK_API int -nk_combo_separator(struct nk_context *ctx, const char *items_separated_by_separator, - int separator, int selected, int count, int item_height, struct nk_vec2 size) -{ - int i; - int max_height; - struct nk_vec2 item_spacing; - struct nk_vec2 window_padding; - const char *current_item; - const char *iter; - int length = 0; - - NK_ASSERT(ctx); - NK_ASSERT(items_separated_by_separator); - if (!ctx || !items_separated_by_separator) - return selected; - - /* calculate popup window */ - item_spacing = ctx->style.window.spacing; - window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type); - max_height = count * item_height + count * (int)item_spacing.y; - max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2; - size.y = NK_MIN(size.y, (float)max_height); - - /* find selected item */ - current_item = items_separated_by_separator; - for (i = 0; i < count; ++i) { - iter = current_item; - while (*iter && *iter != separator) iter++; - length = (int)(iter - current_item); - if (i == selected) break; - current_item = iter + 1; - } - - if (nk_combo_begin_text(ctx, current_item, length, size)) { - current_item = items_separated_by_separator; - nk_layout_row_dynamic(ctx, (float)item_height, 1); - for (i = 0; i < count; ++i) { - iter = current_item; - while (*iter && *iter != separator) iter++; - length = (int)(iter - current_item); - if (nk_combo_item_text(ctx, current_item, length, NK_TEXT_LEFT)) - selected = i; - current_item = current_item + length + 1; - } - nk_combo_end(ctx); - } - return selected; -} -NK_API int -nk_combo_string(struct nk_context *ctx, const char *items_separated_by_zeros, - int selected, int count, int item_height, struct nk_vec2 size) -{ - return nk_combo_separator(ctx, items_separated_by_zeros, '\0', selected, count, item_height, size); -} -NK_API int -nk_combo_callback(struct nk_context *ctx, void(*item_getter)(void*, int, const char**), - void *userdata, int selected, int count, int item_height, struct nk_vec2 size) -{ - int i; - int max_height; - struct nk_vec2 item_spacing; - struct nk_vec2 window_padding; - const char *item; - - NK_ASSERT(ctx); - NK_ASSERT(item_getter); - if (!ctx || !item_getter) - return selected; - - /* calculate popup window */ - item_spacing = ctx->style.window.spacing; - window_padding = nk_panel_get_padding(&ctx->style, ctx->current->layout->type); - max_height = count * item_height + count * (int)item_spacing.y; - max_height += (int)item_spacing.y * 2 + (int)window_padding.y * 2; - size.y = NK_MIN(size.y, (float)max_height); - - item_getter(userdata, selected, &item); - if (nk_combo_begin_label(ctx, item, size)) { - nk_layout_row_dynamic(ctx, (float)item_height, 1); - for (i = 0; i < count; ++i) { - item_getter(userdata, i, &item); - if (nk_combo_item_label(ctx, item, NK_TEXT_LEFT)) - selected = i; - } - nk_combo_end(ctx); - } return selected; -} -NK_API void -nk_combobox(struct nk_context *ctx, const char **items, int count, - int *selected, int item_height, struct nk_vec2 size) -{ - *selected = nk_combo(ctx, items, count, *selected, item_height, size); -} -NK_API void -nk_combobox_string(struct nk_context *ctx, const char *items_separated_by_zeros, - int *selected, int count, int item_height, struct nk_vec2 size) -{ - *selected = nk_combo_string(ctx, items_separated_by_zeros, *selected, count, item_height, size); -} -NK_API void -nk_combobox_separator(struct nk_context *ctx, const char *items_separated_by_separator, - int separator, int *selected, int count, int item_height, struct nk_vec2 size) -{ - *selected = nk_combo_separator(ctx, items_separated_by_separator, separator, - *selected, count, item_height, size); -} -NK_API void -nk_combobox_callback(struct nk_context *ctx, - void(*item_getter)(void* data, int id, const char **out_text), - void *userdata, int *selected, int count, int item_height, struct nk_vec2 size) -{ - *selected = nk_combo_callback(ctx, item_getter, userdata, *selected, count, item_height, size); -} - - - - - -/* =============================================================== - * - * TOOLTIP - * - * ===============================================================*/ -NK_API nk_bool -nk_tooltip_begin(struct nk_context *ctx, float width) -{ - int x,y,w,h; - struct nk_window *win; - const struct nk_input *in; - struct nk_rect bounds; - int ret; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - if (!ctx || !ctx->current || !ctx->current->layout) - return 0; - - /* make sure that no nonblocking popup is currently active */ - win = ctx->current; - in = &ctx->input; - if (win->popup.win && (win->popup.type & NK_PANEL_SET_NONBLOCK)) - return 0; - - w = nk_iceilf(width); - h = nk_iceilf(nk_null_rect.h); - x = nk_ifloorf(in->mouse.pos.x + 1) - (int)win->layout->clip.x; - y = nk_ifloorf(in->mouse.pos.y + 1) - (int)win->layout->clip.y; - - bounds.x = (float)x; - bounds.y = (float)y; - bounds.w = (float)w; - bounds.h = (float)h; - - ret = nk_popup_begin(ctx, NK_POPUP_DYNAMIC, - "__##Tooltip##__", NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_BORDER, bounds); - if (ret) win->layout->flags &= ~(nk_flags)NK_WINDOW_ROM; - win->popup.type = NK_PANEL_TOOLTIP; - ctx->current->layout->type = NK_PANEL_TOOLTIP; - return ret; -} - -NK_API void -nk_tooltip_end(struct nk_context *ctx) -{ - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - if (!ctx || !ctx->current) return; - ctx->current->seq--; - nk_popup_close(ctx); - nk_popup_end(ctx); -} -NK_API void -nk_tooltip(struct nk_context *ctx, const char *text) -{ - const struct nk_style *style; - struct nk_vec2 padding; - - int text_len; - float text_width; - float text_height; - - NK_ASSERT(ctx); - NK_ASSERT(ctx->current); - NK_ASSERT(ctx->current->layout); - NK_ASSERT(text); - if (!ctx || !ctx->current || !ctx->current->layout || !text) - return; - - /* fetch configuration data */ - style = &ctx->style; - padding = style->window.padding; - - /* calculate size of the text and tooltip */ - text_len = nk_strlen(text); - text_width = style->font->width(style->font->userdata, - style->font->height, text, text_len); - text_width += (4 * padding.x); - text_height = (style->font->height + 2 * padding.y); - - /* execute tooltip and fill with text */ - if (nk_tooltip_begin(ctx, (float)text_width)) { - nk_layout_row_dynamic(ctx, (float)text_height, 1); - nk_text(ctx, text, text_len, NK_TEXT_LEFT); - nk_tooltip_end(ctx); - } -} -#ifdef NK_INCLUDE_STANDARD_VARARGS -NK_API void -nk_tooltipf(struct nk_context *ctx, const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - nk_tooltipfv(ctx, fmt, args); - va_end(args); -} -NK_API void -nk_tooltipfv(struct nk_context *ctx, const char *fmt, va_list args) -{ - char buf[256]; - nk_strfmt(buf, NK_LEN(buf), fmt, args); - nk_tooltip(ctx, buf); -} -#endif - - - -#endif /* NK_IMPLEMENTATION */ - -/* -/// ## License -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~none -/// ------------------------------------------------------------------------------ -/// This software is available under 2 licenses -- choose whichever you prefer. -/// ------------------------------------------------------------------------------ -/// ALTERNATIVE A - MIT License -/// Copyright (c) 2016-2018 Micha Mettke -/// Permission is hereby granted, free of charge, to any person obtaining a copy of -/// this software and associated documentation files (the "Software"), to deal in -/// 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: -/// The above copyright notice and this permission notice shall be included in all -/// copies or substantial portions of the 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 -/// AUTHORS 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 IN THE -/// SOFTWARE. -/// ------------------------------------------------------------------------------ -/// ALTERNATIVE B - Public Domain (www.unlicense.org) -/// This is free and unencumbered software released into the public domain. -/// Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -/// software, either in source code form or as a compiled binary, for any purpose, -/// commercial or non-commercial, and by any means. -/// In jurisdictions that recognize copyright laws, the author or authors of this -/// software dedicate any and all copyright interest in the software to the public -/// domain. We make this dedication for the benefit of the public at large and to -/// the detriment of our heirs and successors. We intend this dedication to be an -/// overt act of relinquishment in perpetuity of all present and future rights to -/// this software under copyright law. -/// 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 -/// AUTHORS 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 IN THE SOFTWARE. -/// ------------------------------------------------------------------------------ -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -/// ## Changelog -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~none -/// [date] ([x.y.z]) - [description] -/// - [date]: date on which the change has been pushed -/// - [x.y.z]: Version string, represented in Semantic Versioning format -/// - [x]: Major version with API and library breaking changes -/// - [y]: Minor version with non-breaking API and library changes -/// - [z]: Patch version with no direct changes to the API -/// -/// - 2022/12/23 (4.10.6) - Fix incorrect glyph index in nk_font_bake() -/// - 2022/12/17 (4.10.5) - Fix nk_font_bake_pack() using TTC font offset incorrectly -/// - 2022/10/24 (4.10.4) - Fix nk_str_{append,insert}_str_utf8 always returning 0 -/// - 2022/09/03 (4.10.3) - Renamed the `null` texture variable to `tex_null` -/// - 2022/08/01 (4.10.2) - Fix Apple Silicon with incorrect NK_SITE_TYPE and NK_POINTER_TYPE -/// - 2022/08/01 (4.10.1) - Fix cursor jumping back to beginning of text when typing more than -/// nk_edit_xxx limit -/// - 2022/05/27 (4.10.0) - Add nk_input_has_mouse_click_in_button_rect() to fix window move bug -/// - 2022/04/18 (4.9.7) - Change button behavior when NK_BUTTON_TRIGGER_ON_RELEASE is defined to -/// only trigger when the mouse position was inside the same button on down -/// - 2022/02/03 (4.9.6) - Allow overriding the NK_INV_SQRT function, similar to NK_SIN and NK_COS -/// - 2021/12/22 (4.9.5) - Revert layout bounds not accounting for padding due to regressions -/// - 2021/12/22 (4.9.4) - Fix checking hovering when window is minimized -/// - 2021/12/22 (4.09.3) - Fix layout bounds not accounting for padding -/// - 2021/12/19 (4.09.2) - Update to stb_rect_pack.h v1.01 and stb_truetype.h v1.26 -/// - 2021/12/16 (4.09.1) - Fix the majority of GCC warnings -/// - 2021/10/16 (4.09.0) - Added nk_spacer() widget -/// - 2021/09/22 (4.08.6) - Fix "may be used uninitialized" warnings in nk_widget -/// - 2021/09/22 (4.08.5) - GCC __builtin_offsetof only exists in version 4 and later -/// - 2021/09/15 (4.08.4) - Fix "'num_len' may be used uninitialized" in nk_do_property -/// - 2021/09/15 (4.08.3) - Fix "Templates cannot be declared to have 'C' Linkage" -/// - 2021/09/08 (4.08.2) - Fix warnings in C89 builds -/// - 2021/09/08 (4.08.1) - Use compiler builtins for NK_OFFSETOF when possible -/// - 2021/08/17 (4.08.0) - Implemented 9-slice scaling support for widget styles -/// - 2021/08/16 (4.07.5) - Replace usage of memset in nk_font_atlas_bake with NK_MEMSET -/// - 2021/08/15 (4.07.4) - Fix conversion and sign conversion warnings -/// - 2021/08/08 (4.07.3) - Fix crash when baking merged fonts -/// - 2021/08/08 (4.07.2) - Fix Multiline Edit wrong offset -/// - 2021/03/17 (4.07.1) - Fix warning about unused parameter -/// - 2021/03/17 (4.07.0) - Fix nk_property hover bug -/// - 2021/03/15 (4.06.4) - Change nk_propertyi back to int -/// - 2021/03/15 (4.06.3) - Update documentation for functions that now return nk_bool -/// - 2020/12/19 (4.06.2) - Fix additional C++ style comments which are not allowed in ISO C90. -/// - 2020/10/11 (4.06.1) - Fix C++ style comments which are not allowed in ISO C90. -/// - 2020/10/07 (4.06.0) - Fix nk_combo return type wrongly changed to nk_bool -/// - 2020/09/05 (4.05.0) - Use the nk_font_atlas allocator for stb_truetype memory management. -/// - 2020/09/04 (4.04.1) - Replace every boolean int by nk_bool -/// - 2020/09/04 (4.04.0) - Add nk_bool with NK_INCLUDE_STANDARD_BOOL -/// - 2020/06/13 (4.03.1) - Fix nk_pool allocation sizes. -/// - 2020/06/04 (4.03.0) - Made nk_combo header symbols optional. -/// - 2020/05/27 (4.02.5) - Fix nk_do_edit: Keep scroll position when re-activating edit widget. -/// - 2020/05/09 (4.02.4) - Fix nk_menubar height calculation bug -/// - 2020/05/08 (4.02.3) - Fix missing stdarg.h with NK_INCLUDE_STANDARD_VARARGS -/// - 2020/04/30 (4.02.2) - Fix nk_edit border drawing bug -/// - 2020/04/09 (4.02.1) - Removed unused nk_sqrt function to fix compiler warnings -/// - Fixed compiler warnings if you bring your own methods for -/// nk_cos/nk_sin/nk_strtod/nk_memset/nk_memcopy/nk_dtoa -/// - 2020/04/06 (4.01.10) - Fix bug: Do not use pool before checking for NULL -/// - 2020/03/22 (4.01.9) - Fix bug where layout state wasn't restored correctly after -/// popping a tree. -/// - 2020/03/11 (4.01.8) - Fix bug where padding is subtracted from widget -/// - 2020/03/06 (4.01.7) - Fix bug where width padding was applied twice -/// - 2020/02/06 (4.01.6) - Update stb_truetype.h and stb_rect_pack.h and separate them -/// - 2019/12/10 (4.01.5) - Fix off-by-one error in NK_INTERSECT -/// - 2019/10/09 (4.01.4) - Fix bug for autoscrolling in nk_do_edit -/// - 2019/09/20 (4.01.3) - Fixed a bug wherein combobox cannot be closed by clicking the header -/// when NK_BUTTON_TRIGGER_ON_RELEASE is defined. -/// - 2019/09/10 (4.01.2) - Fixed the nk_cos function, which deviated significantly. -/// - 2019/09/08 (4.01.1) - Fixed a bug wherein re-baking of fonts caused a segmentation -/// fault due to dst_font->glyph_count not being zeroed on subsequent -/// bakes of the same set of fonts. -/// - 2019/06/23 (4.01.0) - Added nk_***_get_scroll and nk_***_set_scroll for groups, windows, and popups. -/// - 2019/06/12 (4.00.3) - Fix panel background drawing bug. -/// - 2018/10/31 (4.00.2) - Added NK_KEYSTATE_BASED_INPUT to "fix" state based backends -/// like GLFW without breaking key repeat behavior on event based. -/// - 2018/04/01 (4.00.1) - Fixed calling `nk_convert` multiple time per single frame. -/// - 2018/04/01 (4.00.0) - BREAKING CHANGE: nk_draw_list_clear no longer tries to -/// clear provided buffers. So make sure to either free -/// or clear each passed buffer after calling nk_convert. -/// - 2018/02/23 (3.00.6) - Fixed slider dragging behavior. -/// - 2018/01/31 (3.00.5) - Fixed overcalculation of cursor data in font baking process. -/// - 2018/01/31 (3.00.4) - Removed name collision with stb_truetype. -/// - 2018/01/28 (3.00.3) - Fixed panel window border drawing bug. -/// - 2018/01/12 (3.00.2) - Added `nk_group_begin_titled` for separated group identifier and title. -/// - 2018/01/07 (3.00.1) - Started to change documentation style. -/// - 2018/01/05 (3.00.0) - BREAKING CHANGE: The previous color picker API was broken -/// because of conversions between float and byte color representation. -/// Color pickers now use floating point values to represent -/// HSV values. To get back the old behavior I added some additional -/// color conversion functions to cast between nk_color and -/// nk_colorf. -/// - 2017/12/23 (2.00.7) - Fixed small warning. -/// - 2017/12/23 (2.00.7) - Fixed `nk_edit_buffer` behavior if activated to allow input. -/// - 2017/12/23 (2.00.7) - Fixed modifyable progressbar dragging visuals and input behavior. -/// - 2017/12/04 (2.00.6) - Added formatted string tooltip widget. -/// - 2017/11/18 (2.00.5) - Fixed window becoming hidden with flag `NK_WINDOW_NO_INPUT`. -/// - 2017/11/15 (2.00.4) - Fixed font merging. -/// - 2017/11/07 (2.00.3) - Fixed window size and position modifier functions. -/// - 2017/09/14 (2.00.2) - Fixed `nk_edit_buffer` and `nk_edit_focus` behavior. -/// - 2017/09/14 (2.00.1) - Fixed window closing behavior. -/// - 2017/09/14 (2.00.0) - BREAKING CHANGE: Modifying window position and size functions now -/// require the name of the window and must happen outside the window -/// building process (between function call nk_begin and nk_end). -/// - 2017/09/11 (1.40.9) - Fixed window background flag if background window is declared last. -/// - 2017/08/27 (1.40.8) - Fixed `nk_item_is_any_active` for hidden windows. -/// - 2017/08/27 (1.40.7) - Fixed window background flag. -/// - 2017/07/07 (1.40.6) - Fixed missing clipping rect check for hovering/clicked -/// query for widgets. -/// - 2017/07/07 (1.40.5) - Fixed drawing bug for vertex output for lines and stroked -/// and filled rectangles. -/// - 2017/07/07 (1.40.4) - Fixed bug in nk_convert trying to add windows that are in -/// process of being destroyed. -/// - 2017/07/07 (1.40.3) - Fixed table internal bug caused by storing table size in -/// window instead of directly in table. -/// - 2017/06/30 (1.40.2) - Removed unneeded semicolon in C++ NK_ALIGNOF macro. -/// - 2017/06/30 (1.40.1) - Fixed drawing lines smaller or equal zero. -/// - 2017/06/08 (1.40.0) - Removed the breaking part of last commit. Auto layout now only -/// comes in effect if you pass in zero was row height argument. -/// - 2017/06/08 (1.40.0) - BREAKING CHANGE: while not directly API breaking it will change -/// how layouting works. From now there will be an internal minimum -/// row height derived from font height. If you need a row smaller than -/// that you can directly set it by `nk_layout_set_min_row_height` and -/// reset the value back by calling `nk_layout_reset_min_row_height. -/// - 2017/06/08 (1.39.1) - Fixed property text edit handling bug caused by past `nk_widget` fix. -/// - 2017/06/08 (1.39.0) - Added function to retrieve window space without calling a `nk_layout_xxx` function. -/// - 2017/06/06 (1.38.5) - Fixed `nk_convert` return flag for command buffer. -/// - 2017/05/23 (1.38.4) - Fixed activation behavior for widgets partially clipped. -/// - 2017/05/10 (1.38.3) - Fixed wrong min window size mouse scaling over boundaries. -/// - 2017/05/09 (1.38.2) - Fixed vertical scrollbar drawing with not enough space. -/// - 2017/05/09 (1.38.1) - Fixed scaler dragging behavior if window size hits minimum size. -/// - 2017/05/06 (1.38.0) - Added platform double-click support. -/// - 2017/04/20 (1.37.1) - Fixed key repeat found inside glfw demo backends. -/// - 2017/04/20 (1.37.0) - Extended properties with selection and clipboard support. -/// - 2017/04/20 (1.36.2) - Fixed #405 overlapping rows with zero padding and spacing. -/// - 2017/04/09 (1.36.1) - Fixed #403 with another widget float error. -/// - 2017/04/09 (1.36.0) - Added window `NK_WINDOW_NO_INPUT` and `NK_WINDOW_NOT_INTERACTIVE` flags. -/// - 2017/04/09 (1.35.3) - Fixed buffer heap corruption. -/// - 2017/03/25 (1.35.2) - Fixed popup overlapping for `NK_WINDOW_BACKGROUND` windows. -/// - 2017/03/25 (1.35.1) - Fixed windows closing behavior. -/// - 2017/03/18 (1.35.0) - Added horizontal scroll requested in #377. -/// - 2017/03/18 (1.34.3) - Fixed long window header titles. -/// - 2017/03/04 (1.34.2) - Fixed text edit filtering. -/// - 2017/03/04 (1.34.1) - Fixed group closable flag. -/// - 2017/02/25 (1.34.0) - Added custom draw command for better language binding support. -/// - 2017/01/24 (1.33.0) - Added programmatic way to remove edit focus. -/// - 2017/01/24 (1.32.3) - Fixed wrong define for basic type definitions for windows. -/// - 2017/01/21 (1.32.2) - Fixed input capture from hidden or closed windows. -/// - 2017/01/21 (1.32.1) - Fixed slider behavior and drawing. -/// - 2017/01/13 (1.32.0) - Added flag to put scaler into the bottom left corner. -/// - 2017/01/13 (1.31.0) - Added additional row layouting method to combine both -/// dynamic and static widgets. -/// - 2016/12/31 (1.30.0) - Extended scrollbar offset from 16-bit to 32-bit. -/// - 2016/12/31 (1.29.2) - Fixed closing window bug of minimized windows. -/// - 2016/12/03 (1.29.1) - Fixed wrapped text with no seperator and C89 error. -/// - 2016/12/03 (1.29.0) - Changed text wrapping to process words not characters. -/// - 2016/11/22 (1.28.6) - Fixed window minimized closing bug. -/// - 2016/11/19 (1.28.5) - Fixed abstract combo box closing behavior. -/// - 2016/11/19 (1.28.4) - Fixed tooltip flickering. -/// - 2016/11/19 (1.28.3) - Fixed memory leak caused by popup repeated closing. -/// - 2016/11/18 (1.28.2) - Fixed memory leak caused by popup panel allocation. -/// - 2016/11/10 (1.28.1) - Fixed some warnings and C++ error. -/// - 2016/11/10 (1.28.0) - Added additional `nk_button` versions which allows to directly -/// pass in a style struct to change buttons visual. -/// - 2016/11/10 (1.27.0) - Added additional `nk_tree` versions to support external state -/// storage. Just like last the `nk_group` commit the main -/// advantage is that you optionally can minimize nuklears runtime -/// memory consumption or handle hash collisions. -/// - 2016/11/09 (1.26.0) - Added additional `nk_group` version to support external scrollbar -/// offset storage. Main advantage is that you can externalize -/// the memory management for the offset. It could also be helpful -/// if you have a hash collision in `nk_group_begin` but really -/// want the name. In addition I added `nk_list_view` which allows -/// to draw big lists inside a group without actually having to -/// commit the whole list to nuklear (issue #269). -/// - 2016/10/30 (1.25.1) - Fixed clipping rectangle bug inside `nk_draw_list`. -/// - 2016/10/29 (1.25.0) - Pulled `nk_panel` memory management into nuklear and out of -/// the hands of the user. From now on users don't have to care -/// about panels unless they care about some information. If you -/// still need the panel just call `nk_window_get_panel`. -/// - 2016/10/21 (1.24.0) - Changed widget border drawing to stroked rectangle from filled -/// rectangle for less overdraw and widget background transparency. -/// - 2016/10/18 (1.23.0) - Added `nk_edit_focus` for manually edit widget focus control. -/// - 2016/09/29 (1.22.7) - Fixed deduction of basic type in non `` compilation. -/// - 2016/09/29 (1.22.6) - Fixed edit widget UTF-8 text cursor drawing bug. -/// - 2016/09/28 (1.22.5) - Fixed edit widget UTF-8 text appending/inserting/removing. -/// - 2016/09/28 (1.22.4) - Fixed drawing bug inside edit widgets which offset all text -/// text in every edit widget if one of them is scrolled. -/// - 2016/09/28 (1.22.3) - Fixed small bug in edit widgets if not active. The wrong -/// text length is passed. It should have been in bytes but -/// was passed as glyphs. -/// - 2016/09/20 (1.22.2) - Fixed color button size calculation. -/// - 2016/09/20 (1.22.1) - Fixed some `nk_vsnprintf` behavior bugs and removed `` -/// again from `NK_INCLUDE_STANDARD_VARARGS`. -/// - 2016/09/18 (1.22.0) - C89 does not support vsnprintf only C99 and newer as well -/// as C++11 and newer. In addition to use vsnprintf you have -/// to include . So just defining `NK_INCLUDE_STD_VAR_ARGS` -/// is not enough. That behavior is now fixed. By default if -/// both varargs as well as stdio is selected I try to use -/// vsnprintf if not possible I will revert to vsprintf. If -/// varargs but not stdio was defined I will use my own function. -/// - 2016/09/15 (1.21.2) - Fixed panel `close` behavior for deeper panel levels. -/// - 2016/09/15 (1.21.1) - Fixed C++ errors and wrong argument to `nk_panel_get_xxxx`. -/// - 2016/09/13 (1.21.0) - !BREAKING! Fixed nonblocking popup behavior in menu, combo, -/// and contextual which prevented closing in y-direction if -/// popup did not reach max height. -/// In addition the height parameter was changed into vec2 -/// for width and height to have more control over the popup size. -/// - 2016/09/13 (1.20.3) - Cleaned up and extended type selection. -/// - 2016/09/13 (1.20.2) - Fixed slider behavior hopefully for the last time. This time -/// all calculation are correct so no more hackery. -/// - 2016/09/13 (1.20.1) - Internal change to divide window/panel flags into panel flags and types. -/// Suprisinly spend years in C and still happened to confuse types -/// with flags. Probably something to take note. -/// - 2016/09/08 (1.20.0) - Added additional helper function to make it easier to just -/// take the produced buffers from `nk_convert` and unplug the -/// iteration process from `nk_context`. So now you can -/// just use the vertex,element and command buffer + two pointer -/// inside the command buffer retrieved by calls `nk__draw_begin` -/// and `nk__draw_end` and macro `nk_draw_foreach_bounded`. -/// - 2016/09/08 (1.19.0) - Added additional asserts to make sure every `nk_xxx_begin` call -/// for windows, popups, combobox, menu and contextual is guarded by -/// `if` condition and does not produce false drawing output. -/// - 2016/09/08 (1.18.0) - Changed confusing name for `NK_SYMBOL_RECT_FILLED`, `NK_SYMBOL_RECT` -/// to hopefully easier to understand `NK_SYMBOL_RECT_FILLED` and -/// `NK_SYMBOL_RECT_OUTLINE`. -/// - 2016/09/08 (1.17.0) - Changed confusing name for `NK_SYMBOL_CIRLCE_FILLED`, `NK_SYMBOL_CIRCLE` -/// to hopefully easier to understand `NK_SYMBOL_CIRCLE_FILLED` and -/// `NK_SYMBOL_CIRCLE_OUTLINE`. -/// - 2016/09/08 (1.16.0) - Added additional checks to select correct types if `NK_INCLUDE_FIXED_TYPES` -/// is not defined by supporting the biggest compiler GCC, clang and MSVC. -/// - 2016/09/07 (1.15.3) - Fixed `NK_INCLUDE_COMMAND_USERDATA` define to not cause an error. -/// - 2016/09/04 (1.15.2) - Fixed wrong combobox height calculation. -/// - 2016/09/03 (1.15.1) - Fixed gaps inside combo boxes in OpenGL. -/// - 2016/09/02 (1.15.0) - Changed nuklear to not have any default vertex layout and -/// instead made it user provided. The range of types to convert -/// to is quite limited at the moment, but I would be more than -/// happy to accept PRs to add additional. -/// - 2016/08/30 (1.14.2) - Removed unused variables. -/// - 2016/08/30 (1.14.1) - Fixed C++ build errors. -/// - 2016/08/30 (1.14.0) - Removed mouse dragging from SDL demo since it does not work correctly. -/// - 2016/08/30 (1.13.4) - Tweaked some default styling variables. -/// - 2016/08/30 (1.13.3) - Hopefully fixed drawing bug in slider, in general I would -/// refrain from using slider with a big number of steps. -/// - 2016/08/30 (1.13.2) - Fixed close and minimize button which would fire even if the -/// window was in Read Only Mode. -/// - 2016/08/30 (1.13.1) - Fixed popup panel padding handling which was previously just -/// a hack for combo box and menu. -/// - 2016/08/30 (1.13.0) - Removed `NK_WINDOW_DYNAMIC` flag from public API since -/// it is bugged and causes issues in window selection. -/// - 2016/08/30 (1.12.0) - Removed scaler size. The size of the scaler is now -/// determined by the scrollbar size. -/// - 2016/08/30 (1.11.2) - Fixed some drawing bugs caused by changes from 1.11.0. -/// - 2016/08/30 (1.11.1) - Fixed overlapping minimized window selection. -/// - 2016/08/30 (1.11.0) - Removed some internal complexity and overly complex code -/// handling panel padding and panel border. -/// - 2016/08/29 (1.10.0) - Added additional height parameter to `nk_combobox_xxx`. -/// - 2016/08/29 (1.10.0) - Fixed drawing bug in dynamic popups. -/// - 2016/08/29 (1.10.0) - Added experimental mouse scrolling to popups, menus and comboboxes. -/// - 2016/08/26 (1.10.0) - Added window name string prepresentation to account for -/// hash collisions. Currently limited to `NK_WINDOW_MAX_NAME` -/// which in term can be redefined if not big enough. -/// - 2016/08/26 (1.10.0) - Added stacks for temporary style/UI changes in code. -/// - 2016/08/25 (1.10.0) - Changed `nk_input_is_key_pressed` and 'nk_input_is_key_released' -/// to account for key press and release happening in one frame. -/// - 2016/08/25 (1.10.0) - Added additional nk_edit flag to directly jump to the end on activate. -/// - 2016/08/17 (1.09.6) - Removed invalid check for value zero in `nk_propertyx`. -/// - 2016/08/16 (1.09.5) - Fixed ROM mode for deeper levels of popup windows parents. -/// - 2016/08/15 (1.09.4) - Editbox are now still active if enter was pressed with flag -/// `NK_EDIT_SIG_ENTER`. Main reasoning is to be able to keep -/// typing after committing. -/// - 2016/08/15 (1.09.4) - Removed redundant code. -/// - 2016/08/15 (1.09.4) - Fixed negative numbers in `nk_strtoi` and remove unused variable. -/// - 2016/08/15 (1.09.3) - Fixed `NK_WINDOW_BACKGROUND` flag behavior to select a background -/// window only as selected by hovering and not by clicking. -/// - 2016/08/14 (1.09.2) - Fixed a bug in font atlas which caused wrong loading -/// of glyphs for font with multiple ranges. -/// - 2016/08/12 (1.09.1) - Added additional function to check if window is currently -/// hidden and therefore not visible. -/// - 2016/08/12 (1.09.1) - nk_window_is_closed now queries the correct flag `NK_WINDOW_CLOSED` -/// instead of the old flag `NK_WINDOW_HIDDEN`. -/// - 2016/08/09 (1.09.0) - Added additional double version to nk_property and changed -/// the underlying implementation to not cast to float and instead -/// work directly on the given values. -/// - 2016/08/09 (1.08.0) - Added additional define to overwrite library internal -/// floating pointer number to string conversion for additional -/// precision. -/// - 2016/08/09 (1.08.0) - Added additional define to overwrite library internal -/// string to floating point number conversion for additional -/// precision. -/// - 2016/08/08 (1.07.2) - Fixed compiling error without define `NK_INCLUDE_FIXED_TYPE`. -/// - 2016/08/08 (1.07.1) - Fixed possible floating point error inside `nk_widget` leading -/// to wrong wiget width calculation which results in widgets falsely -/// becoming tagged as not inside window and cannot be accessed. -/// - 2016/08/08 (1.07.0) - Nuklear now differentiates between hiding a window (NK_WINDOW_HIDDEN) and -/// closing a window (NK_WINDOW_CLOSED). A window can be hidden/shown -/// by using `nk_window_show` and closed by either clicking the close -/// icon in a window or by calling `nk_window_close`. Only closed -/// windows get removed at the end of the frame while hidden windows -/// remain. -/// - 2016/08/08 (1.06.0) - Added `nk_edit_string_zero_terminated` as a second option to -/// `nk_edit_string` which takes, edits and outputs a '\0' terminated string. -/// - 2016/08/08 (1.05.4) - Fixed scrollbar auto hiding behavior. -/// - 2016/08/08 (1.05.3) - Fixed wrong panel padding selection in `nk_layout_widget_space`. -/// - 2016/08/07 (1.05.2) - Fixed old bug in dynamic immediate mode layout API, calculating -/// wrong item spacing and panel width. -/// - 2016/08/07 (1.05.1) - Hopefully finally fixed combobox popup drawing bug. -/// - 2016/08/07 (1.05.0) - Split varargs away from `NK_INCLUDE_STANDARD_IO` into own -/// define `NK_INCLUDE_STANDARD_VARARGS` to allow more fine -/// grained controlled over library includes. -/// - 2016/08/06 (1.04.5) - Changed memset calls to `NK_MEMSET`. -/// - 2016/08/04 (1.04.4) - Fixed fast window scaling behavior. -/// - 2016/08/04 (1.04.3) - Fixed window scaling, movement bug which appears if you -/// move/scale a window and another window is behind it. -/// If you are fast enough then the window behind gets activated -/// and the operation is blocked. I now require activating -/// by hovering only if mouse is not pressed. -/// - 2016/08/04 (1.04.2) - Fixed changing fonts. -/// - 2016/08/03 (1.04.1) - Fixed `NK_WINDOW_BACKGROUND` behavior. -/// - 2016/08/03 (1.04.0) - Added color parameter to `nk_draw_image`. -/// - 2016/08/03 (1.04.0) - Added additional window padding style attributes for -/// sub windows (combo, menu, ...). -/// - 2016/08/03 (1.04.0) - Added functions to show/hide software cursor. -/// - 2016/08/03 (1.04.0) - Added `NK_WINDOW_BACKGROUND` flag to force a window -/// to be always in the background of the screen. -/// - 2016/08/03 (1.03.2) - Removed invalid assert macro for NK_RGB color picker. -/// - 2016/08/01 (1.03.1) - Added helper macros into header include guard. -/// - 2016/07/29 (1.03.0) - Moved the window/table pool into the header part to -/// simplify memory management by removing the need to -/// allocate the pool. -/// - 2016/07/29 (1.02.0) - Added auto scrollbar hiding window flag which if enabled -/// will hide the window scrollbar after NK_SCROLLBAR_HIDING_TIMEOUT -/// seconds without window interaction. To make it work -/// you have to also set a delta time inside the `nk_context`. -/// - 2016/07/25 (1.01.1) - Fixed small panel and panel border drawing bugs. -/// - 2016/07/15 (1.01.0) - Added software cursor to `nk_style` and `nk_context`. -/// - 2016/07/15 (1.01.0) - Added const correctness to `nk_buffer_push' data argument. -/// - 2016/07/15 (1.01.0) - Removed internal font baking API and simplified -/// font atlas memory management by converting pointer -/// arrays for fonts and font configurations to lists. -/// - 2016/07/15 (1.00.0) - Changed button API to use context dependent button -/// behavior instead of passing it for every function call. -/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/// ## Gallery -/// ![Figure [blue]: Feature overview with blue color styling](https://cloud.githubusercontent.com/assets/8057201/13538240/acd96876-e249-11e5-9547-5ac0b19667a0.png) -/// ![Figure [red]: Feature overview with red color styling](https://cloud.githubusercontent.com/assets/8057201/13538243/b04acd4c-e249-11e5-8fd2-ad7744a5b446.png) -/// ![Figure [widgets]: Widget overview](https://cloud.githubusercontent.com/assets/8057201/11282359/3325e3c6-8eff-11e5-86cb-cf02b0596087.png) -/// ![Figure [blackwhite]: Black and white](https://cloud.githubusercontent.com/assets/8057201/11033668/59ab5d04-86e5-11e5-8091-c56f16411565.png) -/// ![Figure [filexp]: File explorer](https://cloud.githubusercontent.com/assets/8057201/10718115/02a9ba08-7b6b-11e5-950f-adacdd637739.png) -/// ![Figure [opengl]: OpenGL Editor](https://cloud.githubusercontent.com/assets/8057201/12779619/2a20d72c-ca69-11e5-95fe-4edecf820d5c.png) -/// ![Figure [nodedit]: Node Editor](https://cloud.githubusercontent.com/assets/8057201/9976995/e81ac04a-5ef7-11e5-872b-acd54fbeee03.gif) -/// ![Figure [skinning]: Using skinning in Nuklear](https://cloud.githubusercontent.com/assets/8057201/15991632/76494854-30b8-11e6-9555-a69840d0d50b.png) -/// ![Figure [bf]: Heavy modified version](https://cloud.githubusercontent.com/assets/8057201/14902576/339926a8-0d9c-11e6-9fee-a8b73af04473.png) -/// -/// ## Credits -/// Developed by Micha Mettke and every direct or indirect github contributor.

-/// -/// Embeds [stb_texedit](https://github.com/nothings/stb/blob/master/stb_textedit.h), [stb_truetype](https://github.com/nothings/stb/blob/master/stb_truetype.h) and [stb_rectpack](https://github.com/nothings/stb/blob/master/stb_rect_pack.h) by Sean Barret (public domain)
-/// Uses [stddoc.c](https://github.com/r-lyeh/stddoc.c) from r-lyeh@github.com for documentation generation

-/// Embeds ProggyClean.ttf font by Tristan Grimmer (MIT license).
-/// -/// Big thank you to Omar Cornut (ocornut@github) for his [imgui library](https://github.com/ocornut/imgui) and -/// giving me the inspiration for this library, Casey Muratori for handmade hero -/// and his original immediate mode graphical user interface idea and Sean -/// Barret for his amazing single header libraries which restored my faith -/// in libraries and brought me to create some of my own. Finally Apoorva Joshi -/// for his single header file packer. -*/ - diff --git a/nuklear/nuklear_xlib_gl3.h b/nuklear/nuklear_xlib_gl3.h deleted file mode 100644 index 3c13d09..0000000 --- a/nuklear/nuklear_xlib_gl3.h +++ /dev/null @@ -1,758 +0,0 @@ -/* - * Nuklear - v1.17 - public domain - * no warrenty implied; use at your own risk. - * authored from 2015-2016 by Micha Mettke - */ -/* - * ============================================================== - * - * API - * - * =============================================================== - */ -#ifndef NK_XLIB_GL3_H_ -#define NK_XLIB_GL3_H_ - -#include -NK_API struct nk_context* nk_x11_init(Display *dpy, Window win); -NK_API void nk_x11_font_stash_begin(struct nk_font_atlas **atlas); -NK_API void nk_x11_font_stash_end(void); -NK_API int nk_x11_handle_event(XEvent *evt); -NK_API void nk_x11_render(enum nk_anti_aliasing, int max_vertex_buffer, int max_element_buffer); -NK_API void nk_x11_shutdown(void); -NK_API int nk_x11_device_create(void); -NK_API void nk_x11_device_destroy(void); - -#endif -/* - * ============================================================== - * - * IMPLEMENTATION - * - * =============================================================== - */ -#ifdef NK_XLIB_GL3_IMPLEMENTATION -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#ifndef NK_X11_DOUBLE_CLICK_LO -#define NK_X11_DOUBLE_CLICK_LO 20 -#endif -#ifndef NK_X11_DOUBLE_CLICK_HI -#define NK_X11_DOUBLE_CLICK_HI 200 -#endif - -#ifdef NK_XLIB_LOAD_OPENGL_EXTENSIONS -#include - -/* GL_ARB_vertex_buffer_object */ -typedef void(*nkglGenBuffers)(GLsizei, GLuint*); -typedef void(*nkglBindBuffer)(GLenum, GLuint); -typedef void(*nkglBufferData)(GLenum, GLsizeiptr, const GLvoid*, GLenum); -typedef void(*nkglBufferSubData)(GLenum, GLintptr, GLsizeiptr, const GLvoid*); -typedef void*(*nkglMapBuffer)(GLenum, GLenum); -typedef GLboolean(*nkglUnmapBuffer)(GLenum); -typedef void(*nkglDeleteBuffers)(GLsizei, GLuint*); -/* GL_ARB_vertex_array_object */ -typedef void (*nkglGenVertexArrays)(GLsizei, GLuint*); -typedef void (*nkglBindVertexArray)(GLuint); -typedef void (*nkglDeleteVertexArrays)(GLsizei, const GLuint*); -/* GL_ARB_vertex_program / GL_ARB_fragment_program */ -typedef void(*nkglVertexAttribPointer)(GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid*); -typedef void(*nkglEnableVertexAttribArray)(GLuint); -typedef void(*nkglDisableVertexAttribArray)(GLuint); -/* GL_ARB_framebuffer_object */ -typedef void(*nkglGenerateMipmap)(GLenum target); -/* GLSL/OpenGL 2.0 core */ -typedef GLuint(*nkglCreateShader)(GLenum); -typedef void(*nkglShaderSource)(GLuint, GLsizei, const GLchar**, const GLint*); -typedef void(*nkglCompileShader)(GLuint); -typedef void(*nkglGetShaderiv)(GLuint, GLenum, GLint*); -typedef void(*nkglGetShaderInfoLog)(GLuint, GLsizei, GLsizei*, GLchar*); -typedef void(*nkglDeleteShader)(GLuint); -typedef GLuint(*nkglCreateProgram)(void); -typedef void(*nkglAttachShader)(GLuint, GLuint); -typedef void(*nkglDetachShader)(GLuint, GLuint); -typedef void(*nkglLinkProgram)(GLuint); -typedef void(*nkglUseProgram)(GLuint); -typedef void(*nkglGetProgramiv)(GLuint, GLenum, GLint*); -typedef void(*nkglGetProgramInfoLog)(GLuint, GLsizei, GLsizei*, GLchar*); -typedef void(*nkglDeleteProgram)(GLuint); -typedef GLint(*nkglGetUniformLocation)(GLuint, const GLchar*); -typedef GLint(*nkglGetAttribLocation)(GLuint, const GLchar*); -typedef void(*nkglUniform1i)(GLint, GLint); -typedef void(*nkglUniform1f)(GLint, GLfloat); -typedef void(*nkglUniformMatrix3fv)(GLint, GLsizei, GLboolean, const GLfloat*); -typedef void(*nkglUniformMatrix4fv)(GLint, GLsizei, GLboolean, const GLfloat*); - -static nkglGenBuffers glGenBuffers; -static nkglBindBuffer glBindBuffer; -static nkglBufferData glBufferData; -static nkglBufferSubData glBufferSubData; -static nkglMapBuffer glMapBuffer; -static nkglUnmapBuffer glUnmapBuffer; -static nkglDeleteBuffers glDeleteBuffers; -static nkglGenVertexArrays glGenVertexArrays; -static nkglBindVertexArray glBindVertexArray; -static nkglDeleteVertexArrays glDeleteVertexArrays; -static nkglVertexAttribPointer glVertexAttribPointer; -static nkglEnableVertexAttribArray glEnableVertexAttribArray; -static nkglDisableVertexAttribArray glDisableVertexAttribArray; -static nkglGenerateMipmap glGenerateMipmap; -static nkglCreateShader glCreateShader; -static nkglShaderSource glShaderSource; -static nkglCompileShader glCompileShader; -static nkglGetShaderiv glGetShaderiv; -static nkglGetShaderInfoLog glGetShaderInfoLog; -static nkglDeleteShader glDeleteShader; -static nkglCreateProgram glCreateProgram; -static nkglAttachShader glAttachShader; -static nkglDetachShader glDetachShader; -static nkglLinkProgram glLinkProgram; -static nkglUseProgram glUseProgram; -static nkglGetProgramiv glGetProgramiv; -static nkglGetProgramInfoLog glGetProgramInfoLog; -static nkglDeleteProgram glDeleteProgram; -static nkglGetUniformLocation glGetUniformLocation; -static nkglGetAttribLocation glGetAttribLocation; -static nkglUniform1i glUniform1i; -static nkglUniform1f glUniform1f; -static nkglUniformMatrix3fv glUniformMatrix3fv; -static nkglUniformMatrix4fv glUniformMatrix4fv; - -enum graphics_card_vendors { - VENDOR_UNKNOWN, - VENDOR_NVIDIA, - VENDOR_AMD, - VENDOR_INTEL -}; - -struct opengl_info { - /* info */ - const char *vendor_str; - const char *version_str; - const char *extensions_str; - const char *renderer_str; - const char *glsl_version_str; - enum graphics_card_vendors vendor; - /* version */ - float version; - int major_version; - int minor_version; - /* extensions */ - int glsl_available; - int vertex_buffer_obj_available; - int vertex_array_obj_available; - int map_buffer_range_available; - int fragment_program_available; - int frame_buffer_object_available; -}; -#endif - -struct nk_x11_vertex { - float position[2]; - float uv[2]; - nk_byte col[4]; -}; - -struct nk_x11_device { -#ifdef NK_XLIB_LOAD_OPENGL_EXTENSIONS - struct opengl_info info; -#endif - struct nk_buffer cmds; - struct nk_draw_null_texture tex_null; - GLuint vbo, vao, ebo; - GLuint prog; - GLuint vert_shdr; - GLuint frag_shdr; - GLint attrib_pos; - GLint attrib_uv; - GLint attrib_col; - GLint uniform_tex; - GLint uniform_proj; - GLuint font_tex; -}; - -static struct nk_x11 { - struct nk_x11_device ogl; - struct nk_context ctx; - struct nk_font_atlas atlas; - Cursor cursor; - Display *dpy; - Window win; - long last_button_click; -} x11; - -#ifdef __APPLE__ - #define NK_SHADER_VERSION "#version 150\n" -#else - #define NK_SHADER_VERSION "#version 300 es\n" -#endif - -#ifdef NK_XLIB_LOAD_OPENGL_EXTENSIONS -#include - -NK_INTERN long -nk_timestamp(void) -{ - struct timeval tv; - if (gettimeofday(&tv, NULL) < 0) return 0; - return (long)((long)tv.tv_sec * 1000 + (long)tv.tv_usec/1000); -} - -NK_INTERN int -nk_x11_stricmpn(const char *a, const char *b, int len) -{ - int i = 0; - for (i = 0; i < len && a[i] && b[i]; ++i) - if (a[i] != b[i]) return 1; - if (i != len) return 1; - return 0; -} - -NK_INTERN int -nk_x11_check_extension(struct opengl_info *GL, const char *ext) -{ - const char *start, *where, *term; - where = strchr(ext, ' '); - if (where || *ext == '\0') - return nk_false; - - for (start = GL->extensions_str;;) { - where = strstr((const char*)start, ext); - if (!where) break; - term = where + strlen(ext); - if (where == start || *(where - 1) == ' ') { - if (*term == ' ' || *term == '\0') - return nk_true; - } - start = term; - } - return nk_false; -} - -#define GL_EXT(name) (nk##name)nk_gl_ext(#name) -NK_INTERN __GLXextFuncPtr -nk_gl_ext(const char *name) -{ - __GLXextFuncPtr func; - func = glXGetProcAddress((const GLubyte*)name); - if (!func) { - fprintf(stdout, "[GL]: failed to load extension: %s", name); - return NULL; - } - return func; -} - -NK_INTERN int -nk_load_opengl(struct opengl_info *gl) -{ - int failed = nk_false; - gl->version_str = (const char*)glGetString(GL_VERSION); - glGetIntegerv(GL_MAJOR_VERSION, &gl->major_version); - glGetIntegerv(GL_MINOR_VERSION, &gl->minor_version); - if (gl->major_version < 2) { - fprintf(stderr, "[GL]: Graphics card does not fulfill minimum OpenGL 2.0 support\n"); - return 0; - } - gl->version = (float)gl->major_version + (float)gl->minor_version * 0.1f; - gl->renderer_str = (const char*)glGetString(GL_RENDERER); - gl->extensions_str = (const char*)glGetString(GL_EXTENSIONS); - gl->glsl_version_str = (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION); - gl->vendor_str = (const char*)glGetString(GL_VENDOR); - if (!nk_x11_stricmpn(gl->vendor_str, "ATI", 4) || - !nk_x11_stricmpn(gl->vendor_str, "AMD", 4)) - gl->vendor = VENDOR_AMD; - else if (!nk_x11_stricmpn(gl->vendor_str, "NVIDIA", 6)) - gl->vendor = VENDOR_NVIDIA; - else if (!nk_x11_stricmpn(gl->vendor_str, "Intel", 5)) - gl->vendor = VENDOR_INTEL; - else gl->vendor = VENDOR_UNKNOWN; - - /* Extensions */ - gl->glsl_available = (gl->version >= 2.0f); - if (gl->glsl_available) { - /* GLSL core in OpenGL > 2 */ - glCreateShader = GL_EXT(glCreateShader); - glShaderSource = GL_EXT(glShaderSource); - glCompileShader = GL_EXT(glCompileShader); - glGetShaderiv = GL_EXT(glGetShaderiv); - glGetShaderInfoLog = GL_EXT(glGetShaderInfoLog); - glDeleteShader = GL_EXT(glDeleteShader); - glCreateProgram = GL_EXT(glCreateProgram); - glAttachShader = GL_EXT(glAttachShader); - glDetachShader = GL_EXT(glDetachShader); - glLinkProgram = GL_EXT(glLinkProgram); - glUseProgram = GL_EXT(glUseProgram); - glGetProgramiv = GL_EXT(glGetProgramiv); - glGetProgramInfoLog = GL_EXT(glGetProgramInfoLog); - glDeleteProgram = GL_EXT(glDeleteProgram); - glGetUniformLocation = GL_EXT(glGetUniformLocation); - glGetAttribLocation = GL_EXT(glGetAttribLocation); - glUniform1i = GL_EXT(glUniform1i); - glUniform1f = GL_EXT(glUniform1f); - glUniformMatrix3fv = GL_EXT(glUniformMatrix3fv); - glUniformMatrix4fv = GL_EXT(glUniformMatrix4fv); - } - gl->vertex_buffer_obj_available = nk_x11_check_extension(gl, "GL_ARB_vertex_buffer_object"); - if (gl->vertex_buffer_obj_available) { - /* GL_ARB_vertex_buffer_object */ - glGenBuffers = GL_EXT(glGenBuffers); - glBindBuffer = GL_EXT(glBindBuffer); - glBufferData = GL_EXT(glBufferData); - glBufferSubData = GL_EXT(glBufferSubData); - glMapBuffer = GL_EXT(glMapBuffer); - glUnmapBuffer = GL_EXT(glUnmapBuffer); - glDeleteBuffers = GL_EXT(glDeleteBuffers); - } - gl->fragment_program_available = nk_x11_check_extension(gl, "GL_ARB_fragment_program"); - if (gl->fragment_program_available) { - /* GL_ARB_vertex_program / GL_ARB_fragment_program */ - glVertexAttribPointer = GL_EXT(glVertexAttribPointer); - glEnableVertexAttribArray = GL_EXT(glEnableVertexAttribArray); - glDisableVertexAttribArray = GL_EXT(glDisableVertexAttribArray); - } - gl->vertex_array_obj_available = nk_x11_check_extension(gl, "GL_ARB_vertex_array_object"); - if (gl->vertex_array_obj_available) { - /* GL_ARB_vertex_array_object */ - glGenVertexArrays = GL_EXT(glGenVertexArrays); - glBindVertexArray = GL_EXT(glBindVertexArray); - glDeleteVertexArrays = GL_EXT(glDeleteVertexArrays); - } - gl->frame_buffer_object_available = nk_x11_check_extension(gl, "GL_ARB_framebuffer_object"); - if (gl->frame_buffer_object_available) { - /* GL_ARB_framebuffer_object */ - glGenerateMipmap = GL_EXT(glGenerateMipmap); - } - if (!gl->vertex_buffer_obj_available) { - fprintf(stdout, "[GL] Error: GL_ARB_vertex_buffer_object is not available!\n"); - failed = nk_true; - } - if (!gl->fragment_program_available) { - fprintf(stdout, "[GL] Error: GL_ARB_fragment_program is not available!\n"); - failed = nk_true; - } - if (!gl->vertex_array_obj_available) { - fprintf(stdout, "[GL] Error: GL_ARB_vertex_array_object is not available!\n"); - failed = nk_true; - } - if (!gl->frame_buffer_object_available) { - fprintf(stdout, "[GL] Error: GL_ARB_framebuffer_object is not available!\n"); - failed = nk_true; - } - return !failed; -} -#endif - -NK_API int -nk_x11_device_create(void) -{ - GLint status; - static const GLchar *vertex_shader = - NK_SHADER_VERSION - "uniform mat4 ProjMtx;\n" - "in vec2 Position;\n" - "in vec2 TexCoord;\n" - "in vec4 Color;\n" - "out vec2 Frag_UV;\n" - "out vec4 Frag_Color;\n" - "void main() {\n" - " Frag_UV = TexCoord;\n" - " Frag_Color = Color;\n" - " gl_Position = ProjMtx * vec4(Position.xy, 0, 1);\n" - "}\n"; - static const GLchar *fragment_shader = - NK_SHADER_VERSION - "precision mediump float;\n" - "uniform sampler2D Texture;\n" - "in vec2 Frag_UV;\n" - "in vec4 Frag_Color;\n" - "out vec4 Out_Color;\n" - "void main(){\n" - " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" - "}\n"; - - struct nk_x11_device *dev = &x11.ogl; -#ifdef NK_XLIB_LOAD_OPENGL_EXTENSIONS - if (!nk_load_opengl(&dev->info)) return 0; -#endif - nk_buffer_init_default(&dev->cmds); - - dev->prog = glCreateProgram(); - dev->vert_shdr = glCreateShader(GL_VERTEX_SHADER); - dev->frag_shdr = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(dev->vert_shdr, 1, &vertex_shader, 0); - glShaderSource(dev->frag_shdr, 1, &fragment_shader, 0); - glCompileShader(dev->vert_shdr); - glCompileShader(dev->frag_shdr); - glGetShaderiv(dev->vert_shdr, GL_COMPILE_STATUS, &status); - assert(status == GL_TRUE); - glGetShaderiv(dev->frag_shdr, GL_COMPILE_STATUS, &status); - assert(status == GL_TRUE); - glAttachShader(dev->prog, dev->vert_shdr); - glAttachShader(dev->prog, dev->frag_shdr); - glLinkProgram(dev->prog); - glGetProgramiv(dev->prog, GL_LINK_STATUS, &status); - assert(status == GL_TRUE); - - dev->uniform_tex = glGetUniformLocation(dev->prog, "Texture"); - dev->uniform_proj = glGetUniformLocation(dev->prog, "ProjMtx"); - dev->attrib_pos = glGetAttribLocation(dev->prog, "Position"); - dev->attrib_uv = glGetAttribLocation(dev->prog, "TexCoord"); - dev->attrib_col = glGetAttribLocation(dev->prog, "Color"); - - { - /* buffer setup */ - GLsizei vs = sizeof(struct nk_x11_vertex); - size_t vp = offsetof(struct nk_x11_vertex, position); - size_t vt = offsetof(struct nk_x11_vertex, uv); - size_t vc = offsetof(struct nk_x11_vertex, col); - - glGenBuffers(1, &dev->vbo); - glGenBuffers(1, &dev->ebo); - glGenVertexArrays(1, &dev->vao); - - glBindVertexArray(dev->vao); - glBindBuffer(GL_ARRAY_BUFFER, dev->vbo); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dev->ebo); - - glEnableVertexAttribArray((GLuint)dev->attrib_pos); - glEnableVertexAttribArray((GLuint)dev->attrib_uv); - glEnableVertexAttribArray((GLuint)dev->attrib_col); - - glVertexAttribPointer((GLuint)dev->attrib_pos, 2, GL_FLOAT, GL_FALSE, vs, (void*)vp); - glVertexAttribPointer((GLuint)dev->attrib_uv, 2, GL_FLOAT, GL_FALSE, vs, (void*)vt); - glVertexAttribPointer((GLuint)dev->attrib_col, 4, GL_UNSIGNED_BYTE, GL_TRUE, vs, (void*)vc); - } - - glBindTexture(GL_TEXTURE_2D, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glBindVertexArray(0); - return 1; -} - -NK_INTERN void -nk_x11_device_upload_atlas(const void *image, int width, int height) -{ - struct nk_x11_device *dev = &x11.ogl; - glGenTextures(1, &dev->font_tex); - glBindTexture(GL_TEXTURE_2D, dev->font_tex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, image); -} - -NK_API void -nk_x11_device_destroy(void) -{ - struct nk_x11_device *dev = &x11.ogl; - glDetachShader(dev->prog, dev->vert_shdr); - glDetachShader(dev->prog, dev->frag_shdr); - glDeleteShader(dev->vert_shdr); - glDeleteShader(dev->frag_shdr); - glDeleteProgram(dev->prog); - glDeleteTextures(1, &dev->font_tex); - glDeleteBuffers(1, &dev->vbo); - glDeleteBuffers(1, &dev->ebo); - nk_buffer_free(&dev->cmds); -} - -NK_API void -nk_x11_render(enum nk_anti_aliasing AA, int max_vertex_buffer, int max_element_buffer) -{ - int width, height; - XWindowAttributes attr; - struct nk_x11_device *dev = &x11.ogl; - GLfloat ortho[4][4] = { - {2.0f, 0.0f, 0.0f, 0.0f}, - {0.0f,-2.0f, 0.0f, 0.0f}, - {0.0f, 0.0f,-1.0f, 0.0f}, - {-1.0f,1.0f, 0.0f, 1.0f}, - }; - XGetWindowAttributes(x11.dpy, x11.win, &attr); - width = attr.width; - height = attr.height; - - ortho[0][0] /= (GLfloat)width; - ortho[1][1] /= (GLfloat)height; - - /* setup global state */ - glEnable(GL_BLEND); - glBlendEquation(GL_FUNC_ADD); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glDisable(GL_CULL_FACE); - glDisable(GL_DEPTH_TEST); - glEnable(GL_SCISSOR_TEST); - glActiveTexture(GL_TEXTURE0); - - /* setup program */ - glUseProgram(dev->prog); - glUniform1i(dev->uniform_tex, 0); - glUniformMatrix4fv(dev->uniform_proj, 1, GL_FALSE, &ortho[0][0]); - glViewport(0,0,(GLsizei)width,(GLsizei)height); - { - /* convert from command queue into draw list and draw to screen */ - const struct nk_draw_command *cmd; - void *vertices, *elements; - const nk_draw_index *offset = NULL; - struct nk_buffer vbuf, ebuf; - - /* allocate vertex and element buffer */ - glBindVertexArray(dev->vao); - glBindBuffer(GL_ARRAY_BUFFER, dev->vbo); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, dev->ebo); - - glBufferData(GL_ARRAY_BUFFER, max_vertex_buffer, NULL, GL_STREAM_DRAW); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, max_element_buffer, NULL, GL_STREAM_DRAW); - - /* load draw vertices & elements directly into vertex + element buffer */ - vertices = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - elements = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); - { - /* fill convert configuration */ - struct nk_convert_config config; - static const struct nk_draw_vertex_layout_element vertex_layout[] = { - {NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_x11_vertex, position)}, - {NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(struct nk_x11_vertex, uv)}, - {NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(struct nk_x11_vertex, col)}, - {NK_VERTEX_LAYOUT_END} - }; - memset(&config, 0, sizeof(config)); - config.vertex_layout = vertex_layout; - config.vertex_size = sizeof(struct nk_x11_vertex); - config.vertex_alignment = NK_ALIGNOF(struct nk_x11_vertex); - config.tex_null = dev->tex_null; - config.circle_segment_count = 22; - config.curve_segment_count = 22; - config.arc_segment_count = 22; - config.global_alpha = 1.0f; - config.shape_AA = AA; - config.line_AA = AA; - - /* setup buffers to load vertices and elements */ - nk_buffer_init_fixed(&vbuf, vertices, (size_t)max_vertex_buffer); - nk_buffer_init_fixed(&ebuf, elements, (size_t)max_element_buffer); - nk_convert(&x11.ctx, &dev->cmds, &vbuf, &ebuf, &config); - } - glUnmapBuffer(GL_ARRAY_BUFFER); - glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); - - /* iterate over and execute each draw command */ - nk_draw_foreach(cmd, &x11.ctx, &dev->cmds) - { - if (!cmd->elem_count) continue; -// GLint unit = cmd->texture.id - glBindTexture(GL_TEXTURE_2D, (GLuint)cmd->texture.id); - glScissor( - (GLint)(cmd->clip_rect.x), - (GLint)((height - (GLint)(cmd->clip_rect.y + cmd->clip_rect.h))), - (GLint)(cmd->clip_rect.w), - (GLint)(cmd->clip_rect.h)); - glDrawElements(GL_TRIANGLES, (GLsizei)cmd->elem_count, GL_UNSIGNED_SHORT, offset); - offset += cmd->elem_count; - } - nk_clear(&x11.ctx); - nk_buffer_clear(&dev->cmds); - } - - /* default OpenGL state */ - glUseProgram(0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glBindVertexArray(0); - glDisable(GL_BLEND); - glDisable(GL_SCISSOR_TEST); -} - -NK_API void -nk_x11_font_stash_begin(struct nk_font_atlas **atlas) -{ - nk_font_atlas_init_default(&x11.atlas); - nk_font_atlas_begin(&x11.atlas); - *atlas = &x11.atlas; -} - -NK_API void -nk_x11_font_stash_end(void) -{ - const void *image; int w, h; - image = nk_font_atlas_bake(&x11.atlas, &w, &h, NK_FONT_ATLAS_RGBA32); - nk_x11_device_upload_atlas(image, w, h); - nk_font_atlas_end(&x11.atlas, nk_handle_id((int)x11.ogl.font_tex), &x11.ogl.tex_null); - if (x11.atlas.default_font) - nk_style_set_font(&x11.ctx, &x11.atlas.default_font->handle); -} - -NK_API int -nk_x11_handle_event(XEvent *evt) -{ - struct nk_context *ctx = &x11.ctx; - - /* optional grabbing behavior */ - if (ctx->input.mouse.grab) { - XDefineCursor(x11.dpy, x11.win, x11.cursor); - ctx->input.mouse.grab = 0; - } else if (ctx->input.mouse.ungrab) { - XWarpPointer(x11.dpy, None, x11.win, 0, 0, 0, 0, - (int)ctx->input.mouse.pos.x, (int)ctx->input.mouse.pos.y); - XUndefineCursor(x11.dpy, x11.win); - ctx->input.mouse.ungrab = 0; - } - - if (evt->type == KeyPress || evt->type == KeyRelease) - { - /* Key handler */ - int ret, down = (evt->type == KeyPress); - KeySym *code = XGetKeyboardMapping(x11.dpy, (KeyCode)evt->xkey.keycode, 1, &ret); - if (*code == XK_Shift_L || *code == XK_Shift_R) nk_input_key(ctx, NK_KEY_SHIFT, down); - else if (*code == XK_Control_L || *code == XK_Control_R) nk_input_key(ctx, NK_KEY_CTRL, down); - else if (*code == XK_Alt_L || *code == XK_Alt_R) nk_input_key(ctx, NK_KEY_ALT, down); - else if (*code == XK_Delete) nk_input_key(ctx, NK_KEY_DEL, down); - else if (*code == XK_Return) nk_input_key(ctx, NK_KEY_ENTER, down); - else if (*code == XK_Tab) nk_input_key(ctx, NK_KEY_TAB, down); - else if (*code == XK_Left) nk_input_key(ctx, NK_KEY_LEFT, down); - else if (*code == XK_Right) nk_input_key(ctx, NK_KEY_RIGHT, down); - else if (*code == XK_Up) nk_input_key(ctx, NK_KEY_UP, down); - else if (*code == XK_Down) nk_input_key(ctx, NK_KEY_DOWN, down); - else if (*code == XK_BackSpace) nk_input_key(ctx, NK_KEY_BACKSPACE, down); - else if (*code == XK_Escape) nk_input_key(ctx, NK_KEY_ESCAPE, down); - // else if (*code == XK_space && !down) nk_input_char(ctx, ' '); - else if (*code == XK_Page_Up) nk_input_key(ctx, NK_KEY_SCROLL_UP, down); - else if (*code == XK_Page_Down) nk_input_key(ctx, NK_KEY_SCROLL_DOWN, down); - else if (*code == XK_Home) { - nk_input_key(ctx, NK_KEY_TEXT_START, down); - nk_input_key(ctx, NK_KEY_SCROLL_START, down); - } else if (*code == XK_End) { - nk_input_key(ctx, NK_KEY_TEXT_END, down); - nk_input_key(ctx, NK_KEY_SCROLL_END, down); - } else { -#if 0 // MII wants these!! - if (*code == 'c' && (evt->xkey.state & ControlMask)) - nk_input_key(ctx, NK_KEY_COPY, down); - else if (*code == 'v' && (evt->xkey.state & ControlMask)) - nk_input_key(ctx, NK_KEY_PASTE, down); - else if (*code == 'x' && (evt->xkey.state & ControlMask)) - nk_input_key(ctx, NK_KEY_CUT, down); - else if (*code == 'z' && (evt->xkey.state & ControlMask)) - nk_input_key(ctx, NK_KEY_TEXT_UNDO, down); - else if (*code == 'r' && (evt->xkey.state & ControlMask)) - nk_input_key(ctx, NK_KEY_TEXT_REDO, down); - else if (*code == XK_Left && (evt->xkey.state & ControlMask)) - nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, down); - else if (*code == XK_Right && (evt->xkey.state & ControlMask)) - nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, down); - else if (*code == 'b' && (evt->xkey.state & ControlMask)) - nk_input_key(ctx, NK_KEY_TEXT_LINE_START, down); - else if (*code == 'e' && (evt->xkey.state & ControlMask)) - nk_input_key(ctx, NK_KEY_TEXT_LINE_END, down); - else { - if (*code == 'i') - nk_input_key(ctx, NK_KEY_TEXT_INSERT_MODE, down); - else if (*code == 'r') - nk_input_key(ctx, NK_KEY_TEXT_REPLACE_MODE, down); -#endif - { - char buf[32]; - KeySym keysym = 0; - if (XLookupString((XKeyEvent*)evt, buf, 32, &keysym, NULL) != NoSymbol) { - if (down) - nk_input_glyph(ctx, buf); - } else { -// printf("Unknown key %lx, pass on RAW %d\n", *code, -// ctx->input.keyboard.text_len); - uint32_t *d = (uint32_t *) ctx->input.keyboard.text; - d[ctx->input.keyboard.text_len / 4] = - (*code << 16) | !!down; - ctx->input.keyboard.text_len += 4; - } - } - } - XFree(code); - return 1; - } else if (evt->type == ButtonPress || evt->type == ButtonRelease) { - /* Button handler */ - int down = (evt->type == ButtonPress); - const int x = evt->xbutton.x, y = evt->xbutton.y; - if (evt->xbutton.button == Button1) { - if (down) { /* Double-Click Button handler */ - long dt = nk_timestamp() - x11.last_button_click; - if (dt > NK_X11_DOUBLE_CLICK_LO && dt < NK_X11_DOUBLE_CLICK_HI) - nk_input_button(ctx, NK_BUTTON_DOUBLE, x, y, nk_true); - x11.last_button_click = nk_timestamp(); - } else nk_input_button(ctx, NK_BUTTON_DOUBLE, x, y, nk_false); - nk_input_button(ctx, NK_BUTTON_LEFT, x, y, down); - } else if (evt->xbutton.button == Button2) - nk_input_button(ctx, NK_BUTTON_MIDDLE, x, y, down); - else if (evt->xbutton.button == Button3) - nk_input_button(ctx, NK_BUTTON_RIGHT, x, y, down); - else if (evt->xbutton.button == Button4) - nk_input_scroll(ctx, nk_vec2(0,1.0f)); - else if (evt->xbutton.button == Button5) - nk_input_scroll(ctx, nk_vec2(0,-1.0f)); - else return 0; - return 1; - } else if (evt->type == MotionNotify) { - /* Mouse motion handler */ - const int x = evt->xmotion.x, y = evt->xmotion.y; - nk_input_motion(ctx, x, y); - if (ctx->input.mouse.grabbed) { - ctx->input.mouse.pos.x = ctx->input.mouse.prev.x; - ctx->input.mouse.pos.y = ctx->input.mouse.prev.y; - XWarpPointer(x11.dpy, None, x11.win, 0, 0, 0, 0, (int)ctx->input.mouse.pos.x, (int)ctx->input.mouse.pos.y); - } - return 1; - } else if (evt->type == KeymapNotify) { - XRefreshKeyboardMapping(&evt->xmapping); - return 1; - } - return 0; -} - -NK_API struct nk_context* -nk_x11_init(Display *dpy, Window win) -{ - if (!setlocale(LC_ALL,"")) return 0; - if (!XSupportsLocale()) return 0; - if (!XSetLocaleModifiers("@im=none")) return 0; - if (!nk_x11_device_create()) return 0; - - x11.dpy = dpy; - x11.win = win; - - /* create invisible cursor */ - {static XColor dummy; char data[1] = {0}; - Pixmap blank = XCreateBitmapFromData(dpy, win, data, 1, 1); - if (blank == None) return 0; - x11.cursor = XCreatePixmapCursor(dpy, blank, blank, &dummy, &dummy, 0, 0); - XFreePixmap(dpy, blank);} - - nk_init_default(&x11.ctx, 0); - return &x11.ctx; -} - -NK_API void -nk_x11_shutdown(void) -{ - nk_font_atlas_clear(&x11.atlas); - nk_free(&x11.ctx); - nk_x11_device_destroy(); - XFreeCursor(x11.dpy, x11.cursor); - memset(&x11, 0, sizeof(x11)); -} - -#endif diff --git a/src/drivers/mii_disk2.c b/src/drivers/mii_disk2.c index 8cf522b..36328db 100644 --- a/src/drivers/mii_disk2.c +++ b/src/drivers/mii_disk2.c @@ -352,17 +352,15 @@ _mii_disk2_command( *(int *)param = 2; break; case MII_SLOT_DRIVE_LOAD ... MII_SLOT_DRIVE_LOAD + 2 - 1: - if (param) { - int drive = cmd - MII_SLOT_DRIVE_LOAD; - const char *filename = param; - if (c->disk[drive].privdat) { - c->disk[drive].eject(&c->disk[drive]); - } - printf("%s: drive %d loading %s\n", __func__, drive, - filename); - c->disk[drive] = disk_format_load(filename); - return 0; + int drive = cmd - MII_SLOT_DRIVE_LOAD; + if (c->disk[drive].privdat) { + c->disk[drive].eject(&c->disk[drive]); } + const char *filename = param; + printf("%s: drive %d loading %s\n", __func__, drive, + filename); + c->disk[drive] = disk_format_load( + filename && *filename ? filename : NULL); break; } return 0; diff --git a/src/drivers/mii_epromcard.c b/src/drivers/mii_epromcard.c index 855d6c5..8bf663b 100644 --- a/src/drivers/mii_epromcard.c +++ b/src/drivers/mii_epromcard.c @@ -8,6 +8,7 @@ * This is a driver for these eprom/flash cards from * Terence J. Boldt and the likes */ +#define _GNU_SOURCE // for asprintf #include #include #include @@ -21,37 +22,55 @@ #include "mii.h" #include "mii_bank.h" +#define INCBIN_STYLE INCBIN_STYLE_SNAKE +#define INCBIN_PREFIX mii_ +#include "incbin.h" + +INCBIN(1mb_rom, "disks/GamesWithFirmware.po"); + typedef struct mii_card_ee_t { - uint8_t * file; - uint16_t latch; + mii_dd_t drive[1]; + uint8_t * file; + uint16_t latch; } mii_card_ee_t; -int mmapfile(const char *fname, uint8_t **buf, size_t *sz, int flags); static int _mii_ee_init( mii_t * mii, struct mii_slot_t *slot ) { - uint8_t * file; - size_t sz; - const char *fname = "disks/Apple IIe Diagnostic 2.1.po"; - //const char *fname = "disks/GamesWithFirmware.po"; - - if (mmapfile(fname, &file, &sz, O_RDONLY) != 0) { - printf("Failed to load %s\n", fname); - return -1; - } mii_card_ee_t *c = calloc(1, sizeof(*c)); slot->drv_priv = c; - c->file = file; - printf("%s loading in slot %d\n", __func__, slot->id); - uint16_t addr = 0xc100 + (slot->id * 0x100); - mii_bank_write( - &mii->bank[MII_BANK_CARD_ROM], - addr, c->file + 0x300, 256); + printf("%s loading in slot %d\n", __func__, slot->id + 1); + for (int i = 0; i < 1; i++) { + mii_dd_t *dd = &c->drive[i]; + dd->slot_id = slot->id + 1; + dd->drive = i + 1; + dd->slot = slot; + dd->ro = 1; dd->wp = 1; + asprintf((char **)&dd->name, "EE1MB S:%d D:%d", + dd->slot_id, dd->drive); + } + mii_dd_register_drives(&mii->dd, c->drive, 1); + +#if 1 + c->file = (uint8_t*)mii_1mb_rom_data; +#else + const char *fname = "disks/GamesWithFirmware.po"; + + mii_dd_file_t *file = mii_dd_file_load(&mii->dd, fname, 0); + mii_dd_drive_load(&c->drive[0], file); + c->file = file->map; +#endif + if (c->file) { + uint16_t addr = 0xc100 + (slot->id * 0x100); + mii_bank_write( + &mii->bank[MII_BANK_CARD_ROM], + addr, c->file + 0x300, 256); + } return 0; } @@ -75,7 +94,35 @@ _mii_ee_access( break; } } else { - return c->file[(c->latch << 4) + psw]; + return c->file ? c->file[(c->latch << 4) + psw] : 0xff; + } + return 0; +} + +static int +_mii_ee_command( + mii_t * mii, + struct mii_slot_t *slot, + uint8_t cmd, + void * param) +{ + mii_card_ee_t *c = slot->drv_priv; + switch (cmd) { + case MII_SLOT_DRIVE_COUNT: + if (param) + *(int *)param = 1; + break; + case MII_SLOT_DRIVE_LOAD: + const char *filename = param; + mii_dd_file_t *file = NULL; + if (filename && *filename) { + file = mii_dd_file_load(&mii->dd, filename, 0); + if (!file) + return -1; + } + mii_dd_drive_load(&c->drive[0], file); + c->file = file ? file->map : (uint8_t*)mii_1mb_rom_data; + break; } return 0; } @@ -85,5 +132,6 @@ static mii_slot_drv_t _driver = { .desc = "EEPROM 1MB card", .init = _mii_ee_init, .access = _mii_ee_access, + .command = _mii_ee_command, }; MI_DRIVER_REGISTER(_driver); diff --git a/src/drivers/mii_mouse.c b/src/drivers/mii_mouse.c index 1a85f84..dccda4e 100644 --- a/src/drivers/mii_mouse.c +++ b/src/drivers/mii_mouse.c @@ -1,4 +1,11 @@ - +/* + * mii_mouse.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + * + */ #include "mii.h" @@ -16,6 +23,48 @@ #include "mii.h" #include "mii_bank.h" +/* + * Coded against this information + * http://stason.org/TULARC/pc/apple2/programmer/012-How-do-I-write-programs-which-use-the-mouse.html + */ + +/* + * Screen holes + * $0478 + slot Low byte of absolute X position + * $04F8 + slot Low byte of absolute Y position + * $0578 + slot High byte of absolute X position + * $05F8 + slot High byte of absolute Y position + * $0678 + slot Reserved and used by the firmware + * $06F8 + slot Reserved and used by the firmware + * $0778 + slot Button 0/1 interrupt status byte + * $07F8 + slot Mode byte + * + * Interrupt status byte: + * Set by READMOUSE + * Bit 7 6 5 4 3 2 1 0 + * | | | | | | | | + * | | | | | | | `--- Previously, button 1 was up (0) or down (1) + * | | | | | | `----- Movement interrupt + * | | | | | `------- Button 0/1 interrupt + * | | | | `--------- VBL interrupt + * | | | `----------- Currently, button 1 is up (0) or down (1) + * | | `------------- X/Y moved since last READMOUSE + * | `--------------- Previously, button 0 was up (0) or down (1) + * `----------------- Currently, button 0 is up (0) or down (1) + * + * Mode byte + * Valid after calling SERVEMOUSE, cleared with READMOUSE + * Bit 7 6 5 4 3 2 1 0 + * | | | | | | | | + * | | | | | | | `--- Mouse off (0) or on (1) + * | | | | | | `----- Interrupt if mouse is moved + * | | | | | `------- Interrupt if button is pressed + * | | | | `--------- Interrupt on VBL + * | | | `----------- Reserved + * | | `------------- Reserved + * | `--------------- Reserved + * `----------------- Reserved + */ enum { CLAMP_MIN_LO = 0x478, @@ -42,6 +91,8 @@ enum { typedef struct mii_card_mouse_t { struct mii_slot_t * slot; + mii_t * mii; + uint8_t timer_id; // 60hz timer uint8_t slot_offset; uint8_t mode; // cached mode byte struct { @@ -50,6 +101,44 @@ typedef struct mii_card_mouse_t { } last; } mii_card_mouse_t; +static uint64_t +_mii_mouse_vbl_handler( + mii_t * mii, + void *param) +{ + mii_card_mouse_t *c = param; + /* this is not exact, the VBL interrupt should still work when + * the mouse is disabled, but it's not really important -- for the moment + */ + if (!mii->mouse.enabled) + return 1000000 / 60; + + mii_bank_t * main = &mii->bank[MII_BANK_MAIN]; + uint8_t status = mii_bank_peek(main, MOUSE_STATUS + c->slot_offset); + uint8_t old = status; + + if (c->mode & mouseIntMoveEnabled) { + if ((mii->mouse.x != c->last.x) || (mii->mouse.y != c->last.y)) { + mii->cpu_state.irq = 1; + status |= 1 << 1; + } + } + if (c->mode & mouseIntButtonEnabled) { + if (mii->mouse.button && !c->last.button) { + mii->cpu_state.irq = 1; + status |= 1 << 2; + } + } + if (c->mode & mouseIntVBlankEnabled) { + mii->cpu_state.irq = 1; + status |= 1 << 3; + } +// if (mii->cpu_state.irq) mii->trace_cpu = true; + if (status != old) + mii_bank_poke(main, MOUSE_STATUS + c->slot_offset, status); + return 1000000 / 60; +} + static int _mii_mouse_init( mii_t * mii, @@ -58,12 +147,16 @@ _mii_mouse_init( mii_card_mouse_t *c = calloc(1, sizeof(*c)); c->slot = slot; slot->drv_priv = c; + c->mii = mii; printf("%s loading in slot %d\n", __func__, slot->id + 1); c->slot_offset = slot->id + 1 + 0xc0; uint8_t data[256] = {}; + c->timer_id = mii_timer_register(mii, + _mii_mouse_vbl_handler, c, + 1000000 / 60, __func__); // Identification as a mouse card // From Technical Note Misc #8, "Pascal 1.1 Firmware Protocol ID Bytes": data[0x05] = 0x38; @@ -84,12 +177,10 @@ _mii_mouse_init( data[base+3] = 0x18; // CLC ;no error data[base+4] = 0x60; // RTS } - uint16_t addr = 0xc100 + (slot->id * 0x100); mii_bank_write( &mii->bank[MII_BANK_CARD_ROM], addr, data, 256); - return 0; } @@ -127,21 +218,19 @@ _mii_mouse_access( printf(" Button: %s\n", byte & mouseIntButtonEnabled ? "enabled" : "disabled"); printf(" VBlank: %s\n", byte & mouseIntVBlankEnabled ? "enabled" : "disabled"); c->mode = byte; - mii->video.vbl_irq = !!(byte & mouseIntVBlankEnabled); } } break; + case 3: // service mouse + // no need to handle that, the VBL handler does it + break; case 4: {// read mouse if (!mii->mouse.enabled) break; uint8_t status = 0; - if (mii->mouse.button) - status |= 1 << 7; - if (c->last.button) { - status |= 1 << 6; - } - if ((mii->mouse.x != c->last.x) || (mii->mouse.y != c->last.y)) { + if ((mii->mouse.x != c->last.x) || (mii->mouse.y != c->last.y)) status |= 1 << 5; - } + status |= c->last.button ? 1 << 6 : 0; + status |= mii->mouse.button ? 1 << 7 : 0; mii_bank_poke(main, MOUSE_X_HI + c->slot_offset, mii->mouse.x >> 8); mii_bank_poke(main, MOUSE_Y_HI + c->slot_offset, mii->mouse.y >> 8); mii_bank_poke(main, MOUSE_X_LO + c->slot_offset, mii->mouse.x); diff --git a/src/drivers/mii_noslotclock.c b/src/drivers/mii_noslotclock.c index ca45ca2..cdcd421 100644 --- a/src/drivers/mii_noslotclock.c +++ b/src/drivers/mii_noslotclock.c @@ -105,7 +105,7 @@ _mii_nsc_access( bool write) { if (!bank) { - printf("%s: disposing of NSC\n", __func__); + // printf("%s: disposing of NSC\n", __func__); free(param); return false; } @@ -158,7 +158,7 @@ _mii_nsc_probe( mii_t *mii, uint32_t flags) { - printf("%s %s\n", __func__, flags & MII_INIT_NSC ? "enabled" : "disabled"); +// printf("%s %s\n", __func__, flags & MII_INIT_NSC ? "enabled" : "disabled"); if (!(flags & MII_INIT_NSC)) return 0; mii_nsc_t * nsc = calloc(1, sizeof(*nsc)); diff --git a/src/drivers/mii_smartport.c b/src/drivers/mii_smartport.c index cf96051..e280c57 100644 --- a/src/drivers/mii_smartport.c +++ b/src/drivers/mii_smartport.c @@ -36,7 +36,7 @@ extern const unsigned char mii_smartport_rom_data[]; #define MII_SM_DRIVE_COUNT 2 typedef struct mii_card_sm_t { - struct mii_card_sm_t *next; +// struct mii_card_sm_t *next; mii_dd_t drive[MII_SM_DRIVE_COUNT]; struct mii_slot_t *slot; } mii_card_sm_t; @@ -244,7 +244,7 @@ _mii_sm_init( c->slot = slot; slot->drv_priv = c; - printf("%s loading in slot %d\n", __func__, slot->id); + printf("%s loading in slot %d\n", __func__, slot->id + 1); uint16_t addr = 0xc100 + (slot->id * 0x100); mii_bank_write( &mii->bank[MII_BANK_CARD_ROM], @@ -252,7 +252,7 @@ _mii_sm_init( uint8_t trap_hd = mii_register_trap(mii, _mii_hd_callback); uint8_t trap_sm = mii_register_trap(mii, _mii_sm_callback); - printf("%s: traps %02x %02x\n", __func__, trap_hd, trap_sm); +// printf("%s: traps %02x %02x\n", __func__, trap_hd, trap_sm); mii_bank_write( &mii->bank[MII_BANK_CARD_ROM], addr + 0xd2, &trap_hd, 1); @@ -302,18 +302,15 @@ _mii_sm_command( *(int *)param = MII_SM_DRIVE_COUNT; break; case MII_SLOT_DRIVE_LOAD ... MII_SLOT_DRIVE_LOAD + MII_SM_DRIVE_COUNT - 1: - if (param) { - int drive = cmd - MII_SLOT_DRIVE_LOAD; - const char *filename = param; - mii_dd_file_t *file = NULL; - if (filename) { - file = mii_dd_file_load(&mii->dd, filename, 0); - if (!file) - return -1; - } - mii_dd_drive_load(&c->drive[drive], file); - return 0; + int drive = cmd - MII_SLOT_DRIVE_LOAD; + const char *filename = param; + mii_dd_file_t *file = NULL; + if (filename && *filename) { + file = mii_dd_file_load(&mii->dd, filename, 0); + if (!file) + return -1; } + mii_dd_drive_load(&c->drive[drive], file); break; } return 0; @@ -324,25 +321,6 @@ _mii_sm_access( mii_t * mii, struct mii_slot_t *slot, uint16_t addr, uint8_t byte, bool write) { - #if 0 - mii_card_sm_t *c = slot->drv_priv; - - printf("%s PC:%04x addr %04x %02x wr:%d\n", __func__, - mii->cpu.PC, addr, byte, write); - int psw = addr & 0x0F; - if (write) { - switch (psw) { - case 0: - // c->latch = (c->latch & 0xff00) | byte; - break; - case 1: - // c->latch = (c->latch & 0x00ff) | (byte << 8); - break; - } - } else { - // return c->file[(c->latch << 4) + psw]; - } - #endif return 0; } diff --git a/src/drivers/mii_ssc.c b/src/drivers/mii_ssc.c new file mode 100644 index 0000000..c3e5bee --- /dev/null +++ b/src/drivers/mii_ssc.c @@ -0,0 +1,143 @@ +/* + * mii_ssc.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + * + */ + +/* + THIS IS A PLACEHOLDER DO NOT USE + */ +#include "mii.h" + +#include +#include +#include +#include +#include +#include + +#include "mii.h" +#include "mii_bank.h" +#include "mii_sw.h" + +#define INCBIN_STYLE INCBIN_STYLE_SNAKE +#define INCBIN_PREFIX mii_ +#include "incbin.h" + +INCBIN(ssc_rom, "roms/mii_rom_scc_3410065a.bin"); + +typedef struct mii_card_ssc_t { + struct mii_slot_t * slot; + struct mii_bank_t * rom; + mii_t * mii; + uint8_t slot_offset; +} mii_card_ssc_t; + +static bool +_mii_ssc_select( + struct mii_bank_t *bank, + void *param, + uint16_t addr, + uint8_t * byte, + bool write) +{ + mii_card_ssc_t *c = param; + printf("%s selected:%d\n", __func__, c->slot->aux_rom_selected); + if (c->slot->aux_rom_selected) + return false; + mii_bank_write(c->rom, 0xc800, mii_ssc_rom_data, 2048); + c->slot->aux_rom_selected = true; + SW_SETSTATE(c->mii, SLOTAUXROM, 1); + c->mii->mem_dirty = true; + return false; +} + +static int +_mii_ssc_init( + mii_t * mii, + struct mii_slot_t *slot ) +{ + mii_card_ssc_t *c = calloc(1, sizeof(*c)); + c->slot = slot; + slot->drv_priv = c; + c->mii = mii; + + printf("%s: THIS IS A PLACEHOLDER DO NOT USE\n", __func__); + printf("%s loading in slot %d\n", __func__, slot->id + 1); + + c->slot_offset = slot->id + 1 + 0xc0; + + uint16_t addr = 0xc100 + (slot->id * 0x100); + c->rom = &mii->bank[MII_BANK_CARD_ROM]; + mii_bank_write(c->rom, addr, mii_ssc_rom_data + 7*256, 256); + /* + * install a callback that will be called for every access to the + * ROM area, we need this to re-install the secondary part of the ROM + * when the card 'slot' rom is accessed. + */ + mii_bank_install_access_cb(c->rom, + _mii_ssc_select, c, addr >> 8, addr >> 8); + + return 0; +} + +static void +_mii_ssc_dispose( + mii_t * mii, + struct mii_slot_t *slot ) +{ + mii_card_ssc_t *c = slot->drv_priv; + free(c); + slot->drv_priv = NULL; +} + +static uint8_t +_mii_ssc_access( + mii_t * mii, + struct mii_slot_t *slot, + uint16_t addr, + uint8_t byte, + bool write) +{ +// mii_card_ssc_t *c = slot->drv_priv; + + int psw = addr & 0x0F; +// mii_bank_t * main = &mii->bank[MII_BANK_MAIN]; + switch (psw) { + default: + printf("%s PC:%04x addr %04x %02x wr:%d\n", __func__, + mii->cpu.PC, addr, byte, write); + break; + } + return 0; +} + +static int +_mii_ssc_command( + mii_t * mii, + struct mii_slot_t *slot, + uint8_t cmd, + void * param) +{ +// mii_card_ssc_t *c = slot->drv_priv; + switch (cmd) { + case MII_SLOT_SSC_SET_TTY: { + const char * tty = param; + printf("%s: set tty %s\n", __func__, tty); + } break; + } + return -1; +} + +static mii_slot_drv_t _driver = { + .name = "ssc", + .desc = "Super Serial card", + .init = _mii_ssc_init, + .dispose = _mii_ssc_dispose, + .access = _mii_ssc_access, + .command = _mii_ssc_command, +}; +MI_DRIVER_REGISTER(_driver); diff --git a/src/drivers/mii_titan_iie.c b/src/drivers/mii_titan_iie.c index ca54a27..45bf564 100644 --- a/src/drivers/mii_titan_iie.c +++ b/src/drivers/mii_titan_iie.c @@ -60,7 +60,7 @@ _mii_titan_probe( mii_t *mii, uint32_t flags) { - printf("%s %s\n", __func__, flags & MII_INIT_TITAN ? "enabled" : "disabled"); +// printf("%s %s\n", __func__, flags & MII_INIT_TITAN ? "enabled" : "disabled"); if (!(flags & MII_INIT_TITAN)) return 0; // this override a read-only soft switch, but we only handle writes diff --git a/src/format/dsk.c b/src/format/dsk.c index 38de340..95089f5 100644 --- a/src/format/dsk.c +++ b/src/format/dsk.c @@ -196,7 +196,7 @@ header: continue; } - const int data_field_sz = 0x15A; //counts prologue, not epilogue + // const int data_field_sz = 0x15A; //counts prologue, not epilogue for (;;) { if (rd >= (end - 0x15A)) goto bail; if (rd[0] == 0xD5 && rd[1] == 0xAA) { diff --git a/src/format/mii_dd.c b/src/format/mii_dd.c index 45c190a..17f22e0 100644 --- a/src/format/mii_dd.c +++ b/src/format/mii_dd.c @@ -36,6 +36,7 @@ mii_dd_system_init( struct mii_t *mii, mii_dd_system_t *dd ) { +// printf("*** %s: %p\n", __func__, dd); dd->drive = NULL; dd->file = NULL; } @@ -44,6 +45,7 @@ void mii_dd_system_dispose( mii_dd_system_t *dd ) { +// printf("*** %s: %p\n", __func__, dd); while (dd->file) mii_dd_file_dispose(dd, dd->file); dd->file = NULL; @@ -56,6 +58,7 @@ mii_dd_register_drives( mii_dd_t * drives, uint8_t count ) { +// printf("%s: registering %d drives\n", __func__, count); for (int i = 0; i < count; i++) { mii_dd_t *d = &drives[i]; d->dd = dd; @@ -121,6 +124,8 @@ mii_dd_drive_load( dd->file = file; printf("%s: %s loading %s\n", __func__, dd->name, file->pathname); + if (dd->ro || dd->wp) + return 0; if (mii_dd_overlay_load(dd) < 0) { printf("%s: No overlay to load, we're fine for now\n", __func__); // no overlay.. what to do? @@ -371,6 +376,8 @@ mii_dd_write( { if (!dd || !dd->file || !dd->file->map) return -1; + if (dd->ro || dd->wp) + return -1; // printf("%s: %s write %d blocks at %d\n", // __func__, dd->name, blockcount, blk); mii_dd_overlay_prepare(dd); diff --git a/src/format/mii_dd.h b/src/format/mii_dd.h index 855ac6d..f49e9dc 100644 --- a/src/format/mii_dd.h +++ b/src/format/mii_dd.h @@ -13,8 +13,9 @@ struct mii_dd_t; enum { - MII_DD_FILE_OVERLAY = 1, +// MII_DD_FILE_OVERLAY = 1, MII_DD_FILE_RAM, + MII_DD_FILE_ROM, MII_DD_FILE_2MG = 5, }; @@ -52,9 +53,9 @@ typedef union mii_dd_overlay_header_t { typedef struct mii_dd_overlay_t { mii_dd_overlay_header_t *header; // points to the file mapped in memory - uint64_t * bitmap; // usage bitmap - uint8_t * blocks; // raw block data - mii_dd_file_t *file; // overlay file mapping + uint64_t * bitmap; // usage bitmap + uint8_t * blocks; // raw block data + mii_dd_file_t * file; // overlay file mapping } mii_dd_overlay_t; struct mii_slot_t; @@ -62,19 +63,19 @@ struct mii_dd_system_t; // a disk drive, with a slot, a drive number, and a file typedef struct mii_dd_t { - struct mii_dd_t *next; + struct mii_dd_t * next; struct mii_dd_system_t *dd; - const char * name; // ie "Disk ][ D:2" - uint8_t slot_id : 4, drive : 4; - struct mii_slot_t *slot; - unsigned int ro : 1, wp : 1, can_eject : 1; - mii_dd_file_t * file; - mii_dd_overlay_t overlay; + const char * name; // ie "Disk ][ D:2" + uint8_t slot_id : 4, drive : 4; + struct mii_slot_t * slot; + unsigned int ro : 1, wp : 1, can_eject : 1; + mii_dd_file_t * file; + mii_dd_overlay_t overlay; } mii_dd_t; typedef struct mii_dd_system_t { - mii_dd_t * drive; // list of all drives on all slots - mii_dd_file_t * file; // list of all open files (inc overlays) + mii_dd_t * drive; // list of all drives on all slots + mii_dd_file_t * file; // list of all open files (inc overlays) } mii_dd_system_t; struct mii_t; diff --git a/src/mii.c b/src/mii.c index 8ea25c1..db1f4f9 100644 --- a/src/mii.c +++ b/src/mii.c @@ -83,7 +83,7 @@ mii_dump_trace_state( // display the S flags static const char *s_flags = "CZIDBRVN"; for (int i = 0; i < 8; i++) - printf("%c", cpu->P.P[7-i] ? s_flags[7-i] : tolower(s_flags[7-i])); + printf("%c", MII_GET_P_BIT(cpu, i) ? s_flags[i] : tolower(s_flags[i])); if (s.sync) { uint8_t op[16]; for (int i = 0; i < 4; i++) { @@ -96,7 +96,7 @@ mii_dump_trace_state( MII_DUMP_DIS_DUMP_HEX); printf(": %s", dis); if (d.desc.branch) { - if (cpu->P.P[d.desc.s_bit] == d.desc.s_bit_value) + if (MII_GET_P_BIT(cpu, d.desc.s_bit) == d.desc.s_bit_value) printf(" ; taken"); } printf("\n"); @@ -109,7 +109,7 @@ mii_dump_run_trace( mii_t *mii) { // walk all the previous PC values in mii->trace, and display a line - // of disassebly for all of them + // of disassembly for all of them for (int li = 0; li < MII_PC_LOG_SIZE; li++) { int idx = (mii->trace.idx + li) & (MII_PC_LOG_SIZE - 1); uint16_t pc = mii->trace.log[idx]; @@ -154,7 +154,7 @@ static void mii_page_table_update( mii_t *mii) { - if (!mii->mem_dirty) + if (likely(!mii->mem_dirty)) return; mii->mem_dirty = 0; bool altzp = SW_GETSTATE(mii, SWALTPZ); @@ -165,9 +165,10 @@ mii_page_table_update( bool ramwrt = SW_GETSTATE(mii, SWRAMWRT); bool intcxrom = SW_GETSTATE(mii, SWINTCXROM); bool slotc3rom = SW_GETSTATE(mii, SWSLOTC3ROM); + bool slotauxrom = SW_GETSTATE(mii, SLOTAUXROM); - if (mii->trace_cpu) - printf("%04x: page table update altzp:%d page2:%d store80:%d " + if (unlikely(mii->trace_cpu)) + printf("%04x: MEM update altzp:%d page2:%d store80:%d " "hires:%d ramrd:%d ramwrt:%d intcxrom:%d " "slotc3rom:%d\n", mii->cpu.PC, altzp, page2, store80, hires, ramrd, ramwrt, intcxrom, slotc3rom); @@ -188,8 +189,11 @@ mii_page_table_update( page2 ? MII_BANK_AUX : MII_BANK_MAIN, page2 ? MII_BANK_AUX : MII_BANK_MAIN, 0x20, 0x3f); } - if (!intcxrom) + if (!intcxrom) { mii_page_set(mii, MII_BANK_CARD_ROM, _SAME, 0xc1, 0xc7); + if (slotauxrom) + mii_page_set(mii, MII_BANK_CARD_ROM, _SAME, 0xc8, 0xcf); + } mii_page_set(mii, slotc3rom ? MII_BANK_CARD_ROM : MII_BANK_ROM, _SAME, 0xc3, 0xc3); bool bsrread = SW_GETSTATE(mii, BSRREAD); @@ -229,6 +233,55 @@ mii_set_sw_override( mii->soft_switches_override[sw_addr].param = param; } +/* + * This watches for any write to 0xcfff -- if a card had it's aux rom + * selected, it will deselect it. + */ +static bool +_mii_deselect_auxrom( + struct mii_bank_t *bank, + void *param, + uint16_t addr, + uint8_t * byte, + bool write) +{ + if (addr != 0xcfff) + return false; + mii_t * mii = param; +// printf("%s AUXROM:%d\n", __func__, !!(mii->sw_state & M_SLOTAUXROM)); + if (!(mii->sw_state & M_SLOTAUXROM)) + return false; + for (int i = 0; i < 7; i++) { + mii_slot_t * slot = &mii->slot[i]; + if (slot->aux_rom_selected) { + printf("%s %d: %s\n", __func__, + i, slot->drv ? slot->drv->name : "(none?)"); + slot->aux_rom_selected = false; + } + } + mii->sw_state &= ~M_SLOTAUXROM; + mii->mem_dirty = true; + return false; +} + +static bool +_mii_select_c3rom( + struct mii_bank_t *bank, + void *param, + uint16_t addr, + uint8_t * byte, + bool write) +{ + mii_t * mii = param; + printf("%s\n", __func__); + if (mii->sw_state & M_SLOTAUXROM) { + // printf("%s: C3 aux rom re-selected\n", __func__); + mii->sw_state &= ~M_SLOTAUXROM; + } + mii->mem_dirty = true; + return false; +} + static bool mii_access_soft_switches( mii_t *mii, @@ -236,7 +289,7 @@ mii_access_soft_switches( uint8_t * byte, bool write) { - if (!(addr >= 0xc000 && addr <= 0xc0ff) || addr == 0xcfff) + if (!(addr >= 0xc000 && addr <= 0xc0ff)) return false; bool res = false; uint8_t on = 0; @@ -280,7 +333,9 @@ mii_access_soft_switches( SW_SETSTATE(mii, BSRREAD, rd); SW_SETSTATE(mii, BSRPAGE2, !(mode & 0x08)); mii->mem_dirty = 1; - if (mii->trace_cpu) +// mii->trace_cpu = 1; +// mii->state = MII_STOPPED; + if (unlikely(mii->trace_cpu)) printf("%04x: BSR mode addr %04x:%02x read:%s write:%s %s altzp:%02x\n", mii->cpu.PC, addr, mode, @@ -289,11 +344,6 @@ mii_access_soft_switches( SW_GETSTATE(mii, BSRPAGE2) ? "page2" : "page1", mii_sw(mii, SWALTPZ)); } break; - case 0xcfff: - res = true; - mii->mem_dirty = 1; - printf("%s TODO reset SLOT roms\n", __func__); - break; case SWPAGE2OFF: case SWPAGE2ON: res = true; @@ -390,15 +440,22 @@ mii_access_soft_switches( *byte = mii_bank_peek(main, addr); break; case 0xc020: // toggle TAPE output ?!?! - case 0xc064: // Analog Input 0 (paddle 0) - case 0xc065: // Analog Input 1 (paddle 1) - case 0xc079: // Analog Input Reset res = true; break; case 0xc068: res = true; // IIgs register, read by prodos tho break; + default: + res = true; + /* + * this is moderately important, return some random value + * as it is supposed to represent what's on the bus at the time, + * typically video being decoded etc. + */ + *byte = mii->random[mii->random_index++]; + mii->random_index &= 0xff; + break; } } if (!res) { @@ -460,15 +517,35 @@ mii_init( mii_t *mii ) { memset(mii, 0, sizeof(*mii)); - mii->speed = 1.0; + mii->speed = 1.023; + mii->timer.map = 0; for (int i = 0; i < MII_BANK_COUNT; i++) mii->bank[i] = _mii_banks_init[i]; mii->bank[MII_BANK_ROM].mem = (uint8_t*)&iie_enhanced_rom_bin[0]; + for (int i = 0; i < MII_BANK_COUNT; i++) + mii_bank_init(&mii->bank[i]); mii->cpu.trap = MII_TRAP; + // these are called once, regardless of reset + mii_dd_system_init(mii, &mii->dd); + mii_analog_init(mii, &mii->analog); + mii_video_init(mii); + mii_speaker_init(mii, &mii->speaker); + mii_reset(mii, true); mii->cpu_state = mii_cpu_init(&mii->cpu); for (int i = 0; i < 7; i++) mii->slot[i].id = i; + +// srandom(time(NULL)); + for (int i = 0; i < 256; i++) + mii->random[i] = random(); + + mii_bank_install_access_cb(&mii->bank[MII_BANK_CARD_ROM], + _mii_deselect_auxrom, mii, 0xcf, 0xcf); + mii_bank_install_access_cb(&mii->bank[MII_BANK_ROM], + _mii_deselect_auxrom, mii, 0xcf, 0xcf); + mii_bank_install_access_cb(&mii->bank[MII_BANK_ROM], + _mii_select_c3rom, mii, 0xc3, 0xc3); } void @@ -476,14 +553,12 @@ mii_prepare( mii_t *mii, uint32_t flags ) { - mii_dd_system_init(mii, &mii->dd); - mii_speaker_init(mii, &mii->speaker); - printf("%s driver table\n", __func__); +// printf("%s driver table\n", __func__); mii_slot_drv_t * drv = mii_slot_drv_list; while (drv) { printf("%s driver: %s\n", __func__, drv->name); if (drv->probe && drv->probe(mii, flags)) { - printf("%s %s probe done\n", __func__, drv->name); + // printf("%s %s probe done\n", __func__, drv->name); } drv = drv->next; } @@ -501,6 +576,7 @@ mii_dispose( mii_bank_dispose(&mii->bank[i]); mii_speaker_dispose(&mii->speaker); mii_dd_system_dispose(&mii->dd); + mii->state = MII_INIT; } void @@ -509,6 +585,7 @@ mii_reset( bool cold) { // printf("%s cold %d\n", __func__, cold); + mii->state = MII_RUNNING; mii->cpu_state.reset = 1; mii_bank_t * main = &mii->bank[MII_BANK_MAIN]; mii->sw_state = M_BSRWRITE | M_BSRPAGE2; @@ -547,27 +624,27 @@ mii_mem_access( mii_access_keyboard(mii, addr, d, wr) || mii_access_video(mii, addr, d, wr) || mii_access_soft_switches(mii, addr, d, wr); - if (!done) { - uint8_t page = addr >> 8; - if (wr) { - uint8_t m = mii->mem[page].write; - mii_bank_t * b = &mii->bank[m]; - if (b->ro) { - // printf("%s write to RO bank %s %04x:%02x\n", - // __func__, b->name, addr, *d); - } else - mii_bank_write(b, addr, d, 1); - } else { - uint8_t m = mii->mem[page].read; - mii_bank_t * b = &mii->bank[m]; - *d = mii_bank_peek(b, addr); - } + if (done) + return; + uint8_t page = addr >> 8; + if (wr) { + uint8_t m = mii->mem[page].write; + mii_bank_t * b = &mii->bank[m]; + if (b->ro) { + // printf("%s write to RO bank %s %04x:%02x\n", + // __func__, b->name, addr, *d); + } else + mii_bank_write(b, addr, d, 1); + } else { + uint8_t m = mii->mem[page].read; + mii_bank_t * b = &mii->bank[m]; + *d = mii_bank_peek(b, addr); } } static void _mii_handle_trap( - mii_t *mii) + mii_t *mii) { // printf("%s TRAP hit PC: %04x\n", __func__, mii->cpu.PC); mii->cpu_state.sync = 1; @@ -588,8 +665,8 @@ _mii_handle_trap( uint8_t mii_register_trap( - mii_t *mii, - mii_trap_handler_cb cb) + mii_t *mii, + mii_trap_handler_cb cb) { if (mii->trap.map == 0xffff) { printf("%s no more traps!!\n", __func__); @@ -605,23 +682,91 @@ mii_register_trap( return 0xff; } +uint8_t +mii_timer_register( + mii_t *mii, + mii_timer_p cb, + void *param, + int64_t when, + const char *name) +{ + if (mii->timer.map == (uint64_t)-1) { + printf("%s no more timers!!\n", __func__); + return 0xff; + } + int i = ffsll(~mii->timer.map) - 1; + mii->timer.map |= 1ull << i; + mii->timer.timers[i].cb = cb; + mii->timer.timers[i].param = param; + mii->timer.timers[i].when = when; + mii->timer.timers[i].name = name; + return i; +} + +int64_t +mii_timer_get( + mii_t *mii, + uint8_t timer_id) +{ + if (timer_id >= (int)sizeof(mii->timer.map) * 8) + return 0; + return mii->timer.timers[timer_id].when; +} + +int +mii_timer_set( + mii_t *mii, + uint8_t timer_id, + int64_t when) +{ + if (timer_id >= (int)sizeof(mii->timer.map) * 8) + return -1; + mii->timer.timers[timer_id].when = when; + return 0; +} + +static void +mii_timer_run( + mii_t *mii, + uint64_t cycles) +{ + uint64_t timer = mii->timer.map; + while (timer) { + int i = ffsll(timer) - 1; + timer &= ~(1ull << i); + if (mii->timer.timers[i].when > 0) { + mii->timer.timers[i].when -= cycles; + if (mii->timer.timers[i].when <= 0) { + if (mii->timer.timers[i].cb) + mii->timer.timers[i].when += mii->timer.timers[i].cb(mii, + mii->timer.timers[i].param); + } + } + } +} + void mii_run( mii_t *mii) { /* this runs all cycles for one instruction */ + uint16_t cycle = mii->cpu.cycle; do { - if (mii->trace_cpu) + if (unlikely(mii->trace_cpu > 1)) mii_dump_trace_state(mii); mii->cpu_state = mii_cpu_run(&mii->cpu, mii->cpu_state); - mii_video_run(mii); - mii_speaker_run(&mii->speaker); + + mii_timer_run(mii, + mii->cpu.cycle > cycle ? mii->cpu.cycle - cycle : + mii->cpu.cycle); + cycle = mii->cpu.cycle; + // extract 16-bit address from pin mask const uint16_t addr = mii->cpu_state.addr; - const uint8_t data = mii->cpu_state.data; +// const uint8_t data = mii->cpu_state.data; int wr = mii->cpu_state.w; - uint8_t d = data; - if (mii->debug.bp_map) { +// uint8_t d = data; + if (unlikely(mii->debug.bp_map)) { for (int i = 0; i < (int)sizeof(mii->debug.bp_map) * 8; i++) { if (!(mii->debug.bp_map & (1 << i))) continue; @@ -644,14 +789,12 @@ mii_run( } } } - mii_mem_access(mii, addr, &d, wr, true); - if (!wr) - mii->cpu_state.data = d; - if (mii->cpu_state.trap) { + mii_mem_access(mii, addr, &mii->cpu_state.data, wr, true); + if (unlikely(mii->cpu_state.trap)) { _mii_handle_trap(mii); } } while (!(mii->cpu_state.sync)); - mii->cycles += mii->cpu.cycle; + // log PC for the running disassembler display mii->trace.log[mii->trace.idx] = mii->cpu.PC; mii->trace.idx = (mii->trace.idx + 1) & (MII_PC_LOG_SIZE - 1); diff --git a/src/mii.h b/src/mii.h index ba7ff41..6ff276e 100644 --- a/src/mii.h +++ b/src/mii.h @@ -10,7 +10,6 @@ #include #include -#include "mii_types.h" #include "mii_65c02.h" #include "mii_dd.h" #include "mii_bank.h" @@ -20,6 +19,9 @@ #include "mii_mouse.h" #include "mii_analog.h" +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + enum { MII_BANK_MAIN = 0, // main 48K address space MII_BANK_BSR, // 0xd000 - 0xffff bank switched RAM 16KB @@ -50,7 +52,8 @@ typedef struct mii_trap_t { // state of the emulator enum { - MII_RUNNING = 0, // default + MII_INIT = 0, + MII_RUNNING, // default MII_STOPPED, MII_STEP, MII_TERMINATE, @@ -78,16 +81,32 @@ typedef struct mii_trace_t { uint32_t step_inst; } mii_trace_t; - +typedef uint64_t (*mii_timer_p)( + mii_t * mii, + void * param ); /* * principal emulator state, for a faceless emulation */ typedef struct mii_t { unsigned int state; - mii_cycles_t cycles; + /* + * These are 'cycle timers' -- they count down from a set value, + * and stop at 0 (or possiblu -1 or -2, depending on the instructions) + * and call the callback (if present). + * The callback returns the number of cycles to wait until the next + * call. + */ + struct { + uint64_t map; + struct { + mii_timer_p cb; + void * param; + int64_t when; + const char * name; // debug + } timers[64]; + } timer; /* this is the video frame/VBL rate vs 60hz, default to 1.0 */ float speed; - float speed_current; // calculated speed mii_cpu_t cpu; mii_cpu_state_t cpu_state; /* @@ -125,6 +144,9 @@ typedef struct mii_t { mii_mouse_t mouse; mii_dd_system_t dd; mii_analog_t analog; + + uint8_t random[256]; + uint8_t random_index; } mii_t; enum { @@ -235,7 +257,6 @@ mii_write_word( mii_t *mii, uint16_t addr, uint16_t w); - /* lower level call to access memory -- this one can trigger softswitches * if specified. Otherwise behaves as the previous ones, one byte at a time */ @@ -256,12 +277,33 @@ mii_set_sw_override( mii_bank_access_cb cb, void *param); +/* register a cycle timer. cb will be called when (at least) when + * cycles have been spent -- the callback returns how many it should + * spend until the next call */ +uint8_t +mii_timer_register( + mii_t *mii, + mii_timer_p cb, // this is optional, can be NULL + void *param, + int64_t when, + const char *name); +/* return the cycles left for timer_id (can be negative !)*/ +int64_t +mii_timer_get( + mii_t *mii, + uint8_t timer_id); +int +mii_timer_set( + mii_t *mii, + uint8_t timer_id, + int64_t when); + void mii_dump_trace_state( - mii_t *mii); + mii_t *mii); void mii_dump_run_trace( - mii_t *mii); + mii_t *mii); extern mii_slot_drv_t * mii_slot_drv_list; diff --git a/src/mii_65c02.c b/src/mii_65c02.c index 5ab5587..6eadea0 100644 --- a/src/mii_65c02.c +++ b/src/mii_65c02.c @@ -8,6 +8,9 @@ #define MII_CPU_65C02_IMPL #include "mii_65c02_ops.h" +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + mii_cpu_state_t mii_cpu_init( mii_cpu_t *cpu ) @@ -23,31 +26,27 @@ mii_cpu_init( #define _FETCH(_val) { \ s.addr = _val; s.w = 0; cpu->cycle++; \ pt_yield(cpu->state); \ - } while (0); + } #define _STORE(_addr, _val) { \ s.addr = _addr; s.data = _val; s.w = 1; cpu->cycle++; \ pt_yield(cpu->state); \ - } while (0); + } + -#define _SET_P(_byte) { \ - for (int _pi = 0; _pi < 8; _pi++) \ - cpu->P.P[_pi] = _pi == B_B || _pi == B_X || \ - ((_byte) & (1 << _pi)); \ - } #define _NZC(_val) { \ uint16_t v = (_val); \ cpu->P.N = !!(v & 0x80); \ cpu->P.Z = (v & 0xff) == 0; \ cpu->P.C = !!(v & 0xff00); \ - } while (0) + } #define _NZ(_val) { \ uint16_t v = (_val); \ cpu->P.N = !!(v & 0x80); \ cpu->P.Z = (v & 0xff) == 0; \ - } while (0) + } #define _C(_val) { \ cpu->P.C = !!(_val); \ - } while (0) + } mii_cpu_state_t mii_cpu_run( @@ -57,28 +56,30 @@ mii_cpu_run( mii_op_desc_t d = mii_cpu_op[cpu->IR].desc; pt_start(cpu->state); next_instruction: - if (s.reset) { + if (unlikely(s.reset)) { s.reset = 0; _FETCH(0xfffc); cpu->_P = s.data; _FETCH(0xfffd); cpu->_P |= s.data << 8; cpu->PC = cpu->_P; cpu->S = 0xFF; - _SET_P(0); + MII_SET_P(cpu, 0); } - if (s.irq) { + if (unlikely(s.irq) && cpu->P.I == 0) { + if (!cpu->IRQ) + cpu->IRQ = 1; + } + if (unlikely(cpu->IRQ)) { s.irq = 0; - cpu->P.P[B_B] = cpu->IRQ == 2; - cpu->IRQ = 1; - cpu->_D = cpu->PC + 1; + cpu->P.B = cpu->IRQ == 2; + cpu->_D = cpu->PC; _STORE(0x0100 | cpu->S--, cpu->_D >> 8); _STORE(0x0100 | cpu->S--, cpu->_D & 0xff); uint8_t p = 0; - for (int i = 0; i < 8; i++) - p |= (i == B_X || cpu->P.P[i]) << i; + MII_GET_P(cpu, p); _STORE(0x0100 | cpu->S--, p); - cpu->P.P[B_I] = 1; - } - if (cpu->IRQ) { + cpu->P.I = 1; + if (cpu->IRQ == 2) + cpu->P.D = 0; cpu->IRQ = 0; _FETCH(0xfffe); cpu->_P = s.data; _FETCH(0xffff); cpu->_P |= s.data << 8; @@ -95,7 +96,7 @@ next_instruction: d = mii_cpu_op[cpu->IR].desc; cpu->ir_log = (cpu->ir_log << 8) | cpu->IR; s.trap = cpu->trap && (cpu->ir_log & 0xffff) == cpu->trap; - if (s.trap) + if (unlikely(s.trap)) cpu->ir_log = 0; switch (d.mode) { case IMM: @@ -173,17 +174,20 @@ next_instruction: case 0x79: case 0x61: case 0x71: case 0x72: { // ADC // Handle adding in BCD with bit D - if (cpu->P.D) { - uint8_t lo = (cpu->A & 0x0f) + (cpu->_D & 0x0f) + !!cpu->P.C; + if (unlikely(cpu->P.D)) { + uint8_t D = cpu->_D; + uint8_t lo = (cpu->A & 0x0f) + (D & 0x0f) + !!cpu->P.C; if (lo > 9) lo += 6; - uint8_t hi = (cpu->A >> 4) + (cpu->_D >> 4) + (lo > 0x0f); - cpu->P.Z = ((uint8_t)(cpu->A + cpu->_D + cpu->P.C)) == 0; + uint8_t hi = (cpu->A >> 4) + (D >> 4) + (lo > 0x0f); + cpu->P.Z = ((uint8_t)(cpu->A + D + cpu->P.C)) == 0; // that is 6502 behaviour // cpu->P.N = !!(hi & 0xf8); - cpu->P.V = !!((!((cpu->A ^ cpu->_D) & 0x80) && + cpu->P.V = !!((!((cpu->A ^ D) & 0x80) && ((cpu->A ^ (hi << 4))) & 0x80)); if (hi > 9) hi += 6; cpu->P.C = hi > 15; + // printf("ADC %02x %02x C:%d %x%x\n", + // cpu->A, D, !!cpu->P.C, hi & 0xf, lo & 0xf); cpu->A = (hi << 4) | (lo & 0x0f); // THAT is 65c02 behaviour cpu->P.N = !!(cpu->A & 0x80); @@ -219,9 +223,11 @@ next_instruction: case 0xaf: case 0xbf: case 0xcf: case 0xdf: case 0xef: case 0xff: { // BBR/BBS +// printf(" BB%c%d vs %02x\n", d.s_bit_value ? 'S' : 'R', +// d.s_bit, cpu->_D); _FETCH(cpu->PC++); // relative branch if (((cpu->_D >> d.s_bit) & 1) == d.s_bit_value) { - cpu->_P = cpu->PC + (int8_t)cpu->_P; + cpu->_P = cpu->PC + (int8_t)s.data; cpu->cycle++; if ((cpu->_P & 0xff00) != (cpu->PC & 0xff00)) cpu->cycle++; @@ -231,7 +237,7 @@ next_instruction: case 0x90: case 0xB0: case 0xF0: case 0x30: case 0xD0: case 0x10: case 0x50: case 0x70: { // BCC, BCS, BEQ, BMI, BNE, BPL, BVC, BVS - if (d.s_bit_value == cpu->P.P[d.s_bit]) { + if (d.s_bit_value == MII_GET_P_BIT(cpu, d.s_bit)) { cpu->_P = cpu->PC + (int8_t)cpu->_P; cpu->cycle++; if ((cpu->_P & 0xff00) != (cpu->PC & 0xff00)) @@ -259,14 +265,16 @@ next_instruction: } break; case 0x00: { // BRK + // Turns out BRK is a 2 byte opcode, who knew? well that guy did: + // https://www.nesdev.org/the%20'B'%20flag%20&%20BRK%20instruction.txt#:~:text=A%20note%20on%20the%20BRK,opcode%2C%20and%20not%20just%201. + _FETCH(cpu->PC++); // cpu->cycle++; s.irq = 1; - cpu->IRQ = 2; // IRQ interrupt - // cpu->P.P[B_D] = 0; // 65c02 clears this + cpu->IRQ = 2; // BRK sort of IRQ interrupt } break; case 0x18: case 0xD8: case 0x58: case 0xB8: { // CLC, CLD, CLI, CLV _FETCH(cpu->PC); - cpu->P.P[d.s_bit] = 0; + MII_SET_P_BIT(cpu, d.s_bit, 0); } break; case 0xC9: case 0xC5: case 0xD5: case 0xCD: case 0xDD: case 0xD9: case 0xC1: case 0xD1: case 0xD2: @@ -338,10 +346,13 @@ next_instruction: cpu->PC = cpu->_P; } break; case 0x20: + // https://github.com/AppleWin/AppleWin/issues/1257 { // JSR - cpu->_D = cpu->PC - 1; - _STORE(0x0100 | cpu->S--, cpu->_D >> 8); - _STORE(0x0100 | cpu->S--, cpu->_D & 0xff); + _FETCH(cpu->PC++); cpu->_P = s.data; + _FETCH(0x0100 | cpu->S); + _STORE(0x0100 | cpu->S--, cpu->PC >> 8); + _STORE(0x0100 | cpu->S--, cpu->PC & 0xff); + _FETCH(cpu->PC++); cpu->_P |= s.data << 8; cpu->PC = cpu->_P; } break; case 0xA9: case 0xA5: case 0xB5: case 0xAD: case 0xBD: @@ -389,9 +400,8 @@ next_instruction: case 0x08: { // PHP uint8_t p = 0; - for (int i = 0; i < 8; i++) - p |= (i == B_X || cpu->P.P[i]) << i; - p |= (1 << B_B); + MII_GET_P(cpu, p); + p |= (1 << B_B) | (1 << B_X); _STORE(0x0100 | cpu->S--, p); cpu->cycle++; } break; case 0xDA: @@ -411,7 +421,7 @@ next_instruction: case 0x28: { // PLP _FETCH(0x0100 | ++cpu->S);cpu->cycle++; - _SET_P(s.data);cpu->cycle++; + MII_SET_P(cpu, s.data);cpu->cycle++; } break; case 0xFA: { // PLX @@ -459,14 +469,15 @@ next_instruction: } break; case 0x40: { // RTI - _FETCH(0x0100 | ((++cpu->S) & 0xff)); + _FETCH(cpu->PC); // dummy write + cpu->S++; _FETCH(0x0100 | cpu->S); for (int i = 0; i < 8; i++) - cpu->P.P[i] = i == B_B || (s.data & (1 << i)); + MII_SET_P_BIT(cpu, i, i == B_B || (s.data & (1 << i))); cpu->P._R = 1; - _FETCH(0x0100 | ((++cpu->S) & 0xff)); + cpu->S++; _FETCH(0x0100 | cpu->S); cpu->_P = s.data; - _FETCH(0x0100 | ((++cpu->S) & 0xff)); - cpu->_P = (s.data << 8) | (cpu->_P ); + cpu->S++; _FETCH(0x0100 | cpu->S); + cpu->_P |= s.data << 8; cpu->PC = cpu->_P; } break; case 0x60: @@ -481,17 +492,24 @@ next_instruction: case 0xF9: case 0xE1: case 0xF1: case 0xF2: { // SBC // Handle subbing in BCD with bit D - if (cpu->P.D) { - uint8_t lo = (cpu->A & 0x0f) - (cpu->_D & 0x0f) - !cpu->P.C; - if (lo & 0x10) lo -= 6; - uint8_t hi = (cpu->A >> 4) - (cpu->_D >> 4) - (lo & 0x10); - if (hi & 0x10) hi -= 6; - cpu->P.Z = ((uint8_t)(cpu->A - cpu->_D - !cpu->P.C)) == 0; - cpu->P.N = !!(hi & 0x8); - cpu->P.V = !!(((cpu->A ^ cpu->_D) & + if (unlikely(cpu->P.D)) { + uint8_t D = 0x99 - cpu->_D; + // verbatim ADC code here + uint8_t lo = (cpu->A & 0x0f) + (D & 0x0f) + !!cpu->P.C; + if (lo > 9) lo += 6; + uint8_t hi = (cpu->A >> 4) + (D >> 4) + (lo > 0x0f); + cpu->P.Z = ((uint8_t)(cpu->A + D + cpu->P.C)) == 0; + // that is 6502 behaviour +// cpu->P.N = !!(hi & 0xf8); + cpu->P.V = !!((!((cpu->A ^ D) & 0x80) && ((cpu->A ^ (hi << 4))) & 0x80)); - cpu->P.C = !(hi & 0x10); + if (hi > 9) hi += 6; + cpu->P.C = hi > 15; + // printf("SBC %02x %02x C:%d %x%x\n", + // cpu->A, D, !!cpu->P.C, hi & 0xf, lo & 0xf); cpu->A = (hi << 4) | (lo & 0x0f); + // THAT is 65c02 behaviour + cpu->P.N = !!(cpu->A & 0x80); } else { cpu->_D = (~cpu->_D) & 0xff; uint16_t sum = cpu->A + cpu->_D + !!cpu->P.C; @@ -504,7 +522,7 @@ next_instruction: } break; case 0x38: case 0xF8: case 0x78: { // SEC, SED, SEI - cpu->P.P[d.s_bit] = 1; + MII_SET_P_BIT(cpu, d.s_bit, 1); } break; case 0x85: case 0x95: case 0x8D: case 0x9D: case 0x99: case 0x81: case 0x91: case 0x92: diff --git a/src/mii_65c02.h b/src/mii_65c02.h index 7d370b7..1db6bfc 100644 --- a/src/mii_65c02.h +++ b/src/mii_65c02.h @@ -2,6 +2,13 @@ #include +/* + * This is pretty heavily dependant on the way bitfields are packed in + * bytes, so it's not technically portable; if you have problems using a + * strange compiler, undefine this and use the 'discrete' version below. + */ +#define MII_PACK_P + /* * State structure used to 'talk' to the CPU emulator. * It works like this: @@ -27,9 +34,9 @@ */ typedef union mii_cpu_state_t { struct { - uint32_t addr : 16, - data : 8, - w : 1, + uint16_t addr; + uint8_t data; + uint8_t w : 1, sync : 1, reset : 1, irq : 1, @@ -49,20 +56,30 @@ typedef struct mii_cpu_t { * are 'indirect' and load from memory will set _P and read in _D * so the opcode doesn't have to handle s.data at all */ uint16_t _D, _P; + +#ifdef MII_PACK_P + union { + struct { + uint8_t C:1, Z:1, I:1, D:1, B:1, _R:1, V:1, N:1; + }; + uint8_t P; + } P; +#else /* My experience with simavr shows that maintaining a 8 bits bitfield * for a status register is a lot slower than having discrete flags - * and 'constructing' the matching 8 biots register when needed */ + * and 'constructing' the matching 8 bits register when needed */ union { struct { uint8_t C, Z, I, D, B, _R, V, N; }; uint8_t P[8]; } P; +#endif uint16_t PC; uint8_t IR; uint8_t IRQ; // IRQ (0) or NMI (1) or BRK (2) uint8_t cycle; // for current instruction - /* State of the CPU state machine */ + /* State of the protothread for the CPU state machine (minipt.h) */ void * state; /* sequence of instruction that will trigger a trap flag. @@ -73,8 +90,7 @@ typedef struct mii_cpu_t { // last 4 instructions, as a shift register, used for traps or debug uint32_t ir_log; - /* Debug only; the callback is called every cycles, with the current - * state of the cpu. */ + /* Debug only; Only used by the test units. */ uint8_t * ram; // DEBUG } mii_cpu_t; @@ -86,3 +102,35 @@ mii_cpu_state_t mii_cpu_run( mii_cpu_t *cpu, mii_cpu_state_t s); + + +#ifdef MII_PACK_P +#define MII_SET_P(_cpu, _byte) { \ + (_cpu)->P.P = _byte | 0x30; \ + } +#define MII_GET_P(_cpu, _res) \ + (_res) = (_cpu)->P.P +#define MII_SET_P_BIT(_cpu, _bit, _val) { \ + const int __bit = _bit; \ + (_cpu)->P.P = ((_cpu)->P.P & ~(1 << __bit)) | (!!(_val) << __bit); \ + } +#define MII_GET_P_BIT(_cpu, _bit) \ + !!(((_cpu)->P.P & (1 << (_bit)))) +#else +#define MII_SET_P(_cpu, _byte) { \ + const int __byte = _byte; \ + for (int _pi = 0; _pi < 8; _pi++) \ + (_cpu)->P.P[_pi] = _pi == B_B || _pi == B_X || \ + ((__byte) & (1 << _pi)); \ + } +#define MII_GET_P(_cpu, _res) { \ + (_res) = 0; \ + for (int _pi = 0; _pi < 8; _pi++) \ + (_res) |= (_cpu)->P.P[_pi] << _pi; \ + } +#define MII_SET_P_BIT(_cpu, _bit, _val) { \ + (_cpu)->P.P[_bit] = _val; \ + } +#define MII_GET_P_BIT(_cpu, _bit) \ + ((_cpu)->P.P[_bit]) +#endif diff --git a/src/mii_65c02_asm.c b/src/mii_65c02_asm.c index c31cf61..c5fe50d 100644 --- a/src/mii_65c02_asm.c +++ b/src/mii_65c02_asm.c @@ -150,7 +150,7 @@ mii_cpu_asm_load( * that can be resolved immediately */ char *kw = position; while (*kw == ' ' || *kw == '\t') kw++; - char *cur = kw; + char *cur = NULL; while ((cur = strsep(&kw, ",")) != NULL) { while (*cur == ' ' || *cur == '\t') cur++; char *ke = cur + strlen(cur); @@ -339,7 +339,7 @@ int mii_cpu_asm_assemble( mii_cpu_asm_program_t *p ) { - mii_cpu_asm_line_t *l = p->prog; + mii_cpu_asm_line_t *l = NULL; int error = 0; // fix symbols @@ -386,6 +386,12 @@ mii_cpu_asm_assemble( } else if (l->mode == mii_cpu_op[i].desc.mode) { found = i; break; + } else if (mii_cpu_op[i].desc.op == 0x20 && + l->mode == ABS) { + // this is JSR -- TECHNICALLY it's ABS mode, but + // it has to do a 'special' fetch so it's marked as + // implied in the table + found = i; } } } @@ -433,7 +439,7 @@ mii_cpu_asm_assemble( while (l2) { int32_t value = 0; if (!strcasecmp(l->op_name, l2->label)) { - value = l2->op_value; + // value = l2->op_value; if (!l2->symbol) value = l2->addr; else diff --git a/src/mii_65c02_disasm.c b/src/mii_65c02_disasm.c index 703c70f..bcf71cb 100644 --- a/src/mii_65c02_disasm.c +++ b/src/mii_65c02_disasm.c @@ -21,6 +21,10 @@ mii_cpu_disasm_one( mii_op_desc_t d = mii_cpu_op[op].desc; if (!d.pc) d.pc = 1; + // special case for JSR, it is marked as IMPLIED for execution, but is + // in fact ABSOLUTE for PC calculation + if (op == 0x20) + d.mode = ABS; *out = 0; int len = out_len; if (flags & MII_DUMP_DIS_PC) diff --git a/src/mii_65c02_ops.h b/src/mii_65c02_ops.h index a66a418..73ca68d 100644 --- a/src/mii_65c02_ops.h +++ b/src/mii_65c02_ops.h @@ -189,7 +189,7 @@ const mii_op_t mii_cpu_op[256] = { PCODE_PC(JMP, ABS, 0x4C, 3) PCODE_PC(JMP, IND, 0x6C, 3) PCODE_PC(JMP, IND_AX, 0x7C, 3) - PCODE_PC(JSR, ABS, 0x20, 3) + PCODE___(JSR, IMPLIED, 0x20, 3) PCODE___(LDA, IMM, 0xA9, 2) PCODE_R_(LDA, ZP_REL, 0xA5, 2) PCODE_R_(LDA, ZP_X, 0xB5, 2) diff --git a/src/mii_analog.c b/src/mii_analog.c index 335aa8b..7b87b05 100644 --- a/src/mii_analog.c +++ b/src/mii_analog.c @@ -14,6 +14,15 @@ #include "mii.h" #include "mii_analog.h" +/* + * Analog joystick + * This is fairly easy, as long as the 65c02 respects the proper cycle + * count for all the instruction involved in reading, as it's very cycle + * sensitive. + * the UI fills up the analog values in mii_t, and here we just simulate + * the capacitor decay. + */ + void mii_analog_init( struct mii_t *mii, @@ -37,17 +46,35 @@ mii_analog_access( return; switch (addr) { case 0xc070: { - // multiplying by mii->speed allows reading joystick in 'fast' mode, - // this basically simulate slowing down just for the joystick reading + /* + * No need starting the cycle timers when nobody cares about + * the analog values aka joysticks + */ + if (!a->enabled) { + a->enabled = true; + /* + * No need for a function pointer here for the timer, the + * decrementing value is just what we need, and we're quite + * happy to stop at ~0 as well. + */ + for (int i = 0; i < 4; i++) + a->v[i].timer_id = mii_timer_register(mii, + NULL, NULL, 0, __func__); + } + /* + * Multiplying by mii->speed allows reading joystick in + * 'fast' emulation mode, this basically simulate slowing down + * just for the joystick reading + */ for (int i = 0; i < 4; i++) { - a->v[i].decay = mii->cycles + - ((a->v[i].value * 11) * mii->speed); + mii_timer_set(mii, a->v[i].timer_id, + ((a->v[i].value * 11) * mii->speed)); // printf("joystick %d: %d\n", i, a->v[i].value); } } break; case 0xc064 ... 0xc067: { addr -= 0xc064; - *byte = mii->cycles <= a->v[addr].decay ? 0x80 : 0x00; + *byte = mii_timer_get(mii, a->v[addr].timer_id) > 0 ? 0x80 : 0x00; } break; } } diff --git a/src/mii_analog.h b/src/mii_analog.h index 4f4aab8..3fedb44 100644 --- a/src/mii_analog.h +++ b/src/mii_analog.h @@ -7,14 +7,15 @@ */ #pragma once -#include "mii_types.h" - +#include typedef struct mii_analog_t { struct { uint8_t value; - mii_cycles_t decay; +// mii_cycles_t decay; + uint8_t timer_id; } v[4]; + bool enabled; } mii_analog_t; struct mii_t; diff --git a/src/mii_argv.c b/src/mii_argv.c index c9e59b8..db85c99 100644 --- a/src/mii_argv.c +++ b/src/mii_argv.c @@ -150,7 +150,7 @@ mii_argv_parse( } else if (!strcmp(arg, "-speed") || !strcmp(arg, "--speed")) { if (i < argc-1) { mii->speed = atof(argv[++i]); - if (mii->speed < 0.0) + if (mii->speed <= 0.0) mii->speed = 1.0; } else { printf("mii: missing speed value\n"); @@ -201,4 +201,4 @@ mii_argv_parse( } *index = argc; return 1; -} +} \ No newline at end of file diff --git a/src/mii_bank.c b/src/mii_bank.c index be21ccc..3a3894f 100644 --- a/src/mii_bank.c +++ b/src/mii_bank.c @@ -14,6 +14,16 @@ #include "mii.h" #include "mii_bank.h" +void +mii_bank_init( + mii_bank_t *bank) +{ + if (bank->mem) + return; + bank->mem = calloc(1, bank->size * 256); + bank->alloc = 1; +} + void mii_bank_dispose( mii_bank_t *bank) @@ -39,8 +49,8 @@ mii_bank_write( const uint8_t *data, uint16_t len) { - if ((addr < bank->base) || - ((addr + len) > (uint32_t)(bank->base + (bank->size * 256)))) { + uint32_t end = bank->base + (bank->size << 8); + if (unlikely(addr < bank->base) || unlikely((addr + len) > end)) { printf("%s %s INVALID write addr %04x len %d %04x:%04x\n", __func__, bank->name, addr, (int)len, bank->base, bank->base + (bank->size * 256)); @@ -52,14 +62,10 @@ mii_bank_write( addr, (uint8_t *)data, true)) return; } - if (!bank->mem) { - bank->alloc = 1; - bank->mem = calloc(1, bank->size * 256); - } addr -= bank->base; - for (uint16_t i = 0; i < len; i++, addr++) { - bank->mem[addr] = data[i]; - } + do { + bank->mem[addr++] = *data++; + } while (unlikely(--len)); } void @@ -69,27 +75,25 @@ mii_bank_read( uint8_t *data, uint16_t len) { - if (addr < bank->base || - (addr + len) > (uint32_t)(bank->base + (bank->size * 256))) { + #if 0 // rather expensive test when profiling! + uint32_t end = bank->base + (bank->size << 8); + if (unlikely(addr < bank->base) || unlikely((addr + len) > end)) { printf("%s %s INVALID read addr %04x len %d %04x-%04x\n", __func__, bank->name, addr, (int)len, bank->base, bank->base + (bank->size * 256)); return; } + #endif uint8_t page_index = (addr - bank->base) >> 8; if (bank->access && bank->access[page_index].cb) { if (bank->access[page_index].cb(bank, bank->access[page_index].param, addr, data, false)) return; } - if (!bank->mem) { - bank->alloc = 1; - bank->mem = calloc(1, bank->size * 256); - } addr -= bank->base; - for (uint16_t i = 0; i < len; i++, addr++) { - data[i] = bank->mem[addr]; - } + do { + *data++ = bank->mem[addr++]; + } while (unlikely(--len)); } @@ -113,8 +117,8 @@ mii_bank_install_access_cb( if (!bank->access) { bank->access = calloc(1, bank->size * sizeof(bank->access[0])); } - printf("%s %s install access cb page %02x:%02x\n", - __func__, bank->name, page, end); +// printf("%s %s install access cb page %02x:%02x\n", +// __func__, bank->name, page, end); for (int i = page; i <= end; i++) { bank->access[i].cb = cb; bank->access[i].param = param; diff --git a/src/mii_bank.h b/src/mii_bank.h index 8daa928..0603ee5 100644 --- a/src/mii_bank.h +++ b/src/mii_bank.h @@ -45,6 +45,9 @@ typedef struct mii_bank_t { uint8_t *mem; } mii_bank_t; +void +mii_bank_init( + mii_bank_t *bank); void mii_bank_dispose( mii_bank_t *bank); diff --git a/nuklear/mii_mish.c b/src/mii_mish.c similarity index 90% rename from nuklear/mii_mish.c rename to src/mii_mish.c index 0a9063f..efb03f3 100644 --- a/nuklear/mii_mish.c +++ b/src/mii_mish.c @@ -55,21 +55,18 @@ _mii_mish_cmd( mii_t * mii = param; if (!argv[1]) { show_state: - printf("mii: %s Target speed: %.3fMHz Current: %.3fMHz\n", - state[mii->state], mii->speed, mii->speed_current); + printf("mii: %s Target speed: %.3fMHz\n", + state[mii->state], mii->speed); mii_dump_run_trace(mii); mii_dump_trace_state(mii); - mii_bank_t * main = &mii->bank[MII_BANK_MAIN]; - bool text = !!mii_bank_peek(main, SWTEXT); - bool page2 = !!mii_bank_peek(main, SWPAGE2); - bool col80 = !!mii_bank_peek(main, SW80COL); - bool mixed = !!mii_bank_peek(main, SWMIXED); - bool hires = !!mii_bank_peek(main, SWHIRES); - bool dhires = !!mii_bank_peek(main, SWRDDHIRES); - - printf("text:%d page2:%d col80:%d mixed:%d hires:%d dhires:%d\n", - text, page2, col80, mixed, hires, dhires); + for (int i = 0; mii_sw_names[i]; i++) { + char buf[32]; + sprintf(buf, "%s:%d", mii_sw_names[i], + !!(mii->sw_state & (1 << i))); + printf("%-13.13s%s", buf, !(i % 6) ? "\n" : " "); + } + printf("\n"); return; } if (!strcmp(argv[1], "reset")) { @@ -77,6 +74,10 @@ show_state: return; } if (!strcmp(argv[1], "mem")) { + printf("mii: memory map: "); + for (int i = 0; i < MII_BANK_COUNT; i++) + printf("%0d:%s ", i, mii->bank[i].name); + printf("\n"); for (int i = 0; i < 16; i++) { printf("%02x: ", i * 16); for (int j = 0; j < 16; j++) @@ -104,7 +105,7 @@ show_state: } uint16_t addr = strtol(argv[2], NULL, 16); uint8_t val = strtol(argv[3], NULL, 16); - mii_mem_access(mii, addr, &val, false, true); + mii_mem_access(mii, addr, &val, true, true); return; } if (!strcmp(argv[1], "peek")) { @@ -114,7 +115,7 @@ show_state: } uint16_t addr = strtol(argv[2], NULL, 16); uint8_t val; - mii_mem_access(mii, addr, &val, false, false); + mii_mem_access(mii, addr, &val, false, true); printf("%04x: %02x\n", addr, val); return; } @@ -141,6 +142,17 @@ show_state: printf("mii: terminating\n"); return; } + if (!strcmp(argv[1], "timers")) { + uint64_t timer = mii->timer.map; + printf("mii: %d cycle timers\n", __builtin_popcountll(timer)); + while (timer) { + int i = ffsll(timer) - 1; + timer &= ~(1ull << i); + printf("%2d: %8ld %s\n", i, mii->timer.timers[i].when, + mii->timer.timers[i].name); + } + return; + } printf("mii: unknown command %s\n", argv[1]); } @@ -277,6 +289,10 @@ _mii_mish_step( { if (argv[0][0] == 's') { mii_t * mii = param; + if (mii->state != MII_STOPPED) { + printf("mii: can't step/next, not stopped\n"); + return; + } if (argv[1]) { int n = strtol(argv[1], NULL, 10); mii->trace.step_inst = n; @@ -287,13 +303,17 @@ _mii_mish_step( } if (argv[0][0] == 'n') { mii_t * mii = param; + if (mii->state != MII_STOPPED) { + printf("mii: can't step/next, not stopped\n"); + return; + } // read current opcode, find how how many bytes it take, // then put a temporary breakpoint to the next PC. // all of that if this is not a relative branch of course, in // which case we use a normal 'step' behaviour uint8_t op; mii_mem_access(mii, mii->cpu.PC, &op, false, false); - if (op == 0x20) { + if (op == 0x20) { // JSR here? // set a temp breakpoint on reading 3 bytes from PC for (int i = 0; i < (int)sizeof(mii->debug.bp_map) * 8; i++) { if ((mii->debug.bp_map & (1 << i))) @@ -337,7 +357,9 @@ _mii_mish_audio( { mii_t * mii = param; if (argc < 2) { - printf("audio: missing argument\n"); + printf("audio volume: %.3f multiplier:%.3f muted:%d\n", + mii->speaker.volume, mii->speaker.vol_multiplier, + mii->speaker.muted); return; } if (!strcmp(argv[1], "record")) { diff --git a/nuklear/mii_mish_dd.c b/src/mii_mish_dd.c similarity index 90% rename from nuklear/mii_mish_dd.c rename to src/mii_mish_dd.c index c605f92..1593cf2 100644 --- a/nuklear/mii_mish_dd.c +++ b/src/mii_mish_dd.c @@ -23,6 +23,7 @@ _mii_mish_dd( mii_t * mii = param; if (!argv[1] || !strcmp(argv[1], "list")) { mii_dd_t *d = mii->dd.drive; + printf("dd %p %p drives\n", &mii->dd, mii->dd.drive); printf(" ID %-16s %-20s\n", "Card", "Name"); while (d) { printf("%d:%d %-16s %-20s : %s\n", @@ -42,4 +43,4 @@ MISH_CMD_HELP(dd, "mii: disk commands", " |list: list all disk drives" ); -MII_MISH(dd, _mii_mish_dd); +MII_MISH(dd, _mii_mish_dd); \ No newline at end of file diff --git a/src/mii_slot.h b/src/mii_slot.h index b083b71..cda9ba5 100644 --- a/src/mii_slot.h +++ b/src/mii_slot.h @@ -12,8 +12,8 @@ typedef struct mii_slot_drv_t mii_slot_drv_t; typedef struct mii_slot_t { - uint8_t id; - void * drv_priv; // for driver use + uint8_t aux_rom_selected: 1, id; + void * drv_priv; // for driver use const mii_slot_drv_t * drv; } mii_slot_t; @@ -27,11 +27,24 @@ typedef struct mii_slot_drv_t { uint32_t enable_flag; // if there is a MII_INIT_xxx flag const char * name; const char * desc; - int (*probe)(mii_t * mii, uint32_t flags); - int (*init)(mii_t * mii, struct mii_slot_t *slot); - void (*dispose)(mii_t * mii, struct mii_slot_t *slot); /* optional */ - void (*reset)(mii_t * mii, struct mii_slot_t *slot); /* optional */ - void (*run)(mii_t * mii, struct mii_slot_t *slot); /* optional */ + int (*probe)( + mii_t * mii, + uint32_t flags); + int (*init)( + mii_t * mii, + struct mii_slot_t *slot); + /* optional */ + void (*dispose)( + mii_t * mii, + struct mii_slot_t *slot); + /* optional */ + void (*reset)( + mii_t * mii, + struct mii_slot_t *slot); + void (*run)( + mii_t * mii, + struct mii_slot_t *slot); + // access to the slot's soft switches. uint8_t (*access)( mii_t * mii, struct mii_slot_t *slot, @@ -64,6 +77,8 @@ mii_slot_drv_find( enum { MII_SLOT_DRIVE_COUNT = 0x01, MII_SLOT_DRIVE_LOAD = 0x20, // + drive index 0...n + + MII_SLOT_SSC_SET_TTY = 0x10, // param is a pathname, or NULL for a pty }; // send a command to a slot/driver. Return >=0 if ok, -1 if error diff --git a/src/mii_speaker.c b/src/mii_speaker.c index 73f9016..bc37d41 100644 --- a/src/mii_speaker.c +++ b/src/mii_speaker.c @@ -81,6 +81,11 @@ _alsa_init( } #endif +static uint64_t +_mii_speaker_timer_cb( + mii_t * mii, + void * param ); + // Initialize the speaker with the frame size in samples void mii_speaker_init( @@ -90,32 +95,86 @@ mii_speaker_init( s->mii = mii; s->debug_fd = -1; s->fsize = MII_SPEAKER_FRAME_SIZE; + // disabled at start... + s->timer_id = mii_timer_register(mii, + _mii_speaker_timer_cb, s, 0, __func__); #ifdef HAS_ALSA if (!s->off) _alsa_init(s); // this can/will change fsize #endif - s->vol_multiplier = 0.2; + mii_speaker_volume(s, 1); s->sample = 0x8000; s->findex = 0; for (int i = 0; i < MII_SPEAKER_FRAME_COUNT; i++) s->frame[i].audio = calloc(sizeof(s->frame[i].audio[0]), s->fsize); - s->frame[0].start = mii->cycles; +// s->frame[0].start = mii->cycles; } void mii_speaker_dispose( - mii_speaker_t *speaker) + mii_speaker_t *s) { + s->fsize = 0; + mii_timer_set(s->mii, s->timer_id, 0); #ifdef HAS_ALSA - if (speaker->alsa_pcm) - snd_pcm_close(speaker->alsa_pcm); + if (s->alsa_pcm) + snd_pcm_close(s->alsa_pcm); #endif for (int i = 0; i < MII_SPEAKER_FRAME_COUNT; i++) { - free(speaker->frame[i].audio); - speaker->frame[i].audio = NULL; + free(s->frame[i].audio); + s->frame[i].audio = NULL; } } +// Check to see if there's a new frame to send, send it +// this timer is always running; it keeps checking for non-empty frames +static uint64_t +_mii_speaker_timer_cb( + mii_t * mii, + void * param ) +{ + mii_speaker_t *s = (mii_speaker_t *)param; + + if (s->muted || s->off) + goto done; + mii_audio_frame_t *f = &s->frame[s->fplay]; + // if the frame is empty, we mark the fact we are in underrun, + // so we can restart the audio later on. + if (!f->fill) { + if (s->under < 10) + s->under++; + goto done; + } + s->under = 0; + // Here we got a frame to play, so we play it, and move on to the next + // There's also the case were we stopped playing and the last frame + // wasn't complete, in which case we pad it, and flush it as well +// printf("%s: fplay %d findex %d fsize %d fill %d\n", +// __func__, s->fplay, s->findex, s->fsize, f->fill); + uint16_t sample = f->audio[f->fill - 1] ^ 0xffff; + while (f->fill < s->fsize) + f->audio[f->fill++] = sample; + s->fplay = (s->fplay + 1) % MII_SPEAKER_FRAME_COUNT; + s->frame[s->fplay].fill = 0; + if (!s->muted) { + if (s->debug_fd != -1) + write(s->debug_fd, f->audio, + f->fill * sizeof(s->frame[0].audio[0])); +#ifdef HAS_ALSA + if (s->alsa_pcm) { + int pcm; + if ((pcm = snd_pcm_writei(s->alsa_pcm, + f->audio, f->fill)) == -EPIPE) { + printf("%s Underrun.\n", __func__); + snd_pcm_recover(s->alsa_pcm, pcm, 1); + } + } +#endif + } +done: + return s->fsize * s->clk_per_sample; +} + // Called when $c030 is touched, place a sample at the 'appropriate' time void mii_speaker_click( @@ -126,18 +185,20 @@ mii_speaker_click( s->cpu_speed = s->mii->speed; s->clk_per_sample = ((1000000.0 /* / s->mii->speed */) / (float)MII_SPEAKER_FREQ) + 0.5f; - printf("%s: %d cycles per sample\n", __func__, s->clk_per_sample); + printf("%s: %.2f cycles per sample\n", __func__, s->clk_per_sample); + mii_timer_set(s->mii, s->timer_id, s->fsize * s->clk_per_sample); } + int64_t remains = mii_timer_get(s->mii, s->timer_id); + mii_audio_frame_t *f = &s->frame[s->findex]; // if we had stopped playing for 2 frames, restart - if (f->start == 0 || - (s->mii->cycles - f->start) > (2 * s->fsize * s->clk_per_sample)) { + if (s->under > 1) { + s->under = 0; // printf("Restarting playback\n"); #ifdef HAS_ALSA if (s->alsa_pcm) snd_pcm_prepare(s->alsa_pcm); #endif - f->start = s->mii->cycles - (s->clk_per_sample * 8); f->fill = 0; // add a small attack to the start of the frame to soften the beeps // we are going to flip the sample, so we need to preemptively @@ -146,20 +207,24 @@ mii_speaker_click( for (int i = 8; i >= 1; i--) f->audio[f->fill++] = (attack / i) * s->vol_multiplier; s->fplay = s->findex; // restart here + mii_timer_set(s->mii, s->timer_id, (s->fsize - 16) * s->clk_per_sample); + remains = mii_timer_get(s->mii, s->timer_id); } - - long sample_index = (s->mii->cycles - f->start) / s->clk_per_sample; + // calculate the sample index we are going to fill -- this is relative + // to the frame we are waiting to play + long sample_index = // (s->fsize / 2) + + (((s->fsize * s->clk_per_sample) - remains) / + s->clk_per_sample); // fill from last sample to here with the current sample for (; f->fill < sample_index && f->fill < s->fsize; f->fill++) f->audio[f->fill] = s->sample * s->vol_multiplier; - +// printf("%s: findex %d fsize %d fill %d sample_index %ld\n", +// __func__, s->findex, s->fsize, f->fill, sample_index); // if we've gone past the end of the frame, switch to the next one - if (sample_index >= s->fsize) { + if (sample_index >= s->fsize || sample_index < f->fill) { sample_index = sample_index % s->fsize; - mii_cycles_t newstart = s->mii->cycles - (sample_index * s->clk_per_sample); s->findex = (s->findex + 1) % MII_SPEAKER_FRAME_COUNT; f = &s->frame[s->findex]; - f->start = newstart; f->fill = 0; // fill from start of this frame to newly calculated sample_index for (; f->fill < sample_index && f->fill < s->fsize; f->fill++) @@ -168,50 +233,22 @@ mii_speaker_click( } s->sample ^= 0xffff; // if we are touching a new sample, make sure the next one is clear too. +#if 1 + int32_t mix = s->sample * s->vol_multiplier; +#else + /* Mixing code; in case theres multiple clicks within a sample period. + * This is not used, because it's not really needed, as 2 clicks + * would cancel each others anyway. */ if (!f->audio[sample_index] && sample_index < s->fsize) f->audio[sample_index + 1] = 0; int32_t mix = f->audio[sample_index] + (s->sample * s->vol_multiplier); if (mix > 0x7fff) mix = 0x7fff; else if (mix < -0x8000) mix = -0x8000; +#endif f->audio[sample_index] = mix; } -// Check to see if there's a new frame to send, send it -void -mii_speaker_run( - mii_speaker_t *s) -{ - mii_audio_frame_t *f = &s->frame[s->fplay]; - - // here we check if the frame we want to play is filled, and if it's - // been long enough since we started filling it to be sure we have - // enough samples to play. - // There's also the case were we stopped playing and the last frame - // wasn't complete, in which case we flush it as well - if (f->fill && ((s->mii->cycles - f->start) > - (s->fsize * s->clk_per_sample * 2))) { - s->fplaying = s->fplay; - s->fplay = (s->fplay + 1) % MII_SPEAKER_FRAME_COUNT; - f = &s->frame[s->fplaying]; - if (!s->muted) { - if (s->debug_fd != -1) - write(s->debug_fd, f->audio, - f->fill * sizeof(s->frame[0].audio[0])); -#ifdef HAS_ALSA - if (s->alsa_pcm) { - int pcm; - if ((pcm = snd_pcm_writei(s->alsa_pcm, - f->audio, f->fill)) == -EPIPE) { - printf("%s Underrun.\n", __func__); - snd_pcm_recover(s->alsa_pcm, pcm, 1); - } - } -#endif - } - f->fill = 0; - } -} // this is here so we dont' have to drag in libm math library. double fastPow(double a, double b) { @@ -234,4 +271,4 @@ mii_speaker_volume( s->volume = volume; // printf("audio: speaker volume set to %.3f (%.4f)\n", volume, mul); -} +} \ No newline at end of file diff --git a/src/mii_speaker.h b/src/mii_speaker.h index 37a2a76..4585701 100644 --- a/src/mii_speaker.h +++ b/src/mii_speaker.h @@ -17,13 +17,14 @@ struct snd_pcm_t; typedef int16_t mii_audio_sample_t; typedef struct mii_audio_frame_t { - mii_cycles_t start; +// mii_cycles_t start; uint16_t fill; mii_audio_sample_t * audio; } mii_audio_frame_t; typedef struct mii_speaker_t { struct mii_t * mii; + uint8_t timer_id; // timer id for the audio thread int debug_fd; // if > 0, dump audio to this fd void * alsa_pcm; // alsa pcm handle bool muted; // if true, don't play anything @@ -31,11 +32,11 @@ typedef struct mii_speaker_t { float volume; // volume, 0.0 to 10.0 float vol_multiplier; // sample multiplier, 0.0 to 1.0 float cpu_speed; // CPU speed in MHz, to calculate clk_per_sample + uint8_t under; // number of frames we've skipped uint8_t fplay; // frame we want to play - uint8_t fplaying; // index of the current playing frame uint16_t fsize; // size in samples of a frame uint8_t findex; // frame we are currently filling - uint16_t clk_per_sample; // number of cycles per sample (at current CPU speed) + float clk_per_sample; // number of cycles per sample (at current CPU speed) mii_audio_sample_t sample; // current value for the speaker output mii_audio_frame_t frame[MII_SPEAKER_FRAME_COUNT]; } mii_speaker_t; @@ -53,9 +54,9 @@ void mii_speaker_click( mii_speaker_t *speaker); // Check to see if there's a new frame to send, send it -void -mii_speaker_run( - mii_speaker_t *speaker); +//void +//mii_speaker_run( +// mii_speaker_t *speaker); // volume from 0 to 10, sets the audio sample multiplier. void mii_speaker_volume( diff --git a/src/mii_sw.h b/src/mii_sw.h index a0727c1..1b56843 100644 --- a/src/mii_sw.h +++ b/src/mii_sw.h @@ -85,27 +85,33 @@ enum { B_BSRREAD = (13), B_BSRPAGE2 = (14), B_SWDHIRES = (15), + // this is no 'real' softwitch, but a bit to mention a card has + // it's secondary rom online in pages c800-cfff + B_SLOTAUXROM = (16), - M_SW80STORE = (1 << B_SW80STORE), - M_SWALTCHARSET = (1 << B_SWALTCHARSET), - M_SW80COL = (1 << B_SW80COL), - M_SWTEXT = (1 << B_SWTEXT), - M_SWMIXED = (1 << B_SWMIXED), - M_SWPAGE2 = (1 << B_SWPAGE2), - M_SWHIRES = (1 << B_SWHIRES), - M_SWRAMRD = (1 << B_SWRAMRD), - M_SWRAMWRT = (1 << B_SWRAMWRT), - M_SWINTCXROM = (1 << B_SWINTCXROM), - M_SWALTPZ = (1 << B_SWALTPZ), - M_SWSLOTC3ROM = (1 << B_SWSLOTC3ROM), - M_BSRWRITE = (1 << B_BSRWRITE), - M_BSRREAD = (1 << B_BSRREAD), - M_BSRPAGE2 = (1 << B_BSRPAGE2), - M_SWDHIRES = (1 << B_SWDHIRES), + M_SW80STORE = (1 << B_SW80STORE), + M_SWALTCHARSET = (1 << B_SWALTCHARSET), + M_SW80COL = (1 << B_SW80COL), + M_SWTEXT = (1 << B_SWTEXT), + M_SWMIXED = (1 << B_SWMIXED), + M_SWPAGE2 = (1 << B_SWPAGE2), + M_SWHIRES = (1 << B_SWHIRES), + M_SWRAMRD = (1 << B_SWRAMRD), + M_SWRAMWRT = (1 << B_SWRAMWRT), + M_SWINTCXROM = (1 << B_SWINTCXROM), + M_SWALTPZ = (1 << B_SWALTPZ), + M_SWSLOTC3ROM = (1 << B_SWSLOTC3ROM), + M_BSRWRITE = (1 << B_BSRWRITE), + M_BSRREAD = (1 << B_BSRREAD), + M_BSRPAGE2 = (1 << B_BSRPAGE2), + M_SWDHIRES = (1 << B_SWDHIRES), + M_SLOTAUXROM = (1 << B_SLOTAUXROM), }; +#define __unused__ __attribute__((unused)) + // unused is to prevent the stupid warnings about unused static stuff -static const char __attribute__((unused)) *mii_sw_names[] = { +static const char __unused__ *mii_sw_names[] = { "80STORE", "ALTCHARSET", "80COL", @@ -122,6 +128,7 @@ static const char __attribute__((unused)) *mii_sw_names[] = { "BSRREAD", "BSRPAGE2", "DHIRES", + "AUXROMON", NULL, } ; diff --git a/src/mii_types.h b/src/mii_types.h deleted file mode 100644 index c6a45b1..0000000 --- a/src/mii_types.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * mii_types.h - * - * Copyright (C) 2023 Michel Pollet - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include - -typedef __uint128_t mii_cycles_t; diff --git a/src/mii_video.c b/src/mii_video.c index 1e59b10..7b7c223 100644 --- a/src/mii_video.c +++ b/src/mii_video.c @@ -36,6 +36,8 @@ enum { /* * Colors were lifted from * https://comp.sys.apple2.narkive.com/lTSrj2ZI/apple-ii-colour-rgb + * and + * https://www.mrob.com/pub/xapple2/colors.html */ #define HI_RGB(r,g,b) (0xff000000 | ((r) << 16) | ((g) << 8) | (b)) static const uint32_t lores_colors[] = { @@ -106,7 +108,7 @@ static const uint32_t mono[3][2] = { /* this 'dims' the colors for every second line of pixels */ -#define C_SCANLINE_MASK 0xffc0c0c0 +#define C_SCANLINE_MASK HI_RGB(0xc0, 0xc0, 0xc0) static inline uint16_t _mii_line_to_video_addr( @@ -118,6 +120,14 @@ _mii_line_to_video_addr( ((line >> 6) << 5) | ((line >> 6) << 3); return addr; } + +unsigned char reverse(unsigned char b) { + b = (b & 0b11110000) >> 4 | (b & 0b00001111) << 4; + b = (b & 0b11001100) >> 2 | (b & 0b00110011) << 2; + b = (b & 0b10101010) >> 1 | (b & 0b01010101) << 1; + return b; +} + /* * This is the state of the video output * All timings lifted from https://rich12345.tripod.com/aiivideo/vbl.html @@ -132,19 +142,20 @@ _mii_line_to_video_addr( * static or global. * *everything* before the pt_start call is ran every time, so you can use * that to reload some sort of state, as here, were we reload all the - * video mode softwsitches. + * video mode softswitches. + * + * This function is also a 'cycle timer' it returns the number of 6502 + * cycles to wait until being called again, so it mostly returns the + * number of cycles until the next horizontal blanking between each lines, + * but also the number of cycles until the next vertical blanking once + * the last line is drawn. */ -void -mii_video_run( - mii_t *mii) +static uint64_t +mii_video_timer_cb( + mii_t *mii, + void *param) { - // no need to do anything, we're waiting cycles - if (mii->video.wait) { - if (mii->video.wait > mii->cycles) - return; - // extra cycles we waited are kept around for next delay - mii->video.wait = mii->cycles - mii->video.wait; - } + uint64_t res = MII_VIDEO_H_CYCLES * mii->speed; mii_bank_t * main = &mii->bank[MII_BANK_MAIN]; bool text = SW_GETSTATE(mii, SWTEXT); bool page2 = SW_GETSTATE(mii, SWPAGE2); @@ -179,14 +190,15 @@ mii_video_run( mii_bank_t * aux = &mii->bank[MII_BANK_AUX]; if (reg == 0 || mii->video.color_mode != MII_VIDEO_COLOR) { - for (int x = 0; x < 40; x += 1) { + const uint32_t clut[2] = { + mono[mii->video.color_mode][0], + mono[mii->video.color_mode][1] }; + for (int x = 0; x < 40; x++) { uint32_t ext = (mii_bank_peek(aux, a + x) & 0x7f) | ((mii_bank_peek(main, a + x) & 0x7f) << 7); for (int bi = 0; bi < 14; bi++) { uint8_t pixel = (ext >> bi) & 1; - uint32_t col = pixel ? - mono[mii->video.color_mode][1] : - mono[mii->video.color_mode][0]; + uint32_t col = clut[pixel]; *screen++ = col; *l2++ = col & C_SCANLINE_MASK; } @@ -233,8 +245,8 @@ mii_video_run( uint16_t run = ((b0 & 0x60) >> ( 5 )) | ((b1 & 0x7f) << ( 2 )) | ((b2 & 0x03) << ( 9 )); - int odd = (x & 1) << 1; - int offset = (b1 & 0x80) >> 5; + int odd = (x & 1) << 1; + int offset = (b1 & 0x80) >> 5; if (mii->video.color_mode == MII_VIDEO_COLOR) { for (int i = 0; i < 7; i++) { @@ -263,9 +275,7 @@ mii_video_run( } else { for (int i = 0; i < 7; i++) { uint8_t pixel = (run >> (2 + i)) & 1; - uint32_t col = pixel ? - mono[mii->video.color_mode][1] : - mono[mii->video.color_mode][0]; + uint32_t col = mono[mii->video.color_mode][pixel]; *screen++ = col; *screen++ = col; *l2++ = col & C_SCANLINE_MASK; @@ -298,9 +308,7 @@ mii_video_run( uint8_t bits = rom[mii->video.line & 0x07]; for (int pi = 0; pi < 7; pi++) { uint8_t pixel = (bits >> pi) & 1; - uint32_t col = pixel ? - mono[mii->video.color_mode][0] : - mono[mii->video.color_mode][1]; + uint32_t col = mono[mii->video.color_mode][!pixel]; *screen++ = col; *l2++ = col & C_SCANLINE_MASK; if (!col80) { @@ -326,25 +334,20 @@ mii_video_run( mii->video.line++; if (mii->video.line == 192) { mii->video.line = 0; - mii->video.wait = mii->cycles - mii->video.wait + - MII_VIDEO_H_CYCLES * mii->speed; + res = MII_VIDEO_H_CYCLES * mii->speed; pt_yield(mii->video.state); mii_bank_poke(main, SWVBL, 0x00); - if (mii->video.vbl_irq) - mii->cpu_state.irq = 1; - mii->video.wait = mii->cycles - mii->video.wait + - MII_VBL_UP_CYCLES * mii->speed; + res = MII_VBL_UP_CYCLES * mii->speed; mii->video.frame_count++; pt_yield(mii->video.state); } else { - mii->video.wait = mii->cycles - mii->video.wait + - (MII_VIDEO_H_CYCLES + MII_VIDEO_HB_CYCLES) * + res = (MII_VIDEO_H_CYCLES + MII_VIDEO_HB_CYCLES) * mii->speed; pt_yield(mii->video.state); } } while (1); pt_end(mii->video.state); - return; + return res; } bool @@ -418,3 +421,11 @@ mii_access_video( } return res; } + +void +mii_video_init( + mii_t *mii) +{ + mii->video.timer_id = mii_timer_register(mii, + mii_video_timer_cb, NULL, MII_VIDEO_H_CYCLES, __func__); +} \ No newline at end of file diff --git a/src/mii_video.h b/src/mii_video.h index 1be80df..fc6d14a 100644 --- a/src/mii_video.h +++ b/src/mii_video.h @@ -8,18 +8,15 @@ #pragma once -#include "mii_types.h" +#include +#include // TODO move VRAM stuff to somewhere else -/* - These are currently way bigger than needed, because they need to be - a power of two to easily map to an opengl texture. - */ -#define MII_VRAM_WIDTH 1024 -#define MII_VRAM_HEIGHT 512 - #define MII_VIDEO_WIDTH (280 * 2) #define MII_VIDEO_HEIGHT (192 * 2) +// in case padding is needed, these can be changed +#define MII_VRAM_WIDTH (MII_VIDEO_WIDTH * 4) +#define MII_VRAM_HEIGHT MII_VIDEO_HEIGHT enum { MII_VIDEO_COLOR = 0, @@ -30,14 +27,13 @@ enum { struct mii_t; typedef struct mii_video_t { - void * state; // protothread state in mii_video.c - uint8_t line; // current line - bool vbl_irq; // VBL IRQ emabled (set by mouse card) - mii_cycles_t wait; // 'wait until' cycle marker - uint32_t pixels[MII_VRAM_WIDTH * MII_VRAM_HEIGHT]; - uint32_t frame_count; // incremented every frame - uint32_t frame_drawn; - uint8_t color_mode; // color, green, amber + void * state; // protothread state in mii_video.c + uint8_t timer_id; // timer id for the video thread + uint8_t line; // current line + uint32_t pixels[MII_VRAM_WIDTH * MII_VRAM_HEIGHT]; + uint32_t frame_count; // incremented every frame + uint32_t frame_drawn; + uint8_t color_mode; // color, green, amber } mii_video_t; bool @@ -47,7 +43,7 @@ mii_access_video( uint8_t * byte, bool write); void -mii_video_run( - struct mii_t *mii); +mii_video_init( + mii_t *mii); diff --git a/src/roms/mii_rom_scc_3410065a.bin b/src/roms/mii_rom_scc_3410065a.bin new file mode 100644 index 0000000..2c94c9b Binary files /dev/null and b/src/roms/mii_rom_scc_3410065a.bin differ diff --git a/test/mii_cpu_test.c b/test/mii_cpu_test.c index 52f0318..75fa74d 100644 --- a/test/mii_cpu_test.c +++ b/test/mii_cpu_test.c @@ -33,7 +33,7 @@ _run_one_dump_state( // display the S flags static const char *s_flags = "CZIDBRVN"; for (int i = 0; i < 8; i++) - printf("%c", cpu->P.P[i] ? s_flags[i] : tolower(s_flags[i])); + printf("%c", MII_GET_P_BIT(cpu, i) ? s_flags[i] : tolower(s_flags[i])); if (s.sync) { mii_op_t d = mii_cpu_op[cpu->ram[cpu->PC]]; printf(" "); @@ -42,7 +42,7 @@ _run_one_dump_state( MII_DUMP_DIS_PC | MII_DUMP_DIS_DUMP_HEX); printf("%s", dis); if (d.desc.branch) { - if (cpu->P.P[d.desc.s_bit] == d.desc.s_bit_value) + if (MII_GET_P_BIT(cpu, d.desc.s_bit) == d.desc.s_bit_value) printf(" ; taken"); } printf("\n"); @@ -77,7 +77,7 @@ _run_one_test( if (verbose) { // cpu.debug = _run_one_dump_state; } - cpu.P.P[5] = 1; + cpu.P._R = 1; cpu.S = 0xFF; cpu.PC = p.org; cpu.A = 0x01; @@ -145,7 +145,7 @@ _run_this_one( mii_cpu_state_t s = {0}; verbose += p.verbose; cpu.ram = ram; - cpu.P.P[B_X] = 1; + cpu.P._R = 1; expected_flags |= (1 << B_X); cpu.S = 0xFF; cpu.PC = p.org; @@ -162,9 +162,10 @@ _run_this_one( int err = 0; static const char *s_flags = "CZIDBRVN"; for (int i = 0; i < 8; i++) - if (cpu.P.P[i] != ((expected_flags >> i) & 1)) { + if (MII_GET_P_BIT(&cpu, i) != ((expected_flags >> i) & 1)) { printf("** S bit %c mismatch %d want %d\n", - s_flags[i], cpu.P.P[i], (expected_flags >> i) & 1); + s_flags[i], MII_GET_P_BIT(&cpu, i), + (expected_flags >> i) & 1); err++; } if (err) @@ -225,6 +226,12 @@ static char * doSED_ADC(uint8_t a, uint8_t b) { #include int main() { + printf("Sizeof mii_op_desc_t %d\n", (int)sizeof(mii_op_desc_t)); + printf("Sizeof mii_op_t %d\n", (int)sizeof(mii_op_t)); + printf("Sizeof mii_cpu_t %d\n", (int)sizeof(mii_cpu_t)); + printf("Sizeof mii_cpu_state_t %d\n", (int)sizeof(mii_cpu_state_t)); + printf("Sizeof mii_cpu_op %d\n", (int)sizeof(mii_cpu_op)); + glob_t globbuf; glob("test/asm/0*.asm", 0, NULL, &globbuf); for (int i = 0; i < (int)globbuf.gl_pathc; i++) { @@ -249,6 +256,17 @@ int main() V = (1 << B_V), N = (1 << B_N), }; + // https://github.com/AppleWin/AppleWin/issues/1257 + _run_one_test( + "; Test of JSR *in* the stack\n" + " .org $0100\n" + " jmp test\n" + "pass: .org $0155\n" + "test: .org $0178\n" + " LDX #$7D\n" + " TXS\n" + " JSR $1355\n", + 0); _run_this("RMB $12", " lda #$FF\n" " sta $12\n" @@ -348,7 +366,7 @@ int main() 0x3F, C, 0); _run_this("SBC ($12) SED", indirect("SEC\n SED", 0x75, 0x25, "SBC ($12)"), - 0x50, C | D, 0); + 0x50, C | D | V, 0); _run_this("STA ($12)", indirect("", 0xF1, 0xC0, "STA ($12)\n LDA $3001"), 0xF1, N, 0); @@ -439,9 +457,7 @@ int main() _run_this("SED ADC 99", doSED_ADC(0x99, 0), 0x99, N | D, 0); _run_this("SED ADC 99", doSED_ADC(0x99, 1), 0x00, C | D, 0); _run_this("SED ADC BD", doSED_ADC(0xBD, 0), 0x23, C | D, 0); - -#if 0 -// _run_this("SED ADC FF", doSED_ADC(0xFF, 0), 0x65, C | D | N, 0); + _run_this("SED ADC FF", doSED_ADC(0xFF, 0), 0x65, C | D , 0); _run_this("SED ADC 0,1", doSED_ADC(0, 1), 0x01, D, 0); _run_this("SED ADC 0,9", doSED_ADC(0, 9), 0x09, D, 0); @@ -449,15 +465,15 @@ int main() _run_this("SED ADC 0,1D", doSED_ADC(0, 0x1D), 0x23, D, 0); _run_this("SED ADC 0,99", doSED_ADC(0, 0x99), 0x99, N | D, 0); _run_this("SED ADC 0,BD", doSED_ADC(0, 0xBD), 0x23, C | D, 0); -// _run_this("SED ADC 0,FF", doSED_ADC(0, 0xFF), 0x65, C | D, 0); + _run_this("SED ADC 0,FF", doSED_ADC(0, 0xFF), 0x65, C | D, 0); - _run_this("SED ADC 99,1", doSED_ADC(0x99, 1), 0x0, Z | C | D, 0); + _run_this("SED ADC 99,1", doSED_ADC(0x99, 1), 0x0, C | D, 0); _run_this("SED ADC 35,35", doSED_ADC(0x35, 0x35), 0x70, D, 0); _run_this("SED ADC 45,45", doSED_ADC(0x45, 0x45), 0x90, N | V | D, 0); - _run_this("SED ADC 50,50", doSED_ADC(0x50, 0x50), 0x0, V | Z | C | D, 0); + _run_this("SED ADC 50,50", doSED_ADC(0x50, 0x50), 0x0, V | C | D, 0); _run_this("SED ADC 99,99", doSED_ADC(0x99, 0x99), 0x98, N | V | C | D, 0); -// _run_this("SED ADC B1,C1", doSED_ADC(0xB1, 0xC1), 0xD2, N | V | C | D, 0); -#endif + _run_this("SED ADC B1,C1", doSED_ADC(0xB1, 0xC1), 0xD2, N | V | C | D, 0); + // create an emulator, load the binary file 6502_functional_test.bin at $0000 // and run it until we hit a BRK const char *bigtest[] = { @@ -479,8 +495,8 @@ int main() mii_cpu_state_t s = {0}; cpu.ram = ram; // cpu.debug = _run_one_dump_state; - cpu.P.P[B_X] = 1; - cpu.P.P[B_I] = 1; + cpu.P._R = 1; + cpu.P.I = 1; cpu.S = 0xFF; cpu.PC = 0x400; cpu.A = 0x00; @@ -495,11 +511,15 @@ int main() if (cpu.PC == prev_pc) { same_pc_count++; if (same_pc_count > 3) { - printf("TEST %s: FAIL (stuck at %04X)\n", - bigtest[ti], cpu.PC); - _run_one_dump_state(&cpu, s, NULL); - printf(" Failed instruction is %c%c%c\n", - cpu.A, cpu.X, cpu.Y); + if (ram[cpu.PC] == 0x4c) + printf("TEST %s: PASS\n", bigtest[ti]); + else { + printf("TEST %s: FAIL (stuck at %04X)\n", + bigtest[ti], cpu.PC); + _run_one_dump_state(&cpu, s, NULL); + printf(" Failed instruction is %c%c%c\n", + cpu.A, cpu.X, cpu.Y); + } break; } } else { @@ -508,7 +528,7 @@ int main() } } // if (s.sync) - _run_one_dump_state(&cpu, s, NULL); + // _run_one_dump_state(&cpu, s, NULL); } while (count--); printf("TEST run with %d spare\n", count); _run_one_dump_state(&cpu, s, NULL); diff --git a/ui_gl/mii_emu_gl.c b/ui_gl/mii_emu_gl.c new file mode 100644 index 0000000..d541f6f --- /dev/null +++ b/ui_gl/mii_emu_gl.c @@ -0,0 +1,1008 @@ +/* + * mii_emu_gl.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ +#define _GNU_SOURCE // for asprintf +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mii_mui.h" +#include "mish.h" +#include "mii_thread.h" + +#include "mii_mui.h" +#include "mii-icon-64.h" +#include "minipt.h" + +/* + * Note: This *assumes* that the GL implementation has support for non-power-of-2 + * textures, which is not a given for older implementations. However, I think + * (by 2024) that's a safe assumption. + */ +#define WINDOW_WIDTH 1280 +#define WINDOW_HEIGHT 720 + + +typedef struct mii_gl_tex_t { + c2_rect_t frame; + GLuint id; +} mii_gl_tex_t; + +typedef struct mii_x11_t { + mii_mui_t video; + pthread_t cpu_thread; + + mui_drawable_t dr; // drawable + + union { + struct { + mii_gl_tex_t mii_tex, mui_tex; + }; + mii_gl_tex_t tex[2]; + }; + + c2_rect_t video_frame; // current video frame + float mui_alpha; + void * transision_state; + struct { + mui_time_t start, end; + c2_rect_t from, to; + } transition; + + Cursor cursor; + Display * dpy; + Window win; + long last_button_click; + struct { + int ungrab, grab, grabbed, down; + c2_pt_t pos; + } mouse; + mui_event_t key; + + XVisualInfo * vis; + Colormap cmap; + XSetWindowAttributes swa; + XWindowAttributes attr; + GLXFBConfig fbc; + Atom wm_delete_window; + int width, height; + GLXContext glContext; +} mii_x11_t; + + +static int gl_err = 0; +static int gl_error_handler( + Display *dpy, + XErrorEvent *ev) +{ + gl_err = true; + return 0; +} + +#define die(_w) { fprintf(stderr,"%s\n",_w); exit(1); } + +static int +has_gl_extension( + const char *string, + const char *ext) +{ + if (!string || !ext) + return false; + int l = strlen(ext); + while (*string) { + char * gotit = strstr((const char *)string, ext); + if (!gotit) + return false; + if (gotit && (gotit[l] == ' ' || gotit[l] == '\0')) + return true; + string += l; + } + return false; +} + +c2_rect_t +c2_rect_interpolate( + c2_rect_t *a, + c2_rect_t *b, + float t) +{ + c2_rect_t r = {}; + r.l = 0.5 + a->l + (b->l - a->l) * t; + r.r = 0.5 + a->r + (b->r - a->r) * t; + r.t = 0.5 + a->t + (b->t - a->t) * t; + r.b = 0.5 + a->b + (b->b - a->b) * t; + return r; +} + +static c2_rect_t +_mii_get_video_position( + mii_x11_t * ui, + bool ui_visible ) +{ + c2_rect_t r = C2_RECT(0, 0, MII_VIDEO_WIDTH, MII_VIDEO_HEIGHT); + if (ui_visible) { + float fac = (ui->attr.height - 38) / (float)MII_VIDEO_HEIGHT; + c2_rect_scale(&r, fac); + c2_rect_offset(&r, + (ui->attr.width / 2) - (c2_rect_width(&r) / 2), 36); + } else { + float fac = (ui->attr.height) / (float)MII_VIDEO_HEIGHT; + c2_rect_scale(&r, fac); + c2_rect_offset(&r, + (ui->attr.width / 2) - (c2_rect_width(&r) / 2), + (ui->attr.height / 2) - (c2_rect_height(&r) / 2)); + c2_rect_inset(&r, 10, 10); + } + return r; +} + +static void +_mii_transition( + mii_x11_t * ui ) +{ + pt_start(ui->transision_state); + + while (ui->video.transition == MII_MUI_TRANSITION_NONE) + pt_yield(ui->transision_state); + + ui->transition.start = mui_get_time(); + ui->transition.end = ui->transition.start + (MUI_TIME_SECOND / 2); + ui->transition.from = ui->video_frame; + + switch (ui->video.transition) { + case MII_MUI_TRANSITION_HIDE_UI: + ui->transition.to = _mii_get_video_position(ui, false); + ui->video.mui_visible = true; + break; + case MII_MUI_TRANSITION_SHOW_UI: + ui->transition.to = _mii_get_video_position(ui, true); + ui->video.mui_visible = true; + break; + } + while (1) { + mui_time_t now = mui_get_time(); + float t = (now - ui->transition.start) / + (float)(ui->transition.end - ui->transition.start); + if (t >= 1.0f) + break; + switch (ui->video.transition) { + case MII_MUI_TRANSITION_HIDE_UI: + ui->mui_alpha = 1.0f - t; + break; + case MII_MUI_TRANSITION_SHOW_UI: + ui->mui_alpha = t; + break; + } + ui->video_frame = c2_rect_interpolate( + &ui->transition.from, &ui->transition.to, t); + pt_yield(ui->transision_state); + } + switch (ui->video.transition) { + case MII_MUI_TRANSITION_HIDE_UI: + ui->video.mui_visible = false; + ui->mui_alpha = 0.0f; + break; + case MII_MUI_TRANSITION_SHOW_UI: + ui->mui_alpha = 1.0f; + break; + } + ui->video.transition = MII_MUI_TRANSITION_NONE; + + pt_end(ui->transision_state); +} + +/* + * xmodmap -pke or -pk will print the list of keycodes + */ +static bool +_mii_x11_convert_keycode( + mii_x11_t *ui, + KeySym sym, + mui_event_t *out ) +{ + switch (sym) { + case XK_F1 ... XK_F12: + out->key.key = MUI_KEY_F1 + (sym - XK_F1); + break; + case XK_Escape: out->key.key = MUI_KEY_ESCAPE; break; + case XK_Left: out->key.key = MUI_KEY_LEFT; break; + case XK_Up: out->key.key = MUI_KEY_UP; break; + case XK_Right: out->key.key = MUI_KEY_RIGHT; break; + case XK_Down: out->key.key = MUI_KEY_DOWN; break; + // XK_Begin + case XK_Insert: out->key.key = MUI_KEY_INSERT; break; + case XK_Home: out->key.key = MUI_KEY_HOME; break; + case XK_End: out->key.key = MUI_KEY_END; break; + case XK_Page_Up: out->key.key = MUI_KEY_PAGEUP; break; + case XK_Page_Down: out->key.key = MUI_KEY_PAGEDOWN; break; + + case XK_Shift_R: out->key.key = MUI_KEY_RSHIFT; break; + case XK_Shift_L: out->key.key = MUI_KEY_LSHIFT; break; + case XK_Control_R: out->key.key = MUI_KEY_RCTRL; break; + case XK_Control_L: out->key.key = MUI_KEY_LCTRL; break; + case XK_Alt_L: out->key.key = MUI_KEY_LALT; break; + case XK_Alt_R: out->key.key = MUI_KEY_RALT; break; + case XK_Super_L: out->key.key = MUI_KEY_LSUPER; break; + case XK_Super_R: out->key.key = MUI_KEY_RSUPER; break; + default: + out->key.key = sym & 0xff; + break; + } +// printf("%s %08x to %04x\n", __func__, sym, out->key.key); + return true; +} + +static int +mii_x11_init( + struct mii_x11_t *ui ) +{ + mui_t * mui = &ui->video.mui; + + if (!setlocale(LC_ALL,"") || + !XSupportsLocale() || + !XSetLocaleModifiers("@im=none")) + return -1; + + ui->dpy = XOpenDisplay(NULL); + if (!ui->dpy) + die("Failed to open X display\n"); + { + /* check glx version */ + int glx_major, glx_minor; + if (!glXQueryVersion(ui->dpy, &glx_major, &glx_minor)) + die("[X11]: Error: Failed to query OpenGL version\n"); + if ((glx_major == 1 && glx_minor < 3) || (glx_major < 1)) + die("[X11]: Error: Invalid GLX version!\n"); + } + { + /* find and pick matching framebuffer visual */ + int fb_count; + static const GLint attr[] = { + GLX_X_RENDERABLE, True, + GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, + GLX_RENDER_TYPE, GLX_RGBA_BIT, + GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR, + GLX_RED_SIZE, 8, + GLX_GREEN_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_ALPHA_SIZE, 8, + None + }; + GLXFBConfig *fbc = glXChooseFBConfig(ui->dpy, + DefaultScreen(ui->dpy), attr, &fb_count); + if (!fbc) + die("[X11]: Error: failed to retrieve framebuffer configuration\n"); + { + /* pick framebuffer with most samples per pixel */ + int fb_best = -1, best_num_samples = -1; + for (int i = 0; i < fb_count; ++i) { + XVisualInfo *vi = glXGetVisualFromFBConfig(ui->dpy, fbc[i]); + if (vi) { + int sample_buffer, samples; + glXGetFBConfigAttrib(ui->dpy, fbc[i], + GLX_SAMPLE_BUFFERS, &sample_buffer); + glXGetFBConfigAttrib(ui->dpy, fbc[i], + GLX_SAMPLES, &samples); + if ((fb_best < 0) || + (sample_buffer && samples > best_num_samples)) + fb_best = i, best_num_samples = samples; + XFree(vi); + } + } + ui->fbc = fbc[fb_best]; + XFree(fbc); + ui->vis = glXGetVisualFromFBConfig(ui->dpy, ui->fbc); + } + } + { + /* create window */ + ui->cmap = XCreateColormap(ui->dpy, + RootWindow(ui->dpy, ui->vis->screen), + ui->vis->visual, AllocNone); + ui->swa.colormap = ui->cmap; + ui->swa.background_pixmap = None; + ui->swa.border_pixel = 0; + ui->swa.event_mask = + ExposureMask | KeyPressMask | KeyReleaseMask | + ButtonPress | ButtonReleaseMask | ButtonMotionMask | + Button1MotionMask | Button3MotionMask | + Button4MotionMask | Button5MotionMask | + PointerMotionMask | StructureNotifyMask | FocusChangeMask; + ui->win = XCreateWindow(ui->dpy, + RootWindow(ui->dpy, ui->vis->screen), 0, 0, + WINDOW_WIDTH, WINDOW_HEIGHT, 0, ui->vis->depth, InputOutput, + ui->vis->visual, + CWBorderPixel | CWColormap | CWEventMask, + &ui->swa); + if (!ui->win) + die("[X11]: Failed to create window\n"); + XFree(ui->vis); + { + char title[128]; + sprintf(title, "MII //e Emulator"); + char *telnet = getenv("MISH_TELNET_PORT"); + if (telnet) + sprintf(title + strlen(title), " (telnet port %s)", telnet); + else + sprintf(title + strlen(title), " (telnet disabled)"); + XStoreName(ui->dpy, ui->win, title); + } + { + Atom net_wm_icon_atom = XInternAtom(ui->dpy, "_NET_WM_ICON", False); + XChangeProperty(ui->dpy, ui->win, net_wm_icon_atom, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)mii_icon64, sizeof(mii_icon64) / sizeof(mii_icon64[0])); + XFlush(ui->dpy); + } + XMapWindow(ui->dpy, ui->win); + ui->wm_delete_window = XInternAtom(ui->dpy, "WM_DELETE_WINDOW", False); + XSetWMProtocols(ui->dpy, ui->win, &ui->wm_delete_window, 1); + } + /* create invisible cursor */ + { + static XColor dummy; char data[1] = {0}; + Pixmap blank = XCreateBitmapFromData(ui->dpy, ui->win, data, 1, 1); + if (blank == None) return 0; + ui->cursor = XCreatePixmapCursor(ui->dpy, blank, blank, &dummy, &dummy, 0, 0); + XFreePixmap(ui->dpy, blank); + } + { + /* create opengl context */ + typedef GLXContext (*glxCreateContext)( + Display *, GLXFBConfig, GLXContext, Bool, const int *); + int (*old_handler)(Display *, XErrorEvent *) = + XSetErrorHandler(gl_error_handler); + const char *extensions_str = glXQueryExtensionsString( + ui->dpy, DefaultScreen(ui->dpy)); + glxCreateContext create_context = (glxCreateContext) + glXGetProcAddressARB((const GLubyte *)"glXCreateContextAttribsARB"); + + gl_err = false; + if (!has_gl_extension(extensions_str, "GLX_ARB_create_context") || + !create_context) { + fprintf(stdout, "[X11]: glXCreateContextAttribARB() not found...\n"); + fprintf(stdout, "[X11]: ... using old-style GLX context\n"); + ui->glContext = glXCreateNewContext(ui->dpy, ui->fbc, GLX_RGBA_TYPE, 0, True); + } else { + GLint attr[] = { + GLX_CONTEXT_MAJOR_VERSION_ARB, 2, + GLX_CONTEXT_MINOR_VERSION_ARB, 2, + None + }; + ui->glContext = create_context(ui->dpy, ui->fbc, 0, True, attr); + XSync(ui->dpy, False); + if (gl_err || !ui->glContext) { + attr[1] = 1; + attr[3] = 0; + gl_err = false; + fprintf(stdout, "[X11] Failed to create OpenGL 3.0 context\n"); + fprintf(stdout, "[X11] ... using old-style GLX context!\n"); + ui->glContext = create_context(ui->dpy, ui->fbc, 0, True, attr); + } + } + XSync(ui->dpy, False); + XSetErrorHandler(old_handler); + if (gl_err || !ui->glContext) + die("[X11]: Failed to create an OpenGL context\n"); + glXMakeCurrent(ui->dpy, ui->win, ui->glContext); + } + { // create the MUI 'screen' at the window size + mui_pixmap_t* pix = &ui->dr.pix; + pix->size.y = WINDOW_HEIGHT; + pix->size.x = WINDOW_WIDTH; + pix->row_bytes = WINDOW_WIDTH * 4; + pix->bpp = 32; + pix->pixels = malloc(pix->row_bytes * WINDOW_HEIGHT * (pix->bpp / 8)); + mui->screen_size = pix->size; + } + { + XGetWindowAttributes(ui->dpy, ui->win, &ui->attr); + ui->mui_alpha = 1.0f; + ui->video.mui_visible = true; + ui->video_frame = _mii_get_video_position(ui, ui->video.mui_visible); + } + return 0; +} + +static void +mii_x11_update_mouse_card( + mii_x11_t * ui) +{ + mii_t * mii = &ui->video.mii; + mui_t * mui = &ui->video.mui; + /* + * We can grab the mouse if it is enabled by the driver, it is in the + * video frame, and there is no active MUI windows (or menus). + */ + if (mii->mouse.enabled && + c2_rect_contains_pt(&ui->video_frame, &ui->mouse.pos) && + !(ui->video.mui_visible && mui_has_active_windows(mui))) { + if (!ui->mouse.grabbed) { + ui->mouse.grab = 1; + ui->mouse.grabbed = 1; + // printf("Grab mouse\n"); + } + } else { + if (ui->mouse.grabbed) { + ui->mouse.ungrab = 1; + ui->mouse.grabbed = 0; + // printf("Ungrab mouse\n"); + } + } + if (!ui->mouse.grabbed) + return; + double x = ui->mouse.pos.x - ui->video_frame.l; + double y = ui->mouse.pos.y - ui->video_frame.t; + // get mouse button state + int button = ui->mouse.down; + // clamp coordinates inside bounds + double vw = c2_rect_width(&ui->video_frame); + double vh = c2_rect_height(&ui->video_frame); + double mw = mii->mouse.max_x - mii->mouse.min_x; + double mh = mii->mouse.max_y - mii->mouse.min_y; + // normalize mouse coordinates + mii->mouse.x = mii->mouse.min_x + (x * mw / vw) + 0.5; + mii->mouse.y = mii->mouse.min_y + (y * mh / vh) + 0.5; + mii->mouse.button = button; +} + +static int +mii_x11_handle_event( + mii_x11_t * ui, + XEvent *evt) +{ + int quit = 0; + + /* We don't actually 'grab' as in warp the pointer, we just show/hide it + * dynamically when we enter/leave the video rectangle */ + if (ui->mouse.grab) { + XDefineCursor(ui->dpy, ui->win, ui->cursor); + ui->mouse.grab = 0; + } else if (ui->mouse.ungrab) { + XUndefineCursor(ui->dpy, ui->win); + ui->mouse.ungrab = 0; + } + mui_t * mui = &ui->video.mui; + mii_t * mii = &ui->video.mii; + switch (evt->type) { + case FocusIn: + case FocusOut: + // printf("%s focus %d\n", __func__, evt->type == FocusIn); + /* This prevents 'stale' modifiers keys when the emulator is + * in front and we switches window/desktop with a modifier on.. + * this used to trigger 'phantom' modifiers still being 'on' */ + mui->modifier_keys = 0; + break; + case KeyRelease: + case KeyPress: { + int ret, down = (evt->type == KeyPress); + KeySym *code = XGetKeyboardMapping(ui->dpy, ( + KeyCode)evt->xkey.keycode, 1, &ret); + ui->key.type = down ? MUI_EVENT_KEYDOWN : MUI_EVENT_KEYUP; + ui->key.key.up = 0; + bool handled = false; + bool converted = _mii_x11_convert_keycode(ui, *code, &ui->key); + bool is_modifier = ui->key.key.key >= MUI_KEY_MODIFIERS && + ui->key.key.key <= MUI_KEY_MODIFIERS_LAST; + if (converted) { + // convert keycodes into a bitfields of current modifiers + if (ui->key.key.key >= MUI_KEY_MODIFIERS && + ui->key.key.key <= MUI_KEY_MODIFIERS_LAST) { + if (down) + mui->modifier_keys |= (1 << (ui->key.key.key - MUI_KEY_MODIFIERS)); + else + mui->modifier_keys &= ~(1 << (ui->key.key.key - MUI_KEY_MODIFIERS)); + } + ui->key.modifiers = mui->modifier_keys; + switch (ui->key.key.key) { + case MUI_KEY_RSUPER: + case MUI_KEY_LSUPER: { + int apple = ui->key.key.key - MUI_KEY_RSUPER; + mii_bank_t *bank = &mii->bank[MII_BANK_MAIN]; + uint8_t old = mii_bank_peek(bank, 0xc061 + apple); + mii_bank_poke(bank, 0xc061 + apple, down ? 0x80 : 0); + if (!!down != !!old) { + // printf("Apple %s %s\n", apple ? "Open" : "Close", + // down ? "down" : "up"); + } + } break; + } + handled = mui_handle_event(mui, &ui->key); + // if not handled and theres a window visible, assume + // it's a dialog and it OUGHT to eat the key + if (!handled) + handled = mui_window_front(mui) != NULL; + // printf("%s key handled %d\n", __func__, handled); + } + if (!handled && down && !is_modifier) { + uint16_t mii_key = ui->key.key.key; + char buf[32] = ""; + KeySym keysym = 0; + if (XLookupString((XKeyEvent*)evt, buf, 32, &keysym, NULL) != NoSymbol) { + #if 0 + printf(" lookup sym %04x %d:", (int)keysym, (int)strlen(buf)); + for (int i = 0; i < (int)strlen(buf); i++) + printf(" %02x", buf[i]); + printf("\n"); + #endif + mii_key = buf[0]; + } + switch (mii_key) { + case MUI_KEY_DOWN: mii_key = 'J' - 'A' + 1; break; + case MUI_KEY_UP: mii_key = 'K' - 'A' + 1; break; + case MUI_KEY_RIGHT: mii_key = 'U' - 'A' + 1; break; + case MUI_KEY_LEFT: mii_key = 'H' - 'A' + 1; break; + } + // printf("key %04x %4x\n", mii_key, mui->modifier_keys); + mii_keypress(mii, mii_key); + } + XFree(code); + } break; + case ButtonPress: + case ButtonRelease: { + // printf("%s %s button %d grabbed:%d\n", __func__, + // evt->type == ButtonPress ? "Down":"Up ", + // evt->xbutton.button, ui->mouse.grabbed); + switch (evt->xbutton.button) { + case Button1: { + ui->mouse.down = evt->type == ButtonPress; + ui->mouse.pos.x = evt->xbutton.x; + ui->mouse.pos.y = evt->xbutton.y; + if (ui->video.mui_visible) { + mui_event_t ev = { + .type = ui->mouse.down ? + MUI_EVENT_BUTTONDOWN : + MUI_EVENT_BUTTONUP, + .mouse.where = ui->mouse.pos, + .modifiers = mui->modifier_keys, // | MUI_MODIFIER_EVENT_TRACE, + }; + mui_handle_event(mui, &ev); + } + mii_x11_update_mouse_card(ui); + } break; + case Button4: + case Button5: { + // printf("%s wheel %d %d\n", __func__, + // evt->xbutton.button, ui->video.mui_visible); + if (ui->video.mui_visible) { + mui_event_t ev = { + .type = MUI_EVENT_WHEEL, + .modifiers = mui->modifier_keys,// | MUI_MODIFIER_EVENT_TRACE, + .wheel.where = ui->mouse.pos, + .wheel.delta = evt->xbutton.button == Button4 ? -1 : 1, + }; + mui_handle_event(mui, &ev); + } + } break; + } + } break; + case MotionNotify: { + ui->mouse.pos.x = evt->xmotion.x; + ui->mouse.pos.y = evt->xmotion.y; + mii_x11_update_mouse_card(ui); + if (ui->mouse.grabbed) + break; + if (ui->video.mui_visible) { + mui_event_t ev = { + .type = MUI_EVENT_DRAG, + .mouse.where = ui->mouse.pos, + .modifiers = mui->modifier_keys, + }; + mui_handle_event(mui, &ev); + } + } break; + case ClientMessage: + if ((Atom)evt->xclient.data.l[0] == ui->wm_delete_window) + quit = 1; + break; + case KeymapNotify: + XRefreshKeyboardMapping(&evt->xmapping); + break; + } + return quit; +} + +static void +mii_x11_terminate( + mii_x11_t *ui) +{ + glXMakeCurrent(ui->dpy, 0, 0); + glXDestroyContext(ui->dpy, ui->glContext); + XUnmapWindow(ui->dpy, ui->win); + XFreeColormap(ui->dpy, ui->cmap); + XDestroyWindow(ui->dpy, ui->win); + XCloseDisplay(ui->dpy); +} + +void +mii_x11_prepare_textures( + mii_x11_t *ui) +{ + mii_t * mii = &ui->video.mii; + mui_t * mui = &ui->video.mui; + GLuint tex[2]; + glGenTextures(2, tex); + for (int i = 0; i < 2; i++) { + mii_gl_tex_t * t = &ui->tex[i]; + memset(t, 0, sizeof(*t)); + t->id = tex[i]; + } + glEnable(GL_TEXTURE_2D); + // bind the mii texture using the GL_ARB_texture_rectangle extension + glBindTexture(GL_TEXTURE_2D, ui->mii_tex.id); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + // disable the repeat of textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glTexImage2D(GL_TEXTURE_2D, 0, 4, + MII_VRAM_WIDTH, + MII_VRAM_HEIGHT, 0, GL_RGBA, + GL_UNSIGNED_BYTE, + mii->video.pixels); + // bind the mui texture using the GL_ARB_texture_rectangle as well + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, ui->mui_tex.id); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, 4, + ui->dr.pix.row_bytes / 4, + mui->screen_size.y, 0, GL_RGBA, + GL_UNSIGNED_BYTE, + ui->dr.pix.pixels); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + +// printf("%s texture created %d\n", __func__, mii_apple_screen_tex); +// display opengl error + GLenum err = glGetError(); + if (err != GL_NO_ERROR) { + printf("Error creating texture: %d\n", err); + } +} + +void +mii_x11_render( + mii_x11_t *ui) +{ + glClearColor( + .6f * ui->mui_alpha, + .6f * ui->mui_alpha, + .6f * ui->mui_alpha, + 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + glPushAttrib(GL_ENABLE_BIT|GL_COLOR_BUFFER_BIT|GL_TRANSFORM_BIT); + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + glDisable(GL_SCISSOR_TEST); + glEnable(GL_BLEND); + glEnable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + /* setup viewport/project */ + glViewport(0, 0, (GLsizei)ui->attr.width, (GLsizei)ui->attr.height); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0.0f, ui->attr.width, ui->attr.height, 0.0f, -1.0f, 1.0f); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + // This (was) the recommended way to handle pixel alignment in glOrtho + // mode, but this seems to have changed -- now it looks like Linear filtering +// glTranslatef(0.375f, 0.375f, 0.0f); + { + /* draw mii texture */ + glColor3f(1.0f, 1.0f, 1.0f); + glBindTexture(GL_TEXTURE_2D, ui->mii_tex.id); + glBegin(GL_QUADS); + c2_rect_t r = ui->video_frame; + glTexCoord2f(0, 0); + glVertex2f(r.l, r.t); + glTexCoord2f(MII_VIDEO_WIDTH / (double)MII_VRAM_WIDTH, 0); + glVertex2f(r.r, r.t); + glTexCoord2f(MII_VIDEO_WIDTH / (double)MII_VRAM_WIDTH, + MII_VIDEO_HEIGHT / (double)MII_VRAM_HEIGHT); + glVertex2f(r.r, r.b); + glTexCoord2f(0, + MII_VIDEO_HEIGHT / (double)MII_VRAM_HEIGHT); + glVertex2f(r.l, r.b); + glEnd(); + /* draw mui texture */ + if (ui->mui_alpha > 0.0f) { + glColor4f(1.0f, 1.0f, 1.0f, ui->mui_alpha); + glBindTexture(GL_TEXTURE_2D, ui->mui_tex.id); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2f(0, 0); + glTexCoord2f(ui->attr.width / (double)(ui->dr.pix.row_bytes / 4), 0); + glVertex2f(ui->attr.width, 0); + glTexCoord2f(ui->attr.width / (double)(ui->dr.pix.row_bytes / 4), + ui->attr.height / (double)(ui->dr.pix.size.y)); + glVertex2f(ui->attr.width, ui->attr.height); + glTexCoord2f(0, + ui->attr.height / (double)(ui->dr.pix.size.y)); + glVertex2f(0, ui->attr.height); + glEnd(); + } + } + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + glDisable(GL_SCISSOR_TEST); + glDisable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, 0); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glPopAttrib(); +} + +// TODO factor this into a single table, this is dupped from mii_mui_settings.c! +static const struct { + const char * name; +} mii_slot_driver[MII_SLOT_DRIVER_COUNT] = { + [MII_SLOT_DRIVER_NONE] = { "none", }, + [MII_SLOT_DRIVER_SMARTPORT] = { "smartport", }, + [MII_SLOT_DRIVER_DISK2] = { "disk2", }, + [MII_SLOT_DRIVER_MOUSE] = { "mouse", }, + [MII_SLOT_DRIVER_SUPERSERIAL] = { "ssc", }, + [MII_SLOT_DRIVER_ROM1MB] = { "eecard", }, +}; + +void +mii_ui_reconfigure_slot( + mii_t * mii, + mii_machine_config_t * config, + int slot ) +{ + printf("%s slot %d\n", __func__, slot); + int i = slot-1; + switch (config->slot[i].driver) { + case MII_SLOT_DRIVER_SMARTPORT: { + mii_slot_command(mii, slot, + MII_SLOT_DRIVE_LOAD, + (void*)config->slot[i].conf.smartport.drive[0].disk); + mii_slot_command(mii, slot, + MII_SLOT_DRIVE_LOAD + 1, + (void*)config->slot[i].conf.smartport.drive[1].disk); + } break; + case MII_SLOT_DRIVER_DISK2: { + mii_slot_command(mii, slot, + MII_SLOT_DRIVE_LOAD, + (void*)config->slot[i].conf.disk2.drive[0].disk); + mii_slot_command(mii, slot, + MII_SLOT_DRIVE_LOAD + 1, + (void*)config->slot[i].conf.disk2.drive[1].disk); + } break; + case MII_SLOT_DRIVER_ROM1MB: { + mii_slot_command(mii, slot, + MII_SLOT_DRIVE_LOAD, + config->slot[i].conf.rom1mb.use_default ? + "" : + (void*)config->slot[i].conf.rom1mb.drive.disk); + } break; + } +} + +// load the content of the mii_machine_config_t into the initialized +// mii_t struct, similar to what mii_argv_parse does +// TODO: Change argv to modify that struct instead of the mii_t directly +static void +_mii_ui_load_config( + mii_t * mii, + mii_machine_config_t * config, + uint32_t *ioFlags ) +{ + if (config->no_slot_clock) + *ioFlags |= MII_INIT_NSC; + if (config->titan_accelerator) + *ioFlags |= MII_INIT_TITAN; + mii->speaker.muted = config->audio_muted; + mii->video.color_mode = config->video_mode; + for (int i = 0; i < 7; i++) { + if (config->slot[i].driver == MII_SLOT_DRIVER_NONE) + continue; + if (config->slot[i].driver >= MII_SLOT_DRIVER_COUNT) { + printf("%s invalid driver %d\n", __func__, + config->slot[i].driver); + continue; + } + int slot = i + 1; + if (mii_slot_drv_register(mii, slot, + mii_slot_driver[config->slot[i].driver].name) < 0) { + printf("%s failed to register driver %s\n", __func__, + mii_slot_driver[config->slot[i].driver].name); + } + mii_ui_reconfigure_slot(mii, config, slot); + } +} + +void +mii_x11_reload_config( + struct mii_x11_t *ui ) +{ + mii_t * mii = &ui->video.mii; + mii_machine_config_t * config = &ui->video.config; + uint32_t flags = MII_INIT_DEFAULT; + + if (mii->state != MII_INIT) { + printf("%s mii is running, terminating thread\n", __func__); + mii->state = MII_TERMINATE; + pthread_join(ui->cpu_thread, NULL); + printf("%s mii terminated\n", __func__); + } + mii_mui_menu_slot_menu_update(&ui->video); + printf("%s (re)loading config\n", __func__); + mii_init(mii); + _mii_ui_load_config(mii, config, &flags); + mii_prepare(mii, flags); + mii_reset(mii, true); + + /* start the CPU/emulator thread */ + ui->cpu_thread = mii_thread_start(mii); +} + +int +main( + int argc, + const char *argv[]) +{ + char * conf_path; + asprintf(&conf_path, "%s/.local/share/mii", getenv("HOME")); + mkdir(conf_path, 0755); + + mii_x11_t g_mii = {}; + mii_x11_t * ui = &g_mii; + mii_t * mii = &g_mii.video.mii; + bool no_config_found = false; + + if (mii_settings_load( + &ui->video.cf, getcwd(NULL,0), ".mii_emu_config") < 0 && + mii_settings_load( + &ui->video.cf, conf_path, "mii_emu_gl") < 0) { + asprintf(&ui->video.cf.path, "%s/.local/share/mii/mii_emu_gl", + getenv("HOME")); + printf("%s failed to load settings\n", argv[0]); + ui->video.config.load_defaults = true; + no_config_found = true; + } else { + mii_emu_load(&ui->video.cf, &ui->video.config); + } + { + mii_init(mii); + int idx = 1; + uint32_t flags = MII_INIT_DEFAULT; + + if (!no_config_found) { + // load the config we have in the UI config struct into the + // mii config struct + _mii_ui_load_config(mii, &ui->video.config, &flags); + } + int r = mii_argv_parse(mii, argc, argv, &idx, &flags); + if (r == 0) { + printf("mii: Invalid argument %s, skipped\n", argv[idx]); + } else if (r == -1) + exit(1); + mii_prepare(mii, flags); + } + { + mish_prepare(1); + mish_set_command_parameter(MISH_FCC('m','i','i',' '), mii); + printf("MISH_TELNET_PORT = %s\n", getenv("MISH_TELNET_PORT")); + } + mii_x11_init(ui); + mui_t * mui = &ui->video.mui; // to move to a function later + mui_init(mui); + mui->clear_color.value = 0; + asprintf(&mui->pref_directory, "%s/.local/share/mii", getenv("HOME")); + + mii_mui_menus_init((mii_mui_t*)ui); + ui->video.mui_visible = 1; + mii_mui_menu_slot_menu_update(&ui->video); + + mii_x11_prepare_textures(ui); + + // use a 60fps timerfd here as well + int timerfd = timerfd_create(CLOCK_MONOTONIC, 0); + if (timerfd < 0) { + perror(__func__); + goto cleanup; + } + mii_thread_set_fps(timerfd, 60); + /* + * If it is the first run, theres no config files, open the + * slot dialog to let the user configure some stuff himself + */ + if (no_config_found) { + ui->video.config.reboot_on_load = true; + mii_config_open_slots_dialog(&ui->video); + } + /* start the CPU/emulator thread */ + ui->cpu_thread = mii_thread_start(mii); + + while (mii->state != MII_INIT) { + /* Input */ + XEvent evt; + while (XPending(ui->dpy)) { + XNextEvent(ui->dpy, &evt); + if (evt.type == ClientMessage) + goto cleanup; + if (XFilterEvent(&evt, ui->win)) + continue; + mii_x11_handle_event(ui, &evt); + } + mui_run(mui); + bool draw = false; + if (pixman_region32_not_empty(&mui->inval)) { + draw = true; + mui_draw(mui, &ui->dr, 0); + glBindTexture(GL_TEXTURE_2D, ui->mui_tex.id); + + pixman_region32_intersect_rect(&mui->redraw, &mui->redraw, + 0, 0, ui->dr.pix.size.x, ui->dr.pix.size.y); + int rc = 0; + c2_rect_t *ra = (c2_rect_t*)pixman_region32_rectangles(&mui->redraw, &rc); + // rc = 1; ra = &C2_RECT(0, 0, mui->screen_size.x, mui->screen_size.y); + if (rc) { + // printf("GL: %d rects to redraw\n", rc); + for (int i = 0; i < rc; i++) { + c2_rect_t r = ra[i]; + // printf("GL: %d,%d %dx%d\n", r.l, r.t, c2_rect_width(&r), c2_rect_height(&r)); + glPixelStorei(GL_UNPACK_ROW_LENGTH, ui->dr.pix.row_bytes / 4); + glTexSubImage2D(GL_TEXTURE_2D, 0, r.l, r.t, + c2_rect_width(&r), c2_rect_height(&r), + GL_RGBA, GL_UNSIGNED_BYTE, + ui->dr.pix.pixels + (r.t * ui->dr.pix.row_bytes) + (r.l * 4)); + } + } + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + pixman_region32_clear(&mui->redraw); + } + if (mii->video.frame_count != mii->video.frame_drawn) { + draw = true; + mii->video.frame_drawn = mii->video.frame_count; + // update the whole texture + glBindTexture(GL_TEXTURE_2D, ui->mii_tex.id); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, + MII_VRAM_WIDTH, + MII_VIDEO_HEIGHT, GL_RGBA, + GL_UNSIGNED_BYTE, + mii->video.pixels); + } + /* Draw */ + if (draw) { + XGetWindowAttributes(ui->dpy, ui->win, &ui->attr); + glViewport(0, 0, ui->width, ui->height); + _mii_transition(ui); + mii_x11_render(ui); + glXSwapBuffers(ui->dpy, ui->win); + } + /* Wait for next frame */ + uint64_t timerv; + if (read(timerfd, &timerv, sizeof(timerv)) < 0) { + perror(__func__); + goto cleanup; + } + } +cleanup: + mii_emu_save(&ui->video.cf, &ui->video.config); + // this was already done in the mii_thread +// mii_dispose(mii); + mii_x11_terminate(ui); + return 0; +} diff --git a/ui_gl/mii_mui.h b/ui_gl/mii_mui.h new file mode 100644 index 0000000..6be2a47 --- /dev/null +++ b/ui_gl/mii_mui.h @@ -0,0 +1,53 @@ +/* + * mii_mui.h + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ +#pragma once +/* + This tries to contains a structure that is the MUI interface over the MII + video, but without any attachment to x11 or opengl. Basically hopefully + segregating the relevant logic without tying it to a specific windowing system. + + Hopefully with a bit more work this OUGHT to allow Windows/macOS port + with a native frontend. + */ + +#include +#include +#include "mii.h" +#include "mui.h" +#include "mii_mui_settings.h" + +enum mii_mui_transition_e { + MII_MUI_TRANSITION_NONE, + MII_MUI_TRANSITION_HIDE_UI, + MII_MUI_TRANSITION_SHOW_UI, +}; + +typedef struct mii_mui_t { + mui_t mui; // mui interface + mii_t mii; // apple II emulator + + bool mui_visible; + uint8_t transition; + + mii_machine_config_t config; + mii_loadbin_conf_t loadbin_conf; + + mii_config_file_t cf; +} mii_mui_t; + + +void +mii_mui_menus_init( + mii_mui_t * ui); +void +mii_mui_menu_slot_menu_update( + mii_mui_t * ui); +// slot can be <= 0 to open the machine dialog instead +void +mii_config_open_slots_dialog( + mii_mui_t * ui); diff --git a/ui_gl/mii_mui_1mb.c b/ui_gl/mii_mui_1mb.c new file mode 100644 index 0000000..115cf1a --- /dev/null +++ b/ui_gl/mii_mui_1mb.c @@ -0,0 +1,336 @@ +/* + * mui_mui_1mb.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mui.h" +#include "mii_mui_settings.h" + +enum { + MII_1MB_WINDOW_ID = FCC('1','m','b','c'), + MII_1MB_SAVE = FCC('s','a','v','e'), + MII_1MB_CANCEL = FCC('c','a','n','c'), + MII_1MB_SELECT = FCC('s','e','l','e'), + MII_1MB_USE_FILE = FCC('r','o','m','0'), + MII_1MB_USE_BIN = FCC('r','o','m','1'), +}; + +typedef struct mii_mui_1mb_t { + mui_window_t win; + mui_control_t * load, *icon, *fname; + mui_control_t * r0, *r1; + + mii_1mb_conf_t * dst; + mii_1mb_conf_t config; +} mii_mui_1mb_t; + +static void +_size_string( + size_t s, + char *out, + int out_size, + uint16_t flags) +{ + if (s < 1024) { + snprintf(out, out_size, "%ld", s); + return; + } + s /= 1024; + if (s < 1024) + snprintf(out, out_size, "%ldK", s); + else if (s < 1024*1024) { + long r = ((s * 10) / (1024) % 10); + if (r == 0 && (flags & 1)) + snprintf(out, out_size, "%ldM", + s / (1024)); + else + snprintf(out, out_size, "%ld.%ldM", + s / (1024), r); + } else { + long r = ((s * 10) / (1024 * 1024) % 10); + if (r == 0 && (flags & 1)) + snprintf(out, out_size, "%ldG", + s / (1024 * 1024)); + else + snprintf(out, out_size, "%ld.%ldG", + s / (1024 * 1024), r); + } +} + +static int +_mii_check_1mb_file( + struct mui_t *mui, + const char * path) +{ + struct stat st; + if (stat(path, &st) < 0) { + char *msg; + asprintf(&msg, "'%s': %s", path, strerror(errno)); + mui_alert(mui, C2_PT(0,0), + "Could not find file", + msg, MUI_ALERT_FLAG_OK); + free(msg); + return -1; + } + if (st.st_size != 1024*1024) { + char stt[64]; + long delta = 1024*1024 - st.st_size; + _size_string(delta < 0 ? -delta : delta, stt, sizeof(stt)-2, 1); + strcpy(stt + strlen(stt), "B"); + char *msg; + asprintf(&msg, "File '%s' is the wrong size, %s too %s.", + basename((char*)path), + stt, delta < 0 ? "big" : "small"); + mui_alert(mui, C2_PT(0,0), + "Invalid file", + msg, MUI_ALERT_FLAG_OK); + free(msg); + return -1; + } + FILE * f = fopen(path, "rb"); + if (!f) { + char *msg; + asprintf(&msg, "Could not open '%s' for reading: %s", + path, strerror(errno)); + mui_alert(mui, C2_PT(0,0), + "Failed to open!", + msg, MUI_ALERT_FLAG_OK); + free(msg); + return -1; + } + uint8_t buf[4]; + fseek(f, 512, SEEK_SET); + fread(buf, 1, 4, f); + fclose(f); + printf("%s %02x %02x %02x %02x\n", __func__, buf[0], buf[1], buf[2], buf[3]); + if (buf[0] != 0x20 || buf[1] != 0x58 || buf[2] != 0xfc || buf[3] != 0xa0) { + char *msg; + asprintf(&msg, "WARNING: '%s' Lacks the 'bootloader' in block #1, " + "this will likely not boot properly.", path); + mui_alert(mui, C2_PT(0,0), + "No bootloader found", + msg, MUI_ALERT_FLAG_OK); + free(msg); + return 0; + } + return 1; +} + +static int +_mii_1mb_stdfile_cb( + mui_window_t * w, + void * cb_param, // mii_mui_1mb_t + uint32_t what, + void * param) // not used +{ + mii_mui_1mb_t * m = cb_param; + switch (what) { + case MUI_STDF_ACTION_SELECT: { + char * path = mui_stdfile_get_selected_path(w); + printf("%s select %s\n", __func__, path); + if (_mii_check_1mb_file(w->ui, path) < 0) { + mui_control_set_title(m->fname, "Click \"Select\" to pick a file"); + mui_control_set_state(m->fname, MUI_CONTROL_STATE_DISABLED); + mui_control_set_state(m->icon, MUI_CONTROL_STATE_DISABLED); + mui_control_set_state(m->load, MUI_CONTROL_STATE_DISABLED); + break; + } + strncpy(m->config.drive.disk, path, sizeof(m->config.drive.disk)-1); + mui_control_set_state(m->fname, MUI_CONTROL_STATE_NORMAL); + char *dup = strdup(path); + mui_control_set_title(m->fname, basename(dup)); + free(dup); + mui_control_set_state(m->icon, MUI_CONTROL_STATE_NORMAL); + mui_control_set_state(m->load, MUI_CONTROL_STATE_NORMAL); + mui_control_set_value(m->r0, 1); + mui_control_set_value(m->r1, 0); + m->config.use_default = 0; + mui_window_dispose(w); + } break; + case MUI_STDF_ACTION_CANCEL: + printf("%s cancel\n", __func__); + mui_window_dispose(w); + break; + } + return 0; +} + +static int +_mii_1mb_action_cb( + mui_control_t * c, + void * cb_param, // mii_mui_1mb_t + uint32_t what, + void * param) // not used +{ + printf("%s %4.4s\n", __func__, (char*)&what); + mii_mui_1mb_t * m = cb_param; + uint32_t uid = mui_control_get_uid(c); + + switch (what) { + case MUI_CONTROL_ACTION_SELECT: + printf("%s control %4.4s\n", __func__, (char*)&uid); + switch (uid) { + case MII_1MB_SAVE: { + // save the config + printf("%s save\n", __func__); + if (m->dst) + *m->dst = m->config; + mui_window_action(&m->win, MII_MUI_1MB_SAVE, m->dst); + mui_window_dispose(&m->win); + } break; + case MII_1MB_CANCEL: { + // cancel the config + printf("%s cancel\n", __func__); + mui_window_dispose(&m->win); + } break; + case MII_1MB_SELECT: { + // select a file + printf("%s select\n", __func__); + mui_window_t * w = mui_stdfile_get(m->win.ui, + C2_PT(0, 0), + "Select a file (Exactly 1MB in size)", + "\\.(po|hdv|bin|rom)$", + getenv("HOME")); + mui_window_set_action(w, _mii_1mb_stdfile_cb, m); + } break; + case MII_1MB_USE_BIN: + mui_control_set_state(m->load, MUI_CONTROL_STATE_NORMAL); + m->config.use_default = 1; + break; + case MII_1MB_USE_FILE: { + m->config.use_default = 1; + if (m->config.drive.disk[0] == 0) { + mui_control_set_state(m->load, MUI_CONTROL_STATE_DISABLED); + } else { + m->config.use_default = 0; + mui_control_set_state(m->load, MUI_CONTROL_STATE_NORMAL); + } + } break; + } + break; + } + return 0; +} + +struct mui_window_t * +mii_mui_load_1mbrom( + struct mui_t *mui, + mii_1mb_conf_t *config) +{ + mui_t *ui = mui; + float base_size = mui_font_find(ui, "main")->size; + float margin = base_size * 0.7; + mui_window_t *w = mui_window_get_by_id(mui, MII_1MB_WINDOW_ID); + if (w) { + mui_window_select(w); + return w; + } + c2_pt_t where = {}; + c2_rect_t wpos = C2_RECT_WH(where.x, where.y, 560, 240); + if (where.x == 0 && where.y == 0) + c2_rect_offset(&wpos, + (ui->screen_size.x / 2) - (c2_rect_width(&wpos) / 2), + (ui->screen_size.y * 0.4) - (c2_rect_height(&wpos) / 2)); + w = mui_window_create(mui, + wpos, + NULL, MUI_WINDOW_LAYER_MODAL, + "1MB ROM Card File", + sizeof(mii_mui_1mb_t)); + mui_window_set_id(w, MII_1MB_WINDOW_ID); + mii_mui_1mb_t * m = (mii_mui_1mb_t*)w; + m->dst = config; + mui_control_t * c = NULL; + c2_rect_t cf; + cf = C2_RECT_WH(0, 0, base_size * 4, base_size * 1.4); + c2_rect_left_of(&cf, c2_rect_width(&w->content), margin); + c2_rect_top_of(&cf, c2_rect_height(&w->content), margin); + m->load = c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_DEFAULT, + "OK", MII_1MB_SAVE); + c->key_equ = MUI_KEY_EQU(0, 13); + c->state = MUI_CONTROL_STATE_DISABLED; + c2_rect_left_of(&cf, cf.l, margin); + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Cancel", MII_1MB_CANCEL); + c->key_equ = MUI_KEY_EQU(0, 27); + + c2_rect_right_of(&cf, 0, margin); + cf.r += 15; + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Select…" , MII_1MB_SELECT); + c->key_equ = MUI_KEY_EQU(MUI_MODIFIER_ALT, 's'); + + c2_rect_set(&cf, margin * 3, (margin/2), + c2_rect_width(&w->frame) - margin, (margin/2) + base_size); + c2_rect_t cp = cf; + cp.l -= margin * 0.2; + cp.b += base_size * 1.3; + c = mui_groupbox_new(w, cp, "File to load:", MUI_CONTROL_TEXTBOX_FRAME); + + float icons_size = mui_font_find(ui, "icon_small")->size; + c2_rect_bottom_of(&cf, cf.b, 0); + cf.b = cf.t + icons_size; + cf.r = cf.l + icons_size; + m->icon = c = mui_textbox_new(w, cf, MUI_ICON_FILE, "icon_small", + MUI_TEXT_ALIGN_MIDDLE | MUI_TEXT_ALIGN_CENTER | 0); + c->state = MUI_CONTROL_STATE_DISABLED; + cf.l = cf.r; + cf.r = c2_rect_width(&w->content) - margin; + m->fname = c = mui_textbox_new(w, cf, + "Click \"Select\" to pick a file", NULL, 0); + c->state = MUI_CONTROL_STATE_DISABLED; + + uint32_t uid_mask = FCC(0xff,0xff,0xff,0); + cf.l = margin; + m->r0 = c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_RADIO, + "", FCC('r','o','m','0')); + c->uid_mask = uid_mask; + c->value = config->use_default == 0; + c2_rect_bottom_of(&cf, cf.b, margin * 0.8); + m->r1 = c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_RADIO, + "Use Built-in image with a few games", + FCC('r','o','m','1')); + c->uid_mask = uid_mask; + c->value = config->use_default != 0; + + c = NULL; + TAILQ_FOREACH(c, &w->controls, self) { + if (mui_control_get_uid(c) == 0) + continue; + mui_control_set_action(c, _mii_1mb_action_cb, m); + } + m->config = *config; + if (m->config.drive.disk[0] && + _mii_check_1mb_file(mui, m->config.drive.disk) >= 0) { + char * path = m->config.drive.disk; + mui_control_set_state(m->fname, MUI_CONTROL_STATE_NORMAL); + char *dup = strdup(path); + mui_control_set_title(m->fname, basename(dup)); + free(dup); + mui_control_set_state(m->icon, MUI_CONTROL_STATE_NORMAL); + mui_control_set_state(m->load, MUI_CONTROL_STATE_NORMAL); + } else { + m->config.drive.disk[0] = 0; + mui_control_set_state(m->load, MUI_CONTROL_STATE_NORMAL); + } + return w; +} + diff --git a/ui_gl/mii_mui_2dsk.c b/ui_gl/mii_mui_2dsk.c new file mode 100644 index 0000000..e596ac0 --- /dev/null +++ b/ui_gl/mii_mui_2dsk.c @@ -0,0 +1,255 @@ +/* + * mui_mui_2disks.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include +#include +#include "mui.h" + +#include "mii_mui_settings.h" + +enum { + MII_2DSK_WINDOW_ID = FCC('2','d','s','k'), + MII_2DSK_SAVE = FCC('s','a','v','e'), + MII_2DSK_CANCEL = FCC('c','a','n','c'), + MII_2DSK_SELECT1 = FCC('s','e','l','1'), + MII_2DSK_SELECT2 = FCC('s','e','l','2'), +}; + +typedef struct mii_mui_2dsk_t { + mui_window_t win; + uint8_t drive_kind; + mui_control_t * load; + uint32_t selecting; + struct { + mui_control_t *icon, *fname, *button; + } drive[2]; + + mii_2dsk_conf_t * dst; + mii_2dsk_conf_t config; +} mii_mui_2dsk_t; + +static void +mii_mui_2dsk_load_conf( + mii_mui_2dsk_t * m, + mii_2dsk_conf_t * config) +{ + int ok = 0; + for (int i = 0; i < 2; i++) { + if (config->drive[i].disk[0]) { + ok = 1; + mui_control_set_state(m->drive[i].fname, MUI_CONTROL_STATE_NORMAL); + char *dup = strdup(config->drive[i].disk); + mui_control_set_title(m->drive[i].fname, basename(dup)); + free(dup); + mui_control_set_state(m->drive[i].icon, MUI_CONTROL_STATE_NORMAL); + mui_control_set_title(m->drive[i].button, "Eject"); + } else { + mui_control_set_state(m->drive[i].fname, MUI_CONTROL_STATE_DISABLED); + mui_control_set_title(m->drive[i].fname, "Click \"Select\" to pick a file"); + mui_control_set_state(m->drive[i].icon, MUI_CONTROL_STATE_DISABLED); + mui_control_set_title(m->drive[i].button, "Select…"); + } + } + if (ok) + mui_control_set_state(m->load, MUI_CONTROL_STATE_NORMAL); +// else +// mui_control_set_state(m->load, MUI_CONTROL_STATE_DISABLED); +} + +static int +_mii_2dsk_stdfile_cb( + mui_window_t * w, + void * cb_param, // mii_mui_2dsk_t + uint32_t what, + void * param) // not used +{ + mii_mui_2dsk_t * m = cb_param; + switch (what) { + case MUI_STDF_ACTION_SELECT: { + int idx = m->selecting == MII_2DSK_SELECT1 ? 0 : 1; + char * path = mui_stdfile_get_selected_path(w); + printf("%s select %s\n", __func__, path); + strncpy(m->config.drive[idx].disk, path, + sizeof(m->config.drive[idx].disk)-1); + mii_mui_2dsk_load_conf(m, &m->config); + mui_window_dispose(w); + } break; + case MUI_STDF_ACTION_CANCEL: + printf("%s cancel\n", __func__); + mui_window_dispose(w); + break; + } + return 0; +} + +static int +_mii_2dsk_action_cb( + mui_control_t * c, + void * cb_param, // mii_mui_2dsk_t + uint32_t what, + void * param) // not used +{ + printf("%s %4.4s\n", __func__, (char*)&what); + mii_mui_2dsk_t * m = cb_param; + uint32_t uid = mui_control_get_uid(c); + + switch (what) { + case MUI_CONTROL_ACTION_SELECT: + printf("%s control %4.4s\n", __func__, (char*)&uid); + switch (uid) { + case MII_2DSK_SAVE: { + // save the config + printf("%s save\n", __func__); + if (m->dst) + *m->dst = m->config; + mui_window_action(&m->win, + m->drive_kind == MII_2DSK_SMARTPORT ? + MII_MUI_SMARTPORT_SAVE : + MII_MUI_DISK2_SAVE, + m->dst); + mui_window_dispose(&m->win); + } break; + case MII_2DSK_CANCEL: { + // cancel the config + printf("%s cancel\n", __func__); + mui_window_dispose(&m->win); + } break; + case MII_2DSK_SELECT1: + case MII_2DSK_SELECT2: { + mii_2dsk_conf_t * config = &m->config; + // select a file + m->selecting = uid; // remember which drive we're selecting + int idx = uid == MII_2DSK_SELECT1 ? 0 : 1; + if (config->drive[idx].disk[0]) { + printf("%s eject %d\n", __func__, idx); + config->drive[idx].disk[0] = 0; + mii_mui_2dsk_load_conf(m, config); + } else { + printf("%s select %d\n", __func__, idx); + mui_window_t * w = mui_stdfile_get(m->win.ui, + C2_PT(0, 0), + m->drive_kind == MII_2DSK_SMARTPORT ? + "Select PO/HDV/2MG file to load" : + "Select DSK file to load", + m->drive_kind == MII_2DSK_SMARTPORT ? + "\\.(po|hdv|2mg)$" : + "\\.(dsk)$", + getenv("HOME")); + mui_window_set_action(w, _mii_2dsk_stdfile_cb, m); + } + } break; + } + break; + } + return 0; +} + +struct mui_window_t * +mii_mui_load_2dsk( + struct mui_t *mui, + mii_2dsk_conf_t *config, + uint8_t drive_kind) +{ + mui_t *ui = mui; + float base_size = mui_font_find(ui, "main")->size; + float margin = base_size * 0.7; + mui_window_t *w = mui_window_get_by_id(mui, MII_2DSK_WINDOW_ID); + if (w) { + mui_window_select(w); + return w; + } + c2_pt_t where = {}; + c2_rect_t wpos = C2_RECT_WH(where.x, where.y, 640, 275); + if (where.x == 0 && where.y == 0) + c2_rect_offset(&wpos, + (ui->screen_size.x / 2) - (c2_rect_width(&wpos) / 2), + (ui->screen_size.y * 0.4) - (c2_rect_height(&wpos) / 2)); + char label[128]; + sprintf(label, "Select Files for %s 1&2 (Slot %d)", + drive_kind == MII_2DSK_SMARTPORT ? "SmartPort" : "Disk II", + config->slot_id + 1); + w = mui_window_create(mui, + wpos, NULL, 0, label, + sizeof(mii_mui_2dsk_t)); + mui_window_set_id(w, MII_2DSK_WINDOW_ID); + mii_mui_2dsk_t * m = (mii_mui_2dsk_t*)w; + m->drive_kind = drive_kind; + + mui_control_t * c = NULL; + c2_rect_t cf; + cf = C2_RECT_WH(0, 0, base_size * 4, base_size * 1.4); + c2_rect_left_of(&cf, c2_rect_width(&w->content), margin); + c2_rect_top_of(&cf, c2_rect_height(&w->content), margin); + m->load = c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_DEFAULT, + "OK", MII_2DSK_SAVE); + c->key_equ = MUI_KEY_EQU(0, 13); + c2_rect_left_of(&cf, cf.l, margin); + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Cancel", MII_2DSK_CANCEL); + c->key_equ = MUI_KEY_EQU(0, 27); + + c2_rect_set(&cf, margin, (margin / 2), + c2_rect_width(&w->frame) - margin - 120, + (margin/2) + base_size); + c2_rect_t cp = cf; + cp.l -= margin * 0.2; + cp.b += base_size * 1.3; + for (int i = 0; i < 2; i++) { + char buf[32]; + snprintf(buf, sizeof(buf), "Drive %d:", i+1); + c = mui_groupbox_new(w, cp, buf, MUI_CONTROL_TEXTBOX_FRAME); + + float icons_size = mui_font_find(ui, "icon_small")->size; + c2_rect_bottom_of(&cf, cp.t, base_size); + c2_rect_right_of(&cf, cp.l, margin * 0.5); + cf.b = cf.t + icons_size; + cf.r = cf.l + icons_size; + m->drive[i].icon = c = mui_textbox_new(w, cf, + MUI_ICON_FILE, "icon_small", + MUI_TEXT_ALIGN_MIDDLE | MUI_TEXT_ALIGN_CENTER | 0); + c->state = MUI_CONTROL_STATE_DISABLED; + cf.l = cf.r; + cf.r = cp.r - margin * 0.5; + m->drive[i].fname = c = mui_textbox_new(w, cf, + "Click \"Select\" to pick a file", NULL, 0); + c->state = MUI_CONTROL_STATE_DISABLED; + + c2_rect_right_of(&cf, cp.r, margin * 0.8); + cf.r = c2_rect_width(&w->frame) - margin * 1.2; + c2_rect_inset(&cf, -4,-4); + m->drive[i].button = c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Select…" , i == 0 ? + MII_2DSK_SELECT1 : MII_2DSK_SELECT2); + c->key_equ = MUI_KEY_EQU(MUI_MODIFIER_ALT, '1' + i); + + c2_rect_bottom_of(&cp, cp.b, margin * 0.2); + } + c2_rect_bottom_of(&cp, cp.t, margin * 0.8); + cp.l = margin * 4; + cp.r = c2_rect_width(&w->frame) - margin * 4; + c = mui_separator_new(w, cp); + + c = NULL; + TAILQ_FOREACH(c, &w->controls, self) { + if (mui_control_get_uid(c) == 0) + continue; + mui_control_set_action(c, _mii_2dsk_action_cb, m); + } + m->dst = config; + m->config = *config; + mii_mui_2dsk_load_conf(m, config); + return w; +} + diff --git a/ui_gl/mii_mui_loadbin.c b/ui_gl/mii_mui_loadbin.c new file mode 100644 index 0000000..2578579 --- /dev/null +++ b/ui_gl/mii_mui_loadbin.c @@ -0,0 +1,213 @@ +/* + * mui_mui_loadbin.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include +#include +#include "mui.h" + +#include "mii_mui_settings.h" + +enum { + MII_LBIN_WINDOW_ID = FCC('l','b','i','n'), + MII_LBIN_SAVE = FCC('s','a','v','e'), + MII_LBIN_CANCEL = FCC('c','a','n','c'), + MII_LBIN_SELECT = FCC('s','e','l','e'), +}; + + +typedef struct mii_mui_loadbin_t { + mui_window_t win; + mui_control_t * load, *icon, *fname; +} mii_mui_loadbin_t; + +static int +_mii_loadbin_stdfile_cb( + mui_window_t * w, + void * cb_param, // mii_mui_loadbin_t + uint32_t what, + void * param) // not used +{ + mii_mui_loadbin_t * m = cb_param; + switch (what) { + case MUI_STDF_ACTION_SELECT: { + char * path = mui_stdfile_get_selected_path(w); + printf("%s select %s\n", __func__, path); + mui_control_set_state(m->fname, MUI_CONTROL_STATE_NORMAL); + char *dup = strdup(path); + mui_control_set_title(m->fname, basename(dup)); + free(dup); + mui_control_set_state(m->icon, MUI_CONTROL_STATE_NORMAL); + mui_control_set_state(m->load, MUI_CONTROL_STATE_NORMAL); + mui_window_dispose(w); + } break; + case MUI_STDF_ACTION_CANCEL: + printf("%s cancel\n", __func__); + mui_window_dispose(w); + break; + } + return 0; +} + +static int +_mii_loadbin_action_cb( + mui_control_t * c, + void * cb_param, // mii_mui_loadbin_t + uint32_t what, + void * param) // not used +{ + printf("%s %4.4s\n", __func__, (char*)&what); + mii_mui_loadbin_t * m = cb_param; + uint32_t uid = mui_control_get_uid(c); + + switch (what) { + case MUI_CONTROL_ACTION_SELECT: + printf("%s control %4.4s\n", __func__, (char*)&uid); + switch (uid) { + case MII_LBIN_SAVE: { + // save the config + printf("%s save\n", __func__); + mui_window_dispose(&m->win); + } break; + case MII_LBIN_CANCEL: { + // cancel the config + printf("%s cancel\n", __func__); + mui_window_dispose(&m->win); + } break; + case MII_LBIN_SELECT: { + // select a file + printf("%s select\n", __func__); + mui_window_t * w = mui_stdfile_get(m->win.ui, + C2_PT(0, 0), + "Select a .bin file to run", + "\\.(bin|rom)$", + getenv("HOME")); + mui_window_set_action(w, _mii_loadbin_stdfile_cb, m); + } break; + } + break; + } + return 0; +} + +struct mui_window_t * +mii_mui_load_binary( + struct mui_t *mui, + mii_loadbin_conf_t *config) +{ + mui_t *ui = mui; + float base_size = mui_font_find(ui, "main")->size; + float margin = base_size * 0.7; + mui_window_t *w = mui_window_get_by_id(mui, MII_LBIN_WINDOW_ID); + if (w) { + mui_window_select(w); + return w; + } + c2_pt_t where = {}; + c2_rect_t wpos = C2_RECT_WH(where.x, where.y, 480, 294); + if (where.x == 0 && where.y == 0) + c2_rect_offset(&wpos, + (ui->screen_size.x / 2) - (c2_rect_width(&wpos) / 2), + (ui->screen_size.y * 0.4) - (c2_rect_height(&wpos) / 2)); + w = mui_window_create(mui, + wpos, + NULL, 0, + "Load&Run Binary File", + sizeof(mii_mui_loadbin_t)); + mui_window_set_id(w, MII_LBIN_WINDOW_ID); + mii_mui_loadbin_t * m = (mii_mui_loadbin_t*)w; + + mui_control_t * c = NULL; + c2_rect_t cf; + cf = C2_RECT_WH(0, 0, base_size * 4, base_size * 1.4); + c2_rect_left_of(&cf, c2_rect_width(&w->content), margin); + c2_rect_top_of(&cf, c2_rect_height(&w->content), margin); + m->load = c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_DEFAULT, + "Load", MII_LBIN_SAVE); + c->key_equ = MUI_KEY_EQU(0, 13); + c->state = MUI_CONTROL_STATE_DISABLED; + c2_rect_left_of(&cf, cf.l, margin); + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Cancel", MII_LBIN_CANCEL); + c->key_equ = MUI_KEY_EQU(0, 27); + + c2_rect_right_of(&cf, 0, margin); + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Select…" , MII_LBIN_SELECT); + c->key_equ = MUI_KEY_EQU(MUI_MODIFIER_ALT, 's'); + + cf.b = cf.t + base_size; + c2_rect_top_of(&cf, cf.t, margin); + c2_rect_right_of(&cf, 0, margin); + cf.r = cf.l + 200; + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_CHECKBOX, + "Auto Reload", 0); + c->key_equ = MUI_KEY_EQU(MUI_MODIFIER_ALT, 'r'); + // this tell libmui that it can clear the radio values of the 'sister' + // radio buttons when one matching the uid&mask is selected + uint32_t uid_mask = FCC(0xff,0xff,0xff,0); + c2_rect_top_of(&cf, cf.t, 10); + cf.l += margin * 2; + cf.r = cf.l + 110; + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_RADIO, + "$0300", FCC('a','d','d','0')); + c->uid_mask = uid_mask; + c->value = 1; + c2_rect_right_of(&cf, cf.r, margin); + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_RADIO, + "$0800", FCC('a','d','d','1')); + c->uid_mask = uid_mask; + c2_rect_right_of(&cf, cf.r, margin); + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_RADIO, + "$2000", FCC('a','d','d','2')); + c->uid_mask = uid_mask; + + c2_rect_right_of(&cf, 0, margin); + c2_rect_top_of(&cf, cf.t, margin / 2); + cf.r = cf.l + 200; + c = mui_textbox_new(w, cf, "Load address:", NULL, 0); + + c2_rect_set(&cf, margin, (margin/2), + c2_rect_width(&w->frame) - margin, (margin/2) + base_size); + c2_rect_t cp = cf; + cp.l -= margin * 0.2; + cp.b += base_size * 1.3; + c = mui_groupbox_new(w, cp, "File to load:", MUI_CONTROL_TEXTBOX_FRAME); + + float icons_size = mui_font_find(ui, "icon_small")->size; + c2_rect_bottom_of(&cf, cf.b, 0); + cf.b = cf.t + icons_size; + cf.r = cf.l + icons_size; + m->icon = c = mui_textbox_new(w, cf, MUI_ICON_FILE, "icon_small", + MUI_TEXT_ALIGN_MIDDLE | MUI_TEXT_ALIGN_CENTER | 0); + c->state = MUI_CONTROL_STATE_DISABLED; + cf.l = cf.r; + cf.r = c2_rect_width(&w->content) - margin; + m->fname = c = mui_textbox_new(w, cf, "Click \"Select\" to pick a file", NULL, 0); + c->state = MUI_CONTROL_STATE_DISABLED; + + c = NULL; + TAILQ_FOREACH(c, &w->controls, self) { + if (mui_control_get_uid(c) == 0) + continue; + mui_control_set_action(c, _mii_loadbin_action_cb, m); + } + + return w; +} + diff --git a/ui_gl/mii_mui_menus.c b/ui_gl/mii_mui_menus.c new file mode 100644 index 0000000..4e63294 --- /dev/null +++ b/ui_gl/mii_mui_menus.c @@ -0,0 +1,403 @@ +/* + * mii_mui_menus.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ +#include +#include +#include +#include +#include + +#include "mii_mui.h" +#include "mii_thread.h" +#define MII_MUI_MENUS_C +#include "mii_mui_menus.h" +#include "mii_mui_settings.h" + +/* this is heavily endian dependend, as is the FCC macro */ +#define FCC_INDEX(_fcc) (isdigit(_fcc>>24) ? ((_fcc >> 24) - '0') : 0) + +struct mii_x11_t; +void +mii_x11_reload_config( + struct mii_x11_t *ui ); +void +mii_ui_reconfigure_slot( + mii_t * mii, + mii_machine_config_t * config, + int slot ); + + +static int +mii_quit_confirm_cb( + mui_window_t *win, + void * cb_param, + uint32_t what, + void * param) +{ + mii_mui_t * ui = cb_param; + printf("%s %4.4s\n", __func__, (char*)&what); + if (what == MUI_CONTROL_ACTION_SELECT) { + mui_control_t * c = param; + printf("%s %4.4s\n", __func__, (char*)&c->uid); + if (c->uid == MUI_ALERT_BUTTON_OK) { + printf("%s Quit\n", __func__); + mii_t * mii = &ui->mii; + mii->state = MII_TERMINATE; + } + } + return 0; +} + +static int +mii_config_save_cb( + mui_window_t *win, + void * cb_param, + uint32_t what, + void * param) +{ + mii_mui_t * ui = cb_param; + printf("%s %4.4s\n", __func__, (char*)&what); + switch (what) { + case MII_MUI_SLOTS_SAVE: + printf("%s *** Rebooting\n", __func__); + mii_x11_reload_config((void*)ui); + break; + case MII_MUI_DISK2_SAVE: + case MII_MUI_SMARTPORT_SAVE: { + mii_2dsk_conf_t * conf = param; + mii_t * mii = &ui->mii; + mii_machine_config_t * config = &ui->config; + mii_ui_reconfigure_slot(mii, config, conf->slot_id + 1); + } break; + case MII_MUI_1MB_SAVE: { + mii_1mb_conf_t * conf = param; + mii_t * mii = &ui->mii; + mii_machine_config_t * config = &ui->config; + mii_ui_reconfigure_slot(mii, config, conf->slot_id + 1); + } break; + } + return 0; +} + +void +mii_config_open_slots_dialog( + mii_mui_t * ui) +{ + mui_window_set_action( + mii_mui_configure_slots(&ui->mui, &ui->config), + mii_config_save_cb, ui); +} + + +static void +_mii_show_about( + mii_mui_t * ui) +{ + mui_t * mui = &ui->mui; + mui_window_t *w = mui_window_get_by_id(mui, FCC('a','b','o','t')); + if (w) { + mui_window_select(w); + return; + } + w = mui_alert(mui, C2_PT(0,0), + "About MII", + "Version " MII_VERSION "\n" + "Build " __DATE__ " " __TIME__, + MUI_ALERT_INFO); + mui_window_set_id(w, FCC('a','b','o','t')); +} + +static int +mii_menubar_action( + mui_window_t *win, // window (menubar) + void * cb_param, + uint32_t what, + void * param) +{ + mii_mui_t * ui = cb_param; + mui_t * mui = &ui->mui; + mii_t * mii = &ui->mii; + +// printf("%s %4.4s\n", __func__, (char*)&what); + + switch (what) { + case MUI_MENUBAR_ACTION_PREPARE: { + mui_menu_item_t * items = param; + // printf("%s prepare (%s)\n", __func__, items[0].title); + for (int i = 0; items[i].title; i++) { + switch (items[i].uid) { + case FCC('v','d','c','0'): + case FCC('v','d','c','1'): + case FCC('v','d','c','2'): { + int idx = FCC_INDEX(items[i].uid); + if (mii->video.color_mode == idx) + strcpy(items[i].mark, MUI_GLYPH_TICK); + else + items[i].mark[0] = 0; + } break; + case FCC('a','u','d','0'): + if (mii->speaker.muted) + strcpy(items[i].mark, MUI_GLYPH_TICK); + else + items[i].mark[0] = 0; + break; + case FCC('a','u','d','+'): + items[i].disabled = mii->speaker.volume >= 10; + break; + case FCC('a','u','d','-'): + items[i].disabled = mii->speaker.volume <= 0.1; + break; + case FCC('m','h','z','1'): + if (mii->speed <= 1.1 && mii->speed >= 0.9) + strcpy(items[i].mark, MUI_GLYPH_TICK); + else + items[i].mark[0] = 0; + break; + case FCC('m','h','z','3'): + if (mii->speed >= 2) + strcpy(items[i].mark, MUI_GLYPH_TICK); + else + items[i].mark[0] = 0; + break; + case FCC('s','t','o','p'): { + if (mii->state == MII_STOPPED) { + items[i].title = "Stopped"; + strcpy(items[i].mark, MUI_GLYPH_TICK); + } else { + items[i].title = "Stop"; + items[i].mark[0] = 0; + } + } break; + case FCC('r','u','n',' '): { + if (mii->state == MII_RUNNING) { + items[i].title = "Running"; + strcpy(items[i].mark, MUI_GLYPH_TICK); + } else { + items[i].title = "Continue"; + items[i].mark[0] = 0; + } + } break; + case FCC('n','e','x','t'): + case FCC('s','t','e','p'): { + items[i].disabled = mii->state == MII_RUNNING; + } break; + /* + * These menu items are disabled when a window/dialog + * is open. + */ + // case FCC('j','o','y','s'): + // case FCC('l','r','u','n'): + case FCC('a','b','o','t'): + case FCC('s','l','o','t'): { + items[i].disabled = mui_window_front(mui) != NULL; + } break; + case FCC('s','h','m','b'): { + items[i].disabled = + (mui_window_front(mui) != NULL) || + (ui->transition != MII_MUI_TRANSITION_NONE); + } break; + } + } + } break; + case MUI_MENUBAR_ACTION_SELECT: { + mui_menu_item_t * item = param; + // printf("%s Selected %4.4s '%s'\n", __func__, + // (char*)&item->uid, item->title); + switch (item->uid) { + case FCC('a','b','o','t'): { + _mii_show_about(ui); + } break; + case FCC('q','u','i','t'): { +// printf("%s Quit?\n", __func__); + if (!ui->mui_visible && + ui->transition == MII_MUI_TRANSITION_NONE) + ui->transition = MII_MUI_TRANSITION_SHOW_UI; + mui_window_t * really = mui_window_get_by_id( + &ui->mui, FCC('q','u','i','t')); + if (really) + mui_window_select(really); + else { + really = mui_alert(mui, C2_PT(0,0), + "Quitting", + "Do you really want to quit the emulator?", + MUI_ALERT_WARN); + really->uid = FCC('q','u','i','t'); + mui_window_set_action(really, mii_quit_confirm_cb, ui); + } + } break; + case FCC('s','h','m','b'): { + if (ui->transition != MII_MUI_TRANSITION_NONE) + break; + if (ui->mui_visible) { + ui->transition = MII_MUI_TRANSITION_HIDE_UI; + } else { + ui->transition = MII_MUI_TRANSITION_SHOW_UI; + } + } break; + case FCC('d','s','k','0'): + case FCC('d','s','k','1'): + case FCC('d','s','k','2'): + case FCC('d','s','k','3'): + case FCC('d','s','k','4'): + case FCC('d','s','k','5'): + case FCC('d','s','k','6'): { + int slot = FCC_INDEX(item->uid); + printf("%s configure slot %d\n", __func__, slot); + mui_window_set_action( + mii_mui_configure_slot(&ui->mui, &ui->config, slot), + mii_config_save_cb, ui); + } break; + case FCC('s','l','o','t'): { + mii_config_open_slots_dialog(ui); + } break; + case FCC('l','r','u','n'): { + mui_window_set_action( + mii_mui_load_binary(&ui->mui, &ui->loadbin_conf), + mii_config_save_cb, ui); + } break; + case FCC('c','r','e','s'): + case FCC('r','e','s','t'): { + mii_th_signal_t sig = { + .cmd = SIGNAL_RESET, + .data = item->uid == FCC('c','r','e','s'), + }; + mii_th_fifo_write(mii_thread_get_fifo(&ui->mii), sig); + } break; + case FCC('a','u','d','0'): + mii->speaker.muted = !mii->speaker.muted; + ui->config.audio_muted = mii->speaker.muted; + break; + case FCC('a','u','d','+'): + mii_speaker_volume(&mii->speaker, mii->speaker.volume + 1); + break; + case FCC('a','u','d','-'): + mii_speaker_volume(&mii->speaker, mii->speaker.volume - 1); + break; + case FCC('v','d','C','l'): { +// printf("%s Cycle video\n", __func__); + mii->video.color_mode = (mii->video.color_mode + 1) % 3; + ui->config.video_mode = mii->video.color_mode; + } break; + case FCC('v','d','c','0'): + case FCC('v','d','c','1'): + case FCC('v','d','c','2'): + mii->video.color_mode = FCC_INDEX(item->uid); + ui->config.video_mode = mii->video.color_mode; + break; + case FCC('m','h','z','1'): + mii->speed = 1; + break; + case FCC('m','h','z','3'): + mii->speed = 3.58; + break; + case FCC('s','t','o','p'): { + mii_th_signal_t sig = { + .cmd = SIGNAL_STOP, + }; + mii_th_fifo_write(mii_thread_get_fifo(&ui->mii), sig); + } break; + case FCC('s','t','e','p'): { + mii_th_signal_t sig = { + .cmd = SIGNAL_STEP, + }; + mii_th_fifo_write(mii_thread_get_fifo(&ui->mii), sig); + } break; + case FCC('r','u','n',' '): { + mii_th_signal_t sig = { + .cmd = SIGNAL_RUN, + }; + mii_th_fifo_write(mii_thread_get_fifo(&ui->mii), sig); + } break; + default: + printf("%s menu item %4.4s %s IGNORED\n", + __func__, (char*)&item->uid, item->title); + break; + } + } break; + default: + printf("%s %4.4s IGNORED?\n", __func__, (char*)&what); + break; + } + return 0; +} + +void +mii_mui_menu_slot_menu_update( + mii_mui_t * ui) +{ + mui_window_t * mbar = mui_menubar_get(&ui->mui); + mui_control_t * m = mui_control_get_by_id(mbar, FCC('f','i','l','e')); + mui_menu_items_t * items = mui_popupmenu_get_items(m); + + printf("%s items %p count %d RO:%d\n", + __func__, items, items? items->count : 0, items? items->read_only : 0); + + mui_menu_items_clear(items); + if (!items->read_only) + mui_menu_items_free(items); + static const mui_menu_items_t zero = {0}; + *items = zero; + + for (int i = 0; i < 7; i++) { + static char static_label[7][64]; + char * label = static_label[i]; + label[0] = 0; + int slot = i + 1; + switch (ui->config.slot[i].driver) { + case MII_SLOT_DRIVER_SMARTPORT: + sprintf(label, "%d: SmartPort…", slot); + break; + case MII_SLOT_DRIVER_DISK2: + sprintf(label, "%d: Disk ][…", slot); + break; + case MII_SLOT_DRIVER_ROM1MB: + sprintf(label, "%d: ROM 1MB…", slot); + break; + default: + break; + } + if (label[0]) { + mui_menu_items_push(items, (mui_menu_item_t){ + .title = label, + .uid = FCC('d','s','k','0' + i), + }); + } + } + int start = items->count ? 1 : 0; + for (int i = start; m_file_menu[i].title; i++) { + mui_menu_items_push(items, m_file_menu[i]); + } + // array is NULL terminated + mui_menu_items_push(items, (mui_menu_item_t){}); + for (int i = 0; i < (int)items->count; i++) + printf(" %d: %s\n", i, items->e[i].title); + + printf("%s items %p count %d RO:%d done\n", + __func__, items, items? items->count : 0, items? items->read_only : 0); +} + +void +mii_mui_menus_init( + mii_mui_t * ui) +{ +// printf("%s\n", __func__); + mui_window_t * mbar = mui_menubar_new(&ui->mui); + mui_window_set_action(mbar, mii_menubar_action, ui); + + mui_menubar_add_simple(mbar, MUI_GLYPH_APPLE, + FCC('a','p','p','l'), + m_apple_menu); + mui_menubar_add_simple(mbar, "File", + FCC('f','i','l','e'), + m_file_menu); + mui_menubar_add_simple(mbar, "Machine", + FCC('m','a','c','h'), + m_machine_menu); + mui_menubar_add_simple(mbar, "CPU", + FCC('c','p','u','m'), + m_cpu_menu); +} \ No newline at end of file diff --git a/ui_gl/mii_mui_menus.h b/ui_gl/mii_mui_menus.h new file mode 100644 index 0000000..2c4ebf2 --- /dev/null +++ b/ui_gl/mii_mui_menus.h @@ -0,0 +1,132 @@ +/* + * mui_mui_menus.h + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +#pragma once +#include "mui.h" + +extern mui_menu_item_t m_apple_menu[]; +extern mui_menu_item_t m_file_menu[]; +extern mui_menu_item_t m_video_menu[]; +extern mui_menu_item_t m_audio_menu[]; +extern mui_menu_item_t m_machine_menu[]; +extern mui_menu_item_t m_cpu_menu[]; + +#ifdef MII_MUI_MENUS_C +mui_menu_item_t m_apple_menu[] = { + { .title = "About MII…", + .uid = FCC('a','b','o','t') }, +// { .title = "-", }, + { }, +}; +mui_menu_item_t m_file_menu[] = { + /* these two don't do anything for the moment */ + { .title = "No Drives Installed…", + .disabled = 1, + .uid = FCC('l','d','i','m'), + .kcombo = MUI_GLYPH_SHIFT MUI_GLYPH_COMMAND "N" }, + { .title = "-", }, + { .title = "Load & Run Binary…", + .disabled = 1, + .uid = FCC('l','r','u','n'), }, + { .title = "-" }, + { .title = "Quit", + .uid = FCC('q','u','i','t'), + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_RCTRL|MUI_MODIFIER_RSUPER, 'Q'), + .kcombo = MUI_GLYPH_CONTROL MUI_GLYPH_COMMAND "Q" }, + { }, +}; +mui_menu_item_t m_video_menu[] = { + { .title = "Show/Hide Menus", + .uid = FCC('s','h','m','b'), + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_RCTRL, MUI_KEY_F1), + .kcombo = MUI_GLYPH_CONTROL MUI_GLYPH_F1 }, + { .title = "Cycle Mode", + .uid = FCC('v','d','C','l'), + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_RCTRL, MUI_KEY_F11), + .kcombo = MUI_GLYPH_CONTROL MUI_GLYPH_F11 }, + { .title = "-", }, + { .title = "Color", + .mark = MUI_GLYPH_TICK, + .uid = FCC('v','d','c','0') }, + { .title = "Green", + .uid = FCC('v','d','c','1') }, + { .title = "Amber", + .uid = FCC('v','d','c','2') }, + { }, +}; +mui_menu_item_t m_audio_menu[] = { + { .title = "Mute", + .uid = FCC('a','u','d','0'), + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_RCTRL, MUI_KEY_F10), + .kcombo = MUI_GLYPH_CONTROL MUI_GLYPH_F10 }, + { .title = "-", }, + { .title = "Louder", + .uid = FCC('a','u','d','+'), + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_RCTRL|MUI_MODIFIER_RSHIFT, '+'), + .kcombo = MUI_GLYPH_CONTROL MUI_GLYPH_SHIFT "+" }, + { .title = "Quieter", + .uid = FCC('a','u','d','-'), + // shift-minus is _ (underscore) + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_RCTRL|MUI_MODIFIER_RSHIFT, '_'), + .kcombo = MUI_GLYPH_CONTROL MUI_GLYPH_SHIFT "-" }, + { }, +}; +mui_menu_item_t m_machine_menu[] = { + { .title = MUI_GLYPH_OAPPLE "-Control-Reset", + .uid = FCC('c','r','e','s'), + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_RCTRL|MUI_MODIFIER_RSHIFT, MUI_KEY_F12), + .kcombo = MUI_GLYPH_CONTROL MUI_GLYPH_SHIFT MUI_GLYPH_F12 }, + { .title = "Control-Reset", + .uid = FCC('r','e','s','t'), + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_RCTRL, MUI_KEY_F12), + .kcombo = MUI_GLYPH_CONTROL MUI_GLYPH_F12 }, + { .title = "-", }, + { .title = "Configure Slots…", + .uid = FCC('s','l','o','t') }, + { .title = "Joystick…", + .disabled = 1, + .uid = FCC('j','o','y','s') }, + { .title = "-", }, + { .title = "Video", + .kcombo = MUI_GLYPH_SUBMENU, + .submenu = m_video_menu }, + { .title = "Audio", + .kcombo = MUI_GLYPH_SUBMENU, + .submenu = m_audio_menu }, + { }, +}; +mui_menu_item_t m_cpu_menu[] = { + { .title = "Normal: 1MHz", + .uid = FCC('m','h','z','1'), + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_LSUPER, MUI_KEY_F2), + .kcombo = MUI_GLYPH_COMMAND MUI_GLYPH_F2 }, + { .title = "Fast: 3.5MHz", + .uid = FCC('m','h','z','3'), + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_LSUPER, MUI_KEY_F3), + .kcombo = MUI_GLYPH_COMMAND MUI_GLYPH_F3 }, + { .title = "-", }, + { .title = "Stop", + .kcombo = MUI_GLYPH_COMMAND MUI_GLYPH_F4, + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_LSUPER, MUI_KEY_F4), + .uid = FCC('s','t','o','p') }, + { .title = "Running", + .kcombo = MUI_GLYPH_COMMAND MUI_GLYPH_F5, + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_LSUPER, MUI_KEY_F5), + .uid = FCC('r','u','n',' ') }, + { .title = "Step", + .kcombo = MUI_GLYPH_COMMAND MUI_GLYPH_F6, + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_LSUPER, MUI_KEY_F6), + .uid = FCC('s','t','e','p') }, + { .title = "Next", + .kcombo = MUI_GLYPH_COMMAND MUI_GLYPH_F7, + .key_equ = MUI_KEY_EQU(MUI_MODIFIER_LSUPER, MUI_KEY_F7), + .uid = FCC('n','e','x','t') }, + { }, +}; + +#endif diff --git a/ui_gl/mii_mui_settings.c b/ui_gl/mii_mui_settings.c new file mode 100644 index 0000000..72a558a --- /dev/null +++ b/ui_gl/mii_mui_settings.c @@ -0,0 +1,381 @@ +/* + * mui_mui_settings.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +#include "mui.h" +#include "mii_mui_settings.h" + +IMPLEMENT_C_ARRAY(mii_config_array); + +mii_config_line_t * +mii_config_get_section( + mii_config_file_t * cf, + const char * section, + bool add ) +{ + mii_config_line_t * cl; + for (int i = 0; i < (int)cf->line.count; i++) { + cl = cf->line.e[i]; + if (cl->section && !strcmp(cl->key, section)) + return cl; + } + if (!add) + return NULL; + cl = calloc(1, sizeof(*cl) + strlen(section) + 3); + if (!cl) + return NULL; + cl->section = 1; + sprintf(cl->line, "[%s", section); + cl->key = cl->line + 1; + cl->number = cf->line.count; + mii_config_array_push(&cf->line, cl); + return cl; +} + +mii_config_line_t * +mii_config_get( + mii_config_file_t * cf, + mii_config_line_t * section, + const char * key) +{ + if (!cf || !section || !key) + return NULL; + for (int i = section->number + 1; i < (int)cf->line.count; i++) { + mii_config_line_t * cl = cf->line.e[i]; + if (cl->section) + return NULL; + if (!strcmp(cl->key, key)) + return cl; + } + return NULL; +} + +mii_config_line_t * +mii_config_set( + mii_config_file_t * cf, + mii_config_line_t * section, + const char * key, + const char * value) +{ + if (!cf || !section || !key) + return NULL; + mii_config_line_t * cl = mii_config_get(cf, section, key); + + int idx = section->number + 1; + if (cl) { + if (value && cl->value && !strcmp(cl->value, value)) + return cl; + idx = cl->number; + mii_config_array_delete(&cf->line, idx, 1); + free(cl); + } + cl = calloc(1, sizeof(*cl) + strlen(key) + strlen(value) + 3); + strcpy(cl->line, key); + // this wouldnt work if memory was not zeroes by calloc + strcpy(cl->line + strlen(key) + 1, value ? value : ""); + cl->key = cl->line; + cl->value = cl->line + strlen(key) + 1; + mii_config_array_insert(&cf->line, idx, &cl, 1); + for (int i = idx; i < (int)cf->line.count; i++) + cf->line.e[i]->number = i; + + return cl; +} + +int +mii_config_file_load( + mii_config_file_t * cf, + const char * path ) +{ + int res = -1; + mii_config_array_clear(&cf->line); + FILE * f = fopen(path, "r"); + if (!f) + return -1; + cf->path = strdup(path); + char line[512]; + int n = 0; + while (fgets(line, sizeof(line), f)) { + int l = strlen(line); + while (l && (line[l-1] == '\n' || line[l-1] == ' ' || line[l-1] == '\t')) + line[--l] = 0; + mii_config_line_t * cl = calloc(1, sizeof(*cl) + l + 1); + if (!cl) + goto exit; + cl->number = n++; + strcpy(cl->line, line); + mii_config_array_push(&cf->line, cl); + + char * s = cl->line; + while (isspace(*s)) + s++; + if (*s == '#' || *s == ';' || *s == 0) + cl->ignore = 1; // comment or empty line + else if (*s == '[') { + char * d = s + 1; + char * e = strchr(d, ']'); + if (e) + *e = 0; + cl->key = d; + cl->value = NULL; + cl->section = 1; + } else { + char * d = s; + char * k = strsep(&d, " ="); + cl->key = k; + // we want a pointer to zero here if there's no value + cl->value = d ? d : s + strlen(s); + } + } + res = 0; +exit: + fclose(f); + return res; +} + +// same as previous function, but write the file back +int +mii_settings_save( + mii_config_file_t * cf) +{ + if (!cf || !cf->path) + return -1; + FILE * f = fopen(cf->path, "w"); + if (!f) + return -1; + mii_config_line_t * cl; + for (int i = 0; i < (int)cf->line.count; i++) { + cl = cf->line.e[i]; + if (cl->section) + fprintf(f, "[%s]\n", cl->key); + else if (cl->ignore) + fprintf(f, "%s\n", cl->line); + else + fprintf(f, "%s %s\n", cl->key, cl->value ? cl->value : ""); + } + fclose(f); + return 0; +} + +int +mii_settings_load( + mii_config_file_t * cf, + const char * path, + const char * file ) +{ + char * full_path = NULL; + if (path) { + asprintf(&full_path, "%s/%s", path, file); + } else { + full_path = strdup(file); + } + if (!full_path) + return -1; + + int r = mii_config_file_load(cf, full_path); + free(full_path); + return r; +} + +static const struct { + const char * name; +} mii_slot_driver[MII_SLOT_DRIVER_COUNT] = { + [MII_SLOT_DRIVER_NONE] = { "none", }, + [MII_SLOT_DRIVER_SMARTPORT] = { "smartport", }, + [MII_SLOT_DRIVER_DISK2] = { "disk2", }, + [MII_SLOT_DRIVER_MOUSE] = { "mouse", }, + [MII_SLOT_DRIVER_SUPERSERIAL] = { "ssc", }, + [MII_SLOT_DRIVER_ROM1MB] = { "eecard", }, +}; + +int +mii_emu_save( + mii_config_file_t * cf, + mii_machine_config_t * config ) +{ + if (!cf || !config) + return -1; + char label[64]; + mii_config_line_t * section = mii_config_get_section(cf, "emu", true); + + mii_config_set(cf, section, "titan", + config->titan_accelerator ? "1" : "0"); + mii_config_set(cf, section, "no_slot_clock", + config->no_slot_clock ? "1" : "0"); + mii_config_set(cf, section, "audio_muted", + config->audio_muted ? "1" : "0"); + sprintf(label, "%d", config->video_mode); + mii_config_set(cf, section, "video_mode", label); + + section = mii_config_get_section(cf, "joystick", true); + mii_config_set(cf, section, "device", + config->joystick.device); + for (int i = 0; i < 2; i++) { + sprintf(label, "%d", config->joystick.buttons[i]); + char name[32] = "button0"; + name[6] += i; + mii_config_set(cf, section, name, label); + strcpy(name, "axis0"); + name[4] += i; + sprintf(label, "%d", config->joystick.axes[i]); + mii_config_set(cf, section, name, label); + } + + for (int i = 0; i < 7; i++) { + char key[32]; + sprintf(key, "slot_%d", i+1); + section = mii_config_get_section(cf, key, true); + + switch(config->slot[i].driver) { + case MII_SLOT_DRIVER_SMARTPORT: + mii_config_set(cf, section, "image0", + config->slot[i].conf.smartport.drive[0].disk); + sprintf(label, "%lu", config->slot[i].conf.smartport.drive[0].flags); + mii_config_set(cf, section, "flags0", label); + mii_config_set(cf, section, "image1", + config->slot[i].conf.smartport.drive[1].disk); + sprintf(label, "%lu", config->slot[i].conf.smartport.drive[1].flags); + mii_config_set(cf, section, "flags1", label); + break; + case MII_SLOT_DRIVER_DISK2: + mii_config_set(cf, section, "image0", + config->slot[i].conf.disk2.drive[0].disk); + sprintf(label, "%lu", config->slot[i].conf.disk2.drive[0].flags); + mii_config_set(cf, section, "flags0", label); + mii_config_set(cf, section, "image1", + config->slot[i].conf.disk2.drive[1].disk); + sprintf(label, "%lu", config->slot[i].conf.disk2.drive[1].flags); + mii_config_set(cf, section, "flags1", label); + break; + case MII_SLOT_DRIVER_SUPERSERIAL: + mii_config_set(cf, section, "device", + config->slot[i].conf.ssc.device); + break; + case MII_SLOT_DRIVER_ROM1MB: + mii_config_set(cf, section, "use_default", + config->slot[i].conf.rom1mb.use_default ? "1" : "0"); + mii_config_set(cf, section, "image", + config->slot[i].conf.rom1mb.drive.disk); + break; + } + mii_config_set(cf, section, "driver", + mii_slot_driver[config->slot[i].driver].name); + } + mii_settings_save(cf); + return 0; +} + +int +mii_emu_load( + mii_config_file_t * cf, + mii_machine_config_t * config ) +{ + if (!cf || !config) + return -1; + mii_config_line_t * section = mii_config_get_section(cf, "emu", false); + if (section) { + mii_config_line_t * cl = mii_config_get(cf, section, "titan"); + if (cl) + config->titan_accelerator = atoi(cl->value); + cl = mii_config_get(cf, section, "no_slot_clock"); + if (cl) + config->no_slot_clock = atoi(cl->value); + cl = mii_config_get(cf, section, "audio_muted"); + if (cl) + config->audio_muted = !!atoi(cl->value); + cl = mii_config_get(cf, section, "video_mode"); + if (cl) + config->video_mode = atoi(cl->value); + } + + section = mii_config_get_section(cf, "joystick", false); + if (section) { + mii_config_line_t * cl = mii_config_get(cf, section, "device"); + if (cl) + strcpy(config->joystick.device, cl->value); + for (int i = 0; i < 2; i++) { + char name[32] = "button0"; + name[6] += i; + cl = mii_config_get(cf, section, name); + if (cl) + config->joystick.buttons[i] = atoi(cl->value); + strcpy(name, "axis0"); + name[4] += i; + cl = mii_config_get(cf, section, name); + if (cl) + config->joystick.axes[i] = atoi(cl->value); + } + } + + for (int i = 0; i < 7; i++) { + char key[32]; + sprintf(key, "slot_%d", i+1); + section = mii_config_get_section(cf, key, false); + if (!section) + continue; + + mii_config_line_t * cl = mii_config_get(cf, section, "driver"); + if (!cl) + continue; + for (int j = 0; j < MII_SLOT_DRIVER_COUNT; j++) { + if (!strcmp(mii_slot_driver[j].name, cl->value)) { + config->slot[i].driver = j; + break; + } + } + switch (config->slot[i].driver) { + case MII_SLOT_DRIVER_SMARTPORT: + cl = mii_config_get(cf, section, "image0"); + if (cl) + strcpy(config->slot[i].conf.smartport.drive[0].disk, cl->value); + cl = mii_config_get(cf, section, "flags0"); + if (cl) + config->slot[i].conf.smartport.drive[0].flags = strtoul(cl->value, NULL, 0); + cl = mii_config_get(cf, section, "image1"); + if (cl) + strcpy(config->slot[i].conf.smartport.drive[1].disk, cl->value); + cl = mii_config_get(cf, section, "flags1"); + if (cl) + config->slot[i].conf.smartport.drive[1].flags = strtoul(cl->value, NULL, 0); + break; + case MII_SLOT_DRIVER_DISK2: + cl = mii_config_get(cf, section, "image0"); + if (cl) + strcpy(config->slot[i].conf.disk2.drive[0].disk, cl->value); + cl = mii_config_get(cf, section, "flags0"); + if (cl) + config->slot[i].conf.disk2.drive[0].flags = strtoul(cl->value, NULL, 0); + cl = mii_config_get(cf, section, "image1"); + if (cl) + strcpy(config->slot[i].conf.disk2.drive[1].disk, cl->value); + cl = mii_config_get(cf, section, "flags1"); + if (cl) + config->slot[i].conf.disk2.drive[1].flags = strtoul(cl->value, NULL, 0); + break; + case MII_SLOT_DRIVER_SUPERSERIAL: + cl = mii_config_get(cf, section, "device"); + if (cl) + strcpy(config->slot[i].conf.ssc.device, cl->value); + break; + case MII_SLOT_DRIVER_ROM1MB: + cl = mii_config_get(cf, section, "use_default"); + if (cl) + config->slot[i].conf.rom1mb.use_default = atoi(cl->value); + cl = mii_config_get(cf, section, "image"); + if (cl) + strcpy(config->slot[i].conf.rom1mb.drive.disk, cl->value); + break; + } + } + return 0; +} \ No newline at end of file diff --git a/ui_gl/mii_mui_settings.h b/ui_gl/mii_mui_settings.h new file mode 100644 index 0000000..011e7fe --- /dev/null +++ b/ui_gl/mii_mui_settings.h @@ -0,0 +1,190 @@ +/* + * mii_settings.h + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ + +/* + * This file defines the configuration data model for the emulator, it is + * made so it can be included without having to include the emulator's + * own headers. + * This way the dialog/ui can still be tested without having to link + * against the emulator, using the mui_playground test. + */ +#pragma once + +#include + +#include "bsd_queue.h" +#include "c_array.h" + +#define MII_PATH_SIZE_MAX 256 + +typedef struct mii_config_line_t { + unsigned int ignore : 1, + section : 1, + number; // line number in file + char * key; + char * value; + char line[]; +} mii_config_line_t; + +DECLARE_C_ARRAY(mii_config_line_t*, mii_config_array, 16); + +typedef struct mii_config_file_t { + char * path; + mii_config_array_t line; +} mii_config_file_t; + +typedef struct mii_drive_conf_t { + unsigned long flags; + char disk[MII_PATH_SIZE_MAX]; +} mii_drive_conf_t; + +typedef struct mii_1mb_conf_t { + unsigned long slot_id : 3, + use_default : 1, + reserved; + mii_drive_conf_t drive; +} mii_1mb_conf_t; + +typedef struct mii_2dsk_conf_t { + unsigned long slot_id : 3, reserved; + mii_drive_conf_t drive[2]; +} mii_2dsk_conf_t; + +typedef struct mii_ssc_conf_t { + uint8_t kind; // device, pty, socket + int socket_port; + char device[MII_PATH_SIZE_MAX]; + // rom/card configuration + unsigned int baud, bits, parity, stop; +} mii_ssc_conf_t; + +typedef struct mii_joystick_conf_t { + // /dev/input/js0 if empty + char device[MII_PATH_SIZE_MAX]; + unsigned int buttons[2]; + unsigned int axes[2]; +} mii_joystick_conf_t; + +typedef struct mii_loadbin_conf_t { + uint16_t active: 1, audo_reload : 1; + uint16_t bank; // unused for now + uint16_t addr; // address in bank + char path[MII_PATH_SIZE_MAX]; +} mii_loadbin_conf_t; + +enum mii_mui_driver_e { + MII_SLOT_DRIVER_NONE = 0, + MII_SLOT_DRIVER_SMARTPORT, + MII_SLOT_DRIVER_DISK2, + MII_SLOT_DRIVER_MOUSE, + MII_SLOT_DRIVER_SUPERSERIAL, + MII_SLOT_DRIVER_ROM1MB, + MII_SLOT_DRIVER_COUNT +}; + +// This is obviously not made to be terribly compact. +typedef struct mii_machine_config_t { + uint32_t reboot_on_load : 1, + load_defaults : 1, + audio_muted : 1, + no_slot_clock : 1, + titan_accelerator : 1; + uint32_t video_mode; + mii_joystick_conf_t joystick; + struct { + uint16_t driver; + union { + mii_2dsk_conf_t smartport; + mii_2dsk_conf_t disk2; + mii_1mb_conf_t rom1mb; + mii_ssc_conf_t ssc; + } conf; + } slot[7]; +} mii_machine_config_t; + +struct mui_window_t; +struct mui_t; + +/* + * These are passed to the window action proc when the dialogs have + * been validated and closed. The matching config structures have been + * updated and can be used to update the emulator's configuration. + */ +enum mii_mui_dialog_e { + MII_MUI_SLOTS_SAVE = FCC('S','L','O','T'), + MII_MUI_LOADBIN_SAVE = FCC('B','I','N',' '), + MII_MUI_1MB_SAVE = FCC('1','M','B',' '), + MII_MUI_DISK2_SAVE = FCC('2','D','S','K'), + MII_MUI_SMARTPORT_SAVE = FCC('S','M','P','T'), +}; + +struct mui_window_t * +mii_mui_configure_slots( + struct mui_t *mui, + mii_machine_config_t *config); +mui_window_t * +mii_mui_configure_slot( + struct mui_t *mui, + mii_machine_config_t *config, + int slot_id); + +struct mui_window_t * +mii_mui_load_binary( + struct mui_t *mui, + mii_loadbin_conf_t *config); +struct mui_window_t * +mii_mui_load_1mbrom( + struct mui_t *mui, + mii_1mb_conf_t *config); + +enum mii_mui_2dsk_e { + MII_2DSK_DISKII = 0, + MII_2DSK_SMARTPORT, +}; + +struct mui_window_t * +mii_mui_load_2dsk( + struct mui_t *mui, + mii_2dsk_conf_t *config, + uint8_t drive_kind); + +/* + * Config file related + */ +mii_config_line_t * +mii_config_get_section( + mii_config_file_t * cf, + const char * section, + bool add ); +mii_config_line_t * +mii_config_get( + mii_config_file_t * cf, + mii_config_line_t * section, + const char * key); +mii_config_line_t * +mii_config_set( + mii_config_file_t * cf, + mii_config_line_t * section, + const char * key, + const char * value); +int +mii_settings_save( + mii_config_file_t * cf); +int +mii_settings_load( + mii_config_file_t * cf, + const char * path, + const char * file ); +int +mii_emu_save( + mii_config_file_t * cf, + mii_machine_config_t * config ); +int +mii_emu_load( + mii_config_file_t * cf, + mii_machine_config_t * config ); diff --git a/ui_gl/mii_mui_slots.c b/ui_gl/mii_mui_slots.c new file mode 100644 index 0000000..27baa31 --- /dev/null +++ b/ui_gl/mii_mui_slots.c @@ -0,0 +1,439 @@ +/* + * mui_mui_slots.c + * + * Copyright (C) 2023 Michel Pollet + * + * SPDX-License-Identifier: MIT + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +#include "mui.h" +#include "mii_mui_settings.h" + + +typedef struct mii_ui_machine_config_t { + mui_window_t win; + + mui_control_t * slot[8]; + + // for sub-windows + unsigned slot_id; + mii_machine_config_t * dst; + mii_machine_config_t config; +} mii_ui_machine_config_t; + +static const mii_machine_config_t _default_config = { + .no_slot_clock = 1, + .titan_accelerator = 0, + .slot = { + [0] = { + // .driver = MII_SLOT_DRIVER_SUPERSERIAL, + .conf.ssc = { + .kind = 0, + .socket_port = 1969, + .device = "/dev/ttyS0", + .baud = 9600, + .bits = 8, + .parity = 0, + .stop = 1, + } + }, + [1] = { .driver = 0, }, + [2] = { .driver = 0, }, + [3] = { + .driver = MII_SLOT_DRIVER_MOUSE, + }, + [4] = { .driver = 0, }, + [5] = { + .driver = MII_SLOT_DRIVER_DISK2, + }, + [6] = { + .driver = MII_SLOT_DRIVER_SMARTPORT, + }, + }, +}; + +enum { + MII_SLOT_WINDOW_ID = FCC('s','l','o','t'), + MII_SLOT_SAVE = FCC('s','a','v','e'), + MII_SLOT_CANCEL = FCC('c','a','n','c'), + MII_SLOT_DEFAULT = FCC('d','e','f','a'), +// MII_SLOT_REBOOT = FCC('r','b','o','o'), + MII_SLOT_NSC = FCC('n','s','c','l'), + MII_SLOT_TITAN = FCC('t','i','t','a'), + MII_SLOT_DRIVER_POP = FCC('d','r','v','p'), + MII_SLOT_DRIVER_CONF = FCC('d','r','v','c'), +}; + +static const struct { + char * label; + int has_config; +} _mii_slot_drivers[] = { + [MII_SLOT_DRIVER_NONE] = { "None", 0 }, + [MII_SLOT_DRIVER_SMARTPORT] = { "SmartPort", 1 }, + [MII_SLOT_DRIVER_DISK2] = { "Disk II", 1 }, + [MII_SLOT_DRIVER_MOUSE] = { "Mouse", 0 }, + [MII_SLOT_DRIVER_SUPERSERIAL] = { "Super Serial", 1 }, + [MII_SLOT_DRIVER_ROM1MB] = { "ROM 1MB", 1 }, + { NULL, 0 }, +}; + +static void +_mii_config_win_to_conf( + mii_ui_machine_config_t * m) +{ + mui_window_t * w = &m->win; + mii_machine_config_t * cf = &m->config; + +// cf->reboot_on_load = !!mui_control_get_value( +// mui_control_get_by_id(w, MII_SLOT_REBOOT)); + cf->titan_accelerator = !!mui_control_get_value( + mui_control_get_by_id(w, MII_SLOT_TITAN)); + cf->no_slot_clock = !!mui_control_get_value( + mui_control_get_by_id(w, MII_SLOT_NSC)); + + for (int slot_id = 1; slot_id < 8; slot_id++) { + mui_control_t * c = mui_control_get_by_id( + w, MII_SLOT_DRIVER_POP + slot_id); + mui_menu_items_t * items = mui_popupmenu_get_items(c); + int pop_val = mui_control_get_value(c); + mui_menu_item_t * item = &items->e[pop_val]; + // printf("%s popup slot %d %4.4s '%s'\n", __func__, + // slot_id, + // (char*)&item->uid, item->title); + mui_control_t * c2 = mui_control_get_by_id(w, + MII_SLOT_DRIVER_CONF + slot_id); + if (c2) { + mui_control_set_state(c2, + _mii_slot_drivers[pop_val].has_config ? + MUI_CONTROL_STATE_NORMAL : + MUI_CONTROL_STATE_DISABLED); + } + if (cf->slot[slot_id-1].driver != item->uid) { + cf->slot[slot_id-1].driver = item->uid; + memset(&cf->slot[slot_id-1].conf, 0, + sizeof(cf->slot[slot_id-1].conf)); + } + } +} + +static void +_mii_config_conf_to_win( + mii_ui_machine_config_t * m) +{ + mui_window_t * w = &m->win; + mii_machine_config_t * cf = &m->config; + +// mui_control_set_value(mui_control_get_by_id(w, MII_SLOT_REBOOT), +// cf->reboot_on_load); + mui_control_set_value(mui_control_get_by_id(w, MII_SLOT_TITAN), + cf->titan_accelerator); + mui_control_set_value(mui_control_get_by_id(w, MII_SLOT_NSC), + cf->no_slot_clock); + + for (int slot_id = 1; slot_id < 8; slot_id++) { + mui_control_t * c = mui_control_get_by_id( + w, MII_SLOT_DRIVER_POP + slot_id); + mui_control_set_value(c, cf->slot[slot_id-1].driver); + + mui_control_t * c2 = mui_control_get_by_id(w, + MII_SLOT_DRIVER_CONF + slot_id); + if (c2) { + mui_control_set_state(c2, + _mii_slot_drivers[cf->slot[slot_id-1].driver].has_config ? + MUI_CONTROL_STATE_NORMAL : + MUI_CONTROL_STATE_DISABLED); + } + } +} + +static int +_mii_config_sub_save_cb( + mui_window_t *win, // the sub window/dialog + void * cb_param, + uint32_t what, + void * param) +{ +// mii_ui_machine_config_t * m = cb_param; + printf("%s %4.4s\n", __func__, (char*)&what); + + return 0; +} + +mui_window_t * +mii_mui_configure_slot( + struct mui_t *mui, + mii_machine_config_t *config, + int slot_id) +{ + printf("%s config slot %d\n", __func__, slot_id); + mui_window_t * res = NULL; + switch (config->slot[slot_id].driver) { + case MII_SLOT_DRIVER_SMARTPORT: { + config->slot[slot_id].conf.smartport.slot_id = slot_id; + res = mii_mui_load_2dsk(mui, + &config->slot[slot_id].conf.smartport, + MII_2DSK_SMARTPORT); + } break; + case MII_SLOT_DRIVER_DISK2: { + config->slot[slot_id].conf.disk2.slot_id = slot_id; + res = mii_mui_load_2dsk(mui, + &config->slot[slot_id].conf.disk2, + MII_2DSK_DISKII); + } break; + case MII_SLOT_DRIVER_ROM1MB: { + config->slot[slot_id].conf.rom1mb.slot_id = slot_id; + res = mii_mui_load_1mbrom(mui, + &config->slot[slot_id].conf.rom1mb); + } break; + case MII_SLOT_DRIVER_SUPERSERIAL: { + mui_alert(mui, C2_PT(0,0), + "Not implemented yet", + "SSC is not implemented yet!\n" + "Driver is present just a placeholder, sorry.", + MUI_ALERT_FLAG_OK); + } break; + } + return res; +} + +static int +_mii_config_slot_action_cb( + mui_control_t * c, // control here + void * cb_param, // mii_ui_machine_config_t + uint32_t what, + void * param) // not used +{ + printf("%s %4.4s\n", __func__, (char*)&what); + mii_ui_machine_config_t * m = cb_param; + uint32_t uid = mui_control_get_uid(c); + + switch (what) { + case MUI_CONTROL_ACTION_SELECT: + printf("%s control %4.4s\n", __func__, (char*)&uid); + switch (uid) { + case MII_SLOT_SAVE: { + // save the config + printf("%s save\n", __func__); + _mii_config_win_to_conf(m); + if (m->dst) + *m->dst = m->config; + mui_window_action(&m->win, MII_MUI_SLOTS_SAVE, m->dst); + mui_window_dispose(&m->win); + } break; + case MII_SLOT_CANCEL: { + // cancel the config + printf("%s cancel\n", __func__); + mui_window_dispose(&m->win); + } break; + case MII_SLOT_DEFAULT: { + // set the default config + printf("%s default\n", __func__); + m->config = _default_config; + _mii_config_conf_to_win(m); + } break; +#if 0 + case MII_SLOT_REBOOT: { + // reboot the machine + printf("%s reboot\n", __func__); + m->config.reboot_on_load = !m->config.reboot_on_load; + } break; +#endif + case MII_SLOT_NSC: { + // no slot clock + printf("%s nsc\n", __func__); + m->config.no_slot_clock = !m->config.no_slot_clock; + } break; + case MII_SLOT_TITAN: { + // titan accelerator + printf("%s titan\n", __func__); + m->config.titan_accelerator = !m->config.titan_accelerator; + } break; + case MII_SLOT_DRIVER_CONF + 1 ... MII_SLOT_DRIVER_CONF + 7: { + // configure a slot + int slot_id = uid - MII_SLOT_DRIVER_CONF - 1; + printf("%s config slot %d\n", __func__, slot_id); + switch (m->config.slot[slot_id].driver) { + case MII_SLOT_DRIVER_SMARTPORT: { + m->config.slot[slot_id].conf.smartport.slot_id = slot_id; + mui_window_set_action( + mii_mui_load_2dsk(m->win.ui, + &m->config.slot[slot_id].conf.smartport, + MII_2DSK_SMARTPORT), + _mii_config_sub_save_cb, m); + } break; + case MII_SLOT_DRIVER_DISK2: { + m->config.slot[slot_id].conf.disk2.slot_id = slot_id; + mui_window_set_action( + mii_mui_load_2dsk(m->win.ui, + &m->config.slot[slot_id].conf.disk2, + MII_2DSK_DISKII), + _mii_config_sub_save_cb, m); + } break; + case MII_SLOT_DRIVER_ROM1MB: { + m->config.slot[slot_id].conf.rom1mb.slot_id = slot_id; + mui_window_set_action( + mii_mui_load_1mbrom(m->win.ui, + &m->config.slot[slot_id].conf.rom1mb), + _mii_config_sub_save_cb, m); + } break; + case MII_SLOT_DRIVER_SUPERSERIAL: { + mui_alert(m->win.ui, C2_PT(0,0), + "Not implemented yet", + "SSC is not implemented yet!\n" + "Driver is present just a placeholder, sorry.", + MUI_ALERT_FLAG_OK); + } break; + } + } break; + } + break; + case MUI_CONTROL_ACTION_VALUE_CHANGED: + // a popup menu changed + printf("%s popup %4.4s\n", __func__, (char*)&uid); + switch (uid) { + case MII_SLOT_DRIVER_POP + 1 ... MII_SLOT_DRIVER_POP + 7: { + _mii_config_win_to_conf(m); + } break; + } + break; + } + return 0; +} + +struct mui_window_t * +mii_mui_configure_slots( + struct mui_t *mui, + mii_machine_config_t *config) +{ + mui_t *ui = mui; + + mui_window_t *w = mui_window_get_by_id(mui, MII_SLOT_WINDOW_ID); + if (w) { + mui_window_select(w); + return w; + } + c2_pt_t where = {}; + c2_rect_t wpos = C2_RECT_WH(where.x, where.y, 520, 480); + if (where.x == 0 && where.y == 0) + c2_rect_offset(&wpos, + (ui->screen_size.x / 2) - (c2_rect_width(&wpos) / 2), + (ui->screen_size.y * 0.4) - (c2_rect_height(&wpos) / 2)); + w = mui_window_create(mui, + wpos, + NULL, 0, + "Configure " MUI_GLYPH_IIE " Slots", + sizeof(mii_ui_machine_config_t)); + mui_window_set_id(w, MII_SLOT_WINDOW_ID); + mii_ui_machine_config_t *m = (mii_ui_machine_config_t*)w; + + mui_control_t * c = NULL; + c2_rect_t cf; + cf = C2_RECT_WH(0, 0, 120, 40); + c2_rect_left_of(&cf, c2_rect_width(&w->content), 20); + c2_rect_top_of(&cf, c2_rect_height(&w->content), 20); + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_DEFAULT, + "Reboot", MII_SLOT_SAVE); + c->key_equ = MUI_KEY_EQU(0, 13); + c2_rect_left_of(&cf, cf.l, 20); + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Cancel", MII_SLOT_CANCEL); + c->key_equ = MUI_KEY_EQU(0, 27); + + c2_rect_right_of(&cf, 0, 20); + cf.r = cf.l + 200; + #if 0 + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_CHECKBOX, + "Reboot Now", MII_SLOT_REBOOT); + #endif + c2_rect_top_of(&cf, cf.t, 36); + cf.r = cf.l + 120; + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Default", MII_SLOT_DEFAULT); + c2_rect_right_of(&cf, cf.r, 30); + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_CHECKBOX, + "No Slot Clock", MII_SLOT_NSC); + c2_rect_right_of(&cf, cf.r, 30); + cf.r = cf.l + 200; + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_CHECKBOX, + "Titan Accelerator", MII_SLOT_TITAN); + + c2_rect_bottom_of(&cf, cf.b, 16); + cf.l = 60; + cf.r = c2_rect_width(&w->content) - 60; + cf.b = cf.t + 1; + c = mui_separator_new(w, cf); + + c2_rect_t slot_line_rect = C2_RECT_WH(0, 0, 500, 34); + cf = slot_line_rect; + cf.r = cf.l + 50; + c = mui_textbox_new(w, cf, "Slot", NULL, + MUI_TEXT_ALIGN_RIGHT | MUI_TEXT_ALIGN_MIDDLE); + c2_rect_right_of(&cf, cf.r, 6); + cf.r = cf.l + 240; + c = mui_textbox_new(w, cf, "Driver", NULL, + MUI_TEXT_ALIGN_CENTER | MUI_TEXT_ALIGN_MIDDLE); + c2_rect_right_of(&cf, cf.r, 30); + cf.r = cf.l + 150; + c = mui_textbox_new(w, cf, "Config", NULL, + MUI_TEXT_ALIGN_CENTER | MUI_TEXT_ALIGN_MIDDLE); + + c2_rect_offset(&slot_line_rect, 0, 36); + for (int i = 1; i < 8; i++) { + cf = slot_line_rect; + cf.r = cf.l + 50; + char idx[16]; + sprintf(idx, "%d:", i); + c = mui_textbox_new(w, cf, idx, NULL, + MUI_TEXT_ALIGN_RIGHT | MUI_TEXT_ALIGN_MIDDLE); + c2_rect_right_of(&cf, cf.r, 6); + cf.r = cf.l + 240; + c = mui_popupmenu_new(w, cf, + "Popup", MII_SLOT_DRIVER_POP + i); + mui_menu_items_t * items = mui_popupmenu_get_items(c); + mui_menu_items_clear(items); + for (int j = 0; _mii_slot_drivers[j].label; j++) { + mui_menu_item_t i = { + .title = strdup(_mii_slot_drivers[j].label), + .uid = j, + }; + mui_menu_items_push(items, i); + } + mui_menu_item_t z = {}; + mui_menu_items_push(items, z); + mui_popupmenu_prepare(c); + + c2_rect_right_of(&cf, cf.r, 30); + cf.r = cf.l + 150; + c = mui_button_new(w, + cf, MUI_BUTTON_STYLE_NORMAL, + "Config…", MII_SLOT_DRIVER_CONF + i); + c2_rect_offset(&slot_line_rect, 0, 38); + } + c = NULL; + TAILQ_FOREACH(c, &w->controls, self) { + if (mui_control_get_uid(c) == 0) + continue; + mui_control_set_action(c, _mii_config_slot_action_cb, m); + } + m->dst = config; + if (config) { + if (config->load_defaults) + m->config = _default_config; + else + m->config = *config; + } + _mii_config_conf_to_win(m); + return w; +} diff --git a/nuklear/mii_thread.c b/ui_gl/mii_thread.c similarity index 67% rename from nuklear/mii_thread.c rename to ui_gl/mii_thread.c index 5a57bfd..768928b 100644 --- a/nuklear/mii_thread.c +++ b/ui_gl/mii_thread.c @@ -5,7 +5,6 @@ * * SPDX-License-Identifier: MIT */ -#include #include #include #include @@ -15,7 +14,7 @@ #include #include #include - +#include // probably should wrap these into a HAVE_JOYSTICK define for non-linux #ifndef HAVE_JOYSTICK #define HAVE_JOYSTICK 1 @@ -24,6 +23,7 @@ #include "mii.h" #include "mii_thread.h" +#include typedef uint64_t mii_time_t; enum { MII_TIME_RES = 1, @@ -40,25 +40,44 @@ mii_get_time() return time; } -static bool mii_thread_running = false; static float default_fps = 60; mii_th_fifo_t signal_fifo; +int +mii_thread_set_fps( + int timerfd, + float fps) +{ + default_fps = fps; + long target_fps_us = 1000000 / default_fps; + struct itimerspec its = { + .it_interval = { .tv_sec = 0, .tv_nsec = target_fps_us * 1000 }, + .it_value = { .tv_sec = 0, .tv_nsec = target_fps_us * 1000 }, + }; + if (timerfd_settime(timerfd, 0, &its, NULL) < 0) { + perror(__func__); + return -1; + } + return 0; +} + static void * mii_thread_cpu_regulator( void *arg) { mii_t *mii = (mii_t *) arg; - mii_thread_running = true; - mii_cycles_t last_cycles = mii->cycles; uint32_t running = 1; - unsigned long target_fps_us = 1000000 / default_fps; - long sleep_time = target_fps_us; - //mii_time_t base = mii_get_time(NULL); + // use a timerfd as regulation + int timerfd = timerfd_create(CLOCK_MONOTONIC, 0); + if (timerfd < 0) { + perror(__func__); + return NULL; + } + mii_thread_set_fps(timerfd, default_fps); + mii->state = MII_RUNNING; uint32_t last_frame = mii->video.frame_count; - mii_time_t last_frame_stamp = mii_get_time(); - while (mii_thread_running) { + while (running) { mii_th_signal_t sig; while (!mii_th_fifo_isempty(&signal_fifo)) { sig = mii_th_fifo_read(&signal_fifo); @@ -77,23 +96,22 @@ mii_thread_cpu_regulator( break; case SIGNAL_RUN: mii->state = MII_RUNNING; - last_frame_stamp = mii_get_time(); running = 1; break; } } if (mii->state != MII_STOPPED) mii_run(mii); - + bool sleep = false; switch (mii->state) { case MII_STOPPED: - usleep(1000); + sleep = true; break; case MII_STEP: + sleep = true; if (running) { running--; mii_dump_trace_state(mii); - usleep(1000); running = 1; if (mii->trace.step_inst) mii->trace.step_inst--; @@ -102,37 +120,20 @@ mii_thread_cpu_regulator( } break; case MII_RUNNING: + sleep = mii->video.frame_count != last_frame; + if (sleep) + last_frame = mii->video.frame_count; break; case MII_TERMINATE: - mii_thread_running = false; + running = 0; break; } - - if (mii->video.frame_count != last_frame) { - sleep_time = target_fps_us; - mii_time_t now = mii_get_time(); - if (mii->state == MII_RUNNING) { - mii_time_t delta = now - last_frame_stamp; - // printf("frame time %d/%d sleep time %d\n", - // (int)delta, (int)target_fps_us, - // (int)target_fps_us - delta); - sleep_time = target_fps_us - delta; - if (sleep_time < 0) - sleep_time = 0; - last_frame = mii->video.frame_count; - while (last_frame_stamp <= now) - last_frame_stamp += target_fps_us; - - // calculate the MHz - mii_cycles_t cycles = mii->cycles; - mii_cycles_t delta_cycles = cycles - last_cycles; - last_cycles = cycles; - mii->speed_current = delta_cycles / (float)target_fps_us; - } - usleep(sleep_time); + if (sleep) { + uint64_t timer_v; + read(timerfd, &timer_v, sizeof(timer_v)); } } - mii_dispose(mii); + mii_dispose(mii); // this sets mii->state to MII_INIT return NULL; } @@ -154,7 +155,29 @@ mii_thread_joystick( perror(__func__); return NULL; } - + char name[128]; + if (ioctl(fd, JSIOCGNAME(sizeof(name)), name) == -1) { + perror(__func__); + return NULL; + } + printf("Joystick found: '%s'\n", name); +#if 0 + printf(" %d axes, %d buttons\n", axes, buttons); + // get and print mappings + struct js_corr corr[axes] = {}; + if (ioctl(fd, JSIOCGCORR, corr) == -1) { + perror(__func__); + // return NULL; + } + printf(" %d axes, %d buttons\n", axes, buttons); + for (int i = 0; i < axes; i++) { + printf("coor %d: type %d, prec %d: %d %d %d %d\n", i, + corr[i].type, corr[i].prec, + corr[i].coef[0], corr[i].coef[1], + corr[i].coef[2], corr[i].coef[3]); + } + printf("Joystick thread started: %d axis, %d buttons\n", axes, buttons); +#endif struct js_event event; mii_t *mii = (mii_t *)arg; mii->analog.v[0].value = 127; @@ -205,18 +228,19 @@ mii_thread_joystick( } #endif -void +pthread_t mii_thread_start( mii_t *mii) { const mii_th_fifo_t zero = {}; signal_fifo = zero; - pthread_t thread; - pthread_create(&thread, NULL, mii_thread_cpu_regulator, mii); + pthread_t cpu, joystick; + pthread_create(&cpu, NULL, mii_thread_cpu_regulator, mii); #if HAVE_JOYSTICK - pthread_create(&thread, NULL, mii_thread_joystick, mii); + pthread_create(&joystick, NULL, mii_thread_joystick, mii); #endif + return cpu; } struct mii_th_fifo_t* diff --git a/nuklear/mii_thread.h b/ui_gl/mii_thread.h similarity index 89% rename from nuklear/mii_thread.h rename to ui_gl/mii_thread.h index 7b9be87..1e34de3 100644 --- a/nuklear/mii_thread.h +++ b/ui_gl/mii_thread.h @@ -28,9 +28,13 @@ DEFINE_FIFO(mii_th_signal_t, mii_th_fifo); struct mii_t; -void +pthread_t mii_thread_start( struct mii_t *mii); struct mii_th_fifo_t* mii_thread_get_fifo( struct mii_t *mii); +int +mii_thread_set_fps( + int timerfd, + float fps); diff --git a/utils/icon-convert-tcc.c b/utils/icon-convert-tcc.c new file mode 100644 index 0000000..d03cbcd --- /dev/null +++ b/utils/icon-convert-tcc.c @@ -0,0 +1,80 @@ +/* + first convert the .png to binary files in contrib using imagemagik: + $ convert your_image.png -depth 8 rgba:your_image.bin + run this with + $ tcc -run icon-convert-tcc.c + */ +#include +#include +#include +#include +#include +#include +#include + +/* this loads each contrib/mii-icon-*.bin file which is raw RGBA and + add the header width/height, and convert the pixels to ARGB */ + +int main() { + glob_t g = {}; + glob("contrib/mii-icon-*.bin", 0, NULL, &g); + for (int i = 0; i < g.gl_pathc; i++) { + char * path = strdup(g.gl_pathv[i]); + char * name = basename(path); + char * dot = strrchr(name, '.'); + if (dot) + *dot = 0; + char * dup = strdup(name); + char * size = strrchr(dup, '-'); + if (size) + size++; + int w = 0, h = 0; + if (size) + w = h = atoi(size); + char *orig = g.gl_pathv[i]; + if (!w || !h) { + printf("bad size %s\n", orig); + continue; + } + FILE * f = fopen(orig, "rb"); + if (!f) { + perror(orig); + printf("bad file %s\n", orig); + continue; + } + fseek(f, 0, SEEK_END); + int size_ = ftell(f); + fseek(f, 0, SEEK_SET); + unsigned char * pixels = malloc(size_); + fread(pixels, 1, size_, f); + fclose(f); + char out[1024]; + snprintf(out, sizeof(out), "contrib/%s.h", name); + f = fopen(out, "wb"); + if (!f) { + printf("bad file %s\n", out); + continue; + } + fprintf(f, "/* this file is auto-generated by icon-convert-tcc.c */\n"); + // fprintf(f, "#include \n"); + fprintf(f, "static const unsigned long mii_icon%d[] = {\n", w); + fprintf(f, "\t%d,%d,\n", w, h); + for (int y = 0; y < h; y++) { + fprintf(f, "\t"); + for (int x = 0; x < w; x++) { + int i = (y * w + x) * 4; + int r = pixels[i + 0]; + int g = pixels[i + 1]; + int b = pixels[i + 2]; + int a = pixels[i + 3]; + fprintf(f, "0x%02x%02x%02x%02x, ", a, r, g, b); + if (x % 8 == 7) + fprintf(f, "\n\t"); + } + fprintf(f, "\n"); + } + fprintf(f, "};\n"); + fclose(f); + free(pixels); + } +} \ No newline at end of file