123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500 |
- #-------------------------------------------------------------------------------
- # Generate the sokol_color.h header from a predefined palette
- #-------------------------------------------------------------------------------
- # LICENSE
- # =======
- #
- # zlib/libpng license
- #
- # Copyright (c) 2020 Stuart Adams
- #
- # This software is provided 'as-is', without any express or implied warranty.
- # In no event will the authors be held liable for any damages arising from the
- # use of this software.
- #
- # Permission is granted to anyone to use this software for any purpose,
- # including commercial applications, and to alter it and redistribute it
- # freely, subject to the following restrictions:
- #
- # 1. The origin of this software must not be misrepresented; you must not
- # claim that you wrote the original software. If you use this software in a
- # product, an acknowledgment in the product documentation would be
- # appreciated but is not required.
- #
- # 2. Altered source versions must be plainly marked as such, and must not
- # be misrepresented as being the original software.
- #
- # 3. This notice may not be removed or altered from any source
- # distribution.
- colors = [
- ("Alice Blue", 0xF0F8FFFF),
- ("Antique White", 0xFAEBD7FF),
- ("Aqua", 0x00FFFFFF),
- ("Aquamarine", 0x7FFFD4FF),
- ("Azure", 0xF0FFFFFF),
- ("Beige", 0xF5F5DCFF),
- ("Bisque", 0xFFE4C4FF),
- ("Black", 0x000000FF),
- ("Blanched Almond", 0xFFEBCDFF),
- ("Blue", 0x0000FFFF),
- ("Blue Violet", 0x8A2BE2FF),
- ("Brown", 0xA52A2AFF),
- ("Burlywood", 0xDEB887FF),
- ("Cadet Blue", 0x5F9EA0FF),
- ("Chartreuse", 0x7FFF00FF),
- ("Chocolate", 0xD2691EFF),
- ("Coral", 0xFF7F50FF),
- ("Cornflower Blue", 0x6495EDFF),
- ("Cornsilk", 0xFFF8DCFF),
- ("Crimson", 0xDC143CFF),
- ("Cyan", 0x00FFFFFF),
- ("Dark Blue", 0x00008BFF),
- ("Dark Cyan", 0x008B8BFF),
- ("Dark Goldenrod", 0xB8860BFF),
- ("Dark Gray", 0xA9A9A9FF),
- ("Dark Green", 0x006400FF),
- ("Dark Khaki", 0xBDB76BFF),
- ("Dark Magenta", 0x8B008BFF),
- ("Dark Olive Green", 0x556B2FFF),
- ("Dark Orange", 0xFF8C00FF),
- ("Dark Orchid", 0x9932CCFF),
- ("Dark Red", 0x8B0000FF),
- ("Dark Salmon", 0xE9967AFF),
- ("Dark Sea Green", 0x8FBC8FFF),
- ("Dark Slate Blue", 0x483D8BFF),
- ("Dark Slate Gray", 0x2F4F4FFF),
- ("Dark Turquoise", 0x00CED1FF),
- ("Dark Violet", 0x9400D3FF),
- ("Deep Pink", 0xFF1493FF),
- ("Deep Sky Blue", 0x00BFFFFF),
- ("Dim Gray", 0x696969FF),
- ("Dodger Blue", 0x1E90FFFF),
- ("Firebrick", 0xB22222FF),
- ("Floral White", 0xFFFAF0FF),
- ("Forest Green", 0x228B22FF),
- ("Fuchsia", 0xFF00FFFF),
- ("Gainsboro", 0xDCDCDCFF),
- ("Ghost White", 0xF8F8FFFF),
- ("Gold", 0xFFD700FF),
- ("Goldenrod", 0xDAA520FF),
- ("Gray", 0xBEBEBEFF),
- ("Web Gray", 0x808080FF),
- ("Green", 0x00FF00FF),
- ("Web Green", 0x008000FF),
- ("Green Yellow", 0xADFF2FFF),
- ("Honeydew", 0xF0FFF0FF),
- ("Hot Pink", 0xFF69B4FF),
- ("Indian Red", 0xCD5C5CFF),
- ("Indigo", 0x4B0082FF),
- ("Ivory", 0xFFFFF0FF),
- ("Khaki", 0xF0E68CFF),
- ("Lavender", 0xE6E6FAFF),
- ("Lavender Blush", 0xFFF0F5FF),
- ("Lawn Green", 0x7CFC00FF),
- ("Lemon Chiffon", 0xFFFACDFF),
- ("Light Blue", 0xADD8E6FF),
- ("Light Coral", 0xF08080FF),
- ("Light Cyan", 0xE0FFFFFF),
- ("Light Goldenrod", 0xFAFAD2FF),
- ("Light Gray", 0xD3D3D3FF),
- ("Light Green", 0x90EE90FF),
- ("Light Pink", 0xFFB6C1FF),
- ("Light Salmon", 0xFFA07AFF),
- ("Light Sea Green", 0x20B2AAFF),
- ("Light Sky Blue", 0x87CEFAFF),
- ("Light Slate Gray", 0x778899FF),
- ("Light Steel Blue", 0xB0C4DEFF),
- ("Light Yellow", 0xFFFFE0FF),
- ("Lime", 0x00FF00FF),
- ("Lime Green", 0x32CD32FF),
- ("Linen", 0xFAF0E6FF),
- ("Magenta", 0xFF00FFFF),
- ("Maroon", 0xB03060FF),
- ("Web Maroon", 0x800000FF),
- ("Medium Aquamarine", 0x66CDAAFF),
- ("Medium Blue", 0x0000CDFF),
- ("Medium Orchid", 0xBA55D3FF),
- ("Medium Purple", 0x9370DBFF),
- ("Medium Sea Green", 0x3CB371FF),
- ("Medium Slate Blue", 0x7B68EEFF),
- ("Medium Spring Green", 0x00FA9AFF),
- ("Medium Turquoise", 0x48D1CCFF),
- ("Medium Violet Red", 0xC71585FF),
- ("Midnight Blue", 0x191970FF),
- ("Mint Cream", 0xF5FFFAFF),
- ("Misty Rose", 0xFFE4E1FF),
- ("Moccasin", 0xFFE4B5FF),
- ("Navajo White", 0xFFDEADFF),
- ("Navy Blue", 0x000080FF),
- ("Old Lace", 0xFDF5E6FF),
- ("Olive", 0x808000FF),
- ("Olive Drab", 0x6B8E23FF),
- ("Orange", 0xFFA500FF),
- ("Orange Red", 0xFF4500FF),
- ("Orchid", 0xDA70D6FF),
- ("Pale Goldenrod", 0xEEE8AAFF),
- ("Pale Green", 0x98FB98FF),
- ("Pale Turquoise", 0xAFEEEEFF),
- ("Pale Violet Red", 0xDB7093FF),
- ("Papaya Whip", 0xFFEFD5FF),
- ("Peach Puff", 0xFFDAB9FF),
- ("Peru", 0xCD853FFF),
- ("Pink", 0xFFC0CBFF),
- ("Plum", 0xDDA0DDFF),
- ("Powder Blue", 0xB0E0E6FF),
- ("Purple", 0xA020F0FF),
- ("Web Purple", 0x800080FF),
- ("Rebecca Purple", 0x663399FF),
- ("Red", 0xFF0000FF),
- ("Rosy Brown", 0xBC8F8FFF),
- ("Royal Blue", 0x4169E1FF),
- ("Saddle Brown", 0x8B4513FF),
- ("Salmon", 0xFA8072FF),
- ("Sandy Brown", 0xF4A460FF),
- ("Sea Green", 0x2E8B57FF),
- ("Seashell", 0xFFF5EEFF),
- ("Sienna", 0xA0522DFF),
- ("Silver", 0xC0C0C0FF),
- ("Sky Blue", 0x87CEEBFF),
- ("Slate Blue", 0x6A5ACDFF),
- ("Slate Gray", 0x708090FF),
- ("Snow", 0xFFFAFAFF),
- ("Spring Green", 0x00FF7FFF),
- ("Steel Blue", 0x4682B4FF),
- ("Tan", 0xD2B48CFF),
- ("Teal", 0x008080FF),
- ("Thistle", 0xD8BFD8FF),
- ("Tomato", 0xFF6347FF),
- ("Transparent", 0x00000000),
- ("Turquoise", 0x40E0D0FF),
- ("Violet", 0xEE82EEFF),
- ("Wheat", 0xF5DEB3FF),
- ("White", 0xFFFFFFFF),
- ("White Smoke", 0xF5F5F5FF),
- ("Yellow", 0xFFFF00FF),
- ("Yellow Green", 0x9ACD32FF)
- ]
- header = open("sokol_color.h", "w")
- header.write("""#if defined(SOKOL_IMPL) && !defined(SOKOL_COLOR_IMPL)
- #define SOKOL_COLOR_IMPL
- #endif
- #ifndef SOKOL_COLOR_INCLUDED
- /*
- sokol_color.h -- sg_color utilities
- This header was generated by gen_sokol_color.py. Do not modify it.
- Project URL: https://github.com/floooh/sokol
- Include the following headers before including sokol_color.h:
- sokol_gfx.h
- FEATURE OVERVIEW
- ================
- sokol_color.h defines preset colors based on the X11 color names,
- alongside utility functions to create and modify sg_color objects.
- The predefined colors are based on the X11 color names:
- https://en.wikipedia.org/wiki/X11_color_names
- This palette is useful for prototyping - lots of programmers are familiar with
- these colours due to their use in X11, web development and XNA / MonoGame. They
- are also handy when you want to reference a familiar color, but don't want to
- write it out by hand.
- COLORS
- ======
- The palette is defined using static const (or constexpr if you are using a
- C++ compiler) objects. These objects use lowercase names:
- static SOKOL_COLOR_CONSTEXPR sg_color sg_red = SG_RED;
- static SOKOL_COLOR_CONSTEXPR sg_color sg_green = SG_GREEN;
- static SOKOL_COLOR_CONSTEXPR sg_color sg_blue = SG_BLUE;
- An sg_color preset object like sg_red can be used to initialize
- an sg_pass_action:
- sg_pass_action pass_action = {
- .colors[0] = { .action=SG_ACTION_CLEAR, .value = sg_red }
- };
- Initializing an object with static storage duration is more complicated
- because of C language rules. Technically, a static const is not a
- compile-time constant in C. To work around this, the palette is also
- defined as a series of brace-enclosed list macro definitions. These
- definitions use uppercase names:
- #define SG_RED { 1.0f, 0.0f, 0.0f, 1.0f }
- #define SG_GREEN { 0.0f, 1.0f, 0.0f, 1.0f }
- #define SG_BLUE { 0.0f, 0.0f, 1.0f, 1.0f }
- A preset macro like SG_RED can be used to initialize objects with static
- storage duration:
- static struct {
- sg_pass_action pass_action;
- } state = {
- .pass_action = {
- .colors[0] = { .action = SG_ACTION_CLEAR, .value = SG_RED }
- }
- };
- A second set of macro definitions exists for colors packed as 32 bit integer
- values. These definitions are also uppercase, but use the _RGBA32 suffix:
- #define SG_RED_RGBA32 0xFF0000FF
- #define SG_GREEN_RGBA32 0x00FF00FF
- #define SG_BLUE_RGBA32 0x0000FFFF
- This is useful if your code makes use of packed colors, as sokol_gl.h does for its
- internal vertex format:
- sgl_begin_triangles();
- sgl_v2f_c1i( 0.0f, 0.5f, SG_RED_RGBA32);
- sgl_v2f_c1i( 0.5f, -0.5f, SG_GREEN_RGBA32);
- sgl_v2f_c1i(-0.5f, -0.5f, SG_BLUE_RGBA32);
- sgl_end();
- UTILITY FUNCTIONS
- =================
- Utility functions for creating colours are provided:
- - sg_make_color_4b(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
- Create a sg_color object from separate R, G, B, A bytes.
- - sg_make_color_1i(uint32_t rgba)
- Create a sg_color object from RGBA bytes packed into a 32-bit unsigned integer.
- - sg_color_lerp(const sg_color* color_a, const sg_color* color_b, float amount)
- Linearly interpolate a color.
- - sg_color_lerp_precise(const sg_color* color_a, const sg_color* color_b, float amount)
- Linearly interpolate a color. Less efficient but more precise than sg_color_lerp.
- - sg_color_multiply(const sg_color* color, float scale)
- Multiply each color component by the scale factor.
- LICENSE
- =======
- zlib/libpng license
- Copyright (c) 2020 Stuart Adams
- This software is provided 'as-is', without any express or implied warranty.
- In no event will the authors be held liable for any damages arising from the
- use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software in a
- product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not
- be misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source
- distribution.
- */
- #define SOKOL_COLOR_INCLUDED (1)
- #if !defined(SOKOL_GFX_INCLUDED)
- #error "Please include sokol_gfx.h before sokol_color.h"
- #endif
- #if defined(SOKOL_API_DECL) && !defined(SOKOL_GL_API_DECL)
- #define SOKOL_COLOR_API_DECL SOKOL_API_DECL
- #endif
- #ifndef SOKOL_COLOR_API_DECL
- #if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_COLOR_IMPL)
- #define SOKOL_COLOR_API_DECL __declspec(dllexport)
- #elif defined(_WIN32) && defined(SOKOL_DLL)
- #define SOKOL_COLOR_API_DECL __declspec(dllimport)
- #else
- #define SOKOL_COLOR_API_DECL extern
- #endif
- #endif
- #ifdef __cplusplus
- #define SOKOL_COLOR_CONSTEXPR constexpr
- extern "C" {
- #else
- #define SOKOL_COLOR_CONSTEXPR const
- #endif
- SOKOL_COLOR_API_DECL sg_color sg_make_color_4b(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
- SOKOL_COLOR_API_DECL sg_color sg_make_color_1i(uint32_t rgba);
- SOKOL_COLOR_API_DECL sg_color sg_color_lerp(const sg_color* color_a, const sg_color* color_b, float amount);
- SOKOL_COLOR_API_DECL sg_color sg_color_lerp_precise(const sg_color* color_a, const sg_color* color_b, float amount);
- SOKOL_COLOR_API_DECL sg_color sg_color_multiply(const sg_color* color, float scale);
- """)
- def unpack_rgba(color):
- red = (color & 0xFF000000) >> 24
- green = (color & 0xFF0000) >> 16
- blue = (color & 0xFF00) >> 8
- alpha = (color & 0xFF)
- return (red, green, blue, alpha)
- def add_documentation(color):
- documentation = "/* {name} color {{ R:{r}, G:{g}, B:{b}, A:{a} }} */\n"
- rgba = unpack_rgba(color[1])
- header.write(documentation.format(
- name = color[0], r = rgba[0], g = rgba[1], b = rgba[2], a = rgba[3]))
- for color in colors:
- add_documentation(color)
- init_color = "SG_" + color[0].upper().replace(" ", "_")
- init_color_definition = "#define {name} {{ {r}f, {g}f, {b}f, {a}f }}\n"
- rgba = unpack_rgba(color[1])
- r = rgba[0] / 255
- g = rgba[1] / 255
- b = rgba[2] / 255
- a = rgba[3] / 255
- r_text = "{:.1f}".format(r) if r.is_integer() else "{:.9g}".format(r)
- g_text = "{:.1f}".format(g) if g.is_integer() else "{:.9g}".format(g)
- b_text = "{:.1f}".format(b) if b.is_integer() else "{:.9g}".format(b)
- a_text = "{:.1f}".format(a) if a.is_integer() else "{:.9g}".format(a)
- header.write(init_color_definition.format(
- name = init_color, r = r_text, g = g_text, b = b_text, a = a_text))
- header.write("\n")
- for color in colors:
- add_documentation(color)
- init_color = "sg_" + color[0].lower().replace(" ", "_")
- init_color_definition = "static SOKOL_COLOR_CONSTEXPR sg_color {name} = {init};\n"
- init_color_name = "SG_" + color[0].upper().replace(" ", "_")
- header.write(init_color_definition.format(name = init_color, init = init_color_name))
- header.write("\n")
- for color in colors:
- add_documentation(color)
- hex_color = "0x{0:08X}".format(color[1])
- packed_color = "SG_" + color[0].upper().replace(" ", "_") + "_RGBA32"
- packed_color_definition = "#define {name} {rgba}\n"
- header.write(packed_color_definition.format(name = packed_color, rgba = hex_color))
- header.write("""
- #ifdef __cplusplus
- } /* extern "C" */
- inline sg_color sg_make_color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
- return sg_make_color_4b(r, g, b, a);
- }
- inline sg_color sg_make_color(uint32_t rgba) {
- return sg_make_color_1i(rgba);
- }
- inline sg_color sg_color_lerp(const sg_color& color_a, const sg_color& color_b, float amount) {
- return sg_color_lerp(&color_a, &color_b, amount);
- }
- inline sg_color sg_color_lerp_precise(const sg_color& color_a, const sg_color& color_b, float amount) {
- return sg_color_lerp_precise(&color_a, &color_b, amount);
- }
- inline sg_color sg_color_multiply(const sg_color& color, float scale) {
- return sg_color_multiply(&color, scale);
- }
- #endif /* __cplusplus */
- #endif /* SOKOL_COLOR_INCLUDED */
- /*-- IMPLEMENTATION ----------------------------------------------------------*/
- #ifdef SOKOL_COLOR_IMPL
- #define SOKOL_COLOR_IMPL_INCLUDED (1)
- #ifndef SOKOL_API_IMPL
- #define SOKOL_API_IMPL
- #endif
- #ifndef SOKOL_ASSERT
- #include <assert.h>
- #define SOKOL_ASSERT(c) assert(c)
- #endif
- static inline float _sg_color_clamp(float v, float low, float high) {
- if (v < low) {
- return low;
- } else if (v > high) {
- return high;
- }
- return v;
- }
- static inline float _sg_color_lerp(float a, float b, float amount) {
- return a + (b - a) * amount;
- }
- static inline float _sg_color_lerp_precise(float a, float b, float amount) {
- return ((1.0f - amount) * a) + (b * amount);
- }
- SOKOL_API_IMPL sg_color sg_make_color_4b(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
- sg_color result;
- result.r = r / 255.0f;
- result.g = g / 255.0f;
- result.b = b / 255.0f;
- result.a = a / 255.0f;
- return result;
- }
- SOKOL_API_IMPL sg_color sg_make_color_1i(uint32_t rgba) {
- return sg_make_color_4b(
- (uint8_t)(rgba >> 24),
- (uint8_t)(rgba >> 16),
- (uint8_t)(rgba >> 8),
- (uint8_t)(rgba >> 0)
- );
- }
- SOKOL_API_IMPL sg_color sg_color_lerp(const sg_color* color_a, const sg_color* color_b, float amount) {
- SOKOL_ASSERT(color_a);
- SOKOL_ASSERT(color_b);
- amount = _sg_color_clamp(amount, 0.0f, 1.0f);
- sg_color result;
- result.r = _sg_color_lerp(color_a->r, color_b->r, amount);
- result.g = _sg_color_lerp(color_a->g, color_b->g, amount);
- result.b = _sg_color_lerp(color_a->b, color_b->b, amount);
- result.a = _sg_color_lerp(color_a->a, color_b->a, amount);
- return result;
- }
- SOKOL_API_IMPL sg_color sg_color_lerp_precise(const sg_color* color_a, const sg_color* color_b, float amount) {
- SOKOL_ASSERT(color_a);
- SOKOL_ASSERT(color_b);
- amount = _sg_color_clamp(amount, 0.0f, 1.0f);
- sg_color result;
- result.r = _sg_color_lerp_precise(color_a->r, color_b->r, amount);
- result.g = _sg_color_lerp_precise(color_a->g, color_b->g, amount);
- result.b = _sg_color_lerp_precise(color_a->b, color_b->b, amount);
- result.a = _sg_color_lerp_precise(color_a->a, color_b->a, amount);
- return result;
- }
- SOKOL_API_IMPL sg_color sg_color_multiply(const sg_color* color, float scale) {
- SOKOL_ASSERT(color);
- sg_color result;
- result.r = color->r * scale;
- result.g = color->g * scale;
- result.b = color->b * scale;
- result.a = color->a * scale;
- return result;
- }
- #endif /* SOKOL_COLOR_IMPL */
- """)
|