summaryrefslogtreecommitdiff
path: root/static/tests
diff options
context:
space:
mode:
authordumpfmprod <dumpfmprod@ubuntu.(none)>2010-06-17 00:34:02 -0400
committerdumpfmprod <dumpfmprod@ubuntu.(none)>2010-06-17 00:34:02 -0400
commite890d6d91db6d716beeb22c94d6bf0a9d88f1ef5 (patch)
tree9891d77bbfaa7459783605b29906d3aa06ba5801 /static/tests
parentf43aa915a5b5268b7b05e2a3f15d128ee218ade5 (diff)
sostler prod commit
Diffstat (limited to 'static/tests')
-rw-r--r--static/tests/avatars.html40
-rw-r--r--static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.gifbin0 -> 1037 bytes
-rw-r--r--static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.thumb.gifbin0 -> 1057 bytes
-rw-r--r--static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.pngbin0 -> 279469 bytes
-rw-r--r--static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.thumb.pngbin0 -> 5106 bytes
-rw-r--r--static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.gifbin0 -> 5188 bytes
-rw-r--r--static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.thumb.gifbin0 -> 865 bytes
-rw-r--r--static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.gifbin0 -> 5927 bytes
-rw-r--r--static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.thumb.gifbin0 -> 3557 bytes
-rw-r--r--static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.jpgbin0 -> 68581 bytes
-rw-r--r--static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.thumb.jpgbin0 -> 681 bytes
-rw-r--r--static/tests/avatars/20100311/index.html49
-rw-r--r--static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.gifbin0 -> 662066 bytes
-rw-r--r--static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.thumb.gifbin0 -> 21369 bytes
-rw-r--r--static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.gifbin0 -> 3195 bytes
-rw-r--r--static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.thumb.gifbin0 -> 1828 bytes
-rw-r--r--static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.jpgbin0 -> 25796 bytes
-rw-r--r--static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.thumb.jpgbin0 -> 17808 bytes
-rw-r--r--static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.gifbin0 -> 33538 bytes
-rw-r--r--static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.thumb.gifbin0 -> 6475 bytes
-rw-r--r--static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.gifbin0 -> 729279 bytes
-rw-r--r--static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.thumb.gifbin0 -> 55343 bytes
-rw-r--r--static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.pngbin0 -> 60870 bytes
-rw-r--r--static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.thumb.pngbin0 -> 5897 bytes
-rw-r--r--static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.jpgbin0 -> 210178 bytes
-rw-r--r--static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.thumb.jpgbin0 -> 683 bytes
-rw-r--r--static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gifbin0 -> 606161 bytes
-rw-r--r--static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.thumb.gifbin0 -> 11727 bytes
-rw-r--r--static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.gifbin0 -> 173588 bytes
-rw-r--r--static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.thumb.gifbin0 -> 12174 bytes
-rw-r--r--static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.pngbin0 -> 168173 bytes
-rw-r--r--static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.thumb.pngbin0 -> 6289 bytes
-rw-r--r--static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.JPGbin0 -> 4718 bytes
-rw-r--r--static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.thumb.JPGbin0 -> 842 bytes
-rw-r--r--static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.pngbin0 -> 18980 bytes
-rw-r--r--static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.thumb.pngbin0 -> 2225 bytes
-rw-r--r--static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.jpgbin0 -> 40496 bytes
-rw-r--r--static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.thumb.jpgbin0 -> 782 bytes
-rw-r--r--static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.pngbin0 -> 20870 bytes
-rw-r--r--static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.thumb.pngbin0 -> 1916 bytes
-rw-r--r--static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.gifbin0 -> 484 bytes
-rw-r--r--static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.thumb.gifbin0 -> 551 bytes
-rw-r--r--static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.pngbin0 -> 58365 bytes
-rw-r--r--static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.thumb.pngbin0 -> 1783 bytes
-rw-r--r--static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.pngbin0 -> 74170 bytes
-rw-r--r--static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.thumb.pngbin0 -> 1900 bytes
-rw-r--r--static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.gifbin0 -> 552509 bytes
-rw-r--r--static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.thumb.gifbin0 -> 32847 bytes
-rw-r--r--static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpgbin0 -> 124232 bytes
-rw-r--r--static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.thumb.jpgbin0 -> 6905 bytes
-rw-r--r--static/tests/avatars/20100317/12688py862249-dumpfm-justytamp-JUSTY-TAMP.thumb.pngbin0 -> 1900 bytes
-rw-r--r--static/tests/avatars/20100317/index.html114
-rw-r--r--static/tests/avatars/bg.gifbin0 -> 106 bytes
-rw-r--r--static/tests/avatars2.html39
-rw-r--r--static/tests/avatars3.html40
-rw-r--r--static/tests/canvas1/index.html24
-rw-r--r--static/tests/canvas1/jsplatformer5_files/AnimatedGameObject.js80
-rw-r--r--static/tests/canvas1/jsplatformer5_files/ApplicationManager.js42
-rw-r--r--static/tests/canvas1/jsplatformer5_files/GameObject.js46
-rw-r--r--static/tests/canvas1/jsplatformer5_files/GameObjectManager.js125
-rw-r--r--static/tests/canvas1/jsplatformer5_files/Main.js81
-rw-r--r--static/tests/canvas1/jsplatformer5_files/RepeatingGameObject.js90
-rw-r--r--static/tests/canvas1/jsplatformer5_files/Utils.js27
-rw-r--r--static/tests/canvas1/jsplatformer5_files/VisualGameObject.js49
-rw-r--r--static/tests/canvas2/index.html24
-rw-r--r--static/tests/canvas2/jsplatformer5_files/AnimatedGameObject.js80
-rw-r--r--static/tests/canvas2/jsplatformer5_files/ApplicationManager.js42
-rw-r--r--static/tests/canvas2/jsplatformer5_files/GameObject.js46
-rw-r--r--static/tests/canvas2/jsplatformer5_files/GameObjectManager.js125
-rw-r--r--static/tests/canvas2/jsplatformer5_files/Main.js81
-rw-r--r--static/tests/canvas2/jsplatformer5_files/RepeatingGameObject.js90
-rw-r--r--static/tests/canvas2/jsplatformer5_files/Utils.js27
-rw-r--r--static/tests/canvas2/jsplatformer5_files/VisualGameObject.js49
73 files changed, 1410 insertions, 0 deletions
diff --git a/static/tests/avatars.html b/static/tests/avatars.html
new file mode 100644
index 0000000..37b5577
--- /dev/null
+++ b/static/tests/avatars.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<style>
+img { width: 32px; height: 32px; }
+</style>
+</head>
+<body>
+<div>
+<img src="http://dump.fm/avatars/20100328/1269820420675-dumpfm-andrej-a2bone.gif"><br>
+<img src="http://dump.fm/avatars/20100528/1275024874455-dumpfm-erikhaspresence-logo.gif"><br>
+<img
+src="http://dump.fm/avatars/20100609/1276057658623-dumpfm-maryrachel-1276057548339-dumpfm-lobstersoap-lobstersoap_mr2.gif"><br>
+<img src="http://dump.fm/avatars/20100430/1272664838950-dumpfm-DaK4nDyM4nFU-cupcake-flashback.gif"><br>
+<img
+src="http://dump.fm/avatars/20100424/1272088155321-dumpfm-thekraken-ac37341b3621ae002fe5fbf7bf829be0c04df97c_m.gif"><br>
+<img src="http://imgur.com/H0sNp.gif"><br>
+<img src="http://dump.fm/avatars/20100605/1275765282700-dumpfm-foot-dizzy-jump.gif"><br>
+<img src="http://dump.fm/avatars/20100602/1275456693159-dumpfm-Savour-pikasleepgif.gif"><br>
+<img src="http://dump.fm/avatars/20100413/1271199038897-dumpfm-cdma-Game_of_life_animated_glider.gif"><br>
+<img src="http://dump.fm/avatars/20100531/1275301955882-dumpfm-whatevz-Zeke_sodabomb_side.gif"><br>
+<img src="http://dump.fm/images/20100410/1270925016612-dumpfm-justytamp-Laptop.gif"><br>
+<img src="http://dump.fm/avatars/20100609/1276134099153-dumpfm-ryder-4421765655_44401c9e82_o.gif"><br>
+<img src="http://dump.fm/avatars/20100512/1273643435184-dumpfm-frankhats-dotfade.gif"><br>
+<img src="http://dump.fm/avatars/20100423/1272000363897-dumpfm-stefan-See_King1.gif"><br>
+<img
+src="http://dump.fm/avatars/20100526/1274899226905-dumpfm-noisia-1274373752899-dumpfm-noisia-Neko_animated.gif"><br>
+<img src="http://dump.fm/avatars/20100421/1271878413411-dumpfm-mat3i-404.gif"><br>
+<img src="http://dump.fm/avatars/20100522/1274555551274-dumpfm-anitahug-creatures_015.gif"><br>
+<img src="http://dump.fm/avatars/20100611/1276243669179-dumpfm-jertronic-smallercolordog.gif"><br>
+<img src="http://dump.fm/avatars/20100407/1270672327296-dumpfm-illalli-wheelchair_lg_nwm.gif"><br>
+<img src="http://dump.fm/avatars/20100517/1274085059285-dumpfm-AGT528-1267051064894-Pop-corn-5.gif"><br>
+<img src="http://dump.fm/avatars/20100510/1273466455783-dumpfm-beaf-skream.gif"><br>
+<img
+src="http://dump.fm/avatars/20100415/1271354812432-dumpfm-melipone-1270872653089-dumpfm-tomauty-1245200306995.gif"><br>
+<img src="http://dump.fm/avatars/20100515/1273927592920-dumpfm-frederick-683150mjhfl22ijf.gif"><br>
+<img
+src="http://dump.fm/avatars/20100605/1275748101974-dumpfm-minty-1275748020937-dumpfm-jumanji-1275745357313-dumpfm-minty-tetes_mort-04.gif"><br>
+</div>
+</body>
+</html>
diff --git a/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.gif b/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.gif
new file mode 100644
index 0000000..e0b85c9
--- /dev/null
+++ b/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.thumb.gif b/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.thumb.gif
new file mode 100644
index 0000000..51f863b
--- /dev/null
+++ b/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.png b/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.png
new file mode 100644
index 0000000..0873f9d
--- /dev/null
+++ b/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.png
Binary files differ
diff --git a/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.thumb.png b/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.thumb.png
new file mode 100644
index 0000000..c8c5530
--- /dev/null
+++ b/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.gif b/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.gif
new file mode 100644
index 0000000..4408809
--- /dev/null
+++ b/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.thumb.gif b/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.thumb.gif
new file mode 100644
index 0000000..3505243
--- /dev/null
+++ b/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.gif b/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.gif
new file mode 100644
index 0000000..cc68e71
--- /dev/null
+++ b/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.thumb.gif b/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.thumb.gif
new file mode 100644
index 0000000..46a47aa
--- /dev/null
+++ b/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.jpg b/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.jpg
new file mode 100644
index 0000000..2ba74e7
--- /dev/null
+++ b/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.jpg
Binary files differ
diff --git a/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.thumb.jpg b/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.thumb.jpg
new file mode 100644
index 0000000..838080e
--- /dev/null
+++ b/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.thumb.jpg
Binary files differ
diff --git a/static/tests/avatars/20100311/index.html b/static/tests/avatars/20100311/index.html
new file mode 100644
index 0000000..39fd34c
--- /dev/null
+++ b/static/tests/avatars/20100311/index.html
@@ -0,0 +1,49 @@
+<html>
+<head>
+ <style>
+ td { text-align: right;}
+ .big { max-width: 500px; max-height: 500px; }
+ .small { max-width: 30px; max-height: 30px; height: 30px; }
+ body {background-image: url(../bg.gif);}
+ thead td { background-color: #000; color: #fff; border: 3px solid #888; }
+ </style>
+</head>
+<body>
+
+<table>
+ <thead>
+ <tr><td>original image w/ max-width/height</td><td>css resize</td><td>thumb</td></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><img class="big" src="1268317730569-dumpfm-unicorngirl-unicornpink.gif"></td>
+ <td><img class="small" src="1268317730569-dumpfm-unicorngirl-unicornpink.gif"></td>
+ <td><img class="thumb" src="1268317730569-dumpfm-unicorngirl-unicornpink.thumb.gif"></td>
+ </tr>
+ <tr>
+ <td><img class="big" src="1268353224487-dumpfm-mu0p-mu0p.gif">
+ <td><img class="small" src="1268353224487-dumpfm-mu0p-mu0p.gif">
+ <td><img class="thumb" src="1268353224487-dumpfm-mu0p-mu0p.thumb.gif">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268360109151-dumpfm-zoeee-Photo-316.jpg">
+ <td><img class="small" src="1268360109151-dumpfm-zoeee-Photo-316.jpg">
+ <td><img class="thumb" src="1268360109151-dumpfm-zoeee-Photo-316.thumb.jpg">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268331012620-dumpfm-AndersStuka-supermensa.png">
+ <td><img class="small" src="1268331012620-dumpfm-AndersStuka-supermensa.png">
+ <td><img class="thumb" src="1268331012620-dumpfm-AndersStuka-supermensa.thumb.png">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268356801824-dumpfm-sam-pent11satanshimmel.gif ">
+ <td><img class="small" src="1268356801824-dumpfm-sam-pent11satanshimmel.gif ">
+ <td><img class="thumb" src="1268356801824-dumpfm-sam-pent11satanshimmel.thumb.gif ">
+ </tr>
+ </tbody>
+</table>
+
+
+
+</body>
+</html> \ No newline at end of file
diff --git a/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.gif b/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.gif
new file mode 100644
index 0000000..3c4a5d8
--- /dev/null
+++ b/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.thumb.gif b/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.thumb.gif
new file mode 100644
index 0000000..8030754
--- /dev/null
+++ b/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.gif b/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.gif
new file mode 100644
index 0000000..db844ff
--- /dev/null
+++ b/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.thumb.gif b/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.thumb.gif
new file mode 100644
index 0000000..864558e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.jpg b/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.jpg
new file mode 100644
index 0000000..affa502
--- /dev/null
+++ b/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.thumb.jpg b/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.thumb.jpg
new file mode 100644
index 0000000..6e672b4
--- /dev/null
+++ b/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.thumb.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.gif b/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.gif
new file mode 100644
index 0000000..66eda90
--- /dev/null
+++ b/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.thumb.gif b/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.thumb.gif
new file mode 100644
index 0000000..8844ec6
--- /dev/null
+++ b/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.gif b/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.gif
new file mode 100644
index 0000000..1479702
--- /dev/null
+++ b/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.thumb.gif b/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.thumb.gif
new file mode 100644
index 0000000..7f1c588
--- /dev/null
+++ b/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.png b/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.png
new file mode 100644
index 0000000..60697e2
--- /dev/null
+++ b/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.thumb.png b/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.thumb.png
new file mode 100644
index 0000000..7fc6cf0
--- /dev/null
+++ b/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.jpg b/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.jpg
new file mode 100644
index 0000000..50c741d
--- /dev/null
+++ b/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.thumb.jpg b/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.thumb.jpg
new file mode 100644
index 0000000..d877c88
--- /dev/null
+++ b/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.thumb.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gif b/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gif
new file mode 100644
index 0000000..70b1e6e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.thumb.gif b/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.thumb.gif
new file mode 100644
index 0000000..ba44afe
--- /dev/null
+++ b/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.gif b/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.gif
new file mode 100644
index 0000000..655a3f2
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.thumb.gif b/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.thumb.gif
new file mode 100644
index 0000000..4cbc7a7
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.png b/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.png
new file mode 100644
index 0000000..84a2c5e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.thumb.png b/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.thumb.png
new file mode 100644
index 0000000..33a792e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.JPG b/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.JPG
new file mode 100644
index 0000000..9a1c44b
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.JPG
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.thumb.JPG b/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.thumb.JPG
new file mode 100644
index 0000000..16ac653
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.thumb.JPG
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.png b/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.png
new file mode 100644
index 0000000..6f0b2cc
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.thumb.png b/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.thumb.png
new file mode 100644
index 0000000..358506d
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.jpg b/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.jpg
new file mode 100644
index 0000000..286dd58
--- /dev/null
+++ b/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.thumb.jpg b/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.thumb.jpg
new file mode 100644
index 0000000..b071b4e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.thumb.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.png b/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.png
new file mode 100644
index 0000000..b0461a8
--- /dev/null
+++ b/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.thumb.png b/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.thumb.png
new file mode 100644
index 0000000..b17e8f0
--- /dev/null
+++ b/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.gif b/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.gif
new file mode 100644
index 0000000..26922dd
--- /dev/null
+++ b/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.thumb.gif b/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.thumb.gif
new file mode 100644
index 0000000..9ac7b20
--- /dev/null
+++ b/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.png b/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.png
new file mode 100644
index 0000000..141e33f
--- /dev/null
+++ b/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.thumb.png b/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.thumb.png
new file mode 100644
index 0000000..e098fe0
--- /dev/null
+++ b/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.png b/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.png
new file mode 100644
index 0000000..fcf1b7d
--- /dev/null
+++ b/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png b/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png
new file mode 100644
index 0000000..76dd58d
--- /dev/null
+++ b/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.gif b/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.gif
new file mode 100644
index 0000000..ed41681
--- /dev/null
+++ b/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.thumb.gif b/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.thumb.gif
new file mode 100644
index 0000000..48f31f6
--- /dev/null
+++ b/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpg b/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpg
new file mode 100644
index 0000000..68a0b8e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.thumb.jpg b/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.thumb.jpg
new file mode 100644
index 0000000..49e34b5
--- /dev/null
+++ b/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.thumb.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/12688py862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png b/static/tests/avatars/20100317/12688py862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png
new file mode 100644
index 0000000..76dd58d
--- /dev/null
+++ b/static/tests/avatars/20100317/12688py862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/index.html b/static/tests/avatars/20100317/index.html
new file mode 100644
index 0000000..a80faec
--- /dev/null
+++ b/static/tests/avatars/20100317/index.html
@@ -0,0 +1,114 @@
+<html>
+<head>
+ <style>
+ td { text-align: right;}
+ .big { max-width: 500px; max-height: 500px; }
+ .small { max-width: 30px; max-height: 30px; height: 30px; }
+ body {background-image: url(../bg.gif);}
+ thead td { background-color: #000; color: #fff; border: 3px solid #888; }
+ </style>
+</head>
+<body>
+
+<table>
+ <thead>
+ <tr><td>original image w/ max-width/height</td><td>css resize</td><td>thumb</td></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><img class="big" src="1268824131789-dumpfm-nigga-babyjump.gif"></td>
+ <td><img class="small" src="1268824131789-dumpfm-nigga-babyjump.gif"></td>
+ <td><img class="thumb" src="1268824131789-dumpfm-nigga-babyjump.thumb.gif"></td>
+ </tr>
+ <tr>
+ <td><img class="big" src="1268843598216-dumpfm-tmkunt-girl.gif">
+ <td><img class="small" src="1268843598216-dumpfm-tmkunt-girl.gif">
+ <td><img class="thumb" src="1268843598216-dumpfm-tmkunt-girl.thumb.gif">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268843634561-dumpfm-tmkunt-tevye.jpg">
+ <td><img class="small" src="1268843634561-dumpfm-tmkunt-tevye.jpg">
+ <td><img class="thumb" src="1268843634561-dumpfm-tmkunt-tevye.thumb.jpg">
+ </tr>
+ <tr>
+ <tr>
+ <td><img class="big" src="1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpg"></td>
+ <td><img class="small" src="1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpg"></td>
+ <td><img class="thumb" src="1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.thumb.jpg"></td>
+ </tr>
+ <tr>
+ <td><img class="big" src="1268881084236-dumpfm-mistaxiii-moooovies.gif">
+ <td><img class="small" src="1268881084236-dumpfm-mistaxiii-moooovies.gif">
+ <td><img class="thumb" src="1268881084236-dumpfm-mistaxiii-moooovies.thumb.gif">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268879862249-dumpfm-justytamp-JUSTY-TAMP.png">
+ <td><img class="small" src="1268879862249-dumpfm-justytamp-JUSTY-TAMP.png">
+ <td><img class="thumb" src="1268879862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268879836325-dumpfm-bendover-clifford-1.png">
+ <td><img class="small" src="1268879836325-dumpfm-bendover-clifford-1.png">
+ <td><img class="thumb" src="1268879836325-dumpfm-bendover-clifford-1.thumb.png">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268878362813-dumpfm-okeeblow-3-smith.gif ">
+ <td><img class="small" src="1268878362813-dumpfm-okeeblow-3-smith.gif ">
+ <td><img class="thumb" src="1268878362813-dumpfm-okeeblow-3-smith.thumb.gif ">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268877902821-dumpfm-3noneTwo-100ico.png"></td>
+ <td><img class="small" src="1268877902821-dumpfm-3noneTwo-100ico.png"></td>
+ <td><img class="thumb" src="1268877902821-dumpfm-3noneTwo-100ico.thumb.png"></td>
+ </tr>
+ <tr>
+ <td><img class="big" src="1268877139344-dumpfm-coeur-GoatBoy.jpg">
+ <td><img class="small" src="1268877139344-dumpfm-coeur-GoatBoy.jpg">
+ <td><img class="thumb" src="1268877139344-dumpfm-coeur-GoatBoy.thumb.jpg">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268875995007-dumpfm-SrProlapse-keatonlolsmall.png">
+ <td><img class="small" src="1268875995007-dumpfm-SrProlapse-keatonlolsmall.png">
+ <td><img class="thumb" src="1268875995007-dumpfm-SrProlapse-keatonlolsmall.thumb.png">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268875479356-dumpfm-cassandreamy-japansmiley.JPG">
+ <td><img class="small" src="1268875479356-dumpfm-cassandreamy-japansmiley.JPG">
+ <td><img class="thumb" src="1268875479356-dumpfm-cassandreamy-japansmiley.thumb.JPG">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268875138982-dumpfm-hankpeters-53-icon.png ">
+ <td><img class="small" src="1268875138982-dumpfm-hankpeters-53-icon.png ">
+ <td><img class="thumb" src="1268875138982-dumpfm-hankpeters-53-icon.thumb.png ">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268875089450-dumpfm-mistaxiii-b2.gif"></td>
+ <td><img class="small" src="1268875089450-dumpfm-mistaxiii-b2.gif"></td>
+ <td><img class="thumb" src="1268875089450-dumpfm-mistaxiii-b2.thumb.gif"></td>
+ </tr>
+ <tr>
+ <td><img class="big" src="1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gif">
+ <td><img class="small" src="1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gif">
+ <td><img class="thumb" src="1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.thumb.gif">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268860204161-dumpfm-ghoulalt-allentown2009-11.jpg">
+ <td><img class="small" src="1268860204161-dumpfm-ghoulalt-allentown2009-11.jpg">
+ <td><img class="thumb" src="1268860204161-dumpfm-ghoulalt-allentown2009-11.thumb.jpg">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268854482173-dumpfm-loghorn-Picture-27.png">
+ <td><img class="small" src="1268854482173-dumpfm-loghorn-Picture-27.png">
+ <td><img class="thumb" src="1268854482173-dumpfm-loghorn-Picture-27.thumb.png">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268845052790-dumpfm-foot-beads_placed_in_bone.gif ">
+ <td><img class="small" src="1268845052790-dumpfm-foot-beads_placed_in_bone.gif ">
+ <td><img class="thumb" src="1268845052790-dumpfm-foot-beads_placed_in_bone.thumb.gif ">
+ </tr>
+ </tbody>
+</table>
+
+
+</body>
+</html> \ No newline at end of file
diff --git a/static/tests/avatars/bg.gif b/static/tests/avatars/bg.gif
new file mode 100644
index 0000000..c7d2cbd
--- /dev/null
+++ b/static/tests/avatars/bg.gif
Binary files differ
diff --git a/static/tests/avatars2.html b/static/tests/avatars2.html
new file mode 100644
index 0000000..2c6460f
--- /dev/null
+++ b/static/tests/avatars2.html
@@ -0,0 +1,39 @@
+<html>
+<head>
+<style>
+</style>
+</head>
+<body>
+<div>
+<img src="http://www.gsarchives.net/nds/jump_superstars/sprites/animated/pla/Naruto_run.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/lego_star_wars_2/sprites/animated/playable/Stormtrooper_walk_south.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/npc-named/Mini-Porky_sirenred.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/enemies/Pigmask_Colonel_walk_southeast.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/playable/Duster_walk_southeast.gif"><br>
+<img src="http://www.gsarchives.net/nes/a_boy_and_his_blob/sprites/animated/NES_ABAHB_Blob_Stand-L_Ani.gif"><br>
+<img src="http://www.gsarchives.net/nes/a_boy_and_his_blob/sprites/animated/NES_ABAHB_Boy_Run-L_Ani.gif"><br>
+<img src="http://www.gsarchives.net/nes/kid_icarus/sprites/animated/kidic_nose.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Char_LuigiSmall_Walk-L.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Enemy_BobOmb-R.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Boss3_Mouser.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Object_RocketFly.gif"><br>
+<img src="http://www.gsarchives.net/nes/yo_noid/sprites/animated/Noid_earpull.gif"><br>
+<img src="http://www.gsarchives.net/nes/yo_noid/sprites/animated/RedNoidDancingLeft.gif"><br>
+<img
+src="http://dump.fm/avatars/20100526/1274899226905-dumpfm-noisia-1274373752899-dumpfm-noisia-Neko_animated.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/player1%20walking%20right%20w%20knife.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/Knife%20guard%20walk%20left.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/player1%20gun%20mellee.gif"><br>
+<img src="http://www.gsarchives.net/nes/final_fantasy_3/sprites/animated/shamanwin.gif"><br>
+<img src="http://www.gsarchives.net/nes/final_fantasy_3/sprites/animated/onionkidgreenwin.gif"><br>
+<img src="http://www.gsarchives.net/nes/garfield/sprites/animated/garfield_catwalking_left.gif"><br>
+<img src="http://www.gsarchives.net/nes/garfield/sprites/animated/garfield_kick_right.gif"><br>
+<img src="http://www.gsarchives.net/nes/contra/sprites/animated/Scorpion_run_left.gif"><br>
+<img src="http://www.gsarchives.net/nes/addams_family/sprites/animated/nesaddamsfamilyenemyarmor2uh.gif"><br>
+</div>
+</body>
+</html>
diff --git a/static/tests/avatars3.html b/static/tests/avatars3.html
new file mode 100644
index 0000000..2b0c9ee
--- /dev/null
+++ b/static/tests/avatars3.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<style>
+img { width: 30px; height: 30px; }
+</style>
+</head>
+<body>
+<div>
+<img src="http://www.gsarchives.net/nds/jump_superstars/sprites/animated/pla/Naruto_run.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/lego_star_wars_2/sprites/animated/playable/Stormtrooper_walk_south.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/npc-named/Mini-Porky_sirenred.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/enemies/Pigmask_Colonel_walk_southeast.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/playable/Duster_walk_southeast.gif"><br>
+<img src="http://www.gsarchives.net/nes/a_boy_and_his_blob/sprites/animated/NES_ABAHB_Blob_Stand-L_Ani.gif"><br>
+<img src="http://www.gsarchives.net/nes/a_boy_and_his_blob/sprites/animated/NES_ABAHB_Boy_Run-L_Ani.gif"><br>
+<img src="http://www.gsarchives.net/nes/kid_icarus/sprites/animated/kidic_nose.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Char_LuigiSmall_Walk-L.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Enemy_BobOmb-R.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Boss3_Mouser.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Object_RocketFly.gif"><br>
+<img src="http://www.gsarchives.net/nes/yo_noid/sprites/animated/Noid_earpull.gif"><br>
+<img src="http://www.gsarchives.net/nes/yo_noid/sprites/animated/RedNoidDancingLeft.gif"><br>
+<img
+src="http://dump.fm/avatars/20100526/1274899226905-dumpfm-noisia-1274373752899-dumpfm-noisia-Neko_animated.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/player1%20walking%20right%20w%20knife.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/Knife%20guard%20walk%20left.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/player1%20gun%20mellee.gif"><br>
+<img src="http://www.gsarchives.net/nes/final_fantasy_3/sprites/animated/shamanwin.gif"><br>
+<img src="http://www.gsarchives.net/nes/final_fantasy_3/sprites/animated/onionkidgreenwin.gif"><br>
+<img src="http://www.gsarchives.net/nes/garfield/sprites/animated/garfield_catwalking_left.gif"><br>
+<img src="http://www.gsarchives.net/nes/garfield/sprites/animated/garfield_kick_right.gif"><br>
+<img src="http://www.gsarchives.net/nes/contra/sprites/animated/Scorpion_run_left.gif"><br>
+<img src="http://www.gsarchives.net/nes/addams_family/sprites/animated/nesaddamsfamilyenemyarmor2uh.gif"><br>
+</div>
+</body>
+</html>
diff --git a/static/tests/canvas1/index.html b/static/tests/canvas1/index.html
new file mode 100644
index 0000000..dfff8af
--- /dev/null
+++ b/static/tests/canvas1/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en"><head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+
+
+ <script type="text/javascript" src="jsplatformer5_files/GameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/VisualGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/RepeatingGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/AnimatedGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/Utils.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/ApplicationManager.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/GameObjectManager.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/Main.js"></script>
+ <style type="text/css">
+ body { font-family: Arial,Helvetica,sans-serif;}
+ </style>
+</head><body>
+
+ <canvas id="canvas" width="80" height="1200" >
+ <p>
+ Your browser does not support the canvas element.
+ </p>
+ </canvas>
+</body></html>
diff --git a/static/tests/canvas1/jsplatformer5_files/AnimatedGameObject.js b/static/tests/canvas1/jsplatformer5_files/AnimatedGameObject.js
new file mode 100644
index 0000000..895fc19
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/AnimatedGameObject.js
@@ -0,0 +1,80 @@
+/**
+ Displays an animated Game Object
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function AnimatedGameObject()
+{
+ /**
+ Defines the current frame that is to be rendered
+ @type Number
+ */
+ this.currentFrame = 0;
+ /**
+ Defines the frames per second of the animation
+ @type Number
+ */
+ this.timeBetweenFrames = 0;
+ /**
+ The number of individual frames held in the image
+ @type Number
+ */
+ /**
+ Time until the next frame
+ @type number
+ */
+ this.timeSinceLastFrame = 0;
+ /**
+ The width of each individual frame
+ @type Number
+ */
+ this.frameWidth = 0;
+
+ /**
+ Initialises this object
+ @param image The image to be displayed
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The depth
+ @param frameCount The number of animation frames in the image
+ @param fps The frames per second to animate this object at
+ */
+ this.startupAnimatedGameObject = function(/**Image*/ image, /**Number*/ x, /**Number*/ y, /**Number*/ z,
+/**Number*/ frameCount, /**Number*/ fps)
+ {
+ if (frameCount <= 0) throw "framecount can not be <= 0";
+ if (fps <= 0) throw "fps can not be <= 0"
+
+ this.startupVisualGameObject(image, x, y, z);
+ this.currentFrame = 0;
+ this.frameCount = frameCount;
+ this.timeBetweenFrames = 1/fps;
+ this.timeSinceLastFrame = this.timeBetweenFrames;
+ this.frameWidth = this.image.width / this.frameCount;
+ }
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(/**Number*/ dt, /**CanvasRenderingContext2D*/ context, /**Number*/ xScroll, /**Number*/
+yScroll)
+ {
+ var sourceX = this.frameWidth * this.currentFrame;
+ context.drawImage(this.image, sourceX, 0, this.frameWidth, this.image.height, this.x - xScroll, this.y -
+yScroll, this.frameWidth, this.image.height);
+
+ this.timeSinceLastFrame -= dt;
+ if (this.timeSinceLastFrame <= 0)
+ {
+ this.timeSinceLastFrame = this.timeBetweenFrames;
+ ++this.currentFrame;
+ this.currentFrame %= this.frameCount;
+ }
+ }
+}
+
+AnimatedGameObject.prototype = new VisualGameObject;
diff --git a/static/tests/canvas1/jsplatformer5_files/ApplicationManager.js b/static/tests/canvas1/jsplatformer5_files/ApplicationManager.js
new file mode 100644
index 0000000..487d4d8
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/ApplicationManager.js
@@ -0,0 +1,42 @@
+/**
+ The ApplicationManager is used to manage the application itself.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function ApplicationManager()
+{
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupApplicationManager = function()
+ {
+ this.runner = new AnimatedGameObject().startupAnimatedGameObject(g_run, 0, 0, 1, 12, 1);
+ this.runner1 = new AnimatedGameObject().startupAnimatedGameObject(g_run1, 0, 40, 1, 12, 2);
+ this.runner2 = new AnimatedGameObject().startupAnimatedGameObject(g_run2, 0, 80, 1, 12, 3);
+ this.runner3 = new AnimatedGameObject().startupAnimatedGameObject(g_run3, 0, 120, 1, 12, 4);
+ this.runner4 = new AnimatedGameObject().startupAnimatedGameObject(g_run4, 0, 160, 1, 12, 15);
+ this.runner5 = new AnimatedGameObject().startupAnimatedGameObject(g_run5, 0, 200, 1, 12, 16);
+ this.runner6 = new AnimatedGameObject().startupAnimatedGameObject(g_run6, 0, 240, 1, 12, 17);
+ this.runner7 = new AnimatedGameObject().startupAnimatedGameObject(g_run7, 0, 280, 1, 12, 18);
+ this.runner8 = new AnimatedGameObject().startupAnimatedGameObject(g_run8, 0, 320, 1, 12, 9);
+ this.runner9 = new AnimatedGameObject().startupAnimatedGameObject(g_run9, 0, 360, 1, 12, 10);
+ this.runner10 = new AnimatedGameObject().startupAnimatedGameObject(g_run10, 0, 400, 1, 12, 20);
+ this.runner11 = new AnimatedGameObject().startupAnimatedGameObject(g_run11, 0, 440, 1, 12, 19);
+ this.runner12 = new AnimatedGameObject().startupAnimatedGameObject(g_run12, 0, 480, 1, 12, 8);
+ this.runner13 = new AnimatedGameObject().startupAnimatedGameObject(g_run13, 0, 520, 1, 12, 7);
+ this.runner14 = new AnimatedGameObject().startupAnimatedGameObject(g_run14, 0, 560, 1, 12, 6);
+ this.runner15 = new AnimatedGameObject().startupAnimatedGameObject(g_run15, 0, 600, 1, 12, 5);
+ this.runner16 = new AnimatedGameObject().startupAnimatedGameObject(g_run16, 0, 640, 1, 12, 14);
+ this.runner17 = new AnimatedGameObject().startupAnimatedGameObject(g_run17, 0, 680, 1, 12, 13);
+ this.runner18 = new AnimatedGameObject().startupAnimatedGameObject(g_run18, 0, 720, 1, 12, 12);
+ this.runner19 = new AnimatedGameObject().startupAnimatedGameObject(g_run19, 0, 760, 1, 12, 11);
+ this.runner20 = new AnimatedGameObject().startupAnimatedGameObject(g_run20, 0, 800, 1, 12, 21);
+ this.runner21 = new AnimatedGameObject().startupAnimatedGameObject(g_run21, 0, 840, 1, 12, 22);
+ this.runner22 = new AnimatedGameObject().startupAnimatedGameObject(g_run22, 0, 880, 1, 12, 23);
+ this.runner23 = new AnimatedGameObject().startupAnimatedGameObject(g_run23, 0, 920, 1, 12, 24);
+ this.runner24 = new AnimatedGameObject().startupAnimatedGameObject(g_run24, 0, 960, 1, 12, 25);
+ this.runner25 = new AnimatedGameObject().startupAnimatedGameObject(g_run25, 0, 1000, 1, 12, 30);
+ return this;
+ }
+}
diff --git a/static/tests/canvas1/jsplatformer5_files/GameObject.js b/static/tests/canvas1/jsplatformer5_files/GameObject.js
new file mode 100644
index 0000000..e6e4e09
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/GameObject.js
@@ -0,0 +1,46 @@
+/**
+ The base class for all elements that appear in the game.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function GameObject()
+{
+ /** Display depth order. A smaller zOrder means the element is rendered first, and therefor
+ in the background.
+ @type Number
+ */
+ this.zOrder = 0;
+ /**
+ The position on the X axis
+ @type Number
+ */
+ this.x = 0;
+ /**
+ The position on the Y axis
+ @type Number
+ */
+ this.y = 0;
+
+ /**
+ Initialises the object, and adds it to the list of objects held by the GameObjectManager.
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The z order of the element (elements in the background have a lower z value)
+ */
+ this.startupGameObject = function(/**Number*/ x, /**Number*/ y, /**Number*/ z)
+ {
+ this.zOrder = z;
+ this.x = x;
+ this.y = y;
+ g_GameObjectManager.addGameObject(this);
+ return this;
+ }
+
+ /**
+ Cleans up the object, and removes it from the list of objects held by the GameObjectManager.
+ */
+ this.shutdownGameObject = function()
+ {
+ g_GameObjectManager.removeGameObject(this);
+ }
+}
diff --git a/static/tests/canvas1/jsplatformer5_files/GameObjectManager.js b/static/tests/canvas1/jsplatformer5_files/GameObjectManager.js
new file mode 100644
index 0000000..c22ccd0
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/GameObjectManager.js
@@ -0,0 +1,125 @@
+/**
+ A manager for all the objects in the game
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function GameObjectManager()
+{
+ /** An array of game objects
+ @type Arary
+ */
+ this.gameObjects = new Array();
+ /** The time that the last frame was rendered
+ @type Date
+ */
+ this.lastFrame = new Date().getTime();
+ /** The global scrolling value of the x axis
+ @type Number
+ */
+ this.xScroll = 0;
+ /** The global scrolling value of the y axis
+ @type Number
+ */
+ this.yScroll = 0;
+ /** A reference to the ApplicationManager instance
+ @type ApplicationManager
+ */
+ this.applicationManager = null;
+ /** A reference to the canvas element
+ @type HTMLCanvasElement
+ */
+ this.canvas = null;
+ /** A reference to the 2D context of the canvas element
+ @type CanvasRenderingContext2D
+ */
+ this.context2D = null;
+ /** A reference to the in-memory canvas used as a back buffer
+ @type HTMLCanvasElement
+ */
+ this.backBuffer = null;
+ /** A reference to the backbuffer 2D context
+ @type CanvasRenderingContext2D
+ */
+ this.backBufferContext2D = null;
+
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupGameObjectManager = function()
+ {
+ // set the global pointer to reference this object
+ g_GameObjectManager = this;
+
+ // get references to the canvas elements and their 2D contexts
+ this.canvas = document.getElementById('canvas');
+ this.context2D = this.canvas.getContext('2d');
+ this.backBuffer = document.createElement('canvas');
+ this.backBuffer.width = this.canvas.width;
+ this.backBuffer.height = this.canvas.height;
+ this.backBufferContext2D = this.backBuffer.getContext('2d');
+
+ // create a new ApplicationManager
+ this.applicationManager = new ApplicationManager().startupApplicationManager();
+
+ // use setInterval to call the draw function
+ setInterval(function(){g_GameObjectManager.draw();}, SECONDS_BETWEEN_FRAMES);
+
+ return this;
+ }
+
+ /**
+ The render loop
+ */
+ this.draw = function ()
+ {
+ // calculate the time since the last frame
+ var thisFrame = new Date().getTime();
+ var dt = (thisFrame - this.lastFrame)/1000;
+ this.lastFrame = thisFrame;
+
+ // clear the drawing contexts
+ this.backBufferContext2D.clearRect(0, 0, this.backBuffer.width, this.backBuffer.height);
+ this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);
+
+ // first update all the game objects
+ for (x in this.gameObjects)
+ {
+ if (this.gameObjects[x].update)
+ {
+ this.gameObjects[x].update(dt, this.backBufferContext2D, this.xScroll, this.yScroll);
+ }
+ }
+
+ // then draw the game objects
+ for (x in this.gameObjects)
+ {
+ if (this.gameObjects[x].draw)
+ {
+ this.gameObjects[x].draw(dt, this.backBufferContext2D, this.xScroll, this.yScroll);
+ }
+ }
+
+ // copy the back buffer to the displayed canvas
+ this.context2D.drawImage(this.backBuffer, 0, 0);
+ };
+
+ /**
+ Adds a new GameObject to the gameObjects collection
+ @param gameObject The object to add
+ */
+ this.addGameObject = function(gameObject)
+ {
+ this.gameObjects.push(gameObject);
+ this.gameObjects.sort(function(a,b){return a.zOrder - b.zOrder;})
+ };
+
+ /**
+ Removes a GameObject from the gameObjects collection
+ @param gameObject The object to remove
+ */
+ this.removeGameObject = function(gameObject)
+ {
+ this.gameObjects.removeObject(gameObject);
+ }
+}
diff --git a/static/tests/canvas1/jsplatformer5_files/Main.js b/static/tests/canvas1/jsplatformer5_files/Main.js
new file mode 100644
index 0000000..752ffa4
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/Main.js
@@ -0,0 +1,81 @@
+/** target frames per second
+ @type Number
+*/
+var FPS = 30;
+/** time between frames
+ @type Number
+*/
+var SECONDS_BETWEEN_FRAMES = 1 / FPS;
+/** A global reference to the GameObjectManager instance
+ @type GameObjectManager
+*/
+var g_GameObjectManager = null;
+/** An image to be used by the application
+ @type Image
+*/
+var g_run = new Image();
+var g_run1 = new Image();
+var g_run2 = new Image();
+var g_run3 = new Image();
+var g_run4 = new Image();
+var g_run5 = new Image();
+var g_run6 = new Image();
+var g_run7 = new Image();
+var g_run8 = new Image();
+var g_run9 = new Image();
+var g_run10 = new Image();
+var g_run11 = new Image();
+var g_run12 = new Image();
+var g_run13 = new Image();
+var g_run14 = new Image();
+var g_run15 = new Image();
+var g_run16 = new Image();
+var g_run17 = new Image();
+var g_run18 = new Image();
+var g_run19 = new Image();
+var g_run20 = new Image();
+var g_run21 = new Image();
+var g_run22 = new Image();
+var g_run23 = new Image();
+var g_run24 = new Image();
+var g_run25 = new Image();
+
+g_run.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run1.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run2.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run3.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run4.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run5.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run6.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run7.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run8.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run9.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run10.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run11.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run12.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run13.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run14.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run15.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run16.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run17.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run18.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run19.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run20.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run21.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run22.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run23.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run24.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run25.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+
+
+
+// The entry point of the application is set to the init function
+window.onload = init;
+
+/**
+ Application entry point
+*/
+function init()
+{
+ new GameObjectManager().startupGameObjectManager();
+}
diff --git a/static/tests/canvas1/jsplatformer5_files/RepeatingGameObject.js b/static/tests/canvas1/jsplatformer5_files/RepeatingGameObject.js
new file mode 100644
index 0000000..b145e97
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/RepeatingGameObject.js
@@ -0,0 +1,90 @@
+/**
+ A class that display a repeating texture that can optionall be offset in either
+ the x or y axis
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function RepeatingGameObject()
+{
+ /** The width that the final image will take up
+ @type Number
+ */
+ this.width = 0;
+ /** The height that the final image will take up
+ @type Number
+ */
+ this.height = 0;
+ /** How much of the scrollX and scrollY to apply when drawing
+ @type Number
+ */
+ this.scrollFactor = 1;
+
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupRepeatingGameObject = function(image, x, y, z, width, height, scrollFactor)
+ {
+ this.startupVisualGameObject(image, x, y, z);
+ this.width = width;
+ this.height = height;
+ this.scrollFactor = scrollFactor;
+ return this;
+ }
+
+ /**
+ Clean this object up
+ */
+ this.shutdownstartupRepeatingGameObject = function()
+ {
+ this.shutdownVisualGameObject();
+ }
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(dt, canvas, xScroll, yScroll)
+ {
+ var areaDrawn = [0, 0];
+
+ for (var y = 0; y < this.height; y += areaDrawn[1])
+ {
+ for (var x = 0; x < this.width; x += areaDrawn[0])
+ {
+ // the top left corner to start drawing the next tile from
+ var newPosition = [this.x + x, this.y + y];
+ // the amount of space left in which to draw
+ var newFillArea = [this.width - x, this.height - y];
+ // the first time around you have to start drawing from the middle of the image
+ // subsequent tiles alwyas get drawn from the top or left
+ var newScrollPosition = [0, 0];
+ if (x==0) newScrollPosition[0] = xScroll * this.scrollFactor;
+ if (y==0) newScrollPosition[1] = yScroll * this.scrollFactor;
+ areaDrawn = this.drawRepeat(canvas, newPosition, newFillArea, newScrollPosition);
+ }
+ }
+ }
+
+ this.drawRepeat = function(canvas, newPosition, newFillArea, newScrollPosition)
+ {
+ // find where in our repeating texture to start drawing (the top left corner)
+ var xOffset = Math.abs(newScrollPosition[0]) % this.image.width;
+ var yOffset = Math.abs(newScrollPosition[1]) % this.image.height;
+ var left = newScrollPosition[0]<0?this.image.width-xOffset:xOffset;
+ var top = newScrollPosition[1]<0?this.image.height-yOffset:yOffset;
+ var width = newFillArea[0] < this.image.width-left?newFillArea[0]:this.image.width-left;
+ var height = newFillArea[1] < this.image.height-top?newFillArea[1]:this.image.height-top;
+
+ // draw the image
+ canvas.drawImage(this.image, left, top, width, height, newPosition[0], newPosition[1], width, height);
+
+ return [width, height];
+ }
+
+
+}
+RepeatingGameObject.prototype = new VisualGameObject();
diff --git a/static/tests/canvas1/jsplatformer5_files/Utils.js b/static/tests/canvas1/jsplatformer5_files/Utils.js
new file mode 100644
index 0000000..0ec5cfa
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/Utils.js
@@ -0,0 +1,27 @@
+/**
+ Removes a number of objects from the array
+ @param from The first object to remove
+ @param to (Optional) The last object to remove
+*/
+Array.prototype.remove = function(/**Number*/ from, /**Number*/ to)
+{
+ var rest = this.slice((to || from) + 1 || this.length);
+ this.length = from < 0 ? this.length + from : from;
+ return this.push.apply(this, rest);
+};
+
+/**
+ Removes a specific object from the array
+ @param object The object to remove
+*/
+Array.prototype.removeObject = function(object)
+{
+ for (var i = 0; i < this.length; ++i)
+ {
+ if (this[i] === object)
+ {
+ this.remove(i);
+ break;
+ }
+ }
+}
diff --git a/static/tests/canvas1/jsplatformer5_files/VisualGameObject.js b/static/tests/canvas1/jsplatformer5_files/VisualGameObject.js
new file mode 100644
index 0000000..3f3329a
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/VisualGameObject.js
@@ -0,0 +1,49 @@
+/**
+ The base class for all elements that appear in the game.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function VisualGameObject()
+{
+ /**
+ The image that will be displayed by this object
+ @type Image
+ */
+ this.image = null;
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(/**Number*/ dt, /**CanvasRenderingContext2D*/ context, /**Number*/ xScroll, /**Number*/
+yScroll)
+ {
+ context.drawImage(this.image, this.x - xScroll, this.y - yScroll);
+ }
+
+ /**
+ Initialises this object
+ @param image The image to be displayed
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The depth
+ */
+ this.startupVisualGameObject = function(/**Image*/ image, /**Number*/ x, /**Number*/ y, /**Number*/ z)
+ {
+ this.startupGameObject(x, y, z);
+ this.image = image;
+ return this;
+ }
+
+ /**
+ Clean this object up
+ */
+ this.shutdownVisualGameObject = function()
+ {
+ this.shutdownGameObject();
+ }
+}
+VisualGameObject.prototype = new GameObject;
diff --git a/static/tests/canvas2/index.html b/static/tests/canvas2/index.html
new file mode 100644
index 0000000..dfff8af
--- /dev/null
+++ b/static/tests/canvas2/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en"><head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+
+
+ <script type="text/javascript" src="jsplatformer5_files/GameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/VisualGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/RepeatingGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/AnimatedGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/Utils.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/ApplicationManager.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/GameObjectManager.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/Main.js"></script>
+ <style type="text/css">
+ body { font-family: Arial,Helvetica,sans-serif;}
+ </style>
+</head><body>
+
+ <canvas id="canvas" width="80" height="1200" >
+ <p>
+ Your browser does not support the canvas element.
+ </p>
+ </canvas>
+</body></html>
diff --git a/static/tests/canvas2/jsplatformer5_files/AnimatedGameObject.js b/static/tests/canvas2/jsplatformer5_files/AnimatedGameObject.js
new file mode 100644
index 0000000..895fc19
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/AnimatedGameObject.js
@@ -0,0 +1,80 @@
+/**
+ Displays an animated Game Object
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function AnimatedGameObject()
+{
+ /**
+ Defines the current frame that is to be rendered
+ @type Number
+ */
+ this.currentFrame = 0;
+ /**
+ Defines the frames per second of the animation
+ @type Number
+ */
+ this.timeBetweenFrames = 0;
+ /**
+ The number of individual frames held in the image
+ @type Number
+ */
+ /**
+ Time until the next frame
+ @type number
+ */
+ this.timeSinceLastFrame = 0;
+ /**
+ The width of each individual frame
+ @type Number
+ */
+ this.frameWidth = 0;
+
+ /**
+ Initialises this object
+ @param image The image to be displayed
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The depth
+ @param frameCount The number of animation frames in the image
+ @param fps The frames per second to animate this object at
+ */
+ this.startupAnimatedGameObject = function(/**Image*/ image, /**Number*/ x, /**Number*/ y, /**Number*/ z,
+/**Number*/ frameCount, /**Number*/ fps)
+ {
+ if (frameCount <= 0) throw "framecount can not be <= 0";
+ if (fps <= 0) throw "fps can not be <= 0"
+
+ this.startupVisualGameObject(image, x, y, z);
+ this.currentFrame = 0;
+ this.frameCount = frameCount;
+ this.timeBetweenFrames = 1/fps;
+ this.timeSinceLastFrame = this.timeBetweenFrames;
+ this.frameWidth = this.image.width / this.frameCount;
+ }
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(/**Number*/ dt, /**CanvasRenderingContext2D*/ context, /**Number*/ xScroll, /**Number*/
+yScroll)
+ {
+ var sourceX = this.frameWidth * this.currentFrame;
+ context.drawImage(this.image, sourceX, 0, this.frameWidth, this.image.height, this.x - xScroll, this.y -
+yScroll, this.frameWidth, this.image.height);
+
+ this.timeSinceLastFrame -= dt;
+ if (this.timeSinceLastFrame <= 0)
+ {
+ this.timeSinceLastFrame = this.timeBetweenFrames;
+ ++this.currentFrame;
+ this.currentFrame %= this.frameCount;
+ }
+ }
+}
+
+AnimatedGameObject.prototype = new VisualGameObject;
diff --git a/static/tests/canvas2/jsplatformer5_files/ApplicationManager.js b/static/tests/canvas2/jsplatformer5_files/ApplicationManager.js
new file mode 100644
index 0000000..e572e02
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/ApplicationManager.js
@@ -0,0 +1,42 @@
+/**
+ The ApplicationManager is used to manage the application itself.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function ApplicationManager()
+{
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupApplicationManager = function()
+ {
+ this.runner = new AnimatedGameObject().startupAnimatedGameObject(g_run, 0, 0, 1, 12, 10);
+ this.runner1 = new AnimatedGameObject().startupAnimatedGameObject(g_run1, 0, 40, 1, 12, 10);
+ this.runner2 = new AnimatedGameObject().startupAnimatedGameObject(g_run2, 0, 80, 1, 12, 10);
+ this.runner3 = new AnimatedGameObject().startupAnimatedGameObject(g_run3, 0, 120, 1, 12, 10);
+ this.runner4 = new AnimatedGameObject().startupAnimatedGameObject(g_run4, 0, 160, 1, 12, 10);
+ this.runner5 = new AnimatedGameObject().startupAnimatedGameObject(g_run5, 0, 200, 1, 12, 10);
+ this.runner6 = new AnimatedGameObject().startupAnimatedGameObject(g_run6, 0, 240, 1, 12, 10);
+ this.runner7 = new AnimatedGameObject().startupAnimatedGameObject(g_run7, 0, 280, 1, 12, 10);
+ this.runner8 = new AnimatedGameObject().startupAnimatedGameObject(g_run8, 0, 320, 1, 12, 10);
+ this.runner9 = new AnimatedGameObject().startupAnimatedGameObject(g_run9, 0, 360, 1, 12, 10);
+ this.runner10 = new AnimatedGameObject().startupAnimatedGameObject(g_run10, 0, 400, 1, 12, 10);
+ this.runner11 = new AnimatedGameObject().startupAnimatedGameObject(g_run11, 0, 440, 1, 12, 10);
+ this.runner12 = new AnimatedGameObject().startupAnimatedGameObject(g_run12, 0, 480, 1, 12, 10);
+ this.runner13 = new AnimatedGameObject().startupAnimatedGameObject(g_run13, 0, 520, 1, 12, 10);
+ this.runner14 = new AnimatedGameObject().startupAnimatedGameObject(g_run14, 0, 560, 1, 12, 10);
+ this.runner15 = new AnimatedGameObject().startupAnimatedGameObject(g_run15, 0, 600, 1, 12, 10);
+ this.runner16 = new AnimatedGameObject().startupAnimatedGameObject(g_run16, 0, 640, 1, 12, 10);
+ this.runner17 = new AnimatedGameObject().startupAnimatedGameObject(g_run17, 0, 680, 1, 12, 10);
+ this.runner18 = new AnimatedGameObject().startupAnimatedGameObject(g_run18, 0, 720, 1, 12, 10);
+ this.runner19 = new AnimatedGameObject().startupAnimatedGameObject(g_run19, 0, 760, 1, 12, 10);
+ this.runner20 = new AnimatedGameObject().startupAnimatedGameObject(g_run20, 0, 800, 1, 12, 10);
+ this.runner21 = new AnimatedGameObject().startupAnimatedGameObject(g_run21, 0, 840, 1, 12, 10);
+ this.runner22 = new AnimatedGameObject().startupAnimatedGameObject(g_run22, 0, 880, 1, 12, 10);
+ this.runner23 = new AnimatedGameObject().startupAnimatedGameObject(g_run23, 0, 920, 1, 12, 10);
+ this.runner24 = new AnimatedGameObject().startupAnimatedGameObject(g_run24, 0, 960, 1, 12, 10);
+ this.runner25 = new AnimatedGameObject().startupAnimatedGameObject(g_run25, 0, 1000, 1, 12, 10);
+ return this;
+ }
+}
diff --git a/static/tests/canvas2/jsplatformer5_files/GameObject.js b/static/tests/canvas2/jsplatformer5_files/GameObject.js
new file mode 100644
index 0000000..e6e4e09
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/GameObject.js
@@ -0,0 +1,46 @@
+/**
+ The base class for all elements that appear in the game.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function GameObject()
+{
+ /** Display depth order. A smaller zOrder means the element is rendered first, and therefor
+ in the background.
+ @type Number
+ */
+ this.zOrder = 0;
+ /**
+ The position on the X axis
+ @type Number
+ */
+ this.x = 0;
+ /**
+ The position on the Y axis
+ @type Number
+ */
+ this.y = 0;
+
+ /**
+ Initialises the object, and adds it to the list of objects held by the GameObjectManager.
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The z order of the element (elements in the background have a lower z value)
+ */
+ this.startupGameObject = function(/**Number*/ x, /**Number*/ y, /**Number*/ z)
+ {
+ this.zOrder = z;
+ this.x = x;
+ this.y = y;
+ g_GameObjectManager.addGameObject(this);
+ return this;
+ }
+
+ /**
+ Cleans up the object, and removes it from the list of objects held by the GameObjectManager.
+ */
+ this.shutdownGameObject = function()
+ {
+ g_GameObjectManager.removeGameObject(this);
+ }
+}
diff --git a/static/tests/canvas2/jsplatformer5_files/GameObjectManager.js b/static/tests/canvas2/jsplatformer5_files/GameObjectManager.js
new file mode 100644
index 0000000..c22ccd0
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/GameObjectManager.js
@@ -0,0 +1,125 @@
+/**
+ A manager for all the objects in the game
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function GameObjectManager()
+{
+ /** An array of game objects
+ @type Arary
+ */
+ this.gameObjects = new Array();
+ /** The time that the last frame was rendered
+ @type Date
+ */
+ this.lastFrame = new Date().getTime();
+ /** The global scrolling value of the x axis
+ @type Number
+ */
+ this.xScroll = 0;
+ /** The global scrolling value of the y axis
+ @type Number
+ */
+ this.yScroll = 0;
+ /** A reference to the ApplicationManager instance
+ @type ApplicationManager
+ */
+ this.applicationManager = null;
+ /** A reference to the canvas element
+ @type HTMLCanvasElement
+ */
+ this.canvas = null;
+ /** A reference to the 2D context of the canvas element
+ @type CanvasRenderingContext2D
+ */
+ this.context2D = null;
+ /** A reference to the in-memory canvas used as a back buffer
+ @type HTMLCanvasElement
+ */
+ this.backBuffer = null;
+ /** A reference to the backbuffer 2D context
+ @type CanvasRenderingContext2D
+ */
+ this.backBufferContext2D = null;
+
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupGameObjectManager = function()
+ {
+ // set the global pointer to reference this object
+ g_GameObjectManager = this;
+
+ // get references to the canvas elements and their 2D contexts
+ this.canvas = document.getElementById('canvas');
+ this.context2D = this.canvas.getContext('2d');
+ this.backBuffer = document.createElement('canvas');
+ this.backBuffer.width = this.canvas.width;
+ this.backBuffer.height = this.canvas.height;
+ this.backBufferContext2D = this.backBuffer.getContext('2d');
+
+ // create a new ApplicationManager
+ this.applicationManager = new ApplicationManager().startupApplicationManager();
+
+ // use setInterval to call the draw function
+ setInterval(function(){g_GameObjectManager.draw();}, SECONDS_BETWEEN_FRAMES);
+
+ return this;
+ }
+
+ /**
+ The render loop
+ */
+ this.draw = function ()
+ {
+ // calculate the time since the last frame
+ var thisFrame = new Date().getTime();
+ var dt = (thisFrame - this.lastFrame)/1000;
+ this.lastFrame = thisFrame;
+
+ // clear the drawing contexts
+ this.backBufferContext2D.clearRect(0, 0, this.backBuffer.width, this.backBuffer.height);
+ this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);
+
+ // first update all the game objects
+ for (x in this.gameObjects)
+ {
+ if (this.gameObjects[x].update)
+ {
+ this.gameObjects[x].update(dt, this.backBufferContext2D, this.xScroll, this.yScroll);
+ }
+ }
+
+ // then draw the game objects
+ for (x in this.gameObjects)
+ {
+ if (this.gameObjects[x].draw)
+ {
+ this.gameObjects[x].draw(dt, this.backBufferContext2D, this.xScroll, this.yScroll);
+ }
+ }
+
+ // copy the back buffer to the displayed canvas
+ this.context2D.drawImage(this.backBuffer, 0, 0);
+ };
+
+ /**
+ Adds a new GameObject to the gameObjects collection
+ @param gameObject The object to add
+ */
+ this.addGameObject = function(gameObject)
+ {
+ this.gameObjects.push(gameObject);
+ this.gameObjects.sort(function(a,b){return a.zOrder - b.zOrder;})
+ };
+
+ /**
+ Removes a GameObject from the gameObjects collection
+ @param gameObject The object to remove
+ */
+ this.removeGameObject = function(gameObject)
+ {
+ this.gameObjects.removeObject(gameObject);
+ }
+}
diff --git a/static/tests/canvas2/jsplatformer5_files/Main.js b/static/tests/canvas2/jsplatformer5_files/Main.js
new file mode 100644
index 0000000..752ffa4
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/Main.js
@@ -0,0 +1,81 @@
+/** target frames per second
+ @type Number
+*/
+var FPS = 30;
+/** time between frames
+ @type Number
+*/
+var SECONDS_BETWEEN_FRAMES = 1 / FPS;
+/** A global reference to the GameObjectManager instance
+ @type GameObjectManager
+*/
+var g_GameObjectManager = null;
+/** An image to be used by the application
+ @type Image
+*/
+var g_run = new Image();
+var g_run1 = new Image();
+var g_run2 = new Image();
+var g_run3 = new Image();
+var g_run4 = new Image();
+var g_run5 = new Image();
+var g_run6 = new Image();
+var g_run7 = new Image();
+var g_run8 = new Image();
+var g_run9 = new Image();
+var g_run10 = new Image();
+var g_run11 = new Image();
+var g_run12 = new Image();
+var g_run13 = new Image();
+var g_run14 = new Image();
+var g_run15 = new Image();
+var g_run16 = new Image();
+var g_run17 = new Image();
+var g_run18 = new Image();
+var g_run19 = new Image();
+var g_run20 = new Image();
+var g_run21 = new Image();
+var g_run22 = new Image();
+var g_run23 = new Image();
+var g_run24 = new Image();
+var g_run25 = new Image();
+
+g_run.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run1.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run2.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run3.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run4.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run5.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run6.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run7.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run8.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run9.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run10.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run11.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run12.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run13.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run14.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run15.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run16.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run17.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run18.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run19.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run20.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run21.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run22.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run23.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run24.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run25.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+
+
+
+// The entry point of the application is set to the init function
+window.onload = init;
+
+/**
+ Application entry point
+*/
+function init()
+{
+ new GameObjectManager().startupGameObjectManager();
+}
diff --git a/static/tests/canvas2/jsplatformer5_files/RepeatingGameObject.js b/static/tests/canvas2/jsplatformer5_files/RepeatingGameObject.js
new file mode 100644
index 0000000..b145e97
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/RepeatingGameObject.js
@@ -0,0 +1,90 @@
+/**
+ A class that display a repeating texture that can optionall be offset in either
+ the x or y axis
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function RepeatingGameObject()
+{
+ /** The width that the final image will take up
+ @type Number
+ */
+ this.width = 0;
+ /** The height that the final image will take up
+ @type Number
+ */
+ this.height = 0;
+ /** How much of the scrollX and scrollY to apply when drawing
+ @type Number
+ */
+ this.scrollFactor = 1;
+
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupRepeatingGameObject = function(image, x, y, z, width, height, scrollFactor)
+ {
+ this.startupVisualGameObject(image, x, y, z);
+ this.width = width;
+ this.height = height;
+ this.scrollFactor = scrollFactor;
+ return this;
+ }
+
+ /**
+ Clean this object up
+ */
+ this.shutdownstartupRepeatingGameObject = function()
+ {
+ this.shutdownVisualGameObject();
+ }
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(dt, canvas, xScroll, yScroll)
+ {
+ var areaDrawn = [0, 0];
+
+ for (var y = 0; y < this.height; y += areaDrawn[1])
+ {
+ for (var x = 0; x < this.width; x += areaDrawn[0])
+ {
+ // the top left corner to start drawing the next tile from
+ var newPosition = [this.x + x, this.y + y];
+ // the amount of space left in which to draw
+ var newFillArea = [this.width - x, this.height - y];
+ // the first time around you have to start drawing from the middle of the image
+ // subsequent tiles alwyas get drawn from the top or left
+ var newScrollPosition = [0, 0];
+ if (x==0) newScrollPosition[0] = xScroll * this.scrollFactor;
+ if (y==0) newScrollPosition[1] = yScroll * this.scrollFactor;
+ areaDrawn = this.drawRepeat(canvas, newPosition, newFillArea, newScrollPosition);
+ }
+ }
+ }
+
+ this.drawRepeat = function(canvas, newPosition, newFillArea, newScrollPosition)
+ {
+ // find where in our repeating texture to start drawing (the top left corner)
+ var xOffset = Math.abs(newScrollPosition[0]) % this.image.width;
+ var yOffset = Math.abs(newScrollPosition[1]) % this.image.height;
+ var left = newScrollPosition[0]<0?this.image.width-xOffset:xOffset;
+ var top = newScrollPosition[1]<0?this.image.height-yOffset:yOffset;
+ var width = newFillArea[0] < this.image.width-left?newFillArea[0]:this.image.width-left;
+ var height = newFillArea[1] < this.image.height-top?newFillArea[1]:this.image.height-top;
+
+ // draw the image
+ canvas.drawImage(this.image, left, top, width, height, newPosition[0], newPosition[1], width, height);
+
+ return [width, height];
+ }
+
+
+}
+RepeatingGameObject.prototype = new VisualGameObject();
diff --git a/static/tests/canvas2/jsplatformer5_files/Utils.js b/static/tests/canvas2/jsplatformer5_files/Utils.js
new file mode 100644
index 0000000..0ec5cfa
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/Utils.js
@@ -0,0 +1,27 @@
+/**
+ Removes a number of objects from the array
+ @param from The first object to remove
+ @param to (Optional) The last object to remove
+*/
+Array.prototype.remove = function(/**Number*/ from, /**Number*/ to)
+{
+ var rest = this.slice((to || from) + 1 || this.length);
+ this.length = from < 0 ? this.length + from : from;
+ return this.push.apply(this, rest);
+};
+
+/**
+ Removes a specific object from the array
+ @param object The object to remove
+*/
+Array.prototype.removeObject = function(object)
+{
+ for (var i = 0; i < this.length; ++i)
+ {
+ if (this[i] === object)
+ {
+ this.remove(i);
+ break;
+ }
+ }
+}
diff --git a/static/tests/canvas2/jsplatformer5_files/VisualGameObject.js b/static/tests/canvas2/jsplatformer5_files/VisualGameObject.js
new file mode 100644
index 0000000..3f3329a
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/VisualGameObject.js
@@ -0,0 +1,49 @@
+/**
+ The base class for all elements that appear in the game.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function VisualGameObject()
+{
+ /**
+ The image that will be displayed by this object
+ @type Image
+ */
+ this.image = null;
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(/**Number*/ dt, /**CanvasRenderingContext2D*/ context, /**Number*/ xScroll, /**Number*/
+yScroll)
+ {
+ context.drawImage(this.image, this.x - xScroll, this.y - yScroll);
+ }
+
+ /**
+ Initialises this object
+ @param image The image to be displayed
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The depth
+ */
+ this.startupVisualGameObject = function(/**Image*/ image, /**Number*/ x, /**Number*/ y, /**Number*/ z)
+ {
+ this.startupGameObject(x, y, z);
+ this.image = image;
+ return this;
+ }
+
+ /**
+ Clean this object up
+ */
+ this.shutdownVisualGameObject = function()
+ {
+ this.shutdownGameObject();
+ }
+}
+VisualGameObject.prototype = new GameObject;