%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Rychla reference k SDL
%
%  Martin Bruchanov -- bruxy at regnet dot cz
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%\pdfoutput=1
\documentclass[a4paper, 10pt, pointednumbers, twoside]{scrartcl}
\usepackage{czech}
\usepackage{a4wide}
\usepackage{graphics}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{latexsym}
\usepackage{multicol}

% změna okrajů stránky, které jsou standardně 1 palec = 2.54 cm
\evensidemargin 0mm
\oddsidemargin 0mm
\headsep 0mm
\hoffset -18.4mm
\voffset -17.4mm % vrsek
\topmargin 0in 
\headheight 0cm
\textwidth 197mm
\textheight 28.7cm
\footskip 0mm

\dateczech
%\renewcommand{\arraystretch}{1.2}

%\renewcommand{\tt}[#1]{\texttt{#1}}

% Zmena radkovani
\renewcommand{\baselinestretch}{0.8}

% Zmena vzdalenosti
%\newcommand{\itemizespace}{-0.5em}
\newcommand{\itemizespace}{0em}


\pagestyle{empty}

\begin{document} 
\section*{Simple Direct Layer}
\addtocounter{section}{1}


\begin{multicols}{2}

\texttt{www.libsdl.org}

\subsection{Obecné}
\begin{itemize}\addtolength\itemsep{\itemizespace}

\item \verb|#include "SDL.h"|

\item Datové typy

{\ttfamily
\begin{tabular}{l|l}
\textrm{SDL} & \textrm{C ekvivalent} \\ \hline
\verb|SDL_bool| & int \\
Uint8 & unsigned char \\
Uint16 & unsigned short \\
Uint32 & unsigned int \\
Uint64 & unsigned long long \\
Sint8 & signed char \\
Sint16 & signed short \\
Sint32 & singed int \\
Sint64 & signed long long \\
\end{tabular}
}

\item  

$
 \mathtt{SDL\_bool} = \big\{
 \begin{array}{l}
  \mathtt{SDL\_TRUE} \\
  \mathtt{SDL\_FALSE}
 \end{array}
$

\item \textbf{SDL\_Init()} -- Inicializace

\begin{verbatim}
int SDL_Init(Uint32 flags);
\end{verbatim}

Flagy (zadávat s bitovým OR):
\begin{itemize}\addtolength\itemsep{\itemizespace}
	\item \texttt{SDL\_INIT\_TIMER, SDL\_INIT\_AUDIO, SDL\_INIT\_VIDEO,
	SDL\_INIT\_CDROM, SDL\_INIT\_JOYSTICK} -- zapnutí subsystémů pro
	časovač, audio, video, CD-ROM, joystick,
	\item \verb|SDL_INIT_EVERYTHING| -- všechny předchozí dohromady,
	\item \verb|SDL_INIT_NOPARACHUTE| -- ochrana před zachycením
	atálních signálů, 
	\item \verb|SDL_INIT_EVENTTHREAD| -- správa událostí ve zvlášním
	vláknu.
\end{itemize}

\item \textbf{SDL\_InitSubSystem(), SDL\_QuitSubSystem()} -- dodatečná
inic. subsystému nebo jeho vypnutí

\begin{verbatim}
int SDL_InitSubSystem(Uint32 flags);
void SDL_QuitSubSystem(Uint32 flags);
\end{verbatim}

\item \textbf{SDL\_WasInit()} -- kontrola jestli byl subsystém inicializován

\begin{verbatim}
int SDL_WasInit(Uint32 flags);
\end{verbatim}

\item \textbf{SDL\_GetError()} -- vrátí řetězec s popisem chyby

\begin{verbatim}
char *SDL_GetError(void);
\end{verbatim}


\item \textbf{SDL\_Quit()} -- ukončení běhu SDL

\begin{verbatim}
void SDL_Quit(void);
\end{verbatim}

%\item \textbf{} --
%SDL\_QuitSubSystem, SDL\_LoadObject, SDL\_LoadFunction,
%SDL\_UnloadObject, SDL\_envvars
\end{itemize}

\subsection{Video}

\begin{itemize}\addtolength\itemsep{\itemizespace}
\item Struktura \textbf{SDL\_Surface} -- definuje parametry
okna video paměti

\begin{verbatim}
typedef struct SDL_Surface {
  Uint32 flags;              /* Read-only */
  /* Formát pixelů */
  SDL_PixelFormat *format;   /* Read-only */
  /* w - šířka, h - výška */
  int w, h;                  /* Read-only */
  /* délka obr. řádku v bytech */
  Uint16 pitch;              /* Read-only */
  /* ukatel na obr. data */
  void *pixels;              /* Read-write */
  /* ořezový obdélník */ 
  SDL_Rect clip_rect;        /* Read-only */
  int refcount;              /* Read-mostly */
} SDL_Surface;
\end{verbatim}

\item  Struktura \textbf{SDL\_Rect} -- definuje
parametry obdélníkové oblasti

\begin{verbatim}
typedef struct{
  Sint16 x, y; /* levý horní roh */
  Uint16 w, h; /* rozměry šířka x výška */
} SDL_Rect;
\end{verbatim}

\item Struktura \textbf{SDL\_PixelFormat} -- uložené
parametry surface

\begin{verbatim}
typedef struct {
  /* ukazatel na 8bit. paletu */
  SDL_Palette *palette;
  /* počet bitů na pixel (8, 16, 24, 32) */
  Uint8  BitsPerPixel;
  /* počt bytů na pixel */
  Uint8  BytesPerPixel;
  /* přesnost barevných kanálů */
  Uint8  Rloss, Gloss, Bloss, Aloss;
  /* pousny uložení bar. kanálů */
  Uint8  Rshift, Gshift, Bshift, Ashift;
  /* maska barevných kanálů */
  Uint32 Rmask, Gmask, Bmask, Amask;
  Uint32 colorkey;
  /* celková hodnota alfa kanálu */
  Uint8  alpha;
} SDL_PixelFormat;
\end{verbatim}

\item \textbf{SDL\_SetVideoMode()} -- nastavení paremetrů
video módu

\begin{verbatim}
SDL_Surface *SDL_SetVideoMode(int width, 
int height, int bitsperpixel, Uint32 flags);
\end{verbatim}

Flagy (zadávat s bitovým OR):
\begin{itemize}\addtolength\itemsep{\itemizespace}
	\item \texttt{SDL\_SWSURFACE} -- surface v hlavní paměti,
	\item \texttt{SDL\_HWSURFACE} -- surface ve video paměti,
	\item \texttt{SDL\_DOUBLEBUF} -- hardwarový double-buffering,
	\item \texttt{SDL\_FULLSCREEN} -- fullscreen režim,
	\item \texttt{SDL\_OPENGL} -- vykreslování přes OpenGL,
	\item \texttt{SDL\_RESIZABLE} -- okno s proměnými rozměry,
	\item \texttt{SDL\_ASYNCBLIT}, \texttt{SDL\_ANYFORMAT}, \texttt{SDL\_HWPALETTE}, \texttt{SDL\_OPENGLBLIT}, \texttt{SDL\_RESIZABLE}, \texttt{SDL\_NOFRAME}.

\end{itemize}

\item \textbf{SDL\_CreateRGBSurface()} -- vytvoří prázdný surface

\begin{verbatim}
SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, 
  int width, int height, int bitsPerPixel, 
  Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, 
  Uint32 Amask);
\end{verbatim}

Flagy (zadávat s bitovým OR):
\begin{itemize}\addtolength\itemsep{\itemizespace}
	\item \texttt{SDL\_SWSURFACE}, \texttt{SDL\_HWSURFACE}
	\item \texttt{SDL\_SRCCOLORKEY} -- klíčování barevných kanalů,
	\item \texttt{SDL\_SRCALPHA} -- zapíná míchání alpha-kanálu.
\end{itemize}

\item Pořadí bitové masky 

$
 \mathtt{SDL\_BYTEORDER} = \big\{
 \begin{array}{l}
  \mathtt{SDL\_BIG\_ENDIAN} \quad RGBA\\
  \mathtt{SDL\_LIL\_ENDIAN} \quad ABGR\\
 \end{array}
$

\item \textbf{SDL\_CreateRGBSurfaceFrom()} -- vytvořit 
surface s obrazovými daty.

{\small
\begin{verbatim}
SDL_Surface *SDL_CreateRGBSurfaceFrom(void *pixels, ...
\end{verbatim}
}

\item \textbf{SDL\_SetClipRect()} -- nastaví ořezový obdélník 
surface

\begin{verbatim}
void SDL_SetClipRect(SDL_Surface *surface, 
                     SDL_Rect *rect);
\end{verbatim}

\item \textbf{SDL\_MapRGB()} -- mapování RGB(A) kanálů
do formátu pixelu

\begin{verbatim}
Uint32 SDL_MapRGB(SDL_PixelFormat *fmt,
                  Uint8 r, Uint8 g, Uint8 b);
Uint32 SDL_MapRGBA(SDL_PixelFormat *fmt, 
         Uint8 r, Uint8 g, Uint8 b, Uint8 a);
\end{verbatim}

\item \textbf{SDL\_GetRGB()} -- vrátí RGB(A) kanály
z pixelu

\begin{verbatim}
void SDL_GetRGB(Uint32 pixel,
         SDL_PixelFormat *fmt,
         Uint8 *r, Uint8 *g, Uint8 *b);

void SDL_GetRGBA(Uint32 pixel, 
         SDL_PixelFormat *fmt, 
         Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a);
\end{verbatim}

\item \textbf{Kreslení pixelů} pomocí zadávání
adresy uvnitř surface

$$
\mathrm{Adresa} = \mathrm{ukazatel}+Y\times\mathrm{velikost\,řádku} + X\times \mathrm{pixel}
$$
\begin{itemize}\addtolength\itemsep{\itemizespace}
	\item ukazatel na počátek surface: \verb|surface->pixels|
	\item velikost obrazového řádku v bytech: \verb|surface->pitch|
	\item velikost obr. bodu v paměti:\\
	\quad \verb|surface->format->BytesPerPixel|
\end{itemize}



\item \textbf{SDL\_FillRect()} -- vyplnění oblasti
barvou, \texttt{dstrect} omezí velikost, při \texttt{NULL}
celá plocha

\begin{verbatim}
int SDL_FillRect(SDL_Surface *dst, 
             SDL_Rect *dstrect, Uint32 color);
\end{verbatim}

\item \textbf{SDL\_SetAlpha} -- nastavení průhlednosti, úplně průhledný 0,
neprůhledný 255

\begin{verbatim}
int SDL_SetAlpha(SDL_Surface *surface, 
         Uint32 flags, Uint8 alpha);
\end{verbatim}

%%%%%%%%%%
\item \textbf{SDL\_BlitSurface()} -- rychlý přesun dat mezi surfacy

\begin{verbatim}
int SDL_BlitSurface(SDL_Surface *src, 
                    SDL_Rect *srcrect, 
                    SDL_Surface *dst, 
					SDL_Rect *dstrect);
\end{verbatim}

\item \textbf{SDL\_LoadBMP(),  SDL\_SaveBMP()} -- načtení a uložení
obrazu 

\begin{verbatim}
SDL_Surface *SDL_LoadBMP(const char *file);
int SDL_SaveBMP(SDL_Surface *surface, 
                const char *file);
\end{verbatim}

\item \textbf{SDL\_LockSurface(), SDL\_UnlockSurface()} -- uzamčení
surface pro přímý přístup, udemčení surface. Uzamčení se provádí 
před zápisem obrazových dat.

\begin{verbatim}
int SDL_LockSurface(SDL_Surface *surface);
void SDL_UnlockSurface(SDL_Surface *surface);
\end{verbatim}

\item \textbf{SDL\_UpdateRect} -- obnoví oblast obrazovky,
pokud jsou parametry 0 celou obrazovku 

\begin{verbatim}
void SDL_UpdateRect(SDL_Surface *screen, Sint32 x, 
                    Sint32 y, Sint32 w, Sint32 h);
\end{verbatim}


\item \textbf{SDL\_FreeSurface} -- uvolní surface z paměti

\begin{verbatim}
SDL_FreeSurface(SDL_Surface *surface);
\end{verbatim}
\end{itemize}



%%%%%%%%%%%%%%
\subsection{Komunikace se správcem oken}

\begin{itemize}\addtolength\itemsep{\itemizespace}
\item \textbf{SDL\_WM\_SetCaption}  nastavení titulku okna

\begin{verbatim}
void SDL_WM_SetCaption(const char *title, 
                       const char *icon);
\end{verbatim}

\item \textbf{SDL\_WM\_ToggleFullScreen} -- přepínání mezi oknem a celou
obrazovkou (za běhu pouze pod X11)


\begin{verbatim}
int SDL_WM_ToggleFullScreen(SDL_Surface *surface);
\end{verbatim}

\item \textbf{SDL\_GrabMode } -- chování kurzoru myši;


\begin{verbatim}
SDL_GrabMode SDL_WM_GrabInput(SDL_GrabMode mode);
\end{verbatim}
Mód: při \texttt{SDL\_GRAB\_ON} kurzor pohlcen v okně, vypnout
\texttt{SDL\_GRAB\_OFF}, zjistit stav pomocí \texttt{SDL\_GRAB\_QUERY}
\end{itemize}


%%%%%%%%%%%%%%
\subsection{Správa událostí}

\begin{itemize}\addtolength\itemsep{\itemizespace}
\item Union SDL\_Event pro zpracování událostí vyvolaných
uživatelem, obsahuje struktury se stavem jednotlivých zažízení

\begin{itemize}\addtolength\itemsep{\itemizespace}
\item Klávesnice

{\small
\begin{verbatim}
typedef struct{
  Uint8 type; /* SDL_KEYDOWN, SDL_KEYUP */
  Uint8 state; /* SDL_PRESSED, SDL_RELEASED */
  SDL_keysym keysym; /* klávesa */
} SDL_KeyboardEvent;
\end{verbatim}
}

\item Pohyb kurzoru myši

{\small
\begin{verbatim}
typedef struct{
  Uint8 type; /* SDL_MOUSEMOTION */
  Uint8 state; /* stav tlačítek */
  Uint16 x, y; /* pozice */
  Sint16 xrel, yrel; /* relativní poz. */
} SDL_MouseMotionEvent;
\end{verbatim}
}

\item Stav tlačítek myši

{\small
\begin{verbatim}
typedef struct{
  /* SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP */
  Uint8 type;   
  Uint8 button; /* které tlačítko ? */
  Uint8 state; /* SDL_PRESSED,  SDL_RELEASED */
  Uint16 x, y; /* souřadnice při změně stavu */
} SDL_MouseButtonEvent; 
\end{verbatim}
}

Tlačítko (\texttt{SDL\_BUTTON\_xxx}): 
\texttt{LEFT, MIDDLE, RIGHT, WHEELUP, WHEELDOWN}

\item Ukončení správcem oken, typ \texttt{SDL\_QUIT} 

\begin{verbatim}
typedef struct{ Uint8 type } SDL_QuitEvent;
\end{verbatim}

\end{itemize}

\item \textbf{SDL\_WaitEvent()} -- libovolně dlouhé čekání dokud nenastane 
nějaká událost 

\begin{verbatim}
int SDL_WaitEvent(SDL_Event *event);
\end{verbatim}

\item \textbf{SDL\_PollEvent()} -- vrátí posledná událost ve frontě,
nečeká na událost v případě prázdné fronty

\begin{verbatim}
int SDL_PollEvent(SDL_Event *event);
\end{verbatim}

\item \textbf{SDL\_PumpEvents()} -- shromažďuje události ze zařícení 
a tlačí je do fronty

\begin{verbatim}
void SDL_PumpEvents(void);
\end{verbatim}

\item \textbf{SDL\_PushEvent()} -- vložení události do fronty

\begin{verbatim}
int SDL_PushEvent(SDL_Event *event); 
\end{verbatim}

\end{itemize}

\section{Kompilace v GNU/Linux}

\begin{itemize}\addtolength\itemsep{\itemizespace}
\item Nastavení voleb kompilátoru

\begin{verbatim}
gcc `sdl-config --cflags` -c program.c 
\end{verbatim}

\item Nastavení voleb linkeru

\begin{verbatim}
gcc `sdl-config --libs` -o program program.o 
\end{verbatim}


\end{itemize}

\end{multicols}
\end{document}


