# Examples

## What is this?

In here are a collection of standalone SDL application examples. Unless
otherwise stated, they should work on all supported platforms out of the box.
If they don't [please file a bug to let us know](https://github.com/libsdl-org/SDL/issues/new).


## What is this SDL_AppIterate thing?

SDL can optionally build apps as a collection of callbacks instead of the
usual program structure that starts and ends in a function called `main`.
The examples use this format for two reasons.

First, it allows the examples to work when built as web applications without
a pile of ugly `#ifdef`s, and all of these examples are published on the web
at [examples.libsdl.org](https://examples.libsdl.org/), so you can easily see
them in action.

Second, it's example code! The callbacks let us cleanly break the program up
into the four logical pieces most apps care about:

- Program startup
- Event handling
- What the program actually does in a single frame
- Program shutdown

A detailed technical explanation of these callbacks is in
docs/README-main-functions.md (or view that page on the web on
[the wiki](https://wiki.libsdl.org/SDL3/README/main-functions#main-callbacks-in-sdl3)).


## I would like to build and run these examples myself.

When you build SDL with CMake, you can add `-DSDL_EXAMPLES=On` to the
CMake command line. When you build SDL, these examples will be built with it.

But most of these can just be built as a single .c file, as long as you point
your compiler at SDL3's headers and link against SDL.


## What is the license on the example code? Can I paste this into my project?

All code in the examples directory is considered public domain! You can do
anything you like with it, including copy/paste it into your closed-source
project, sell it, and pretend you wrote it yourself. We do not require you to
give us credit for this code (but we always appreciate if you do!).

This is only true for the examples directory. The rest of SDL falls under the
[zlib license](https://github.com/libsdl-org/SDL/blob/main/LICENSE.txt).


## What is template.html and highlight-plugin.lua in this directory?

This is what [examples.libsdl.org](https://examples.libsdl.org/) uses when
generating the web versions of these example programs. You can ignore this,
unless you are improving it, in which case we definitely would love to hear
from you!


## What is template.c in this directory?

If writing new examples, this is the skeleton code we start from, to keep
everything consistent. You can ignore it.


## How are the thumbnails/onmouseover media created?

(Since I have to figure this out every time.)

This is how Ryan is doing it currently.

- `rm -f frame*.png`
- Temporarily add `#include "../../save-rendering-to-bitmaps.h"` after any SDL
  includes in the example program.
- Launch the example app, interact with it, let it run for a few seconds, quit.
- This will dump a "frameX.png" file for each frame rendered.
- Make a video in webp format from the bitmaps (this assumes the bitmaps were
  stored at 60fps, you might have to tweak).

  ```bash
  ffmpeg -framerate 60 -pattern_type glob -i 'frame*.png' -loop 0 -quality 40 -r 10 -frames:v 40 onmouseover.webp
  ```

  You might need to start in the middle of the video, or mess with quality or
  number of frames to generate, ymmv.
- Pick a frame for the thumbnail, make it a .png, and run that png through
  pngquant for massive file size reduction without any obvious loss in quality:

  ```bash
  convert frame00000.png cvt.png ; pngquant cvt.png --output thumbnail.png ; rm -f cvt.png
  ```

