1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 namespace System.Drawing
6 {
7     public static class Pens
8     {
9         private static readonly object s_transparentKey = new object();
10         private static readonly object s_aliceBlueKey = new object();
11         private static readonly object s_antiqueWhiteKey = new object();
12         private static readonly object s_aquaKey = new object();
13         private static readonly object s_aquamarineKey = new object();
14         private static readonly object s_azureKey = new object();
15         private static readonly object s_beigeKey = new object();
16         private static readonly object s_bisqueKey = new object();
17         private static readonly object s_blackKey = new object();
18         private static readonly object s_blanchedAlmondKey = new object();
19         private static readonly object s_blueKey = new object();
20         private static readonly object s_blueVioletKey = new object();
21         private static readonly object s_brownKey = new object();
22         private static readonly object s_burlyWoodKey = new object();
23         private static readonly object s_cadetBlueKey = new object();
24         private static readonly object s_chartreuseKey = new object();
25         private static readonly object s_chocolateKey = new object();
26         private static readonly object s_coralKey = new object();
27         private static readonly object s_cornflowerBlueKey = new object();
28         private static readonly object s_cornsilkKey = new object();
29         private static readonly object s_crimsonKey = new object();
30         private static readonly object s_cyanKey = new object();
31         private static readonly object s_darkBlueKey = new object();
32         private static readonly object s_darkCyanKey = new object();
33         private static readonly object s_darkGoldenrodKey = new object();
34         private static readonly object s_darkGrayKey = new object();
35         private static readonly object s_darkGreenKey = new object();
36         private static readonly object s_darkKhakiKey = new object();
37         private static readonly object s_darkMagentaKey = new object();
38         private static readonly object s_darkOliveGreenKey = new object();
39         private static readonly object s_darkOrangeKey = new object();
40         private static readonly object s_darkOrchidKey = new object();
41         private static readonly object s_darkRedKey = new object();
42         private static readonly object s_darkSalmonKey = new object();
43         private static readonly object s_darkSeaGreenKey = new object();
44         private static readonly object s_darkSlateBlueKey = new object();
45         private static readonly object s_darkSlateGrayKey = new object();
46         private static readonly object s_darkTurquoiseKey = new object();
47         private static readonly object s_darkVioletKey = new object();
48         private static readonly object s_deepPinkKey = new object();
49         private static readonly object s_deepSkyBlueKey = new object();
50         private static readonly object s_dimGrayKey = new object();
51         private static readonly object s_dodgerBlueKey = new object();
52         private static readonly object s_firebrickKey = new object();
53         private static readonly object s_floralWhiteKey = new object();
54         private static readonly object s_forestGreenKey = new object();
55         private static readonly object s_fuchsiaKey = new object();
56         private static readonly object s_gainsboroKey = new object();
57         private static readonly object s_ghostWhiteKey = new object();
58         private static readonly object s_goldKey = new object();
59         private static readonly object s_goldenrodKey = new object();
60         private static readonly object s_grayKey = new object();
61         private static readonly object s_greenKey = new object();
62         private static readonly object s_greenYellowKey = new object();
63         private static readonly object s_honeydewKey = new object();
64         private static readonly object s_hotPinkKey = new object();
65         private static readonly object s_indianRedKey = new object();
66         private static readonly object s_indigoKey = new object();
67         private static readonly object s_ivoryKey = new object();
68         private static readonly object s_khakiKey = new object();
69         private static readonly object s_lavenderKey = new object();
70         private static readonly object s_lavenderBlushKey = new object();
71         private static readonly object s_lawnGreenKey = new object();
72         private static readonly object s_lemonChiffonKey = new object();
73         private static readonly object s_lightBlueKey = new object();
74         private static readonly object s_lightCoralKey = new object();
75         private static readonly object s_lightCyanKey = new object();
76         private static readonly object s_lightGoldenrodYellowKey = new object();
77         private static readonly object s_lightGreenKey = new object();
78         private static readonly object s_lightGrayKey = new object();
79         private static readonly object s_lightPinkKey = new object();
80         private static readonly object s_lightSalmonKey = new object();
81         private static readonly object s_lightSeaGreenKey = new object();
82         private static readonly object s_lightSkyBlueKey = new object();
83         private static readonly object s_lightSlateGrayKey = new object();
84         private static readonly object s_lightSteelBlueKey = new object();
85         private static readonly object s_lightYellowKey = new object();
86         private static readonly object s_limeKey = new object();
87         private static readonly object s_limeGreenKey = new object();
88         private static readonly object s_linenKey = new object();
89         private static readonly object s_magentaKey = new object();
90         private static readonly object s_maroonKey = new object();
91         private static readonly object s_mediumAquamarineKey = new object();
92         private static readonly object s_mediumBlueKey = new object();
93         private static readonly object s_mediumOrchidKey = new object();
94         private static readonly object s_mediumPurpleKey = new object();
95         private static readonly object s_mediumSeaGreenKey = new object();
96         private static readonly object s_mediumSlateBlueKey = new object();
97         private static readonly object s_mediumSpringGreenKey = new object();
98         private static readonly object s_mediumTurquoiseKey = new object();
99         private static readonly object s_mediumVioletRedKey = new object();
100         private static readonly object s_midnightBlueKey = new object();
101         private static readonly object s_mintCreamKey = new object();
102         private static readonly object s_mistyRoseKey = new object();
103         private static readonly object s_moccasinKey = new object();
104         private static readonly object s_navajoWhiteKey = new object();
105         private static readonly object s_navyKey = new object();
106         private static readonly object s_oldLaceKey = new object();
107         private static readonly object s_oliveKey = new object();
108         private static readonly object s_oliveDrabKey = new object();
109         private static readonly object s_orangeKey = new object();
110         private static readonly object s_orangeRedKey = new object();
111         private static readonly object s_orchidKey = new object();
112         private static readonly object s_paleGoldenrodKey = new object();
113         private static readonly object s_paleGreenKey = new object();
114         private static readonly object s_paleTurquoiseKey = new object();
115         private static readonly object s_paleVioletRedKey = new object();
116         private static readonly object s_papayaWhipKey = new object();
117         private static readonly object s_peachPuffKey = new object();
118         private static readonly object s_peruKey = new object();
119         private static readonly object s_pinkKey = new object();
120         private static readonly object s_plumKey = new object();
121         private static readonly object s_powderBlueKey = new object();
122         private static readonly object s_purpleKey = new object();
123         private static readonly object s_redKey = new object();
124         private static readonly object s_rosyBrownKey = new object();
125         private static readonly object s_royalBlueKey = new object();
126         private static readonly object s_saddleBrownKey = new object();
127         private static readonly object s_salmonKey = new object();
128         private static readonly object s_sandyBrownKey = new object();
129         private static readonly object s_seaGreenKey = new object();
130         private static readonly object s_seaShellKey = new object();
131         private static readonly object s_siennaKey = new object();
132         private static readonly object s_silverKey = new object();
133         private static readonly object s_skyBlueKey = new object();
134         private static readonly object s_slateBlueKey = new object();
135         private static readonly object s_slateGrayKey = new object();
136         private static readonly object s_snowKey = new object();
137         private static readonly object s_springGreenKey = new object();
138         private static readonly object s_steelBlueKey = new object();
139         private static readonly object s_tanKey = new object();
140         private static readonly object s_tealKey = new object();
141         private static readonly object s_thistleKey = new object();
142         private static readonly object s_tomatoKey = new object();
143         private static readonly object s_turquoiseKey = new object();
144         private static readonly object s_violetKey = new object();
145         private static readonly object s_wheatKey = new object();
146         private static readonly object s_whiteKey = new object();
147         private static readonly object s_whiteSmokeKey = new object();
148         private static readonly object s_yellowKey = new object();
149         private static readonly object s_yellowGreenKey = new object();
150 
151         public static Pen Transparent => GetPen(s_transparentKey, Color.Transparent);
152 
153         public static Pen AliceBlue => GetPen(s_aliceBlueKey, Color.AliceBlue);
154         public static Pen AntiqueWhite => GetPen(s_antiqueWhiteKey, Color.AntiqueWhite);
155         public static Pen Aqua => GetPen(s_aquaKey, Color.Aqua);
156         public static Pen Aquamarine => GetPen(s_aquamarineKey, Color.Aquamarine);
157         public static Pen Azure => GetPen(s_azureKey, Color.Azure);
158 
159         public static Pen Beige => GetPen(s_beigeKey, Color.Beige);
160         public static Pen Bisque => GetPen(s_bisqueKey, Color.Bisque);
161         public static Pen Black => GetPen(s_blackKey, Color.Black);
162         public static Pen BlanchedAlmond => GetPen(s_blanchedAlmondKey, Color.BlanchedAlmond);
163         public static Pen Blue => GetPen(s_blueKey, Color.Blue);
164         public static Pen BlueViolet => GetPen(s_blueVioletKey, Color.BlueViolet);
165         public static Pen Brown => GetPen(s_brownKey, Color.Brown);
166         public static Pen BurlyWood => GetPen(s_burlyWoodKey, Color.BurlyWood);
167 
168         public static Pen CadetBlue => GetPen(s_cadetBlueKey, Color.CadetBlue);
169         public static Pen Chartreuse => GetPen(s_chartreuseKey, Color.Chartreuse);
170         public static Pen Chocolate => GetPen(s_chocolateKey, Color.Chocolate);
171         public static Pen Coral => GetPen(s_coralKey, Color.Coral);
172         public static Pen CornflowerBlue => GetPen(s_cornflowerBlueKey, Color.CornflowerBlue);
173         public static Pen Cornsilk => GetPen(s_cornsilkKey, Color.Cornsilk);
174         public static Pen Crimson => GetPen(s_crimsonKey, Color.Crimson);
175         public static Pen Cyan => GetPen(s_cyanKey, Color.Cyan);
176 
177         public static Pen DarkBlue => GetPen(s_darkBlueKey, Color.DarkBlue);
178         public static Pen DarkCyan => GetPen(s_darkCyanKey, Color.DarkCyan);
179         public static Pen DarkGoldenrod => GetPen(s_darkGoldenrodKey, Color.DarkGoldenrod);
180         public static Pen DarkGray => GetPen(s_darkGrayKey, Color.DarkGray);
181         public static Pen DarkGreen => GetPen(s_darkGreenKey, Color.DarkGreen);
182         public static Pen DarkKhaki => GetPen(s_darkKhakiKey, Color.DarkKhaki);
183         public static Pen DarkMagenta => GetPen(s_darkMagentaKey, Color.DarkMagenta);
184         public static Pen DarkOliveGreen => GetPen(s_darkOliveGreenKey, Color.DarkOliveGreen);
185         public static Pen DarkOrange => GetPen(s_darkOrangeKey, Color.DarkOrange);
186         public static Pen DarkOrchid => GetPen(s_darkOrchidKey, Color.DarkOrchid);
187         public static Pen DarkRed => GetPen(s_darkRedKey, Color.DarkRed);
188         public static Pen DarkSalmon => GetPen(s_darkSalmonKey, Color.DarkSalmon);
189         public static Pen DarkSeaGreen => GetPen(s_darkSeaGreenKey, Color.DarkSeaGreen);
190         public static Pen DarkSlateBlue => GetPen(s_darkSlateBlueKey, Color.DarkSlateBlue);
191         public static Pen DarkSlateGray => GetPen(s_darkSlateGrayKey, Color.DarkSlateGray);
192         public static Pen DarkTurquoise => GetPen(s_darkTurquoiseKey, Color.DarkTurquoise);
193         public static Pen DarkViolet => GetPen(s_darkVioletKey, Color.DarkViolet);
194         public static Pen DeepPink => GetPen(s_deepPinkKey, Color.DeepPink);
195         public static Pen DeepSkyBlue => GetPen(s_deepSkyBlueKey, Color.DeepSkyBlue);
196         public static Pen DimGray => GetPen(s_dimGrayKey, Color.DimGray);
197         public static Pen DodgerBlue => GetPen(s_dodgerBlueKey, Color.DodgerBlue);
198 
199         public static Pen Firebrick => GetPen(s_firebrickKey, Color.Firebrick);
200         public static Pen FloralWhite => GetPen(s_floralWhiteKey, Color.FloralWhite);
201         public static Pen ForestGreen => GetPen(s_forestGreenKey, Color.ForestGreen);
202         public static Pen Fuchsia => GetPen(s_fuchsiaKey, Color.Fuchsia);
203 
204         public static Pen Gainsboro => GetPen(s_gainsboroKey, Color.Gainsboro);
205         public static Pen GhostWhite => GetPen(s_ghostWhiteKey, Color.GhostWhite);
206         public static Pen Gold => GetPen(s_goldKey, Color.Gold);
207         public static Pen Goldenrod => GetPen(s_goldenrodKey, Color.Goldenrod);
208         public static Pen Gray => GetPen(s_grayKey, Color.Gray);
209         public static Pen Green => GetPen(s_greenKey, Color.Green);
210         public static Pen GreenYellow => GetPen(s_greenYellowKey, Color.GreenYellow);
211 
212         public static Pen Honeydew => GetPen(s_honeydewKey, Color.Honeydew);
213         public static Pen HotPink => GetPen(s_hotPinkKey, Color.HotPink);
214 
215         public static Pen IndianRed => GetPen(s_indianRedKey, Color.IndianRed);
216         public static Pen Indigo => GetPen(s_indigoKey, Color.Indigo);
217         public static Pen Ivory => GetPen(s_ivoryKey, Color.Ivory);
218 
219         public static Pen Khaki => GetPen(s_khakiKey, Color.Khaki);
220 
221         public static Pen Lavender => GetPen(s_lavenderKey, Color.Lavender);
222         public static Pen LavenderBlush => GetPen(s_lavenderBlushKey, Color.LavenderBlush);
223         public static Pen LawnGreen => GetPen(s_lawnGreenKey, Color.LawnGreen);
224         public static Pen LemonChiffon => GetPen(s_lemonChiffonKey, Color.LemonChiffon);
225         public static Pen LightBlue => GetPen(s_lightBlueKey, Color.LightBlue);
226         public static Pen LightCoral => GetPen(s_lightCoralKey, Color.LightCoral);
227         public static Pen LightCyan => GetPen(s_lightCyanKey, Color.LightCyan);
228         public static Pen LightGoldenrodYellow => GetPen(s_lightGoldenrodYellowKey, Color.LightGoldenrodYellow);
229         public static Pen LightGreen => GetPen(s_lightGreenKey, Color.LightGreen);
230         public static Pen LightGray => GetPen(s_lightGrayKey, Color.LightGray);
231         public static Pen LightPink => GetPen(s_lightPinkKey, Color.LightPink);
232         public static Pen LightSalmon => GetPen(s_lightSalmonKey, Color.LightSalmon);
233         public static Pen LightSeaGreen => GetPen(s_lightSeaGreenKey, Color.LightSeaGreen);
234         public static Pen LightSkyBlue => GetPen(s_lightSkyBlueKey, Color.LightSkyBlue);
235         public static Pen LightSlateGray => GetPen(s_lightSlateGrayKey, Color.LightSlateGray);
236         public static Pen LightSteelBlue => GetPen(s_lightSteelBlueKey, Color.LightSteelBlue);
237         public static Pen LightYellow => GetPen(s_lightYellowKey, Color.LightYellow);
238         public static Pen Lime => GetPen(s_limeKey, Color.Lime);
239         public static Pen LimeGreen => GetPen(s_limeGreenKey, Color.LimeGreen);
240         public static Pen Linen => GetPen(s_linenKey, Color.Linen);
241 
242         public static Pen Magenta => GetPen(s_magentaKey, Color.Magenta);
243         public static Pen Maroon => GetPen(s_maroonKey, Color.Maroon);
244         public static Pen MediumAquamarine => GetPen(s_mediumAquamarineKey, Color.MediumAquamarine);
245         public static Pen MediumBlue => GetPen(s_mediumBlueKey, Color.MediumBlue);
246         public static Pen MediumOrchid => GetPen(s_mediumOrchidKey, Color.MediumOrchid);
247         public static Pen MediumPurple => GetPen(s_mediumPurpleKey, Color.MediumPurple);
248         public static Pen MediumSeaGreen => GetPen(s_mediumSeaGreenKey, Color.MediumSeaGreen);
249         public static Pen MediumSlateBlue => GetPen(s_mediumSlateBlueKey, Color.MediumSlateBlue);
250         public static Pen MediumSpringGreen => GetPen(s_mediumSpringGreenKey, Color.MediumSpringGreen);
251         public static Pen MediumTurquoise => GetPen(s_mediumTurquoiseKey, Color.MediumTurquoise);
252         public static Pen MediumVioletRed => GetPen(s_mediumVioletRedKey, Color.MediumVioletRed);
253         public static Pen MidnightBlue => GetPen(s_midnightBlueKey, Color.MidnightBlue);
254         public static Pen MintCream => GetPen(s_mintCreamKey, Color.MintCream);
255         public static Pen MistyRose => GetPen(s_mistyRoseKey, Color.MistyRose);
256         public static Pen Moccasin => GetPen(s_moccasinKey, Color.Moccasin);
257 
258         public static Pen NavajoWhite => GetPen(s_navajoWhiteKey, Color.NavajoWhite);
259         public static Pen Navy => GetPen(s_navyKey, Color.Navy);
260 
261         public static Pen OldLace => GetPen(s_oldLaceKey, Color.OldLace);
262         public static Pen Olive => GetPen(s_oliveKey, Color.Olive);
263         public static Pen OliveDrab => GetPen(s_oliveDrabKey, Color.OliveDrab);
264         public static Pen Orange => GetPen(s_orangeKey, Color.Orange);
265         public static Pen OrangeRed => GetPen(s_orangeRedKey, Color.OrangeRed);
266         public static Pen Orchid => GetPen(s_orchidKey, Color.Orchid);
267 
268         public static Pen PaleGoldenrod => GetPen(s_paleGoldenrodKey, Color.PaleGoldenrod);
269         public static Pen PaleGreen => GetPen(s_paleGreenKey, Color.PaleGreen);
270         public static Pen PaleTurquoise => GetPen(s_paleTurquoiseKey, Color.PaleTurquoise);
271         public static Pen PaleVioletRed => GetPen(s_paleVioletRedKey, Color.PaleVioletRed);
272         public static Pen PapayaWhip => GetPen(s_papayaWhipKey, Color.PapayaWhip);
273         public static Pen PeachPuff => GetPen(s_peachPuffKey, Color.PeachPuff);
274         public static Pen Peru => GetPen(s_peruKey, Color.Peru);
275         public static Pen Pink => GetPen(s_pinkKey, Color.Pink);
276         public static Pen Plum => GetPen(s_plumKey, Color.Plum);
277         public static Pen PowderBlue => GetPen(s_powderBlueKey, Color.PowderBlue);
278         public static Pen Purple => GetPen(s_purpleKey, Color.Purple);
279 
280         public static Pen Red => GetPen(s_redKey, Color.Red);
281         public static Pen RosyBrown => GetPen(s_rosyBrownKey, Color.RosyBrown);
282         public static Pen RoyalBlue => GetPen(s_royalBlueKey, Color.RoyalBlue);
283 
284         public static Pen SaddleBrown => GetPen(s_saddleBrownKey, Color.SaddleBrown);
285         public static Pen Salmon => GetPen(s_salmonKey, Color.Salmon);
286         public static Pen SandyBrown => GetPen(s_sandyBrownKey, Color.SandyBrown);
287         public static Pen SeaGreen => GetPen(s_seaGreenKey, Color.SeaGreen);
288         public static Pen SeaShell => GetPen(s_seaShellKey, Color.SeaShell);
289         public static Pen Sienna => GetPen(s_siennaKey, Color.Sienna);
290         public static Pen Silver => GetPen(s_silverKey, Color.Silver);
291         public static Pen SkyBlue => GetPen(s_skyBlueKey, Color.SkyBlue);
292         public static Pen SlateBlue => GetPen(s_slateBlueKey, Color.SlateBlue);
293         public static Pen SlateGray => GetPen(s_slateGrayKey, Color.SlateGray);
294         public static Pen Snow => GetPen(s_snowKey, Color.Snow);
295         public static Pen SpringGreen => GetPen(s_springGreenKey, Color.SpringGreen);
296         public static Pen SteelBlue => GetPen(s_steelBlueKey, Color.SteelBlue);
297 
298         public static Pen Tan => GetPen(s_tanKey, Color.Tan);
299         public static Pen Teal => GetPen(s_tealKey, Color.Teal);
300         public static Pen Thistle => GetPen(s_thistleKey, Color.Thistle);
301         public static Pen Tomato => GetPen(s_tomatoKey, Color.Tomato);
302         public static Pen Turquoise => GetPen(s_turquoiseKey, Color.Turquoise);
303 
304         public static Pen Violet => GetPen(s_violetKey, Color.Violet);
305 
306         public static Pen Wheat => GetPen(s_wheatKey, Color.Wheat);
307         public static Pen White => GetPen(s_whiteKey, Color.White);
308         public static Pen WhiteSmoke => GetPen(s_whiteSmokeKey, Color.WhiteSmoke);
309 
310         public static Pen Yellow => GetPen(s_yellowKey, Color.Yellow);
311         public static Pen YellowGreen => GetPen(s_yellowGreenKey, Color.YellowGreen);
312 
GetPen(object key, Color color)313         private static Pen GetPen(object key, Color color)
314         {
315             Pen Pen = (Pen)SafeNativeMethods.Gdip.ThreadData[key];
316             if (Pen == null)
317             {
318                 Pen = new Pen(color, true);
319                 SafeNativeMethods.Gdip.ThreadData[key] = Pen;
320             }
321             return Pen;
322         }
323     }
324 }
325