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.
208 lines
4.7 KiB
208 lines
4.7 KiB
15 years ago
|
/* 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;
|
||
|
}*/
|