From e3507b390e8eecd19c04df04980ee3213ad2de8f Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Tue, 22 Apr 2025 16:54:06 -0400
Subject: [PATCH] examples: added audio/05-planar-data
---
examples/CMakeLists.txt | 1 +
examples/audio/05-planar-data/README.txt | 7 +
.../audio/05-planar-data/onmouseover.webp | Bin 0 -> 17488 bytes
examples/audio/05-planar-data/planar-data.c | 366 ++++++++++++++++++
examples/audio/05-planar-data/thumbnail.png | Bin 0 -> 2637 bytes
5 files changed, 374 insertions(+)
create mode 100644 examples/audio/05-planar-data/README.txt
create mode 100644 examples/audio/05-planar-data/onmouseover.webp
create mode 100644 examples/audio/05-planar-data/planar-data.c
create mode 100644 examples/audio/05-planar-data/thumbnail.png
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 58406f6221bd4..6efc021546f96 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -141,6 +141,7 @@ add_sdl_example_executable(audio-simple-playback SOURCES audio/01-simple-playbac
add_sdl_example_executable(audio-simple-playback-callback SOURCES audio/02-simple-playback-callback/simple-playback-callback.c)
add_sdl_example_executable(audio-load-wav SOURCES audio/03-load-wav/load-wav.c DATAFILES ${CMAKE_CURRENT_SOURCE_DIR}/../test/sample.wav)
add_sdl_example_executable(audio-multiple-streams SOURCES audio/04-multiple-streams/multiple-streams.c DATAFILES ${CMAKE_CURRENT_SOURCE_DIR}/../test/sample.wav ${CMAKE_CURRENT_SOURCE_DIR}/../test/sword.wav)
+add_sdl_example_executable(audio-planar-data SOURCES audio/05-planar-data/planar-data.c)
add_sdl_example_executable(input-joystick-polling SOURCES input/01-joystick-polling/joystick-polling.c)
add_sdl_example_executable(input-joystick-events SOURCES input/02-joystick-events/joystick-events.c)
add_sdl_example_executable(camera-read-and-draw SOURCES camera/01-read-and-draw/read-and-draw.c)
diff --git a/examples/audio/05-planar-data/README.txt b/examples/audio/05-planar-data/README.txt
new file mode 100644
index 0000000000000..c7bd0ab5e862b
--- /dev/null
+++ b/examples/audio/05-planar-data/README.txt
@@ -0,0 +1,7 @@
+This example code draws two clickable buttons. Each causes a sound to play,
+fed to either the left or right audio channel through separate (planar)
+arrays.
+
+Planar audio can feed both channels at the same time from different arrays,
+as well, but this example only uses one channel at a time for clarity. A
+NULL array will supply silence for that channel.
diff --git a/examples/audio/05-planar-data/onmouseover.webp b/examples/audio/05-planar-data/onmouseover.webp
new file mode 100644
index 0000000000000000000000000000000000000000..90880c9e4544826bd5afa597497eed33ea79a96e
GIT binary patch
literal 17488
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
I7c$HL0LV6yTmS$7
literal 0
HcmV?d00001
diff --git a/examples/audio/05-planar-data/planar-data.c b/examples/audio/05-planar-data/planar-data.c
new file mode 100644
index 0000000000000..ab67999ab92bc
--- /dev/null
+++ b/examples/audio/05-planar-data/planar-data.c
@@ -0,0 +1,366 @@
+/*
+ * This example code draws two clickable buttons. Each causes a sound to play,
+ * fed to either the left or right audio channel through separate ("planar")
+ * arrays.
+ *
+ * This code is public domain. Feel free to use it for any purpose!
+ */
+
+#define SDL_MAIN_USE_CALLBACKS 1 /* use the callbacks instead of main() */
+#include <SDL3/SDL.h>
+#include <SDL3/SDL_main.h>
+
+/* We will use this renderer to draw into this window every frame. */
+static SDL_Window *window = NULL;
+static SDL_Renderer *renderer = NULL;
+static SDL_AudioStream *stream = NULL;
+
+/* location of buttons on the screen. */
+static const SDL_FRect rect_left_button = { 100, 170, 100, 100 };
+static const SDL_FRect rect_right_button = { 440, 170, 100, 100 };
+
+/* -1 if we're currently playing left, 1 if playing right, 0 if not playing. */
+static int playing_sound = 0;
+
+/* Raw audio data. These arrays are at the end of the source file. */
+static const Uint8 left[1870];
+static const Uint8 right[1777];
+
+
+/* This function runs once at startup. */
+SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
+{
+ const SDL_AudioSpec spec = { SDL_AUDIO_U8, 2, 4000 }; /* Uint8 data, stereo, 4000Hz. */
+
+ SDL_SetAppMetadata("Example Audio Planar Data", "1.0", "com.example.audio-planar-data");
+
+ if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)) {
+ SDL_Log("Couldn't initialize SDL: %s", SDL_GetError());
+ return SDL_APP_FAILURE;
+ }
+
+ if (!SDL_CreateWindowAndRenderer("examples/audio/planar-data", 640, 480, 0, &window, &renderer)) {
+ SDL_Log("Couldn't create window/renderer: %s", SDL_GetError());
+ return SDL_APP_FAILURE;
+ }
+
+ stream = SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &spec, NULL, NULL);
+ if (!stream) {
+ SDL_Log("Couldn't open audio device stream: %s", SDL_GetError());
+ return SDL_APP_FAILURE;
+ }
+
+ SDL_ResumeAudioStreamDevice(stream); /* SDL_OpenAudioDeviceStream starts the device paused. Resume it! */
+
+ return SDL_APP_CONTINUE; /* carry on with the program! */
+}
+
+/* This function runs when a new event (mouse input, keypresses, etc) occurs. */
+SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
+{
+ if (event->type == SDL_EVENT_QUIT) {
+ return SDL_APP_SUCCESS; /* end the program, reporting success to the OS. */
+ } else if (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
+ if (playing_sound == 0) { /* nothing currently playing? */
+ const SDL_FPoint point = { event->button.x, event->button.y };
+ if (SDL_PointInRectFloat(&point, &rect_left_button)) { /* clicked left button? */
+ const Uint8 *planes[] = { left, NULL }; /* specify NULL to say "this specific channel is silent" */
+ SDL_PutAudioStreamPlanarData(stream, (const void * const *) planes, SDL_arraysize(left));
+ SDL_FlushAudioStream(stream); /* that's all we're playing until it completes. */
+ playing_sound = -1; /* left is playing */
+ } else if (SDL_PointInRectFloat(&point, &rect_right_button)) { /* clicked right button? */
+ const Uint8 *planes[] = { NULL, right }; /* specify NULL to say "this specific channel is silent" */
+ SDL_PutAudioStreamPlanarData(stream, (const void * const *) planes, SDL_arraysize(right));
+ SDL_FlushAudioStream(stream); /* that's all we're playing until it completes. */
+ playing_sound = 1; /* right is playing */
+ }
+ }
+ }
+
+ return SDL_APP_CONTINUE; /* carry on with the program! */
+}
+
+static void render_button(const SDL_FRect *rect, const char *str, int button_value)
+{
+ float x, y;
+
+ if (playing_sound == button_value) {
+ SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); /* green while playing */
+ } else {
+ SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255); /* blue while not playing */
+ }
+
+ SDL_RenderFillRect(renderer, rect);
+ SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+
+ x = rect->x + ((rect->w - (SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * SDL_strlen(str))) / 2.0f);
+ y = rect->y + ((rect->h - SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE) / 2.0f);
+ SDL_RenderDebugText(renderer, x, y, str);
+}
+
+/* This function runs once per frame, and is the heart of the program. */
+SDL_AppResult SDL_AppIterate(void *appstate)
+{
+ if (playing_sound) {
+ if (SDL_GetAudioStreamQueued(stream) == 0) { /* sound is done? We can play a new sound now. */
+ playing_sound = 0;
+ }
+ }
+
+ SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
+ SDL_RenderClear(renderer);
+
+ render_button(&rect_left_button, "LEFT", -1);
+ render_button(&rect_right_button, "RIGHT", 1);
+
+ SDL_RenderPresent(renderer);
+
+ return SDL_APP_CONTINUE; /* carry on with the program! */
+}
+
+/* This function runs once at shutdown. */
+void SDL_AppQuit(void *appstate, SDL_AppResult result)
+{
+ SDL_DestroyAudioStream(stream);
+ /* SDL will clean up the window/renderer for us. */
+}
+
+
+
+/* This is the audio data, as raw PCM samples (Uint8, 1 channel, 4000Hz) packed into C byte arrays for convenience. */
+
+static const Uint8 left[1870] = {
+ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x81, 0x82, 0x82,
+ 0x83, 0x83, 0x83, 0x83, 0x83, 0x82, 0x82, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7e, 0x7e, 0x7e, 0x7d,
+ 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7d, 0x7d, 0x7e, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x85, 0x84,
+ 0x84, 0x83, 0x81, 0x7f, 0x7d, 0x7c, 0x7a, 0x7a, 0x7a, 0x77, 0x77, 0x77, 0x76, 0x76, 0x76, 0x77,
+ 0x78, 0x7d, 0x82, 0x89, 0x8e, 0x92, 0x95, 0x95, 0x91, 0x8b, 0x84, 0x7d, 0x77, 0x73, 0x72, 0x72,
+ 0x74, 0x75, 0x75, 0x75, 0x76, 0x74, 0x73, 0x73, 0x74, 0x79, 0x81, 0x89, 0x8f, 0x96, 0x9b, 0x9c,
+ 0x98, 0x91, 0x88, 0x7e, 0x77, 0x74, 0x73, 0x74, 0x77, 0x7b, 0x7c, 0x7a, 0x77, 0x73, 0x6d, 0x69,
+ 0x68, 0x6a, 0x73, 0x7f, 0x87, 0x8e, 0x99, 0xa1, 0x9e, 0x97, 0x90, 0x86, 0x7c, 0x76, 0x77, 0x7b,
+ 0x80, 0x89, 0x91, 0x93, 0x91, 0x8e, 0x87, 0x7c, 0x71, 0x6b, 0x65, 0x60, 0x5d, 0x5f, 0x60, 0x61,
+ 0x6b, 0x7b, 0x84, 0x8d, 0xa0, 0xae, 0xae, 0xa8, 0xa1, 0x94, 0x81, 0x73, 0x6f, 0x70, 0x74, 0x7e,
+ 0x8d, 0x95, 0x97, 0x98, 0x92, 0x83, 0x72, 0x69, 0x61, 0x5a, 0x56, 0x59, 0x5d, 0x5f, 0x65, 0x75,
+ 0x82, 0x87, 0x95, 0xaa, 0xb4, 0xb0, 0xaa, 0xa0, 0x8d, 0x77, 0x6c, 0x6c, 0x6d, 0x72, 0x81, 0x91,
+ 0x98, 0x9a, 0x9a, 0x8f, 0x7a, 0x6a, 0x61, 0x58, 0x4f, 0x50, 0x57, 0x5b, 0x61, 0x74, 0x85, 0x8a,
+ 0x96, 0xab, 0xb4, 0xae, 0xa5, 0x9c, 0x88, 0x71, 0x67, 0x69, 0x6c, 0x73, 0x85, 0x96, 0x9d, 0xa1,
+ 0xa3, 0x96, 0x7f, 0x6e, 0x63, 0x56, 0x4c, 0x4d, 0x52, 0x53, 0x58, 0x6b, 0x80, 0x86, 0x92, 0xaa,
+ 0xb8, 0xb4, 0xac, 0xa5, 0x90, 0x75, 0x69, 0x6a, 0x6c, 0x73, 0x86, 0x98, 0x9c, 0xa2, 0xa7, 0x99,
+ 0x7f, 0x6e, 0x61, 0x54, 0x4c, 0x4b, 0x4d, 0x4f, 0x54, 0x66, 0x7c, 0x85, 0x90, 0xa9, 0xbc, 0xba,
+ 0xb4, 0xac, 0x95, 0x78, 0x69, 0x67, 0x67, 0x71, 0x86, 0x99, 0x9d, 0xa4, 0xab, 0x9b, 0x7f, 0x6e,
+ 0x5f, 0x50, 0x4b, 0x4e, 0x4e, 0x4e, 0x54, 0x60, 0x77, 0x86, 0x8e, 0xa4, 0xbb, 0xbf, 0xb9, 0xb3,
+ 0x9e, 0x7d, 0x68, 0x65, 0x63, 0x6b, 0x84, 0x9a, 0x9d, 0xa3, 0xb0, 0x9f, 0x83, 0x71, 0x5f, 0x4d,
+ 0x4c, 0x51, 0x51, 0x51, 0x56, 0x5a, 0x64, 0x7d, 0x90, 0x99, 0xad, 0xc3, 0xc2, 0xb5, 0xaa, 0x92,
+ 0x71, 0x62, 0x65, 0x6a, 0x78, 0x92, 0xa2, 0xa1, 0xa7, 0xa8, 0x91, 0x78, 0x66, 0x55, 0x4a, 0x50,
+ 0x54, 0x50, 0x50, 0x58, 0x5a, 0x65, 0x8b, 0x9b, 0x9b, 0xb7, 0xc9, 0xb3, 0xa6, 0xa2, 0x7d, 0x5a,
+ 0x66, 0x6f, 0x70, 0x94, 0xa2, 0x90, 0x9b, 0xa5, 0x8f, 0x82, 0x77, 0x5c, 0x58, 0x60, 0x50, 0x46,
+ 0x56, 0x49, 0x3a, 0x54, 0x97, 0xbe, 0xa9, 0xb0, 0xad, 0x91, 0xa7, 0xb3, 0x83, 0x6f, 0x6c, 0x5b,
+ 0x71, 0x91, 0x9c, 0xac, 0x98, 0x78, 0x8a, 0xa6, 0xad, 0x9e, 0x72, 0x4d, 0x4e, 0x4f, 0x4e, 0x4a,
+ 0x48, 0x46, 0x42, 0x4e, 0x99, 0xd5, 0xae, 0xb0, 0xb1, 0x8a, 0xb3, 0xbd, 0x82, 0x6b, 0x53, 0x56,
+ 0x8b, 0x97, 0xa7, 0xaf, 0x74, 0x6b, 0x92, 0xaf, 0xc1, 0x8f, 0x55, 0x47, 0x4e, 0x60, 0x5e, 0x45,
+ 0x4a, 0x4f, 0x3a, 0x44, 0x9f, 0xdf, 0xac, 0xa8, 0x93, 0x79, 0xbf, 0xc3, 0x92, 0x67, 0x36, 0x5a,
+ 0x90, 0x9b, 0xb6, 0xa1, 0x6b, 0x68, 0x8d, 0xc3, 0xca, 0x83, 0x4f, 0x3d, 0x53, 0x72, 0x63, 0x46,
+ 0x44, 0x55, 0x4f, 0x4c, 0x78, 0xcb, 0xbb, 0x93, 0x99, 0x79, 0xad, 0xd0, 0x9f, 0x70, 0x37, 0x4f,
+ 0x90, 0x9e, 0xaf, 0x94, 0x73, 0x71, 0x89, 0xc0, 0xc0, 0x8f, 0x5b, 0x45, 0x62, 0x79, 0x6f, 0x5b,
+ 0x46, 0x56, 0x54, 0x53, 0x59, 0x90, 0xd8, 0x95, 0x8c, 0x8c, 0x88, 0xd6, 0xb8, 0x83, 0x4c, 0x2f,
+ 0x80, 0xa2, 0xaa, 0x9c, 0x69, 0x74, 0x80, 0xb0, 0xc6, 0x99, 0x78, 0x54, 0x69, 0x80, 0x7c, 0x69,
+ 0x4b, 0x4e, 0x57, 0x4e, 0x4c, 0x5f, 0xae, 0xc3, 0x82, 0x86, 0x83, 0xac, 0xd9, 0xa3, 0x6a, 0x31,
+ 0x50, 0xa0, 0xad, 0xa6, 0x6d, 0x59, 0x7f, 0x9e, 0xc8, 0xaf, 0x81, 0x74, 0x70, 0x8b, 0x83, 0x76,
+ 0x58, 0x50, 0x56, 0x59, 0x58, 0x49, 0x62, 0x7c, 0xce, 0x99, 0x71, 0x9c, 0x8d, 0xd4, 0xb1, 0x6c,
+ 0x4f, 0x37, 0x95, 0xab, 0x9b, 0x7f, 0x4b, 0x82, 0xa2, 0xba, 0xb5, 0x7b, 0x7d, 0x7d, 0x8d, 0x8b,
+ 0x71, 0x62, 0x54, 0x5b, 0x4e, 0x5d, 0x4c, 0x5e, 0x57, 0x9c, 0xd4, 0x67, 0x94, 0x83, 0xa2, 0xd8,
+ 0x83, 0x70, 0x2e, 0x59, 0xb5, 0x9d, 0xa1, 0x51, 0x55, 0x97, 0xad, 0xcb, 0x86, 0x77, 0x78, 0x95,
+ 0xa1, 0x76, 0x6d, 0x58, 0x67, 0x5b, 0x4f, 0x66, 0x55, 0x67, 0x4e, 0x67, 0xd9, 0x88, 0x89, 0x86,
+ 0x6f, 0xcd, 0x9b, 0x89, 0x4e, 0x39, 0x9f, 0xa0, 0xa9, 0x7a, 0x47, 0x88, 0x99, 0xbe, 0xac, 0x6b,
+ 0x88, 0x87, 0xaf, 0x9a, 0x67, 0x71, 0x63, 0x74, 0x62, 0x55, 0x5c, 0x5e, 0x65, 0x5c, 0x54, 0xb1,
+ 0xb0, 0x79, 0x8d, 0x6f, 0xac, 0xb7, 0x8e, 0x73, 0x44, 0x7b, 0xa1, 0x99, 0x90, 0x5a, 0x70, 0x97,
+ 0xa0, 0xb4, 0x89, 0x83, 0x8e, 0x96, 0xa3, 0x7e, 0x6f, 0x6c, 0x6a, 0x6b, 0x5b, 0x5a, 0x61, 0x5e,
+ 0x5d, 0x63, 0x66, 0xa0, 0xa6, 0x7c, 0x8d, 0x83, 0xa4, 0xad, 0x88, 0x7b, 0x58, 0x75, 0x95, 0x91,
+ 0x92, 0x70, 0x75, 0x93, 0x9c, 0xab, 0x92, 0x84, 0x8d, 0x91, 0x96, 0x81, 0x70, 0x6b, 0x6c, 0x68,
+ 0x62, 0x59, 0x5e, 0x69, 0x5a, 0x5a, 0x68, 0x5f, 0xa2, 0xb0, 0x6d, 0x87, 0x7e, 0xa0, 0xba, 0x89,
+ 0x78, 0x53, 0x73, 0xa6, 0x9b, 0x95, 0x6c, 0x65, 0x8e, 0x9a, 0xab, 0x97, 0x7b, 0x85, 0x8e, 0x9a,
+ 0x91, 0x71, 0x6b, 0x68, 0x65, 0x6e, 0x58, 0x5d, 0x70, 0x5d, 0x6d, 0x67, 0x5e, 0x80, 0x78, 0x94,
+ 0x98, 0x7c, 0x96, 0x90, 0xa1, 0xa5, 0x82, 0x7f, 0x70, 0x7e, 0x94, 0x87, 0x87, 0x80, 0x88, 0x92,
+ 0x8e, 0x96, 0x8c, 0x89, 0x84, 0x73, 0x72, 0x6f, 0x71, 0x6d, 0x5e, 0x61, 0x6a, 0x70, 0x77, 0x6f,
+ 0x6d, 0x79, 0x76, 0x7f, 0x77, 0x75, 0x7e, 0x90, 0xa8, 0x8c, 0x85, 0x98, 0x9b, 0xa7, 0x93, 0x79,
+ 0x78, 0x79, 0x91, 0x94, 0x87, 0x86, 0x85, 0x86, 0x8b, 0x89, 0x82, 0x7c, 0x74, 0x6d, 0x6c, 0x75,
+ 0x75, 0x6f, 0x64, 0x69, 0x74, 0x7e, 0x83, 0x76, 0x75, 0x85, 0x8a, 0x89, 0x88, 0x78, 0x81, 0x88,
+ 0x83, 0x85, 0x7e, 0x80, 0x88, 0x89, 0x8c, 0x8d, 0x8a, 0x8b, 0x88, 0x88, 0x89, 0x85, 0x81, 0x81,
+ 0x7e, 0x7c, 0x7c, 0x77, 0x7d, 0x76, 0x6f, 0x7d, 0x7f, 0x78, 0x73, 0x76, 0x83, 0x84, 0x80, 0x7f,
+ 0x82, 0x86, 0x80, 0x81, 0x83, 0x81, 0x81, 0x7e, 0x7d, 0x7b, 0x83, 0x8b, 0x85, 0x7a, 0x76, 0x83,
+ 0x87, 0x82, 0x7d, 0x76, 0x7b, 0x80, 0x83, 0x81, 0x7a, 0x79, 0x7d, 0x82, 0x81, 0x82, 0x82, 0x83,
+ 0x86, 0x80, 0x80, 0x81, 0x7e, 0x80, 0x7d, 0x7a, 0x7e, 0x81, 0x7e, 0x7e, 0x80, 0x7f, 0x81, 0x82,
+ 0x80, 0x81, 0x82, 0x7f, 0x7f, 0x7d, 0x7c, 0x7f, 0x7b, 0x7b, 0x7d, 0x7a, 0x7a, 0x7e, 0x7e, 0x7c,
+ 0x7c, 0x7f, 0x80, 0x7f, 0x80, 0x82, 0x81, 0x81, 0x80, 0x7e, 0x80, 0x7f, 0x81, 0x7b, 0x7c, 0x7f,
+ 0x7f, 0x81, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x83, 0x7e, 0x7f, 0x85, 0x81, 0x83,
+ 0x84, 0x80, 0x84, 0x81, 0x81, 0x83, 0x81, 0x83, 0x80, 0x84, 0x80, 0x80, 0x85, 0x80, 0x81, 0x7f,
+ 0x82, 0x82, 0x81, 0x81, 0x80, 0x81, 0x80, 0x87, 0x81, 0x7c, 0x80, 0x7f, 0x80, 0x7d, 0x7c, 0x7d,
+ 0x80, 0x80, 0x80, 0x82, 0x7d, 0x81, 0x82, 0x7e, 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x82,
+ 0x7f, 0x80, 0x7f, 0x7f, 0x81, 0x7f, 0x80, 0x7e, 0x81, 0x80, 0x7e, 0x80, 0x7e, 0x7f, 0x80, 0x80,
+ 0x82, 0x7f, 0x83, 0x83, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x80,
+ 0x80, 0x81, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7e, 0x7d, 0x7e, 0x7d, 0x7c, 0x7d, 0x7c, 0x7c,
+ 0x7d, 0x7c, 0x7d, 0x7e, 0x7f, 0x7e, 0x7e, 0x7f, 0x7d, 0x7f, 0x7f, 0x80, 0x7f, 0x7e, 0x7f, 0x80,
+ 0x7e, 0x80, 0x7e, 0x7e, 0x80, 0x7e, 0x80, 0x7e, 0x7f, 0x7e, 0x7d, 0x7f, 0x7d, 0x7d, 0x7d, 0x7d,
+ 0x7d, 0x7d, 0x7e, 0x7f, 0x7f, 0x7d, 0x7e, 0x7f, 0x7e, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80,
+ 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x81, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x80, 0x7f,
+ 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80,
+ 0x81, 0x80, 0x82, 0x83, 0x81, 0x82, 0x81, 0x82, 0x82, 0x82, 0x81, 0x81, 0x83, 0x82, 0x82, 0x82,
+ 0x81, 0x83, 0x82, 0x81, 0x81, 0x80, 0x80, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x80, 0x7d, 0x80,
+ 0x81, 0x7e, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, 0x81, 0x81, 0x80,
+ 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x81, 0x80, 0x7f, 0x81, 0x81, 0x82, 0x81,
+ 0x80, 0x82, 0x82, 0x80, 0x81, 0x81, 0x80, 0x80, 0x7e, 0x7d, 0x7f, 0x7e, 0x81, 0x81, 0x7e, 0x7f,
+ 0x82, 0x7f, 0x7d, 0x7f, 0x7d, 0x81, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x80,
+ 0x7f, 0x7e, 0x7f, 0x7f, 0x7e, 0x7c, 0x7d, 0x7e, 0x7d, 0x7d, 0x7e, 0x7d, 0x7e, 0x7c, 0x7e, 0x7e,
+ 0x7c, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, 0x7d, 0x7d, 0x7c, 0x7b, 0x7c, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b,
+ 0x7b, 0x7c, 0x7c, 0x7d, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d,
+ 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f,
+ 0x7f, 0x7f, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
+ 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81,
+ 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x81,
+ 0x81, 0x81, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, 0x82,
+ 0x81, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f,
+ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e,
+ 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f,
+ 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f,
+ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x81, 0x80, 0x83, 0x80, 0x80, 0x80, 0x84, 0x84,
+ 0x7b, 0x7e, 0x80, 0x80, 0x7e, 0x80, 0x7e, 0x7f, 0x81, 0x81, 0x80, 0x7f, 0x80, 0x7f, 0x7e, 0x7e,
+ 0x7f, 0x80, 0x80, 0x7f, 0x81, 0x82, 0x80, 0x80, 0x81, 0x81, 0x80, 0x81, 0x7f, 0x80, 0x80, 0x81,
+ 0x81, 0x81, 0x81, 0x84, 0x83, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x81, 0x7e, 0x7e, 0x7f, 0x81, 0x7f,
+ 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x81, 0x82, 0x82, 0x80, 0x7f, 0x80,
+ 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x7d, 0x7e, 0x7e, 0x7f, 0x80,
+ 0x80, 0x80, 0x80, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x80, 0x80, 0x81, 0x7f, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x7e, 0x7e, 0x7e, 0x7f,
+ 0x7e, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7e, 0x80, 0x7e, 0x7f, 0x7f,
+ 0x7e, 0x7f, 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7e, 0x7f, 0x7f,
+ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x81, 0x80, 0x7f, 0x80, 0x80, 0x82,
+ 0x81, 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x81, 0x81, 0x80, 0x81, 0x80, 0x82, 0x7f,
+ 0x7f, 0x7e, 0x7e, 0x80, 0x7e, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x81, 0x80,
+ 0x81, 0x80, 0x80, 0x81, 0x80, 0x83, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x7e, 0x80, 0x7f,
+ 0x7f, 0x80, 0x7f, 0x82, 0x80, 0x81, 0x7f, 0x7e, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80,
+ 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x7f, 0x80, 0x7f, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x81, 0x80, 0x80, 0x80, 0x81, 0x81, 0x7f, 0x7f, 0x7f,
+ 0x7f, 0x7e, 0x7e, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x7f, 0x80, 0x7e, 0x7f, 0x7f,
+ 0x7e, 0x80, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7d, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, 0x80,
+ 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7f, 0x80, 0x81, 0x81, 0x81, 0x80, 0x80, 0x7f, 0x7f, 0x80, 0x7f,
+ 0x7f, 0x7f, 0x81, 0x81, 0x7f, 0x80, 0x7f, 0x80, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x7f, 0x7f,
+ 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x80, 0x81, 0x80, 0x80, 0x7f, 0x7e, 0x7f, 0x7e, 0x7e, 0x7e, 0x7e,
+ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x7f, 0x80, 0x80, 0x7f, 0x80, 0x7e, 0x7f, 0x7e
+};
+
+static const Uint8 right[1777] = {
+ 0x7f, 0x7e, 0x7e, 0x7f, 0x80, 0x80, 0x80, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x82, 0x83, 0x83, 0x83,
+ 0x82, 0x81, 0x81, 0x80, 0x7f, 0x7e, 0x7c, 0x7b, 0x7a, 0x7a, 0x79, 0x79, 0x79, 0x7a, 0x7a, 0x7b,
+ 0x7c, 0x7e, 0x80, 0x82, 0x84, 0x86, 0x88, 0x89, 0x89, 0x89, 0x88, 0x87, 0x84, 0x82, 0x80, 0x7e,
+ 0x7c, 0x7b, 0x7a, 0x7a, 0x79, 0x78, 0x77, 0x75, 0x76, 0x77, 0x78, 0x78, 0x78, 0x7b, 0x81, 0x87,
+ 0x8c, 0x8e, 0x90, 0x92, 0x91, 0x8d, 0x87, 0x81, 0x7d, 0x7b, 0x7a, 0x79, 0x79, 0x7a, 0x79, 0x78,
+ 0x75, 0x74, 0x75, 0x75, 0x75, 0x76, 0x76, 0x76, 0x76, 0x7b, 0x83, 0x88, 0x8b, 0x8f, 0x95, 0x98,
+ 0x95, 0x8d, 0x86, 0x83, 0x80, 0x7e, 0x7c, 0x7c, 0x7e, 0x7e, 0x7c, 0x79, 0x78, 0x76, 0x75, 0x72,
+ 0x73, 0x74, 0x72, 0x6f, 0x6d, 0x72, 0x7e, 0x87, 0x8b, 0x90, 0x98, 0x9f, 0x9b, 0x91, 0x85, 0x7f,
+ 0x7b, 0x78, 0x79, 0x7f, 0x87, 0x8b, 0x8a, 0x89, 0x89, 0x86, 0x81, 0x79, 0x75, 0x74, 0x73, 0x73,
+ 0x6f, 0x6d, 0x6e, 0x6e, 0x6e, 0x6f, 0x72, 0x77, 0x82, 0x8f, 0x95, 0x99, 0x9c, 0x9e, 0x99, 0x8c,
+ 0x7f, 0x74, 0x71, 0x70, 0x74, 0x7e, 0x8a, 0x92, 0x91, 0x8f, 0x8f, 0x8d, 0x85, 0x7c, 0x76, 0x75,
+ 0x76, 0x75, 0x71, 0x6d, 0x6b, 0x68, 0x64, 0x64, 0x66, 0x6e, 0x83, 0x8f, 0x93, 0x9b, 0xa3, 0xa4,
+ 0x97, 0x86, 0x76, 0x6f, 0x6d, 0x6e, 0x78, 0x87, 0x94, 0x98, 0x96, 0x94, 0x91, 0x89, 0x7e, 0x74,
+ 0x6f, 0x70, 0x74, 0x72, 0x6e, 0x6b, 0x67, 0x62, 0x60, 0x60, 0x69, 0x84, 0x91, 0x95, 0xa1, 0xae,
+ 0xb0, 0x9b, 0x84, 0x74, 0x6a, 0x65, 0x67, 0x78, 0x8b, 0x98, 0x9f, 0x9e, 0x9a, 0x90, 0x86, 0x7c,
+ 0x71, 0x6a, 0x6c, 0x73, 0x74, 0x6d, 0x69, 0x65, 0x5e, 0x5c, 0x60, 0x6f, 0x8b, 0x95, 0x9b, 0xac,
+ 0xb3, 0xa5, 0x89, 0x7a, 0x6b, 0x5c, 0x5f, 0x70, 0x88, 0x97, 0xa5, 0xac, 0xa1, 0x95, 0x8e, 0x86,
+ 0x76, 0x6a, 0x6b, 0x72, 0x72, 0x6c, 0x67, 0x5e, 0x55, 0x52, 0x56, 0x78, 0x9c, 0x91, 0x9c, 0xbc,
+ 0xb8, 0x98, 0x83, 0x7f, 0x5e, 0x4c, 0x6c, 0x83, 0x8a, 0x9a, 0xb7, 0xae, 0x8a, 0x8f, 0x93, 0x79,
+ 0x69, 0x76, 0x76, 0x69, 0x70, 0x70, 0x5b, 0x50, 0x51, 0x57, 0x52, 0x77, 0xb2, 0x90, 0x95, 0xc8,
+ 0xb1, 0x8d, 0x89, 0x8a, 0x55, 0x4e, 0x87, 0x7f, 0x82, 0xb3, 0xb9, 0x8f, 0x8c, 0x9d, 0x79, 0x71,
+ 0x80, 0x6a, 0x61, 0x7b, 0x70, 0x51, 0x63, 0x62, 0x3e, 0x50, 0x61, 0x9a, 0xad, 0x7e, 0xba, 0xb5,
+ 0x94, 0x9f, 0x93, 0x75, 0x4b, 0x7b, 0x79, 0x6c, 0xab, 0xaf, 0x9f, 0x93, 0x8e, 0x7a, 0x7f, 0x89,
+ 0x6a, 0x6e, 0x71, 0x66, 0x5e, 0x63, 0x5c, 0x53, 0x53, 0x50, 0x5a, 0xb8, 0xbd, 0x6d, 0xc3, 0xb2,
+ 0x8a, 0xa7, 0xa1, 0x70, 0x4c, 0x88, 0x63, 0x7d, 0xb1, 0xa1, 0xa6, 0x8e, 0x6a, 0x7c, 0x95, 0x8b,
+ 0x84, 0x72, 0x5c, 0x5c, 0x67, 0x64, 0x61, 0x56, 0x65, 0x52, 0x44, 0x80, 0xda, 0x8a, 0x88, 0xc9,
+ 0x89, 0x96, 0xb1, 0x92, 0x4a, 0x6f, 0x6d, 0x78, 0xa5, 0xa7, 0xa0, 0x98, 0x66, 0x6e, 0xa6, 0x9d,
+ 0x95, 0x70, 0x52, 0x57, 0x73, 0x69, 0x72, 0x5a, 0x55, 0x52, 0x50, 0x3d, 0xb8, 0xdb, 0x5d, 0xa9,
+ 0xab, 0x82, 0xad, 0xc3, 0x65, 0x4c, 0x6c, 0x6d, 0x98, 0xac, 0x9f, 0x97, 0x74, 0x5a, 0xa0, 0xb1,
+ 0x9e, 0x7e, 0x52, 0x54, 0x74, 0x71, 0x6a, 0x6a, 0x5a, 0x53, 0x4b, 0x46, 0x5e, 0xe5, 0xaa, 0x62,
+ 0xab, 0x8f, 0x97, 0xcb, 0xa5, 0x4b, 0x4f, 0x67, 0x88, 0xa6, 0xa4, 0x98, 0x84, 0x61, 0x80, 0xb7,
+ 0xb4, 0x98, 0x64, 0x4e, 0x64, 0x77, 0x72, 0x72, 0x55, 0x54, 0x4e, 0x52, 0x3c, 0x96, 0xf0, 0x69,
+ 0x7f, 0xa2, 0x80, 0xc1, 0xc8, 0x75, 0x46, 0x4d, 0x74, 0xa4, 0x9e, 0x95, 0x8a, 0x6a, 0x73, 0xa6,
+ 0xb7, 0xb4, 0x81, 0x60, 0x5e, 0x71, 0x7c, 0x74, 0x6b, 0x54, 0x54, 0x48, 0x4f, 0x44, 0xc3, 0xcb,
+ 0x5b, 0x9b, 0x86, 0x99, 0xd4, 0xa3, 0x71, 0x3e, 0x4b, 0x91, 0x99, 0x9d, 0x95, 0x70, 0x72, 0x85,
+ 0xb0, 0xbd, 0xa5, 0x7e, 0x67, 0x67, 0x78, 0x77, 0x6e, 0x63, 0x53, 0x5b, 0x39, 0x50, 0x48, 0xb5,
+ 0xc2, 0x6a, 0xa5, 0x77, 0xa8, 0xbd, 0x98, 0x89, 0x3a, 0x60, 0x83, 0x85, 0xa9, 0x87, 0x87, 0x74,
+ 0x77, 0xac, 0xa9, 0xb9, 0x8a, 0x71, 0x6b, 0x6d, 0x81, 0x6d, 0x66, 0x51, 0x60, 0x3c, 0x50, 0x4a,
+ 0x91, 0xbf, 0x83, 0xae, 0x7a, 0xa4, 0xa1, 0x97, 0x92, 0x4b, 0x73, 0x68, 0x86, 0x8e, 0x8c, 0x95,
+ 0x79, 0x83, 0x86, 0xa2, 0xab, 0xa6, 0x8d, 0x79, 0x6a, 0x75, 0x68, 0x74, 0x56, 0x5c, 0x4e, 0x4c,
+ 0x49, 0x5d, 0xb1, 0x88, 0xb9, 0x8d, 0xa4, 0x90, 0x94, 0x8b, 0x66, 0x72, 0x69, 0x83, 0x7c, 0x91,
+ 0x82, 0x89, 0x79, 0x87, 0x8a, 0xa1, 0x9f, 0xa5, 0x95, 0x8d, 0x7a, 0x6f, 0x6f, 0x61, 0x62, 0x58,
+ 0x5f, 0x52, 0x52, 0x4f, 0x80, 0x90, 0xa1, 0xa6, 0xa3, 0x9c, 0x90, 0x86, 0x74, 0x6d, 0x6c, 0x7a,
+ 0x83, 0x8a, 0x8c, 0x88, 0x7f, 0x80, 0x82, 0x8f, 0x99, 0x9e, 0xa3, 0x9a, 0x93, 0x84, 0x73, 0x68,
+ 0x5d, 0x5e,
(Patch may be truncated, please check the link at the top of this post.)