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
00031
00032 #include "filterselect.h"
00033
00034 ChannelSelectBoxFilter::ChannelSelectBoxFilter() : ChannelFilter<unsigned char>()
00035 {
00036 active = false;
00037 x0 = y0 = x1 = y1 = 0;
00038 }
00039
00040 ChannelSelectBoxFilter::~ChannelSelectBoxFilter()
00041 {
00042 }
00043
00044 void ChannelSelectBoxFilter::OnMouseEvent(const int button, const int state, int x, int y)
00045 {
00046 bool activity = active;
00047 if(!activity && button==0 && state==0)
00048 {
00049 active = true;
00050 ChannelFilter<unsigned char>::Normalize(&x,&y);
00051 x0 = x1 = x;
00052 y0 = y1 = y;
00053 }
00054 if(activity && button==0 && state==1)
00055 {
00056 active = false;
00057 x1 = x;
00058 y1 = y;
00059 ChannelFilter<unsigned char>::Normalize(&x0,&y0,&x1,&y1);
00060 InvertArea(x0,y0,x1,y1);
00061 OnAction(x0,y0,x1,y1);
00062 }
00063 }
00064
00065 void ChannelSelectBoxFilter::OnMotionEvent(int x, int y)
00066 {
00067 ChannelFilter<unsigned char>::Normalize(&x,&y);
00068 if(active)
00069 {
00070 InvertArea(x0,y0,x1,y1,x,y);
00071 x1 = x;
00072 y1 = y;
00073 }
00074 }
00075
00076 unsigned char ChannelSelectBoxFilter::Get(const int x, const int y)
00077 {
00078 return(active&&(x>=x0&&x<=x1||x>=x1&&x<=x0)&&(y>=y0&&y<=y1||y>=y1&&y<=y0)
00079 ? InvertPixel(ChannelFilter<unsigned char>::Get(x,y)) : ChannelFilter<unsigned char>::Get(x,y));
00080 }
00081
00082 void ChannelSelectBoxFilter::Set(const int x, const int y, const unsigned char val)
00083 {
00084 if(active&&(x>=x0&&x<=x1||x>=x1&&x<=x0)&&(y>=y0&&y<=y1||y>=y1&&y<=y0))
00085 ChannelFilter<unsigned char>::Set(x,y,InvertPixel(val));
00086 else
00087 ChannelFilter<unsigned char>::Set(x,y,val);;
00088 }
00089
00090 inline unsigned char ChannelSelectBoxFilter::InvertPixel(unsigned char val)
00091 {
00092 return(255 - val);
00093 }
00094
00095 void ChannelSelectBoxFilter::InvertArea(int x0, int y0, int x1, int y1)
00096 {
00097 ChannelFilter<unsigned char>::Normalize(&x0,&y0,&x1,&y1);
00098 for(int x=x0;x<x1;x++)
00099 for(int y=y0;y<y1;y++)
00100 ChannelFilter<unsigned char>::Set(x,y,InvertPixel(ChannelFilter<unsigned char>::Get(x,y)));
00101
00102 }
00103 void ChannelSelectBoxFilter::InvertArea(int x0, int y0, int x1a, int y1a, int x1b, int y1b)
00104 {
00105 InvertArea(x0,y1a,x1a,y1b);
00106 InvertArea(x1a,y0,x1b,y1b);
00107 }
00108
00109 void ChannelSelectBoxFilter::ResetChannel()
00110 {
00111 if(active)
00112 {
00113 InvertArea(x0,y0,x1,y1);
00114 active = false;
00115 }
00116 ChannelFilter<unsigned char>::ResetChannel();
00117 }