// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// Eigen is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// Alternatively, you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License and a copy of the GNU General Public License along with
// Eigen. If not, see <http://www.gnu.org/licenses/>.

#ifndef MANDELBROT_H
#define MANDELBROT_H

#include <Eigen/Array>
#include <QtGui/QApplication>
#include <QtGui/QWidget>
#include <QtCore/QThread>

class MandelbrotWidget;

class MandelbrotThread : public QThread
{
    friend class MandelbrotWidget;
    MandelbrotWidget *widget;
    long long total_iter;
    int id, max_iter;
    bool single_precision;

  public:
    MandelbrotThread(MandelbrotWidget *w, int i) : widget(w), id(i) {}
    void run();
    template<typename Real> void render(int img_width, int img_height);
};

class MandelbrotWidget : public QWidget
{
    Q_OBJECT

    friend class MandelbrotThread;
    Eigen::Vector2d center;
    double xradius;
    int size;
    unsigned char *buffer;
    QPoint lastpos;
    int draft;
    MandelbrotThread **threads;
    int threadcount;

  protected:
    void resizeEvent(QResizeEvent *);
    void paintEvent(QPaintEvent *);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

  public:
    MandelbrotWidget() : QWidget(), center(0,0), xradius(2),
                         size(0), buffer(0), draft(16)
    {
      setAutoFillBackground(false);
      threadcount = QThread::idealThreadCount();
      threads = new MandelbrotThread*[threadcount];
      for(int th = 0; th < threadcount; th++) threads[th] = new MandelbrotThread(this, th);
    }
    ~MandelbrotWidget()
    {
      if(buffer) delete[]buffer;
      for(int th = 0; th < threadcount; th++) delete threads[th];
      delete[] threads;
    }
};

#endif // MANDELBROT_H
