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.
254 lines
6.0 KiB
254 lines
6.0 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.
|
|
*/
|
|
|
|
#ifndef SYNA_H
|
|
#define SYNA_H
|
|
|
|
#include "config.h"
|
|
#include <qptrlist.h>
|
|
#include "polygon.h"
|
|
#include <noatun/plugin.h>
|
|
|
|
//**************************************
|
|
// For the incurably fiddle prone:
|
|
|
|
// log2 of sample size
|
|
#define LogSize 9
|
|
|
|
// overlap amount between samples. Set to 1 or 2 if you have a fast computer
|
|
#define Overlap 1
|
|
|
|
// Brightness
|
|
#define Brightness 150
|
|
|
|
// Sample frequency
|
|
#define Frequency 22050
|
|
|
|
//***************************************
|
|
|
|
#define DefaultWidth 260
|
|
#define DefaultHeight 260
|
|
|
|
#define NumSamples (1<<LogSize)
|
|
#define RecSize (1<<LogSize-Overlap)
|
|
|
|
#ifndef __linux__
|
|
#warning This target has not been tested!
|
|
#endif
|
|
|
|
#ifdef __FreeBSD__
|
|
#include <machine/endian.h>
|
|
typedef unsigned short sampleType;
|
|
#else
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_ENDIAN_H
|
|
#include <endian.h>
|
|
#elif defined(_BIG_ENDIAN)
|
|
#define BIG_ENDIAN 1
|
|
#define BYTE_ORDER BIG_ENDIAN
|
|
#endif
|
|
typedef short sampleType;
|
|
#endif
|
|
|
|
#if BYTE_ORDER == BIG_ENDIAN
|
|
#define BIGENDIAN
|
|
#else
|
|
#define LITTLEENDIAN
|
|
#endif
|
|
|
|
void error(const char *str, bool syscall=false);
|
|
void warning(const char *str, bool syscall=false);
|
|
|
|
enum SymbolID
|
|
{
|
|
Speaker, Bulb,
|
|
Play, Pause, Stop, SkipFwd, SkipBack,
|
|
Handle, Pointer, Open, NoCD, Exit,
|
|
Zero, One, Two, Three, Four,
|
|
Five, Six, Seven, Eight, Nine,
|
|
Slider, Selector, Plug, Loop, Box, Bar,
|
|
Flame, Wave, Stars, Star, Diamond, Size, FgColor, BgColor,
|
|
Save, Reset, TrackSelect, FullScreen,
|
|
NotASymbol
|
|
};
|
|
|
|
// wrap
|
|
struct BaseScreen
|
|
{
|
|
virtual bool init(int xHint, int yHint, int widthHint, int heightHint, bool fullscreen) = 0;
|
|
virtual void setPalette(unsigned char *palette) = 0;
|
|
virtual void end() = 0;
|
|
virtual void fullscreen()=0;
|
|
virtual int sizeUpdate() = 0;
|
|
virtual bool inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit) = 0;
|
|
virtual void show() = 0;
|
|
virtual void updateWindowCaption(const char *string)=0;
|
|
};
|
|
|
|
struct SdlScreen : public BaseScreen
|
|
{
|
|
bool init(int xHint, int yHint, int widthHint, int heightHint, bool fullscreen);
|
|
void setPalette(unsigned char *palette);
|
|
void end();
|
|
void fullscreen();
|
|
int sizeUpdate();
|
|
bool inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit);
|
|
void show();
|
|
// int winID();
|
|
void updateWindowCaption(const char *string);
|
|
};
|
|
|
|
// core
|
|
class Combiner
|
|
{
|
|
public:
|
|
static unsigned short combine(unsigned short a,unsigned short b)
|
|
{
|
|
//Not that i want to give the compiler a hint or anything...
|
|
unsigned char ah = a>>8, al = a&255, bh = b>>8, bl = b&255;
|
|
if (ah < 64) ah *= 4; else ah = 255;
|
|
if (al < 64) al *= 4; else al = 255;
|
|
if (bh > ah) ah = bh;
|
|
if (bl > al) al = bl;
|
|
return ah*256+al;
|
|
}
|
|
};
|
|
|
|
class Interface;
|
|
|
|
class Core : public StereoScope
|
|
{
|
|
public:
|
|
Core();
|
|
~Core();
|
|
|
|
inline unsigned char *output() { return (unsigned char*)outputBmp.data; }
|
|
inline unsigned char *lastOutput() { return (unsigned char*)lastOutputBmp.data; }
|
|
inline unsigned char *lastLastOutput() { return (unsigned char*)lastLastOutputBmp.data; }
|
|
|
|
void allocOutput(int w,int h);
|
|
void interfaceInit();
|
|
//void coreInit();
|
|
void setStarSize(double size);
|
|
void setupPalette(double);
|
|
|
|
bool init ( void );
|
|
|
|
bool go();
|
|
bool calculate();
|
|
|
|
void toDefaults();
|
|
void fade();
|
|
void fadeFade();
|
|
void fadePixelWave(int x, int y, int where, int step);
|
|
void fadeWave();
|
|
void fadePixelHeat(int x,int y,int where,int step);
|
|
void fadeHeat();
|
|
|
|
void fft(double*, double*);
|
|
|
|
void addPixel(int x, int y, int br1, int br2);
|
|
void addPixelFast(unsigned char *p, int br1, int br2);
|
|
unsigned char getPixel(int x, int y, int where);
|
|
|
|
static int bitReverser(int);
|
|
|
|
protected:
|
|
void scopeEvent(float *, float *, int) {}
|
|
|
|
public:
|
|
BaseScreen *screen;
|
|
Interface *interface;
|
|
sampleType *data;
|
|
Bitmap<unsigned short> outputBmp, lastOutputBmp, lastLastOutputBmp;
|
|
PolygonEngine<unsigned short,Combiner,2> polygonEngine;
|
|
|
|
double cosTable[NumSamples], negSinTable[NumSamples];
|
|
int bitReverse[NumSamples];
|
|
int scaleDown[256];
|
|
int maxStarRadius;
|
|
|
|
|
|
public:
|
|
int outWidth, outHeight;
|
|
SymbolID fadeMode;
|
|
bool pointsAreDiamonds;
|
|
|
|
double brightnessTwiddler;
|
|
double starSize;
|
|
|
|
double fgRedSlider, fgGreenSlider, bgRedSlider, bgGreenSlider;
|
|
SymbolID state;
|
|
|
|
int windX, windY, windWidth, windHeight;
|
|
};
|
|
|
|
extern Core *core;
|
|
|
|
inline unsigned char Core::getPixel(int x,int y,int where)
|
|
{
|
|
if (x < 0 || y < 0 || x >= outWidth || y >= outHeight) return 0;
|
|
return lastOutput()[where];
|
|
}
|
|
|
|
struct Button;
|
|
|
|
struct UIObject
|
|
{
|
|
int visibleMask, activeMask;
|
|
double x,y,width,height;
|
|
bool active;
|
|
|
|
virtual int go(bool mouseDown,bool mouseClick,bool mouseOver,
|
|
double x, double y, double scale, char &hotKey, int &action)
|
|
= 0;
|
|
|
|
virtual void handleKey(char key, int &action) = 0;
|
|
void changed();
|
|
};
|
|
|
|
class Interface
|
|
{
|
|
public:
|
|
Interface();
|
|
~Interface();
|
|
bool go();
|
|
void syncToState();
|
|
void setupPalette();
|
|
|
|
void putString(char *string,int x,int y,int red,int blue);
|
|
|
|
protected:
|
|
void addUI(UIObject *obj);
|
|
void changeState(int transitionSymbol);
|
|
|
|
private:
|
|
QPtrList<UIObject> uiObjects;
|
|
Button *stateButton, *starsButton, *waveButton, *flameButton, *starButton, *diamondButton;
|
|
int mouseButtons;
|
|
|
|
int visibleMask;
|
|
int mouseX, mouseY, lastX, lastY, countDown;
|
|
|
|
};
|
|
|
|
#endif
|