Squashed 'external/sdl_nyan/' content from commit 2307b735e

git-subtree-dir: external/sdl_nyan
git-subtree-split: 2307b735e7aab49024356c6b94bbafe0c35e7027
This commit is contained in:
oxmox 2023-03-12 12:00:25 +01:00
commit 3086bd1629
43 changed files with 9373 additions and 0 deletions

9
.gitignore vendored Normal file
View file

@ -0,0 +1,9 @@
build*/
.cache/
.clangd/
.cmake/
CMakeLists.txt.user*
compile_commands.json
**/*.swo
**/*.swp
.vscode/

13
CMakeLists.txt Normal file
View file

@ -0,0 +1,13 @@
cmake_minimum_required(VERSION 3.14)
project(sdl-nyan)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
## Create binaries in the root of the build directory
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "ON")
find_package(SDL2 REQUIRED)
add_subdirectory(src)

21
LICENSE Normal file
View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 oxmox
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.

40
README.md Normal file
View file

@ -0,0 +1,40 @@
# sdl_nyan
Tiny SDL2-based library and demo application for rendering animated nyan cats.
Rainbows not included, cats only!
![Screenshot of sdl_nyan_demo. Shows individual nyan sprites and some spinning cats.](sdl_nyan_demo.png)
## Requirements and building
Requires CMake>=3.14, SDL2 and a c11/c++17 capable compiler.
git clone https://github.com/oxmox42/sdl_nyan
mkdir sdl_nyan/build && cd sdl_nyan/build/
cmake .. && make
./sdl_nyan_demo
## Usage
Only internal use in the demo application tested so far. Needs more CMake-foo to
be installable as "proper" library.
The nyan sprites have been converted to c code and are included in the library,
so there's no need to keep the `.png` files around.
Create a `SDL_Renderer` and call `make_nyan_sprite_sheet_from_mem()`. This
creates a texture containing all 12 rightward-facing nyan sprites.
Use `nyan_sprite_rect()` to get the `SDL_Rect` for a specific sprite. This can
be used as the `sourceRect` for `SDL_RenderCopy` or `SDL_RenderCopyEx`.
See the demo on how to make circly, spinny nyans.
Meow!
## External projects used in sdl_nyan
* Nyan sprites taken from https://github.com/splitbrain/nyan which does not have a license.
* Uses stb_image from https://github.com/nothings/stb (MIT | public domain).
* [image_to_c](https://github.com/bitbank2/image_to_c) was used to generate C code from the nyan sprites.

8
external/nyan/README vendored Normal file
View file

@ -0,0 +1,8 @@
This is just a quick hack done in an evening. There's no license for my code,
do what ever you want with it. NO WARRANTIES whatsoever.
As for the Nyan graphics and sounds... I believe this little fun project to
be in the spirit of the original idea and hopefully be okay with the copyright
holders (if there are any). If not, just send me a mail (andi@splitbrain.org)
and I'll take it down.
For the orginal Nyan cat, please visit http://nyan.cat

28
external/nyan/index.html vendored Normal file
View file

@ -0,0 +1,28 @@
<html>
<head>
<title>Canvas Nyan Cat</title>
<script type="text/javascript" src="nyan/nyan.js"></script>
<script type="text/javascript">
// you might want to use your favorite JS framework's DOMready
// implementation instead of window.onload
window.onload = function(){
nyan.init('nyan');
};
</script>
</head>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum accumsan libero ac purus pellentesque quis viverra quam mollis. Sed accumsan ultricies nisl, at egestas quam euismod in. Sed nec elit nunc, a porta quam. Vestibulum semper placerat arcu in semper. Duis semper ornare eros, et sollicitudin neque bibendum eget. Praesent non suscipit risus. Aliquam porta viverra odio in ultrices. Aenean ornare rutrum sodales. In scelerisque orci eu diam egestas a feugiat dolor ultrices. Suspendisse et ipsum augue, vestibulum feugiat nunc.</p>
<p>Proin commodo pretium justo non dapibus. Aliquam nec nulla sed dui fermentum dignissim. Nullam sit amet nunc risus, a feugiat tortor. Quisque justo turpis, dignissim ac sagittis a, imperdiet sit amet turpis. In pharetra, sem sed gravida eleifend, lorem tellus suscipit erat, ut fringilla lectus dui at eros. Nulla et urna erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam vel elit consectetur orci elementum pharetra at dapibus purus. Cras rutrum bibendum nisl, a mattis orci auctor ac. Mauris ut commodo neque. Phasellus et molestie sem. Nunc vitae ante sed orci tincidunt vestibulum et sit amet mauris. Pellentesque eu suscipit lectus. Praesent aliquet sem viverra odio dapibus in porta tortor porta.</p>
<p>Nullam id urna id mauris malesuada euismod. Donec pellentesque facilisis consequat. Nullam porttitor, eros sit amet suscipit sodales, lacus diam vestibulum velit, in consequat massa eros at lacus. Donec auctor, sem mattis sagittis aliquam, erat ipsum interdum purus, semper fermentum sapien leo ac libero. Fusce congue, ipsum in tempus viverra, libero arcu ultrices arcu, vitae tempor purus leo facilisis nisi. Proin vitae neque est, at ultrices magna. Sed interdum erat id nibh euismod commodo nec ac orci. Suspendisse potenti. Suspendisse quis tortor eros. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec commodo risus at diam facilisis iaculis. Aenean at neque nec dolor sollicitudin pharetra. Maecenas sit amet varius nisl. Sed ut luctus augue.</p>
<p>In vestibulum facilisis condimentum. Morbi non tincidunt mauris. Sed nec diam elit. Integer vestibulum nulla sit amet lorem bibendum in vulputate diam feugiat. Aenean faucibus scelerisque turpis, et posuere ligula rutrum ac. Aenean posuere vulputate congue. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
<p>Maecenas commodo tincidunt accumsan. Phasellus vel rhoncus lacus. Proin quis neque ante, sed tristique tortor. Curabitur dapibus volutpat posuere. Etiam sagittis elementum risus in fermentum. Fusce fringilla, mi sit amet adipiscing tristique, ipsum justo lacinia lectus, at venenatis velit diam eget quam. Ut nec elementum neque. Sed quam risus, adipiscing vel tristique eu, ornare eget sapien. Nunc fermentum dolor ut sem pulvinar at venenatis arcu placerat. Nulla vestibulum diam et justo pharetra rutrum. Nullam vel odio nec magna auctor rutrum a quis magna. Donec ligula libero, sollicitudin vel rhoncus hendrerit, pharetra at mauris. Praesent cursus, ipsum sit amet rhoncus euismod, turpis nunc suscipit mauris, id cursus nibh nibh ac justo. Praesent nec erat vel sem facilisis semper eu ut massa. Suspendisse a sagittis leo.</p>
</body>
</html>

BIN
external/nyan/nyan/l1.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

BIN
external/nyan/nyan/l10.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 B

BIN
external/nyan/nyan/l11.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 B

BIN
external/nyan/nyan/l12.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

BIN
external/nyan/nyan/l2.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

BIN
external/nyan/nyan/l3.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

BIN
external/nyan/nyan/l4.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 B

BIN
external/nyan/nyan/l5.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 B

BIN
external/nyan/nyan/l6.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

BIN
external/nyan/nyan/l7.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

BIN
external/nyan/nyan/l8.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

BIN
external/nyan/nyan/l9.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

186
external/nyan/nyan/nyan.js vendored Normal file
View file

@ -0,0 +1,186 @@
/**
* A background canvas Nyan cat
*
* Does not work in IE
*/
var nyan = {
path: '',
wrapper: null,
canvas: null,
sound: null,
last: null,
step: 1,
timeout: null,
/**
* Call this when the DOM is ready
*
* @param string path - where the nyan cat files are located, no trailing slash!
*/
init: function (path){
nyan.path = path;
// keep out incompatible browsers
if(!document.createElement('audio').canPlayType) return;
if(!document.createElement('canvas').getContext) return;
// wrap around everythng in the body
// http://stackoverflow.com/questions/1577814
nyan.wrapper = document.createElement('div');
while (document.body.firstChild) {
nyan.wrapper.appendChild(document.body.firstChild);
}
nyan.setStyle(document.body,nyan.wrapper);
nyan.wrapper.style.zIndex = 5;
document.body.appendChild(nyan.wrapper);
// create the canvas
nyan.canvas = document.createElement('canvas');
nyan.setStyle(document.body,nyan.canvas);
nyan.canvas.style.zIndex = 1;
nyan.canvas.width = nyan.wrapper.offsetWidth;
nyan.canvas.height = nyan.wrapper.offsetHeight;
document.body.insertBefore(nyan.canvas,nyan.wrapper);
// add the audio object
nyan.sound = document.createElement('audio');
if(nyan.sound.canPlayType('audio/mpeg') != ''){
nyan.sound.src = nyan.path+'/nyanlooped.mp3';
}else{
nyan.sound.src = nyan.path+'/nyanlooped.ogg';
}
nyan.sound.addEventListener('ended',function(){
// loop around
// http://forestmist.org/2010/04/html5-audio-loops/
this.currentTime = 0;
}, false);
document.body.appendChild(nyan.sound);
// add mouse listener
nyan.wrapper.addEventListener('mousemove', nyan.onMouseMove);
},
/**
* Set the cursor to nyan cat in the correct animation step
*/
setCursor: function(step,left){
nyan.wrapper.style.cursor = 'url('+nyan.path+'/'+(left?'l':'r')+step+'.png), default';
},
/**
* Stops the madness
*/
stop: function(){
nyan.wrapper.style.cursor = 'auto';
nyan.sound.pause();
},
/**
* The real worker
*
* draws nyan cat, the rainbow and starts the audio
*/
onMouseMove: function(evt){
var mousePos = nyan.getMousePos(nyan.wrapper, evt);
if(!nyan.last){
nyan.last = mousePos;
return;
}
if(Math.abs(nyan.last.x - mousePos.x) >= 1 ||
Math.abs(nyan.last.y - mousePos.y) > 1) {
var context = nyan.canvas.getContext('2d');
// start sound and timeout
nyan.sound.play();
if(nyan.timeout) window.clearTimeout(nyan.timeout);
nyan.timeout = window.setTimeout(nyan.stop,500);
// red
context.beginPath();
context.rect(mousePos.x +5, mousePos.y +2, 15, 3);
context.fillStyle = 'rgba(255,0,0,0.5)';
context.fill();
// orange
context.beginPath();
context.rect(mousePos.x +5, mousePos.y +5, 15, 3);
context.fillStyle = 'rgba(255,153,0,0.5)';
context.fill();
// yellow
context.beginPath();
context.rect(mousePos.x +5, mousePos.y +8, 15, 3);
context.fillStyle = 'rgba(255,255,0,0.5)';
context.fill();
// geen
context.beginPath();
context.rect(mousePos.x +5, mousePos.y +11, 15, 3);
context.fillStyle = 'rgba(51,255,0,0.5)';
context.fill();
// blue
context.beginPath();
context.rect(mousePos.x +5, mousePos.y +14, 15, 3);
context.fillStyle = 'rgba(0,153,255,0.7)';
context.fill();
// purple
context.beginPath();
context.rect(mousePos.x +5, mousePos.y +17, 15, 3);
context.fillStyle = 'rgba(102,51,255,0.5)';
context.fill();
//animate
nyan.setCursor(nyan.step,((nyan.last.x - mousePos.x) > 0));
// animation counter
nyan.step++;
if(nyan.step > 12) nyan.step = 1;
// remember position
nyan.last = mousePos;
}
},
/**
* copy styles from body to our wrapper and canvas
*
* needed to keep any margins or paddings
*/
setStyle: function(from, to){
var style = window.getComputedStyle(from);
to.style.cssText = style.cssText;
to.style['position'] = 'absolute';
to.style['top'] = '0px';
to.style['left'] = '0px';
to.style['background'] = 'transparent none';
},
/**
* return mouse position relative to the given object
*/
getMousePos: function(obj, evt){
// get canvas position
var top = 0;
var left = 0;
while (obj && obj.tagName != 'BODY') {
top += obj.offsetTop;
left += obj.offsetLeft;
obj = obj.offsetParent;
}
// return relative mouse position
var mouseX = evt.clientX - left + window.pageXOffset;
var mouseY = evt.clientY - top + window.pageYOffset;
return {
x: mouseX,
y: mouseY
};
}
}

BIN
external/nyan/nyan/nyanlooped.mp3 vendored Normal file

Binary file not shown.

BIN
external/nyan/nyan/nyanlooped.ogg vendored Normal file

Binary file not shown.

BIN
external/nyan/nyan/r1.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

BIN
external/nyan/nyan/r10.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

BIN
external/nyan/nyan/r11.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

BIN
external/nyan/nyan/r12.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 B

BIN
external/nyan/nyan/r2.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

BIN
external/nyan/nyan/r3.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

BIN
external/nyan/nyan/r4.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

BIN
external/nyan/nyan/r5.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

BIN
external/nyan/nyan/r6.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 B

BIN
external/nyan/nyan/r7.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

BIN
external/nyan/nyan/r8.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

BIN
external/nyan/nyan/r9.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

BIN
sdl_nyan_demo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

36
src/CMakeLists.txt Normal file
View file

@ -0,0 +1,36 @@
set(SDL_NYAN_WARN_FLAGS -Wall -Wextra -Wpedantic)
# Source: log.c by rxi (https://github.com/rxi/log.c)
add_library(nyan_logc OBJECT log.c)
target_compile_features(nyan_logc PRIVATE c_std_11)
if (NOT WIN32)
target_compile_definitions(nyan_logc PRIVATE -DLOG_USE_COLOR)
endif()
target_compile_options(nyan_logc PUBLIC -fmacro-prefix-map=${CMAKE_CURRENT_SOURCE_DIR}=. PRIVATE ${SDL_NYAN_WARN_FLAGS})
find_program(CLANG_TIDY_EXECUTABLE clang-tidy)
if (CLANG_TIDY_EXECUTABLE)
set(CMAKE_C_CLANG_TIDY clang-tidy -p ${CMAKE_BINARY_DIR} --extra-arg=-std=c11)
set(CMAKE_CXX_CLANG_TIDY clang-tidy -p ${CMAKE_BINARY_DIR} --extra-arg=-std=c++17)
endif()
add_library(sdl_nyan STATIC sdl_nyan.cc)
target_compile_features(sdl_nyan PRIVATE cxx_std_17)
target_link_libraries(sdl_nyan
PRIVATE nyan_logc
PRIVATE SDL2::SDL2
)
target_include_directories(sdl_nyan
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
)
add_executable(sdl_nyan_demo sdl_nyan_demo.cc)
target_compile_features(sdl_nyan_demo PRIVATE cxx_std_17)
target_link_libraries(sdl_nyan_demo
PRIVATE sdl_nyan
PRIVATE SDL2::SDL2
)
if (WIN32)
target_link_libraries(sdl_nyan_demo PRIVATE SDL2::SDL2main)
endif()

168
src/log.c Normal file
View file

@ -0,0 +1,168 @@
/*
* Copyright (c) 2020 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.
*/
#include "log.h"
#define MAX_CALLBACKS 32
typedef struct {
log_LogFn fn;
void *udata;
int level;
} Callback;
static struct {
void *udata;
log_LockFn lock;
int level;
bool quiet;
Callback callbacks[MAX_CALLBACKS];
} L;
static const char *level_strings[] = {
"TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"
};
#ifdef LOG_USE_COLOR
static const char *level_colors[] = {
"\x1b[94m", "\x1b[36m", "\x1b[32m", "\x1b[33m", "\x1b[31m", "\x1b[35m"
};
#endif
static void stdout_callback(log_Event *ev) {
char buf[16];
buf[strftime(buf, sizeof(buf), "%H:%M:%S", ev->time)] = '\0';
#ifdef LOG_USE_COLOR
fprintf(
ev->udata, "%s %s%-5s\x1b[0m \x1b[90m%s:%d:\x1b[0m ",
buf, level_colors[ev->level], level_strings[ev->level],
ev->file, ev->line);
#else
fprintf(
ev->udata, "%s %-5s %s:%d: ",
buf, level_strings[ev->level], ev->file, ev->line);
#endif
vfprintf(ev->udata, ev->fmt, ev->ap);
fprintf(ev->udata, "\n");
fflush(ev->udata);
}
static void file_callback(log_Event *ev) {
char buf[64];
buf[strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ev->time)] = '\0';
fprintf(
ev->udata, "%s %-5s %s:%d: ",
buf, level_strings[ev->level], ev->file, ev->line);
vfprintf(ev->udata, ev->fmt, ev->ap);
fprintf(ev->udata, "\n");
fflush(ev->udata);
}
static void lock(void) {
if (L.lock) { L.lock(true, L.udata); }
}
static void unlock(void) {
if (L.lock) { L.lock(false, L.udata); }
}
const char* log_level_string(int level) {
return level_strings[level];
}
void log_set_lock(log_LockFn fn, void *udata) {
L.lock = fn;
L.udata = udata;
}
void log_set_level(int level) {
L.level = level;
}
void log_set_quiet(bool enable) {
L.quiet = enable;
}
int log_add_callback(log_LogFn fn, void *udata, int level) {
for (int i = 0; i < MAX_CALLBACKS; i++) {
if (!L.callbacks[i].fn) {
L.callbacks[i] = (Callback) { fn, udata, level };
return 0;
}
}
return -1;
}
int log_add_fp(FILE *fp, int level) {
return log_add_callback(file_callback, fp, level);
}
static void init_event(log_Event *ev, void *udata) {
if (!ev->time) {
time_t t = time(NULL);
ev->time = localtime(&t);
}
ev->udata = udata;
}
void log_log(int level, const char *file, int line, const char *fmt, ...) {
log_Event ev = {
.fmt = fmt,
.file = file,
.line = line,
.level = level,
};
lock();
if (!L.quiet && level >= L.level) {
init_event(&ev, stderr);
va_start(ev.ap, fmt);
stdout_callback(&ev);
va_end(ev.ap);
}
for (int i = 0; i < MAX_CALLBACKS && L.callbacks[i].fn; i++) {
Callback *cb = &L.callbacks[i];
if (level >= cb->level) {
init_event(&ev, cb->udata);
va_start(ev.ap, fmt);
cb->fn(&ev);
va_end(ev.ap);
}
}
unlock();
}

