You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeaddons/noatun-plugins/synaescope/sdlwrap.cpp

208 lines
4.7 KiB

/* 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>
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"
#ifdef Bool
#undef Bool
#endif
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 )
{
fprintf(stderr, "Could not initialize SDL library: %s\n", SDL_GetError());
return false;
}
updateWindowCaption("Noatun - 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()
{
SDL_Quit();
}
bool SdlScreen::inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit)
{
SDL_Event event;
keyHit = 0;
mouseButtons=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 );
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)
{
mouseButtons=0;
fullscreen();
}
if (event.key.keysym.unicode > 255)
break;
keyHit = event.key.keysym.unicode;
return true;
case SDL_QUIT:
//keyHit = 'q';
return false;
break;
}
}
return true;
}
void SdlScreen::fullscreen()
{
SDL_WM_ToggleFullScreen(surface);
}
int SdlScreen::sizeUpdate() { return 0; }
void SdlScreen::show()
{
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);
}
void SdlScreen::updateWindowCaption(const char *string)
{
SDL_WM_SetCaption(string, "synaescope");
}
/*
int SdlScreen::winID()
{
SDL_SysWMinfo info;
info.version.major = SDL_MAJOR_VERSION;
info.subsystem = SDL_SYSWM_X11;
SDL_GetWMInfo(&info);
return info.info.x11.wmwindow;
}*/