diff options
author | No'am Rosenthal <noam.rosenthal@nokia.com> | 2009-11-28 16:16:12 -0800 |
---|---|---|
committer | No'am Rosenthal <noam.rosenthal@nokia.com> | 2009-11-28 16:16:12 -0800 |
commit | 1eec369503511779f6204ccff1cbd7010f60e65c (patch) | |
tree | fbf27ef76aab993b455c7b6554a16594d465c8c3 | |
parent | f056bf3efa4dbfc4e43394c6c1b3951193b98401 (diff) |
Added the Deconstructive HTML dojo
-rw-r--r-- | deconstructive/deconstructive.pro | 10 | ||||
-rw-r--r-- | deconstructive/example.html | 76 | ||||
-rw-r--r-- | deconstructive/main.cpp | 122 |
3 files changed, 208 insertions, 0 deletions
diff --git a/deconstructive/deconstructive.pro b/deconstructive/deconstructive.pro new file mode 100644 index 0000000..934a3e0 --- /dev/null +++ b/deconstructive/deconstructive.pro @@ -0,0 +1,10 @@ +# ------------------------------------------------- +# Project created by QtCreator 2009-11-28T10:31:10 +# ------------------------------------------------- +QT += network \ + webkit +TARGET = deconstructive +TEMPLATE = app +SOURCES += main.cpp +HEADERS += +OTHER_FILES += example.html diff --git a/deconstructive/example.html b/deconstructive/example.html new file mode 100644 index 0000000..06bd471 --- /dev/null +++ b/deconstructive/example.html @@ -0,0 +1,76 @@ +<html> + <!-- +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the Graphics Dojo project on Qt Labs. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 or 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ +--> + <head> + <style> + div { display: block; margin-left:0px; width: 275px;} + input[type="text"] { + -webkit-border-radius: 10px; + padding: 3px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#99cc99), to(#88ee88)); + color: white; + -webkit-text-stroke: 1px rgba(0,0,0,0.4); + font-size: 24px; + margin:0px; + border-width: 2px; + border-color: rgba(0,0,0,0.5); + } + </style> + <script> + function renderElement(selector, onLoad) { + var img = new Image; + img.onload = function() { onLoad(img); }; + img.src = "render:"+escape(selector)+"?"+(new Date().getTime()); + } + function rerender() + { + var canvas = document.getElementById("canvas"); + renderElement('input[type="text"]', function(img) { + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext("2d"); + ctx.save(); + ctx.fillStyle = "white"; + ctx.globalAlpha = 1; + ctx.fillRect(0,0,canvas.width,canvas.height); + ctx.globalAlpha = 0.5; + ctx.translate(canvas.width,canvas.height); + ctx.rotate(Math.PI); + ctx.drawImage(img,0,0); + ctx.restore(); + document.getElementById("image").src = img.src; + }); + } + </script> + </head> + <body onload="document.getElementById('input').focus()" /> + <div> + <form> + Type something: <input type="text" id="input" onkeydown="setTimeout(rerender,0)"/> + <canvas id="canvas" width="320" height=240"></canvas> + </form> + </div> + </body> +</html> diff --git a/deconstructive/main.cpp b/deconstructive/main.cpp new file mode 100644 index 0000000..46ed597 --- /dev/null +++ b/deconstructive/main.cpp @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the Graphics Dojo project on Qt Labs. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 or 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include <QtGui/QApplication> +#include <QWebView> +#include <QWebElement> +#include <QWebPage> +#include <QWebFrame> +#include <QNetworkReply> +#include <QNetworkAccessManager> +#include <QTimer> +#include <QBuffer> +#include <QDebug> +#include <QFile> + +namespace { + class RendererNetworkReply : public QNetworkReply + { + Q_OBJECT + QBuffer buffer; + public: + RendererNetworkReply(QWebFrame* frame,const QNetworkRequest & r) + : QNetworkReply(frame) + { + setRequest(r); + QString selector = r.url().toString(QUrl::RemoveScheme|QUrl::RemoveQuery); + selector = QUrl::fromPercentEncoding(selector.toAscii()); + setOperation(QNetworkAccessManager::GetOperation); + setHeader(QNetworkRequest::ContentTypeHeader,QVariant("image/png")); + open(ReadOnly|Unbuffered); + setUrl(r.url()); + QWebElement element = frame->findFirstElement(selector); + QPixmap pxm(element.geometry().size()); + pxm.fill(Qt::transparent); + { + QPainter painter(&pxm); + element.render(&painter); + } + buffer.open(QIODevice::WriteOnly); + pxm.save(&buffer,"png"); + buffer.close(); + buffer.open(QIODevice::ReadOnly); + QTimer::singleShot(0,this,SIGNAL(readyRead())); + QTimer::singleShot(0,this,SIGNAL(finished())); + } + + virtual qint64 readData(char* data, qint64 maxSize) + { + return buffer.read(data,maxSize); + } + + virtual qint64 bytesAvailable() const + { + return buffer.bytesAvailable(); + } + + void setData(const QByteArray & data) + { + buffer.setData(data); + buffer.open(QIODevice::ReadOnly); + } + + + void abort() + { + } + }; + + class RendererNetworkAccessManager : public QNetworkAccessManager + { + QWebPage* webPage; + public: + RendererNetworkAccessManager(QWebPage* page) : QNetworkAccessManager(page),webPage(page) + { + } + QNetworkReply* createRequest(Operation op, const QNetworkRequest & req, QIODevice* outgoingData) + { + if (req.url().scheme() == "render" && op == GetOperation) { + return new RendererNetworkReply(webPage->currentFrame(),req); + } else + return QNetworkAccessManager::createRequest(op,req,outgoingData); + } + }; + +}; + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled,true); + QWebView w; + w.page()->setNetworkAccessManager(new RendererNetworkAccessManager(w.page())); + QFile f("example.html"); + f.open(QIODevice::ReadOnly); + w.setHtml(f.readAll()); + f.close(); + w.show(); + return a.exec(); +} + + +#include <main.moc> |