57
src/log.h Normal file
View file

@ -0,0 +1,57 @@
/**
* Copyright (c) 2020 rxi
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MIT license. See `log.c` for details.
*/
#ifndef LOG_H
#define LOG_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdarg.h>
#include <stdbool.h>
#include <time.h>
#define LOG_VERSION "0.1.0"
typedef struct {
va_list ap;
const char *fmt;
const char *file;
struct tm *time;
void *udata;
int line;
int level;
} log_Event;
typedef void (*log_LogFn)(log_Event *ev);
typedef void (*log_LockFn)(bool lock, void *udata);
enum { LOG_TRACE, LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR, LOG_FATAL };
#define log_trace(...) log_log(LOG_TRACE, __FILE__, __LINE__, __VA_ARGS__)
#define log_debug(...) log_log(LOG_DEBUG, __FILE__, __LINE__, __VA_ARGS__)
#define log_info(...) log_log(LOG_INFO, __FILE__, __LINE__, __VA_ARGS__)
#define log_warn(...) log_log(LOG_WARN, __FILE__, __LINE__, __VA_ARGS__)
#define log_error(...) log_log(LOG_ERROR, __FILE__, __LINE__, __VA_ARGS__)
#define log_fatal(...) log_log(LOG_FATAL, __FILE__, __LINE__, __VA_ARGS__)
const char* log_level_string(int level);
void log_set_lock(log_LockFn fn, void *udata);
void log_set_level(int level);
void log_set_quiet(bool enable);
int log_add_callback(log_LogFn fn, void *udata, int level);
int log_add_fp(FILE *fp, int level);
void log_log(int level, const char *file, int line, const char *fmt, ...);
#ifdef __cplusplus
}
#endif
#endif

