OSDN Git Service

9098329c5407f9affbbf6e844782f29999a0b225
[psychlops/silverlight.git] / dev3 / psychlops / core / graphic / canvas.cs
1 using System;\r
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 \r
11 \r
12 \r
13 namespace Psychlops\r
14 {\r
15 \r
16         public class Canvas : Drawable\r
17         {\r
18                 public static System.Windows.Controls.Image default_buffer_frame;\r
19                 public static System.Windows.Controls.UserControl default_panel;\r
20                 public static System.Windows.Controls.Canvas default_api_canvas;\r
21                 public static WriteableBitmap default_buffer;\r
22                 System.Windows.Controls.Image instance;\r
23                 System.Windows.Controls.Canvas api_canvas;\r
24                 System.Windows.Controls.UserControl panel;\r
25                 WriteableBitmap buffer;\r
26                 System.Windows.Shapes.Rectangle back_panel;\r
27                 System.Windows.Media.SolidColorBrush back_panel_color;\r
28 \r
29                 public Canvas(int wid, int hei)\r
30                 {\r
31                         panel = default_panel;\r
32                         api_canvas = default_api_canvas;\r
33                         instance = default_buffer_frame;\r
34                         initialize(wid, hei);\r
35                 }\r
36                 public Canvas(int wid, int hei, System.Windows.Controls.Image target, System.Windows.Controls.Canvas apicnvs,  System.Windows.Controls.UserControl system)\r
37                 {\r
38                         panel = system;\r
39                         api_canvas = apicnvs;\r
40                         instance = target;\r
41                         initialize(wid, hei);\r
42                 }\r
43                 protected void initialize(int wid, int hei)\r
44                 {\r
45                         instance.Width = wid;\r
46                         instance.Height = hei;\r
47                         instance.Source = buffer;\r
48                         api_canvas.Width = wid;\r
49                         api_canvas.Height = hei;\r
50                         buffer = new WriteableBitmap((int)instance.Width, (int)instance.Height);\r
51                         api_canvas.MouseMove += Mouse.Canvas_MousePos;\r
52                         api_canvas.MouseLeftButtonDown += Mouse.Canvas_LDown;\r
53                         api_canvas.MouseLeftButtonUp += Mouse.Canvas_LUp;\r
54                         api_canvas.MouseWheel += Mouse.Canvas_MouseWheel;\r
55                         Mouse._prime = api_canvas;\r
56                         Main.drawable = this;\r
57                         default_buffer = buffer;\r
58 \r
59                         back_panel = new System.Windows.Shapes.Rectangle();\r
60                         back_panel.Width = wid;\r
61                         back_panel.Height = hei;\r
62                         back_panel_color = new SolidColorBrush();\r
63                         back_panel.Fill = back_panel_color;\r
64                 }\r
65                 public Point getCenter()\r
66                 {\r
67                         return new Point(instance.Width/2.0, instance.Height/2.0, 0);\r
68                 }\r
69 \r
70                 public void clear()\r
71                 {\r
72                         buffer.Clear(Color.black);\r
73                 }\r
74                 public void clear(Color col)\r
75                 {\r
76                         api_canvas.Children.Clear();\r
77                         back_panel_color.Color = col;\r
78                         api_canvas.Children.Add(back_panel);\r
79                         //buffer.Clear(col);\r
80                 }\r
81 \r
82                 public void pix(int x, int y, Color col)\r
83                 {\r
84                         buffer.SetPixel(x, y, col);\r
85                 }\r
86 \r
87                 static System.Windows.Shapes.Line api_line;\r
88                 static System.Windows.Shapes.Path api_curve;\r
89                 static System.Windows.Shapes.Rectangle api_rect;\r
90                 static System.Windows.Shapes.Ellipse api_ellipse;\r
91                 static System.Windows.Shapes.Polygon api_polygon;\r
92                 static System.Windows.Shapes.Polyline api_polyline;\r
93                 static System.Windows.Media.Color api_color;\r
94                 static System.Windows.Media.SolidColorBrush api_fill;\r
95                 static System.Windows.Media.SolidColorBrush api_stroke;\r
96                 static System.Windows.Media.TranslateTransform api_translation;\r
97                 static Canvas()\r
98                 {\r
99                         api_line     = new System.Windows.Shapes.Line();\r
100                         api_curve    = new System.Windows.Shapes.Path();\r
101                         api_rect     = new System.Windows.Shapes.Rectangle();\r
102                         api_ellipse  = new System.Windows.Shapes.Ellipse();\r
103                         api_polygon  = new System.Windows.Shapes.Polygon();\r
104                         api_polyline = new System.Windows.Shapes.Polyline();\r
105                         api_color       = new System.Windows.Media.Color();\r
106                         api_fill        = new System.Windows.Media.SolidColorBrush();\r
107                         api_stroke      = new System.Windows.Media.SolidColorBrush();\r
108                         api_translation = new System.Windows.Media.TranslateTransform();\r
109                 }\r
110 \r
111                 public void line(Line drawee, Color col)\r
112                 {\r
113                         //buffer.DrawLine((int)drawee.begin.x, (int)drawee.begin.y, (int)drawee.end.x, (int)drawee.end.y, col);\r
114                         var zapi_shape = new System.Windows.Shapes.Line();\r
115                         var zapi_fill = new System.Windows.Media.SolidColorBrush();\r
116                         zapi_shape.X1 = (int)drawee.begin.x;\r
117                         zapi_shape.Y1 = (int)drawee.begin.y;\r
118                         zapi_shape.X2 = (int)drawee.end.x;\r
119                         zapi_shape.Y2 = (int)drawee.end.y;\r
120                         zapi_fill.Color = col;\r
121                         zapi_fill.Opacity = 1.0;\r
122                         zapi_shape.Stroke = zapi_fill;\r
123                         zapi_shape.StrokeThickness = 1;\r
124                         api_canvas.Children.Add(zapi_shape);\r
125                         //System.Windows.Controls.Canvas.SetLeft(zapi_shape, drawee.left);\r
126                         //System.Windows.Controls.Canvas.SetTop(zapi_shape, drawee.top);\r
127                 }\r
128                 public void rect(Rectangle drawee, Color col)\r
129                 {\r
130                         //buffer.DrawRectangle((int)drawee.v1.x, (int)drawee.v1.y, (int)drawee.v2.x, (int)drawee.v2.y, col);\r
131 \r
132                         var zapi_shape = new System.Windows.Shapes.Rectangle();\r
133                         var zapi_fill = new System.Windows.Media.SolidColorBrush();\r
134                         zapi_shape.Width = drawee.width;\r
135                         zapi_shape.Height = drawee.height;\r
136                         zapi_fill.Color = col;\r
137                         zapi_shape.Fill = zapi_fill;\r
138                         api_canvas.Children.Add(zapi_shape);\r
139                         System.Windows.Controls.Canvas.SetLeft(zapi_shape, drawee.left);\r
140                         System.Windows.Controls.Canvas.SetTop(zapi_shape, drawee.top);\r
141                 }\r
142                 public void ellipse(Ellipse drawee, Color col)\r
143                 {\r
144                         //buffer.DrawEllipse((int)(drawee.datum.x - drawee.xdiameter / 2), (int)(drawee.datum.y - drawee.ydiameter / 2), (int)(drawee.datum.x + drawee.xdiameter / 2), (int)(drawee.datum.y + drawee.ydiameter / 2), col);\r
145 \r
146                         var zapi_shape = new System.Windows.Shapes.Ellipse();\r
147                         var zapi_fill = new System.Windows.Media.SolidColorBrush();\r
148                         zapi_shape.Width = drawee.width;\r
149                         zapi_shape.Height = drawee.height;\r
150                         zapi_fill.Color = col;\r
151                         zapi_shape.Fill = zapi_fill;\r
152                         api_canvas.Children.Add(zapi_shape);\r
153                         System.Windows.Controls.Canvas.SetLeft(zapi_shape, drawee.left);\r
154                         System.Windows.Controls.Canvas.SetTop(zapi_shape, drawee.top);\r
155                 }\r
156                 public void polygon(Polygon drawee, Color col)\r
157                 {\r
158                         /*\r
159                         int[] ps = new int[drawee.vertices.Count];\r
160                         buffer.DrawPolyline(ps, col);\r
161                         */\r
162                         var zapi_shape = new System.Windows.Shapes.Polygon();\r
163                         var zapi_fill = new System.Windows.Media.SolidColorBrush();\r
164                         int i = 0;\r
165                         foreach (Point p in drawee.vertices)\r
166                         {\r
167                                 zapi_shape.Points.Add(p);\r
168                         }\r
169                         zapi_fill.Color = col;\r
170                         zapi_shape.Fill = zapi_fill;\r
171                         api_canvas.Children.Add(zapi_shape);\r
172                         System.Windows.Controls.Canvas.SetLeft(zapi_shape, drawee.datum.x);\r
173                         System.Windows.Controls.Canvas.SetTop(zapi_shape, drawee.datum.y);\r
174                 }\r
175                 public void letters(Letters drawee, Color col)\r
176                 {\r
177                         //var zapi_shape = new System.Windows.Documents.Glyphs();\r
178                         var zapi_shape = new System.Windows.Controls.TextBlock();\r
179                         var zapi_fill = new System.Windows.Media.SolidColorBrush();\r
180                         zapi_shape.MaxWidth = width;\r
181                         zapi_shape.MaxHeight = height;\r
182                         zapi_shape.Text = drawee.str;\r
183                         //zapi_shape.FontFamily = ;\r
184                         zapi_shape.FontSize = drawee.font.size;\r
185                         zapi_shape.FontStyle = drawee.font.style==Font.Style.normal_style ? System.Windows.FontStyles.Normal : System.Windows.FontStyles.Italic;\r
186                         zapi_shape.FontWeight = drawee.font.weight>400 ? System.Windows.FontWeights.Bold : System.Windows.FontWeights.Normal;\r
187                         zapi_shape.TextAlignment = drawee.align==Letters.HorizontalAlign.TEXT_ALIGN_LEFT ? TextAlignment.Left : TextAlignment.Center;\r
188                         zapi_fill.Color = col;\r
189                         zapi_shape.Foreground = zapi_fill;\r
190                         api_canvas.Children.Add(zapi_shape);\r
191                         System.Windows.Controls.Canvas.SetLeft(zapi_shape, drawee.datum.x);\r
192                         System.Windows.Controls.Canvas.SetTop(zapi_shape, drawee.datum.y);\r
193                 }\r
194                 public void image(Image drawee)\r
195                 {\r
196                         //buffer.Blit(drawee.datum, drawee.buffer, drawee.self_rect, Colors.White, WriteableBitmapExtensions.BlendMode.None);\r
197                         var zapi_shape = new System.Windows.Controls.Image();\r
198                         zapi_shape.Source = drawee.buffer;\r
199                         api_canvas.Children.Add(zapi_shape);\r
200                         System.Windows.Controls.Canvas.SetLeft(zapi_shape, drawee.datum.x);\r
201                         System.Windows.Controls.Canvas.SetTop(zapi_shape, drawee.datum.y);\r
202                 }\r
203 \r
204 \r
205                 public int frame;\r
206                 public void flip()\r
207                 {\r
208                         buffer.Invalidate();\r
209                         frame++;\r
210                 }\r
211 \r
212                 public double width { get { return api_canvas.Width; } }\r
213                 public double height { get { return api_canvas.Height; } }\r
214         }\r
215 \r
216 \r
217 }