From 181c9f33dcc3f4ef8af5dfae1b9fedc935bcdba5 Mon Sep 17 00:00:00 2001 From: Juergen Koller Date: Mon, 1 Dec 2014 15:15:25 +0100 Subject: [PATCH 01/13] Android custom font support --- samples/Clock/Clock/Clock.cs | 8 + samples/Clock/ClockAndroid/Activity1.cs | 2 +- .../Assets/BILLY ARGEL TRIAL___.otf | Bin 0 -> 64296 bytes .../Clock/ClockAndroid/ClockAndroid.csproj | 7 + .../Properties/AndroidManifest.xml | 5 + .../Resources/Resource.Designer.cs | 41 +- src/AndroidGraphics.cs | 789 +++++++++--------- src/Graphics.cs | 53 +- 8 files changed, 499 insertions(+), 406 deletions(-) create mode 100644 samples/Clock/ClockAndroid/Assets/BILLY ARGEL TRIAL___.otf create mode 100644 samples/Clock/ClockAndroid/Properties/AndroidManifest.xml diff --git a/samples/Clock/Clock/Clock.cs b/samples/Clock/Clock/Clock.cs index 308e2ef..ae57bcd 100644 --- a/samples/Clock/Clock/Clock.cs +++ b/samples/Clock/Clock/Clock.cs @@ -47,6 +47,14 @@ public void Draw (IGraphics g) var textWidth = g.GetFontMetrics ().StringWidth ("Cross Graphics"); g.DrawString ("Cross Graphics", center.X - textWidth / 2, center.Y + 0.25f * r); + //Custom Font Test + var customFont = Font.FromName("BILLY ARGEL TRIAL___.otf", "BILLY ARGEL FONT Regular", 30); + g.SetFont(customFont); + g.SetColor(new Color(255, 0, 0)); + var myString = "Custom Font Test"; + textWidth = g.GetFontMetrics().StringWidth(myString); + g.DrawString(myString, center.X - textWidth / 2, center.Y - 0.25f * r); + // // Draw the hour hand // diff --git a/samples/Clock/ClockAndroid/Activity1.cs b/samples/Clock/ClockAndroid/Activity1.cs index 3356952..bb9fd37 100644 --- a/samples/Clock/ClockAndroid/Activity1.cs +++ b/samples/Clock/ClockAndroid/Activity1.cs @@ -42,7 +42,7 @@ public override void Draw (global::Android.Graphics.Canvas canvas) { base.Draw (canvas); - var g = new AndroidGraphics (canvas); + var g = new AndroidGraphics (canvas, Context); _clock.Width = Width; _clock.Height = Height; diff --git a/samples/Clock/ClockAndroid/Assets/BILLY ARGEL TRIAL___.otf b/samples/Clock/ClockAndroid/Assets/BILLY ARGEL TRIAL___.otf new file mode 100644 index 0000000000000000000000000000000000000000..e084a2a11939c9cb065251a40d2e9c86cdda76a9 GIT binary patch literal 64296 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 J1*Fkv{u`~*z2^V` literal 0 HcmV?d00001 diff --git a/samples/Clock/ClockAndroid/ClockAndroid.csproj b/samples/Clock/ClockAndroid/ClockAndroid.csproj index 78e366f..65514b6 100644 --- a/samples/Clock/ClockAndroid/ClockAndroid.csproj +++ b/samples/Clock/ClockAndroid/ClockAndroid.csproj @@ -15,6 +15,9 @@ true Resources\Resource.Designer.cs Off + Properties\AndroidManifest.xml + + v2.3 true @@ -63,6 +66,7 @@ + @@ -75,6 +79,9 @@ + + + + + v3.5 + + + true + full + false + Bin\Debug + DEBUG;TRACE;SILVERLIGHT + true + true + prompt + 4 + + + pdbonly + true + Bin\Release + TRACE;SILVERLIGHT + true + true + prompt + 4 + + + + + + + + + + + + + Graphics.cs + + + SilverlightGraphics.cs + + + System.Drawing.cs + + + Clock.cs + + + App.xaml + + + MainPage.xaml + + + + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Clock/ClockSilverlight/Backup/ClockSilverlight.sln b/samples/Clock/ClockSilverlight/Backup/ClockSilverlight.sln new file mode 100644 index 0000000..11acecb --- /dev/null +++ b/samples/Clock/ClockSilverlight/Backup/ClockSilverlight.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClockSilverlight", "ClockSilverlight.csproj", "{97636F78-8852-4E21-9D3A-8931FCD43C7C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {97636F78-8852-4E21-9D3A-8931FCD43C7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97636F78-8852-4E21-9D3A-8931FCD43C7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97636F78-8852-4E21-9D3A-8931FCD43C7C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97636F78-8852-4E21-9D3A-8931FCD43C7C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/samples/Clock/ClockSilverlight/Backup/Graphics.cs b/samples/Clock/ClockSilverlight/Backup/Graphics.cs new file mode 100644 index 0000000..57819d4 --- /dev/null +++ b/samples/Clock/ClockSilverlight/Backup/Graphics.cs @@ -0,0 +1,559 @@ +// +// Copyright (c) 2010-2012 Frank A. Krueger +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +using System; +using System.Collections.Generic; +using System.Drawing; + +namespace CrossGraphics +{ + public interface IGraphics + { + void BeginEntity(object entity); + + void SetFont(Font f); + + void SetColor(Color c); + + void Clear (Color c); + + void FillPolygon(Polygon poly); + + void DrawPolygon(Polygon poly,float w); + + void FillRect(float x,float y,float width, float height); + + void DrawRect(float x, float y, float width, float height, float w); + + void FillRoundedRect(float x, float y, float width, float height, float radius); + + void DrawRoundedRect(float x, float y, float width, float height, float radius, float w); + + void FillOval(float x, float y, float width, float height); + + void DrawOval(float x, float y, float width, float height, float w); + + void BeginLines(bool rounded); + + void DrawLine(float sx, float sy, float ex, float ey, float w); + + void EndLines(); + + void FillArc(float cx, float cy, float radius, float startAngle, float endAngle); + + void DrawArc(float cx, float cy, float radius, float startAngle, float endAngle, float w); + + void DrawImage(IImage img, float x, float y, float width, float height); + + void DrawString(string s, float x, float y, float width, float height, LineBreakMode lineBreak, TextAlignment align); + + void DrawString(string s, float x, float y); + + void SaveState(); + + void SetClippingRect (float x, float y, float width, float height); + + void Translate(float dx, float dy); + + void Scale(float sx, float sy); + + void RestoreState(); + + IFontMetrics GetFontMetrics(); + + IImage ImageFromFile(string path); + } + + public enum LineBreakMode { + None, + Clip, + WordWrap, + } + + public enum TextAlignment { + Left, + Center, + Right, + Justified + } + + public static class GraphicsEx + { + public static void DrawString (this IGraphics g, string s, PointF p) + { + g.DrawString(s, p.X, p.Y); + } + + public static void DrawString(this IGraphics g, string s, PointF p, Font f) + { + g.SetFont (f); + g.DrawString (s, p.X, p.Y); + } + + public static void DrawString(this IGraphics g, string s, RectangleF p, Font f, LineBreakMode lineBreak, TextAlignment align) + { + g.SetFont (f); + g.DrawString (s, p.Left, p.Top, p.Width, p.Height, lineBreak, align); + } + + public static void DrawLine(this IGraphics g, PointF s, PointF e, float w) + { + g.DrawLine (s.X, s.Y, e.X, e.Y, w); + } + + public static void DrawRoundedRect(this IGraphics g, RectangleF r, float radius, float w) + { + g.DrawRoundedRect (r.Left, r.Top, r.Width, r.Height, radius, w); + } + + public static void DrawRoundedRect(this IGraphics g, Rectangle r, float radius, float w) + { + g.DrawRoundedRect(r.Left, r.Top, r.Width, r.Height, radius, w); + } + + public static void FillRoundedRect(this IGraphics g, RectangleF r, float radius) + { + g.FillRoundedRect (r.Left, r.Top, r.Width, r.Height, radius); + } + + public static void FillRoundedRect(this IGraphics g, Rectangle r, float radius) + { + g.FillRoundedRect (r.Left, r.Top, r.Width, r.Height, radius); + } + + public static void FillRect(this IGraphics g, RectangleF r) + { + g.FillRect (r.Left, r.Top, r.Width, r.Height); + } + + public static void FillRect(this IGraphics g, Rectangle r) + { + g.FillRect(r.Left, r.Top, r.Width, r.Height); + } + + public static void DrawRect(this IGraphics g, RectangleF r, float w) + { + g.DrawRect (r.Left, r.Top, r.Width, r.Height, w); + } + + public static void DrawRect(this IGraphics g, Rectangle r, float w) + { + g.DrawRect(r.Left, r.Top, r.Width, r.Height, w); + } + + public static void FillOval(this IGraphics g, RectangleF r) + { + g.FillOval (r.Left, r.Top, r.Width, r.Height); + } + + public static void DrawOval(this IGraphics g, RectangleF r, float w) + { + g.DrawOval (r.Left, r.Top, r.Width, r.Height, w); + } + } + + public interface IImage + { + } + + [Flags] + public enum FontOptions + { + None = 0, + Bold = 1 + } + + public class Font + { + public string FontFamily { get; private set; } + + public string FontFilename { get; private set; } + + public FontOptions Options { get; private set; } + + public int Size { get; private set; } + + public object Tag { get; set; } + + public bool IsBold { get { return (Options & FontOptions.Bold) != 0; } } + + public Font (string fontFileName, string fontFamily, FontOptions options, int size) + { + FontFilename = fontFileName; + FontFamily = fontFamily; + Options = options; + Size = size; + } + + static Font[] _boldSystemFonts = new Font[0]; + static Font[] _systemFonts = new Font[0]; + static Font[] _userFixedPitchFonts = new Font[0]; + static Font[] _boldUserFixedPitchFonts = new Font[0]; + + public static Font BoldSystemFontOfSize (int size) { + if (size >= _boldSystemFonts.Length) { + return new Font ("", "SystemFont", FontOptions.Bold, size); + } + else { + var f = _boldSystemFonts[size]; + if (f == null) { + f = new Font ("", "SystemFont", FontOptions.Bold, size); + _boldSystemFonts[size] = f; + } + return f; + } + } + public static Font SystemFontOfSize (int size) { + if (size >= _systemFonts.Length) { + return new Font ("", "SystemFont", FontOptions.None, size); + } + else { + var f = _systemFonts[size]; + if (f == null) { + f = new Font ("", "SystemFont", FontOptions.None, size); + _systemFonts[size] = f; + } + return f; + } + } + public static Font UserFixedPitchFontOfSize (int size) { + if (size >= _userFixedPitchFonts.Length) { + return new Font ("", "Monospace", FontOptions.None, size); + } + else { + var f = _userFixedPitchFonts[size]; + if (f == null) { + f = new Font ("", "Monospace", FontOptions.None, size); + _userFixedPitchFonts[size] = f; + } + return f; + } + } + public static Font BoldUserFixedPitchFontOfSize (int size) { + if (size >= _boldUserFixedPitchFonts.Length) { + return new Font ("", "Monospace", FontOptions.Bold, size); + } + else { + var f = _boldUserFixedPitchFonts[size]; + if (f == null) { + f = new Font ("", "Monospace", FontOptions.Bold, size); + _boldUserFixedPitchFonts[size] = f; + } + return f; + } + } + + + //Customs Fonts + //iOS: + //You have to modify your info.plist and add the entry 'Fonts provided by application' UIAppFonts for your custom fonts and copy the fonts to your Bundle as BundleResource + //Not all fonts seem to work and I couldn't find out why + // + //Android: + //Copy the fonts to your Assets folder as AndroidAsset; remember to use the full filename to load the font like Font.FromName("UniversLTStd-LightCn.otf", "Univers LT Std", 18); + // + //Windows Phone/Store: + //According to + //http://stackoverflow.com/questions/14085818/custom-font-usage-in-windows-phone-8 + //you have to set the real font name not only the filename for windows phone like Font.FromName("UniversLTStd-LightCn.otf", "Univers LT Std", 18); + //The fonts should be copied inside a 'Fonts' folder. The custom fonts should be as type 'Content' + + public static Font FromName(string fontFileName, string name, int size) + { + return new Font(fontFileName, name, FontOptions.None, size); + } + + public override string ToString() + { + return string.Format ("[Font: FontFamily={0}, Options={1}, Size={2}, Tag={3}]", FontFamily, Options, Size, Tag); + } + } + + public interface IFontMetrics + { + int StringWidth(string s, int startIndex, int length); + + int Height { get; } + + int Ascent { get; } + + int Descent { get; } + } + + public static class FontMetricsEx + { + public static int StringWidth (this IFontMetrics fm, string s) + { + return fm.StringWidth (s, 0, s.Length); + } + } + + public class Color + { + public readonly int Red, Green, Blue, Alpha; + public object Tag; + + public float RedValue { + get { return Red / 255.0f; } + } + + public float GreenValue { + get { return Green / 255.0f; } + } + + public float BlueValue { + get { return Blue / 255.0f; } + } + + public float AlphaValue { + get { return Alpha / 255.0f; } + } + + public Color (int red, int green, int blue) + { + Red = red; + Green = green; + Blue = blue; + Alpha = 255; + } + + public Color (int red, int green, int blue, int alpha) + { + Red = red; + Green = green; + Blue = blue; + Alpha = alpha; + } + + public Color(float red, float green, float blue) + { + Red = (int)(red * 255); + Green = (int)(green * 255); + Blue = (int)(blue * 255); + Alpha = 255; + } + + public Color(float red, float green, float blue, float alpha) + { + Red = (int)(red * 255); + Green = (int)(green * 255); + Blue = (int)(blue * 255); + Alpha = (int)(alpha * 255); + } + + public int Intensity { get { return (Red + Green + Blue) / 3; } } + + public Color GetInvertedColor() + { + return new Color (255 - Red, 255 - Green, 255 - Blue, Alpha); + } + + public static bool AreEqual(Color a, Color b) + { + if (a == null && b == null) + return true; + if (a == null && b != null) + return false; + if (a != null && b == null) + return false; + return (a.Red == b.Red && a.Green == b.Green && a.Blue == b.Blue && a.Alpha == b.Alpha); + } + + public bool IsWhite { + get { return (Red == 255) && (Green == 255) && (Blue == 255); } + } + + public bool IsBlack { + get { return (Red == 0) && (Green == 0) && (Blue == 0); } + } + + public Color WithAlpha(int aa) + { + return new Color (Red, Green, Blue, aa); + } + + public override bool Equals (object obj) + { + var o = obj as Color; + return (o != null) && (o.Red == Red) && (o.Green == Green) && (o.Blue == Blue) && (o.Alpha == Alpha); + } + + public override int GetHashCode () + { + return (Red + Green + Blue + Alpha).GetHashCode (); + } + + public override string ToString() + { + return string.Format ("[Color: RedValue={0}, GreenValue={1}, BlueValue={2}, AlphaValue={3}]", RedValue, GreenValue, BlueValue, AlphaValue); + } + } + + public static class Colors + { + public static readonly Color Yellow = new Color (255, 255, 0); + public static readonly Color Red = new Color (255, 0, 0); + public static readonly Color Green = new Color (0, 255, 0); + public static readonly Color Blue = new Color (0, 0, 255); + public static readonly Color White = new Color (255, 255, 255); + public static readonly Color Cyan = new Color (0, 255, 255); + public static readonly Color Black = new Color (0, 0, 0); + public static readonly Color LightGray = new Color (212, 212, 212); + public static readonly Color Gray = new Color (127, 127, 127); + public static readonly Color DarkGray = new Color (64, 64, 64); + } + + public class Polygon + { + public readonly List Points; + + public object Tag { get; set; } + + public int Version { get; set; } + + public Polygon () + { + Points = new List (); + } + + public Polygon (int[] xs, int[] ys, int c) + { + Points = new List (c); + for (var i = 0; i < c; i++) { + Points.Add (new PointF (xs [i], ys [i])); + } + } + + public int Count { + get { return Points.Count; } + } + + public void Clear() + { + Points.Clear (); + Version++; + } + + public void AddPoint(PointF p) + { + Points.Add (p); + Version++; + } + + public void AddPoint(float x, float y) + { + Points.Add (new PointF (x, y)); + Version++; + } + } + + public struct Transform2D + { + public float M11, M12, M13; + public float M21, M22, M23; + //public float M31, M32, M33; + + public void Apply (float x, float y, out float xp, out float yp) + { + xp = M11 * x + M12 * y + M13; + yp = M21 * x + M22 * y + M23; + } + + public static Transform2D operator * (Transform2D l, Transform2D r) + { + var t = new Transform2D (); + + t.M11 = l.M11 * r.M11 + l.M12 * r.M21;// +l.M13 * r.M31; + t.M12 = l.M11 * r.M12 + l.M12 * r.M22;// +l.M13 * r.M32; + t.M13 = l.M11 * r.M13 + l.M12 * r.M23 + l.M13;// *r.M33; + + t.M21 = l.M21 * r.M11 + l.M22 * r.M21;// +l.M23 * r.M31; + t.M22 = l.M21 * r.M12 + l.M22 * r.M22;// +l.M23 * r.M32; + t.M23 = l.M21 * r.M13 + l.M22 * r.M23 + l.M23;// *r.M33; + + //t.M31 = l.M31 * r.M11 + l.M32 * r.M21 + l.M33 * r.M31; + //t.M32 = l.M31 * r.M12 + l.M32 * r.M22 + l.M33 * r.M32; + //t.M33 = l.M31 * r.M13 + l.M32 * r.M23 + l.M33 * r.M33; + + return t; + } + + public static Transform2D Identity () + { + var t = new Transform2D (); + t.M11 = 1; + t.M22 = 1; + //t.M33 = 1; + return t; + } + + public static Transform2D Translate (float x, float y) + { + var t = new Transform2D (); + t.M11 = 1; + t.M22 = 1; + //t.M33 = 1; + t.M13 = x; + t.M23 = y; + return t; + } + public static Transform2D Scale (float x, float y) + { + var t = new Transform2D (); + t.M11 = x; + t.M22 = y; + //t.M33 = 1; + return t; + } + } + + public static class RectangleEx + { + public static RectangleF ToRectangleF (this System.Drawing.Rectangle r) + { + return new RectangleF (r.X, r.Y, r.Width, r.Height); + } + + public static System.Drawing.Point GetCenter (this System.Drawing.Rectangle r) + { + return new System.Drawing.Point (r.Left + r.Width / 2, + r.Top + r.Height / 2); + } + + public static System.Drawing.PointF GetCenter (this System.Drawing.RectangleF r) + { + return new System.Drawing.PointF (r.X + r.Width / 2.0f, + r.Y + r.Height / 2.0f); + } + + public static List GetIntersections (this List boxes, RectangleF box) + { + var r = new List (); + foreach (var b in boxes) { + if (b.IntersectsWith (box)) { + r.Add (b); + } + } + return r; + } + } +} + diff --git a/samples/Clock/ClockSilverlight/Backup/MainPage.xaml b/samples/Clock/ClockSilverlight/Backup/MainPage.xaml new file mode 100644 index 0000000..81f7661 --- /dev/null +++ b/samples/Clock/ClockSilverlight/Backup/MainPage.xaml @@ -0,0 +1,12 @@ + + + + + + diff --git a/samples/Clock/ClockSilverlight/Backup/MainPage.xaml.cs b/samples/Clock/ClockSilverlight/Backup/MainPage.xaml.cs new file mode 100644 index 0000000..41e16bc --- /dev/null +++ b/samples/Clock/ClockSilverlight/Backup/MainPage.xaml.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Shapes; +using CrossGraphics.SilverlightGraphics; +using System.Windows.Threading; + +namespace Clock.Silverlight +{ + public partial class MainPage : UserControl + { + Clock _clock; + SilverlightGraphics _graphics; + + public MainPage () + { + InitializeComponent (); + _clock = new Clock (); + } + + private void UserControl_Loaded (object sender, RoutedEventArgs e) + { + _graphics = new SilverlightGraphics (LayoutRoot); + + var timer = new DispatcherTimer { + Interval = TimeSpan.FromSeconds (1), + }; + timer.Tick += delegate { + Draw (); + }; + timer.Start (); + } + + void Draw () + { + _clock.Width = (float)LayoutRoot.ActualWidth; + _clock.Height = (float)LayoutRoot.ActualHeight; + + _graphics.BeginDrawing (); + + _clock.Draw (_graphics); + + _graphics.EndDrawing (); + } + } +} diff --git a/samples/Clock/ClockWP7/Properties/AppManifest.xml b/samples/Clock/ClockSilverlight/Backup/Properties/AppManifest.xml similarity index 100% rename from samples/Clock/ClockWP7/Properties/AppManifest.xml rename to samples/Clock/ClockSilverlight/Backup/Properties/AppManifest.xml diff --git a/samples/Clock/ClockSilverlight/Backup/Properties/AssemblyInfo.cs b/samples/Clock/ClockSilverlight/Backup/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..8661553 --- /dev/null +++ b/samples/Clock/ClockSilverlight/Backup/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle ("ClockSilverlight")] +[assembly: AssemblyDescription ("")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("")] +[assembly: AssemblyProduct ("ClockSilverlight")] +[assembly: AssemblyCopyright ("Copyright © 2012")] +[assembly: AssemblyTrademark ("")] +[assembly: AssemblyCulture ("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible (false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid ("53cf5958-6765-428d-a3b8-69790d7eee9f")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion ("1.0.0.0")] +[assembly: AssemblyFileVersion ("1.0.0.0")] diff --git a/samples/Clock/ClockSilverlight/Backup/System.Drawing.cs b/samples/Clock/ClockSilverlight/Backup/System.Drawing.cs new file mode 100644 index 0000000..64e6e2a --- /dev/null +++ b/samples/Clock/ClockSilverlight/Backup/System.Drawing.cs @@ -0,0 +1,189 @@ +// +// Copyright (c) 2010 Frank A. Krueger +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +using System; + +namespace System.Drawing +{ + public struct RectangleF + { + public float X, Y, Width, Height; + + public float Left { get { return X; } } + public float Top { get { return Y; } } + + public float Right { get { return X + Width; } } + public float Bottom { get { return Y + Height; } } + + public RectangleF (float left, float top, float width, float height) + { + X = left; + Y = top; + Width = width; + Height = height; + } + + public void Inflate (float width, float height) + { + Inflate (new SizeF (width, height)); + } + + public void Inflate (SizeF size) + { + X -= size.Width; + Y -= size.Height; + Width += size.Width * 2; + Height += size.Height * 2; + } + + public bool IntersectsWith(RectangleF rect) + { + return !((Left >= rect.Right) || (Right <= rect.Left) || + (Top >= rect.Bottom) || (Bottom <= rect.Top)); + } + + public bool Contains(PointF loc) + { + return (X <= loc.X && loc.X < (X + Width) && Y <= loc.Y && loc.Y < (Y + Height)); + } + + public override string ToString() + { + return string.Format("[RectangleF: Left={0} Top={1} Width={2} Height={3}]", Left, Top, Width, Height); + } + } + + public struct Rectangle + { + public int X, Y, Width, Height; + + public int Left { get { return X; } } + + public int Top { get { return Y; } } + + public int Bottom { get { return Top + Height; } } + + public int Right { get { return Left + Width; } } + + public Rectangle (int left, int top, int width, int height) + { + X = left; + Y = top; + Width = width; + Height = height; + } + + public void Offset (int dx, int dy) + { + X += dx; + Y += dy; + } + + public bool Contains (int x, int y) + { + return (x >= X && x < X + Width) && (y >= Y && y < Y + Height); + } + + public static Rectangle Union (Rectangle a, Rectangle b) + { + var left = Math.Min (a.Left, b.Left); + var top = Math.Min (a.Top, b.Top); + return new Rectangle (left, + top, + Math.Max (a.Right, b.Right) - left, + Math.Max (a.Bottom, b.Bottom) - top); + } + + public bool IntersectsWith (Rectangle rect) + { + return !((Left >= rect.Right) || (Right <= rect.Left) || + (Top >= rect.Bottom) || (Bottom <= rect.Top)); + } + + public void Inflate (int width, int height) + { + Inflate (new Size (width, height)); + } + + public void Inflate (Size size) + { + X -= size.Width; + Y -= size.Height; + Width += size.Width * 2; + Height += size.Height * 2; + } + + public override string ToString () + { + return string.Format ("[Rectangle: Left={0} Top={1} Width={2} Height={3}]", Left, Top, Width, Height); + } + } + + public struct PointF + { + public float X, Y; + + public PointF (float x, float y) + { + X = x; + Y = y; + } + + public override string ToString() + { + return string.Format("({0}, {1})", X, Y); + } + } + + public struct Point + { + public int X, Y; + + public Point (int x, int y) + { + X = x; + Y = y; + } + } + + public struct Size + { + public int Width, Height; + + public Size (int width, int height) + { + Width = width; + Height = height; + } + } + + public struct SizeF + { + public float Width, Height; + + public SizeF (float width, float height) + { + Width = width; + Height = height; + } + } +} + diff --git a/samples/Clock/ClockSilverlight/ClockSilverlight.csproj b/samples/Clock/ClockSilverlight/ClockSilverlight.csproj index 33281b5..a081ad6 100644 --- a/samples/Clock/ClockSilverlight/ClockSilverlight.csproj +++ b/samples/Clock/ClockSilverlight/ClockSilverlight.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -12,7 +12,7 @@ Clock.Silverlight ClockSilverlight Silverlight - v4.0 + v5.0 $(TargetFrameworkVersion) true @@ -31,6 +31,11 @@ true + + + + + 4.0 + \ No newline at end of file diff --git a/samples/Clock/ClockSvg/Backup/ClockSvg.sln b/samples/Clock/ClockSvg/Backup/ClockSvg.sln new file mode 100644 index 0000000..82cb361 --- /dev/null +++ b/samples/Clock/ClockSvg/Backup/ClockSvg.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClockSvg", "ClockSvg.csproj", "{69365CC0-8B33-450F-8344-F710DBCFCF5B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {69365CC0-8B33-450F-8344-F710DBCFCF5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69365CC0-8B33-450F-8344-F710DBCFCF5B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69365CC0-8B33-450F-8344-F710DBCFCF5B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69365CC0-8B33-450F-8344-F710DBCFCF5B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/samples/Clock/ClockSvg/Backup/Default.aspx b/samples/Clock/ClockSvg/Backup/Default.aspx new file mode 100644 index 0000000..f213c80 --- /dev/null +++ b/samples/Clock/ClockSvg/Backup/Default.aspx @@ -0,0 +1,36 @@ +<%@ Page Language="C#" AutoEventWireup="true" %> + + + + CrossGraphics Clock SVG Sample + + +
+ + <% + Func GetClockSvg = delegate { + var rect = new System.Drawing.RectangleF (0, 0, 400, 400); + var clock = new Clock.Clock (); + using (var w = new System.IO.StringWriter ()) { + var g = new CrossGraphics.Svg.SvgGraphics (w, rect) { + IncludeXmlAndDoctype = false, + }; + g.BeginDrawing (); + clock.Width = rect.Width; + clock.Height = rect.Height; + clock.Draw (g); + g.EndDrawing (); + return w.ToString (); + } + }; + %> + + <%=GetClockSvg() %> + + + + + + diff --git a/samples/Clock/ClockSvg/Backup/Graphics.cs b/samples/Clock/ClockSvg/Backup/Graphics.cs new file mode 100644 index 0000000..57819d4 --- /dev/null +++ b/samples/Clock/ClockSvg/Backup/Graphics.cs @@ -0,0 +1,559 @@ +// +// Copyright (c) 2010-2012 Frank A. Krueger +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +using System; +using System.Collections.Generic; +using System.Drawing; + +namespace CrossGraphics +{ + public interface IGraphics + { + void BeginEntity(object entity); + + void SetFont(Font f); + + void SetColor(Color c); + + void Clear (Color c); + + void FillPolygon(Polygon poly); + + void DrawPolygon(Polygon poly,float w); + + void FillRect(float x,float y,float width, float height); + + void DrawRect(float x, float y, float width, float height, float w); + + void FillRoundedRect(float x, float y, float width, float height, float radius); + + void DrawRoundedRect(float x, float y, float width, float height, float radius, float w); + + void FillOval(float x, float y, float width, float height); + + void DrawOval(float x, float y, float width, float height, float w); + + void BeginLines(bool rounded); + + void DrawLine(float sx, float sy, float ex, float ey, float w); + + void EndLines(); + + void FillArc(float cx, float cy, float radius, float startAngle, float endAngle); + + void DrawArc(float cx, float cy, float radius, float startAngle, float endAngle, float w); + + void DrawImage(IImage img, float x, float y, float width, float height); + + void DrawString(string s, float x, float y, float width, float height, LineBreakMode lineBreak, TextAlignment align); + + void DrawString(string s, float x, float y); + + void SaveState(); + + void SetClippingRect (float x, float y, float width, float height); + + void Translate(float dx, float dy); + + void Scale(float sx, float sy); + + void RestoreState(); + + IFontMetrics GetFontMetrics(); + + IImage ImageFromFile(string path); + } + + public enum LineBreakMode { + None, + Clip, + WordWrap, + } + + public enum TextAlignment { + Left, + Center, + Right, + Justified + } + + public static class GraphicsEx + { + public static void DrawString (this IGraphics g, string s, PointF p) + { + g.DrawString(s, p.X, p.Y); + } + + public static void DrawString(this IGraphics g, string s, PointF p, Font f) + { + g.SetFont (f); + g.DrawString (s, p.X, p.Y); + } + + public static void DrawString(this IGraphics g, string s, RectangleF p, Font f, LineBreakMode lineBreak, TextAlignment align) + { + g.SetFont (f); + g.DrawString (s, p.Left, p.Top, p.Width, p.Height, lineBreak, align); + } + + public static void DrawLine(this IGraphics g, PointF s, PointF e, float w) + { + g.DrawLine (s.X, s.Y, e.X, e.Y, w); + } + + public static void DrawRoundedRect(this IGraphics g, RectangleF r, float radius, float w) + { + g.DrawRoundedRect (r.Left, r.Top, r.Width, r.Height, radius, w); + } + + public static void DrawRoundedRect(this IGraphics g, Rectangle r, float radius, float w) + { + g.DrawRoundedRect(r.Left, r.Top, r.Width, r.Height, radius, w); + } + + public static void FillRoundedRect(this IGraphics g, RectangleF r, float radius) + { + g.FillRoundedRect (r.Left, r.Top, r.Width, r.Height, radius); + } + + public static void FillRoundedRect(this IGraphics g, Rectangle r, float radius) + { + g.FillRoundedRect (r.Left, r.Top, r.Width, r.Height, radius); + } + + public static void FillRect(this IGraphics g, RectangleF r) + { + g.FillRect (r.Left, r.Top, r.Width, r.Height); + } + + public static void FillRect(this IGraphics g, Rectangle r) + { + g.FillRect(r.Left, r.Top, r.Width, r.Height); + } + + public static void DrawRect(this IGraphics g, RectangleF r, float w) + { + g.DrawRect (r.Left, r.Top, r.Width, r.Height, w); + } + + public static void DrawRect(this IGraphics g, Rectangle r, float w) + { + g.DrawRect(r.Left, r.Top, r.Width, r.Height, w); + } + + public static void FillOval(this IGraphics g, RectangleF r) + { + g.FillOval (r.Left, r.Top, r.Width, r.Height); + } + + public static void DrawOval(this IGraphics g, RectangleF r, float w) + { + g.DrawOval (r.Left, r.Top, r.Width, r.Height, w); + } + } + + public interface IImage + { + } + + [Flags] + public enum FontOptions + { + None = 0, + Bold = 1 + } + + public class Font + { + public string FontFamily { get; private set; } + + public string FontFilename { get; private set; } + + public FontOptions Options { get; private set; } + + public int Size { get; private set; } + + public object Tag { get; set; } + + public bool IsBold { get { return (Options & FontOptions.Bold) != 0; } } + + public Font (string fontFileName, string fontFamily, FontOptions options, int size) + { + FontFilename = fontFileName; + FontFamily = fontFamily; + Options = options; + Size = size; + } + + static Font[] _boldSystemFonts = new Font[0]; + static Font[] _systemFonts = new Font[0]; + static Font[] _userFixedPitchFonts = new Font[0]; + static Font[] _boldUserFixedPitchFonts = new Font[0]; + + public static Font BoldSystemFontOfSize (int size) { + if (size >= _boldSystemFonts.Length) { + return new Font ("", "SystemFont", FontOptions.Bold, size); + } + else { + var f = _boldSystemFonts[size]; + if (f == null) { + f = new Font ("", "SystemFont", FontOptions.Bold, size); + _boldSystemFonts[size] = f; + } + return f; + } + } + public static Font SystemFontOfSize (int size) { + if (size >= _systemFonts.Length) { + return new Font ("", "SystemFont", FontOptions.None, size); + } + else { + var f = _systemFonts[size]; + if (f == null) { + f = new Font ("", "SystemFont", FontOptions.None, size); + _systemFonts[size] = f; + } + return f; + } + } + public static Font UserFixedPitchFontOfSize (int size) { + if (size >= _userFixedPitchFonts.Length) { + return new Font ("", "Monospace", FontOptions.None, size); + } + else { + var f = _userFixedPitchFonts[size]; + if (f == null) { + f = new Font ("", "Monospace", FontOptions.None, size); + _userFixedPitchFonts[size] = f; + } + return f; + } + } + public static Font BoldUserFixedPitchFontOfSize (int size) { + if (size >= _boldUserFixedPitchFonts.Length) { + return new Font ("", "Monospace", FontOptions.Bold, size); + } + else { + var f = _boldUserFixedPitchFonts[size]; + if (f == null) { + f = new Font ("", "Monospace", FontOptions.Bold, size); + _boldUserFixedPitchFonts[size] = f; + } + return f; + } + } + + + //Customs Fonts + //iOS: + //You have to modify your info.plist and add the entry 'Fonts provided by application' UIAppFonts for your custom fonts and copy the fonts to your Bundle as BundleResource + //Not all fonts seem to work and I couldn't find out why + // + //Android: + //Copy the fonts to your Assets folder as AndroidAsset; remember to use the full filename to load the font like Font.FromName("UniversLTStd-LightCn.otf", "Univers LT Std", 18); + // + //Windows Phone/Store: + //According to + //http://stackoverflow.com/questions/14085818/custom-font-usage-in-windows-phone-8 + //you have to set the real font name not only the filename for windows phone like Font.FromName("UniversLTStd-LightCn.otf", "Univers LT Std", 18); + //The fonts should be copied inside a 'Fonts' folder. The custom fonts should be as type 'Content' + + public static Font FromName(string fontFileName, string name, int size) + { + return new Font(fontFileName, name, FontOptions.None, size); + } + + public override string ToString() + { + return string.Format ("[Font: FontFamily={0}, Options={1}, Size={2}, Tag={3}]", FontFamily, Options, Size, Tag); + } + } + + public interface IFontMetrics + { + int StringWidth(string s, int startIndex, int length); + + int Height { get; } + + int Ascent { get; } + + int Descent { get; } + } + + public static class FontMetricsEx + { + public static int StringWidth (this IFontMetrics fm, string s) + { + return fm.StringWidth (s, 0, s.Length); + } + } + + public class Color + { + public readonly int Red, Green, Blue, Alpha; + public object Tag; + + public float RedValue { + get { return Red / 255.0f; } + } + + public float GreenValue { + get { return Green / 255.0f; } + } + + public float BlueValue { + get { return Blue / 255.0f; } + } + + public float AlphaValue { + get { return Alpha / 255.0f; } + } + + public Color (int red, int green, int blue) + { + Red = red; + Green = green; + Blue = blue; + Alpha = 255; + } + + public Color (int red, int green, int blue, int alpha) + { + Red = red; + Green = green; + Blue = blue; + Alpha = alpha; + } + + public Color(float red, float green, float blue) + { + Red = (int)(red * 255); + Green = (int)(green * 255); + Blue = (int)(blue * 255); + Alpha = 255; + } + + public Color(float red, float green, float blue, float alpha) + { + Red = (int)(red * 255); + Green = (int)(green * 255); + Blue = (int)(blue * 255); + Alpha = (int)(alpha * 255); + } + + public int Intensity { get { return (Red + Green + Blue) / 3; } } + + public Color GetInvertedColor() + { + return new Color (255 - Red, 255 - Green, 255 - Blue, Alpha); + } + + public static bool AreEqual(Color a, Color b) + { + if (a == null && b == null) + return true; + if (a == null && b != null) + return false; + if (a != null && b == null) + return false; + return (a.Red == b.Red && a.Green == b.Green && a.Blue == b.Blue && a.Alpha == b.Alpha); + } + + public bool IsWhite { + get { return (Red == 255) && (Green == 255) && (Blue == 255); } + } + + public bool IsBlack { + get { return (Red == 0) && (Green == 0) && (Blue == 0); } + } + + public Color WithAlpha(int aa) + { + return new Color (Red, Green, Blue, aa); + } + + public override bool Equals (object obj) + { + var o = obj as Color; + return (o != null) && (o.Red == Red) && (o.Green == Green) && (o.Blue == Blue) && (o.Alpha == Alpha); + } + + public override int GetHashCode () + { + return (Red + Green + Blue + Alpha).GetHashCode (); + } + + public override string ToString() + { + return string.Format ("[Color: RedValue={0}, GreenValue={1}, BlueValue={2}, AlphaValue={3}]", RedValue, GreenValue, BlueValue, AlphaValue); + } + } + + public static class Colors + { + public static readonly Color Yellow = new Color (255, 255, 0); + public static readonly Color Red = new Color (255, 0, 0); + public static readonly Color Green = new Color (0, 255, 0); + public static readonly Color Blue = new Color (0, 0, 255); + public static readonly Color White = new Color (255, 255, 255); + public static readonly Color Cyan = new Color (0, 255, 255); + public static readonly Color Black = new Color (0, 0, 0); + public static readonly Color LightGray = new Color (212, 212, 212); + public static readonly Color Gray = new Color (127, 127, 127); + public static readonly Color DarkGray = new Color (64, 64, 64); + } + + public class Polygon + { + public readonly List Points; + + public object Tag { get; set; } + + public int Version { get; set; } + + public Polygon () + { + Points = new List (); + } + + public Polygon (int[] xs, int[] ys, int c) + { + Points = new List (c); + for (var i = 0; i < c; i++) { + Points.Add (new PointF (xs [i], ys [i])); + } + } + + public int Count { + get { return Points.Count; } + } + + public void Clear() + { + Points.Clear (); + Version++; + } + + public void AddPoint(PointF p) + { + Points.Add (p); + Version++; + } + + public void AddPoint(float x, float y) + { + Points.Add (new PointF (x, y)); + Version++; + } + } + + public struct Transform2D + { + public float M11, M12, M13; + public float M21, M22, M23; + //public float M31, M32, M33; + + public void Apply (float x, float y, out float xp, out float yp) + { + xp = M11 * x + M12 * y + M13; + yp = M21 * x + M22 * y + M23; + } + + public static Transform2D operator * (Transform2D l, Transform2D r) + { + var t = new Transform2D (); + + t.M11 = l.M11 * r.M11 + l.M12 * r.M21;// +l.M13 * r.M31; + t.M12 = l.M11 * r.M12 + l.M12 * r.M22;// +l.M13 * r.M32; + t.M13 = l.M11 * r.M13 + l.M12 * r.M23 + l.M13;// *r.M33; + + t.M21 = l.M21 * r.M11 + l.M22 * r.M21;// +l.M23 * r.M31; + t.M22 = l.M21 * r.M12 + l.M22 * r.M22;// +l.M23 * r.M32; + t.M23 = l.M21 * r.M13 + l.M22 * r.M23 + l.M23;// *r.M33; + + //t.M31 = l.M31 * r.M11 + l.M32 * r.M21 + l.M33 * r.M31; + //t.M32 = l.M31 * r.M12 + l.M32 * r.M22 + l.M33 * r.M32; + //t.M33 = l.M31 * r.M13 + l.M32 * r.M23 + l.M33 * r.M33; + + return t; + } + + public static Transform2D Identity () + { + var t = new Transform2D (); + t.M11 = 1; + t.M22 = 1; + //t.M33 = 1; + return t; + } + + public static Transform2D Translate (float x, float y) + { + var t = new Transform2D (); + t.M11 = 1; + t.M22 = 1; + //t.M33 = 1; + t.M13 = x; + t.M23 = y; + return t; + } + public static Transform2D Scale (float x, float y) + { + var t = new Transform2D (); + t.M11 = x; + t.M22 = y; + //t.M33 = 1; + return t; + } + } + + public static class RectangleEx + { + public static RectangleF ToRectangleF (this System.Drawing.Rectangle r) + { + return new RectangleF (r.X, r.Y, r.Width, r.Height); + } + + public static System.Drawing.Point GetCenter (this System.Drawing.Rectangle r) + { + return new System.Drawing.Point (r.Left + r.Width / 2, + r.Top + r.Height / 2); + } + + public static System.Drawing.PointF GetCenter (this System.Drawing.RectangleF r) + { + return new System.Drawing.PointF (r.X + r.Width / 2.0f, + r.Y + r.Height / 2.0f); + } + + public static List GetIntersections (this List boxes, RectangleF box) + { + var r = new List (); + foreach (var b in boxes) { + if (b.IntersectsWith (box)) { + r.Add (b); + } + } + return r; + } + } +} + diff --git a/samples/Clock/ClockSvg/Backup/Properties/AssemblyInfo.cs b/samples/Clock/ClockSvg/Backup/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..3d6a2cd --- /dev/null +++ b/samples/Clock/ClockSvg/Backup/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle ("ClockSvg")] +[assembly: AssemblyDescription ("")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("")] +[assembly: AssemblyProduct ("ClockSvg")] +[assembly: AssemblyCopyright ("Copyright © 2012")] +[assembly: AssemblyTrademark ("")] +[assembly: AssemblyCulture ("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible (false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid ("73db20ab-7f16-475f-8124-e446ac68c521")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion ("1.0.0.0")] +[assembly: AssemblyFileVersion ("1.0.0.0")] diff --git a/samples/Clock/ClockSvg/Backup/SvgGraphics.cs b/samples/Clock/ClockSvg/Backup/SvgGraphics.cs new file mode 100644 index 0000000..9e1ae06 --- /dev/null +++ b/samples/Clock/ClockSvg/Backup/SvgGraphics.cs @@ -0,0 +1,364 @@ +// +// Copyright (c) 2010-2013 Frank A. Krueger +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +using System; +using System.Collections.Generic; +using System.IO; +using System.Drawing; + +namespace CrossGraphics +{ + public class SvgGraphics : IGraphics + { + TextWriter _tw; + + SvgGraphicsFontMetrics _fontMetrics; + //Font _lastFont = null; + string _lastColor = null; + + class State { + public PointF Scale; + public PointF Translation; + public RectangleF ClippingRect; + } + readonly Stack _states = new Stack (); + State _state = new State (); + + RectangleF _viewBox; + + public SvgGraphics (TextWriter tw, RectangleF viewBox) + { + _viewBox = viewBox; + _tw = tw; + IncludeXmlAndDoctype = true; + _fontMetrics = new SvgGraphicsFontMetrics (); + SetColor (Colors.Black); + _states.Push (_state); + } + + public SvgGraphics (TextWriter tw, Rectangle viewBox) + : this(tw, new RectangleF(viewBox.Left, viewBox.Top, viewBox.Width, viewBox.Height)) + { + } + + public SvgGraphics (Stream s, RectangleF viewBox) + : this(new StreamWriter(s, System.Text.Encoding.UTF8), viewBox) + { + } + + public bool IncludeXmlAndDoctype { get; set; } + + void WriteLine (string s) + { + _tw.WriteLine (s); + } + void WriteLine (string format, params object[] args) + { + WriteLine (string.Format (System.Globalization.CultureInfo.InvariantCulture, format, args)); + } + void Write (string s) + { + _tw.Write (s); + } + void Write (string format, params object[] args) + { + Write (string.Format (System.Globalization.CultureInfo.InvariantCulture, format, args)); + } + + public void BeginDrawing () + { + if (IncludeXmlAndDoctype) { + WriteLine (@" +"); + } + WriteLine (@"", + _viewBox.Left, _viewBox.Top, _viewBox.Width, _viewBox.Height); + + inGroup = false; + } + + bool inGroup = false; + public void BeginEntity (object entity) + { + if (inGroup) { + WriteLine (""); + } + var klass = (entity != null) ? entity.ToString () : ""; + WriteLine ("", klass); + inGroup = true; + } + + public void Clear (Color clearColor) + { + WriteLine ("", + _viewBox.X, _viewBox.Y, _viewBox.Width, _viewBox.Height, FormatColor (clearColor)); + } + + public void EndDrawing () + { + if (inGroup) { + WriteLine (""); + inGroup = false; + } + WriteLine(""); + _tw.Flush(); + } + + public void SaveState () + { + var ns = new State() { + Translation = _state.Translation, + }; + _states.Push (ns); + _state = ns; + } + + public void Scale (float sx, float sy) + { + _state.Scale.X *= sx; + _state.Scale.Y *= sy; + } + + public void Translate (float dx, float dy) + { + _state.Translation.X += dx; + _state.Translation.Y += dy; + } + + public void SetClippingRect (float x, float y, float width, float height) + { + _state.ClippingRect = new RectangleF (x, y, width, height); + } + + public void RestoreState () + { + if (_states.Count > 1) { + _state = _states.Pop (); + } + } + + public void SetFont (Font f) + { + //_lastFont = f; + } + + static string FormatColor (Color c) + { + return string.Format("#{0:X2}{1:X2}{2:X2}", c.Red, c.Green, c.Blue); + } + + public void SetColor (Color c) + { + _lastColor = FormatColor (c); + } + + public void FillPolygon (Polygon poly) + { + Write(""); + } + + public void DrawPolygon (Polygon poly, float w) + { + Write(""); + } + + public void FillOval (float x, float y, float width, float height) + { + var rx = width / 2; + var ry = height / 2; + var cx = x + rx; + var cy = y + ry; + WriteLine("", + cx, cy, rx, ry, _lastColor); + } + + public void DrawOval (float x, float y, float width, float height, float w) + { + var rx = width / 2; + var ry = height / 2; + var cx = x + rx; + var cy = y + ry; + WriteLine("", + cx, cy, rx, ry, _lastColor, w); + } + + public void FillArc (float cx, float cy, float radius, float startAngle, float endAngle) + { + WriteArc (cx, cy, radius, startAngle, endAngle, 0, "none", _lastColor); + } + + public void DrawArc (float cx, float cy, float radius, float startAngle, float endAngle, float w) + { + WriteArc (cx, cy, radius, startAngle, endAngle, w, _lastColor, "none"); + } + + public void WriteArc (float cx, float cy, float radius, float startAngle, float endAngle, float w, string stroke, string fill) + { + var sa = startAngle + Math.PI; + var ea = endAngle + Math.PI; + + var sx = cx + radius * Math.Cos (sa); + var sy = cy + radius * Math.Sin (sa); + var ex = cx + radius * Math.Cos (ea); + var ey = cy + radius * Math.Sin (ea); + + WriteLine("", + sx, sy, + radius, radius, + ex, ey, + stroke, w, fill); + } + + public void FillRoundedRect (float x, float y, float width, float height, float radius) + { + WriteLine("", + x, y, width, height, _lastColor, radius); + } + + public void DrawRoundedRect (float x, float y, float width, float height, float radius, float w) + { + WriteLine("", + x, y, width, height, _lastColor, w, radius); + } + + public void FillRect (float x, float y, float width, float height) + { + WriteLine("", + x, y, width, height, _lastColor); + } + + public void DrawRect (float x, float y, float width, float height, float w) + { + WriteLine("", + x, y, width, height, _lastColor, w); + } + + bool _inPolyline = false; + bool _startedPolyline = false; + + public void BeginLines (bool rounded) + { + _inPolyline = true; + } + + public void DrawLine (float sx, float sy, float ex, float ey, float w) + { + if (_inPolyline) { + if (!_startedPolyline) { + Write ("", sx, sy, ex, ey, _lastColor, w); + } + } + + public void EndLines () + { + if (_inPolyline) { + WriteLine("\" />"); + _inPolyline = false; + _startedPolyline = false; + } + } + + public void DrawString(string s, float x, float y, float width, float height, LineBreakMode lineBreak, TextAlignment align) + { + WriteLine("{2}", + x, y + _fontMetrics.Height, + s.Replace("&", "&").Replace("<", "<").Replace(">", ">")); + } + + public void DrawString (string s, float x, float y) + { + WriteLine("{2}", + x, y + _fontMetrics.Height, + s.Replace("&", "&").Replace("<", "<").Replace(">", ">")); + } + + public IFontMetrics GetFontMetrics () + { + return _fontMetrics; + } + + public void DrawImage (IImage img, float x, float y, float width, float height) + { + } + + public IImage ImageFromFile (string filename) + { + return null; + } + } + + class SvgGraphicsFontMetrics : IFontMetrics + { + int _height; + + public SvgGraphicsFontMetrics () + { + _height = 10; + } + + public int StringWidth (string str, int startIndex, int length) + { + return length * 10; + } + + public int Height + { + get { + return _height; + } + } + + public int Ascent + { + get { + return Height; + } + } + + public int Descent + { + get { + return 0; + } + } + } +} \ No newline at end of file diff --git a/samples/Clock/ClockSvg/Backup/Web.config b/samples/Clock/ClockSvg/Backup/Web.config new file mode 100644 index 0000000..0598be1 --- /dev/null +++ b/samples/Clock/ClockSvg/Backup/Web.config @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/samples/Clock/ClockSvg/ClockSvg.csproj b/samples/Clock/ClockSvg/ClockSvg.csproj index ec1eb8c..ebc6523 100644 --- a/samples/Clock/ClockSvg/ClockSvg.csproj +++ b/samples/Clock/ClockSvg/ClockSvg.csproj @@ -1,5 +1,6 @@  + Debug AnyCPU @@ -14,6 +15,11 @@ ClockSvg v4.0 false + + + + + 4.0 true @@ -66,8 +72,13 @@
+ + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + - + + diff --git a/samples/Clock/ClockSvg/ClockSvg.sln b/samples/Clock/ClockSvg/ClockSvg.sln index 82cb361..4ec65d5 100644 --- a/samples/Clock/ClockSvg/ClockSvg.sln +++ b/samples/Clock/ClockSvg/ClockSvg.sln @@ -1,6 +1,8 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30723.0 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClockSvg", "ClockSvg.csproj", "{69365CC0-8B33-450F-8344-F710DBCFCF5B}" EndProject Global diff --git a/samples/Clock/ClockSvg/UpgradeLog.htm b/samples/Clock/ClockSvg/UpgradeLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..26832d2c2b9740bcfaca6b7ac262192c7464adb6 GIT binary patch literal 42416 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 XE*G}&Ucr8300000NkvXXu0mjfzDs=J literal 0 HcmV?d00001 diff --git a/samples/Clock/ClockWP8/Assets/Logo.png b/samples/Clock/ClockWP8/Assets/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e1f40a079c5e083a6988d33c3b07c1bf829038 GIT binary patch literal 1679 zcmYjSe>B^N7SHQR_tMZVBw_7TNhE?W;q|p^qdn@Il9*Whs(50giIlA-SxU9a5#{9v zT9U=2adP@)4W$}vMx$E9(FE}r&yQ7$S{Z3kTdP&wzB}igv-iin_k7MhpL6d$_nyy{ zeaZ~ojogQX!C<@TVL%iV)BiNYdytQDH&sFbE(neYhQXSz*u72J3E{nBTD&;=%T#f8 ziii&j=6%WKyV1|42>4O_6kd+d%%{R&@43@~;F$AC&(wAq_>WN`i)SwW7&Pjdrsg%< zHShmvTX~1K^0)5EnKy>btI6-)R@--D4kDt*+^Fc^R&{2AVe8Y(friI*UJZdZ>dpLx zq_OQDuLiX3h<9X0*JJ60wqVZ)O?O$%GElwMdLBhv6Izzx#!|V`HvPEoHi+nAvP)C+ zth1sYn{_fhh;WTymnK)T(q8=MmQGO#;YhY;@17dV!US`h*@>mCrCW~d%5ugMBaOda zY-V7(SG-o-Y~-8aNm)w=x!;o{gy{b=Cu3vOozJW*CL#+yaHFx*P*dm49kqNvK3Q9&|8-RX@O8auaRtZ z#1r(xPrsr?L-{-{*@~+1h)8`g1$K}mHOEgnwe}3W(HLXO9Ah zSnyN!J_`coX_iy>e7e}0Fd2>uCBS}^)1Kb-@ zwRmXhXdfR$G?5`PE^0LB+A6kEj%#m&$WoG-P?h^bdm^TLoX=Z-F1?yqMeuT$&%QzC zr!%&*juw*ea=J33QI%Pv&*SIWuGwUI4gmnz)8)WmC4m4G(Z z-c#l^smgt_a0#qLJ54mSp@a6-T zHy1s7q2hkU&NS3^(qLq<3ebL*dzmEJyl37Q=eTaqm3x;6PzT(RBa6DOWw)2T`7Uoa zl&^I%pWp@kiOr8)3B6`f2Bnc?y5u7no{tSskp)g6@)Kj@J2s(KdLM|AC|Z)~VIp=4Jb-+{5%NVHx!xTC%e ztLPcpoF>J?*Z(vSafkPk12&KnDcahdsihC-8@8@cF}moth8hKCo0nfC8R#TYym)6&bBcEW(w&Lk_ zTCbDg%<2(=oCs!)^@k_SenH`irW=n%YWMj_Y(rrkZfaciN*)3l z_>2oXj8aC$(9C(=q%U$nUwg=)tRqg1mA{g5K!cc(u*)cuSB!IV?oN`C12<~_lA#FD zz++7BGRiF#Kg{G*$NM60>uU=Qt#y7mQ`aY?vEW)d<1dw4kHfe|(*I8dF-4)#QTR!I zjD{*+S)8vYt)tVFWfkN9DPsT)9+P}w*Awa+46b5^ZVf1uxe~?mP@SX@jgl-E{Yfq4OhbH&x6zg>aU{6OBjs^gV!4O@Rt+CCY9q|kQvU=G6be}DJ> XgEka!=>CgG&_{vMX-uH$M6%=$sBH{F literal 0 HcmV?d00001 diff --git a/samples/Clock/ClockWP8/Assets/SplashScreen.png b/samples/Clock/ClockWP8/Assets/SplashScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9072882aa6910bacba3505b85d0ca698bf4dfa GIT binary patch literal 18843 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 aEZ>cNC*sI^Jb?cmK%s$=0S$X%F8&`q%Kr}l literal 0 HcmV?d00001 diff --git a/samples/Clock/ClockWP8/Assets/SquareTile71x71.png b/samples/Clock/ClockWP8/Assets/SquareTile71x71.png new file mode 100644 index 0000000000000000000000000000000000000000..4754af3a7c1bd185524ee360a1c123377635319c GIT binary patch literal 2811 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 literal 0 HcmV?d00001 diff --git a/samples/Clock/ClockWP8/Assets/StoreLogo.png b/samples/Clock/ClockWP8/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..12c5f4f65546d138e9d16b60b395c43d4cec24be GIT binary patch literal 1375 zcmXX`Yfuwc6y7RDgwk3On}mqgW$ZZAu{MSXQV|W|(P9)W1qBs`BmySsB9w$!Lbdf# zlVEs^#3*!znd*#!KWk0h|xf%_wMpzcfUP*zVAHlIeT{Z zu2_FxnlFMN{_%0_B=D5L%f}ns!?VJ=!NW@sofwTEjir8b8SjI4YJN;g{$4RZzc3?@ zheT(IGkI&`g&6`~5-%f5iap>(0**7D9lcL-a9n*rg@!L%{Kj*kx3(*(Wo1X!1?%gw ziuD4-d3Td+cYl7G|VU48-=qcXYXyzu|+ym)+14-;Wk>hNv2gN zOGf%v8$G9a^g&@vNC{V-((cqN&v-QiUS#H_MG1F?lsrq)aa5z~#4}z)ZG0uYqxQhE zr7h>Q%&Fs+quWD}ji&vmW%||lS+AiOJtuggQX2q1%X-YXu_$-#dlKhmW}bYauPP2X zIM+$LRZ}Sb8jy;cIK=~>i4p(|ZsZhqT@l4Yc#~tAC})K%FZslhf*yMF()uyb64a?J zR-DgXG&vlYYr|*%3{)dV$y3@}-B)5ZU=08P@q`s-RamE%M+~ont^qw}`Kkgxn8Es7 zTO(@?5UrWf#s<&-0BzZKFdJ384j5&wMAT9g3N(8kiYZci5U8ZBx;}F1l^#aFosQXj z#A|_LtfAYyXJ7}2sLK0Ajo$tVltjR=L|GZgf< zgrJ7A?XXRpyBsL$loIn89tOksa3YSJ!nD9Oa|KEdduT`m{7q$yk1l2RtplQzPU`8d zFi|;(q!=@w6wvjsO`L-JFLWv^Y!hldR`Q6{8k?o8b&~=oxgR#QlJFe&1KnRFEHCul zPs&zxhVHB*Wgm@c?k1D6{MY91uaUA0x3wg+l!%~fX4(EDBLvPwA4Im% zVrgwOm)vMLA;U%2BfbPlSEaAkkKC49-PT92T+O`D{4^GJT33|SQb{025#R7FX_N9A z0!f=xaP=vN@N?bY9;*BXRLY-xkdaK)!16_<(a9779kqPgR0_X>J|G%`i$+XMrV^+& z93P^Rw(#k{pA&kulou@;0-=6bk`U64B9<+ zD&Y|ef5%v8F$11)w*nV&+;D)f3Qb49V#XW7pFwdZ16E|F(tU~BUk2b@meOtH_EkXGNz*TEr%Bg7K5;pSTx7$-B0sLfI%Feu zIM&ygj!4TuH6Zm}$3|uR#UNB;D&FoKTM3(>46>lwWlM){?!((({}aYu)a%O>9hY0r z#341F2E|A-$Z|JsKPF~$`%YZNrpM6oSv;62+Ey4Vidx~fck#wu{>II6&)kxrTM6d$ TC9Q$r4~fLb>|)pNIDF!NbGB?N literal 0 HcmV?d00001 diff --git a/samples/Clock/ClockWP8/Assets/WideLogo.png b/samples/Clock/ClockWP8/Assets/WideLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..082197b62b50743507240b89afe28db92c40a996 GIT binary patch literal 8107 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 + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Clock/ClockWP8/Backup/App.xaml.cs b/samples/Clock/ClockWP8/Backup/App.xaml.cs new file mode 100644 index 0000000..3d1ab8f --- /dev/null +++ b/samples/Clock/ClockWP8/Backup/App.xaml.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Navigation; +using System.Windows.Shapes; +using Microsoft.Phone.Controls; +using Microsoft.Phone.Shell; + +namespace ClockWP7 +{ + public partial class App : Application + { + /// + /// Provides easy access to the root frame of the Phone Application. + /// + /// The root frame of the Phone Application. + public PhoneApplicationFrame RootFrame { get; private set; } + + /// + /// Constructor for the Application object. + /// + public App () + { + // Global handler for uncaught exceptions. + UnhandledException += Application_UnhandledException; + + // Standard Silverlight initialization + InitializeComponent (); + + // Phone-specific initialization + InitializePhoneApplication (); + + // Show graphics profiling information while debugging. + if (System.Diagnostics.Debugger.IsAttached) { + // Display the current frame rate counters. + Application.Current.Host.Settings.EnableFrameRateCounter = true; + + // Show the areas of the app that are being redrawn in each frame. + //Application.Current.Host.Settings.EnableRedrawRegions = true; + + // Enable non-production analysis visualization mode, + // which shows areas of a page that are handed off to GPU with a colored overlay. + //Application.Current.Host.Settings.EnableCacheVisualization = true; + + // Disable the application idle detection by setting the UserIdleDetectionMode property of the + // application's PhoneApplicationService object to Disabled. + // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run + // and consume battery power when the user is not using the phone. + PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; + } + + } + + // Code to execute when the application is launching (eg, from Start) + // This code will not execute when the application is reactivated + private void Application_Launching (object sender, LaunchingEventArgs e) + { + } + + // Code to execute when the application is activated (brought to foreground) + // This code will not execute when the application is first launched + private void Application_Activated (object sender, ActivatedEventArgs e) + { + } + + // Code to execute when the application is deactivated (sent to background) + // This code will not execute when the application is closing + private void Application_Deactivated (object sender, DeactivatedEventArgs e) + { + } + + // Code to execute when the application is closing (eg, user hit Back) + // This code will not execute when the application is deactivated + private void Application_Closing (object sender, ClosingEventArgs e) + { + } + + // Code to execute if a navigation fails + private void RootFrame_NavigationFailed (object sender, NavigationFailedEventArgs e) + { + if (System.Diagnostics.Debugger.IsAttached) { + // A navigation has failed; break into the debugger + System.Diagnostics.Debugger.Break (); + } + } + + // Code to execute on Unhandled Exceptions + private void Application_UnhandledException (object sender, ApplicationUnhandledExceptionEventArgs e) + { + if (System.Diagnostics.Debugger.IsAttached) { + // An unhandled exception has occurred; break into the debugger + System.Diagnostics.Debugger.Break (); + } + } + + #region Phone application initialization + + // Avoid double-initialization + private bool phoneApplicationInitialized = false; + + // Do not add any additional code to this method + private void InitializePhoneApplication () + { + if (phoneApplicationInitialized) + return; + + // Create the frame but don't set it as RootVisual yet; this allows the splash + // screen to remain active until the application is ready to render. + RootFrame = new PhoneApplicationFrame (); + RootFrame.Navigated += CompleteInitializePhoneApplication; + + // Handle navigation failures + RootFrame.NavigationFailed += RootFrame_NavigationFailed; + + // Ensure we don't initialize again + phoneApplicationInitialized = true; + } + + // Do not add any additional code to this method + private void CompleteInitializePhoneApplication (object sender, NavigationEventArgs e) + { + // Set the root visual to allow the application to render + if (RootVisual != RootFrame) + RootVisual = RootFrame; + + // Remove this handler since it is no longer needed + RootFrame.Navigated -= CompleteInitializePhoneApplication; + } + + #endregion + } +} \ No newline at end of file diff --git a/samples/Clock/ClockWP8/Backup/ApplicationIcon.png b/samples/Clock/ClockWP8/Backup/ApplicationIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..5859393ca1056103ba35d225773352a9fa3ab754 GIT binary patch literal 1881 zcmV-f2d4OmP)GXLPE9uD;d|3K9jFs0^O3no;*#kUHY6H}PH_^L3*aj} zl+rSw?L`W0p^tkju#a}u3PxyqFY3}?ZpgV`?z#P)?|kQbU67g4(Jt>MC@$|ToYbAv zoz$Jwoz$JwUyrEBh@^xBYY9T32$%4g4Eozd9YH8m>Im7iz@UwrH+y+`StMa0!Jlv1 zOs9{eP8~IOLbaYWZ(elNbZg1v$&=#~5`=udMY3Y~^2n$tPDrTrV}g_vPDsd`qdqj` z?(SZ2=x{`MxJ4Ea7yy62*t!)g2L{u*+?5%tV8G+?EYFApOLBK?H(-W0sdbrL7RKcs zEi7D+mK#@=wJ2&3^B#Z6SE|tW^ z&fa_A0KDdD7g}CkuGQ%*uYy_6tlm5}8JiaBN~M03ks%g~tMA@5>&#%lv|6osRa0w$GfX-lmv6;tg7E35t(xdFTQCUeAbpwWpTg5+|K7IY# zwbIg(hK5FUUmu3O*mrLl?KRUayoa}&LPcB<-$|3+(JUi7*{UTR~?sv$M1P1N>*rj)mLHrKNHON-lLA!%9m^1R@cPXUv=l zmwktfMx&WuVn$tE?SL(YK0XhFAR`119z6nm6Brlagxr7dz}8t~Yn@7=%#V+Eb8|(} zt{zpd`CNjX*sbr;=t5DIS`Dt#+slj1W=)+krM;u$iMZ8K>adS$jr!2xBjD^>TUvBF z9d0yoxm*IZ?l;-5Ain@y6NACvgojsGRpsU7j%^L&Y-U7+haE2}3J&Fvoey?)v}dhb zCu#eKuxQ%SD*0;n9-YaBlZv8a$Hv3kwrJWRlMUc_^1_AW@h&SVIeq4*!NEa-a~Q~4 z+oV!0nTl_2YVx!S#tzx~^ayTn&@|YYz@VU6F)=fuXV94}i1{Q@*QnG@O^x-nwNi;h z*`t)BXsbkOr-$)j`>g(C&HN({S~o10_f z;%IdG#4O<1vuEG#-(Pg%q)ef3=$L{Rf85e?x28HGf*TMRL^f|}YwPyhobszzVFAQ= zm~N%=UR|9)Ab@0*RDI`VXWyx=A<{WQ0h*baId@(Hx%~+Wg~envH8%FDRE|=IfS_Gc9lLglmM*of63B)(jlMWFl^Yh` z-PHwg&`!V3goKDr=Y)nNCGiA8A;+rnCkfqM=&e6)R#x6>e)2@4>Few7cQpMPZm{_I z@>5c?^YUI_#W{jAr%qkC_-ltu?lLq)WR>)^Tj}QN>OSs3Z67*1WyCi#!0z{cbAY@o z006~x)1!xywl>13BNU2g3IFKvB5+=0+j?T+{J*NJA&d|~9YF+(7w2r-hRPK^N~OV| z*K2jK7)uw$abO06sz<3-X}VB_(P)g1kH1%6r&4Pit&*rzYH08@48w6FjvxpyMqH5G z+#G(IkSOXBu{bAtE4UNjJv2Dv?d^r*xNNN6#<*(JR_RN|$7Zqo{R0Rz5+7e*D63_1 z1<}onQAk;|C^{yFKD+Wz{HrNFFf|SuX0K6dp!F8pg;@r>Y=rsCpr)?Z@)E?>v3>(o$ zrqR3^&og+a=b!w5N57jd;8|i|GIMu#V_YC94Rc^kd-O#lzDi#4-5>B z`F?^uj5UIS0&A+OHhi}J_wsTa!}NN6eQllj6z=lWJG4TH)* z?`+z*0Yy=!W5up*A7no6n!nw*wo>MkzI-d?@orCP?%cM_FCIaX9;>6gpovZ%<&lG0MhzAcYIoOgsb z0n|ss&CTu6!-opA%OZibfuXl|${hS;XMd^jw!!)D4NmG#>Q3rT>i;k5{|Ybw$j9Fp Tu#Z&K00000NkvXXu0mjfnP|DN literal 0 HcmV?d00001 diff --git a/samples/Clock/ClockWP8/Backup/Background.png b/samples/Clock/ClockWP8/Backup/Background.png new file mode 100644 index 0000000000000000000000000000000000000000..e46f21d9407f1ae4d6fedcf793778f32bae3f06d GIT binary patch literal 3521 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 literal 0 HcmV?d00001 diff --git a/samples/Clock/ClockWP8/Backup/Clock.cs b/samples/Clock/ClockWP8/Backup/Clock.cs new file mode 100644 index 0000000..c8a5b5e --- /dev/null +++ b/samples/Clock/ClockWP8/Backup/Clock.cs @@ -0,0 +1,105 @@ +using System; +using CrossGraphics; + +namespace Clock +{ + /// + /// This class demonstrates drawing with the CrossGraphics library. + /// + public class Clock + { + public float Width { get; set; } + public float Height { get; set; } + + readonly Color BackColor = new Color (0xDD, 0xDD, 0xDD); + readonly Color FaceColor = new Color (0xCC, 0xCC, 0xCC); + readonly Color BorderColor = new Color (0x66, 0x66, 0x66); + readonly Font LabelFont = Font.SystemFontOfSize (16); + + public void Draw (IGraphics g) + { + g.BeginEntity (this); + + var now = DateTime.Now; + + var r = Math.Min (Width / 2, Height / 2); + var center = new System.Drawing.PointF (Width / 2, Height / 2); + + // + // Draw the face + // + g.SetColor (BackColor); + g.FillOval (center.X - r, center.Y - r, 2 * r, 2 * r); + g.SetColor (BorderColor); + g.DrawOval (center.X - r, center.Y - r, 2 * r, 2 * r, 8); + + g.SetColor (FaceColor); + for (var i = 0; i < 12; i++) { + var angle = (i / 12.0) * 2 * Math.PI; + g.DrawLine ( + center.X + 0.75f * r * (float)Math.Cos (angle), + center.Y + 0.75f * r * (float)Math.Sin (angle), + center.X + 0.9f * r * (float)Math.Cos (angle), + center.Y + 0.9f * r * (float)Math.Sin (angle), + 7); + } + g.SetFont (LabelFont); + var textWidth = g.GetFontMetrics ().StringWidth ("Cross Graphics"); + g.DrawString ("Cross Graphics", center.X - textWidth / 2, center.Y + 0.25f * r); + + //Custom Font Test + var customFont = Font.FromName("BILLY ARGEL TRIAL___.otf", "BILLY ARGEL FONT", 30); + g.SetFont(customFont); + g.SetColor(new Color(255, 0, 0)); + var myString = "Custom Font Test"; + textWidth = g.GetFontMetrics().StringWidth(myString); + g.DrawString(myString, center.X - textWidth / 2, center.Y - 0.25f * r); + + // + // Draw the hour hand + // + g.SetColor (Colors.DarkGray); + var h = now.Hour + now.Minute / 60.0; + var hAngle = h > 12 ? + ((h - 12) / 12.0 * 2 * Math.PI - Math.PI /2) : + (h / 12.0 * 2 * Math.PI - Math.PI / 2); + g.DrawLine ( + center.X + -0.1f * r * (float)Math.Cos (hAngle), + center.Y + -0.1f * r * (float)Math.Sin (hAngle), + center.X + 0.65f * r * (float)Math.Cos (hAngle), + center.Y + 0.65f * r * (float)Math.Sin (hAngle), + 7); + + // + // Draw the minute hand + // + g.SetColor (Colors.DarkGray); + var m = now.Minute + now.Second / 60.0; + var mAngle = (m / 60.0) * 2 * Math.PI - Math.PI / 2; + g.DrawLine ( + center.X + -0.15f * r * (float)Math.Cos (mAngle), + center.Y + -0.15f * r * (float)Math.Sin (mAngle), + center.X + 0.85f * r * (float)Math.Cos (mAngle), + center.Y + 0.85f * r * (float)Math.Sin (mAngle), + 5); + + // + // Draw the second hand + // + g.SetColor (Colors.Red); + var sAngle = (now.Second / 60.0) * 2 * Math.PI - Math.PI / 2; + g.DrawLine ( + center.X + -0.15f * r * (float)Math.Cos (sAngle), + center.Y + -0.15f * r * (float)Math.Sin (sAngle), + center.X + 0.85f * r * (float)Math.Cos (sAngle), + center.Y + 0.85f * r * (float)Math.Sin (sAngle), + 1); + + // + // Draw the pin + // + g.SetColor (Colors.Black); + g.FillOval (center.X - 5, center.Y - 5, 10, 10); + } + } +} diff --git a/samples/Clock/ClockWP7/ClockWP7.csproj b/samples/Clock/ClockWP8/Backup/ClockWP7.csproj similarity index 100% rename from samples/Clock/ClockWP7/ClockWP7.csproj rename to samples/Clock/ClockWP8/Backup/ClockWP7.csproj diff --git a/samples/Clock/ClockWP7/ClockWP7.sln b/samples/Clock/ClockWP8/Backup/ClockWP7.sln similarity index 100% rename from samples/Clock/ClockWP7/ClockWP7.sln rename to samples/Clock/ClockWP8/Backup/ClockWP7.sln diff --git a/samples/Clock/ClockWP8/Backup/Graphics.cs b/samples/Clock/ClockWP8/Backup/Graphics.cs new file mode 100644 index 0000000..57819d4 --- /dev/null +++ b/samples/Clock/ClockWP8/Backup/Graphics.cs @@ -0,0 +1,559 @@ +// +// Copyright (c) 2010-2012 Frank A. Krueger +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +using System; +using System.Collections.Generic; +using System.Drawing; + +namespace CrossGraphics +{ + public interface IGraphics + { + void BeginEntity(object entity); + + void SetFont(Font f); + + void SetColor(Color c); + + void Clear (Color c); + + void FillPolygon(Polygon poly); + + void DrawPolygon(Polygon poly,float w); + + void FillRect(float x,float y,float width, float height); + + void DrawRect(float x, float y, float width, float height, float w); + + void FillRoundedRect(float x, float y, float width, float height, float radius); + + void DrawRoundedRect(float x, float y, float width, float height, float radius, float w); + + void FillOval(float x, float y, float width, float height); + + void DrawOval(float x, float y, float width, float height, float w); + + void BeginLines(bool rounded); + + void DrawLine(float sx, float sy, float ex, float ey, float w); + + void EndLines(); + + void FillArc(float cx, float cy, float radius, float startAngle, float endAngle); + + void DrawArc(float cx, float cy, float radius, float startAngle, float endAngle, float w); + + void DrawImage(IImage img, float x, float y, float width, float height); + + void DrawString(string s, float x, float y, float width, float height, LineBreakMode lineBreak, TextAlignment align); + + void DrawString(string s, float x, float y); + + void SaveState(); + + void SetClippingRect (float x, float y, float width, float height); + + void Translate(float dx, float dy); + + void Scale(float sx, float sy); + + void RestoreState(); + + IFontMetrics GetFontMetrics(); + + IImage ImageFromFile(string path); + } + + public enum LineBreakMode { + None, + Clip, + WordWrap, + } + + public enum TextAlignment { + Left, + Center, + Right, + Justified + } + + public static class GraphicsEx + { + public static void DrawString (this IGraphics g, string s, PointF p) + { + g.DrawString(s, p.X, p.Y); + } + + public static void DrawString(this IGraphics g, string s, PointF p, Font f) + { + g.SetFont (f); + g.DrawString (s, p.X, p.Y); + } + + public static void DrawString(this IGraphics g, string s, RectangleF p, Font f, LineBreakMode lineBreak, TextAlignment align) + { + g.SetFont (f); + g.DrawString (s, p.Left, p.Top, p.Width, p.Height, lineBreak, align); + } + + public static void DrawLine(this IGraphics g, PointF s, PointF e, float w) + { + g.DrawLine (s.X, s.Y, e.X, e.Y, w); + } + + public static void DrawRoundedRect(this IGraphics g, RectangleF r, float radius, float w) + { + g.DrawRoundedRect (r.Left, r.Top, r.Width, r.Height, radius, w); + } + + public static void DrawRoundedRect(this IGraphics g, Rectangle r, float radius, float w) + { + g.DrawRoundedRect(r.Left, r.Top, r.Width, r.Height, radius, w); + } + + public static void FillRoundedRect(this IGraphics g, RectangleF r, float radius) + { + g.FillRoundedRect (r.Left, r.Top, r.Width, r.Height, radius); + } + + public static void FillRoundedRect(this IGraphics g, Rectangle r, float radius) + { + g.FillRoundedRect (r.Left, r.Top, r.Width, r.Height, radius); + } + + public static void FillRect(this IGraphics g, RectangleF r) + { + g.FillRect (r.Left, r.Top, r.Width, r.Height); + } + + public static void FillRect(this IGraphics g, Rectangle r) + { + g.FillRect(r.Left, r.Top, r.Width, r.Height); + } + + public static void DrawRect(this IGraphics g, RectangleF r, float w) + { + g.DrawRect (r.Left, r.Top, r.Width, r.Height, w); + } + + public static void DrawRect(this IGraphics g, Rectangle r, float w) + { + g.DrawRect(r.Left, r.Top, r.Width, r.Height, w); + } + + public static void FillOval(this IGraphics g, RectangleF r) + { + g.FillOval (r.Left, r.Top, r.Width, r.Height); + } + + public static void DrawOval(this IGraphics g, RectangleF r, float w) + { + g.DrawOval (r.Left, r.Top, r.Width, r.Height, w); + } + } + + public interface IImage + { + } + + [Flags] + public enum FontOptions + { + None = 0, + Bold = 1 + } + + public class Font + { + public string FontFamily { get; private set; } + + public string FontFilename { get; private set; } + + public FontOptions Options { get; private set; } + + public int Size { get; private set; } + + public object Tag { get; set; } + + public bool IsBold { get { return (Options & FontOptions.Bold) != 0; } } + + public Font (string fontFileName, string fontFamily, FontOptions options, int size) + { + FontFilename = fontFileName; + FontFamily = fontFamily; + Options = options; + Size = size; + } + + static Font[] _boldSystemFonts = new Font[0]; + static Font[] _systemFonts = new Font[0]; + static Font[] _userFixedPitchFonts = new Font[0]; + static Font[] _boldUserFixedPitchFonts = new Font[0]; + + public static Font BoldSystemFontOfSize (int size) { + if (size >= _boldSystemFonts.Length) { + return new Font ("", "SystemFont", FontOptions.Bold, size); + } + else { + var f = _boldSystemFonts[size]; + if (f == null) { + f = new Font ("", "SystemFont", FontOptions.Bold, size); + _boldSystemFonts[size] = f; + } + return f; + } + } + public static Font SystemFontOfSize (int size) { + if (size >= _systemFonts.Length) { + return new Font ("", "SystemFont", FontOptions.None, size); + } + else { + var f = _systemFonts[size]; + if (f == null) { + f = new Font ("", "SystemFont", FontOptions.None, size); + _systemFonts[size] = f; + } + return f; + } + } + public static Font UserFixedPitchFontOfSize (int size) { + if (size >= _userFixedPitchFonts.Length) { + return new Font ("", "Monospace", FontOptions.None, size); + } + else { + var f = _userFixedPitchFonts[size]; + if (f == null) { + f = new Font ("", "Monospace", FontOptions.None, size); + _userFixedPitchFonts[size] = f; + } + return f; + } + } + public static Font BoldUserFixedPitchFontOfSize (int size) { + if (size >= _boldUserFixedPitchFonts.Length) { + return new Font ("", "Monospace", FontOptions.Bold, size); + } + else { + var f = _boldUserFixedPitchFonts[size]; + if (f == null) { + f = new Font ("", "Monospace", FontOptions.Bold, size); + _boldUserFixedPitchFonts[size] = f; + } + return f; + } + } + + + //Customs Fonts + //iOS: + //You have to modify your info.plist and add the entry 'Fonts provided by application' UIAppFonts for your custom fonts and copy the fonts to your Bundle as BundleResource + //Not all fonts seem to work and I couldn't find out why + // + //Android: + //Copy the fonts to your Assets folder as AndroidAsset; remember to use the full filename to load the font like Font.FromName("UniversLTStd-LightCn.otf", "Univers LT Std", 18); + // + //Windows Phone/Store: + //According to + //http://stackoverflow.com/questions/14085818/custom-font-usage-in-windows-phone-8 + //you have to set the real font name not only the filename for windows phone like Font.FromName("UniversLTStd-LightCn.otf", "Univers LT Std", 18); + //The fonts should be copied inside a 'Fonts' folder. The custom fonts should be as type 'Content' + + public static Font FromName(string fontFileName, string name, int size) + { + return new Font(fontFileName, name, FontOptions.None, size); + } + + public override string ToString() + { + return string.Format ("[Font: FontFamily={0}, Options={1}, Size={2}, Tag={3}]", FontFamily, Options, Size, Tag); + } + } + + public interface IFontMetrics + { + int StringWidth(string s, int startIndex, int length); + + int Height { get; } + + int Ascent { get; } + + int Descent { get; } + } + + public static class FontMetricsEx + { + public static int StringWidth (this IFontMetrics fm, string s) + { + return fm.StringWidth (s, 0, s.Length); + } + } + + public class Color + { + public readonly int Red, Green, Blue, Alpha; + public object Tag; + + public float RedValue { + get { return Red / 255.0f; } + } + + public float GreenValue { + get { return Green / 255.0f; } + } + + public float BlueValue { + get { return Blue / 255.0f; } + } + + public float AlphaValue { + get { return Alpha / 255.0f; } + } + + public Color (int red, int green, int blue) + { + Red = red; + Green = green; + Blue = blue; + Alpha = 255; + } + + public Color (int red, int green, int blue, int alpha) + { + Red = red; + Green = green; + Blue = blue; + Alpha = alpha; + } + + public Color(float red, float green, float blue) + { + Red = (int)(red * 255); + Green = (int)(green * 255); + Blue = (int)(blue * 255); + Alpha = 255; + } + + public Color(float red, float green, float blue, float alpha) + { + Red = (int)(red * 255); + Green = (int)(green * 255); + Blue = (int)(blue * 255); + Alpha = (int)(alpha * 255); + } + + public int Intensity { get { return (Red + Green + Blue) / 3; } } + + public Color GetInvertedColor() + { + return new Color (255 - Red, 255 - Green, 255 - Blue, Alpha); + } + + public static bool AreEqual(Color a, Color b) + { + if (a == null && b == null) + return true; + if (a == null && b != null) + return false; + if (a != null && b == null) + return false; + return (a.Red == b.Red && a.Green == b.Green && a.Blue == b.Blue && a.Alpha == b.Alpha); + } + + public bool IsWhite { + get { return (Red == 255) && (Green == 255) && (Blue == 255); } + } + + public bool IsBlack { + get { return (Red == 0) && (Green == 0) && (Blue == 0); } + } + + public Color WithAlpha(int aa) + { + return new Color (Red, Green, Blue, aa); + } + + public override bool Equals (object obj) + { + var o = obj as Color; + return (o != null) && (o.Red == Red) && (o.Green == Green) && (o.Blue == Blue) && (o.Alpha == Alpha); + } + + public override int GetHashCode () + { + return (Red + Green + Blue + Alpha).GetHashCode (); + } + + public override string ToString() + { + return string.Format ("[Color: RedValue={0}, GreenValue={1}, BlueValue={2}, AlphaValue={3}]", RedValue, GreenValue, BlueValue, AlphaValue); + } + } + + public static class Colors + { + public static readonly Color Yellow = new Color (255, 255, 0); + public static readonly Color Red = new Color (255, 0, 0); + public static readonly Color Green = new Color (0, 255, 0); + public static readonly Color Blue = new Color (0, 0, 255); + public static readonly Color White = new Color (255, 255, 255); + public static readonly Color Cyan = new Color (0, 255, 255); + public static readonly Color Black = new Color (0, 0, 0); + public static readonly Color LightGray = new Color (212, 212, 212); + public static readonly Color Gray = new Color (127, 127, 127); + public static readonly Color DarkGray = new Color (64, 64, 64); + } + + public class Polygon + { + public readonly List Points; + + public object Tag { get; set; } + + public int Version { get; set; } + + public Polygon () + { + Points = new List (); + } + + public Polygon (int[] xs, int[] ys, int c) + { + Points = new List (c); + for (var i = 0; i < c; i++) { + Points.Add (new PointF (xs [i], ys [i])); + } + } + + public int Count { + get { return Points.Count; } + } + + public void Clear() + { + Points.Clear (); + Version++; + } + + public void AddPoint(PointF p) + { + Points.Add (p); + Version++; + } + + public void AddPoint(float x, float y) + { + Points.Add (new PointF (x, y)); + Version++; + } + } + + public struct Transform2D + { + public float M11, M12, M13; + public float M21, M22, M23; + //public float M31, M32, M33; + + public void Apply (float x, float y, out float xp, out float yp) + { + xp = M11 * x + M12 * y + M13; + yp = M21 * x + M22 * y + M23; + } + + public static Transform2D operator * (Transform2D l, Transform2D r) + { + var t = new Transform2D (); + + t.M11 = l.M11 * r.M11 + l.M12 * r.M21;// +l.M13 * r.M31; + t.M12 = l.M11 * r.M12 + l.M12 * r.M22;// +l.M13 * r.M32; + t.M13 = l.M11 * r.M13 + l.M12 * r.M23 + l.M13;// *r.M33; + + t.M21 = l.M21 * r.M11 + l.M22 * r.M21;// +l.M23 * r.M31; + t.M22 = l.M21 * r.M12 + l.M22 * r.M22;// +l.M23 * r.M32; + t.M23 = l.M21 * r.M13 + l.M22 * r.M23 + l.M23;// *r.M33; + + //t.M31 = l.M31 * r.M11 + l.M32 * r.M21 + l.M33 * r.M31; + //t.M32 = l.M31 * r.M12 + l.M32 * r.M22 + l.M33 * r.M32; + //t.M33 = l.M31 * r.M13 + l.M32 * r.M23 + l.M33 * r.M33; + + return t; + } + + public static Transform2D Identity () + { + var t = new Transform2D (); + t.M11 = 1; + t.M22 = 1; + //t.M33 = 1; + return t; + } + + public static Transform2D Translate (float x, float y) + { + var t = new Transform2D (); + t.M11 = 1; + t.M22 = 1; + //t.M33 = 1; + t.M13 = x; + t.M23 = y; + return t; + } + public static Transform2D Scale (float x, float y) + { + var t = new Transform2D (); + t.M11 = x; + t.M22 = y; + //t.M33 = 1; + return t; + } + } + + public static class RectangleEx + { + public static RectangleF ToRectangleF (this System.Drawing.Rectangle r) + { + return new RectangleF (r.X, r.Y, r.Width, r.Height); + } + + public static System.Drawing.Point GetCenter (this System.Drawing.Rectangle r) + { + return new System.Drawing.Point (r.Left + r.Width / 2, + r.Top + r.Height / 2); + } + + public static System.Drawing.PointF GetCenter (this System.Drawing.RectangleF r) + { + return new System.Drawing.PointF (r.X + r.Width / 2.0f, + r.Y + r.Height / 2.0f); + } + + public static List GetIntersections (this List boxes, RectangleF box) + { + var r = new List (); + foreach (var b in boxes) { + if (b.IntersectsWith (box)) { + r.Add (b); + } + } + return r; + } + } +} + diff --git a/samples/Clock/ClockWP7/MainPage.xaml b/samples/Clock/ClockWP8/Backup/MainPage.xaml similarity index 100% rename from samples/Clock/ClockWP7/MainPage.xaml rename to samples/Clock/ClockWP8/Backup/MainPage.xaml diff --git a/samples/Clock/ClockWP7/MainPage.xaml.cs b/samples/Clock/ClockWP8/Backup/MainPage.xaml.cs similarity index 100% rename from samples/Clock/ClockWP7/MainPage.xaml.cs rename to samples/Clock/ClockWP8/Backup/MainPage.xaml.cs diff --git a/samples/Clock/ClockWP8/Backup/Properties/AppManifest.xml b/samples/Clock/ClockWP8/Backup/Properties/AppManifest.xml new file mode 100644 index 0000000..a955232 --- /dev/null +++ b/samples/Clock/ClockWP8/Backup/Properties/AppManifest.xml @@ -0,0 +1,6 @@ + + + + diff --git a/samples/Clock/ClockWP7/Properties/AssemblyInfo.cs b/samples/Clock/ClockWP8/Backup/Properties/AssemblyInfo.cs similarity index 100% rename from samples/Clock/ClockWP7/Properties/AssemblyInfo.cs rename to samples/Clock/ClockWP8/Backup/Properties/AssemblyInfo.cs diff --git a/samples/Clock/ClockWP7/Properties/WMAppManifest.xml b/samples/Clock/ClockWP8/Backup/Properties/WMAppManifest.xml similarity index 100% rename from samples/Clock/ClockWP7/Properties/WMAppManifest.xml rename to samples/Clock/ClockWP8/Backup/Properties/WMAppManifest.xml diff --git a/samples/Clock/ClockWP7/SplashScreenImage.jpg b/samples/Clock/ClockWP8/Backup/SplashScreenImage.jpg similarity index 100% rename from samples/Clock/ClockWP7/SplashScreenImage.jpg rename to samples/Clock/ClockWP8/Backup/SplashScreenImage.jpg diff --git a/samples/Clock/ClockWP8/Backup/System.Drawing.cs b/samples/Clock/ClockWP8/Backup/System.Drawing.cs new file mode 100644 index 0000000..64e6e2a --- /dev/null +++ b/samples/Clock/ClockWP8/Backup/System.Drawing.cs @@ -0,0 +1,189 @@ +// +// Copyright (c) 2010 Frank A. Krueger +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +using System; + +namespace System.Drawing +{ + public struct RectangleF + { + public float X, Y, Width, Height; + + public float Left { get { return X; } } + public float Top { get { return Y; } } + + public float Right { get { return X + Width; } } + public float Bottom { get { return Y + Height; } } + + public RectangleF (float left, float top, float width, float height) + { + X = left; + Y = top; + Width = width; + Height = height; + } + + public void Inflate (float width, float height) + { + Inflate (new SizeF (width, height)); + } + + public void Inflate (SizeF size) + { + X -= size.Width; + Y -= size.Height; + Width += size.Width * 2; + Height += size.Height * 2; + } + + public bool IntersectsWith(RectangleF rect) + { + return !((Left >= rect.Right) || (Right <= rect.Left) || + (Top >= rect.Bottom) || (Bottom <= rect.Top)); + } + + public bool Contains(PointF loc) + { + return (X <= loc.X && loc.X < (X + Width) && Y <= loc.Y && loc.Y < (Y + Height)); + } + + public override string ToString() + { + return string.Format("[RectangleF: Left={0} Top={1} Width={2} Height={3}]", Left, Top, Width, Height); + } + } + + public struct Rectangle + { + public int X, Y, Width, Height; + + public int Left { get { return X; } } + + public int Top { get { return Y; } } + + public int Bottom { get { return Top + Height; } } + + public int Right { get { return Left + Width; } } + + public Rectangle (int left, int top, int width, int height) + { + X = left; + Y = top; + Width = width; + Height = height; + } + + public void Offset (int dx, int dy) + { + X += dx; + Y += dy; + } + + public bool Contains (int x, int y) + { + return (x >= X && x < X + Width) && (y >= Y && y < Y + Height); + } + + public static Rectangle Union (Rectangle a, Rectangle b) + { + var left = Math.Min (a.Left, b.Left); + var top = Math.Min (a.Top, b.Top); + return new Rectangle (left, + top, + Math.Max (a.Right, b.Right) - left, + Math.Max (a.Bottom, b.Bottom) - top); + } + + public bool IntersectsWith (Rectangle rect) + { + return !((Left >= rect.Right) || (Right <= rect.Left) || + (Top >= rect.Bottom) || (Bottom <= rect.Top)); + } + + public void Inflate (int width, int height) + { + Inflate (new Size (width, height)); + } + + public void Inflate (Size size) + { + X -= size.Width; + Y -= size.Height; + Width += size.Width * 2; + Height += size.Height * 2; + } + + public override string ToString () + { + return string.Format ("[Rectangle: Left={0} Top={1} Width={2} Height={3}]", Left, Top, Width, Height); + } + } + + public struct PointF + { + public float X, Y; + + public PointF (float x, float y) + { + X = x; + Y = y; + } + + public override string ToString() + { + return string.Format("({0}, {1})", X, Y); + } + } + + public struct Point + { + public int X, Y; + + public Point (int x, int y) + { + X = x; + Y = y; + } + } + + public struct Size + { + public int Width, Height; + + public Size (int width, int height) + { + Width = width; + Height = height; + } + } + + public struct SizeF + { + public float Width, Height; + + public SizeF (float width, float height) + { + Width = width; + Height = height; + } + } +} + diff --git a/samples/Clock/ClockWP8/ClockWP8.csproj b/samples/Clock/ClockWP8/ClockWP8.csproj new file mode 100644 index 0000000..e8fa0ed --- /dev/null +++ b/samples/Clock/ClockWP8/ClockWP8.csproj @@ -0,0 +1,183 @@ + + + + Debug + AnyCPU + 10.0.20506 + 2.0 + {202641C4-7536-4935-8A25-C88C12E2B876} + {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + Clock.WP8 + ClockWP7 + v8.1 + + + + + WindowsPhone + true + + + true + true + ClockWP7_$(Configuration)_$(Platform).xap + Properties\AppManifest.xml + ClockWP7.App + true + true + + + + + 4.0 + 12.0 + en-US + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + true + full + false + Bin\Debug + DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + prompt + 4 + + + pdbonly + true + Bin\Release + TRACE;SILVERLIGHT;WINDOWS_PHONE + true + true + prompt + 4 + + + + Bin\x86\Debug + true + full + false + + + + Bin\x86\Release + pdbonly + true + + + + Bin\ARM\Debug + true + full + false + + + + Bin\ARM\Release + pdbonly + true + + + + Graphics.cs + + + System.Drawing.cs + + + XamlGraphics.cs + + + Clock.cs + + + App.xaml + + + MainPage.xaml + + + + + + Designer + MSBuild:Compile + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + MSBuild:Compile + Designer + + + + + Designer + + + + + Designer + + + + + PreserveNewest + + + + + + + + + + PreserveNewest + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + \ No newline at end of file diff --git a/samples/Clock/ClockWP8/ClockWP8.sln b/samples/Clock/ClockWP8/ClockWP8.sln new file mode 100644 index 0000000..1c437ee --- /dev/null +++ b/samples/Clock/ClockWP8/ClockWP8.sln @@ -0,0 +1,40 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30723.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClockWP8", "ClockWP8.csproj", "{202641C4-7536-4935-8A25-C88C12E2B876}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {202641C4-7536-4935-8A25-C88C12E2B876}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {202641C4-7536-4935-8A25-C88C12E2B876}.Debug|Any CPU.Build.0 = Debug|Any CPU + {202641C4-7536-4935-8A25-C88C12E2B876}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {202641C4-7536-4935-8A25-C88C12E2B876}.Debug|ARM.ActiveCfg = Debug|ARM + {202641C4-7536-4935-8A25-C88C12E2B876}.Debug|ARM.Build.0 = Debug|ARM + {202641C4-7536-4935-8A25-C88C12E2B876}.Debug|ARM.Deploy.0 = Debug|ARM + {202641C4-7536-4935-8A25-C88C12E2B876}.Debug|x86.ActiveCfg = Debug|x86 + {202641C4-7536-4935-8A25-C88C12E2B876}.Debug|x86.Build.0 = Debug|x86 + {202641C4-7536-4935-8A25-C88C12E2B876}.Debug|x86.Deploy.0 = Debug|x86 + {202641C4-7536-4935-8A25-C88C12E2B876}.Release|Any CPU.ActiveCfg = Release|Any CPU + {202641C4-7536-4935-8A25-C88C12E2B876}.Release|Any CPU.Build.0 = Release|Any CPU + {202641C4-7536-4935-8A25-C88C12E2B876}.Release|Any CPU.Deploy.0 = Release|Any CPU + {202641C4-7536-4935-8A25-C88C12E2B876}.Release|ARM.ActiveCfg = Release|ARM + {202641C4-7536-4935-8A25-C88C12E2B876}.Release|ARM.Build.0 = Release|ARM + {202641C4-7536-4935-8A25-C88C12E2B876}.Release|ARM.Deploy.0 = Release|ARM + {202641C4-7536-4935-8A25-C88C12E2B876}.Release|x86.ActiveCfg = Release|x86 + {202641C4-7536-4935-8A25-C88C12E2B876}.Release|x86.Build.0 = Release|x86 + {202641C4-7536-4935-8A25-C88C12E2B876}.Release|x86.Deploy.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/samples/Clock/ClockWP8/Fonts/BILLY ARGEL TRIAL___.otf b/samples/Clock/ClockWP8/Fonts/BILLY ARGEL TRIAL___.otf new file mode 100644 index 0000000000000000000000000000000000000000..e084a2a11939c9cb065251a40d2e9c86cdda76a9 GIT binary patch literal 64296 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 J1*Fkv{u`~*z2^V` literal 0 HcmV?d00001 diff --git a/samples/Clock/ClockWP8/MainPage.xaml b/samples/Clock/ClockWP8/MainPage.xaml new file mode 100644 index 0000000..04493bd --- /dev/null +++ b/samples/Clock/ClockWP8/MainPage.xaml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/samples/Clock/ClockWP8/MainPage.xaml.cs b/samples/Clock/ClockWP8/MainPage.xaml.cs new file mode 100644 index 0000000..40da8e7 --- /dev/null +++ b/samples/Clock/ClockWP8/MainPage.xaml.cs @@ -0,0 +1,52 @@ +using System; +using System.Windows; +using System.Windows.Threading; +using Microsoft.Phone.Controls; +using CrossGraphics; + +namespace Clock.WP8 +{ + public partial class MainPage : PhoneApplicationPage + { + Clock _clock; + XamlGraphics _graphics; + + public MainPage () + { + InitializeComponent (); + + _clock = new Clock (); + } + + private void PhoneApplicationPage_Loaded (object sender, RoutedEventArgs e) + { + // + // Initialize the graphics context + // + _graphics = new XamlGraphics(LayoutRoot); + + // + // Create a timer to refresh the clock + // + var timer = new DispatcherTimer { + Interval = TimeSpan.FromSeconds (1), + }; + timer.Tick += delegate { + Draw (); + }; + timer.Start (); + } + + void Draw () + { + _clock.Width = (float)LayoutRoot.ActualWidth; + _clock.Height = (float)LayoutRoot.ActualHeight; + + _graphics.BeginDrawing (); + + _clock.Draw (_graphics); + + _graphics.EndDrawing (); + } + } +} diff --git a/samples/Clock/ClockWP8/Package.appxmanifest b/samples/Clock/ClockWP8/Package.appxmanifest new file mode 100644 index 0000000..faae6bc --- /dev/null +++ b/samples/Clock/ClockWP8/Package.appxmanifest @@ -0,0 +1,58 @@ + + + + + + + + + ClockWP7 + Juergen + Assets\StoreLogo.png + + + + 6.3.1 + 6.3.1 + + + + + + + + + + + + + + + + + + + + + + + + + + + AgHostSvcs.dll + + + + + \ No newline at end of file diff --git a/samples/Clock/ClockWP8/Properties/AppManifest.xml b/samples/Clock/ClockWP8/Properties/AppManifest.xml new file mode 100644 index 0000000..a955232 --- /dev/null +++ b/samples/Clock/ClockWP8/Properties/AppManifest.xml @@ -0,0 +1,6 @@ + + + + diff --git a/samples/Clock/ClockWP8/Properties/AssemblyInfo.cs b/samples/Clock/ClockWP8/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..12df7f2 --- /dev/null +++ b/samples/Clock/ClockWP8/Properties/AssemblyInfo.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Resources; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle ("ClockWP7")] +[assembly: AssemblyDescription ("")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("")] +[assembly: AssemblyProduct ("ClockWP7")] +[assembly: AssemblyCopyright ("Copyright © 2012")] +[assembly: AssemblyTrademark ("")] +[assembly: AssemblyCulture ("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible (false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid ("c72d72aa-aecf-4325-9048-5ca6d40ed591")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion ("1.0.0.0")] +[assembly: AssemblyFileVersion ("1.0.0.0")] +[assembly: NeutralResourcesLanguageAttribute ("en-US")] diff --git a/samples/Clock/ClockWP8/Properties/WMAppManifest.xml b/samples/Clock/ClockWP8/Properties/WMAppManifest.xml new file mode 100644 index 0000000..6e10b30 --- /dev/null +++ b/samples/Clock/ClockWP8/Properties/WMAppManifest.xml @@ -0,0 +1,48 @@ + + + + + ApplicationIcon.png + + + + + + + + + + + + + + + + + + + + + + + + + Background.png + 0 + Background.png + ClockWP7 + + + + + false + + + + + + + + + + \ No newline at end of file diff --git a/samples/Clock/ClockWP8/SplashScreenImage.jpg b/samples/Clock/ClockWP8/SplashScreenImage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..353b1927b9d397aac7f23098e427739615db19fd GIT binary patch literal 9417 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 UfQSJR10n`Q4E%c;KnlnH2jCM6ivR!s literal 0 HcmV?d00001 diff --git a/samples/Clock/ClockWP8/UpgradeLog.htm b/samples/Clock/ClockWP8/UpgradeLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..5348bb85075e376d57c2546a21c3b2662e1b5e41 GIT binary patch literal 46504 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 literal 0 HcmV?d00001 diff --git a/src/XamlGraphics.cs b/src/XamlGraphics.cs index ebc7a94..9edcf52 100644 --- a/src/XamlGraphics.cs +++ b/src/XamlGraphics.cs @@ -1079,78 +1079,95 @@ public void DrawImage (IImage img, float x, float y, float width, float height) e.Height = height; } } - } - - public void DrawString(string str, float x, float y, float width = 0, float height = 0, LineBreakMode lineBreak = LineBreakMode.None, TextAlignment align = TextAlignment.Left) - { - var s = GetNextShape(TypeId.Text); - var e = (TextBlock)s.Element; - //var b = s.Element as Border; - //var e = b.Child as TextBlock; - //if (e == null) { - // e = new TextBlock(); - // b.Child = e; - //} - - if (s.TextAlignment != align) { - switch (align) { - case TextAlignment.Center: - e.TextAlignment = NativeTextAlignment.Center; - e.Width = width; - e.Height = height; - break; - default: - e.TextAlignment = NativeTextAlignment.Left; - break; - } - s.TextAlignment = align; - } - - if (s.X != x) { - s.X = x; - Canvas.SetLeft(e, x); - } - if (s.Y != y) { - s.Y = y; - Canvas.SetTop(e, y); - } - if (s.Text != str) { - s.Text = str; - e.Text = str; - //b.Background = new SolidColorBrush(System.Windows.Media.Colors.Red); - } - if (s.Color != _currentColor) { - s.Color = _currentColor; - e.Foreground = _currentColor.GetBrush(); - } - if (s.Font != CurrentFont) { - s.Font = CurrentFont; - if (CurrentFont.FontFamily == "Monospace") { - e.FontFamily = XamlFontMetrics.Monospace; - } - else { - e.FontFamily = XamlFontMetrics.SystemFont; - } - if (CurrentFont.IsBold) { - e.FontWeight = FontWeights.Bold; - } - else { - e.FontWeight = FontWeights.Normal; - } - e.Padding = new Thickness(0); - e.RenderTransform = new TranslateTransform() { - X = 0, -#if NETFX_CORE - Y = -0.08 * CurrentFont.Size, -#else - Y = -0.333 * CurrentFont.Size, -#endif - }; - e.FontSize = CurrentFont.Size; - //e.Height = CurrentFont.Size; - } - } - } + } + + public void DrawString(string str, float x, float y, float width = 0, float height = 0, LineBreakMode lineBreak = LineBreakMode.None, TextAlignment align = TextAlignment.Left) + { + var s = GetNextShape(TypeId.Text); + var e = (TextBlock)s.Element; + //var b = s.Element as Border; + //var e = b.Child as TextBlock; + //if (e == null) { + // e = new TextBlock(); + // b.Child = e; + //} + + if (s.TextAlignment != align) + { + switch (align) + { + case TextAlignment.Center: + e.TextAlignment = NativeTextAlignment.Center; + e.Width = width; + e.Height = height; + break; + default: + e.TextAlignment = NativeTextAlignment.Left; + break; + } + s.TextAlignment = align; + } + + if (s.X != x) + { + s.X = x; + Canvas.SetLeft(e, x); + } + if (s.Y != y) + { + s.Y = y; + Canvas.SetTop(e, y); + } + if (s.Text != str) + { + s.Text = str; + e.Text = str; + //b.Background = new SolidColorBrush(System.Windows.Media.Colors.Red); + } + if (s.Color != _currentColor) + { + s.Color = _currentColor; + e.Foreground = _currentColor.GetBrush(); + } + if (s.Font != CurrentFont) + { + s.Font = CurrentFont; + if (CurrentFont.FontFamily == "Monospace") + { + e.FontFamily = XamlFontMetrics.Monospace; + } + else if (string.IsNullOrEmpty(CurrentFont.FontFamily) == false) + { + e.FontFamily = new NativeFontFamily("/Fonts/" + CurrentFont.FontFilename + "#" + CurrentFont.FontFamily); + //e.FontFamily = new FontFamily("/Fonts/" + CurrentFont.FontFilename + "#" + CurrentFont.FontFamily); + } + else + { + e.FontFamily = XamlFontMetrics.SystemFont; + } + if (CurrentFont.IsBold) + { + e.FontWeight = FontWeights.Bold; + } + else + { + e.FontWeight = FontWeights.Normal; + } + e.Padding = new Thickness(0); + e.RenderTransform = new TranslateTransform() + { + X = 0, +#if NETFX_CORE + Y = -0.08 * CurrentFont.Size, +#else + Y = -0.333 * CurrentFont.Size, +#endif + }; + e.FontSize = CurrentFont.Size; + //e.Height = CurrentFont.Size; + } + } + } public static partial class ColorEx { From 746c4d8b24af98edcc7fd99a9d03d8438dbad3ec Mon Sep 17 00:00:00 2001 From: Juergen Koller Date: Thu, 4 Dec 2014 16:52:30 +0100 Subject: [PATCH 04/13] XamlGraphics DrawString LineWrap --- samples/Clock/Clock/Clock.cs | 11 +- samples/Clock/ClockWpf/ClockWpf.csproj | 9 +- samples/Clock/ClockWpf/MainWindow.xaml.cs | 6 +- src/CoreGraphicsGraphics.cs | 107 +- src/Graphics.cs | 115 +- src/System.Drawing.cs | 377 ++-- src/XamlGraphics.cs | 2271 +++++++++++---------- 7 files changed, 1471 insertions(+), 1425 deletions(-) diff --git a/samples/Clock/Clock/Clock.cs b/samples/Clock/Clock/Clock.cs index c8a5b5e..18b659d 100644 --- a/samples/Clock/Clock/Clock.cs +++ b/samples/Clock/Clock/Clock.cs @@ -14,7 +14,11 @@ public class Clock readonly Color BackColor = new Color (0xDD, 0xDD, 0xDD); readonly Color FaceColor = new Color (0xCC, 0xCC, 0xCC); readonly Color BorderColor = new Color (0x66, 0x66, 0x66); - readonly Font LabelFont = Font.SystemFontOfSize (16); + readonly Color RedColor = new Color (0xFF, 0x0, 0x0); + readonly Font LabelFont = Font.SystemFontOfSize (16); + + //Custom Font Test + readonly Font CustomFont = Font.FromName("BILLY ARGEL TRIAL___.otf", "BILLY ARGEL FONT", 30); public void Draw (IGraphics g) { @@ -48,9 +52,8 @@ public void Draw (IGraphics g) g.DrawString ("Cross Graphics", center.X - textWidth / 2, center.Y + 0.25f * r); //Custom Font Test - var customFont = Font.FromName("BILLY ARGEL TRIAL___.otf", "BILLY ARGEL FONT", 30); - g.SetFont(customFont); - g.SetColor(new Color(255, 0, 0)); + g.SetFont(CustomFont); + g.SetColor(RedColor); var myString = "Custom Font Test"; textWidth = g.GetFontMetrics().StringWidth(myString); g.DrawString(myString, center.X - textWidth / 2, center.Y - 0.25f * r); diff --git a/samples/Clock/ClockWpf/ClockWpf.csproj b/samples/Clock/ClockWpf/ClockWpf.csproj index 300dc3c..4b1ed74 100644 --- a/samples/Clock/ClockWpf/ClockWpf.csproj +++ b/samples/Clock/ClockWpf/ClockWpf.csproj @@ -62,12 +62,12 @@ Graphics.cs - - SilverlightGraphics.cs - System.Drawing.cs + + XamlGraphics.cs + Clock.cs @@ -104,6 +104,9 @@ + + +