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.
tdevelop/languages/cpp/app_templates/noatunvisual/plugin_impl.cpp

277 lines
5.8 KiB

#include "plugin_%{APPNAMELC}_impl.h"
#include <string.h>
#include <stdlib.h>
extern "C"
{
#include <SDL.h>
#include <fcntl.h>
#include <unistd.h>
}
#if 0
#define TEST() cout << "At line " << __LINE__ << endl
#else
#define TEST() if(0)
#endif
#define output ((unsigned char*)data)
template <class Type>
inline void Bitmap<Type>::addPixel(int x, int y, int br1, int br2)
{
if (x < 0 || x >= width || y < 0 || y >= height) return;
unsigned char *p = output+x*2+y*width*2;
if (p[0] < 255-br1) p[0] += br1; else p[0] = 255;
if (p[1] < 255-br2) p[1] += br2; else p[1] = 255;
}
template <class Type>
void Bitmap<Type>::addVertLine(int x, int y1, int y2, int br1, int br2)
{
if(y1 < y2)
{
for(int y = y1; y <= y2; y++)
addPixel(x,y, br1, br2);
}
else if(y2 < y1)
{
for(int y = y2; y <= y1; y++)
addPixel(x, y, br1, br2);
}
else
{
addPixel(x, y1, br1, br2);
}
}
template <class Type>
void Bitmap<Type>::fadeStar()
{
unsigned long *ptr = (unsigned long*)output;
int i = width*height*2/4;
do
{
if (*ptr)
*(ptr++) -= ((*ptr & 0xf0f0f0f0ul) >> 4) + ((*ptr & 0xe0e0e0e0ul) >> 5);
else
ptr++;
} while(--i > 0);
}
%{APPNAME}View::%{APPNAME}View(int in) : mFd(in), outputBmp(0), fullscreen(false)
{
surface = 0;
width = 320;
height = width*6/8;
outputBmp.size(width, height);
TEST();
TEST();
fcntl(mFd, F_SETFL, fcntl(mFd, F_GETFL) & ~O_NONBLOCK);
TEST();
float *data = new float[width];
TEST();
startVideo();
setupPalette();
TEST();
while(true)
{
checkInput();
if(!surface) exit(0);
int bytestoread = width * sizeof(float);
int pos = 0;
while(pos < bytestoread)
{
char *d = (char *)data;
int r = read(mFd, d + pos, bytestoread - pos);
if(r > 0) pos += r;
else if (r==0) exit(0);
}
outputBmp.fadeStar();
outputBmp.fadeStar();
float *d = data;
float *end = data + width;
float heightHalf = height / 4.0;
int y = height / 2;
int x=0;
int oldy=(int)(*d * heightHalf);
while(d <= end)
{
int amp = (int)(*d * heightHalf);
amp+=y;
outputBmp.addVertLine(x, oldy, amp, 255, 255);
oldy=amp;
d++;
x++;
}
repaint();
}
}
static 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 %{APPNAME}View::startVideo()
{
if(surface)
{
SDL_FreeSurface(surface);
surface = 0;
}
Uint32 videoflags;
/* Initialize SDL */
if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
exit(0);
SDL_WM_SetCaption("%{APPNAME}","%{APPNAMELC}");
/* See if we try to get a hardware colormap */
videoflags = SDL_SWSURFACE | (fullscreen?SDL_FULLSCREEN:0);
surface = CreateScreen(width, height, 8, videoflags);
if (!surface)
exit(0);
SDL_ShowCursor(0);
if(!surface)
SDL_Quit();
SDL_WM_SetCaption("%{APPNAME}", 0);
SDL_ShowCursor(0);
}
void %{APPNAME}View::setupPalette(double)
{
#define BOUND(x) ((x) > 255 ? 255 : (x))
#define PEAKIFY(x) int(BOUND((x) - (x)*(255-(x))/255/2))
#define MAX(x,y) ((x) > (y) ? (x) : (y))
int redMax=136;
int greenMax=136;
int blueMax=255;
SDL_Color sdlPalette[256];
for(int i=0;i<256;i++)
{
// i
// 255 136
sdlPalette[i].r = i*redMax/255;
sdlPalette[i].g = i*greenMax/255;
sdlPalette[i].b = i*blueMax/255;
}
SDL_SetColors(surface, sdlPalette, 0, 256);
#undef BOUND
#undef PEAKIFY
#undef MAX
}
void %{APPNAME}View::checkInput()
{
SDL_Event myEvent;
while(SDL_PollEvent(&myEvent))
{
switch(myEvent.type)
{
case SDL_KEYDOWN:
switch(myEvent.key.keysym.sym)
{
case SDLK_SPACE:
// fullscreen ^= true;
// startVideo();
break;
default:
break;
}
break;
case SDL_QUIT:
exit(0);
break;
}
}
}
#define output2 ((unsigned char*)outputBmp.data)
void %{APPNAME}View::repaint()
{
SDL_LockSurface(surface);
TEST();
unsigned long *ptr2 = (unsigned long*)output2;
unsigned long *ptr1 = (unsigned long*)( surface->pixels );
int i = width*height/4;
TEST();
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);
TEST();
SDL_UnlockSurface(surface);
SDL_UpdateRect(surface, 0, 0, 0, 0);
TEST();
}
%{APPNAME}View::~%{APPNAME}View()
{
::close(mFd);
}