// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

#ifndef MANDELBROT_H
#define MANDELBROT_H

#include <Eigen/Core>
#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
