aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-03-11 22:57:50 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-03-11 22:57:50 +0000
commit6f458fc22181622af0ccc7edb583152521bb73b3 (patch)
tree28a60cb29944f1f64d99617431e95e7d795646ec /experimental
parente63306df4de7b72b643c4072f259a4ea85c5d093 (diff)
First pass at a web app that lets you run Skia code and see the results.
BUG=skia: R=reed@google.com Author: jcgregorio@google.com Review URL: https://codereview.chromium.org/195143004 git-svn-id: http://skia.googlecode.com/svn/trunk@13751 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'experimental')
-rw-r--r--experimental/webtry/README16
-rw-r--r--experimental/webtry/index.html97
-rw-r--r--experimental/webtry/server.py79
-rw-r--r--experimental/webtry/template.cpp23
4 files changed, 215 insertions, 0 deletions
diff --git a/experimental/webtry/README b/experimental/webtry/README
new file mode 100644
index 0000000000..a36ac8a3fe
--- /dev/null
+++ b/experimental/webtry/README
@@ -0,0 +1,16 @@
+WebTry
+======
+
+Allows trying out Skia code in the browser. Run a local webserver
+and from the pages it serves try out Skia code and see the results
+immediately.
+
+Running
+=======
+
+$ cd experimental/webtry
+$ python server.py
+
+Then visit http://localhost:8765 in your browser.
+
+
diff --git a/experimental/webtry/index.html b/experimental/webtry/index.html
new file mode 100644
index 0000000000..b3903e675f
--- /dev/null
+++ b/experimental/webtry/index.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Skia WebTry</title>
+ <meta charset='utf-8' />
+ <style type="text/css" media="screen">
+ textarea {
+ margin-left: 0;
+ border: solid 1px #ccc;
+ color: green;
+ }
+ pre, code {
+ padding: 0;
+ color: green;
+ }
+ </style>
+</head>
+<body>
+ <pre><code>#include "SkCanvas.h"
+#include "SkGraphics.h"
+#include "SkImageEncoder.h"
+#include "SkImageInfo.h"
+#include "SkForceLinking.h"
+
+int main() {
+ SkForceLinking(false);
+ SkGraphics::Init();
+
+ SkImageInfo info = SkImageInfo::MakeN32(300, 300, kPremul_SkAlphaType);
+ SkBitmap bitmap;
+ bitmap.setConfig(info);
+ bitmap.allocPixels();
+ SkCanvas c(bitmap);
+ c.drawColor(SK_ColorWHITE);
+
+ <textarea name='code' id='code' rows='20' cols='80'>SkPaint p;
+p.setColor(SK_ColorRED);
+p.setAntiAlias(true);
+p.setStyle(SkPaint::kStroke_Style);
+p.setStrokeWidth(10);
+
+c.drawLine(20, 20, 100, 100, p);
+</textarea>
+
+ if (!SkImageEncoder::EncodeFile("foo.png", bitmap, SkImageEncoder::kPNG_Type, 100)) {
+ printf("Failed to encode\n");
+ }
+}
+</code></pre>
+
+ <p>Image appears here:</p>
+ <img id='img' src=''/>
+
+ <pre><code id='output'></code></pre>
+
+ <input type='button' value='Run' id='run'>
+ <script type='text/javascript' charset='utf-8'>
+ var run = document.getElementById('run');
+ var code = document.getElementById('code');
+ var output = document.getElementById('output');
+ var img = document.getElementById('img');
+
+ function codeComplete(e) {
+ // The response is JSON of the form:
+ // {
+ // "message": "you had an error...",
+ // "img": "<base64 encoded image but only on success>"
+ // }
+ //
+ // The img is optional and only appears if there is a valid
+ // image to display.
+ console.log(e.target.response);
+ body = JSON.parse(e.target.response);
+ output.innerText = body.message;
+ if (body.hasOwnProperty('img')) {
+ img.src = 'data:image/png;base64,' + body.img;
+ } else {
+ img.src = '';
+ }
+ }
+
+ function codeError(e) {
+ alert('Something bad happened: ' + e);
+ }
+
+ run.addEventListener('click', onSubmitCode);
+ function onSubmitCode() {
+ var req = new XMLHttpRequest();
+ req.addEventListener('load', codeComplete);
+ req.addEventListener('error', codeError);
+ req.overrideMimeType('application/json');
+ req.open('POST', '.', true);
+ req.send(code.value + '\r\nEOF\r\n');
+ }
+ </script>
+</body>
+</html>
diff --git a/experimental/webtry/server.py b/experimental/webtry/server.py
new file mode 100644
index 0000000000..8367b3e46a
--- /dev/null
+++ b/experimental/webtry/server.py
@@ -0,0 +1,79 @@
+import BaseHTTPServer
+import base64
+import json
+import logging
+import string
+import subprocess
+
+HOST_NAME = 'localhost'
+PORT_NUMBER = 8765
+
+def runCode(usercode):
+ f = open('template.cpp', 'rb')
+ template = string.Template(f.read())
+ f.close()
+
+ code = template.substitute(usercode=usercode)
+
+ f = open('result.cpp', 'wb')
+ f.write(code)
+ f.close()
+
+ msg = ""
+ img = ""
+ try:
+ logging.info("compiling")
+ msg = subprocess.check_output('ninja -C ../../out/Debug webtry'.split())
+ try:
+ logging.info("running")
+ msg = subprocess.check_output('../../out/Debug/webtry'.split())
+ f = open('foo.png', 'rb')
+ img = base64.b64encode(f.read())
+ f.close()
+ except subprocess.CalledProcessError as e:
+ logging.info(e)
+ msg = e.output
+ except subprocess.CalledProcessError as e:
+ logging.info(e)
+ msg = e.output
+
+ retval = {
+ 'message': msg
+ }
+ if img:
+ retval['img'] = img
+ return retval
+
+class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
+ def do_POST(self):
+ logging.info("POST")
+ body = ""
+ l = self.rfile.readline()
+ while l.strip() != "EOF":
+ body += l
+ l = self.rfile.readline()
+ self.send_response(200)
+ self.send_header("Content-type", "application/json")
+ self.end_headers()
+ resp = runCode(body)
+ self.wfile.write(json.dumps(resp))
+ self.end_headers()
+
+ def do_GET(self):
+ """Respond to a GET request."""
+ self.send_response(200)
+ self.send_header("Content-type", "text/html")
+ self.end_headers()
+ f = open('index.html', 'rb')
+ self.wfile.write(f.read())
+ f.close()
+
+if __name__ == '__main__':
+ server_class = BaseHTTPServer.HTTPServer
+ httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
+ logging.info("Server Start: %s:%s" % (HOST_NAME, PORT_NUMBER))
+ try:
+ httpd.serve_forever()
+ except KeyboardInterrupt:
+ pass
+ httpd.server_close()
diff --git a/experimental/webtry/template.cpp b/experimental/webtry/template.cpp
new file mode 100644
index 0000000000..20b9086cde
--- /dev/null
+++ b/experimental/webtry/template.cpp
@@ -0,0 +1,23 @@
+#include "SkCanvas.h"
+#include "SkGraphics.h"
+#include "SkImageEncoder.h"
+#include "SkImageInfo.h"
+#include "SkForceLinking.h"
+
+int main() {
+ SkForceLinking(false);
+ SkGraphics::Init();
+
+ SkImageInfo info = SkImageInfo::MakeN32(300, 300, kPremul_SkAlphaType);
+ SkBitmap bitmap;
+ bitmap.setConfig(info);
+ bitmap.allocPixels();
+ SkCanvas c(bitmap);
+ c.drawColor(SK_ColorWHITE);
+
+ $usercode
+
+ if (!SkImageEncoder::EncodeFile("foo.png", bitmap, SkImageEncoder::kPNG_Type, 100)) {
+ printf("Failed to encode\n");
+ }
+}