comparison js/bt/other_libs/excanvas_0002/examples/example3.html @ 18:0d557e6e73f7

Added beautytips and some additional event handling code to the library.
author David Eads <eads@chicagotech.org>
date Fri, 06 Mar 2009 14:11:46 -0600
parents
children
comparison
equal deleted inserted replaced
17:1a77f87927dd 18:0d557e6e73f7
1 <!DOCTYPE html>
2
3 <!--
4
5 Copyright 2006 Google Inc.
6
7 Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
10
11 http://www.apache.org/licenses/LICENSE-2.0
12
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18
19 -->
20
21 <html>
22 <head>
23 <title></title>
24 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
25 <!--[if IE]><script type="text/javascript" src="../excanvas.js"></script><![endif]-->
26 <style type="text/css">
27
28 body {
29 overflow: hidden;
30 width: 100%;
31 height: 100%;
32 margin: 0;
33 }
34
35 #image-rotator {
36 position: absolute;
37 left: 0;
38 top: 0;
39 width: 100%;
40 height: 100%;
41 }
42
43 #image-rotator .tool-bar {
44 text-align: center;
45 }
46
47 .tool-bar button {
48 margin: 0.5em 0.5em 0 0;
49 }
50
51 #image-rotator img,
52 #image-rotator canvas {
53 position: absolute;
54 }
55
56 </style>
57 <script type="text/javascript">
58
59 function sawFunc(a) {
60 var PI = Math.PI;
61 var PI2 = PI / 2;
62 // make sure a is within 0 to PI
63 a = a % PI;
64 if (a < 0) {
65 a += PI;
66 }
67 if (a < PI2) {
68 return a / PI2;
69 } else {
70 return (PI - a) / PI2;
71 }
72 }
73
74 function easeInEaseOut(t) {
75 var t2 = t * t;
76 return 3 * t2 - 2 * t * t2;
77 }
78
79 function ImageRotator(el, src, w, h) {
80 this.element = el;
81 this.toolBar = el.getElementsByTagName("div")[0];
82 this.canvas = el.getElementsByTagName("canvas")[0];
83 var images = el.getElementsByTagName("img");
84 this.image = images[images.length - 1];
85 var btns = el.getElementsByTagName("button");
86 this.btnCw = btns[0];
87 this.btnCcw = btns[1];
88 var self = this;
89 this.btnCcw.onclick = function () {
90 self.rotateCcw();
91 };
92 this.btnCw.onclick = function () {
93 self.rotateCw();
94 };
95 this.image.onload = function (e) {
96 self.onImageLoad(e);
97 };
98 this.image.onerror = function (e) {
99 self.onImageError(e);
100 };
101 this.image.onabort = function (e) {
102 self.onImageAbort(e);
103 };
104 this.setImage(src, w, h);
105 this.layout();
106
107 var onResize = function () {
108 self.layout();
109 };
110 var onLoad = function () {
111 self.onWindowLoad();
112 };
113 if (window.addEventListener) {
114 window.addEventListener("resize", onResize, false);
115 window.addEventListener("load", onLoad, false);
116 } else if (window.attachEvent) {
117 window.attachEvent("onresize", onResize);
118 window.attachEvent("onload", onLoad);
119 }
120 }
121
122 ImageRotator.prototype = {
123 getLoaded: function () {
124 return this.imageLoaded && this.windowLoaded;
125 },
126 setImage: function (src, w, h) {
127 this.imageLoaded = false;
128 this.image.src = src;
129 this.imageWidth = w;
130 this.imageHeight = h;
131 },
132
133 layout: function () {
134 var PI2 = Math.PI / 2;
135 var h = this.element.clientHeight;
136 var w = this.element.clientWidth;
137 var th = this.toolBar.offsetHeight;
138 h -= this.toolBar.offsetHeight;
139 if (!this.ctx || !this.getLoaded()) {
140 this.btnCw.disabled = true;
141 this.btnCcw.disabled = true;
142 this.canvas.style.display = "none";
143 this.image.style.display = "block";
144 var ratio = Math.min(w / this.imageWidth, h / this.imageHeight, 1);
145 var imgW = this.imageWidth * ratio;
146 var imgH = this.imageHeight * ratio;
147 var y = th + (h - imgH) / 2;
148 var x = (w - imgW) / 2;
149 this.image.style.left = Math.round(x) + "px";
150 this.image.style.top = Math.round(y) + "px";
151 this.image.style.width = Math.round(imgW) + "px";
152 this.image.style.height = Math.round(imgH) + "px";
153 } else {
154 this.btnCw.disabled = this.isAnimating_;
155 this.btnCcw.disabled = this.isAnimating_;
156 this.canvas.style.display = "block";
157 this.image.style.display = "none";
158
159 this.canvas.style.left = 0 + "px";
160 this.canvas.style.top = th + "px";
161 this.canvas.style.width = w + "px";
162 this.canvas.width = w;
163 this.canvas.style.height = h + "px";
164 this.canvas.height = h;
165
166 this.ctx.save();
167 this.ctx.clearRect(0, 0, w, h);
168 this.ctx.translate(w / 2, h / 2);
169 this.ctx.rotate(this.rotation);
170 // 0 -> 1, sin(0) = 0
171 // PI / 2 -> H / W, sin(PI/2) = 1
172
173 // sin(PI/2) = 1 -> limit factor is w and imgH
174
175 var iw = this.imageWidth;
176 var ih = this.imageHeight;
177 var scale;
178 if (iw <= w && iw <= h && ih <= h && ih <= w) {
179 scale = 1;
180 } else {
181 var sinr = sawFunc(this.rotation);
182 var cosr = sawFunc(this.rotation + PI2);
183 var ratio1 = sinr * Math.min(w / ih, h / iw);
184 var ratio2 = cosr * Math.min(w / iw, h / ih);
185 var ratio = Math.min(1, ratio1 + ratio2);
186 scale = ratio;
187 }
188 this.ctx.scale(scale, scale);
189 this.ctx.translate(-iw / 2, -ih / 2);
190 this.ctx.drawImage(this.image, 0, 0, iw, ih);
191 this.ctx.restore();
192 }
193 },
194
195 rotation: 0,
196 animationDuration: 500,
197
198 rotateCcw: function () {
199 if (!this.isAnimating_) {
200 this.startTime_ = (new Date).valueOf();
201 this.currentAngle_ = this.rotation;
202 this.deltaAngle_ = Math.PI / 2;
203 this.isAnimating_ = true;
204 this.animCounter_ = 0;
205 this.rotate_();
206 }
207 },
208
209 rotateCw: function () {
210 if (!this.isAnimating_) {
211 this.startTime_ = (new Date).valueOf();
212 this.currentAngle_ = this.rotation;
213 this.deltaAngle_ = -Math.PI / 2;
214 this.isAnimating_ = true;
215 this.animCounter_ = 0;
216 this.rotate_();
217 }
218 },
219
220 rotate_: function () {
221 if (this.isAnimating_) {
222 var t = easeInEaseOut(Math.min(1, (new Date - this.startTime_) /
223 this.animationDuration));
224 this.rotation = t * this.deltaAngle_ + this.currentAngle_;
225 if (t < 1) {
226 var self = this;
227 window.setTimeout(function () {
228 self.rotate_();
229 }, 10);
230 } else {
231 this.isAnimating_ = false;
232 }
233 this.layout();
234 }
235 },
236
237 onImageLoad: function (e) {
238 this.imageLoaded = true;
239 this.initCanvas();
240 },
241 onImageError: function (e) {
242 this.imageLoaded = false;
243 },
244 onImageAbort: function (e) {
245 this.imageLoaded = false;
246 },
247 onWindowLoad: function (e) {
248 this.windowLoaded = true;
249 this.initCanvas();
250 },
251
252 initCanvas: function () {
253 if (!this.ctx && this.getLoaded()) {
254 // IE recreates the element?
255 this.canvas = this.element.getElementsByTagName("canvas")[0];
256 this.ctx = this.canvas.getContext("2d");
257
258 if (!this.ctx) {
259 return;
260 }
261 this.layout();
262 }
263 }
264 };
265
266 </script>
267 </head>
268 <body>
269
270 <div id="image-rotator">
271 <div class="tool-bar">
272 <button>Rotate Left</button><button>Rotate Right</button>
273 </div>
274 <canvas id="c"></canvas>
275 <img src="" alt="">
276 </div>
277 <script type="text/javascript">
278 new ImageRotator(document.getElementById("image-rotator"),
279 "ff.jpg", 608, 380);
280 </script>
281
282 </body>
283 </html>
284