514
src/nyan_data_r.c Normal file
View file

@ -0,0 +1,514 @@
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r10
// Data size = 468 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r10[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,
0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,
0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xdc,0x02,
0x04,0x01,0x2e,0x01,0x21,0x48,0xe1,0x4e,0x00,0x00,0x00,0x1d,0x69,0x54,0x58,0x74,
0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x72,0x65,0x61,
0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,
0x07,0x00,0x00,0x01,0x2b,0x49,0x44,0x41,0x54,0x48,0xc7,0xed,0x96,0x4b,0x12,0xc2,
0x30,0x08,0x86,0x21,0xd3,0x8d,0xf7,0xf0,0x06,0xf6,0x06,0xde,0xc3,0x65,0x38,0x53,
0x72,0x26,0x3d,0x13,0x6e,0x1a,0x9b,0xa6,0xd0,0x42,0xe3,0x38,0x3a,0x23,0x9b,0x66,
0xda,0x3c,0x3e,0xe0,0x27,0x14,0xe0,0x6f,0x3f,0x66,0xe8,0x98,0xcb,0x9f,0x38,0xcf,
0x0a,0xc4,0x7c,0x4f,0xfd,0x34,0x23,0xed,0x9e,0x89,0x6e,0x98,0x47,0xf4,0x93,0x5c,
0xb2,0x19,0x2a,0xb8,0x36,0xd6,0x60,0x72,0x96,0xc7,0x07,0x9c,0x08,0x6e,0x18,0xe9,
0xc0,0x18,0xe5,0xf1,0x01,0xa8,0xe0,0x0e,0x7f,0xdc,0xdf,0x18,0x09,0x01,0x09,0x75,
0x07,0x96,0x85,0xb2,0x28,0x96,0xe1,0xed,0x65,0x4b,0x08,0x29,0xa5,0xd7,0x98,0x93,
0x5a,0x9c,0x5c,0xe6,0x11,0x11,0x17,0x5d,0x85,0x6e,0x82,0x8d,0x08,0xa4,0x94,0xe6,
0x48,0x29,0x30,0xad,0xf5,0x47,0x68,0x27,0x85,0x12,0x94,0x06,0x73,0x1c,0x28,0x67,
0x93,0x96,0x2c,0x00,0x1e,0x51,0xb3,0x7a,0x3b,0xb7,0x30,0x53,0xda,0x6a,0xfd,0x78,
0x6c,0x5a,0xc3,0x1a,0x10,0x97,0x1c,0xaf,0x36,0xd7,0xf4,0xa2,0x44,0xeb,0x1c,0x6f,
0x40,0x44,0xae,0x6f,0x41,0x12,0x9b,0xea,0x65,0xf4,0xdd,0xd2,0x57,0x3c,0xad,0xde,
0x15,0x08,0xe9,0x5b,0xab,0xa1,0xba,0x0c,0xbb,0xb4,0x14,0xe7,0x5c,0xa8,0x7a,0x2a,
0xcf,0x32,0x97,0x0c,0x1a,0xc2,0x45,0xcf,0x29,0xfd,0xa8,0x4e,0x9b,0x21,0x62,0xb5,
0x73,0xda,0x78,0xab,0xb9,0xb2,0xf0,0xde,0xd5,0x5c,0x5b,0x61,0x6f,0x45,0xbb,0xc9,
0x08,0x9a,0xbb,0x3d,0x00,0x80,0xe7,0xf7,0x03,0x47,0x32,0x57,0x5b,0x0d,0x63,0x01,
0xf2,0xeb,0xaa,0xf3,0xa7,0x6d,0x38,0xb0,0x98,0xa5,0x50,0x1b,0x9c,0x31,0xad,0x45,
0x4b,0xba,0x24,0x5d,0x19,0xf7,0x90,0xe6,0xb1,0xe3,0xfc,0xbf,0x7d,0xbf,0x3d,0x01,
0x02,0x72,0x88,0x5a,0x43,0x81,0x64,0x26,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,
0xae,0x42,0x60,0x82};
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r11
// Data size = 486 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r11[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,
0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,
0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xdc,0x02,
0x04,0x01,0x2e,0x01,0x21,0x48,0xe1,0x4e,0x00,0x00,0x00,0x1d,0x69,0x54,0x58,0x74,
0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x72,0x65,0x61,
0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,
0x07,0x00,0x00,0x01,0x3d,0x49,0x44,0x41,0x54,0x48,0xc7,0xed,0x96,0xcb,0x71,0x03,
0x31,0x08,0x86,0x41,0xb3,0x17,0xf7,0x91,0x0e,0xe2,0x0e,0xdc,0x47,0x8e,0xa2,0x26,
0x54,0x93,0x5d,0x13,0xb9,0x44,0x36,0xbb,0x11,0x08,0x76,0x3d,0x9e,0x49,0xc6,0x5c,
0xac,0x19,0xb1,0xe2,0xd3,0x6f,0x1e,0x02,0x78,0xdb,0x1f,0x33,0x4c,0xf8,0xca,0x2b,
0xe2,0x45,0x81,0x44,0xae,0x7c,0x9c,0xe6,0x4c,0xd3,0x98,0x98,0x86,0xb9,0xd5,0x3c,
0xc9,0x67,0x0b,0x43,0x95,0xd4,0xc1,0x16,0x4c,0x6b,0xe3,0xf5,0x8e,0x4b,0x94,0x34,
0xcc,0x28,0x60,0xad,0xe3,0xf5,0x0e,0xa8,0x92,0x96,0xbf,0xfa,0x07,0x23,0x21,0x20,
0xa1,0xaf,0xd8,0xa3,0x48,0x7e,0x15,0xca,0xf2,0xd4,0x92,0x25,0x04,0x66,0xbe,0xaf,
0x85,0xc5,0xba,0x80,0x74,0x3f,0x22,0x12,0x9d,0x53,0xe5,0x30,0x85,0xa1,0x00,0x33,
0xaf,0x95,0xda,0xec,0x59,0xb6,0x38,0x7d,0x06,0x8f,0xfe,0x85,0x23,0x28,0x0f,0x46,
0x03,0x89,0x76,0x24,0x22,0xbf,0x11,0xb6,0x36,0xcd,0xa5,0x28,0x80,0xd5,0x87,0x64,
0xf4,0xf1,0x0f,0x18,0xc8,0x95,0xfd,0x2a,0x69,0x0d,0xf0,0x46,0xe9,0xe0,0x9b,0x38,
0xa8,0x15,0x42,0x95,0x60,0xab,0xdb,0x75,0x28,0x57,0x99,0x5a,0x01,0xb4,0x1f,0x00,
0x7c,0xd4,0x2f,0xb8,0xe0,0x69,0x08,0xe9,0xed,0x95,0x81,0x62,0xa8,0x00,0x53,0x25,
0xaf,0xed,0x82,0x27,0x4b,0x89,0xe1,0x5e,0xa4,0xec,0x71,0x3a,0x54,0x07,0x8a,0xd5,
0x87,0xbc,0x66,0x3e,0xf5,0xdf,0xee,0x4b,0xbb,0x1a,0x63,0x9f,0x47,0xba,0xcc,0x27,
0x8a,0x69,0x85,0xad,0x75,0x76,0xb8,0xca,0x3d,0xa9,0x03,0x23,0x40,0x37,0xc6,0x59,
0x60,0xd5,0x18,0x57,0x1c,0x18,0x7d,0xff,0x44,0x9f,0x1f,0x78,0x8e,0x57,0xdb,0x16,
0xc6,0x03,0x92,0xe8,0x4d,0x9f,0xfd,0x60,0x5b,0x12,0xb7,0x10,0x4b,0x66,0x67,0x4e,
0x65,0xbf,0xb5,0x0f,0x35,0x7c,0x24,0x98,0x7f,0x32,0xa9,0x56,0x84,0xb7,0xfd,0x17,
0xfb,0x06,0x35,0x26,0x8f,0x02,0xfd,0xb4,0x15,0x54,0x00,0x00,0x00,0x00,0x49,0x45,
0x4e,0x44,0xae,0x42,0x60,0x82};
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r12
// Data size = 484 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r12[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,
0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,
0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xdc,0x02,
0x04,0x01,0x2e,0x01,0x21,0x48,0xe1,0x4e,0x00,0x00,0x00,0x1d,0x69,0x54,0x58,0x74,
0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x72,0x65,0x61,
0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,
0x07,0x00,0x00,0x01,0x3b,0x49,0x44,0x41,0x54,0x48,0xc7,0xed,0x96,0xcb,0x8d,0x02,
0x31,0x0c,0x40,0xe3,0x88,0xcb,0xf6,0x41,0x07,0xd0,0x01,0x7d,0xec,0x31,0xae,0xc9,
0xa9,0x89,0xa9,0xc9,0x7b,0x21,0x99,0x4c,0xb0,0xc7,0xf6,0x20,0x56,0x42,0xc2,0xa7,
0x11,0x31,0xf1,0xf3,0x3f,0x29,0x7d,0xe5,0xc3,0x04,0x02,0xba,0xfc,0x1f,0xf6,0xbc,
0x40,0xcc,0x77,0x7a,0x9d,0xe6,0x8a,0xa6,0x4d,0x08,0xc3,0x2c,0x25,0x4e,0x72,0xa9,
0x6e,0xa8,0x1c,0xba,0x58,0x83,0xa9,0x55,0xfe,0x3e,0xe0,0x44,0x0e,0xc3,0x48,0x06,
0xcb,0x6a,0x10,0x16,0x4c,0x80,0xe0,0x81,0x62,0xa9,0x2e,0x73,0x38,0xfc,0x45,0xf7,
0x16,0x10,0x12,0x11,0x25,0x22,0x5a,0xa1,0x24,0x07,0x52,0xe2,0xa6,0x37,0x43,0x9d,
0xde,0xd5,0xbe,0x0d,0x8a,0x89,0xc5,0x33,0x4d,0x4e,0x4a,0x6b,0xfb,0xc7,0x41,0xad,
0x6a,0xd4,0x36,0x91,0x72,0xc0,0xcc,0x40,0xdc,0x94,0x11,0x91,0xdd,0x50,0xa5,0x98,
0x91,0x8a,0x48,0x36,0x06,0x21,0x9b,0x5d,0x35,0xd5,0xcf,0x91,0xd4,0x8e,0x76,0xf2,
0xe6,0x4e,0xc4,0xae,0x34,0x14,0x9d,0x1d,0x15,0x01,0xf0,0x5c,0x7e,0x53,0xbb,0x2f,
0x72,0x96,0x9f,0x1c,0x45,0x54,0x95,0x95,0x8e,0x11,0xd3,0x76,0x83,0x9f,0xa7,0xdf,
0xda,0xbd,0xd2,0x99,0x67,0x52,0xf7,0x30,0xf2,0x9d,0xcc,0xe1,0xd6,0x52,0xd6,0xb4,
0xaa,0xa7,0xfc,0xd6,0x28,0x74,0x96,0x6c,0xac,0x15,0x30,0x3b,0x6c,0x47,0xc6,0x48,
0x6b,0xdf,0xaf,0xed,0xb2,0xa5,0xec,0xb6,0xf9,0x5c,0xd8,0x7b,0x86,0x87,0x8e,0xde,
0x70,0x58,0x40,0xdc,0x53,0xe6,0xdc,0x4b,0x91,0x6e,0x9b,0x61,0xcc,0x1a,0x22,0xa2,
0xee,0x65,0xe4,0xf9,0xf1,0xd8,0xe8,0x87,0xde,0x47,0xb0,0x07,0xe3,0x09,0x7d,0x74,
0xe6,0x48,0x51,0x09,0xed,0xb2,0xe1,0x02,0xd6,0xf2,0xae,0x39,0x23,0xfd,0xf7,0xe8,
0x8b,0x91,0x05,0x1d,0x8e,0x8e,0x8b,0x49,0x8f,0x83,0xcd,0xf4,0x95,0xcf,0x90,0x3f,
0xbd,0xa2,0x95,0x2f,0x7f,0x64,0xeb,0xd7,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,
0xae,0x42,0x60,0x82};
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r1
// Data size = 477 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r1[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,
0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,
0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xdc,0x02,
0x04,0x01,0x2e,0x01,0x21,0x48,0xe1,0x4e,0x00,0x00,0x00,0x1d,0x69,0x54,0x58,0x74,
0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x72,0x65,0x61,
0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,
0x07,0x00,0x00,0x01,0x34,0x49,0x44,0x41,0x54,0x48,0xc7,0xed,0x96,0xcd,0x99,0x03,
0x21,0x08,0x86,0xc5,0x67,0x2e,0xdb,0x47,0x3a,0x48,0x3a,0xd8,0x3e,0xf6,0x28,0x35,
0x61,0x4d,0xd9,0x9a,0xd8,0xcb,0x3a,0x31,0x0a,0x08,0xf9,0x3b,0x0d,0x97,0xf1,0x19,
0x05,0x5f,0x3f,0x41,0x4d,0xe9,0x30,0xdb,0x20,0x30,0x96,0x3f,0x31,0x9f,0x17,0x88,
0xf9,0x4a,0xcf,0xd3,0x5c,0x70,0x39,0x27,0x84,0x61,0x7e,0x4b,0x9c,0xe4,0x5c,0xdd,
0x50,0x39,0x14,0x58,0x83,0xa9,0x55,0x6e,0x3f,0xb0,0x88,0x1c,0x86,0x91,0x26,0x2c,
0x45,0x6e,0x3f,0x00,0x95,0xc3,0xf2,0x17,0x3b,0x30,0x20,0x24,0x40,0xb0,0x15,0xbb,
0x15,0xc9,0x54,0x28,0xdb,0x4b,0x4b,0x16,0x21,0x11,0xd1,0xde,0x66,0x62,0x6d,0x01,
0xdc,0xc6,0x21,0x22,0xf7,0x39,0x95,0x05,0x62,0x0e,0x95,0xb8,0xa2,0x00,0x11,0xdd,
0x2b,0x35,0xf4,0x69,0xb6,0x49,0x03,0x11,0xb1,0x01,0xc2,0x33,0x5b,0x28,0x41,0x59,
0x30,0x13,0x10,0x22,0x26,0x22,0x4a,0x44,0xd4,0x43,0xc9,0xaa,0x14,0x5f,0x92,0xae,
0x00,0xac,0xa4,0x86,0x4e,0x1d,0x3b,0xd0,0x08,0x53,0xeb,0x5d,0xfe,0x44,0xec,0xdf,
0x87,0xb5,0x2a,0xb3,0xa1,0xb4,0x8a,0x11,0xd4,0x3a,0x95,0x9f,0x3d,0x4e,0xa4,0x2f,
0x6b,0xa7,0x37,0x22,0xce,0x4e,0xc5,0x7f,0xc0,0x7d,0xc3,0xd7,0xf4,0xaf,0xc5,0x93,
0xfa,0x56,0x65,0x0f,0xae,0x0b,0x55,0xc8,0xa5,0x72,0xdb,0x0b,0x35,0x9f,0xda,0xb7,
0x8d,0xc5,0xc0,0xc1,0x08,0xd3,0x7d,0xd4,0x6f,0xdb,0x42,0xb1,0x5e,0x61,0xad,0xfd,
0xd6,0xcb,0x75,0x4c,0x6c,0x6b,0xe2,0xe1,0x88,0x01,0x2f,0xd0,0xbe,0x65,0xde,0xe7,
0x07,0x5c,0xd0,0x5d,0x6d,0x23,0xcc,0x0a,0x88,0xbd,0xab,0x7d,0xe5,0x83,0x6d,0x0b,
0xac,0xa4,0x05,0x60,0x4d,0x6e,0xe5,0xae,0x8a,0xf8,0xd9,0x0a,0x39,0x2a,0xcf,0xeb,
0x3f,0xfa,0x42,0x3a,0xec,0xb0,0x37,0xd9,0x1f,0xe5,0x5f,0x90,0x9d,0xe7,0x7f,0xd5,
0x7b,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82};
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r2
// Data size = 476 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r2[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,
0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,
0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xdc,0x02,
0x04,0x01,0x2e,0x01,0x21,0x48,0xe1,0x4e,0x00,0x00,0x00,0x1d,0x69,0x54,0x58,0x74,
0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x72,0x65,0x61,
0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,
0x07,0x00,0x00,0x01,0x33,0x49,0x44,0x41,0x54,0x48,0xc7,0xed,0x56,0xc1,0x0d,0x83,
0x30,0x0c,0xb4,0x23,0x3e,0xdd,0xa3,0x1b,0xb4,0x1b,0x74,0x8f,0x3e,0xe3,0x99,0xcc,
0x4c,0xed,0x4c,0xee,0x87,0x40,0x08,0x36,0xd8,0xd0,0xf6,0x85,0x25,0xa4,0x08,0x1c,
0xe7,0x72,0xe7,0x4b,0x00,0x38,0x63,0x3d,0x30,0x90,0x2b,0xff,0x58,0xcf,0x0b,0x48,
0xe4,0xc5,0xc7,0xd1,0xdc,0x69,0x73,0x4d,0x0c,0x83,0x79,0xe7,0x38,0x92,0x5b,0xef,
0x06,0x95,0x42,0x85,0x2d,0x30,0x7d,0xaf,0x8f,0x77,0x6c,0x22,0x85,0xc1,0x68,0x0b,
0xe6,0xac,0x8f,0x77,0x80,0x4a,0x61,0xfa,0xf3,0x76,0x61,0x24,0x04,0x24,0xb4,0x37,
0x30,0x37,0xca,0xcc,0x2c,0xdd,0xd7,0x6d,0x4b,0x08,0xcc,0x3c,0x8e,0x85,0x4d,0x73,
0x4a,0xc9,0x23,0x22,0x29,0x7d,0x95,0x0e,0x23,0x58,0x61,0x80,0x99,0x27,0xa6,0x0c,
0x30,0x6d,0x74,0xc6,0x59,0x83,0xdf,0x92,0x50,0x03,0x65,0x81,0x69,0x01,0xa9,0x14,
0x9a,0xac,0x64,0xbf,0x73,0xd6,0x00,0x44,0x9a,0x5a,0xcc,0xd3,0xb9,0x05,0x33,0xc8,
0x56,0xf7,0x4f,0x24,0x86,0x39,0xd2,0x02,0x42,0x22,0x1a,0x13,0xca,0xe3,0xea,0x17,
0x83,0xad,0x6b,0x7e,0x42,0xa9,0xe9,0xfd,0x96,0x16,0x26,0x21,0x32,0x8b,0x44,0x64,
0x02,0x00,0x78,0xe0,0x65,0xf1,0xae,0xd4,0xd6,0xbe,0x6d,0x35,0xef,0x28,0x97,0xbc,
0x58,0x3f,0xd8,0x9a,0x5e,0x2a,0x92,0x95,0x37,0xbd,0xc7,0x13,0x13,0x13,0x00,0x00,
0x98,0x36,0xee,0x39,0x5c,0xdc,0x47,0xb5,0x6c,0x0e,0xc6,0x6a,0xb6,0xad,0xf1,0x4f,
0x2f,0xd7,0xb6,0xb1,0x4d,0xf9,0x2b,0xf7,0x0d,0x39,0xe8,0x06,0x34,0xca,0x16,0xf8,
0xcd,0xf0,0xba,0xad,0x06,0xe3,0x01,0x24,0xcd,0x2e,0x7e,0xfe,0x93,0xd8,0xed,0x98,
0x2c,0x1a,0xd5,0x8e,0xcd,0xb8,0xe6,0xa2,0x47,0x2e,0x25,0x57,0xa2,0x4e,0xad,0xf2,
0x24,0xd8,0xc3,0x67,0x9c,0x11,0x8a,0x0f,0x8f,0x76,0x8b,0x35,0xbb,0xdf,0x39,0x63,
0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82};
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r3
// Data size = 477 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r3[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,
0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,
0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xdc,0x02,
0x04,0x01,0x2e,0x01,0x21,0x48,0xe1,0x4e,0x00,0x00,0x00,0x1d,0x69,0x54,0x58,0x74,
0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x72,0x65,0x61,
0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,
0x07,0x00,0x00,0x01,0x34,0x49,0x44,0x41,0x54,0x48,0xc7,0xed,0x96,0xc1,0x6d,0xc3,
0x30,0x0c,0x45,0x49,0x23,0x97,0xee,0xd1,0x0d,0x9a,0x0d,0xb2,0x47,0x8e,0xfa,0x33,
0x51,0x33,0xb5,0x33,0xb1,0x97,0x28,0x91,0x65,0xd2,0x26,0xed,0xb4,0x68,0x81,0x10,
0x10,0x2c,0xcb,0xb4,0xf4,0x48,0x7d,0x5a,0x26,0x7a,0xd9,0x3f,0x33,0x4e,0xf8,0xea,
0x6f,0xac,0x17,0x05,0x52,0xfd,0x94,0xe3,0x34,0x67,0x6c,0xae,0xc9,0x69,0x98,0xaf,
0x92,0x27,0xf9,0xa8,0x61,0xa8,0x29,0x35,0xb1,0x07,0x53,0xab,0xdd,0xdf,0x11,0xc4,
0x94,0x86,0xb1,0x16,0x2c,0xc5,0xee,0xef,0x80,0x9a,0xd2,0xe9,0x2f,0xdb,0x13,0x33,
0x98,0x18,0xec,0x07,0x30,0x2f,0x94,0x59,0xb1,0x9c,0x9e,0x5e,0xb6,0x60,0x12,0x91,
0x7b,0x5f,0xc5,0x2d,0x4e,0x6d,0x7e,0x00,0xb4,0xe9,0x6a,0x3a,0x4c,0xb0,0x92,0x01,
0x11,0x79,0x64,0xca,0x81,0x19,0xed,0x78,0x86,0x36,0xb6,0xd0,0x82,0xf2,0x60,0xf6,
0x03,0xd5,0x1a,0xd2,0x52,0x04,0x20,0x2b,0x6a,0x0d,0x65,0xe5,0xb6,0x6d,0xbd,0x7e,
0x32,0x76,0x7b,0x47,0x3d,0x20,0xb5,0xd4,0xbf,0xaa,0x17,0x27,0x5b,0xef,0xe5,0x4a,
0x00,0x52,0xcf,0x4e,0x63,0x36,0xc6,0x08,0x67,0x2f,0x95,0xdc,0x57,0xfa,0xc2,0x6f,
0x8b,0x31,0x00,0x24,0x22,0xe6,0xb3,0x85,0x86,0x7a,0x18,0x2f,0xb2,0x88,0x96,0xca,
0x63,0x42,0x57,0x4f,0xed,0xda,0x7c,0x61,0x68,0x88,0x01,0x50,0x6b,0x8b,0xb3,0xae,
0x9d,0x47,0xfd,0xb6,0x05,0x32,0xd6,0x07,0xe6,0xf5,0x7f,0xf4,0x70,0x1d,0x85,0xbd,
0x96,0xe9,0xee,0xc3,0x78,0x67,0x09,0x01,0x11,0x11,0x65,0x7e,0x3f,0xf8,0x8c,0x70,
0xb5,0xf5,0x30,0xe1,0x1f,0x33,0x11,0xd1,0xa1,0xfa,0x9e,0xd9,0xf6,0x1d,0xae,0x5d,
0xc4,0xdc,0xee,0x87,0x31,0xab,0x59,0x7e,0xe3,0x58,0x5e,0x43,0x8e,0xbf,0x06,0xe7,
0xb1,0xfc,0x34,0xc9,0xf0,0xb2,0xbf,0x6b,0xdf,0x3b,0x6d,0x9d,0xdf,0xee,0x13,0x74,
0x8a,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82};
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r4
// Data size = 468 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r4[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,
0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,
0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xdc,0x02,
0x04,0x01,0x2e,0x01,0x21,0x48,0xe1,0x4e,0x00,0x00,0x00,0x1d,0x69,0x54,0x58,0x74,
0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x72,0x65,0x61,
0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,
0x07,0x00,0x00,0x01,0x2b,0x49,0x44,0x41,0x54,0x48,0xc7,0xed,0x96,0x4b,0x12,0xc2,
0x30,0x08,0x86,0x21,0xd3,0x8d,0xf7,0xf0,0x06,0xf6,0x06,0xde,0xc3,0x65,0x38,0x53,
0x72,0x26,0x3d,0x13,0x6e,0x1a,0x9b,0xa6,0xd0,0x42,0xe3,0x38,0x3a,0x23,0x9b,0x66,
0xda,0x3c,0x3e,0xe0,0x27,0x14,0xe0,0x6f,0x3f,0x66,0xe8,0x98,0xcb,0x9f,0x38,0xcf,
0x0a,0xc4,0x7c,0x4f,0xfd,0x34,0x23,0xed,0x9e,0x89,0x6e,0x98,0x47,0xf4,0x93,0x5c,
0xb2,0x19,0x2a,0xb8,0x36,0xd6,0x60,0x72,0x96,0xc7,0x07,0x9c,0x08,0x6e,0x18,0xe9,
0xc0,0x18,0xe5,0xf1,0x01,0xa8,0xe0,0x0e,0x7f,0xdc,0xdf,0x18,0x09,0x01,0x09,0x75,
0x07,0x96,0x85,0xb2,0x28,0x96,0xe1,0xed,0x65,0x4b,0x08,0x29,0xa5,0xd7,0x98,0x93,
0x5a,0x9c,0x5c,0xe6,0x11,0x11,0x17,0x5d,0x85,0x6e,0x82,0x8d,0x08,0xa4,0x94,0xe6,
0x48,0x29,0x30,0xad,0xf5,0x47,0x68,0x27,0x85,0x12,0x94,0x06,0x73,0x1c,0x28,0x67,
0x93,0x96,0x2c,0x00,0x1e,0x51,0xb3,0x7a,0x3b,0xb7,0x30,0x53,0xda,0x6a,0xfd,0x78,
0x6c,0x5a,0xc3,0x1a,0x10,0x97,0x1c,0xaf,0x36,0xd7,0xf4,0xa2,0x44,0xeb,0x1c,0x6f,
0x40,0x44,0xae,0x6f,0x41,0x12,0x9b,0xea,0x65,0xf4,0xdd,0xd2,0x57,0x3c,0xad,0xde,
0x15,0x08,0xe9,0x5b,0xab,0xa1,0xba,0x0c,0xbb,0xb4,0x14,0xe7,0x5c,0xa8,0x7a,0x2a,
0xcf,0x32,0x97,0x0c,0x1a,0xc2,0x45,0xcf,0x29,0xfd,0xa8,0x4e,0x9b,0x21,0x62,0xb5,
0x73,0xda,0x78,0xab,0xb9,0xb2,0xf0,0xde,0xd5,0x5c,0x5b,0x61,0x6f,0x45,0xbb,0xc9,
0x08,0x9a,0xbb,0x3d,0x00,0x80,0xe7,0xf7,0x03,0x47,0x32,0x57,0x5b,0x0d,0x63,0x01,
0xf2,0xeb,0xaa,0xf3,0xa7,0x6d,0x38,0xb0,0x98,0xa5,0x50,0x1b,0x9c,0x31,0xad,0x45,
0x4b,0xba,0x24,0x5d,0x19,0xf7,0x90,0xe6,0xb1,0xe3,0xfc,0xbf,0x7d,0xbf,0x3d,0x01,
0x02,0x72,0x88,0x5a,0x43,0x81,0x64,0x26,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,
0xae,0x42,0x60,0x82};
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r5
// Data size = 395 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r5[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,
0x13,0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x01,0x3d,0x49,0x44,0x41,0x54,0x48,0xc7,
0xed,0x96,0xcb,0x71,0x03,0x31,0x08,0x86,0x41,0xb3,0x17,0xf7,0x91,0x0e,0xe2,0x0e,
0xdc,0x47,0x8e,0xa2,0x26,0x54,0x93,0x5d,0x13,0xb9,0x44,0x36,0xbb,0x11,0x08,0x76,
0x3d,0x9e,0x49,0xc6,0x5c,0xac,0x19,0xb1,0xe2,0xd3,0x6f,0x1e,0x02,0x78,0xdb,0x1f,
0x33,0x4c,0xf8,0xca,0x2b,0xe2,0x45,0x81,0x44,0xae,0x7c,0x9c,0xe6,0x4c,0xd3,0x98,
0x98,0x86,0xb9,0xd5,0x3c,0xc9,0x67,0x0b,0x43,0x95,0xd4,0xc1,0x16,0x4c,0x6b,0xe3,
0xf5,0x8e,0x4b,0x94,0x34,0xcc,0x28,0x60,0xad,0xe3,0xf5,0x0e,0xa8,0x92,0x96,0xbf,
0xfa,0x07,0x23,0x21,0x20,0xa1,0xaf,0xd8,0xa3,0x48,0x7e,0x15,0xca,0xf2,0xd4,0x92,
0x25,0x04,0x66,0xbe,0xaf,0x85,0xc5,0xba,0x80,0x74,0x3f,0x22,0x12,0x9d,0x53,0xe5,
0x30,0x85,0xa1,0x00,0x33,0xaf,0x95,0xda,0xec,0x59,0xb6,0x38,0x7d,0x06,0x8f,0xfe,
0x85,0x23,0x28,0x0f,0x46,0x03,0x89,0x76,0x24,0x22,0xbf,0x11,0xb6,0x36,0xcd,0xa5,
0x28,0x80,0xd5,0x87,0x64,0xf4,0xf1,0x0f,0x18,0xc8,0x95,0xfd,0x2a,0x69,0x0d,0xf0,
0x46,0xe9,0xe0,0x9b,0x38,0xa8,0x15,0x42,0x95,0x60,0xab,0xdb,0x75,0x28,0x57,0x99,
0x5a,0x01,0xb4,0x1f,0x00,0x7c,0xd4,0x2f,0xb8,0xe0,0x69,0x08,0xe9,0xed,0x95,0x81,
0x62,0xa8,0x00,0x53,0x25,0xaf,0xed,0x82,0x27,0x4b,0x89,0xe1,0x5e,0xa4,0xec,0x71,
0x3a,0x54,0x07,0x8a,0xd5,0x87,0xbc,0x66,0x3e,0xf5,0xdf,0xee,0x4b,0xbb,0x1a,0x63,
0x9f,0x47,0xba,0xcc,0x27,0x8a,0x69,0x85,0xad,0x75,0x76,0xb8,0xca,0x3d,0xa9,0x03,
0x23,0x40,0x37,0xc6,0x59,0x60,0xd5,0x18,0x57,0x1c,0x18,0x7d,0xff,0x44,0x9f,0x1f,
0x78,0x8e,0x57,0xdb,0x16,0xc6,0x03,0x92,0xe8,0x4d,0x9f,0xfd,0x60,0x5b,0x12,0xb7,
0x10,0x4b,0x66,0x67,0x4e,0x65,0xbf,0xb5,0x0f,0x35,0x7c,0x24,0x98,0x7f,0x32,0xa9,
0x56,0x84,0xb7,0xfd,0x17,0xfb,0x06,0x35,0x26,0x8f,0x02,0xfd,0xb4,0x15,0x54,0x00,
0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82};
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r6
// Data size = 484 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r6[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,
0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,
0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xdc,0x02,
0x04,0x01,0x2e,0x01,0x21,0x48,0xe1,0x4e,0x00,0x00,0x00,0x1d,0x69,0x54,0x58,0x74,
0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x72,0x65,0x61,
0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,
0x07,0x00,0x00,0x01,0x3b,0x49,0x44,0x41,0x54,0x48,0xc7,0xed,0x96,0xcb,0x8d,0x02,
0x31,0x0c,0x40,0xe3,0x88,0xcb,0xf6,0x41,0x07,0xd0,0x01,0x7d,0xec,0x31,0xae,0xc9,
0xa9,0x89,0xa9,0xc9,0x7b,0x21,0x99,0x4c,0xb0,0xc7,0xf6,0x20,0x56,0x42,0xc2,0xa7,
0x11,0x31,0xf1,0xf3,0x3f,0x29,0x7d,0xe5,0xc3,0x04,0x02,0xba,0xfc,0x1f,0xf6,0xbc,
0x40,0xcc,0x77,0x7a,0x9d,0xe6,0x8a,0xa6,0x4d,0x08,0xc3,0x2c,0x25,0x4e,0x72,0xa9,
0x6e,0xa8,0x1c,0xba,0x58,0x83,0xa9,0x55,0xfe,0x3e,0xe0,0x44,0x0e,0xc3,0x48,0x06,
0xcb,0x6a,0x10,0x16,0x4c,0x80,0xe0,0x81,0x62,0xa9,0x2e,0x73,0x38,0xfc,0x45,0xf7,
0x16,0x10,0x12,0x11,0x25,0x22,0x5a,0xa1,0x24,0x07,0x52,0xe2,0xa6,0x37,0x43,0x9d,
0xde,0xd5,0xbe,0x0d,0x8a,0x89,0xc5,0x33,0x4d,0x4e,0x4a,0x6b,0xfb,0xc7,0x41,0xad,
0x6a,0xd4,0x36,0x91,0x72,0xc0,0xcc,0x40,0xdc,0x94,0x11,0x91,0xdd,0x50,0xa5,0x98,
0x91,0x8a,0x48,0x36,0x06,0x21,0x9b,0x5d,0x35,0xd5,0xcf,0x91,0xd4,0x8e,0x76,0xf2,
0xe6,0x4e,0xc4,0xae,0x34,0x14,0x9d,0x1d,0x15,0x01,0xf0,0x5c,0x7e,0x53,0xbb,0x2f,
0x72,0x96,0x9f,0x1c,0x45,0x54,0x95,0x95,0x8e,0x11,0xd3,0x76,0x83,0x9f,0xa7,0xdf,
0xda,0xbd,0xd2,0x99,0x67,0x52,0xf7,0x30,0xf2,0x9d,0xcc,0xe1,0xd6,0x52,0xd6,0xb4,
0xaa,0xa7,0xfc,0xd6,0x28,0x74,0x96,0x6c,0xac,0x15,0x30,0x3b,0x6c,0x47,0xc6,0x48,
0x6b,0xdf,0xaf,0xed,0xb2,0xa5,0xec,0xb6,0xf9,0x5c,0xd8,0x7b,0x86,0x87,0x8e,0xde,
0x70,0x58,0x40,0xdc,0x53,0xe6,0xdc,0x4b,0x91,0x6e,0x9b,0x61,0xcc,0x1a,0x22,0xa2,
0xee,0x65,0xe4,0xf9,0xf1,0xd8,0xe8,0x87,0xde,0x47,0xb0,0x07,0xe3,0x09,0x7d,0x74,
0xe6,0x48,0x51,0x09,0xed,0xb2,0xe1,0x02,0xd6,0xf2,0xae,0x39,0x23,0xfd,0xf7,0xe8,
0x8b,0x91,0x05,0x1d,0x8e,0x8e,0x8b,0x49,0x8f,0x83,0xcd,0xf4,0x95,0xcf,0x90,0x3f,
0xbd,0xa2,0x95,0x2f,0x7f,0x64,0xeb,0xd7,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,
0xae,0x42,0x60,0x82};
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r7
// Data size = 477 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r7[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,
0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,
0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xdc,0x02,
0x04,0x01,0x2e,0x01,0x21,0x48,0xe1,0x4e,0x00,0x00,0x00,0x1d,0x69,0x54,0x58,0x74,
0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x72,0x65,0x61,
0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,
0x07,0x00,0x00,0x01,0x34,0x49,0x44,0x41,0x54,0x48,0xc7,0xed,0x96,0xcd,0x99,0x03,
0x21,0x08,0x86,0xc5,0x67,0x2e,0xdb,0x47,0x3a,0x48,0x3a,0xd8,0x3e,0xf6,0x28,0x35,
0x61,0x4d,0xd9,0x9a,0xd8,0xcb,0x3a,0x31,0x0a,0x08,0xf9,0x3b,0x0d,0x97,0xf1,0x19,
0x05,0x5f,0x3f,0x41,0x4d,0xe9,0x30,0xdb,0x20,0x30,0x96,0x3f,0x31,0x9f,0x17,0x88,
0xf9,0x4a,0xcf,0xd3,0x5c,0x70,0x39,0x27,0x84,0x61,0x7e,0x4b,0x9c,0xe4,0x5c,0xdd,
0x50,0x39,0x14,0x58,0x83,0xa9,0x55,0x6e,0x3f,0xb0,0x88,0x1c,0x86,0x91,0x26,0x2c,
0x45,0x6e,0x3f,0x00,0x95,0xc3,0xf2,0x17,0x3b,0x30,0x20,0x24,0x40,0xb0,0x15,0xbb,
0x15,0xc9,0x54,0x28,0xdb,0x4b,0x4b,0x16,0x21,0x11,0xd1,0xde,0x66,0x62,0x6d,0x01,
0xdc,0xc6,0x21,0x22,0xf7,0x39,0x95,0x05,0x62,0x0e,0x95,0xb8,0xa2,0x00,0x11,0xdd,
0x2b,0x35,0xf4,0x69,0xb6,0x49,0x03,0x11,0xb1,0x01,0xc2,0x33,0x5b,0x28,0x41,0x59,
0x30,0x13,0x10,0x22,0x26,0x22,0x4a,0x44,0xd4,0x43,0xc9,0xaa,0x14,0x5f,0x92,0xae,
0x00,0xac,0xa4,0x86,0x4e,0x1d,0x3b,0xd0,0x08,0x53,0xeb,0x5d,0xfe,0x44,0xec,0xdf,
0x87,0xb5,0x2a,0xb3,0xa1,0xb4,0x8a,0x11,0xd4,0x3a,0x95,0x9f,0x3d,0x4e,0xa4,0x2f,
0x6b,0xa7,0x37,0x22,0xce,0x4e,0xc5,0x7f,0xc0,0x7d,0xc3,0xd7,0xf4,0xaf,0xc5,0x93,
0xfa,0x56,0x65,0x0f,0xae,0x0b,0x55,0xc8,0xa5,0x72,0xdb,0x0b,0x35,0x9f,0xda,0xb7,
0x8d,0xc5,0xc0,0xc1,0x08,0xd3,0x7d,0xd4,0x6f,0xdb,0x42,0xb1,0x5e,0x61,0xad,0xfd,
0xd6,0xcb,0x75,0x4c,0x6c,0x6b,0xe2,0xe1,0x88,0x01,0x2f,0xd0,0xbe,0x65,0xde,0xe7,
0x07,0x5c,0xd0,0x5d,0x6d,0x23,0xcc,0x0a,0x88,0xbd,0xab,0x7d,0xe5,0x83,0x6d,0x0b,
0xac,0xa4,0x05,0x60,0x4d,0x6e,0xe5,0xae,0x8a,0xf8,0xd9,0x0a,0x39,0x2a,0xcf,0xeb,
0x3f,0xfa,0x42,0x3a,0xec,0xb0,0x37,0xd9,0x1f,0xe5,0x5f,0x90,0x9d,0xe7,0x7f,0xd5,
0x7b,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82};
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r8
// Data size = 476 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r8[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,
0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,
0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xdc,0x02,
0x04,0x01,0x2e,0x01,0x21,0x48,0xe1,0x4e,0x00,0x00,0x00,0x1d,0x69,0x54,0x58,0x74,
0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x72,0x65,0x61,
0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,
0x07,0x00,0x00,0x01,0x33,0x49,0x44,0x41,0x54,0x48,0xc7,0xed,0x56,0xc1,0x0d,0x83,
0x30,0x0c,0xb4,0x23,0x3e,0xdd,0xa3,0x1b,0xb4,0x1b,0x74,0x8f,0x3e,0xe3,0x99,0xcc,
0x4c,0xed,0x4c,0xee,0x87,0x40,0x08,0x36,0xd8,0xd0,0xf6,0x85,0x25,0xa4,0x08,0x1c,
0xe7,0x72,0xe7,0x4b,0x00,0x38,0x63,0x3d,0x30,0x90,0x2b,0xff,0x58,0xcf,0x0b,0x48,
0xe4,0xc5,0xc7,0xd1,0xdc,0x69,0x73,0x4d,0x0c,0x83,0x79,0xe7,0x38,0x92,0x5b,0xef,
0x06,0x95,0x42,0x85,0x2d,0x30,0x7d,0xaf,0x8f,0x77,0x6c,0x22,0x85,0xc1,0x68,0x0b,
0xe6,0xac,0x8f,0x77,0x80,0x4a,0x61,0xfa,0xf3,0x76,0x61,0x24,0x04,0x24,0xb4,0x37,
0x30,0x37,0xca,0xcc,0x2c,0xdd,0xd7,0x6d,0x4b,0x08,0xcc,0x3c,0x8e,0x85,0x4d,0x73,
0x4a,0xc9,0x23,0x22,0x29,0x7d,0x95,0x0e,0x23,0x58,0x61,0x80,0x99,0x27,0xa6,0x0c,
0x30,0x6d,0x74,0xc6,0x59,0x83,0xdf,0x92,0x50,0x03,0x65,0x81,0x69,0x01,0xa9,0x14,
0x9a,0xac,0x64,0xbf,0x73,0xd6,0x00,0x44,0x9a,0x5a,0xcc,0xd3,0xb9,0x05,0x33,0xc8,
0x56,0xf7,0x4f,0x24,0x86,0x39,0xd2,0x02,0x42,0x22,0x1a,0x13,0xca,0xe3,0xea,0x17,
0x83,0xad,0x6b,0x7e,0x42,0xa9,0xe9,0xfd,0x96,0x16,0x26,0x21,0x32,0x8b,0x44,0x64,
0x02,0x00,0x78,0xe0,0x65,0xf1,0xae,0xd4,0xd6,0xbe,0x6d,0x35,0xef,0x28,0x97,0xbc,
0x58,0x3f,0xd8,0x9a,0x5e,0x2a,0x92,0x95,0x37,0xbd,0xc7,0x13,0x13,0x13,0x00,0x00,
0x98,0x36,0xee,0x39,0x5c,0xdc,0x47,0xb5,0x6c,0x0e,0xc6,0x6a,0xb6,0xad,0xf1,0x4f,
0x2f,0xd7,0xb6,0xb1,0x4d,0xf9,0x2b,0xf7,0x0d,0x39,0xe8,0x06,0x34,0xca,0x16,0xf8,
0xcd,0xf0,0xba,0xad,0x06,0xe3,0x01,0x24,0xcd,0x2e,0x7e,0xfe,0x93,0xd8,0xed,0x98,
0x2c,0x1a,0xd5,0x8e,0xcd,0xb8,0xe6,0xa2,0x47,0x2e,0x25,0x57,0xa2,0x4e,0xad,0xf2,
0x24,0xd8,0xc3,0x67,0x9c,0x11,0x8a,0x0f,0x8f,0x76,0x8b,0x35,0xbb,0xdf,0x39,0x63,
0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82};
// Created with image_to_c
// https://github.com/bitbank2/image_to_c
//
// r9
// Data size = 477 bytes
//
// PNG, Compression=Flate, Size: 36 x 26, 32-Bpp
//
// for non-Arduino builds...
#ifndef PROGMEM
#define PROGMEM
#endif
const uint8_t r9[] PROGMEM = {
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x1a,0x08,0x06,0x00,0x00,0x00,0xdf,0x70,0xfe,
0x45,0x00,0x00,0x00,0x01,0x73,0x52,0x47,0x42,0x00,0xae,0xce,0x1c,0xe9,0x00,0x00,
0x00,0x06,0x62,0x4b,0x47,0x44,0x00,0xff,0x00,0xff,0x00,0xff,0xa0,0xbd,0xa7,0x93,
0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,0x13,
0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xdc,0x02,
0x04,0x01,0x2e,0x01,0x21,0x48,0xe1,0x4e,0x00,0x00,0x00,0x1d,0x69,0x54,0x58,0x74,
0x43,0x6f,0x6d,0x6d,0x65,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x43,0x72,0x65,0x61,
0x74,0x65,0x64,0x20,0x77,0x69,0x74,0x68,0x20,0x47,0x49,0x4d,0x50,0x64,0x2e,0x65,
0x07,0x00,0x00,0x01,0x34,0x49,0x44,0x41,0x54,0x48,0xc7,0xed,0x96,0xc1,0x6d,0xc3,
0x30,0x0c,0x45,0x49,0x23,0x97,0xee,0xd1,0x0d,0x9a,0x0d,0xb2,0x47,0x8e,0xfa,0x33,
0x51,0x33,0xb5,0x33,0xb1,0x97,0x28,0x91,0x65,0xd2,0x26,0xed,0xb4,0x68,0x81,0x10,
0x10,0x2c,0xcb,0xb4,0xf4,0x48,0x7d,0x5a,0x26,0x7a,0xd9,0x3f,0x33,0x4e,0xf8,0xea,
0x6f,0xac,0x17,0x05,0x52,0xfd,0x94,0xe3,0x34,0x67,0x6c,0xae,0xc9,0x69,0x98,0xaf,
0x92,0x27,0xf9,0xa8,0x61,0xa8,0x29,0x35,0xb1,0x07,0x53,0xab,0xdd,0xdf,0x11,0xc4,
0x94,0x86,0xb1,0x16,0x2c,0xc5,0xee,0xef,0x80,0x9a,0xd2,0xe9,0x2f,0xdb,0x13,0x33,
0x98,0x18,0xec,0x07,0x30,0x2f,0x94,0x59,0xb1,0x9c,0x9e,0x5e,0xb6,0x60,0x12,0x91,
0x7b,0x5f,0xc5,0x2d,0x4e,0x6d,0x7e,0x00,0xb4,0xe9,0x6a,0x3a,0x4c,0xb0,0x92,0x01,
0x11,0x79,0x64,0xca,0x81,0x19,0xed,0x78,0x86,0x36,0xb6,0xd0,0x82,0xf2,0x60,0xf6,
0x03,0xd5,0x1a,0xd2,0x52,0x04,0x20,0x2b,0x6a,0x0d,0x65,0xe5,0xb6,0x6d,0xbd,0x7e,
0x32,0x76,0x7b,0x47,0x3d,0x20,0xb5,0xd4,0xbf,0xaa,0x17,0x27,0x5b,0xef,0xe5,0x4a,
0x00,0x52,0xcf,0x4e,0x63,0x36,0xc6,0x08,0x67,0x2f,0x95,0xdc,0x57,0xfa,0xc2,0x6f,
0x8b,0x31,0x00,0x24,0x22,0xe6,0xb3,0x85,0x86,0x7a,0x18,0x2f,0xb2,0x88,0x96,0xca,
0x63,0x42,0x57,0x4f,0xed,0xda,0x7c,0x61,0x68,0x88,0x01,0x50,0x6b,0x8b,0xb3,0xae,
0x9d,0x47,0xfd,0xb6,0x05,0x32,0xd6,0x07,0xe6,0xf5,0x7f,0xf4,0x70,0x1d,0x85,0xbd,
0x96,0xe9,0xee,0xc3,0x78,0x67,0x09,0x01,0x11,0x11,0x65,0x7e,0x3f,0xf8,0x8c,0x70,
0xb5,0xf5,0x30,0xe1,0x1f,0x33,0x11,0xd1,0xa1,0xfa,0x9e,0xd9,0xf6,0x1d,0xae,0x5d,
0xc4,0xdc,0xee,0x87,0x31,0xab,0x59,0x7e,0xe3,0x58,0x5e,0x43,0x8e,0xbf,0x06,0xe7,
0xb1,0xfc,0x34,0xc9,0xf0,0xb2,0xbf,0x6b,0xdf,0x3b,0x6d,0x9d,0xdf,0xee,0x13,0x74,
0x8a,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82};

