|
|
|
/* 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);
|
|
|
|
|
|
|
|
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
|
|
|
|
unsigned int const r1 = *(ptr2++);
|
|
|
|
unsigned int const r2 = *(ptr2++);
|
|
|
|
|
|
|
|
//if (r1 || r2) {
|
|
|
|
#ifdef LITTLEENDIAN
|
|
|
|
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
|
|
|
|
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;
|
|
|
|
}
|