+ , width(width_)
+ , height(height_)
+{
+ initialize(fun);
+}
+
+//! Destructeur.
+DrawingWindow::~DrawingWindow()
+{
+ delete thread;
+ delete painter;
+ delete image;
+}
+
+//! Change la couleur de dessin.
+/*!
+ * La couleur est un entier, tel que retourné par getPointColor.
+ * Normalement de la forme #00RRGGBB.
+ *
+ * \param color couleur
+ *
+ * \see setColor(const char *), setColor(float, float, float),
+ * setBgColor(unsigned int),
+ * getPointColor
+ */
+void DrawingWindow::setColor(unsigned int color)
+{
+ setColor(QColor::fromRgb(color));
+}
+
+//! Change la couleur de dessin.
+/*!
+ * Le nom de couleur est de la forme "black", "white", "red", "blue", ...
+ *
+ * \param name nom de couleur
+ *
+ * \see setColor(unsigned int), setColor(float, float, float),
+ * setBgColor(const char *)
+ * \see http://www.w3.org/TR/SVG/types.html#ColorKeywords
+ */
+void DrawingWindow::setColor(const char *name)
+{
+ setColor(QColor(name));
+}
+
+//! Change la couleur de dessin.
+/*!
+ * Les composantes de rouge, vert et bleu de la couleur doivent être
+ * compris entre 0 et 1. Si le trois composantes sont à 0, on obtient
+ * du noir; si les trois composantes sont à 1, on obtient du blanc.
+ *
+ * \param red composante de rouge
+ * \param green composante de vert
+ * \param blue composante de bleu
+ *
+ * \see setColor(unsigned int), setColor(const char *),
+ * setBgColor(float, float, float)
+ */
+void DrawingWindow::setColor(float red, float green, float blue)
+{
+ setColor(QColor::fromRgbF(red, green, blue));
+}
+
+//! Change la couleur de fond.
+/*!
+ * \param color couleur
+ *
+ * \see setBgColor(const char *), setBgColor(float, float, float),
+ * setColor(unsigned int),
+ * getPointColor,
+ * clearGraph
+ */
+void DrawingWindow::setBgColor(unsigned int color)
+{
+ setBgColor(QColor::fromRgb(color));
+}
+
+//! Change la couleur de fond.
+/*!
+ * \param name nom de couleur
+ *
+ * \see setBgColor(unsigned int), setBgColor(float, float, float),
+ * setColor(const char *),
+ * clearGraph
+ * \see http://www.w3.org/TR/SVG/types.html#ColorKeywords
+ */
+void DrawingWindow::setBgColor(const char *name)
+{
+ setBgColor(QColor(name));
+}
+
+//! Change la couleur de fond.
+/*!
+ * \param red composante de rouge
+ * \param green composante de vert
+ * \param blue composante de bleu
+ *
+ * \see setBgColor(unsigned int), setBgColor(const char *),
+ * setColor(float, float, float),
+ * clearGraph
+ */
+void DrawingWindow::setBgColor(float red, float green, float blue)
+{
+ setBgColor(QColor::fromRgbF(red, green, blue));
+}
+
+//! Change l'épaisseur du pinceau
+/*!
+ * Le pinceau à une épaisseur de 1 par défaut.
+ *
+ * \param width épaisseur du pinceau
+ */
+void DrawingWindow::setPenWidth(int width)
+{
+ QPen pen(painter->pen());
+ pen.setWidth(width);
+ painter->setPen(pen);
+}
+
+//! Retourne la fonte courante utilisée pour dessiner du texte.
+/*!
+ * \see QFont, setFont
+ */
+const QFont &DrawingWindow::getFont() const
+{
+ return painter->font();
+}
+
+//! Applique une nouvelle font pour dessiner du texte.
+/*!
+ * \see QFont, getFont
+ */
+void DrawingWindow::setFont(const QFont &font)
+{
+ painter->setFont(font);
+}
+
+//! Active ou non l'antialiasing.
+/*!
+ * Permet de lisser le dessin.
+ * Fonctionnalité désactivée par défaut.
+ *
+ * \param state état de l'antialiasing
+ *
+ * \bug expérimental
+ */
+void DrawingWindow::setAntialiasing(bool state)
+{
+ painter->setRenderHint(QPainter::Antialiasing, state);
+}
+
+//! Efface la fenêtre.
+/*!
+ * La fenêtre est effacée avec la couleur de fond courante.
+ *
+ * \see setBgColor
+ */
+void DrawingWindow::clearGraph()
+{
+ safeLock(imageMutex);
+ painter->fillRect(image->rect(), getBgColor());
+ dirty();
+ safeUnlock(imageMutex);
+}
+
+//! Dessine un point.
+/*!
+ * Dessine un point (pixel) aux coordonnées (x, y), avec la couleur de
+ * dessin courante.
+ *
+ * \param x, y coordonnées du point
+ *
+ * \see setColor
+ */
+void DrawingWindow::drawPoint(int x, int y)
+{
+ safeLock(imageMutex);
+ painter->drawPoint(x, y);
+ dirty(x, y);
+ safeUnlock(imageMutex);
+}
+
+//! Dessine un segment.
+/*!
+ * Dessine un segement de droite entre les coordonnées (x1, y1) et
+ * (x2, y2), avec la couleur de dessin courante.
+ *
+ * \param x1, y1 coordonnées d'une extrémité du segment
+ * \param x2, y2 coordonnées de l'autre extrémité du segment
+ *
+ * \see setColor
+ */
+void DrawingWindow::drawLine(int x1, int y1, int x2, int y2)
+{
+ if (x1 == x2 && y1 == y2) {
+ drawPoint(x1, y1);
+ } else {
+ safeLock(imageMutex);
+ painter->drawLine(x1, y1, x2, y2);
+ dirty(x1, y1, x2, y2);
+ safeUnlock(imageMutex);
+ }
+}
+
+//! Dessine un rectangle.
+/*!
+ * Dessine le rectangle parallèle aux axes et défini par les
+ * coordonnées de deux sommets opposés (x1, y1) et (x2, y2). Utilise
+ * la couleur de dessin courante.
+ *
+ * \param x1, y1 coordonnées d'un sommet du rectangle
+ * \param x2, y2 coordonnées du sommet opposé du rectangle
+ *
+ * \see fillRect, setColor
+ */
+void DrawingWindow::drawRect(int x1, int y1, int x2, int y2)
+{
+ if (x1 == x2 && y1 == y2) {
+ drawPoint(x1, y1);
+ } else {
+ QRect r;
+ r.setCoords(x1, y1, x2 - 1, y2 - 1);
+ r = r.normalized();
+ safeLock(imageMutex);
+ painter->drawRect(r);
+ r.adjust(0, 0, 1, 1);
+ dirty(r);
+ safeUnlock(imageMutex);
+ }
+}
+
+//! Dessine un rectangle plein.
+/*!
+ * Dessine le rectangle plein parallèle aux axes et défini par les
+ * coordonnées de deux sommets opposés (x1, y1) et (x2, y2). Utilise
+ * la couleur de dessin courante.
+ *
+ * \param x1, y1 coordonnées d'un sommet du rectangle
+ * \param x2, y2 coordonnées du sommet opposé du rectangle
+ *
+ * \see drawRect, setColor
+ */
+void DrawingWindow::fillRect(int x1, int y1, int x2, int y2)
+{
+ painter->setBrush(getColor());
+ drawRect(x1, y1, x2, y2);
+ painter->setBrush(Qt::NoBrush);
+}
+
+//! Dessine un cercle.
+/*!
+ * Dessine un cercle de centre (x, y) et de rayon r. Utilise la
+ * couleur de dessin courante.
+ *
+ * \param x, y coordonnées du centre du cercle
+ * \param r rayon du cercle
+ *
+ * \see fillCircle, setColor
+ */
+void DrawingWindow::drawCircle(int x, int y, int r)
+{
+ QRect rect;
+ rect.setCoords(x - r, y - r, x + r - 1, y + r - 1);
+ safeLock(imageMutex);
+ painter->drawEllipse(rect);
+ rect.adjust(0, 0, 1, 1);
+ dirty(rect);
+ safeUnlock(imageMutex);
+}
+
+//! Dessine un disque.
+/*!
+ * Dessine un disque (cercle plein) de centre (x, y) et de rayon r.
+ * Utilise la couleur de dessin courante.
+ *
+ * \param x, y coordonnées du centre du disque
+ * \param r rayon du disque
+ *
+ * \see drawCircle, setColor
+ */
+void DrawingWindow::fillCircle(int x, int y, int r)
+{
+ painter->setBrush(getColor());
+ drawCircle(x, y, r);
+ painter->setBrush(Qt::NoBrush);
+}
+
+//! Dessine un triangle.
+/*!
+ * Dessine un triangle défini par les coordonnées de ses sommets:
+ * (x1, y1), (x2, y2) et (x3, y3). Utilise la couleur de dessin
+ * courante.
+ *
+ * \param x1, y1 coordonnées du premier sommet du triangle
+ * \param x2, y2 coordonnées du deuxième sommet du triangle
+ * \param x3, y3 coordonnées du troisième sommet du triangle
+ *
+ * \see fillTriangle, setColor
+ */
+void DrawingWindow::drawTriangle(int x1, int y1, int x2, int y2, int x3, int y3)
+{
+ QPolygon poly(3);
+ poly.putPoints(0, 3, x1, y1, x2, y2, x3, y3);
+ safeLock(imageMutex);
+ painter->drawConvexPolygon(poly);
+ dirty(poly.boundingRect());
+ safeUnlock(imageMutex);
+}
+
+//! Dessine un triangle plein.
+/*!
+ * Dessine un triangle plein défini par les coordonnées de ses
+ * sommets: (x1, y1), (x2, y2) et (x3, y3). Utilise la couleur de
+ * dessin courante.
+ *
+ * \param x1, y1 coordonnées du premier sommet du triangle
+ * \param x2, y2 coordonnées du deuxième sommet du triangle
+ * \param x3, y3 coordonnées du troisième sommet du triangle
+ *
+ * \see drawTriangle, setColor
+ */
+void DrawingWindow::fillTriangle(int x1, int y1, int x2, int y2, int x3, int y3)
+{
+ painter->setBrush(getColor());
+ drawTriangle(x1, y1, x2, y2, x3, y3);
+ painter->setBrush(Qt::NoBrush);
+}
+
+//! Écrit du texte.
+/*!
+ * Écrit le texte text, aux coordonnées (x, y) et avec les paramètres
+ * d'alignement flags. Le texte est écrit avec la couleur de dessin
+ * courante. Les flags sont une combinaison (ou binaire) de
+ * Qt::AlignLeft, Qt::AligneRight, Qt::AlignHCenter, Qt::AlignTop,
+ * Qt::AlignBottom, Qt::AlignVCenter, Qt::AlignCenter. Par défaut, le
+ * texte est aligné en haut à gauche.
+ *
+ * \param x, y coordonnées du texte
+ * \param text texte à écrire
+ * \param flags paramètres d'alignement
+ *
+ * \see drawText(int, int, const std::string &, int)
+ * \see drawTextBg, setColor
+ * \see QPainter::drawText
+ */
+void DrawingWindow::drawText(int x, int y, const char *text, int flags)
+{
+ safeLock(syncMutex);
+ if (!terminateThread) {
+ qApp->postEvent(this, new DrawTextEvent(x, y, text, flags));
+ syncCondition.wait(&syncMutex);
+ }
+ safeUnlock(syncMutex);
+}
+
+//! Écrit du texte.
+/*!
+ * \see drawText(int, int, const char *, int)
+ */
+void DrawingWindow::drawText(int x, int y, const std::string &text, int flags)
+{
+ drawText(x, y, text.c_str(), flags);
+}
+
+//! Écrit du texte sur fond coloré.
+/*!
+ * Écrit du texte comme drawText, mais l'arrière-plan est coloré avec
+ * la couleur de fond courante.
+ *
+ * \param x, y coordonnées du texte
+ * \param text texte à écrire
+ * \param flags paramètres d'alignement
+ *
+ * \see drawTextBg(int, int, const std::string &, int)
+ * \see drawText, setColor, setColorBg
+ */
+void DrawingWindow::drawTextBg(int x, int y, const char *text, int flags)
+{
+ painter->setBackgroundMode(Qt::OpaqueMode);
+ drawText(x, y, text, flags);
+ painter->setBackgroundMode(Qt::TransparentMode);
+}
+
+//! Écrit du texte sur fond coloré.
+/*!
+ * \see drawTextBg(int, int, const char *, int)
+ */
+void DrawingWindow::drawTextBg(int x, int y, const std::string &text, int flags)
+{
+ drawTextBg(x, y, text.c_str(), flags);
+}
+
+//! Retourne la couleur d'un pixel.
+/*!
+ * Retourne la couleur du pixel de coordonnées (x, y). La valeur
+ * retournée peut servir de paramètres à setColor(unsigned int) ou
+ * setBgColor(unsigned int).
+ *
+ * \param x, y coordonnées du pixel
+ * \return couleur du pixel
+ *
+ * \see setColor(unsigned int), setBgColor(unsigned int)
+ */
+unsigned int DrawingWindow::getPointColor(int x, int y) const