ref: 3d8c0a5a8bda3110afe915a22bd7b4d5ba9427d1
parent: 9aa16f4d5691e44c364b44a281880ccf03434249
author: Sigrid Haflínudóttir <[email protected]>
date: Sun Jan 5 17:59:46 EST 2020
plan 9 only from now on
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,5 @@
-Copyright (c) 2018 rxi
+Copyright (c) 2018-2019 rxi
+Copyright (c) 2020 ftrvxmtrx
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
--- a/README.md
+++ b/README.md
@@ -1,24 +1,17 @@
# microui
![screenshot](doc/microui_9front.png)
-A tiny, portable, immediate-mode UI library written in ANSI C
+A tiny, portable, immediate-mode UI library written in ANSI C.
+This is a fork of [microui](https://github.com/rxi/microui)
+targetting Plan 9 specifically.
-[**Browser Demo**](https://floooh.github.io/sokol-html5/sgl-microui-sapp.html)
-
-## Features
-* Tiny: around `1100 sloc` of ANSI C
-* Works within a fixed-sized memory region: no additional memory is
- allocated
-* Built-in controls: window, panel, button, slider, textbox, label,
- checkbox, wordwrapped text
-* Easy to add custom controls
-* Simple layout system
-
## Usage
+
* See [`doc/usage.md`](doc/usage.md) for usage instructions
* See the [`demo`](demo) directory for a usage example
## Notes
+
* The library expects the user to provide input and handle the resultant
drawing commands, it does not do any drawing itself
* In contrast to other immediate mode ui libraries microui does not store
@@ -26,11 +19,12 @@
user to manage this data themselves
## Contributing
+
The library is designed to be lightweight, providing a foundation to which
you can easily add custom controls and UI elements; pull requests adding
additional features will likely not be merged. Bug reports are welcome.
## License
+
This library is free software; you can redistribute it and/or modify it
under the terms of the MIT license. See [LICENSE](LICENSE) for details.
-
--- a/demo/atlas.inl
+++ /dev/null
@@ -1,995 +1,0 @@
-
-enum { ATLAS_WHITE = MU_ICON_MAX, ATLAS_FONT };
-enum { ATLAS_WIDTH = 128, ATLAS_HEIGHT = 128 };
-
-
-static unsigned char atlas_texture[ATLAS_WIDTH * ATLAS_HEIGHT] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x20,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x32, 0x0b, 0x00, 0x00, 0x00,
- 0x00, 0x31, 0x35, 0x01, 0x00, 0x00, 0x00, 0x15, 0x35, 0x1d, 0x30, 0x19,
- 0x00, 0x00, 0x0f, 0x35, 0x06, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x2d, 0x00, 0x00, 0x00,
- 0x14, 0x26, 0x00, 0x00, 0x31, 0x2a, 0x00, 0x00, 0x00, 0x10, 0x31, 0x00,
- 0x00, 0x00, 0x00, 0x06, 0x3e, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x06, 0x3e, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x00,
- 0x31, 0x35, 0x2f, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x41,
- 0x37, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x21, 0xe0, 0xea, 0x2c, 0x00, 0x00, 0x00, 0x00,
- 0x36, 0xc4, 0xdb, 0xb2, 0xd9, 0xc1, 0x1a, 0x00, 0x00, 0xea, 0xff, 0x39,
- 0x00, 0x00, 0x00, 0x9e, 0xff, 0x88, 0xbe, 0x9c, 0x00, 0x00, 0x72, 0xff,
- 0x48, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x1c, 0xe4, 0xce, 0x8d, 0x00, 0x00, 0xb5, 0x60, 0x00, 0x00,
- 0xea, 0xfa, 0x2c, 0x00, 0x00, 0x4e, 0xeb, 0x00, 0x00, 0x1c, 0x8f, 0xea,
- 0xea, 0xee, 0x92, 0x1f, 0x00, 0x00, 0x1c, 0x8f, 0xea, 0xea, 0xee, 0x92,
- 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x42, 0xf3, 0xcd, 0xf5, 0x3a, 0x00, 0x00, 0x00, 0xea, 0xf2, 0xef, 0xe5,
- 0x8f, 0x2f, 0x00, 0x00, 0x0f, 0xa0, 0xfe, 0xf2, 0xf1, 0xfa, 0x33, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21,
- 0xe0, 0xea, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x35, 0xdc, 0x33, 0x00, 0x06,
- 0x00, 0x5a, 0xd7, 0x13, 0x00, 0xea, 0xd8, 0x92, 0x00, 0x00, 0x09, 0xf0,
- 0xd9, 0x88, 0x7b, 0xda, 0x00, 0x00, 0xb9, 0xe9, 0x91, 0x00, 0x05, 0xf4,
- 0x03, 0x35, 0x02, 0x32, 0x1f, 0x00, 0x04, 0x37, 0x24, 0x00, 0x5b, 0xa9,
- 0x1b, 0xe7, 0x01, 0x44, 0xd0, 0x02, 0x00, 0x00, 0xea, 0xe4, 0xc3, 0x01,
- 0x00, 0x4e, 0xeb, 0x00, 0x00, 0x8f, 0xd8, 0x42, 0x01, 0x3a, 0xd0, 0x9b,
- 0x00, 0x00, 0x8f, 0xd8, 0x42, 0x01, 0x3a, 0xd0, 0x9b, 0x00, 0x2e, 0x1a,
- 0x00, 0x03, 0x36, 0x19, 0x00, 0x04, 0x36, 0x00, 0xa3, 0xa0, 0x00, 0xb5,
- 0x8d, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x01, 0x3d, 0xac, 0xe5, 0x03, 0x00,
- 0xa1, 0xeb, 0x63, 0x0c, 0x03, 0x2e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xe1, 0xeb, 0x2d, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xd6, 0x38, 0x37, 0xb4, 0xd6, 0xe9, 0x35, 0x9e, 0x5c,
- 0x00, 0xea, 0x87, 0xe8, 0x03, 0x00, 0x56, 0xcc, 0xba, 0x88, 0x38, 0xff,
- 0x1a, 0x09, 0xf7, 0x84, 0xd9, 0x00, 0x39, 0xfe, 0x0e, 0xff, 0xb7, 0xe1,
- 0xf3, 0x94, 0xbc, 0xde, 0xfb, 0x97, 0x73, 0x9b, 0x0b, 0xfb, 0x0b, 0xcf,
- 0x44, 0x01, 0x00, 0x00, 0xea, 0x65, 0xf7, 0x63, 0x00, 0x4e, 0xeb, 0x00,
- 0x01, 0xe0, 0x79, 0x00, 0x00, 0x00, 0x6b, 0xea, 0x03, 0x01, 0xe0, 0x79,
- 0x00, 0x00, 0x00, 0x6b, 0xea, 0x03, 0xb0, 0xa4, 0x00, 0x39, 0xfe, 0xa0,
- 0x00, 0x3d, 0xfd, 0x00, 0x6e, 0xe0, 0x5b, 0xef, 0x41, 0x00, 0x00, 0x00,
- 0xea, 0x6d, 0x00, 0x00, 0x17, 0xfd, 0x47, 0x18, 0xff, 0x8f, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x21, 0xe1, 0xeb, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xe3,
- 0x00, 0xc5, 0x51, 0x00, 0xd4, 0x37, 0x61, 0x99, 0x00, 0xea, 0x4d, 0xe9,
- 0x45, 0x00, 0xb2, 0x70, 0xbf, 0x88, 0x04, 0xf0, 0x59, 0x48, 0xe9, 0x18,
- 0xfd, 0x23, 0x77, 0xd4, 0x0e, 0xff, 0x9f, 0x02, 0x54, 0xff, 0x86, 0x00,
- 0x69, 0xf0, 0x39, 0xd1, 0x61, 0xca, 0x60, 0xb6, 0x6f, 0xe3, 0x98, 0x00,
- 0xea, 0x4a, 0x7f, 0xec, 0x15, 0x4e, 0xeb, 0x00, 0x32, 0xff, 0x36, 0x00,
- 0x00, 0x00, 0x29, 0xff, 0x3e, 0x32, 0xff, 0x36, 0x00, 0x00, 0x00, 0x29,
- 0xff, 0x3f, 0x68, 0xe6, 0x00, 0x83, 0xaf, 0xe7, 0x01, 0x80, 0xc9, 0x00,
- 0x18, 0xf4, 0xff, 0x53, 0x00, 0x15, 0x3b, 0x00, 0xea, 0x6d, 0x00, 0x00,
- 0x00, 0xc5, 0xa2, 0x41, 0xff, 0x39, 0x00, 0x40, 0x73, 0x73, 0x35, 0x00,
- 0x00, 0x00, 0x3d, 0xed, 0x45, 0x00, 0x00, 0x00, 0x22, 0xe1, 0xeb, 0x2d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0xb3, 0x12, 0xf9, 0x04, 0x03,
- 0xef, 0x2c, 0x6a, 0x94, 0x00, 0xea, 0x4d, 0x95, 0x9e, 0x14, 0xf6, 0x18,
- 0xc1, 0x88, 0x00, 0xb2, 0x96, 0x8e, 0xa4, 0x00, 0xcb, 0x6a, 0xb5, 0x92,
- 0x0e, 0xff, 0x59, 0x00, 0x27, 0xff, 0x3d, 0x00, 0x3a, 0xff, 0x04, 0x71,
- 0xae, 0x40, 0xe0, 0x2e, 0xee, 0x1e, 0xd5, 0x00, 0xea, 0x4d, 0x08, 0xd9,
- 0xa0, 0x4b, 0xeb, 0x00, 0x20, 0xfe, 0x45, 0x00, 0x00, 0x00, 0x37, 0xff,
- 0x2c, 0x20, 0xfe, 0x45, 0x00, 0x00, 0x00, 0x37, 0xff, 0x3b, 0x21, 0xff,
- 0x29, 0xcc, 0x4a, 0xe9, 0x30, 0xc3, 0x81, 0x14, 0xdf, 0xab, 0xbd, 0xcd,
- 0x14, 0x9c, 0xb5, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0xdc, 0xa6, 0x20,
- 0xfe, 0x42, 0x00, 0x63, 0xb2, 0xf4, 0x76, 0x00, 0x00, 0x00, 0x13, 0xd0,
- 0xf6, 0x45, 0x00, 0x22, 0xe1, 0xeb, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x3f, 0xe7, 0x03, 0xd7, 0x5e, 0x75, 0xf7, 0x8d, 0xc7, 0x4a,
- 0x00, 0xea, 0x4d, 0x3c, 0xf0, 0x71, 0xb7, 0x00, 0xc1, 0x88, 0x00, 0x70,
- 0xc9, 0xcb, 0x5d, 0x00, 0x83, 0xa2, 0xe9, 0x4f, 0x0e, 0xff, 0x43, 0x00,
- 0x26, 0xff, 0x2d, 0x00, 0x39, 0xff, 0x00, 0x00, 0x00, 0x7c, 0x9a, 0x1f,
- 0xf1, 0x00, 0xaf, 0x00, 0xea, 0x4d, 0x00, 0x44, 0xfe, 0x83, 0xeb, 0x00,
- 0x00, 0xcd, 0x89, 0x00, 0x00, 0x00, 0x7b, 0xd9, 0x00, 0x00, 0xcd, 0x89,
- 0x00, 0x00, 0x00, 0x7b, 0xf8, 0x08, 0x00, 0xd8, 0x75, 0xf8, 0x0d, 0xa7,
- 0x79, 0xf7, 0x39, 0x5b, 0xfc, 0x0a, 0x09, 0xba, 0xd4, 0xf6, 0x39, 0x00,
- 0xea, 0x6d, 0x00, 0x00, 0x31, 0xff, 0x75, 0x00, 0xcc, 0x8f, 0x00, 0x00,
- 0x00, 0xdb, 0x76, 0x00, 0x00, 0x00, 0x00, 0x13, 0xd0, 0xf6, 0x63, 0xe1,
- 0xeb, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xf3,
- 0x44, 0x2c, 0x96, 0x87, 0x29, 0xa3, 0x64, 0x00, 0x00, 0xea, 0x4d, 0x01,
- 0xe1, 0xf3, 0x5b, 0x00, 0xc1, 0x88, 0x00, 0x2e, 0xf7, 0xf5, 0x17, 0x00,
- 0x3a, 0xec, 0xfc, 0x10, 0x0e, 0xff, 0x43, 0x00, 0x26, 0xff, 0x2d, 0x00,
- 0x39, 0xff, 0x00, 0x00, 0x17, 0xe6, 0x19, 0x02, 0xee, 0x13, 0xd0, 0x00,
- 0xea, 0x4d, 0x00, 0x00, 0xa5, 0xf6, 0xeb, 0x00, 0x00, 0x7d, 0xec, 0x7a,
- 0x24, 0x73, 0xe7, 0x87, 0x00, 0x00, 0x7d, 0xec, 0x7a, 0x24, 0x73, 0xe7,
- 0x9c, 0x00, 0x00, 0x91, 0xda, 0xbd, 0x00, 0x61, 0xd9, 0xed, 0x03, 0x2b,
- 0xfe, 0x67, 0x1d, 0x70, 0xfc, 0xf0, 0x1a, 0x00, 0xea, 0x7f, 0x31, 0x81,
- 0xdc, 0xdc, 0x0a, 0x00, 0x79, 0xef, 0x83, 0x23, 0x1c, 0xe1, 0x76, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x13, 0xd0, 0xff, 0xec, 0x2e, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0xdc, 0x78, 0x20, 0x0d,
- 0x3c, 0x3b, 0x00, 0x00, 0x00, 0xea, 0x4d, 0x00, 0x8a, 0xf3, 0x0b, 0x00,
- 0xc1, 0x88, 0x00, 0x01, 0xea, 0xce, 0x00, 0x00, 0x03, 0xed, 0xc9, 0x00,
- 0x0e, 0xff, 0x43, 0x00, 0x26, 0xff, 0x2d, 0x00, 0x39, 0xff, 0x00, 0x00,
- 0x98, 0x7e, 0x00, 0x00, 0x78, 0xe7, 0xb0, 0x00, 0xea, 0x4d, 0x00, 0x00,
- 0x18, 0xef, 0xeb, 0x00, 0x00, 0x06, 0x54, 0xb6, 0xfb, 0xbb, 0x57, 0x07,
- 0x00, 0x00, 0x06, 0x54, 0xb6, 0xfc, 0xff, 0x8d, 0x01, 0x00, 0x00, 0x49,
- 0xff, 0x74, 0x00, 0x1b, 0xfe, 0xa8, 0x00, 0x00, 0x7f, 0xde, 0xff, 0xe7,
- 0x72, 0xb1, 0xdb, 0x00, 0xea, 0xff, 0xf8, 0xd6, 0x92, 0x13, 0x00, 0x00,
- 0x06, 0x52, 0xb4, 0xfb, 0xff, 0xe5, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x13, 0xbc, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x44, 0xb7, 0xde, 0xdb, 0xad, 0x50, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1b, 0xda, 0xbb, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f,
- 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0xe6,
- 0xa0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x17, 0x00, 0x00, 0x00,
- 0x2a, 0x1e, 0x00, 0x35, 0x13, 0x00, 0x00, 0x00, 0x2c, 0x1c, 0x00, 0x00,
- 0x0c, 0x27, 0x00, 0x29, 0x09, 0x00, 0x00, 0x00, 0x3c, 0x24, 0x00, 0x00,
- 0x00, 0x31, 0x35, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44,
- 0x1f, 0x00, 0x00, 0x31, 0x17, 0x00, 0x00, 0x13, 0x35, 0x00, 0x31, 0x35,
- 0x2b, 0x02, 0x00, 0x00, 0x00, 0x31, 0x35, 0x2a, 0x02, 0x00, 0x00, 0x33,
- 0x16, 0x00, 0x00, 0x00, 0x0f, 0x35, 0x27, 0x28, 0x00, 0x00, 0x00, 0x1f,
- 0x2e, 0x0b, 0xbc, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x13, 0xbc, 0x2a, 0x0b, 0xbc, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0xfc,
- 0x5b, 0x00, 0x00, 0x00, 0xd2, 0x84, 0x00, 0x00, 0x59, 0xa9, 0x00, 0xea,
- 0x0f, 0x00, 0x00, 0x34, 0xfe, 0xce, 0x00, 0x00, 0x00, 0xea, 0xf2, 0xed,
- 0xfa, 0xce, 0x1a, 0x00, 0x09, 0xb5, 0xfd, 0xe7, 0xf5, 0xaf, 0x00, 0xea,
- 0x6d, 0x00, 0x0c, 0xcf, 0xa7, 0x00, 0xea, 0xf2, 0xf3, 0xea, 0x94, 0x00,
- 0x00, 0xea, 0xf4, 0xf6, 0xec, 0x9d, 0x00, 0xc0, 0x9e, 0x00, 0x00, 0x00,
- 0x7a, 0xe5, 0x58, 0xf8, 0x26, 0x00, 0x0d, 0xe4, 0x7a, 0x0e, 0xff, 0x43,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0x39, 0x0e,
- 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea,
- 0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0xfc, 0x5b, 0x00, 0x00, 0x00,
- 0xd2, 0x84, 0x00, 0x00, 0x89, 0x79, 0x1c, 0xdd, 0x00, 0x00, 0x00, 0x93,
- 0xad, 0xf9, 0x2e, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x19, 0xe3, 0x8c, 0x00,
- 0xab, 0xe1, 0x4f, 0x02, 0x07, 0x1f, 0x00, 0xea, 0x6d, 0x03, 0xb2, 0xc6,
- 0x08, 0x00, 0xea, 0x6d, 0x03, 0x4d, 0xff, 0x33, 0x00, 0xea, 0x6d, 0x03,
- 0x49, 0xff, 0x3a, 0x67, 0xee, 0x06, 0x00, 0x00, 0xd0, 0x8e, 0x00, 0xb3,
- 0xbb, 0x00, 0x8e, 0xcf, 0x05, 0x0e, 0xff, 0x41, 0x12, 0x25, 0x00, 0x00,
- 0x00, 0x00, 0x18, 0x20, 0x18, 0xff, 0x39, 0x0e, 0xff, 0x41, 0x2e, 0x33,
- 0x01, 0x00, 0x03, 0x35, 0x01, 0x2e, 0x34, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x04, 0x39, 0x05, 0x00, 0x00, 0x03, 0x36, 0x02, 0x11, 0x25,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00,
- 0xc9, 0x8e, 0x00, 0xfc, 0x5b, 0x00, 0x00, 0x00, 0xd2, 0x84, 0x41, 0xd3,
- 0xf0, 0xe3, 0xdd, 0xf4, 0xd3, 0x00, 0x06, 0xec, 0x52, 0xb4, 0x8d, 0x00,
- 0x00, 0xea, 0x6d, 0x00, 0x06, 0xdd, 0x86, 0x0b, 0xfc, 0x81, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xea, 0x6d, 0x8d, 0xdd, 0x15, 0x00, 0x00, 0xea, 0x6d,
- 0x00, 0x07, 0xf3, 0x64, 0x00, 0xea, 0x6d, 0x00, 0x0a, 0xf4, 0x69, 0x13,
- 0xfa, 0x4a, 0x00, 0x27, 0xff, 0x34, 0x00, 0x1c, 0xf1, 0x86, 0xf7, 0x33,
- 0x00, 0x0e, 0xff, 0xaa, 0xd3, 0xf8, 0xab, 0x01, 0x00, 0x87, 0xf6, 0xda,
- 0xa5, 0xff, 0x39, 0x0e, 0xff, 0xc0, 0xe5, 0xf2, 0xd5, 0x03, 0x0e, 0xff,
- 0xb4, 0xe5, 0xf2, 0xd6, 0x04, 0x00, 0x00, 0x00, 0x00, 0x6d, 0xe7, 0xdd,
- 0xe7, 0x6d, 0x00, 0x0e, 0xff, 0x98, 0xd2, 0xf8, 0xab, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xea, 0xe9, 0xd9, 0xd9, 0xd9, 0xf7, 0x8e, 0x00, 0xfc,
- 0x5b, 0x00, 0x00, 0x00, 0xd2, 0x84, 0x09, 0x1d, 0xec, 0x2e, 0x93, 0x87,
- 0x1d, 0x00, 0x52, 0xf1, 0x09, 0x5d, 0xe8, 0x04, 0x00, 0xea, 0xe4, 0xd3,
- 0xf6, 0xb1, 0x0d, 0x3c, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea,
- 0xc9, 0xff, 0x60, 0x00, 0x00, 0x00, 0xea, 0x8a, 0x49, 0x9e, 0xf1, 0x0d,
- 0x00, 0xea, 0xa6, 0x71, 0xbb, 0xe1, 0x1a, 0x00, 0xb4, 0xa0, 0x00, 0x7d,
- 0xda, 0x00, 0x00, 0x00, 0x74, 0xff, 0x93, 0x00, 0x00, 0x0e, 0xff, 0x9c,
- 0x02, 0x2a, 0xff, 0x32, 0x0e, 0xfa, 0x5a, 0x00, 0x6f, 0xff, 0x39, 0x0e,
- 0xff, 0xa6, 0x04, 0x1e, 0xff, 0x42, 0x0e, 0xff, 0xa5, 0x04, 0x1e, 0xff,
- 0x42, 0x00, 0x00, 0x00, 0x07, 0xf1, 0x59, 0x00, 0x55, 0xf2, 0x09, 0x0e,
- 0xff, 0x99, 0x01, 0x2d, 0xff, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea,
- 0x98, 0x4c, 0x4c, 0x4c, 0xd9, 0x8e, 0x00, 0xfc, 0x5b, 0x00, 0x00, 0x00,
- 0xd2, 0x84, 0x37, 0x58, 0xef, 0x4a, 0xc6, 0x83, 0x38, 0x00, 0xb1, 0xd5,
- 0x6f, 0x7d, 0xff, 0x4c, 0x00, 0xea, 0x94, 0x47, 0x70, 0xe7, 0x83, 0x22,
- 0xff, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0xd2, 0xaf, 0xe2, 0x10,
- 0x00, 0x00, 0xea, 0xf5, 0xda, 0x94, 0x3e, 0x00, 0x00, 0xea, 0xd6, 0xc4,
- 0xfd, 0x27, 0x00, 0x00, 0x5b, 0xef, 0x06, 0xd3, 0x81, 0x00, 0x00, 0x01,
- 0xbc, 0xeb, 0xd2, 0x06, 0x00, 0x0e, 0xff, 0x56, 0x00, 0x00, 0xdd, 0x77,
- 0x50, 0xfb, 0x0c, 0x00, 0x23, 0xff, 0x39, 0x0e, 0xff, 0x5c, 0x00, 0x00,
- 0xeb, 0x68, 0x0e, 0xff, 0x5c, 0x00, 0x00, 0xeb, 0x68, 0x00, 0x00, 0x00,
- 0x4c, 0xfb, 0x0b, 0x00, 0x08, 0xf8, 0x51, 0x0e, 0xff, 0x52, 0x00, 0x00,
- 0xde, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00,
- 0xc9, 0x8e, 0x00, 0xd3, 0x85, 0x00, 0x00, 0x09, 0xf4, 0x6b, 0x7b, 0xc7,
- 0xdf, 0xa7, 0xfd, 0xa9, 0x7f, 0x16, 0xfa, 0xc4, 0xb8, 0xb8, 0xe2, 0xab,
- 0x00, 0xea, 0x6d, 0x00, 0x00, 0x8e, 0xdf, 0x00, 0xd2, 0x89, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xea, 0x6d, 0x0f, 0xe0, 0xa1, 0x00, 0x00, 0xea, 0x6d,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x01, 0xc6, 0xa5, 0x00, 0x00,
- 0x0c, 0xf5, 0x69, 0xff, 0x28, 0x00, 0x00, 0x60, 0xec, 0x21, 0xe4, 0x80,
- 0x00, 0x0e, 0xff, 0x65, 0x00, 0x01, 0xea, 0x67, 0x43, 0xfe, 0x12, 0x00,
- 0x25, 0xff, 0x39, 0x0e, 0xff, 0x43, 0x00, 0x00, 0xea, 0x68, 0x0e, 0xff,
- 0x43, 0x00, 0x00, 0xea, 0x68, 0x00, 0x00, 0x00, 0x4c, 0xfe, 0x16, 0x00,
- 0x11, 0xfd, 0x40, 0x0e, 0xff, 0x65, 0x00, 0x01, 0xeb, 0x67, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0x72,
- 0xdf, 0x4b, 0x23, 0x8c, 0xfa, 0x28, 0x00, 0x7c, 0x81, 0x1a, 0xe5, 0x00,
- 0x00, 0x70, 0xeb, 0x05, 0x00, 0x00, 0x5c, 0xf8, 0x00, 0xea, 0x7f, 0x22,
- 0x4a, 0xdd, 0x95, 0x00, 0x84, 0xed, 0x7c, 0x1d, 0x24, 0x32, 0x00, 0xea,
- 0x6d, 0x00, 0x40, 0xfd, 0x52, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xea, 0x6d, 0x00, 0x31, 0xfc, 0x49, 0x00, 0x00, 0xa8, 0xe3, 0xcd,
- 0x00, 0x00, 0x17, 0xed, 0x62, 0x00, 0x54, 0xf9, 0x2d, 0x0e, 0xff, 0xbc,
- 0x1d, 0x5f, 0xff, 0x21, 0x07, 0xf5, 0x7e, 0x11, 0x8d, 0xff, 0x39, 0x0e,
- 0xff, 0x43, 0x00, 0x00, 0xea, 0x68, 0x0e, 0xff, 0x43, 0x00, 0x00, 0xea,
- 0x68, 0x00, 0x00, 0x00, 0x14, 0xf2, 0x88, 0x15, 0x82, 0xe8, 0x03, 0x0e,
- 0xff, 0xbc, 0x1e, 0x61, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea,
- 0x6d, 0x00, 0x00, 0x00, 0xc9, 0x8e, 0x00, 0x10, 0x85, 0xdc, 0xfe, 0xd9,
- 0x4c, 0x00, 0x00, 0xaa, 0x50, 0x4b, 0xb4, 0x00, 0x00, 0xcf, 0x97, 0x00,
- 0x00, 0x00, 0x0c, 0xf4, 0x00, 0xea, 0xff, 0xff, 0xdd, 0x93, 0x1c, 0x00,
- 0x08, 0x5c, 0xc0, 0xfe, 0xed, 0x7b, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x8d,
- 0xea, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00,
- 0x00, 0x95, 0xe0, 0x00, 0x00, 0x4f, 0xff, 0x74, 0x00, 0x00, 0xa8, 0xc3,
- 0x01, 0x00, 0x00, 0xb7, 0xca, 0x0e, 0xfd, 0x6f, 0xd4, 0xe5, 0x72, 0x00,
- 0x00, 0x5c, 0xd9, 0xdb, 0x63, 0xef, 0x39, 0x0e, 0xff, 0x43, 0x00, 0x00,
- 0xea, 0x68, 0x0e, 0xff, 0x43, 0x00, 0x00, 0xea, 0x68, 0x00, 0x00, 0x00,
- 0x00, 0x43, 0xdb, 0xfc, 0xb7, 0x46, 0x00, 0x0e, 0xff, 0x8c, 0xd4, 0xe4,
- 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
- 0x00, 0x00, 0x00, 0x0e, 0xff, 0x43, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
- 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xc2, 0x33, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x79,
- 0x00, 0x00, 0x00, 0x00, 0x58, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x0a, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e,
- 0x14, 0x00, 0x00, 0x04, 0x32, 0x3b, 0x03, 0x00, 0x00, 0x00, 0x21, 0x38,
- 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3b, 0x0f, 0x00, 0x2e, 0x35, 0x35,
- 0x35, 0x16, 0x00, 0x00, 0x03, 0x26, 0x49, 0x1f, 0x1e, 0x33, 0x33, 0x33,
- 0x33, 0x33, 0x00, 0x00, 0x18, 0x3a, 0x05, 0x00, 0x00, 0x00, 0x14, 0x37,
- 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f,
- 0x00, 0x31, 0x35, 0x35, 0x35, 0x27, 0x00, 0x31, 0x35, 0x35, 0x35, 0x26,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xa6, 0xea, 0x9e, 0x53, 0x0f, 0x03,
- 0x5f, 0xa3, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d,
- 0xe9, 0xea, 0xb4, 0x23, 0x00, 0x07, 0x98, 0xff, 0x61, 0x00, 0x27, 0xd4,
- 0xee, 0xe8, 0xe8, 0x2f, 0x32, 0xcf, 0xdd, 0xe5, 0xef, 0x33, 0x00, 0x00,
- 0x00, 0x89, 0xff, 0x41, 0x00, 0xea, 0xf9, 0xf6, 0xf6, 0x64, 0x00, 0x25,
- 0xcf, 0xfe, 0xd1, 0x6c, 0x90, 0xf6, 0xf6, 0xf6, 0xf9, 0xff, 0x00, 0xa0,
- 0xea, 0xca, 0xee, 0x3e, 0x00, 0x9e, 0xf3, 0xe2, 0xe3, 0x1c, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0xea, 0xf4, 0xec,
- 0xec, 0xac, 0x00, 0xea, 0xf4, 0xec, 0xec, 0xa9, 0x00, 0x00, 0x00, 0x00,
- 0x17, 0x3a, 0x05, 0x30, 0x0c, 0x06, 0x36, 0x0c, 0x00, 0x00, 0x34, 0x13,
- 0x16, 0xf6, 0x91, 0xc3, 0x79, 0x5b, 0x80, 0xed, 0xc9, 0xd9, 0xdb, 0xcb,
- 0x00, 0x00, 0x31, 0xa9, 0x00, 0x00, 0x06, 0xf7, 0x57, 0x0c, 0xbd, 0x88,
- 0x05, 0xc6, 0xb6, 0xed, 0x61, 0x00, 0x08, 0x64, 0x05, 0x02, 0xbf, 0x9d,
- 0x04, 0x3a, 0x00, 0x01, 0xbe, 0xa2, 0x00, 0x00, 0x3d, 0xd1, 0xfc, 0x41,
- 0x02, 0xfc, 0x41, 0x00, 0x00, 0x00, 0x00, 0xc9, 0xa9, 0x1f, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x90, 0xbf, 0x23, 0xfe, 0x27, 0x00, 0x9b, 0xaf,
- 0x2b, 0xfc, 0x21, 0x00, 0xa9, 0xb1, 0x00, 0x00, 0x00, 0x01, 0x50, 0xce,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x98, 0x1e, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x7c, 0xc1, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xea,
- 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xf6, 0xdf, 0xbf, 0xf9,
- 0x39, 0x1d, 0xff, 0x38, 0x00, 0x00, 0xf6, 0x5c, 0x30, 0xff, 0x55, 0xa7,
- 0x00, 0x00, 0x06, 0x21, 0xdd, 0xeb, 0x45, 0x0c, 0x00, 0x00, 0x3a, 0xc8,
- 0x00, 0x00, 0x35, 0xfd, 0x09, 0x00, 0x77, 0xc1, 0x00, 0x44, 0x03, 0xee,
- 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xa9, 0x00, 0x00, 0x00, 0x09,
- 0xdb, 0x79, 0x00, 0x0d, 0xdc, 0x43, 0xff, 0x41, 0x13, 0xff, 0x38, 0x0f,
- 0x00, 0x00, 0x36, 0xff, 0x34, 0x26, 0x05, 0x00, 0x00, 0x00, 0x00, 0x12,
- 0xf3, 0x4e, 0x0a, 0xf1, 0x6b, 0x16, 0xce, 0x80, 0x6e, 0xda, 0x00, 0x00,
- 0x58, 0xe9, 0x00, 0x01, 0x50, 0xce, 0xbc, 0x44, 0x49, 0xab, 0xab, 0xab,
- 0xab, 0xa8, 0x0f, 0x78, 0xe1, 0x98, 0x1f, 0x00, 0x00, 0x01, 0xdb, 0x62,
- 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6a, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x0e, 0xfa, 0x58, 0x00, 0x6f, 0xff, 0x39, 0x1d, 0xff, 0x38,
- 0x00, 0x00, 0xf6, 0x5c, 0x00, 0x90, 0xfc, 0xdd, 0x46, 0x00, 0x00, 0x8b,
- 0xbb, 0x75, 0xce, 0x06, 0x41, 0x8d, 0xa7, 0xe7, 0x8d, 0x8d, 0x6b, 0xe3,
- 0x00, 0x00, 0x52, 0xf5, 0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x00, 0x00,
- 0x00, 0x31, 0xf8, 0x3f, 0x00, 0x33, 0xcb, 0xf8, 0x85, 0x05, 0x00, 0x9c,
- 0x8e, 0x08, 0xff, 0x41, 0x1f, 0xfd, 0xfe, 0xfa, 0xb8, 0x2d, 0x5b, 0xf2,
- 0xc9, 0xe6, 0xe7, 0x5a, 0x00, 0x00, 0x00, 0x7c, 0xd9, 0x02, 0x00, 0x37,
- 0xfb, 0xf8, 0xa4, 0x02, 0x2e, 0xfd, 0x49, 0x26, 0xbd, 0xfe, 0x35, 0xce,
- 0xac, 0x34, 0x00, 0x00, 0x24, 0x55, 0x55, 0x55, 0x55, 0x53, 0x00, 0x00,
- 0x08, 0x68, 0xd8, 0x98, 0x00, 0x3b, 0xf4, 0x0d, 0x00, 0xea, 0xe8, 0xd6,
- 0xd6, 0x6f, 0x00, 0xea, 0xb6, 0x82, 0x82, 0x42, 0x00, 0x00, 0x4f, 0xfb,
- 0x0c, 0x00, 0x23, 0xff, 0x39, 0x1d, 0xff, 0x38, 0x00, 0x00, 0xf6, 0x5c,
- 0x00, 0x00, 0x3a, 0xe4, 0xf4, 0x89, 0x00, 0x24, 0x30, 0x0c, 0x48, 0x00,
- 0x34, 0x72, 0x92, 0xe1, 0x72, 0x72, 0x5e, 0xea, 0x00, 0x00, 0x59, 0xee,
- 0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x00, 0x00, 0x22, 0xe6, 0x76, 0x00,
- 0x00, 0x15, 0x57, 0x82, 0xe7, 0x79, 0x4d, 0xd5, 0x09, 0x08, 0xff, 0x41,
- 0x00, 0x13, 0x03, 0x2c, 0xcd, 0xa5, 0x6f, 0xfc, 0x30, 0x01, 0x81, 0xd3,
- 0x00, 0x00, 0x09, 0xe9, 0x6a, 0x00, 0x0f, 0xc5, 0xb2, 0x78, 0xed, 0x63,
- 0x00, 0x7f, 0xe4, 0xe4, 0xa5, 0xeb, 0x34, 0xc4, 0xcd, 0x64, 0x0a, 0x00,
- 0x2e, 0x6c, 0x6c, 0x6c, 0x6c, 0x6a, 0x00, 0x00, 0x29, 0x92, 0xe4, 0x93,
- 0x00, 0x9a, 0xa3, 0x00, 0x00, 0xea, 0x96, 0x48, 0x48, 0x25, 0x00, 0xea,
- 0xc8, 0xa1, 0xa1, 0x52, 0x00, 0x00, 0x43, 0xfe, 0x12, 0x00, 0x23, 0xff,
- 0x39, 0x1c, 0xff, 0x3d, 0x00, 0x1c, 0xff, 0x5c, 0x06, 0x00, 0x17, 0xa7,
- 0x8a, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0xc8,
- 0x00, 0x00, 0x25, 0xff, 0x0f, 0x00, 0x7f, 0xb8, 0x00, 0x00, 0x00, 0xf0,
- 0x61, 0x00, 0x00, 0x20, 0xe0, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x84, 0xe4, 0xc4, 0xf0, 0xe2, 0xe3, 0xff, 0xe9, 0x00, 0x00, 0x00, 0x00,
- 0x7b, 0xdd, 0x4b, 0xf3, 0x07, 0x00, 0x47, 0xf8, 0x00, 0x00, 0x68, 0xed,
- 0x0b, 0x00, 0x5f, 0xe3, 0x02, 0x00, 0x5d, 0xeb, 0x00, 0x00, 0x01, 0x00,
- 0xaa, 0xbd, 0x00, 0x00, 0x35, 0xa5, 0xea, 0x90, 0x3f, 0x92, 0x92, 0x92,
- 0x92, 0x90, 0x34, 0xbe, 0xe0, 0x74, 0x10, 0x00, 0x09, 0xf0, 0x44, 0x00,
- 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6a, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x07, 0xf5, 0x7b, 0x10, 0x8b, 0xff, 0x39, 0x02, 0xe4, 0x8c,
- 0x10, 0x86, 0xff, 0x5c, 0x60, 0xd2, 0xa9, 0xea, 0xfd, 0x77, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x91, 0x00, 0x00, 0x01, 0xea,
- 0x87, 0x2f, 0xd5, 0x81, 0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x1f, 0xdf,
- 0x9f, 0x29, 0x29, 0x29, 0x36, 0x28, 0x04, 0x29, 0xcd, 0x9c, 0x2a, 0x35,
- 0x35, 0x3b, 0xff, 0x69, 0x28, 0x37, 0x09, 0x32, 0xd3, 0x81, 0x16, 0xef,
- 0x7f, 0x18, 0xa7, 0xaf, 0x00, 0x03, 0xdb, 0x87, 0x00, 0x00, 0x3e, 0xf5,
- 0x26, 0x05, 0x88, 0xc7, 0x00, 0x06, 0x1b, 0x75, 0xf4, 0x48, 0x00, 0x00,
- 0x00, 0x00, 0x1b, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x56,
- 0x04, 0x00, 0x00, 0x00, 0x5a, 0xe2, 0x02, 0x00, 0x00, 0xea, 0x81, 0x24,
- 0x24, 0x1a, 0x00, 0xea, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c,
- 0xda, 0xda, 0x71, 0xff, 0x39, 0x00, 0x68, 0xe4, 0xfa, 0xa6, 0xd0, 0x5c,
- 0x09, 0x38, 0x74, 0xc9, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xb5, 0xef, 0x82, 0x10,
- 0x00, 0x00, 0x00, 0xf0, 0x61, 0x00, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0x5f, 0xdc, 0xfc, 0xe9, 0xa6, 0x22, 0x00, 0x00, 0x00, 0x08, 0xff, 0x41,
- 0x3e, 0xd7, 0xfd, 0xe4, 0x95, 0x17, 0x00, 0x47, 0xdc, 0xfb, 0xb2, 0x30,
- 0x00, 0x55, 0xfa, 0x1b, 0x00, 0x00, 0x00, 0x90, 0xe3, 0xf2, 0xbf, 0x3c,
- 0x00, 0xec, 0xfc, 0xde, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xb9, 0x85, 0x00, 0x00, 0x00, 0xea, 0xff, 0xff, 0xff, 0xba, 0x00, 0xea,
- 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x1a, 0xff,
- 0x39, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x70,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0f, 0x0d, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0xff, 0x39, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x14, 0xc2, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x17, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x15, 0x43, 0x14, 0x00, 0x2d, 0x35, 0x35, 0x35,
- 0x35, 0x35, 0x32, 0x1b, 0x00, 0x00, 0x00, 0x26, 0x1c, 0x35, 0x35, 0x35,
- 0x35, 0x35, 0x00, 0x00, 0x1d, 0x17, 0x00, 0x00, 0x00, 0x00, 0x8c, 0xa9,
- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xbc, 0x2f, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x7a,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x35, 0x35,
- 0x35, 0x2b, 0x0d, 0x35, 0x04, 0x35, 0x0e, 0x00, 0x12, 0x41, 0x0e, 0x00,
- 0x2f, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xa1,
- 0xf9, 0xe4, 0xfe, 0x7c, 0xc9, 0xf0, 0xf6, 0xfe, 0xf0, 0xf0, 0x9e, 0xd1,
- 0x02, 0x00, 0x14, 0xf1, 0x7c, 0xf0, 0xf0, 0xf0, 0xf8, 0xff, 0x00, 0x00,
- 0xbd, 0xae, 0x00, 0x00, 0x00, 0x00, 0x0b, 0xb2, 0x74, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x0e, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x60, 0x60, 0x60, 0xaa, 0x33, 0xfc,
- 0x02, 0xf9, 0x36, 0x9f, 0xeb, 0xd6, 0xf7, 0x5d, 0xa5, 0x99, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x2b, 0xfe, 0x2d, 0x00, 0x1a, 0x15,
- 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x1d, 0xf7, 0x58, 0x00, 0x8a, 0xda,
- 0x00, 0x00, 0x00, 0x08, 0xd5, 0x9c, 0x00, 0x35, 0xc9, 0xd2, 0x34, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x03, 0x35, 0x42, 0x09, 0x00,
- 0x00, 0x00, 0x07, 0x38, 0x03, 0x00, 0x00, 0x00, 0x28, 0x48, 0x36, 0x36,
- 0x0e, 0xff, 0x40, 0x00, 0x0e, 0x36, 0x34, 0x17, 0x00, 0x00, 0x0f, 0x36,
- 0x25, 0x2c, 0x00, 0x00, 0x1a, 0x35, 0x33, 0x1a, 0x00, 0x00, 0x10, 0x36,
- 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x1f, 0xea, 0x00, 0xe6, 0x22, 0x1c,
- 0x04, 0x00, 0x7a, 0xcf, 0x46, 0xef, 0x09, 0x00, 0x00, 0x00, 0x04, 0x3e,
- 0x21, 0x00, 0x04, 0x36, 0x34, 0x06, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00,
- 0x00, 0x00, 0x24, 0xff, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xea,
- 0x00, 0x00, 0x00, 0x8b, 0xd9, 0x1d, 0xf5, 0x54, 0x00, 0x00, 0x00, 0x8b,
- 0xe0, 0x0e, 0x00, 0xac, 0x58, 0x54, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xa7, 0xd5, 0xc6, 0xf3, 0x42, 0x00, 0x6d, 0xe1, 0xc7,
- 0xe1, 0x49, 0x02, 0xca, 0xbd, 0xb6, 0xff, 0xb2, 0x0e, 0xff, 0x40, 0x0c,
- 0xc7, 0xae, 0xba, 0xa4, 0x00, 0x00, 0x7f, 0xdf, 0x46, 0xfb, 0x38, 0x08,
- 0xd8, 0x97, 0xb6, 0xb1, 0x00, 0x00, 0x81, 0xe2, 0x00, 0x00, 0x58, 0xaa,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00,
- 0x00, 0x95, 0x0a, 0xa3, 0x00, 0xa1, 0x0d, 0x00, 0x00, 0x02, 0xa9, 0xb9,
- 0x03, 0xe3, 0x58, 0x00, 0x00, 0x70, 0xe7, 0xdd, 0xf7, 0x11, 0xe9, 0xe3,
- 0xd8, 0xcf, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x84,
- 0xfb, 0xb6, 0x33, 0x00, 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x12,
- 0xef, 0xd9, 0xc8, 0x01, 0x00, 0x00, 0x3b, 0xfb, 0x42, 0x00, 0x26, 0xdf,
- 0x04, 0x02, 0xd1, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
- 0x00, 0x00, 0xa7, 0xa5, 0x07, 0xf1, 0x3f, 0x00, 0x77, 0xba, 0x45, 0xf4,
- 0x06, 0x01, 0xe9, 0x66, 0x0e, 0xff, 0x45, 0xbc, 0xbb, 0x07, 0x59, 0xf3,
- 0x0a, 0x00, 0xd8, 0x80, 0x00, 0x95, 0xd5, 0x8f, 0xdb, 0x0b, 0x50, 0xf9,
- 0x13, 0x00, 0xd8, 0x85, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x2c, 0xb1,
- 0xcf, 0x88, 0x4c, 0x89, 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x9a, 0xd6, 0x1d, 0x00, 0x86, 0xb7, 0x00,
- 0x07, 0xf1, 0x62, 0x00, 0x06, 0x58, 0xf8, 0x20, 0x00, 0x08, 0x00, 0x00,
- 0x00, 0xea, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xbe, 0xfe, 0x5a,
- 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x00, 0x79, 0xff, 0x40, 0x00,
- 0x00, 0x0a, 0xda, 0x92, 0x00, 0x00, 0x9a, 0x75, 0x00, 0x00, 0x53, 0xc0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x8b, 0xbf, 0xe6, 0xc5,
- 0x49, 0xfe, 0xc3, 0xc2, 0xd2, 0xfc, 0x36, 0xfe, 0x39, 0x2b, 0xf8, 0x29,
- 0x0e, 0xff, 0xc7, 0xf9, 0x18, 0x00, 0x09, 0xef, 0x57, 0x32, 0xfd, 0x20,
- 0x00, 0x0b, 0xe0, 0xff, 0x3d, 0x00, 0x04, 0xe5, 0x69, 0x31, 0xfe, 0x25,
- 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x49, 0x3a, 0x47, 0x91, 0xbd, 0x67,
- 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x43, 0xe6, 0x15, 0x00, 0x00, 0x28, 0xfb, 0x1a, 0x4a, 0xfb, 0x0d, 0x00,
- 0x00, 0x11, 0xc2, 0xf4, 0x90, 0x19, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xbe, 0x00, 0x00, 0x6c, 0xea,
- 0x00, 0x00, 0x00, 0x00, 0x47, 0xff, 0x12, 0x00, 0x00, 0x91, 0xda, 0x0a,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x27, 0xfc, 0x6a, 0x1e, 0x9a, 0xc5, 0x3b, 0xfd, 0x42, 0x31,
- 0x31, 0x31, 0x00, 0x9f, 0xe5, 0xb3, 0x5d, 0x00, 0x0e, 0xff, 0xac, 0xd2,
- 0xa4, 0x00, 0x00, 0x97, 0xac, 0x88, 0xbc, 0x00, 0x00, 0x2b, 0xf7, 0xee,
- 0x75, 0x00, 0x00, 0x82, 0xbf, 0x86, 0xc3, 0x00, 0x00, 0x00, 0x58, 0xaa,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00,
- 0x00, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x5b, 0x00, 0x00,
- 0x00, 0x00, 0xc7, 0x76, 0x40, 0xfe, 0x15, 0x00, 0x00, 0x00, 0x01, 0x4f,
- 0xd1, 0xdf, 0x00, 0x00, 0x00, 0xea, 0x83, 0x27, 0x27, 0x23, 0x39, 0x44,
- 0x14, 0x2b, 0xd1, 0x7b, 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x00,
- 0x47, 0xff, 0x12, 0x00, 0x40, 0xfd, 0x60, 0x27, 0x27, 0x27, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xf6,
- 0x0f, 0x1f, 0xe4, 0xc5, 0x01, 0xe0, 0x89, 0x0e, 0x07, 0x31, 0x08, 0xfa,
- 0x4e, 0x24, 0x0a, 0x00, 0x0e, 0xff, 0x40, 0x2b, 0xf5, 0x65, 0x00, 0x36,
- 0xef, 0xd1, 0x5b, 0x00, 0x05, 0xcd, 0x9e, 0x4b, 0xf8, 0x2d, 0x00, 0x1e,
- 0xf6, 0xda, 0x63, 0x00, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x95, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x68, 0xd4,
- 0x04, 0xec, 0x8a, 0x14, 0x3f, 0x27, 0x2c, 0x01, 0x54, 0xee, 0x00, 0x00,
- 0x00, 0xea, 0xff, 0xff, 0xff, 0xe6, 0x51, 0xdb, 0xfd, 0xea, 0xa3, 0x11,
- 0x00, 0x00, 0x6c, 0xea, 0x00, 0x00, 0x00, 0x00, 0x47, 0xff, 0x12, 0x00,
- 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc8, 0xf7, 0xdf, 0x83, 0xc5,
- 0x00, 0x3f, 0xae, 0xf4, 0xfc, 0x9f, 0x0a, 0xd2, 0xfc, 0xfb, 0xf7, 0x90,
- 0x0e, 0xff, 0x40, 0x00, 0x65, 0xf6, 0x00, 0x00, 0xd4, 0xf0, 0x09, 0x00,
- 0x83, 0xe5, 0x10, 0x00, 0xa2, 0xd0, 0x00, 0x00, 0xb4, 0xf4, 0x0d, 0x00,
- 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xc6, 0x95, 0x95, 0x95, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x82, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x11, 0xf7, 0x00, 0x4f, 0xbf, 0xfe,
- 0xf1, 0x57, 0xe9, 0xf3, 0xde, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d,
- 0x0a, 0x00, 0xaa, 0x94, 0x08, 0x02, 0x4e, 0xf8, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x06, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x58, 0xaa,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0f, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x00, 0x0f,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xae,
- 0x37, 0x49, 0xae, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xc3,
- 0xf1, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x58, 0xaa, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x79, 0xb0, 0x96, 0x5c, 0x10,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x9f, 0x3a, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x3d, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xff, 0x5a, 0xff, 0x8f, 0x00,
- 0x00, 0x00, 0xff, 0x8f, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x3c, 0xaa, 0x3c, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x8f, 0xff,
- 0x8f, 0x00, 0x8f, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x8f, 0xff, 0x8f, 0xff, 0x8f,
- 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14,
- 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x14, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x6e, 0xaa, 0x00, 0x3c, 0xaa, 0x3c, 0x00, 0x00, 0x8f,
- 0xff, 0x8f, 0x00, 0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x86, 0xbd, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x17,
- 0x00, 0x00, 0x00, 0x0a, 0x35, 0x13, 0x00, 0x00, 0x30, 0x20, 0x1d, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x31, 0x17, 0x00, 0x33, 0x15, 0x07, 0x35, 0x35,
- 0x26, 0x35, 0x31, 0x03, 0x7f, 0x18, 0x03, 0x7f, 0x18, 0x0b, 0xbc, 0x31,
- 0x00, 0x00, 0x0d, 0x35, 0x00, 0x00, 0x00, 0x5e, 0xff, 0x70, 0x00, 0x00,
- 0x00, 0x00, 0x70, 0xff, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5,
- 0xff, 0x00, 0x5a, 0xff, 0x5a, 0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x00,
- 0x00, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x81, 0xd8, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x4f, 0x3b, 0x00, 0x00, 0x00, 0xb5, 0xf5, 0xb0, 0xe7, 0x28, 0x00, 0x26,
- 0xff, 0x55, 0x00, 0x3e, 0xe7, 0x4c, 0xdc, 0x06, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0xcb, 0x8e, 0xd6, 0xeb, 0x0b,
- 0xc5, 0x2f, 0x0b, 0xc5, 0x2f, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x33, 0xfc,
- 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0x70, 0x00, 0x00, 0x70, 0xff, 0x70,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x8f, 0xff, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x17, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x07,
- 0xcd, 0xa8, 0x36, 0x03, 0x35, 0x00, 0x24, 0x0b, 0xcf, 0x85, 0x36, 0x00,
- 0x32, 0xfd, 0x1b, 0x01, 0xbb, 0x85, 0x00, 0x19, 0xff, 0x48, 0x01, 0xca,
- 0x70, 0x01, 0xca, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x2c, 0x09, 0x00, 0x2c, 0x08, 0x00, 0xea, 0x6d, 0x00, 0xf4,
- 0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x03, 0x36, 0x0e, 0x03, 0x36,
- 0x0e, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x1f, 0xea, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x70, 0xff, 0x70, 0x70, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x55, 0x37, 0x00, 0x37, 0x55, 0x00, 0x1e, 0x55, 0x1e, 0xff, 0x8f, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0xcc,
- 0xcc, 0xe8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x98, 0xf3, 0xe6, 0xc9, 0x0e,
- 0xff, 0x85, 0xfc, 0x93, 0xfb, 0xde, 0xc9, 0x00, 0x41, 0xf6, 0x00, 0x00,
- 0x9e, 0x99, 0x00, 0x0c, 0xff, 0x3c, 0x2c, 0xff, 0x0f, 0x00, 0x69, 0xd0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xf8, 0x54,
- 0x20, 0xf8, 0x51, 0x00, 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12,
- 0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43,
- 0x00, 0x00, 0x0a, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff,
- 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa5, 0x00, 0xa5,
- 0xff, 0x00, 0x5a, 0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xe6, 0x6f, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xc7, 0x8b, 0x00, 0x0e, 0xff, 0xc7, 0x1f, 0x00,
- 0xee, 0x64, 0x00, 0x00, 0x64, 0xe7, 0x00, 0x00, 0x8f, 0xba, 0x00, 0x01,
- 0xfd, 0x2f, 0x54, 0xe5, 0x00, 0x00, 0x41, 0xf6, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x45, 0x09, 0x03, 0x46, 0x09, 0x00,
- 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e,
- 0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0x70, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x55, 0x37, 0x00, 0x37, 0x55, 0x00, 0x1e, 0x55,
- 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x01, 0xb1, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xc7, 0x8b, 0x00, 0x0e, 0xff, 0x5d, 0x00, 0x00, 0xee, 0x64, 0x00, 0x9b,
- 0xe8, 0x53, 0x00, 0x00, 0x23, 0xc4, 0xd7, 0x00, 0xf1, 0x22, 0x7b, 0xbe,
- 0x00, 0x00, 0x1a, 0xff, 0x00, 0x00, 0x00, 0x62, 0xa4, 0xa4, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0xf4,
- 0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff,
- 0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x70, 0xff, 0x70, 0x70, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69,
- 0xe8, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x8b, 0x00, 0x0e,
- 0xff, 0x43, 0x00, 0x00, 0xee, 0x64, 0x00, 0x52, 0xcc, 0xa7, 0x00, 0x00,
- 0x4e, 0xea, 0x76, 0x00, 0x75, 0x0c, 0x6f, 0xca, 0x00, 0x00, 0x26, 0xff,
- 0x00, 0x00, 0x00, 0x49, 0x7a, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12,
- 0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0x70, 0x00,
- 0x00, 0x70, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0xf5, 0x4c, 0x03, 0x03, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xc7, 0x8b, 0x00, 0x0e, 0xff, 0x43, 0x00, 0x00,
- 0xd0, 0x8f, 0x05, 0x00, 0x4a, 0xf5, 0x00, 0x00, 0x99, 0xa2, 0x00, 0x08,
- 0x75, 0x17, 0x47, 0xf2, 0x01, 0x00, 0x4e, 0xeb, 0x09, 0x56, 0x17, 0x00,
- 0x00, 0x00, 0x08, 0x75, 0x17, 0x08, 0x75, 0x17, 0x09, 0x56, 0x17, 0x00,
- 0xea, 0x6d, 0x00, 0xf4, 0x64, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e,
- 0xff, 0x43, 0x0e, 0xff, 0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x5e, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff,
- 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x9a, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xc7, 0x8b, 0x00, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x62, 0xee, 0xfc, 0x00,
- 0x41, 0xf7, 0x00, 0x00, 0x9f, 0x99, 0x00, 0x27, 0xfe, 0x4f, 0x1a, 0xfc,
- 0x27, 0x00, 0x82, 0xba, 0x3d, 0xf9, 0x14, 0x00, 0x00, 0x00, 0x27, 0xfe,
- 0x4f, 0x27, 0xfe, 0x4f, 0x3d, 0xf9, 0x14, 0x00, 0xea, 0x6d, 0x00, 0xf6,
- 0x60, 0x22, 0xff, 0x12, 0x00, 0x46, 0xeb, 0x0e, 0xff, 0x43, 0x0e, 0xff,
- 0x43, 0x0e, 0xff, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14,
- 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x14, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0e, 0x00, 0x13, 0xf7, 0x74, 0x3a,
- 0xe1, 0x6d, 0x00, 0x00, 0x12, 0x00, 0x00, 0x97, 0x9e, 0x0d, 0xeb, 0x3d,
- 0x71, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00,
- 0x71, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x33, 0xff, 0x25, 0x22, 0xff, 0x3c,
- 0x20, 0x67, 0xeb, 0x00, 0x00, 0x00, 0x17, 0xff, 0x42, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1,
- 0xc1, 0xc1, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xa8, 0x8b, 0x86, 0x0d, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x16, 0xc8, 0x5c, 0x97, 0x00, 0x49, 0x33, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x33, 0x00, 0x00,
- 0x00, 0x00, 0xf9, 0xad, 0x00, 0x1c, 0xd1, 0xd1, 0x95, 0xd1, 0xc0, 0x00,
- 0x00, 0x00, 0xba, 0xf7, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-
-
-static mu_Rect atlas[] = {
- [ MU_ICON_CLOSE ] = { 88, 68, 16, 16 },
- [ MU_ICON_CHECK ] = { 0, 0, 18, 18 },
- [ MU_ICON_EXPANDED ] = { 118, 68, 7, 5 },
- [ MU_ICON_COLLAPSED ] = { 113, 68, 5, 7 },
- [ ATLAS_WHITE ] = { 125, 68, 3, 3 },
- [ ATLAS_FONT+32 ] = { 84, 68, 2, 17 },
- [ ATLAS_FONT+33 ] = { 39, 68, 3, 17 },
- [ ATLAS_FONT+34 ] = { 114, 51, 5, 17 },
- [ ATLAS_FONT+35 ] = { 34, 17, 7, 17 },
- [ ATLAS_FONT+36 ] = { 28, 34, 6, 17 },
- [ ATLAS_FONT+37 ] = { 58, 0, 9, 17 },
- [ ATLAS_FONT+38 ] = { 103, 0, 8, 17 },
- [ ATLAS_FONT+39 ] = { 86, 68, 2, 17 },
- [ ATLAS_FONT+40 ] = { 42, 68, 3, 17 },
- [ ATLAS_FONT+41 ] = { 45, 68, 3, 17 },
- [ ATLAS_FONT+42 ] = { 34, 34, 6, 17 },
- [ ATLAS_FONT+43 ] = { 40, 34, 6, 17 },
- [ ATLAS_FONT+44 ] = { 48, 68, 3, 17 },
- [ ATLAS_FONT+45 ] = { 51, 68, 3, 17 },
- [ ATLAS_FONT+46 ] = { 54, 68, 3, 17 },
- [ ATLAS_FONT+47 ] = { 124, 34, 4, 17 },
- [ ATLAS_FONT+48 ] = { 46, 34, 6, 17 },
- [ ATLAS_FONT+49 ] = { 52, 34, 6, 17 },
- [ ATLAS_FONT+50 ] = { 58, 34, 6, 17 },
- [ ATLAS_FONT+51 ] = { 64, 34, 6, 17 },
- [ ATLAS_FONT+52 ] = { 70, 34, 6, 17 },
- [ ATLAS_FONT+53 ] = { 76, 34, 6, 17 },
- [ ATLAS_FONT+54 ] = { 82, 34, 6, 17 },
- [ ATLAS_FONT+55 ] = { 88, 34, 6, 17 },
- [ ATLAS_FONT+56 ] = { 94, 34, 6, 17 },
- [ ATLAS_FONT+57 ] = { 100, 34, 6, 17 },
- [ ATLAS_FONT+58 ] = { 57, 68, 3, 17 },
- [ ATLAS_FONT+59 ] = { 60, 68, 3, 17 },
- [ ATLAS_FONT+60 ] = { 106, 34, 6, 17 },
- [ ATLAS_FONT+61 ] = { 112, 34, 6, 17 },
- [ ATLAS_FONT+62 ] = { 118, 34, 6, 17 },
- [ ATLAS_FONT+63 ] = { 119, 51, 5, 17 },
- [ ATLAS_FONT+64 ] = { 18, 0, 10, 17 },
- [ ATLAS_FONT+65 ] = { 41, 17, 7, 17 },
- [ ATLAS_FONT+66 ] = { 48, 17, 7, 17 },
- [ ATLAS_FONT+67 ] = { 55, 17, 7, 17 },
- [ ATLAS_FONT+68 ] = { 111, 0, 8, 17 },
- [ ATLAS_FONT+69 ] = { 0, 35, 6, 17 },
- [ ATLAS_FONT+70 ] = { 6, 35, 6, 17 },
- [ ATLAS_FONT+71 ] = { 119, 0, 8, 17 },
- [ ATLAS_FONT+72 ] = { 18, 17, 8, 17 },
- [ ATLAS_FONT+73 ] = { 63, 68, 3, 17 },
- [ ATLAS_FONT+74 ] = { 66, 68, 3, 17 },
- [ ATLAS_FONT+75 ] = { 62, 17, 7, 17 },
- [ ATLAS_FONT+76 ] = { 12, 51, 6, 17 },
- [ ATLAS_FONT+77 ] = { 28, 0, 10, 17 },
- [ ATLAS_FONT+78 ] = { 67, 0, 9, 17 },
- [ ATLAS_FONT+79 ] = { 76, 0, 9, 17 },
- [ ATLAS_FONT+80 ] = { 69, 17, 7, 17 },
- [ ATLAS_FONT+81 ] = { 85, 0, 9, 17 },
- [ ATLAS_FONT+82 ] = { 76, 17, 7, 17 },
- [ ATLAS_FONT+83 ] = { 18, 51, 6, 17 },
- [ ATLAS_FONT+84 ] = { 24, 51, 6, 17 },
- [ ATLAS_FONT+85 ] = { 26, 17, 8, 17 },
- [ ATLAS_FONT+86 ] = { 83, 17, 7, 17 },
- [ ATLAS_FONT+87 ] = { 38, 0, 10, 17 },
- [ ATLAS_FONT+88 ] = { 90, 17, 7, 17 },
- [ ATLAS_FONT+89 ] = { 30, 51, 6, 17 },
- [ ATLAS_FONT+90 ] = { 36, 51, 6, 17 },
- [ ATLAS_FONT+91 ] = { 69, 68, 3, 17 },
- [ ATLAS_FONT+92 ] = { 124, 51, 4, 17 },
- [ ATLAS_FONT+93 ] = { 72, 68, 3, 17 },
- [ ATLAS_FONT+94 ] = { 42, 51, 6, 17 },
- [ ATLAS_FONT+95 ] = { 15, 68, 4, 17 },
- [ ATLAS_FONT+96 ] = { 48, 51, 6, 17 },
- [ ATLAS_FONT+97 ] = { 54, 51, 6, 17 },
- [ ATLAS_FONT+98 ] = { 97, 17, 7, 17 },
- [ ATLAS_FONT+99 ] = { 0, 52, 5, 17 },
- [ ATLAS_FONT+100 ] = { 104, 17, 7, 17 },
- [ ATLAS_FONT+101 ] = { 60, 51, 6, 17 },
- [ ATLAS_FONT+102 ] = { 19, 68, 4, 17 },
- [ ATLAS_FONT+103 ] = { 66, 51, 6, 17 },
- [ ATLAS_FONT+104 ] = { 111, 17, 7, 17 },
- [ ATLAS_FONT+105 ] = { 75, 68, 3, 17 },
- [ ATLAS_FONT+106 ] = { 78, 68, 3, 17 },
- [ ATLAS_FONT+107 ] = { 72, 51, 6, 17 },
- [ ATLAS_FONT+108 ] = { 81, 68, 3, 17 },
- [ ATLAS_FONT+109 ] = { 48, 0, 10, 17 },
- [ ATLAS_FONT+110 ] = { 118, 17, 7, 17 },
- [ ATLAS_FONT+111 ] = { 0, 18, 7, 17 },
- [ ATLAS_FONT+112 ] = { 7, 18, 7, 17 },
- [ ATLAS_FONT+113 ] = { 14, 34, 7, 17 },
- [ ATLAS_FONT+114 ] = { 23, 68, 4, 17 },
- [ ATLAS_FONT+115 ] = { 5, 52, 5, 17 },
- [ ATLAS_FONT+116 ] = { 27, 68, 4, 17 },
- [ ATLAS_FONT+117 ] = { 21, 34, 7, 17 },
- [ ATLAS_FONT+118 ] = { 78, 51, 6, 17 },
- [ ATLAS_FONT+119 ] = { 94, 0, 9, 17 },
- [ ATLAS_FONT+120 ] = { 84, 51, 6, 17 },
- [ ATLAS_FONT+121 ] = { 90, 51, 6, 17 },
- [ ATLAS_FONT+122 ] = { 10, 68, 5, 17 },
- [ ATLAS_FONT+123 ] = { 31, 68, 4, 17 },
- [ ATLAS_FONT+124 ] = { 96, 51, 6, 17 },
- [ ATLAS_FONT+125 ] = { 35, 68, 4, 17 },
- [ ATLAS_FONT+126 ] = { 102, 51, 6, 17 },
- [ ATLAS_FONT+127 ] = { 108, 51, 6, 17 },
-};
-
--- a/demo/atlas_p9.h
+++ /dev/null
@@ -1,43 +1,0 @@
-static u8int atlas_texture[] = {
- 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x72, 0x38,
- 0x67, 0x38, 0x62, 0x38, 0x61, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x20, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x20, 0x20,
- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0x36, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x20, 0x20, 0x20, 0x20, 0x31, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x31, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0x38, 0x36, 0x20, 0x80,
- 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x78, 0x00, 0x80, 0xff, 0x00, 0x00, 0x80, 0x8f, 0x00,
- 0x00, 0x74, 0x13, 0x04, 0x0f, 0x04, 0x17, 0x7c, 0x51, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x14,
- 0x8f, 0x24, 0xa7, 0x34, 0x13, 0x24, 0x0f, 0x7c, 0x51, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c,
- 0xbb, 0x2c, 0x1b, 0x7c, 0x00, 0x7c, 0x00, 0x34, 0x00, 0x80, 0x14, 0x00, 0x00, 0x80, 0x5c, 0x00,
- 0x00, 0x54, 0x1f, 0x04, 0x1b, 0x04, 0x23, 0x7c, 0xbb, 0x5c, 0x13, 0x7c, 0x00, 0x3c, 0x00, 0x80,
- 0x20, 0x00, 0x00, 0x80, 0xc0, 0x00, 0x00, 0x04, 0x07, 0x44, 0x1f, 0x80, 0x5e, 0x00, 0x00, 0x04,
- 0x67, 0x80, 0x70, 0x00, 0x00, 0x34, 0x1b, 0x04, 0x13, 0x04, 0x1b, 0x04, 0x23, 0x7c, 0xb3, 0x2c,
- 0x1b, 0x24, 0x0f, 0x7c, 0x00, 0x2c, 0x00, 0x80, 0x21, 0x00, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x80,
- 0xea, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x00, 0x54, 0x27, 0x14, 0x9f, 0x24, 0xbb, 0x44, 0x13, 0x7c,
- 0xb3, 0x4c, 0x00, 0x7c, 0x00, 0x4c, 0xb3, 0x80, 0x2d, 0x00, 0x00, 0x74, 0x2f, 0x24, 0xa7, 0x64,
- 0xb3, 0x04, 0x00, 0x7c, 0xb3, 0x2c, 0x00, 0x7c, 0x00, 0x1c, 0xb3, 0x80, 0xe1, 0x00, 0x00, 0x80,
- 0xeb, 0x00, 0x00, 0x7c, 0xb3, 0x3c, 0xbb, 0x64, 0xb3, 0x7c, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x80,
- 0x0e, 0x00, 0x00, 0x7c, 0xb3, 0x7c, 0xb3, 0x7c, 0xb7, 0x7c, 0x00, 0x74, 0x00, 0x14, 0x00, 0x80,
- 0x3d, 0x00, 0x00, 0x80, 0xed, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x24, 0x17, 0x80, 0x22, 0x00,
- 0x00, 0x7c, 0xb3, 0x7e, 0x27, 0x76, 0x27, 0x7c, 0x00, 0x2c, 0x00, 0x14, 0x00, 0x80, 0x13, 0x00,
- 0x00, 0x80, 0xd0, 0x00, 0x00, 0x80, 0xf6, 0x00, 0x00, 0x14, 0xbb, 0x24, 0xb3, 0x80, 0x2e, 0x00,
- 0x00, 0x7c, 0x45, 0x7f, 0x97, 0x7c, 0xbb, 0x7c, 0x00, 0x04, 0x00, 0x54, 0xbb, 0x80, 0x63, 0x00,
- 0x00, 0x7c, 0xb3, 0x4c, 0x00, 0x80, 0x5e, 0x00, 0x00, 0x54, 0x9f, 0x14, 0xbb, 0x04, 0x23, 0x7c,
- 0x49, 0x5c, 0x00, 0x54, 0xbb, 0x04, 0x5b, 0x80, 0xec, 0x00, 0x00, 0x7c, 0xb3, 0x3c, 0x00, 0x80,
- 0x14, 0x00, 0x00, 0x80, 0x5c, 0x00, 0x00, 0x54, 0x1f, 0x04, 0x1b, 0x04, 0x23, 0x7c, 0x49, 0x5c,
- 0x00, 0x54, 0xbb, 0x80, 0xbc, 0x00, 0x00, 0x7c, 0xb3, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x44,
- 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x2c, 0x00, 0x7c, 0x00, 0x7c,
- 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x2c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c,
- 0x00, 0x7c, 0x00, 0x2c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x2c,
- 0x00,
-};
-
-static struct {
- int x, y, w, h;
-}atlas[] = {
- [MU_ICON_CHECK] = {0, 0, 18, 18},
- [MU_ICON_CLOSE] = {18, 0, 16, 16},
- [MU_ICON_COLLAPSED] = {34, 0, 5, 7},
- [MU_ICON_EXPANDED] = {39, 0, 7, 5},
- [ATLAS_DIMENSIONS] = {0, 0, 46, 18},
-};
--- a/demo/common.c
+++ /dev/null
@@ -1,249 +1,0 @@
-#ifdef __plan9__
-#include <u.h>
-#include <libc.h>
-#define sprintf sprint
-#define NULL nil
-#else
-#include <stdio.h>
-#include <string.h>
-#endif
-#include "common.h"
-
-
-static char logbuf[64000];
-static int logbuf_updated = 0;
-
-float bg[3] = { 90, 95, 100 };
-
-
-static void write_log(const char *text) {
- if (logbuf[0]) { strcat(logbuf, "\n"); }
- strcat(logbuf, text);
- logbuf_updated = 1;
-}
-
-#define text_width(s) (ctx->text_width(ctx->style->font, s, -1) + 6)
-#define text_height() ctx->text_height(ctx->style->font)
-
-static void test_window(mu_Context *ctx) {
- static mu_Container window;
-
- /* init window manually so we can set its position and size */
- if (!window.inited) {
- mu_init_window(ctx, &window, 0);
- window.rect = mu_rect(40, 40, 300, 450);
- }
-
- /* limit window to minimum size */
- window.rect.w = mu_max(window.rect.w, 240);
- window.rect.h = mu_max(window.rect.h, 300);
-
-
- /* do window */
- if (mu_begin_window(ctx, &window, "Demo Window")) {
-
- /* window info */
- static int show_info = 0;
- if (mu_header(ctx, &show_info, "Window Info")) {
- char buf[64];
- const int widths[] = { text_width("Position:"), -1 };
- mu_layout_row(ctx, 2, widths, 0);
- mu_label(ctx, "Position:");
- sprintf(buf, "%d, %d", window.rect.x, window.rect.y); mu_label(ctx, buf);
- mu_label(ctx, "Size:");
- sprintf(buf, "%d, %d", window.rect.w, window.rect.h); mu_label(ctx, buf);
- }
-
- /* labels + buttons */
- static int show_buttons = 1;
- if (mu_header(ctx, &show_buttons, "Test Buttons")) {
- const int widths[] = { 86, -110, -1 };
- mu_layout_row(ctx, 3, widths, 0);
- mu_label(ctx, "Test buttons 1:");
- if (mu_button(ctx, "Button 1")) { write_log("Pressed button 1"); }
- if (mu_button(ctx, "Button 2")) { write_log("Pressed button 2"); }
- mu_label(ctx, "Test buttons 2:");
- if (mu_button(ctx, "Button 3")) { write_log("Pressed button 3"); }
- if (mu_button(ctx, "Button 4")) { write_log("Pressed button 4"); }
- }
-
- /* tree */
- static int show_tree = 1;
- if (mu_header(ctx, &show_tree, "Tree and Text")) {
- int widths[] = { text_width("Test 1a")+text_height()*2+text_width("Button 3")+6, -1 };
- mu_layout_row(ctx, 2, widths, 0);
- mu_layout_begin_column(ctx);
- static int states[8];
- if (mu_begin_treenode(ctx, &states[0], "Test 1")) {
- if (mu_begin_treenode(ctx, &states[1], "Test 1a")) {
- mu_label(ctx, "Hello");
- mu_label(ctx, "world");
- mu_end_treenode(ctx);
- }
- if (mu_begin_treenode(ctx, &states[2], "Test 1b")) {
- if (mu_button(ctx, "Button 1")) { write_log("Pressed button 1"); }
- if (mu_button(ctx, "Button 2")) { write_log("Pressed button 2"); }
- mu_end_treenode(ctx);
- }
- mu_end_treenode(ctx);
- }
- if (mu_begin_treenode(ctx, &states[3], "Test 2")) {
- int widths[2];
- widths[0] = widths[1] = text_width("Button 3");
- mu_layout_row(ctx, 2, widths, 0);
- if (mu_button(ctx, "Button 3")) { write_log("Pressed button 3"); }
- if (mu_button(ctx, "Button 4")) { write_log("Pressed button 4"); }
- if (mu_button(ctx, "Button 5")) { write_log("Pressed button 5"); }
- if (mu_button(ctx, "Button 6")) { write_log("Pressed button 6"); }
- mu_end_treenode(ctx);
- }
- if (mu_begin_treenode(ctx, &states[4], "Test 3")) {
- static int checks[3] = { 1, 0, 1 };
- mu_checkbox(ctx, &checks[0], "Checkbox 1");
- mu_checkbox(ctx, &checks[1], "Checkbox 2");
- mu_checkbox(ctx, &checks[2], "Checkbox 3");
- mu_end_treenode(ctx);
- }
- mu_layout_end_column(ctx);
-
- mu_layout_begin_column(ctx);
- widths[0] = -1;
- mu_layout_row(ctx, 1, widths, 0);
- mu_text(ctx, "Lorem ipsum dolor sit amet, consectetur adipiscing "
- "elit. Maecenas lacinia, sem eu lacinia molestie, mi risus faucibus "
- "ipsum, eu varius magna felis a nulla.");
- mu_layout_end_column(ctx);
- }
-
- /* background color sliders */
- static int show_sliders = 1;
- if (mu_header(ctx, &show_sliders, "Background Color")) {
- int widths[] = { -78, -1 };
- mu_layout_row(ctx, 2, widths, 74);
- /* sliders */
- mu_layout_begin_column(ctx);
- widths[0] = text_width("Green:");
- mu_layout_row(ctx, 2, widths, 0);
- mu_label(ctx, "Red:"); mu_slider(ctx, &bg[0], 0, 255);
- mu_label(ctx, "Green:"); mu_slider(ctx, &bg[1], 0, 255);
- mu_label(ctx, "Blue:"); mu_slider(ctx, &bg[2], 0, 255);
- mu_layout_end_column(ctx);
- /* color preview */
- mu_Rect r = mu_layout_next(ctx);
- mu_draw_rect(ctx, r, mu_color(bg[0], bg[1], bg[2], 255));
- char buf[32];
- sprintf(buf, "#%02X%02X%02X", (int) bg[0], (int) bg[1], (int) bg[2]);
- mu_draw_control_text(ctx, buf, r, MU_COLOR_TEXT, MU_OPT_ALIGNCENTER);
- }
-
- mu_end_window(ctx);
- }
-}
-
-
-static void log_window(mu_Context *ctx) {
- static mu_Container window;
-
- /* init window manually so we can set its position and size */
- if (!window.inited) {
- mu_init_window(ctx, &window, 0);
- window.rect = mu_rect(350, 40, 300, 200);
- }
-
- if (mu_begin_window(ctx, &window, "Log Window")) {
- int widths[] = { -1, -1 };
-
- /* output text panel */
- static mu_Container panel;
- mu_layout_row(ctx, 1, widths, -28);
- mu_begin_panel(ctx, &panel);
- mu_layout_row(ctx, 1, widths, -1);
- mu_text(ctx, logbuf);
- mu_end_panel(ctx);
- if (logbuf_updated) {
- panel.scroll.y = panel.content_size.y;
- logbuf_updated = 0;
- }
-
- /* input textbox + submit button */
- static char buf[128];
- int submitted = 0;
- widths[0] = -text_width("Submit")-8;
- mu_layout_row(ctx, 2, widths, 0);
- if (mu_textbox(ctx, buf, sizeof(buf)) & MU_RES_SUBMIT) {
- mu_set_focus(ctx, ctx->last_id);
- submitted = 1;
- }
- if (mu_button(ctx, "Submit")) { submitted = 1; }
- if (submitted) {
- write_log(buf);
- buf[0] = '\0';
- }
-
- mu_end_window(ctx);
- }
-}
-
-
-static int uint8_slider(mu_Context *ctx, unsigned char *value, int low, int high) {
- static float tmp;
- mu_push_id(ctx, &value, sizeof(value));
- tmp = *value;
- int res = mu_slider_ex(ctx, &tmp, low, high, 0, "%.0f", MU_OPT_ALIGNCENTER);
- *value = tmp;
- mu_pop_id(ctx);
- return res;
-}
-
-
-static void style_window(mu_Context *ctx) {
- static mu_Container window;
-
- /* init window manually so we can set its position and size */
- if (!window.inited) {
- mu_init_window(ctx, &window, 0);
- window.rect = mu_rect(350, 250, 300, 240);
- }
-
- static struct { const char *label; int idx; } colors[] = {
- { "text:", MU_COLOR_TEXT },
- { "border:", MU_COLOR_BORDER },
- { "windowbg:", MU_COLOR_WINDOWBG },
- { "titlebg:", MU_COLOR_TITLEBG },
- { "titletext:", MU_COLOR_TITLETEXT },
- { "panelbg:", MU_COLOR_PANELBG },
- { "button:", MU_COLOR_BUTTON },
- { "buttonhover:", MU_COLOR_BUTTONHOVER },
- { "buttonfocus:", MU_COLOR_BUTTONFOCUS },
- { "base:", MU_COLOR_BASE },
- { "basehover:", MU_COLOR_BASEHOVER },
- { "basefocus:", MU_COLOR_BASEFOCUS },
- { "scrollbase:", MU_COLOR_SCROLLBASE },
- { "scrollthumb:", MU_COLOR_SCROLLTHUMB },
- { NULL }
- };
-
- if (mu_begin_window(ctx, &window, "Style Editor")) {
- int sw = mu_max(text_width("255"), mu_get_container(ctx)->body.w * 0.14);
- const int widths[] = { text_width("scrollthumb:"), sw, sw, sw, sw, -1 };
- mu_layout_row(ctx, 6, widths, 0);
- for (int i = 0; colors[i].label; i++) {
- mu_label(ctx, colors[i].label);
- uint8_slider(ctx, &ctx->style->colors[i].r, 0, 255);
- uint8_slider(ctx, &ctx->style->colors[i].g, 0, 255);
- uint8_slider(ctx, &ctx->style->colors[i].b, 0, 255);
- uint8_slider(ctx, &ctx->style->colors[i].a, 0, 255);
- mu_draw_rect(ctx, mu_layout_next(ctx), ctx->style->colors[i]);
- }
- mu_end_window(ctx);
- }
-}
-
-
-void process_frame(mu_Context *ctx) {
- mu_begin(ctx);
- test_window(ctx);
- log_window(ctx);
- style_window(ctx);
- mu_end(ctx);
-}
--- a/demo/common.h
+++ /dev/null
@@ -1,11 +1,0 @@
-#ifndef COMMON_H
-#define COMMON_H
-
-#include "microui.h"
-#include "renderer.h"
-
-extern float bg[3];
-
-void process_frame(mu_Context *ctx);
-
-#endif
--- /dev/null
+++ b/demo/frame.c
@@ -1,0 +1,224 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include "microui.h"
+
+static char logbuf[64000];
+static int logbuf_updated = 0;
+
+static void write_log(const char *text) {
+ if (logbuf[0]) { strcat(logbuf, "\n"); }
+ strcat(logbuf, text);
+ logbuf_updated = 1;
+}
+
+#define text_width(s) (stringwidth(ctx->style->font, s) + 6)
+#define text_height() ctx->style->font->height
+
+static void test_window(mu_Context *ctx) {
+ static mu_Container window;
+
+ /* init window manually so we can set its position and size */
+ if (!window.inited) {
+ mu_init_window(ctx, &window, 0);
+ window.rect = mu_rect(40, 40, 320, 500);
+ }
+
+ /* limit window to minimum size */
+ window.rect.w = mu_max(window.rect.w, 240);
+ window.rect.h = mu_max(window.rect.h, 300);
+
+
+ /* do window */
+ if (mu_begin_window(ctx, &window, "Demo Window")) {
+
+ /* window info */
+ static int show_info = 0;
+ if (mu_header(ctx, &show_info, "Window Info")) {
+ char buf[64];
+ const int widths[] = { text_width("Position:"), -1 };
+ mu_layout_row(ctx, 2, widths, 0);
+ mu_label(ctx, "Position:");
+ sprint(buf, "%d, %d", window.rect.x, window.rect.y); mu_label(ctx, buf);
+ mu_label(ctx, "Size:");
+ sprint(buf, "%d, %d", window.rect.w, window.rect.h); mu_label(ctx, buf);
+ }
+
+ /* labels + buttons */
+ static int show_buttons = 1;
+ if (mu_header(ctx, &show_buttons, "Test Buttons")) {
+ const int widths[] = { 86, -110, -1 };
+ mu_layout_row(ctx, 3, widths, 0);
+ mu_label(ctx, "Test buttons 1:");
+ if (mu_button(ctx, "Button 1")) { write_log("Pressed button 1"); }
+ if (mu_button(ctx, "Button 2")) { write_log("Pressed button 2"); }
+ mu_label(ctx, "Test buttons 2:");
+ if (mu_button(ctx, "Button 3")) { write_log("Pressed button 3"); }
+ if (mu_button(ctx, "Button 4")) { write_log("Pressed button 4"); }
+ }
+
+ /* tree */
+ static int show_tree = 1;
+ if (mu_header(ctx, &show_tree, "Tree and Text")) {
+ int widths[] = { text_width("Test 1a")+text_height()*2+text_width("Button 3")+6, -1 };
+ mu_layout_row(ctx, 2, widths, 0);
+ mu_layout_begin_column(ctx);
+ static int states[8];
+ if (mu_begin_treenode(ctx, &states[0], "Test 1")) {
+ if (mu_begin_treenode(ctx, &states[1], "Test 1a")) {
+ mu_label(ctx, "Hello");
+ mu_label(ctx, "world");
+ mu_end_treenode(ctx);
+ }
+ if (mu_begin_treenode(ctx, &states[2], "Test 1b")) {
+ if (mu_button(ctx, "Button 1")) { write_log("Pressed button 1"); }
+ if (mu_button(ctx, "Button 2")) { write_log("Pressed button 2"); }
+ mu_end_treenode(ctx);
+ }
+ mu_end_treenode(ctx);
+ }
+ if (mu_begin_treenode(ctx, &states[3], "Test 2")) {
+ int widths[2];
+ widths[0] = widths[1] = text_width("Button 3");
+ mu_layout_row(ctx, 2, widths, 0);
+ if (mu_button(ctx, "Button 3")) { write_log("Pressed button 3"); }
+ if (mu_button(ctx, "Button 4")) { write_log("Pressed button 4"); }
+ if (mu_button(ctx, "Button 5")) { write_log("Pressed button 5"); }
+ if (mu_button(ctx, "Button 6")) { write_log("Pressed button 6"); }
+ mu_end_treenode(ctx);
+ }
+ if (mu_begin_treenode(ctx, &states[4], "Test 3")) {
+ static int checks[3] = { 1, 0, 1 };
+ mu_checkbox(ctx, &checks[0], "Checkbox 1");
+ mu_checkbox(ctx, &checks[1], "Checkbox 2");
+ mu_checkbox(ctx, &checks[2], "Checkbox 3");
+ mu_end_treenode(ctx);
+ }
+ mu_layout_end_column(ctx);
+
+ mu_layout_begin_column(ctx);
+ widths[0] = -1;
+ mu_layout_row(ctx, 1, widths, 0);
+ mu_text(ctx, "Lorem ipsum dolor sit amet, consectetur adipiscing "
+ "elit. Maecenas lacinia, sem eu lacinia molestie, mi risus faucibus "
+ "ipsum, eu varius magna felis a nulla.");
+ mu_layout_end_column(ctx);
+ }
+
+ mu_end_window(ctx);
+ }
+}
+
+
+static void log_window(mu_Context *ctx) {
+ static mu_Container window;
+
+ /* init window manually so we can set its position and size */
+ if (!window.inited) {
+ mu_init_window(ctx, &window, 0);
+ window.rect = mu_rect(370, 40, 340, 200);
+ }
+
+ if (mu_begin_window(ctx, &window, "Log Window")) {
+ int widths[] = { -1, -1 };
+
+ /* output text panel */
+ static mu_Container panel;
+ mu_layout_row(ctx, 1, widths, -28);
+ mu_begin_panel(ctx, &panel);
+ mu_layout_row(ctx, 1, widths, -1);
+ mu_text(ctx, logbuf);
+ mu_end_panel(ctx);
+ if (logbuf_updated) {
+ panel.scroll.y = panel.content_size.y;
+ logbuf_updated = 0;
+ }
+
+ /* input textbox + submit button */
+ static char buf[128];
+ int submitted = 0;
+ widths[0] = -text_width("Submit")-8;
+ mu_layout_row(ctx, 2, widths, -1);
+ if (mu_textbox(ctx, buf, sizeof(buf)) & MU_RES_SUBMIT) {
+ mu_set_focus(ctx, ctx->last_id);
+ submitted = 1;
+ }
+ if (mu_button(ctx, "Submit")) { submitted = 1; }
+ if (submitted) {
+ write_log(buf);
+ buf[0] = '\0';
+ }
+
+ mu_end_window(ctx);
+ }
+}
+
+
+static int uint8_slider(mu_Context *ctx, unsigned char *value, int low, int high) {
+ static float tmp;
+ mu_push_id(ctx, &value, sizeof(value));
+ tmp = *value;
+ int res = mu_slider_ex(ctx, &tmp, low, high, 0, "%.0f", MU_OPT_ALIGNCENTER);
+ *value = tmp;
+ mu_pop_id(ctx);
+ return res;
+}
+
+static void style_window(mu_Context *ctx) {
+ static mu_Container window;
+ static u8int cur[MU_COLOR_MAX][4], old[MU_COLOR_MAX][4];
+ static struct { const char *label; int idx; } colors[] = {
+ { "background:", MU_COLOR_BG },
+ { "text:", MU_COLOR_TEXT },
+ { "border:", MU_COLOR_BORDER },
+ { "windowbg:", MU_COLOR_WINDOWBG },
+ { "titlebg:", MU_COLOR_TITLEBG },
+ { "titletext:", MU_COLOR_TITLETEXT },
+ { "panelbg:", MU_COLOR_PANELBG },
+ { "button:", MU_COLOR_BUTTON },
+ { "buttonhover:", MU_COLOR_BUTTONHOVER },
+ { "buttonfocus:", MU_COLOR_BUTTONFOCUS },
+ { "base:", MU_COLOR_BASE },
+ { "basehover:", MU_COLOR_BASEHOVER },
+ { "basefocus:", MU_COLOR_BASEFOCUS },
+ { "scrollbase:", MU_COLOR_SCROLLBASE },
+ { "scrollthumb:", MU_COLOR_SCROLLTHUMB },
+ { nil }
+ };
+
+ /* init window manually so we can set its position and size */
+ if (!window.inited) {
+ mu_init_window(ctx, &window, 0);
+ window.rect = mu_rect(370, 250, 340, 290);
+ memmove(cur, defaultcolors, sizeof(cur));
+ memmove(old, defaultcolors, sizeof(old));
+ }
+
+ if (mu_begin_window(ctx, &window, "Style Editor")) {
+ int sw = mu_max(text_width("255"), mu_get_container(ctx)->body.w * 0.14);
+ const int widths[] = { text_width("scrollthumb:"), sw, sw, sw, sw, -1 };
+ mu_layout_row(ctx, 6, widths, 0);
+ for (int i = 0; colors[i].label; i++) {
+ mu_label(ctx, colors[i].label);
+ uint8_slider(ctx, &cur[i][0], 0, 255);
+ uint8_slider(ctx, &cur[i][1], 0, 255);
+ uint8_slider(ctx, &cur[i][2], 0, 255);
+ uint8_slider(ctx, &cur[i][3], 0, 255);
+ if (memcmp(cur[i], old[i], 4) != 0) {
+ freeimage(ctx->style->colors[i]);
+ ctx->style->colors[i] = mu_color(cur[i][0], cur[i][1], cur[i][2], cur[i][3]);
+ memmove(old[i], cur[i], 4);
+ }
+ mu_draw_rect(ctx, mu_layout_next(ctx), ctx->style->colors[i]);
+ }
+ mu_end_window(ctx);
+ }
+}
+
+void process_frame(mu_Context *ctx) {
+ mu_begin(ctx);
+ test_window(ctx);
+ log_window(ctx);
+ style_window(ctx);
+ mu_end(ctx);
+}
binary files a/demo/icons/mu_icon_check.png /dev/null differ
binary files a/demo/icons/mu_icon_close.png /dev/null differ
binary files a/demo/icons/mu_icon_collapsed.png /dev/null differ
binary files a/demo/icons/mu_icon_expanded.png /dev/null differ
--- a/demo/mkfile
+++ b/demo/mkfile
@@ -2,16 +2,10 @@
TARG=demo
-CFLAGS=$CFLAGS -D__plan9__ -p -I../src
OFILES=\
- common.$O\
- microui.$O\
+ frame.$O\
plan9.$O\
- renderer_plan9.$O\
default:V: all
-
-microui.$O: ../src/microui.c
- $CC $CFLAGS $prereq
</sys/src/cmd/mkone
--- a/demo/plan9.c
+++ b/demo/plan9.c
@@ -5,14 +5,18 @@
#include <keyboard.h>
#include <thread.h>
#include <bio.h>
-#include "common.h"
+#include "microui.h"
-static Mousectl *mctl;
-static Keyboardctl *kctl;
+void process_frame(mu_Context *ctx);
void
threadmain(int argc, char **argv)
{
+ Mousectl *mctl;
+ char *s;
+ mu_Context *ctx;
+ Biobuf *snarf;
+ Keyboardctl *kctl;
Rune key;
Mouse m;
Alt a[] = {
@@ -22,12 +26,7 @@
{ nil, nil, CHANEND},
};
int oldbuttons, b, nkey, gotevent;
- char text[5], *s;
- mu_Command *cmd;
- mu_Context *ctx;
- Biobuf *snarf;
- char *oldcmds;
- int oldcmdsidx;
+ char text[5];
USED(argc); USED(argv);
@@ -47,36 +46,17 @@
ctx = malloc(sizeof(mu_Context));
mu_init(ctx);
- ctx->text_width = r_get_text_width;
- ctx->text_height = r_get_text_height;
- ctx->style->font = display->defaultfont;
- ctx->style->size.y = display->defaultfont->height;
+ ctx->style->font = font;
+ ctx->style->size.y = font->height;
ctx->style->title_height = ctx->style->size.y + 6;
- r_init();
process_frame(ctx);
oldbuttons = 0;
- oldcmds = malloc(sizeof(ctx->command_list.items));
- oldcmdsidx = -1;
for (;;) {
process_frame(ctx);
+ if (mu_render(ctx))
+ flushimage(display, 1);
- if (oldcmdsidx != ctx->command_list.idx || memcmp(oldcmds, ctx->command_list.items, oldcmdsidx) != 0) {
- oldcmdsidx = ctx->command_list.idx;
- memmove(oldcmds, ctx->command_list.items, oldcmdsidx);
- cmd = nil;
- r_clear(mu_color(bg[0], bg[1], bg[2], 255));
- while (mu_next_command(ctx, &cmd)) {
- switch (cmd->type) {
- case MU_COMMAND_TEXT: r_draw_text(ctx->style->font, cmd->text.str, cmd->text.pos, cmd->text.color); break;
- case MU_COMMAND_RECT: r_draw_rect(cmd->rect.rect, cmd->rect.color); break;
- case MU_COMMAND_ICON: r_draw_icon(cmd->icon.id, cmd->icon.rect, cmd->icon.color); break;
- case MU_COMMAND_CLIP: r_set_clip_rect(cmd->clip.rect); break;
- }
- }
- r_present();
- }
-
gotevent = 1;
switch (alt(a)) {
case 0: /* mouse */
@@ -101,7 +81,6 @@
case 1: /* resize */
getwindow(display, Refnone);
- oldcmdsidx = -1;
break;
case 2: /* keyboard */
--- a/demo/renderer.h
+++ /dev/null
@@ -1,15 +1,0 @@
-#ifndef RENDERER_H
-#define RENDERER_H
-
-void r_init(void);
-void r_draw_rect(mu_Rect rect, mu_Color color);
-void r_draw_text(mu_Font font, const char *text, mu_Vec2 pos, mu_Color color);
-void r_draw_icon(int id, mu_Rect rect, mu_Color color);
- int r_get_text_width(mu_Font font, const char *text, int len);
- int r_get_text_height(mu_Font font);
-void r_set_clip_rect(mu_Rect rect);
-void r_clear(mu_Color color);
-void r_present(void);
-
-#endif
-
--- a/demo/renderer_gl.c
+++ /dev/null
@@ -1,190 +1,0 @@
-#include <SDL2/SDL.h>
-#include <SDL2/SDL_opengl.h>
-#include <assert.h>
-#include "common.h"
-#include "atlas.inl"
-
-#define BUFFER_SIZE 16384
-#define unused(x) ((void) (x))
-
-static GLfloat tex_buf[BUFFER_SIZE * 8];
-static GLfloat vert_buf[BUFFER_SIZE * 8];
-static GLubyte color_buf[BUFFER_SIZE * 16];
-static GLuint index_buf[BUFFER_SIZE * 6];
-
-static int width = 800;
-static int height = 600;
-static int buf_idx;
-
-static SDL_Window *window;
-
-
-void r_init(void) {
- /* init SDL window */
- window = SDL_CreateWindow(
- NULL, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
- width, height, SDL_WINDOW_OPENGL);
- SDL_GL_CreateContext(window);
-
- /* init gl */
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glDisable(GL_CULL_FACE);
- glDisable(GL_DEPTH_TEST);
- glEnable(GL_SCISSOR_TEST);
- glEnable(GL_TEXTURE_2D);
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
-
- /* init texture */
- GLuint id;
- glGenTextures(1, &id);
- glBindTexture(GL_TEXTURE_2D, id);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, ATLAS_WIDTH, ATLAS_HEIGHT, 0,
- GL_ALPHA, GL_UNSIGNED_BYTE, atlas_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- assert(glGetError() == 0);
-}
-
-
-static void flush(void) {
- if (buf_idx == 0) { return; }
-
- glViewport(0, 0, width, height);
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glOrtho(0.0f, width, height, 0.0f, -1.0f, +1.0f);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
-
- glTexCoordPointer(2, GL_FLOAT, 0, tex_buf);
- glVertexPointer(2, GL_FLOAT, 0, vert_buf);
- glColorPointer(4, GL_UNSIGNED_BYTE, 0, color_buf);
- glDrawElements(GL_TRIANGLES, buf_idx * 6, GL_UNSIGNED_INT, index_buf);
-
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
-
- buf_idx = 0;
-}
-
-
-static void push_quad(mu_Rect dst, mu_Rect src, mu_Color color) {
- if (buf_idx == BUFFER_SIZE) { flush(); }
-
- int texvert_idx = buf_idx * 8;
- int color_idx = buf_idx * 16;
- int element_idx = buf_idx * 4;
- int index_idx = buf_idx * 6;
- buf_idx++;
-
- /* update texture buffer */
- float x = src.x / (float) ATLAS_WIDTH;
- float y = src.y / (float) ATLAS_HEIGHT;
- float w = src.w / (float) ATLAS_WIDTH;
- float h = src.h / (float) ATLAS_HEIGHT;
- tex_buf[texvert_idx + 0] = x;
- tex_buf[texvert_idx + 1] = y;
- tex_buf[texvert_idx + 2] = x + w;
- tex_buf[texvert_idx + 3] = y;
- tex_buf[texvert_idx + 4] = x;
- tex_buf[texvert_idx + 5] = y + h;
- tex_buf[texvert_idx + 6] = x + w;
- tex_buf[texvert_idx + 7] = y + h;
-
- /* update vertex buffer */
- vert_buf[texvert_idx + 0] = dst.x;
- vert_buf[texvert_idx + 1] = dst.y;
- vert_buf[texvert_idx + 2] = dst.x + dst.w;
- vert_buf[texvert_idx + 3] = dst.y;
- vert_buf[texvert_idx + 4] = dst.x;
- vert_buf[texvert_idx + 5] = dst.y + dst.h;
- vert_buf[texvert_idx + 6] = dst.x + dst.w;
- vert_buf[texvert_idx + 7] = dst.y + dst.h;
-
- /* update color buffer */
- memcpy(color_buf + color_idx + 0, &color, 4);
- memcpy(color_buf + color_idx + 4, &color, 4);
- memcpy(color_buf + color_idx + 8, &color, 4);
- memcpy(color_buf + color_idx + 12, &color, 4);
-
- /* update index buffer */
- index_buf[index_idx + 0] = element_idx + 0;
- index_buf[index_idx + 1] = element_idx + 1;
- index_buf[index_idx + 2] = element_idx + 2;
- index_buf[index_idx + 3] = element_idx + 2;
- index_buf[index_idx + 4] = element_idx + 3;
- index_buf[index_idx + 5] = element_idx + 1;
-}
-
-
-void r_draw_rect(mu_Rect rect, mu_Color color) {
- push_quad(rect, atlas[ATLAS_WHITE], color);
-}
-
-
-void r_draw_text(mu_Font font, const char *text, mu_Vec2 pos, mu_Color color) {
- mu_Rect dst = { pos.x, pos.y, 0, 0 };
- unused(font);
- for (const char *p = text; *p; p++) {
- if ((*p & 0xc0) == 0x80) { continue; }
- int chr = mu_min((unsigned char) *p, 127);
- mu_Rect src = atlas[ATLAS_FONT + chr];
- dst.w = src.w;
- dst.h = src.h;
- push_quad(dst, src, color);
- dst.x += dst.w;
- }
-}
-
-
-void r_draw_icon(int id, mu_Rect rect, mu_Color color) {
- mu_Rect src = atlas[id];
- int x = rect.x + (rect.w - src.w) / 2;
- int y = rect.y + (rect.h - src.h) / 2;
- push_quad(mu_rect(x, y, src.w, src.h), src, color);
-}
-
-
-int r_get_text_width(mu_Font font, const char *text, int len) {
- int res = 0;
- unused(font);
- if (len == -1) { len = strlen(text); }
- for (const char *p = text; *p && len--; p++) {
- if ((*p & 0xc0) == 0x80) { continue; }
- int chr = mu_min((unsigned char) *p, 127);
- res += atlas[ATLAS_FONT + chr].w;
- }
- return res;
-}
-
-
-int r_get_text_height(mu_Font font) {
- unused(font);
- return 18;
-}
-
-
-void r_set_clip_rect(mu_Rect rect) {
- flush();
- glScissor(rect.x, height - (rect.y + rect.h), rect.w, rect.h);
-}
-
-
-void r_clear(mu_Color clr) {
- flush();
- glClearColor(clr.r / 255., clr.g / 255., clr.b / 255., clr.a / 255.);
- glClear(GL_COLOR_BUFFER_BIT);
-}
-
-
-void r_present(void) {
- flush();
- SDL_GL_SwapWindow(window);
-}
--- a/demo/renderer_plan9.c
+++ /dev/null
@@ -1,139 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <draw.h>
-#include "common.h"
-#include "atlas_p9.h"
-
-enum
-{
- Maxcolors = 64,
-};
-
-static u32int rgba[Maxcolors];
-static u16int lastused[Maxcolors];
-static Image *colors[Maxcolors];
-static int numcolors = 0;
-static u16int frame = 0;
-static Image *atlasimage;
-
-static Image *
-getcolor(mu_Color color)
-{
- u32int c;
- int i;
- u16int diff, leasti;
-
- diff = 0;
- leasti = 0;
- c = setalpha(color.r<<24 | color.g<<16 | color.b<<8, color.a);
- if (c == DBlack)
- return display->black;
- if (c == DWhite)
- return display->white;
- for (i = 0; i < numcolors; i++) {
- if (rgba[i] == c) {
- lastused[i] = frame;
- return colors[i];
- }
- if (diff < frame - lastused[i]) {
- diff = frame - lastused[i];
- leasti = i;
- }
- }
- if (i >= nelem(colors)) {
- freeimage(colors[leasti]);
- rgba[leasti] = c;
- colors[leasti] = allocimage(display, Rect(0, 0, 1, 1), RGBA32, 1, c);
- lastused[leasti] = frame;
- return colors[leasti];
- }
-
- rgba[numcolors] = c;
- colors[numcolors] = allocimage(display, Rect(0, 0, 1, 1), RGBA32, 1, c);
- return colors[numcolors++];
-}
-
-static Rectangle
-screenrect(mu_Rect rect)
-{
- Rectangle r;
- r.min = screen->r.min;
- r.min.x += rect.x;
- r.min.y += rect.y;
- r.max = r.min;
- r.max.x += rect.w;
- r.max.y += rect.h;
- return r;
-}
-
-void
-r_init(void)
-{
- Rectangle r = Rect(0, 0, atlas[ATLAS_DIMENSIONS].w, atlas[ATLAS_DIMENSIONS].h);
- int res;
-
- atlasimage = allocimage(display, r, RGBA32, 1, DTransparent);
- if (memcmp(atlas_texture, "compressed\n", 11) == 0)
- res = cloadimage(atlasimage, r, atlas_texture+11+5*12, sizeof(atlas_texture)-11-5*12);
- else
- res = loadimage(atlasimage, r, atlas_texture, sizeof(atlas_texture));
- if (res < 0)
- sysfatal("failed to load atlas: %r");
-}
-
-void
-r_draw_rect(mu_Rect rect, mu_Color color)
-{
- draw(screen, screenrect(rect), getcolor(color), nil, ZP);
-}
-
-void
-r_draw_text(mu_Font font, const char *text, mu_Vec2 pos, mu_Color color) {
- string(screen, addpt(screen->r.min, Pt(pos.x, pos.y)), getcolor(color), ZP, font, text);
-}
-
-void
-r_draw_icon(int id, mu_Rect rect, mu_Color color)
-{
- Rectangle r;
- USED(color); /* FIXME no colors */
- rect.x += (rect.w - atlas[id].w) / 2;
- rect.y += (rect.h - atlas[id].h) / 2;
- rect.w = atlas[id].w;
- rect.h = atlas[id].h;
- r = screenrect(rect);
- draw(screen, r, atlasimage, nil, Pt(atlas[id].x, atlas[id].y));
-}
-
-int
-r_get_text_width(mu_Font font, const char *text, int len)
-{
- if (len < 0)
- len = strlen(text);
- return stringnwidth(font, text, len);
-}
-
-int
-r_get_text_height(mu_Font font)
-{
- return ((Font*)font)->height;
-}
-
-void
-r_set_clip_rect(mu_Rect rect)
-{
- replclipr(screen, 0, screenrect(rect));
-}
-
-void
-r_clear(mu_Color color)
-{
- draw(screen, screen->r, getcolor(color), nil, ZP);
-}
-
-void
-r_present(void)
-{
- flushimage(display, 1);
- frame++;
-}
--- a/demo/sdl2.c
+++ /dev/null
@@ -1,86 +1,0 @@
-#include <SDL2/SDL.h>
-#include "common.h"
-
-#define unused(x) ((void) (x))
-
-static const char button_map[256] = {
- [ SDL_BUTTON_LEFT & 0xff ] = MU_MOUSE_LEFT,
- [ SDL_BUTTON_RIGHT & 0xff ] = MU_MOUSE_RIGHT,
- [ SDL_BUTTON_MIDDLE & 0xff ] = MU_MOUSE_MIDDLE,
-};
-
-static const char key_map[256] = {
- [ SDLK_LSHIFT & 0xff ] = MU_KEY_SHIFT,
- [ SDLK_RSHIFT & 0xff ] = MU_KEY_SHIFT,
- [ SDLK_LCTRL & 0xff ] = MU_KEY_CTRL,
- [ SDLK_RCTRL & 0xff ] = MU_KEY_CTRL,
- [ SDLK_LALT & 0xff ] = MU_KEY_ALT,
- [ SDLK_RALT & 0xff ] = MU_KEY_ALT,
- [ SDLK_RETURN & 0xff ] = MU_KEY_RETURN,
- [ SDLK_BACKSPACE & 0xff ] = MU_KEY_BACKSPACE,
-};
-
-
-int main(int argc, char **argv) {
- mu_Font dummy = NULL;
-
- unused(argc); unused(argv);
-
- /* init SDL and renderer */
- SDL_Init(SDL_INIT_EVERYTHING);
- r_init();
-
- /* init microui */
- mu_Context *ctx = malloc(sizeof(mu_Context));
- mu_init(ctx);
- ctx->text_width = r_get_text_width;
- ctx->text_height = r_get_text_height;
-
- /* main loop */
- for (;;) {
- /* handle SDL events */
- SDL_Event e;
- while (SDL_PollEvent(&e)) {
- switch (e.type) {
- case SDL_QUIT: exit(EXIT_SUCCESS); break;
- case SDL_MOUSEMOTION: mu_input_mousemove(ctx, e.motion.x, e.motion.y); break;
- case SDL_MOUSEWHEEL: mu_input_scroll(ctx, 0, e.wheel.y * -30); break;
- case SDL_TEXTINPUT: mu_input_text(ctx, e.text.text); break;
-
- case SDL_MOUSEBUTTONDOWN:
- case SDL_MOUSEBUTTONUP: {
- int b = button_map[e.button.button & 0xff];
- if (b && e.type == SDL_MOUSEBUTTONDOWN) { mu_input_mousedown(ctx, e.button.x, e.button.y, b); }
- if (b && e.type == SDL_MOUSEBUTTONUP) { mu_input_mouseup(ctx, e.button.x, e.button.y, b); }
- break;
- }
-
- case SDL_KEYDOWN:
- case SDL_KEYUP: {
- int c = key_map[e.key.keysym.sym & 0xff];
- if (c && e.type == SDL_KEYDOWN) { mu_input_keydown(ctx, c); }
- if (c && e.type == SDL_KEYUP) { mu_input_keyup(ctx, c); }
- break;
- }
- }
- }
-
- /* process frame */
- process_frame(ctx);
-
- /* render */
- r_clear(mu_color(bg[0], bg[1], bg[2], 255));
- mu_Command *cmd = NULL;
- while (mu_next_command(ctx, &cmd)) {
- switch (cmd->type) {
- case MU_COMMAND_TEXT: r_draw_text(dummy, cmd->text.str, cmd->text.pos, cmd->text.color); break;
- case MU_COMMAND_RECT: r_draw_rect(cmd->rect.rect, cmd->rect.color); break;
- case MU_COMMAND_ICON: r_draw_icon(cmd->icon.id, cmd->icon.rect, cmd->icon.color); break;
- case MU_COMMAND_CLIP: r_set_clip_rect(cmd->clip.rect); break;
- }
- }
- r_present();
- }
-
- return 0;
-}
binary files /dev/null b/icons/mu_icon_check.png differ
binary files /dev/null b/icons/mu_icon_close.png differ
binary files /dev/null b/icons/mu_icon_collapsed.png differ
binary files /dev/null b/icons/mu_icon_expanded.png differ
--- /dev/null
+++ b/microui.c
@@ -1,0 +1,1309 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include "microui.h"
+
+#define expect(x) do { \
+ if (!(x)) { \
+ fprint(2, "Fatal error: %s:%d: assertion '%s' failed\n", __FILE__, __LINE__, #x); \
+ abort(); \
+ } \
+ } while (0)
+
+
+#define push(stk, val) do { \
+ expect((stk).idx < (int) (sizeof((stk).items) / sizeof(*(stk).items))); \
+ (stk).items[ (stk).idx ] = (val); \
+ (stk).idx++; \
+ } while (0)
+
+
+#define pop(stk) do { \
+ expect((stk).idx > 0); \
+ (stk).idx--; \
+ } while (0)
+
+
+static mu_Rect unclipped_rect = { 0, 0, 0x1000000, 0x1000000 };
+
+static mu_Style default_style = {
+ .font = nil,
+ .size = { 68, 10 },
+ .padding = 6,
+ .spacing = 4,
+ .indent = 24,
+ .title_height = 26,
+ .scrollbar_size = 12,
+ .thumb_size = 8,
+ .colors = {nil},
+};
+
+static u8int atlasraw[] = {
+ 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x72, 0x38,
+ 0x67, 0x38, 0x62, 0x38, 0x61, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0x36, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x31, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x31, 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0x38, 0x36, 0x20, 0x80,
+ 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x78, 0x00, 0x80, 0xff, 0x00, 0x00, 0x80, 0x8f, 0x00,
+ 0x00, 0x74, 0x13, 0x04, 0x0f, 0x04, 0x17, 0x7c, 0x51, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x14,
+ 0x8f, 0x24, 0xa7, 0x34, 0x13, 0x24, 0x0f, 0x7c, 0x51, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c,
+ 0xbb, 0x2c, 0x1b, 0x7c, 0x00, 0x7c, 0x00, 0x34, 0x00, 0x80, 0x14, 0x00, 0x00, 0x80, 0x5c, 0x00,
+ 0x00, 0x54, 0x1f, 0x04, 0x1b, 0x04, 0x23, 0x7c, 0xbb, 0x5c, 0x13, 0x7c, 0x00, 0x3c, 0x00, 0x80,
+ 0x20, 0x00, 0x00, 0x80, 0xc0, 0x00, 0x00, 0x04, 0x07, 0x44, 0x1f, 0x80, 0x5e, 0x00, 0x00, 0x04,
+ 0x67, 0x80, 0x70, 0x00, 0x00, 0x34, 0x1b, 0x04, 0x13, 0x04, 0x1b, 0x04, 0x23, 0x7c, 0xb3, 0x2c,
+ 0x1b, 0x24, 0x0f, 0x7c, 0x00, 0x2c, 0x00, 0x80, 0x21, 0x00, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x80,
+ 0xea, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x00, 0x54, 0x27, 0x14, 0x9f, 0x24, 0xbb, 0x44, 0x13, 0x7c,
+ 0xb3, 0x4c, 0x00, 0x7c, 0x00, 0x4c, 0xb3, 0x80, 0x2d, 0x00, 0x00, 0x74, 0x2f, 0x24, 0xa7, 0x64,
+ 0xb3, 0x04, 0x00, 0x7c, 0xb3, 0x2c, 0x00, 0x7c, 0x00, 0x1c, 0xb3, 0x80, 0xe1, 0x00, 0x00, 0x80,
+ 0xeb, 0x00, 0x00, 0x7c, 0xb3, 0x3c, 0xbb, 0x64, 0xb3, 0x7c, 0x00, 0x3c, 0x00, 0x24, 0x00, 0x80,
+ 0x0e, 0x00, 0x00, 0x7c, 0xb3, 0x7c, 0xb3, 0x7c, 0xb7, 0x7c, 0x00, 0x74, 0x00, 0x14, 0x00, 0x80,
+ 0x3d, 0x00, 0x00, 0x80, 0xed, 0x00, 0x00, 0x80, 0x45, 0x00, 0x00, 0x24, 0x17, 0x80, 0x22, 0x00,
+ 0x00, 0x7c, 0xb3, 0x7e, 0x27, 0x76, 0x27, 0x7c, 0x00, 0x2c, 0x00, 0x14, 0x00, 0x80, 0x13, 0x00,
+ 0x00, 0x80, 0xd0, 0x00, 0x00, 0x80, 0xf6, 0x00, 0x00, 0x14, 0xbb, 0x24, 0xb3, 0x80, 0x2e, 0x00,
+ 0x00, 0x7c, 0x45, 0x7f, 0x97, 0x7c, 0xbb, 0x7c, 0x00, 0x04, 0x00, 0x54, 0xbb, 0x80, 0x63, 0x00,
+ 0x00, 0x7c, 0xb3, 0x4c, 0x00, 0x80, 0x5e, 0x00, 0x00, 0x54, 0x9f, 0x14, 0xbb, 0x04, 0x23, 0x7c,
+ 0x49, 0x5c, 0x00, 0x54, 0xbb, 0x04, 0x5b, 0x80, 0xec, 0x00, 0x00, 0x7c, 0xb3, 0x3c, 0x00, 0x80,
+ 0x14, 0x00, 0x00, 0x80, 0x5c, 0x00, 0x00, 0x54, 0x1f, 0x04, 0x1b, 0x04, 0x23, 0x7c, 0x49, 0x5c,
+ 0x00, 0x54, 0xbb, 0x80, 0xbc, 0x00, 0x00, 0x7c, 0xb3, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x44,
+ 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x2c, 0x00, 0x7c, 0x00, 0x7c,
+ 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x2c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c,
+ 0x00, 0x7c, 0x00, 0x2c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x2c,
+ 0x00,
+};
+
+static mu_Rect default_atlas_icons[] = {
+ [MU_ICON_CHECK] = {0, 0, 18, 18},
+ [MU_ICON_CLOSE] = {18, 0, 16, 16},
+ [MU_ICON_COLLAPSED] = {34, 0, 5, 7},
+ [MU_ICON_EXPANDED] = {39, 0, 7, 5},
+ [ATLAS_DIMENSIONS] = {0, 0, 46, 18},
+};
+
+Image *atlasimage = nil;
+mu_Rect *atlasicons = default_atlas_icons;
+u8int defaultcolors[MU_COLOR_MAX][4] = {
+ [MU_COLOR_BG] = {119, 119, 119, 255},
+ [MU_COLOR_TEXT] = {230, 230, 230, 255},
+ [MU_COLOR_BORDER] = {25, 25, 25, 255},
+ [MU_COLOR_WINDOWBG] = {50, 50, 50, 255},
+ [MU_COLOR_TITLEBG] = {25, 25, 25, 255},
+ [MU_COLOR_TITLETEXT] = {240, 240, 240, 255},
+ [MU_COLOR_PANELBG] = {0, 0, 0, 0},
+ [MU_COLOR_BUTTON] = {75, 75, 75, 255},
+ [MU_COLOR_BUTTONHOVER] = {95, 95, 95, 255},
+ [MU_COLOR_BUTTONFOCUS] = {115, 115, 115, 255},
+ [MU_COLOR_BASE] = {30, 30, 30, 255},
+ [MU_COLOR_BASEHOVER] = {35, 35, 35, 255},
+ [MU_COLOR_BASEFOCUS] = {40, 40, 40, 255},
+ [MU_COLOR_SCROLLBASE] = {43, 43, 43, 255},
+ [MU_COLOR_SCROLLTHUMB] = {30, 30, 30, 255},
+};
+
+mu_Rect mu_rect(int x, int y, int w, int h) {
+ mu_Rect res;
+ res.x = x, res.y = y, res.w = w, res.h = h;
+ return res;
+}
+
+Image *
+mu_color(u8int r, u8int g, u8int b, u8int a)
+{
+ Image *c;
+ if ((c = allocimage(display, Rect(0, 0, 1, 1), RGBA32, 1, setalpha(r<<24 | g<<16 | b<<8, a))) == nil)
+ sysfatal("couldn't allocate color");
+ return c;
+}
+
+static Rectangle
+screenrect(mu_Rect r)
+{
+ Rectangle rect;
+ rect.min = screen->r.min;
+ rect.min.x += r.x;
+ rect.min.y += r.y;
+ rect.max = rect.min;
+ rect.max.x += r.w;
+ rect.max.y += r.h;
+ return rect;
+}
+
+static mu_Rect expand_rect(mu_Rect rect, int n) {
+ return mu_rect(rect.x - n, rect.y - n, rect.w + n * 2, rect.h + n * 2);
+}
+
+
+static mu_Rect clip_rect(mu_Rect r1, mu_Rect r2) {
+ int x1 = mu_max(r1.x, r2.x);
+ int y1 = mu_max(r1.y, r2.y);
+ int x2 = mu_min(r1.x + r1.w, r2.x + r2.w);
+ int y2 = mu_min(r1.y + r1.h, r2.y + r2.h);
+ if (x2 < x1) { x2 = x1; }
+ if (y2 < y1) { y2 = y1; }
+ return mu_rect(x1, y1, x2 - x1, y2 - y1);
+}
+
+
+static int rect_overlaps_vec2(mu_Rect r, Point p) {
+ return p.x >= r.x && p.x < r.x + r.w && p.y >= r.y && p.y < r.y + r.h;
+}
+
+static void
+draw_frame(mu_Context *ctx, mu_Rect rect, int colorid)
+{
+ mu_draw_rect(ctx, rect, ctx->style->colors[colorid]);
+ if (colorid == MU_COLOR_SCROLLBASE ||
+ colorid == MU_COLOR_SCROLLTHUMB ||
+ colorid == MU_COLOR_TITLEBG) { return; }
+ /* draw border */
+ mu_draw_box(ctx, expand_rect(rect, 1), ctx->style->colors[MU_COLOR_BORDER]);
+}
+
+static int
+text_width(Font *font, const char *text, int len)
+{
+ return stringnwidth(font, text, len >= 0 ? len : strlen(text));
+}
+
+void
+mu_init(mu_Context *ctx)
+{
+ Rectangle r;
+ int res, i;
+
+ if (atlasimage == nil) {
+ r = Rect(0, 0, atlasicons[ATLAS_DIMENSIONS].w, atlasicons[ATLAS_DIMENSIONS].h);
+ atlasimage = allocimage(display, r, RGBA32, 1, DTransparent);
+ if (memcmp(atlasraw, "compressed\n", 11) == 0)
+ res = cloadimage(atlasimage, r, atlasraw+11+5*12, sizeof(atlasraw)-11-5*12);
+ else
+ res = loadimage(atlasimage, r, atlasraw, sizeof(atlasraw));
+ if (res < 0)
+ sysfatal("failed to load atlas: %r");
+ }
+
+ if (default_style.colors[0] == nil) {
+ for (i = 0; i < MU_COLOR_MAX; i++) {
+ default_style.colors[i] = mu_color(
+ defaultcolors[i][0],
+ defaultcolors[i][1],
+ defaultcolors[i][2],
+ defaultcolors[i][3]
+ );
+ }
+ }
+
+ memset(ctx, 0, sizeof(*ctx));
+ memmove(&ctx->_style, &default_style, sizeof(default_style));
+ ctx->style = &ctx->_style;
+}
+
+void mu_begin(mu_Context *ctx) {
+ ctx->command_list.idx = 0;
+ ctx->root_list.idx = 0;
+ ctx->scroll_target = nil;
+ ctx->last_hover_root = ctx->hover_root;
+ ctx->hover_root = nil;
+ ctx->mouse_delta.x = ctx->mouse_pos.x - ctx->last_mouse_pos.x;
+ ctx->mouse_delta.y = ctx->mouse_pos.y - ctx->last_mouse_pos.y;
+}
+
+
+static int compare_zindex(const void *a, const void *b) {
+ return (*(mu_Container**) a)->zindex - (*(mu_Container**) b)->zindex;
+}
+
+
+void mu_end(mu_Context *ctx) {
+ int i, n;
+ /* check stacks */
+ expect(ctx->container_stack.idx == 0);
+ expect(ctx->clip_stack.idx == 0);
+ expect(ctx->id_stack.idx == 0);
+ expect(ctx->layout_stack.idx == 0);
+
+ /* handle scroll input */
+ if (ctx->scroll_target) {
+ ctx->scroll_target->scroll.x += ctx->scroll_delta.x;
+ ctx->scroll_target->scroll.y += ctx->scroll_delta.y;
+ }
+
+ /* unset focus if focus id was not touched this frame */
+ if (!ctx->updated_focus) { ctx->focus = 0; }
+ ctx->updated_focus = 0;
+
+ /* bring hover root to front if mouse was pressed */
+ if (ctx->mouse_pressed && ctx->hover_root &&
+ ctx->hover_root->zindex < ctx->last_zindex)
+ {
+ mu_bring_to_front(ctx, ctx->hover_root);
+ }
+
+ /* reset input state */
+ ctx->key_pressed = 0;
+ ctx->text_input[0] = '\0';
+ ctx->mouse_pressed = 0;
+ ctx->scroll_delta = ZP;
+ ctx->last_mouse_pos = ctx->mouse_pos;
+
+ /* sort root containers by zindex */
+ n = ctx->root_list.idx;
+ qsort(ctx->root_list.items, n, sizeof(mu_Container*), compare_zindex);
+
+ /* set root container jump commands */
+ for (i = 0; i < n; i++) {
+ mu_Container *cnt = ctx->root_list.items[i];
+ /* if this is the first container then make the first command jump to it.
+ ** otherwise set the previous container's tail to jump to this one */
+ if (i == 0) {
+ mu_Command *cmd = (mu_Command*) ctx->command_list.items;
+ cmd->jump.dst = (char*) cnt->head + sizeof(mu_JumpCommand);
+ } else {
+ mu_Container *prev = ctx->root_list.items[i - 1];
+ prev->tail->jump.dst = (char*) cnt->head + sizeof(mu_JumpCommand);
+ }
+ /* make the last container's tail jump to the end of command list */
+ if (i == n - 1) {
+ cnt->tail->jump.dst = ctx->command_list.items + ctx->command_list.idx;
+ }
+ }
+}
+
+
+void mu_set_focus(mu_Context *ctx, mu_Id id) {
+ ctx->focus = id;
+ ctx->updated_focus = 1;
+}
+
+
+/* 32bit fnv-1a hash */
+#define HASH_INITIAL 2166136261
+
+static void hash(mu_Id *hash, const void *data, int size) {
+ const unsigned char *p = data;
+ while (size--) {
+ *hash = (*hash ^ *p++) * 16777619;
+ }
+}
+
+
+mu_Id mu_get_id(mu_Context *ctx, const void *data, int size) {
+ int idx = ctx->id_stack.idx;
+ mu_Id res = (idx > 0) ? ctx->id_stack.items[idx - 1] : HASH_INITIAL;
+ hash(&res, data, size);
+ ctx->last_id = res;
+ return res;
+}
+
+
+void mu_push_id(mu_Context *ctx, const void *data, int size) {
+ push(ctx->id_stack, mu_get_id(ctx, data, size));
+}
+
+
+void mu_pop_id(mu_Context *ctx) {
+ pop(ctx->id_stack);
+}
+
+
+void mu_push_clip_rect(mu_Context *ctx, mu_Rect rect) {
+ mu_Rect last = mu_get_clip_rect(ctx);
+ push(ctx->clip_stack, clip_rect(rect, last));
+}
+
+
+void mu_pop_clip_rect(mu_Context *ctx) {
+ pop(ctx->clip_stack);
+}
+
+
+mu_Rect mu_get_clip_rect(mu_Context *ctx) {
+ expect(ctx->clip_stack.idx > 0);
+ return ctx->clip_stack.items[ ctx->clip_stack.idx - 1 ];
+}
+
+
+int mu_check_clip(mu_Context *ctx, mu_Rect r) {
+ mu_Rect cr = mu_get_clip_rect(ctx);
+ if (r.x > cr.x + cr.w || r.x + r.w < cr.x ||
+ r.y > cr.y + cr.h || r.y + r.h < cr.y ) { return MU_CLIP_ALL; }
+ if (r.x >= cr.x && r.x + r.w <= cr.x + cr.w &&
+ r.y >= cr.y && r.y + r.h <= cr.y + cr.h ) { return MU_CLIP_NONE; }
+ return MU_CLIP_PART;
+}
+
+
+static void push_layout(mu_Context *ctx, mu_Rect body, Point scroll) {
+ mu_Layout layout;
+ int width = 0;
+ memset(&layout, 0, sizeof(mu_Layout));
+ layout.body = mu_rect(body.x - scroll.x, body.y - scroll.y, body.w, body.h);
+ layout.max = Pt(-0x1000000, -0x1000000);
+ push(ctx->layout_stack, layout);
+ mu_layout_row(ctx, 1, &width, 0);
+}
+
+
+static mu_Layout* get_layout(mu_Context *ctx) {
+ return &ctx->layout_stack.items[ctx->layout_stack.idx - 1];
+}
+
+
+static void push_container(mu_Context *ctx, mu_Container *cnt) {
+ push(ctx->container_stack, cnt);
+ mu_push_id(ctx, &cnt, sizeof(mu_Container*));
+}
+
+
+static void pop_container(mu_Context *ctx) {
+ mu_Container *cnt = mu_get_container(ctx);
+ mu_Layout *layout = get_layout(ctx);
+ cnt->content_size.x = layout->max.x - layout->body.x;
+ cnt->content_size.y = layout->max.y - layout->body.y;
+ /* pop container, layout and id */
+ pop(ctx->container_stack);
+ pop(ctx->layout_stack);
+ mu_pop_id(ctx);
+}
+
+
+mu_Container* mu_get_container(mu_Context *ctx) {
+ expect(ctx->container_stack.idx > 0);
+ return ctx->container_stack.items[ ctx->container_stack.idx - 1 ];
+}
+
+
+void mu_init_window(mu_Context *ctx, mu_Container *cnt, int opt) {
+ memset(cnt, 0, sizeof(*cnt));
+ cnt->inited = 1;
+ cnt->open = opt & MU_OPT_CLOSED ? 0 : 1;
+ cnt->rect = mu_rect(100, 100, 300, 300);
+ mu_bring_to_front(ctx, cnt);
+}
+
+
+void mu_bring_to_front(mu_Context *ctx, mu_Container *cnt) {
+ cnt->zindex = ++ctx->last_zindex;
+}
+
+
+/*============================================================================
+** input handlers
+**============================================================================*/
+
+void mu_input_mousemove(mu_Context *ctx, int x, int y) {
+ ctx->mouse_pos = Pt(x, y);
+}
+
+
+void mu_input_mousedown(mu_Context *ctx, int x, int y, int btn) {
+ mu_input_mousemove(ctx, x, y);
+ ctx->mouse_down |= btn;
+ ctx->mouse_pressed |= btn;
+}
+
+
+void mu_input_mouseup(mu_Context *ctx, int x, int y, int btn) {
+ mu_input_mousemove(ctx, x, y);
+ ctx->mouse_down &= ~btn;
+}
+
+
+void mu_input_scroll(mu_Context *ctx, int x, int y) {
+ ctx->scroll_delta.x += x;
+ ctx->scroll_delta.y += y;
+}
+
+
+void mu_input_keydown(mu_Context *ctx, int key) {
+ ctx->key_pressed |= key;
+ ctx->key_down |= key;
+}
+
+
+void mu_input_keyup(mu_Context *ctx, int key) {
+ ctx->key_down &= ~key;
+}
+
+
+void mu_input_text(mu_Context *ctx, const char *text) {
+ int len = strlen(ctx->text_input);
+ int size = strlen(text) + 1;
+ expect(len + size <= (int) sizeof(ctx->text_input));
+ memcpy(ctx->text_input + len, text, size);
+}
+
+/*============================================================================
+** commandlist
+**============================================================================*/
+
+mu_Command* mu_push_command(mu_Context *ctx, int type, int size) {
+ mu_Command *cmd = (mu_Command*) (ctx->command_list.items + ctx->command_list.idx);
+ expect(ctx->command_list.idx + size < MU_COMMANDLIST_SIZE);
+ cmd->base.type = type;
+ cmd->base.size = size;
+ ctx->command_list.idx += size;
+ return cmd;
+}
+
+
+int mu_next_command(mu_Context *ctx, mu_Command **cmd) {
+ if (*cmd) {
+ *cmd = (mu_Command*) (((char*) *cmd) + (*cmd)->base.size);
+ } else {
+ *cmd = (mu_Command*) ctx->command_list.items;
+ }
+ while ((char*) *cmd != ctx->command_list.items + ctx->command_list.idx) {
+ if ((*cmd)->type != MU_COMMAND_JUMP) { return 1; }
+ *cmd = (*cmd)->jump.dst;
+ }
+ return 0;
+}
+
+
+static mu_Command* push_jump(mu_Context *ctx, mu_Command *dst) {
+ mu_Command *cmd;
+ cmd = mu_push_command(ctx, MU_COMMAND_JUMP, sizeof(mu_JumpCommand));
+ cmd->jump.dst = dst;
+ return cmd;
+}
+
+
+void mu_set_clip(mu_Context *ctx, mu_Rect rect) {
+ mu_Command *cmd;
+ cmd = mu_push_command(ctx, MU_COMMAND_CLIP, sizeof(mu_ClipCommand));
+ cmd->clip.rect = rect;
+}
+
+
+void mu_draw_rect(mu_Context *ctx, mu_Rect rect, Image *color) {
+ mu_Command *cmd;
+ rect = clip_rect(rect, mu_get_clip_rect(ctx));
+ if (rect.w > 0 && rect.h > 0) {
+ cmd = mu_push_command(ctx, MU_COMMAND_RECT, sizeof(mu_RectCommand));
+ cmd->rect.rect = rect;
+ cmd->rect.color = color;
+ }
+}
+
+
+void mu_draw_box(mu_Context *ctx, mu_Rect rect, Image *color) {
+ mu_draw_rect(ctx, mu_rect(rect.x + 1, rect.y, rect.w - 2, 1), color);
+ mu_draw_rect(ctx, mu_rect(rect.x+1, rect.y + rect.h-1, rect.w-2, 1), color);
+ mu_draw_rect(ctx, mu_rect(rect.x, rect.y, 1, rect.h), color);
+ mu_draw_rect(ctx, mu_rect(rect.x + rect.w - 1, rect.y, 1, rect.h), color);
+}
+
+
+void mu_draw_text(mu_Context *ctx, Font *font, const char *str, int len,
+ Point pos, Image *color)
+{
+ mu_Command *cmd;
+ mu_Rect rect = mu_rect(pos.x, pos.y, text_width(font, str, len), font->height);
+ int clipped = mu_check_clip(ctx, rect);
+ if (clipped == MU_CLIP_ALL ) { return; }
+ if (clipped == MU_CLIP_PART) { mu_set_clip(ctx, mu_get_clip_rect(ctx)); }
+ /* add command */
+ if (len < 0) { len = strlen(str); }
+ cmd = mu_push_command(ctx, MU_COMMAND_TEXT, sizeof(mu_TextCommand) + len);
+ memcpy(cmd->text.str, str, len);
+ cmd->text.str[len] = '\0';
+ cmd->text.pos = pos;
+ cmd->text.color = color;
+ cmd->text.font = font;
+ /* reset clipping if it was set */
+ if (clipped) { mu_set_clip(ctx, unclipped_rect); }
+}
+
+
+void mu_draw_icon(mu_Context *ctx, int id, mu_Rect rect) {
+ mu_Command *cmd;
+ /* do clip command if the rect isn't fully contained within the cliprect */
+ int clipped = mu_check_clip(ctx, rect);
+ if (clipped == MU_CLIP_ALL ) { return; }
+ if (clipped == MU_CLIP_PART) { mu_set_clip(ctx, mu_get_clip_rect(ctx)); }
+ /* do icon command */
+ cmd = mu_push_command(ctx, MU_COMMAND_ICON, sizeof(mu_IconCommand));
+ cmd->icon.id = id;
+ cmd->icon.rect = rect;
+ /* reset clipping if it was set */
+ if (clipped) { mu_set_clip(ctx, unclipped_rect); }
+}
+
+
+/*============================================================================
+** layout
+**============================================================================*/
+
+enum { RELATIVE = 1, ABSOLUTE = 2 };
+
+
+void mu_layout_begin_column(mu_Context *ctx) {
+ push_layout(ctx, mu_layout_next(ctx), ZP);
+}
+
+
+void mu_layout_end_column(mu_Context *ctx) {
+ mu_Layout *a, *b;
+ b = get_layout(ctx);
+ pop(ctx->layout_stack);
+ /* inherit position/next_row/max from child layout if they are greater */
+ a = get_layout(ctx);
+ a->position.x = mu_max(a->position.x, b->position.x + b->body.x - a->body.x);
+ a->next_row = mu_max(a->next_row, b->next_row + b->body.y - a->body.y);
+ a->max.x = mu_max(a->max.x, b->max.x);
+ a->max.y = mu_max(a->max.y, b->max.y);
+}
+
+
+void mu_layout_row(mu_Context *ctx, int items, const int *widths, int height) {
+ mu_Layout *layout = get_layout(ctx);
+ if (widths) {
+ expect(items <= MU_MAX_WIDTHS);
+ memcpy(layout->widths, widths, items * sizeof(widths[0]));
+ }
+ layout->items = items;
+ layout->position = Pt(layout->indent, layout->next_row);
+ layout->size.y = height;
+ layout->row_index = 0;
+}
+
+
+void mu_layout_width(mu_Context *ctx, int width) {
+ get_layout(ctx)->size.x = width;
+}
+
+
+void mu_layout_height(mu_Context *ctx, int height) {
+ get_layout(ctx)->size.y = height;
+}
+
+
+void mu_layout_set_next(mu_Context *ctx, mu_Rect r, int relative) {
+ mu_Layout *layout = get_layout(ctx);
+ layout->next = r;
+ layout->next_type = relative ? RELATIVE : ABSOLUTE;
+}
+
+
+mu_Rect mu_layout_next(mu_Context *ctx) {
+ mu_Layout *layout = get_layout(ctx);
+ mu_Style *style = ctx->style;
+ mu_Rect res;
+
+ if (layout->next_type) {
+ /* handle rect set by `mu_layout_set_next` */
+ int type = layout->next_type;
+ layout->next_type = 0;
+ res = layout->next;
+ if (type == ABSOLUTE) {
+ ctx->last_rect = res;
+ return res;
+ }
+
+ } else {
+ /* handle next row */
+ if (layout->row_index == layout->items) {
+ mu_layout_row(ctx, layout->items, nil, layout->size.y);
+ }
+
+ /* position */
+ res.x = layout->position.x;
+ res.y = layout->position.y;
+
+ /* size */
+ res.w =
+ layout->items > -1 ? layout->widths[layout->row_index] : layout->size.x;
+ res.h = layout->size.y;
+ if (res.w == 0) { res.w = style->size.x + style->padding * 2; }
+ if (res.h == 0) { res.h = style->size.y + style->padding * 2; }
+ if (res.w < 0) { res.w += layout->body.w - res.x + 1; }
+ if (res.h < 0) { res.h += layout->body.h - res.y + 1; }
+
+ layout->row_index++;
+ }
+
+ /* update position */
+ layout->position.x += res.w + style->spacing;
+ layout->next_row = mu_max(layout->next_row, res.y + res.h + style->spacing);
+
+ /* apply body offset */
+ res.x += layout->body.x;
+ res.y += layout->body.y;
+
+ /* update max position */
+ layout->max.x = mu_max(layout->max.x, res.x + res.w);
+ layout->max.y = mu_max(layout->max.y, res.y + res.h);
+
+ ctx->last_rect = res;
+ return res;
+}
+
+
+/*============================================================================
+** controls
+**============================================================================*/
+
+static int in_hover_root(mu_Context *ctx) {
+ int i = ctx->container_stack.idx;
+ while (i--) {
+ if (ctx->container_stack.items[i] == ctx->last_hover_root) { return 1; }
+ /* only root containers have their `head` field set; stop searching if we've
+ ** reached the current root container */
+ if (ctx->container_stack.items[i]->head) { break; }
+ }
+ return 0;
+}
+
+
+void mu_draw_control_frame(mu_Context *ctx, mu_Id id, mu_Rect rect,
+ int colorid, int opt)
+{
+ if (opt & MU_OPT_NOFRAME) { return; }
+ colorid += (ctx->focus == id) ? 2 : (ctx->hover == id) ? 1 : 0;
+ draw_frame(ctx, rect, colorid);
+}
+
+
+void mu_draw_control_text(mu_Context *ctx, const char *str, mu_Rect rect,
+ int colorid, int opt)
+{
+ Point pos;
+ Font *font = ctx->style->font;
+ int tw = text_width(font, str, -1);
+ mu_push_clip_rect(ctx, rect);
+ pos.y = rect.y + (rect.h - font->height) / 2;
+ if (opt & MU_OPT_ALIGNCENTER) {
+ pos.x = rect.x + (rect.w - tw) / 2;
+ } else if (opt & MU_OPT_ALIGNRIGHT) {
+ pos.x = rect.x + rect.w - tw - ctx->style->padding;
+ } else {
+ pos.x = rect.x + ctx->style->padding;
+ }
+ mu_draw_text(ctx, font, str, -1, pos, ctx->style->colors[colorid]);
+ mu_pop_clip_rect(ctx);
+}
+
+
+int mu_mouse_over(mu_Context *ctx, mu_Rect rect) {
+ return rect_overlaps_vec2(rect, ctx->mouse_pos) &&
+ rect_overlaps_vec2(mu_get_clip_rect(ctx), ctx->mouse_pos) &&
+ in_hover_root(ctx);
+}
+
+
+void mu_update_control(mu_Context *ctx, mu_Id id, mu_Rect rect, int opt) {
+ int mouseover = mu_mouse_over(ctx, rect);
+
+ if (ctx->focus == id) { ctx->updated_focus = 1; }
+ if (opt & MU_OPT_NOINTERACT) { return; }
+ if (mouseover && !ctx->mouse_down) { ctx->hover = id; }
+
+ if (ctx->focus == id) {
+ if (ctx->mouse_pressed && !mouseover) { mu_set_focus(ctx, 0); }
+ if (!ctx->mouse_down && ~opt & MU_OPT_HOLDFOCUS) { mu_set_focus(ctx, 0); }
+ }
+
+ if (ctx->hover == id) {
+ if (!mouseover) {
+ ctx->hover = 0;
+ } else if (ctx->mouse_pressed) {
+ mu_set_focus(ctx, id);
+ }
+ }
+}
+
+
+void mu_text(mu_Context *ctx, const char *text) {
+ const char *start, *end, *p = text;
+ int width = -1;
+ Font *font = ctx->style->font;
+ Image *color = ctx->style->colors[MU_COLOR_TEXT];
+ mu_layout_begin_column(ctx);
+ mu_layout_row(ctx, 1, &width, font->height);
+ do {
+ mu_Rect r = mu_layout_next(ctx);
+ int w = 0;
+ start = end = p;
+ do {
+ const char* word = p;
+ while (*p && *p != ' ' && *p != '\n') { p++; }
+ w += text_width(font, word, p - word);
+ if (w > r.w && end != start) { break; }
+ w += text_width(font, p, 1);
+ end = p++;
+ } while (*end && *end != '\n');
+ mu_draw_text(ctx, font, start, end - start, Pt(r.x, r.y), color);
+ p = end + 1;
+ } while (*end);
+ mu_layout_end_column(ctx);
+}
+
+
+void mu_label(mu_Context *ctx, const char *text) {
+ mu_draw_control_text(ctx, text, mu_layout_next(ctx), MU_COLOR_TEXT, 0);
+}
+
+
+int mu_button_ex(mu_Context *ctx, const char *label, int icon, int opt) {
+ int res = 0;
+ mu_Id id = label ? mu_get_id(ctx, label, strlen(label))
+ : mu_get_id(ctx, &icon, sizeof(icon));
+ mu_Rect r = mu_layout_next(ctx);
+ mu_update_control(ctx, id, r, opt);
+ /* handle click */
+ if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id) {
+ res |= MU_RES_SUBMIT;
+ }
+ /* draw */
+ mu_draw_control_frame(ctx, id, r, MU_COLOR_BUTTON, opt);
+ if (label) { mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, opt); }
+ if (icon) { mu_draw_icon(ctx, icon, r); }
+ return res;
+}
+
+
+int mu_button(mu_Context *ctx, const char *label) {
+ return mu_button_ex(ctx, label, 0, MU_OPT_ALIGNCENTER);
+}
+
+
+int mu_checkbox(mu_Context *ctx, int *state, const char *label) {
+ int res = 0;
+ mu_Id id = mu_get_id(ctx, &state, sizeof(state));
+ mu_Rect r = mu_layout_next(ctx);
+ mu_Rect box = mu_rect(r.x, r.y, r.h, r.h);
+ mu_update_control(ctx, id, r, 0);
+ /* handle click */
+ if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id) {
+ res |= MU_RES_CHANGE;
+ *state = !*state;
+ }
+ /* draw */
+ mu_draw_control_frame(ctx, id, box, MU_COLOR_BASE, 0);
+ if (*state) {
+ mu_draw_icon(ctx, MU_ICON_CHECK, box);
+ }
+ r = mu_rect(r.x + box.w, r.y, r.w - box.w, r.h);
+ mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, 0);
+ return res;
+}
+
+
+int mu_textbox_raw(mu_Context *ctx, char *buf, int bufsz, mu_Id id, mu_Rect r,
+ int opt)
+{
+ int res = 0;
+ mu_update_control(ctx, id, r, opt | MU_OPT_HOLDFOCUS);
+
+ if (ctx->focus == id) {
+ /* handle text input */
+ int len = strlen(buf);
+ int n = mu_min(bufsz - len - 1, (int) strlen(ctx->text_input));
+ if (n > 0) {
+ memcpy(buf + len, ctx->text_input, n);
+ len += n;
+ buf[len] = '\0';
+ res |= MU_RES_CHANGE;
+ }
+ /* handle backspace */
+ if (ctx->key_pressed & MU_KEY_BACKSPACE && len > 0) {
+ /* skip utf-8 continuation bytes */
+ while ((buf[--len] & 0xc0) == 0x80 && len > 0);
+ buf[len] = '\0';
+ res |= MU_RES_CHANGE;
+ }
+ if (ctx->key_pressed & MU_KEY_NACK && len > 0) {
+ buf[0] = '\0';
+ res |= MU_RES_CHANGE;
+ }
+ /* handle return */
+ if (ctx->key_pressed & MU_KEY_RETURN) {
+ mu_set_focus(ctx, 0);
+ res |= MU_RES_SUBMIT;
+ }
+ }
+
+ /* draw */
+ mu_draw_control_frame(ctx, id, r, MU_COLOR_BASE, opt);
+ if (ctx->focus == id) {
+ Image *color = ctx->style->colors[MU_COLOR_TEXT];
+ Font *font = ctx->style->font;
+ int textw = text_width(font, buf, -1);
+ int texth = font->height;
+ int ofx = r.w - ctx->style->padding - textw - 1;
+ int textx = r.x + mu_min(ofx, ctx->style->padding);
+ int texty = r.y + (r.h - texth) / 2;
+ mu_push_clip_rect(ctx, r);
+ mu_draw_text(ctx, font, buf, -1, Pt(textx, texty), color);
+ mu_draw_rect(ctx, mu_rect(textx + textw, texty, 1, texth), color);
+ mu_pop_clip_rect(ctx);
+ } else {
+ mu_draw_control_text(ctx, buf, r, MU_COLOR_TEXT, opt);
+ }
+
+ return res;
+}
+
+
+static int number_textbox(mu_Context *ctx, float *value, mu_Rect r, mu_Id id) {
+ if (((ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->key_down & MU_KEY_SHIFT)
+ ||
+ ctx->mouse_pressed == MU_MOUSE_RIGHT
+ ) &&
+ ctx->hover == id)
+ {
+ ctx->number_editing = id;
+ sprint(ctx->number_buf, MU_REAL_FMT, *value);
+ }
+ if (ctx->number_editing == id) {
+ int res = mu_textbox_raw(
+ ctx, ctx->number_buf, sizeof(ctx->number_buf), id, r, 0);
+ if (res & MU_RES_SUBMIT || ctx->focus != id) {
+ *value = strtod(ctx->number_buf, nil);
+ ctx->number_editing = 0;
+ } else {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+int mu_textbox_ex(mu_Context *ctx, char *buf, int bufsz, int opt) {
+ mu_Id id = mu_get_id(ctx, &buf, sizeof(buf));
+ mu_Rect r = mu_layout_next(ctx);
+ return mu_textbox_raw(ctx, buf, bufsz, id, r, opt);
+}
+
+
+int mu_textbox(mu_Context *ctx, char *buf, int bufsz) {
+ return mu_textbox_ex(ctx, buf, bufsz, 0);
+}
+
+
+int mu_slider_ex(mu_Context *ctx, float *value, float low, float high,
+ float step, const char *fmt, int opt)
+{
+ char buf[MU_MAX_FMT + 1];
+ mu_Rect thumb;
+ int w, res = 0;
+ float normalized, last = *value, v = last;
+ mu_Id id = mu_get_id(ctx, &value, sizeof(value));
+ mu_Rect base = mu_layout_next(ctx);
+
+ /* handle text input mode */
+ if (number_textbox(ctx, &v, base, id)) { return res; }
+
+ /* handle normal mode */
+ mu_update_control(ctx, id, base, opt);
+
+ /* handle input */
+ if (ctx->focus == id) {
+ if (ctx->mouse_down == MU_MOUSE_LEFT) {
+ v = low + ((float) (ctx->mouse_pos.x - base.x) / base.w) * (high - low);
+ }
+ } else if (ctx->hover == id) {
+ if ((ctx->key_pressed & (MU_KEY_LEFT | MU_KEY_RIGHT)) == MU_KEY_LEFT) {
+ v -= step ? step : 1;
+ if (v < low) v = low;
+ } else if ((ctx->key_pressed & (MU_KEY_LEFT | MU_KEY_RIGHT)) == MU_KEY_RIGHT) {
+ v += step ? step : 1;
+ if (v > high) v = high;
+ }
+ }
+
+ if (step) { v = ((long) ((v + step/2) / step)) * step; }
+ /* clamp and store value, update res */
+ *value = v = mu_clamp(v, low, high);
+ if (last != v) { res |= MU_RES_CHANGE; }
+
+ /* draw base */
+ mu_draw_control_frame(ctx, id, base, MU_COLOR_BASE, opt);
+ /* draw thumb */
+ w = ctx->style->thumb_size;
+ normalized = (v - low) / (high - low);
+ thumb = mu_rect(base.x + normalized * (base.w - w), base.y, w, base.h);
+ mu_draw_control_frame(ctx, id, thumb, MU_COLOR_BUTTON, opt);
+ /* draw text */
+ sprint(buf, fmt, v);
+ mu_draw_control_text(ctx, buf, base, MU_COLOR_TEXT, opt);
+
+ return res;
+}
+
+
+int mu_slider(mu_Context *ctx, float *value, float low, float high) {
+ return mu_slider_ex(ctx, value, low, high, 0, MU_SLIDER_FMT, MU_OPT_ALIGNCENTER);
+}
+
+
+int mu_number_ex(mu_Context *ctx, float *value, float step,
+ const char *fmt,int opt)
+{
+ char buf[MU_MAX_FMT + 1];
+ int res = 0;
+ mu_Id id = mu_get_id(ctx, &value, sizeof(value));
+ mu_Rect base = mu_layout_next(ctx);
+ float last = *value;
+
+ /* handle text input mode */
+ if (number_textbox(ctx, value, base, id)) { return res; }
+
+ /* handle normal mode */
+ mu_update_control(ctx, id, base, opt);
+
+ /* handle input */
+ if (ctx->focus == id && ctx->mouse_down == MU_MOUSE_LEFT) {
+ *value += ctx->mouse_delta.x * step;
+ }
+ /* set flag if value changed */
+ if (*value != last) { res |= MU_RES_CHANGE; }
+
+ /* draw base */
+ mu_draw_control_frame(ctx, id, base, MU_COLOR_BASE, opt);
+ /* draw text */
+ sprint(buf, fmt, *value);
+ mu_draw_control_text(ctx, buf, base, MU_COLOR_TEXT, opt);
+
+ return res;
+}
+
+
+int mu_number(mu_Context *ctx, float *value, float step) {
+ return mu_number_ex(ctx, value, step, MU_SLIDER_FMT, MU_OPT_ALIGNCENTER);
+}
+
+
+static int header(mu_Context *ctx, int *state, const char *label,
+ int istreenode)
+{
+ mu_Rect r;
+ mu_Id id;
+ int width = -1;
+ mu_layout_row(ctx, 1, &width, 0);
+ r = mu_layout_next(ctx);
+ id = mu_get_id(ctx, &state, sizeof(state));
+ mu_update_control(ctx, id, r, 0);
+ /* handle click */
+ if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id) {
+ *state = !(*state);
+ }
+ /* draw */
+ if (istreenode) {
+ if (ctx->hover == id) { draw_frame(ctx, r, MU_COLOR_BUTTONHOVER); }
+ } else {
+ mu_draw_control_frame(ctx, id, r, MU_COLOR_BUTTON, 0);
+ }
+ mu_draw_icon(
+ ctx, *state ? MU_ICON_EXPANDED : MU_ICON_COLLAPSED,
+ mu_rect(r.x, r.y, r.h, r.h));
+ r.x += r.h - ctx->style->padding;
+ r.w -= r.h - ctx->style->padding;
+ mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, 0);
+ return *state ? MU_RES_ACTIVE : 0;
+}
+
+
+int mu_header(mu_Context *ctx, int *state, const char *label) {
+ return header(ctx, state, label, 0);
+}
+
+
+int mu_begin_treenode(mu_Context *ctx, int *state, const char *label) {
+ int res = header(ctx, state, label, 1);
+ if (res & MU_RES_ACTIVE) {
+ get_layout(ctx)->indent += ctx->style->indent;
+ mu_push_id(ctx, &state, sizeof(void*));
+ }
+ return res;
+}
+
+
+void mu_end_treenode(mu_Context *ctx) {
+ get_layout(ctx)->indent -= ctx->style->indent;
+ mu_pop_id(ctx);
+}
+
+
+#define scrollbar(ctx, cnt, b, cs, x, y, w, h) \
+ do { \
+ /* only add scrollbar if content size is larger than body */ \
+ int maxscroll = cs.y - b->h; \
+ \
+ if (maxscroll > 0 && b->h > 0) { \
+ mu_Rect base, thumb; \
+ mu_Id id = mu_get_id(ctx, "!scrollbar" #y, 11); \
+ \
+ /* get sizing / positioning */ \
+ base = *b; \
+ base.x = b->x + b->w; \
+ base.w = ctx->style->scrollbar_size; \
+ \
+ /* handle input */ \
+ mu_update_control(ctx, id, base, 0); \
+ if (ctx->focus == id && ctx->mouse_down == MU_MOUSE_LEFT) { \
+ cnt->scroll.y += ctx->mouse_delta.y * cs.y / base.h; \
+ } \
+ /* clamp scroll to limits */ \
+ cnt->scroll.y = mu_clamp(cnt->scroll.y, 0, maxscroll); \
+ \
+ /* draw base and thumb */ \
+ draw_frame(ctx, base, MU_COLOR_SCROLLBASE); \
+ thumb = base; \
+ thumb.h = mu_max(ctx->style->thumb_size, base.h * b->h / cs.y); \
+ thumb.y += cnt->scroll.y * (base.h - thumb.h) / maxscroll; \
+ draw_frame(ctx, thumb, MU_COLOR_SCROLLTHUMB); \
+ \
+ /* set this as the scroll_target (will get scrolled on mousewheel) */ \
+ /* if the mouse is over it */ \
+ if (mu_mouse_over(ctx, *b)) { ctx->scroll_target = cnt; } \
+ } else { \
+ cnt->scroll.y = 0; \
+ } \
+ } while (0)
+
+
+static void scrollbars(mu_Context *ctx, mu_Container *cnt, mu_Rect *body) {
+ int sz = ctx->style->scrollbar_size;
+ Point cs = cnt->content_size;
+ cs.x += ctx->style->padding * 2;
+ cs.y += ctx->style->padding * 2;
+ mu_push_clip_rect(ctx, *body);
+ /* resize body to make room for scrollbars */
+ if (cs.y > cnt->body.h) { body->w -= sz; }
+ if (cs.x > cnt->body.w) { body->h -= sz; }
+ /* to create a horizontal or vertical scrollbar almost-identical code is
+ ** used; only the references to `x|y` `w|h` need to be switched */
+ scrollbar(ctx, cnt, body, cs, x, y, w, h);
+ scrollbar(ctx, cnt, body, cs, y, x, h, w);
+ mu_pop_clip_rect(ctx);
+}
+
+
+static void push_container_body(
+ mu_Context *ctx, mu_Container *cnt, mu_Rect body, int opt
+) {
+ if (~opt & MU_OPT_NOSCROLL) { scrollbars(ctx, cnt, &body); }
+ push_layout(ctx, expand_rect(body, -ctx->style->padding), cnt->scroll);
+ cnt->body = body;
+}
+
+
+static void begin_root_container(mu_Context *ctx, mu_Container *cnt) {
+ push_container(ctx, cnt);
+
+ /* push container to roots list and push head command */
+ push(ctx->root_list, cnt);
+ cnt->head = push_jump(ctx, nil);
+
+ /* set as hover root if the mouse is overlapping this container and it has a
+ ** higher zindex than the current hover root */
+ if (rect_overlaps_vec2(cnt->rect, ctx->mouse_pos) &&
+ (!ctx->hover_root || cnt->zindex > ctx->hover_root->zindex))
+ {
+ ctx->hover_root = cnt;
+ }
+ /* clipping is reset here in case a root-container is made within
+ ** another root-containers's begin/end block; this prevents the inner
+ ** root-container being clipped to the outer */
+ push(ctx->clip_stack, unclipped_rect);
+}
+
+
+static void end_root_container(mu_Context *ctx) {
+ /* push tail 'goto' jump command and set head 'skip' command. the final steps
+ ** on initing these are done in mu_end() */
+ mu_Container *cnt = mu_get_container(ctx);
+ cnt->tail = push_jump(ctx, nil);
+ cnt->head->jump.dst = ctx->command_list.items + ctx->command_list.idx;
+ /* pop base clip rect and container */
+ mu_pop_clip_rect(ctx);
+ pop_container(ctx);
+}
+
+
+int mu_begin_window_ex(mu_Context *ctx, mu_Container *cnt, const char *title,
+ int opt)
+{
+ mu_Rect rect, body, titlerect;
+
+ if (!cnt->inited) { mu_init_window(ctx, cnt, opt); }
+ if (!cnt->open) { return 0; }
+
+ begin_root_container(ctx, cnt);
+ rect = cnt->rect;
+ body = rect;
+
+ /* draw frame */
+ if (~opt & MU_OPT_NOFRAME) {
+ draw_frame(ctx, rect, MU_COLOR_WINDOWBG);
+ }
+
+ /* do title bar */
+ titlerect = rect;
+ titlerect.h = ctx->style->title_height;
+ if (~opt & MU_OPT_NOTITLE) {
+ draw_frame(ctx, titlerect, MU_COLOR_TITLEBG);
+
+ /* do title text */
+ if (~opt & MU_OPT_NOTITLE) {
+ mu_Id id = mu_get_id(ctx, "!title", 6);
+ mu_update_control(ctx, id, titlerect, opt);
+ mu_draw_control_text(ctx, title, titlerect, MU_COLOR_TITLETEXT, opt);
+ if (id == ctx->focus && ctx->mouse_down == MU_MOUSE_LEFT) {
+ cnt->rect.x += ctx->mouse_delta.x;
+ cnt->rect.y += ctx->mouse_delta.y;
+ }
+ body.y += titlerect.h;
+ body.h -= titlerect.h;
+ }
+
+ /* do `close` button */
+ if (~opt & MU_OPT_NOCLOSE) {
+ mu_Id id = mu_get_id(ctx, "!close", 6);
+ mu_Rect r = mu_rect(
+ titlerect.x + titlerect.w - titlerect.h,
+ titlerect.y, titlerect.h, titlerect.h);
+ titlerect.w -= r.w;
+ mu_draw_icon(ctx, MU_ICON_CLOSE, r);
+ mu_update_control(ctx, id, r, opt);
+ if (ctx->mouse_pressed == MU_MOUSE_LEFT && id == ctx->focus) {
+ cnt->open = 0;
+ }
+ }
+ }
+
+ push_container_body(ctx, cnt, body, opt);
+
+ /* do `resize` handle */
+ if (~opt & MU_OPT_NORESIZE) {
+ int sz = ctx->style->scrollbar_size;
+ mu_Id id = mu_get_id(ctx, "!resize", 7);
+ mu_Rect r = mu_rect(rect.x + rect.w - sz, rect.y + rect.h - sz, sz, sz);
+ mu_update_control(ctx, id, r, opt);
+ if (id == ctx->focus && ctx->mouse_down == MU_MOUSE_LEFT) {
+ cnt->rect.w = mu_max(96, cnt->rect.w + ctx->mouse_delta.x);
+ cnt->rect.h = mu_max(64, cnt->rect.h + ctx->mouse_delta.y);
+ }
+ }
+
+ /* resize to content size */
+ if (opt & MU_OPT_AUTOSIZE) {
+ mu_Rect r = get_layout(ctx)->body;
+ cnt->rect.w = cnt->content_size.x + (cnt->rect.w - r.w);
+ cnt->rect.h = cnt->content_size.y + (cnt->rect.h - r.h);
+ }
+
+ /* close if this is a popup window and elsewhere was clicked */
+ if (opt & MU_OPT_POPUP && ctx->mouse_pressed && ctx->last_hover_root != cnt) {
+ cnt->open = 0;
+ }
+
+ mu_push_clip_rect(ctx, cnt->body);
+ return MU_RES_ACTIVE;
+}
+
+
+int mu_begin_window(mu_Context *ctx, mu_Container *cnt, const char *title) {
+ return mu_begin_window_ex(ctx, cnt, title, 0);
+}
+
+
+void mu_end_window(mu_Context *ctx) {
+ mu_pop_clip_rect(ctx);
+ end_root_container(ctx);
+}
+
+
+void mu_open_popup(mu_Context *ctx, mu_Container *cnt) {
+ /* set as hover root so popup isn't closed in begin_window_ex() */
+ ctx->last_hover_root = ctx->hover_root = cnt;
+ /* init container if not inited */
+ if (!cnt->inited) { mu_init_window(ctx, cnt, 0); }
+ /* position at mouse cursor, open and bring-to-front */
+ cnt->rect = mu_rect(ctx->mouse_pos.x, ctx->mouse_pos.y, 0, 0);
+ cnt->open = 1;
+ mu_bring_to_front(ctx, cnt);
+}
+
+
+int mu_begin_popup(mu_Context *ctx, mu_Container *cnt) {
+ int opt = MU_OPT_POPUP | MU_OPT_AUTOSIZE | MU_OPT_NORESIZE |
+ MU_OPT_NOSCROLL | MU_OPT_NOTITLE | MU_OPT_CLOSED;
+ return mu_begin_window_ex(ctx, cnt, "", opt);
+}
+
+
+void mu_end_popup(mu_Context *ctx) {
+ mu_end_window(ctx);
+}
+
+
+void mu_begin_panel_ex(mu_Context *ctx, mu_Container *cnt, int opt) {
+ cnt->rect = mu_layout_next(ctx);
+ if (~opt & MU_OPT_NOFRAME) {
+ draw_frame(ctx, cnt->rect, MU_COLOR_PANELBG);
+ }
+ push_container(ctx, cnt);
+ push_container_body(ctx, cnt, cnt->rect, opt);
+ mu_push_clip_rect(ctx, cnt->body);
+}
+
+
+void mu_begin_panel(mu_Context *ctx, mu_Container *cnt) {
+ mu_begin_panel_ex(ctx, cnt, 0);
+}
+
+
+void mu_end_panel(mu_Context *ctx) {
+ mu_pop_clip_rect(ctx);
+ pop_container(ctx);
+}
+
+int
+mu_render(mu_Context *ctx)
+{
+ mu_Command *cmd;
+ mu_Rect r, i;
+
+ if (memcmp(&ctx->screen, &screen->r, sizeof(ctx->screen)) != 0)
+ ctx->screen = screen->r;
+ else if (ctx->old_command_list.idx == ctx->command_list.idx && memcmp(ctx->old_command_list.items, ctx->command_list.items, ctx->command_list.idx) == 0)
+ return 0;
+
+ ctx->old_command_list.idx = ctx->command_list.idx;
+ memmove(ctx->old_command_list.items, ctx->command_list.items, ctx->command_list.idx);
+ cmd = nil;
+ if (ctx->style->colors[MU_COLOR_BG] != nil)
+ draw(screen, screen->r, ctx->style->colors[MU_COLOR_BG], nil, ZP);
+ while (mu_next_command(ctx, &cmd)) {
+ switch (cmd->type) {
+ case MU_COMMAND_TEXT:
+ if (cmd->text.color != nil)
+ string(screen, addpt(screen->r.min, cmd->text.pos), cmd->text.color, ZP, ctx->style->font, cmd->text.str);
+ break;
+
+ case MU_COMMAND_RECT:
+ if (cmd->rect.color != nil)
+ draw(screen, screenrect(cmd->rect.rect), cmd->rect.color, nil, ZP);
+ break;
+
+ case MU_COMMAND_ICON:
+ r = cmd->icon.rect;
+ i = atlasicons[cmd->icon.id];
+ r.x += (r.w - i.w) / 2;
+ r.y += (r.h - i.h) / 2;
+ r.w = i.w;
+ r.h = i.h;
+ draw(screen, screenrect(r), atlasimage, nil, Pt(i.x, i.y));
+ break;
+
+ case MU_COMMAND_CLIP:
+ replclipr(screen, 0, screenrect(cmd->clip.rect));
+ break;
+ }
+ }
+
+ return 1;
+}
--- /dev/null
+++ b/microui.h
@@ -1,0 +1,274 @@
+#pragma lib "libmicroui.a"
+
+#define MU_COMMANDLIST_SIZE (1024 * 256)
+#define MU_ROOTLIST_SIZE 32
+#define MU_CONTAINERSTACK_SIZE 32
+#define MU_CLIPSTACK_SIZE 32
+#define MU_IDSTACK_SIZE 32
+#define MU_LAYOUTSTACK_SIZE 16
+#define MU_MAX_WIDTHS 16
+#define MU_REAL_FMT "%.3g"
+#define MU_SLIDER_FMT "%.2f"
+#define MU_MAX_FMT 127
+
+#define mu_stack(T, n) struct { int idx; T items[n]; }
+#define mu_min(a, b) ((a) < (b) ? (a) : (b))
+#define mu_max(a, b) ((a) > (b) ? (a) : (b))
+#define mu_clamp(x, a, b) mu_min(b, mu_max(a, x))
+
+enum {
+ MU_CLIP_NONE,
+ MU_CLIP_PART,
+ MU_CLIP_ALL
+};
+
+enum {
+ MU_COMMAND_JUMP = 1,
+ MU_COMMAND_CLIP,
+ MU_COMMAND_RECT,
+ MU_COMMAND_TEXT,
+ MU_COMMAND_ICON,
+ MU_COMMAND_MAX
+};
+
+enum {
+ MU_COLOR_BG,
+ MU_COLOR_TEXT,
+ MU_COLOR_BORDER,
+ MU_COLOR_WINDOWBG,
+ MU_COLOR_TITLEBG,
+ MU_COLOR_TITLETEXT,
+ MU_COLOR_PANELBG,
+ MU_COLOR_BUTTON,
+ MU_COLOR_BUTTONHOVER,
+ MU_COLOR_BUTTONFOCUS,
+ MU_COLOR_BASE,
+ MU_COLOR_BASEHOVER,
+ MU_COLOR_BASEFOCUS,
+ MU_COLOR_SCROLLBASE,
+ MU_COLOR_SCROLLTHUMB,
+ MU_COLOR_MAX
+};
+
+enum {
+ MU_ICON_CHECK,
+ MU_ICON_CLOSE,
+ MU_ICON_COLLAPSED,
+ MU_ICON_EXPANDED,
+ ATLAS_DIMENSIONS,
+};
+
+enum {
+ MU_RES_ACTIVE = (1 << 0),
+ MU_RES_SUBMIT = (1 << 1),
+ MU_RES_CHANGE = (1 << 2)
+};
+
+enum {
+ MU_OPT_ALIGNCENTER = (1 << 0),
+ MU_OPT_ALIGNRIGHT = (1 << 1),
+ MU_OPT_NOINTERACT = (1 << 2),
+ MU_OPT_NOFRAME = (1 << 3),
+ MU_OPT_NORESIZE = (1 << 4),
+ MU_OPT_NOSCROLL = (1 << 5),
+ MU_OPT_NOCLOSE = (1 << 6),
+ MU_OPT_NOTITLE = (1 << 7),
+ MU_OPT_HOLDFOCUS = (1 << 8),
+ MU_OPT_AUTOSIZE = (1 << 9),
+ MU_OPT_POPUP = (1 << 10),
+ MU_OPT_CLOSED = (1 << 11)
+};
+
+enum {
+ MU_MOUSE_LEFT = (1 << 0),
+ MU_MOUSE_RIGHT = (1 << 1),
+ MU_MOUSE_MIDDLE = (1 << 2)
+};
+
+enum {
+ MU_KEY_SHIFT = (1 << 0),
+ MU_KEY_CTRL = (1 << 1),
+ MU_KEY_ALT = (1 << 2),
+ MU_KEY_BACKSPACE = (1 << 3),
+ MU_KEY_RETURN = (1 << 4),
+ MU_KEY_NACK = (1 << 5),
+ MU_KEY_LEFT = (1 << 6),
+ MU_KEY_RIGHT = (1 << 7),
+};
+
+
+typedef struct mu_Context mu_Context;
+typedef unsigned mu_Id;
+
+typedef struct { int x, y, w, h; } mu_Rect;
+
+typedef struct { int type, size; } mu_BaseCommand;
+typedef struct { mu_BaseCommand base; void *dst; } mu_JumpCommand;
+typedef struct { mu_BaseCommand base; mu_Rect rect; } mu_ClipCommand;
+typedef struct { mu_BaseCommand base; mu_Rect rect; Image *color; } mu_RectCommand;
+typedef struct { mu_BaseCommand base; Font *font; Point pos; Image *color; char str[1]; } mu_TextCommand;
+typedef struct { mu_BaseCommand base; mu_Rect rect; int id; } mu_IconCommand;
+
+typedef union {
+ int type;
+ mu_BaseCommand base;
+ mu_JumpCommand jump;
+ mu_ClipCommand clip;
+ mu_RectCommand rect;
+ mu_TextCommand text;
+ mu_IconCommand icon;
+} mu_Command;
+
+
+typedef struct {
+ mu_Rect body;
+ mu_Rect next;
+ Point position;
+ Point size;
+ Point max;
+ int widths[MU_MAX_WIDTHS];
+ int items;
+ int row_index;
+ int next_row;
+ int next_type;
+ int indent;
+} mu_Layout;
+
+
+typedef struct {
+ mu_Command *head, *tail;
+ mu_Rect rect;
+ mu_Rect body;
+ Point content_size;
+ Point scroll;
+ int inited;
+ int zindex;
+ int open;
+} mu_Container;
+
+
+typedef struct {
+ Font *font;
+ Point size;
+ int padding;
+ int spacing;
+ int indent;
+ int title_height;
+ int scrollbar_size;
+ int thumb_size;
+ Image *colors[MU_COLOR_MAX];
+} mu_Style;
+
+
+struct mu_Context {
+ /* core state */
+ mu_Style _style;
+ mu_Style *style;
+ mu_Id hover;
+ mu_Id focus;
+ mu_Id last_id;
+ mu_Rect last_rect;
+ int last_zindex;
+ int updated_focus;
+ mu_Container *hover_root;
+ mu_Container *last_hover_root;
+ mu_Container *scroll_target;
+ char number_buf[MU_MAX_FMT];
+ mu_Id number_editing;
+ Rectangle screen;
+ /* stacks */
+ mu_stack(char, MU_COMMANDLIST_SIZE) command_list;
+ mu_stack(char, MU_COMMANDLIST_SIZE) old_command_list;
+ mu_stack(mu_Container*, MU_ROOTLIST_SIZE) root_list;
+ mu_stack(mu_Container*, MU_CONTAINERSTACK_SIZE) container_stack;
+ mu_stack(mu_Rect, MU_CLIPSTACK_SIZE) clip_stack;
+ mu_stack(mu_Id, MU_IDSTACK_SIZE) id_stack;
+ mu_stack(mu_Layout, MU_LAYOUTSTACK_SIZE) layout_stack;
+ /* input state */
+ Point mouse_pos;
+ Point last_mouse_pos;
+ Point mouse_delta;
+ Point scroll_delta;
+ int mouse_down;
+ int mouse_pressed;
+ int key_down;
+ int key_pressed;
+ char text_input[32];
+};
+
+extern Image *atlasimage;
+extern mu_Rect *atlasicons;
+extern u8int defaultcolors[MU_COLOR_MAX][4];
+
+mu_Rect mu_rect(int x, int y, int w, int h);
+Image *mu_color(u8int r, u8int g, u8int b, u8int a);
+
+void mu_init(mu_Context *ctx);
+int mu_render(mu_Context *ctx);
+void mu_begin(mu_Context *ctx);
+void mu_end(mu_Context *ctx);
+void mu_set_focus(mu_Context *ctx, mu_Id id);
+mu_Id mu_get_id(mu_Context *ctx, const void *data, int size);
+void mu_push_id(mu_Context *ctx, const void *data, int size);
+void mu_pop_id(mu_Context *ctx);
+void mu_push_clip_rect(mu_Context *ctx, mu_Rect rect);
+void mu_pop_clip_rect(mu_Context *ctx);
+mu_Rect mu_get_clip_rect(mu_Context *ctx);
+int mu_check_clip(mu_Context *ctx, mu_Rect r);
+mu_Container* mu_get_container(mu_Context *ctx);
+void mu_init_window(mu_Context *ctx, mu_Container *cnt, int opt);
+void mu_bring_to_front(mu_Context *ctx, mu_Container *cnt);
+
+void mu_input_mousemove(mu_Context *ctx, int x, int y);
+void mu_input_mousedown(mu_Context *ctx, int x, int y, int btn);
+void mu_input_mouseup(mu_Context *ctx, int x, int y, int btn);
+void mu_input_scroll(mu_Context *ctx, int x, int y);
+void mu_input_keydown(mu_Context *ctx, int key);
+void mu_input_keyup(mu_Context *ctx, int key);
+void mu_input_text(mu_Context *ctx, const char *text);
+
+mu_Command* mu_push_command(mu_Context *ctx, int type, int size);
+int mu_next_command(mu_Context *ctx, mu_Command **cmd);
+void mu_set_clip(mu_Context *ctx, mu_Rect rect);
+void mu_draw_rect(mu_Context *ctx, mu_Rect rect, Image *color);
+void mu_draw_box(mu_Context *ctx, mu_Rect rect, Image *color);
+void mu_draw_text(mu_Context *ctx, Font *font, const char *str, int len, Point pos, Image *color);
+void mu_draw_icon(mu_Context *ctx, int id, mu_Rect rect);
+
+void mu_layout_row(mu_Context *ctx, int items, const int *widths, int height);
+void mu_layout_width(mu_Context *ctx, int width);
+void mu_layout_height(mu_Context *ctx, int height);
+void mu_layout_begin_column(mu_Context *ctx);
+void mu_layout_end_column(mu_Context *ctx);
+void mu_layout_set_next(mu_Context *ctx, mu_Rect r, int relative);
+mu_Rect mu_layout_next(mu_Context *ctx);
+
+void mu_draw_control_frame(mu_Context *ctx, mu_Id id, mu_Rect rect, int colorid, int opt);
+void mu_draw_control_text(mu_Context *ctx, const char *str, mu_Rect rect, int colorid, int opt);
+int mu_mouse_over(mu_Context *ctx, mu_Rect rect);
+void mu_update_control(mu_Context *ctx, mu_Id id, mu_Rect rect, int opt);
+
+void mu_text(mu_Context *ctx, const char *text);
+void mu_label(mu_Context *ctx, const char *text);
+int mu_button_ex(mu_Context *ctx, const char *label, int icon, int opt);
+int mu_button(mu_Context *ctx, const char *label);
+int mu_checkbox(mu_Context *ctx, int *state, const char *label);
+int mu_textbox_raw(mu_Context *ctx, char *buf, int bufsz, mu_Id id, mu_Rect r, int opt);
+int mu_textbox_ex(mu_Context *ctx, char *buf, int bufsz, int opt);
+int mu_textbox(mu_Context *ctx, char *buf, int bufsz);
+int mu_slider_ex(mu_Context *ctx, float *value, float low, float high, float step, const char *fmt, int opt);
+int mu_slider(mu_Context *ctx, float *value, float low, float high);
+int mu_number_ex(mu_Context *ctx, float *value, float step, const char *fmt, int opt);
+int mu_number(mu_Context *ctx, float *value, float step);
+int mu_header(mu_Context *ctx, int *state, const char *label);
+int mu_begin_treenode(mu_Context *ctx, int *state, const char *label);
+void mu_end_treenode(mu_Context *ctx);
+int mu_begin_window_ex(mu_Context *ctx, mu_Container *cnt, const char *title, int opt);
+int mu_begin_window(mu_Context *ctx, mu_Container *cnt, const char *title);
+void mu_end_window(mu_Context *ctx);
+void mu_open_popup(mu_Context *ctx, mu_Container *cnt);
+int mu_begin_popup(mu_Context *ctx, mu_Container *cnt);
+void mu_end_popup(mu_Context *ctx);
+void mu_begin_panel_ex(mu_Context *ctx, mu_Container *cnt, int opt);
+void mu_begin_panel(mu_Context *ctx, mu_Container *cnt);
+void mu_end_panel(mu_Context *ctx);
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,15 @@
+</$objtype/mkfile
+LIB=/$objtype/lib/libmicroui.a
+
+CFLAGS=$CFLAGS -p
+
+OFILES=\
+ microui.$O\
+
+HFILES=\
+ /sys/include/microui.h\
+
+/sys/include/%.h: %.h
+ cp $stem.h /sys/include/$stem.h
+
+</sys/src/cmd/mksyslib
--- a/src/microui.c
+++ /dev/null
@@ -1,1231 +1,0 @@
-/*
-** Copyright (c) 2019 rxi
-**
-** Permission is hereby granted, free of charge, to any person obtaining a copy
-** of this software and associated documentation files (the "Software"), to
-** deal in the Software without restriction, including without limitation the
-** rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-** sell copies of the Software, and to permit persons to whom the Software is
-** furnished to do so, subject to the following conditions:
-**
-** The above copyright notice and this permission notice shall be included in
-** all copies or substantial portions of the Software.
-**
-** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-** FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-** IN THE SOFTWARE.
-*/
-
-#ifdef __plan9__
-#include <u.h>
-#include <libc.h>
-#define unused USED
-#define NULL nil
-#define sprintf sprint
-#define vsnprintf vsnprint
-#define fprintf fprint
-#define stderr 2
-#else
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#define unused(x) ((void) (x))
-#endif
-
-#include "microui.h"
-
-#define expect(x) do { \
- if (!(x)) { \
- fprintf(stderr, "Fatal error: %s:%d: assertion '%s' failed\n", \
- __FILE__, __LINE__, #x); \
- abort(); \
- } \
- } while (0)
-
-
-#define push(stk, val) do { \
- expect((stk).idx < (int) (sizeof((stk).items) / sizeof(*(stk).items))); \
- (stk).items[ (stk).idx ] = (val); \
- (stk).idx++; \
- } while (0)
-
-
-#define pop(stk) do { \
- expect((stk).idx > 0); \
- (stk).idx--; \
- } while (0)
-
-
-static mu_Rect unclipped_rect = { 0, 0, 0x1000000, 0x1000000 };
-
-static mu_Style default_style = {
- NULL, /* font */
- { 68, 10 }, /* size */
- 6, 4, 24, /* padding, spacing, indent */
- 26, /* title_height */
- 12, 8, /* scrollbar_size, thumb_size */
- {
- { 230, 230, 230, 255 }, /* MU_COLOR_TEXT */
- { 25, 25, 25, 255 }, /* MU_COLOR_BORDER */
- { 50, 50, 50, 255 }, /* MU_COLOR_WINDOWBG */
- { 25, 25, 25, 255 }, /* MU_COLOR_TITLEBG */
- { 240, 240, 240, 255 }, /* MU_COLOR_TITLETEXT */
- { 0, 0, 0, 0 }, /* MU_COLOR_PANELBG */
- { 75, 75, 75, 255 }, /* MU_COLOR_BUTTON */
- { 95, 95, 95, 255 }, /* MU_COLOR_BUTTONHOVER */
- { 115, 115, 115, 255 }, /* MU_COLOR_BUTTONFOCUS */
- { 30, 30, 30, 255 }, /* MU_COLOR_BASE */
- { 35, 35, 35, 255 }, /* MU_COLOR_BASEHOVER */
- { 40, 40, 40, 255 }, /* MU_COLOR_BASEFOCUS */
- { 43, 43, 43, 255 }, /* MU_COLOR_SCROLLBASE */
- { 30, 30, 30, 255 } /* MU_COLOR_SCROLLTHUMB */
- }
-};
-
-
-mu_Vec2 mu_vec2(int x, int y) {
- mu_Vec2 res;
- res.x = x, res.y = y;
- return res;
-}
-
-
-mu_Rect mu_rect(int x, int y, int w, int h) {
- mu_Rect res;
- res.x = x, res.y = y, res.w = w, res.h = h;
- return res;
-}
-
-
-mu_Color mu_color(int r, int g, int b, int a) {
- mu_Color res;
- res.r = r, res.g = g, res.b = b, res.a = a;
- return res;
-}
-
-
-static mu_Rect expand_rect(mu_Rect rect, int n) {
- return mu_rect(rect.x - n, rect.y - n, rect.w + n * 2, rect.h + n * 2);
-}
-
-
-static mu_Rect clip_rect(mu_Rect r1, mu_Rect r2) {
- int x1 = mu_max(r1.x, r2.x);
- int y1 = mu_max(r1.y, r2.y);
- int x2 = mu_min(r1.x + r1.w, r2.x + r2.w);
- int y2 = mu_min(r1.y + r1.h, r2.y + r2.h);
- if (x2 < x1) { x2 = x1; }
- if (y2 < y1) { y2 = y1; }
- return mu_rect(x1, y1, x2 - x1, y2 - y1);
-}
-
-
-static int rect_overlaps_vec2(mu_Rect r, mu_Vec2 p) {
- return p.x >= r.x && p.x < r.x + r.w && p.y >= r.y && p.y < r.y + r.h;
-}
-
-
-static int text_width(mu_Font font, const char *str, int len) {
- unused(font);
- if (len < 0) { len = strlen(str); }
- return len * 8;
-}
-
-
-static int text_height(mu_Font font) {
- unused(font);
- return 16;
-}
-
-
-static void draw_frame(mu_Context *ctx, mu_Rect rect, int colorid) {
- mu_draw_rect(ctx, rect, ctx->style->colors[colorid]);
- if (colorid == MU_COLOR_SCROLLBASE ||
- colorid == MU_COLOR_SCROLLTHUMB ||
- colorid == MU_COLOR_TITLEBG) { return; }
- /* draw border */
- if (ctx->style->colors[MU_COLOR_BORDER].a) {
- mu_draw_box(ctx, expand_rect(rect, 1), ctx->style->colors[MU_COLOR_BORDER]);
- }
-}
-
-
-void mu_init(mu_Context *ctx) {
- memset(ctx, 0, sizeof(*ctx));
- ctx->text_width = text_width;
- ctx->text_height = text_height;
- ctx->draw_frame = draw_frame;
- ctx->_style = default_style;
- ctx->style = &ctx->_style;
-}
-
-
-void mu_begin(mu_Context *ctx) {
- ctx->command_list.idx = 0;
- ctx->root_list.idx = 0;
- ctx->scroll_target = NULL;
- ctx->last_hover_root = ctx->hover_root;
- ctx->hover_root = NULL;
- ctx->mouse_delta.x = ctx->mouse_pos.x - ctx->last_mouse_pos.x;
- ctx->mouse_delta.y = ctx->mouse_pos.y - ctx->last_mouse_pos.y;
-}
-
-
-static int compare_zindex(const void *a, const void *b) {
- return (*(mu_Container**) a)->zindex - (*(mu_Container**) b)->zindex;
-}
-
-
-void mu_end(mu_Context *ctx) {
- int i, n;
- /* check stacks */
- expect(ctx->container_stack.idx == 0);
- expect(ctx->clip_stack.idx == 0);
- expect(ctx->id_stack.idx == 0);
- expect(ctx->layout_stack.idx == 0);
-
- /* handle scroll input */
- if (ctx->scroll_target) {
- ctx->scroll_target->scroll.x += ctx->scroll_delta.x;
- ctx->scroll_target->scroll.y += ctx->scroll_delta.y;
- }
-
- /* unset focus if focus id was not touched this frame */
- if (!ctx->updated_focus) { ctx->focus = 0; }
- ctx->updated_focus = 0;
-
- /* bring hover root to front if mouse was pressed */
- if (ctx->mouse_pressed && ctx->hover_root &&
- ctx->hover_root->zindex < ctx->last_zindex)
- {
- mu_bring_to_front(ctx, ctx->hover_root);
- }
-
- /* reset input state */
- ctx->key_pressed = 0;
- ctx->text_input[0] = '\0';
- ctx->mouse_pressed = 0;
- ctx->scroll_delta = mu_vec2(0, 0);
- ctx->last_mouse_pos = ctx->mouse_pos;
-
- /* sort root containers by zindex */
- n = ctx->root_list.idx;
- qsort(ctx->root_list.items, n, sizeof(mu_Container*), compare_zindex);
-
- /* set root container jump commands */
- for (i = 0; i < n; i++) {
- mu_Container *cnt = ctx->root_list.items[i];
- /* if this is the first container then make the first command jump to it.
- ** otherwise set the previous container's tail to jump to this one */
- if (i == 0) {
- mu_Command *cmd = (mu_Command*) ctx->command_list.items;
- cmd->jump.dst = (char*) cnt->head + sizeof(mu_JumpCommand);
- } else {
- mu_Container *prev = ctx->root_list.items[i - 1];
- prev->tail->jump.dst = (char*) cnt->head + sizeof(mu_JumpCommand);
- }
- /* make the last container's tail jump to the end of command list */
- if (i == n - 1) {
- cnt->tail->jump.dst = ctx->command_list.items + ctx->command_list.idx;
- }
- }
-}
-
-
-void mu_set_focus(mu_Context *ctx, mu_Id id) {
- ctx->focus = id;
- ctx->updated_focus = 1;
-}
-
-
-/* 32bit fnv-1a hash */
-#define HASH_INITIAL 2166136261
-
-static void hash(mu_Id *hash, const void *data, int size) {
- const unsigned char *p = data;
- while (size--) {
- *hash = (*hash ^ *p++) * 16777619;
- }
-}
-
-
-mu_Id mu_get_id(mu_Context *ctx, const void *data, int size) {
- int idx = ctx->id_stack.idx;
- mu_Id res = (idx > 0) ? ctx->id_stack.items[idx - 1] : HASH_INITIAL;
- hash(&res, data, size);
- ctx->last_id = res;
- return res;
-}
-
-
-void mu_push_id(mu_Context *ctx, const void *data, int size) {
- push(ctx->id_stack, mu_get_id(ctx, data, size));
-}
-
-
-void mu_pop_id(mu_Context *ctx) {
- pop(ctx->id_stack);
-}
-
-
-void mu_push_clip_rect(mu_Context *ctx, mu_Rect rect) {
- mu_Rect last = mu_get_clip_rect(ctx);
- push(ctx->clip_stack, clip_rect(rect, last));
-}
-
-
-void mu_pop_clip_rect(mu_Context *ctx) {
- pop(ctx->clip_stack);
-}
-
-
-mu_Rect mu_get_clip_rect(mu_Context *ctx) {
- expect(ctx->clip_stack.idx > 0);
- return ctx->clip_stack.items[ ctx->clip_stack.idx - 1 ];
-}
-
-
-int mu_check_clip(mu_Context *ctx, mu_Rect r) {
- mu_Rect cr = mu_get_clip_rect(ctx);
- if (r.x > cr.x + cr.w || r.x + r.w < cr.x ||
- r.y > cr.y + cr.h || r.y + r.h < cr.y ) { return MU_CLIP_ALL; }
- if (r.x >= cr.x && r.x + r.w <= cr.x + cr.w &&
- r.y >= cr.y && r.y + r.h <= cr.y + cr.h ) { return MU_CLIP_NONE; }
- return MU_CLIP_PART;
-}
-
-
-static void push_layout(mu_Context *ctx, mu_Rect body, mu_Vec2 scroll) {
- mu_Layout layout;
- int width = 0;
- memset(&layout, 0, sizeof(mu_Layout));
- layout.body = mu_rect(body.x - scroll.x, body.y - scroll.y, body.w, body.h);
- layout.max = mu_vec2(-0x1000000, -0x1000000);
- push(ctx->layout_stack, layout);
- mu_layout_row(ctx, 1, &width, 0);
-}
-
-
-static mu_Layout* get_layout(mu_Context *ctx) {
- return &ctx->layout_stack.items[ctx->layout_stack.idx - 1];
-}
-
-
-static void push_container(mu_Context *ctx, mu_Container *cnt) {
- push(ctx->container_stack, cnt);
- mu_push_id(ctx, &cnt, sizeof(mu_Container*));
-}
-
-
-static void pop_container(mu_Context *ctx) {
- mu_Container *cnt = mu_get_container(ctx);
- mu_Layout *layout = get_layout(ctx);
- cnt->content_size.x = layout->max.x - layout->body.x;
- cnt->content_size.y = layout->max.y - layout->body.y;
- /* pop container, layout and id */
- pop(ctx->container_stack);
- pop(ctx->layout_stack);
- mu_pop_id(ctx);
-}
-
-
-mu_Container* mu_get_container(mu_Context *ctx) {
- expect(ctx->container_stack.idx > 0);
- return ctx->container_stack.items[ ctx->container_stack.idx - 1 ];
-}
-
-
-void mu_init_window(mu_Context *ctx, mu_Container *cnt, int opt) {
- memset(cnt, 0, sizeof(*cnt));
- cnt->inited = 1;
- cnt->open = opt & MU_OPT_CLOSED ? 0 : 1;
- cnt->rect = mu_rect(100, 100, 300, 300);
- mu_bring_to_front(ctx, cnt);
-}
-
-
-void mu_bring_to_front(mu_Context *ctx, mu_Container *cnt) {
- cnt->zindex = ++ctx->last_zindex;
-}
-
-
-/*============================================================================
-** input handlers
-**============================================================================*/
-
-void mu_input_mousemove(mu_Context *ctx, int x, int y) {
- ctx->mouse_pos = mu_vec2(x, y);
-}
-
-
-void mu_input_mousedown(mu_Context *ctx, int x, int y, int btn) {
- mu_input_mousemove(ctx, x, y);
- ctx->mouse_down |= btn;
- ctx->mouse_pressed |= btn;
-}
-
-
-void mu_input_mouseup(mu_Context *ctx, int x, int y, int btn) {
- mu_input_mousemove(ctx, x, y);
- ctx->mouse_down &= ~btn;
-}
-
-
-void mu_input_scroll(mu_Context *ctx, int x, int y) {
- ctx->scroll_delta.x += x;
- ctx->scroll_delta.y += y;
-}
-
-
-void mu_input_keydown(mu_Context *ctx, int key) {
- ctx->key_pressed |= key;
- ctx->key_down |= key;
-}
-
-
-void mu_input_keyup(mu_Context *ctx, int key) {
- ctx->key_down &= ~key;
-}
-
-
-void mu_input_text(mu_Context *ctx, const char *text) {
- int len = strlen(ctx->text_input);
- int size = strlen(text) + 1;
- expect(len + size <= (int) sizeof(ctx->text_input));
- memcpy(ctx->text_input + len, text, size);
-}
-
-
-/*============================================================================
-** commandlist
-**============================================================================*/
-
-mu_Command* mu_push_command(mu_Context *ctx, int type, int size) {
- mu_Command *cmd = (mu_Command*) (ctx->command_list.items + ctx->command_list.idx);
- expect(ctx->command_list.idx + size < MU_COMMANDLIST_SIZE);
- cmd->base.type = type;
- cmd->base.size = size;
- ctx->command_list.idx += size;
- return cmd;
-}
-
-
-int mu_next_command(mu_Context *ctx, mu_Command **cmd) {
- if (*cmd) {
- *cmd = (mu_Command*) (((char*) *cmd) + (*cmd)->base.size);
- } else {
- *cmd = (mu_Command*) ctx->command_list.items;
- }
- while ((char*) *cmd != ctx->command_list.items + ctx->command_list.idx) {
- if ((*cmd)->type != MU_COMMAND_JUMP) { return 1; }
- *cmd = (*cmd)->jump.dst;
- }
- return 0;
-}
-
-
-static mu_Command* push_jump(mu_Context *ctx, mu_Command *dst) {
- mu_Command *cmd;
- cmd = mu_push_command(ctx, MU_COMMAND_JUMP, sizeof(mu_JumpCommand));
- cmd->jump.dst = dst;
- return cmd;
-}
-
-
-void mu_set_clip(mu_Context *ctx, mu_Rect rect) {
- mu_Command *cmd;
- cmd = mu_push_command(ctx, MU_COMMAND_CLIP, sizeof(mu_ClipCommand));
- cmd->clip.rect = rect;
-}
-
-
-void mu_draw_rect(mu_Context *ctx, mu_Rect rect, mu_Color color) {
- mu_Command *cmd;
- rect = clip_rect(rect, mu_get_clip_rect(ctx));
- if (rect.w > 0 && rect.h > 0) {
- cmd = mu_push_command(ctx, MU_COMMAND_RECT, sizeof(mu_RectCommand));
- cmd->rect.rect = rect;
- cmd->rect.color = color;
- }
-}
-
-
-void mu_draw_box(mu_Context *ctx, mu_Rect rect, mu_Color color) {
- mu_draw_rect(ctx, mu_rect(rect.x + 1, rect.y, rect.w - 2, 1), color);
- mu_draw_rect(ctx, mu_rect(rect.x+1, rect.y + rect.h-1, rect.w-2, 1), color);
- mu_draw_rect(ctx, mu_rect(rect.x, rect.y, 1, rect.h), color);
- mu_draw_rect(ctx, mu_rect(rect.x + rect.w - 1, rect.y, 1, rect.h), color);
-}
-
-
-void mu_draw_text(mu_Context *ctx, mu_Font font, const char *str, int len,
- mu_Vec2 pos, mu_Color color)
-{
- mu_Command *cmd;
- mu_Rect rect = mu_rect(
- pos.x, pos.y, ctx->text_width(font, str, len), ctx->text_height(font));
- int clipped = mu_check_clip(ctx, rect);
- if (clipped == MU_CLIP_ALL ) { return; }
- if (clipped == MU_CLIP_PART) { mu_set_clip(ctx, mu_get_clip_rect(ctx)); }
- /* add command */
- if (len < 0) { len = strlen(str); }
- cmd = mu_push_command(ctx, MU_COMMAND_TEXT, sizeof(mu_TextCommand) + len);
- memcpy(cmd->text.str, str, len);
- cmd->text.str[len] = '\0';
- cmd->text.pos = pos;
- cmd->text.color = color;
- cmd->text.font = font;
- /* reset clipping if it was set */
- if (clipped) { mu_set_clip(ctx, unclipped_rect); }
-}
-
-
-void mu_draw_icon(mu_Context *ctx, int id, mu_Rect rect, mu_Color color) {
- mu_Command *cmd;
- /* do clip command if the rect isn't fully contained within the cliprect */
- int clipped = mu_check_clip(ctx, rect);
- if (clipped == MU_CLIP_ALL ) { return; }
- if (clipped == MU_CLIP_PART) { mu_set_clip(ctx, mu_get_clip_rect(ctx)); }
- /* do icon command */
- cmd = mu_push_command(ctx, MU_COMMAND_ICON, sizeof(mu_IconCommand));
- cmd->icon.id = id;
- cmd->icon.rect = rect;
- cmd->icon.color = color;
- /* reset clipping if it was set */
- if (clipped) { mu_set_clip(ctx, unclipped_rect); }
-}
-
-
-/*============================================================================
-** layout
-**============================================================================*/
-
-enum { RELATIVE = 1, ABSOLUTE = 2 };
-
-
-void mu_layout_begin_column(mu_Context *ctx) {
- push_layout(ctx, mu_layout_next(ctx), mu_vec2(0, 0));
-}
-
-
-void mu_layout_end_column(mu_Context *ctx) {
- mu_Layout *a, *b;
- b = get_layout(ctx);
- pop(ctx->layout_stack);
- /* inherit position/next_row/max from child layout if they are greater */
- a = get_layout(ctx);
- a->position.x = mu_max(a->position.x, b->position.x + b->body.x - a->body.x);
- a->next_row = mu_max(a->next_row, b->next_row + b->body.y - a->body.y);
- a->max.x = mu_max(a->max.x, b->max.x);
- a->max.y = mu_max(a->max.y, b->max.y);
-}
-
-
-void mu_layout_row(mu_Context *ctx, int items, const int *widths, int height) {
- mu_Layout *layout = get_layout(ctx);
- if (widths) {
- expect(items <= MU_MAX_WIDTHS);
- memcpy(layout->widths, widths, items * sizeof(widths[0]));
- }
- layout->items = items;
- layout->position = mu_vec2(layout->indent, layout->next_row);
- layout->size.y = height;
- layout->row_index = 0;
-}
-
-
-void mu_layout_width(mu_Context *ctx, int width) {
- get_layout(ctx)->size.x = width;
-}
-
-
-void mu_layout_height(mu_Context *ctx, int height) {
- get_layout(ctx)->size.y = height;
-}
-
-
-void mu_layout_set_next(mu_Context *ctx, mu_Rect r, int relative) {
- mu_Layout *layout = get_layout(ctx);
- layout->next = r;
- layout->next_type = relative ? RELATIVE : ABSOLUTE;
-}
-
-
-mu_Rect mu_layout_next(mu_Context *ctx) {
- mu_Layout *layout = get_layout(ctx);
- mu_Style *style = ctx->style;
- mu_Rect res;
-
- if (layout->next_type) {
- /* handle rect set by `mu_layout_set_next` */
- int type = layout->next_type;
- layout->next_type = 0;
- res = layout->next;
- if (type == ABSOLUTE) {
- ctx->last_rect = res;
- return res;
- }
-
- } else {
- /* handle next row */
- if (layout->row_index == layout->items) {
- mu_layout_row(ctx, layout->items, NULL, layout->size.y);
- }
-
- /* position */
- res.x = layout->position.x;
- res.y = layout->position.y;
-
- /* size */
- res.w =
- layout->items > -1 ? layout->widths[layout->row_index] : layout->size.x;
- res.h = layout->size.y;
- if (res.w == 0) { res.w = style->size.x + style->padding * 2; }
- if (res.h == 0) { res.h = style->size.y + style->padding * 2; }
- if (res.w < 0) { res.w += layout->body.w - res.x + 1; }
- if (res.h < 0) { res.h += layout->body.h - res.y + 1; }
-
- layout->row_index++;
- }
-
- /* update position */
- layout->position.x += res.w + style->spacing;
- layout->next_row = mu_max(layout->next_row, res.y + res.h + style->spacing);
-
- /* apply body offset */
- res.x += layout->body.x;
- res.y += layout->body.y;
-
- /* update max position */
- layout->max.x = mu_max(layout->max.x, res.x + res.w);
- layout->max.y = mu_max(layout->max.y, res.y + res.h);
-
- ctx->last_rect = res;
- return res;
-}
-
-
-/*============================================================================
-** controls
-**============================================================================*/
-
-static int in_hover_root(mu_Context *ctx) {
- int i = ctx->container_stack.idx;
- while (i--) {
- if (ctx->container_stack.items[i] == ctx->last_hover_root) { return 1; }
- /* only root containers have their `head` field set; stop searching if we've
- ** reached the current root container */
- if (ctx->container_stack.items[i]->head) { break; }
- }
- return 0;
-}
-
-
-void mu_draw_control_frame(mu_Context *ctx, mu_Id id, mu_Rect rect,
- int colorid, int opt)
-{
- if (opt & MU_OPT_NOFRAME) { return; }
- colorid += (ctx->focus == id) ? 2 : (ctx->hover == id) ? 1 : 0;
- ctx->draw_frame(ctx, rect, colorid);
-}
-
-
-void mu_draw_control_text(mu_Context *ctx, const char *str, mu_Rect rect,
- int colorid, int opt)
-{
- mu_Vec2 pos;
- mu_Font font = ctx->style->font;
- int tw = ctx->text_width(font, str, -1);
- mu_push_clip_rect(ctx, rect);
- pos.y = rect.y + (rect.h - ctx->text_height(font)) / 2;
- if (opt & MU_OPT_ALIGNCENTER) {
- pos.x = rect.x + (rect.w - tw) / 2;
- } else if (opt & MU_OPT_ALIGNRIGHT) {
- pos.x = rect.x + rect.w - tw - ctx->style->padding;
- } else {
- pos.x = rect.x + ctx->style->padding;
- }
- mu_draw_text(ctx, font, str, -1, pos, ctx->style->colors[colorid]);
- mu_pop_clip_rect(ctx);
-}
-
-
-int mu_mouse_over(mu_Context *ctx, mu_Rect rect) {
- return rect_overlaps_vec2(rect, ctx->mouse_pos) &&
- rect_overlaps_vec2(mu_get_clip_rect(ctx), ctx->mouse_pos) &&
- in_hover_root(ctx);
-}
-
-
-void mu_update_control(mu_Context *ctx, mu_Id id, mu_Rect rect, int opt) {
- int mouseover = mu_mouse_over(ctx, rect);
-
- if (ctx->focus == id) { ctx->updated_focus = 1; }
- if (opt & MU_OPT_NOINTERACT) { return; }
- if (mouseover && !ctx->mouse_down) { ctx->hover = id; }
-
- if (ctx->focus == id) {
- if (ctx->mouse_pressed && !mouseover) { mu_set_focus(ctx, 0); }
- if (!ctx->mouse_down && ~opt & MU_OPT_HOLDFOCUS) { mu_set_focus(ctx, 0); }
- }
-
- if (ctx->hover == id) {
- if (!mouseover) {
- ctx->hover = 0;
- } else if (ctx->mouse_pressed) {
- mu_set_focus(ctx, id);
- }
- }
-}
-
-
-void mu_text(mu_Context *ctx, const char *text) {
- const char *start, *end, *p = text;
- int width = -1;
- mu_Font font = ctx->style->font;
- mu_Color color = ctx->style->colors[MU_COLOR_TEXT];
- mu_layout_begin_column(ctx);
- mu_layout_row(ctx, 1, &width, ctx->text_height(font));
- do {
- mu_Rect r = mu_layout_next(ctx);
- int w = 0;
- start = end = p;
- do {
- const char* word = p;
- while (*p && *p != ' ' && *p != '\n') { p++; }
- w += ctx->text_width(font, word, p - word);
- if (w > r.w && end != start) { break; }
- w += ctx->text_width(font, p, 1);
- end = p++;
- } while (*end && *end != '\n');
- mu_draw_text(ctx, font, start, end - start, mu_vec2(r.x, r.y), color);
- p = end + 1;
- } while (*end);
- mu_layout_end_column(ctx);
-}
-
-
-void mu_label(mu_Context *ctx, const char *text) {
- mu_draw_control_text(ctx, text, mu_layout_next(ctx), MU_COLOR_TEXT, 0);
-}
-
-
-int mu_button_ex(mu_Context *ctx, const char *label, int icon, int opt) {
- int res = 0;
- mu_Id id = label ? mu_get_id(ctx, label, strlen(label))
- : mu_get_id(ctx, &icon, sizeof(icon));
- mu_Rect r = mu_layout_next(ctx);
- mu_update_control(ctx, id, r, opt);
- /* handle click */
- if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id) {
- res |= MU_RES_SUBMIT;
- }
- /* draw */
- mu_draw_control_frame(ctx, id, r, MU_COLOR_BUTTON, opt);
- if (label) { mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, opt); }
- if (icon) { mu_draw_icon(ctx, icon, r, ctx->style->colors[MU_COLOR_TEXT]); }
- return res;
-}
-
-
-int mu_button(mu_Context *ctx, const char *label) {
- return mu_button_ex(ctx, label, 0, MU_OPT_ALIGNCENTER);
-}
-
-
-int mu_checkbox(mu_Context *ctx, int *state, const char *label) {
- int res = 0;
- mu_Id id = mu_get_id(ctx, &state, sizeof(state));
- mu_Rect r = mu_layout_next(ctx);
- mu_Rect box = mu_rect(r.x, r.y, r.h, r.h);
- mu_update_control(ctx, id, r, 0);
- /* handle click */
- if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id) {
- res |= MU_RES_CHANGE;
- *state = !*state;
- }
- /* draw */
- mu_draw_control_frame(ctx, id, box, MU_COLOR_BASE, 0);
- if (*state) {
- mu_draw_icon(ctx, MU_ICON_CHECK, box, ctx->style->colors[MU_COLOR_TEXT]);
- }
- r = mu_rect(r.x + box.w, r.y, r.w - box.w, r.h);
- mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, 0);
- return res;
-}
-
-
-int mu_textbox_raw(mu_Context *ctx, char *buf, int bufsz, mu_Id id, mu_Rect r,
- int opt)
-{
- int res = 0;
- mu_update_control(ctx, id, r, opt | MU_OPT_HOLDFOCUS);
-
- if (ctx->focus == id) {
- /* handle text input */
- int len = strlen(buf);
- int n = mu_min(bufsz - len - 1, (int) strlen(ctx->text_input));
- if (n > 0) {
- memcpy(buf + len, ctx->text_input, n);
- len += n;
- buf[len] = '\0';
- res |= MU_RES_CHANGE;
- }
- /* handle backspace */
- if (ctx->key_pressed & MU_KEY_BACKSPACE && len > 0) {
- /* skip utf-8 continuation bytes */
- while ((buf[--len] & 0xc0) == 0x80 && len > 0);
- buf[len] = '\0';
- res |= MU_RES_CHANGE;
- }
- if (ctx->key_pressed & MU_KEY_NACK && len > 0) {
- buf[0] = '\0';
- res |= MU_RES_CHANGE;
- }
- /* handle return */
- if (ctx->key_pressed & MU_KEY_RETURN) {
- mu_set_focus(ctx, 0);
- res |= MU_RES_SUBMIT;
- }
- }
-
- /* draw */
- mu_draw_control_frame(ctx, id, r, MU_COLOR_BASE, opt);
- if (ctx->focus == id) {
- mu_Color color = ctx->style->colors[MU_COLOR_TEXT];
- mu_Font font = ctx->style->font;
- int textw = ctx->text_width(font, buf, -1);
- int texth = ctx->text_height(font);
- int ofx = r.w - ctx->style->padding - textw - 1;
- int textx = r.x + mu_min(ofx, ctx->style->padding);
- int texty = r.y + (r.h - texth) / 2;
- mu_push_clip_rect(ctx, r);
- mu_draw_text(ctx, font, buf, -1, mu_vec2(textx, texty), color);
- mu_draw_rect(ctx, mu_rect(textx + textw, texty, 1, texth), color);
- mu_pop_clip_rect(ctx);
- } else {
- mu_draw_control_text(ctx, buf, r, MU_COLOR_TEXT, opt);
- }
-
- return res;
-}
-
-
-static int number_textbox(mu_Context *ctx, mu_Real *value, mu_Rect r, mu_Id id) {
- if (((ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->key_down & MU_KEY_SHIFT)
- ||
- ctx->mouse_pressed == MU_MOUSE_RIGHT
- ) &&
- ctx->hover == id)
- {
- ctx->number_editing = id;
- sprintf(ctx->number_buf, MU_REAL_FMT, *value);
- }
- if (ctx->number_editing == id) {
- int res = mu_textbox_raw(
- ctx, ctx->number_buf, sizeof(ctx->number_buf), id, r, 0);
- if (res & MU_RES_SUBMIT || ctx->focus != id) {
- *value = strtod(ctx->number_buf, NULL);
- ctx->number_editing = 0;
- } else {
- return 1;
- }
- }
- return 0;
-}
-
-
-int mu_textbox_ex(mu_Context *ctx, char *buf, int bufsz, int opt) {
- mu_Id id = mu_get_id(ctx, &buf, sizeof(buf));
- mu_Rect r = mu_layout_next(ctx);
- return mu_textbox_raw(ctx, buf, bufsz, id, r, opt);
-}
-
-
-int mu_textbox(mu_Context *ctx, char *buf, int bufsz) {
- return mu_textbox_ex(ctx, buf, bufsz, 0);
-}
-
-
-int mu_slider_ex(mu_Context *ctx, mu_Real *value, mu_Real low, mu_Real high,
- mu_Real step, const char *fmt, int opt)
-{
- char buf[MU_MAX_FMT + 1];
- mu_Rect thumb;
- int w, res = 0;
- mu_Real normalized, last = *value, v = last;
- mu_Id id = mu_get_id(ctx, &value, sizeof(value));
- mu_Rect base = mu_layout_next(ctx);
-
- /* handle text input mode */
- if (number_textbox(ctx, &v, base, id)) { return res; }
-
- /* handle normal mode */
- mu_update_control(ctx, id, base, opt);
-
- /* handle input */
- if (ctx->focus == id) {
- if (ctx->mouse_down == MU_MOUSE_LEFT) {
- v = low + ((mu_Real) (ctx->mouse_pos.x - base.x) / base.w) * (high - low);
- }
- } else if (ctx->hover == id) {
- if ((ctx->key_pressed & (MU_KEY_LEFT | MU_KEY_RIGHT)) == MU_KEY_LEFT) {
- v -= step ? step : 1;
- if (v < low) v = low;
- } else if ((ctx->key_pressed & (MU_KEY_LEFT | MU_KEY_RIGHT)) == MU_KEY_RIGHT) {
- v += step ? step : 1;
- if (v > high) v = high;
- }
- }
-
- if (step) { v = ((long) ((v + step/2) / step)) * step; }
- /* clamp and store value, update res */
- *value = v = mu_clamp(v, low, high);
- if (last != v) { res |= MU_RES_CHANGE; }
-
- /* draw base */
- mu_draw_control_frame(ctx, id, base, MU_COLOR_BASE, opt);
- /* draw thumb */
- w = ctx->style->thumb_size;
- normalized = (v - low) / (high - low);
- thumb = mu_rect(base.x + normalized * (base.w - w), base.y, w, base.h);
- mu_draw_control_frame(ctx, id, thumb, MU_COLOR_BUTTON, opt);
- /* draw text */
- sprintf(buf, fmt, v);
- mu_draw_control_text(ctx, buf, base, MU_COLOR_TEXT, opt);
-
- return res;
-}
-
-
-int mu_slider(mu_Context *ctx, mu_Real *value, mu_Real low, mu_Real high) {
- return mu_slider_ex(ctx, value, low, high, 0, MU_SLIDER_FMT, MU_OPT_ALIGNCENTER);
-}
-
-
-int mu_number_ex(mu_Context *ctx, mu_Real *value, mu_Real step,
- const char *fmt,int opt)
-{
- char buf[MU_MAX_FMT + 1];
- int res = 0;
- mu_Id id = mu_get_id(ctx, &value, sizeof(value));
- mu_Rect base = mu_layout_next(ctx);
- mu_Real last = *value;
-
- /* handle text input mode */
- if (number_textbox(ctx, value, base, id)) { return res; }
-
- /* handle normal mode */
- mu_update_control(ctx, id, base, opt);
-
- /* handle input */
- if (ctx->focus == id && ctx->mouse_down == MU_MOUSE_LEFT) {
- *value += ctx->mouse_delta.x * step;
- }
- /* set flag if value changed */
- if (*value != last) { res |= MU_RES_CHANGE; }
-
- /* draw base */
- mu_draw_control_frame(ctx, id, base, MU_COLOR_BASE, opt);
- /* draw text */
- sprintf(buf, fmt, *value);
- mu_draw_control_text(ctx, buf, base, MU_COLOR_TEXT, opt);
-
- return res;
-}
-
-
-int mu_number(mu_Context *ctx, mu_Real *value, mu_Real step) {
- return mu_number_ex(ctx, value, step, MU_SLIDER_FMT, MU_OPT_ALIGNCENTER);
-}
-
-
-static int header(mu_Context *ctx, int *state, const char *label,
- int istreenode)
-{
- mu_Rect r;
- mu_Id id;
- int width = -1;
- mu_layout_row(ctx, 1, &width, 0);
- r = mu_layout_next(ctx);
- id = mu_get_id(ctx, &state, sizeof(state));
- mu_update_control(ctx, id, r, 0);
- /* handle click */
- if (ctx->mouse_pressed == MU_MOUSE_LEFT && ctx->focus == id) {
- *state = !(*state);
- }
- /* draw */
- if (istreenode) {
- if (ctx->hover == id) { ctx->draw_frame(ctx, r, MU_COLOR_BUTTONHOVER); }
- } else {
- mu_draw_control_frame(ctx, id, r, MU_COLOR_BUTTON, 0);
- }
- mu_draw_icon(
- ctx, *state ? MU_ICON_EXPANDED : MU_ICON_COLLAPSED,
- mu_rect(r.x, r.y, r.h, r.h), ctx->style->colors[MU_COLOR_TEXT]);
- r.x += r.h - ctx->style->padding;
- r.w -= r.h - ctx->style->padding;
- mu_draw_control_text(ctx, label, r, MU_COLOR_TEXT, 0);
- return *state ? MU_RES_ACTIVE : 0;
-}
-
-
-int mu_header(mu_Context *ctx, int *state, const char *label) {
- return header(ctx, state, label, 0);
-}
-
-
-int mu_begin_treenode(mu_Context *ctx, int *state, const char *label) {
- int res = header(ctx, state, label, 1);
- if (res & MU_RES_ACTIVE) {
- get_layout(ctx)->indent += ctx->style->indent;
- mu_push_id(ctx, &state, sizeof(void*));
- }
- return res;
-}
-
-
-void mu_end_treenode(mu_Context *ctx) {
- get_layout(ctx)->indent -= ctx->style->indent;
- mu_pop_id(ctx);
-}
-
-
-#define scrollbar(ctx, cnt, b, cs, x, y, w, h) \
- do { \
- /* only add scrollbar if content size is larger than body */ \
- int maxscroll = cs.y - b->h; \
- \
- if (maxscroll > 0 && b->h > 0) { \
- mu_Rect base, thumb; \
- mu_Id id = mu_get_id(ctx, "!scrollbar" #y, 11); \
- \
- /* get sizing / positioning */ \
- base = *b; \
- base.x = b->x + b->w; \
- base.w = ctx->style->scrollbar_size; \
- \
- /* handle input */ \
- mu_update_control(ctx, id, base, 0); \
- if (ctx->focus == id && ctx->mouse_down == MU_MOUSE_LEFT) { \
- cnt->scroll.y += ctx->mouse_delta.y * cs.y / base.h; \
- } \
- /* clamp scroll to limits */ \
- cnt->scroll.y = mu_clamp(cnt->scroll.y, 0, maxscroll); \
- \
- /* draw base and thumb */ \
- ctx->draw_frame(ctx, base, MU_COLOR_SCROLLBASE); \
- thumb = base; \
- thumb.h = mu_max(ctx->style->thumb_size, base.h * b->h / cs.y); \
- thumb.y += cnt->scroll.y * (base.h - thumb.h) / maxscroll; \
- ctx->draw_frame(ctx, thumb, MU_COLOR_SCROLLTHUMB); \
- \
- /* set this as the scroll_target (will get scrolled on mousewheel) */ \
- /* if the mouse is over it */ \
- if (mu_mouse_over(ctx, *b)) { ctx->scroll_target = cnt; } \
- } else { \
- cnt->scroll.y = 0; \
- } \
- } while (0)
-
-
-static void scrollbars(mu_Context *ctx, mu_Container *cnt, mu_Rect *body) {
- int sz = ctx->style->scrollbar_size;
- mu_Vec2 cs = cnt->content_size;
- cs.x += ctx->style->padding * 2;
- cs.y += ctx->style->padding * 2;
- mu_push_clip_rect(ctx, *body);
- /* resize body to make room for scrollbars */
- if (cs.y > cnt->body.h) { body->w -= sz; }
- if (cs.x > cnt->body.w) { body->h -= sz; }
- /* to create a horizontal or vertical scrollbar almost-identical code is
- ** used; only the references to `x|y` `w|h` need to be switched */
- scrollbar(ctx, cnt, body, cs, x, y, w, h);
- scrollbar(ctx, cnt, body, cs, y, x, h, w);
- mu_pop_clip_rect(ctx);
-}
-
-
-static void push_container_body(
- mu_Context *ctx, mu_Container *cnt, mu_Rect body, int opt
-) {
- if (~opt & MU_OPT_NOSCROLL) { scrollbars(ctx, cnt, &body); }
- push_layout(ctx, expand_rect(body, -ctx->style->padding), cnt->scroll);
- cnt->body = body;
-}
-
-
-static void begin_root_container(mu_Context *ctx, mu_Container *cnt) {
- push_container(ctx, cnt);
-
- /* push container to roots list and push head command */
- push(ctx->root_list, cnt);
- cnt->head = push_jump(ctx, NULL);
-
- /* set as hover root if the mouse is overlapping this container and it has a
- ** higher zindex than the current hover root */
- if (rect_overlaps_vec2(cnt->rect, ctx->mouse_pos) &&
- (!ctx->hover_root || cnt->zindex > ctx->hover_root->zindex))
- {
- ctx->hover_root = cnt;
- }
- /* clipping is reset here in case a root-container is made within
- ** another root-containers's begin/end block; this prevents the inner
- ** root-container being clipped to the outer */
- push(ctx->clip_stack, unclipped_rect);
-}
-
-
-static void end_root_container(mu_Context *ctx) {
- /* push tail 'goto' jump command and set head 'skip' command. the final steps
- ** on initing these are done in mu_end() */
- mu_Container *cnt = mu_get_container(ctx);
- cnt->tail = push_jump(ctx, NULL);
- cnt->head->jump.dst = ctx->command_list.items + ctx->command_list.idx;
- /* pop base clip rect and container */
- mu_pop_clip_rect(ctx);
- pop_container(ctx);
-}
-
-
-int mu_begin_window_ex(mu_Context *ctx, mu_Container *cnt, const char *title,
- int opt)
-{
- mu_Rect rect, body, titlerect;
-
- if (!cnt->inited) { mu_init_window(ctx, cnt, opt); }
- if (!cnt->open) { return 0; }
-
- begin_root_container(ctx, cnt);
- rect = cnt->rect;
- body = rect;
-
- /* draw frame */
- if (~opt & MU_OPT_NOFRAME) {
- ctx->draw_frame(ctx, rect, MU_COLOR_WINDOWBG);
- }
-
- /* do title bar */
- titlerect = rect;
- titlerect.h = ctx->style->title_height;
- if (~opt & MU_OPT_NOTITLE) {
- ctx->draw_frame(ctx, titlerect, MU_COLOR_TITLEBG);
-
- /* do title text */
- if (~opt & MU_OPT_NOTITLE) {
- mu_Id id = mu_get_id(ctx, "!title", 6);
- mu_update_control(ctx, id, titlerect, opt);
- mu_draw_control_text(ctx, title, titlerect, MU_COLOR_TITLETEXT, opt);
- if (id == ctx->focus && ctx->mouse_down == MU_MOUSE_LEFT) {
- cnt->rect.x += ctx->mouse_delta.x;
- cnt->rect.y += ctx->mouse_delta.y;
- }
- body.y += titlerect.h;
- body.h -= titlerect.h;
- }
-
- /* do `close` button */
- if (~opt & MU_OPT_NOCLOSE) {
- mu_Id id = mu_get_id(ctx, "!close", 6);
- mu_Rect r = mu_rect(
- titlerect.x + titlerect.w - titlerect.h,
- titlerect.y, titlerect.h, titlerect.h);
- titlerect.w -= r.w;
- mu_draw_icon(ctx, MU_ICON_CLOSE, r, ctx->style->colors[MU_COLOR_TITLETEXT]);
- mu_update_control(ctx, id, r, opt);
- if (ctx->mouse_pressed == MU_MOUSE_LEFT && id == ctx->focus) {
- cnt->open = 0;
- }
- }
- }
-
- push_container_body(ctx, cnt, body, opt);
-
- /* do `resize` handle */
- if (~opt & MU_OPT_NORESIZE) {
- int sz = ctx->style->scrollbar_size;
- mu_Id id = mu_get_id(ctx, "!resize", 7);
- mu_Rect r = mu_rect(rect.x + rect.w - sz, rect.y + rect.h - sz, sz, sz);
- mu_update_control(ctx, id, r, opt);
- if (id == ctx->focus && ctx->mouse_down == MU_MOUSE_LEFT) {
- cnt->rect.w = mu_max(96, cnt->rect.w + ctx->mouse_delta.x);
- cnt->rect.h = mu_max(64, cnt->rect.h + ctx->mouse_delta.y);
- }
- }
-
- /* resize to content size */
- if (opt & MU_OPT_AUTOSIZE) {
- mu_Rect r = get_layout(ctx)->body;
- cnt->rect.w = cnt->content_size.x + (cnt->rect.w - r.w);
- cnt->rect.h = cnt->content_size.y + (cnt->rect.h - r.h);
- }
-
- /* close if this is a popup window and elsewhere was clicked */
- if (opt & MU_OPT_POPUP && ctx->mouse_pressed && ctx->last_hover_root != cnt) {
- cnt->open = 0;
- }
-
- mu_push_clip_rect(ctx, cnt->body);
- return MU_RES_ACTIVE;
-}
-
-
-int mu_begin_window(mu_Context *ctx, mu_Container *cnt, const char *title) {
- return mu_begin_window_ex(ctx, cnt, title, 0);
-}
-
-
-void mu_end_window(mu_Context *ctx) {
- mu_pop_clip_rect(ctx);
- end_root_container(ctx);
-}
-
-
-void mu_open_popup(mu_Context *ctx, mu_Container *cnt) {
- /* set as hover root so popup isn't closed in begin_window_ex() */
- ctx->last_hover_root = ctx->hover_root = cnt;
- /* init container if not inited */
- if (!cnt->inited) { mu_init_window(ctx, cnt, 0); }
- /* position at mouse cursor, open and bring-to-front */
- cnt->rect = mu_rect(ctx->mouse_pos.x, ctx->mouse_pos.y, 0, 0);
- cnt->open = 1;
- mu_bring_to_front(ctx, cnt);
-}
-
-
-int mu_begin_popup(mu_Context *ctx, mu_Container *cnt) {
- int opt = MU_OPT_POPUP | MU_OPT_AUTOSIZE | MU_OPT_NORESIZE |
- MU_OPT_NOSCROLL | MU_OPT_NOTITLE | MU_OPT_CLOSED;
- return mu_begin_window_ex(ctx, cnt, "", opt);
-}
-
-
-void mu_end_popup(mu_Context *ctx) {
- mu_end_window(ctx);
-}
-
-
-void mu_begin_panel_ex(mu_Context *ctx, mu_Container *cnt, int opt) {
- cnt->rect = mu_layout_next(ctx);
- if (~opt & MU_OPT_NOFRAME) {
- ctx->draw_frame(ctx, cnt->rect, MU_COLOR_PANELBG);
- }
- push_container(ctx, cnt);
- push_container_body(ctx, cnt, cnt->rect, opt);
- mu_push_clip_rect(ctx, cnt->body);
-}
-
-
-void mu_begin_panel(mu_Context *ctx, mu_Container *cnt) {
- mu_begin_panel_ex(ctx, cnt, 0);
-}
-
-
-void mu_end_panel(mu_Context *ctx) {
- mu_pop_clip_rect(ctx);
- pop_container(ctx);
-}
--- a/src/microui.h
+++ /dev/null
@@ -1,299 +1,0 @@
-/*
-** Copyright (c) 2019 rxi
-**
-** This library is free software; you can redistribute it and/or modify it
-** under the terms of the MIT license. See `microui.c` for details.
-*/
-
-#ifndef MICROUI_H
-#define MICROUI_H
-
-#define MU_VERSION "1.02"
-
-#define MU_COMMANDLIST_SIZE (1024 * 256)
-#define MU_ROOTLIST_SIZE 32
-#define MU_CONTAINERSTACK_SIZE 32
-#define MU_CLIPSTACK_SIZE 32
-#define MU_IDSTACK_SIZE 32
-#define MU_LAYOUTSTACK_SIZE 16
-#define MU_MAX_WIDTHS 16
-#define MU_REAL float
-#define MU_REAL_FMT "%.3g"
-#define MU_SLIDER_FMT "%.2f"
-#define MU_MAX_FMT 127
-
-#define mu_stack(T, n) struct { int idx; T items[n]; }
-#define mu_min(a, b) ((a) < (b) ? (a) : (b))
-#define mu_max(a, b) ((a) > (b) ? (a) : (b))
-#define mu_clamp(x, a, b) mu_min(b, mu_max(a, x))
-
-enum {
- MU_CLIP_NONE,
- MU_CLIP_PART,
- MU_CLIP_ALL
-};
-
-enum {
- MU_COMMAND_JUMP = 1,
- MU_COMMAND_CLIP,
- MU_COMMAND_RECT,
- MU_COMMAND_TEXT,
- MU_COMMAND_ICON,
- MU_COMMAND_MAX
-};
-
-enum {
- MU_COLOR_TEXT,
- MU_COLOR_BORDER,
- MU_COLOR_WINDOWBG,
- MU_COLOR_TITLEBG,
- MU_COLOR_TITLETEXT,
- MU_COLOR_PANELBG,
- MU_COLOR_BUTTON,
- MU_COLOR_BUTTONHOVER,
- MU_COLOR_BUTTONFOCUS,
- MU_COLOR_BASE,
- MU_COLOR_BASEHOVER,
- MU_COLOR_BASEFOCUS,
- MU_COLOR_SCROLLBASE,
- MU_COLOR_SCROLLTHUMB,
- MU_COLOR_MAX
-};
-
-#ifdef __plan9__
-enum {
- MU_ICON_CHECK,
- MU_ICON_CLOSE,
- MU_ICON_COLLAPSED,
- MU_ICON_EXPANDED,
- ATLAS_DIMENSIONS,
-};
-#else
-enum {
- MU_ICON_CLOSE = 1,
- MU_ICON_CHECK,
- MU_ICON_COLLAPSED,
- MU_ICON_EXPANDED,
- MU_ICON_MAX
-};
-#endif
-
-enum {
- MU_RES_ACTIVE = (1 << 0),
- MU_RES_SUBMIT = (1 << 1),
- MU_RES_CHANGE = (1 << 2)
-};
-
-enum {
- MU_OPT_ALIGNCENTER = (1 << 0),
- MU_OPT_ALIGNRIGHT = (1 << 1),
- MU_OPT_NOINTERACT = (1 << 2),
- MU_OPT_NOFRAME = (1 << 3),
- MU_OPT_NORESIZE = (1 << 4),
- MU_OPT_NOSCROLL = (1 << 5),
- MU_OPT_NOCLOSE = (1 << 6),
- MU_OPT_NOTITLE = (1 << 7),
- MU_OPT_HOLDFOCUS = (1 << 8),
- MU_OPT_AUTOSIZE = (1 << 9),
- MU_OPT_POPUP = (1 << 10),
- MU_OPT_CLOSED = (1 << 11)
-};
-
-enum {
- MU_MOUSE_LEFT = (1 << 0),
- MU_MOUSE_RIGHT = (1 << 1),
- MU_MOUSE_MIDDLE = (1 << 2)
-};
-
-enum {
- MU_KEY_SHIFT = (1 << 0),
- MU_KEY_CTRL = (1 << 1),
- MU_KEY_ALT = (1 << 2),
- MU_KEY_BACKSPACE = (1 << 3),
- MU_KEY_RETURN = (1 << 4),
- MU_KEY_NACK = (1 << 5),
- MU_KEY_LEFT = (1 << 6),
- MU_KEY_RIGHT = (1 << 7),
-};
-
-
-typedef struct mu_Context mu_Context;
-typedef unsigned mu_Id;
-typedef MU_REAL mu_Real;
-typedef void* mu_Font;
-
-typedef struct { int x, y; } mu_Vec2;
-typedef struct { int x, y, w, h; } mu_Rect;
-typedef struct { unsigned char r, g, b, a; } mu_Color;
-
-typedef struct { int type, size; } mu_BaseCommand;
-typedef struct { mu_BaseCommand base; void *dst; } mu_JumpCommand;
-typedef struct { mu_BaseCommand base; mu_Rect rect; } mu_ClipCommand;
-typedef struct { mu_BaseCommand base; mu_Rect rect; mu_Color color; } mu_RectCommand;
-typedef struct { mu_BaseCommand base; mu_Font font; mu_Vec2 pos; mu_Color color; char str[1]; } mu_TextCommand;
-typedef struct { mu_BaseCommand base; mu_Rect rect; int id; mu_Color color; } mu_IconCommand;
-
-typedef union {
- int type;
- mu_BaseCommand base;
- mu_JumpCommand jump;
- mu_ClipCommand clip;
- mu_RectCommand rect;
- mu_TextCommand text;
- mu_IconCommand icon;
-} mu_Command;
-
-
-typedef struct {
- mu_Rect body;
- mu_Rect next;
- mu_Vec2 position;
- mu_Vec2 size;
- mu_Vec2 max;
- int widths[MU_MAX_WIDTHS];
- int items;
- int row_index;
- int next_row;
- int next_type;
- int indent;
-} mu_Layout;
-
-
-typedef struct {
- mu_Command *head, *tail;
- mu_Rect rect;
- mu_Rect body;
- mu_Vec2 content_size;
- mu_Vec2 scroll;
- int inited;
- int zindex;
- int open;
-} mu_Container;
-
-
-typedef struct {
- mu_Font font;
- mu_Vec2 size;
- int padding;
- int spacing;
- int indent;
- int title_height;
- int scrollbar_size;
- int thumb_size;
- mu_Color colors[MU_COLOR_MAX];
-} mu_Style;
-
-
-struct mu_Context {
- /* callbacks */
- int (*text_width)(mu_Font font, const char *str, int len);
- int (*text_height)(mu_Font font);
- void (*draw_frame)(mu_Context *ctx, mu_Rect rect, int colorid);
- /* core state */
- mu_Style _style;
- mu_Style *style;
- mu_Id hover;
- mu_Id focus;
- mu_Id last_id;
- mu_Rect last_rect;
- int last_zindex;
- int updated_focus;
- mu_Container *hover_root;
- mu_Container *last_hover_root;
- mu_Container *scroll_target;
- char number_buf[MU_MAX_FMT];
- mu_Id number_editing;
- /* stacks */
- mu_stack(char, MU_COMMANDLIST_SIZE) command_list;
- mu_stack(mu_Container*, MU_ROOTLIST_SIZE) root_list;
- mu_stack(mu_Container*, MU_CONTAINERSTACK_SIZE) container_stack;
- mu_stack(mu_Rect, MU_CLIPSTACK_SIZE) clip_stack;
- mu_stack(mu_Id, MU_IDSTACK_SIZE) id_stack;
- mu_stack(mu_Layout, MU_LAYOUTSTACK_SIZE) layout_stack;
- /* input state */
- mu_Vec2 mouse_pos;
- mu_Vec2 last_mouse_pos;
- mu_Vec2 mouse_delta;
- mu_Vec2 scroll_delta;
- int mouse_down;
- int mouse_pressed;
- int key_down;
- int key_pressed;
- char text_input[32];
-};
-
-
-mu_Vec2 mu_vec2(int x, int y);
-mu_Rect mu_rect(int x, int y, int w, int h);
-mu_Color mu_color(int r, int g, int b, int a);
-
-void mu_init(mu_Context *ctx);
-void mu_begin(mu_Context *ctx);
-void mu_end(mu_Context *ctx);
-void mu_set_focus(mu_Context *ctx, mu_Id id);
-mu_Id mu_get_id(mu_Context *ctx, const void *data, int size);
-void mu_push_id(mu_Context *ctx, const void *data, int size);
-void mu_pop_id(mu_Context *ctx);
-void mu_push_clip_rect(mu_Context *ctx, mu_Rect rect);
-void mu_pop_clip_rect(mu_Context *ctx);
-mu_Rect mu_get_clip_rect(mu_Context *ctx);
-int mu_check_clip(mu_Context *ctx, mu_Rect r);
-mu_Container* mu_get_container(mu_Context *ctx);
-void mu_init_window(mu_Context *ctx, mu_Container *cnt, int opt);
-void mu_bring_to_front(mu_Context *ctx, mu_Container *cnt);
-
-void mu_input_mousemove(mu_Context *ctx, int x, int y);
-void mu_input_mousedown(mu_Context *ctx, int x, int y, int btn);
-void mu_input_mouseup(mu_Context *ctx, int x, int y, int btn);
-void mu_input_scroll(mu_Context *ctx, int x, int y);
-void mu_input_keydown(mu_Context *ctx, int key);
-void mu_input_keyup(mu_Context *ctx, int key);
-void mu_input_text(mu_Context *ctx, const char *text);
-
-mu_Command* mu_push_command(mu_Context *ctx, int type, int size);
-int mu_next_command(mu_Context *ctx, mu_Command **cmd);
-void mu_set_clip(mu_Context *ctx, mu_Rect rect);
-void mu_draw_rect(mu_Context *ctx, mu_Rect rect, mu_Color color);
-void mu_draw_box(mu_Context *ctx, mu_Rect rect, mu_Color color);
-void mu_draw_text(mu_Context *ctx, mu_Font font, const char *str, int len, mu_Vec2 pos, mu_Color color);
-void mu_draw_icon(mu_Context *ctx, int id, mu_Rect rect, mu_Color color);
-
-void mu_layout_row(mu_Context *ctx, int items, const int *widths, int height);
-void mu_layout_width(mu_Context *ctx, int width);
-void mu_layout_height(mu_Context *ctx, int height);
-void mu_layout_begin_column(mu_Context *ctx);
-void mu_layout_end_column(mu_Context *ctx);
-void mu_layout_set_next(mu_Context *ctx, mu_Rect r, int relative);
-mu_Rect mu_layout_next(mu_Context *ctx);
-
-void mu_draw_control_frame(mu_Context *ctx, mu_Id id, mu_Rect rect, int colorid, int opt);
-void mu_draw_control_text(mu_Context *ctx, const char *str, mu_Rect rect, int colorid, int opt);
-int mu_mouse_over(mu_Context *ctx, mu_Rect rect);
-void mu_update_control(mu_Context *ctx, mu_Id id, mu_Rect rect, int opt);
-
-void mu_text(mu_Context *ctx, const char *text);
-void mu_label(mu_Context *ctx, const char *text);
-int mu_button_ex(mu_Context *ctx, const char *label, int icon, int opt);
-int mu_button(mu_Context *ctx, const char *label);
-int mu_checkbox(mu_Context *ctx, int *state, const char *label);
-int mu_textbox_raw(mu_Context *ctx, char *buf, int bufsz, mu_Id id, mu_Rect r, int opt);
-int mu_textbox_ex(mu_Context *ctx, char *buf, int bufsz, int opt);
-int mu_textbox(mu_Context *ctx, char *buf, int bufsz);
-int mu_slider_ex(mu_Context *ctx, mu_Real *value, mu_Real low, mu_Real high, mu_Real step, const char *fmt, int opt);
-int mu_slider(mu_Context *ctx, mu_Real *value, mu_Real low, mu_Real high);
-int mu_number_ex(mu_Context *ctx, mu_Real *value, mu_Real step, const char *fmt, int opt);
-int mu_number(mu_Context *ctx, mu_Real *value, mu_Real step);
-int mu_header(mu_Context *ctx, int *state, const char *label);
-int mu_begin_treenode(mu_Context *ctx, int *state, const char *label);
-void mu_end_treenode(mu_Context *ctx);
-int mu_begin_window_ex(mu_Context *ctx, mu_Container *cnt, const char *title, int opt);
-int mu_begin_window(mu_Context *ctx, mu_Container *cnt, const char *title);
-void mu_end_window(mu_Context *ctx);
-void mu_open_popup(mu_Context *ctx, mu_Container *cnt);
-int mu_begin_popup(mu_Context *ctx, mu_Container *cnt);
-void mu_end_popup(mu_Context *ctx);
-void mu_begin_panel_ex(mu_Context *ctx, mu_Container *cnt, int opt);
-void mu_begin_panel(mu_Context *ctx, mu_Container *cnt);
-void mu_end_panel(mu_Context *ctx);
-
-#endif