#include "filters.h"

QImage levelling(QImage img)
{
    double min,max;

    QRgb clr=img.pixel(0,0);
    min=max = 0.2125*qRed(clr) + 0.7154*qGreen(clr) + 0.0721*qBlue(clr);


    for(int i=0; i<img.width();i++)
        for(int j=0; j<img.height();j++)
        {
            clr=img.pixel(i,j);
            double c = 0.2125*qRed(clr) + 0.7154*qGreen(clr) + 0.0721*qBlue(clr);
            if (c>max) max=c;
            else
            if (c<min) min=c;
        }
    double k=255/(max-min);

    for(int i=0; i<img.width();i++)
        for(int j=0; j<img.height();j++)
        {
            clr=img.pixel(i,j);
            double c = 0.2125*qRed(clr) + 0.7154*qGreen(clr) + 0.0721*qBlue(clr);
            double etalon=(c-min)*k;
            double koef=etalon/c;
            int rr=(int)(koef*(double)qRed(clr));
            int gg=(int)(koef*(double)qGreen(clr));
            int bb=(int)(koef*(double)qBlue(clr));

            if (rr>255) rr=255;
            if (rr<0) rr=0;
            if (gg>255) gg=255;
            if (gg<0) gg=0;
            if (bb>255) bb=255;
            if (bb<0) bb=0;
             img.setPixel(i,j,qRgb(rr,gg,bb));



        }
    return img;
}

QImage levellingCh(QImage img)
{
    double minr,maxr,ming,maxg,minb,maxb;

    QRgb clr=img.pixel(0,0);
    minr=maxr = qRed(clr);
    ming=maxg = qGreen(clr);
    minb=maxb = qBlue(clr);


    for(int i=0; i<img.width();i++)
        for(int j=0; j<img.height();j++)
        {
            clr=img.pixel(i,j);

            if (qRed(clr)>maxr) maxr=qRed(clr);
            else
            if (qRed(clr)<minr) minr=qRed(clr);

            if (qGreen(clr)>maxg) maxg=qGreen(clr);
            else
            if (qGreen(clr)<ming) ming=qGreen(clr);

            if (qBlue(clr)>maxb) maxb=qBlue(clr);
            else
            if (qBlue(clr)<minb) minb=qBlue(clr);

        }
    double kr=255/(maxr-minr);
    double kg=255/(maxg-ming);
    double kb=255/(maxb-minb);

    for(int i=0; i<img.width();i++)
        for(int j=0; j<img.height();j++)
        {
            clr=img.pixel(i,j);

            double rr=(qRed(clr)-minr)*kr;
            double gg=(qGreen(clr)-ming)*kg;
            double bb=(qBlue(clr)-minb)*kb;



            if (rr>255) rr=255;
            if (rr<0) rr=0;
            if (gg>255) gg=255;
            if (gg<0) gg=0;
            if (bb>255) bb=255;
            if (bb<0) bb=0;
             img.setPixel(i,j,qRgb(rr,gg,bb));
        }
    return img;



}

struct Mys
{
    double c;
    int x;
    int y;

public:

};
bool operator<(Mys const & a, Mys const & b)
{
       return (a.c<b.c);
}


using namespace std;

QImage median(QImage img, int size)
{
    list <double> num;
    QImage tmp(img);
    tmp.fill(qRgb(0,0,0));
    QRgb clr;
    int width=img.width(),height=img.height();
    int smesh=(size-1)/2;

    for (int i=smesh;i<width-smesh;i++)
        for (int j=smesh;j<height-smesh;j++)
        {

            list <Mys> num;

            for (int k=0; k<=(size-1); k++)
                for (int l=0; l<=(size-1); l++)
                 {
                     Mys m;

                     clr=img.pixel(i-smesh+l,j-smesh+k);
                     m.c=0.2125*qRed(clr) + 0.7154*qGreen(clr) + 0.0721*qBlue(clr);
                     m.x=i-smesh+l;
                     m.y=j-smesh+k;
                     num.push_back(m);
                 }

            num.sort();
            int fin=size*size/2+1;
            int s=1;
            list<Mys>::iterator it;
            for(it = num.begin(); s!=fin ; ++it)
                   {
                       s++;
                   }
            Mys m=*it;
            tmp.setPixel(i,j, clr=img.pixel(m.x,m.y));
        }
return tmp;

}

QImage glass(QImage img, int s)
{
    int smesh=s;
    QImage tmp=img;
    int w=img.width()-smesh;
    int h=img.height()-smesh;
    for (int i = smesh; i < w; i++)
        for (int j = smesh; j < h; j++)
        {

            int x = i + (rand()%(2*(s+1)-1)-s);
            int y = j + (rand()%(2*(s+1)-1)-s);
            tmp.setPixel(i, j, img.pixel(x, y));
        }
    return tmp;

}


void greyWorld(QImage*  img)
{
    int R=0,G=0,B=0;
    double Avg;
    int w=img->width(),h=img->height();
    QRgb clr;

    for(int i=0; i<w;i++)
        for(int j=0; j<h;j++)
        {
            clr=img->pixel(i,j);
            R+=qRed(clr);
            G+=qGreen(clr);
            B+=qBlue(clr);
        }
    R=R/(w*h);
    G=G/(w*h);
    B=B/(w*h);
    Avg=(R+G+B)/(3);
    double RAvg=Avg/R,GAvg=Avg/G,BAvg=Avg/B;

    for(int i=0; i<w;i++)
        for(int j=0; j<h;j++)
        {
            clr=img->pixel(i,j);

            int rr=(int)(RAvg*(double)qRed(clr));
            int gg=(int)(GAvg*(double)qGreen(clr));
            int bb=(int)(BAvg*(double)qBlue(clr));

            if (rr>255) rr=255;
            if (rr<0) rr=0;
            if (gg>255) gg=255;
            if (gg<0) gg=0;
            if (bb>255) bb=255;
            if (bb<0) bb=0;
             img->setPixel(i,j,qRgb(rr,gg,bb));
        }
}

