00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "inkblotVideoCursor.h"
00016 #include "config_movies.h"
00017
00018 TypeHandle InkblotVideoCursor::_type_handle;
00019
00020
00021
00022
00023
00024
00025 struct color {
00026 int r,g,b;
00027 };
00028
00029 static color colormap[17] = {
00030 { 255,0,0 },
00031 { 255,255,0 },
00032 { 0,255,0 },
00033 { 0,255,255 },
00034 { 0,0,255 },
00035 { 0,0,0 },
00036 { 255,0,0 },
00037 { 255,255,0 },
00038 { 0,255,0 },
00039 { 0,255,255 },
00040 { 0,0,255 },
00041 { 0,0,0 },
00042 { 255,0,0 },
00043 { 255,255,0 },
00044 { 0,255,0 },
00045 { 0,255,255 },
00046 { 0,0,255 },
00047 };
00048
00049
00050
00051
00052
00053
00054 InkblotVideoCursor::
00055 InkblotVideoCursor(InkblotVideo *src) :
00056 MovieVideoCursor(src)
00057 {
00058 _size_x = src->_specified_x;
00059 _size_y = src->_specified_y;
00060 _num_components = 3;
00061 _fps = src->_specified_fps;
00062 int padx = _size_x + 2;
00063 int pady = _size_y + 2;
00064 _cells = new unsigned char[padx * pady];
00065 _cells2 = new unsigned char[padx * pady];
00066 memset(_cells, 255, padx * pady);
00067 memset(_cells2, 255, padx * pady);
00068 _can_seek = true;
00069 _can_seek_fast = false;
00070 _current_frame = 0;
00071 _last_frame = -1;
00072 }
00073
00074
00075
00076
00077
00078
00079 InkblotVideoCursor::
00080 ~InkblotVideoCursor() {
00081 delete[] _cells;
00082 delete[] _cells2;
00083 }
00084
00085
00086
00087
00088
00089
00090 bool InkblotVideoCursor::
00091 set_time(double time, int loop_count) {
00092 int frame = (int)(time / _fps);
00093 if (frame == _current_frame) {
00094 return false;
00095 }
00096
00097 _current_frame = frame;
00098 return true;
00099 }
00100
00101
00102
00103
00104
00105
00106 PT(MovieVideoCursor::Buffer) InkblotVideoCursor::
00107 fetch_buffer() {
00108 PT(Buffer) buffer = get_standard_buffer();
00109
00110 int padx = size_x() + 2;
00111 int pady = size_y() + 2;
00112
00113 if (_current_frame < _last_frame) {
00114
00115 memset(_cells, 255, padx * pady);
00116 memset(_cells2, 255, padx * pady);
00117 _last_frame = 0;
00118 }
00119
00120 while (_last_frame <= _current_frame) {
00121 ++_last_frame;
00122 for (int y=1; y<pady-1; y++) {
00123 for (int x=1; x<padx-1; x++) {
00124 int tot =
00125 _cells[(x+1)+(y+1)*padx] +
00126 _cells[(x+1)+(y+0)*padx] +
00127 _cells[(x+1)+(y-1)*padx] +
00128 _cells[(x+0)+(y+1)*padx] +
00129 _cells[(x+0)+(y+0)*padx] +
00130 _cells[(x+0)+(y-1)*padx] +
00131 _cells[(x-1)+(y+1)*padx] +
00132 _cells[(x-1)+(y+0)*padx] +
00133 _cells[(x-1)+(y-1)*padx];
00134 _cells2[x + y*padx] = (tot/9)+3;
00135 }
00136 }
00137 unsigned char *t = _cells;
00138 _cells = _cells2;
00139 _cells2 = t;
00140 }
00141
00142 unsigned char *data = buffer->_block;
00143 for (int y=1; y<pady - 1; y++) {
00144 for (int x=1; x<padx - 1; x++) {
00145 int val = _cells[x + y*padx];
00146 color &c1 = colormap[(val>>4)+0];
00147 color &c2 = colormap[(val>>4)+1];
00148 int lerp = val & 15;
00149 data[0] = (c1.b * (16-lerp) + c2.b * lerp) / 16;
00150 data[1] = (c1.g * (16-lerp) + c2.g * lerp) / 16;
00151 data[2] = (c1.r * (16-lerp) + c2.r * lerp) / 16;
00152 data += 3;
00153 }
00154 }
00155
00156 return buffer;
00157 }
00158