Squashed 'third_party/eigen/' content from commit 61d72f6

Change-Id: Iccc90fa0b55ab44037f018046d2fcffd90d9d025
git-subtree-dir: third_party/eigen
git-subtree-split: 61d72f6383cfa842868c53e30e087b0258177257
diff --git a/demos/mandelbrot/mandelbrot.h b/demos/mandelbrot/mandelbrot.h
new file mode 100644
index 0000000..a687fd0
--- /dev/null
+++ b/demos/mandelbrot/mandelbrot.h
@@ -0,0 +1,71 @@
+// 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