From 60af680aa1a3bf1136072e6f030059ddfd6cec61 Mon Sep 17 00:00:00 2001 From: Vanessa Freudenberg Date: Thu, 4 Sep 2014 19:30:48 +0200 Subject: [PATCH] add scratch demo page --- scratch/Makefile | 22 ++++++++++++ scratch/index.html | 56 +++++++++++++++++++++++++++++++ scratch/scratch.css | 30 +++++++++++++++++ scratch/scratch.js | 80 ++++++++++++++++++++++++++++++++++++++++++++ scratch/scratch.png | Bin 0 -> 16779 bytes 5 files changed, 188 insertions(+) create mode 100644 scratch/Makefile create mode 100644 scratch/index.html create mode 100644 scratch/scratch.css create mode 100644 scratch/scratch.js create mode 100644 scratch/scratch.png diff --git a/scratch/Makefile b/scratch/Makefile new file mode 100644 index 00000000..92112b48 --- /dev/null +++ b/scratch/Makefile @@ -0,0 +1,22 @@ +# File: Makefile +# Author: Bert Freudenberg +# +# copy files to publishing directory and create an offline manifest + +TARGET=../gh-pages/scratch +MANIFEST=$(TARGET)/offline.appcache +FILES=../lib/squeak.js ../vm.js index.html scratch.css scratch.js scratch.png \ + ../lib/lz-string.js ../lib/addtohomescreen.css ../lib/addtohomescreen.js ../lib/gh-fork-ribbon.css +EXTRA=http://freudenbergs.de/bert/squeakjs/scratch/Scratch.image + +$(MANIFEST): Makefile $(TARGET) + @rm -f $@ + @echo "CACHE MANIFEST" > $@ + @stat -f '# %Sm' `ls -t $(FILES) | head -n1` | tee -a $@ + @for f in $(FILES) $(EXTRA); do echo $$f >> $@ ; done + +$(TARGET): $(FILES) + @mkdir -pv $@ $@/../lib + @for f in $^ ; do install -pvm 444 $$f $@/$$f ; done + @touch $@ + diff --git a/scratch/index.html b/scratch/index.html new file mode 100644 index 00000000..769754d2 --- /dev/null +++ b/scratch/index.html @@ -0,0 +1,56 @@ + + + + +ScratchJS + + + + + + + + + + + + + + + + +
+

Scratch on SqueakJS

+
+ +
+

This is an early version of SqueakJS running a Scratch image. + Feedback and contributions welcome! -- Bert Freudenberg, September 2014

+
+
+ +
+ + diff --git a/scratch/scratch.css b/scratch/scratch.css new file mode 100644 index 00000000..84099623 --- /dev/null +++ b/scratch/scratch.css @@ -0,0 +1,30 @@ +body { + background-color: #eae6d1; + font-family: sans-serif; +} +canvas { + position: absolute; + background: #000; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} +div#sqHeader { + position: absolute; + top: 0; + left: 0; + right: 0; + padding: 10px; + border-bottom: 6px double gray; +} +div#sqFooter { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: 10px; + border-top: 6px double gray; +} diff --git a/scratch/scratch.js b/scratch/scratch.js new file mode 100644 index 00000000..e980d649 --- /dev/null +++ b/scratch/scratch.js @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2013,2014 Bert Freudenberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +var fullscreen = navigator.standalone; + +window.onload = function() { + if (fullscreen) { + document.body.style.margin = 0; + document.body.style.backgroundColor = 'black'; + sqHeader.style.display = 'none'; + sqFooter.style.display = 'none'; + } + var display = createSqueakDisplay(sqCanvas, {fullscreen: fullscreen, header: sqHeader, footer: sqFooter}); + function loadAndRunImage(url) { + //url = "../demo/mini.image" // for debugging + var imageName = Squeak.splitFilePath(url).basename; + if (document.location.hostname == "localhost") url = imageName; // load from local folder while debugging + display.showBanner("Downloading " + imageName); + display.showProgress(0); + var rq = new XMLHttpRequest(); + rq.open('GET', url); + rq.responseType = 'arraybuffer'; + rq.onprogress = function(e) { + if (e.lengthComputable) display.showProgress(e.loaded / e.total); + } + rq.onload = function(e) { + display.showBanner("Initializing, please wait"); + window.setTimeout(function(){ + var image = new Squeak.Image(rq.response, imageName); + var vm = new Squeak.Interpreter(image, display); + display.clear(); + var run = function() { + try { + vm.interpret(20, function(ms) { + if (typeof ms === 'number') { // continue running + window.setTimeout(run, ms); + } else { // quit + sqCanvas.style.webkitTransition = "-webkit-transform 0.5s"; + sqCanvas.style.webkitTransform = "scale(0)"; + window.setTimeout(function(){sqCanvas.style.display = 'none'}, 500); + } + }); + } catch(error) { + console.error(error); + alert(error); + } + }; + run(); + }, 0); + }; + rq.send(); + }; + loadAndRunImage("http://freudenbergs.de/bert/squeakjs/scratch/Scratch.image"); +}; + +if (addToHomescreen.isStandalone) + fullscreen = true; +else addToHomescreen({ + appID: 'squeakjs.scratch.add2home', +}); diff --git a/scratch/scratch.png b/scratch/scratch.png new file mode 100644 index 0000000000000000000000000000000000000000..3e54066d8f077d13522809ee0fca2aef192eec96 GIT binary patch literal 16779 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 literal 0 HcmV?d00001