Mercurial > hg > LGMap
diff geotemco/lib/excanvas/examples/example3.html @ 0:57bde4830927
first commit
author | Zoe Hong <zhong@mpiwg-berlin.mpg.de> |
---|---|
date | Tue, 24 Mar 2015 11:37:17 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/geotemco/lib/excanvas/examples/example3.html Tue Mar 24 11:37:17 2015 +0100 @@ -0,0 +1,284 @@ +<!DOCTYPE html> + +<!-- + +Copyright 2006 Google Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +--> + +<html> +<head> +<title></title> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<!--[if IE]><script type="text/javascript" src="../excanvas.js"></script><![endif]--> +<style type="text/css"> + +body { + overflow: hidden; + width: 100%; + height: 100%; + margin: 0; +} + +#image-rotator { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +#image-rotator .tool-bar { + text-align: center; +} + +.tool-bar button { + margin: 0.5em 0.5em 0 0; +} + +#image-rotator img, +#image-rotator canvas { + position: absolute; +} + +</style> +<script type="text/javascript"> + +function sawFunc(a) { + var PI = Math.PI; + var PI2 = PI / 2; + // make sure a is within 0 to PI + a = a % PI; + if (a < 0) { + a += PI; + } + if (a < PI2) { + return a / PI2; + } else { + return (PI - a) / PI2; + } +} + +function easeInEaseOut(t) { + var t2 = t * t; + return 3 * t2 - 2 * t * t2; +} + +function ImageRotator(el, src, w, h) { + this.element = el; + this.toolBar = el.getElementsByTagName("div")[0]; + this.canvas = el.getElementsByTagName("canvas")[0]; + var images = el.getElementsByTagName("img"); + this.image = images[images.length - 1]; + var btns = el.getElementsByTagName("button"); + this.btnCw = btns[0]; + this.btnCcw = btns[1]; + var self = this; + this.btnCcw.onclick = function () { + self.rotateCcw(); + }; + this.btnCw.onclick = function () { + self.rotateCw(); + }; + this.image.onload = function (e) { + self.onImageLoad(e); + }; + this.image.onerror = function (e) { + self.onImageError(e); + }; + this.image.onabort = function (e) { + self.onImageAbort(e); + }; + this.setImage(src, w, h); + this.layout(); + + var onResize = function () { + self.layout(); + }; + var onLoad = function () { + self.onWindowLoad(); + }; + if (window.addEventListener) { + window.addEventListener("resize", onResize, false); + window.addEventListener("load", onLoad, false); + } else if (window.attachEvent) { + window.attachEvent("onresize", onResize); + window.attachEvent("onload", onLoad); + } +} + +ImageRotator.prototype = { + getLoaded: function () { + return this.imageLoaded && this.windowLoaded; + }, + setImage: function (src, w, h) { + this.imageLoaded = false; + this.image.src = src; + this.imageWidth = w; + this.imageHeight = h; + }, + + layout: function () { + var PI2 = Math.PI / 2; + var h = this.element.clientHeight; + var w = this.element.clientWidth; + var th = this.toolBar.offsetHeight; + h -= this.toolBar.offsetHeight; + if (!this.ctx || !this.getLoaded()) { + this.btnCw.disabled = true; + this.btnCcw.disabled = true; + this.canvas.style.display = "none"; + this.image.style.display = "block"; + var ratio = Math.min(w / this.imageWidth, h / this.imageHeight, 1); + var imgW = this.imageWidth * ratio; + var imgH = this.imageHeight * ratio; + var y = th + (h - imgH) / 2; + var x = (w - imgW) / 2; + this.image.style.left = Math.round(x) + "px"; + this.image.style.top = Math.round(y) + "px"; + this.image.style.width = Math.round(imgW) + "px"; + this.image.style.height = Math.round(imgH) + "px"; + } else { + this.btnCw.disabled = this.isAnimating_; + this.btnCcw.disabled = this.isAnimating_; + this.canvas.style.display = "block"; + this.image.style.display = "none"; + + this.canvas.style.left = 0 + "px"; + this.canvas.style.top = th + "px"; + this.canvas.style.width = w + "px"; + this.canvas.width = w; + this.canvas.style.height = h + "px"; + this.canvas.height = h; + + this.ctx.save(); + this.ctx.clearRect(0, 0, w, h); + this.ctx.translate(w / 2, h / 2); + this.ctx.rotate(this.rotation); + // 0 -> 1, sin(0) = 0 + // PI / 2 -> H / W, sin(PI/2) = 1 + + // sin(PI/2) = 1 -> limit factor is w and imgH + + var iw = this.imageWidth; + var ih = this.imageHeight; + var scale; + if (iw <= w && iw <= h && ih <= h && ih <= w) { + scale = 1; + } else { + var sinr = sawFunc(this.rotation); + var cosr = sawFunc(this.rotation + PI2); + var ratio1 = sinr * Math.min(w / ih, h / iw); + var ratio2 = cosr * Math.min(w / iw, h / ih); + var ratio = Math.min(1, ratio1 + ratio2); + scale = ratio; + } + this.ctx.scale(scale, scale); + this.ctx.translate(-iw / 2, -ih / 2); + this.ctx.drawImage(this.image, 0, 0, iw, ih); + this.ctx.restore(); + } + }, + + rotation: 0, + animationDuration: 500, + + rotateCcw: function () { + if (!this.isAnimating_) { + this.startTime_ = (new Date).valueOf(); + this.currentAngle_ = this.rotation; + this.deltaAngle_ = Math.PI / 2; + this.isAnimating_ = true; + this.animCounter_ = 0; + this.rotate_(); + } + }, + + rotateCw: function () { + if (!this.isAnimating_) { + this.startTime_ = (new Date).valueOf(); + this.currentAngle_ = this.rotation; + this.deltaAngle_ = -Math.PI / 2; + this.isAnimating_ = true; + this.animCounter_ = 0; + this.rotate_(); + } + }, + + rotate_: function () { + if (this.isAnimating_) { + var t = easeInEaseOut(Math.min(1, (new Date - this.startTime_) / + this.animationDuration)); + this.rotation = t * this.deltaAngle_ + this.currentAngle_; + if (t < 1) { + var self = this; + window.setTimeout(function () { + self.rotate_(); + }, 10); + } else { + this.isAnimating_ = false; + } + this.layout(); + } + }, + + onImageLoad: function (e) { + this.imageLoaded = true; + this.initCanvas(); + }, + onImageError: function (e) { + this.imageLoaded = false; + }, + onImageAbort: function (e) { + this.imageLoaded = false; + }, + onWindowLoad: function (e) { + this.windowLoaded = true; + this.initCanvas(); + }, + + initCanvas: function () { + if (!this.ctx && this.getLoaded()) { + // IE recreates the element? + this.canvas = this.element.getElementsByTagName("canvas")[0]; + this.ctx = this.canvas.getContext("2d"); + + if (!this.ctx) { + return; + } + this.layout(); + } + } +}; + +</script> +</head> +<body> + +<div id="image-rotator"> + <div class="tool-bar"> + <button>Rotate Left</button><button>Rotate Right</button> + </div> + <canvas id="c"></canvas> + <img src="" alt=""> +</div> +<script type="text/javascript"> + new ImageRotator(document.getElementById("image-rotator"), + "ff.jpg", 608, 380); +</script> + +</body> +</html> +