From 9a4c74ad932b5cb702d9de202349f5581359ec14 Mon Sep 17 00:00:00 2001 From: IoIxD Date: Tue, 9 Dec 2025 20:11:01 -0600 Subject: [PATCH 01/13] Unfinished Wayland PR (#1) moved from the github repo. current progress: image.png Other notes: - took the opportunity to remove MwLLSetBackground which I was told was deprecated - Updated .gitignore to more accurately cover/remove example binaries - Uses OpenGL as the backend. - New LL function for swapping buffers, MwLLEndDraw - [TODO] Uses weak linking for all libraries so that systems that don't support Wayland or even have it installed can launch without it. Reviewed-on: https://gitea.nishi.boats/pyrite-dev/milsko/pulls/1 Co-authored-by: IoIxD Co-committed-by: IoIxD --- include/Mw/BaseTypes.h | 4 +- include/Mw/LowLevel.h | 17 +- include/Mw/LowLevel/Wayland.h | 121 +++ include/Mw/LowLevel/Wayland/.gitignore | 1 + include/Mw/LowLevel/Wayland/README.md | 1 + include/Mw/MachDep.h | 2 + pl/rules.pl | 25 +- pl/utils.pl | 32 + src/backend/.gitignore | 1 + src/backend/call.c | 6 +- src/backend/gdi.c | 8 + src/backend/wayland.c | 1150 ++++++++++++++++++++++++ src/backend/x11.c | 9 +- src/core.c | 12 +- src/draw.c | 1 + src/lowlevel.c | 3 + src/widget/opengl.c | 35 + src/widget/scrollbar.c | 8 +- 18 files changed, 1424 insertions(+), 12 deletions(-) create mode 100644 include/Mw/LowLevel/Wayland.h create mode 100644 include/Mw/LowLevel/Wayland/.gitignore create mode 100644 include/Mw/LowLevel/Wayland/README.md create mode 100644 src/backend/.gitignore create mode 100644 src/backend/wayland.c diff --git a/include/Mw/BaseTypes.h b/include/Mw/BaseTypes.h index e44c3bcf3..7b92c9335 100644 --- a/include/Mw/BaseTypes.h +++ b/include/Mw/BaseTypes.h @@ -58,8 +58,8 @@ typedef unsigned long MwU64; #ifdef OTHER_TYPES_DEFINED #undef OTHER_TYPES_DEFINED #else -typedef int MwI32; -typedef unsigned int MwU32; +typedef int MwI32; +typedef unsigned int MwU32; typedef short MwI16; typedef unsigned short MwU16; diff --git a/include/Mw/LowLevel.h b/include/Mw/LowLevel.h index c9437fe54..167785aeb 100644 --- a/include/Mw/LowLevel.h +++ b/include/Mw/LowLevel.h @@ -25,7 +25,8 @@ typedef void* MwLLPixmap; enum MwLLBackends { MwLLBackendX11 = 0, - MwLLBackendGDI + MwLLBackendGDI, + MwLLBackendWayland, }; struct _MwLLCommon { @@ -55,6 +56,9 @@ struct _MwLLCommonPixmap { #ifdef USE_GDI #include #endif +#ifdef USE_WAYLAND +#include +#endif union _MwLL { struct _MwLLCommon common; @@ -64,6 +68,9 @@ union _MwLL { #ifdef USE_GDI struct _MwLLGDI gdi; #endif +#ifdef USE_WAYLAND + struct _MwLLWayland wayland; +#endif }; union _MwLLColor { @@ -74,6 +81,9 @@ union _MwLLColor { #ifdef USE_GDI struct _MwLLGDIColor gdi; #endif +#ifdef USE_WAYLAND + struct _MwLLWaylandColor wayland; +#endif }; union _MwLLPixmap { @@ -84,6 +94,9 @@ union _MwLLPixmap { #ifdef USE_GDI struct _MwLLGDIPixmap gdi; #endif +#ifdef USE_WAYLAND + struct _MwLLWaylandPixmap wayland; +#endif }; #endif #include @@ -149,6 +162,8 @@ MWDECL void (*MwLLDestroy)(MwLL handle); MWDECL void (*MwLLPolygon)(MwLL handle, MwPoint* points, int points_count, MwLLColor color); MWDECL void (*MwLLLine)(MwLL handle, MwPoint* points, MwLLColor color); +MWDECL void (*MwLLBeginDraw)(MwLL handle); +MWDECL void (*MwLLEndDraw)(MwLL handle); MWDECL MwLLColor (*MwLLAllocColor)(MwLL handle, int r, int g, int b); MWDECL void (*MwLLColorUpdate)(MwLL handle, MwLLColor c, int r, int g, int b); diff --git a/include/Mw/LowLevel/Wayland.h b/include/Mw/LowLevel/Wayland.h new file mode 100644 index 000000000..af80f4762 --- /dev/null +++ b/include/Mw/LowLevel/Wayland.h @@ -0,0 +1,121 @@ +/*! + * @file Mw/LowLevel/Wayland.h + * @brief Work in progress Wayland Backend + * @warning This is used internally. + * @warning This is disabled by default. + */ +#ifndef __MW_LOWLEVEL_WAYLAND_H__ +#define __MW_LOWLEVEL_WAYLAND_H__ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +MWDECL int MwLLWaylandCallInit(void); + +#ifndef WL_PROTOCOLS_DEFINED +#define WL_PROTOCOLS_DEFINED +#include "Wayland/xdg-shell-client-protocol.h" +#include "Wayland/xdg-decoration-client-protocol.h" +#include "Wayland/cursor-shape-client-protocol.h" +#endif + +struct _MwLLWayland; + +typedef struct wayland_protocol { + void* listener; + void* context; +} wayland_protocol_t; + +typedef wayland_protocol_t*(wl_setup_func)(MwU32, struct _MwLLWayland*); + +struct _MwLLWaylandTopLevel { + struct xdg_surface* xdg_surface; + struct xdg_toplevel* xdg_top_level; + struct xdg_toplevel_listener xdg_toplevel_listener; + struct xdg_surface_listener xdg_surface_listener; + + struct xkb_context* xkb_context; + struct xkb_keymap* xkb_keymap; + struct xkb_state* xkb_state; + + MwBool compositor_created; + MwBool xdg_wm_base_created; + MwBool xdg_surface_created; +}; + +struct _MwLLWayland { + struct _MwLLCommon common; + + /* Pointer for data that's only loaded if the widget is a toplevel */ + struct _MwLLWaylandTopLevel* toplevel; + + enum { + MWLL_WAYLAND_TOPLEVEL = 0, + MWLL_WAYLAND_SUBLEVEL = 1, /* Sublevels are surfaces that have the toplevel as a parent. They could be implemented as subsurfaces if we ever switch away from OpenGL. Some parts of the code also call them subwidgets. */ + } type; + + /* Map of Wayland interfaces to their relevant setup functions. */ + struct { + const char* key; + wl_setup_func* value; + }* wl_protocol_setup_map; + + /* Map of Wayland interfaces to any information we keep about them once we've registered them. */ + struct { + const char* key; + wayland_protocol_t* value; + }* wl_protocol_map; + + struct wl_display* display; + struct wl_registry* registry; + struct wl_compositor* compositor; + struct wl_subcompositor* subcompositor; + struct wl_surface* surface; + struct wl_registry_listener registry_listener; + struct wl_event_queue* event_queue; + + EGLNativeWindowType egl_window_native; + EGLDisplay egl_display; + EGLContext egl_context; + EGLSurface egl_surface; + EGLConfig egl_config; + + MwLL* sublevels; /* stb_ds managed array of any sublevels */ + MwBool configured; /* Whether or not xdg_toplevel_configure has run once */ + MwBool egl_setup; /* Whether or not EGL has been set up */ + MwBool has_set_xy /* Whether or not MwSetXY has been called */; + + int resize_counter; /* Counter that's for a hack in event_loop */ + MwU32 x, y, ww, wh; /* Window position */ + MwU32 lw, lh; /* Last known window position */ + MwPoint cur_mouse_pos; /* Currently known mouse position */ + + struct timeval timer; + MwU64 cooldown_timer; + MwU64 cooldown_timer_epoch; + + MwLL parent; + MwLL topmost_parent; /* The parent at the top of all the other parents. Usually a toplevel. */ +}; + +struct _MwLLWaylandColor { + struct _MwLLCommonColor common; +}; + +struct _MwLLWaylandPixmap { + struct _MwLLCommonPixmap common; + GLuint texture; + MwBool texture_deleted; +}; + +#endif diff --git a/include/Mw/LowLevel/Wayland/.gitignore b/include/Mw/LowLevel/Wayland/.gitignore new file mode 100644 index 000000000..25a4663fa --- /dev/null +++ b/include/Mw/LowLevel/Wayland/.gitignore @@ -0,0 +1 @@ +*protocol.h diff --git a/include/Mw/LowLevel/Wayland/README.md b/include/Mw/LowLevel/Wayland/README.md new file mode 100644 index 000000000..e0c17e81f --- /dev/null +++ b/include/Mw/LowLevel/Wayland/README.md @@ -0,0 +1 @@ +Folder for wayland-scanner to place any of its files. diff --git a/include/Mw/MachDep.h b/include/Mw/MachDep.h index cbc8bcde6..6eb37be7f 100644 --- a/include/Mw/MachDep.h +++ b/include/Mw/MachDep.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -43,6 +44,7 @@ #include #include #include +#include #endif #ifndef M_PI diff --git a/pl/rules.pl b/pl/rules.pl index 8b9e123be..ab5521b50 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -26,6 +26,26 @@ if (grep(/^gdi$/, @backends)) { $gl_libs = "-lopengl32 -lglu32"; } +if (grep(/^wayland$/, @backends)) { + add_cflags("-DUSE_WAYLAND"); + new_object("src/backend/wayland.c"); + if ($cross) { + add_libs("-lGL -lEGL -lwayland-egl -lwayland-client -lxkbcommon"); + } + else { + add_libs("-lGL -lEGL"); + add_cflags(`pkg-config --cflags wayland-egl wayland-client xkbcommon`); + add_libs(`pkg-config --libs wayland-egl wayland-client xkbcommon`); + } + + scan_wayland_protocol("stable", "xdg-shell", ""); + scan_wayland_protocol("stable", "tablet", "-v2"); + scan_wayland_protocol("staging", "cursor-shape", "-v1"); + scan_wayland_protocol("unstable", "xdg-decoration", "-unstable-v1"); + + $gl_libs = "-lGL -lGLU"; +} + if (param_get("stb-image")) { add_cflags("-DUSE_STB_IMAGE"); } @@ -34,7 +54,10 @@ if (param_get("stb-truetype")) { } if (param_get("freetype2")) { add_cflags("-DUSE_FREETYPE2"); - if (not($cross)) { + if ($cross) { + add_libs("-lfreetype"); + } + else { add_cflags(`pkg-config --cflags freetype2`); add_libs(`pkg-config --libs freetype2`); } diff --git a/pl/utils.pl b/pl/utils.pl index a84371d3e..971c19626 100644 --- a/pl/utils.pl +++ b/pl/utils.pl @@ -54,6 +54,38 @@ sub use_backend { } } +sub scan_wayland_protocol { + my $tier = $_[0]; + my $proto = $_[1]; + my $ver = $_[2]; + + my $proto_c = "src/backend/wayland-${proto}-protocol.c"; + + if ( + system( +"wayland-scanner private-code /usr/share/wayland-protocols/${tier}/${proto}/${proto}${ver}.xml ${proto_c}" + ) != 0 + ) + { + print( +"^ Error on getting private code for /usr/share/wayland-protocols/${tier}/${proto}/${proto}${ver}.xml\n" + ); + } + else { + new_object($proto_c); + } + if ( + system( +"wayland-scanner client-header /usr/share/wayland-protocols/${tier}/${proto}/${proto}${ver}.xml include/Mw/LowLevel/Wayland/${proto}-client-protocol.h" + ) + ) + { + print( +"^ Error on getting client header for /usr/share/wayland-protocols/${tier}/${proto}/${proto}${ver}.xml\n" + ); + } +} + our %params = (); sub param_set { diff --git a/src/backend/.gitignore b/src/backend/.gitignore new file mode 100644 index 000000000..137387c58 --- /dev/null +++ b/src/backend/.gitignore @@ -0,0 +1 @@ +wayland*protocol.c diff --git a/src/backend/call.c b/src/backend/call.c index 2ce5ed234..e2ce934c9 100644 --- a/src/backend/call.c +++ b/src/backend/call.c @@ -8,8 +8,10 @@ MwLLCreate = MwLLCreateImpl; \ MwLLDestroy = MwLLDestroyImpl; \ \ - MwLLPolygon = MwLLPolygonImpl; \ - MwLLLine = MwLLLineImpl; \ + MwLLPolygon = MwLLPolygonImpl; \ + MwLLLine = MwLLLineImpl; \ + MwLLBeginDraw = MwLLBeginDrawImpl; \ + MwLLEndDraw = MwLLEndDrawImpl; \ \ MwLLAllocColor = MwLLAllocColorImpl; \ MwLLColorUpdate = MwLLColorUpdateImpl; \ diff --git a/src/backend/gdi.c b/src/backend/gdi.c index 6cc557dbb..85f8fcbb0 100644 --- a/src/backend/gdi.c +++ b/src/backend/gdi.c @@ -280,6 +280,14 @@ static void MwLLDestroyImpl(MwLL handle) { free(handle); } +static void MwLLBeginDrawImpl(MwLL handle) { + (void)handle; +} + +static void MwLLEndDrawImpl(MwLL handle) { + (void)handle; +} + static void MwLLPolygonImpl(MwLL handle, MwPoint* points, int points_count, MwLLColor color) { POINT* p = malloc(sizeof(*p) * points_count); HPEN pen = CreatePen(PS_NULL, 0, RGB(0, 0, 0)); diff --git a/src/backend/wayland.c b/src/backend/wayland.c new file mode 100644 index 000000000..307e1ee70 --- /dev/null +++ b/src/backend/wayland.c @@ -0,0 +1,1150 @@ +#include + +#include +#include + +#include "../../external/stb_ds.h" + +#include +#include +#include + +/* TODO: find out what FreeBSD and such wants us to include */ +#ifdef __FreeBSD__ +/* XXX: Untested (nishi) */ +#include +#else +#include +#include +#endif + +/* + * TODO: + * make sure MwLLDestroy is finished (+ handle dropdown bug that results from it) + * GNOME doesn't want to support zxdg_decoration_protocol so we're gonna design some Windows 95 ass ui just for that window manager. + * finish the rest of the owl + */ + +/* + * Redraw `handle` if the given cooldown hasn't expired (`time` >= `cooldown_timer` + `cooldown)). + * Used for pointer callbacks, resize callbacks, etc. to ensure we only resize every x milliseconds + */ +static void timed_redraw(MwLL handle, MwU32 time, int cooldown, MwU64* cooldown_timer); + +/* Get the registered interface from r, or NULL if it doesn't currently have it. */ +#define WAYLAND_GET_INTERFACE(handle, inter) shget(handle.wl_protocol_map, inter##_interface.name) + +/* `wl_registry.global` callback */ +static void new_protocol(void* data, struct wl_registry* registry, + MwU32 name, const char* interface, + MwU32 version) { + struct _MwLLWayland* wayland = data; + + wl_setup_func* func = shget(wayland->wl_protocol_setup_map, interface); + if(func != NULL) { + /* printf("registering interface %s\n", interface); */ + shput(wayland->wl_protocol_map, interface, func(name, data)); + } else { + /* printf("unknown interface %s\n", interface); */ + } +}; + +/* `wl_registry.global_remove` callback */ +static void protocol_removed(void* data, + struct wl_registry* registry, + MwU32 name) { + +}; + +/* `wl_pointer.enter` callback */ +static void pointer_enter(void* data, struct wl_pointer* wl_pointer, MwU32 serial, + struct wl_surface* surface, wl_fixed_t surface_x, + wl_fixed_t surface_y) { +}; + +/* `wl_pointer.leave` callback */ +static void pointer_leave(void* data, struct wl_pointer* wl_pointer, MwU32 serial, + struct wl_surface* surface) { +}; + +/* `wl_pointer.motion` callback */ +static void pointer_motion(void* data, struct wl_pointer* wl_pointer, MwU32 time, + wl_fixed_t surface_x, wl_fixed_t surface_y) { + MwLL self = data; + MwLLMouse p; + + self->wayland.cur_mouse_pos.x = wl_fixed_to_double(surface_x); + self->wayland.cur_mouse_pos.y = wl_fixed_to_double(surface_y); + p.point = self->wayland.cur_mouse_pos; + MwLLDispatch(self, move, &p); + + timed_redraw(self, time, 50, &self->wayland.cooldown_timer); +}; + +/* `wl_pointer.button` callback */ +static void pointer_button(void* data, struct wl_pointer* wl_pointer, MwU32 serial, MwU32 time, MwU32 button, MwU32 state) { + MwLL self = data; + MwLLMouse p; + p.point = self->wayland.cur_mouse_pos; + if(p.point.x > self->wayland.x && p.point.x < self->wayland.x + self->wayland.ww && p.point.y > self->wayland.y && p.point.y < self->wayland.y + self->wayland.wh) { + switch(button) { + case BTN_LEFT: + p.button = MwLLMouseLeft; + break; + case BTN_MIDDLE: + p.button = MwLLMouseMiddle; + break; + case BTN_RIGHT: + p.button = MwLLMouseRight; + break; + } + switch(state) { + case WL_POINTER_BUTTON_STATE_PRESSED: + MwLLDispatch(self, down, &p); + break; + case WL_POINTER_BUTTON_STATE_RELEASED: + MwLLDispatch(self, up, &p); + break; + } + } + MwLLDispatch(self, draw, NULL); +}; + +/* `wl_pointer.axis` callback */ +static void pointer_axis(void* data, struct wl_pointer* wl_pointer, MwU32 time, + MwU32 axis, wl_fixed_t value) {}; + +struct wl_pointer_listener pointer_listener = { + .enter = pointer_enter, + .leave = pointer_leave, + .motion = pointer_motion, + .button = pointer_button, + .axis = pointer_axis, +}; + +/* Recursively dispatch the key event to `handle` and its children */ +static void recursive_key(MwLL handle, void* ud) { + int i; + if(handle->wayland.sublevels != NULL) { + for(i = 0; i < arrlen(handle->wayland.sublevels); i++) { + MwLLDispatch(handle->wayland.sublevels[i], key, ud); + recursive_key(handle->wayland.sublevels[i], ud); + } + } +} + +/* Recursively dispatch the key_released event to `handle` and its children */ +static void recursive_key_released(MwLL handle, void* ud) { + int i; + if(handle->wayland.sublevels != NULL) { + for(i = 0; i < arrlen(handle->wayland.sublevels); i++) { + MwLLDispatch(handle->wayland.sublevels[i], key_released, ud); + recursive_key(handle->wayland.sublevels[i], ud); + } + } +} + +/* Recursively dispatch the draw event to `handle` and its children */ +static void recursive_draw(MwLL handle) { + int i; + if(handle->wayland.sublevels != NULL) { + for(i = 0; i < arrlen(handle->wayland.sublevels); i++) { + MwLLDispatch(handle->wayland.sublevels[i], draw, NULL); + recursive_draw(handle->wayland.sublevels[i]); + } + } +} + +/* `wl_keyboard.keymap` callback */ +static void keyboard_keymap(void* data, + struct wl_keyboard* wl_keyboard, + MwU32 format, + int32_t fd, + MwU32 size) { + MwLL self = data; + if(self->wayland.type == MWLL_WAYLAND_TOPLEVEL) { + struct _MwLLWaylandTopLevel* wayland = self->wayland.toplevel; + assert(format == WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1); + + char* map_shm = (char*)mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); + assert(map_shm != MAP_FAILED); + + struct xkb_keymap* xkb_keymap = xkb_keymap_new_from_string( + wayland->xkb_context, map_shm, XKB_KEYMAP_FORMAT_TEXT_V1, + XKB_KEYMAP_COMPILE_NO_FLAGS); + munmap(map_shm, size); + close(fd); + + struct xkb_state* xkb_state = xkb_state_new(xkb_keymap); + xkb_keymap_unref(wayland->xkb_keymap); + xkb_state_unref(wayland->xkb_state); + + wayland->xkb_keymap = xkb_keymap; + wayland->xkb_state = xkb_state; + } +}; + +/* `wl_keyboard.enter` callback */ +static void keyboard_enter(void* data, + struct wl_keyboard* wl_keyboard, + MwU32 serial, + struct wl_surface* surface, + struct wl_array* keys) { + MwLL self = data; + MwLLDispatch(self, focus_in, NULL); +}; + +/* `wl_keyboard.leave` callback */ +static void keyboard_leave(void* data, + struct wl_keyboard* wl_keyboard, + MwU32 serial, + struct wl_surface* surface) { + MwLL self = data; + MwLLDispatch(self, focus_out, NULL); +}; + +/* `wl_keyboard.key` callback */ +static void keyboard_key(void* data, + struct wl_keyboard* wl_keyboard, + MwU32 serial, + MwU32 time, + MwU32 key, + MwU32 state) { + MwLL self = data; + if(self->wayland.type == MWLL_WAYLAND_TOPLEVEL) { + struct _MwLLWaylandTopLevel* wayland = self->wayland.toplevel; + xkb_layout_index_t layout; + xkb_level_index_t level; + const xkb_keysym_t* syms_out; + MwU32 keycode = key + 8; + MwU64 syms_num; + int i; + + if(!wayland->xkb_keymap) { + return; + } + + layout = xkb_state_key_get_layout(wayland->xkb_state, keycode); + level = + xkb_keymap_num_levels_for_key(wayland->xkb_keymap, keycode, layout) - 1; + syms_num = xkb_keymap_key_get_syms_by_level(wayland->xkb_keymap, keycode, layout, level, &syms_out); + if(syms_out == NULL) { + return; + } + + for(i = 0; i < syms_num; i++) { + int sym = syms_out[i]; + int key; + switch(sym) { + case XKB_KEY_BackSpace: + key = MwLLKeyBackSpace; + break; + case XKB_KEY_Left: + key = MwLLKeyLeft; + break; + case XKB_KEY_Right: + key = MwLLKeyRight; + break; + case XKB_KEY_Up: + key = MwLLKeyUp; + break; + case XKB_KEY_Down: + key = MwLLKeyDown; + break; + case XKB_KEY_Return: + key = MwLLKeyEnter; + break; + case XKB_KEY_Escape: + key = MwLLKeyEscape; + break; + case XKB_KEY_Shift_L: + key = MwLLKeyLeftShift; + break; + case XKB_KEY_Shift_R: + key = MwLLKeyRightShift; + break; + case XKB_KEY_Alt_L: + case XKB_KEY_Alt_R: + key = MwLLKeyAlt; + break; + case XKB_KEY_Control_L: + case XKB_KEY_Control_R: + key = MwLLKeyControl; + break; + default: + key = sym; + } + if(state == WL_KEYBOARD_KEY_STATE_PRESSED) { + MwLLDispatch(self, key, &key); + recursive_key(self, &key); + } else { + MwLLDispatch(self, key_released, &key); + recursive_key_released(self, &key); + } + } + } +}; + +/* `wl_keyboard.modifiers` callback */ +static void keyboard_modifiers(void* data, + struct wl_keyboard* wl_keyboard, + MwU32 serial, + MwU32 mods_depressed, + MwU32 mods_latched, + MwU32 mods_locked, + MwU32 group) {}; + +struct wl_keyboard_listener keyboard_listener = { + .keymap = keyboard_keymap, + .enter = keyboard_enter, + .leave = keyboard_leave, + .key = keyboard_key, + .modifiers = keyboard_modifiers, +}; + +/* `wl_seat.name` callback */ +static void +wl_seat_name(void* data, struct wl_seat* wl_seat, const char* name) {}; + +/* `wl_seat.capabilities` callback */ +static void wl_seat_capabilities(void* data, struct wl_seat* wl_seat, + MwU32 capabilities) { + MwLL self = data; + if(capabilities & WL_SEAT_CAPABILITY_KEYBOARD) { + struct wl_keyboard* keyboard = wl_seat_get_keyboard(wl_seat); + wl_keyboard_add_listener(keyboard, &keyboard_listener, data); + } + if(capabilities & WL_SEAT_CAPABILITY_POINTER) { + struct wl_pointer* pointer = wl_seat_get_pointer(wl_seat); + wl_pointer_add_listener(pointer, &pointer_listener, data); + } +}; + +/* `xdg_wm_base.ping` callback */ +void xdg_wm_base_ping(void* data, + struct xdg_wm_base* xdg_wm_base, + MwU32 serial) { + xdg_wm_base_pong(xdg_wm_base, serial); +}; + +/* wl_seat setup function */ +static wayland_protocol_t* wl_seat_setup(MwU32 name, MwLL ll) { + wayland_protocol_t* proto = malloc(sizeof(wayland_protocol_t)); + proto->listener = malloc(sizeof(struct wl_seat_listener)); + + ((struct wl_seat_listener*)proto->listener)->name = wl_seat_name; + ((struct wl_seat_listener*)proto->listener)->capabilities = wl_seat_capabilities; + + proto->context = wl_registry_bind(ll->wayland.registry, name, &wl_seat_interface, 1); + wl_seat_add_listener(proto->context, proto->listener, ll); + + return proto; +} + +/* wl_compositor setup function */ +static wayland_protocol_t* wl_compositor_setup(MwU32 name, struct _MwLLWayland* wayland) { + wayland->compositor = wl_registry_bind(wayland->registry, name, &wl_compositor_interface, 1); + + return NULL; +} + +/* wl_subcompositor setup function */ +static wayland_protocol_t* wl_subcompositor_setup(MwU32 name, struct _MwLLWayland* wayland) { + wayland->subcompositor = wl_registry_bind(wayland->registry, name, &wl_subcompositor_interface, 1); + + return NULL; +} + +/* xdg_wm_base setup function */ +static wayland_protocol_t* xdg_wm_base_setup(MwU32 name, struct _MwLLWayland* wayland) { + wayland_protocol_t* proto = malloc(sizeof(wayland_protocol_t)); + proto->listener = malloc(sizeof(struct xdg_wm_base_listener)); + + ((struct xdg_wm_base_listener*)proto->listener)->ping = xdg_wm_base_ping; + + proto->context = wl_registry_bind(wayland->registry, name, &xdg_wm_base_interface, 1); + xdg_wm_base_add_listener(proto->context, proto->listener, wayland); + + return proto; +} + +/* wp_cursor_shape_manager setup function */ +static wayland_protocol_t* wp_cursor_shape_manager_v1_setup(MwU32 name, struct _MwLLWayland* wayland) { + wayland_protocol_t* proto = malloc(sizeof(wayland_protocol_t)); + proto->listener = NULL; + + proto->context = wl_registry_bind(wayland->registry, name, &wp_cursor_shape_manager_v1_interface, 1); + + return proto; +} + +/* the two decoration manager constructs */ +typedef struct zxdg_decoration_manager_v1_context { + struct zxdg_decoration_manager_v1* manager; + struct zxdg_toplevel_decoration_v1* decoration; +} zxdg_decoration_manager_v1_context_t; + +/* zxdg_decoration_manager_v1 setup function */ +static wayland_protocol_t* zxdg_decoration_manager_v1_setup(MwU32 name, struct _MwLLWayland* wayland) { + wayland_protocol_t* proto = malloc(sizeof(wayland_protocol_t)); + zxdg_decoration_manager_v1_context_t* ctx = malloc(sizeof(zxdg_decoration_manager_v1_context_t)); + proto->listener = NULL; + + ctx->manager = wl_registry_bind(wayland->registry, name, &zxdg_decoration_manager_v1_interface, 1); + ; + + proto->context = ctx; + + return proto; +} + +/* EGL Setup function */ +static MwBool egl_setup(MwLL self, int x, int y, int width, int height) { + int err; + EGLint numConfigs; + EGLint majorVersion; + EGLint minorVersion; + EGLContext context; + EGLSurface surface; + EGLint fbAttribs[] = + { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, + EGL_NONE}; + EGLint contextAttribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 1, + EGL_CONTEXT_MAJOR_VERSION, 1, + EGL_CONTEXT_MINOR_VERSION, 1, + EGL_NONE}; + + EGLDisplay display; + display = eglGetDisplay(self->wayland.display); + if(display == EGL_NO_DISPLAY) { + printf("ERROR: eglGetDisplay, %0X\n", eglGetError()); + return MwFALSE; + } + /* Initialize EGL */ + if(!eglInitialize(display, &majorVersion, &minorVersion)) { + printf("ERROR: eglInitialize, %0X\n", eglGetError()); + return MwFALSE; + } + + /* Get configs */ + if((eglGetConfigs(display, NULL, 0, &numConfigs) != EGL_TRUE) || (numConfigs == 0)) { + printf("ERROR: eglGetConfigs, %0X\n", eglGetError()); + return MwFALSE; + } + + /* Choose config */ + if((eglChooseConfig(display, fbAttribs, &self->wayland.egl_config, 1, &numConfigs) != EGL_TRUE) || (numConfigs != 1)) { + printf("ERROR: eglChooseConfig, %0X\n", eglGetError()); + return MwFALSE; + } + + self->wayland.egl_window_native = + wl_egl_window_create(self->wayland.surface, width, height); + if(self->wayland.egl_window_native == EGL_NO_SURFACE) { + printf("ERROR: wl_egl_window_create, EGL_NO_SURFACE\n"); + return MwFALSE; + } + + /* Create a surface */ + surface = eglCreateWindowSurface(display, self->wayland.egl_config, self->wayland.egl_window_native, NULL); + if(surface == EGL_NO_SURFACE) { + printf("ERROR: eglCreateWindowSurface, %0X\n", eglGetError()); + return MwFALSE; + } + + eglBindAPI(EGL_OPENGL_API); + + /* Create a GL context */ + context = eglCreateContext(display, self->wayland.egl_config, EGL_NO_CONTEXT, contextAttribs); + if(context == EGL_NO_CONTEXT) { + printf("ERROR: eglCreateContext, %0X\n", eglGetError()); + return MwFALSE; + } + + self->wayland.egl_display = display; + self->wayland.egl_surface = surface; + self->wayland.egl_context = context; + + if(self->wayland.parent == NULL) { + if(!eglMakeCurrent(self->wayland.egl_display, self->wayland.egl_surface, self->wayland.egl_surface, self->wayland.egl_context)) { + printf("ERROR: eglMakeCurrent, %0X\n", eglGetError()); + } + } + + glEnable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glEnable(GL_SCISSOR_TEST); + + return MwTRUE; +} + +/* EGL reconfiguration function for resizes */ +static void egl_resetup(MwLL handle) { + float w, h; + + if(handle->wayland.parent == NULL) { + w = handle->wayland.ww; + h = handle->wayland.wh; + } else { + w = handle->wayland.parent->wayland.ww; + h = handle->wayland.parent->wayland.wh; + } + + glViewport(handle->wayland.x, handle->wayland.y, w, h); + glScissor(handle->wayland.x, handle->wayland.y, w, h); +} + +static void timed_redraw(MwLL handle, MwU32 time, int cooldown, MwU64* cooldown_timer) { + if(handle->wayland.parent == NULL) { + if(time >= (*cooldown_timer + cooldown)) { + egl_resetup(handle); + MwLLDispatch(handle, draw, NULL); + *cooldown_timer = time; + } + } +} + +/* Same as timed_redraw but it uses the unix epoch as the cooldown timer. */ +static void timed_redraw_by_epoch(MwLL handle, int cooldown) { + gettimeofday(&handle->wayland.timer, NULL); + unsigned long long time = + (unsigned long long)(handle->wayland.timer.tv_sec) * 1000 + + (unsigned long long)(handle->wayland.timer.tv_usec) / 1000; + timed_redraw(handle, time, cooldown, &handle->wayland.cooldown_timer_epoch); +} + +/* `xdg_toplevel.close` callback */ +static void xdg_toplevel_configure(void* data, + struct xdg_toplevel* xdg_toplevel, + MwI32 width, MwI32 height, + struct wl_array* states) { + MwLL self = data; + + if(width == 0 || height == 0) { + width = self->wayland.ww; + height = self->wayland.wh; + /* if it's still 0 then bail */ + if(width == 0 || height == 0) { + return; + } + } + + self->wayland.ww = width; + self->wayland.wh = height; + xdg_surface_set_window_geometry(self->wayland.toplevel->xdg_surface, 0, 0, self->wayland.ww, self->wayland.wh); + + MwLLDispatch(self, resize, NULL); + + if(!self->wayland.egl_setup) { + self->wayland.egl_setup = egl_setup(self, self->wayland.x, self->wayland.y, width, height); + } else { + wl_egl_window_resize(self->wayland.egl_window_native, width, height, 0, 0); + egl_resetup(self); + } + + return; +}; + +/* Empty function for satisfying zxdg_toplevel's requirements */ +static void decoration_configure( + void* data, struct zxdg_toplevel_decoration_v1* zxdg_toplevel_decoration_v1, + MwU32 mode) { +} + +/* `xdg_surface.close` callback */ +static void xdg_toplevel_close( + void* data, struct xdg_toplevel* xdg_toplevel) { + MwLL self = data; + MwLLDispatch(self, close, NULL); +}; + +/* `xdg_surface.configure` callback */ +static void xdg_surface_configure( + void* data, struct xdg_surface* xdg_surface, MwU32 serial) { + MwLL self = data; + + xdg_surface_ack_configure(xdg_surface, serial); + + if(self->wayland.configured) { + wl_surface_commit(self->wayland.surface); + } + + self->wayland.configured = MwTRUE; +} + +/* Standard Wayland event loop. */ +static int event_loop(MwLL handle) { + enum { + DISPLAY_FD, + KEYREPEAT_FD, + CURSOR_FD + }; + struct pollfd fd; + int timeout = 100; + struct _MwLLWayland* wayland = &handle->wayland; + MwLL topmost_parent = handle->wayland.parent; + + if(wayland->display == NULL) { + return 0; + } + fd.fd = wl_display_get_fd(wayland->display); + fd.events = POLLIN; + + /* If an error other than EAGAIN happens, we have likely been disconnected from the Wayland session */ + while(wl_display_flush(wayland->display) == -1) { + if(errno != EAGAIN) { + return MwFALSE; + } + + while(poll(&fd, 1, -1) == -1) { + if(errno != EINTR && errno != EAGAIN) { + wl_display_cancel_read(wayland->display); + + MwLLDispatch(handle, close, NULL); + return 0; + } + } + } + + if(fd.revents & POLLIN) { + wl_display_read_events(wayland->display); + if(wl_display_dispatch_pending(wayland->display) > 0) { + } + } else { + /* Condition for no events being sent */ + if(wl_display_dispatch_pending(wayland->display) == 0) { + if(wayland->event_queue != NULL) { + if(wl_display_roundtrip_queue(wayland->display, wayland->event_queue) < 0) { + printf("error\n"); + }; + } + /* HACK: If the last known size is different, force a redraw */ + if(wayland->lw != wayland->ww || wayland->lh != wayland->wh) { + MwLLDispatch(handle, draw, 0); + wayland->resize_counter++; + if(wayland->resize_counter >= 5) { + wayland->lw = wayland->ww; + wayland->lh = wayland->wh; + wayland->lh = wayland->wh; + wayland->resize_counter = 0; + } + } + } + } + + return 0; +} + +/* Function for setting up the callbacks/structs that will be registered upon the relevant interfaces being found. */ +static void setup_callbacks(struct _MwLLWayland* wayland) { + +/* Convience macro for adding the interface functions to the setup map */ +#define WL_INTERFACE(interface) \ + shput(wayland->wl_protocol_setup_map, interface##_interface.name, (wl_setup_func*)interface##_setup); + + wayland->registry_listener.global = new_protocol; + wayland->registry_listener.global_remove = protocol_removed; + wayland->wl_protocol_setup_map = NULL; + wayland->wl_protocol_map = NULL; + + WL_INTERFACE(wl_compositor); + WL_INTERFACE(wl_subcompositor); + WL_INTERFACE(wl_seat); + if(wayland->type == MWLL_WAYLAND_TOPLEVEL) { + WL_INTERFACE(xdg_wm_base); + WL_INTERFACE(zxdg_decoration_manager_v1); + WL_INTERFACE(wp_cursor_shape_manager_v1); + } +#undef WL_INTERFACE +} + +/* Toplevel setup function */ +static void setup_toplevel(MwLL r, int x, int y) { + int i; + + r->wayland.type = MWLL_WAYLAND_TOPLEVEL; + r->wayland.toplevel = malloc(sizeof(struct _MwLLWaylandTopLevel)); + r->wayland.topmost_parent = NULL; + + setup_callbacks(&r->wayland); + + /* Connect to the Wayland compositor */ + r->wayland.display = wl_display_connect(NULL); + if(r->wayland.display == NULL) { + printf("wayland: failed to create display\n"); + raise(SIGTRAP); + return; + } + + /* Do a roundtrip to ensure all interfaces are setup. */ + r->wayland.registry = wl_display_get_registry(r->wayland.display); + wl_registry_add_listener(r->wayland.registry, &r->wayland.registry_listener, r); + if(wl_display_roundtrip(r->wayland.display) == -1) { + printf("roundtrip failed\n"); + raise(SIGTRAP); + return; + } + + r->wayland.toplevel->xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + + /* Create a wl_surface, a xdg_surface and a xdg_toplevel */ + r->wayland.surface = wl_compositor_create_surface(r->wayland.compositor); + r->wayland.toplevel->xdg_surface = + xdg_wm_base_get_xdg_surface(WAYLAND_GET_INTERFACE(r->wayland, xdg_wm_base)->context, r->wayland.surface); + r->wayland.toplevel->xdg_top_level = xdg_surface_get_toplevel(r->wayland.toplevel->xdg_surface); + + /* setup mandatory listeners */ + r->wayland.toplevel->xdg_surface_listener.configure = xdg_surface_configure; + + r->wayland.toplevel->xdg_toplevel_listener.configure = xdg_toplevel_configure; + r->wayland.toplevel->xdg_toplevel_listener.close = xdg_toplevel_close; + + xdg_surface_add_listener(r->wayland.toplevel->xdg_surface, &r->wayland.toplevel->xdg_surface_listener, r); + xdg_toplevel_add_listener(r->wayland.toplevel->xdg_top_level, &r->wayland.toplevel->xdg_toplevel_listener, + r); + + xdg_toplevel_set_title(r->wayland.toplevel->xdg_top_level, "Milsko App"); + xdg_toplevel_set_app_id(r->wayland.toplevel->xdg_top_level, "MilskoWaylandApp"); + + /* Perform the initial commit and wait for the first configure event */ + wl_surface_commit(r->wayland.surface); + event_loop(r); + + /* setup decorations if we can */ + if(shget(r->wayland.wl_protocol_map, zxdg_decoration_manager_v1_interface.name) != NULL) { + zxdg_decoration_manager_v1_context_t* dec = WAYLAND_GET_INTERFACE(r->wayland, zxdg_decoration_manager_v1)->context; + + dec->decoration = zxdg_decoration_manager_v1_get_toplevel_decoration( + dec->manager, r->wayland.toplevel->xdg_top_level); + + zxdg_toplevel_decoration_v1_set_mode( + dec->decoration, ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); + } else { + printf("zxdg null\n"); + } + + r->wayland.event_queue = wl_display_create_queue(r->wayland.display); + + egl_resetup(r); + MwLLDispatch(r, draw, NULL); + recursive_draw(r); +} + +/* Sublevel setup function */ +static void setup_sublevel(MwLL parent, MwLL r, int x, int y) { + struct wl_compositor* compositor = parent->wayland.compositor; + struct wl_subcompositor* subcompositor = parent->wayland.subcompositor; + struct wl_surface* parent_surface = parent->wayland.surface; + struct wl_region* region; + { + MwLL topmost_parent = parent; + + while(topmost_parent->wayland.type != MWLL_WAYLAND_TOPLEVEL) { + topmost_parent = topmost_parent->wayland.parent; + } + r->wayland.topmost_parent = topmost_parent; + } + + r->wayland.type = MWLL_WAYLAND_SUBLEVEL; + + r->wayland.display = parent->wayland.display; + + r->wayland.surface = wl_compositor_create_surface(compositor); + + region = wl_compositor_create_region(compositor); + wl_region_add(region, 0, 0, r->wayland.ww, r->wayland.wh); + wl_surface_set_opaque_region(r->wayland.surface, region); + wl_surface_commit(r->wayland.surface); + event_loop(r); + wl_region_destroy(region); + + setup_callbacks(&r->wayland); + + r->wayland.registry = wl_display_get_registry(r->wayland.topmost_parent->wayland.display); + r->wayland.display = r->wayland.topmost_parent->wayland.display; + + wl_registry_add_listener(r->wayland.registry, &r->wayland.registry_listener, r); + if(wl_display_roundtrip(r->wayland.display) == -1) { + printf("roundtrip failed\n"); + raise(SIGTRAP); + return; + } + + r->wayland.configured = MwTRUE; + if(!r->wayland.egl_setup) { + r->wayland.egl_setup = egl_setup(r, r->wayland.x, r->wayland.y, r->wayland.ww, r->wayland.wh); + egl_resetup(r); + MwLLDispatch(r, draw, NULL); + recursive_draw(r); + }; + + r->wayland.event_queue = parent->wayland.event_queue; + + arrpush(parent->wayland.sublevels, r); + + wl_surface_damage(parent->wayland.surface, 0, 0, parent->wayland.ww, parent->wayland.wh); + + egl_resetup(r->wayland.topmost_parent); + MwLLDispatch(r->wayland.topmost_parent, draw, NULL); + recursive_draw(r->wayland.topmost_parent); +} + +static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) { + MwLL r; + r = malloc(sizeof(*r)); + MwLLCreateCommon(r); + + r->common.type = MwLLBackendWayland; + + if(width == 0) width = 1; + if(height == 0) height = 1; + + if(x == MwDEFAULT) { + x = 0; + } + if(y == MwDEFAULT) { + y = 0; + } + + r->wayland.ww = width; + r->wayland.wh = height; + r->wayland.x = x; + r->wayland.y = y; + + r->wayland.parent = parent; + + r->wayland.cooldown_timer = 0; + r->wayland.has_set_xy = MwFALSE; + r->wayland.resize_counter = 0; + + r->wayland.sublevels = NULL; + + if(parent == NULL) { + setup_toplevel(r, x, y); + } else { + setup_sublevel(parent, r, x, y); + } + + return r; +} + +static void MwLLDestroyImpl(MwLL handle) { + MwLLDestroyCommon(handle); + + free(handle); +} + +static void MwLLGetXYWHImpl(MwLL handle, int* x, int* y, unsigned int* w, unsigned int* h) { + *x = handle->wayland.x; + *y = handle->wayland.y; + *w = handle->wayland.ww; + *h = handle->wayland.wh; +} + +static void MwLLSetXYImpl(MwLL handle, int x, int y) { + if(handle->wayland.type != MWLL_WAYLAND_TOPLEVEL) { + handle->wayland.x = x; + handle->wayland.y = y; + if(handle->wayland.has_set_xy) { + timed_redraw_by_epoch(handle->wayland.topmost_parent, 25); + /* recursive_draw(handle->wayland.topmost_parent); */ + } else if(x != 0 && y != 0) { + handle->wayland.has_set_xy = MwTRUE; + } + } +} + +static void MwLLSetWHImpl(MwLL handle, int w, int h) { + /* Prevent an integer underflow when the w/h is too low */ + if((w < 10 || h < 10)) { + handle->wayland.ww = handle->wayland.lw = 10; + handle->wayland.wh = handle->wayland.lh = 10; + return; + } + handle->wayland.ww = handle->wayland.lw = w; + handle->wayland.wh = handle->wayland.lh = h; + + if(handle->wayland.type == MWLL_WAYLAND_TOPLEVEL) { + xdg_surface_set_window_geometry(handle->wayland.toplevel->xdg_surface, 0, 0, handle->wayland.ww, handle->wayland.wh); + } else { + timed_redraw_by_epoch(handle->wayland.topmost_parent, 25); + /* recursive_draw(handle->wayland.topmost_parent); */ + } +} + +static void MwLLPolygonImpl(MwLL handle, MwPoint* points, int points_count, MwLLColor color) { + int i, n; + float maxX = 0, maxY = 0; + float centerX, centerY; + float w, h; + + if(handle->wayland.parent == NULL) { + w = handle->wayland.ww; + h = handle->wayland.wh; + } else { + w = handle->wayland.topmost_parent->wayland.ww; + h = handle->wayland.topmost_parent->wayland.wh; + } + + glColor3f(color->common.red / 255.0, color->common.green / 255.0, color->common.blue / 255.0); + + glBegin(GL_POLYGON); + + for(i = 0; i < points_count; i++) { + float x = ((float)(handle->wayland.x + points[i].x) / (w / 2)) - 1.0; + float y = 1.0 - ((float)(handle->wayland.y + points[i].y) / (h / 2)); + + glVertex2f(x, y); + } + glEnd(); + glColor3f(0, 0, 0); +} + +static void MwLLLineImpl(MwLL handle, MwPoint* points, MwLLColor color) { + int i; + float w, h; + + if(handle->wayland.topmost_parent == NULL) { + w = handle->wayland.ww; + h = handle->wayland.wh; + } else { + w = handle->wayland.topmost_parent->wayland.ww; + h = handle->wayland.topmost_parent->wayland.wh; + } + + glLineWidth(1); + glColor3f(color->common.red / 255.0, color->common.green / 255.0, color->common.blue / 255.0); + + glBegin(GL_LINES); + for(i = 0; i < 2; i++) { + float x = ((float)(handle->wayland.x + points[i].x) / (w / 2)) - 1.0; + float y = 1.0 - ((float)(handle->wayland.y + points[i].y) / (h / 2)); + + glVertex2f(x, y); + } + glEnd(); + glColor3f(0, 0, 0); +} + +static void MwLLBeginDrawImpl(MwLL handle) { + if(handle->wayland.parent == NULL) { + if(!eglMakeCurrent(handle->wayland.egl_display, handle->wayland.egl_surface, handle->wayland.egl_surface, handle->wayland.egl_context)) { + printf("ERROR: eglMakeCurrent, %0X\n", eglGetError()); + return; + } + } +} + +static void MwLLEndDrawImpl(MwLL handle) { + int w, h; + + recursive_draw(handle); + + /* glClear(GL_COLOR_BUFFER_BIT); */ + /* glClearColor(1.0, 0, 0, 1); */ + + if(handle->wayland.parent == NULL) { + if(!eglSwapBuffers(handle->wayland.egl_display, handle->wayland.egl_surface)) { + printf("error swapping buffers! %0X\n", eglGetError()); + } else { + wl_surface_commit(handle->wayland.surface); + } + } +} + +static MwLLColor MwLLAllocColorImpl(MwLL handle, int r, int g, int b) { + MwLLColor c = malloc(sizeof(*c)); + + c->common.red = r; + c->common.blue = b; + c->common.green = g; + + return c; +} + +static void MwLLColorUpdateImpl(MwLL handle, MwLLColor c, int r, int g, int b) { + c->common.red = r; + c->common.blue = b; + c->common.green = g; +} + +static void MwLLFreeColorImpl(MwLLColor color) { + free(color); +} + +static int MwLLPendingImpl(MwLL handle) { + if(wl_display_dispatch_pending(handle->wayland.display) == 0) { + } + return event_loop(handle); +} + +static void MwLLNextEventImpl(MwLL handle) { +} + +static void MwLLSetTitleImpl(MwLL handle, const char* title) { + if(handle->wayland.type == MWLL_WAYLAND_TOPLEVEL) { + xdg_toplevel_set_title(handle->wayland.toplevel->xdg_top_level, title); + } +} + +static MwLLPixmap MwLLCreatePixmapImpl(MwLL handle, unsigned char* data, int width, int height) { + MwLLPixmap r = malloc(sizeof(*r)); + + r->common.width = width; + r->common.height = height; + r->common.raw = data; + r->wayland.texture = 0; + + glGenTextures(1, &r->wayland.texture); + + glBindTexture(GL_TEXTURE_2D, r->wayland.texture); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glBindTexture(GL_TEXTURE_2D, 0); + + MwLLPixmapUpdate(r); + + return r; +} + +static void MwLLPixmapUpdateImpl(MwLLPixmap r) { + glBindTexture(GL_TEXTURE_2D, r->wayland.texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, r->common.width, r->common.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, r->common.raw); + glBindTexture(GL_TEXTURE_2D, 0); +} + +static void MwLLDestroyPixmapImpl(MwLLPixmap pixmap) { + glDeleteTextures(1, &pixmap->wayland.texture); + free(pixmap); +} + +static void MwLLDrawPixmapImpl(MwLL handle, MwRect* rect, MwLLPixmap pixmap) { + float x, y, w, h; + + if(handle->wayland.topmost_parent == NULL) { + w = handle->wayland.ww; + h = handle->wayland.wh; + } else { + w = handle->wayland.topmost_parent->wayland.ww; + h = handle->wayland.topmost_parent->wayland.wh; + } + + x = ((float)(handle->wayland.x + rect->x) / (w / 2)) - 1.0; + y = 1.0 - ((float)(handle->wayland.y + rect->y) / (h / 2)); + + glColor3f(1.0, 1.0, 1.0); + + glBindTexture(GL_TEXTURE_2D, pixmap->wayland.texture); + glActiveTexture(pixmap->wayland.texture); + + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0); + glVertex2f(x, y); + glTexCoord2f(1, 0); + glVertex2f(x + (rect->width / (w / 2)), y); + glTexCoord2f(1, 1); + glVertex2f(x + (rect->width / (w / 2)), y - (rect->height / (h / 2))); + glTexCoord2f(0.0f, 1); + glVertex2f(x, y - (rect->height / (h / 2))); + glEnd(); + glFinish(); +} +static void MwLLSetIconImpl(MwLL handle, MwLLPixmap pixmap) { +} + +static void MwLLForceRenderImpl(MwLL handle) { + wl_surface_damage(handle->wayland.surface, 0, 0, handle->wayland.ww, handle->wayland.wh); + + if(handle->wayland.egl_setup) { + timed_redraw_by_epoch(handle, 25); + } +} + +static void MwLLSetCursorImpl(MwLL handle, MwCursor* image, MwCursor* mask) { +} + +static void MwLLDetachImpl(MwLL handle, MwPoint* point) { +} + +static void MwLLShowImpl(MwLL handle, int show) { +} + +static void MwLLMakePopupImpl(MwLL handle, MwLL parent) { +} + +static void MwLLSetSizeHintsImpl(MwLL handle, int minx, int miny, int maxx, int maxy) { + if(handle->wayland.type == MWLL_WAYLAND_TOPLEVEL) { + xdg_toplevel_set_min_size(handle->wayland.toplevel->xdg_top_level, minx, miny); + xdg_toplevel_set_max_size(handle->wayland.toplevel->xdg_top_level, maxx, maxy); + } +} + +static void MwLLMakeBorderlessImpl(MwLL handle, int toggle) { + if(handle->wayland.type == MWLL_WAYLAND_TOPLEVEL) { + if(WAYLAND_GET_INTERFACE(handle->wayland, zxdg_decoration_manager_v1) != NULL) { + zxdg_decoration_manager_v1_context_t* dec = WAYLAND_GET_INTERFACE(handle->wayland, zxdg_decoration_manager_v1)->context; + + dec->decoration = zxdg_decoration_manager_v1_get_toplevel_decoration( + dec->manager, handle->wayland.toplevel->xdg_top_level); + + zxdg_toplevel_decoration_v1_set_mode( + dec->decoration, ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE); + } else { + /* TODO: hide our custom window decorations when we have them. */ + printf("zxdg null\n"); + } + } +} + +static void MwLLFocusImpl(MwLL handle) { +} + +static void MwLLGrabPointerImpl(MwLL handle, int toggle) { +} + +static void MwLLSetClipboardImpl(MwLL handle, const char* text) { +} + +static char* MwLLGetClipboardImpl(MwLL handle) { + char* r = NULL; + return r; +} + +static void MwLLMakeToolWindowImpl(MwLL handle) { +} + +static void MwLLGetCursorCoordImpl(MwLL handle, MwPoint* point) { +} + +static void MwLLGetScreenSizeImpl(MwLL handle, MwRect* rect) { +} + +static void MwLLBeginStateChangeImpl(MwLL handle) { + MwLLShow(handle, 0); +} + +static void MwLLEndStateChangeImpl(MwLL handle) { + MwLLShow(handle, 1); +} + +static int MwLLWaylandCallInitImpl(void) { +#ifdef __linux__ + if(strcmp(getenv("XDG_SESSION_TYPE"), "wayland")) { + return 1; + } +#endif + return 0; +} + +#include "call.c" +CALL(Wayland); diff --git a/src/backend/x11.c b/src/backend/x11.c index a93536465..c21c5a1bb 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -259,6 +259,14 @@ static void MwLLDestroyImpl(MwLL handle) { free(handle); } +static void MwLLBeginDrawImpl(MwLL handle) { + (void)handle; +} + +static void MwLLEndDrawImpl(MwLL handle) { + (void)handle; +} + static void MwLLPolygonImpl(MwLL handle, MwPoint* points, int points_count, MwLLColor color) { int i; XPoint* p = malloc(sizeof(*p) * points_count); @@ -1028,7 +1036,6 @@ static void MwLLEndStateChangeImpl(MwLL handle) { } static int MwLLX11CallInitImpl(void) { - /* TODO: check properly */ return 0; } diff --git a/src/core.c b/src/core.c index efa5a86b7..9a5fd1480 100644 --- a/src/core.c +++ b/src/core.c @@ -1,16 +1,20 @@ #include #include "../external/stb_ds.h" +#include "Mw/LowLevel.h" static void lldrawhandler(MwLL handle, void* data) { MwWidget h = (MwWidget)handle->common.user; (void)data; + MwLLBeginDraw(handle); h->bgcolor = NULL; MwDispatch(h, draw); if(h->draw_inject != NULL) h->draw_inject(h); MwDispatchUserHandler(h, MwNdrawHandler, NULL); + + MwLLEndDraw(handle); } static void lluphandler(MwLL handle, void* data) { @@ -303,7 +307,10 @@ int MwStep(MwWidget handle) { arrfree(widgets); handle->prop_event = 0; - if(handle->lowlevel != NULL && MwLLPending(handle->lowlevel)) MwLLNextEvent(handle->lowlevel); + + if(handle->lowlevel != NULL && MwLLPending(handle->lowlevel)) + MwLLNextEvent(handle->lowlevel); + handle->prop_event = 1; clean_destroy_queue(handle); @@ -694,6 +701,9 @@ MwWidget MwGetParent(MwWidget handle) { typedef int (*call_t)(void); int MwLibraryInit(void) { call_t calls[] = { +#ifdef USE_WAYLAND + MwLLWaylandCallInit, +#endif #ifdef USE_X11 MwLLX11CallInit, #endif diff --git a/src/draw.c b/src/draw.c index ac16451c2..32b6d758a 100644 --- a/src/draw.c +++ b/src/draw.c @@ -491,6 +491,7 @@ void MwDrawTriangle(MwWidget handle, MwRect* rect, MwLLColor color, int invert, p4[2].y = rect->y + s * border; } MwLLPolygon(handle->lowlevel, p4, 3, col); + if(color != col) MwLLFreeColor(col); MwLLFreeColor(lighter); diff --git a/src/lowlevel.c b/src/lowlevel.c index cc303451d..96f619613 100644 --- a/src/lowlevel.c +++ b/src/lowlevel.c @@ -6,6 +6,9 @@ void (*MwLLDestroy)(MwLL handle); void (*MwLLPolygon)(MwLL handle, MwPoint* points, int points_count, MwLLColor color); void (*MwLLLine)(MwLL handle, MwPoint* points, MwLLColor color); +void (*MwLLBeginDraw)(MwLL handle); +void (*MwLLEndDraw)(MwLL handle); + MwLLColor (*MwLLAllocColor)(MwLL handle, int r, int g, int b); void (*MwLLColorUpdate)(MwLL handle, MwLLColor c, int r, int g, int b); void (*MwLLFreeColor)(MwLLColor color); diff --git a/src/widget/opengl.c b/src/widget/opengl.c index 552105ab5..f6cc36933 100644 --- a/src/widget/opengl.c +++ b/src/widget/opengl.c @@ -1,6 +1,12 @@ #include #include +#ifdef USE_WAYLAND +#include +#include +#include +#endif + #ifdef USE_GDI typedef HGLRC(WINAPI* MWwglCreateContext)(HDC); typedef BOOL(WINAPI* MWwglMakeCurrent)(HDC, HGLRC); @@ -103,6 +109,12 @@ static int create(MwWidget handle) { o->gl = o->glXCreateContext(handle->lowlevel->x11.display, o->visual, NULL, GL_TRUE); } #endif +#ifdef USE_WAYLAND + /* Wayland uses OpenGL as its backend so its already initialized */ + if(handle->lowlevel->common.type == MwLLBackendWayland) { + } +#endif + handle->internal = r; handle->lowlevel->common.copy_buffer = 0; @@ -133,6 +145,10 @@ static void destroy(MwWidget handle) { MwDynamicClose(o->lib); } #endif +#ifdef USE_WAYLAND +/* Wayland uses OpenGL as its backend so its destroyed accordingly */ +#endif + free(handle->internal); } @@ -151,6 +167,10 @@ static void mwOpenGLMakeCurrentImpl(MwWidget handle) { o->glXMakeCurrent(handle->lowlevel->x11.display, handle->lowlevel->x11.window, o->gl); } #endif +#ifdef USE_WAYLAND + if(handle->lowlevel->common.type == MwLLBackendWayland) { + } +#endif } static void mwOpenGLSwapBufferImpl(MwWidget handle) { @@ -168,6 +188,16 @@ static void mwOpenGLSwapBufferImpl(MwWidget handle) { o->glXSwapBuffers(handle->lowlevel->x11.display, handle->lowlevel->x11.window); } #endif +#ifdef USE_WAYLAND +#define tp handle->lowlevel->wayland.topmost_parent->wayland + if(handle->lowlevel->common.type == MwLLBackendWayland) { + if(!eglSwapBuffers( + tp.egl_display, tp.egl_surface)) { + printf("Userland error: eglSwapBuffers, %0X\n", eglGetError()); + } + } +#undef topmost_parent +#endif } static void* mwOpenGLGetProcAddressImpl(MwWidget handle, const char* name) { @@ -184,6 +214,11 @@ static void* mwOpenGLGetProcAddressImpl(MwWidget handle, const char* name) { return o->glXGetProcAddress((const GLubyte*)name); } +#endif +#ifdef USE_WAYLAND + if(handle->lowlevel->common.type == MwLLBackendWayland) { + return eglGetProcAddress(name); + } #endif return NULL; } diff --git a/src/widget/scrollbar.c b/src/widget/scrollbar.c index 6490b0636..ebfcb40c4 100644 --- a/src/widget/scrollbar.c +++ b/src/widget/scrollbar.c @@ -142,7 +142,7 @@ static void draw(MwWidget handle) { } static void mouse_move(MwWidget handle) { - int or = MwGetInteger(handle, MwNorientation); + int or = MwGetInteger(handle, MwNorientation); scrollbar_t* scr = handle->internal; if(!handle->pressed) return; @@ -170,9 +170,9 @@ static void mouse_move(MwWidget handle) { } static void mouse_down(MwWidget handle, void* ptr) { - int ww = MwGetInteger(handle, MwNwidth); - int wh = MwGetInteger(handle, MwNheight); - int or = MwGetInteger(handle, MwNorientation); + int ww = MwGetInteger(handle, MwNwidth); + int wh = MwGetInteger(handle, MwNheight); + int or = MwGetInteger(handle, MwNorientation); scrollbar_t* scr = handle->internal; MwLLMouse* m = ptr; From 0c787264c6c988eb714127c78745294c53502a97 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Wed, 10 Dec 2025 11:15:52 +0900 Subject: [PATCH 02/13] fix some stuff --- include/Mw/BaseTypes.h | 12 ++++++------ src/core.c | 1 - src/widget/scrollbar.c | 8 ++++---- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/include/Mw/BaseTypes.h b/include/Mw/BaseTypes.h index 7b92c9335..ca718ea4a 100644 --- a/include/Mw/BaseTypes.h +++ b/include/Mw/BaseTypes.h @@ -31,7 +31,7 @@ typedef uint16_t MwU16; typedef int8_t MwI8; typedef uint8_t MwU8; -#define OTHER_TYPES_DEFINED +#define MW_OTHER_TYPES_DEFINED #elif __GNUC__ > 2 typedef long long MwI64; typedef unsigned long long MwU64; @@ -48,18 +48,18 @@ typedef unsigned __int16 MwU16; typedef __int8 MwI8; typedef unsigned __int8 MwU8; -#define OTHER_TYPES_DEFINED +#define MW_OTHER_TYPES_DEFINED #else /* out of hope */ typedef long MwI64; typedef unsigned long MwU64; #endif -#ifdef OTHER_TYPES_DEFINED -#undef OTHER_TYPES_DEFINED +#ifdef MW_OTHER_TYPES_DEFINED +#undef MW_OTHER_TYPES_DEFINED #else -typedef int MwI32; -typedef unsigned int MwU32; +typedef int MwI32; +typedef unsigned int MwU32; typedef short MwI16; typedef unsigned short MwU16; diff --git a/src/core.c b/src/core.c index 9a5fd1480..ec7cb7d53 100644 --- a/src/core.c +++ b/src/core.c @@ -1,7 +1,6 @@ #include #include "../external/stb_ds.h" -#include "Mw/LowLevel.h" static void lldrawhandler(MwLL handle, void* data) { MwWidget h = (MwWidget)handle->common.user; diff --git a/src/widget/scrollbar.c b/src/widget/scrollbar.c index ebfcb40c4..6490b0636 100644 --- a/src/widget/scrollbar.c +++ b/src/widget/scrollbar.c @@ -142,7 +142,7 @@ static void draw(MwWidget handle) { } static void mouse_move(MwWidget handle) { - int or = MwGetInteger(handle, MwNorientation); + int or = MwGetInteger(handle, MwNorientation); scrollbar_t* scr = handle->internal; if(!handle->pressed) return; @@ -170,9 +170,9 @@ static void mouse_move(MwWidget handle) { } static void mouse_down(MwWidget handle, void* ptr) { - int ww = MwGetInteger(handle, MwNwidth); - int wh = MwGetInteger(handle, MwNheight); - int or = MwGetInteger(handle, MwNorientation); + int ww = MwGetInteger(handle, MwNwidth); + int wh = MwGetInteger(handle, MwNheight); + int or = MwGetInteger(handle, MwNorientation); scrollbar_t* scr = handle->internal; MwLLMouse* m = ptr; From bbc27d680a8cb359f10503895cd863b320aaf25b Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Wed, 10 Dec 2025 12:57:40 +0900 Subject: [PATCH 03/13] that is simply wrong --- src/backend/x11.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/x11.c b/src/backend/x11.c index c21c5a1bb..353f6d7c4 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -1020,7 +1020,7 @@ static void MwLLGetCursorCoordImpl(MwLL handle, MwPoint* point) { static void MwLLGetScreenSizeImpl(MwLL handle, MwRect* rect) { XWindowAttributes xwa; - XGetWindowAttributes(handle->x11.display, handle->x11.window, &xwa); + XGetWindowAttributes(handle->x11.display, DefaultRootWindow(handle->x11.display), &xwa); rect->x = rect->y = 0; rect->width = xwa.width; From 82f9330befba2e95e0339710744c4aeace13abf3 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Wed, 10 Dec 2025 13:26:19 +0900 Subject: [PATCH 04/13] add MwNfillArea --- include/Mw/StringDefs.h | 1 + milsko.xml | 1 + src/widget/button.c | 26 ++++++++++++++++---------- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/include/Mw/StringDefs.h b/include/Mw/StringDefs.h index a51f98105..69a747ab5 100644 --- a/include/Mw/StringDefs.h +++ b/include/Mw/StringDefs.h @@ -31,6 +31,7 @@ #define MwNshowArrows "IshowArrows" #define MwNpadding "Ipadding" #define MwNborderWidth "IborderWidth" +#define MwNfillArea "IfillArea" #define MwNtitle "Stitle" #define MwNtext "Stext" diff --git a/milsko.xml b/milsko.xml index 45f7c2846..98e0d91aa 100644 --- a/milsko.xml +++ b/milsko.xml @@ -488,6 +488,7 @@ + diff --git a/src/widget/button.c b/src/widget/button.c index d6e5394f1..d2b790ad6 100644 --- a/src/widget/button.c +++ b/src/widget/button.c @@ -5,6 +5,7 @@ static int create(MwWidget handle) { MwSetInteger(handle, MwNflat, 0); MwSetInteger(handle, MwNpadding, 0); + MwSetInteger(handle, MwNfillArea, 1); return 0; } @@ -44,18 +45,23 @@ static void draw(MwWidget handle) { int ow = r.width; int oh = r.height; - double sw = (double)ow / px->common.width; - double sh = (double)oh / px->common.height; + if(MwGetInteger(handle, MwNfillArea)) { + double sw = (double)ow / px->common.width; + double sh = (double)oh / px->common.height; - if(sw < sh) { - r.width = px->common.width * sw; - r.height = px->common.height * sw; + if(sw < sh) { + r.width = px->common.width * sw; + r.height = px->common.height * sw; + } else { + r.width = px->common.width * sh; + r.height = px->common.height * sh; + } + r.width -= MwGetInteger(handle, MwNpadding) * 2; + r.height -= MwGetInteger(handle, MwNpadding) * 2; } else { - r.width = px->common.width * sh; - r.height = px->common.height * sh; + r.width = px->common.width; + r.height = px->common.height; } - r.width -= MwGetInteger(handle, MwNpadding) * 2; - r.height -= MwGetInteger(handle, MwNpadding) * 2; r.x += (double)(ow - r.width) / 2; r.y += (double)(oh - r.height) / 2; @@ -77,7 +83,7 @@ static void click(MwWidget handle) { } static void prop_change(MwWidget handle, const char* key) { - if(strcmp(key, MwNtext) == 0 || strcmp(key, MwNpixmap) == 0 || strcmp(key, MwNflat) == 0 || strcmp(key, MwNpadding) == 0) MwForceRender(handle); + if(strcmp(key, MwNtext) == 0 || strcmp(key, MwNpixmap) == 0 || strcmp(key, MwNflat) == 0 || strcmp(key, MwNpadding) == 0 || strcmp(key, MwNfillArea) == 0) MwForceRender(handle); } MwClassRec MwButtonClassRec = { From e57f3fd910ec4b22cdb1923adee35e80a933e726 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Thu, 11 Dec 2025 00:50:50 +0900 Subject: [PATCH 05/13] update --- include/Mw/StringDefs.h | 1 + milsko.xml | 1 + src/widget/button.c | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/include/Mw/StringDefs.h b/include/Mw/StringDefs.h index 69a747ab5..de8b8bb17 100644 --- a/include/Mw/StringDefs.h +++ b/include/Mw/StringDefs.h @@ -45,6 +45,7 @@ #define MwNsizeHints "VsizeHints" #define MwNfont "Vfont" #define MwNboldFont "VboldFont" +#define MwNbackgroundPixmap "VbackgroundPixmap" #define MwNactivateHandler "Cactivate" /* NULL/int* (MwListBox)/void* (MwTreeView) */ #define MwNresizeHandler "Cresize" /* NULL */ diff --git a/milsko.xml b/milsko.xml index 98e0d91aa..5e7458043 100644 --- a/milsko.xml +++ b/milsko.xml @@ -48,6 +48,7 @@ - MwNwidth - MwNheight - MwNborderWidth + - MwNbackgroundPixmap Integer properties must be prefixed with I. String properties must be prefixed with S. diff --git a/src/widget/button.c b/src/widget/button.c index d2b790ad6..30b29805b 100644 --- a/src/widget/button.c +++ b/src/widget/button.c @@ -17,6 +17,7 @@ static void draw(MwWidget handle) { MwLLColor text = MwParseColor(handle, MwGetText(handle, MwNforeground)); const char* str = MwGetText(handle, MwNtext); MwLLPixmap px = MwGetVoid(handle, MwNpixmap); + MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap); if(str == NULL) str = ""; @@ -34,6 +35,9 @@ static void draw(MwWidget handle) { } else { MwDrawWidgetBack(handle, &r, base, handle->pressed, 1); } + if(bgpx != NULL) { + MwLLDrawPixmap(handle->lowlevel, &r, bgpx); + } if(MwGetInteger(handle, MwNflat) && !handle->pressed) { r.x += MwDefaultBorderWidth(handle); r.y += MwDefaultBorderWidth(handle); From 363897df74ff64d49081968810f6d9b78551f26e Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Thu, 11 Dec 2025 01:37:13 +0900 Subject: [PATCH 06/13] background pixmap --- src/widget/button.c | 4 +--- src/widget/checkbox.c | 6 ++++-- src/widget/entry.c | 2 ++ src/widget/frame.c | 10 ++++++---- src/widget/label.c | 4 +++- src/widget/progressbar.c | 10 ++++++---- src/widget/radiobox.c | 6 ++++-- src/widget/scrollbar.c | 4 +++- 8 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/widget/button.c b/src/widget/button.c index 30b29805b..a484eea76 100644 --- a/src/widget/button.c +++ b/src/widget/button.c @@ -35,9 +35,7 @@ static void draw(MwWidget handle) { } else { MwDrawWidgetBack(handle, &r, base, handle->pressed, 1); } - if(bgpx != NULL) { - MwLLDrawPixmap(handle->lowlevel, &r, bgpx); - } + if(bgpx != NULL) MwLLDrawPixmap(handle->lowlevel, &r, bgpx); if(MwGetInteger(handle, MwNflat) && !handle->pressed) { r.x += MwDefaultBorderWidth(handle); r.y += MwDefaultBorderWidth(handle); diff --git a/src/widget/checkbox.c b/src/widget/checkbox.c index 2f6df54b4..0a117a42e 100644 --- a/src/widget/checkbox.c +++ b/src/widget/checkbox.c @@ -9,8 +9,9 @@ static int create(MwWidget handle) { } static void draw(MwWidget handle) { - MwRect r; - MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); + MwRect r; + MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); + MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap); r.x = 0; r.y = 0; @@ -18,6 +19,7 @@ static void draw(MwWidget handle) { r.height = MwGetInteger(handle, MwNheight); MwDrawWidgetBack(handle, &r, base, (handle->pressed || MwGetInteger(handle, MwNchecked)) ? 1 : 0, MwTRUE); + if(bgpx != NULL) MwLLDrawPixmap(handle->lowlevel, &r, bgpx); if(handle->pressed || MwGetInteger(handle, MwNchecked)) { /* TODO: write check mark */ } diff --git a/src/widget/entry.c b/src/widget/entry.c index e86376044..b5ac1e05d 100644 --- a/src/widget/entry.c +++ b/src/widget/entry.c @@ -25,6 +25,7 @@ static void draw(MwWidget handle) { MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); MwLLColor text = MwParseColor(handle, MwGetText(handle, MwNforeground)); const char* str = MwGetText(handle, MwNtext); + MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap); if(str == NULL) str = ""; r.x = 0; @@ -33,6 +34,7 @@ static void draw(MwWidget handle) { r.height = MwGetInteger(handle, MwNheight); MwDrawWidgetBack(handle, &r, base, 1, 1); + if(bgpx != NULL) MwLLDrawPixmap(handle->lowlevel, &r, bgpx); if(str != NULL) { int w = MwTextWidth(handle, "M"); int h = MwTextHeight(handle, "M"); diff --git a/src/widget/frame.c b/src/widget/frame.c index b2f3ad0dd..38ff990fe 100644 --- a/src/widget/frame.c +++ b/src/widget/frame.c @@ -10,10 +10,11 @@ static int create(MwWidget handle) { } static void draw(MwWidget handle) { - MwRect fr; - MwRect rr; - MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); - int inverted; + MwRect fr; + MwRect rr; + MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); + int inverted; + MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap); if(MwGetInteger(handle, MwNhasBorder)) { inverted = MwGetInteger(handle, MwNinverted); @@ -36,6 +37,7 @@ static void draw(MwWidget handle) { } MwDrawRect(handle, &rr, base); + if(bgpx != NULL) MwLLDrawPixmap(handle->lowlevel, &rr, bgpx); MwLLFreeColor(base); } diff --git a/src/widget/label.c b/src/widget/label.c index 4305662ce..f26edd075 100644 --- a/src/widget/label.c +++ b/src/widget/label.c @@ -14,7 +14,8 @@ static void draw(MwWidget handle) { MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); MwLLColor text = MwParseColor(handle, MwGetText(handle, MwNforeground)); int align; - const char* str = MwGetText(handle, MwNtext); + const char* str = MwGetText(handle, MwNtext); + MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap); if(str == NULL) str = ""; @@ -24,6 +25,7 @@ static void draw(MwWidget handle) { r.height = MwGetInteger(handle, MwNheight); MwDrawRect(handle, &r, base); + if(bgpx != NULL) MwLLDrawPixmap(handle->lowlevel, &r, bgpx); align = MwGetInteger(handle, MwNalignment); if(align == MwALIGNMENT_CENTER) { diff --git a/src/widget/progressbar.c b/src/widget/progressbar.c index db57851ad..f3f99eb33 100644 --- a/src/widget/progressbar.c +++ b/src/widget/progressbar.c @@ -12,10 +12,11 @@ static int create(MwWidget handle) { } static void draw(MwWidget handle) { - MwRect r; - MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); - MwLLColor fill = MwParseColor(handle, MwGetText(handle, MwNforeground)); - double w; + MwRect r; + MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); + MwLLColor fill = MwParseColor(handle, MwGetText(handle, MwNforeground)); + double w; + MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap); r.x = 0; r.y = 0; @@ -26,6 +27,7 @@ static void draw(MwWidget handle) { MwDrawRect(handle, &r, base); w = MwGetInteger(handle, MwNvalue) - MwGetInteger(handle, MwNminValue); w = w / (MwGetInteger(handle, MwNmaxValue) - MwGetInteger(handle, MwNminValue)); + if(bgpx != NULL) MwLLDrawPixmap(handle->lowlevel, &r, bgpx); r.x += MwDefaultBorderWidth(handle); r.y += MwDefaultBorderWidth(handle); diff --git a/src/widget/radiobox.c b/src/widget/radiobox.c index 681949afa..85c7871a1 100644 --- a/src/widget/radiobox.c +++ b/src/widget/radiobox.c @@ -11,8 +11,9 @@ static int create(MwWidget handle) { } static void draw(MwWidget handle) { - MwRect r; - MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); + MwRect r; + MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); + MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap); r.x = 0; r.y = 0; @@ -20,6 +21,7 @@ static void draw(MwWidget handle) { r.height = MwGetInteger(handle, MwNheight); MwDrawRect(handle, &r, base); + if(bgpx != NULL) MwLLDrawPixmap(handle->lowlevel, &r, bgpx); MwDrawDiamond(handle, &r, base, (handle->pressed || MwGetInteger(handle, MwNchecked)) ? 1 : 0); MwLLFreeColor(base); diff --git a/src/widget/scrollbar.c b/src/widget/scrollbar.c index 6490b0636..e00d0b550 100644 --- a/src/widget/scrollbar.c +++ b/src/widget/scrollbar.c @@ -65,7 +65,8 @@ static void draw(MwWidget handle) { MwLLColor dark = MwLightenColor(handle, base, -64, -64, -64); scrollbar_t* scr = handle->internal; int or ; - int uy, dy, ux, dx; + int uy, dy, ux, dx; + MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap); r.x = 0; r.y = 0; @@ -79,6 +80,7 @@ static void draw(MwWidget handle) { dx = r.width - r.height; MwDrawWidgetBack(handle, &r, dark, 1, MwTRUE); + if(bgpx != NULL) MwLLDrawPixmap(handle->lowlevel, &r, bgpx); rt = r; From 0c8715ec9f6ea8f9273b3ae01b11ed05e3f8cf9b Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Fri, 12 Dec 2025 17:26:57 +0900 Subject: [PATCH 07/13] bugfix --- src/backend/x11.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/x11.c b/src/backend/x11.c index 353f6d7c4..4370b55b5 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -53,7 +53,7 @@ static void sync_move(MwLL handle, int x, int y) { XSync(handle->x11.display, False); if(!XPending(handle->x11.display)) continue; XNextEvent(handle->x11.display, &ev); - if(ev.type == ReparentNotify && ev.xreparent.window == handle->x11.window && ev.xreparent.window != RootWindow(handle->x11.display, DefaultScreen(handle->x11.display))) { + if(ev.type == ReparentNotify && ev.xreparent.window == handle->x11.window) { break; } else { arrput(queue, ev); From f9c0ec987e856a5c05233ba9df946239b20afc6d Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Fri, 12 Dec 2025 17:51:26 +0900 Subject: [PATCH 08/13] improvement --- src/backend/x11.c | 9 +++++---- src/text.c | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/backend/x11.c b/src/backend/x11.c index 4370b55b5..3d2b505df 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -581,8 +581,6 @@ static void MwLLSetTitleImpl(MwLL handle, const char* title) { static MwLLPixmap MwLLCreatePixmapImpl(MwLL handle, unsigned char* data, int width, int height) { MwLLPixmap r = malloc(sizeof(*r)); - char* di = malloc(4 * width * height); - char* dm = malloc(4 * width * height); int evbase, erbase; XWindowAttributes attr; @@ -603,8 +601,11 @@ static MwLLPixmap MwLLCreatePixmapImpl(MwLL handle, unsigned char* data, int wid r->x11.use_xrender = XRenderQueryExtension(handle->x11.display, &evbase, &erbase) ? 1 : 0; #endif - r->x11.image = XCreateImage(handle->x11.display, DefaultVisual(handle->x11.display, DefaultScreen(handle->x11.display)), r->x11.depth, ZPixmap, 0, di, width, height, 32, width * 4); - r->x11.mask = XCreateImage(handle->x11.display, DefaultVisual(handle->x11.display, DefaultScreen(handle->x11.display)), 1, ZPixmap, 0, dm, width, height, 32, width * 4); + r->x11.image = XCreateImage(handle->x11.display, DefaultVisual(handle->x11.display, DefaultScreen(handle->x11.display)), r->x11.depth, ZPixmap, 0, NULL, width, height, 32, 0); + r->x11.mask = XCreateImage(handle->x11.display, DefaultVisual(handle->x11.display, DefaultScreen(handle->x11.display)), 1, ZPixmap, 0, NULL, width, height, 32, 0); + + r->x11.image->data = malloc(r->x11.image->bytes_per_line * height); + r->x11.mask->data = malloc(r->x11.mask->bytes_per_line * height); MwLLPixmapUpdate(r); return r; diff --git a/src/text.c b/src/text.c index 87a9a01a1..7d94e5cf4 100644 --- a/src/text.c +++ b/src/text.c @@ -292,6 +292,7 @@ static int ttf_MwTextHeight(MwWidget handle, int count) { #endif void MwDrawText(MwWidget handle, MwPoint* point, const char* text, int bold, int align, MwLLColor color) { + if(strlen(text) == 0) return; #ifdef TTF if(ttf_MwDrawText(handle, point, text, bold, align, color)) #endif From cf4fdc531a79852546ef8f55754f51ab45c974c7 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Mon, 15 Dec 2025 06:48:40 +0900 Subject: [PATCH 09/13] update color things --- include/Mw/Draw.h | 18 +- src/backend/x11.c | 4 +- src/color.c | 5484 ++++++++++++++++++++++++++++++++++++++------- src/draw.c | 71 +- tools/color.pl | 22 +- 5 files changed, 4763 insertions(+), 836 deletions(-) diff --git a/include/Mw/Draw.h b/include/Mw/Draw.h index 50aa66664..6ccc299cd 100644 --- a/include/Mw/Draw.h +++ b/include/Mw/Draw.h @@ -21,6 +21,13 @@ extern "C" { */ MWDECL MwLLColor MwParseColor(MwWidget handle, const char* text); +/*! + * @brief Parses a color text + * @param text Color text + * @param rgb RGB + */ +MWDECL void MwParseColorNoAllocate(const char* text, MwRGB* rgb); + /*! * @brief Lighten a color * @param handle Widget @@ -120,12 +127,12 @@ MWDECL MwLLPixmap MwLoadRaw(MwWidget handle, unsigned char* rgb, int width, int /*! * @brief Creates a pixmap from raw data * @param handle Widget + * @param pixmap Pixmap to update * @param rgb RGBA data * @param width Width * @param height Height - * @return Pixmap */ -MWDECL void MwReloadRaw(MwWidget handle, unsigned char* rgb, int width, int height, MwLLPixmap pixmap); +MWDECL void MwReloadRaw(MwWidget handle, MwLLPixmap pixmap, unsigned char* rgb, int width, int height); /*! * @brief Creates a pixmap from XPM data @@ -191,6 +198,13 @@ MWDECL int MwTextHeight(MwWidget handle, const char* text); */ MWDECL MwLLColor MwParseColorName(MwWidget handle, const char* color); +/*! + * @brief Parses a color name + * @param color Color name + * @param rgb RGB + */ +MWDECL void MwParseColorNameNoAllocate(const char* color, MwRGB* rgb); + #ifdef __cplusplus } #endif diff --git a/src/backend/x11.c b/src/backend/x11.c index 3d2b505df..c44daafd1 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -580,7 +580,7 @@ static void MwLLSetTitleImpl(MwLL handle, const char* title) { } static MwLLPixmap MwLLCreatePixmapImpl(MwLL handle, unsigned char* data, int width, int height) { - MwLLPixmap r = malloc(sizeof(*r)); + MwLLPixmap r = malloc(sizeof(*r)); int evbase, erbase; XWindowAttributes attr; @@ -605,7 +605,7 @@ static MwLLPixmap MwLLCreatePixmapImpl(MwLL handle, unsigned char* data, int wid r->x11.mask = XCreateImage(handle->x11.display, DefaultVisual(handle->x11.display, DefaultScreen(handle->x11.display)), 1, ZPixmap, 0, NULL, width, height, 32, 0); r->x11.image->data = malloc(r->x11.image->bytes_per_line * height); - r->x11.mask->data = malloc(r->x11.mask->bytes_per_line * height); + r->x11.mask->data = malloc(r->x11.mask->bytes_per_line * height); MwLLPixmapUpdate(r); return r; diff --git a/src/color.c b/src/color.c index 0232792d9..40003a45d 100644 --- a/src/color.c +++ b/src/color.c @@ -1,787 +1,4705 @@ #include MwLLColor MwParseColorName(MwWidget handle, const char* color) { - if(strcmp(color, "snow") == 0) return MwLLAllocColor(handle->lowlevel, 255, 250, 250); - if(strcmp(color, "ghost white") == 0) return MwLLAllocColor(handle->lowlevel, 248, 248, 255); - if(strcmp(color, "GhostWhite") == 0) return MwLLAllocColor(handle->lowlevel, 248, 248, 255); - if(strcmp(color, "white smoke") == 0) return MwLLAllocColor(handle->lowlevel, 245, 245, 245); - if(strcmp(color, "WhiteSmoke") == 0) return MwLLAllocColor(handle->lowlevel, 245, 245, 245); - if(strcmp(color, "gainsboro") == 0) return MwLLAllocColor(handle->lowlevel, 220, 220, 220); - if(strcmp(color, "floral white") == 0) return MwLLAllocColor(handle->lowlevel, 255, 250, 240); - if(strcmp(color, "FloralWhite") == 0) return MwLLAllocColor(handle->lowlevel, 255, 250, 240); - if(strcmp(color, "old lace") == 0) return MwLLAllocColor(handle->lowlevel, 253, 245, 230); - if(strcmp(color, "OldLace") == 0) return MwLLAllocColor(handle->lowlevel, 253, 245, 230); - if(strcmp(color, "linen") == 0) return MwLLAllocColor(handle->lowlevel, 250, 240, 230); - if(strcmp(color, "antique white") == 0) return MwLLAllocColor(handle->lowlevel, 250, 235, 215); - if(strcmp(color, "AntiqueWhite") == 0) return MwLLAllocColor(handle->lowlevel, 250, 235, 215); - if(strcmp(color, "papaya whip") == 0) return MwLLAllocColor(handle->lowlevel, 255, 239, 213); - if(strcmp(color, "PapayaWhip") == 0) return MwLLAllocColor(handle->lowlevel, 255, 239, 213); - if(strcmp(color, "blanched almond") == 0) return MwLLAllocColor(handle->lowlevel, 255, 235, 205); - if(strcmp(color, "BlanchedAlmond") == 0) return MwLLAllocColor(handle->lowlevel, 255, 235, 205); - if(strcmp(color, "bisque") == 0) return MwLLAllocColor(handle->lowlevel, 255, 228, 196); - if(strcmp(color, "peach puff") == 0) return MwLLAllocColor(handle->lowlevel, 255, 218, 185); - if(strcmp(color, "PeachPuff") == 0) return MwLLAllocColor(handle->lowlevel, 255, 218, 185); - if(strcmp(color, "navajo white") == 0) return MwLLAllocColor(handle->lowlevel, 255, 222, 173); - if(strcmp(color, "NavajoWhite") == 0) return MwLLAllocColor(handle->lowlevel, 255, 222, 173); - if(strcmp(color, "moccasin") == 0) return MwLLAllocColor(handle->lowlevel, 255, 228, 181); - if(strcmp(color, "cornsilk") == 0) return MwLLAllocColor(handle->lowlevel, 255, 248, 220); - if(strcmp(color, "ivory") == 0) return MwLLAllocColor(handle->lowlevel, 255, 255, 240); - if(strcmp(color, "lemon chiffon") == 0) return MwLLAllocColor(handle->lowlevel, 255, 250, 205); - if(strcmp(color, "LemonChiffon") == 0) return MwLLAllocColor(handle->lowlevel, 255, 250, 205); - if(strcmp(color, "seashell") == 0) return MwLLAllocColor(handle->lowlevel, 255, 245, 238); - if(strcmp(color, "honeydew") == 0) return MwLLAllocColor(handle->lowlevel, 240, 255, 240); - if(strcmp(color, "mint cream") == 0) return MwLLAllocColor(handle->lowlevel, 245, 255, 250); - if(strcmp(color, "MintCream") == 0) return MwLLAllocColor(handle->lowlevel, 245, 255, 250); - if(strcmp(color, "azure") == 0) return MwLLAllocColor(handle->lowlevel, 240, 255, 255); - if(strcmp(color, "alice blue") == 0) return MwLLAllocColor(handle->lowlevel, 240, 248, 255); - if(strcmp(color, "AliceBlue") == 0) return MwLLAllocColor(handle->lowlevel, 240, 248, 255); - if(strcmp(color, "lavender") == 0) return MwLLAllocColor(handle->lowlevel, 230, 230, 250); - if(strcmp(color, "lavender blush") == 0) return MwLLAllocColor(handle->lowlevel, 255, 240, 245); - if(strcmp(color, "LavenderBlush") == 0) return MwLLAllocColor(handle->lowlevel, 255, 240, 245); - if(strcmp(color, "misty rose") == 0) return MwLLAllocColor(handle->lowlevel, 255, 228, 225); - if(strcmp(color, "MistyRose") == 0) return MwLLAllocColor(handle->lowlevel, 255, 228, 225); - if(strcmp(color, "white") == 0) return MwLLAllocColor(handle->lowlevel, 255, 255, 255); - if(strcmp(color, "black") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 0); - if(strcmp(color, "dark slate gray") == 0) return MwLLAllocColor(handle->lowlevel, 47, 79, 79); - if(strcmp(color, "DarkSlateGray") == 0) return MwLLAllocColor(handle->lowlevel, 47, 79, 79); - if(strcmp(color, "dark slate grey") == 0) return MwLLAllocColor(handle->lowlevel, 47, 79, 79); - if(strcmp(color, "DarkSlateGrey") == 0) return MwLLAllocColor(handle->lowlevel, 47, 79, 79); - if(strcmp(color, "dim gray") == 0) return MwLLAllocColor(handle->lowlevel, 105, 105, 105); - if(strcmp(color, "DimGray") == 0) return MwLLAllocColor(handle->lowlevel, 105, 105, 105); - if(strcmp(color, "dim grey") == 0) return MwLLAllocColor(handle->lowlevel, 105, 105, 105); - if(strcmp(color, "DimGrey") == 0) return MwLLAllocColor(handle->lowlevel, 105, 105, 105); - if(strcmp(color, "slate gray") == 0) return MwLLAllocColor(handle->lowlevel, 112, 128, 144); - if(strcmp(color, "SlateGray") == 0) return MwLLAllocColor(handle->lowlevel, 112, 128, 144); - if(strcmp(color, "slate grey") == 0) return MwLLAllocColor(handle->lowlevel, 112, 128, 144); - if(strcmp(color, "SlateGrey") == 0) return MwLLAllocColor(handle->lowlevel, 112, 128, 144); - if(strcmp(color, "light slate gray") == 0) return MwLLAllocColor(handle->lowlevel, 119, 136, 153); - if(strcmp(color, "LightSlateGray") == 0) return MwLLAllocColor(handle->lowlevel, 119, 136, 153); - if(strcmp(color, "light slate grey") == 0) return MwLLAllocColor(handle->lowlevel, 119, 136, 153); - if(strcmp(color, "LightSlateGrey") == 0) return MwLLAllocColor(handle->lowlevel, 119, 136, 153); - if(strcmp(color, "gray") == 0) return MwLLAllocColor(handle->lowlevel, 190, 190, 190); - if(strcmp(color, "grey") == 0) return MwLLAllocColor(handle->lowlevel, 190, 190, 190); - if(strcmp(color, "x11 gray") == 0) return MwLLAllocColor(handle->lowlevel, 190, 190, 190); - if(strcmp(color, "X11Gray") == 0) return MwLLAllocColor(handle->lowlevel, 190, 190, 190); - if(strcmp(color, "x11 grey") == 0) return MwLLAllocColor(handle->lowlevel, 190, 190, 190); - if(strcmp(color, "X11Grey") == 0) return MwLLAllocColor(handle->lowlevel, 190, 190, 190); - if(strcmp(color, "web gray") == 0) return MwLLAllocColor(handle->lowlevel, 128, 128, 128); - if(strcmp(color, "WebGray") == 0) return MwLLAllocColor(handle->lowlevel, 128, 128, 128); - if(strcmp(color, "web grey") == 0) return MwLLAllocColor(handle->lowlevel, 128, 128, 128); - if(strcmp(color, "WebGrey") == 0) return MwLLAllocColor(handle->lowlevel, 128, 128, 128); - if(strcmp(color, "light grey") == 0) return MwLLAllocColor(handle->lowlevel, 211, 211, 211); - if(strcmp(color, "LightGrey") == 0) return MwLLAllocColor(handle->lowlevel, 211, 211, 211); - if(strcmp(color, "light gray") == 0) return MwLLAllocColor(handle->lowlevel, 211, 211, 211); - if(strcmp(color, "LightGray") == 0) return MwLLAllocColor(handle->lowlevel, 211, 211, 211); - if(strcmp(color, "midnight blue") == 0) return MwLLAllocColor(handle->lowlevel, 25, 25, 112); - if(strcmp(color, "MidnightBlue") == 0) return MwLLAllocColor(handle->lowlevel, 25, 25, 112); - if(strcmp(color, "navy") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 128); - if(strcmp(color, "navy blue") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 128); - if(strcmp(color, "NavyBlue") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 128); - if(strcmp(color, "cornflower blue") == 0) return MwLLAllocColor(handle->lowlevel, 100, 149, 237); - if(strcmp(color, "CornflowerBlue") == 0) return MwLLAllocColor(handle->lowlevel, 100, 149, 237); - if(strcmp(color, "dark slate blue") == 0) return MwLLAllocColor(handle->lowlevel, 72, 61, 139); - if(strcmp(color, "DarkSlateBlue") == 0) return MwLLAllocColor(handle->lowlevel, 72, 61, 139); - if(strcmp(color, "slate blue") == 0) return MwLLAllocColor(handle->lowlevel, 106, 90, 205); - if(strcmp(color, "SlateBlue") == 0) return MwLLAllocColor(handle->lowlevel, 106, 90, 205); - if(strcmp(color, "medium slate blue") == 0) return MwLLAllocColor(handle->lowlevel, 123, 104, 238); - if(strcmp(color, "MediumSlateBlue") == 0) return MwLLAllocColor(handle->lowlevel, 123, 104, 238); - if(strcmp(color, "light slate blue") == 0) return MwLLAllocColor(handle->lowlevel, 132, 112, 255); - if(strcmp(color, "LightSlateBlue") == 0) return MwLLAllocColor(handle->lowlevel, 132, 112, 255); - if(strcmp(color, "medium blue") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 205); - if(strcmp(color, "MediumBlue") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 205); - if(strcmp(color, "royal blue") == 0) return MwLLAllocColor(handle->lowlevel, 65, 105, 225); - if(strcmp(color, "RoyalBlue") == 0) return MwLLAllocColor(handle->lowlevel, 65, 105, 225); - if(strcmp(color, "blue") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 255); - if(strcmp(color, "dodger blue") == 0) return MwLLAllocColor(handle->lowlevel, 30, 144, 255); - if(strcmp(color, "DodgerBlue") == 0) return MwLLAllocColor(handle->lowlevel, 30, 144, 255); - if(strcmp(color, "deep sky blue") == 0) return MwLLAllocColor(handle->lowlevel, 0, 191, 255); - if(strcmp(color, "DeepSkyBlue") == 0) return MwLLAllocColor(handle->lowlevel, 0, 191, 255); - if(strcmp(color, "sky blue") == 0) return MwLLAllocColor(handle->lowlevel, 135, 206, 235); - if(strcmp(color, "SkyBlue") == 0) return MwLLAllocColor(handle->lowlevel, 135, 206, 235); - if(strcmp(color, "light sky blue") == 0) return MwLLAllocColor(handle->lowlevel, 135, 206, 250); - if(strcmp(color, "LightSkyBlue") == 0) return MwLLAllocColor(handle->lowlevel, 135, 206, 250); - if(strcmp(color, "steel blue") == 0) return MwLLAllocColor(handle->lowlevel, 70, 130, 180); - if(strcmp(color, "SteelBlue") == 0) return MwLLAllocColor(handle->lowlevel, 70, 130, 180); - if(strcmp(color, "light steel blue") == 0) return MwLLAllocColor(handle->lowlevel, 176, 196, 222); - if(strcmp(color, "LightSteelBlue") == 0) return MwLLAllocColor(handle->lowlevel, 176, 196, 222); - if(strcmp(color, "light blue") == 0) return MwLLAllocColor(handle->lowlevel, 173, 216, 230); - if(strcmp(color, "LightBlue") == 0) return MwLLAllocColor(handle->lowlevel, 173, 216, 230); - if(strcmp(color, "powder blue") == 0) return MwLLAllocColor(handle->lowlevel, 176, 224, 230); - if(strcmp(color, "PowderBlue") == 0) return MwLLAllocColor(handle->lowlevel, 176, 224, 230); - if(strcmp(color, "pale turquoise") == 0) return MwLLAllocColor(handle->lowlevel, 175, 238, 238); - if(strcmp(color, "PaleTurquoise") == 0) return MwLLAllocColor(handle->lowlevel, 175, 238, 238); - if(strcmp(color, "dark turquoise") == 0) return MwLLAllocColor(handle->lowlevel, 0, 206, 209); - if(strcmp(color, "DarkTurquoise") == 0) return MwLLAllocColor(handle->lowlevel, 0, 206, 209); - if(strcmp(color, "medium turquoise") == 0) return MwLLAllocColor(handle->lowlevel, 72, 209, 204); - if(strcmp(color, "MediumTurquoise") == 0) return MwLLAllocColor(handle->lowlevel, 72, 209, 204); - if(strcmp(color, "turquoise") == 0) return MwLLAllocColor(handle->lowlevel, 64, 224, 208); - if(strcmp(color, "cyan") == 0) return MwLLAllocColor(handle->lowlevel, 0, 255, 255); - if(strcmp(color, "aqua") == 0) return MwLLAllocColor(handle->lowlevel, 0, 255, 255); - if(strcmp(color, "light cyan") == 0) return MwLLAllocColor(handle->lowlevel, 224, 255, 255); - if(strcmp(color, "LightCyan") == 0) return MwLLAllocColor(handle->lowlevel, 224, 255, 255); - if(strcmp(color, "cadet blue") == 0) return MwLLAllocColor(handle->lowlevel, 95, 158, 160); - if(strcmp(color, "CadetBlue") == 0) return MwLLAllocColor(handle->lowlevel, 95, 158, 160); - if(strcmp(color, "medium aquamarine") == 0) return MwLLAllocColor(handle->lowlevel, 102, 205, 170); - if(strcmp(color, "MediumAquamarine") == 0) return MwLLAllocColor(handle->lowlevel, 102, 205, 170); - if(strcmp(color, "aquamarine") == 0) return MwLLAllocColor(handle->lowlevel, 127, 255, 212); - if(strcmp(color, "dark green") == 0) return MwLLAllocColor(handle->lowlevel, 0, 100, 0); - if(strcmp(color, "DarkGreen") == 0) return MwLLAllocColor(handle->lowlevel, 0, 100, 0); - if(strcmp(color, "dark olive green") == 0) return MwLLAllocColor(handle->lowlevel, 85, 107, 47); - if(strcmp(color, "DarkOliveGreen") == 0) return MwLLAllocColor(handle->lowlevel, 85, 107, 47); - if(strcmp(color, "dark sea green") == 0) return MwLLAllocColor(handle->lowlevel, 143, 188, 143); - if(strcmp(color, "DarkSeaGreen") == 0) return MwLLAllocColor(handle->lowlevel, 143, 188, 143); - if(strcmp(color, "sea green") == 0) return MwLLAllocColor(handle->lowlevel, 46, 139, 87); - if(strcmp(color, "SeaGreen") == 0) return MwLLAllocColor(handle->lowlevel, 46, 139, 87); - if(strcmp(color, "medium sea green") == 0) return MwLLAllocColor(handle->lowlevel, 60, 179, 113); - if(strcmp(color, "MediumSeaGreen") == 0) return MwLLAllocColor(handle->lowlevel, 60, 179, 113); - if(strcmp(color, "light sea green") == 0) return MwLLAllocColor(handle->lowlevel, 32, 178, 170); - if(strcmp(color, "LightSeaGreen") == 0) return MwLLAllocColor(handle->lowlevel, 32, 178, 170); - if(strcmp(color, "pale green") == 0) return MwLLAllocColor(handle->lowlevel, 152, 251, 152); - if(strcmp(color, "PaleGreen") == 0) return MwLLAllocColor(handle->lowlevel, 152, 251, 152); - if(strcmp(color, "spring green") == 0) return MwLLAllocColor(handle->lowlevel, 0, 255, 127); - if(strcmp(color, "SpringGreen") == 0) return MwLLAllocColor(handle->lowlevel, 0, 255, 127); - if(strcmp(color, "lawn green") == 0) return MwLLAllocColor(handle->lowlevel, 124, 252, 0); - if(strcmp(color, "LawnGreen") == 0) return MwLLAllocColor(handle->lowlevel, 124, 252, 0); - if(strcmp(color, "green") == 0) return MwLLAllocColor(handle->lowlevel, 0, 255, 0); - if(strcmp(color, "lime") == 0) return MwLLAllocColor(handle->lowlevel, 0, 255, 0); - if(strcmp(color, "x11 green") == 0) return MwLLAllocColor(handle->lowlevel, 0, 255, 0); - if(strcmp(color, "X11Green") == 0) return MwLLAllocColor(handle->lowlevel, 0, 255, 0); - if(strcmp(color, "web green") == 0) return MwLLAllocColor(handle->lowlevel, 0, 128, 0); - if(strcmp(color, "WebGreen") == 0) return MwLLAllocColor(handle->lowlevel, 0, 128, 0); - if(strcmp(color, "chartreuse") == 0) return MwLLAllocColor(handle->lowlevel, 127, 255, 0); - if(strcmp(color, "medium spring green") == 0) return MwLLAllocColor(handle->lowlevel, 0, 250, 154); - if(strcmp(color, "MediumSpringGreen") == 0) return MwLLAllocColor(handle->lowlevel, 0, 250, 154); - if(strcmp(color, "green yellow") == 0) return MwLLAllocColor(handle->lowlevel, 173, 255, 47); - if(strcmp(color, "GreenYellow") == 0) return MwLLAllocColor(handle->lowlevel, 173, 255, 47); - if(strcmp(color, "lime green") == 0) return MwLLAllocColor(handle->lowlevel, 50, 205, 50); - if(strcmp(color, "LimeGreen") == 0) return MwLLAllocColor(handle->lowlevel, 50, 205, 50); - if(strcmp(color, "yellow green") == 0) return MwLLAllocColor(handle->lowlevel, 154, 205, 50); - if(strcmp(color, "YellowGreen") == 0) return MwLLAllocColor(handle->lowlevel, 154, 205, 50); - if(strcmp(color, "forest green") == 0) return MwLLAllocColor(handle->lowlevel, 34, 139, 34); - if(strcmp(color, "ForestGreen") == 0) return MwLLAllocColor(handle->lowlevel, 34, 139, 34); - if(strcmp(color, "olive drab") == 0) return MwLLAllocColor(handle->lowlevel, 107, 142, 35); - if(strcmp(color, "OliveDrab") == 0) return MwLLAllocColor(handle->lowlevel, 107, 142, 35); - if(strcmp(color, "dark khaki") == 0) return MwLLAllocColor(handle->lowlevel, 189, 183, 107); - if(strcmp(color, "DarkKhaki") == 0) return MwLLAllocColor(handle->lowlevel, 189, 183, 107); - if(strcmp(color, "khaki") == 0) return MwLLAllocColor(handle->lowlevel, 240, 230, 140); - if(strcmp(color, "pale goldenrod") == 0) return MwLLAllocColor(handle->lowlevel, 238, 232, 170); - if(strcmp(color, "PaleGoldenrod") == 0) return MwLLAllocColor(handle->lowlevel, 238, 232, 170); - if(strcmp(color, "light goldenrod yellow") == 0) return MwLLAllocColor(handle->lowlevel, 250, 250, 210); - if(strcmp(color, "LightGoldenrodYellow") == 0) return MwLLAllocColor(handle->lowlevel, 250, 250, 210); - if(strcmp(color, "light yellow") == 0) return MwLLAllocColor(handle->lowlevel, 255, 255, 224); - if(strcmp(color, "LightYellow") == 0) return MwLLAllocColor(handle->lowlevel, 255, 255, 224); - if(strcmp(color, "yellow") == 0) return MwLLAllocColor(handle->lowlevel, 255, 255, 0); - if(strcmp(color, "gold") == 0) return MwLLAllocColor(handle->lowlevel, 255, 215, 0); - if(strcmp(color, "light goldenrod") == 0) return MwLLAllocColor(handle->lowlevel, 238, 221, 130); - if(strcmp(color, "LightGoldenrod") == 0) return MwLLAllocColor(handle->lowlevel, 238, 221, 130); - if(strcmp(color, "goldenrod") == 0) return MwLLAllocColor(handle->lowlevel, 218, 165, 32); - if(strcmp(color, "dark goldenrod") == 0) return MwLLAllocColor(handle->lowlevel, 184, 134, 11); - if(strcmp(color, "DarkGoldenrod") == 0) return MwLLAllocColor(handle->lowlevel, 184, 134, 11); - if(strcmp(color, "rosy brown") == 0) return MwLLAllocColor(handle->lowlevel, 188, 143, 143); - if(strcmp(color, "RosyBrown") == 0) return MwLLAllocColor(handle->lowlevel, 188, 143, 143); - if(strcmp(color, "indian red") == 0) return MwLLAllocColor(handle->lowlevel, 205, 92, 92); - if(strcmp(color, "IndianRed") == 0) return MwLLAllocColor(handle->lowlevel, 205, 92, 92); - if(strcmp(color, "saddle brown") == 0) return MwLLAllocColor(handle->lowlevel, 139, 69, 19); - if(strcmp(color, "SaddleBrown") == 0) return MwLLAllocColor(handle->lowlevel, 139, 69, 19); - if(strcmp(color, "sienna") == 0) return MwLLAllocColor(handle->lowlevel, 160, 82, 45); - if(strcmp(color, "peru") == 0) return MwLLAllocColor(handle->lowlevel, 205, 133, 63); - if(strcmp(color, "burlywood") == 0) return MwLLAllocColor(handle->lowlevel, 222, 184, 135); - if(strcmp(color, "beige") == 0) return MwLLAllocColor(handle->lowlevel, 245, 245, 220); - if(strcmp(color, "wheat") == 0) return MwLLAllocColor(handle->lowlevel, 245, 222, 179); - if(strcmp(color, "sandy brown") == 0) return MwLLAllocColor(handle->lowlevel, 244, 164, 96); - if(strcmp(color, "SandyBrown") == 0) return MwLLAllocColor(handle->lowlevel, 244, 164, 96); - if(strcmp(color, "tan") == 0) return MwLLAllocColor(handle->lowlevel, 210, 180, 140); - if(strcmp(color, "chocolate") == 0) return MwLLAllocColor(handle->lowlevel, 210, 105, 30); - if(strcmp(color, "firebrick") == 0) return MwLLAllocColor(handle->lowlevel, 178, 34, 34); - if(strcmp(color, "brown") == 0) return MwLLAllocColor(handle->lowlevel, 165, 42, 42); - if(strcmp(color, "dark salmon") == 0) return MwLLAllocColor(handle->lowlevel, 233, 150, 122); - if(strcmp(color, "DarkSalmon") == 0) return MwLLAllocColor(handle->lowlevel, 233, 150, 122); - if(strcmp(color, "salmon") == 0) return MwLLAllocColor(handle->lowlevel, 250, 128, 114); - if(strcmp(color, "light salmon") == 0) return MwLLAllocColor(handle->lowlevel, 255, 160, 122); - if(strcmp(color, "LightSalmon") == 0) return MwLLAllocColor(handle->lowlevel, 255, 160, 122); - if(strcmp(color, "orange") == 0) return MwLLAllocColor(handle->lowlevel, 255, 165, 0); - if(strcmp(color, "dark orange") == 0) return MwLLAllocColor(handle->lowlevel, 255, 140, 0); - if(strcmp(color, "DarkOrange") == 0) return MwLLAllocColor(handle->lowlevel, 255, 140, 0); - if(strcmp(color, "coral") == 0) return MwLLAllocColor(handle->lowlevel, 255, 127, 80); - if(strcmp(color, "light coral") == 0) return MwLLAllocColor(handle->lowlevel, 240, 128, 128); - if(strcmp(color, "LightCoral") == 0) return MwLLAllocColor(handle->lowlevel, 240, 128, 128); - if(strcmp(color, "tomato") == 0) return MwLLAllocColor(handle->lowlevel, 255, 99, 71); - if(strcmp(color, "orange red") == 0) return MwLLAllocColor(handle->lowlevel, 255, 69, 0); - if(strcmp(color, "OrangeRed") == 0) return MwLLAllocColor(handle->lowlevel, 255, 69, 0); - if(strcmp(color, "red") == 0) return MwLLAllocColor(handle->lowlevel, 255, 0, 0); - if(strcmp(color, "hot pink") == 0) return MwLLAllocColor(handle->lowlevel, 255, 105, 180); - if(strcmp(color, "HotPink") == 0) return MwLLAllocColor(handle->lowlevel, 255, 105, 180); - if(strcmp(color, "deep pink") == 0) return MwLLAllocColor(handle->lowlevel, 255, 20, 147); - if(strcmp(color, "DeepPink") == 0) return MwLLAllocColor(handle->lowlevel, 255, 20, 147); - if(strcmp(color, "pink") == 0) return MwLLAllocColor(handle->lowlevel, 255, 192, 203); - if(strcmp(color, "light pink") == 0) return MwLLAllocColor(handle->lowlevel, 255, 182, 193); - if(strcmp(color, "LightPink") == 0) return MwLLAllocColor(handle->lowlevel, 255, 182, 193); - if(strcmp(color, "pale violet red") == 0) return MwLLAllocColor(handle->lowlevel, 219, 112, 147); - if(strcmp(color, "PaleVioletRed") == 0) return MwLLAllocColor(handle->lowlevel, 219, 112, 147); - if(strcmp(color, "maroon") == 0) return MwLLAllocColor(handle->lowlevel, 176, 48, 96); - if(strcmp(color, "x11 maroon") == 0) return MwLLAllocColor(handle->lowlevel, 176, 48, 96); - if(strcmp(color, "X11Maroon") == 0) return MwLLAllocColor(handle->lowlevel, 176, 48, 96); - if(strcmp(color, "web maroon") == 0) return MwLLAllocColor(handle->lowlevel, 128, 0, 0); - if(strcmp(color, "WebMaroon") == 0) return MwLLAllocColor(handle->lowlevel, 128, 0, 0); - if(strcmp(color, "medium violet red") == 0) return MwLLAllocColor(handle->lowlevel, 199, 21, 133); - if(strcmp(color, "MediumVioletRed") == 0) return MwLLAllocColor(handle->lowlevel, 199, 21, 133); - if(strcmp(color, "violet red") == 0) return MwLLAllocColor(handle->lowlevel, 208, 32, 144); - if(strcmp(color, "VioletRed") == 0) return MwLLAllocColor(handle->lowlevel, 208, 32, 144); - if(strcmp(color, "magenta") == 0) return MwLLAllocColor(handle->lowlevel, 255, 0, 255); - if(strcmp(color, "fuchsia") == 0) return MwLLAllocColor(handle->lowlevel, 255, 0, 255); - if(strcmp(color, "violet") == 0) return MwLLAllocColor(handle->lowlevel, 238, 130, 238); - if(strcmp(color, "plum") == 0) return MwLLAllocColor(handle->lowlevel, 221, 160, 221); - if(strcmp(color, "orchid") == 0) return MwLLAllocColor(handle->lowlevel, 218, 112, 214); - if(strcmp(color, "medium orchid") == 0) return MwLLAllocColor(handle->lowlevel, 186, 85, 211); - if(strcmp(color, "MediumOrchid") == 0) return MwLLAllocColor(handle->lowlevel, 186, 85, 211); - if(strcmp(color, "dark orchid") == 0) return MwLLAllocColor(handle->lowlevel, 153, 50, 204); - if(strcmp(color, "DarkOrchid") == 0) return MwLLAllocColor(handle->lowlevel, 153, 50, 204); - if(strcmp(color, "dark violet") == 0) return MwLLAllocColor(handle->lowlevel, 148, 0, 211); - if(strcmp(color, "DarkViolet") == 0) return MwLLAllocColor(handle->lowlevel, 148, 0, 211); - if(strcmp(color, "blue violet") == 0) return MwLLAllocColor(handle->lowlevel, 138, 43, 226); - if(strcmp(color, "BlueViolet") == 0) return MwLLAllocColor(handle->lowlevel, 138, 43, 226); - if(strcmp(color, "purple") == 0) return MwLLAllocColor(handle->lowlevel, 160, 32, 240); - if(strcmp(color, "x11 purple") == 0) return MwLLAllocColor(handle->lowlevel, 160, 32, 240); - if(strcmp(color, "X11Purple") == 0) return MwLLAllocColor(handle->lowlevel, 160, 32, 240); - if(strcmp(color, "web purple") == 0) return MwLLAllocColor(handle->lowlevel, 128, 0, 128); - if(strcmp(color, "WebPurple") == 0) return MwLLAllocColor(handle->lowlevel, 128, 0, 128); - if(strcmp(color, "medium purple") == 0) return MwLLAllocColor(handle->lowlevel, 147, 112, 219); - if(strcmp(color, "MediumPurple") == 0) return MwLLAllocColor(handle->lowlevel, 147, 112, 219); - if(strcmp(color, "thistle") == 0) return MwLLAllocColor(handle->lowlevel, 216, 191, 216); - if(strcmp(color, "snow1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 250, 250); - if(strcmp(color, "snow2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 233, 233); - if(strcmp(color, "snow3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 201, 201); - if(strcmp(color, "snow4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 137, 137); - if(strcmp(color, "seashell1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 245, 238); - if(strcmp(color, "seashell2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 229, 222); - if(strcmp(color, "seashell3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 197, 191); - if(strcmp(color, "seashell4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 134, 130); - if(strcmp(color, "AntiqueWhite1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 239, 219); - if(strcmp(color, "AntiqueWhite2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 223, 204); - if(strcmp(color, "AntiqueWhite3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 192, 176); - if(strcmp(color, "AntiqueWhite4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 131, 120); - if(strcmp(color, "bisque1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 228, 196); - if(strcmp(color, "bisque2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 213, 183); - if(strcmp(color, "bisque3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 183, 158); - if(strcmp(color, "bisque4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 125, 107); - if(strcmp(color, "PeachPuff1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 218, 185); - if(strcmp(color, "PeachPuff2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 203, 173); - if(strcmp(color, "PeachPuff3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 175, 149); - if(strcmp(color, "PeachPuff4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 119, 101); - if(strcmp(color, "NavajoWhite1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 222, 173); - if(strcmp(color, "NavajoWhite2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 207, 161); - if(strcmp(color, "NavajoWhite3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 179, 139); - if(strcmp(color, "NavajoWhite4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 121, 94); - if(strcmp(color, "LemonChiffon1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 250, 205); - if(strcmp(color, "LemonChiffon2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 233, 191); - if(strcmp(color, "LemonChiffon3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 201, 165); - if(strcmp(color, "LemonChiffon4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 137, 112); - if(strcmp(color, "cornsilk1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 248, 220); - if(strcmp(color, "cornsilk2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 232, 205); - if(strcmp(color, "cornsilk3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 200, 177); - if(strcmp(color, "cornsilk4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 136, 120); - if(strcmp(color, "ivory1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 255, 240); - if(strcmp(color, "ivory2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 238, 224); - if(strcmp(color, "ivory3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 205, 193); - if(strcmp(color, "ivory4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 139, 131); - if(strcmp(color, "honeydew1") == 0) return MwLLAllocColor(handle->lowlevel, 240, 255, 240); - if(strcmp(color, "honeydew2") == 0) return MwLLAllocColor(handle->lowlevel, 224, 238, 224); - if(strcmp(color, "honeydew3") == 0) return MwLLAllocColor(handle->lowlevel, 193, 205, 193); - if(strcmp(color, "honeydew4") == 0) return MwLLAllocColor(handle->lowlevel, 131, 139, 131); - if(strcmp(color, "LavenderBlush1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 240, 245); - if(strcmp(color, "LavenderBlush2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 224, 229); - if(strcmp(color, "LavenderBlush3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 193, 197); - if(strcmp(color, "LavenderBlush4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 131, 134); - if(strcmp(color, "MistyRose1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 228, 225); - if(strcmp(color, "MistyRose2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 213, 210); - if(strcmp(color, "MistyRose3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 183, 181); - if(strcmp(color, "MistyRose4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 125, 123); - if(strcmp(color, "azure1") == 0) return MwLLAllocColor(handle->lowlevel, 240, 255, 255); - if(strcmp(color, "azure2") == 0) return MwLLAllocColor(handle->lowlevel, 224, 238, 238); - if(strcmp(color, "azure3") == 0) return MwLLAllocColor(handle->lowlevel, 193, 205, 205); - if(strcmp(color, "azure4") == 0) return MwLLAllocColor(handle->lowlevel, 131, 139, 139); - if(strcmp(color, "SlateBlue1") == 0) return MwLLAllocColor(handle->lowlevel, 131, 111, 255); - if(strcmp(color, "SlateBlue2") == 0) return MwLLAllocColor(handle->lowlevel, 122, 103, 238); - if(strcmp(color, "SlateBlue3") == 0) return MwLLAllocColor(handle->lowlevel, 105, 89, 205); - if(strcmp(color, "SlateBlue4") == 0) return MwLLAllocColor(handle->lowlevel, 71, 60, 139); - if(strcmp(color, "RoyalBlue1") == 0) return MwLLAllocColor(handle->lowlevel, 72, 118, 255); - if(strcmp(color, "RoyalBlue2") == 0) return MwLLAllocColor(handle->lowlevel, 67, 110, 238); - if(strcmp(color, "RoyalBlue3") == 0) return MwLLAllocColor(handle->lowlevel, 58, 95, 205); - if(strcmp(color, "RoyalBlue4") == 0) return MwLLAllocColor(handle->lowlevel, 39, 64, 139); - if(strcmp(color, "blue1") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 255); - if(strcmp(color, "blue2") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 238); - if(strcmp(color, "blue3") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 205); - if(strcmp(color, "blue4") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 139); - if(strcmp(color, "DodgerBlue1") == 0) return MwLLAllocColor(handle->lowlevel, 30, 144, 255); - if(strcmp(color, "DodgerBlue2") == 0) return MwLLAllocColor(handle->lowlevel, 28, 134, 238); - if(strcmp(color, "DodgerBlue3") == 0) return MwLLAllocColor(handle->lowlevel, 24, 116, 205); - if(strcmp(color, "DodgerBlue4") == 0) return MwLLAllocColor(handle->lowlevel, 16, 78, 139); - if(strcmp(color, "SteelBlue1") == 0) return MwLLAllocColor(handle->lowlevel, 99, 184, 255); - if(strcmp(color, "SteelBlue2") == 0) return MwLLAllocColor(handle->lowlevel, 92, 172, 238); - if(strcmp(color, "SteelBlue3") == 0) return MwLLAllocColor(handle->lowlevel, 79, 148, 205); - if(strcmp(color, "SteelBlue4") == 0) return MwLLAllocColor(handle->lowlevel, 54, 100, 139); - if(strcmp(color, "DeepSkyBlue1") == 0) return MwLLAllocColor(handle->lowlevel, 0, 191, 255); - if(strcmp(color, "DeepSkyBlue2") == 0) return MwLLAllocColor(handle->lowlevel, 0, 178, 238); - if(strcmp(color, "DeepSkyBlue3") == 0) return MwLLAllocColor(handle->lowlevel, 0, 154, 205); - if(strcmp(color, "DeepSkyBlue4") == 0) return MwLLAllocColor(handle->lowlevel, 0, 104, 139); - if(strcmp(color, "SkyBlue1") == 0) return MwLLAllocColor(handle->lowlevel, 135, 206, 255); - if(strcmp(color, "SkyBlue2") == 0) return MwLLAllocColor(handle->lowlevel, 126, 192, 238); - if(strcmp(color, "SkyBlue3") == 0) return MwLLAllocColor(handle->lowlevel, 108, 166, 205); - if(strcmp(color, "SkyBlue4") == 0) return MwLLAllocColor(handle->lowlevel, 74, 112, 139); - if(strcmp(color, "LightSkyBlue1") == 0) return MwLLAllocColor(handle->lowlevel, 176, 226, 255); - if(strcmp(color, "LightSkyBlue2") == 0) return MwLLAllocColor(handle->lowlevel, 164, 211, 238); - if(strcmp(color, "LightSkyBlue3") == 0) return MwLLAllocColor(handle->lowlevel, 141, 182, 205); - if(strcmp(color, "LightSkyBlue4") == 0) return MwLLAllocColor(handle->lowlevel, 96, 123, 139); - if(strcmp(color, "SlateGray1") == 0) return MwLLAllocColor(handle->lowlevel, 198, 226, 255); - if(strcmp(color, "SlateGray2") == 0) return MwLLAllocColor(handle->lowlevel, 185, 211, 238); - if(strcmp(color, "SlateGray3") == 0) return MwLLAllocColor(handle->lowlevel, 159, 182, 205); - if(strcmp(color, "SlateGray4") == 0) return MwLLAllocColor(handle->lowlevel, 108, 123, 139); - if(strcmp(color, "LightSteelBlue1") == 0) return MwLLAllocColor(handle->lowlevel, 202, 225, 255); - if(strcmp(color, "LightSteelBlue2") == 0) return MwLLAllocColor(handle->lowlevel, 188, 210, 238); - if(strcmp(color, "LightSteelBlue3") == 0) return MwLLAllocColor(handle->lowlevel, 162, 181, 205); - if(strcmp(color, "LightSteelBlue4") == 0) return MwLLAllocColor(handle->lowlevel, 110, 123, 139); - if(strcmp(color, "LightBlue1") == 0) return MwLLAllocColor(handle->lowlevel, 191, 239, 255); - if(strcmp(color, "LightBlue2") == 0) return MwLLAllocColor(handle->lowlevel, 178, 223, 238); - if(strcmp(color, "LightBlue3") == 0) return MwLLAllocColor(handle->lowlevel, 154, 192, 205); - if(strcmp(color, "LightBlue4") == 0) return MwLLAllocColor(handle->lowlevel, 104, 131, 139); - if(strcmp(color, "LightCyan1") == 0) return MwLLAllocColor(handle->lowlevel, 224, 255, 255); - if(strcmp(color, "LightCyan2") == 0) return MwLLAllocColor(handle->lowlevel, 209, 238, 238); - if(strcmp(color, "LightCyan3") == 0) return MwLLAllocColor(handle->lowlevel, 180, 205, 205); - if(strcmp(color, "LightCyan4") == 0) return MwLLAllocColor(handle->lowlevel, 122, 139, 139); - if(strcmp(color, "PaleTurquoise1") == 0) return MwLLAllocColor(handle->lowlevel, 187, 255, 255); - if(strcmp(color, "PaleTurquoise2") == 0) return MwLLAllocColor(handle->lowlevel, 174, 238, 238); - if(strcmp(color, "PaleTurquoise3") == 0) return MwLLAllocColor(handle->lowlevel, 150, 205, 205); - if(strcmp(color, "PaleTurquoise4") == 0) return MwLLAllocColor(handle->lowlevel, 102, 139, 139); - if(strcmp(color, "CadetBlue1") == 0) return MwLLAllocColor(handle->lowlevel, 152, 245, 255); - if(strcmp(color, "CadetBlue2") == 0) return MwLLAllocColor(handle->lowlevel, 142, 229, 238); - if(strcmp(color, "CadetBlue3") == 0) return MwLLAllocColor(handle->lowlevel, 122, 197, 205); - if(strcmp(color, "CadetBlue4") == 0) return MwLLAllocColor(handle->lowlevel, 83, 134, 139); - if(strcmp(color, "turquoise1") == 0) return MwLLAllocColor(handle->lowlevel, 0, 245, 255); - if(strcmp(color, "turquoise2") == 0) return MwLLAllocColor(handle->lowlevel, 0, 229, 238); - if(strcmp(color, "turquoise3") == 0) return MwLLAllocColor(handle->lowlevel, 0, 197, 205); - if(strcmp(color, "turquoise4") == 0) return MwLLAllocColor(handle->lowlevel, 0, 134, 139); - if(strcmp(color, "cyan1") == 0) return MwLLAllocColor(handle->lowlevel, 0, 255, 255); - if(strcmp(color, "cyan2") == 0) return MwLLAllocColor(handle->lowlevel, 0, 238, 238); - if(strcmp(color, "cyan3") == 0) return MwLLAllocColor(handle->lowlevel, 0, 205, 205); - if(strcmp(color, "cyan4") == 0) return MwLLAllocColor(handle->lowlevel, 0, 139, 139); - if(strcmp(color, "DarkSlateGray1") == 0) return MwLLAllocColor(handle->lowlevel, 151, 255, 255); - if(strcmp(color, "DarkSlateGray2") == 0) return MwLLAllocColor(handle->lowlevel, 141, 238, 238); - if(strcmp(color, "DarkSlateGray3") == 0) return MwLLAllocColor(handle->lowlevel, 121, 205, 205); - if(strcmp(color, "DarkSlateGray4") == 0) return MwLLAllocColor(handle->lowlevel, 82, 139, 139); - if(strcmp(color, "aquamarine1") == 0) return MwLLAllocColor(handle->lowlevel, 127, 255, 212); - if(strcmp(color, "aquamarine2") == 0) return MwLLAllocColor(handle->lowlevel, 118, 238, 198); - if(strcmp(color, "aquamarine3") == 0) return MwLLAllocColor(handle->lowlevel, 102, 205, 170); - if(strcmp(color, "aquamarine4") == 0) return MwLLAllocColor(handle->lowlevel, 69, 139, 116); - if(strcmp(color, "DarkSeaGreen1") == 0) return MwLLAllocColor(handle->lowlevel, 193, 255, 193); - if(strcmp(color, "DarkSeaGreen2") == 0) return MwLLAllocColor(handle->lowlevel, 180, 238, 180); - if(strcmp(color, "DarkSeaGreen3") == 0) return MwLLAllocColor(handle->lowlevel, 155, 205, 155); - if(strcmp(color, "DarkSeaGreen4") == 0) return MwLLAllocColor(handle->lowlevel, 105, 139, 105); - if(strcmp(color, "SeaGreen1") == 0) return MwLLAllocColor(handle->lowlevel, 84, 255, 159); - if(strcmp(color, "SeaGreen2") == 0) return MwLLAllocColor(handle->lowlevel, 78, 238, 148); - if(strcmp(color, "SeaGreen3") == 0) return MwLLAllocColor(handle->lowlevel, 67, 205, 128); - if(strcmp(color, "SeaGreen4") == 0) return MwLLAllocColor(handle->lowlevel, 46, 139, 87); - if(strcmp(color, "PaleGreen1") == 0) return MwLLAllocColor(handle->lowlevel, 154, 255, 154); - if(strcmp(color, "PaleGreen2") == 0) return MwLLAllocColor(handle->lowlevel, 144, 238, 144); - if(strcmp(color, "PaleGreen3") == 0) return MwLLAllocColor(handle->lowlevel, 124, 205, 124); - if(strcmp(color, "PaleGreen4") == 0) return MwLLAllocColor(handle->lowlevel, 84, 139, 84); - if(strcmp(color, "SpringGreen1") == 0) return MwLLAllocColor(handle->lowlevel, 0, 255, 127); - if(strcmp(color, "SpringGreen2") == 0) return MwLLAllocColor(handle->lowlevel, 0, 238, 118); - if(strcmp(color, "SpringGreen3") == 0) return MwLLAllocColor(handle->lowlevel, 0, 205, 102); - if(strcmp(color, "SpringGreen4") == 0) return MwLLAllocColor(handle->lowlevel, 0, 139, 69); - if(strcmp(color, "green1") == 0) return MwLLAllocColor(handle->lowlevel, 0, 255, 0); - if(strcmp(color, "green2") == 0) return MwLLAllocColor(handle->lowlevel, 0, 238, 0); - if(strcmp(color, "green3") == 0) return MwLLAllocColor(handle->lowlevel, 0, 205, 0); - if(strcmp(color, "green4") == 0) return MwLLAllocColor(handle->lowlevel, 0, 139, 0); - if(strcmp(color, "chartreuse1") == 0) return MwLLAllocColor(handle->lowlevel, 127, 255, 0); - if(strcmp(color, "chartreuse2") == 0) return MwLLAllocColor(handle->lowlevel, 118, 238, 0); - if(strcmp(color, "chartreuse3") == 0) return MwLLAllocColor(handle->lowlevel, 102, 205, 0); - if(strcmp(color, "chartreuse4") == 0) return MwLLAllocColor(handle->lowlevel, 69, 139, 0); - if(strcmp(color, "OliveDrab1") == 0) return MwLLAllocColor(handle->lowlevel, 192, 255, 62); - if(strcmp(color, "OliveDrab2") == 0) return MwLLAllocColor(handle->lowlevel, 179, 238, 58); - if(strcmp(color, "OliveDrab3") == 0) return MwLLAllocColor(handle->lowlevel, 154, 205, 50); - if(strcmp(color, "OliveDrab4") == 0) return MwLLAllocColor(handle->lowlevel, 105, 139, 34); - if(strcmp(color, "DarkOliveGreen1") == 0) return MwLLAllocColor(handle->lowlevel, 202, 255, 112); - if(strcmp(color, "DarkOliveGreen2") == 0) return MwLLAllocColor(handle->lowlevel, 188, 238, 104); - if(strcmp(color, "DarkOliveGreen3") == 0) return MwLLAllocColor(handle->lowlevel, 162, 205, 90); - if(strcmp(color, "DarkOliveGreen4") == 0) return MwLLAllocColor(handle->lowlevel, 110, 139, 61); - if(strcmp(color, "khaki1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 246, 143); - if(strcmp(color, "khaki2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 230, 133); - if(strcmp(color, "khaki3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 198, 115); - if(strcmp(color, "khaki4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 134, 78); - if(strcmp(color, "LightGoldenrod1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 236, 139); - if(strcmp(color, "LightGoldenrod2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 220, 130); - if(strcmp(color, "LightGoldenrod3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 190, 112); - if(strcmp(color, "LightGoldenrod4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 129, 76); - if(strcmp(color, "LightYellow1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 255, 224); - if(strcmp(color, "LightYellow2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 238, 209); - if(strcmp(color, "LightYellow3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 205, 180); - if(strcmp(color, "LightYellow4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 139, 122); - if(strcmp(color, "yellow1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 255, 0); - if(strcmp(color, "yellow2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 238, 0); - if(strcmp(color, "yellow3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 205, 0); - if(strcmp(color, "yellow4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 139, 0); - if(strcmp(color, "gold1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 215, 0); - if(strcmp(color, "gold2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 201, 0); - if(strcmp(color, "gold3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 173, 0); - if(strcmp(color, "gold4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 117, 0); - if(strcmp(color, "goldenrod1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 193, 37); - if(strcmp(color, "goldenrod2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 180, 34); - if(strcmp(color, "goldenrod3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 155, 29); - if(strcmp(color, "goldenrod4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 105, 20); - if(strcmp(color, "DarkGoldenrod1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 185, 15); - if(strcmp(color, "DarkGoldenrod2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 173, 14); - if(strcmp(color, "DarkGoldenrod3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 149, 12); - if(strcmp(color, "DarkGoldenrod4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 101, 8); - if(strcmp(color, "RosyBrown1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 193, 193); - if(strcmp(color, "RosyBrown2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 180, 180); - if(strcmp(color, "RosyBrown3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 155, 155); - if(strcmp(color, "RosyBrown4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 105, 105); - if(strcmp(color, "IndianRed1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 106, 106); - if(strcmp(color, "IndianRed2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 99, 99); - if(strcmp(color, "IndianRed3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 85, 85); - if(strcmp(color, "IndianRed4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 58, 58); - if(strcmp(color, "sienna1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 130, 71); - if(strcmp(color, "sienna2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 121, 66); - if(strcmp(color, "sienna3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 104, 57); - if(strcmp(color, "sienna4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 71, 38); - if(strcmp(color, "burlywood1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 211, 155); - if(strcmp(color, "burlywood2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 197, 145); - if(strcmp(color, "burlywood3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 170, 125); - if(strcmp(color, "burlywood4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 115, 85); - if(strcmp(color, "wheat1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 231, 186); - if(strcmp(color, "wheat2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 216, 174); - if(strcmp(color, "wheat3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 186, 150); - if(strcmp(color, "wheat4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 126, 102); - if(strcmp(color, "tan1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 165, 79); - if(strcmp(color, "tan2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 154, 73); - if(strcmp(color, "tan3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 133, 63); - if(strcmp(color, "tan4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 90, 43); - if(strcmp(color, "chocolate1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 127, 36); - if(strcmp(color, "chocolate2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 118, 33); - if(strcmp(color, "chocolate3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 102, 29); - if(strcmp(color, "chocolate4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 69, 19); - if(strcmp(color, "firebrick1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 48, 48); - if(strcmp(color, "firebrick2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 44, 44); - if(strcmp(color, "firebrick3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 38, 38); - if(strcmp(color, "firebrick4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 26, 26); - if(strcmp(color, "brown1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 64, 64); - if(strcmp(color, "brown2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 59, 59); - if(strcmp(color, "brown3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 51, 51); - if(strcmp(color, "brown4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 35, 35); - if(strcmp(color, "salmon1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 140, 105); - if(strcmp(color, "salmon2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 130, 98); - if(strcmp(color, "salmon3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 112, 84); - if(strcmp(color, "salmon4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 76, 57); - if(strcmp(color, "LightSalmon1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 160, 122); - if(strcmp(color, "LightSalmon2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 149, 114); - if(strcmp(color, "LightSalmon3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 129, 98); - if(strcmp(color, "LightSalmon4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 87, 66); - if(strcmp(color, "orange1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 165, 0); - if(strcmp(color, "orange2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 154, 0); - if(strcmp(color, "orange3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 133, 0); - if(strcmp(color, "orange4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 90, 0); - if(strcmp(color, "DarkOrange1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 127, 0); - if(strcmp(color, "DarkOrange2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 118, 0); - if(strcmp(color, "DarkOrange3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 102, 0); - if(strcmp(color, "DarkOrange4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 69, 0); - if(strcmp(color, "coral1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 114, 86); - if(strcmp(color, "coral2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 106, 80); - if(strcmp(color, "coral3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 91, 69); - if(strcmp(color, "coral4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 62, 47); - if(strcmp(color, "tomato1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 99, 71); - if(strcmp(color, "tomato2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 92, 66); - if(strcmp(color, "tomato3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 79, 57); - if(strcmp(color, "tomato4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 54, 38); - if(strcmp(color, "OrangeRed1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 69, 0); - if(strcmp(color, "OrangeRed2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 64, 0); - if(strcmp(color, "OrangeRed3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 55, 0); - if(strcmp(color, "OrangeRed4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 37, 0); - if(strcmp(color, "red1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 0, 0); - if(strcmp(color, "red2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 0, 0); - if(strcmp(color, "red3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 0, 0); - if(strcmp(color, "red4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 0, 0); - if(strcmp(color, "DeepPink1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 20, 147); - if(strcmp(color, "DeepPink2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 18, 137); - if(strcmp(color, "DeepPink3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 16, 118); - if(strcmp(color, "DeepPink4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 10, 80); - if(strcmp(color, "HotPink1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 110, 180); - if(strcmp(color, "HotPink2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 106, 167); - if(strcmp(color, "HotPink3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 96, 144); - if(strcmp(color, "HotPink4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 58, 98); - if(strcmp(color, "pink1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 181, 197); - if(strcmp(color, "pink2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 169, 184); - if(strcmp(color, "pink3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 145, 158); - if(strcmp(color, "pink4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 99, 108); - if(strcmp(color, "LightPink1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 174, 185); - if(strcmp(color, "LightPink2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 162, 173); - if(strcmp(color, "LightPink3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 140, 149); - if(strcmp(color, "LightPink4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 95, 101); - if(strcmp(color, "PaleVioletRed1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 130, 171); - if(strcmp(color, "PaleVioletRed2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 121, 159); - if(strcmp(color, "PaleVioletRed3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 104, 137); - if(strcmp(color, "PaleVioletRed4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 71, 93); - if(strcmp(color, "maroon1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 52, 179); - if(strcmp(color, "maroon2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 48, 167); - if(strcmp(color, "maroon3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 41, 144); - if(strcmp(color, "maroon4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 28, 98); - if(strcmp(color, "VioletRed1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 62, 150); - if(strcmp(color, "VioletRed2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 58, 140); - if(strcmp(color, "VioletRed3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 50, 120); - if(strcmp(color, "VioletRed4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 34, 82); - if(strcmp(color, "magenta1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 0, 255); - if(strcmp(color, "magenta2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 0, 238); - if(strcmp(color, "magenta3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 0, 205); - if(strcmp(color, "magenta4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 0, 139); - if(strcmp(color, "orchid1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 131, 250); - if(strcmp(color, "orchid2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 122, 233); - if(strcmp(color, "orchid3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 105, 201); - if(strcmp(color, "orchid4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 71, 137); - if(strcmp(color, "plum1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 187, 255); - if(strcmp(color, "plum2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 174, 238); - if(strcmp(color, "plum3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 150, 205); - if(strcmp(color, "plum4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 102, 139); - if(strcmp(color, "MediumOrchid1") == 0) return MwLLAllocColor(handle->lowlevel, 224, 102, 255); - if(strcmp(color, "MediumOrchid2") == 0) return MwLLAllocColor(handle->lowlevel, 209, 95, 238); - if(strcmp(color, "MediumOrchid3") == 0) return MwLLAllocColor(handle->lowlevel, 180, 82, 205); - if(strcmp(color, "MediumOrchid4") == 0) return MwLLAllocColor(handle->lowlevel, 122, 55, 139); - if(strcmp(color, "DarkOrchid1") == 0) return MwLLAllocColor(handle->lowlevel, 191, 62, 255); - if(strcmp(color, "DarkOrchid2") == 0) return MwLLAllocColor(handle->lowlevel, 178, 58, 238); - if(strcmp(color, "DarkOrchid3") == 0) return MwLLAllocColor(handle->lowlevel, 154, 50, 205); - if(strcmp(color, "DarkOrchid4") == 0) return MwLLAllocColor(handle->lowlevel, 104, 34, 139); - if(strcmp(color, "purple1") == 0) return MwLLAllocColor(handle->lowlevel, 155, 48, 255); - if(strcmp(color, "purple2") == 0) return MwLLAllocColor(handle->lowlevel, 145, 44, 238); - if(strcmp(color, "purple3") == 0) return MwLLAllocColor(handle->lowlevel, 125, 38, 205); - if(strcmp(color, "purple4") == 0) return MwLLAllocColor(handle->lowlevel, 85, 26, 139); - if(strcmp(color, "MediumPurple1") == 0) return MwLLAllocColor(handle->lowlevel, 171, 130, 255); - if(strcmp(color, "MediumPurple2") == 0) return MwLLAllocColor(handle->lowlevel, 159, 121, 238); - if(strcmp(color, "MediumPurple3") == 0) return MwLLAllocColor(handle->lowlevel, 137, 104, 205); - if(strcmp(color, "MediumPurple4") == 0) return MwLLAllocColor(handle->lowlevel, 93, 71, 139); - if(strcmp(color, "thistle1") == 0) return MwLLAllocColor(handle->lowlevel, 255, 225, 255); - if(strcmp(color, "thistle2") == 0) return MwLLAllocColor(handle->lowlevel, 238, 210, 238); - if(strcmp(color, "thistle3") == 0) return MwLLAllocColor(handle->lowlevel, 205, 181, 205); - if(strcmp(color, "thistle4") == 0) return MwLLAllocColor(handle->lowlevel, 139, 123, 139); - if(strcmp(color, "gray0") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 0); - if(strcmp(color, "grey0") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 0); - if(strcmp(color, "gray1") == 0) return MwLLAllocColor(handle->lowlevel, 3, 3, 3); - if(strcmp(color, "grey1") == 0) return MwLLAllocColor(handle->lowlevel, 3, 3, 3); - if(strcmp(color, "gray2") == 0) return MwLLAllocColor(handle->lowlevel, 5, 5, 5); - if(strcmp(color, "grey2") == 0) return MwLLAllocColor(handle->lowlevel, 5, 5, 5); - if(strcmp(color, "gray3") == 0) return MwLLAllocColor(handle->lowlevel, 8, 8, 8); - if(strcmp(color, "grey3") == 0) return MwLLAllocColor(handle->lowlevel, 8, 8, 8); - if(strcmp(color, "gray4") == 0) return MwLLAllocColor(handle->lowlevel, 10, 10, 10); - if(strcmp(color, "grey4") == 0) return MwLLAllocColor(handle->lowlevel, 10, 10, 10); - if(strcmp(color, "gray5") == 0) return MwLLAllocColor(handle->lowlevel, 13, 13, 13); - if(strcmp(color, "grey5") == 0) return MwLLAllocColor(handle->lowlevel, 13, 13, 13); - if(strcmp(color, "gray6") == 0) return MwLLAllocColor(handle->lowlevel, 15, 15, 15); - if(strcmp(color, "grey6") == 0) return MwLLAllocColor(handle->lowlevel, 15, 15, 15); - if(strcmp(color, "gray7") == 0) return MwLLAllocColor(handle->lowlevel, 18, 18, 18); - if(strcmp(color, "grey7") == 0) return MwLLAllocColor(handle->lowlevel, 18, 18, 18); - if(strcmp(color, "gray8") == 0) return MwLLAllocColor(handle->lowlevel, 20, 20, 20); - if(strcmp(color, "grey8") == 0) return MwLLAllocColor(handle->lowlevel, 20, 20, 20); - if(strcmp(color, "gray9") == 0) return MwLLAllocColor(handle->lowlevel, 23, 23, 23); - if(strcmp(color, "grey9") == 0) return MwLLAllocColor(handle->lowlevel, 23, 23, 23); - if(strcmp(color, "gray10") == 0) return MwLLAllocColor(handle->lowlevel, 26, 26, 26); - if(strcmp(color, "grey10") == 0) return MwLLAllocColor(handle->lowlevel, 26, 26, 26); - if(strcmp(color, "gray11") == 0) return MwLLAllocColor(handle->lowlevel, 28, 28, 28); - if(strcmp(color, "grey11") == 0) return MwLLAllocColor(handle->lowlevel, 28, 28, 28); - if(strcmp(color, "gray12") == 0) return MwLLAllocColor(handle->lowlevel, 31, 31, 31); - if(strcmp(color, "grey12") == 0) return MwLLAllocColor(handle->lowlevel, 31, 31, 31); - if(strcmp(color, "gray13") == 0) return MwLLAllocColor(handle->lowlevel, 33, 33, 33); - if(strcmp(color, "grey13") == 0) return MwLLAllocColor(handle->lowlevel, 33, 33, 33); - if(strcmp(color, "gray14") == 0) return MwLLAllocColor(handle->lowlevel, 36, 36, 36); - if(strcmp(color, "grey14") == 0) return MwLLAllocColor(handle->lowlevel, 36, 36, 36); - if(strcmp(color, "gray15") == 0) return MwLLAllocColor(handle->lowlevel, 38, 38, 38); - if(strcmp(color, "grey15") == 0) return MwLLAllocColor(handle->lowlevel, 38, 38, 38); - if(strcmp(color, "gray16") == 0) return MwLLAllocColor(handle->lowlevel, 41, 41, 41); - if(strcmp(color, "grey16") == 0) return MwLLAllocColor(handle->lowlevel, 41, 41, 41); - if(strcmp(color, "gray17") == 0) return MwLLAllocColor(handle->lowlevel, 43, 43, 43); - if(strcmp(color, "grey17") == 0) return MwLLAllocColor(handle->lowlevel, 43, 43, 43); - if(strcmp(color, "gray18") == 0) return MwLLAllocColor(handle->lowlevel, 46, 46, 46); - if(strcmp(color, "grey18") == 0) return MwLLAllocColor(handle->lowlevel, 46, 46, 46); - if(strcmp(color, "gray19") == 0) return MwLLAllocColor(handle->lowlevel, 48, 48, 48); - if(strcmp(color, "grey19") == 0) return MwLLAllocColor(handle->lowlevel, 48, 48, 48); - if(strcmp(color, "gray20") == 0) return MwLLAllocColor(handle->lowlevel, 51, 51, 51); - if(strcmp(color, "grey20") == 0) return MwLLAllocColor(handle->lowlevel, 51, 51, 51); - if(strcmp(color, "gray21") == 0) return MwLLAllocColor(handle->lowlevel, 54, 54, 54); - if(strcmp(color, "grey21") == 0) return MwLLAllocColor(handle->lowlevel, 54, 54, 54); - if(strcmp(color, "gray22") == 0) return MwLLAllocColor(handle->lowlevel, 56, 56, 56); - if(strcmp(color, "grey22") == 0) return MwLLAllocColor(handle->lowlevel, 56, 56, 56); - if(strcmp(color, "gray23") == 0) return MwLLAllocColor(handle->lowlevel, 59, 59, 59); - if(strcmp(color, "grey23") == 0) return MwLLAllocColor(handle->lowlevel, 59, 59, 59); - if(strcmp(color, "gray24") == 0) return MwLLAllocColor(handle->lowlevel, 61, 61, 61); - if(strcmp(color, "grey24") == 0) return MwLLAllocColor(handle->lowlevel, 61, 61, 61); - if(strcmp(color, "gray25") == 0) return MwLLAllocColor(handle->lowlevel, 64, 64, 64); - if(strcmp(color, "grey25") == 0) return MwLLAllocColor(handle->lowlevel, 64, 64, 64); - if(strcmp(color, "gray26") == 0) return MwLLAllocColor(handle->lowlevel, 66, 66, 66); - if(strcmp(color, "grey26") == 0) return MwLLAllocColor(handle->lowlevel, 66, 66, 66); - if(strcmp(color, "gray27") == 0) return MwLLAllocColor(handle->lowlevel, 69, 69, 69); - if(strcmp(color, "grey27") == 0) return MwLLAllocColor(handle->lowlevel, 69, 69, 69); - if(strcmp(color, "gray28") == 0) return MwLLAllocColor(handle->lowlevel, 71, 71, 71); - if(strcmp(color, "grey28") == 0) return MwLLAllocColor(handle->lowlevel, 71, 71, 71); - if(strcmp(color, "gray29") == 0) return MwLLAllocColor(handle->lowlevel, 74, 74, 74); - if(strcmp(color, "grey29") == 0) return MwLLAllocColor(handle->lowlevel, 74, 74, 74); - if(strcmp(color, "gray30") == 0) return MwLLAllocColor(handle->lowlevel, 77, 77, 77); - if(strcmp(color, "grey30") == 0) return MwLLAllocColor(handle->lowlevel, 77, 77, 77); - if(strcmp(color, "gray31") == 0) return MwLLAllocColor(handle->lowlevel, 79, 79, 79); - if(strcmp(color, "grey31") == 0) return MwLLAllocColor(handle->lowlevel, 79, 79, 79); - if(strcmp(color, "gray32") == 0) return MwLLAllocColor(handle->lowlevel, 82, 82, 82); - if(strcmp(color, "grey32") == 0) return MwLLAllocColor(handle->lowlevel, 82, 82, 82); - if(strcmp(color, "gray33") == 0) return MwLLAllocColor(handle->lowlevel, 84, 84, 84); - if(strcmp(color, "grey33") == 0) return MwLLAllocColor(handle->lowlevel, 84, 84, 84); - if(strcmp(color, "gray34") == 0) return MwLLAllocColor(handle->lowlevel, 87, 87, 87); - if(strcmp(color, "grey34") == 0) return MwLLAllocColor(handle->lowlevel, 87, 87, 87); - if(strcmp(color, "gray35") == 0) return MwLLAllocColor(handle->lowlevel, 89, 89, 89); - if(strcmp(color, "grey35") == 0) return MwLLAllocColor(handle->lowlevel, 89, 89, 89); - if(strcmp(color, "gray36") == 0) return MwLLAllocColor(handle->lowlevel, 92, 92, 92); - if(strcmp(color, "grey36") == 0) return MwLLAllocColor(handle->lowlevel, 92, 92, 92); - if(strcmp(color, "gray37") == 0) return MwLLAllocColor(handle->lowlevel, 94, 94, 94); - if(strcmp(color, "grey37") == 0) return MwLLAllocColor(handle->lowlevel, 94, 94, 94); - if(strcmp(color, "gray38") == 0) return MwLLAllocColor(handle->lowlevel, 97, 97, 97); - if(strcmp(color, "grey38") == 0) return MwLLAllocColor(handle->lowlevel, 97, 97, 97); - if(strcmp(color, "gray39") == 0) return MwLLAllocColor(handle->lowlevel, 99, 99, 99); - if(strcmp(color, "grey39") == 0) return MwLLAllocColor(handle->lowlevel, 99, 99, 99); - if(strcmp(color, "gray40") == 0) return MwLLAllocColor(handle->lowlevel, 102, 102, 102); - if(strcmp(color, "grey40") == 0) return MwLLAllocColor(handle->lowlevel, 102, 102, 102); - if(strcmp(color, "gray41") == 0) return MwLLAllocColor(handle->lowlevel, 105, 105, 105); - if(strcmp(color, "grey41") == 0) return MwLLAllocColor(handle->lowlevel, 105, 105, 105); - if(strcmp(color, "gray42") == 0) return MwLLAllocColor(handle->lowlevel, 107, 107, 107); - if(strcmp(color, "grey42") == 0) return MwLLAllocColor(handle->lowlevel, 107, 107, 107); - if(strcmp(color, "gray43") == 0) return MwLLAllocColor(handle->lowlevel, 110, 110, 110); - if(strcmp(color, "grey43") == 0) return MwLLAllocColor(handle->lowlevel, 110, 110, 110); - if(strcmp(color, "gray44") == 0) return MwLLAllocColor(handle->lowlevel, 112, 112, 112); - if(strcmp(color, "grey44") == 0) return MwLLAllocColor(handle->lowlevel, 112, 112, 112); - if(strcmp(color, "gray45") == 0) return MwLLAllocColor(handle->lowlevel, 115, 115, 115); - if(strcmp(color, "grey45") == 0) return MwLLAllocColor(handle->lowlevel, 115, 115, 115); - if(strcmp(color, "gray46") == 0) return MwLLAllocColor(handle->lowlevel, 117, 117, 117); - if(strcmp(color, "grey46") == 0) return MwLLAllocColor(handle->lowlevel, 117, 117, 117); - if(strcmp(color, "gray47") == 0) return MwLLAllocColor(handle->lowlevel, 120, 120, 120); - if(strcmp(color, "grey47") == 0) return MwLLAllocColor(handle->lowlevel, 120, 120, 120); - if(strcmp(color, "gray48") == 0) return MwLLAllocColor(handle->lowlevel, 122, 122, 122); - if(strcmp(color, "grey48") == 0) return MwLLAllocColor(handle->lowlevel, 122, 122, 122); - if(strcmp(color, "gray49") == 0) return MwLLAllocColor(handle->lowlevel, 125, 125, 125); - if(strcmp(color, "grey49") == 0) return MwLLAllocColor(handle->lowlevel, 125, 125, 125); - if(strcmp(color, "gray50") == 0) return MwLLAllocColor(handle->lowlevel, 127, 127, 127); - if(strcmp(color, "grey50") == 0) return MwLLAllocColor(handle->lowlevel, 127, 127, 127); - if(strcmp(color, "gray51") == 0) return MwLLAllocColor(handle->lowlevel, 130, 130, 130); - if(strcmp(color, "grey51") == 0) return MwLLAllocColor(handle->lowlevel, 130, 130, 130); - if(strcmp(color, "gray52") == 0) return MwLLAllocColor(handle->lowlevel, 133, 133, 133); - if(strcmp(color, "grey52") == 0) return MwLLAllocColor(handle->lowlevel, 133, 133, 133); - if(strcmp(color, "gray53") == 0) return MwLLAllocColor(handle->lowlevel, 135, 135, 135); - if(strcmp(color, "grey53") == 0) return MwLLAllocColor(handle->lowlevel, 135, 135, 135); - if(strcmp(color, "gray54") == 0) return MwLLAllocColor(handle->lowlevel, 138, 138, 138); - if(strcmp(color, "grey54") == 0) return MwLLAllocColor(handle->lowlevel, 138, 138, 138); - if(strcmp(color, "gray55") == 0) return MwLLAllocColor(handle->lowlevel, 140, 140, 140); - if(strcmp(color, "grey55") == 0) return MwLLAllocColor(handle->lowlevel, 140, 140, 140); - if(strcmp(color, "gray56") == 0) return MwLLAllocColor(handle->lowlevel, 143, 143, 143); - if(strcmp(color, "grey56") == 0) return MwLLAllocColor(handle->lowlevel, 143, 143, 143); - if(strcmp(color, "gray57") == 0) return MwLLAllocColor(handle->lowlevel, 145, 145, 145); - if(strcmp(color, "grey57") == 0) return MwLLAllocColor(handle->lowlevel, 145, 145, 145); - if(strcmp(color, "gray58") == 0) return MwLLAllocColor(handle->lowlevel, 148, 148, 148); - if(strcmp(color, "grey58") == 0) return MwLLAllocColor(handle->lowlevel, 148, 148, 148); - if(strcmp(color, "gray59") == 0) return MwLLAllocColor(handle->lowlevel, 150, 150, 150); - if(strcmp(color, "grey59") == 0) return MwLLAllocColor(handle->lowlevel, 150, 150, 150); - if(strcmp(color, "gray60") == 0) return MwLLAllocColor(handle->lowlevel, 153, 153, 153); - if(strcmp(color, "grey60") == 0) return MwLLAllocColor(handle->lowlevel, 153, 153, 153); - if(strcmp(color, "gray61") == 0) return MwLLAllocColor(handle->lowlevel, 156, 156, 156); - if(strcmp(color, "grey61") == 0) return MwLLAllocColor(handle->lowlevel, 156, 156, 156); - if(strcmp(color, "gray62") == 0) return MwLLAllocColor(handle->lowlevel, 158, 158, 158); - if(strcmp(color, "grey62") == 0) return MwLLAllocColor(handle->lowlevel, 158, 158, 158); - if(strcmp(color, "gray63") == 0) return MwLLAllocColor(handle->lowlevel, 161, 161, 161); - if(strcmp(color, "grey63") == 0) return MwLLAllocColor(handle->lowlevel, 161, 161, 161); - if(strcmp(color, "gray64") == 0) return MwLLAllocColor(handle->lowlevel, 163, 163, 163); - if(strcmp(color, "grey64") == 0) return MwLLAllocColor(handle->lowlevel, 163, 163, 163); - if(strcmp(color, "gray65") == 0) return MwLLAllocColor(handle->lowlevel, 166, 166, 166); - if(strcmp(color, "grey65") == 0) return MwLLAllocColor(handle->lowlevel, 166, 166, 166); - if(strcmp(color, "gray66") == 0) return MwLLAllocColor(handle->lowlevel, 168, 168, 168); - if(strcmp(color, "grey66") == 0) return MwLLAllocColor(handle->lowlevel, 168, 168, 168); - if(strcmp(color, "gray67") == 0) return MwLLAllocColor(handle->lowlevel, 171, 171, 171); - if(strcmp(color, "grey67") == 0) return MwLLAllocColor(handle->lowlevel, 171, 171, 171); - if(strcmp(color, "gray68") == 0) return MwLLAllocColor(handle->lowlevel, 173, 173, 173); - if(strcmp(color, "grey68") == 0) return MwLLAllocColor(handle->lowlevel, 173, 173, 173); - if(strcmp(color, "gray69") == 0) return MwLLAllocColor(handle->lowlevel, 176, 176, 176); - if(strcmp(color, "grey69") == 0) return MwLLAllocColor(handle->lowlevel, 176, 176, 176); - if(strcmp(color, "gray70") == 0) return MwLLAllocColor(handle->lowlevel, 179, 179, 179); - if(strcmp(color, "grey70") == 0) return MwLLAllocColor(handle->lowlevel, 179, 179, 179); - if(strcmp(color, "gray71") == 0) return MwLLAllocColor(handle->lowlevel, 181, 181, 181); - if(strcmp(color, "grey71") == 0) return MwLLAllocColor(handle->lowlevel, 181, 181, 181); - if(strcmp(color, "gray72") == 0) return MwLLAllocColor(handle->lowlevel, 184, 184, 184); - if(strcmp(color, "grey72") == 0) return MwLLAllocColor(handle->lowlevel, 184, 184, 184); - if(strcmp(color, "gray73") == 0) return MwLLAllocColor(handle->lowlevel, 186, 186, 186); - if(strcmp(color, "grey73") == 0) return MwLLAllocColor(handle->lowlevel, 186, 186, 186); - if(strcmp(color, "gray74") == 0) return MwLLAllocColor(handle->lowlevel, 189, 189, 189); - if(strcmp(color, "grey74") == 0) return MwLLAllocColor(handle->lowlevel, 189, 189, 189); - if(strcmp(color, "gray75") == 0) return MwLLAllocColor(handle->lowlevel, 191, 191, 191); - if(strcmp(color, "grey75") == 0) return MwLLAllocColor(handle->lowlevel, 191, 191, 191); - if(strcmp(color, "gray76") == 0) return MwLLAllocColor(handle->lowlevel, 194, 194, 194); - if(strcmp(color, "grey76") == 0) return MwLLAllocColor(handle->lowlevel, 194, 194, 194); - if(strcmp(color, "gray77") == 0) return MwLLAllocColor(handle->lowlevel, 196, 196, 196); - if(strcmp(color, "grey77") == 0) return MwLLAllocColor(handle->lowlevel, 196, 196, 196); - if(strcmp(color, "gray78") == 0) return MwLLAllocColor(handle->lowlevel, 199, 199, 199); - if(strcmp(color, "grey78") == 0) return MwLLAllocColor(handle->lowlevel, 199, 199, 199); - if(strcmp(color, "gray79") == 0) return MwLLAllocColor(handle->lowlevel, 201, 201, 201); - if(strcmp(color, "grey79") == 0) return MwLLAllocColor(handle->lowlevel, 201, 201, 201); - if(strcmp(color, "gray80") == 0) return MwLLAllocColor(handle->lowlevel, 204, 204, 204); - if(strcmp(color, "grey80") == 0) return MwLLAllocColor(handle->lowlevel, 204, 204, 204); - if(strcmp(color, "gray81") == 0) return MwLLAllocColor(handle->lowlevel, 207, 207, 207); - if(strcmp(color, "grey81") == 0) return MwLLAllocColor(handle->lowlevel, 207, 207, 207); - if(strcmp(color, "gray82") == 0) return MwLLAllocColor(handle->lowlevel, 209, 209, 209); - if(strcmp(color, "grey82") == 0) return MwLLAllocColor(handle->lowlevel, 209, 209, 209); - if(strcmp(color, "gray83") == 0) return MwLLAllocColor(handle->lowlevel, 212, 212, 212); - if(strcmp(color, "grey83") == 0) return MwLLAllocColor(handle->lowlevel, 212, 212, 212); - if(strcmp(color, "gray84") == 0) return MwLLAllocColor(handle->lowlevel, 214, 214, 214); - if(strcmp(color, "grey84") == 0) return MwLLAllocColor(handle->lowlevel, 214, 214, 214); - if(strcmp(color, "gray85") == 0) return MwLLAllocColor(handle->lowlevel, 217, 217, 217); - if(strcmp(color, "grey85") == 0) return MwLLAllocColor(handle->lowlevel, 217, 217, 217); - if(strcmp(color, "gray86") == 0) return MwLLAllocColor(handle->lowlevel, 219, 219, 219); - if(strcmp(color, "grey86") == 0) return MwLLAllocColor(handle->lowlevel, 219, 219, 219); - if(strcmp(color, "gray87") == 0) return MwLLAllocColor(handle->lowlevel, 222, 222, 222); - if(strcmp(color, "grey87") == 0) return MwLLAllocColor(handle->lowlevel, 222, 222, 222); - if(strcmp(color, "gray88") == 0) return MwLLAllocColor(handle->lowlevel, 224, 224, 224); - if(strcmp(color, "grey88") == 0) return MwLLAllocColor(handle->lowlevel, 224, 224, 224); - if(strcmp(color, "gray89") == 0) return MwLLAllocColor(handle->lowlevel, 227, 227, 227); - if(strcmp(color, "grey89") == 0) return MwLLAllocColor(handle->lowlevel, 227, 227, 227); - if(strcmp(color, "gray90") == 0) return MwLLAllocColor(handle->lowlevel, 229, 229, 229); - if(strcmp(color, "grey90") == 0) return MwLLAllocColor(handle->lowlevel, 229, 229, 229); - if(strcmp(color, "gray91") == 0) return MwLLAllocColor(handle->lowlevel, 232, 232, 232); - if(strcmp(color, "grey91") == 0) return MwLLAllocColor(handle->lowlevel, 232, 232, 232); - if(strcmp(color, "gray92") == 0) return MwLLAllocColor(handle->lowlevel, 235, 235, 235); - if(strcmp(color, "grey92") == 0) return MwLLAllocColor(handle->lowlevel, 235, 235, 235); - if(strcmp(color, "gray93") == 0) return MwLLAllocColor(handle->lowlevel, 237, 237, 237); - if(strcmp(color, "grey93") == 0) return MwLLAllocColor(handle->lowlevel, 237, 237, 237); - if(strcmp(color, "gray94") == 0) return MwLLAllocColor(handle->lowlevel, 240, 240, 240); - if(strcmp(color, "grey94") == 0) return MwLLAllocColor(handle->lowlevel, 240, 240, 240); - if(strcmp(color, "gray95") == 0) return MwLLAllocColor(handle->lowlevel, 242, 242, 242); - if(strcmp(color, "grey95") == 0) return MwLLAllocColor(handle->lowlevel, 242, 242, 242); - if(strcmp(color, "gray96") == 0) return MwLLAllocColor(handle->lowlevel, 245, 245, 245); - if(strcmp(color, "grey96") == 0) return MwLLAllocColor(handle->lowlevel, 245, 245, 245); - if(strcmp(color, "gray97") == 0) return MwLLAllocColor(handle->lowlevel, 247, 247, 247); - if(strcmp(color, "grey97") == 0) return MwLLAllocColor(handle->lowlevel, 247, 247, 247); - if(strcmp(color, "gray98") == 0) return MwLLAllocColor(handle->lowlevel, 250, 250, 250); - if(strcmp(color, "grey98") == 0) return MwLLAllocColor(handle->lowlevel, 250, 250, 250); - if(strcmp(color, "gray99") == 0) return MwLLAllocColor(handle->lowlevel, 252, 252, 252); - if(strcmp(color, "grey99") == 0) return MwLLAllocColor(handle->lowlevel, 252, 252, 252); - if(strcmp(color, "gray100") == 0) return MwLLAllocColor(handle->lowlevel, 255, 255, 255); - if(strcmp(color, "grey100") == 0) return MwLLAllocColor(handle->lowlevel, 255, 255, 255); - if(strcmp(color, "dark grey") == 0) return MwLLAllocColor(handle->lowlevel, 169, 169, 169); - if(strcmp(color, "DarkGrey") == 0) return MwLLAllocColor(handle->lowlevel, 169, 169, 169); - if(strcmp(color, "dark gray") == 0) return MwLLAllocColor(handle->lowlevel, 169, 169, 169); - if(strcmp(color, "DarkGray") == 0) return MwLLAllocColor(handle->lowlevel, 169, 169, 169); - if(strcmp(color, "dark blue") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 139); - if(strcmp(color, "DarkBlue") == 0) return MwLLAllocColor(handle->lowlevel, 0, 0, 139); - if(strcmp(color, "dark cyan") == 0) return MwLLAllocColor(handle->lowlevel, 0, 139, 139); - if(strcmp(color, "DarkCyan") == 0) return MwLLAllocColor(handle->lowlevel, 0, 139, 139); - if(strcmp(color, "dark magenta") == 0) return MwLLAllocColor(handle->lowlevel, 139, 0, 139); - if(strcmp(color, "DarkMagenta") == 0) return MwLLAllocColor(handle->lowlevel, 139, 0, 139); - if(strcmp(color, "dark red") == 0) return MwLLAllocColor(handle->lowlevel, 139, 0, 0); - if(strcmp(color, "DarkRed") == 0) return MwLLAllocColor(handle->lowlevel, 139, 0, 0); - if(strcmp(color, "light green") == 0) return MwLLAllocColor(handle->lowlevel, 144, 238, 144); - if(strcmp(color, "LightGreen") == 0) return MwLLAllocColor(handle->lowlevel, 144, 238, 144); - if(strcmp(color, "crimson") == 0) return MwLLAllocColor(handle->lowlevel, 220, 20, 60); - if(strcmp(color, "indigo") == 0) return MwLLAllocColor(handle->lowlevel, 75, 0, 130); - if(strcmp(color, "olive") == 0) return MwLLAllocColor(handle->lowlevel, 128, 128, 0); - if(strcmp(color, "rebecca purple") == 0) return MwLLAllocColor(handle->lowlevel, 102, 51, 153); - if(strcmp(color, "RebeccaPurple") == 0) return MwLLAllocColor(handle->lowlevel, 102, 51, 153); - if(strcmp(color, "silver") == 0) return MwLLAllocColor(handle->lowlevel, 192, 192, 192); - if(strcmp(color, "teal") == 0) return MwLLAllocColor(handle->lowlevel, 0, 128, 128); - return MwLLAllocColor(handle->lowlevel, 0, 0, 0); + MwRGB rgb; + MwParseColorNameNoAllocate(color, &rgb); + return MwLLAllocColor(handle->lowlevel, rgb.red, rgb.green, rgb.blue); +} + +void MwParseColorNameNoAllocate(const char* color, MwRGB* rgb) { + if(strcmp(color, "snow") == 0) { + rgb->red = 255; + rgb->green = 250; + rgb->green = 250; + return; + } + if(strcmp(color, "ghost white") == 0) { + rgb->red = 248; + rgb->green = 248; + rgb->green = 255; + return; + } + if(strcmp(color, "GhostWhite") == 0) { + rgb->red = 248; + rgb->green = 248; + rgb->green = 255; + return; + } + if(strcmp(color, "white smoke") == 0) { + rgb->red = 245; + rgb->green = 245; + rgb->green = 245; + return; + } + if(strcmp(color, "WhiteSmoke") == 0) { + rgb->red = 245; + rgb->green = 245; + rgb->green = 245; + return; + } + if(strcmp(color, "gainsboro") == 0) { + rgb->red = 220; + rgb->green = 220; + rgb->green = 220; + return; + } + if(strcmp(color, "floral white") == 0) { + rgb->red = 255; + rgb->green = 250; + rgb->green = 240; + return; + } + if(strcmp(color, "FloralWhite") == 0) { + rgb->red = 255; + rgb->green = 250; + rgb->green = 240; + return; + } + if(strcmp(color, "old lace") == 0) { + rgb->red = 253; + rgb->green = 245; + rgb->green = 230; + return; + } + if(strcmp(color, "OldLace") == 0) { + rgb->red = 253; + rgb->green = 245; + rgb->green = 230; + return; + } + if(strcmp(color, "linen") == 0) { + rgb->red = 250; + rgb->green = 240; + rgb->green = 230; + return; + } + if(strcmp(color, "antique white") == 0) { + rgb->red = 250; + rgb->green = 235; + rgb->green = 215; + return; + } + if(strcmp(color, "AntiqueWhite") == 0) { + rgb->red = 250; + rgb->green = 235; + rgb->green = 215; + return; + } + if(strcmp(color, "papaya whip") == 0) { + rgb->red = 255; + rgb->green = 239; + rgb->green = 213; + return; + } + if(strcmp(color, "PapayaWhip") == 0) { + rgb->red = 255; + rgb->green = 239; + rgb->green = 213; + return; + } + if(strcmp(color, "blanched almond") == 0) { + rgb->red = 255; + rgb->green = 235; + rgb->green = 205; + return; + } + if(strcmp(color, "BlanchedAlmond") == 0) { + rgb->red = 255; + rgb->green = 235; + rgb->green = 205; + return; + } + if(strcmp(color, "bisque") == 0) { + rgb->red = 255; + rgb->green = 228; + rgb->green = 196; + return; + } + if(strcmp(color, "peach puff") == 0) { + rgb->red = 255; + rgb->green = 218; + rgb->green = 185; + return; + } + if(strcmp(color, "PeachPuff") == 0) { + rgb->red = 255; + rgb->green = 218; + rgb->green = 185; + return; + } + if(strcmp(color, "navajo white") == 0) { + rgb->red = 255; + rgb->green = 222; + rgb->green = 173; + return; + } + if(strcmp(color, "NavajoWhite") == 0) { + rgb->red = 255; + rgb->green = 222; + rgb->green = 173; + return; + } + if(strcmp(color, "moccasin") == 0) { + rgb->red = 255; + rgb->green = 228; + rgb->green = 181; + return; + } + if(strcmp(color, "cornsilk") == 0) { + rgb->red = 255; + rgb->green = 248; + rgb->green = 220; + return; + } + if(strcmp(color, "ivory") == 0) { + rgb->red = 255; + rgb->green = 255; + rgb->green = 240; + return; + } + if(strcmp(color, "lemon chiffon") == 0) { + rgb->red = 255; + rgb->green = 250; + rgb->green = 205; + return; + } + if(strcmp(color, "LemonChiffon") == 0) { + rgb->red = 255; + rgb->green = 250; + rgb->green = 205; + return; + } + if(strcmp(color, "seashell") == 0) { + rgb->red = 255; + rgb->green = 245; + rgb->green = 238; + return; + } + if(strcmp(color, "honeydew") == 0) { + rgb->red = 240; + rgb->green = 255; + rgb->green = 240; + return; + } + if(strcmp(color, "mint cream") == 0) { + rgb->red = 245; + rgb->green = 255; + rgb->green = 250; + return; + } + if(strcmp(color, "MintCream") == 0) { + rgb->red = 245; + rgb->green = 255; + rgb->green = 250; + return; + } + if(strcmp(color, "azure") == 0) { + rgb->red = 240; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "alice blue") == 0) { + rgb->red = 240; + rgb->green = 248; + rgb->green = 255; + return; + } + if(strcmp(color, "AliceBlue") == 0) { + rgb->red = 240; + rgb->green = 248; + rgb->green = 255; + return; + } + if(strcmp(color, "lavender") == 0) { + rgb->red = 230; + rgb->green = 230; + rgb->green = 250; + return; + } + if(strcmp(color, "lavender blush") == 0) { + rgb->red = 255; + rgb->green = 240; + rgb->green = 245; + return; + } + if(strcmp(color, "LavenderBlush") == 0) { + rgb->red = 255; + rgb->green = 240; + rgb->green = 245; + return; + } + if(strcmp(color, "misty rose") == 0) { + rgb->red = 255; + rgb->green = 228; + rgb->green = 225; + return; + } + if(strcmp(color, "MistyRose") == 0) { + rgb->red = 255; + rgb->green = 228; + rgb->green = 225; + return; + } + if(strcmp(color, "white") == 0) { + rgb->red = 255; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "black") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "dark slate gray") == 0) { + rgb->red = 47; + rgb->green = 79; + rgb->green = 79; + return; + } + if(strcmp(color, "DarkSlateGray") == 0) { + rgb->red = 47; + rgb->green = 79; + rgb->green = 79; + return; + } + if(strcmp(color, "dark slate grey") == 0) { + rgb->red = 47; + rgb->green = 79; + rgb->green = 79; + return; + } + if(strcmp(color, "DarkSlateGrey") == 0) { + rgb->red = 47; + rgb->green = 79; + rgb->green = 79; + return; + } + if(strcmp(color, "dim gray") == 0) { + rgb->red = 105; + rgb->green = 105; + rgb->green = 105; + return; + } + if(strcmp(color, "DimGray") == 0) { + rgb->red = 105; + rgb->green = 105; + rgb->green = 105; + return; + } + if(strcmp(color, "dim grey") == 0) { + rgb->red = 105; + rgb->green = 105; + rgb->green = 105; + return; + } + if(strcmp(color, "DimGrey") == 0) { + rgb->red = 105; + rgb->green = 105; + rgb->green = 105; + return; + } + if(strcmp(color, "slate gray") == 0) { + rgb->red = 112; + rgb->green = 128; + rgb->green = 144; + return; + } + if(strcmp(color, "SlateGray") == 0) { + rgb->red = 112; + rgb->green = 128; + rgb->green = 144; + return; + } + if(strcmp(color, "slate grey") == 0) { + rgb->red = 112; + rgb->green = 128; + rgb->green = 144; + return; + } + if(strcmp(color, "SlateGrey") == 0) { + rgb->red = 112; + rgb->green = 128; + rgb->green = 144; + return; + } + if(strcmp(color, "light slate gray") == 0) { + rgb->red = 119; + rgb->green = 136; + rgb->green = 153; + return; + } + if(strcmp(color, "LightSlateGray") == 0) { + rgb->red = 119; + rgb->green = 136; + rgb->green = 153; + return; + } + if(strcmp(color, "light slate grey") == 0) { + rgb->red = 119; + rgb->green = 136; + rgb->green = 153; + return; + } + if(strcmp(color, "LightSlateGrey") == 0) { + rgb->red = 119; + rgb->green = 136; + rgb->green = 153; + return; + } + if(strcmp(color, "gray") == 0) { + rgb->red = 190; + rgb->green = 190; + rgb->green = 190; + return; + } + if(strcmp(color, "grey") == 0) { + rgb->red = 190; + rgb->green = 190; + rgb->green = 190; + return; + } + if(strcmp(color, "x11 gray") == 0) { + rgb->red = 190; + rgb->green = 190; + rgb->green = 190; + return; + } + if(strcmp(color, "X11Gray") == 0) { + rgb->red = 190; + rgb->green = 190; + rgb->green = 190; + return; + } + if(strcmp(color, "x11 grey") == 0) { + rgb->red = 190; + rgb->green = 190; + rgb->green = 190; + return; + } + if(strcmp(color, "X11Grey") == 0) { + rgb->red = 190; + rgb->green = 190; + rgb->green = 190; + return; + } + if(strcmp(color, "web gray") == 0) { + rgb->red = 128; + rgb->green = 128; + rgb->green = 128; + return; + } + if(strcmp(color, "WebGray") == 0) { + rgb->red = 128; + rgb->green = 128; + rgb->green = 128; + return; + } + if(strcmp(color, "web grey") == 0) { + rgb->red = 128; + rgb->green = 128; + rgb->green = 128; + return; + } + if(strcmp(color, "WebGrey") == 0) { + rgb->red = 128; + rgb->green = 128; + rgb->green = 128; + return; + } + if(strcmp(color, "light grey") == 0) { + rgb->red = 211; + rgb->green = 211; + rgb->green = 211; + return; + } + if(strcmp(color, "LightGrey") == 0) { + rgb->red = 211; + rgb->green = 211; + rgb->green = 211; + return; + } + if(strcmp(color, "light gray") == 0) { + rgb->red = 211; + rgb->green = 211; + rgb->green = 211; + return; + } + if(strcmp(color, "LightGray") == 0) { + rgb->red = 211; + rgb->green = 211; + rgb->green = 211; + return; + } + if(strcmp(color, "midnight blue") == 0) { + rgb->red = 25; + rgb->green = 25; + rgb->green = 112; + return; + } + if(strcmp(color, "MidnightBlue") == 0) { + rgb->red = 25; + rgb->green = 25; + rgb->green = 112; + return; + } + if(strcmp(color, "navy") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 128; + return; + } + if(strcmp(color, "navy blue") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 128; + return; + } + if(strcmp(color, "NavyBlue") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 128; + return; + } + if(strcmp(color, "cornflower blue") == 0) { + rgb->red = 100; + rgb->green = 149; + rgb->green = 237; + return; + } + if(strcmp(color, "CornflowerBlue") == 0) { + rgb->red = 100; + rgb->green = 149; + rgb->green = 237; + return; + } + if(strcmp(color, "dark slate blue") == 0) { + rgb->red = 72; + rgb->green = 61; + rgb->green = 139; + return; + } + if(strcmp(color, "DarkSlateBlue") == 0) { + rgb->red = 72; + rgb->green = 61; + rgb->green = 139; + return; + } + if(strcmp(color, "slate blue") == 0) { + rgb->red = 106; + rgb->green = 90; + rgb->green = 205; + return; + } + if(strcmp(color, "SlateBlue") == 0) { + rgb->red = 106; + rgb->green = 90; + rgb->green = 205; + return; + } + if(strcmp(color, "medium slate blue") == 0) { + rgb->red = 123; + rgb->green = 104; + rgb->green = 238; + return; + } + if(strcmp(color, "MediumSlateBlue") == 0) { + rgb->red = 123; + rgb->green = 104; + rgb->green = 238; + return; + } + if(strcmp(color, "light slate blue") == 0) { + rgb->red = 132; + rgb->green = 112; + rgb->green = 255; + return; + } + if(strcmp(color, "LightSlateBlue") == 0) { + rgb->red = 132; + rgb->green = 112; + rgb->green = 255; + return; + } + if(strcmp(color, "medium blue") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 205; + return; + } + if(strcmp(color, "MediumBlue") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 205; + return; + } + if(strcmp(color, "royal blue") == 0) { + rgb->red = 65; + rgb->green = 105; + rgb->green = 225; + return; + } + if(strcmp(color, "RoyalBlue") == 0) { + rgb->red = 65; + rgb->green = 105; + rgb->green = 225; + return; + } + if(strcmp(color, "blue") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 255; + return; + } + if(strcmp(color, "dodger blue") == 0) { + rgb->red = 30; + rgb->green = 144; + rgb->green = 255; + return; + } + if(strcmp(color, "DodgerBlue") == 0) { + rgb->red = 30; + rgb->green = 144; + rgb->green = 255; + return; + } + if(strcmp(color, "deep sky blue") == 0) { + rgb->red = 0; + rgb->green = 191; + rgb->green = 255; + return; + } + if(strcmp(color, "DeepSkyBlue") == 0) { + rgb->red = 0; + rgb->green = 191; + rgb->green = 255; + return; + } + if(strcmp(color, "sky blue") == 0) { + rgb->red = 135; + rgb->green = 206; + rgb->green = 235; + return; + } + if(strcmp(color, "SkyBlue") == 0) { + rgb->red = 135; + rgb->green = 206; + rgb->green = 235; + return; + } + if(strcmp(color, "light sky blue") == 0) { + rgb->red = 135; + rgb->green = 206; + rgb->green = 250; + return; + } + if(strcmp(color, "LightSkyBlue") == 0) { + rgb->red = 135; + rgb->green = 206; + rgb->green = 250; + return; + } + if(strcmp(color, "steel blue") == 0) { + rgb->red = 70; + rgb->green = 130; + rgb->green = 180; + return; + } + if(strcmp(color, "SteelBlue") == 0) { + rgb->red = 70; + rgb->green = 130; + rgb->green = 180; + return; + } + if(strcmp(color, "light steel blue") == 0) { + rgb->red = 176; + rgb->green = 196; + rgb->green = 222; + return; + } + if(strcmp(color, "LightSteelBlue") == 0) { + rgb->red = 176; + rgb->green = 196; + rgb->green = 222; + return; + } + if(strcmp(color, "light blue") == 0) { + rgb->red = 173; + rgb->green = 216; + rgb->green = 230; + return; + } + if(strcmp(color, "LightBlue") == 0) { + rgb->red = 173; + rgb->green = 216; + rgb->green = 230; + return; + } + if(strcmp(color, "powder blue") == 0) { + rgb->red = 176; + rgb->green = 224; + rgb->green = 230; + return; + } + if(strcmp(color, "PowderBlue") == 0) { + rgb->red = 176; + rgb->green = 224; + rgb->green = 230; + return; + } + if(strcmp(color, "pale turquoise") == 0) { + rgb->red = 175; + rgb->green = 238; + rgb->green = 238; + return; + } + if(strcmp(color, "PaleTurquoise") == 0) { + rgb->red = 175; + rgb->green = 238; + rgb->green = 238; + return; + } + if(strcmp(color, "dark turquoise") == 0) { + rgb->red = 0; + rgb->green = 206; + rgb->green = 209; + return; + } + if(strcmp(color, "DarkTurquoise") == 0) { + rgb->red = 0; + rgb->green = 206; + rgb->green = 209; + return; + } + if(strcmp(color, "medium turquoise") == 0) { + rgb->red = 72; + rgb->green = 209; + rgb->green = 204; + return; + } + if(strcmp(color, "MediumTurquoise") == 0) { + rgb->red = 72; + rgb->green = 209; + rgb->green = 204; + return; + } + if(strcmp(color, "turquoise") == 0) { + rgb->red = 64; + rgb->green = 224; + rgb->green = 208; + return; + } + if(strcmp(color, "cyan") == 0) { + rgb->red = 0; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "aqua") == 0) { + rgb->red = 0; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "light cyan") == 0) { + rgb->red = 224; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "LightCyan") == 0) { + rgb->red = 224; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "cadet blue") == 0) { + rgb->red = 95; + rgb->green = 158; + rgb->green = 160; + return; + } + if(strcmp(color, "CadetBlue") == 0) { + rgb->red = 95; + rgb->green = 158; + rgb->green = 160; + return; + } + if(strcmp(color, "medium aquamarine") == 0) { + rgb->red = 102; + rgb->green = 205; + rgb->green = 170; + return; + } + if(strcmp(color, "MediumAquamarine") == 0) { + rgb->red = 102; + rgb->green = 205; + rgb->green = 170; + return; + } + if(strcmp(color, "aquamarine") == 0) { + rgb->red = 127; + rgb->green = 255; + rgb->green = 212; + return; + } + if(strcmp(color, "dark green") == 0) { + rgb->red = 0; + rgb->green = 100; + rgb->green = 0; + return; + } + if(strcmp(color, "DarkGreen") == 0) { + rgb->red = 0; + rgb->green = 100; + rgb->green = 0; + return; + } + if(strcmp(color, "dark olive green") == 0) { + rgb->red = 85; + rgb->green = 107; + rgb->green = 47; + return; + } + if(strcmp(color, "DarkOliveGreen") == 0) { + rgb->red = 85; + rgb->green = 107; + rgb->green = 47; + return; + } + if(strcmp(color, "dark sea green") == 0) { + rgb->red = 143; + rgb->green = 188; + rgb->green = 143; + return; + } + if(strcmp(color, "DarkSeaGreen") == 0) { + rgb->red = 143; + rgb->green = 188; + rgb->green = 143; + return; + } + if(strcmp(color, "sea green") == 0) { + rgb->red = 46; + rgb->green = 139; + rgb->green = 87; + return; + } + if(strcmp(color, "SeaGreen") == 0) { + rgb->red = 46; + rgb->green = 139; + rgb->green = 87; + return; + } + if(strcmp(color, "medium sea green") == 0) { + rgb->red = 60; + rgb->green = 179; + rgb->green = 113; + return; + } + if(strcmp(color, "MediumSeaGreen") == 0) { + rgb->red = 60; + rgb->green = 179; + rgb->green = 113; + return; + } + if(strcmp(color, "light sea green") == 0) { + rgb->red = 32; + rgb->green = 178; + rgb->green = 170; + return; + } + if(strcmp(color, "LightSeaGreen") == 0) { + rgb->red = 32; + rgb->green = 178; + rgb->green = 170; + return; + } + if(strcmp(color, "pale green") == 0) { + rgb->red = 152; + rgb->green = 251; + rgb->green = 152; + return; + } + if(strcmp(color, "PaleGreen") == 0) { + rgb->red = 152; + rgb->green = 251; + rgb->green = 152; + return; + } + if(strcmp(color, "spring green") == 0) { + rgb->red = 0; + rgb->green = 255; + rgb->green = 127; + return; + } + if(strcmp(color, "SpringGreen") == 0) { + rgb->red = 0; + rgb->green = 255; + rgb->green = 127; + return; + } + if(strcmp(color, "lawn green") == 0) { + rgb->red = 124; + rgb->green = 252; + rgb->green = 0; + return; + } + if(strcmp(color, "LawnGreen") == 0) { + rgb->red = 124; + rgb->green = 252; + rgb->green = 0; + return; + } + if(strcmp(color, "green") == 0) { + rgb->red = 0; + rgb->green = 255; + rgb->green = 0; + return; + } + if(strcmp(color, "lime") == 0) { + rgb->red = 0; + rgb->green = 255; + rgb->green = 0; + return; + } + if(strcmp(color, "x11 green") == 0) { + rgb->red = 0; + rgb->green = 255; + rgb->green = 0; + return; + } + if(strcmp(color, "X11Green") == 0) { + rgb->red = 0; + rgb->green = 255; + rgb->green = 0; + return; + } + if(strcmp(color, "web green") == 0) { + rgb->red = 0; + rgb->green = 128; + rgb->green = 0; + return; + } + if(strcmp(color, "WebGreen") == 0) { + rgb->red = 0; + rgb->green = 128; + rgb->green = 0; + return; + } + if(strcmp(color, "chartreuse") == 0) { + rgb->red = 127; + rgb->green = 255; + rgb->green = 0; + return; + } + if(strcmp(color, "medium spring green") == 0) { + rgb->red = 0; + rgb->green = 250; + rgb->green = 154; + return; + } + if(strcmp(color, "MediumSpringGreen") == 0) { + rgb->red = 0; + rgb->green = 250; + rgb->green = 154; + return; + } + if(strcmp(color, "green yellow") == 0) { + rgb->red = 173; + rgb->green = 255; + rgb->green = 47; + return; + } + if(strcmp(color, "GreenYellow") == 0) { + rgb->red = 173; + rgb->green = 255; + rgb->green = 47; + return; + } + if(strcmp(color, "lime green") == 0) { + rgb->red = 50; + rgb->green = 205; + rgb->green = 50; + return; + } + if(strcmp(color, "LimeGreen") == 0) { + rgb->red = 50; + rgb->green = 205; + rgb->green = 50; + return; + } + if(strcmp(color, "yellow green") == 0) { + rgb->red = 154; + rgb->green = 205; + rgb->green = 50; + return; + } + if(strcmp(color, "YellowGreen") == 0) { + rgb->red = 154; + rgb->green = 205; + rgb->green = 50; + return; + } + if(strcmp(color, "forest green") == 0) { + rgb->red = 34; + rgb->green = 139; + rgb->green = 34; + return; + } + if(strcmp(color, "ForestGreen") == 0) { + rgb->red = 34; + rgb->green = 139; + rgb->green = 34; + return; + } + if(strcmp(color, "olive drab") == 0) { + rgb->red = 107; + rgb->green = 142; + rgb->green = 35; + return; + } + if(strcmp(color, "OliveDrab") == 0) { + rgb->red = 107; + rgb->green = 142; + rgb->green = 35; + return; + } + if(strcmp(color, "dark khaki") == 0) { + rgb->red = 189; + rgb->green = 183; + rgb->green = 107; + return; + } + if(strcmp(color, "DarkKhaki") == 0) { + rgb->red = 189; + rgb->green = 183; + rgb->green = 107; + return; + } + if(strcmp(color, "khaki") == 0) { + rgb->red = 240; + rgb->green = 230; + rgb->green = 140; + return; + } + if(strcmp(color, "pale goldenrod") == 0) { + rgb->red = 238; + rgb->green = 232; + rgb->green = 170; + return; + } + if(strcmp(color, "PaleGoldenrod") == 0) { + rgb->red = 238; + rgb->green = 232; + rgb->green = 170; + return; + } + if(strcmp(color, "light goldenrod yellow") == 0) { + rgb->red = 250; + rgb->green = 250; + rgb->green = 210; + return; + } + if(strcmp(color, "LightGoldenrodYellow") == 0) { + rgb->red = 250; + rgb->green = 250; + rgb->green = 210; + return; + } + if(strcmp(color, "light yellow") == 0) { + rgb->red = 255; + rgb->green = 255; + rgb->green = 224; + return; + } + if(strcmp(color, "LightYellow") == 0) { + rgb->red = 255; + rgb->green = 255; + rgb->green = 224; + return; + } + if(strcmp(color, "yellow") == 0) { + rgb->red = 255; + rgb->green = 255; + rgb->green = 0; + return; + } + if(strcmp(color, "gold") == 0) { + rgb->red = 255; + rgb->green = 215; + rgb->green = 0; + return; + } + if(strcmp(color, "light goldenrod") == 0) { + rgb->red = 238; + rgb->green = 221; + rgb->green = 130; + return; + } + if(strcmp(color, "LightGoldenrod") == 0) { + rgb->red = 238; + rgb->green = 221; + rgb->green = 130; + return; + } + if(strcmp(color, "goldenrod") == 0) { + rgb->red = 218; + rgb->green = 165; + rgb->green = 32; + return; + } + if(strcmp(color, "dark goldenrod") == 0) { + rgb->red = 184; + rgb->green = 134; + rgb->green = 11; + return; + } + if(strcmp(color, "DarkGoldenrod") == 0) { + rgb->red = 184; + rgb->green = 134; + rgb->green = 11; + return; + } + if(strcmp(color, "rosy brown") == 0) { + rgb->red = 188; + rgb->green = 143; + rgb->green = 143; + return; + } + if(strcmp(color, "RosyBrown") == 0) { + rgb->red = 188; + rgb->green = 143; + rgb->green = 143; + return; + } + if(strcmp(color, "indian red") == 0) { + rgb->red = 205; + rgb->green = 92; + rgb->green = 92; + return; + } + if(strcmp(color, "IndianRed") == 0) { + rgb->red = 205; + rgb->green = 92; + rgb->green = 92; + return; + } + if(strcmp(color, "saddle brown") == 0) { + rgb->red = 139; + rgb->green = 69; + rgb->green = 19; + return; + } + if(strcmp(color, "SaddleBrown") == 0) { + rgb->red = 139; + rgb->green = 69; + rgb->green = 19; + return; + } + if(strcmp(color, "sienna") == 0) { + rgb->red = 160; + rgb->green = 82; + rgb->green = 45; + return; + } + if(strcmp(color, "peru") == 0) { + rgb->red = 205; + rgb->green = 133; + rgb->green = 63; + return; + } + if(strcmp(color, "burlywood") == 0) { + rgb->red = 222; + rgb->green = 184; + rgb->green = 135; + return; + } + if(strcmp(color, "beige") == 0) { + rgb->red = 245; + rgb->green = 245; + rgb->green = 220; + return; + } + if(strcmp(color, "wheat") == 0) { + rgb->red = 245; + rgb->green = 222; + rgb->green = 179; + return; + } + if(strcmp(color, "sandy brown") == 0) { + rgb->red = 244; + rgb->green = 164; + rgb->green = 96; + return; + } + if(strcmp(color, "SandyBrown") == 0) { + rgb->red = 244; + rgb->green = 164; + rgb->green = 96; + return; + } + if(strcmp(color, "tan") == 0) { + rgb->red = 210; + rgb->green = 180; + rgb->green = 140; + return; + } + if(strcmp(color, "chocolate") == 0) { + rgb->red = 210; + rgb->green = 105; + rgb->green = 30; + return; + } + if(strcmp(color, "firebrick") == 0) { + rgb->red = 178; + rgb->green = 34; + rgb->green = 34; + return; + } + if(strcmp(color, "brown") == 0) { + rgb->red = 165; + rgb->green = 42; + rgb->green = 42; + return; + } + if(strcmp(color, "dark salmon") == 0) { + rgb->red = 233; + rgb->green = 150; + rgb->green = 122; + return; + } + if(strcmp(color, "DarkSalmon") == 0) { + rgb->red = 233; + rgb->green = 150; + rgb->green = 122; + return; + } + if(strcmp(color, "salmon") == 0) { + rgb->red = 250; + rgb->green = 128; + rgb->green = 114; + return; + } + if(strcmp(color, "light salmon") == 0) { + rgb->red = 255; + rgb->green = 160; + rgb->green = 122; + return; + } + if(strcmp(color, "LightSalmon") == 0) { + rgb->red = 255; + rgb->green = 160; + rgb->green = 122; + return; + } + if(strcmp(color, "orange") == 0) { + rgb->red = 255; + rgb->green = 165; + rgb->green = 0; + return; + } + if(strcmp(color, "dark orange") == 0) { + rgb->red = 255; + rgb->green = 140; + rgb->green = 0; + return; + } + if(strcmp(color, "DarkOrange") == 0) { + rgb->red = 255; + rgb->green = 140; + rgb->green = 0; + return; + } + if(strcmp(color, "coral") == 0) { + rgb->red = 255; + rgb->green = 127; + rgb->green = 80; + return; + } + if(strcmp(color, "light coral") == 0) { + rgb->red = 240; + rgb->green = 128; + rgb->green = 128; + return; + } + if(strcmp(color, "LightCoral") == 0) { + rgb->red = 240; + rgb->green = 128; + rgb->green = 128; + return; + } + if(strcmp(color, "tomato") == 0) { + rgb->red = 255; + rgb->green = 99; + rgb->green = 71; + return; + } + if(strcmp(color, "orange red") == 0) { + rgb->red = 255; + rgb->green = 69; + rgb->green = 0; + return; + } + if(strcmp(color, "OrangeRed") == 0) { + rgb->red = 255; + rgb->green = 69; + rgb->green = 0; + return; + } + if(strcmp(color, "red") == 0) { + rgb->red = 255; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "hot pink") == 0) { + rgb->red = 255; + rgb->green = 105; + rgb->green = 180; + return; + } + if(strcmp(color, "HotPink") == 0) { + rgb->red = 255; + rgb->green = 105; + rgb->green = 180; + return; + } + if(strcmp(color, "deep pink") == 0) { + rgb->red = 255; + rgb->green = 20; + rgb->green = 147; + return; + } + if(strcmp(color, "DeepPink") == 0) { + rgb->red = 255; + rgb->green = 20; + rgb->green = 147; + return; + } + if(strcmp(color, "pink") == 0) { + rgb->red = 255; + rgb->green = 192; + rgb->green = 203; + return; + } + if(strcmp(color, "light pink") == 0) { + rgb->red = 255; + rgb->green = 182; + rgb->green = 193; + return; + } + if(strcmp(color, "LightPink") == 0) { + rgb->red = 255; + rgb->green = 182; + rgb->green = 193; + return; + } + if(strcmp(color, "pale violet red") == 0) { + rgb->red = 219; + rgb->green = 112; + rgb->green = 147; + return; + } + if(strcmp(color, "PaleVioletRed") == 0) { + rgb->red = 219; + rgb->green = 112; + rgb->green = 147; + return; + } + if(strcmp(color, "maroon") == 0) { + rgb->red = 176; + rgb->green = 48; + rgb->green = 96; + return; + } + if(strcmp(color, "x11 maroon") == 0) { + rgb->red = 176; + rgb->green = 48; + rgb->green = 96; + return; + } + if(strcmp(color, "X11Maroon") == 0) { + rgb->red = 176; + rgb->green = 48; + rgb->green = 96; + return; + } + if(strcmp(color, "web maroon") == 0) { + rgb->red = 128; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "WebMaroon") == 0) { + rgb->red = 128; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "medium violet red") == 0) { + rgb->red = 199; + rgb->green = 21; + rgb->green = 133; + return; + } + if(strcmp(color, "MediumVioletRed") == 0) { + rgb->red = 199; + rgb->green = 21; + rgb->green = 133; + return; + } + if(strcmp(color, "violet red") == 0) { + rgb->red = 208; + rgb->green = 32; + rgb->green = 144; + return; + } + if(strcmp(color, "VioletRed") == 0) { + rgb->red = 208; + rgb->green = 32; + rgb->green = 144; + return; + } + if(strcmp(color, "magenta") == 0) { + rgb->red = 255; + rgb->green = 0; + rgb->green = 255; + return; + } + if(strcmp(color, "fuchsia") == 0) { + rgb->red = 255; + rgb->green = 0; + rgb->green = 255; + return; + } + if(strcmp(color, "violet") == 0) { + rgb->red = 238; + rgb->green = 130; + rgb->green = 238; + return; + } + if(strcmp(color, "plum") == 0) { + rgb->red = 221; + rgb->green = 160; + rgb->green = 221; + return; + } + if(strcmp(color, "orchid") == 0) { + rgb->red = 218; + rgb->green = 112; + rgb->green = 214; + return; + } + if(strcmp(color, "medium orchid") == 0) { + rgb->red = 186; + rgb->green = 85; + rgb->green = 211; + return; + } + if(strcmp(color, "MediumOrchid") == 0) { + rgb->red = 186; + rgb->green = 85; + rgb->green = 211; + return; + } + if(strcmp(color, "dark orchid") == 0) { + rgb->red = 153; + rgb->green = 50; + rgb->green = 204; + return; + } + if(strcmp(color, "DarkOrchid") == 0) { + rgb->red = 153; + rgb->green = 50; + rgb->green = 204; + return; + } + if(strcmp(color, "dark violet") == 0) { + rgb->red = 148; + rgb->green = 0; + rgb->green = 211; + return; + } + if(strcmp(color, "DarkViolet") == 0) { + rgb->red = 148; + rgb->green = 0; + rgb->green = 211; + return; + } + if(strcmp(color, "blue violet") == 0) { + rgb->red = 138; + rgb->green = 43; + rgb->green = 226; + return; + } + if(strcmp(color, "BlueViolet") == 0) { + rgb->red = 138; + rgb->green = 43; + rgb->green = 226; + return; + } + if(strcmp(color, "purple") == 0) { + rgb->red = 160; + rgb->green = 32; + rgb->green = 240; + return; + } + if(strcmp(color, "x11 purple") == 0) { + rgb->red = 160; + rgb->green = 32; + rgb->green = 240; + return; + } + if(strcmp(color, "X11Purple") == 0) { + rgb->red = 160; + rgb->green = 32; + rgb->green = 240; + return; + } + if(strcmp(color, "web purple") == 0) { + rgb->red = 128; + rgb->green = 0; + rgb->green = 128; + return; + } + if(strcmp(color, "WebPurple") == 0) { + rgb->red = 128; + rgb->green = 0; + rgb->green = 128; + return; + } + if(strcmp(color, "medium purple") == 0) { + rgb->red = 147; + rgb->green = 112; + rgb->green = 219; + return; + } + if(strcmp(color, "MediumPurple") == 0) { + rgb->red = 147; + rgb->green = 112; + rgb->green = 219; + return; + } + if(strcmp(color, "thistle") == 0) { + rgb->red = 216; + rgb->green = 191; + rgb->green = 216; + return; + } + if(strcmp(color, "snow1") == 0) { + rgb->red = 255; + rgb->green = 250; + rgb->green = 250; + return; + } + if(strcmp(color, "snow2") == 0) { + rgb->red = 238; + rgb->green = 233; + rgb->green = 233; + return; + } + if(strcmp(color, "snow3") == 0) { + rgb->red = 205; + rgb->green = 201; + rgb->green = 201; + return; + } + if(strcmp(color, "snow4") == 0) { + rgb->red = 139; + rgb->green = 137; + rgb->green = 137; + return; + } + if(strcmp(color, "seashell1") == 0) { + rgb->red = 255; + rgb->green = 245; + rgb->green = 238; + return; + } + if(strcmp(color, "seashell2") == 0) { + rgb->red = 238; + rgb->green = 229; + rgb->green = 222; + return; + } + if(strcmp(color, "seashell3") == 0) { + rgb->red = 205; + rgb->green = 197; + rgb->green = 191; + return; + } + if(strcmp(color, "seashell4") == 0) { + rgb->red = 139; + rgb->green = 134; + rgb->green = 130; + return; + } + if(strcmp(color, "AntiqueWhite1") == 0) { + rgb->red = 255; + rgb->green = 239; + rgb->green = 219; + return; + } + if(strcmp(color, "AntiqueWhite2") == 0) { + rgb->red = 238; + rgb->green = 223; + rgb->green = 204; + return; + } + if(strcmp(color, "AntiqueWhite3") == 0) { + rgb->red = 205; + rgb->green = 192; + rgb->green = 176; + return; + } + if(strcmp(color, "AntiqueWhite4") == 0) { + rgb->red = 139; + rgb->green = 131; + rgb->green = 120; + return; + } + if(strcmp(color, "bisque1") == 0) { + rgb->red = 255; + rgb->green = 228; + rgb->green = 196; + return; + } + if(strcmp(color, "bisque2") == 0) { + rgb->red = 238; + rgb->green = 213; + rgb->green = 183; + return; + } + if(strcmp(color, "bisque3") == 0) { + rgb->red = 205; + rgb->green = 183; + rgb->green = 158; + return; + } + if(strcmp(color, "bisque4") == 0) { + rgb->red = 139; + rgb->green = 125; + rgb->green = 107; + return; + } + if(strcmp(color, "PeachPuff1") == 0) { + rgb->red = 255; + rgb->green = 218; + rgb->green = 185; + return; + } + if(strcmp(color, "PeachPuff2") == 0) { + rgb->red = 238; + rgb->green = 203; + rgb->green = 173; + return; + } + if(strcmp(color, "PeachPuff3") == 0) { + rgb->red = 205; + rgb->green = 175; + rgb->green = 149; + return; + } + if(strcmp(color, "PeachPuff4") == 0) { + rgb->red = 139; + rgb->green = 119; + rgb->green = 101; + return; + } + if(strcmp(color, "NavajoWhite1") == 0) { + rgb->red = 255; + rgb->green = 222; + rgb->green = 173; + return; + } + if(strcmp(color, "NavajoWhite2") == 0) { + rgb->red = 238; + rgb->green = 207; + rgb->green = 161; + return; + } + if(strcmp(color, "NavajoWhite3") == 0) { + rgb->red = 205; + rgb->green = 179; + rgb->green = 139; + return; + } + if(strcmp(color, "NavajoWhite4") == 0) { + rgb->red = 139; + rgb->green = 121; + rgb->green = 94; + return; + } + if(strcmp(color, "LemonChiffon1") == 0) { + rgb->red = 255; + rgb->green = 250; + rgb->green = 205; + return; + } + if(strcmp(color, "LemonChiffon2") == 0) { + rgb->red = 238; + rgb->green = 233; + rgb->green = 191; + return; + } + if(strcmp(color, "LemonChiffon3") == 0) { + rgb->red = 205; + rgb->green = 201; + rgb->green = 165; + return; + } + if(strcmp(color, "LemonChiffon4") == 0) { + rgb->red = 139; + rgb->green = 137; + rgb->green = 112; + return; + } + if(strcmp(color, "cornsilk1") == 0) { + rgb->red = 255; + rgb->green = 248; + rgb->green = 220; + return; + } + if(strcmp(color, "cornsilk2") == 0) { + rgb->red = 238; + rgb->green = 232; + rgb->green = 205; + return; + } + if(strcmp(color, "cornsilk3") == 0) { + rgb->red = 205; + rgb->green = 200; + rgb->green = 177; + return; + } + if(strcmp(color, "cornsilk4") == 0) { + rgb->red = 139; + rgb->green = 136; + rgb->green = 120; + return; + } + if(strcmp(color, "ivory1") == 0) { + rgb->red = 255; + rgb->green = 255; + rgb->green = 240; + return; + } + if(strcmp(color, "ivory2") == 0) { + rgb->red = 238; + rgb->green = 238; + rgb->green = 224; + return; + } + if(strcmp(color, "ivory3") == 0) { + rgb->red = 205; + rgb->green = 205; + rgb->green = 193; + return; + } + if(strcmp(color, "ivory4") == 0) { + rgb->red = 139; + rgb->green = 139; + rgb->green = 131; + return; + } + if(strcmp(color, "honeydew1") == 0) { + rgb->red = 240; + rgb->green = 255; + rgb->green = 240; + return; + } + if(strcmp(color, "honeydew2") == 0) { + rgb->red = 224; + rgb->green = 238; + rgb->green = 224; + return; + } + if(strcmp(color, "honeydew3") == 0) { + rgb->red = 193; + rgb->green = 205; + rgb->green = 193; + return; + } + if(strcmp(color, "honeydew4") == 0) { + rgb->red = 131; + rgb->green = 139; + rgb->green = 131; + return; + } + if(strcmp(color, "LavenderBlush1") == 0) { + rgb->red = 255; + rgb->green = 240; + rgb->green = 245; + return; + } + if(strcmp(color, "LavenderBlush2") == 0) { + rgb->red = 238; + rgb->green = 224; + rgb->green = 229; + return; + } + if(strcmp(color, "LavenderBlush3") == 0) { + rgb->red = 205; + rgb->green = 193; + rgb->green = 197; + return; + } + if(strcmp(color, "LavenderBlush4") == 0) { + rgb->red = 139; + rgb->green = 131; + rgb->green = 134; + return; + } + if(strcmp(color, "MistyRose1") == 0) { + rgb->red = 255; + rgb->green = 228; + rgb->green = 225; + return; + } + if(strcmp(color, "MistyRose2") == 0) { + rgb->red = 238; + rgb->green = 213; + rgb->green = 210; + return; + } + if(strcmp(color, "MistyRose3") == 0) { + rgb->red = 205; + rgb->green = 183; + rgb->green = 181; + return; + } + if(strcmp(color, "MistyRose4") == 0) { + rgb->red = 139; + rgb->green = 125; + rgb->green = 123; + return; + } + if(strcmp(color, "azure1") == 0) { + rgb->red = 240; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "azure2") == 0) { + rgb->red = 224; + rgb->green = 238; + rgb->green = 238; + return; + } + if(strcmp(color, "azure3") == 0) { + rgb->red = 193; + rgb->green = 205; + rgb->green = 205; + return; + } + if(strcmp(color, "azure4") == 0) { + rgb->red = 131; + rgb->green = 139; + rgb->green = 139; + return; + } + if(strcmp(color, "SlateBlue1") == 0) { + rgb->red = 131; + rgb->green = 111; + rgb->green = 255; + return; + } + if(strcmp(color, "SlateBlue2") == 0) { + rgb->red = 122; + rgb->green = 103; + rgb->green = 238; + return; + } + if(strcmp(color, "SlateBlue3") == 0) { + rgb->red = 105; + rgb->green = 89; + rgb->green = 205; + return; + } + if(strcmp(color, "SlateBlue4") == 0) { + rgb->red = 71; + rgb->green = 60; + rgb->green = 139; + return; + } + if(strcmp(color, "RoyalBlue1") == 0) { + rgb->red = 72; + rgb->green = 118; + rgb->green = 255; + return; + } + if(strcmp(color, "RoyalBlue2") == 0) { + rgb->red = 67; + rgb->green = 110; + rgb->green = 238; + return; + } + if(strcmp(color, "RoyalBlue3") == 0) { + rgb->red = 58; + rgb->green = 95; + rgb->green = 205; + return; + } + if(strcmp(color, "RoyalBlue4") == 0) { + rgb->red = 39; + rgb->green = 64; + rgb->green = 139; + return; + } + if(strcmp(color, "blue1") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 255; + return; + } + if(strcmp(color, "blue2") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 238; + return; + } + if(strcmp(color, "blue3") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 205; + return; + } + if(strcmp(color, "blue4") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 139; + return; + } + if(strcmp(color, "DodgerBlue1") == 0) { + rgb->red = 30; + rgb->green = 144; + rgb->green = 255; + return; + } + if(strcmp(color, "DodgerBlue2") == 0) { + rgb->red = 28; + rgb->green = 134; + rgb->green = 238; + return; + } + if(strcmp(color, "DodgerBlue3") == 0) { + rgb->red = 24; + rgb->green = 116; + rgb->green = 205; + return; + } + if(strcmp(color, "DodgerBlue4") == 0) { + rgb->red = 16; + rgb->green = 78; + rgb->green = 139; + return; + } + if(strcmp(color, "SteelBlue1") == 0) { + rgb->red = 99; + rgb->green = 184; + rgb->green = 255; + return; + } + if(strcmp(color, "SteelBlue2") == 0) { + rgb->red = 92; + rgb->green = 172; + rgb->green = 238; + return; + } + if(strcmp(color, "SteelBlue3") == 0) { + rgb->red = 79; + rgb->green = 148; + rgb->green = 205; + return; + } + if(strcmp(color, "SteelBlue4") == 0) { + rgb->red = 54; + rgb->green = 100; + rgb->green = 139; + return; + } + if(strcmp(color, "DeepSkyBlue1") == 0) { + rgb->red = 0; + rgb->green = 191; + rgb->green = 255; + return; + } + if(strcmp(color, "DeepSkyBlue2") == 0) { + rgb->red = 0; + rgb->green = 178; + rgb->green = 238; + return; + } + if(strcmp(color, "DeepSkyBlue3") == 0) { + rgb->red = 0; + rgb->green = 154; + rgb->green = 205; + return; + } + if(strcmp(color, "DeepSkyBlue4") == 0) { + rgb->red = 0; + rgb->green = 104; + rgb->green = 139; + return; + } + if(strcmp(color, "SkyBlue1") == 0) { + rgb->red = 135; + rgb->green = 206; + rgb->green = 255; + return; + } + if(strcmp(color, "SkyBlue2") == 0) { + rgb->red = 126; + rgb->green = 192; + rgb->green = 238; + return; + } + if(strcmp(color, "SkyBlue3") == 0) { + rgb->red = 108; + rgb->green = 166; + rgb->green = 205; + return; + } + if(strcmp(color, "SkyBlue4") == 0) { + rgb->red = 74; + rgb->green = 112; + rgb->green = 139; + return; + } + if(strcmp(color, "LightSkyBlue1") == 0) { + rgb->red = 176; + rgb->green = 226; + rgb->green = 255; + return; + } + if(strcmp(color, "LightSkyBlue2") == 0) { + rgb->red = 164; + rgb->green = 211; + rgb->green = 238; + return; + } + if(strcmp(color, "LightSkyBlue3") == 0) { + rgb->red = 141; + rgb->green = 182; + rgb->green = 205; + return; + } + if(strcmp(color, "LightSkyBlue4") == 0) { + rgb->red = 96; + rgb->green = 123; + rgb->green = 139; + return; + } + if(strcmp(color, "SlateGray1") == 0) { + rgb->red = 198; + rgb->green = 226; + rgb->green = 255; + return; + } + if(strcmp(color, "SlateGray2") == 0) { + rgb->red = 185; + rgb->green = 211; + rgb->green = 238; + return; + } + if(strcmp(color, "SlateGray3") == 0) { + rgb->red = 159; + rgb->green = 182; + rgb->green = 205; + return; + } + if(strcmp(color, "SlateGray4") == 0) { + rgb->red = 108; + rgb->green = 123; + rgb->green = 139; + return; + } + if(strcmp(color, "LightSteelBlue1") == 0) { + rgb->red = 202; + rgb->green = 225; + rgb->green = 255; + return; + } + if(strcmp(color, "LightSteelBlue2") == 0) { + rgb->red = 188; + rgb->green = 210; + rgb->green = 238; + return; + } + if(strcmp(color, "LightSteelBlue3") == 0) { + rgb->red = 162; + rgb->green = 181; + rgb->green = 205; + return; + } + if(strcmp(color, "LightSteelBlue4") == 0) { + rgb->red = 110; + rgb->green = 123; + rgb->green = 139; + return; + } + if(strcmp(color, "LightBlue1") == 0) { + rgb->red = 191; + rgb->green = 239; + rgb->green = 255; + return; + } + if(strcmp(color, "LightBlue2") == 0) { + rgb->red = 178; + rgb->green = 223; + rgb->green = 238; + return; + } + if(strcmp(color, "LightBlue3") == 0) { + rgb->red = 154; + rgb->green = 192; + rgb->green = 205; + return; + } + if(strcmp(color, "LightBlue4") == 0) { + rgb->red = 104; + rgb->green = 131; + rgb->green = 139; + return; + } + if(strcmp(color, "LightCyan1") == 0) { + rgb->red = 224; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "LightCyan2") == 0) { + rgb->red = 209; + rgb->green = 238; + rgb->green = 238; + return; + } + if(strcmp(color, "LightCyan3") == 0) { + rgb->red = 180; + rgb->green = 205; + rgb->green = 205; + return; + } + if(strcmp(color, "LightCyan4") == 0) { + rgb->red = 122; + rgb->green = 139; + rgb->green = 139; + return; + } + if(strcmp(color, "PaleTurquoise1") == 0) { + rgb->red = 187; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "PaleTurquoise2") == 0) { + rgb->red = 174; + rgb->green = 238; + rgb->green = 238; + return; + } + if(strcmp(color, "PaleTurquoise3") == 0) { + rgb->red = 150; + rgb->green = 205; + rgb->green = 205; + return; + } + if(strcmp(color, "PaleTurquoise4") == 0) { + rgb->red = 102; + rgb->green = 139; + rgb->green = 139; + return; + } + if(strcmp(color, "CadetBlue1") == 0) { + rgb->red = 152; + rgb->green = 245; + rgb->green = 255; + return; + } + if(strcmp(color, "CadetBlue2") == 0) { + rgb->red = 142; + rgb->green = 229; + rgb->green = 238; + return; + } + if(strcmp(color, "CadetBlue3") == 0) { + rgb->red = 122; + rgb->green = 197; + rgb->green = 205; + return; + } + if(strcmp(color, "CadetBlue4") == 0) { + rgb->red = 83; + rgb->green = 134; + rgb->green = 139; + return; + } + if(strcmp(color, "turquoise1") == 0) { + rgb->red = 0; + rgb->green = 245; + rgb->green = 255; + return; + } + if(strcmp(color, "turquoise2") == 0) { + rgb->red = 0; + rgb->green = 229; + rgb->green = 238; + return; + } + if(strcmp(color, "turquoise3") == 0) { + rgb->red = 0; + rgb->green = 197; + rgb->green = 205; + return; + } + if(strcmp(color, "turquoise4") == 0) { + rgb->red = 0; + rgb->green = 134; + rgb->green = 139; + return; + } + if(strcmp(color, "cyan1") == 0) { + rgb->red = 0; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "cyan2") == 0) { + rgb->red = 0; + rgb->green = 238; + rgb->green = 238; + return; + } + if(strcmp(color, "cyan3") == 0) { + rgb->red = 0; + rgb->green = 205; + rgb->green = 205; + return; + } + if(strcmp(color, "cyan4") == 0) { + rgb->red = 0; + rgb->green = 139; + rgb->green = 139; + return; + } + if(strcmp(color, "DarkSlateGray1") == 0) { + rgb->red = 151; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "DarkSlateGray2") == 0) { + rgb->red = 141; + rgb->green = 238; + rgb->green = 238; + return; + } + if(strcmp(color, "DarkSlateGray3") == 0) { + rgb->red = 121; + rgb->green = 205; + rgb->green = 205; + return; + } + if(strcmp(color, "DarkSlateGray4") == 0) { + rgb->red = 82; + rgb->green = 139; + rgb->green = 139; + return; + } + if(strcmp(color, "aquamarine1") == 0) { + rgb->red = 127; + rgb->green = 255; + rgb->green = 212; + return; + } + if(strcmp(color, "aquamarine2") == 0) { + rgb->red = 118; + rgb->green = 238; + rgb->green = 198; + return; + } + if(strcmp(color, "aquamarine3") == 0) { + rgb->red = 102; + rgb->green = 205; + rgb->green = 170; + return; + } + if(strcmp(color, "aquamarine4") == 0) { + rgb->red = 69; + rgb->green = 139; + rgb->green = 116; + return; + } + if(strcmp(color, "DarkSeaGreen1") == 0) { + rgb->red = 193; + rgb->green = 255; + rgb->green = 193; + return; + } + if(strcmp(color, "DarkSeaGreen2") == 0) { + rgb->red = 180; + rgb->green = 238; + rgb->green = 180; + return; + } + if(strcmp(color, "DarkSeaGreen3") == 0) { + rgb->red = 155; + rgb->green = 205; + rgb->green = 155; + return; + } + if(strcmp(color, "DarkSeaGreen4") == 0) { + rgb->red = 105; + rgb->green = 139; + rgb->green = 105; + return; + } + if(strcmp(color, "SeaGreen1") == 0) { + rgb->red = 84; + rgb->green = 255; + rgb->green = 159; + return; + } + if(strcmp(color, "SeaGreen2") == 0) { + rgb->red = 78; + rgb->green = 238; + rgb->green = 148; + return; + } + if(strcmp(color, "SeaGreen3") == 0) { + rgb->red = 67; + rgb->green = 205; + rgb->green = 128; + return; + } + if(strcmp(color, "SeaGreen4") == 0) { + rgb->red = 46; + rgb->green = 139; + rgb->green = 87; + return; + } + if(strcmp(color, "PaleGreen1") == 0) { + rgb->red = 154; + rgb->green = 255; + rgb->green = 154; + return; + } + if(strcmp(color, "PaleGreen2") == 0) { + rgb->red = 144; + rgb->green = 238; + rgb->green = 144; + return; + } + if(strcmp(color, "PaleGreen3") == 0) { + rgb->red = 124; + rgb->green = 205; + rgb->green = 124; + return; + } + if(strcmp(color, "PaleGreen4") == 0) { + rgb->red = 84; + rgb->green = 139; + rgb->green = 84; + return; + } + if(strcmp(color, "SpringGreen1") == 0) { + rgb->red = 0; + rgb->green = 255; + rgb->green = 127; + return; + } + if(strcmp(color, "SpringGreen2") == 0) { + rgb->red = 0; + rgb->green = 238; + rgb->green = 118; + return; + } + if(strcmp(color, "SpringGreen3") == 0) { + rgb->red = 0; + rgb->green = 205; + rgb->green = 102; + return; + } + if(strcmp(color, "SpringGreen4") == 0) { + rgb->red = 0; + rgb->green = 139; + rgb->green = 69; + return; + } + if(strcmp(color, "green1") == 0) { + rgb->red = 0; + rgb->green = 255; + rgb->green = 0; + return; + } + if(strcmp(color, "green2") == 0) { + rgb->red = 0; + rgb->green = 238; + rgb->green = 0; + return; + } + if(strcmp(color, "green3") == 0) { + rgb->red = 0; + rgb->green = 205; + rgb->green = 0; + return; + } + if(strcmp(color, "green4") == 0) { + rgb->red = 0; + rgb->green = 139; + rgb->green = 0; + return; + } + if(strcmp(color, "chartreuse1") == 0) { + rgb->red = 127; + rgb->green = 255; + rgb->green = 0; + return; + } + if(strcmp(color, "chartreuse2") == 0) { + rgb->red = 118; + rgb->green = 238; + rgb->green = 0; + return; + } + if(strcmp(color, "chartreuse3") == 0) { + rgb->red = 102; + rgb->green = 205; + rgb->green = 0; + return; + } + if(strcmp(color, "chartreuse4") == 0) { + rgb->red = 69; + rgb->green = 139; + rgb->green = 0; + return; + } + if(strcmp(color, "OliveDrab1") == 0) { + rgb->red = 192; + rgb->green = 255; + rgb->green = 62; + return; + } + if(strcmp(color, "OliveDrab2") == 0) { + rgb->red = 179; + rgb->green = 238; + rgb->green = 58; + return; + } + if(strcmp(color, "OliveDrab3") == 0) { + rgb->red = 154; + rgb->green = 205; + rgb->green = 50; + return; + } + if(strcmp(color, "OliveDrab4") == 0) { + rgb->red = 105; + rgb->green = 139; + rgb->green = 34; + return; + } + if(strcmp(color, "DarkOliveGreen1") == 0) { + rgb->red = 202; + rgb->green = 255; + rgb->green = 112; + return; + } + if(strcmp(color, "DarkOliveGreen2") == 0) { + rgb->red = 188; + rgb->green = 238; + rgb->green = 104; + return; + } + if(strcmp(color, "DarkOliveGreen3") == 0) { + rgb->red = 162; + rgb->green = 205; + rgb->green = 90; + return; + } + if(strcmp(color, "DarkOliveGreen4") == 0) { + rgb->red = 110; + rgb->green = 139; + rgb->green = 61; + return; + } + if(strcmp(color, "khaki1") == 0) { + rgb->red = 255; + rgb->green = 246; + rgb->green = 143; + return; + } + if(strcmp(color, "khaki2") == 0) { + rgb->red = 238; + rgb->green = 230; + rgb->green = 133; + return; + } + if(strcmp(color, "khaki3") == 0) { + rgb->red = 205; + rgb->green = 198; + rgb->green = 115; + return; + } + if(strcmp(color, "khaki4") == 0) { + rgb->red = 139; + rgb->green = 134; + rgb->green = 78; + return; + } + if(strcmp(color, "LightGoldenrod1") == 0) { + rgb->red = 255; + rgb->green = 236; + rgb->green = 139; + return; + } + if(strcmp(color, "LightGoldenrod2") == 0) { + rgb->red = 238; + rgb->green = 220; + rgb->green = 130; + return; + } + if(strcmp(color, "LightGoldenrod3") == 0) { + rgb->red = 205; + rgb->green = 190; + rgb->green = 112; + return; + } + if(strcmp(color, "LightGoldenrod4") == 0) { + rgb->red = 139; + rgb->green = 129; + rgb->green = 76; + return; + } + if(strcmp(color, "LightYellow1") == 0) { + rgb->red = 255; + rgb->green = 255; + rgb->green = 224; + return; + } + if(strcmp(color, "LightYellow2") == 0) { + rgb->red = 238; + rgb->green = 238; + rgb->green = 209; + return; + } + if(strcmp(color, "LightYellow3") == 0) { + rgb->red = 205; + rgb->green = 205; + rgb->green = 180; + return; + } + if(strcmp(color, "LightYellow4") == 0) { + rgb->red = 139; + rgb->green = 139; + rgb->green = 122; + return; + } + if(strcmp(color, "yellow1") == 0) { + rgb->red = 255; + rgb->green = 255; + rgb->green = 0; + return; + } + if(strcmp(color, "yellow2") == 0) { + rgb->red = 238; + rgb->green = 238; + rgb->green = 0; + return; + } + if(strcmp(color, "yellow3") == 0) { + rgb->red = 205; + rgb->green = 205; + rgb->green = 0; + return; + } + if(strcmp(color, "yellow4") == 0) { + rgb->red = 139; + rgb->green = 139; + rgb->green = 0; + return; + } + if(strcmp(color, "gold1") == 0) { + rgb->red = 255; + rgb->green = 215; + rgb->green = 0; + return; + } + if(strcmp(color, "gold2") == 0) { + rgb->red = 238; + rgb->green = 201; + rgb->green = 0; + return; + } + if(strcmp(color, "gold3") == 0) { + rgb->red = 205; + rgb->green = 173; + rgb->green = 0; + return; + } + if(strcmp(color, "gold4") == 0) { + rgb->red = 139; + rgb->green = 117; + rgb->green = 0; + return; + } + if(strcmp(color, "goldenrod1") == 0) { + rgb->red = 255; + rgb->green = 193; + rgb->green = 37; + return; + } + if(strcmp(color, "goldenrod2") == 0) { + rgb->red = 238; + rgb->green = 180; + rgb->green = 34; + return; + } + if(strcmp(color, "goldenrod3") == 0) { + rgb->red = 205; + rgb->green = 155; + rgb->green = 29; + return; + } + if(strcmp(color, "goldenrod4") == 0) { + rgb->red = 139; + rgb->green = 105; + rgb->green = 20; + return; + } + if(strcmp(color, "DarkGoldenrod1") == 0) { + rgb->red = 255; + rgb->green = 185; + rgb->green = 15; + return; + } + if(strcmp(color, "DarkGoldenrod2") == 0) { + rgb->red = 238; + rgb->green = 173; + rgb->green = 14; + return; + } + if(strcmp(color, "DarkGoldenrod3") == 0) { + rgb->red = 205; + rgb->green = 149; + rgb->green = 12; + return; + } + if(strcmp(color, "DarkGoldenrod4") == 0) { + rgb->red = 139; + rgb->green = 101; + rgb->green = 8; + return; + } + if(strcmp(color, "RosyBrown1") == 0) { + rgb->red = 255; + rgb->green = 193; + rgb->green = 193; + return; + } + if(strcmp(color, "RosyBrown2") == 0) { + rgb->red = 238; + rgb->green = 180; + rgb->green = 180; + return; + } + if(strcmp(color, "RosyBrown3") == 0) { + rgb->red = 205; + rgb->green = 155; + rgb->green = 155; + return; + } + if(strcmp(color, "RosyBrown4") == 0) { + rgb->red = 139; + rgb->green = 105; + rgb->green = 105; + return; + } + if(strcmp(color, "IndianRed1") == 0) { + rgb->red = 255; + rgb->green = 106; + rgb->green = 106; + return; + } + if(strcmp(color, "IndianRed2") == 0) { + rgb->red = 238; + rgb->green = 99; + rgb->green = 99; + return; + } + if(strcmp(color, "IndianRed3") == 0) { + rgb->red = 205; + rgb->green = 85; + rgb->green = 85; + return; + } + if(strcmp(color, "IndianRed4") == 0) { + rgb->red = 139; + rgb->green = 58; + rgb->green = 58; + return; + } + if(strcmp(color, "sienna1") == 0) { + rgb->red = 255; + rgb->green = 130; + rgb->green = 71; + return; + } + if(strcmp(color, "sienna2") == 0) { + rgb->red = 238; + rgb->green = 121; + rgb->green = 66; + return; + } + if(strcmp(color, "sienna3") == 0) { + rgb->red = 205; + rgb->green = 104; + rgb->green = 57; + return; + } + if(strcmp(color, "sienna4") == 0) { + rgb->red = 139; + rgb->green = 71; + rgb->green = 38; + return; + } + if(strcmp(color, "burlywood1") == 0) { + rgb->red = 255; + rgb->green = 211; + rgb->green = 155; + return; + } + if(strcmp(color, "burlywood2") == 0) { + rgb->red = 238; + rgb->green = 197; + rgb->green = 145; + return; + } + if(strcmp(color, "burlywood3") == 0) { + rgb->red = 205; + rgb->green = 170; + rgb->green = 125; + return; + } + if(strcmp(color, "burlywood4") == 0) { + rgb->red = 139; + rgb->green = 115; + rgb->green = 85; + return; + } + if(strcmp(color, "wheat1") == 0) { + rgb->red = 255; + rgb->green = 231; + rgb->green = 186; + return; + } + if(strcmp(color, "wheat2") == 0) { + rgb->red = 238; + rgb->green = 216; + rgb->green = 174; + return; + } + if(strcmp(color, "wheat3") == 0) { + rgb->red = 205; + rgb->green = 186; + rgb->green = 150; + return; + } + if(strcmp(color, "wheat4") == 0) { + rgb->red = 139; + rgb->green = 126; + rgb->green = 102; + return; + } + if(strcmp(color, "tan1") == 0) { + rgb->red = 255; + rgb->green = 165; + rgb->green = 79; + return; + } + if(strcmp(color, "tan2") == 0) { + rgb->red = 238; + rgb->green = 154; + rgb->green = 73; + return; + } + if(strcmp(color, "tan3") == 0) { + rgb->red = 205; + rgb->green = 133; + rgb->green = 63; + return; + } + if(strcmp(color, "tan4") == 0) { + rgb->red = 139; + rgb->green = 90; + rgb->green = 43; + return; + } + if(strcmp(color, "chocolate1") == 0) { + rgb->red = 255; + rgb->green = 127; + rgb->green = 36; + return; + } + if(strcmp(color, "chocolate2") == 0) { + rgb->red = 238; + rgb->green = 118; + rgb->green = 33; + return; + } + if(strcmp(color, "chocolate3") == 0) { + rgb->red = 205; + rgb->green = 102; + rgb->green = 29; + return; + } + if(strcmp(color, "chocolate4") == 0) { + rgb->red = 139; + rgb->green = 69; + rgb->green = 19; + return; + } + if(strcmp(color, "firebrick1") == 0) { + rgb->red = 255; + rgb->green = 48; + rgb->green = 48; + return; + } + if(strcmp(color, "firebrick2") == 0) { + rgb->red = 238; + rgb->green = 44; + rgb->green = 44; + return; + } + if(strcmp(color, "firebrick3") == 0) { + rgb->red = 205; + rgb->green = 38; + rgb->green = 38; + return; + } + if(strcmp(color, "firebrick4") == 0) { + rgb->red = 139; + rgb->green = 26; + rgb->green = 26; + return; + } + if(strcmp(color, "brown1") == 0) { + rgb->red = 255; + rgb->green = 64; + rgb->green = 64; + return; + } + if(strcmp(color, "brown2") == 0) { + rgb->red = 238; + rgb->green = 59; + rgb->green = 59; + return; + } + if(strcmp(color, "brown3") == 0) { + rgb->red = 205; + rgb->green = 51; + rgb->green = 51; + return; + } + if(strcmp(color, "brown4") == 0) { + rgb->red = 139; + rgb->green = 35; + rgb->green = 35; + return; + } + if(strcmp(color, "salmon1") == 0) { + rgb->red = 255; + rgb->green = 140; + rgb->green = 105; + return; + } + if(strcmp(color, "salmon2") == 0) { + rgb->red = 238; + rgb->green = 130; + rgb->green = 98; + return; + } + if(strcmp(color, "salmon3") == 0) { + rgb->red = 205; + rgb->green = 112; + rgb->green = 84; + return; + } + if(strcmp(color, "salmon4") == 0) { + rgb->red = 139; + rgb->green = 76; + rgb->green = 57; + return; + } + if(strcmp(color, "LightSalmon1") == 0) { + rgb->red = 255; + rgb->green = 160; + rgb->green = 122; + return; + } + if(strcmp(color, "LightSalmon2") == 0) { + rgb->red = 238; + rgb->green = 149; + rgb->green = 114; + return; + } + if(strcmp(color, "LightSalmon3") == 0) { + rgb->red = 205; + rgb->green = 129; + rgb->green = 98; + return; + } + if(strcmp(color, "LightSalmon4") == 0) { + rgb->red = 139; + rgb->green = 87; + rgb->green = 66; + return; + } + if(strcmp(color, "orange1") == 0) { + rgb->red = 255; + rgb->green = 165; + rgb->green = 0; + return; + } + if(strcmp(color, "orange2") == 0) { + rgb->red = 238; + rgb->green = 154; + rgb->green = 0; + return; + } + if(strcmp(color, "orange3") == 0) { + rgb->red = 205; + rgb->green = 133; + rgb->green = 0; + return; + } + if(strcmp(color, "orange4") == 0) { + rgb->red = 139; + rgb->green = 90; + rgb->green = 0; + return; + } + if(strcmp(color, "DarkOrange1") == 0) { + rgb->red = 255; + rgb->green = 127; + rgb->green = 0; + return; + } + if(strcmp(color, "DarkOrange2") == 0) { + rgb->red = 238; + rgb->green = 118; + rgb->green = 0; + return; + } + if(strcmp(color, "DarkOrange3") == 0) { + rgb->red = 205; + rgb->green = 102; + rgb->green = 0; + return; + } + if(strcmp(color, "DarkOrange4") == 0) { + rgb->red = 139; + rgb->green = 69; + rgb->green = 0; + return; + } + if(strcmp(color, "coral1") == 0) { + rgb->red = 255; + rgb->green = 114; + rgb->green = 86; + return; + } + if(strcmp(color, "coral2") == 0) { + rgb->red = 238; + rgb->green = 106; + rgb->green = 80; + return; + } + if(strcmp(color, "coral3") == 0) { + rgb->red = 205; + rgb->green = 91; + rgb->green = 69; + return; + } + if(strcmp(color, "coral4") == 0) { + rgb->red = 139; + rgb->green = 62; + rgb->green = 47; + return; + } + if(strcmp(color, "tomato1") == 0) { + rgb->red = 255; + rgb->green = 99; + rgb->green = 71; + return; + } + if(strcmp(color, "tomato2") == 0) { + rgb->red = 238; + rgb->green = 92; + rgb->green = 66; + return; + } + if(strcmp(color, "tomato3") == 0) { + rgb->red = 205; + rgb->green = 79; + rgb->green = 57; + return; + } + if(strcmp(color, "tomato4") == 0) { + rgb->red = 139; + rgb->green = 54; + rgb->green = 38; + return; + } + if(strcmp(color, "OrangeRed1") == 0) { + rgb->red = 255; + rgb->green = 69; + rgb->green = 0; + return; + } + if(strcmp(color, "OrangeRed2") == 0) { + rgb->red = 238; + rgb->green = 64; + rgb->green = 0; + return; + } + if(strcmp(color, "OrangeRed3") == 0) { + rgb->red = 205; + rgb->green = 55; + rgb->green = 0; + return; + } + if(strcmp(color, "OrangeRed4") == 0) { + rgb->red = 139; + rgb->green = 37; + rgb->green = 0; + return; + } + if(strcmp(color, "red1") == 0) { + rgb->red = 255; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "red2") == 0) { + rgb->red = 238; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "red3") == 0) { + rgb->red = 205; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "red4") == 0) { + rgb->red = 139; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "DeepPink1") == 0) { + rgb->red = 255; + rgb->green = 20; + rgb->green = 147; + return; + } + if(strcmp(color, "DeepPink2") == 0) { + rgb->red = 238; + rgb->green = 18; + rgb->green = 137; + return; + } + if(strcmp(color, "DeepPink3") == 0) { + rgb->red = 205; + rgb->green = 16; + rgb->green = 118; + return; + } + if(strcmp(color, "DeepPink4") == 0) { + rgb->red = 139; + rgb->green = 10; + rgb->green = 80; + return; + } + if(strcmp(color, "HotPink1") == 0) { + rgb->red = 255; + rgb->green = 110; + rgb->green = 180; + return; + } + if(strcmp(color, "HotPink2") == 0) { + rgb->red = 238; + rgb->green = 106; + rgb->green = 167; + return; + } + if(strcmp(color, "HotPink3") == 0) { + rgb->red = 205; + rgb->green = 96; + rgb->green = 144; + return; + } + if(strcmp(color, "HotPink4") == 0) { + rgb->red = 139; + rgb->green = 58; + rgb->green = 98; + return; + } + if(strcmp(color, "pink1") == 0) { + rgb->red = 255; + rgb->green = 181; + rgb->green = 197; + return; + } + if(strcmp(color, "pink2") == 0) { + rgb->red = 238; + rgb->green = 169; + rgb->green = 184; + return; + } + if(strcmp(color, "pink3") == 0) { + rgb->red = 205; + rgb->green = 145; + rgb->green = 158; + return; + } + if(strcmp(color, "pink4") == 0) { + rgb->red = 139; + rgb->green = 99; + rgb->green = 108; + return; + } + if(strcmp(color, "LightPink1") == 0) { + rgb->red = 255; + rgb->green = 174; + rgb->green = 185; + return; + } + if(strcmp(color, "LightPink2") == 0) { + rgb->red = 238; + rgb->green = 162; + rgb->green = 173; + return; + } + if(strcmp(color, "LightPink3") == 0) { + rgb->red = 205; + rgb->green = 140; + rgb->green = 149; + return; + } + if(strcmp(color, "LightPink4") == 0) { + rgb->red = 139; + rgb->green = 95; + rgb->green = 101; + return; + } + if(strcmp(color, "PaleVioletRed1") == 0) { + rgb->red = 255; + rgb->green = 130; + rgb->green = 171; + return; + } + if(strcmp(color, "PaleVioletRed2") == 0) { + rgb->red = 238; + rgb->green = 121; + rgb->green = 159; + return; + } + if(strcmp(color, "PaleVioletRed3") == 0) { + rgb->red = 205; + rgb->green = 104; + rgb->green = 137; + return; + } + if(strcmp(color, "PaleVioletRed4") == 0) { + rgb->red = 139; + rgb->green = 71; + rgb->green = 93; + return; + } + if(strcmp(color, "maroon1") == 0) { + rgb->red = 255; + rgb->green = 52; + rgb->green = 179; + return; + } + if(strcmp(color, "maroon2") == 0) { + rgb->red = 238; + rgb->green = 48; + rgb->green = 167; + return; + } + if(strcmp(color, "maroon3") == 0) { + rgb->red = 205; + rgb->green = 41; + rgb->green = 144; + return; + } + if(strcmp(color, "maroon4") == 0) { + rgb->red = 139; + rgb->green = 28; + rgb->green = 98; + return; + } + if(strcmp(color, "VioletRed1") == 0) { + rgb->red = 255; + rgb->green = 62; + rgb->green = 150; + return; + } + if(strcmp(color, "VioletRed2") == 0) { + rgb->red = 238; + rgb->green = 58; + rgb->green = 140; + return; + } + if(strcmp(color, "VioletRed3") == 0) { + rgb->red = 205; + rgb->green = 50; + rgb->green = 120; + return; + } + if(strcmp(color, "VioletRed4") == 0) { + rgb->red = 139; + rgb->green = 34; + rgb->green = 82; + return; + } + if(strcmp(color, "magenta1") == 0) { + rgb->red = 255; + rgb->green = 0; + rgb->green = 255; + return; + } + if(strcmp(color, "magenta2") == 0) { + rgb->red = 238; + rgb->green = 0; + rgb->green = 238; + return; + } + if(strcmp(color, "magenta3") == 0) { + rgb->red = 205; + rgb->green = 0; + rgb->green = 205; + return; + } + if(strcmp(color, "magenta4") == 0) { + rgb->red = 139; + rgb->green = 0; + rgb->green = 139; + return; + } + if(strcmp(color, "orchid1") == 0) { + rgb->red = 255; + rgb->green = 131; + rgb->green = 250; + return; + } + if(strcmp(color, "orchid2") == 0) { + rgb->red = 238; + rgb->green = 122; + rgb->green = 233; + return; + } + if(strcmp(color, "orchid3") == 0) { + rgb->red = 205; + rgb->green = 105; + rgb->green = 201; + return; + } + if(strcmp(color, "orchid4") == 0) { + rgb->red = 139; + rgb->green = 71; + rgb->green = 137; + return; + } + if(strcmp(color, "plum1") == 0) { + rgb->red = 255; + rgb->green = 187; + rgb->green = 255; + return; + } + if(strcmp(color, "plum2") == 0) { + rgb->red = 238; + rgb->green = 174; + rgb->green = 238; + return; + } + if(strcmp(color, "plum3") == 0) { + rgb->red = 205; + rgb->green = 150; + rgb->green = 205; + return; + } + if(strcmp(color, "plum4") == 0) { + rgb->red = 139; + rgb->green = 102; + rgb->green = 139; + return; + } + if(strcmp(color, "MediumOrchid1") == 0) { + rgb->red = 224; + rgb->green = 102; + rgb->green = 255; + return; + } + if(strcmp(color, "MediumOrchid2") == 0) { + rgb->red = 209; + rgb->green = 95; + rgb->green = 238; + return; + } + if(strcmp(color, "MediumOrchid3") == 0) { + rgb->red = 180; + rgb->green = 82; + rgb->green = 205; + return; + } + if(strcmp(color, "MediumOrchid4") == 0) { + rgb->red = 122; + rgb->green = 55; + rgb->green = 139; + return; + } + if(strcmp(color, "DarkOrchid1") == 0) { + rgb->red = 191; + rgb->green = 62; + rgb->green = 255; + return; + } + if(strcmp(color, "DarkOrchid2") == 0) { + rgb->red = 178; + rgb->green = 58; + rgb->green = 238; + return; + } + if(strcmp(color, "DarkOrchid3") == 0) { + rgb->red = 154; + rgb->green = 50; + rgb->green = 205; + return; + } + if(strcmp(color, "DarkOrchid4") == 0) { + rgb->red = 104; + rgb->green = 34; + rgb->green = 139; + return; + } + if(strcmp(color, "purple1") == 0) { + rgb->red = 155; + rgb->green = 48; + rgb->green = 255; + return; + } + if(strcmp(color, "purple2") == 0) { + rgb->red = 145; + rgb->green = 44; + rgb->green = 238; + return; + } + if(strcmp(color, "purple3") == 0) { + rgb->red = 125; + rgb->green = 38; + rgb->green = 205; + return; + } + if(strcmp(color, "purple4") == 0) { + rgb->red = 85; + rgb->green = 26; + rgb->green = 139; + return; + } + if(strcmp(color, "MediumPurple1") == 0) { + rgb->red = 171; + rgb->green = 130; + rgb->green = 255; + return; + } + if(strcmp(color, "MediumPurple2") == 0) { + rgb->red = 159; + rgb->green = 121; + rgb->green = 238; + return; + } + if(strcmp(color, "MediumPurple3") == 0) { + rgb->red = 137; + rgb->green = 104; + rgb->green = 205; + return; + } + if(strcmp(color, "MediumPurple4") == 0) { + rgb->red = 93; + rgb->green = 71; + rgb->green = 139; + return; + } + if(strcmp(color, "thistle1") == 0) { + rgb->red = 255; + rgb->green = 225; + rgb->green = 255; + return; + } + if(strcmp(color, "thistle2") == 0) { + rgb->red = 238; + rgb->green = 210; + rgb->green = 238; + return; + } + if(strcmp(color, "thistle3") == 0) { + rgb->red = 205; + rgb->green = 181; + rgb->green = 205; + return; + } + if(strcmp(color, "thistle4") == 0) { + rgb->red = 139; + rgb->green = 123; + rgb->green = 139; + return; + } + if(strcmp(color, "gray0") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "grey0") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "gray1") == 0) { + rgb->red = 3; + rgb->green = 3; + rgb->green = 3; + return; + } + if(strcmp(color, "grey1") == 0) { + rgb->red = 3; + rgb->green = 3; + rgb->green = 3; + return; + } + if(strcmp(color, "gray2") == 0) { + rgb->red = 5; + rgb->green = 5; + rgb->green = 5; + return; + } + if(strcmp(color, "grey2") == 0) { + rgb->red = 5; + rgb->green = 5; + rgb->green = 5; + return; + } + if(strcmp(color, "gray3") == 0) { + rgb->red = 8; + rgb->green = 8; + rgb->green = 8; + return; + } + if(strcmp(color, "grey3") == 0) { + rgb->red = 8; + rgb->green = 8; + rgb->green = 8; + return; + } + if(strcmp(color, "gray4") == 0) { + rgb->red = 10; + rgb->green = 10; + rgb->green = 10; + return; + } + if(strcmp(color, "grey4") == 0) { + rgb->red = 10; + rgb->green = 10; + rgb->green = 10; + return; + } + if(strcmp(color, "gray5") == 0) { + rgb->red = 13; + rgb->green = 13; + rgb->green = 13; + return; + } + if(strcmp(color, "grey5") == 0) { + rgb->red = 13; + rgb->green = 13; + rgb->green = 13; + return; + } + if(strcmp(color, "gray6") == 0) { + rgb->red = 15; + rgb->green = 15; + rgb->green = 15; + return; + } + if(strcmp(color, "grey6") == 0) { + rgb->red = 15; + rgb->green = 15; + rgb->green = 15; + return; + } + if(strcmp(color, "gray7") == 0) { + rgb->red = 18; + rgb->green = 18; + rgb->green = 18; + return; + } + if(strcmp(color, "grey7") == 0) { + rgb->red = 18; + rgb->green = 18; + rgb->green = 18; + return; + } + if(strcmp(color, "gray8") == 0) { + rgb->red = 20; + rgb->green = 20; + rgb->green = 20; + return; + } + if(strcmp(color, "grey8") == 0) { + rgb->red = 20; + rgb->green = 20; + rgb->green = 20; + return; + } + if(strcmp(color, "gray9") == 0) { + rgb->red = 23; + rgb->green = 23; + rgb->green = 23; + return; + } + if(strcmp(color, "grey9") == 0) { + rgb->red = 23; + rgb->green = 23; + rgb->green = 23; + return; + } + if(strcmp(color, "gray10") == 0) { + rgb->red = 26; + rgb->green = 26; + rgb->green = 26; + return; + } + if(strcmp(color, "grey10") == 0) { + rgb->red = 26; + rgb->green = 26; + rgb->green = 26; + return; + } + if(strcmp(color, "gray11") == 0) { + rgb->red = 28; + rgb->green = 28; + rgb->green = 28; + return; + } + if(strcmp(color, "grey11") == 0) { + rgb->red = 28; + rgb->green = 28; + rgb->green = 28; + return; + } + if(strcmp(color, "gray12") == 0) { + rgb->red = 31; + rgb->green = 31; + rgb->green = 31; + return; + } + if(strcmp(color, "grey12") == 0) { + rgb->red = 31; + rgb->green = 31; + rgb->green = 31; + return; + } + if(strcmp(color, "gray13") == 0) { + rgb->red = 33; + rgb->green = 33; + rgb->green = 33; + return; + } + if(strcmp(color, "grey13") == 0) { + rgb->red = 33; + rgb->green = 33; + rgb->green = 33; + return; + } + if(strcmp(color, "gray14") == 0) { + rgb->red = 36; + rgb->green = 36; + rgb->green = 36; + return; + } + if(strcmp(color, "grey14") == 0) { + rgb->red = 36; + rgb->green = 36; + rgb->green = 36; + return; + } + if(strcmp(color, "gray15") == 0) { + rgb->red = 38; + rgb->green = 38; + rgb->green = 38; + return; + } + if(strcmp(color, "grey15") == 0) { + rgb->red = 38; + rgb->green = 38; + rgb->green = 38; + return; + } + if(strcmp(color, "gray16") == 0) { + rgb->red = 41; + rgb->green = 41; + rgb->green = 41; + return; + } + if(strcmp(color, "grey16") == 0) { + rgb->red = 41; + rgb->green = 41; + rgb->green = 41; + return; + } + if(strcmp(color, "gray17") == 0) { + rgb->red = 43; + rgb->green = 43; + rgb->green = 43; + return; + } + if(strcmp(color, "grey17") == 0) { + rgb->red = 43; + rgb->green = 43; + rgb->green = 43; + return; + } + if(strcmp(color, "gray18") == 0) { + rgb->red = 46; + rgb->green = 46; + rgb->green = 46; + return; + } + if(strcmp(color, "grey18") == 0) { + rgb->red = 46; + rgb->green = 46; + rgb->green = 46; + return; + } + if(strcmp(color, "gray19") == 0) { + rgb->red = 48; + rgb->green = 48; + rgb->green = 48; + return; + } + if(strcmp(color, "grey19") == 0) { + rgb->red = 48; + rgb->green = 48; + rgb->green = 48; + return; + } + if(strcmp(color, "gray20") == 0) { + rgb->red = 51; + rgb->green = 51; + rgb->green = 51; + return; + } + if(strcmp(color, "grey20") == 0) { + rgb->red = 51; + rgb->green = 51; + rgb->green = 51; + return; + } + if(strcmp(color, "gray21") == 0) { + rgb->red = 54; + rgb->green = 54; + rgb->green = 54; + return; + } + if(strcmp(color, "grey21") == 0) { + rgb->red = 54; + rgb->green = 54; + rgb->green = 54; + return; + } + if(strcmp(color, "gray22") == 0) { + rgb->red = 56; + rgb->green = 56; + rgb->green = 56; + return; + } + if(strcmp(color, "grey22") == 0) { + rgb->red = 56; + rgb->green = 56; + rgb->green = 56; + return; + } + if(strcmp(color, "gray23") == 0) { + rgb->red = 59; + rgb->green = 59; + rgb->green = 59; + return; + } + if(strcmp(color, "grey23") == 0) { + rgb->red = 59; + rgb->green = 59; + rgb->green = 59; + return; + } + if(strcmp(color, "gray24") == 0) { + rgb->red = 61; + rgb->green = 61; + rgb->green = 61; + return; + } + if(strcmp(color, "grey24") == 0) { + rgb->red = 61; + rgb->green = 61; + rgb->green = 61; + return; + } + if(strcmp(color, "gray25") == 0) { + rgb->red = 64; + rgb->green = 64; + rgb->green = 64; + return; + } + if(strcmp(color, "grey25") == 0) { + rgb->red = 64; + rgb->green = 64; + rgb->green = 64; + return; + } + if(strcmp(color, "gray26") == 0) { + rgb->red = 66; + rgb->green = 66; + rgb->green = 66; + return; + } + if(strcmp(color, "grey26") == 0) { + rgb->red = 66; + rgb->green = 66; + rgb->green = 66; + return; + } + if(strcmp(color, "gray27") == 0) { + rgb->red = 69; + rgb->green = 69; + rgb->green = 69; + return; + } + if(strcmp(color, "grey27") == 0) { + rgb->red = 69; + rgb->green = 69; + rgb->green = 69; + return; + } + if(strcmp(color, "gray28") == 0) { + rgb->red = 71; + rgb->green = 71; + rgb->green = 71; + return; + } + if(strcmp(color, "grey28") == 0) { + rgb->red = 71; + rgb->green = 71; + rgb->green = 71; + return; + } + if(strcmp(color, "gray29") == 0) { + rgb->red = 74; + rgb->green = 74; + rgb->green = 74; + return; + } + if(strcmp(color, "grey29") == 0) { + rgb->red = 74; + rgb->green = 74; + rgb->green = 74; + return; + } + if(strcmp(color, "gray30") == 0) { + rgb->red = 77; + rgb->green = 77; + rgb->green = 77; + return; + } + if(strcmp(color, "grey30") == 0) { + rgb->red = 77; + rgb->green = 77; + rgb->green = 77; + return; + } + if(strcmp(color, "gray31") == 0) { + rgb->red = 79; + rgb->green = 79; + rgb->green = 79; + return; + } + if(strcmp(color, "grey31") == 0) { + rgb->red = 79; + rgb->green = 79; + rgb->green = 79; + return; + } + if(strcmp(color, "gray32") == 0) { + rgb->red = 82; + rgb->green = 82; + rgb->green = 82; + return; + } + if(strcmp(color, "grey32") == 0) { + rgb->red = 82; + rgb->green = 82; + rgb->green = 82; + return; + } + if(strcmp(color, "gray33") == 0) { + rgb->red = 84; + rgb->green = 84; + rgb->green = 84; + return; + } + if(strcmp(color, "grey33") == 0) { + rgb->red = 84; + rgb->green = 84; + rgb->green = 84; + return; + } + if(strcmp(color, "gray34") == 0) { + rgb->red = 87; + rgb->green = 87; + rgb->green = 87; + return; + } + if(strcmp(color, "grey34") == 0) { + rgb->red = 87; + rgb->green = 87; + rgb->green = 87; + return; + } + if(strcmp(color, "gray35") == 0) { + rgb->red = 89; + rgb->green = 89; + rgb->green = 89; + return; + } + if(strcmp(color, "grey35") == 0) { + rgb->red = 89; + rgb->green = 89; + rgb->green = 89; + return; + } + if(strcmp(color, "gray36") == 0) { + rgb->red = 92; + rgb->green = 92; + rgb->green = 92; + return; + } + if(strcmp(color, "grey36") == 0) { + rgb->red = 92; + rgb->green = 92; + rgb->green = 92; + return; + } + if(strcmp(color, "gray37") == 0) { + rgb->red = 94; + rgb->green = 94; + rgb->green = 94; + return; + } + if(strcmp(color, "grey37") == 0) { + rgb->red = 94; + rgb->green = 94; + rgb->green = 94; + return; + } + if(strcmp(color, "gray38") == 0) { + rgb->red = 97; + rgb->green = 97; + rgb->green = 97; + return; + } + if(strcmp(color, "grey38") == 0) { + rgb->red = 97; + rgb->green = 97; + rgb->green = 97; + return; + } + if(strcmp(color, "gray39") == 0) { + rgb->red = 99; + rgb->green = 99; + rgb->green = 99; + return; + } + if(strcmp(color, "grey39") == 0) { + rgb->red = 99; + rgb->green = 99; + rgb->green = 99; + return; + } + if(strcmp(color, "gray40") == 0) { + rgb->red = 102; + rgb->green = 102; + rgb->green = 102; + return; + } + if(strcmp(color, "grey40") == 0) { + rgb->red = 102; + rgb->green = 102; + rgb->green = 102; + return; + } + if(strcmp(color, "gray41") == 0) { + rgb->red = 105; + rgb->green = 105; + rgb->green = 105; + return; + } + if(strcmp(color, "grey41") == 0) { + rgb->red = 105; + rgb->green = 105; + rgb->green = 105; + return; + } + if(strcmp(color, "gray42") == 0) { + rgb->red = 107; + rgb->green = 107; + rgb->green = 107; + return; + } + if(strcmp(color, "grey42") == 0) { + rgb->red = 107; + rgb->green = 107; + rgb->green = 107; + return; + } + if(strcmp(color, "gray43") == 0) { + rgb->red = 110; + rgb->green = 110; + rgb->green = 110; + return; + } + if(strcmp(color, "grey43") == 0) { + rgb->red = 110; + rgb->green = 110; + rgb->green = 110; + return; + } + if(strcmp(color, "gray44") == 0) { + rgb->red = 112; + rgb->green = 112; + rgb->green = 112; + return; + } + if(strcmp(color, "grey44") == 0) { + rgb->red = 112; + rgb->green = 112; + rgb->green = 112; + return; + } + if(strcmp(color, "gray45") == 0) { + rgb->red = 115; + rgb->green = 115; + rgb->green = 115; + return; + } + if(strcmp(color, "grey45") == 0) { + rgb->red = 115; + rgb->green = 115; + rgb->green = 115; + return; + } + if(strcmp(color, "gray46") == 0) { + rgb->red = 117; + rgb->green = 117; + rgb->green = 117; + return; + } + if(strcmp(color, "grey46") == 0) { + rgb->red = 117; + rgb->green = 117; + rgb->green = 117; + return; + } + if(strcmp(color, "gray47") == 0) { + rgb->red = 120; + rgb->green = 120; + rgb->green = 120; + return; + } + if(strcmp(color, "grey47") == 0) { + rgb->red = 120; + rgb->green = 120; + rgb->green = 120; + return; + } + if(strcmp(color, "gray48") == 0) { + rgb->red = 122; + rgb->green = 122; + rgb->green = 122; + return; + } + if(strcmp(color, "grey48") == 0) { + rgb->red = 122; + rgb->green = 122; + rgb->green = 122; + return; + } + if(strcmp(color, "gray49") == 0) { + rgb->red = 125; + rgb->green = 125; + rgb->green = 125; + return; + } + if(strcmp(color, "grey49") == 0) { + rgb->red = 125; + rgb->green = 125; + rgb->green = 125; + return; + } + if(strcmp(color, "gray50") == 0) { + rgb->red = 127; + rgb->green = 127; + rgb->green = 127; + return; + } + if(strcmp(color, "grey50") == 0) { + rgb->red = 127; + rgb->green = 127; + rgb->green = 127; + return; + } + if(strcmp(color, "gray51") == 0) { + rgb->red = 130; + rgb->green = 130; + rgb->green = 130; + return; + } + if(strcmp(color, "grey51") == 0) { + rgb->red = 130; + rgb->green = 130; + rgb->green = 130; + return; + } + if(strcmp(color, "gray52") == 0) { + rgb->red = 133; + rgb->green = 133; + rgb->green = 133; + return; + } + if(strcmp(color, "grey52") == 0) { + rgb->red = 133; + rgb->green = 133; + rgb->green = 133; + return; + } + if(strcmp(color, "gray53") == 0) { + rgb->red = 135; + rgb->green = 135; + rgb->green = 135; + return; + } + if(strcmp(color, "grey53") == 0) { + rgb->red = 135; + rgb->green = 135; + rgb->green = 135; + return; + } + if(strcmp(color, "gray54") == 0) { + rgb->red = 138; + rgb->green = 138; + rgb->green = 138; + return; + } + if(strcmp(color, "grey54") == 0) { + rgb->red = 138; + rgb->green = 138; + rgb->green = 138; + return; + } + if(strcmp(color, "gray55") == 0) { + rgb->red = 140; + rgb->green = 140; + rgb->green = 140; + return; + } + if(strcmp(color, "grey55") == 0) { + rgb->red = 140; + rgb->green = 140; + rgb->green = 140; + return; + } + if(strcmp(color, "gray56") == 0) { + rgb->red = 143; + rgb->green = 143; + rgb->green = 143; + return; + } + if(strcmp(color, "grey56") == 0) { + rgb->red = 143; + rgb->green = 143; + rgb->green = 143; + return; + } + if(strcmp(color, "gray57") == 0) { + rgb->red = 145; + rgb->green = 145; + rgb->green = 145; + return; + } + if(strcmp(color, "grey57") == 0) { + rgb->red = 145; + rgb->green = 145; + rgb->green = 145; + return; + } + if(strcmp(color, "gray58") == 0) { + rgb->red = 148; + rgb->green = 148; + rgb->green = 148; + return; + } + if(strcmp(color, "grey58") == 0) { + rgb->red = 148; + rgb->green = 148; + rgb->green = 148; + return; + } + if(strcmp(color, "gray59") == 0) { + rgb->red = 150; + rgb->green = 150; + rgb->green = 150; + return; + } + if(strcmp(color, "grey59") == 0) { + rgb->red = 150; + rgb->green = 150; + rgb->green = 150; + return; + } + if(strcmp(color, "gray60") == 0) { + rgb->red = 153; + rgb->green = 153; + rgb->green = 153; + return; + } + if(strcmp(color, "grey60") == 0) { + rgb->red = 153; + rgb->green = 153; + rgb->green = 153; + return; + } + if(strcmp(color, "gray61") == 0) { + rgb->red = 156; + rgb->green = 156; + rgb->green = 156; + return; + } + if(strcmp(color, "grey61") == 0) { + rgb->red = 156; + rgb->green = 156; + rgb->green = 156; + return; + } + if(strcmp(color, "gray62") == 0) { + rgb->red = 158; + rgb->green = 158; + rgb->green = 158; + return; + } + if(strcmp(color, "grey62") == 0) { + rgb->red = 158; + rgb->green = 158; + rgb->green = 158; + return; + } + if(strcmp(color, "gray63") == 0) { + rgb->red = 161; + rgb->green = 161; + rgb->green = 161; + return; + } + if(strcmp(color, "grey63") == 0) { + rgb->red = 161; + rgb->green = 161; + rgb->green = 161; + return; + } + if(strcmp(color, "gray64") == 0) { + rgb->red = 163; + rgb->green = 163; + rgb->green = 163; + return; + } + if(strcmp(color, "grey64") == 0) { + rgb->red = 163; + rgb->green = 163; + rgb->green = 163; + return; + } + if(strcmp(color, "gray65") == 0) { + rgb->red = 166; + rgb->green = 166; + rgb->green = 166; + return; + } + if(strcmp(color, "grey65") == 0) { + rgb->red = 166; + rgb->green = 166; + rgb->green = 166; + return; + } + if(strcmp(color, "gray66") == 0) { + rgb->red = 168; + rgb->green = 168; + rgb->green = 168; + return; + } + if(strcmp(color, "grey66") == 0) { + rgb->red = 168; + rgb->green = 168; + rgb->green = 168; + return; + } + if(strcmp(color, "gray67") == 0) { + rgb->red = 171; + rgb->green = 171; + rgb->green = 171; + return; + } + if(strcmp(color, "grey67") == 0) { + rgb->red = 171; + rgb->green = 171; + rgb->green = 171; + return; + } + if(strcmp(color, "gray68") == 0) { + rgb->red = 173; + rgb->green = 173; + rgb->green = 173; + return; + } + if(strcmp(color, "grey68") == 0) { + rgb->red = 173; + rgb->green = 173; + rgb->green = 173; + return; + } + if(strcmp(color, "gray69") == 0) { + rgb->red = 176; + rgb->green = 176; + rgb->green = 176; + return; + } + if(strcmp(color, "grey69") == 0) { + rgb->red = 176; + rgb->green = 176; + rgb->green = 176; + return; + } + if(strcmp(color, "gray70") == 0) { + rgb->red = 179; + rgb->green = 179; + rgb->green = 179; + return; + } + if(strcmp(color, "grey70") == 0) { + rgb->red = 179; + rgb->green = 179; + rgb->green = 179; + return; + } + if(strcmp(color, "gray71") == 0) { + rgb->red = 181; + rgb->green = 181; + rgb->green = 181; + return; + } + if(strcmp(color, "grey71") == 0) { + rgb->red = 181; + rgb->green = 181; + rgb->green = 181; + return; + } + if(strcmp(color, "gray72") == 0) { + rgb->red = 184; + rgb->green = 184; + rgb->green = 184; + return; + } + if(strcmp(color, "grey72") == 0) { + rgb->red = 184; + rgb->green = 184; + rgb->green = 184; + return; + } + if(strcmp(color, "gray73") == 0) { + rgb->red = 186; + rgb->green = 186; + rgb->green = 186; + return; + } + if(strcmp(color, "grey73") == 0) { + rgb->red = 186; + rgb->green = 186; + rgb->green = 186; + return; + } + if(strcmp(color, "gray74") == 0) { + rgb->red = 189; + rgb->green = 189; + rgb->green = 189; + return; + } + if(strcmp(color, "grey74") == 0) { + rgb->red = 189; + rgb->green = 189; + rgb->green = 189; + return; + } + if(strcmp(color, "gray75") == 0) { + rgb->red = 191; + rgb->green = 191; + rgb->green = 191; + return; + } + if(strcmp(color, "grey75") == 0) { + rgb->red = 191; + rgb->green = 191; + rgb->green = 191; + return; + } + if(strcmp(color, "gray76") == 0) { + rgb->red = 194; + rgb->green = 194; + rgb->green = 194; + return; + } + if(strcmp(color, "grey76") == 0) { + rgb->red = 194; + rgb->green = 194; + rgb->green = 194; + return; + } + if(strcmp(color, "gray77") == 0) { + rgb->red = 196; + rgb->green = 196; + rgb->green = 196; + return; + } + if(strcmp(color, "grey77") == 0) { + rgb->red = 196; + rgb->green = 196; + rgb->green = 196; + return; + } + if(strcmp(color, "gray78") == 0) { + rgb->red = 199; + rgb->green = 199; + rgb->green = 199; + return; + } + if(strcmp(color, "grey78") == 0) { + rgb->red = 199; + rgb->green = 199; + rgb->green = 199; + return; + } + if(strcmp(color, "gray79") == 0) { + rgb->red = 201; + rgb->green = 201; + rgb->green = 201; + return; + } + if(strcmp(color, "grey79") == 0) { + rgb->red = 201; + rgb->green = 201; + rgb->green = 201; + return; + } + if(strcmp(color, "gray80") == 0) { + rgb->red = 204; + rgb->green = 204; + rgb->green = 204; + return; + } + if(strcmp(color, "grey80") == 0) { + rgb->red = 204; + rgb->green = 204; + rgb->green = 204; + return; + } + if(strcmp(color, "gray81") == 0) { + rgb->red = 207; + rgb->green = 207; + rgb->green = 207; + return; + } + if(strcmp(color, "grey81") == 0) { + rgb->red = 207; + rgb->green = 207; + rgb->green = 207; + return; + } + if(strcmp(color, "gray82") == 0) { + rgb->red = 209; + rgb->green = 209; + rgb->green = 209; + return; + } + if(strcmp(color, "grey82") == 0) { + rgb->red = 209; + rgb->green = 209; + rgb->green = 209; + return; + } + if(strcmp(color, "gray83") == 0) { + rgb->red = 212; + rgb->green = 212; + rgb->green = 212; + return; + } + if(strcmp(color, "grey83") == 0) { + rgb->red = 212; + rgb->green = 212; + rgb->green = 212; + return; + } + if(strcmp(color, "gray84") == 0) { + rgb->red = 214; + rgb->green = 214; + rgb->green = 214; + return; + } + if(strcmp(color, "grey84") == 0) { + rgb->red = 214; + rgb->green = 214; + rgb->green = 214; + return; + } + if(strcmp(color, "gray85") == 0) { + rgb->red = 217; + rgb->green = 217; + rgb->green = 217; + return; + } + if(strcmp(color, "grey85") == 0) { + rgb->red = 217; + rgb->green = 217; + rgb->green = 217; + return; + } + if(strcmp(color, "gray86") == 0) { + rgb->red = 219; + rgb->green = 219; + rgb->green = 219; + return; + } + if(strcmp(color, "grey86") == 0) { + rgb->red = 219; + rgb->green = 219; + rgb->green = 219; + return; + } + if(strcmp(color, "gray87") == 0) { + rgb->red = 222; + rgb->green = 222; + rgb->green = 222; + return; + } + if(strcmp(color, "grey87") == 0) { + rgb->red = 222; + rgb->green = 222; + rgb->green = 222; + return; + } + if(strcmp(color, "gray88") == 0) { + rgb->red = 224; + rgb->green = 224; + rgb->green = 224; + return; + } + if(strcmp(color, "grey88") == 0) { + rgb->red = 224; + rgb->green = 224; + rgb->green = 224; + return; + } + if(strcmp(color, "gray89") == 0) { + rgb->red = 227; + rgb->green = 227; + rgb->green = 227; + return; + } + if(strcmp(color, "grey89") == 0) { + rgb->red = 227; + rgb->green = 227; + rgb->green = 227; + return; + } + if(strcmp(color, "gray90") == 0) { + rgb->red = 229; + rgb->green = 229; + rgb->green = 229; + return; + } + if(strcmp(color, "grey90") == 0) { + rgb->red = 229; + rgb->green = 229; + rgb->green = 229; + return; + } + if(strcmp(color, "gray91") == 0) { + rgb->red = 232; + rgb->green = 232; + rgb->green = 232; + return; + } + if(strcmp(color, "grey91") == 0) { + rgb->red = 232; + rgb->green = 232; + rgb->green = 232; + return; + } + if(strcmp(color, "gray92") == 0) { + rgb->red = 235; + rgb->green = 235; + rgb->green = 235; + return; + } + if(strcmp(color, "grey92") == 0) { + rgb->red = 235; + rgb->green = 235; + rgb->green = 235; + return; + } + if(strcmp(color, "gray93") == 0) { + rgb->red = 237; + rgb->green = 237; + rgb->green = 237; + return; + } + if(strcmp(color, "grey93") == 0) { + rgb->red = 237; + rgb->green = 237; + rgb->green = 237; + return; + } + if(strcmp(color, "gray94") == 0) { + rgb->red = 240; + rgb->green = 240; + rgb->green = 240; + return; + } + if(strcmp(color, "grey94") == 0) { + rgb->red = 240; + rgb->green = 240; + rgb->green = 240; + return; + } + if(strcmp(color, "gray95") == 0) { + rgb->red = 242; + rgb->green = 242; + rgb->green = 242; + return; + } + if(strcmp(color, "grey95") == 0) { + rgb->red = 242; + rgb->green = 242; + rgb->green = 242; + return; + } + if(strcmp(color, "gray96") == 0) { + rgb->red = 245; + rgb->green = 245; + rgb->green = 245; + return; + } + if(strcmp(color, "grey96") == 0) { + rgb->red = 245; + rgb->green = 245; + rgb->green = 245; + return; + } + if(strcmp(color, "gray97") == 0) { + rgb->red = 247; + rgb->green = 247; + rgb->green = 247; + return; + } + if(strcmp(color, "grey97") == 0) { + rgb->red = 247; + rgb->green = 247; + rgb->green = 247; + return; + } + if(strcmp(color, "gray98") == 0) { + rgb->red = 250; + rgb->green = 250; + rgb->green = 250; + return; + } + if(strcmp(color, "grey98") == 0) { + rgb->red = 250; + rgb->green = 250; + rgb->green = 250; + return; + } + if(strcmp(color, "gray99") == 0) { + rgb->red = 252; + rgb->green = 252; + rgb->green = 252; + return; + } + if(strcmp(color, "grey99") == 0) { + rgb->red = 252; + rgb->green = 252; + rgb->green = 252; + return; + } + if(strcmp(color, "gray100") == 0) { + rgb->red = 255; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "grey100") == 0) { + rgb->red = 255; + rgb->green = 255; + rgb->green = 255; + return; + } + if(strcmp(color, "dark grey") == 0) { + rgb->red = 169; + rgb->green = 169; + rgb->green = 169; + return; + } + if(strcmp(color, "DarkGrey") == 0) { + rgb->red = 169; + rgb->green = 169; + rgb->green = 169; + return; + } + if(strcmp(color, "dark gray") == 0) { + rgb->red = 169; + rgb->green = 169; + rgb->green = 169; + return; + } + if(strcmp(color, "DarkGray") == 0) { + rgb->red = 169; + rgb->green = 169; + rgb->green = 169; + return; + } + if(strcmp(color, "dark blue") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 139; + return; + } + if(strcmp(color, "DarkBlue") == 0) { + rgb->red = 0; + rgb->green = 0; + rgb->green = 139; + return; + } + if(strcmp(color, "dark cyan") == 0) { + rgb->red = 0; + rgb->green = 139; + rgb->green = 139; + return; + } + if(strcmp(color, "DarkCyan") == 0) { + rgb->red = 0; + rgb->green = 139; + rgb->green = 139; + return; + } + if(strcmp(color, "dark magenta") == 0) { + rgb->red = 139; + rgb->green = 0; + rgb->green = 139; + return; + } + if(strcmp(color, "DarkMagenta") == 0) { + rgb->red = 139; + rgb->green = 0; + rgb->green = 139; + return; + } + if(strcmp(color, "dark red") == 0) { + rgb->red = 139; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "DarkRed") == 0) { + rgb->red = 139; + rgb->green = 0; + rgb->green = 0; + return; + } + if(strcmp(color, "light green") == 0) { + rgb->red = 144; + rgb->green = 238; + rgb->green = 144; + return; + } + if(strcmp(color, "LightGreen") == 0) { + rgb->red = 144; + rgb->green = 238; + rgb->green = 144; + return; + } + if(strcmp(color, "crimson") == 0) { + rgb->red = 220; + rgb->green = 20; + rgb->green = 60; + return; + } + if(strcmp(color, "indigo") == 0) { + rgb->red = 75; + rgb->green = 0; + rgb->green = 130; + return; + } + if(strcmp(color, "olive") == 0) { + rgb->red = 128; + rgb->green = 128; + rgb->green = 0; + return; + } + if(strcmp(color, "rebecca purple") == 0) { + rgb->red = 102; + rgb->green = 51; + rgb->green = 153; + return; + } + if(strcmp(color, "RebeccaPurple") == 0) { + rgb->red = 102; + rgb->green = 51; + rgb->green = 153; + return; + } + if(strcmp(color, "silver") == 0) { + rgb->red = 192; + rgb->green = 192; + rgb->green = 192; + return; + } + if(strcmp(color, "teal") == 0) { + rgb->red = 0; + rgb->green = 128; + rgb->green = 128; + return; + } + rgb->red = 0; + rgb->green = 0; + rgb->blue = 0; } diff --git a/src/draw.c b/src/draw.c index 32b6d758a..966666b98 100644 --- a/src/draw.c +++ b/src/draw.c @@ -37,28 +37,35 @@ static int hex(const char* txt, int len) { return r; } -MwLLColor MwParseColor(MwWidget handle, const char* text) { - int r; - int g; - int b; - +void MwParseColorNoAllocate(const char* text, MwRGB* rgb) { if(text[0] == '#' && strlen(text) == 4) { - r = hex(text + 1, 1); - g = hex(text + 2, 1); - b = hex(text + 3, 1); + rgb->red = hex(text + 1, 1); + rgb->green = hex(text + 2, 1); + rgb->blue = hex(text + 3, 1); - r |= r << 4; - g |= g << 4; - b |= b << 4; + rgb->red |= rgb->red << 4; + rgb->green |= rgb->green << 4; + rgb->blue |= rgb->blue << 4; } else if(text[0] == '#' && strlen(text) == 7) { - r = hex(text + 1, 2); - g = hex(text + 3, 2); - b = hex(text + 5, 2); + rgb->red = hex(text + 1, 2); + rgb->green = hex(text + 3, 2); + rgb->blue = hex(text + 5, 2); } else { - return MwParseColorName(handle, text); + MwParseColorNameNoAllocate(text, rgb); + return; } +} - return MwLLAllocColor(handle->lowlevel, r, g, b); +MwLLColor MwParseColor(MwWidget handle, const char* text) { + MwRGB rgb; + + rgb.red = 0; + rgb.green = 0; + rgb.blue = 0; + + MwParseColorNoAllocate(text, &rgb); + + return MwLLAllocColor(handle->lowlevel, rgb.red, rgb.green, rgb.blue); } MwLLColor MwLightenColor(MwWidget handle, MwLLColor color, int r, int g, int b) { @@ -649,40 +656,14 @@ MwLLPixmap MwLoadImage(MwWidget handle, const char* path) { } MwLLPixmap MwLoadRaw(MwWidget handle, unsigned char* rgb, int width, int height) { - MwLLPixmap px; - unsigned char* out = malloc(width * height * 4); - int i; - MwLLColor base = handle->bgcolor == NULL ? MwParseColor(handle, MwGetText(handle, MwNbackground)) : handle->bgcolor; + MwLLPixmap px = MwLLCreatePixmap(handle->lowlevel, rgb, width, height); - memset(out, 0, width * height * 4); - for(i = 0; i < width * height; i++) { - unsigned char* pin = &rgb[i * 4]; - unsigned char* pout = &out[i * 4]; - double a = pin[3]; - - a /= 255; - if(a != 0) { - pout[0] = pin[0] * a; - pout[1] = pin[1] * a; - pout[2] = pin[2] * a; - - pout[0] += base->common.red * (1 - a); - pout[1] += base->common.green * (1 - a); - pout[2] += base->common.blue * (1 - a); - pout[3] = 255; - } - } - - if(handle->bgcolor == NULL) MwLLFreeColor(base); - - px = MwLLCreatePixmap(handle->lowlevel, out, width, height); - - free(out); + MwReloadRaw(handle, px, rgb, width, height); return px; } -void MwReloadRaw(MwWidget handle, unsigned char* rgb, int width, int height, MwLLPixmap px) { +void MwReloadRaw(MwWidget handle, MwLLPixmap px, unsigned char* rgb, int width, int height) { int i; MwLLColor base = handle->bgcolor == NULL ? MwParseColor(handle, MwGetText(handle, MwNbackground)) : handle->bgcolor; diff --git a/tools/color.pl b/tools/color.pl index f0705bb65..623e972be 100755 --- a/tools/color.pl +++ b/tools/color.pl @@ -5,15 +5,29 @@ open(OUT, ">", "src/color.c"); print(OUT "#include \n"); print(OUT "\n"); print(OUT "MwLLColor MwParseColorName(MwWidget handle, const char* color){\n"); +print(OUT " MwRGB rgb;\n"); +print(OUT " MwParseColorNameNoAllocate(color, &rgb);\n"); +print(OUT +" return MwLLAllocColor(handle->lowlevel, rgb.red, rgb.green, rgb.blue);\n" +); +print(OUT "}\n"); +print(OUT "\n"); +print(OUT "void MwParseColorNameNoAllocate(const char* color, MwRGB* rgb){\n"); + while (my $l = ) { $l =~ s/\r?\n$//; if ($l =~ /^[ \t]*([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+(.+)$/) { - print(OUT -" if(strcmp(color, \"$4\") == 0) return MwLLAllocColor(handle->lowlevel, $1, $2, $3);\n" - ); + print(OUT " if(strcmp(color, \"$4\") == 0){\n"); + print(OUT " rgb->red = $1;\n"); + print(OUT " rgb->green = $2;\n"); + print(OUT " rgb->green = $3;\n"); + print(OUT " return;\n"); + print(OUT " }\n"); } } -print(OUT " return MwLLAllocColor(handle->lowlevel, 0, 0, 0);\n"); +print(OUT " rgb->red = 0;\n"); +print(OUT " rgb->green = 0;\n"); +print(OUT " rgb->blue = 0;\n"); print(OUT "}\n"); close(OUT); From bc998806ee27d19c12c5aaa3fc6317c82aaf12b1 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Mon, 15 Dec 2025 06:51:31 +0900 Subject: [PATCH 10/13] oops --- src/dialog/colorpicker.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dialog/colorpicker.c b/src/dialog/colorpicker.c index ddbc79def..eeb9a4f96 100644 --- a/src/dialog/colorpicker.c +++ b/src/dialog/colorpicker.c @@ -147,7 +147,7 @@ static void color_picker_image_update(color_picker_t* picker) { picker->parent, picker->color_picker_image_data, PICKER_SIZE, PICKER_SIZE); } else { MwReloadRaw( - picker->parent, picker->color_picker_image_data, PICKER_SIZE, PICKER_SIZE, picker->color_picker_pixmap); + picker->parent, picker->color_picker_pixmap, picker->color_picker_image_data, PICKER_SIZE, PICKER_SIZE); } MwVaApply(picker->color_picker_img, MwNpixmap, picker->color_picker_pixmap, NULL); // printf("%d\n", n); From 1e74356db70f14b410323e0687e7580d64c98172 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Mon, 15 Dec 2025 07:05:42 +0900 Subject: [PATCH 11/13] method name consistency --- examples/gldemos/clock.c | 4 ++-- include/Mw/Draw.h | 23 +++++++++++++++++------ include/Mw/LowLevel.h | 1 + src/dialog/colorpicker.c | 16 ++++++++-------- src/draw.c | 19 +++++++++++++------ src/widget/treeview.c | 2 +- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/examples/gldemos/clock.c b/examples/gldemos/clock.c index 993d4af9a..7bf74b621 100644 --- a/examples/gldemos/clock.c +++ b/examples/gldemos/clock.c @@ -142,10 +142,10 @@ int main() { NULL); bgcolor = MwParseColor(window, MwGetText(window, MwNbackground)); - MwGetColor(bgcolor, &br, &bg, &bb); + MwColorGet(bgcolor, &br, &bg, &bb); fgcolor = MwParseColor(window, MwGetText(window, MwNforeground)); - MwGetColor(fgcolor, &fr, &fg, &fb); + MwColorGet(fgcolor, &fr, &fg, &fb); opengl = MwCreateWidget(MwOpenGLClass, "clock", window, 0, 0, 100, 100); diff --git a/include/Mw/Draw.h b/include/Mw/Draw.h index 6ccc299cd..b90d4e423 100644 --- a/include/Mw/Draw.h +++ b/include/Mw/Draw.h @@ -112,7 +112,7 @@ MWDECL MwLLPixmap MwLoadImage(MwWidget handle, const char* path); * @param green Pointer to green color * @param blue Pointer to blue color */ -MWDECL void MwGetColor(MwLLColor color, int* red, int* green, int* blue); +MWDECL void MwColorGet(MwLLColor color, int* red, int* green, int* blue); /*! * @brief Creates a pixmap from raw data @@ -125,14 +125,25 @@ MWDECL void MwGetColor(MwLLColor color, int* red, int* green, int* blue); MWDECL MwLLPixmap MwLoadRaw(MwWidget handle, unsigned char* rgb, int width, int height); /*! - * @brief Creates a pixmap from raw data - * @param handle Widget + * @brief Updates a pixmap using raw data * @param pixmap Pixmap to update * @param rgb RGBA data - * @param width Width - * @param height Height */ -MWDECL void MwReloadRaw(MwWidget handle, MwLLPixmap pixmap, unsigned char* rgb, int width, int height); +MWDECL void MwPixmapReloadRaw(MwLLPixmap pixmap, unsigned char* rgb); + +/*! + * @brief Gets the raw data of pixmap + * @param pixmap Pixmap + * @return RFBA data + */ +MWDECL unsigned char* MwPixmapGetRaw(MwLLPixmap pixmap); + +/*! + * @brief Gets the size of pixmap + * @param pixmap Pixmap + * @param rect Size + */ +MWDECL void MwPixmapGetSize(MwLLPixmap pixmap, MwRect* rect); /*! * @brief Creates a pixmap from XPM data diff --git a/include/Mw/LowLevel.h b/include/Mw/LowLevel.h index 167785aeb..0b0357d89 100644 --- a/include/Mw/LowLevel.h +++ b/include/Mw/LowLevel.h @@ -47,6 +47,7 @@ struct _MwLLCommonPixmap { int width; int height; unsigned char* raw; + void* user; }; #ifdef _MILSKO diff --git a/src/dialog/colorpicker.c b/src/dialog/colorpicker.c index eeb9a4f96..0a953e6e2 100644 --- a/src/dialog/colorpicker.c +++ b/src/dialog/colorpicker.c @@ -146,11 +146,11 @@ static void color_picker_image_update(color_picker_t* picker) { picker->color_picker_pixmap = MwLoadRaw( picker->parent, picker->color_picker_image_data, PICKER_SIZE, PICKER_SIZE); } else { - MwReloadRaw( - picker->parent, picker->color_picker_pixmap, picker->color_picker_image_data, PICKER_SIZE, PICKER_SIZE); + MwPixmapReloadRaw( + picker->color_picker_pixmap, picker->color_picker_image_data); } MwVaApply(picker->color_picker_img, MwNpixmap, picker->color_picker_pixmap, NULL); - // printf("%d\n", n); + /* printf("%d\n", n); */ } static void color_picker_click(MwWidget handle, void* user, void* call) { @@ -165,7 +165,7 @@ static void color_picker_click(MwWidget handle, void* user, void* call) { (void)user; (void)call; - // color_picker_image_update(picker); + /* color_picker_image_update(picker); */ i = ((mouse->point.y * PICKER_SIZE) + mouse->point.x) * 4; @@ -198,7 +198,7 @@ static void color_picker_on_change_value(MwWidget handle, void* user, picker->value = ((double)value / 1024.); picker->doUpdate = 1; - // color_picker_image_update(picker); + /* color_picker_image_update(picker); */ } static void color_picker_tick(MwWidget handle, void* user, @@ -282,12 +282,12 @@ color_picker_t* color_picker_setup(MwWidget parent, int w, int h) { MwVaCreateWidget(MwImageClass, "image", picker->parent, IMG_POS_X(w), IMG_POS_Y(h), PICKER_SIZE, PICKER_SIZE, NULL); - // picker->color_picker_image_data = malloc(PICKER_SIZE * PICKER_SIZE * 4); + /* picker->color_picker_image_data = malloc(PICKER_SIZE * PICKER_SIZE * 4); */ picker->color_picker_pixmap = NULL; picker->value = 0; - // color_picker_image_update(picker); + /* color_picker_image_update(picker); */ picker->doUpdate = 1; MwAddUserHandler(picker->color_picker_img, MwNmouseDownHandler, @@ -299,7 +299,7 @@ color_picker_t* color_picker_setup(MwWidget parent, int w, int h) { MwSetText(picker->color_display_text, MwNbackground, "#FFFFFF"); MwSetText(picker->color_display_text, MwNtext, "#FFFFFF"); - // MwSetInteger(picker->color_display_text, Mwnali, MwALIGNMENT_CENTER); + /* MwSetInteger(picker->color_display_text, Mwnali, MwALIGNMENT_CENTER); */ MwAddUserHandler(picker->color_display_text, MwNactivateHandler, color_display_text_change, picker); diff --git a/src/draw.c b/src/draw.c index 966666b98..169b43c12 100644 --- a/src/draw.c +++ b/src/draw.c @@ -658,17 +658,19 @@ MwLLPixmap MwLoadImage(MwWidget handle, const char* path) { MwLLPixmap MwLoadRaw(MwWidget handle, unsigned char* rgb, int width, int height) { MwLLPixmap px = MwLLCreatePixmap(handle->lowlevel, rgb, width, height); - MwReloadRaw(handle, px, rgb, width, height); + px->common.user = handle; + MwPixmapReloadRaw(px, rgb); return px; } -void MwReloadRaw(MwWidget handle, MwLLPixmap px, unsigned char* rgb, int width, int height) { +void MwPixmapReloadRaw(MwLLPixmap px, unsigned char* rgb) { int i; - MwLLColor base = handle->bgcolor == NULL ? MwParseColor(handle, MwGetText(handle, MwNbackground)) : handle->bgcolor; + MwWidget handle = px->common.user; + MwLLColor base = handle->bgcolor == NULL ? MwParseColor(handle, MwGetText(handle, MwNbackground)) : handle->bgcolor; - memset(px->common.raw, 0, width * height * 4); - for(i = 0; i < width * height; i++) { + memset(px->common.raw, 0, px->common.width * px->common.height * 4); + for(i = 0; i < px->common.width * px->common.height; i++) { unsigned char* pin = &rgb[i * 4]; unsigned char* pout = &px->common.raw[i * 4]; double a = pin[3]; @@ -691,7 +693,12 @@ void MwReloadRaw(MwWidget handle, MwLLPixmap px, unsigned char* rgb, int width, MwLLPixmapUpdate(px); } -void MwGetColor(MwLLColor color, int* red, int* green, int* blue) { +void MwPixmapGetSize(MwLLPixmap pixmap, MwRect* rect) { + rect->width = pixmap->common.width; + rect->height = pixmap->common.height; +} + +void MwColorGet(MwLLColor color, int* red, int* green, int* blue) { *red = color->common.red; *green = color->common.green; *blue = color->common.blue; diff --git a/src/widget/treeview.c b/src/widget/treeview.c index 19e1be178..2379937c7 100644 --- a/src/widget/treeview.c +++ b/src/widget/treeview.c @@ -114,7 +114,7 @@ static void recursion(MwWidget handle, MwTreeViewEntry* tree, MwTreeViewEntry** if(tree->selected) { r.x = p->x; r.y = p->y - MwTextHeight(handle, "M") / 2; - r.width = MwGetInteger(handle, MwNwidth) - MwGetInteger(handle, MwNleftPadding) - shift; // MwTextWidth(handle, tree->label); + r.width = MwGetInteger(handle, MwNwidth) - MwGetInteger(handle, MwNleftPadding) - shift; r.height = MwTextHeight(handle, "M"); MwDrawRect(handle, &r, text2); } From dabe62d475294f34a2932721ce7ac7f67ea75f25 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Mon, 15 Dec 2025 07:10:23 +0900 Subject: [PATCH 12/13] forgot --- src/draw.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/draw.c b/src/draw.c index 169b43c12..636dc7874 100644 --- a/src/draw.c +++ b/src/draw.c @@ -693,6 +693,10 @@ void MwPixmapReloadRaw(MwLLPixmap px, unsigned char* rgb) { MwLLPixmapUpdate(px); } +unsigned char* MwPixmapGetRaw(MwLLPixmap pixmap) { + return pixmap->common.raw; +} + void MwPixmapGetSize(MwLLPixmap pixmap, MwRect* rect) { rect->width = pixmap->common.width; rect->height = pixmap->common.height; From 270c87bca29da90c1ba22dc17aec0a4dc2b83d8c Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Mon, 15 Dec 2025 07:21:45 +0900 Subject: [PATCH 13/13] care abt DESTDIR --- Makefile.pl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.pl b/Makefile.pl index fe5349c58..6eba069f6 100755 --- a/Makefile.pl +++ b/Makefile.pl @@ -171,10 +171,10 @@ print(OUT "\n"); print(OUT "all: lib examples\n"); print(OUT "\n"); print(OUT "install: lib\n"); -print(OUT " mkdir -p \$(PREFIX)/lib \$(PREFIX)/include\n"); -print(OUT " -cp src/${library_prefix}Mw${library_suffix} \$(PREFIX)/lib/\n"); -print(OUT " -cp src/libMw.a \$(PREFIX)/lib/\n"); -print(OUT " cp -rf include \$(PREFIX)/\n"); +print(OUT " mkdir -p \$(DESTDIR)\$(PREFIX)/lib \$(DESTDIR)\$(PREFIX)/include\n"); +print(OUT " -cp src/${library_prefix}Mw${library_suffix} \$(DESTDIR)\$(PREFIX)/lib/\n"); +print(OUT " -cp src/libMw.a \$(DESTDIR)\$(PREFIX)/lib/\n"); +print(OUT " cp -rf include \$(DESTDIR)\$(PREFIX)/\n"); print(OUT "\n"); print(OUT "format:\n"); print(OUT