Files
tlib/oversampling/WDL/lice/test/main.cpp
2024-05-24 13:28:31 +02:00

1138 lines
34 KiB
C++

/*
Cockos WDL - LICE - Lightweight Image Compositing Engine
Copyright (C) 2007 and later, Cockos Incorporated
File: main.cpp (example use of LICE)
See lice.h for license and other information
*/
#ifndef WDL_NO_DEFINE_MINMAX
#define WDL_NO_DEFINE_MINMAX
#endif
#include "../lice.h"
#include "../../plush2/plush.h"
#include "../../MersenneTwister.h"
#include <math.h>
#include <stdio.h>
#ifndef _WIN32
#include <sys/time.h>
#include "../../swell/swell.h"
#endif
static double gettm()
{
#ifndef _WIN32
struct timeval tm={0,};
gettimeofday(&tm,NULL);
return (double)tm.tv_sec + (double)tm.tv_usec/1000000;
#else
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
return (double)now.QuadPart / (double)freq.QuadPart;
#endif
}
char g_status[1024];
#include "../lice_text.h"
#include "../lice_glbitmap.h"
//#define GLEW_STATIC
//#include "../glew/include/gl/glew.h"
//#include "../glew/include/gl/wglew.h"
//uncomment this to enable the ffmpeg video output in test 1
//#define FFMPEG_TEST
//#define TIMING
#include "../../timing.c"
#ifdef FFMPEG_TEST
//ffmpeg encoding test
#include "../../ffmpeg.h"
#pragma comment(lib, "../../../sdks/ffmpeg/lib/avcodec.lib")
#pragma comment(lib, "../../../sdks/ffmpeg/lib/avformat.lib")
#pragma comment(lib, "../../../sdks/ffmpeg/lib/avutil.lib")
#pragma comment(lib, "../../../sdks/ffmpeg/lib/swscale.lib")
static WDL_VideoEncode *m_encoder;
static WDL_VideoDecode *m_decoder;
#endif
#include "resource.h"
#define NUM_EFFECTS 25
const char *effect_names[NUM_EFFECTS] =
{
"Rotated + Scaled blit",
"Simple alpha blit",
"Rotated blit",
"Scaled blit",
"GradRect",
"Marble generator",
"Wood generator",
"Noise generator",
"Circular noise generator",
"GradRect + text + rotated blit",
"PutPixel",
"Line",
"DrawText",
"Icon loading",
"Circles, Arc",
"Rotated + Multiply add blit",
"Transform blit",
"Plush 3D",
"3D Fly (use mouse)",
"SVG loading (C:\\test.svg)",
"GL acceleration (disabled)",
"Bezier curves",
"Convex polygon fill",
"Palette generator (C:\\test.png)",
"Triangle test",
};
HINSTANCE g_hInstance;
LICE_IBitmap *jpg;
LICE_IBitmap *bmp;
LICE_IBitmap *icon;
LICE_IBitmap *framebuffer;
static int m_effect = 11;
static int m_doeff = 0;
static LICE_IBitmap* tmpbmp = 0;
static DWORD m_start_time, m_frame_cnt;
bool m_cap;
static void DoPaint(HWND hwndDlg, HDC dc)
{
RECT r;
GetClientRect(hwndDlg, &r);
#ifdef _WIN32
r.top+=40;
if (r.top >= r.bottom) r.top=r.bottom-1;
#endif
if (framebuffer->resize(r.right-r.left,r.bottom-r.top))
{
m_doeff=1;
// memset(framebuffer->getBits(),0,framebuffer->getWidth()*framebuffer->getHeight()*4);
}
int x=rand()%(r.right+300)-150;
int y=rand()%(r.bottom+300)-150;
static int frame_cnt;
static int s_preveff = -1;
if (m_effect != s_preveff)
{
frame_cnt=0;
s_preveff = m_effect;
LICE_Clear(framebuffer, 0);
}
static MTRand s_rng;
double t2=gettm();
switch(m_effect)
{
case 23:
{
const int palnumcols=256;
static int init=0;
static LICE_IBitmap* srcbmp=0;
static LICE_IBitmap* palbmp=0;
static LICE_pixel palette[palnumcols] = { 0 };
if (!init)
{
init=-1;
srcbmp = LICE_LoadPNG("C:\\test.png");
if (srcbmp)
{
int n = LICE_BuildPalette(srcbmp, palette, palnumcols);
palbmp = new LICE_MemBitmap;
LICE_Copy(palbmp, srcbmp);
void LICE_TestPalette(LICE_IBitmap*, LICE_pixel*, int);
LICE_TestPalette(palbmp, palette, n);
init=1;
}
}
if (init > 0)
{
static int lastw=0;
static int lasth=0;
if (lastw != framebuffer->getWidth() || lasth != framebuffer->getHeight())
{
lastw = framebuffer->getWidth();
lasth = framebuffer->getHeight();
int y = framebuffer->getHeight()*3/4;
LICE_ScaledBlit(framebuffer, srcbmp, 0, 0, lastw/2, y, 0, 0, srcbmp->getWidth(), srcbmp->getHeight(), 1.0f, LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR);
LICE_ScaledBlit(framebuffer, palbmp, lastw/2, 0, lastw/2, y, 0, 0, palbmp->getWidth(), palbmp->getHeight(), 1.0f, LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR);
int dy = (lasth-y)/4;
int dx = lastw/(palnumcols/4);
int i, j, k=0;
for (i = 0; i < 4; ++i)
{
for (j = 0; j < palnumcols/4; ++j)
{
LICE_FillRect(framebuffer, j*dx, y+i*dy, dx, dy, palette[k++], 1.0f, LICE_BLIT_MODE_COPY);
}
}
}
}
}
break;
case 24:
{
LICE_MemBitmap bm(128,128);
LICE_Clear(framebuffer,0);
LICE_Clear(&bm,0);
static POINT sp;
POINT p;
if (!sp.x&&!sp.y) GetCursorPos(&sp);
GetCursorPos(&p);
p.x-=sp.x;
p.y-=sp.y;
int th=p.y+16;
bool flip = th < 0;
if (flip) th=-th;
int tw=p.x+16;
int cx=(tw+1)/2;
int x=1,y=1;
LICE_pixel lc=LICE_RGBA(255,0,255,255);
LICE_Line(&bm,x,y,x+tw,y,lc,1.0f,LICE_BLIT_MODE_COPY);
LICE_Line(&bm,x,y+th,x+tw,y+th,lc,1.0f,LICE_BLIT_MODE_COPY);
LICE_Line(&bm,x+tw,y,x+tw,y+th,lc,1.0f,LICE_BLIT_MODE_COPY);
LICE_Line(&bm,x,y,x,y+th,lc,1.0f,LICE_BLIT_MODE_COPY);
LICE_FillTriangle(&bm,x+tw,y+(flip?th:0)/*+th/4*/,x+cx,y+(flip?0:th),x,y+(flip?th:0),LICE_RGBA(255,255,255,255),0.75f,LICE_BLIT_MODE_COPY);
int sc=16;
LICE_ScaledBlit(framebuffer,&bm,0,0,bm.getWidth()*sc,bm.getHeight()*sc,0,0,bm.getWidth(),bm.getHeight(),1.0,LICE_BLIT_MODE_COPY);
for (y=0;y<bm.getHeight();y++)
LICE_Line(framebuffer,0,y*sc,bm.getWidth()*sc,y*sc,LICE_RGBA(255,255,255,255),0.5,LICE_BLIT_MODE_COPY,false);
for (x=0;x<bm.getWidth();x++)
LICE_Line(framebuffer,x*sc,0,x*sc,bm.getHeight()*sc,LICE_RGBA(255,255,255,255),0.5,LICE_BLIT_MODE_COPY,false);
}
break;
case 22:
{
static int x[16], y[16];
int i;
int w = framebuffer->getWidth();
int h = framebuffer->getHeight();
static bool init = false;
if (!init)
{
init = true;
for (i = 0; i < 16; ++i)
{
x[i] = s_rng.randInt(w-1);
y[i] = s_rng.randInt(h-1);
}
}
for (i = 0; i < 16; ++i)
{
x[i] += s_rng.randNorm(0.0, 1.0)+0.5;
y[i] += s_rng.randNorm(0.0, 1.0)+0.5;
if (x[i] < 0) x[i] = 0;
else if (x[i] >= w) x[i] = w-1;
if (y[i] < 0) y[i] = 0;
else if (y[i] >= h) y[i] = h-1;
}
LICE_Clear(framebuffer, 0);
LICE_FillConvexPolygon(framebuffer, x, y, 16, LICE_RGBA(96,96,96,255), 0.5f, LICE_BLIT_MODE_ADD);
for (i = 0; i < 16; ++i)
{
LICE_Line(framebuffer, x[i]-1, y[i], x[i]+1, y[i], LICE_RGBA(255,0,0,255), 1.0f, LICE_BLIT_MODE_COPY);
LICE_Line(framebuffer, x[i], y[i]-1, x[i], y[i]+1, LICE_RGBA(255,0,0,255), 1.0f, LICE_BLIT_MODE_COPY);
}
}
break;
case 21:
{
int w = framebuffer->getWidth();
int h = framebuffer->getHeight();
int x0, y0, x1, y1, x2, y2, x3, y3;
bool aa = true;
float maxsegmentpx = 0.0f;
x0 = w*(double)rand()/RAND_MAX;
y0 = h*(double)rand()/RAND_MAX;
x1 = w*(double)rand()/RAND_MAX;
y1 = h*(double)rand()/RAND_MAX;
x2 = w*(double)rand()/RAND_MAX;
y2 = h*(double)rand()/RAND_MAX;
LICE_DrawQBezier(framebuffer, x0, y0, x1, y1, x2, y2, LICE_RGBA(255,0,0,255), 1.0f, LICE_BLIT_MODE_COPY, aa, maxsegmentpx);
x0 = w*(double)rand()/RAND_MAX;
y0 = h*(double)rand()/RAND_MAX;
x1 = w*(double)rand()/RAND_MAX;
y1 = h*(double)rand()/RAND_MAX;
x2 = w*(double)rand()/RAND_MAX;
y2 = h*(double)rand()/RAND_MAX;
x3 = w*(double)rand()/RAND_MAX;
y3 = h*(double)rand()/RAND_MAX;
LICE_DrawCBezier(framebuffer, x0, y0, x1, y1, x2, y2, x3, y3, LICE_RGBA(0,255,0,255), 1.0f, LICE_BLIT_MODE_COPY, aa, maxsegmentpx);
}
break;
#ifndef DISABLE_LICE_EXTENSIONS
case 20: // GL acceleration
{
int w = framebuffer->getWidth();
int h = framebuffer->getHeight();
int x, y, tw, th;
static LICE_IBitmap* glbmp = 0;
if (!glbmp)
{
glbmp = new LICE_GL_SysBitmap(0, 0);
glbmp->resize(w, h);
glbmp = new LICE_GL_SubBitmap(glbmp, 20, 80, 50, 20);
framebuffer = glbmp;
}
if (!tmpbmp)
{
tmpbmp = new LICE_GL_MemBitmap(0, 0);
tmpbmp->resize(20, 20);
//tmpbmp = new LICE_MemBitmap(20, 20);
}
LICE_Clear(tmpbmp, LICE_RGBA(255,0,0,255));
LICE_Line(tmpbmp, 0, 0, 20, 20, LICE_RGBA(255,255,255,255), 1.0f, LICE_BLIT_MODE_COPY, true);
static int _n = 0;
//if (_n < 3)
{
//LICE_Clear(glbmp, LICE_RGBA(0,0,0,0));
x = w*rand()/RAND_MAX;
y = h*rand()/RAND_MAX;
LICE_Blit(glbmp, tmpbmp, x, y, 0, 0, 20, 20, 1.0f, LICE_BLIT_MODE_COPY); // blit one GL bitmap to another
x = w*rand()/RAND_MAX;
y = h*rand()/RAND_MAX;
LICE_ScaledBlit(glbmp, tmpbmp, x, y, 40, 40, 0, 0, 20, 20, 1.0f, LICE_BLIT_MODE_COPY); // blit one GL bitmap to another
x = w*rand()/RAND_MAX;
y = h*rand()/RAND_MAX;
tw = (w-x)*rand()/RAND_MAX;
th = (h-y)*rand()/RAND_MAX;
int color = (_n%2 ? LICE_RGBA(63,63,63,255) : LICE_RGBA(0,0,0,255));
LICE_FillRect(glbmp, x, y, tw, th, color, 1.0f, LICE_BLIT_MODE_COPY);
x = w*rand()/RAND_MAX;
y = h*rand()/RAND_MAX;
tw = (w-x)*rand()/RAND_MAX;
th = (h-y)*rand()/RAND_MAX;
LICE_Line(glbmp, x, y, x+tw, y+th, LICE_RGBA(255,0,0,255), 1.0f, LICE_BLIT_MODE_COPY, true);
int x0 = w*rand()/RAND_MAX;
int y0 = h*rand()/RAND_MAX;
int x1 = w*rand()/RAND_MAX;
int y1 = h*rand()/RAND_MAX;
int x2 = w*rand()/RAND_MAX;
int y2 = h*rand()/RAND_MAX;
int x3 = w*rand()/RAND_MAX;
int y3 = h*rand()/RAND_MAX;
LICE_DrawCBezier(glbmp, x0, y0, x1, y1, x2, y2, x3, y3, LICE_RGBA(0,255,0,255), 1.0f, LICE_BLIT_MODE_COPY, true);
#define A(x) ((LICE_pixel_chan)((x)*255.0+0.5))
LICE_pixel_chan alphas[81] =
{
A(0.00), A(0.12), A(0.69), A(1.00), A(1.00), A(1.00), A(0.69), A(0.12), A(0.00),
A(0.12), A(0.94), A(0.82), A(0.31), A(0.25), A(0.31), A(0.82), A(0.94), A(0.12),
A(0.69), A(0.82), A(0.06), A(0.00), A(0.00), A(0.00), A(0.06), A(0.82), A(0.69),
A(1.00), A(0.31), A(0.00), A(0.00), A(0.00), A(0.00), A(0.00), A(0.31), A(1.00),
A(1.00), A(0.19), A(0.00), A(0.00), A(0.00), A(0.00), A(0.00), A(0.19), A(1.00),
A(1.00), A(0.31), A(0.00), A(0.00), A(0.00), A(0.00), A(0.00), A(0.31), A(1.00),
A(0.69), A(0.82), A(0.06), A(0.00), A(0.00), A(0.00), A(0.06), A(0.82), A(0.69),
A(0.12), A(0.94), A(0.82), A(0.31), A(0.25), A(0.31), A(0.82), A(0.94), A(0.12),
A(0.00), A(0.12), A(0.69), A(1.00), A(1.00), A(1.00), A(0.69), A(0.12), A(0.00)
};
int gw = 9;
int gh = 9;
x = w*rand()/RAND_MAX;
y = h*rand()/RAND_MAX;
LICE_DrawGlyph(glbmp, x, y, LICE_RGBA(255,255,0,255), alphas, gw, gh, 1.0f, LICE_BLIT_MODE_COPY);
static LICE_CachedFont* font = 0;
if (!font)
{
font = new LICE_CachedFont;
LOGFONT lf={ 12, 0, 0, 0, FW_LIGHT, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial"};
HFONT hf = CreateFontIndirect(&lf);
font->SetFromHFont(hf, 0);
font->SetTextColor(LICE_RGBA(255,255,0,255));
}
x = w*rand()/RAND_MAX;
y = h*rand()/RAND_MAX;
RECT r = { x, y, x+40, y+10 };
font->DrawText(glbmp, "foo bar", -1, &r, 0);
}
++_n;
}
break;
#endif
case 18:
{
void doFlyEffect(LICE_IBitmap *fb,HWND);
doFlyEffect(framebuffer,m_cap ? hwndDlg : NULL);
}
break;
case 17:
{
static pl_Obj *obj=NULL,*obj2=NULL;
static LICE_IBitmap *framebuffer2;
if (!framebuffer2) framebuffer2=new LICE_MemBitmap;
LICE_Copy(framebuffer2,framebuffer);
if (!obj)
{
pl_Mat *mat = new pl_Mat;
pl_Mat *mat2 = new pl_Mat;
mat2->Smoothing=false;
mat2->Ambient[0]=mat2->Ambient[1]=mat2->Ambient[2]=0.0;
mat2->Diffuse[0]=mat2->Diffuse[1]=0.6;
mat2->Diffuse[2]=1.0;
mat->Ambient[0]=mat->Ambient[1]=mat->Ambient[2]=0.0;
mat->Diffuse[0]=mat->Diffuse[1]=1.9;
mat->Diffuse[2]=0.4;
mat->PerspectiveCorrect=16;
mat->SolidCombineMode=LICE_BLIT_MODE_COPY;
mat->SolidOpacity=1.0;
mat->Smoothing=true;
mat->Lightable=true;
//mat->FadeDist = 300.0;
mat2->Texture=bmp;
mat2->TexOpacity=0.5;
mat2->TexCombineMode=LICE_BLIT_MODE_MUL|LICE_BLIT_FILTER_BILINEAR;
mat2->SolidOpacity=0.4;
mat2->BackfaceCull=false;
mat2->BackfaceIllumination=1.0;
mat2->Texture2=framebuffer2;
mat2->Tex2MapIdx=-1;
mat2->Tex2Opacity=0.75;
mat->Texture=bmp;
LICE_TexGen_Marble(mat->Texture = new LICE_MemBitmap(r.right,r.bottom),NULL,0.3,0.4,0.0,1.0f);
mat->TexOpacity=0.5;
mat->TexScaling[0]=mat->TexScaling[1]=3.0;
mat->TexCombineMode=LICE_BLIT_MODE_MUL|LICE_BLIT_FILTER_BILINEAR;
LICE_TexGen_Noise(mat->Texture2 = new LICE_MemBitmap(r.right,r.bottom),NULL,0.3,0.4,0.0,1.0f);
// mat->Texture2=icon;
mat->Tex2MapIdx=-1;
mat->Tex2CombineMode=LICE_BLIT_MODE_ADD|LICE_BLIT_FILTER_BILINEAR;
mat->Tex2Opacity=0.8;
mat->Tex2Scaling[0]=2.0;
mat->Tex2Scaling[1]=-2.0;
mat->BackfaceCull=true;
mat->BackfaceIllumination=0.0;
obj=plMakeTorus(100.0,80.0,40,40,mat);
int x;
if (0)for(x=1;x<3;x++)
{
pl_Obj *no = obj->Clone();
no->Translate(0,40.0,-x*35.0);
obj->Children.Add(no);
no->Xa += 50.35*x;
no->Ya -= 30.13*x;
}
obj2=plMakeSphere(58,20,20,mat2);
obj2->Zp -= 30.0;
obj->Zp += 30.0;
/*pl_Obj *o = plRead3DSObj("c:\\temp\\suzanne.3ds",mat);
if (o)
{
o->Scale(30.0);
o->Translate(150.0,0,0);
obj->Children.Add(o);
}
*/
}
obj2->Xa+=0.3;
obj2->Ya+=-0.1;
obj->Ya+=0.1;
obj->Xa+=0.1;
obj->Za+=0.1;
obj->GenMatrix=true;
if (1) LICE_Clear(framebuffer,0);
else {
double a=GetTickCount()/1000.0;
double scale=(1.1+sin(a)*0.3);
LICE_RotatedBlit(framebuffer,framebuffer,0,0,r.right,r.bottom,0+sin(a*0.3)*16.0,0+sin(a*0.21)*16.0,r.right,r.bottom,cos(a*0.5)*0.13,false,254/255.0,LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR);
}
static pl_Cam cam;
LICE_SubBitmap tmpbm(framebuffer,10,10,framebuffer->getWidth()-20,framebuffer->getHeight()-20);
//cam.CenterX = (tmpbm.getWidth()/2+80);
//cam.CenterY = (tmpbm.getHeight()/2+80);
cam.AspectRatio = 1.0;//cam.frameBuffer->getWidth()* 3.0/4.0 / (double)cam.frameBuffer->getHeight();
cam.X = cam.Y = 0.0;
cam.Z = -200.0;
cam.WantZBuffer=true;
cam.SetTarget(0,0,0);
static pl_Light light;
light.Set(PL_LIGHT_POINT,500.0,0,-900.0,1.3f,0.5f,0.5f,1000.0);
static pl_Light light2;
light2.Set(PL_LIGHT_POINT,-500.0,0,-700.0,0.0f,1.0f,0.5f,1000.0);
cam.ClipBack=220.0;
cam.Begin(&tmpbm);
cam.RenderLight(&light);
cam.RenderLight(&light2);
cam.RenderObject(obj);
cam.SortToCurrent();
cam.RenderObject(obj2);
cam.End();
char buf[512];
sprintf(buf,"tri: %d->%d->%d, pix=%.0f",
cam.RenderTrisIn,
cam.RenderTrisCulled,
cam.RenderTrisOut,cam.RenderPixelsOut);
LICE_DrawText(framebuffer,0,10,buf,LICE_RGBA(255,255,255,255),1.0f,0);
}
break;
case 15:
case 0:
{
double a=.51;//GetTickCount()/1000.0;
double scale=(1.1+sin(a)*0.3);
if (0) // weirdness
{
LICE_RotatedBlit(framebuffer,framebuffer,0,0,r.right,r.bottom,0+sin(a*0.3)*16.0,0+sin(a*0.21)*16.0,r.right,r.bottom,cos(a*0.5)*0.13,false,254/255.0,LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR);
}
else // artifact-free mode
{
LICE_MemBitmap framebuffer_back;
LICE_Copy(&framebuffer_back,framebuffer);
LICE_RotatedBlit(framebuffer,&framebuffer_back,0,0,r.right,r.bottom,0+sin(a*0.3)*16.0,0+sin(a*0.21)*16.0,r.right,r.bottom,cos(a*0.5)*0.13,false,1.0,LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR);
timingEnter(0);
LICE_ScaledBlit(framebuffer,&framebuffer_back,0,0,r.right,r.bottom,-200,-200,3000,3000,0.1,LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR);
timingLeave(0);
timingEnter(1);
LICE_ScaledBlit(framebuffer,&framebuffer_back,0,0,r.right,r.bottom,0,0,r.right/2,r.bottom/2,0.1,LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR);
timingLeave(1);
}
//LICE_Clear(framebuffer,0);
if (bmp) LICE_RotatedBlit(framebuffer,bmp,r.right*scale,r.bottom*scale,r.right*(1.0-scale*2.0),r.bottom*(1.0-scale*2.0),0,0,bmp->getWidth(),bmp->getHeight(),cos(a*0.3)*13.0,false,0.3,LICE_BLIT_MODE_ADD|LICE_BLIT_USE_ALPHA|LICE_BLIT_FILTER_BILINEAR);
if (m_effect==15)
{
LICE_MultiplyAddRect(framebuffer,0,0,framebuffer->getWidth(),framebuffer->getHeight(),0.9,0.9,-0.3,1,
3,2,200,0);
}
#ifdef FFMPEG_TEST
#if 0
//ffmpeg encoding test
if(!m_encoder) m_encoder = new WDL_VideoEncode("flv", framebuffer->getWidth(),framebuffer->getHeight(), 25, 1256, NULL, 44100, 1, 128);
if(m_encoder->isInited())
{
//set the alpha bit to 0xff
//LICE_FillRect(framebuffer, 0, 0, framebuffer->getWidth(), framebuffer->getHeight(), LICE_RGBA(0,0,0,255), 1.0f, LICE_BLIT_MODE_ADD);
m_encoder->encodeVideo(framebuffer->getBits());
static short audiodata[2000]={0,};
static int initaudio=0;
if(!initaudio)
{
float t = 0;
for(int j=0;j<2000;j++)
{
audiodata[j] = (int)(sin(t) * 10000);
t += 2 * M_PI * 440.0 / 44100;
}
initaudio = 1;
}
m_encoder->encodeAudio(audiodata, 44100/25);
static WDL_HeapBuf h;
h.Resize(256*1024);
unsigned char *p = (unsigned char *)h.Get();
int s = m_encoder->getBytes(p, 256*1024);
if(s)
{
FILE *fh = fopen("c:\\temp\\out.flv", "ab");
fwrite(p, s, 1, fh);
fclose(fh);
}
}
#else
//ffmpeg decoding test
if(!m_decoder) m_decoder = new WDL_VideoDecode("c:\\test.avi");
if(m_decoder->isInited())
{
static LICE_IBitmap *m_tmpframe;
static double t = 0;
if(!m_tmpframe)
{
m_tmpframe = new LICE_MemBitmap(framebuffer->getWidth(), framebuffer->getHeight());
}
m_decoder->GetVideoFrameAtTime(m_tmpframe, t, NULL, &t, true);
t+=0.0001;
LICE_Blit(framebuffer, m_tmpframe, 0, 0, 0, 0, m_tmpframe->getWidth(), m_tmpframe->getHeight(), 1.0f, 0);
}
#endif
#endif
}
break;
case 1:
if (rand()%6==0)
LICE_Blit(framebuffer,bmp,x,y,NULL,-1.4,LICE_BLIT_MODE_ADD|LICE_BLIT_USE_ALPHA);
else
LICE_Blit(framebuffer,bmp,x,y,NULL,0.6,LICE_BLIT_MODE_COPY|LICE_BLIT_USE_ALPHA);
break;
case 2:
{
LICE_Clear(framebuffer,0);
double a=GetTickCount()/1000.0;
double scale=(1.1+sin(a)*0.3);
if (bmp) LICE_RotatedBlit(framebuffer,bmp,r.right*scale,r.bottom*scale,r.right*(1.0-scale*2.0),r.bottom*(1.0-scale*2.0),0,0,bmp->getWidth(),bmp->getHeight(),cos(a*0.3)*13.0,false,1.0,LICE_BLIT_MODE_ADD|LICE_BLIT_USE_ALPHA|LICE_BLIT_FILTER_BILINEAR,0.0,-bmp->getHeight()/2);
}
break;
case 3:
{
LICE_Clear(framebuffer,LICE_RGBA(128,128,128,128));
static double a;
a+=0.003;
int xsize=sin(a*1.1)*r.right*10.5;
int ysize=sin(a*1.7)*r.bottom*10.5;
int xp = sin(a*0.3+1515851)*r.right*0.5;
int yp = sin(a*0.3+15853)*r.bottom*0.5;
if (bmp)
{
// if (rand()%3==0)
// LICE_ScaledBlit(framebuffer,bmp,r.right/2-xsize/2,r.bottom/2-ysize/2,xsize,ysize,0.0,0.0,bmp->getWidth(),bmp->getHeight(),-0.7,LICE_BLIT_USE_ALPHA|LICE_BLIT_MODE_ADD|LICE_BLIT_FILTER_BILINEAR);
/// else
LICE_ScaledBlit(framebuffer,bmp,xp + r.right/2-xsize/2,yp + r.bottom/2-ysize/2,xsize,ysize,-300,-300,600+bmp->getWidth(),600+bmp->getHeight(),1,LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR);
}
}
break;
case 4:
case 9:
{
static double a;
a+=0.003;
LICE_GradRect(framebuffer,0,0,framebuffer->getWidth(),framebuffer->getHeight(),
0.5*sin(a*14.0),0.5*cos(a*2.0+1.3),0.5*sin(a*4.0),1.0,
(cos(a*37.0))/framebuffer->getWidth()*0.5,(sin(a*17.0))/framebuffer->getWidth()*0.5,(cos(a*7.0))/framebuffer->getWidth()*0.5,0,
(sin(a*12.0))/framebuffer->getHeight()*0.5,(cos(a*4.0))/framebuffer->getHeight()*0.5,(cos(a*3.0))/framebuffer->getHeight()*0.5,0,
LICE_BLIT_MODE_COPY);
if (m_effect==9)
{
/* LOGFONT lf={
140,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,
"Times New Roman"
};
HFONT font=CreateFontIndirect(&lf);
*/
LICE_SysBitmap bm(60,60);
LICE_Clear(&bm,LICE_RGBA(0,0,0,0));
SetTextColor(bm.getDC(),RGB(255,255,255));
SetBkMode(bm.getDC(),TRANSPARENT);
// HGDIOBJ of=SelectObject(bm.getDC(),font);
RECT r={0,0,bm.getWidth(),bm.getHeight()};
DrawText(bm.getDC(),"LICE",-1,&r,DT_LEFT|DT_TOP|DT_SINGLELINE);
// SelectObject(bm.getDC(),of);
// DeleteObject(font);
LICE_Blit(&bm,&bm,0,0,NULL,1.0,LICE_BLIT_MODE_CHANCOPY|LICE_PIXEL_R|(LICE_PIXEL_A<<2));
int bmw=bm.getWidth();
int bmh=bm.getHeight();
LICE_FillRect(framebuffer,framebuffer->getWidth()/2,framebuffer->getHeight()/2,bmh,bmw,0,0.5,LICE_BLIT_MODE_COPY);
LICE_RotatedBlit(framebuffer,&bm,
framebuffer->getWidth()/2,framebuffer->getHeight()/2,
bmh,bmw,0,0,bmw,bmh,
3.14159*0.5,false,.4,LICE_BLIT_MODE_COPY|LICE_BLIT_USE_ALPHA|LICE_BLIT_FILTER_BILINEAR,-bm.getWidth()/4,-bm.getHeight()/4);
}
break;
}
case 5:
if(m_doeff)
{
LICE_TexGen_Marble(framebuffer, NULL, 1, 1, 1, 1);
}
break;
case 6:
if(m_doeff)
{
LICE_TexGen_Noise(framebuffer, NULL, 0.9, 0.3, 0.6, 6.0f, NOISE_MODE_WOOD, 2);
}
break;
case 7:
if(m_doeff)
{
LICE_TexGen_Noise(framebuffer, NULL, 1,1,1, 8.0f, NOISE_MODE_NORMAL, 8);
}
break;
case 8:
if(m_doeff)
{
LICE_TexGen_CircNoise(framebuffer, NULL, 0.5f,0.5f,0.5f, 12.0f, 0.1f, 32);
}
break;
case 10:
{
int x;
static double a;
double sc=sin(a)*0.24;
a+=0.03;
for (x = 0; x < 10000; x ++)
LICE_PutPixel(framebuffer,rand()%framebuffer->getWidth(),rand()%framebuffer->getHeight(),LICE_RGBA(255,255,255,255),sc,LICE_BLIT_MODE_ADD);
}
break;
case 11:
//line test
{
LICE_pixel goodCol=LICE_RGBA(192,0,192,64);
LICE_Clear(framebuffer,goodCol);
int subx=30,suby=30,subw=framebuffer->getWidth()-60,subh=framebuffer->getHeight()-60;
LICE_SubBitmap bm(framebuffer,subx,suby,subw,subh);
LICE_Clear(&bm,LICE_RGBA(80,80,80,255));
int n;
int w = framebuffer->getWidth(), h = framebuffer->getHeight();
for(n=0;n<1000;n++)
{
LICE_FLine(&bm, rand()%(w*3/2)-w/4, rand()%(h*3/2)-h/4, rand()%(w*3/2)-w/4, rand()%(h*3/2)-h/4, LICE_RGBA(rand()%255,rand()%255,rand()%255,255));
}
int y;
if (0) for(y=0;y<h;y++)
{
int x;
for(x=0;x<w;x++)
{
if (x<subx||y<suby||x>=subx+subw||y>=suby+subh)
{
if (LICE_GetPixel(framebuffer,x,y)!=goodCol)
{
LICE_Clear(framebuffer,LICE_RGBA(255,255,255,255));
y=h;
break;
}
}
}
}
// LICE_Line(framebuffer, rand()%(w*3/2)-w/4, rand()%(h*3/2)-h/4, rand()%(w*3/2)-w/4, rand()%(h*3/2)-h/4, LICE_RGBA(rand()%255,rand()%255,rand()%255,255));
}
break;
case 12:
//lice draw text test
{
static double a;
a+=0.001;
LICE_DrawText(framebuffer,0.5*(1+sin(a))*(framebuffer->getWidth()-30),0.5*(1+sin(a*7.0+1.3))*(framebuffer->getHeight()-16),"LICE RULEZ",LICE_RGBA(255,0,0,0),sin(a*0.7),LICE_BLIT_MODE_ADD);
}
break;
case 13:
//icon loading test
{
LICE_Clear(framebuffer, LICE_RGBA(255,255,255,255));
LICE_Blit(framebuffer,icon,0,0,NULL,1.0f,LICE_BLIT_MODE_COPY|LICE_BLIT_USE_ALPHA);
}
break;
case 14:
// circles/arcs
{
int w = framebuffer->getWidth(), h = framebuffer->getHeight();
const double _PI = acos(-1.0);
static int m_init, m_x, m_y;
if (!m_init) {
m_init = true;
m_x = w/2; m_y = h/2;
}
int r = rand()%w;
float alpha = 1.0f; //(float) r / (float) w;
float aLo = 2*_PI*rand()/RAND_MAX;
float aHi = 2*_PI*rand()/RAND_MAX;
//LICE_Clear(framebuffer, LICE_RGBA(0,0,0,0));
LICE_Arc(framebuffer, m_x, m_y, r, aLo, aHi, LICE_RGBA(rand()%255,rand()%255,rand()%255,255),alpha);
//LICE_Circle(framebuffer, m_x, m_y, r, LICE_RGBA(rand()%255,rand()%255,rand()%255,255));
}
break;
case 16:
{
int sw=framebuffer->getWidth();
int sh=framebuffer->getHeight();
LICE_MemBitmap framebuffer_back;
{
static double a;
a+=0.003;
static int turd;
if ((turd++&511) < 12)
LICE_GradRect(framebuffer,sw/4,sh/4,sw/2,sh/2,
0.5*sin(a*14.0),0.5*cos(a*2.0+1.3),0.5*sin(a*4.0),0.1,
(cos(a*37.0))/framebuffer->getWidth()*0.5,(sin(a*17.0))/framebuffer->getWidth()*0.5,(cos(a*7.0))/framebuffer->getWidth()*0.5,0,
(sin(a*12.0))/framebuffer->getHeight()*0.5,(cos(a*4.0))/framebuffer->getHeight()*0.5,(cos(a*3.0))/framebuffer->getHeight()*0.5,0,
LICE_BLIT_MODE_ADD);
}
//LICE_TexGen_Marble(framebuffer, NULL, 1, 1, 1, 1);
LICE_Copy(&framebuffer_back,framebuffer);
const int divw=10;
const int divh=5;
float pts[2*divw*divh];
static float angs[2*divw*divh];
static float dangs[2*divw*divh];
static int turd;
if (!turd)
{
turd++;
int a;
for (a = 0; a < 2*divw*divh; a ++)
{
dangs[a]=((rand()%1000)-500)*0.0001;
angs[a]=((rand()%1000)-500)*0.1;
}
}
int x,y;
for (y=0;y<divh; y++)
{
for (x=0;x<divw; x ++)
{
int idx=(y*divw+x)*2;
float ang=angs[idx]+=dangs[idx];
float ang2=angs[idx+1]+=dangs[idx+1];
pts[idx]=sw*(float)x/(float)(divw-1) + (cos(ang))*sw*0.01;
pts[idx+1]=sh*(float)y/(float)(divh-1) + (sin(ang2))*sh*0.01;
}
}
LICE_TransformBlit(framebuffer,&framebuffer_back,0,0,framebuffer->getWidth(),
framebuffer->getHeight(),pts,divw,divh,0.8,LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR);
}
break;
case 19:
//SVG loading
break;
}
if(jpg)
{
LICE_ScaledBlit(framebuffer,jpg,0,0,framebuffer->getWidth(),framebuffer->getHeight(),0,0,jpg->getWidth(),jpg->getHeight(),0.5,LICE_BLIT_MODE_COPY);
}
t2 = gettm()-t2;
m_frame_cnt++;
double sec=(GetTickCount()-m_start_time)*0.001;
//if (sec>0.0001)
if (g_status[0])
{
LICE_DrawText(framebuffer,1,1,g_status,LICE_RGBA(0,0,0,0),1,LICE_BLIT_MODE_COPY);
LICE_DrawText(framebuffer,0,0,g_status,LICE_RGBA(255,255,255,0),1,LICE_BLIT_MODE_COPY);
}
m_doeff = 0;
double t1=gettm();
BitBlt(dc,r.left,r.top,framebuffer->getWidth(),framebuffer->getHeight(),framebuffer->getDC(),0,0,SRCCOPY);
// bmp->blitToDC(dc, NULL, 0, 0);
t1 = gettm()-t1;
static double ac,stt,ac2;
if (!frame_cnt++)
{
ac=ac2=0;
stt=gettm();
}
ac+=t1;
ac2+=t2;
sprintf(g_status,"blit = %f/%f, %f/%f %dx%d @ %ffps\n",t1,t2,ac/frame_cnt,ac2/frame_cnt,framebuffer->getWidth(),framebuffer->getHeight(),frame_cnt/(gettm()-stt));
#if 0
if (GetAsyncKeyState(VK_SHIFT)&0x8000)
if (GetAsyncKeyState(VK_MENU)&0x8000)
if (GetAsyncKeyState(VK_CONTROL)&0x8000)
{
LICE_WritePNG("/tmp/blah.png",framebuffer,false);
LICE_WriteJPG("/tmp/blah.jpg",framebuffer);
}
#endif
}
// this is only used on OS X since it's way faster there
LRESULT WINAPI testRenderDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg==WM_PAINT)
{
PAINTSTRUCT ps;
HDC dc = BeginPaint(hwndDlg, &ps);
DoPaint(hwndDlg,dc);
EndPaint(hwndDlg, &ps);
return 0;
}
if (uMsg == WM_LBUTTONDOWN)
{
m_cap=true;
SetCapture(hwndDlg);
ShowCursor(FALSE);
}
else if (uMsg == WM_LBUTTONUP||uMsg==WM_CAPTURECHANGED)
{
m_cap=false;
ShowCursor(TRUE);
if (uMsg==WM_LBUTTONUP)ReleaseCapture();
}
return DefWindowProc(hwndDlg,uMsg,wParam,lParam);
}
WDL_DLGRET WINAPI dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_LBUTTONDOWN)
{
m_cap=true;
SetCapture(hwndDlg);
ShowCursor(FALSE);
}
else if (uMsg == WM_LBUTTONUP||uMsg==WM_CAPTURECHANGED)
{
m_cap=false;
ShowCursor(TRUE);
if (uMsg==WM_LBUTTONUP)ReleaseCapture();
}
switch(uMsg)
{
case WM_INITDIALOG:
framebuffer = new LICE_SysBitmap(0,0);
//jpg=LICE_LoadJPG("C:/turds.jpg");
#ifdef _WIN32
bmp = LICE_LoadPNGFromResource(g_hInstance, MAKEINTRESOURCE(IDC_PNG1));
icon = LICE_LoadIconFromResource(g_hInstance, MAKEINTRESOURCE(IDI_MAIN), 0);
#else
bmp = LICE_LoadPNGFromNamedResource("image.png");
// uncomment if you want to try GL blits:
// SWELL_SetViewGL(GetDlgItem(hwndDlg,IDC_RECT),true);
SendMessage(hwndDlg,WM_SIZE,0,0);
#endif
SetTimer(hwndDlg,1,1,NULL);
{
int x;
for (x = 0; x < NUM_EFFECTS; x ++)
{
char buf[512];
wsprintf(buf,"Effect %d - %s",x+1,effect_names[x]);
SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_ADDSTRING,0,(LPARAM)buf);
}
SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_SETCURSEL,m_effect,0);
m_start_time=GetTickCount();
m_frame_cnt=0;
}
return 0;
case WM_DESTROY:
delete icon;
delete bmp;
delete framebuffer;
return 0;
#ifdef _WIN32
case WM_TIMER:
InvalidateRect(hwndDlg,NULL,FALSE);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC dc = BeginPaint(hwndDlg, &ps);
DoPaint(hwndDlg,dc);
EndPaint(hwndDlg,&ps);
}
break;
#else
case WM_SIZE:
{
RECT r;
GetClientRect(hwndDlg,&r);
r.top+=40;
SetWindowPos(GetDlgItem(hwndDlg,IDC_RECT),NULL,r.left,r.top,r.right-r.left,r.bottom-r.top,SWP_NOZORDER|SWP_NOACTIVATE);
}
return 0;
case WM_TIMER:
#if 1
InvalidateRect(GetDlgItem(hwndDlg,IDC_RECT),NULL,FALSE);
#else
{
HWND h = GetDlgItem(hwndDlg,IDC_RECT);
HDC dc = GetWindowDC(h);
DoPaint(hwndDlg,dc);
ReleaseDC(h,dc);
SWELL_FlushWindow(h);
}
#endif
return 0;
#endif
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_COMBO1:
m_effect = SendDlgItemMessage(hwndDlg,IDC_COMBO1,CB_GETCURSEL,0,0);
m_doeff=1;
m_start_time=GetTickCount();
m_frame_cnt=0;
break;
case IDCANCEL:
#ifndef __APPLE__
EndDialog(hwndDlg, 0);
#else
DestroyWindow(hwndDlg); // on mac we run modeless
#endif
break;
}
break;
}
return 0;
}
#ifdef _WIN32
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nShowCmd)
{
timingInit();
g_hInstance=hInstance;
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, dlgProc);
timingPrint();
return 0;
}
#else
static HWND ccontrolCreator(HWND parent, const char *cname, int idx, const char *classname, int style, int x, int y, int w, int h)
{
if (!stricmp(classname,"TestRenderingClass"))
{
HWND hw=CreateDialog(NULL,0,parent,(DLGPROC)testRenderDialogProc);
SetWindowLong(hw,GWL_ID,idx);
SetWindowPos(hw,HWND_TOP,x,y,w,h,SWP_NOZORDER|SWP_NOACTIVATE);
ShowWindow(hw,SW_SHOWNA);
return hw;
}
return 0;
}
#include "../../swell/swell-dlggen.h"
// define our dialog box resource!
SWELL_DEFINE_DIALOG_RESOURCE_BEGIN(IDD_DIALOG1,SWELL_DLG_WS_RESIZABLE|SWELL_DLG_WS_FLIPPED,"LICE Test",400,300,1.8)
BEGIN
CONTROL "",IDC_RECT,"TestRenderingClass",0,7,23,384,239 // we arae creating a custom control here because it will be opaque and therefor a LOT faster drawing
COMBOBOX IDC_COMBO1,7,7,181,170,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
END
SWELL_DEFINE_DIALOG_RESOURCE_END(IDD_DIALOG1)
#if !defined(__APPLE__)
int main(int argc, char **argv)
{
SWELL_initargs(&argc,&argv);
SWELL_Internal_PostMessage_Init();
SWELL_ExtendedAPI("APPNAME",(void*)"LICE test");
SWELL_RegisterCustomControlCreator(ccontrolCreator);
//SWELL_ExtendedAPI("INIFILE",(void*)"path/to/ini/file.ini");
//SWELL_ExtendedAPI("FONTPANGRAM",(void*)"LICE test thingy lbah akbzfshauoh01384u1023");
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, dlgProc);
return 0;
}
INT_PTR SWELLAppMain(int msg, INT_PTR parm1, INT_PTR parm2)
{
return 0;
}
#endif
#endif