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 "filterpr.h"
00031 #include <cmath>
00032
00033 PrFilter::PrFilter() : StatefullTransformationFilter()
00034 {
00035 }
00036
00037 PrFilter::~PrFilter()
00038 {
00039 }
00040
00041 ChannelFilter<unsigned char>* PrFilter::EmptyClone()
00042 {
00043 PrFilter *copy = new PrFilter();
00044 copy->SetSubChannel(GetSubChannel());
00045 return(copy);
00046 }
00047
00048 void PrFilter::OnStart(Channel<unsigned char>* source, Channel<unsigned char>* target, int x, int y)
00049 {
00050 height = target->GetHeight();
00051 width = target->GetWidth();
00052 }
00053
00054 void PrFilter::OnEnd(Channel<unsigned char>* source, Channel<unsigned char>* target, int x0, int y0, int x1, int y1)
00055 {
00056 int height = target->GetHeight();
00057 int width = target->GetWidth();
00058 for(int x=0;x<width;x++)
00059 for(int y=0;y<height;y++)
00060 source->Set(x,y,target->Get(x,y));
00061 }
00062
00063 bool PrFilter::OnRender(Channel<unsigned char>* source, Channel<unsigned char>* target, int x0, int y0, int x1, int y1)
00064 {
00065 int current, sum;
00066 for(int x=0;x<width;x++)
00067 for(int y=0;y<height;y++)
00068 {
00069 current = target->Get(x,y);
00070 sum = 0;
00071 if(x>0)
00072 sum+=source->Get(x-1,y);
00073 if(y>0)
00074 sum+=source->Get(x,y-1);
00075 if(x<width-1)
00076 sum+=source->Get(x+1,y);
00077 if(y<height-1)
00078 sum+=source->Get(x,y+1);
00079 sum /= 16;
00080 if(abs(sum) > 16)
00081 target->Set(x,y,(unsigned)(abs(current+(sum))%255));
00082 }
00083 return(true);
00084 }
00085