diff -NpuBr -Xexclude.txt main/configure sherpya/configure --- main/configure 2008-07-17 19:52:46.062500000 +0200 +++ sherpya/configure 2008-07-17 19:53:17.828125000 +0200 @@ -349,6 +349,7 @@ Video output: --enable-dhahelper enable VIDIX dhahelper support --enable-svgalib_helper enable VIDIX svgalib_helper support --enable-gl enable OpenGL video output [autodetect] + --enable-matrixview enable OpenGL MatrixView video outputi [no] --enable-dga2 enable DGA 2 support [autodetect] --enable-dga1 enable DGA 1 support [autodetect] --enable-vesa enable VESA video output [autodetect] @@ -539,6 +540,7 @@ _md5sum=yes _yuv4mpeg=yes _gif=auto _gl=auto +_matrixview=no _ggi=auto _ggiwmh=auto _aa=auto @@ -862,6 +864,8 @@ for ac_option do --disable-gif) _gif=no ;; --enable-gl) _gl=yes ;; --disable-gl) _gl=no ;; + --enable-matrixview) _matrixview=yes ;; + --disable-matrixview) _matrixview=no ;; --enable-ggi) _ggi=yes ;; --disable-ggi) _ggi=no ;; --enable-ggiwmh) _ggiwmh=yes ;; @@ -4230,6 +4234,19 @@ else fi echores "$_gl" +echocheck "MatrixView" +if test "$_gl" = no ; then + _matrixview=no +fi +if test "$_matrixview" = yes ; then + _vosrc="$_vosrc vo_matrixview.c matrixview.c matrixview_textures.c" + _vomodules="matrixview $_vomodules" + _def_matrixview='#define HAVE_MATRIXVIEW 1' +else + _novomodules="matrixview $_novomodules" + _def_matrixview='#undef HAVE_MATRIXVIEW' +fi +echores "$_matrixview" echocheck "VIDIX" _def_vidix='#undef CONFIG_VIDIX' @@ -8554,6 +8571,7 @@ $_def_xf86keysym $_def_xinerama $_def_gl $_def_gl_win32 +$_def_matrixview $_def_dga $_def_dga1 $_def_dga2 diff -NpuBr -Xexclude.txt main/libvo/matrixview.c sherpya/libvo/matrixview.c --- main/libvo/matrixview.c 1970-01-01 01:00:00.000000000 +0100 +++ sherpya/libvo/matrixview.c 2008-07-17 19:53:17.843750000 +0200 @@ -0,0 +1,445 @@ +/* + * Copyright (C) 2003 Alex Zolotov + * Mucked with by Tugrul Galatali + * + * MatrixView is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * MatrixView 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/** + * Ported to an MPlayer video out plugin by Pigeon + * August 2006 + */ + +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#define random rand +#endif + +extern unsigned char matrixview_font[]; +extern int matrixview_font_w; +extern int matrixview_font_h; +extern int matrixview_font_size; + +#include "matrixview.h" + +static float matrix_contrast = 1.5; +static float matrix_brightness = 1.0; + +// Settings for our light. Try playing with these (or add more lights). +static float Light_Ambient[] = { 0.1f, 0.1f, 0.1f, 1.0f }; +static float Light_Diffuse[] = { 1.2f, 1.2f, 1.2f, 1.0f }; +static float Light_Position[] = { 2.0f, 2.0f, 0.0f, 1.0f }; + +static unsigned char *font = NULL; + +static unsigned char flare[16] = { + 0, 0, 0, 0, + 0, 180, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0 +}; + +#define MAX_TEXT_X 320 +#define MAX_TEXT_Y 240 +static int text_x = 0; +static int text_y = 0; +#define _text_x text_x/2 +#define _text_y text_y/2 + +// Scene position +#define Z_Off -128.0f +#define Z_Depth 8 + +static unsigned char speed[MAX_TEXT_X]; +static unsigned char text[MAX_TEXT_X * MAX_TEXT_Y + MAX_TEXT_X]; +static unsigned char text_light[MAX_TEXT_X * MAX_TEXT_Y + MAX_TEXT_X]; //255 - white; 254 - none; +static float text_depth[MAX_TEXT_X * MAX_TEXT_Y + MAX_TEXT_X]; + +static unsigned char *pic = NULL; +static float bump_pic[MAX_TEXT_X * MAX_TEXT_Y + MAX_TEXT_X]; + +static void draw_char (long num, float light, float x, float y, float z) +{ + float tx, ty; + long num2, num3; + + num &= 63; + //light = light / 255; //light=7-light;num+=(light*60); + light = light / 255 * matrix_brightness; + num2 = num / 10; + num3 = num - (num2 * 10); + ty = (float)num2 / 7; + tx = (float)num3 / 10; + glNormal3f (0.0f, 0.0f, 1.0f); // Needed for lighting + glColor4f (0.9, 0.4, 0.3, light); // Basic polygon color + + glTexCoord2f (tx, ty); + glVertex3f (x, y, z); + glTexCoord2f (tx + 0.1, ty); + glVertex3f (x + 1, y, z); + glTexCoord2f (tx + 0.1, ty + 0.166); + glVertex3f (x + 1, y - 1, z); + glTexCoord2f (tx, ty + 0.166); + glVertex3f (x, y - 1, z); +} + +static void draw_illuminatedchar (long num, float x, float y, float z) +{ + float tx, ty; + long num2, num3; + + num2 = num / 10; + num3 = num - (num2 * 10); + ty = (float)num2 / 7; + tx = (float)num3 / 10; + glNormal3f (0.0f, 0.0f, 1.0f); // Needed for lighting + glColor4f (0.9, 0.4, 0.3, .5); // Basic polygon color + + glTexCoord2f (tx, ty); + glVertex3f (x, y, z); + glTexCoord2f (tx + 0.1, ty); + glVertex3f (x + 1, y, z); + glTexCoord2f (tx + 0.1, ty + 0.166); + glVertex3f (x + 1, y - 1, z); + glTexCoord2f (tx, ty + 0.166); + glVertex3f (x, y - 1, z); +} + +static void draw_flare (float x, float y, float z) //flare +{ + glNormal3f (0.0f, 0.0f, 1.0f); // Needed for lighting + glColor4f (0.9, 0.4, 0.3, .8); // Basic polygon color + + glTexCoord2f (0, 0); + glVertex3f (x - 1, y + 1, z); + glTexCoord2f (0.75, 0); + glVertex3f (x + 2, y + 1, z); + glTexCoord2f (0.75, 0.75); + glVertex3f (x + 2, y - 2, z); + glTexCoord2f (0, 0.75); + glVertex3f (x - 1, y - 2, z); +} + +static void draw_text () +{ + int x, y; + long p = 0; + int c, c_pic; + int pic_fade = 255; + + for (y = _text_y; y > -_text_y; y--) { + for (x = -_text_x; x < _text_x; x++) { + c = text_light[p] - (text[p] >> 1); + c += pic_fade; + if (c > 255) + c = 255; + + if (pic) { + + // Original code + //c_pic = pic[p] * matrix_contrast - (255 - pic_fade); + + c_pic = (255 - pic[p]) * matrix_contrast - (255 - pic_fade); + + if (c_pic < 0) + c_pic = 0; + + c -= c_pic; + + if (c < 0) + c = 0; + + bump_pic[p] = (255.0f - c_pic) / (256 / Z_Depth); + } else { + bump_pic[p] = Z_Depth; + } + + if (c > 10) + if (text[p]) + draw_char (text[p] + 1, c, x, y, text_depth[p] + bump_pic[p]); + + if (text_depth[p] < 0.1) + text_depth[p] = 0; + else + text_depth[p] /= 1.1; + + p++; + } + } +} + +static void draw_illuminatedtext (void) +{ + float x, y; + long p = 0; + + for (y = _text_y; y > -_text_y; y--) { + for (x = -_text_x; x < _text_x; x++) { + if (text_light[p] > 128) + if (text_light[p + text_x] < 10) + draw_illuminatedchar (text[p] + 1, x, y, text_depth[p] + bump_pic[p]); + p++; + } + } +} + +static void draw_flares (void) +{ + float x, y; + long p = 0; + + for (y = _text_y; y > -_text_y; y--) { + for (x = -_text_x; x < _text_x; x++) { + if (text_light[p] > 128) + if (text_light[p + text_x] < 10) + draw_flare (x, y, text_depth[p] + bump_pic[p]); + p++; + } + } +} + +static void scroll (double dCurrentTime) +{ + int a, s, polovina; + //static double dLastCycle = -1; + static double dLastMove = -1; + + if (dCurrentTime - dLastMove > 1.0 / (text_y / 1.5)) { + dLastMove = dCurrentTime; + + polovina = (text_x * text_y) / 2; + s = 0; + for (a = (text_x * text_y) + text_x - 1; a > text_x; a--) { + if (speed[s]) { + text_light[a] = text_light[a - text_x]; //scroll light table down + } + s++; + if (s >= text_x) + s = 0; + } + + //============================ + //for (a = (text_x * text_y) + text_x - 1; a > text_x; a--) { + // text_light[a] = text_light[a - text_x]; //scroll light table down + //} + memmove ((void *)(&text_light[0] + text_x), (void *)&text_light, (text_x * text_y) - 1); + + //for (a = 0; a < text_x; a++) + // text_light[a] = 253; //clear top line (in light table) + memset ((void *)&text_light, 253, text_x); + + s = 0; + for (a = polovina; a < (text_x * text_y); a++) { + if (text_light[a] == 255) + text_light[s] = text_light[s + text_x] >> 1; //make black bugs in top line + + s++; + + if (s >= text_x) + s = 0; + } + } +} + +static void make_change (double dCurrentTime) +{ + int r = random () & 0xFFFF; + + r >>= 3; + if (r < (text_x * text_y)) + text[r] += 133; //random bugs + + r = random () & 0xFFFF; + r >>= 7; + if (r < text_x) + if (text_light[r] != 0) + text_light[r] = 255; //white bugs + + scroll (dCurrentTime); +} + + +static void load_texture () +{ + long a; + + font = matrixview_font; + + for (a = 0; a < matrixview_font_size; a++) { + if ((a >> 9) & 2) { + //font[a] = font[a]; + } else { + font[a] = font[a] >> 1; + } + } +} + +static void make_text () +{ + long a; + unsigned int r; + + for (a = 0; a < (text_x * text_y); a++) { + r = random () & 0xFFFF; + text[a] = r; + } + + for (a = 0; a < text_x; a++) + speed[a] = random () & 1; +} + +static void ourBuildTextures () +{ + + glBindTexture (GL_TEXTURE_2D, 1); + glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, matrixview_font_w, matrixview_font_h, 0, GL_GREEN, GL_UNSIGNED_BYTE, font); + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glBindTexture (GL_TEXTURE_2D, 2); + glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, matrixview_font_w, matrixview_font_h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, font); + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glBindTexture (GL_TEXTURE_2D, 3); + glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, flare); + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + // Some pretty standard settings for wrapping and filtering. + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + + // We start with GL_DECAL mode. + glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); +} + +void matrixview_init (int w, int h) +{ + if (font == NULL) { + load_texture (); + } + make_text (); + + ourBuildTextures (); + + // Color to clear color buffer to. + glClearColor (0.0f, 0.0f, 0.0f, 0.0f); + + // Depth to clear depth buffer to; type of test. + glClearDepth (1.0); + glDepthFunc (GL_LESS); + + // Enables Smooth Color Shading; try GL_FLAT for (lack of) fun. + glShadeModel (GL_SMOOTH); + + // Set up a light, turn it on. + glLightfv (GL_LIGHT1, GL_POSITION, Light_Position); + glLightfv (GL_LIGHT1, GL_AMBIENT, Light_Ambient); + glLightfv (GL_LIGHT1, GL_DIFFUSE, Light_Diffuse); + glEnable (GL_LIGHT1); + + // A handy trick -- have surface material mirror the color. + glColorMaterial (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); + glEnable (GL_COLOR_MATERIAL); + + matrixview_reshape (w, h); +} + + +void matrixview_reshape (int w, int h) +{ + glViewport (0, 0, w, h); + + glMatrixMode (GL_PROJECTION); + glLoadIdentity (); + glFrustum(-_text_x, _text_x, -_text_y, _text_y, -Z_Off - Z_Depth, -Z_Off); + + glMatrixMode (GL_MODELVIEW); +} + + +void matrixview_draw (int w, int h, double currentTime, float frameTime, + unsigned char *data) +{ + pic = data; + + glBindTexture (GL_TEXTURE_2D, 1); + glEnable (GL_BLEND); + glEnable (GL_TEXTURE_2D); + + glDisable (GL_LIGHTING); + glBlendFunc (GL_SRC_ALPHA, GL_ONE); + glDisable (GL_DEPTH_TEST); + + glMatrixMode (GL_MODELVIEW); + glLoadIdentity (); + glTranslatef (0.0f, 0.0f, Z_Off); + + // Clear the color and depth buffers. + glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // OK, let's start drawing our planer quads. + glBegin (GL_QUADS); + draw_text (); + glEnd (); + + glBindTexture (GL_TEXTURE_2D, 2); + glBegin (GL_QUADS); + draw_illuminatedtext (); + glEnd (); + + glBindTexture (GL_TEXTURE_2D, 3); + glBegin (GL_QUADS); + draw_flares (); + glEnd (); + + make_change (currentTime); + + glLoadIdentity (); + glMatrixMode (GL_PROJECTION); + +} + +void matrixview_contrast_set(float contrast) +{ + matrix_contrast = contrast; +} + +void matrixview_brightness_set(float brightness) +{ + matrix_brightness = brightness; +} + + +void matrixview_matrix_resize(int w, int h) +{ + if(w > MAX_TEXT_X) + { + w = MAX_TEXT_X; + } + if(h > MAX_TEXT_Y) + { + h = MAX_TEXT_Y; + } + text_x = w; + text_y = h; + make_text(); +} + diff -NpuBr -Xexclude.txt main/libvo/matrixview.h sherpya/libvo/matrixview.h --- main/libvo/matrixview.h 1970-01-01 01:00:00.000000000 +0100 +++ sherpya/libvo/matrixview.h 2008-07-17 19:53:17.859375000 +0200 @@ -0,0 +1,8 @@ + +void matrixview_init (int w, int h); +void matrixview_reshape (int w, int h); +void matrixview_draw (int w, int h, double currentTime, float frameTime, unsigned char *data); +void matrixview_matrix_resize(int w, int h); +void matrixview_contrast_set(float contrast); +void matrixview_brightness_set(float brightness); + diff -NpuBr -Xexclude.txt main/libvo/matrixview_textures.c sherpya/libvo/matrixview_textures.c --- main/libvo/matrixview_textures.c 1970-01-01 01:00:00.000000000 +0100 +++ sherpya/libvo/matrixview_textures.c 2008-07-17 19:53:17.875000000 +0200 @@ -0,0 +1,479 @@ + +unsigned char matrixview_font[] = "" + "\005\005\005\005\012)i\232\033\005\005\005\005\005\005\006\033" + "U\207\216\204D\016\005\005\005\005\010H\213\217\217\217\217\214" + "F\010\006\005\005\005\005\005\006\005:\215\217N\006\005\006\007" + "X\216\217\216\220\217\216\217\202\032\005\006\005\006\013=\201" + "\220\217[\032\006\005\005\005:\217\217\217\217\217\217\217\217" + "^\005\005\005\005\005\0124t\177I\017\005\005\005\005\005\005\031" + "t\217\216\217\217z\037\005\005\005\005\006\005\007\005\005\005" + "\005\006\005\006\005\005\005\005\006=\365\377\365)\007\005\005" + "\005\005\006B\334\372\252m\201\336\241\021\006\007\006)\271~d" + "e\246\372\377\363;\005\005\005\005\005\006\006\034\324\355\377" + "\224\005\007\006\007T\206\207\206\206\206\314\377\360-\006\005" + "\006\020\236\373\347\223\316\376\3278\006\005\005+ddcddp\354\377" + "\253\005\005\005\005\014\203\370\376\367\375\262\036\005\005\005" + "\005\006\241\377\374\202}\370\377\255\013\007\005\006\006\011" + "\030\032\016\016\031\031\011\006\006\005\005\005\006\030w\373" + "\366)\006\005\005\005\005\017\314\377\307\012\006\0061\264@\007" + "\006\006\006\005\006\006\007\013\255\377\377f\006\005\005\005" + "\005\007\013\234\313\215\377\224\006\006\006\005\006\006\006\007" + "\006\005\217\377\360.\005\006\006d\374\375F\005\035\343\377\235" + "\012\006\006\006\006\005\005\006\006*\354\377\234\005\005\005" + "\005I\372\377\233F\324\377\230\005\005\005\005\005\273\377\333" + "\031F\367\377\310\017\007\006\006\006 \322\334^m\333\304\036\006" + "\005\005\005\005\005\006>\371\366*\005\005\005\005\005\022\340" + "\377\273\011\006\006\006\006\005\006\006\007\006\006\006\006\006" + "\005\201\377\377f\006\005\005\005\005\006_\351C}\377\222\006\006" + "\005\006\017a\232\233\233\234\326\377\357-\006\005\006\265\377" + "\344\034\006\013\275\377\276\016\006\007\006\006\006\006\006\010" + "\200\377\366:\005\005\005\005[\376\375p\036\273\377\245\005\005" + "\005\005\006\273\377\331\036\277\377\377\307\020\006\006\006\005" + ";\377\377R\235\377\334\034\006\006\005\005\005\005\005<\371\366" + ")\005\005\005\005\005\013\246\377\343\027\005\006\006\005\006" + "\005\006\006\006\006\006\007\006\007\211\377\377f\006\006\006" + "\005\006)\336|\006|\377\224\005\005\006\006d\374\377\354\205_" + "__V\022\005\005\006\305\377\372/\006\027\335\377\257\013\006\005" + "\005\005\006\006\0064\354\377\222\011\006\005\005\005\031\311" + "\376\365\332\377\346>\005\005\005\005\005\274\377\332n\372\377" + "\377\307\016\005\006\007\006T\377\371@\271\377\311\017\006\005" + "\005\005\005\005\005=\371\365(\005\005\005\005\005\005\035\260" + "\375\266%\006\006\005\005\005\005\007\006\005\022\023\0253\330" + "\377\376a\006\005\006\010\016\255\306\036\024\204\377\223\005" + "\005\005\005\203\377\377z\010\007\006\005\005\005\005\005\006" + "\270\377\377\274a\244\375\371r\007\007\005\005\005\005\010\020" + "\266\377\324\036\006\005\005\005\005\007j\372\377\377\377\224" + "\015\005\005\005\005\005\273\377\346\346\304\363\377\307\016\005" + "\005\006\006v\377\3604\310\377\270\007\006\005\005\005\005\005" + "\005=\371\366(\005\005\005\005\005\006\006\024\205\362\335U\012" + "\006\005\005\005\006\005\006\257\314\316\344\356\354\266\036\007" + "\006\006\007m\374\345\314\314\346\377\224\006\005\005\005\204" + "\377\377d\006\006\006\005\005\005\005\005\006\221\377\344\250" + "\320\323\266\\\012\006\006\005\005\005\005\006f\375\374^\006\006" + "\005\005\005\005;\361\377\327\244\364\373b\005\005\005\005\006" + "\273\377\377\367I\352\377\307\016\005\005\007\006\227\377\346" + "0\330\377\241\006\006\005\005\005\005\005\005=\371\366)\005\005" + "\005\005\005\005\006\006\010F\326\365\205\024\006\005\005\006" + "\006\006D\255\361\340~;\013\006\005\006\006\011Xwwvv\272\377\223" + "\006\005\005\005\203\377\377j\005\005\005\005\005\005\005\005" + "\005@\364\373P\006\006\005\006\006\006\006\005\005\005\005\016" + "\303\377\323\025\006\007\006\005\005\005i\377\375[\012\260\377" + "\234\005\005\005\005\006\273\377\377\246\022\352\377\306\016\005" + "\005\006\006\220\337\274(\312\337o\005\007\005\006\005\006\006" + "\006<\371\366(\006\005\005\005\005\015\025\026\026\026/\256\376" + "\3011\006\005\006\020%$&S\267\371\321t\027\005\006\006\006\006" + "\007\006\005\005{\377\225\005\005\005\005\201\377\377\301*\012" + "\010,=\014\005\006\006\007|\363\341R\021\006\007\007\006\006\006" + "\005\005\006\024\320\377\300\006\006\005\006\005\006\0053\355" + "\377\307\225\354\371W\006\005\005\005\005\270\377\376H&\356\377" + "\304\016\007\006\006\005\021\030\024\010\027\030\017\005\005\005" + "\007\006\006\006\0057\342\335&\006\005\005\005\005`\300\277\300" + "\300\277\305\352\352\227\007\006\006J\321\321\321\322\322\346" + "\353\347U\006\006\005\025\230\256\256\256\257\314\353\203\005" + "\005\005\0055\312\351\352\322\264\260\321\227\017\005\006\006" + "\006\007\?\251\327\270\224\200\016\006\006\006\006\006\006\022" + "\275\353\256\006\006\006\007\006\007\006\010R\315\362\364\327" + "s\013\006\007\006\006\006Z\333\352\315\314\353\332d\007\006\006" + "\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\007" + "\005\015'$\012\006\006\005\005\005\027((('((('\035\006\006\006" + "\021&(('()')\021\006\006\006\0132:1'&'&\031\005\005\005\005\014" + "%8:9:93\025\006\006\006\006\006\007\005\005\033&''\012\006\006" + "\006\007\006\005\007!(\036\006\006\007\006\005\006\006\022\031" + "$DG(\030\027\027\011\005\006\006\006\032(((&\031\006\006\006\006" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\211\311\310" + "\311\311\311\310\311\250\022\005\005\005\005\005\005\006\022\031" + "$,;3\012\007\005\006\006\006\006\006\006\006\006\006\006\006\006" + "\005\017\250\331{\005\006\006\006\006\006\005\005\005L\300\302" + "\303\303\302\322\331\236\006\005\006\006\005\005\005\006\006\005" + "\006\006\006\006\006\005\005\020NNNONO>\012\005\006\006\012}\257" + "\260\261\257\266\330\332\267!\006\006\006\007\006\006\006\006" + "\005\006\006\006\007\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\255\367\262\250\252\251\251\251\214\017\005\005\005" + "=\254\273\314\325\334\346\356\367\324\027\005\005\006\006\006" + "\006\023y\263\223$\007\006\005\010-\321\377\246,+++*\034\005\005" + "\005\022$%%%J\353\377\267\006\006\006\006\006\006\006\006\006" + "\005\006\006\006\006\005\006\006-\371\370\376\377\373\370\300" + "\020\006\006\007\007\020\026\026\026\026-\363\377\206\010\006" + "\005\006\030NS<\012\005\006\006\006\006\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\255\344\032\007\006\005\006\006" + "\005\005\005\005\005o\377\373\366\350\342\322\312\276\223\021" + "\006\006\007\006\006>\304\374\2651\007\006\006\006\027\310\374" + "\377\370\355\356\356\356\356\227\005\005\005\005\006\005\006\036" + "\311\377\365U\005\006\006\006\006\007\006\006\006\006\007\006" + "\006\007\006\007\005\01434\270\377i4(\010\006\005\006\007!,,," + ",B\364\377\220\013\006\006\006\025{\354\364\231 \006\006\007\005" + "\006\005\005\005\005\005\005\005\005\005\005\005\005\005\255\344" + "\033\006\006\006\005\005\006\005\005\005\005\034FKUQ]VaT\005\006" + "\006\010\006\025\204\357\346j\023\006\006\006\007\006\015U\327" + "\377\277`````>\005\005\005\006\006\006\021\257\377\371r\010\005" + "\007\005\005\027\034\033\033\014\026\034\034\033\013\005\006\006" + "\006\006\006\251\377G\005\006\007\006\006\006\014\256\360\360" + "\360\357\361\377\377\346+\006\006\006\007\0075\267\375\326S\011" + "\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\255\344\032\006\006\006\006\006\006\005\005\005\005\005e\342" + "\354\360\371\373\377\325\006\006\006\005\005/\323\377\270$\006" + "\006\006\005\007\006\006\006\236\377\263\007\005\005\005\005\005" + "\005\005\005\005\006\014\222\375\375\217\013\006\006\006\006\015" + "\301\343\343\341/\307\342\343\330'\005\006\006\007\006\006\250" + "\377F\007\006\005\006\006\006\007,<<<'\011\006\005\006\304\346\346\346\346\345\346\244\014\007" + "\005\007\006\006\0063\267\365\260\\9\032\005\005\005P\375\376" + "\222QPOPB\006\007\006\006\005\005\005\005\005\005\005\005\005" + "\005\005\006\017\265\363\363\362\362\362\363\362j\007\007\006" + "\012x\245\247\247\327\377\377\333%\007\007\006\006\011\017\020" + "\013\006\006\007\005\005\005\006\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\030\"\"!\"\"!!\"!\022\005\005\010\012\005" + "\006\006\005\006\007\005\005\005\005\005\005\036\"#!\"\"\"\031" + "\006\006\006\006\005\006\005\006\017@\177\213u(\006\006\0055\244" + "\247\244\243\244\244\243\207\005\006\006\005\005\006\005\005\005" + "\005\005\005\006\006\006\007\010\033!\"\"\"\"\"#\022\006\006\005" + "\013|\246\246\246\245\247\216-\005\005\005\005\005\006\006\006" + "\006\005\006\006\006\007\006\005\007\006\005\006\006\005\006\007" + "\005\006\005\005\005\005\005\006\006\006\0359:\025\006\005\005" + "\005\006\006\006\005\005\006\006\007\006\005\005\005\006\0176" + ":\014\006\005\011.8\027\006\006\006\026:99:9:9:0\011\006\006\006" + "\006\007\006\006\006\005\005\006\006\007\006\006\006\006\006\005" + "\005\005\007.95\010\006\006\006\":\033\006\0249(\006\005\007\006" + "\005\01067\011\006&3\012\006\005\005\005\006\006\006\006\006\007" + "\0319\"\006\006\006\006\006\007\006\012\037 \012\006\006\006\005" + "\005\005\005\006\006\006I\362\364f\005\005\005\005\005\005\006" + "\007\007\007\010\006\005\005\005\005\0060\345\364%\006\005\037" + "\343\347&\006\006\006M\364\364\364\364\364\364\365\364\313\023" + "\005\020\301\317\320\316\317\320\317\317\317v\006\006\036VUVV" + "VV[\317\364\342\017\006\006\005\222\364o\005M\365\252\006\005" + "\007\006\006\025\347\344\021\006\231\340\036\005\005\005\005\026" + "bjjjj\237\363\250.\006\006\006\006\034\010\007\005\010" + "\0068\206\233\374\375\240\206N\006\005\005\006\030\305\351\317" + "\037\200\377\377>\006\006\006\006\005\0060\202\203a\006\005\005" + "\005\005\0055\362\377'\006\020\221\227\032\007\006\007\006$\355" + "\377\355\366\373P\006\006\005\006\006\017\324\377\264\013\006" + "\006\006\007\006\007\005\005\005\005\005\005\005\005\005\014\302" + "\377\354\017\006\006\005\254\377V\0058\270~\005\005\006\006\006" + "\026\362\360\021\005s\246\030\005\005\005\005\006\207\3500\010" + "\013\313\367\035\006\007\005\005\006\036DJ\370\370h2\005\006\006" + "\006\006I\375\377\254\007G\371\377\206\006\006\006\005\005\005" + "\006\006\006\005\006\005\005\005\005\006\034\347\3776\007\006" + "\006\007\006\006\007\006\011~\370\377\361\2219\014\007\006\005" + "\007\007\011\205\376\3601\006\006\021G@\020\010\006\005\005\005" + "\005\005\005\005\014\303\377\355\016\006\006\006\220\377g\005" + "\010\014\014\005\006\006\006\006\021\337\360\025\006\013\014\005" + "\005\005\005\005\006\020n\241F\014\345\343\024\006\006\005\005" + "\007z\367\205\366\371\354\264\006\007\006\006\006\232\377\376" + "Z\006\026\340\377\275\016\006\006\006\006\007'dfK\006\005\005" + "\005\005\006\010\277\377u\006\006\006\006\006\005\006\005\017" + "\270\325\377\343\"\006\006\007\006\006\006\007\006\027\303\377" + "\306!\006]\370\334\032\006\005\005\005\005\005\005\005\005\020" + "\333\377\355\017\005\005\006Q\377\234\007\006\005\006\005\005" + "\006\006\006\013\255\371C\006\006\006\007\006\005\005\005\006" + "\006\006\016\016\036\356\307\017\007\006\006\006\006\234\374s" + "\367\370\301\307\016\005\005\007\032\331\377\366n+\021\260\377" + "\357\037\006\005\006\005\006`\376\377\303\006\005\005\005\005" + "\006\005T\372\322\031\006\005\006\006\006\005\005\007\034\037" + "\314\377\204\007\006\006\006\005\005\005\005\005!\260\374\323" + "O\242\377\271\006\005\005\006\006\005\005\005\005\006T\372\377" + "\355\020\005\005\005\031\323\341\"\006\006\006\006\006\005\005" + "\005\005K\372\236\011\006\006\005\005\005\005\005\005\006\005" + "\005\0069\366\255\013\006\006\005\006\014\263\361[\367\370f\343" + ">\006\005\006M\376\377\377\375\364\340\343\377\377S\006\006\006" + "\005\006]\367\370\277\006\005\005\005\005\006\007\012\233\375" + "\242\031\007\006\005\006\006\006\005\005\005<\343\365q\022\007" + "\006\005\005\005\005\006\005\017O\243\326\373\377q\006\006\006" + "\013\024\024\024\025$d\346\377\377\305\013\005\005\005\005H\354" + "\253\030\007\006\007\005\005\005\005\006\013\223\365e\012\007" + "\007\005\005\005\005\005\006\006\006\007V\375\220\006\006\005" + "\005\005\023\313\352Q\367\371Ce\251\025\005\006\231\377\375\331" + "\352\372\377\377\377\377\223\006\006\006\006\005\014\032\032\024" + "\005\005\005\005\005\006\006\006\021x\347\322{L6\010\007\005\005" + "\005\005\0063\261\362\306~S\036\005\005\005\006\006\007\006\011" + "<\374\3628\006\006\005O\361\360\360\361\364\373\377\376\341>\005" + "\005\005\005\005\007>\300\274U\036\006\006\005\005\005\005\005" + "\021q\324\216L\030\005\005\005\005\025_iji\250\377\264h-\007\006" + "\007\025\316\367\342\371\371\337\332\326#\006\010Urh\037\031:" + "irrrF\006\005\005\005\006\006\006\006\006\005\005\005\005\005" + "\006\006\006\005\010\037f\211z;\006\005\005\005\011\013\013\013" + "\0231`va\035\006\005\005\005\007\006\006\005\035SM\015\006\006" + "\005&uxxwwxxi\"\006\006\005\005\005\005\005\006\016=e:\006\006" + "\005\005\005\005\006\006\010\025DV\025\005\005\005\005\025cnn" + "npspm.\006\006\006\010(6876783\014\006\006\006)ssrsrrK\005\006" + "\006\034\204\212\212\212\212\212\212\212\212\212M\006\005\005" + "\005\005\007\016\021\006\005\005\005\005\006\014}\250\250\250" + "\250\250\250\250\250\250.\006\0077jrriijj@\006\006\006\006d\247" + "\250\250\250\250\250\2434\007\005\005\005\005\005\005\005\005" + "\005\005\005\005\006\006\011s\212\212\212\212\212\211\212\212" + "\206&\006\006\005\005\005\005\006\025\014\006\005\005\005\005" + "\006J\212\2134\007\006\006\006\005\007\006\006\006Z\377\347\300" + "\300\323\377\246\006\007\0070\367\377\355\334\335\334\334\334" + "\353\377\220\007\006\005\005\005\007n\237\012\005\005\005\005" + "\007\016\301\377\377\367\361\360\360\360\361\360@\007\007(p\374" + "\343OKJK-\007\006\006\006b\242\242\242\257\373\356\2421\006\005" + "\005\005\005\005\005\005\005\005\005\005\005\006\007\013\265\335" + "\334\334\334\334\336\335\335\326:\007\007\006\005\005\005\010" + "\307\\\006\005\005\005\005\006\202\377\377t\006\006\010\012\006" + "\006\006\005\005\\\377\225\014\014L\373\247\007\006\0071\366\377" + "m\017\017\017\017\017f\377\217\005\005\005\005\005\006t\262\013" + "\005\005\005\005\006\011\264\377\373O\023\023\023\023\023\023" + "\012\006\006 c\375\342\?;;;$\006\007\006\006I}}}\215\371\315\023" + "\006\006\006\005\005\005\005\005\005\005\005\005\005\005\005\006" + "\011w\202\203\203\203\203\203\203\203\203V\006\006\005\005\005" + "\005\010\320a\006\005\005\005\005\007a\377\377\223\035U\232E\006" + "\006\006\006\006\\\377\221\005\006G\373\246\006\006\0061\366\377" + "h\006\005\005\005\005V\355\205\005\005\005\005\005\005u\264\013" + "\005\005\005\005\006\005\221\377\373@\006\005\005\005\005\005" + "\006\006\006}\373\377\377\374\370\366\366\224\007\006\006\006" + "\222\372\377\373\363\370\357 \006\006\007\005\005\005\005\005" + "\005\005\005\005\005\005\006\006\016\354\377\377\372\371\372\372" + "\372\371\372\261\006\007\005\005\005\005\010\323c\006\005\005" + "\005\005\007\?\377\377\360\355\375\360N\006\006\005\005\005]\377" + "\273`^\211\375\246\007\006\0051\367\377i\007\006\005\005\005\011" + "\020\013\005\005\005\005\005\010Q\212\012\005\005\005\005\006" + "\007M\377\377W\006\006\005\005\005\005\005\005\005&m\374\377\365" + "cIH,\007\007\006\007\034\226\377\257,T\354\215\024\010\006\006" + "\006$@>\?>>\?6\013\005\006\016\337\377\357RJHHIIH4\007\006\005" + "\005\005\005\007\322a\005\005\005\005\005,\322\377\377\374\313" + "s'\010\005\005\005\005\005\\\377\343\266\266\314\377\246\006\007" + "\007$\363\377|\007\006\005\005\005\005\005\005\005\005\005\005" + "\005\0068E\007\005\005\005\005\007\007\032\327\377\225\010\006" + "\005\005\005\005\005\005\005\0068\373\377\370G\006\006\010\006" + "\007\006\006\006j\377\254\011\007=\254\243!\006\006\006q\326\326" + "\311\241\311\326\264\027\007\006\011\250\377\371>\006\005\005" + "\005\005\005\006\010\007\005\005\005\005\006\323a\005\005\005" + "\005\005D\367\352\377\3561\007\005\005\005\005\005\005\005[\377" + "\225\011\012J\374\246\006\006\005\014\274\377\326\031\005\005" + "\005\005\005\005\005\005\005\005\005\005\006r\261\012\005\005" + "\005\005\005\006\006\200\377\350.\006\005\005\005\005\005\005" + "\005\0057\373\377\377\201\006\007\006\006\005\006\006\006!\344" + "\340\033\006\007\011\015\007\006\006\006\012\014\014\004\000\004" + "\014\012\006\006\005\006L\370\377\263\020\006\005\005\005\005" + "\006\007\006\005\005\005\005\007\323a\005\005\005\005\005\034" + ">+\346\377\231\011\005\005\005\005\005\005\005\\\377\224\006\006" + "G\373\246\005\006\006\005<\346\376\230\020\005\005\005\005\005" + "\005\005\005\005\005\005\006u\263\013\005\005\005\005\007\006" + "\023\271\377\377\274!\005\005\005\005\005\005\005\0057\373\357" + "\344\336\037\007\006\006\006\005\006\006\010s\374\203\012\006" + "\006\005\006\007\006\005\005\006\005\001\000\001\006\006\006\005" + "\006\006\012\223\374\374\214\021\005\005\005\005\005\006\005\005" + "\005\005\005\006\322`\005\005\005\005\005\006\006\007i\371\365" + "i\012\005\005\005\005\006\006[\377\277hj\222\375\246\006\005\005" + "\005\0065\311\372\2540\025\016\017\011\006\006\005\005\005\005" + "\006s\262\013\005\005\005\005\005\012v\377\352\257\366\324Y\035" + "\025\033\011\006\006\0068\373\327B\341\262!\006\005\005\005\006" + "\005\006\012\212\362~\030\015\007\006\006\005\005\005\005\007" + "\007\004\005\005\005\005\005\006\007\006\016t\353\376\275C\026" + "\017\020\016\006\005\007\006\007\006\007\244L\006\006\006\006" + "\006\005\005\005\011v\364\370\2273\030\027\013\006\006<\256\256" + "\256\255\255\256q\006\005\005\005\005\006\024d\274\340\273\251" + "\217\035\007\006\005\005\005\005\007,O\010\005\005\005\005\005" + ")\334\353u\011F\245\342\320\302\263\031\006\006\0063\350\304\012" + ")\235\301)\005\005\005\006\006\006\006\007O\254\266\226\020\005" + "\007\005\005\005\005\007\005\006\005\005\005\005\005\006\005\006" + "\006\007&v\302\346\303\251\246\\\006\006\006\006\006\006\005\007" + "\006\006\007\006\005\006\005\005\005\005\010@\244\342\351\310" + "\2510\005\006\007\013\017\013\011\017\011\006\005\005\005\005" + "\006\006\006\006\005\014\037\033\006\006\005\006\006\005\005\005" + "\006\007\006\007\005\005\005\005\007\020\037\035\012\007\006\007" + "\025(\"\020\010\006\012\016\024(\"\020\017\017\032\015\005\005" + "\005\007\017\017\017\020\017\016\025\020\006\006\006\005\005\005" + "\005\006\014\016\012\005\005\005\005\006\006\013\016\016\017\017" + "\017\031))\031\006\007\006\006\014\017\012\006\017\013\015\016" + "\006\006\006\005\005\005\005\006\012\030\031\035\031\010\005\006" + "\006\006x\300v@\300\?\006\005\005\005\005\005\005\006\006\006" + "\006\006\006\005\006\006\006\005\005\005\005\006\006\006\006\005" + "\005\005\005\006\007\006\006\005\006\005\"\260\300\277\3004\006" + "]\301\300\300\300\277\277\277\277D\005\005\0052\273\300\300\277" + "\300\301\301\266\023\006\006\006\023\030\031\031\222\300\201\030" + "\030\030\023\006\005M\243\243\241\243\242\244\270\300\243\022" + "\007\005\006w\300S$\265l\231\232\016\006\005\005\017\030\030\032" + "F\330\250\025\011\006\005\005\005\005\264\377\206N\376V\006\005" + "\005\005\005\006\006\006\006\"=\006\006\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\006\021\017\006\005\005" + "\005+\352\374\375\374C\006~\377\326\246\247\246\246\246\246:\005" + "\005\005F\374\377\333\247\247\246\324\3718\006\006\013\231\332" + "\332\332\367\377\364\332\333\332\242\015\007\032#$%%$+\307\377" + "\252\010\006\006\006\270\377rb\376m\356\237\011\006\006\006t\333" + "\332\333\345\377\370\300\033\006\006\005\005\016\310\377g@\371" + "U\005\006\005\005\005\006\006YGt\320,r\024\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\007ZS\006\005\005\005" + "\020ELLL\026\005|\377\206\006\015(%\007\006\005\005\005\005@\371" + "\377\220\005\010\0074\351\213\010\007\007\212\377\377\311\242" + "\242\243\242\242\242x\013\007\221\365\365\364\364\364\363\375" + "\377\340\031\006\006\006\256\377n\244\363x\374c\006\007\006\006" + "\213\372\232\201\257\377\342p\023\007\005\005\005\030\327\377" + "O%\352Z\006\006\005\005\005\006\006h\354\355\367\352\254\022\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006F" + "\220\006\005\005\005 \244\261\261\2602\006s\377\214\010;\363\332" + "\010\006\005\005\005\005/\360\377\231.W\217\237V\3171\007\006" + "3\364\377\264\017\006\006\005\005\005\005\006\006\203\376\220" + "aaaf\326\377\267\015\006\006\006\231\377[\312\257\214\336!\005" + "\006\006\006\214\3626\006b\377\301\005\005\005\006\005\005$\351" + "\373>\013\320\210\007\006\005\005\005\005\006L\333\367\375\360" + "\206\014\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\007 \332/\005\005\005*\350\372\372\371C\005e\377\267\014" + "@\377\344\007\007\005\005\005\005\020\333\377\365\371\377\356" + "\271\021%#\007\005\011\200\377\375\222\021\005\005\005\005\005" + "\006\006G\371|\010\006\007\016\276\377\237\006\006\006\005{\377" + "o\031\023\025\031\010\005\006\006\006\215\3625\006I\377\303\010" + "\006\007\005\005\0052\371\361/\006\223\273\014\006\005\005\005" + "\006\006n~\202\327X\242\027\005\005\005\005\005\006\010\005\005" + "\005\005\007\007\005\005\006\013\253\306)\005\006\017@GFE\024" + "\0068\365\362:A\377\353\035\006\005\005\005\005\006\227\377\375" + "\273i-\007\005\005\005\005\007:\307\377\377\375\2658\014\006\006" + "\006\006\006\013\233\341;\011\006\016\300\377\240\005\005\007" + "\007G\372\231\007\005\006\006\005\005\005\005\005\214\3635\007" + "-\360\326\026\006\005\005\006\006;\377\343 \005<\3513\006\005" + "\005\005\006\006\005\006H\216\007\006\005\005\005\005\005\006" + "Q\203\202\202\202\202\203^\010\006\006\005@\362\335q,\027\025" + "\024\025\025\011\006\013\225\373\341\245\377\373Y\006\005\005" + "\005\005\0073\356\373N\010\007\005\005\005\005\005\017\271\377" + "\364\233\324\377\360\271|M\023\006\006\006\021r\247J\007\030\333" + "\377\237\007\006\006\006\024\324\337\037\010\006\006\005\005\005" + "\005\007\216\3626\007\014\266\371@\006\006\006\006\007T\377\326" + "\025\006\007~\247\024\005\005\005\005\006\006\010\006\006\006" + "\006\005\005\005\005\005\007]\230\230\230\230\230\227l\011\005" + "\006\006\010u\367\377\357\324\321\321\321\3209\006\006\017Ntx" + "\307\377\312\035\005\005\005\005\005\005x\372\3418\007\006\005" + "\005\005\005\016\273\317I\006\275\377\272Hot\034\006\006\006\006" + "\007\006\006\011p\376\377\230\006\005\006\005\006a\371\242\024" + "\006\005\005\005\005\005\006\214\374\234`\0349\346\272\025\006" + "\005\005\005p\377\307\010\006\005\014E\026\005\005\006\006\006" + "\005\006\005\006\007\007\005\005\005\005\006\006\005\007\005\005" + "\005\005\007\006\006\006\006\006\005\011Z\317\373\377\377\377" + "\377\377E\007\006\006\006\006\005,\320\377\312N\031\005\005\005" + "\006\012o\352\346t,\027\014\005\005\015]8%&\307\377\265&%%\036" + "\010\007B\212\213\213\213\256\366\377\364J\006\006\006\006\005" + "\013\200\363\271E\025\024\010\005\006\007_\360\370\361\?\006F" + "\331\262+\007\006\006u\331\227\005\007\006\006\007\005\006\005" + "\007\006\006\006\006\007\006\006\006\005\006\006\006\006\006\006" + "\006\005\005\005\005\006\006\006\006\005\005\005\005\005\023H" + "\177\243\261\262\2600\006\006\006\005\005\005\006\037s\267\305" + "q\006\005\005\005\005\005,\204\303\266\2244\006\005\013\214\302" + "\301\302\324\331\323\302\302\302\215\014\006`\311\310\310\311" + "\310\311\277\\\006\005\005\005\005\005\005\010<\220\266\236\211" + "\027\006\006\006\0120<8\024\006\006 zr\012\005\006\016\027\021" + "*M'\006\005\006\005\006\010%:9::::::7\021\006\034LLLKKKKLLJ\027" + "\005\005\005\005\006\006\006\005\006\005\006\005\005\006\006\006" + "\005\005\005\006\006\007\006\006\006\006\006\006\005\005\005\006" + "\007\005\005\005\006\006\006\006\023\027\027\027\030\030\027\027" + "\027\027\021\006\005\006\006\005\005\005\005\006\006\005\005\005" + "\005\005\005\005\005\005\006\006\006\005\005\006\006\006\006\007" + "\007\006\005\006\006\006\006\006\006\005\006\006\006\006\006\250" + "\377w\006\006\006\006\006\007;\\[_\314\361|\\[V\027\007S\367\367" + "\367\367\367\367\367\367\367\356>\005\005\005\005\006\006\006" + "\006\007\006\006\006\006\006\006\005\005\005\005\006\006\007\006" + "\006\006\007\006\005\005\005\005\007\006\005\006\005\006\006\006" + "\006\006\006\006\006\006\006\005\005\005\005\005\005\007\006\006" + "\005\005\005\006\006\007\006\005\005\005\005\005\005\005\005\005" + "\006\005\005\007\006\007\006\007\006\006\006\006\006\007\006\006" + "\007\006\005\005\030\262\316\315\363\377\340\317\315\201\006\006" + "\011\225\354\354\356\373\377\361\354\354\3435\005 [[[[\\Z\\\\" + "\\W\032\005\005\005\032uvvvum\024\005\005\006\006\005\005\005" + "\005GM\006\005\007\005\005\006\005\005\005\005\005\005\005\007" + "\006\006\006\005\006\006\006\006\006\006\006\006\005\005\005\005" + "\006\006\005\005\005\005\005\005\006\006\006\006\005\005\005\005" + "\005\005\005\005\005\006\006\006\006\006\005\006\005\005\007\006" + "\006\006\006\005\007\006\005\005\024\214\244\257\366\375\267\245" + "\245g\005\005\011\246\377\234AAA@J\331\371<\005P\356\356\357\355" + "\360\356\356\356\356\346<\005\005\005\035\204\204\204\204\205" + "z\024\005\005\005\005\005\006\006\005\237\255\006\007\006\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\006\005\007'\352\354)\006\007\007\005\006\011\243\377" + "|\006\006\006\007\021\261\3314\006\027>t\374\377x>=\?><\022\005" + "\005\005\005\005\005\005\005\006\006\005\006\005\005\005\005\006" + "D{\314\325{L\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\006\006\006;\372\325\031\006\006" + "\006\005\005\011\244\377\202\006\006\007\007\010\033\036\013\006" + "\006\006\031\345\377\211\007\006\006\006\006\005\005\005\005\005" + "\005\005\005\005\006\005\006\006\005\005\005\005\005~\341\364" + "\370\341\214\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\006\016Q`\215\377\330caa=\005\005\010" + "\224\377\265\012\006\006\006\005\006\006\007\006\006\006\006\217" + "\376\330\031\006\006\006\007\006\005\006\005\005\005\005\005\006" + "\006\006\006\005\005\005\005\005\005\023\036\250\267\037\025\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\006\031\277\334\362\377\363\336\334\335\213\005\005\005" + "@\366\364\?\007\007\006\007\006\006\010\006\006\007\006\032\323" + "\377\221\015\006\006\005\006\005\006\006\232\335\335\335\335\335" + "\335|\007\005\005\005\005\005\005\005z\201\006\006\006\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\011\027\033\245\377\214\032\032\032\022\005\005\005\010o" + "\365\3339\006\006\006\005\007\007\006\006\006\006\0064\323\372" + "\214\022\006\006\006\006\006\005#011132\034\006\005\005\005\005" + "\005\005\005\014\013\006\006\006\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\006\006\006\006\272\377" + "_\005\005\005\005\005\005\005\005\010I\305\354\233XR,\007\006" + "\006\007\007\006\007\006\037\210\341\317\215h\010\006\006\005" + "\005\005\005\005\005\006\005\005\006\005\005\005\005\005\005\005" + "\005\006\006\007\006\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\006\005\010Tk\034\005\005\005" + "\005\005\005\005\005\006\005\0214cgZ#\006\005\005\006\005\006" + "\006\006\005\006\034>e:\007\005\005\005\005\005\005\005\005\006" + "\006\005\005\005\005\005\005\005\005\005\005\005\006\006\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005" + "\005"; + +int matrixview_font_w = 128; +int matrixview_font_h = 64; +int matrixview_font_size = 8192; + diff -NpuBr -Xexclude.txt main/libvo/video_out.c sherpya/libvo/video_out.c --- main/libvo/video_out.c 2008-07-10 19:30:24.968750000 +0200 +++ sherpya/libvo/video_out.c 2008-07-17 19:53:17.890625000 +0200 @@ -74,6 +74,7 @@ extern vo_functions_t video_out_xvmc; extern vo_functions_t video_out_xv; extern vo_functions_t video_out_gl; extern vo_functions_t video_out_gl2; +extern vo_functions_t video_out_matrixview; extern vo_functions_t video_out_dga; extern vo_functions_t video_out_sdl; extern vo_functions_t video_out_3dfx; @@ -155,6 +156,9 @@ const vo_functions_t* const video_out_dr #ifdef HAVE_GL &video_out_gl, &video_out_gl2, +#ifdef HAVE_MATRIXVIEW + &video_out_matrixview, +#endif #endif #ifdef HAVE_DGA &video_out_dga, diff -NpuBr -Xexclude.txt main/libvo/vo_matrixview.c sherpya/libvo/vo_matrixview.c --- main/libvo/vo_matrixview.c 1970-01-01 01:00:00.000000000 +0100 +++ sherpya/libvo/vo_matrixview.c 2008-07-17 19:53:17.890625000 +0200 @@ -0,0 +1,458 @@ +/* + * MatrixView video output driver for MPlayer + * + * by Pigeon + * + * Based on MatrixView the screensaver from http://rss-glx.sf.net/ + */ + +#include +#include +#include +#include + +#include "config.h" +#include "mp_msg.h" +#include "subopt-helper.h" +#include "video_out.h" +#include "video_out_internal.h" +#include "gl_common.h" +#include "aspect.h" +#include "libswscale/swscale.h" +#include "libmpcodecs/vf_scale.h" +#include "osdep/timer.h" + +#include "matrixview.h" + +static vo_info_t info = +{ + "MatrixView (OpenGL)", + "matrixview", + "Pigeon ", + "Based on MatrixView from rss-glx.sf.net" +}; + +LIBVO_EXTERN(matrixview) + +#ifdef GL_WIN32 +static int gl_vinfo = 0; +static HGLRC gl_context = 0; +#define update_xinerama_info w32_update_xinerama_info +#define vo_init vo_w32_init +#define vo_window vo_w32_window +#else +static XVisualInfo *gl_vinfo = NULL; +static GLXContext gl_context = 0; +static int wsGLXAttrib[] = { + GLX_RGBA, + GLX_RED_SIZE,1, + GLX_GREEN_SIZE,1, + GLX_BLUE_SIZE,1, + GLX_DEPTH_SIZE,1, + GLX_DOUBLEBUFFER, + None +}; +#endif + +static int int_pause = 0; +static int eq_contrast = 0.0; +static int eq_brightness = 0.0; +static uint32_t image_width; +static uint32_t image_height; +static uint32_t image_format; +static struct SwsContext *sws = NULL; + +static uint8_t *map_image[3] = { NULL, NULL, NULL }; +static int map_stride[3] = { 0, 0, 0 }; + +#define MATRIX_ROWS 90 +#define MATRIX_COLS 120 +static int matrix_rows = MATRIX_ROWS; +static int matrix_cols = MATRIX_COLS; + +#define DEFAULT_CONTRAST 0.90f +#define CONTRAST_MULTIPLIER 0.02f + +#define DEFAULT_BRIGHTNESS 1.0f +#define BRIGHTNESS_MULTIPLIER 0.02f + + +static void +contrast_set(int value) +{ + float contrast; + eq_contrast = value; + contrast = value * CONTRAST_MULTIPLIER + DEFAULT_CONTRAST; + if (contrast >= 0) { + matrixview_contrast_set(contrast); + } +} + + +static void +brightness_set(int value) +{ + float brightness; + eq_brightness = value; + brightness = value * BRIGHTNESS_MULTIPLIER + DEFAULT_BRIGHTNESS; + if (brightness >= 0) { + matrixview_brightness_set(brightness); + } +} + + +static int +config(uint32_t width, uint32_t height, + uint32_t d_width, uint32_t d_height, + uint32_t flags, char *title, uint32_t format) +{ + image_height = height; + image_width = width; + image_format = format; + + int_pause = 0; + + panscan_init(); + aspect_save_orig(width,height); + aspect_save_prescale(d_width,d_height); + update_xinerama_info(); + + aspect((int *) &d_width, (int *) &d_height,A_NOZOOM); + vo_dx = (int)(vo_screenwidth - d_width) / 2; + vo_dy = (int)(vo_screenheight - d_height) / 2; + geometry((int *) &vo_dx, (int *) &vo_dy, + (int *) &d_width, (int *) &d_height, + vo_screenwidth, vo_screenheight); + vo_dx += xinerama_x; + vo_dy += xinerama_y; + + vo_dwidth = d_width; + vo_dheight = d_height; +#ifdef GL_WIN32 + if (!vo_w32_config(d_width, d_height, flags)) + return -1; +#else + if (WinID >= 0) { + vo_window = WinID ? (Window) WinID : mRootWin; + vo_x11_selectinput_witherr(mDisplay, vo_window, + StructureNotifyMask | KeyPressMask | PointerMotionMask | + ButtonPressMask | ButtonReleaseMask | ExposureMask); + goto glconfig; + } + + if (vo_window == None) { + unsigned int fg, bg; + XSizeHints hint; + XVisualInfo *vinfo; + XEvent xev; + + vo_fs = VO_FALSE; + + hint.x = vo_dx; + hint.y = vo_dy; + hint.width = d_width; + hint.height = d_height; + hint.flags = PPosition | PSize; + + /* Get some colors */ + bg = WhitePixel(mDisplay, mScreen); + fg = BlackPixel(mDisplay, mScreen); + + /* Make the window */ + + vinfo=glXChooseVisual( mDisplay,mScreen,wsGLXAttrib ); + if (vinfo == NULL) + { + mp_msg(MSGT_VO, MSGL_ERR, "[matrixview] no GLX support present\n"); + return -1; + } + + + vo_window = vo_x11_create_smooth_window(mDisplay, mRootWin, vinfo->visual, hint.x, hint.y, hint.width, hint.height, vinfo->depth, XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocNone)); + + vo_x11_classhint(mDisplay,vo_window,"matrixview"); + vo_hidecursor(mDisplay,vo_window); + + XSelectInput(mDisplay, vo_window, StructureNotifyMask); + /* Tell other applications about this window */ + XSetStandardProperties(mDisplay, vo_window, title, title, None, NULL, 0, &hint); + /* Map window. */ + XMapWindow(mDisplay, vo_window); + + /* Wait for map. */ + do + { + XNextEvent(mDisplay, &xev); + } + while (xev.type != MapNotify || xev.xmap.event != vo_window); + + XSelectInput(mDisplay, vo_window, NoEventMask); + + XSync(mDisplay, False); + + vo_x11_selectinput_witherr(mDisplay, vo_window, StructureNotifyMask | KeyPressMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask); + } + + if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop); + + if (vo_config_count == 0) { + vo_x11_nofs_sizepos(vo_dx, vo_dy, d_width, d_height); + if (vo_fs ^ (flags & VOFLAG_FULLSCREEN)) + vo_x11_fullscreen(); + } +#endif /* GL_WIN32 */ +glconfig: + setGlWindow(&gl_vinfo, &gl_context, vo_window); + + if(sws) { + sws_freeContext(sws); + } + + sws = sws_getContextFromCmdLine(image_width, image_height, image_format, matrix_cols, matrix_rows, IMGFMT_Y8); + if (!sws) { + mp_msg(MSGT_VO, MSGL_ERR, "[matrixview] Cannot create SwsContext context\n"); + return -1; + } + + if(!map_image[0]) { + map_image[0] = malloc(matrix_cols * matrix_rows); + } + + map_stride[0] = matrix_cols; + + matrixview_init(vo_dwidth, vo_dheight); + matrixview_matrix_resize(matrix_cols, matrix_rows); + + contrast_set(eq_contrast); + brightness_set(eq_brightness); +#ifdef GL_WIN32 + /* On win32 starts with black screen */ + matrixview_reshape(vo_dwidth, vo_dheight); +#endif + return 0; +} + + +static void check_events(void) +{ + int e=vo_check_events(); + if(e & VO_EVENT_RESIZE) { + matrixview_reshape(vo_dwidth, vo_dheight); + } + if(e & VO_EVENT_EXPOSE && int_pause) flip_page(); +} + + +static void draw_osd(void) +{ + return; +} + + +static void do_matrixview() +{ + matrixview_draw(vo_dwidth, vo_dheight, GetTimer(), 0.0, map_image[0]); +} + + +static void +flip_page(void) +{ + do_matrixview(); + swapGlBuffers(); +} + + + +static int draw_slice(uint8_t *src[], int stride[], + int w, int h, int x, int y) +{ + sws_scale_ordered(sws, src, stride, y, h, map_image, map_stride); + return 0; +} + + +static int +draw_frame(uint8_t *src[]) +{ + return 0; + +#if 0 + int stride[3] = { 0, 0, 0 }; + + switch(image_format) { + case IMGFMT_YV12: + stride[0] = image_width * 12 / 8; + break; + case IMGFMT_BGR32: + case IMGFMT_RGB32: + stride[0] = image_width * 4; + break; + case IMGFMT_BGR24: + case IMGFMT_RGB24: + stride[0] = image_width * 3; + break; + case IMGFMT_BGR16: + case IMGFMT_BGR15: + stride[0] = image_width * 2; + break; + } + + sws_scale_ordered(sws, src, stride, 0, image_height, + map_image, map_stride); + + return 0; +#endif +} + + +static int +query_format(uint32_t format) +{ + int caps = VFCAP_CSP_SUPPORTED | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | + VFCAP_ACCEPT_STRIDE; + + switch(format) { + case IMGFMT_YV12: + case IMGFMT_BGR32: + case IMGFMT_BGR24: + case IMGFMT_BGR16: + case IMGFMT_BGR15: + case IMGFMT_RGB32: + case IMGFMT_RGB24: + case IMGFMT_ARGB: + return caps; + default: + break; + } + + return 0; +} + + +static void +uninit(void) +{ + if (!vo_config_count) return; + releaseGlContext(&gl_vinfo, &gl_context); + vo_uninit(); + free(map_image[0]); + map_image[0] = NULL; + sws_freeContext(sws); + sws = NULL; +} + + +static opt_t subopts[] = +{ + { "rows", OPT_ARG_INT, &matrix_rows, (opt_test_f) int_non_neg, 0 }, + { "cols", OPT_ARG_INT, &matrix_cols, (opt_test_f) int_non_neg, 0 }, + { NULL, 0, NULL, NULL, 0 }, +}; + + +static int preinit(const char *arg) +{ + if(!vo_init()) return -1; + + matrix_rows = MATRIX_ROWS; + matrix_cols = MATRIX_COLS; + + if(subopt_parse(arg, subopts) != 0) { + mp_msg(MSGT_VO, MSGL_FATAL, + "\n-vo matrixview command line help:\n" + "Example: mplayer -vo matrixview:cols=320:rows=240\n" + "\n" + "Options:\n" + "\n" + " cols=<12-320>\n" + " Specify the number of columns of the matrix view, default %d\n" + "\n" + " rows=<12-240>\n" + " Specify the number of rows of the matrix view, default %d\n" + "\n" + , + MATRIX_COLS, MATRIX_ROWS + ); + return -1; + } + + if(matrix_cols > 320) + { + matrix_cols = 320; + } + else if(matrix_cols < 12) + { + matrix_cols = 12; + } + + if(matrix_rows > 240) + { + matrix_rows = 240; + } + else if(matrix_rows < 12) + { + matrix_rows = 12; + } + + return 0; +} + + +static int control(uint32_t request, void *data, ...) +{ + switch (request) { + case VOCTRL_PAUSE: return (int_pause=1); + case VOCTRL_RESUME: return (int_pause=0); + case VOCTRL_QUERY_FORMAT: + return query_format(*((uint32_t*)data)); + case VOCTRL_ONTOP: + vo_ontop(); + return VO_TRUE; + case VOCTRL_FULLSCREEN: + vo_fullscreen(); + matrixview_reshape(vo_dwidth, vo_dheight); + return VO_TRUE; +#ifdef GL_WIN32 + case VOCTRL_BORDER: + vo_w32_border(); + return VO_TRUE; +#endif + case VOCTRL_GET_EQUALIZER: + { + va_list va; + int *value; + va_start(va, data); + value = va_arg(va, int *); + va_end(va); + if (strcasecmp(data, "contrast") == 0) + { + *value = eq_contrast; + } + else if (strcasecmp(data, "brightness") == 0) + { + *value = eq_brightness; + } + } + return VO_TRUE; + case VOCTRL_SET_EQUALIZER: + { + va_list va; + int value; + va_start(va, data); + value = va_arg(va, int); + va_end(va); + if (strcasecmp(data, "contrast") == 0) + { + contrast_set(value); + } + else if (strcasecmp(data, "brightness") == 0) + { + brightness_set(value); + } + } + return VO_TRUE; + } + return VO_NOTIMPL; +} +