Skip to content

Commit

Permalink
Add Goom to the libmythtv visualisations.
Browse files Browse the repository at this point in the history
- currently OpenGL video only (VDPAU and Direct3D to follow).
- 2 versions will be listed in the OSD menu - both use the display
resolution for initial sizing but Goom will max out at 600x400 and Goom
HD at 1200x800.
  • Loading branch information
Mark Kendall committed Jan 2, 2012
1 parent 1bf85b6 commit ded61bd
Show file tree
Hide file tree
Showing 30 changed files with 4,637 additions and 0 deletions.
12 changes: 12 additions & 0 deletions mythtv/libs/libmythtv/libmythtv.pro
Expand Up @@ -350,6 +350,18 @@ using_frontend {
SOURCES += videocolourspace.cpp
SOURCES += videovisual.cpp

using_opengl {
# Goom
HEADERS += goom/filters.h goom/goomconfig.h goom/goom_core.h goom/graphic.h
HEADERS += goom/ifs.h goom/lines.h goom/drawmethods.h
HEADERS += goom/mmx.h goom/mathtools.h goom/tentacle3d.h goom/v3d.h
HEADERS += videovisualgoom.h
SOURCES += goom/filters.c goom/goom_core.c goom/graphic.c goom/tentacle3d.c
SOURCES += goom/ifs.c goom/ifs_display.c goom/lines.c goom/surf3d.c
SOURCES += goom/zoom_filter_mmx.c goom/zoom_filter_xmmx.c
SOURCES += videovisualgoom.cpp
}

using_libfftw3 {
DEFINES += FFTW3_SUPPORT
HEADERS += videovisualspectrum.h
Expand Down
178 changes: 178 additions & 0 deletions mythtv/libs/libmythtv/visualisations/goom/drawmethods.h
@@ -0,0 +1,178 @@
#ifndef _DRAWMETHODS_H
#define _DRAWMETHODS_H

#include "goomconfig.h"

#define DRAWMETHOD_NORMAL(adr,col) {*(adr) = (col);}

#ifdef MMX
#include "mmx.h"

#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \
{\
movd_m2r (_backbuf, mm0); \
paddusb_m2r (_col, mm0); \
movd_r2m (mm0, _out); \
}

#else
#define DRAWMETHOD_PLUS(_out,_backbuf,_col) \
{\
int tra=0,i=0;\
unsigned char *bra = (unsigned char*)&(_backbuf);\
unsigned char *dra = (unsigned char*)&(_out);\
unsigned char *cra = (unsigned char*)&(_col);\
for (;i<4;i++) {\
tra = *cra;\
tra += *bra;\
if (tra>255) tra=255;\
*dra = tra;\
++dra;++cra;++bra;\
}\
}
#endif

#define DRAWMETHOD_OR(adr,col) {*(adr)|=(col);}

#ifdef MMX
#define DRAWMETHOD_DONE() {__asm__ __volatile__ ("emms");}
#else
#define DRAWMETHOD_DONE() {}
#endif

#ifndef DRAWMETHOD
#define DRAWMETHOD DRAWMETHOD_PLUS(*p,*p,col)

static void draw_line (int *data, int x1, int y1, int x2, int y2, int col, int screenx, int screeny) {
int x, y, dx, dy, yy, xx; // am, tmp;
int *p;


if ((y1 < 0) || (y2 < 0) || (x1 < 0) || (x2 < 0) || (y1 >= screeny) || (y2 >= screeny) || (x1 >= screenx) || (x2 >= screenx))
return;

dx = x2 - x1;
dy = y2 - y1;
if (x1 > x2) {
int tmp;

tmp = x1;
x1 = x2;
x2 = tmp;
tmp = y1;
y1 = y2;
y2 = tmp;
dx = x2 - x1;
dy = y2 - y1;
}

/* vertical line */
if (dx == 0) {
if (y1 < y2) {
p = &(data[(screenx * y1) + x1]);
for (y = y1; y <= y2; y++) {
DRAWMETHOD;
p += screenx;
}
}
else {
p = &(data[(screenx * y2) + x1]);
for (y = y2; y <= y1; y++) {
DRAWMETHOD;
p += screenx;
}
}
return;
}
/* horizontal line */
if (dy == 0) {
if (x1 < x2) {
p = &(data[(screenx * y1) + x1]);
for (x = x1; x <= x2; x++) {
DRAWMETHOD;
p++;
}
return;
}
else {
p = &(data[(screenx * y1) + x2]);
for (x = x2; x <= x1; x++) {
DRAWMETHOD;
p++;
}
return;
}
}
/* 1 */

/* 2 */
if (y2 > y1) {
/* steep */
if (dy > dx) {
dx = ((dx << 16) / dy);
x = x1 << 16;
for (y = y1; y <= y2; y++) {
xx = x >> 16;
p = &(data[(screenx * y) + xx]);
DRAWMETHOD;
if (xx < (screenx - 1)) {
p++;
}
x += dx;
}
return;
}
/* shallow */
else {
dy = ((dy << 16) / dx);
y = y1 << 16;
for (x = x1; x <= x2; x++) {
yy = y >> 16;
p = &(data[(screenx * yy) + x]);
DRAWMETHOD;
if (yy < (screeny - 1)) {
p += screeny;
}
y += dy;
}
}
}
/* 2 */

/* 1 */
else {
/* steep */
if (-dy > dx) {
dx = ((dx << 16) / -dy);
x = (x1 + 1) << 16;
for (y = y1; y >= y2; y--) {
xx = x >> 16;
p = &(data[(screenx * y) + xx]);
DRAWMETHOD;
if (xx < (screenx - 1)) {
p--;
}
x += dx;
}
return;
}
/* shallow */
else {
dy = ((dy << 16) / dx);
y = y1 << 16;
for (x = x1; x <= x2; x++) {
yy = y >> 16;
p = &(data[(screenx * yy) + x]);
DRAWMETHOD;
if (yy < (screeny - 1)) {
p += screeny;
}
y += dy;
}
return;
}
}
}
#endif

#endif

0 comments on commit ded61bd

Please sign in to comment.