OSDN Git Service

Version 0.6.169, add doc comment.
[pettanr/clientJs.git] / 0.6.x / js / 05_util / 03_XUtilImage.js
1 \r
2 var X_Util_Image_actualSize = {};\r
3 \r
4 /**\r
5  * ユーティリティ関数とユーティリティクラス\r
6  * @namespace X.Util.Image\r
7  */\r
8 X[ 'Util' ][ 'Image' ] = {      \r
9         'getActualDimension' : X_Util_Image_getActualDimension\r
10         \r
11         // Alpha Image, data uri ong ...\r
12 };\r
13 \r
14 /*\r
15  * Opacity不可 NetFront3.4\r
16  */\r
17 \r
18 /**\r
19  * <p>画像の実際のサイズを返します。\r
20  * <p>original\r
21  * <p> LICENSE: MIT\r
22  * <p> AUTHOR: uupaa.js@gmail.com\r
23  * @alias X.Util.Image.getActualDimension\r
24  * @param {Node|ImageElement|string}\r
25  * @return {array.<number>}\r
26  */\r
27 function X_Util_Image_getActualDimension( XnodeOrImageElemOrSrc ){\r
28         var xnode, img, remove, ret, run, memW, memH, w, h;\r
29 \r
30         if( X_Type_isString( XnodeOrImageElemOrSrc ) ){\r
31                 if( ret = X_Util_Image_actualSize[ X_URL_toAbsolutePath( XnodeOrImageElemOrSrc ) ] ) return ret;\r
32                 \r
33                 xnode = X_Node_systemNode[ 'create' ](\r
34                         'img',\r
35                         {\r
36                                 src : XnodeOrImageElemOrSrc\r
37                         },\r
38                         {\r
39                                 position   : 'absolute'\r
40                         }\r
41                 );\r
42                 X_Node_startUpdate();\r
43                 img    = X_UA_DOM.IE4 ? X_Node__ie4getRawNode( xnode ) : xnode[ '_rawObject' ];\r
44                 remove = true;\r
45         } else {\r
46                 if( XnodeOrImageElemOrSrc.constructor === Node ){\r
47                         xnode = XnodeOrImageElemOrSrc;\r
48                         img   = X_UA_DOM.IE4 ? X_Node__ie4getRawNode( xnode )[ '_rawObject' ] : xnode[ '_rawObject' ];\r
49                 } else\r
50                 if( X_Type_isHTMLElement( XnodeOrImageElemOrSrc ) ){\r
51                         img = XnodeOrImageElemOrSrc;\r
52                 } else\r
53                 if( XnodeOrImageElemOrSrc.constructor === X_EventDispatcher && X_Type_isImage( XnodeOrImageElemOrSrc[ '_rawObject' ] ) ){\r
54                         xnode = XnodeOrImageElemOrSrc;\r
55                         img   = xnode[ '_rawObject' ];\r
56                 } else {\r
57                         return;\r
58                 };\r
59                 if( ret = X_Util_Image_actualSize[ img.src ] ) return ret;\r
60         };\r
61 \r
62         // for Firefox, Safari, Google Chrome\r
63         if( img.naturalWidth ) return [ img.naturalWidth, img.naturalHeight ];\r
64 \r
65         if( 5 <= X_UA[ 'IE' ] ){// for IE\r
66                 run  = img.runtimeStyle;\r
67                 memW = run.width;\r
68                 memH = run.height;\r
69 \r
70                 // keep runtimeStyle\r
71                 run.width  = 'auto';\r
72                 // override\r
73                 run.height = 'auto';\r
74                 w = img.width;\r
75                 h = img.height;\r
76                 run.width  = memW;\r
77                 // restore\r
78                 run.height = memH;\r
79         } else {// for Opera and Other\r
80                 \r
81                 memW = w = img.width;\r
82                 memH = h = img.height;\r
83                 \r
84                 if( img.removeAttribute ){ // Safari1.3 の Image は removeAttribute がない\r
85                         // keep current style\r
86                         img.removeAttribute( 'width' );\r
87                         img.removeAttribute( 'height' );\r
88                         \r
89                         w = img.width;\r
90                         h = img.height;\r
91                         \r
92                         // restore\r
93                         img.width  = memW;\r
94                         img.height = memH;\r
95                 };\r
96         };\r
97         \r
98         ret = X_Util_Image_actualSize[ img.src ] = [ w, h ];\r
99         \r
100         remove && xnode[ 'kill' ]();\r
101         \r
102         return ret;\r
103 };\r
104 \r
105 \r