00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "filtertest.h"
00031 #include <cmath>
00032
00033 TestFilter::TestFilter() : StatefullTransformationFilter()
00034 {
00035 r1 = new RenderObject(10,10);
00036 r2 = new RenderObject(50,100);
00037 r3 = new RenderObject(150,25);
00038 }
00039
00040 TestFilter::~TestFilter()
00041 {
00042 delete r1;
00043 delete r2;
00044 delete r3;
00045 }
00046
00047 ChannelFilter<unsigned char>* TestFilter::EmptyClone()
00048 {
00049 TestFilter *copy = new TestFilter();
00050 copy->SetSubChannel(StatefullTransformationFilter::GetSubChannel());
00051 return(copy);
00052 }
00053
00054 void TestFilter::OnStart(Channel<unsigned char>* source, Channel<unsigned char>* target, int x, int y)
00055 {
00056 r1->SetChannels(source,target);
00057 r2->SetChannels(source,target);
00058 r3->SetChannels(source,target);
00059 r1->Start();
00060 r2->Start(),
00061 r3->Start();
00062 }
00063
00064 void TestFilter::OnEnd(Channel<unsigned char>* source, Channel<unsigned char>* target, int x0, int y0, int x1, int y1)
00065 {
00066 r1->End();
00067 r2->End();
00068 r3->End();
00069 }
00070
00071 bool TestFilter::OnRender(Channel<unsigned char>* source, Channel<unsigned char>* target, int x0, int y0, int x1, int y1)
00072 {
00073 r1->Render();
00074 r1->Next();
00075 r2->Render();
00076 r2->Next();
00077 r3->Render();
00078 r3->Next();
00079 return(true);
00080 }
00081
00082 RenderObject::RenderObject(int x, int y)
00083 {
00084 posx = x;
00085 posy = y;
00086 }
00087
00088 RenderObject::~RenderObject()
00089 {
00090 }
00091
00092 void RenderObject::SetChannels(Channel<unsigned char>* source, Channel<unsigned char>* target)
00093 {
00094 this->source = source;
00095 this->target = target;
00096 }
00097
00098 void RenderObject::Next()
00099 {
00100 posy++;
00101 if(posy==target->GetHeight())
00102 posy = -49;
00103 }
00104
00105 void RenderObject::Render()
00106 {
00107 int x0 = posx+25;
00108 int y0 = posy+25;
00109 int height = target->GetHeight();
00110 for(int x=posx<0?0:posx;x<posx+50;x++)
00111 for(int y=posy<0?0:posy;y<posy+50 && y<height;y++)
00112 {
00113 if(625<=(x-x0)*(x-x0)+(y-y0)*(y-y0))
00114 target->Set(x,y,source->Get(x,y));
00115 else
00116 {
00117 int ky = (int)(y0+tanh((y-y0)/15.0)*15.0);
00118 int kx = (int)(x0+tanh((x-x0)/15.0)*15.0);
00119 source->Normalize(&kx,&ky);
00120 target->Set(x,y,source->Get(kx,ky));
00121 }
00122 }
00123 }
00124
00125 void RenderObject::Start()
00126 {
00127 }
00128
00129 void RenderObject::End()
00130 {
00131 for(int x=posx<0?0:posx;x<posx+50;x++)
00132 for(int y=posy<0?0:posy;y<posy+50 && y<target->GetHeight();y++)
00133 target->Set(x,y,source->Get(x,y));
00134 }
00135
00136
00137