diff options
Diffstat (limited to 'noatun-plugins/tippercanoe/sdlwrap.cpp')
-rw-r--r-- | noatun-plugins/tippercanoe/sdlwrap.cpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/noatun-plugins/tippercanoe/sdlwrap.cpp b/noatun-plugins/tippercanoe/sdlwrap.cpp new file mode 100644 index 0000000..7449aec --- /dev/null +++ b/noatun-plugins/tippercanoe/sdlwrap.cpp @@ -0,0 +1,197 @@ +/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia) + Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au> + 2001 Charles Samuels <charles@kde.org> + Copyright (C) 2001 Neil Stevens <multivac@fcmail.com> + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <string.h> +#include "syna.h" +#include <iostream> +#include <SDL_syswm.h> +#include "SDL.h" + +static SDL_Surface *surface; + +SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags) +{ + SDL_Surface *screen; + + /* Set the video mode */ + screen = SDL_SetVideoMode(w, h, bpp, flags); + + return screen; +} + +void SdlScreen::setPalette(unsigned char *palette) +{ + SDL_Color sdlPalette[256]; + + for(int i=0;i<256;i++) { + sdlPalette[i].r = palette[i*3+0]; + sdlPalette[i].g = palette[i*3+1]; + sdlPalette[i].b = palette[i*3+2]; + } + + SDL_SetColors(surface, sdlPalette, 0, 256); +} + +bool SdlScreen::init(int,int,int width,int height,bool fullscreen) +{ + Uint32 videoflags; + + /* Initialize SDL */ + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { + //char str[1000]; + //printf(str, "Could not initialize SDL library: %s\n",SDL_GetError()); + return false; + } + + SDL_WM_SetCaption("Synaescope","synaescope"); + + /* See if we try to get a hardware colormap */ + videoflags = SDL_SWSURFACE | (fullscreen?SDL_FULLSCREEN:0); + + surface = CreateScreen(width, height, 8, videoflags); + if (!surface) + { + error("requesting screen dimensions"); + } + + core->outWidth = width; + core->outHeight = height; + + SDL_EnableUNICODE(1); + SDL_ShowCursor(0); + + return true; +} + +void SdlScreen::end(void) +{ + SDL_Quit(); +} + +bool SdlScreen::inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit) +{ + SDL_Event event; + + keyHit = 0; + + while ( SDL_PollEvent(&event) > 0 ) { + switch (event.type) { + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: + if ( event.button.state == SDL_PRESSED ) + mouseButtons |= 1 << event.button.button; + else + mouseButtons &= ~( 1 << event.button.button ); + mouseX = event.button.x; + mouseY = event.button.y; + break; + case SDL_MOUSEMOTION : + mouseX = event.motion.x; + mouseY = event.motion.y; + break; + case SDL_KEYDOWN: + /* Ignore key releases */ + if ( event.key.state == SDL_RELEASED ) { + break; + } + + if(event.key.keysym.sym == SDLK_SPACE) + { + SDL_WM_ToggleFullScreen(surface); + mouseButtons = 0; + } + + if (event.key.keysym.unicode > 255) + break; + + keyHit = event.key.keysym.unicode; + return true; + case SDL_QUIT: + //keyHit = 'q'; + //return false; + break; + default: + break; + } + } + return true; +} + +int SdlScreen::sizeUpdate(void) { return 0; } + +void SdlScreen::show(void) { + SDL_LockSurface(surface); + + register unsigned long *ptr2 = (unsigned long*)core->output(); + unsigned long *ptr1 = (unsigned long*)( surface->pixels ); + int i = core->outWidth*core->outHeight/4; + + do { + // Asger Alstrup Nielsen's (alstrup@diku.dk) + // optimized 32 bit screen loop + register unsigned int const r1 = *(ptr2++); + register unsigned int const r2 = *(ptr2++); + + //if (r1 || r2) { +#ifdef LITTLEENDIAN + register unsigned int const v = + ((r1 & 0x000000f0ul) >> 4) + | ((r1 & 0x0000f000ul) >> 8) + | ((r1 & 0x00f00000ul) >> 12) + | ((r1 & 0xf0000000ul) >> 16); + *(ptr1++) = v | + ( ((r2 & 0x000000f0ul) << 12) + | ((r2 & 0x0000f000ul) << 8) + | ((r2 & 0x00f00000ul) << 4) + | ((r2 & 0xf0000000ul))); +#else + register unsigned int const v = + ((r2 & 0x000000f0ul) >> 4) + | ((r2 & 0x0000f000ul) >> 8) + | ((r2 & 0x00f00000ul) >> 12) + | ((r2 & 0xf0000000ul) >> 16); + *(ptr1++) = v | + ( ((r1 & 0x000000f0ul) << 12) + | ((r1 & 0x0000f000ul) << 8) + | ((r1 & 0x00f00000ul) << 4) + | ((r1 & 0xf0000000ul))); +#endif + //} else ptr1++; + } while (--i); + + SDL_UnlockSurface(surface); + SDL_UpdateRect(surface, 0, 0, 0, 0); +} + +int SdlScreen::winID(void) +{ + SDL_SysWMinfo info; + info.version.major = SDL_MAJOR_VERSION; + info.version.minor = SDL_MINOR_VERSION; + info.version.patch = SDL_PATCHLEVEL; + info.subsystem = SDL_SYSWM_X11; + + info.info.x11.wmwindow = 0xdeadbeef; + SDL_GetWMInfo(&info); + return info.info.x11.wmwindow; +} |