/Frameworks/Debug/AppKit/browser.platform/CALayer.j

http://github.com/jfahrenkrug/MapKit-HelloWorld · Unknown · 764 lines · 751 code · 13 blank · 0 comment · 0 complexity · f4cf7c0559379c3a303a4cbf5c0b2884 MD5 · raw file

  1. I;21;Foundation/CPObject.jI;23;AppKit/CABackingStore.jI;18;AppKit/CGContext.jI;19;AppKit/CGGeometry.ji;12;CGGeometry.jc;36412;
  2. CGAffineTransformMake= function(a, b, c, d, tx, ty) { return { a:a, b:b, c:c, d:d, tx:tx, ty:ty }; }
  3. CGAffineTransformMakeIdentity= function() { return { a:1.0, b:0.0, c:0.0, d:1.0, tx:0.0, ty:0.0 }; }
  4. CGAffineTransformMakeCopy= function(anAffineTransform) { return { a:anAffineTransform.a, b:anAffineTransform.b, c:anAffineTransform.c, d:anAffineTransform.d, tx:anAffineTransform.tx, ty:anAffineTransform.ty }; }
  5. CGAffineTransformMakeScale= function(sx, sy) { return { a:sx, b:0.0, c:0.0, d:sy, tx:0.0, ty:0.0 }; }
  6. CGAffineTransformMakeTranslation= function(tx, ty) { return { a:1.0, b:0.0, c:0.0, d:1.0, tx:tx, ty:ty }; }
  7. CGAffineTransformTranslate= function(aTransform, tx, ty) { return { a:aTransform.a, b:aTransform.b, c:aTransform.c, d:aTransform.d, tx:aTransform.tx + aTransform.a * tx + aTransform.c * ty, ty:aTransform.ty + aTransform.b * tx + aTransform.d * ty }; }
  8. CGAffineTransformScale= function(aTransform, sx, sy) { return { a:aTransform.a * sx, b:aTransform.b * sx, c:aTransform.c * sy, d:aTransform.d * sy, tx:aTransform.tx, ty:aTransform.ty }; }
  9. CGAffineTransformConcat= function(lhs, rhs) { return { a:lhs.a * rhs.a + lhs.b * rhs.c, b:lhs.a * rhs.b + lhs.b * rhs.d, c:lhs.c * rhs.a + lhs.d * rhs.c, d:lhs.c * rhs.b + lhs.d * rhs.d, tx:lhs.tx * rhs.a + lhs.ty * rhs.c + rhs.tx, ty:lhs.tx * rhs.b + lhs.ty * rhs.d + rhs.ty }; }
  10. CGPointApplyAffineTransform= function(aPoint, aTransform) { return { x:aPoint.x * aTransform.a + aPoint.y * aTransform.c + aTransform.tx, y:aPoint.x * aTransform.b + aPoint.y * aTransform.d + aTransform.ty }; }
  11. CGSizeApplyAffineTransform= function(aSize, aTransform) { return { width:aSize.width * aTransform.a + aSize.height * aTransform.c, height:aSize.width * aTransform.b + aSize.height * aTransform.d }; }
  12. CGAffineTransformIsIdentity= function(aTransform) { return (aTransform.a == 1 && aTransform.b == 0 && aTransform.c == 0 && aTransform.d == 1 && aTransform.tx == 0 && aTransform.ty == 0); }
  13. CGAffineTransformEqualToTransform= function(lhs, rhs) { return (lhs.a == rhs.a && lhs.b == rhs.b && lhs.c == rhs.c && lhs.d == rhs.d && lhs.tx == rhs.tx && lhs.ty == rhs.ty); }
  14. CGStringCreateWithCGAffineTransform= function(aTransform) { return (" [[ " + aTransform.a + ", " + aTransform.b + ", 0 ], [ " + aTransform.c + ", " + aTransform.d + ", 0 ], [ " + aTransform.tx + ", " + aTransform.ty + ", 1]]"); }
  15. CGAffineTransformCreateCopy= function(aTransform)
  16. {
  17. return { a:aTransform.a, b:aTransform.b, c:aTransform.c, d:aTransform.d, tx:aTransform.tx, ty:aTransform.ty };
  18. }
  19. CGAffineTransformMakeRotation= function(anAngle)
  20. {
  21. var sin = SIN(anAngle),
  22. cos = COS(anAngle);
  23. return { a:cos, b:sin, c:-sin, d:cos, tx:0.0, ty:0.0 };
  24. }
  25. CGAffineTransformRotate= function(aTransform, anAngle)
  26. {
  27. var sin = SIN(anAngle),
  28. cos = COS(anAngle);
  29. return {
  30. a:aTransform.a * cos + aTransform.c * sin,
  31. b:aTransform.b * cos + aTransform.d * sin,
  32. c:aTransform.c * cos - aTransform.a * sin,
  33. d:aTransform.d * cos - aTransform.b * sin,
  34. tx:aTransform.tx,
  35. ty:aTransform.ty
  36. };
  37. }
  38. CGAffineTransformInvert= function(aTransform)
  39. {
  40. var determinant = 1 / (aTransform.a * aTransform.d - aTransform.b * aTransform.c);
  41. return {
  42. a:determinant * aTransform.d,
  43. b:-determinant * aTransform.b,
  44. c:-determinant * aTransform.c,
  45. d:determinant * aTransform.a,
  46. tx:determinant * (aTransform.c * aTransform.ty - aTransform.d * aTransform.tx),
  47. ty:determinant * (aTransform.b * aTransform.tx - aTransform.a * aTransform.ty)
  48. };
  49. }
  50. CGRectApplyAffineTransform= function(aRect, anAffineTransform)
  51. {
  52. var top = (aRect.origin.y),
  53. left = (aRect.origin.x),
  54. right = (aRect.origin.x + aRect.size.width),
  55. bottom = (aRect.origin.y + aRect.size.height),
  56. topLeft = CGPointApplyAffineTransform({ x:left, y:top }, anAffineTransform),
  57. topRight = CGPointApplyAffineTransform({ x:right, y:top }, anAffineTransform),
  58. bottomLeft = CGPointApplyAffineTransform({ x:left, y:bottom }, anAffineTransform),
  59. bottomRight = CGPointApplyAffineTransform({ x:right, y:bottom }, anAffineTransform),
  60. minX = MIN(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x),
  61. maxX = MAX(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x),
  62. minY = MIN(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y),
  63. maxY = MAX(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
  64. return { origin: { x:minX, y:minY }, size: { width:(maxX - minX), height:(maxY - minY) } };
  65. }
  66. CPStringFromCGAffineTransform= function(anAffineTransform)
  67. {
  68. return '{' + anAffineTransform.a + ", " + anAffineTransform.b + ", " + anAffineTransform.c + ", " + anAffineTransform.d + ", " + anAffineTransform.tx + ", " + anAffineTransform.ty + '}';
  69. }
  70. var CALayerGeometryBoundsMask = 1,
  71. CALayerGeometryPositionMask = 2,
  72. CALayerGeometryAnchorPointMask = 4,
  73. CALayerGeometryAffineTransformMask = 8,
  74. CALayerGeometryParentSublayerTransformMask = 16;
  75. var USE_BUFFER = NO;
  76. var CALayerFrameOriginUpdateMask = 1,
  77. CALayerFrameSizeUpdateMask = 2,
  78. CALayerZPositionUpdateMask = 4,
  79. CALayerDisplayUpdateMask = 8,
  80. CALayerCompositeUpdateMask = 16,
  81. CALayerDOMUpdateMask = CALayerZPositionUpdateMask | CALayerFrameOriginUpdateMask | CALayerFrameSizeUpdateMask;
  82. var CALayerRegisteredRunLoopUpdates = nil;
  83. {var the_class = objj_allocateClassPair(CPObject, "CALayer"),
  84. meta_class = the_class.isa;class_addIvars(the_class, [new objj_ivar("_frame"), new objj_ivar("_bounds"), new objj_ivar("_position"), new objj_ivar("_zPosition"), new objj_ivar("_anchorPoint"), new objj_ivar("_affineTransform"), new objj_ivar("_sublayerTransform"), new objj_ivar("_sublayerTransformForSublayers"), new objj_ivar("_backingStoreFrame"), new objj_ivar("_standardBackingStoreFrame"), new objj_ivar("_hasSublayerTransform"), new objj_ivar("_hasCustomBackingStoreFrame"), new objj_ivar("_opacity"), new objj_ivar("_isHidden"), new objj_ivar("_backgroundColor"), new objj_ivar("_superlayer"), new objj_ivar("_sublayers"), new objj_ivar("_runLoopUpdateMask"), new objj_ivar("_needsDisplayOnBoundsChange"), new objj_ivar("_delegate"), new objj_ivar("_delegateRespondsToDisplayLayerSelector"), new objj_ivar("_delegateRespondsToDrawLayerInContextSelector"), new objj_ivar("_DOMElement"), new objj_ivar("_DOMContentsElement"), new objj_ivar("_contents"), new objj_ivar("_context"), new objj_ivar("_owningView"), new objj_ivar("_transformToLayer"), new objj_ivar("_transformFromLayer")]);
  85. objj_registerClassPair(the_class);
  86. objj_addClassForBundle(the_class, objj_getBundleWithPath(OBJJ_CURRENT_BUNDLE.path));
  87. class_addMethods(the_class, [new objj_method(sel_getUid("init"), function $CALayer__init(self, _cmd)
  88. { with(self)
  89. {
  90. self = objj_msgSendSuper({ receiver:self, super_class:objj_getClass("CPObject") }, "init");
  91. if (self)
  92. {
  93. _frame = CGRectMakeZero();
  94. _backingStoreFrame = CGRectMakeZero();
  95. _standardBackingStoreFrame = CGRectMakeZero();
  96. _bounds = CGRectMakeZero();
  97. _position = CGPointMakeZero();
  98. _zPosition = 0.0;
  99. _anchorPoint = CGPointMake(0.5, 0.5);
  100. _affineTransform = CGAffineTransformMakeIdentity();
  101. _sublayerTransform = CGAffineTransformMakeIdentity();
  102. _transformToLayer = CGAffineTransformMakeIdentity();
  103. _transformFromLayer = CGAffineTransformMakeIdentity();
  104. _opacity = 1.0;
  105. _isHidden = NO;
  106. _masksToBounds = NO;
  107. _sublayers = [];
  108. _DOMElement = document.createElement("div");
  109. _DOMElement.style.overflow = "visible";
  110. _DOMElement.style.position = "absolute";
  111. _DOMElement.style.visibility = "visible";
  112. _DOMElement.style.top = "0px";
  113. _DOMElement.style.left = "0px";
  114. _DOMElement.style.zIndex = 0;
  115. _DOMElement.style.width = "0px";
  116. _DOMElement.style.height = "0px";
  117. }
  118. return self;
  119. }
  120. }), new objj_method(sel_getUid("setBounds:"), function $CALayer__setBounds_(self, _cmd, aBounds)
  121. { with(self)
  122. {
  123. if (CGRectEqualToRect(_bounds, aBounds))
  124. return;
  125. var oldOrigin = _bounds.origin;
  126. _bounds = { origin: { x:aBounds.origin.x, y:aBounds.origin.y }, size: { width:aBounds.size.width, height:aBounds.size.height } };
  127. if (_hasSublayerTransform)
  128. _CALayerUpdateSublayerTransformForSublayers(self);
  129. _CALayerRecalculateGeometry(self, CALayerGeometryBoundsMask);
  130. }
  131. }), new objj_method(sel_getUid("bounds"), function $CALayer__bounds(self, _cmd)
  132. { with(self)
  133. {
  134. return _bounds;
  135. }
  136. }), new objj_method(sel_getUid("setPosition:"), function $CALayer__setPosition_(self, _cmd, aPosition)
  137. { with(self)
  138. {
  139. if (CGPointEqualToPoint(_position, aPosition))
  140. return;
  141. _position = { x:aPosition.x, y:aPosition.y };
  142. _CALayerRecalculateGeometry(self, CALayerGeometryPositionMask);
  143. }
  144. }), new objj_method(sel_getUid("position"), function $CALayer__position(self, _cmd)
  145. { with(self)
  146. {
  147. return _position;
  148. }
  149. }), new objj_method(sel_getUid("setZPosition:"), function $CALayer__setZPosition_(self, _cmd, aZPosition)
  150. { with(self)
  151. {
  152. if (_zPosition == aZPosition)
  153. return;
  154. _zPosition = aZPosition;
  155. objj_msgSend(self, "registerRunLoopUpdateWithMask:", CALayerZPositionUpdateMask);
  156. }
  157. }), new objj_method(sel_getUid("setAnchorPoint:"), function $CALayer__setAnchorPoint_(self, _cmd, anAnchorPoint)
  158. { with(self)
  159. {
  160. anAnchorPoint = { x:anAnchorPoint.x, y:anAnchorPoint.y };
  161. anAnchorPoint.x = MIN(1.0, MAX(0.0, anAnchorPoint.x));
  162. anAnchorPoint.y = MIN(1.0, MAX(0.0, anAnchorPoint.y));
  163. if (CGPointEqualToPoint(_anchorPoint, anAnchorPoint))
  164. return;
  165. _anchorPoint = anAnchorPoint;
  166. if (_hasSublayerTransform)
  167. _CALayerUpdateSublayerTransformForSublayers(self);
  168. if (_owningView)
  169. _position = CGPointMake((_bounds.size.width) * _anchorPoint.x, (_bounds.size.height) * _anchorPoint.y);
  170. _CALayerRecalculateGeometry(self, CALayerGeometryAnchorPointMask);
  171. }
  172. }), new objj_method(sel_getUid("anchorPoint"), function $CALayer__anchorPoint(self, _cmd)
  173. { with(self)
  174. {
  175. return _anchorPoint;
  176. }
  177. }), new objj_method(sel_getUid("setAffineTransform:"), function $CALayer__setAffineTransform_(self, _cmd, anAffineTransform)
  178. { with(self)
  179. {
  180. if (CGAffineTransformEqualToTransform(_affineTransform, anAffineTransform))
  181. return;
  182. _affineTransform = { a:anAffineTransform.a, b:anAffineTransform.b, c:anAffineTransform.c, d:anAffineTransform.d, tx:anAffineTransform.tx, ty:anAffineTransform.ty };
  183. _CALayerRecalculateGeometry(self, CALayerGeometryAffineTransformMask);
  184. }
  185. }), new objj_method(sel_getUid("affineTransform"), function $CALayer__affineTransform(self, _cmd)
  186. { with(self)
  187. {
  188. return _affineTransform;
  189. }
  190. }), new objj_method(sel_getUid("setSublayerTransform:"), function $CALayer__setSublayerTransform_(self, _cmd, anAffineTransform)
  191. { with(self)
  192. {
  193. if (CGAffineTransformEqualToTransform(_sublayerTransform, anAffineTransform))
  194. return;
  195. var hadSublayerTransform = _hasSublayerTransform;
  196. _sublayerTransform = { a:anAffineTransform.a, b:anAffineTransform.b, c:anAffineTransform.c, d:anAffineTransform.d, tx:anAffineTransform.tx, ty:anAffineTransform.ty };
  197. _hasSublayerTransform = !(_sublayerTransform.a == 1 && _sublayerTransform.b == 0 && _sublayerTransform.c == 0 && _sublayerTransform.d == 1 && _sublayerTransform.tx == 0 && _sublayerTransform.ty == 0);
  198. if (_hasSublayerTransform)
  199. {
  200. _CALayerUpdateSublayerTransformForSublayers(self);
  201. var index = _sublayers.length;
  202. while (index--)
  203. _CALayerRecalculateGeometry(_sublayers[index], CALayerGeometryParentSublayerTransformMask);
  204. }
  205. }
  206. }), new objj_method(sel_getUid("sublayerTransform"), function $CALayer__sublayerTransform(self, _cmd)
  207. { with(self)
  208. {
  209. return _sublayerTransform;
  210. }
  211. }), new objj_method(sel_getUid("transformToLayer"), function $CALayer__transformToLayer(self, _cmd)
  212. { with(self)
  213. {
  214. return _transformToLayer;
  215. }
  216. }), new objj_method(sel_getUid("setFrame:"), function $CALayer__setFrame_(self, _cmd, aFrame)
  217. { with(self)
  218. {
  219. alert("FIXME IMPLEMENT");
  220. }
  221. }), new objj_method(sel_getUid("frame"), function $CALayer__frame(self, _cmd)
  222. { with(self)
  223. {
  224. if (!_frame)
  225. _frame = objj_msgSend(self, "convertRect:toLayer:", _bounds, _superlayer);
  226. return _frame;
  227. }
  228. }), new objj_method(sel_getUid("backingStoreFrame"), function $CALayer__backingStoreFrame(self, _cmd)
  229. { with(self)
  230. {
  231. return _backingStoreFrame;
  232. }
  233. }), new objj_method(sel_getUid("setBackingStoreFrame:"), function $CALayer__setBackingStoreFrame_(self, _cmd, aFrame)
  234. { with(self)
  235. {
  236. _hasCustomBackingStoreFrame = (aFrame != nil);
  237. if (aFrame == nil)
  238. aFrame = CGRectMakeCopy(_standardBackingStoreFrame);
  239. else
  240. {
  241. if (_superlayer)
  242. {
  243. aFrame = objj_msgSend(_superlayer, "convertRect:toLayer:", aFrame, nil);
  244. var bounds = objj_msgSend(_superlayer, "bounds"),
  245. frame = objj_msgSend(_superlayer, "convertRect:toLayer:", bounds, nil);
  246. aFrame.origin.x -= (frame.origin.x);
  247. aFrame.origin.y -= (frame.origin.y);
  248. }
  249. else
  250. aFrame = CGRectMakeCopy(aFrame);
  251. }
  252. if (!CGPointEqualToPoint(_backingStoreFrame.origin, aFrame.origin))
  253. objj_msgSend(self, "registerRunLoopUpdateWithMask:", CALayerFrameOriginUpdateMask);
  254. if (!CGSizeEqualToSize(_backingStoreFrame.size, aFrame.size))
  255. objj_msgSend(self, "registerRunLoopUpdateWithMask:", CALayerFrameSizeUpdateMask);
  256. _backingStoreFrame = aFrame;
  257. }
  258. }), new objj_method(sel_getUid("contents"), function $CALayer__contents(self, _cmd)
  259. { with(self)
  260. {
  261. return _contents;
  262. }
  263. }), new objj_method(sel_getUid("setContents:"), function $CALayer__setContents_(self, _cmd, contents)
  264. { with(self)
  265. {
  266. if (_contents == contents)
  267. return;
  268. _contents = contents;
  269. objj_msgSend(self, "composite");
  270. }
  271. }), new objj_method(sel_getUid("composite"), function $CALayer__composite(self, _cmd)
  272. { with(self)
  273. {
  274. if (USE_BUFFER && !_contents || !_context)
  275. return;
  276. CGContextClearRect(_context, { origin: { x:0.0, y:0.0 }, size: { width:(_backingStoreFrame.size.width), height:(_backingStoreFrame.size.height) } });
  277. var transform = _transformFromLayer;
  278. if (_superlayer)
  279. {
  280. var superlayerTransform = _CALayerGetTransform(_superlayer, nil),
  281. superlayerOrigin = CGPointApplyAffineTransform(_superlayer._bounds.origin, superlayerTransform);
  282. transform = CGAffineTransformConcat(transform, superlayerTransform);
  283. transform.tx -= superlayerOrigin.x;
  284. transform.ty -= superlayerOrigin.y;
  285. }
  286. transform.tx -= (_backingStoreFrame.origin.x);
  287. transform.ty -= (_backingStoreFrame.origin.y);
  288. CGContextSaveGState(_context);
  289. CGContextConcatCTM(_context, transform);
  290. if (USE_BUFFER)
  291. {
  292. _context.drawImage(_contents.buffer, (_bounds.origin.x), (_bounds.origin.y));
  293. }
  294. else
  295. objj_msgSend(self, "drawInContext:", _context);
  296. CGContextRestoreGState(_context);
  297. }
  298. }), new objj_method(sel_getUid("display"), function $CALayer__display(self, _cmd)
  299. { with(self)
  300. {
  301. if (!_context)
  302. {
  303. _context = CGBitmapGraphicsContextCreate();
  304. _DOMContentsElement = _context.DOMElement;
  305. _DOMContentsElement.style.zIndex = -100;
  306. _DOMContentsElement.style.overflow = "hidden";
  307. _DOMContentsElement.style.position = "absolute";
  308. _DOMContentsElement.style.visibility = "visible";
  309. _DOMContentsElement.width = ROUND((_backingStoreFrame.size.width));
  310. _DOMContentsElement.height = ROUND((_backingStoreFrame.size.height));
  311. _DOMContentsElement.style.top = "0px";
  312. _DOMContentsElement.style.left = "0px";
  313. _DOMContentsElement.style.width = ROUND((_backingStoreFrame.size.width)) + "px";
  314. _DOMContentsElement.style.height = ROUND((_backingStoreFrame.size.height)) + "px";
  315. _DOMElement.appendChild(_DOMContentsElement);
  316. }
  317. if (USE_BUFFER)
  318. {
  319. if (_delegateRespondsToDisplayLayerSelector)
  320. return objj_msgSend(_delegate, "displayInLayer:", self);
  321. if ((_backingStoreFrame.size.width) == 0.0 || (_backingStoreFrame.size.height) == 0.0)
  322. return;
  323. if (!_contents)
  324. _contents = CABackingStoreCreate();
  325. CABackingStoreSetSize(_contents, _bounds.size);
  326. objj_msgSend(self, "drawInContext:", CABackingStoreGetContext(_contents));
  327. }
  328. objj_msgSend(self, "composite");
  329. }
  330. }), new objj_method(sel_getUid("drawInContext:"), function $CALayer__drawInContext_(self, _cmd, aContext)
  331. { with(self)
  332. {
  333. if (_backgroundColor)
  334. {
  335. CGContextSetFillColor(aContext, _backgroundColor);
  336. CGContextFillRect(aContext, _bounds);
  337. }
  338. if (_delegateRespondsToDrawLayerInContextSelector)
  339. objj_msgSend(_delegate, "drawLayer:inContext:", self, aContext);
  340. }
  341. }), new objj_method(sel_getUid("opacity"), function $CALayer__opacity(self, _cmd)
  342. { with(self)
  343. {
  344. return _opacity;
  345. }
  346. }), new objj_method(sel_getUid("setOpacity:"), function $CALayer__setOpacity_(self, _cmd, anOpacity)
  347. { with(self)
  348. {
  349. if (_opacity == anOpacity)
  350. return;
  351. _opacity = anOpacity;
  352. _DOMElement.style.opacity = anOpacity;
  353. _DOMElement.style.filter = "alpha(opacity=" + anOpacity * 100 + ")";
  354. }
  355. }), new objj_method(sel_getUid("setHidden:"), function $CALayer__setHidden_(self, _cmd, isHidden)
  356. { with(self)
  357. {
  358. _isHidden = isHidden;
  359. _DOMElement.style.display = isHidden ? "none" : "block";
  360. }
  361. }), new objj_method(sel_getUid("hidden"), function $CALayer__hidden(self, _cmd)
  362. { with(self)
  363. {
  364. return _isHidden;
  365. }
  366. }), new objj_method(sel_getUid("isHidden"), function $CALayer__isHidden(self, _cmd)
  367. { with(self)
  368. {
  369. return _isHidden;
  370. }
  371. }), new objj_method(sel_getUid("setMasksToBounds:"), function $CALayer__setMasksToBounds_(self, _cmd, masksToBounds)
  372. { with(self)
  373. {
  374. if (_masksToBounds == masksToBounds)
  375. return;
  376. _masksToBounds = masksToBounds;
  377. _DOMElement.style.overflow = _masksToBounds ? "hidden" : "visible";
  378. }
  379. }), new objj_method(sel_getUid("setBackgroundColor:"), function $CALayer__setBackgroundColor_(self, _cmd, aColor)
  380. { with(self)
  381. {
  382. _backgroundColor = aColor;
  383. objj_msgSend(self, "setNeedsDisplay");
  384. }
  385. }), new objj_method(sel_getUid("backgroundColor"), function $CALayer__backgroundColor(self, _cmd)
  386. { with(self)
  387. {
  388. return _backgroundColor;
  389. }
  390. }), new objj_method(sel_getUid("sublayers"), function $CALayer__sublayers(self, _cmd)
  391. { with(self)
  392. {
  393. return _sublayers;
  394. }
  395. }), new objj_method(sel_getUid("superlayer"), function $CALayer__superlayer(self, _cmd)
  396. { with(self)
  397. {
  398. return _superlayer;
  399. }
  400. }), new objj_method(sel_getUid("addSublayer:"), function $CALayer__addSublayer_(self, _cmd, aLayer)
  401. { with(self)
  402. {
  403. objj_msgSend(self, "insertSublayer:atIndex:", aLayer, _sublayers.length);
  404. return;
  405. if (_DOMContentsElement && aLayer._zPosition > _DOMContentsElement.style.zIndex) _DOMContentsElement.style.zIndex -= 100.0;;
  406. objj_msgSend(_sublayers, "addObject:", aLayer);
  407. _DOMElement.appendChild(aLayer._DOMElement);
  408. }
  409. }), new objj_method(sel_getUid("removeFromSuperlayer"), function $CALayer__removeFromSuperlayer(self, _cmd)
  410. { with(self)
  411. {
  412. if (_owningView)
  413. objj_msgSend(_owningView, "setLayer:", nil);
  414. if (!_superlayer)
  415. return;
  416. _superlayer._DOMElement.removeChild(_DOMElement);
  417. objj_msgSend(_superlayer._sublayers, "removeObject:", self);
  418. _superlayer = nil;
  419. }
  420. }), new objj_method(sel_getUid("insertSublayer:atIndex:"), function $CALayer__insertSublayer_atIndex_(self, _cmd, aLayer, anIndex)
  421. { with(self)
  422. {
  423. if (!aLayer)
  424. return;
  425. var superlayer = objj_msgSend(aLayer, "superlayer");
  426. if (superlayer == self)
  427. {
  428. var index = objj_msgSend(_sublayers, "indexOfObjectIdenticalTo:", aLayer);
  429. if (index == anIndex)
  430. return;
  431. objj_msgSend(_sublayers, "removeObjectAtIndex:", index);
  432. if (index < anIndex)
  433. --anIndex;
  434. }
  435. else if (superlayer != nil)
  436. objj_msgSend(aLayer, "removeFromSuperlayer");
  437. if (_DOMContentsElement && aLayer._zPosition > _DOMContentsElement.style.zIndex) _DOMContentsElement.style.zIndex -= 100.0;;
  438. objj_msgSend(_sublayers, "insertObject:atIndex:", aLayer, anIndex);
  439. if (anIndex >= _sublayers.length - 1)
  440. _DOMElement.appendChild(aLayer._DOMElement);
  441. else
  442. _DOMElement.insertBefore(aLayer._DOMElement, _sublayers[anIndex + 1]._DOMElement);
  443. aLayer._superlayer = self;
  444. if (self != superlayer)
  445. _CALayerRecalculateGeometry(aLayer, 0xFFFFFFF);
  446. }
  447. }), new objj_method(sel_getUid("insertSublayer:below:"), function $CALayer__insertSublayer_below_(self, _cmd, aLayer, aSublayer)
  448. { with(self)
  449. {
  450. var index = aSublayer ? objj_msgSend(_sublayers, "indexOfObjectIdenticalTo:", aSublayer) : 0;
  451. objj_msgSend(self, "insertSublayer:atIndex:", aLayer, index == CPNotFound ? _sublayers.length : index);
  452. }
  453. }), new objj_method(sel_getUid("insertSublayer:above:"), function $CALayer__insertSublayer_above_(self, _cmd, aLayer, aSublayer)
  454. { with(self)
  455. {
  456. var index = aSublayer ? objj_msgSend(_sublayers, "indexOfObjectIdenticalTo:", aSublayer) : _sublayers.length;
  457. if (index == CPNotFound)
  458. objj_msgSend(CPException, "raise:reason:", "CALayerNotFoundException", "aSublayer is not a sublayer of this layer");
  459. objj_msgSend(_sublayers, "insertObject:atIndex:", aLayer, index == CPNotFound ? _sublayers.length : index + 1);
  460. }
  461. }), new objj_method(sel_getUid("replaceSublayer:with:"), function $CALayer__replaceSublayer_with_(self, _cmd, aSublayer, aLayer)
  462. { with(self)
  463. {
  464. if (aSublayer == aLayer)
  465. return;
  466. if (aSublayer._superlayer != self)
  467. {
  468. alert("EXCEPTION");
  469. return;
  470. }
  471. if (_DOMContentsElement && aLayer._zPosition > _DOMContentsElement.style.zIndex) _DOMContentsElement.style.zIndex -= 100.0;;
  472. objj_msgSend(_sublayers, "replaceObjectAtIndex:withObject:", objj_msgSend(_sublayers, "indexOfObjectIdenticalTo:", aSublayer), aLayer);
  473. _DOMElement.replaceChild(aSublayer._DOMElement, aLayer._DOMElement);
  474. }
  475. }), new objj_method(sel_getUid("registerRunLoopUpdateWithMask:"), function $CALayer__registerRunLoopUpdateWithMask_(self, _cmd, anUpdateMask)
  476. { with(self)
  477. {
  478. if (CALayerRegisteredRunLoopUpdates == nil)
  479. {
  480. CALayerRegisteredRunLoopUpdates = {};
  481. objj_msgSend(objj_msgSend(CPRunLoop, "currentRunLoop"), "performSelector:target:argument:order:modes:", sel_getUid("runLoopUpdateLayers"), CALayer, nil, 0, [CPDefaultRunLoopMode]);
  482. }
  483. _runLoopUpdateMask |= anUpdateMask;
  484. CALayerRegisteredRunLoopUpdates[objj_msgSend(self, "hash")] = self;
  485. }
  486. }), new objj_method(sel_getUid("setNeedsComposite"), function $CALayer__setNeedsComposite(self, _cmd)
  487. { with(self)
  488. {
  489. objj_msgSend(self, "registerRunLoopUpdateWithMask:", CALayerCompositeUpdateMask);
  490. }
  491. }), new objj_method(sel_getUid("setNeedsDisplay"), function $CALayer__setNeedsDisplay(self, _cmd)
  492. { with(self)
  493. {
  494. objj_msgSend(self, "registerRunLoopUpdateWithMask:", CALayerDisplayUpdateMask);
  495. }
  496. }), new objj_method(sel_getUid("setNeedsDisplayOnBoundsChange:"), function $CALayer__setNeedsDisplayOnBoundsChange_(self, _cmd, needsDisplayOnBoundsChange)
  497. { with(self)
  498. {
  499. _needsDisplayOnBoundsChange = needsDisplayOnBoundsChange;
  500. }
  501. }), new objj_method(sel_getUid("needsDisplayOnBoundsChange"), function $CALayer__needsDisplayOnBoundsChange(self, _cmd)
  502. { with(self)
  503. {
  504. return _needsDisplayOnBoundsChange;
  505. }
  506. }), new objj_method(sel_getUid("setNeedsDisplayInRect:"), function $CALayer__setNeedsDisplayInRect_(self, _cmd, aRect)
  507. { with(self)
  508. {
  509. _dirtyRect = aRect;
  510. objj_msgSend(self, "display");
  511. }
  512. }), new objj_method(sel_getUid("convertPoint:fromLayer:"), function $CALayer__convertPoint_fromLayer_(self, _cmd, aPoint, aLayer)
  513. { with(self)
  514. {
  515. return CGPointApplyAffineTransform(aPoint, _CALayerGetTransform(aLayer, self));
  516. }
  517. }), new objj_method(sel_getUid("convertPoint:toLayer:"), function $CALayer__convertPoint_toLayer_(self, _cmd, aPoint, aLayer)
  518. { with(self)
  519. {
  520. return CGPointApplyAffineTransform(aPoint, _CALayerGetTransform(self, aLayer));
  521. }
  522. }), new objj_method(sel_getUid("convertRect:fromLayer:"), function $CALayer__convertRect_fromLayer_(self, _cmd, aRect, aLayer)
  523. { with(self)
  524. {
  525. return CGRectApplyAffineTransform(aRect, _CALayerGetTransform(aLayer, self));
  526. }
  527. }), new objj_method(sel_getUid("convertRect:toLayer:"), function $CALayer__convertRect_toLayer_(self, _cmd, aRect, aLayer)
  528. { with(self)
  529. {
  530. return CGRectApplyAffineTransform(aRect, _CALayerGetTransform(self, aLayer));
  531. }
  532. }), new objj_method(sel_getUid("containsPoint:"), function $CALayer__containsPoint_(self, _cmd, aPoint)
  533. { with(self)
  534. {
  535. return (aPoint.x >= (_bounds.origin.x) && aPoint.y >= (_bounds.origin.y) && aPoint.x < (_bounds.origin.x + _bounds.size.width) && aPoint.y < (_bounds.origin.y + _bounds.size.height));
  536. }
  537. }), new objj_method(sel_getUid("hitTest:"), function $CALayer__hitTest_(self, _cmd, aPoint)
  538. { with(self)
  539. {
  540. if (_isHidden)
  541. return nil;
  542. var point = CGPointApplyAffineTransform(aPoint, _transformToLayer);
  543. if (!(point.x >= (_bounds.origin.x) && point.y >= (_bounds.origin.y) && point.x < (_bounds.origin.x + _bounds.size.width) && point.y < (_bounds.origin.y + _bounds.size.height)))
  544. return nil;
  545. var layer = nil,
  546. index = _sublayers.length;
  547. while (index--)
  548. if (layer = objj_msgSend(_sublayers[index], "hitTest:", point))
  549. return layer;
  550. return self;
  551. }
  552. }), new objj_method(sel_getUid("setDelegate:"), function $CALayer__setDelegate_(self, _cmd, aDelegate)
  553. { with(self)
  554. {
  555. if (_delegate == aDelegate)
  556. return;
  557. _delegate = aDelegate;
  558. _delegateRespondsToDisplayLayerSelector = objj_msgSend(_delegate, "respondsToSelector:", sel_getUid("displayLayer:"));
  559. _delegateRespondsToDrawLayerInContextSelector = objj_msgSend(_delegate, "respondsToSelector:", sel_getUid("drawLayer:inContext:"));
  560. if (_delegateRespondsToDisplayLayerSelector || _delegateRespondsToDrawLayerInContextSelector)
  561. objj_msgSend(self, "setNeedsDisplay");
  562. }
  563. }), new objj_method(sel_getUid("delegate"), function $CALayer__delegate(self, _cmd)
  564. { with(self)
  565. {
  566. return _delegate;
  567. }
  568. }), new objj_method(sel_getUid("_setOwningView:"), function $CALayer___setOwningView_(self, _cmd, anOwningView)
  569. { with(self)
  570. {
  571. _owningView = anOwningView;
  572. if (_owningView)
  573. {
  574. _owningView = anOwningView;
  575. _bounds.size = CGSizeMakeCopy(objj_msgSend(_owningView, "bounds").size);
  576. _position = CGPointMake((_bounds.size.width) * _anchorPoint.x, (_bounds.size.height) * _anchorPoint.y);
  577. }
  578. _CALayerRecalculateGeometry(self, CALayerGeometryPositionMask | CALayerGeometryBoundsMask);
  579. }
  580. }), new objj_method(sel_getUid("_owningViewBoundsChanged"), function $CALayer___owningViewBoundsChanged(self, _cmd)
  581. { with(self)
  582. {
  583. _bounds.size = CGSizeMakeCopy(objj_msgSend(_owningView, "bounds").size);
  584. _position = CGPointMake((_bounds.size.width) * _anchorPoint.x, (_bounds.size.height) * _anchorPoint.y);
  585. _CALayerRecalculateGeometry(self, CALayerGeometryPositionMask | CALayerGeometryBoundsMask);
  586. }
  587. }), new objj_method(sel_getUid("_update"), function $CALayer___update(self, _cmd)
  588. { with(self)
  589. {
  590. window.loop = true;
  591. var mask = _runLoopUpdateMask;
  592. if (mask & CALayerDOMUpdateMask)
  593. _CALayerUpdateDOM(self, mask);
  594. if (mask & CALayerDisplayUpdateMask)
  595. objj_msgSend(self, "display");
  596. else if (mask & CALayerFrameSizeUpdateMask || mask & CALayerCompositeUpdateMask)
  597. objj_msgSend(self, "composite");
  598. _runLoopUpdateMask = 0;
  599. window.loop = false;
  600. }
  601. })]);
  602. class_addMethods(meta_class, [new objj_method(sel_getUid("layer"), function $CALayer__layer(self, _cmd)
  603. { with(self)
  604. {
  605. return objj_msgSend(objj_msgSend(objj_msgSend(self, "class"), "alloc"), "init");
  606. }
  607. }), new objj_method(sel_getUid("runLoopUpdateLayers"), function $CALayer__runLoopUpdateLayers(self, _cmd)
  608. { with(self)
  609. {if (window.oops) {alert(window.latest); objj_debug_print_backtrace();}
  610. window.loop = true;
  611. for (hash in CALayerRegisteredRunLoopUpdates)
  612. {
  613. var layer = CALayerRegisteredRunLoopUpdates[hash],
  614. mask = layer._runLoopUpdateMask;
  615. if (mask & CALayerDOMUpdateMask)
  616. _CALayerUpdateDOM(layer, mask);
  617. if (mask & CALayerDisplayUpdateMask)
  618. objj_msgSend(layer, "display");
  619. else if (mask & CALayerFrameSizeUpdateMask || mask & CALayerCompositeUpdateMask)
  620. objj_msgSend(layer, "composite");
  621. layer._runLoopUpdateMask = 0;
  622. }
  623. window.loop= false;
  624. CALayerRegisteredRunLoopUpdates = nil;
  625. }
  626. })]);
  627. }
  628. _CALayerUpdateSublayerTransformForSublayers= function(aLayer)
  629. {
  630. var bounds = aLayer._bounds,
  631. anchorPoint = aLayer._anchorPoint,
  632. translateX = (bounds.size.width) * anchorPoint.x,
  633. translateY = (bounds.size.height) * anchorPoint.y;
  634. aLayer._sublayerTransformForSublayers = CGAffineTransformConcat(
  635. CGAffineTransformMakeTranslation(-translateX, -translateY),
  636. CGAffineTransformConcat(aLayer._sublayerTransform,
  637. CGAffineTransformMakeTranslation(translateX, translateY)));
  638. }
  639. _CALayerUpdateDOM= function(aLayer, aMask)
  640. {
  641. var DOMElementStyle = aLayer._DOMElement.style;
  642. if (aMask & CALayerZPositionUpdateMask)
  643. DOMElementStyle.zIndex = aLayer._zPosition;
  644. var frame = aLayer._backingStoreFrame;
  645. if (aMask & CALayerFrameOriginUpdateMask)
  646. {
  647. DOMElementStyle.top = ROUND((frame.origin.y)) + "px";
  648. DOMElementStyle.left = ROUND((frame.origin.x)) + "px";
  649. }
  650. if (aMask & CALayerFrameSizeUpdateMask)
  651. {
  652. var width = MAX(0.0, ROUND((frame.size.width))),
  653. height = MAX(0.0, ROUND((frame.size.height))),
  654. DOMContentsElement = aLayer._DOMContentsElement;
  655. DOMElementStyle.width = width + "px";
  656. DOMElementStyle.height = height + "px";
  657. if (DOMContentsElement)
  658. {
  659. DOMContentsElement.width = width;
  660. DOMContentsElement.height = height;
  661. DOMContentsElement.style.width = width + "px";
  662. DOMContentsElement.style.height = height + "px";
  663. }
  664. }
  665. }
  666. _CALayerRecalculateGeometry= function(aLayer, aGeometryChange)
  667. {
  668. var bounds = aLayer._bounds,
  669. superlayer = aLayer._superlayer,
  670. width = (bounds.size.width),
  671. height = (bounds.size.height),
  672. position = aLayer._position,
  673. anchorPoint = aLayer._anchorPoint,
  674. affineTransform = aLayer._affineTransform,
  675. backingStoreFrameSize = { width:aLayer._backingStoreFrame.width, height:aLayer._backingStoreFrame.height },
  676. hasCustomBackingStoreFrame = aLayer._hasCustomBackingStoreFrame;
  677. aLayer._transformFromLayer = CGAffineTransformConcat(
  678. CGAffineTransformMakeTranslation(-width * anchorPoint.x - (aLayer._bounds.origin.x), -height * anchorPoint.y - (aLayer._bounds.origin.y)),
  679. CGAffineTransformConcat(affineTransform,
  680. CGAffineTransformMakeTranslation(position.x, position.y)));
  681. if (superlayer && superlayer._hasSublayerTransform)
  682. {
  683. var tx = aLayer._transformFromLayer.tx * superlayer._sublayerTransformForSublayers.a + aLayer._transformFromLayer.ty * superlayer._sublayerTransformForSublayers.c + superlayer._sublayerTransformForSublayers.tx;aLayer._transformFromLayer.ty = aLayer._transformFromLayer.tx * superlayer._sublayerTransformForSublayers.b + aLayer._transformFromLayer.ty * superlayer._sublayerTransformForSublayers.d + superlayer._sublayerTransformForSublayers.ty;aLayer._transformFromLayer.tx = tx;var a = aLayer._transformFromLayer.a * superlayer._sublayerTransformForSublayers.a + aLayer._transformFromLayer.b * superlayer._sublayerTransformForSublayers.c, b = aLayer._transformFromLayer.a * superlayer._sublayerTransformForSublayers.b + aLayer._transformFromLayer.b * superlayer._sublayerTransformForSublayers.d, c = aLayer._transformFromLayer.c * superlayer._sublayerTransformForSublayers.a + aLayer._transformFromLayer.d * superlayer._sublayerTransformForSublayers.c;aLayer._transformFromLayer.d = aLayer._transformFromLayer.c * superlayer._sublayerTransformForSublayers.b + aLayer._transformFromLayer.d * superlayer._sublayerTransformForSublayers.d;aLayer._transformFromLayer.a = a;aLayer._transformFromLayer.b = b;aLayer._transformFromLayer.c = c;;
  684. }
  685. aLayer._transformToLayer = CGAffineTransformInvert(aLayer._transformFromLayer);
  686. aLayer._frame = nil;
  687. aLayer._standardBackingStoreFrame = objj_msgSend(aLayer, "convertRect:toLayer:", bounds, nil);
  688. if (superlayer)
  689. {
  690. var bounds = objj_msgSend(superlayer, "bounds"),
  691. frame = objj_msgSend(superlayer, "convertRect:toLayer:", bounds, nil);
  692. aLayer._standardBackingStoreFrame.origin.x -= (frame.origin.x);
  693. aLayer._standardBackingStoreFrame.origin.y -= (frame.origin.y);
  694. }
  695. var origin = aLayer._standardBackingStoreFrame.origin,
  696. size = aLayer._standardBackingStoreFrame.size;
  697. origin.x = FLOOR(origin.x);
  698. origin.y = FLOOR(origin.y);
  699. size.width = CEIL(size.width) + 1.0;
  700. size.height = CEIL(size.height) + 1.0;
  701. if (!hasCustomBackingStoreFrame)
  702. {
  703. var backingStoreFrame = CGRectMakeCopy(aLayer._standardBackingStoreFrame);
  704. if (ROUND((backingStoreFrame.origin.x)) != ROUND((aLayer._backingStoreFrame.origin.x)) ||
  705. ROUND((backingStoreFrame.origin.y)) != ROUND((aLayer._backingStoreFrame.origin.y)))
  706. objj_msgSend(aLayer, "registerRunLoopUpdateWithMask:", CALayerFrameOriginUpdateMask);
  707. if (((backingStoreFrame.size.width) != ROUND((aLayer._backingStoreFrame.size.width)) ||
  708. (backingStoreFrame.size.height) != ROUND((aLayer._backingStoreFrame.size.height))))
  709. objj_msgSend(aLayer, "registerRunLoopUpdateWithMask:", CALayerFrameSizeUpdateMask);
  710. aLayer._backingStoreFrame = backingStoreFrame;
  711. }
  712. if (aGeometryChange & CALayerGeometryBoundsMask && aLayer._needsDisplayOnBoundsChange)
  713. objj_msgSend(aLayer, "setNeedsDisplay");
  714. else if (hasCustomBackingStoreFrame || (aGeometryChange & ~(CALayerGeometryPositionMask | CALayerGeometryAnchorPointMask)))
  715. objj_msgSend(aLayer, "setNeedsComposite");
  716. var sublayers = aLayer._sublayers,
  717. index = 0,
  718. count = sublayers.length;
  719. for (; index < count; ++index)
  720. _CALayerRecalculateGeometry(sublayers[index], aGeometryChange);
  721. }
  722. _CALayerGetTransform= function(fromLayer, toLayer)
  723. {
  724. var transform = CGAffineTransformMakeIdentity();
  725. if (fromLayer)
  726. {
  727. var layer = fromLayer;
  728. while (layer && layer != toLayer)
  729. {
  730. var transformFromLayer = layer._transformFromLayer;
  731. var tx = transform.tx * transformFromLayer.a + transform.ty * transformFromLayer.c + transformFromLayer.tx;transform.ty = transform.tx * transformFromLayer.b + transform.ty * transformFromLayer.d + transformFromLayer.ty;transform.tx = tx;var a = transform.a * transformFromLayer.a + transform.b * transformFromLayer.c, b = transform.a * transformFromLayer.b + transform.b * transformFromLayer.d, c = transform.c * transformFromLayer.a + transform.d * transformFromLayer.c;transform.d = transform.c * transformFromLayer.b + transform.d * transformFromLayer.d;transform.a = a;transform.b = b;transform.c = c;;
  732. layer = layer._superlayer;
  733. }
  734. if (layer == toLayer)
  735. return transform;
  736. }
  737. var layers = [],
  738. layer = toLayer;
  739. while (layer)
  740. {
  741. layers.push(layer);
  742. layer = layer._superlayer;
  743. }
  744. var index = layers.length;
  745. while (index--)
  746. {
  747. var transformToLayer = layers[index]._transformToLayer;
  748. var tx = transform.tx * transformToLayer.a + transform.ty * transformToLayer.c + transformToLayer.tx;transform.ty = transform.tx * transformToLayer.b + transform.ty * transformToLayer.d + transformToLayer.ty;transform.tx = tx;var a = transform.a * transformToLayer.a + transform.b * transformToLayer.c, b = transform.a * transformToLayer.b + transform.b * transformToLayer.d, c = transform.c * transformToLayer.a + transform.d * transformToLayer.c;transform.d = transform.c * transformToLayer.b + transform.d * transformToLayer.d;transform.a = a;transform.b = b;transform.c = c;;
  749. }
  750. return transform;
  751. }