2 using System.Windows;
\r
3 using System.Windows.Controls;
\r
4 using System.Windows.Documents;
\r
5 using System.Windows.Input;
\r
6 using System.Windows.Media;
\r
7 using System.Windows.Media.Animation;
\r
8 using System.Windows.Media.Imaging;
\r
9 using System.Windows.Shapes;
\r
10 using System.Windows.Browser;
\r
12 using System.Collections.Generic;
\r
19 internal static partial class CONST
\r
21 internal static readonly Int32 MAX_OBJ_N = 4096;//65535;
\r
22 internal static readonly Int32 MOBJ_N = 2048;//16384;
\r
23 internal static readonly Int32 COBJ_N = 300;//4096;
\r
24 internal static readonly Int32 HOBJ_N = 100;//1024;
\r
25 internal static readonly Int32 MOBJ_I = 500;
\r
26 internal static readonly Int32 COBJ_I = 300;
\r
27 internal static readonly Int32 HOBJ_I = 100;
\r
33 public class StackableDrawable : Drawable
\r
35 // protected System.Collections.Generic.Queue<Internal.PrimitiveFigure> stack;
\r
36 internal Internal.PrimitiveFigure[] stack;
\r
37 internal int stackN = 0;
\r
38 internal Line[] lineStack;
\r
39 internal int lineStackN = 0, lineStackMAX = 0;
\r
40 internal Rectangle[] rectStack;
\r
41 internal int rectStackN = 0, rectStackMAX = 0;
\r
42 internal ShaderField[] shaderStack;
\r
43 internal int shaderStackN = 0, shaderStackMAX = 0;
\r
44 internal Ellipse[] ellipseStack;
\r
45 internal int ellipseStackN = 0, ellipseStackMAX = 0;
\r
46 internal Polygon[] polygonStack;
\r
47 internal int polygonStackN = 0, polygonStackMAX = 0;
\r
48 internal Letters[] lettersStack;
\r
49 internal int lettersStackN = 0, lettersStackMAX = 0;
\r
50 internal Image[] imageStack;
\r
51 internal int imageStackN = 0, imageStackMAX = 0;
\r
52 internal Group[] groupStack;
\r
53 internal int groupStackN = 0, groupStackMAX = 0;
\r
55 public StackableDrawable()
\r
57 stack = new Internal.PrimitiveFigure[CONST.MAX_OBJ_N];
\r
58 lineStack = new Line[CONST.MOBJ_N];
\r
59 rectStack = new Rectangle[CONST.MOBJ_N];
\r
60 ellipseStack = new Ellipse[CONST.MOBJ_N];
\r
61 shaderStack = new ShaderField[CONST.COBJ_N];
\r
62 polygonStack = new Polygon[CONST.COBJ_N];
\r
63 lettersStack = new Letters[CONST.COBJ_N];
\r
64 imageStack = new Image[CONST.HOBJ_N];
\r
65 groupStack = new Group[CONST.HOBJ_N];
\r
66 for (int i = 0; i < CONST.MOBJ_I; i++)
\r
68 rectStack[i] = new Rectangle();
\r
70 rectStackMAX = CONST.MOBJ_I;
\r
71 for (int i = 0; i < CONST.COBJ_I; i++)
\r
73 lineStack[i] = new Line(0, 0, 0, 0);
\r
74 ellipseStack[i] = new Ellipse();
\r
75 shaderStack[i] = new ShaderField();
\r
76 polygonStack[i] = new Polygon();
\r
78 lineStackMAX = CONST.COBJ_I;
\r
79 shaderStackMAX = CONST.COBJ_I;
\r
80 ellipseStackMAX = CONST.COBJ_I;
\r
81 polygonStackMAX = CONST.COBJ_I;
\r
82 for (int i = 0; i < CONST.HOBJ_I; i++)
\r
84 imageStack[i] = new Image();
\r
85 lettersStack[i] = new Letters();
\r
86 // groupStack[i] = new Group();
\r
88 imageStackMAX = CONST.HOBJ_I;
\r
89 lettersStackMAX = CONST.HOBJ_I;
\r
93 public void clear() { clear(Color.black); }
\r
94 public virtual void clear(Color col) { } //rect(back_panel, col); }
\r
95 public virtual void pix(int x, int y, Color col) { }
\r
96 public virtual void line(Line drawee) { drawee.copyToStack(this); }
\r
97 public virtual void rect(Rectangle drawee) { drawee.copyToStack(this); }
\r
98 public virtual void ellipse(Ellipse drawee) { drawee.copyToStack(this); }
\r
99 public virtual void oval(Ellipse drawee) { drawee.copyToStack(this); }
\r
100 public virtual void polygon(Polygon drawee) { drawee.copyToStack(this); }
\r
101 public virtual void letters(Letters drawee) { drawee.copyToStack(this); }
\r
102 public virtual void image(Image drawee) { drawee.copyToStack(this); }
\r
103 public virtual void group(Group drawee) { drawee.copyToStack(this); }
\r
104 public virtual void shader(ShaderField drawee) { drawee.copyToStack(this); }
\r
106 public void msg(string str, double x, double y) { msg(str, x, y, Color.white); }
\r
107 public virtual void msg(string dstr, double x, double y, Color col)
\r
109 var let = new Letters(dstr);
\r
114 public void var<Type>(Type val, double x, double y) { msg(val.ToString(), x, y, Color.white); }
\r
115 public void var<Type>(Type val, double x, double y, Color col) { msg(val.ToString(), x, y, col); }
\r
117 public virtual Point getCenter() { return new Point(0, 0, 0); }
\r
122 public class Canvas : Templates.StackableDrawable
\r
124 internal System.Windows.Controls.Canvas masterPool, prevPool;
\r
125 internal System.Windows.Point[] pointPool;
\r
126 internal int pointPoolN;
\r
127 internal SolidColorBrush[] brushPool;
\r
128 internal int brushPoolN, brushPoolMAX;
\r
130 internal System.Windows.Controls.Canvas[] UIElementPool;
\r
131 internal int UIElementPoolN;
\r
132 internal int lastVisibleN;
\r
134 internal System.Windows.Shapes.Line[] linePool;
\r
135 internal int linePoolN, linePoolMAX;
\r
136 internal System.Windows.Shapes.Rectangle[] dummyRectPool;
\r
137 internal System.Windows.Shapes.Rectangle[] rectPool;
\r
138 internal int rectPoolN, rectPoolMAX;
\r
139 internal System.Windows.Shapes.Rectangle[] shaderPool;
\r
140 internal int shaderPoolN, shaderPoolMAX;
\r
141 internal System.Windows.Shapes.Ellipse[] ellipsePool;
\r
142 internal int ellipsePoolN, ellipsePoolMAX;
\r
143 internal System.Windows.Shapes.Polygon[] polygonPool;
\r
144 internal int polygonPoolN, polygonPoolMAX;
\r
145 internal System.Windows.Controls.TextBlock[] lettersPool;
\r
146 internal int lettersPoolN, lettersPoolMAX;
\r
147 internal System.Windows.Controls.Image[] imagePool;
\r
148 internal int imagePoolN, imagePoolMAX;
\r
149 internal Dictionary<int, bool> imagePoolT;
\r
150 internal System.Windows.Controls.Canvas[] groupPool;
\r
151 internal int groupPoolN, groupPoolMAX;
\r
153 #region initializer
\r
156 public static IList<Action> initialize_at_canvas_initialize__ = new List<Action>();
\r
158 public static System.Windows.Controls.UserControl default_panel;
\r
159 public static System.Windows.Controls.Canvas default_api_canvas;
\r
160 public static WriteableBitmap default_buffer;
\r
161 internal System.Windows.Controls.Canvas api_canvas;
\r
162 internal System.Windows.Controls.UserControl panel;
\r
163 Rectangle back_panel;
\r
164 double width_, height_;
\r
167 public Canvas(int wid, int hei)
\r
169 panel = default_panel;
\r
170 api_canvas = default_api_canvas;
\r
171 initialize(wid, hei);
\r
173 public Canvas(int wid, int hei, System.Windows.Controls.Canvas apicnvs, System.Windows.Controls.UserControl system)
\r
176 api_canvas = apicnvs;
\r
177 initialize(wid, hei);
\r
180 protected bool AsyncInitBool;
\r
181 internal void beginInvoke(Action a) { api_canvas.Dispatcher.BeginInvoke(a); }
\r
182 protected void initialize(int wid, int hei)
\r
184 before = new Clock();
\r
186 var after = new Clock();
\r
187 AsyncInitBool = false;
\r
190 api_canvas.Dispatcher.BeginInvoke(new Action<int,int>(initialize__), wid, hei);
\r
191 while (!AsyncInitBool)
\r
194 if ((after - before).at_msec() > 1000) break;
\r
196 Mouse._prime = api_canvas;
\r
197 Main.drawable = this;
\r
198 Main.canvas = this;
\r
200 back_panel = new Rectangle(wid, hei);
\r
202 flipexec = new Action(executeFlip);
\r
204 protected void initialize__(int wid, int hei)
\r
206 api_canvas.Width = wid;
\r
207 api_canvas.Height = hei+20;
\r
208 api_canvas.MouseMove += Mouse.Canvas_MousePos;
\r
209 api_canvas.MouseLeftButtonDown += Mouse.Canvas_LDown;
\r
210 api_canvas.MouseLeftButtonUp += Mouse.Canvas_LUp;
\r
211 api_canvas.MouseWheel += Mouse.Canvas_MouseWheel;
\r
212 panel.KeyDown += Keyboard.Canvas_KeyDown;
\r
213 panel.KeyUp += Keyboard.Canvas_KeyUp;
\r
215 HtmlElement htmlHost = HtmlPage.Document.GetElementById("silverlightControlHost");
\r
216 //if (htmlHost != null) HtmlPage.Window.Alert("silverlightControlHost is null");
\r
217 htmlHost.SetStyleAttribute("width", (wid).ToString()+"px");
\r
218 htmlHost.SetStyleAttribute("height", (hei).ToString() + "px");
\r
219 htmlHost.SetStyleAttribute("margin", "2em auto auto auto");
\r
221 pointPool = new System.Windows.Point[CONST.MOBJ_N];
\r
222 brushPool = new SolidColorBrush[CONST.MOBJ_N];
\r
223 rectPool = new System.Windows.Shapes.Rectangle[CONST.MOBJ_N];
\r
224 for (int i = 0; i < CONST.MOBJ_N; i++)
\r
226 //pointPool[i] = new System.Windows.Point();
\r
227 brushPool[i] = new SolidColorBrush();
\r
228 rectPool[i] = new System.Windows.Shapes.Rectangle();
\r
230 ellipsePool = new System.Windows.Shapes.Ellipse[CONST.COBJ_N];
\r
231 linePool = new System.Windows.Shapes.Line[CONST.COBJ_N];
\r
232 shaderPool = new System.Windows.Shapes.Rectangle[CONST.COBJ_N];
\r
233 polygonPool = new System.Windows.Shapes.Polygon[CONST.COBJ_N];
\r
234 for (int i = 0; i < CONST.COBJ_N; i++)
\r
236 linePool[i] = new System.Windows.Shapes.Line();
\r
237 ellipsePool[i] = new System.Windows.Shapes.Ellipse();
\r
238 shaderPool[i] = new System.Windows.Shapes.Rectangle();
\r
239 polygonPool[i] = new System.Windows.Shapes.Polygon();
\r
241 lettersPool = new System.Windows.Controls.TextBlock[CONST.HOBJ_N];
\r
242 imagePool = new System.Windows.Controls.Image[CONST.HOBJ_N];
\r
243 imagePoolT = new Dictionary<int, bool>(CONST.HOBJ_N);
\r
244 groupPool = new System.Windows.Controls.Canvas[CONST.HOBJ_N];
\r
245 for (int i = 0; i < CONST.HOBJ_N; i++)
\r
247 lettersPool[i] = new System.Windows.Controls.TextBlock();
\r
248 imagePool[i] = new System.Windows.Controls.Image();
\r
249 imagePoolT.Add(imagePool[i].GetHashCode(), false);
\r
250 groupPool[i] = new System.Windows.Controls.Canvas();
\r
253 masterPool = new System.Windows.Controls.Canvas();
\r
254 prevPool = new System.Windows.Controls.Canvas();
\r
255 api_canvas.Children.Add(masterPool);
\r
257 //api_canvas.Children.Remove(Internal.Main.widgetStack);
\r
258 Psychlops.Internal.Main.widgetStack = new StackPanel();
\r
259 Psychlops.Internal.Main.widgetStack.Orientation = Orientation.Vertical;
\r
260 Psychlops.Internal.Main.widgetStack.Height = hei;
\r
261 api_canvas.Children.Add(Psychlops.Internal.Main.widgetStack);
\r
262 Internal.Main.statusBar.Visibility = Visibility.Collapsed;
\r
265 UIElementPool = new System.Windows.Controls.Canvas[CONST.MAX_OBJ_N];
\r
266 dummyRectPool = new System.Windows.Shapes.Rectangle[CONST.MAX_OBJ_N];
\r
267 for (int i = 0; i < CONST.MAX_OBJ_N; i++)
\r
269 UIElementPool[i] = new System.Windows.Controls.Canvas();
\r
270 masterPool.Children.Add(UIElementPool[i]);
\r
271 dummyRectPool[i] = new System.Windows.Shapes.Rectangle();
\r
272 UIElementPool[i].Children.Add(dummyRectPool[i]);
\r
273 dummyRectPool[i].Visibility = Visibility.Collapsed;
\r
276 AsyncInitBool = true;
\r
278 // initialize at Canvas initializing
\r
279 //Figures.ShaderGabor.initialize__();
\r
282 internal int findEmptyInPool(Dictionary<int, bool> pool)
\r
285 foreach( KeyValuePair<int, bool> elem in pool)
\r
294 #region static initializer
\r
303 public override void clear(Color col)
\r
305 back_panel.fill = col;
\r
310 int nextIntervalFrame = 1, chacked = 0;
\r
311 public void flip(int n)
\r
315 nextIntervalFrame = n;
\r
328 UIElementPoolN = 0;
\r
343 Internal.Main.canvas_flag.WaitOne();
\r
351 #region version modifyNative2
\r
352 public void executeFlip()
\r
354 // Clock after = new Clock();
\r
356 // AppState.statusBar = ((after - before).at_msec().ToString()) + " msec";
\r
359 ShaderField shaderS;
\r
366 System.Windows.Shapes.Line lineP;
\r
367 System.Windows.Shapes.Rectangle rectP;
\r
368 System.Windows.Shapes.Rectangle shaderP;
\r
369 System.Windows.Shapes.Ellipse ellipseP;
\r
370 System.Windows.Shapes.Polygon polygonP;
\r
371 System.Windows.Controls.TextBlock lettersP;
\r
372 System.Windows.Controls.Image imageP;
\r
373 System.Windows.Controls.Canvas groupP;
\r
377 nextIntervalFrame--;
\r
380 var cnv = UIElementPool[0];
\r
381 if (nextIntervalFrame <= 0)
\r
387 for (int i = 0; i < stackN; i++)
\r
389 if (null != (shaderS = stack[i] as ShaderField))
\r
391 if (null != (shaderP = cnv.Children[0] as System.Windows.Shapes.Rectangle))
\r
393 shaderS.modifyNative(shaderP, this);
\r
397 cnv.Children.Clear();
\r
398 cnv.Children.Add(stack[i].poolNative(this));
\r
401 else if( null != (rectS = stack[i] as Rectangle) )
\r
403 if (null != (rectP = cnv.Children[0] as System.Windows.Shapes.Rectangle))
\r
405 rectS.modifyNative(rectP, this);
\r
409 cnv.Children.Clear();
\r
410 cnv.Children.Add(stack[i].poolNative(this));
\r
413 else if (null != (lineS = stack[i] as Line))
\r
415 if (null != (lineP = cnv.Children[0] as System.Windows.Shapes.Line))
\r
417 lineS.modifyNative(lineP, this);
\r
421 cnv.Children.Clear();
\r
422 cnv.Children.Add(stack[i].poolNative(this));
\r
425 else if (null != (ellipseS = stack[i] as Ellipse))
\r
427 if (null != (ellipseP = cnv.Children[0] as System.Windows.Shapes.Ellipse))
\r
429 ellipseS.modifyNative(ellipseP, this);
\r
433 cnv.Children.Clear();
\r
434 cnv.Children.Add(stack[i].poolNative(this));
\r
437 else if (null != (polygonS = stack[i] as Polygon))
\r
439 if (null != (polygonP = cnv.Children[0] as System.Windows.Shapes.Polygon))
\r
441 polygonS.modifyNative(polygonP, this);
\r
445 cnv.Children.Clear();
\r
446 cnv.Children.Add(stack[i].poolNative(this));
\r
449 else if (null != (lettersS = stack[i] as Letters))
\r
451 if (null != (lettersP = cnv.Children[0] as System.Windows.Controls.TextBlock))
\r
453 lettersS.modifyNative(lettersP, this);
\r
457 cnv.Children.Clear();
\r
458 cnv.Children.Add(stack[i].poolNative(this));
\r
461 else if (null != (imageS = stack[i] as Image))
\r
463 if (null != (imageP = cnv.Children[0] as System.Windows.Controls.Image))
\r
465 imageS.modifyNative(imageP, this);
\r
469 cnv.Children.Clear();
\r
470 cnv.Children.Add(stack[i].poolNative(this));
\r
473 else if (null != (groupS = stack[i] as Group))
\r
475 if (null != (groupP = cnv.Children[0] as System.Windows.Controls.Canvas))
\r
477 groupS.modifyNative(groupP, this);
\r
481 cnv.Children.Clear();
\r
482 cnv.Children.Add(stack[i].poolNative(this));
\r
485 cnv.Visibility = Visibility.Visible;
\r
487 cnv = UIElementPool[UIElementPoolN];
\r
489 for (int i = UIElementPoolN; i < lastVisibleN; i++)
\r
491 cnv = UIElementPool[i];
\r
492 cnv.Visibility = Visibility.Collapsed;
\r
494 lastVisibleN = UIElementPoolN;
\r
501 Psychlops.Internal.Main.canvas_flag.Set();
\r
504 System.Threading.Thread.Sleep(0);
\r
510 #region version modifyNative
\r
512 public void executeFlip()
\r
521 System.Windows.Shapes.Line lineP;
\r
522 System.Windows.Shapes.Rectangle rectP;
\r
523 System.Windows.Shapes.Ellipse ellipseP;
\r
524 System.Windows.Shapes.Polygon polygonP;
\r
525 System.Windows.Controls.TextBlock lettersP;
\r
526 System.Windows.Controls.Image imageP;
\r
527 System.Windows.Controls.Canvas groupP;
\r
531 nextIntervalFrame--;
\r
534 var en = masterPool.Children.GetEnumerator();
\r
535 bool full = en.MoveNext();
\r
536 if (nextIntervalFrame <= 0)
\r
540 //masterPool.Children.Clear();
\r
543 for (int i = 0; i < stackN - 2; i++)
\r
547 masterPool.Children.Add(stack[i].poolNative(this));
\r
551 if( null != (rectS = stack[i] as Rectangle) )
\r
553 if (null != (rectP = en.Current as System.Windows.Shapes.Rectangle))
\r
555 rectS.modifyNative(rectP, this);
\r
558 else if (null != (lineS = stack[i] as Line))
\r
560 if (null != (lineP = en.Current as System.Windows.Shapes.Line))
\r
562 lineS.modifyNative(lineP, this);
\r
565 else if (null != (ellipseS = stack[i] as Ellipse))
\r
567 if (null != (ellipseP = en.Current as System.Windows.Shapes.Ellipse))
\r
569 ellipseS.modifyNative(ellipseP, this);
\r
573 masterPool.Children.Add(stack[i].poolNative(this));
\r
576 else if (null != (polygonS = stack[i] as Polygon))
\r
578 if (null != (polygonP = en.Current as System.Windows.Shapes.Polygon))
\r
580 polygonS.modifyNative(polygonP, this);
\r
583 else if (null != (lettersS = stack[i] as Letters))
\r
585 if (null != (lettersP = en.Current as System.Windows.Controls.TextBlock))
\r
587 lettersS.modifyNative(lettersP, this);
\r
590 else if (null != (imageS = stack[i] as Image))
\r
592 if (null != (imageP = en.Current as System.Windows.Controls.Image))
\r
594 imageS.modifyNative(imageP, this);
\r
597 else if (null != (groupS = stack[i] as Group))
\r
599 if (null != (groupP = en.Current as System.Windows.Controls.Canvas))
\r
601 groupS.modifyNative(groupP, this);
\r
604 full = en.MoveNext();
\r
613 Psychlops.Internal.Main.canvas_flag.Set();
\r
616 System.Threading.Thread.Sleep(0);
\r
621 #region version poolNative 2
\r
623 public void executeFlip()
\r
628 nextIntervalFrame--;
\r
630 UIElementPoolN = 0;
\r
631 if (nextIntervalFrame <= 0)
\r
635 //masterPool.Children.Clear();
\r
638 for (int i = 0; i < stackN - 2; i++)
\r
640 UIElementPool[UIElementPoolN] = stack[i].poolNative(this);
\r
641 UIElementPool[UIElementPoolN].Visibility = Visibility.Visible;
\r
645 for (int i = stackN - 2; i < 10000; i++)
\r
647 UIElementPool[UIElementPoolN] = rectPool[i];
\r
648 UIElementPool[UIElementPoolN].Visibility = Visibility.Collapsed;
\r
657 Psychlops.Internal.Main.canvas_flag.Set();
\r
660 System.Threading.Thread.Sleep(0);
\r
668 public double width { get { return width_; } }
\r
669 public double height { get { return height_; } }
\r
670 public Point center { get { return new Point(width / 2.0, height / 2.0, 0); } }
\r
671 public double getWidth() { return width; }
\r
672 public double getHeight() { return height; }
\r
673 public override Point getCenter() { return center; }
\r
674 public double getHCenter() { return width / 2; }
\r
675 public double getVCenter() { return height / 2; }
\r
676 public double getRefreshRate() { return 60; }
\r
681 #region compatibitily trick
\r
683 public enum Mode { window, fullscreen }
\r
684 public static readonly Mode window = Mode.window, fullscreen = Mode.fullscreen;
\r
686 public Canvas(int wid, int hei, Mode mod)
\r
688 panel = default_panel;
\r
689 api_canvas = default_api_canvas;
\r
690 initialize(500, 500);
\r
692 public Canvas(Mode mod)
\r
695 panel = default_panel;
\r
696 api_canvas = default_api_canvas;
\r
697 initialize(500, 500);
\r
700 public Canvas(int wid, int hei, Mode mod, Display.DisplayName name)
\r
702 panel = default_panel;
\r
703 api_canvas = default_api_canvas;
\r
704 initialize(500, 500);
\r
706 public Canvas(Mode mod, Display.DisplayName name)
\r
709 panel = default_panel;
\r
710 api_canvas = default_api_canvas;
\r
711 initialize(500, 500);
\r
715 public void showFPS(bool sw = true) { }
\r
716 public void watchFPS(bool sw = true) { }
\r
719 public void clear(double lum)
\r
721 clear(new Color(lum));
\r
731 #region primitive tokenizer
\r
736 partial struct Point
\r
738 public static implicit operator System.Windows.Point(Point d)
\r
740 return new System.Windows.Point(d.x, d.y);
\r
744 public Point datum { get { return this; } set { this = value; } }
\r
745 public Point shift(Point p) { this = this + p; return this; }
\r
746 public Point centering(Point p) { this = p; return this; }
\r
747 public Point getDatum() { return this; }
\r
748 public Point setDatum(Point p) { this = p; return p; }
\r
749 public Point shift(double x, double y, double z = 0.0) { return shift(new Point(x, y, z)); }
\r
750 public Point centering() { return centering(Main.drawable.getCenter()); }
\r
751 public Point centering(double x, double y, double z = 0.0) { return centering(new Point(x, y, z)); }
\r
754 partial struct Color
\r
756 public static implicit operator System.Windows.Media.Color(Color d)
\r
758 return System.Windows.Media.Color.FromArgb((byte)(d.a * 255), (byte)(d.r * 255), (byte)(d.g * 255), (byte)(d.b * 255));
\r
760 public static implicit operator System.Windows.Media.SolidColorBrush(Color d)
\r
762 return new SolidColorBrush { Color = d };
\r
764 public System.Windows.Media.SolidColorBrush getNativeFromStack(Canvas d)
\r
766 var tmp = d.brushPool[d.brushPoolN];
\r
774 partial struct Stroke
\r
776 public void apply(System.Windows.Shapes.Shape target)
\r
778 target.Stroke = this;
\r
779 //target.StrokeDashArray
\r
780 target.StrokeThickness = thick;
\r
782 public static implicit operator SolidColorBrush(Stroke d)
\r
784 return new SolidColorBrush { Color = d.color };
\r
786 public System.Windows.Media.SolidColorBrush getNativeFromStack(Canvas d)
\r
788 var tmp = d.brushPool[d.brushPoolN];
\r
789 tmp.Color = this.color;
\r
803 return (Line)MemberwiseClone();
\r
805 public Line clone()
\r
807 return (Line)MemberwiseClone();
\r
809 public static implicit operator System.Windows.Shapes.Line(Line d)
\r
811 var tmp = new System.Windows.Shapes.Line() { X1 = d.begin.x, Y1 = d.begin.y, X2 = d.end.x, Y2 = d.end.y };
\r
812 if (d.stroke.thick == 0.0) tmp.Stroke = d.fill;
\r
813 else d.stroke.apply(tmp);
\r
816 public UIElement toNative() { return this; }
\r
818 public void copyToStack(Templates.StackableDrawable d)
\r
820 var tmp = d.lineStack[d.lineStackN];
\r
821 tmp.begin.x = begin.x;
\r
822 tmp.begin.y = begin.y;
\r
826 tmp.stroke = stroke;
\r
827 d.stack[d.stackN] = tmp;
\r
831 public UIElement poolNative(Canvas d)
\r
833 var tmp = d.linePool[d.linePoolN];
\r
838 if (stroke.thick == 0.0) tmp.Stroke = fill.getNativeFromStack(d);
\r
839 else stroke.apply(tmp);
\r
840 System.Windows.Controls.Canvas.SetLeft(tmp, left);
\r
841 System.Windows.Controls.Canvas.SetTop(tmp, top);
\r
842 tmp.Visibility = Visibility.Visible;
\r
846 public void modifyNative(System.Windows.Shapes.Line tmp, Canvas d)
\r
852 if (stroke.thick == 0.0) tmp.Stroke = fill.getNativeFromStack(d);
\r
853 else stroke.apply(tmp);
\r
854 System.Windows.Controls.Canvas.SetLeft(tmp, left);
\r
855 System.Windows.Controls.Canvas.SetTop(tmp, top);
\r
856 tmp.Visibility = Visibility.Visible;
\r
864 partial class Rectangle
\r
866 public Rectangle dup()
\r
868 return (Rectangle)MemberwiseClone();
\r
870 public Rectangle clone()
\r
872 return (Rectangle)MemberwiseClone();
\r
874 public static implicit operator System.Windows.Rect(Rectangle d)
\r
876 return new System.Windows.Rect(d.v1.x, d.v1.y, d.v2.x, d.v2.y);
\r
878 public static implicit operator System.Windows.Shapes.Rectangle(Rectangle d)
\r
880 var tmp = new System.Windows.Shapes.Rectangle { Width = d.width, Height = d.height, Fill = d.fill };
\r
881 d.stroke.apply(tmp);
\r
882 System.Windows.Controls.Canvas.SetLeft(tmp, d.left);
\r
883 System.Windows.Controls.Canvas.SetTop(tmp, d.top);
\r
887 public UIElement toNative() { return this; }
\r
888 public void copyToStack(Templates.StackableDrawable d)
\r
890 if (d.rectStackMAX <= d.rectStackN)
\r
892 d.rectStackMAX += CONST.HOBJ_I;
\r
893 for (int i = d.rectStackN; i < d.rectStackMAX; i++)
\r
895 d.rectStack[i] = new Rectangle();
\r
898 var tmp = d.rectStack[d.rectStackN];
\r
902 d.stack[d.stackN] = tmp;
\r
906 public UIElement poolNative(Canvas d)
\r
908 var tmp = d.rectPool[d.rectPoolN];
\r
910 tmp.Height = height;
\r
911 tmp.Fill = fill.getNativeFromStack(d);
\r
912 System.Windows.Controls.Canvas.SetLeft(tmp, left);
\r
913 System.Windows.Controls.Canvas.SetTop(tmp, top);
\r
914 tmp.Visibility = Visibility.Visible;
\r
918 public void modifyNative(System.Windows.Shapes.Rectangle tmp, Canvas d)
\r
921 tmp.Height = height;
\r
922 tmp.Fill = fill.getNativeFromStack(d);
\r
923 System.Windows.Controls.Canvas.SetLeft(tmp, left);
\r
924 System.Windows.Controls.Canvas.SetTop(tmp, top);
\r
925 tmp.Visibility = Visibility.Visible;
\r
931 #region ShaderField
\r
933 partial class ShaderField
\r
935 public System.Windows.Media.Effects.Effect shader;
\r
936 protected static System.Windows.Media.SolidColorBrush dummyfill = null;
\r
938 protected static void initializeShader()
\r
940 dummyfill = new SolidColorBrush(System.Windows.Media.Colors.Blue);
\r
943 public UIElement toNative() { return null; }
\r
944 public void copyToStack(Templates.StackableDrawable d)
\r
946 var tmp = d.shaderStack[d.shaderStackN];
\r
947 tmp.initialize__ = initialize__;
\r
948 tmp.setParameters = setParameters;
\r
951 tmp.shader = shader;
\r
952 d.stack[d.stackN] = tmp;
\r
956 public UIElement poolNative(Canvas d)
\r
958 var tmp = d.shaderPool[d.shaderPoolN];
\r
960 tmp.Height = height;
\r
961 if (!initialized) { initialize__(); }
\r
963 tmp.Effect = shader;
\r
964 tmp.Fill = dummyfill;
\r
965 System.Windows.Controls.Canvas.SetLeft(tmp, left);
\r
966 System.Windows.Controls.Canvas.SetTop(tmp, top);
\r
967 tmp.Visibility = Visibility.Visible;
\r
971 public void modifyNative(System.Windows.Shapes.Rectangle tmp, Canvas d)
\r
974 tmp.Height = height;
\r
975 if (!initialized) { initialize__(); }
\r
977 tmp.Effect = shader;
\r
978 tmp.Fill = dummyfill;
\r
979 System.Windows.Controls.Canvas.SetLeft(tmp, left);
\r
980 System.Windows.Controls.Canvas.SetTop(tmp, top);
\r
981 tmp.Visibility = Visibility.Visible;
\r
989 partial class Ellipse
\r
991 public Ellipse dup()
\r
993 return (Ellipse)MemberwiseClone();
\r
995 public Ellipse clone()
\r
997 return (Ellipse)MemberwiseClone();
\r
999 public static implicit operator System.Windows.Shapes.Ellipse(Ellipse d)
\r
1001 var tmp = new System.Windows.Shapes.Ellipse { Width = d.width, Height = d.height, Fill = d.fill };
\r
1002 d.stroke.apply(tmp);
\r
1003 System.Windows.Controls.Canvas.SetLeft(tmp, d.left);
\r
1004 System.Windows.Controls.Canvas.SetTop(tmp, d.top);
\r
1008 public UIElement toNative() { return this; }
\r
1010 public void copyToStack(Templates.StackableDrawable d)
\r
1012 var tmp = d.ellipseStack[d.ellipseStackN];
\r
1013 tmp.datum = datum;
\r
1014 tmp.xdiameter = xdiameter;
\r
1015 tmp.ydiameter = ydiameter;
\r
1017 d.stack[d.stackN] = tmp;
\r
1018 d.ellipseStackN++;
\r
1021 public UIElement poolNative(Canvas d)
\r
1023 var tmp = d.ellipsePool[d.ellipsePoolN];
\r
1024 tmp.Width = width;
\r
1025 tmp.Height = height;
\r
1026 tmp.Fill = fill.getNativeFromStack(d);
\r
1027 System.Windows.Controls.Canvas.SetLeft(tmp, left);
\r
1028 System.Windows.Controls.Canvas.SetTop(tmp, top);
\r
1029 tmp.Visibility = Visibility.Visible;
\r
1033 public void modifyNative(System.Windows.Shapes.Ellipse tmp, Canvas d)
\r
1035 tmp.Width = width;
\r
1036 tmp.Height = height;
\r
1037 tmp.Fill = fill.getNativeFromStack(d);
\r
1038 System.Windows.Controls.Canvas.SetLeft(tmp, left);
\r
1039 System.Windows.Controls.Canvas.SetTop(tmp, top);
\r
1040 tmp.Visibility = Visibility.Visible;
\r
1048 partial class Polygon
\r
1050 public Polygon dup()
\r
1052 return (Polygon)MemberwiseClone();
\r
1054 public Polygon clone()
\r
1056 return (Polygon)MemberwiseClone();
\r
1058 public static implicit operator System.Windows.Shapes.Polygon(Polygon d)
\r
1060 var tmp = new System.Windows.Shapes.Polygon { Fill = d.fill };
\r
1061 d.stroke.apply(tmp);
\r
1062 foreach (Point p in d.vertices)
\r
1064 tmp.Points.Add(p);
\r
1066 System.Windows.Controls.Canvas.SetLeft(tmp, d.datum.x);
\r
1067 System.Windows.Controls.Canvas.SetTop(tmp, d.datum.y);
\r
1070 public UIElement toNative() { return this; }
\r
1072 public void copyToStack(Templates.StackableDrawable d)
\r
1074 var tmp = d.polygonStack[d.polygonStackN];
\r
1075 tmp.datum = datum;
\r
1076 tmp.vertices.Clear();
\r
1077 foreach (var v in vertices)
\r
1079 tmp.vertices.Add(v);
\r
1082 d.stack[d.stackN] = tmp;
\r
1083 d.polygonStackN++;
\r
1086 public UIElement poolNative(Canvas d)
\r
1088 var tmp = d.polygonPool[d.polygonPoolN];
\r
1089 tmp.Fill = fill.getNativeFromStack(d);
\r
1090 tmp.Points.Clear();
\r
1091 foreach (var v in vertices)
\r
1093 tmp.Points.Add(v);
\r
1095 System.Windows.Controls.Canvas.SetLeft(tmp, datum.x);
\r
1096 System.Windows.Controls.Canvas.SetTop(tmp, datum.y);
\r
1097 tmp.Visibility = Visibility.Visible;
\r
1101 public void modifyNative(System.Windows.Shapes.Polygon tmp, Canvas d)
\r
1103 tmp.Fill = fill.getNativeFromStack(d);
\r
1104 tmp.Points.Clear();
\r
1105 foreach (var v in vertices)
\r
1107 tmp.Points.Add(v);
\r
1109 System.Windows.Controls.Canvas.SetLeft(tmp, datum.x);
\r
1110 System.Windows.Controls.Canvas.SetTop(tmp, datum.y);
\r
1111 tmp.Visibility = Visibility.Visible;
\r
1120 partial class Letters
\r
1122 #region static initializer
\r
1123 internal static System.Collections.Generic.Dictionary<int, System.Windows.FontWeight> FONT_WEIGHT_BRIDGE;
\r
1124 internal static System.Collections.Generic.Dictionary<Font.Style, System.Windows.FontStyle> FONT_STYLE_BRIDGE;
\r
1125 internal static System.Collections.Generic.Dictionary<Letters.HorizontalAlign, TextAlignment> LETTERS_H_ALIGN_BRIDGE;
\r
1128 FONT_WEIGHT_BRIDGE = new System.Collections.Generic.Dictionary<int, System.Windows.FontWeight>();
\r
1129 FONT_WEIGHT_BRIDGE.Add((int)Font.Weight.normal, System.Windows.FontWeights.Normal);
\r
1130 FONT_WEIGHT_BRIDGE.Add((int)Font.Weight.bold, System.Windows.FontWeights.Bold);
\r
1131 FONT_STYLE_BRIDGE = new System.Collections.Generic.Dictionary<Font.Style, System.Windows.FontStyle>();
\r
1132 FONT_STYLE_BRIDGE.Add(Font.Style.normal, System.Windows.FontStyles.Normal);
\r
1133 FONT_STYLE_BRIDGE.Add(Font.Style.italic, System.Windows.FontStyles.Italic);
\r
1134 FONT_STYLE_BRIDGE.Add(Font.Style.oblique, System.Windows.FontStyles.Italic);
\r
1135 LETTERS_H_ALIGN_BRIDGE = new System.Collections.Generic.Dictionary<Letters.HorizontalAlign, TextAlignment>();
\r
1136 LETTERS_H_ALIGN_BRIDGE.Add(Letters.HorizontalAlign.left, TextAlignment.Left);
\r
1137 LETTERS_H_ALIGN_BRIDGE.Add(Letters.HorizontalAlign.center, TextAlignment.Center);
\r
1138 LETTERS_H_ALIGN_BRIDGE.Add(Letters.HorizontalAlign.right, TextAlignment.Right);
\r
1139 LETTERS_H_ALIGN_BRIDGE.Add(Letters.HorizontalAlign.not_specified, TextAlignment.Left);
\r
1142 public Letters dup()
\r
1144 return (Letters)MemberwiseClone();
\r
1146 public Letters clone()
\r
1148 return (Letters)MemberwiseClone();
\r
1150 public static implicit operator System.Windows.Controls.TextBlock(Letters d)
\r
1152 //var zapi_shape = new System.Windows.Documents.Glyphs();
\r
1153 var tmp = new System.Windows.Controls.TextBlock {
\r
1154 Text = d.str, Width = 500, Height = 500,
\r
1155 FontSize = d.font.size,
\r
1156 //tmp.FontFamily = ,
\r
1157 FontStyle = FONT_STYLE_BRIDGE[d.font.style],
\r
1158 FontWeight = FONT_WEIGHT_BRIDGE[d.font.weight],
\r
1159 TextAlignment = LETTERS_H_ALIGN_BRIDGE[d.align],
\r
1160 Foreground = d.fill
\r
1165 case Letters.HorizontalAlign.left: break;
\r
1166 case Letters.HorizontalAlign.center: left = tmp.Width / 2; break;
\r
1167 case Letters.HorizontalAlign.right: left = tmp.Width; break;
\r
1169 System.Windows.Controls.Canvas.SetLeft(tmp, d.datum.x - left);
\r
1170 System.Windows.Controls.Canvas.SetTop(tmp, d.datum.y - d.font.size);
\r
1173 public UIElement toNative() { return this; }
\r
1175 public void copyToStack(Templates.StackableDrawable d)
\r
1177 var tmp = d.lettersStack[d.lettersStackN];
\r
1179 tmp.datum = datum;
\r
1181 d.stack[d.stackN] = tmp;
\r
1182 d.lettersStackN++;
\r
1185 public UIElement poolNative(Canvas d)
\r
1187 var tmp = d.lettersPool[d.lettersPoolN];
\r
1191 tmp.FontSize = font.size;
\r
1192 //tmp.FontFamily = ,
\r
1193 tmp.FontStyle = FONT_STYLE_BRIDGE[font.style];
\r
1194 tmp.FontWeight = FONT_WEIGHT_BRIDGE[font.weight];
\r
1195 tmp.TextAlignment = LETTERS_H_ALIGN_BRIDGE[align];
\r
1196 tmp.Foreground = fill.getNativeFromStack(d);
\r
1197 System.Windows.Controls.Canvas.SetLeft(tmp, datum.x);
\r
1198 System.Windows.Controls.Canvas.SetTop(tmp, datum.y);
\r
1199 tmp.Visibility = Visibility.Visible;
\r
1203 public void modifyNative(System.Windows.Controls.TextBlock tmp, Canvas d)
\r
1208 tmp.FontSize = font.size;
\r
1209 //tmp.FontFamily = ,
\r
1210 tmp.FontStyle = FONT_STYLE_BRIDGE[font.style];
\r
1211 tmp.FontWeight = FONT_WEIGHT_BRIDGE[font.weight];
\r
1212 tmp.TextAlignment = LETTERS_H_ALIGN_BRIDGE[align];
\r
1213 tmp.Foreground = fill.getNativeFromStack(d);
\r
1214 System.Windows.Controls.Canvas.SetLeft(tmp, datum.x);
\r
1215 System.Windows.Controls.Canvas.SetTop(tmp, datum.y);
\r
1216 tmp.Visibility = Visibility.Visible;
\r
1224 partial class Image
\r
1226 internal void initialize__(int wid, int hei)
\r
1228 AsyncBool = false;
\r
1229 Canvas.default_api_canvas.Dispatcher.BeginInvoke(new Action<int,int>(create__), wid, hei);
\r
1230 while (!AsyncBool) { System.Threading.Thread.Sleep(10); }
\r
1232 internal void create__(int wid, int hei)
\r
1234 buffer = new WriteableBitmap(wid, hei);
\r
1237 internal void load__(string uri)
\r
1239 AsyncBool = false;
\r
1240 var ur = new System.Uri(uri, System.UriKind.RelativeOrAbsolute);
\r
1241 Canvas.default_api_canvas.Dispatcher.BeginInvoke(new Action<Uri>(load_), ur);
\r
1242 while (!AsyncBool) { System.Threading.Thread.Sleep(10); }
\r
1244 internal void load_(Uri uri)
\r
1246 var bitmap = new BitmapImage();
\r
1247 bitmap.CreateOptions = BitmapCreateOptions.None;
\r
1248 bitmap.UriSource = uri;
\r
1251 var wbm = new System.Windows.Media.Imaging.WriteableBitmap(bitmap);
\r
1254 //catch (Exception e)
\r
1256 // buffer = new WriteableBitmap(64, 64);
\r
1257 // buffer.ForEach(bitmap_drawChecker);
\r
1259 self_rect.set(buffer.PixelWidth, buffer.PixelHeight);
\r
1262 static System.Windows.Media.Color[] CHECKER_C;
\r
1265 CHECKER_C = new System.Windows.Media.Color[2];
\r
1266 CHECKER_C[0] = System.Windows.Media.Color.FromArgb(0, 0, 0, 0);
\r
1267 CHECKER_C[1] = System.Windows.Media.Color.FromArgb(128,128,128,128);
\r
1269 static System.Windows.Media.Color bitmap_drawChecker(int x, int y)
\r
1271 return ((x / 4) + (y / 4)) % 2 == 0 ? CHECKER_C[0] : CHECKER_C[1];
\r
1273 delegate void FieldFunc1(System.Func<int, int, System.Windows.Media.Color> func);
\r
1274 delegate void FieldFunc2(System.Func<int, int, System.Windows.Media.Color, System.Windows.Media.Color> func);
\r
1275 public void field__(System.Func<int, int, System.Windows.Media.Color> func)
\r
1277 Canvas.default_api_canvas.Dispatcher.BeginInvoke(new FieldFunc1(field___), func);
\r
1278 //buffer.ForEach(func);
\r
1280 public void field__(System.Func<int, int, System.Windows.Media.Color, System.Windows.Media.Color> func)
\r
1282 Canvas.default_api_canvas.Dispatcher.BeginInvoke(new FieldFunc2(field___), func);
\r
1283 //buffer.ForEach(func);
\r
1285 public void field___(System.Func<int, int, System.Windows.Media.Color> func)
\r
1287 buffer.ForEach(func);
\r
1289 public void field___(System.Func<int, int, System.Windows.Media.Color, System.Windows.Media.Color> func)
\r
1291 buffer.ForEach(func);
\r
1294 public Image clone()
\r
1296 return (Image)MemberwiseClone();
\r
1298 public static implicit operator System.Windows.Controls.Image(Image d)
\r
1300 var tmp = new System.Windows.Controls.Image();
\r
1301 tmp.Source = d.buffer;
\r
1302 System.Windows.Controls.Canvas.SetLeft(tmp, d.datum.x);
\r
1303 System.Windows.Controls.Canvas.SetTop(tmp, d.datum.y);
\r
1306 public UIElement toNative() { return this; }
\r
1308 public void copyToStack(Templates.StackableDrawable d)
\r
1310 var tmp = d.imageStack[d.imageStackN];
\r
1311 tmp.datum = datum;
\r
1312 tmp.buffer = buffer;
\r
1313 tmp.self_rect = self_rect;
\r
1314 d.stack[d.stackN] = tmp;
\r
1318 public UIElement poolNative(Canvas d)
\r
1320 var tmp = d.imagePool[d.imagePoolN];
\r
1321 tmp.Source = buffer;
\r
1322 System.Windows.Controls.Canvas.SetLeft(tmp, datum.x);
\r
1323 System.Windows.Controls.Canvas.SetTop(tmp, datum.y);
\r
1324 tmp.Visibility = Visibility.Visible;
\r
1328 public void modifyNative(System.Windows.Controls.Image tmp, Canvas d)
\r
1330 tmp.Source = buffer;
\r
1331 System.Windows.Controls.Canvas.SetLeft(tmp, datum.x);
\r
1332 System.Windows.Controls.Canvas.SetTop(tmp, datum.y);
\r
1333 tmp.Visibility = Visibility.Visible;
\r
1342 partial class Group
\r
1344 internal void initialize__()
\r
1346 Canvas.default_api_canvas.Dispatcher.BeginInvoke(new Action(create__));
\r
1348 internal void create__()
\r
1350 cnvs = new System.Windows.Controls.Canvas();
\r
1351 trans = new System.Windows.Media.TransformGroup();
\r
1352 transF = new System.Windows.Media.TransformCollection();
\r
1353 rotateF = new System.Windows.Media.RotateTransform();
\r
1354 scaleF = new System.Windows.Media.ScaleTransform();
\r
1355 translateF = new System.Windows.Media.TranslateTransform();
\r
1356 transF.Add(rotateF);
\r
1357 transF.Add(scaleF);
\r
1358 transF.Add(translateF);
\r
1359 trans.Children = transF;
\r
1360 cnvs.RenderTransform = trans;
\r
1363 public Group clone()
\r
1365 return (Group)MemberwiseClone();
\r
1368 delegate void AppendFunc1(Internal.PrimitiveFigure func);
\r
1369 void append__(Internal.PrimitiveFigure fig)
\r
1371 fig.centering(0, 0);
\r
1372 UIElement e = fig.toNative();
\r
1373 cnvs.Children.Add(e);
\r
1374 System.Windows.Controls.Canvas.SetLeft(e, fig.datum.x);
\r
1375 System.Windows.Controls.Canvas.SetTop(e, fig.datum.y);
\r
1377 delegate void SimpleProcedure();
\r
1378 void getRotation__() { rotation_ = rotateF.Angle; }
\r
1379 void setRotation__() { rotateF.Angle = rotation_; }
\r
1380 //void getTranslation__() { rotation_ = rotateF.Angle; }
\r
1381 void setTranslation__() { translateF.X = datum.x; translateF.Y = datum.y; }
\r
1382 void setScaling__() { scaleF.ScaleX = scaling_.x; scaleF.ScaleY = scaling_.y; }
\r
1384 public static implicit operator System.Windows.Controls.Canvas(Group d)
\r
1386 var tmp = d.cnvs;//new System.Windows.Controls.Canvas();
\r
1387 System.Windows.Controls.Canvas.SetLeft(d.cnvs, d.datum.x);
\r
1388 System.Windows.Controls.Canvas.SetTop(d.cnvs, d.datum.y);
\r
1391 public UIElement toNative() { return this; }
\r
1393 public void copyToStack(Templates.StackableDrawable d)
\r
1395 var tmp = d.groupStack[d.groupStackN];
\r
1396 tmp.datum = datum;
\r
1398 d.stack[d.stackN] = tmp;
\r
1402 public UIElement poolNative(Canvas d)
\r
1404 //d.groupPool[d.groupPoolN] = cnvs;
\r
1405 //var tmp = d.groupPool[d.groupPoolN];
\r
1407 System.Windows.Controls.Canvas.SetLeft(tmp, datum.x);
\r
1408 System.Windows.Controls.Canvas.SetTop(tmp, datum.y);
\r
1409 tmp.Visibility = Visibility.Visible;
\r
1413 public void modifyNative(System.Windows.Controls.Canvas tmp, Canvas d)
\r
1415 d.groupPool[d.groupPoolN] = cnvs;
\r
1416 System.Windows.Controls.Canvas.SetLeft(cnvs, datum.x);
\r
1417 System.Windows.Controls.Canvas.SetTop(cnvs, datum.y);
\r
1418 tmp.Visibility = Visibility.Visible;
\r