00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 @import <Foundation/CPRunLoop.j>
00024
00025 #include "../../CoreGraphics/CGAffineTransform.h"
00026 #include "CPDOMDisplayServer.h"
00027
00028
00029 var CPDOMDisplayRunLoop = nil;
00030
00031 CPDOMDisplayServerInstructions = [];
00032 CPDOMDisplayServerInstructionCount = 0;
00033
00034 CPDOMDisplayServerViews = [];
00035 CPDOMDisplayServerViewsCount = 0;
00036 CPDOMDisplayServerViewsContext = {};
00037
00038 @implementation CPDOMDisplayServer : CPObject
00039 {
00040 }
00041
00042 + (void)start
00043 {
00044 CPDOMDisplayRunLoop = [CPRunLoop currentRunLoop];
00045
00046 [CPDOMDisplayRunLoop performSelector:@selector(run) target:CPDOMDisplayServer argument:nil order:0 modes:[CPDefaultRunLoopMode]];
00047 }
00048
00049 + (void)run
00050 {
00051 while (CPDOMDisplayServerInstructionCount || CPDOMDisplayServerViewsCount)
00052 {
00053 var index = 0;
00054
00055 while (index < CPDOMDisplayServerInstructionCount)
00056 {
00057 var instruction = CPDOMDisplayServerInstructions[index++];
00058 try{
00059 switch (instruction)
00060 {
00061 case SetStyleLeftTop:
00062 case SetStyleRightTop:
00063 case SetStyleLeftBottom:
00064 case SetStyleRightBottom: var element = CPDOMDisplayServerInstructions[index],
00065 style = element.style,
00066 x = (instruction == SetStyleLeftTop || instruction == SetStyleLeftBottom) ? "left" : "right",
00067 y = (instruction == SetStyleLeftTop || instruction == SetStyleRightTop) ? "top" : "bottom";
00068
00069 CPDOMDisplayServerInstructions[index++] = nil;
00070
00071 var transform = CPDOMDisplayServerInstructions[index++];
00072
00073 if (transform)
00074 {
00075 var point = _CGPointMake(CPDOMDisplayServerInstructions[index++], CPDOMDisplayServerInstructions[index++]),
00076 transformed = _CGPointApplyAffineTransform(point, transform);
00077
00078 style[x] = ROUND(transformed.x) + "px";
00079 style[y] = ROUND(transformed.y) + "px";
00080
00081 }
00082 else
00083 {
00084 style[x] = ROUND(CPDOMDisplayServerInstructions[index++]) + "px";
00085 style[y] = ROUND(CPDOMDisplayServerInstructions[index++]) + "px";
00086 }
00087
00088 element.CPDOMDisplayContext[SetStyleOrigin] = -1;
00089
00090 break;
00091
00092 case SetStyleSize: var element = CPDOMDisplayServerInstructions[index],
00093 style = element.style;
00094
00095 CPDOMDisplayServerInstructions[index++] = nil;
00096
00097 element.CPDOMDisplayContext[SetStyleSize] = -1;
00098
00099 style.width = MAX(0.0, ROUND(CPDOMDisplayServerInstructions[index++])) + "px";
00100 style.height = MAX(0.0, ROUND(CPDOMDisplayServerInstructions[index++])) + "px";
00101
00102 break;
00103
00104 case SetSize: var element = CPDOMDisplayServerInstructions[index];
00105
00106 CPDOMDisplayServerInstructions[index++] = nil;
00107
00108 element.CPDOMDisplayContext[SetSize] = -1;
00109
00110 element.width = MAX(0.0, ROUND(CPDOMDisplayServerInstructions[index++]));
00111 element.height = MAX(0.0, ROUND(CPDOMDisplayServerInstructions[index++]));
00112
00113 break;
00114
00115 case AppendChild: CPDOMDisplayServerInstructions[index].appendChild(CPDOMDisplayServerInstructions[index + 1]);
00116
00117 CPDOMDisplayServerInstructions[index++] = nil;
00118 CPDOMDisplayServerInstructions[index++] = nil;
00119
00120 break;
00121
00122 case InsertBefore: CPDOMDisplayServerInstructions[index].insertBefore(CPDOMDisplayServerInstructions[index + 1], CPDOMDisplayServerInstructions[index + 2]);
00123
00124 CPDOMDisplayServerInstructions[index++] = nil;
00125 CPDOMDisplayServerInstructions[index++] = nil;
00126 CPDOMDisplayServerInstructions[index++] = nil;
00127
00128 break;
00129
00130 case RemoveChild: CPDOMDisplayServerInstructions[index].removeChild(CPDOMDisplayServerInstructions[index + 1]);
00131
00132 CPDOMDisplayServerInstructions[index++] = nil;
00133 CPDOMDisplayServerInstructions[index++] = nil;
00134
00135 break;
00136 }}catch(e) { CPLog("here?" + instruction) }
00137 }
00138
00139 CPDOMDisplayServerInstructionCount = 0;
00140
00141 var views = CPDOMDisplayServerViews,
00142 index = 0,
00143 count = CPDOMDisplayServerViewsCount;
00144
00145
00146 CPDOMDisplayServerViews = [];
00147 CPDOMDisplayServerViewsCount = 0;
00148
00149 for (; index < count; ++index)
00150 {
00151 var view = views[index];
00152
00153 delete CPDOMDisplayServerViewsContext[[view hash]];
00154
00155 [view displayIfNeeded];
00156 }
00157 }
00158
00159 [CPDOMDisplayRunLoop performSelector:@selector(run) target:CPDOMDisplayServer argument:nil order:0 modes:[CPDefaultRunLoopMode]];
00160 }
00161
00162 @end
00163
00164 [CPDOMDisplayServer start];