21
src/nyan_types.h Normal file
View file

@ -0,0 +1,21 @@
#ifndef SRC_DP_TYPES_H
#define SRC_DP_TYPES_H
#ifdef __cplusplus
#include <cstdint>
#else
#include <stdint.h>
#endif
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;
typedef int8_t s8;
typedef int16_t s16;
typedef int32_t s32;
typedef int64_t s64;
#endif // SRC_DP_TYPES_H

102
src/sdl_nyan.cc Normal file
View file

@ -0,0 +1,102 @@
#include "sdl_nyan.h"
#include <SDL.h>
#include <SDL_render.h>
#include <array>
#include <cassert>
#include <cstdarg>
#include <string>
#include "log.h"
#include "nyan_types.h"
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#include "nyan_data_r.c"
static const char *const NYAN_PATH = "../external/nyan/nyan";
static void nyan_sdl_fatal(const char *const msg)
{
log_fatal("%s: %s", msg, SDL_GetError());
abort();
}
static void nyan_sdl_error(const char *const msg)
{
log_error("%s: %s", msg, SDL_GetError());
}
template<size_t Size>
[[maybe_unused]] const char *aprintf(std::array<char, Size> &buf, const char *fmt, ...)
{
std::va_list args;
va_start(args, fmt);
std::vsnprintf(buf.data(), buf.size(), fmt, args);
va_end(args);
return buf.data();
}
static SDL_Texture *make_nyan_sprite_sheet_from_files(SDL_Renderer *renderer, const char dir = 'r')
{
static const auto textureRect = nyan_sheet_rect();
auto result = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING,
textureRect.w, textureRect.h);
if (!result)
nyan_sdl_fatal("make_nyan_sprite_sheet_from_files/SDL_CreateTexture");
if (SDL_SetTextureBlendMode(result, SDL_BLENDMODE_BLEND))
nyan_sdl_fatal("make_nyan_sprite_sheet_from_files/SDL_SetTextureBlendMode");
std::array<char, 1024> strBuf;
for (size_t i=0; i<NYAN_SPRITE_COUNT; ++i)
{
auto filename = aprintf(strBuf, "%s/%c%zu.png", NYAN_PATH, dir, i+1);
log_trace("make_nyan_sprite_sheet_from_files: loading %s", filename);
int w = 0, h = 0, bytes_per_pixel = 0;
u8 *data = stbi_load(filename, &w, &h, &bytes_per_pixel, 0);
assert(w == NYAN_SPRITE_WIDTH && h == NYAN_SPRITE_HEIGHT && bytes_per_pixel == NYAN_BBP);
auto destRect = nyan_sprite_rect(i);
if (SDL_UpdateTexture(result, &destRect, data, NYAN_BBP * NYAN_SPRITE_WIDTH))
nyan_sdl_fatal("make_nyan_sprite_sheet_from_files/SDL_UpdateTexture");
STBI_FREE(data);
}
return result;
}
SDL_Texture *make_nyan_sprite_sheet_from_mem(SDL_Renderer *renderer)
{
static const uint8_t *const data_ptrs[] = { r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, nullptr };
static const size_t data_sizes[] = {
sizeof(r1), sizeof(r2), sizeof(r3), sizeof(r4), sizeof(r5), sizeof(r6),
sizeof(r7), sizeof(r8), sizeof(r9), sizeof(r10), sizeof(r11), sizeof(r12)
};
static const auto textureRect = nyan_sheet_rect();
auto result = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING,
textureRect.w, textureRect.h);
if (!result)
nyan_sdl_fatal("make_nyan_sprite_sheet_from_mem/SDL_CreateTexture");
if (SDL_SetTextureBlendMode(result, SDL_BLENDMODE_BLEND))
nyan_sdl_fatal("make_nyan_sprite_sheet_from_mem/SDL_SetTextureBlendMode");
for (size_t i=0; data_ptrs[i]; ++i)
{
log_trace("make_nyan_sprite_sheet_from_mem: loading data %zu", i);
int w = 0, h = 0, bytes_per_pixel = 0;
u8 *data = stbi_load_from_memory(data_ptrs[i], data_sizes[i], &w, &h, &bytes_per_pixel, 0);
assert(w == NYAN_SPRITE_WIDTH && h == NYAN_SPRITE_HEIGHT && bytes_per_pixel == NYAN_BBP);
auto destRect = nyan_sprite_rect(i);
if (SDL_UpdateTexture(result, &destRect, data, NYAN_BBP * NYAN_SPRITE_WIDTH))
nyan_sdl_fatal("make_nyan_sprite_sheet_from_mem/SDL_UpdateTexture");
STBI_FREE(data);
}
return result;
}

