package cx.fbn.nevernote.gui; import com.trolltech.qt.core.QBuffer; import com.trolltech.qt.core.QByteArray; import com.trolltech.qt.core.QIODevice; import com.trolltech.qt.core.QMutex; import com.trolltech.qt.core.QObject; import com.trolltech.qt.core.QSize; import com.trolltech.qt.core.Qt.AspectRatioMode; import com.trolltech.qt.core.Qt.Orientation; import com.trolltech.qt.core.Qt.ScrollBarPolicy; import com.trolltech.qt.core.Qt.TransformationMode; import com.trolltech.qt.gui.QImage; import com.trolltech.qt.gui.QImage.Format; import com.trolltech.qt.gui.QPainter; import com.trolltech.qt.webkit.QWebPage; import cx.fbn.nevernote.Global; import cx.fbn.nevernote.sql.DatabaseConnection; import cx.fbn.nevernote.threads.ThumbnailRunner; import cx.fbn.nevernote.utilities.ApplicationLogger; import cx.fbn.nevernote.utilities.ListManager; public class Thumbnailer extends QObject { public QWebPage page = new QWebPage(); public QImage image; public QPainter painter = new QPainter(); public QMutex mutex; public String guid; private final QSize size; private int zoom; private QBuffer buffer; private final ApplicationLogger logger; private final DatabaseConnection conn; public Thumbnailer(ApplicationLogger logger, DatabaseConnection conn, ListManager l, ThumbnailRunner r) { mutex = new QMutex(); zoom = 1; this.logger = logger; page = new QWebPage(); this.conn = conn; size = new QSize(1024,768); // size = new QSize(); // size.setWidth(Global.largeThumbnailSize.width()); // size.setHeight(Global.largeThumbnailSize.height()); image = new QImage(size, Format.Format_ARGB32_Premultiplied); page.setViewportSize(size); page.loadFinished.connect(this, "loadFinished(Boolean)"); buffer = new QBuffer(); mutex.unlock(); } public void loadContent(String guid, QByteArray html, int zoom) { this.zoom = zoom; this.guid = guid; page.mainFrame().setScrollBarPolicy(Orientation.Horizontal, ScrollBarPolicy.ScrollBarAlwaysOff); page.mainFrame().setScrollBarPolicy(Orientation.Vertical, ScrollBarPolicy.ScrollBarAlwaysOff); page.mainFrame().setContent(html); } @SuppressWarnings("unused") private String loadFinished(Boolean ok) { if (!ok) { mutex.unlock(); return null; } // page.setViewportSize(page.mainFrame().contentsSize()); // image = new QImage(size, Format.Format_ARGB32); logger.log(logger.EXTREME, "Creating painter"); painter = new QPainter(); logger.log(logger.EXTREME, "Beginning painter"); painter.begin(image); page.mainFrame().setZoomFactor(new Double(zoom)); if (painter.paintEngine() == null) { logger.log(logger.EXTREME, "Bad paint engine. Aborting"); painter.end(); mutex.unlock(); return null; } logger.log(logger.EXTREME, "Rendering image"); page.mainFrame().render(painter); logger.log(logger.EXTREME, "Closing painter"); painter.end(); if (image.isNull()) { logger.log(logger.EXTREME, "Error rendering thumbnail image. Aborting"); mutex.unlock(); return null; } logger.log(logger.EXTREME, "Saving image isNull=" +image.isNull() +" Size=" +image.size()); logger.log(logger.EXTREME, "Adding image to runner"); saveImage(); logger.log(logger.EXTREME, "Unlocking thumbnailer"); mutex.unlock(); return guid; } private void saveImage() { logger.log(logger.EXTREME, "Image found "+guid); logger.log(logger.EXTREME, "Opening buffer"); if (buffer == null) buffer = new QBuffer(); if (!buffer.open(QIODevice.OpenModeFlag.ReadWrite)) { logger.log(logger.EXTREME, "Failure to open buffer. Aborting."); mutex.unlock(); return; } logger.log(logger.EXTREME, "Filling buffer"); QImage img = image.scaled(Global.largeThumbnailSize, AspectRatioMode.KeepAspectRatio, TransformationMode.SmoothTransformation); if (!img.save(buffer, "PNG")) { logger.log(logger.EXTREME, "Failure to write to buffer. Aborting."); mutex.unlock(); return; } buffer.close(); logger.log(logger.EXTREME, "Updating database"); QByteArray b = buffer.buffer(); conn.getNoteTable().setThumbnail(guid, b); conn.getNoteTable().setThumbnailNeeded(guid, false); } }