Hauptseite   Klassenhierarchie   Auflistung der Dateien  

filtercopyblock.cpp

00001 /**********************************************************************************
00002 * Copyright (c) 2003, Christoph Rueegg <opendev@cdrnet.ch> and Matthias Bader     *
00003 * Partially based on ideas of Tim Weyrich <weyrich@inf.ethz.ch>                   *
00004 * and/or the Swiss Federal Institute of Technology http://www.ethz.ch             *
00005 * All rights reserved.                                                            *
00006 *                                                                                 *
00007 * Project Website: http://www.cdrnet.net/projects/painter/                        *
00008 *                                                                                 *
00009 * Redistribution and use in source and binary forms, with or without modification,*
00010 * are permitted provided that the following conditions are met:                   *
00011 *                                                                                 *
00012 * 1. Redistributions of source code must retain the above copyright notice,       *
00013 * this list of conditions and the following disclaimer.                           *
00014 *                                                                                 *
00015 * 2. Redistributions in binary form must reproduce the above copyright notice,    *
00016 * this list of conditions and the following disclaimer in the documentation       *
00017 * and/or other materials provided with the distribution.                          *
00018 *                                                                                 *
00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"     *
00020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE       *
00021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE      *
00022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE        *
00023 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR             *
00024 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF            *
00025 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS        *
00026 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN         *
00027 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)         *
00028 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF          *
00029 * THE POSSIBILITY OF SUCH DAMAGE.                                                 *
00030 **********************************************************************************/
00031 
00032 #include "filtercopyblock.h"
00033 
00034 CopyBlockFilter::CopyBlockFilter() : ChannelSelectBoxFilter()
00035 {
00036   selected = false;
00037   topleftx = toplefty = 2;
00038   bottomrightx = bottomrighty = 22;
00039 }
00040 
00041 CopyBlockFilter::~CopyBlockFilter()
00042 {
00043 }
00044 
00045 void CopyBlockFilter::OnAction(const int topleftx, const int toplefty, const int bottomrightx, const int bottomrighty)
00046 {
00047   if(selected)
00048     InvertArea(this->topleftx,this->toplefty,this->bottomrightx,this->bottomrighty);
00049   selected = true;
00050   this->topleftx = topleftx;
00051   this->toplefty = toplefty;
00052   this->bottomrightx = bottomrightx;
00053   this->bottomrighty = bottomrighty;
00054   InvertArea(topleftx,toplefty,bottomrightx,bottomrighty);
00055 }
00056 
00057 ChannelFilter<unsigned char>* CopyBlockFilter::EmptyClone()
00058 {
00059   CopyBlockFilter *copy = new CopyBlockFilter();
00060   copy->SetSubChannel(ChannelSelectBoxFilter::GetSubChannel());
00061   return(copy);
00062 }
00063 
00064 void CopyBlockFilter::OnMouseEvent(const int button, const int state, int x, int y)
00065 {
00066   if(selected && button==0 && state==0)
00067   {
00068     InvertArea(topleftx,toplefty,bottomrightx,bottomrighty);
00069     ChannelSelectBoxFilter::Normalize(&x,&y);
00070     int diffx = x - topleftx;
00071     int diffy = y - toplefty;
00072     int width = ChannelSelectBoxFilter::GetWidth();
00073     int height = ChannelSelectBoxFilter::GetHeight();
00074     int xi, yi;
00075     if(diffy>0 || diffy==0 && diffx<0)
00076     {
00077       yi = bottomrighty-1+diffy<height ? yi = bottomrighty-1 : height-diffy-1;
00078       for(;yi>=toplefty; yi--)
00079         for(xi = topleftx; xi<bottomrightx && xi+diffx<width; xi++)
00080           ChannelSelectBoxFilter::Set(xi+diffx,yi+diffy,ChannelSelectBoxFilter::Get(xi,yi));
00081     }
00082     if(diffy<0 || diffy==0 && diffx>0)
00083     {
00084       for(yi = toplefty; yi<bottomrighty && yi+diffy<height; yi++)
00085       {
00086         xi = bottomrightx-1+diffx<width ? bottomrightx-1 : width-diffx-1;
00087         for(;xi>=topleftx; xi--)
00088           ChannelSelectBoxFilter::Set(xi+diffx,yi+diffy,ChannelSelectBoxFilter::Get(xi,yi));
00089       }
00090     }
00091   }
00092   if(selected && button==0 && state==1)
00093   {
00094     selected = false;
00095   }
00096   if(!selected || button != 0)
00097   {
00098     ChannelSelectBoxFilter::OnMouseEvent(button,state,x,y);
00099   }
00100 }
00101 
00102 void CopyBlockFilter::ResetChannel()
00103 {
00104   if(selected)
00105   {
00106     InvertArea(this->topleftx,this->toplefty,this->bottomrightx,this->bottomrighty);
00107     selected = false;
00108   }
00109   ChannelSelectBoxFilter::ResetChannel();
00110 }
00111 

Erzeugt am Fri Jan 31 15:27:35 2003 für OOP Miniprojekt von doxygen1.3-rc2