31
src/sdl_nyan.h Normal file
View file

@ -0,0 +1,31 @@
#ifndef SRC_SDL_NYAN_H
#define SRC_SDL_NYAN_H
#include <SDL_render.h>
#ifdef __cplusplus
extern "C" {
#endif
#define NYAN_SPRITE_COUNT 12u
#define NYAN_SPRITE_WIDTH 36u
#define NYAN_SPRITE_HEIGHT 26u
#define NYAN_BBP 4u
SDL_Texture *make_nyan_sprite_sheet_from_mem(SDL_Renderer *renderer);
static SDL_Rect nyan_sprite_rect(size_t index)
{
return SDL_Rect{ static_cast<int>(NYAN_SPRITE_WIDTH * index), 0, NYAN_SPRITE_WIDTH, NYAN_SPRITE_HEIGHT};
}
static constexpr SDL_Rect nyan_sheet_rect()
{
return { 0, 0, NYAN_SPRITE_COUNT * NYAN_SPRITE_WIDTH, NYAN_SPRITE_HEIGHT };
}
#ifdef __cplusplus
}
#endif
#endif // SRC_SDL_NYAN_H

152
src/sdl_nyan_demo.cc Normal file
View file

@ -0,0 +1,152 @@
#include "log.h"
#include "nyan_types.h"
#include <sdl_nyan.h>
#include <SDL.h>
#include <SDL_render.h>
static void nyan_sdl_fatal(const char *const msg)
{
log_fatal("%s: %s", msg, SDL_GetError());
abort();
}
static void nyan_sdl_error(const char *const msg)
{
log_error("%s: %s", msg, SDL_GetError());
}
static const float NYAN_PI = 3.14159265358979323846f;
static const float NYAN_PI2 = 2.0f * NYAN_PI;
template<typename T> T deg2rad(T deg) { return deg * NYAN_PI / 180.0; }
template<typename T> T rad2deg(T deg) { return 180.0 * deg / NYAN_PI; }
struct NyanSpinnyCircle
{
SDL_Texture *nyanSheet = nullptr;
SDL_Point centerPos;
float radius = 100.0f;
float radiusBounce = 0.0f;
float radiusBounceIncrement = 0.4f;
float radiusBounceMax = 42.0f;
float angle = 0.0f;
float angularStep = 0.015f;
unsigned animSpeed = 48;
unsigned nyanCount = 13;
};
void do_circle_nyan_step(SDL_Renderer *renderer, NyanSpinnyCircle &nsc)
{
static constexpr SDL_Point rotCenter = {NYAN_SPRITE_WIDTH, NYAN_SPRITE_HEIGHT};
const size_t nyanSpriteIndex = (SDL_GetTicks() / nsc.animSpeed) % NYAN_SPRITE_COUNT;
const auto sourceRect = nyan_sprite_rect(nyanSpriteIndex);
const auto nyanRads = deg2rad(360.0f / nsc.nyanCount);
for (auto i=0u; i<nsc.nyanCount; ++i)
{
auto a = nsc.angle + nyanRads * i;
auto x = nsc.centerPos.x + std::cos(a) * (nsc.radius + nsc.radiusBounce);
auto y = nsc.centerPos.y + std::sin(a) * (nsc.radius + nsc.radiusBounce);
auto destRect = sourceRect;
destRect.x = x;
destRect.y = y;
float rotAngle = rad2deg(a) + 90.0f;
SDL_RenderCopyEx(renderer, nsc.nyanSheet, &sourceRect, &destRect, rotAngle, &rotCenter, SDL_FLIP_NONE);
}
nsc.angle = nsc.angle + nsc.angularStep;
if (nsc.angle >= NYAN_PI2) nsc.angle -= NYAN_PI2;
nsc.radiusBounce += nsc.radiusBounceIncrement;
if (nsc.radiusBounce <= -nsc.radiusBounceMax || nsc.radiusBounce > nsc.radiusBounceMax)
nsc.radiusBounceIncrement = - nsc.radiusBounceIncrement;
}
int main(int argc, char *argv[])
{
(void) argc;
(void) argv;
#ifndef NDEBUG
log_set_level(LOG_TRACE);
#else
log_set_level(LOG_DEBUG);
#endif
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER))
nyan_sdl_fatal("SDL_Init");
#ifdef SDL_HINT_IME_SHOW_UI
SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");
#endif
const auto windowFlags = SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_OPENGL;
auto window = SDL_CreateWindow("sdl_nyan", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 960, windowFlags);
if (!window)
nyan_sdl_fatal("SDL_CreateWindow");
auto renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
if (!renderer)
nyan_sdl_fatal("SDL_CreateRenderer");
//auto nyanSheet = make_nyan_sprite_sheet_from_files(renderer);
auto nyanSheet = make_nyan_sprite_sheet_from_mem(renderer);
NyanSpinnyCircle nsc;
nsc.nyanSheet = nyanSheet;
nsc.centerPos = { 420/2, 420/2 };
bool quit = false;
while (!quit)
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
quit = true;
if (event.type == SDL_KEYDOWN && event.key.keysym.mod & KMOD_CTRL && event.key.keysym.sym == SDLK_q)
quit = true;
}
SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255);
SDL_RenderClear(renderer);
auto sheetDestRect = nyan_sheet_rect();
sheetDestRect.w *= 3;
sheetDestRect.h *= 3;
SDL_RenderCopy(renderer, nyanSheet, nullptr, &sheetDestRect);
auto ticks = SDL_GetTicks();
size_t nyanSpriteIndex = (ticks / 48) % NYAN_SPRITE_COUNT;
auto sourceRect = nyan_sprite_rect(nyanSpriteIndex);
auto destRect = nyan_sprite_rect(0);
destRect.w *= 3;
destRect.h *= 3;
destRect.y += sheetDestRect.h;
SDL_RenderCopy(renderer, nyanSheet, &sourceRect, &destRect);
destRect.x = 420/2;
destRect.y = 420/2;
SDL_Point centerPoint = {NYAN_SPRITE_WIDTH, NYAN_SPRITE_HEIGHT};
double angle = (ticks / 4) % 360;
SDL_RenderCopyEx(renderer, nyanSheet, &sourceRect, &destRect, angle, &centerPoint, SDL_FLIP_NONE);
do_circle_nyan_step(renderer, nsc);
SDL_RenderPresent(renderer);
}
SDL_DestroyTexture(nyanSheet);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}

7987
src/stb_image.h Normal file

File diff suppressed because it is too large Load diff