From b8c3b9c29f0cf03f6d3f5f213c3d99f8a7c481c4 Mon Sep 17 00:00:00 2001 From: Regalis Date: Fri, 24 Feb 2017 00:01:46 +0200 Subject: [PATCH 01/44] - sub editor shows a warning upon saving if there are entities way outside the sub - warnings are shown in a GUIMessageBox instead of the debug console - added a submarine indicator to the editor --- Subsurface/Source/Map/Submarine.cs | 39 +++++++++++++++++++--- Subsurface/Source/Screens/EditMapScreen.cs | 13 +++++--- Subsurface/Source/Screens/GameScreen.cs | 21 ------------ Subsurface/Source/Screens/Screen.cs | 20 +++++++++++ 4 files changed, 62 insertions(+), 31 deletions(-) diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index 32cee36b5..e3be7b567 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -938,9 +938,11 @@ namespace Barotrauma public void CheckForErrors() { + string errorMsg = ""; + if (!Hull.hullList.Any()) { - DebugConsole.ThrowError("No hulls found in the submarine. Hulls determine the \"borders\" of an individual room and are required for water and air distribution to work correctly."); + errorMsg = "No hulls found in the submarine. Hulls determine the \"borders\" of an individual room and are required for water and air distribution to work correctly."; } foreach (Item item in Item.ItemList) @@ -949,19 +951,46 @@ namespace Barotrauma if (!item.linkedTo.Any()) { - DebugConsole.ThrowError("The submarine contains vents which haven't been linked to an oxygen generator. Select a vent and click an oxygen generator while holding space to link them."); + errorMsg += "\nThe submarine contains vents which haven't been linked to an oxygen generator. Select a vent and click an oxygen generator while holding space to link them."; } } if (WayPoint.WayPointList.Find(wp => !wp.MoveWithLevel && wp.SpawnType == SpawnType.Path) == null) { - DebugConsole.ThrowError("No waypoints found in the submarine. AI controlled crew members won't be able to navigate without waypoints."); + errorMsg += "\nNo waypoints found in the submarine. AI controlled crew members won't be able to navigate without waypoints."; } if (WayPoint.WayPointList.Find(wp => wp.SpawnType == SpawnType.Cargo) == null) { - DebugConsole.ThrowError("The submarine doesn't have spawnpoints for cargo (which are used for determining where to place bought items). " - +"To fix this, create a new spawnpoint and change its \"spawn type\" parameter to \"cargo\"."); + errorMsg += "\nThe submarine doesn't have spawnpoints for cargo (which are used for determining where to place bought items). " + +"To fix this, create a new spawnpoint and change its \"spawn type\" parameter to \"cargo\"."; + } + + if (!string.IsNullOrWhiteSpace(errorMsg)) + { + new GUIMessageBox("Warning", errorMsg); + } + + foreach (MapEntity e in MapEntity.mapEntityList) + { + if (Vector2.Distance(e.Position, HiddenSubPosition) > 20000) + { + var msgBox = new GUIMessageBox( + "Warning", + "One or more structures have been placed very far from the submarine. Show the structures?", + new string[] {"Yes", "No"}); + + msgBox.Buttons[0].OnClicked += (btn, obj) => + { + GameMain.EditMapScreen.Cam.Position = e.WorldPosition; + return true; + }; + msgBox.Buttons[0].OnClicked += msgBox.Close; + msgBox.Buttons[1].OnClicked += msgBox.Close; + + break; + + } } } diff --git a/Subsurface/Source/Screens/EditMapScreen.cs b/Subsurface/Source/Screens/EditMapScreen.cs index 86176a7a3..6929e2ae7 100644 --- a/Subsurface/Source/Screens/EditMapScreen.cs +++ b/Subsurface/Source/Screens/EditMapScreen.cs @@ -309,9 +309,8 @@ namespace Barotrauma } else { - cam.Position = Submarine.HiddenSubStartPosition; - Submarine.MainSub = new Submarine(Path.Combine(Submarine.SavePath, "Unnamed.sub"), "", false); + cam.Position = Submarine.MainSub.Position; } SoundPlayer.OverrideMusicType = "none"; @@ -588,8 +587,7 @@ namespace Barotrauma Submarine.MainSub = selectedSub; selectedSub.Load(true); - //nameBox.Text = selectedSub.Name; - //descriptionBox.Text = ToolBox.LimitString(selectedSub.Description,15); + cam.Position = Submarine.MainSub.Position + Submarine.MainSub.HiddenSubPosition; loadFrame = null; @@ -1064,7 +1062,7 @@ namespace Barotrauma graphics.Clear(new Color(0.051f, 0.149f, 0.271f, 1.0f)); if (GameMain.DebugDraw) { - GUI.DrawLine(spriteBatch, new Vector2(0.0f, -cam.WorldView.Y), new Vector2(0.0f, -(cam.WorldView.Y - cam.WorldView.Height)), Color.White*0.5f, 1.0f, (int)(2.0f/cam.Zoom)); + GUI.DrawLine(spriteBatch, new Vector2(Submarine.MainSub.HiddenSubPosition.X, -cam.WorldView.Y), new Vector2(Submarine.MainSub.HiddenSubPosition.X, -(cam.WorldView.Y - cam.WorldView.Height)), Color.White * 0.5f, 1.0f, (int)(2.0f / cam.Zoom)); GUI.DrawLine(spriteBatch, new Vector2(cam.WorldView.X, -Submarine.MainSub.HiddenSubPosition.Y), new Vector2(cam.WorldView.Right, -Submarine.MainSub.HiddenSubPosition.Y), Color.White * 0.5f, 1.0f, (int)(2.0f / cam.Zoom)); } @@ -1084,6 +1082,11 @@ namespace Barotrauma spriteBatch.Begin(); + if (Submarine.MainSub != null) + { + DrawSubmarineIndicator(spriteBatch, Submarine.MainSub, Color.LightBlue * 0.5f); + } + leftPanel.Draw(spriteBatch); topPanel.Draw(spriteBatch); diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index 1493dd02b..d6685f0ab 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -445,26 +445,5 @@ namespace Barotrauma } } - - private void DrawSubmarineIndicator(SpriteBatch spriteBatch, Submarine submarine, Color color) - { - Vector2 subDiff = submarine.WorldPosition - cam.WorldViewCenter; - - if (Math.Abs(subDiff.X) > cam.WorldView.Width || Math.Abs(subDiff.Y) > cam.WorldView.Height) - { - Vector2 normalizedSubDiff = Vector2.Normalize(subDiff); - - Vector2 iconPos = - cam.WorldToScreen(cam.WorldViewCenter) + - new Vector2(normalizedSubDiff.X * GameMain.GraphicsWidth * 0.4f, -normalizedSubDiff.Y * GameMain.GraphicsHeight * 0.4f); - - GUI.SubmarineIcon.Draw(spriteBatch, iconPos, color); - - Vector2 arrowOffset = normalizedSubDiff * GUI.SubmarineIcon.size.X * 0.7f; - arrowOffset.Y = -arrowOffset.Y; - GUI.Arrow.Draw(spriteBatch, iconPos + arrowOffset, color, MathUtils.VectorToAngle(arrowOffset) + MathHelper.PiOver2); - } - } - } } diff --git a/Subsurface/Source/Screens/Screen.cs b/Subsurface/Source/Screens/Screen.cs index a57a06007..56dfa3421 100644 --- a/Subsurface/Source/Screens/Screen.cs +++ b/Subsurface/Source/Screens/Screen.cs @@ -75,5 +75,25 @@ namespace Barotrauma yield return CoroutineStatus.Success; } + protected void DrawSubmarineIndicator(SpriteBatch spriteBatch, Submarine submarine, Color color) + { + Vector2 subDiff = submarine.WorldPosition - Cam.WorldViewCenter; + + if (Math.Abs(subDiff.X) > Cam.WorldView.Width || Math.Abs(subDiff.Y) > Cam.WorldView.Height) + { + Vector2 normalizedSubDiff = Vector2.Normalize(subDiff); + + Vector2 iconPos = + Cam.WorldToScreen(Cam.WorldViewCenter) + + new Vector2(normalizedSubDiff.X * GameMain.GraphicsWidth * 0.4f, -normalizedSubDiff.Y * GameMain.GraphicsHeight * 0.4f); + + GUI.SubmarineIcon.Draw(spriteBatch, iconPos, color); + + Vector2 arrowOffset = normalizedSubDiff * GUI.SubmarineIcon.size.X * 0.7f; + arrowOffset.Y = -arrowOffset.Y; + GUI.Arrow.Draw(spriteBatch, iconPos + arrowOffset, color, MathUtils.VectorToAngle(arrowOffset) + MathHelper.PiOver2); + } + } + } } From 7aafdadae51fcffd9dba27c2e91661b6248f3c47 Mon Sep 17 00:00:00 2001 From: Regalis Date: Fri, 24 Feb 2017 19:16:42 +0200 Subject: [PATCH 02/44] (Maybe?) fixed "collection was modified" exceptions in GUIComponent.AddToGUIUpdateList http://undertowgames.com/forum/viewtopic.php?f=21&t=5915 Couldn't reproduce the exception and not sure why exactly it happens, but I think this should prevent it --- Subsurface/Source/GUI/GUIComponent.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Subsurface/Source/GUI/GUIComponent.cs b/Subsurface/Source/GUI/GUIComponent.cs index f48325221..b059c8267 100644 --- a/Subsurface/Source/GUI/GUIComponent.cs +++ b/Subsurface/Source/GUI/GUIComponent.cs @@ -28,7 +28,12 @@ namespace Barotrauma if (!Visible) return; if (ComponentsToUpdate.Contains(this)) return; ComponentsToUpdate.Add(this); - children.ForEach(c => c.AddToGUIUpdateList()); + + List fixedChildren = new List(children); + foreach (GUIComponent c in fixedChildren) + { + c.AddToGUIUpdateList(); + } } public static void ClearUpdateList() From 2a60f9d052f59521560226ff2726c6a33e660422 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 25 Feb 2017 14:28:12 +0200 Subject: [PATCH 03/44] Fixed "OpenAL not found" exceptions if no audio devices are found --- Subsurface/Source/Sounds/Sound.cs | 26 ++----------- Subsurface/Source/Sounds/SoundManager.cs | 48 ++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/Subsurface/Source/Sounds/Sound.cs b/Subsurface/Source/Sounds/Sound.cs index 867ae39f4..a334f59b4 100644 --- a/Subsurface/Source/Sounds/Sound.cs +++ b/Subsurface/Source/Sounds/Sound.cs @@ -40,7 +40,7 @@ namespace Barotrauma if (loadedSound.filePath == file) oggSound = loadedSound.oggSound; } - if (oggSound == null) + if (oggSound == null && !SoundManager.Disabled) { try { @@ -210,26 +210,6 @@ namespace Barotrauma } } - //public int Loop(float volume = 1.0f) - //{ - // return SoundManager.Loop(this, volume); - //} - - //public void Pause() - //{ - // SoundManager.Pause(this); - //} - - //public void Resume() - //{ - // SoundManager.Resume(this); - //} - - //public void Stop() - //{ - // SoundManager.Stop(this); - //} - public static void OnGameEnd() { List removableSounds = loadedSounds.FindAll(s => s.destroyOnGameEnd); @@ -268,17 +248,19 @@ namespace Barotrauma public static void StartStream(string file, float volume = 1.0f) { + if (SoundManager.Disabled) return; stream = SoundManager.StartStream(file, volume); } public static void StreamVolume(float volume = 1.0f) { + if (SoundManager.Disabled) return; stream.Volume = volume; } public static void StopStream() { - if (stream!=null) SoundManager.StopStream(); + if (stream != null) SoundManager.StopStream(); } public static void Dispose() diff --git a/Subsurface/Source/Sounds/SoundManager.cs b/Subsurface/Source/Sounds/SoundManager.cs index 986a1ee64..e1184e983 100644 --- a/Subsurface/Source/Sounds/SoundManager.cs +++ b/Subsurface/Source/Sounds/SoundManager.cs @@ -9,6 +9,12 @@ namespace Barotrauma.Sounds { static class SoundManager { + public static bool Disabled + { + get; + private set; + } + public const int DefaultSourceCount = 16; private static readonly List alSources = new List(); @@ -26,9 +32,17 @@ namespace Barotrauma.Sounds public static void Init() { + var availableDevices = AudioContext.AvailableDevices; + if (availableDevices.Count == 0) + { + DebugConsole.ThrowError("No audio devices found. Disabling audio playback."); + Disabled = true; + return; + } + try { - AC = new AudioContext(); + AC = new AudioContext(); ALHelper.Check(); } catch (DllNotFoundException e) @@ -55,11 +69,14 @@ namespace Barotrauma.Sounds public static int Play(Sound sound, float volume = 1.0f) { + if (Disabled) return -1; return Play(sound, Vector2.Zero, volume, 0.0f); } public static int Play(Sound sound, Vector2 position, float volume = 1.0f, float lowPassGain = 0.0f, bool loop=false) { + if (Disabled) return -1; + for (int i = 1; i < DefaultSourceCount; i++) { //find a source that's free to use (not playing or paused) @@ -85,11 +102,15 @@ namespace Barotrauma.Sounds public static int Loop(Sound sound, int sourceIndex, float volume = 1.0f) { + if (Disabled) return -1; + return Loop(sound,sourceIndex, Vector2.Zero, volume); } public static int Loop(Sound sound, int sourceIndex, Vector2 position, float volume = 1.0f) { + if (Disabled) return -1; + if (!MathUtils.IsValid(volume)) { volume = 0.0f; @@ -111,6 +132,8 @@ namespace Barotrauma.Sounds public static void Pause(int sourceIndex) { + if (Disabled) return; + if (AL.GetSourceState(alSources[sourceIndex]) != ALSourceState.Playing) return; @@ -120,6 +143,8 @@ namespace Barotrauma.Sounds public static void Resume(int sourceIndex) { + if (Disabled) return; + if (AL.GetSourceState(alSources[sourceIndex]) != ALSourceState.Paused) return; @@ -129,6 +154,8 @@ namespace Barotrauma.Sounds public static void Stop(int sourceIndex) { + if (Disabled) return; + if (sourceIndex < 1) return; var state = AL.GetSourceState(alSources[sourceIndex]); @@ -143,6 +170,8 @@ namespace Barotrauma.Sounds public static Sound GetPlayingSound(int sourceIndex) { + if (Disabled) return null; + if (sourceIndex < 1 || sourceIndex>alSources.Count-1) return null; if (AL.GetSourceState(alSources[sourceIndex]) != ALSourceState.Playing) return null; @@ -152,6 +181,8 @@ namespace Barotrauma.Sounds public static bool IsPlaying(int sourceIndex) { + if (Disabled) return false; + if (sourceIndex < 1 || sourceIndex>alSources.Count-1) return false; return AL.GetSourceState(alSources[sourceIndex]) == ALSourceState.Playing; @@ -159,6 +190,8 @@ namespace Barotrauma.Sounds public static bool IsPaused(int sourceIndex) { + if (Disabled) return false; + if (sourceIndex < 1 || sourceIndex > alSources.Count - 1) return false; return AL.GetSourceState(alSources[sourceIndex]) == ALSourceState.Paused; @@ -166,6 +199,7 @@ namespace Barotrauma.Sounds public static bool IsLooping(int sourceIndex) { + if (Disabled) return false; if (sourceIndex < 1 || sourceIndex > alSources.Count - 1) return false; bool isLooping; @@ -177,6 +211,8 @@ namespace Barotrauma.Sounds public static void Volume(int sourceIndex, float volume) { + if (Disabled) return; + AL.Source(alSources[sourceIndex], ALSourcef.Gain, volume * MasterVolume); ALHelper.Check(); } @@ -187,6 +223,7 @@ namespace Barotrauma.Sounds get { return lowPassHfGain; } set { + if (Disabled) return; if (ALHelper.Efx.IsInitialized) { lowPassHfGain = value; @@ -200,7 +237,6 @@ namespace Barotrauma.Sounds ALHelper.Efx.BindFilterToSource(alSources[i], lowpassFilterId); ALHelper.Check(); } - } } } @@ -208,7 +244,7 @@ namespace Barotrauma.Sounds public static void UpdateSoundPosition(int sourceIndex, Vector2 position, float baseVolume = 1.0f) { - if (sourceIndex < 1) return; + if (sourceIndex < 1 || Disabled) return; if (!MathUtils.IsValid(position)) { @@ -229,6 +265,8 @@ namespace Barotrauma.Sounds public static OggStream StartStream(string file, float volume = 1.0f) { + if (Disabled) return null; + if (oggStreamer == null) oggStreamer = new OggStreamer(); @@ -244,7 +282,7 @@ namespace Barotrauma.Sounds public static void StopStream() { - if (oggStream!=null) oggStream.Stop(); + if (oggStream != null) oggStream.Stop(); } public static void ClearAlSource(int bufferId) @@ -260,6 +298,8 @@ namespace Barotrauma.Sounds public static void Dispose() { + if (Disabled) return; + if (ALHelper.Efx.IsInitialized) ALHelper.Efx.DeleteFilter(lowpassFilterId); From 12466e304ef5cdae645d58d41b40d73c04e5e3b6 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 25 Feb 2017 15:03:10 +0200 Subject: [PATCH 04/44] Fixed server failing to start a round if there's a selected cargo spawnpoint is not inside a hull --- Subsurface/Source/Networking/GameServer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index f6c108f75..0492bbe9f 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -1035,9 +1035,9 @@ namespace Barotrauma.Networking WayPoint cargoSpawnPos = WayPoint.GetRandom(SpawnType.Cargo, null, sub); - if (cargoSpawnPos == null) + if (cargoSpawnPos == null || cargoSpawnPos.CurrentHull == null) { - DebugConsole.ThrowError("Couldn't spawn additional cargo (cargo spawnpoint not found)"); + DebugConsole.ThrowError("Couldn't spawn additional cargo (no cargo spawnpoint inside any of the hulls)"); continue; } From bf3fa804df4ec566ff29f882721b774b0a1f4694 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 25 Feb 2017 16:40:52 +0200 Subject: [PATCH 05/44] Fixed ragdolls accumulating a large movement value while being dragged (backported from commit a21d8d7) --- .../Source/Characters/Animation/HumanoidAnimController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs index b131e258d..2be536010 100644 --- a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs @@ -910,7 +910,7 @@ namespace Barotrauma targetLimb.pullJoint.WorldAnchorB = targetLimb.SimPosition - diff; targetLimb.pullJoint.MaxForce = 10000.0f; - target.AnimController.movement -= diff; + target.AnimController.movement = -diff; } } From c9f09031defd4db752080c3286ad1f8e551eb973 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 25 Feb 2017 16:47:20 +0200 Subject: [PATCH 06/44] Re-enabled anchoring main limb to the collider when a remote player is unconscious (otherwise only the position of the collider will be synced, and the ragdoll won't follow it) + stunned characters can't send position updates --- .../Characters/Animation/HumanoidAnimController.cs | 10 +++++----- Subsurface/Source/Characters/Character.cs | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs index 2be536010..5072c221b 100644 --- a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs @@ -64,16 +64,16 @@ namespace Barotrauma levitatingCollider = false; Collider.FarseerBody.FixedRotation = false; - /*if (character.IsRemotePlayer) + if (character.IsRemotePlayer) { MainLimb.pullJoint.WorldAnchorB = Collider.SimPosition; MainLimb.pullJoint.Enabled = true; } else - {*/ - Collider.LinearVelocity = (GetLimb(LimbType.Waist).SimPosition - Collider.SimPosition) * 20.0f; - Collider.SmoothRotate(GetLimb(LimbType.Torso).Rotation); - //} + { + Collider.LinearVelocity = (GetLimb(LimbType.Waist).SimPosition - Collider.SimPosition) * 20.0f; + Collider.SmoothRotate(GetLimb(LimbType.Torso).Rotation); + } if (stunTimer > 0) { diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index a81ced76b..0df0109bb 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -1805,7 +1805,7 @@ namespace Barotrauma { data = null; - if (GameMain.Server != null && (type != NetworkEventType.InventoryUpdate || (!IsUnconscious && !IsDead))) + if (GameMain.Server != null && (type != NetworkEventType.InventoryUpdate || (!IsUnconscious && !IsDead && Stun <= 0.0f))) { Client sender = GameMain.Server.ConnectedClients.Find(c => c.Connection == message.SenderConnection); if (sender == null || sender.Character != this) @@ -1997,7 +1997,7 @@ namespace Barotrauma return false; } - if (GameMain.Server != null && (isDead || IsUnconscious)) return false; + if (GameMain.Server != null && (isDead || IsUnconscious || Stun > 0.0f)) return false; keys[(int)InputType.Use].Held = actionKeyState; keys[(int)InputType.Use].SetState(false, actionKeyState); From 844097b132a6a777ef925205cce3852828b19706 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 25 Feb 2017 21:24:38 +0200 Subject: [PATCH 07/44] Initial steps in making the light rendering use light volumes instead of shadow volumes to allow rendering the lights in one batch. So far just disabled shadow rendering and cleaned up some unnecessary stuff --- Subsurface/Source/Map/Lights/ConvexHull.cs | 53 +++++++++++++++ Subsurface/Source/Map/Lights/LightManager.cs | 37 +--------- Subsurface/Source/Map/Lights/LightSource.cs | 71 ++++---------------- 3 files changed, 70 insertions(+), 91 deletions(-) diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs index c48285988..d0e3fb589 100644 --- a/Subsurface/Source/Map/Lights/ConvexHull.cs +++ b/Subsurface/Source/Map/Lights/ConvexHull.cs @@ -397,6 +397,59 @@ namespace Barotrauma.Lights } } + public static List GetHullsInRange(Vector2 position, float range, Submarine ParentSub) + { + List list = new List(); + + foreach (ConvexHullList chList in ConvexHull.HullLists) + { + Vector2 lightPos = position; + if (ParentSub == null) + { + //light and the convexhull are both outside + if (chList.Submarine == null) + { + list.AddRange(chList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox))); + + } + //light is outside, convexhull inside a sub + else + { + if (!MathUtils.CircleIntersectsRectangle(lightPos - chList.Submarine.WorldPosition, range, chList.Submarine.Borders)) continue; + + lightPos -= (chList.Submarine.WorldPosition - chList.Submarine.HiddenSubPosition); + + list.AddRange(chList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox))); + } + } + else + { + //light is inside, convexhull outside + if (chList.Submarine == null) continue; + + //light and convexhull are both inside the same sub + if (chList.Submarine == ParentSub) + { + list.AddRange(chList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox))); + } + //light and convexhull are inside different subs + else + { + lightPos -= (chList.Submarine.Position - ParentSub.Position); + + Rectangle subBorders = chList.Submarine.Borders; + subBorders.Location += chList.Submarine.HiddenSubPosition.ToPoint() - new Point(0, chList.Submarine.Borders.Height); + + if (!MathUtils.CircleIntersectsRectangle(lightPos, range, subBorders)) continue; + + list.AddRange(chList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox))); + } + } + } + + return list; + } + public void DrawShadows(GraphicsDevice graphicsDevice, Camera cam, LightSource light, Matrix transform, bool los = true) { if (!Enabled) return; diff --git a/Subsurface/Source/Map/Lights/LightManager.cs b/Subsurface/Source/Map/Lights/LightManager.cs index b3d4c8382..4040be2ab 100644 --- a/Subsurface/Source/Map/Lights/LightManager.cs +++ b/Subsurface/Source/Map/Lights/LightManager.cs @@ -133,45 +133,19 @@ namespace Barotrauma.Lights //clear to some small ambient light graphics.Clear(AmbientLight); + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive, null, null, null, null, cam.Transform); + foreach (LightSource light in lights) { if (light.Color.A < 1 || light.Range < 1.0f || !light.CastShadows) continue; if (!MathUtils.CircleIntersectsRectangle(light.WorldPosition, light.Range, viewRect)) continue; - - //clear alpha to 1 - ClearAlphaToOne(graphics, spriteBatch); - - //draw all shadows - //write only to the alpha channel, which sets alpha to 0 - graphics.RasterizerState = RasterizerState.CullNone; - graphics.BlendState = CustomBlendStates.WriteToAlpha; - light.DrawShadows(graphics, cam, shadowTransform); - - //draw the light shape - //where Alpha is 0, nothing will be written - spriteBatch.Begin(SpriteSortMode.Deferred, CustomBlendStates.MultiplyWithAlpha, null, null, null, null, cam.Transform); light.Draw(spriteBatch); - spriteBatch.End(); } - - ClearAlphaToOne(graphics, spriteBatch); - - spriteBatch.Begin(SpriteSortMode.Deferred, CustomBlendStates.MultiplyWithAlpha, null, null, null, null, cam.Transform); - GameMain.ParticleManager.Draw(spriteBatch, false, Particles.ParticleBlendState.Additive); - - foreach (LightSource light in lights) - { - if (light.Color.A < 1 || light.Range < 1.0f || light.CastShadows) continue; - //if (!MathUtils.CircleIntersectsRectangle(light.WorldPosition, light.Range, viewRect)) continue; - - light.Draw(spriteBatch); - } - if (Character.Controlled != null) { if (Character.Controlled.ClosestItem != null) @@ -185,10 +159,6 @@ namespace Barotrauma.Lights Character.Controlled.ClosestCharacter.Draw(spriteBatch); } } - spriteBatch.End(); - - - spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive, null, null, null, null, cam.Transform); foreach (Hull hull in smoothedHullAmbientLights.Keys) { @@ -207,7 +177,6 @@ namespace Barotrauma.Lights spriteBatch.End(); - //clear alpha, to avoid messing stuff up later ClearAlphaToOne(graphics, spriteBatch); @@ -253,7 +222,7 @@ namespace Barotrauma.Lights Matrix shadowTransform = cam.ShaderTransform * Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f; - var convexHulls = LightSource.GetHullsInRange(viewTarget.Position, cam.WorldView.Width*0.75f, viewTarget.Submarine); + var convexHulls = ConvexHull.GetHullsInRange(viewTarget.Position, cam.WorldView.Width*0.75f, viewTarget.Submarine); if (convexHulls != null) { diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index f6d21525d..0b64f0206 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -136,7 +136,7 @@ namespace Barotrauma.Lights GameMain.LightManager.AddLight(this); } - public void DrawShadows(GraphicsDevice graphics, Camera cam, Matrix shadowTransform) + /*public void DrawShadows(GraphicsDevice graphics, Camera cam, Matrix shadowTransform) { if (!CastShadows) return; if (range < 1.0f || color.A < 0.01f) return; @@ -161,9 +161,9 @@ namespace Barotrauma.Lights foreach (ConvexHull ch in outsideHulls) { ch.DrawShadows(graphics, cam, this, shadowTransform, false); - } - } - + } + } + private List GetHullsInRange(Submarine sub) { //find the current list of hulls in range @@ -237,62 +237,20 @@ namespace Barotrauma.Lights } return chList.List; - } + }*/ - public static List GetHullsInRange(Vector2 position, float range, Submarine ParentSub) + private void CalculateFanVertices() { - List list = new List(); + if (!CastShadows) return; + if (range < 1.0f || color.A < 0.01f) return; - foreach (ConvexHullList chList in ConvexHull.HullLists) - { - Vector2 lightPos = position; - if (ParentSub == null) - { - //light and the convexhull are both outside - if (chList.Submarine == null) - { - list.AddRange(chList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox))); - - } - //light is outside, convexhull inside a sub - else - { - if (!MathUtils.CircleIntersectsRectangle(lightPos - chList.Submarine.WorldPosition, range, chList.Submarine.Borders)) continue; - - lightPos -= (chList.Submarine.WorldPosition - chList.Submarine.HiddenSubPosition); - - list.AddRange(chList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox))); - } - } - else - { - //light is inside, convexhull outside - if (chList.Submarine == null) continue; - - //light and convexhull are both inside the same sub - if (chList.Submarine == ParentSub) - { - list.AddRange(chList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox))); - } - //light and convexhull are inside different subs - else - { - lightPos -= (chList.Submarine.Position - ParentSub.Position); - - Rectangle subBorders = chList.Submarine.Borders; - subBorders.Location += chList.Submarine.HiddenSubPosition.ToPoint() - new Point(0, chList.Submarine.Borders.Height); - - if (!MathUtils.CircleIntersectsRectangle(lightPos, range, subBorders)) continue; - - list.AddRange(chList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox))); - } - } - } - - - return list; + var hulls = ConvexHull.GetHullsInRange(position, range, ParentSub); + + //TODO: calculate fan based on hulls + + //http://www.redblobgames.com/articles/visibility/ + //http://roy-t.nl/index.php/2014/02/27/2d-lighting-and-shadows-preview/ } - public void Draw(SpriteBatch spriteBatch) { @@ -323,7 +281,6 @@ namespace Barotrauma.Lights if (LightSprite != null) { LightSprite.Draw(spriteBatch, drawPos, Color, LightSprite.Origin, -Rotation, 1, SpriteEffect); - } } From bcabe4ab393ff1bb89316ae90b6399ead98a0053 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 25 Feb 2017 21:50:11 +0200 Subject: [PATCH 08/44] Disabled convexhull shadow caching --- Subsurface/Source/Map/Lights/ConvexHull.cs | 52 +++++++--------------- 1 file changed, 15 insertions(+), 37 deletions(-) diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs index d0e3fb589..f35a96c45 100644 --- a/Subsurface/Source/Map/Lights/ConvexHull.cs +++ b/Subsurface/Source/Map/Lights/ConvexHull.cs @@ -7,7 +7,7 @@ using System.Linq; namespace Barotrauma.Lights { - class CachedShadow : IDisposable + /*class CachedShadow : IDisposable { public VertexBuffer ShadowBuffer; @@ -40,7 +40,7 @@ namespace Barotrauma.Lights { ShadowBuffer.Dispose(); } - } + }*/ class ConvexHullList { @@ -71,7 +71,9 @@ namespace Barotrauma.Lights static BasicEffect shadowEffect; static BasicEffect penumbraEffect; - private Dictionary cachedShadows; + //private Dictionary cachedShadows; + + public VertexBuffer ShadowBuffer; private Vector2[] vertices; private Vector2[] losVertices; @@ -124,7 +126,7 @@ namespace Barotrauma.Lights parentEntity = parent; - cachedShadows = new Dictionary(); + //cachedShadows = new Dictionary(); shadowVertices = new VertexPositionColor[6 * 2]; penumbraVertices = new VertexPositionTexture[6]; @@ -191,8 +193,6 @@ namespace Barotrauma.Lights public void Move(Vector2 amount) { - ClearCachedShadows(); - for (int i = 0; i < vertices.Length; i++) { vertices[i] += amount; @@ -204,8 +204,6 @@ namespace Barotrauma.Lights public void SetVertices(Vector2[] points) { - ClearCachedShadows(); - vertices = points; losVertices = points; @@ -231,7 +229,7 @@ namespace Barotrauma.Lights CalculateDimensions(); } - private void RemoveCachedShadow(Lights.LightSource light) + /*private void RemoveCachedShadow(Lights.LightSource light) { CachedShadow shadow = null; cachedShadows.TryGetValue(light, out shadow); @@ -251,7 +249,7 @@ namespace Barotrauma.Lights cachedShadow.Value.Dispose(); } cachedShadows.Clear(); - } + }*/ public bool Intersects(Rectangle rect) { @@ -468,29 +466,13 @@ namespace Barotrauma.Lights } } - - CachedShadow cachedShadow = null; - if (!cachedShadows.TryGetValue(light, out cachedShadow) || - Vector2.DistanceSquared(lightSourcePos, cachedShadow.LightPos) > 1.0f) - { - CalculateShadowVertices(lightSourcePos, los); - - if (cachedShadow != null) - { - cachedShadow.LightPos = lightSourcePos; - cachedShadow.ShadowBuffer.SetData(shadowVertices, 0, shadowVertices.Length); - cachedShadow.ShadowVertexCount = shadowVertexCount; - } - else - { - cachedShadow = new CachedShadow(shadowVertices, lightSourcePos, shadowVertexCount, 0); - RemoveCachedShadow(light); - cachedShadows.Add(light, cachedShadow); - } - } - - graphicsDevice.SetVertexBuffer(cachedShadow.ShadowBuffer); - shadowVertexCount = cachedShadow.ShadowVertexCount; + + CalculateShadowVertices(lightSourcePos, los); + ShadowBuffer = new VertexBuffer(GameMain.CurrGraphicsDevice, VertexPositionColor.VertexDeclaration, 6 * 2, BufferUsage.None); + ShadowBuffer.SetData(shadowVertices, 0, shadowVertices.Length); + + graphicsDevice.SetVertexBuffer(ShadowBuffer); + shadowVertexCount = shadowVertices.Length; DrawShadows(graphicsDevice, cam, transform, los); } @@ -546,8 +528,6 @@ namespace Barotrauma.Lights public void Remove() { - ClearCachedShadows(); - var chList = HullLists.Find(x => x.Submarine == parentEntity.Submarine); if (chList != null) @@ -559,8 +539,6 @@ namespace Barotrauma.Lights } } } - - } } From abfe2261d2d50df9c74b85d2f8e27b74ef9439b5 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sun, 26 Feb 2017 01:17:22 +0200 Subject: [PATCH 09/44] - ConvexHulls consist of Segments and SegmentPoints which keep references to each other - LightSources fetch a list of non-backfacing ConvexHull segments within their range, and sort the points counter-clockwise (TODO: calculate triangles from the points) - fixed incorrectly working CircleIntersectsRectangle method --- Subsurface/Source/Map/Lights/ConvexHull.cs | 155 +++++++++++++++----- Subsurface/Source/Map/Lights/LightSource.cs | 35 ++++- Subsurface/Source/Utils/MathUtils.cs | 23 ++- 3 files changed, 163 insertions(+), 50 deletions(-) diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs index f35a96c45..5a56766e4 100644 --- a/Subsurface/Source/Map/Lights/ConvexHull.cs +++ b/Subsurface/Source/Map/Lights/ConvexHull.cs @@ -65,6 +65,32 @@ namespace Barotrauma.Lights } } + class Segment + { + public SegmentPoint Start; + public SegmentPoint End; + + public Segment(SegmentPoint start, SegmentPoint end) + { + Start = start; + End = end; + } + } + + class SegmentPoint + { + public Vector2 Pos; + public Segment[] Segments; + + public Vector2 WorldPos; + + public SegmentPoint(Vector2 pos, Segment[] segments) + { + Pos = pos; + Segments = segments; + } + } + class ConvexHull { public static List HullLists = new List(); @@ -75,9 +101,12 @@ namespace Barotrauma.Lights public VertexBuffer ShadowBuffer; - private Vector2[] vertices; - private Vector2[] losVertices; - private int primitiveCount; + Segment[] segments = new Segment[4]; + SegmentPoint[] vertices = new SegmentPoint[4]; + SegmentPoint[] losVertices = new SegmentPoint[4]; + + //private Vector2[] vertices; + //private Vector2[] losVertices; private bool[] backFacing; private bool[] ignoreEdge; @@ -132,12 +161,11 @@ namespace Barotrauma.Lights penumbraVertices = new VertexPositionTexture[6]; //vertices = points; - primitiveCount = points.Length; SetVertices(points); //CalculateDimensions(); - backFacing = new bool[primitiveCount]; - ignoreEdge = new bool[primitiveCount]; + backFacing = new bool[4]; + ignoreEdge = new bool[4]; Enabled = true; @@ -161,10 +189,10 @@ namespace Barotrauma.Lights { for (int i = 0; i < vertices.Length; i++) { - if (vertices[i].X >= ch.boundingBox.X && vertices[i].X <= ch.boundingBox.Right && - vertices[i].Y >= ch.boundingBox.Y && vertices[i].Y <= ch.boundingBox.Bottom) + if (vertices[i].Pos.X >= ch.boundingBox.X && vertices[i].Pos.X <= ch.boundingBox.Right && + vertices[i].Pos.Y >= ch.boundingBox.Y && vertices[i].Pos.Y <= ch.boundingBox.Bottom) { - Vector2 p = vertices[(i + 1) % vertices.Length]; + Vector2 p = vertices[(i + 1) % vertices.Length].Pos; if (p.X >= ch.boundingBox.X && p.X <= ch.boundingBox.Right && p.Y >= ch.boundingBox.Y && p.Y <= ch.boundingBox.Bottom) @@ -181,11 +209,11 @@ namespace Barotrauma.Lights for (int i = 0; i < vertices.Length; i++) { - if (minX == null || vertices[i].X < minX) minX = vertices[i].X; - if (minY == null || vertices[i].Y < minY) minY = vertices[i].Y; + if (minX == null || vertices[i].Pos.X < minX) minX = vertices[i].Pos.X; + if (minY == null || vertices[i].Pos.Y < minY) minY = vertices[i].Pos.Y; - if (maxX == null || vertices[i].X > maxX) maxX = vertices[i].X; - if (maxY == null || vertices[i].Y > minY) maxY = vertices[i].Y; + if (maxX == null || vertices[i].Pos.X > maxX) maxX = vertices[i].Pos.X; + if (maxY == null || vertices[i].Pos.Y > minY) maxY = vertices[i].Pos.Y; } boundingBox = new Rectangle((int)minX, (int)minY, (int)(maxX - minX), (int)(maxY - minY)); @@ -195,8 +223,8 @@ namespace Barotrauma.Lights { for (int i = 0; i < vertices.Length; i++) { - vertices[i] += amount; - losVertices[i] += amount; + vertices[i].Pos += amount; + losVertices[i].Pos += amount; } CalculateDimensions(); @@ -204,26 +232,38 @@ namespace Barotrauma.Lights public void SetVertices(Vector2[] points) { - vertices = points; - losVertices = points; + Debug.Assert(points.Length == 4, "Only rectangular convex hulls are supported"); + for (int i = 0; i < 4; i++) + { + vertices[i] = new SegmentPoint(points[i], new Segment[2]); + losVertices[i] = new SegmentPoint(points[i], new Segment[2]); + + } + for (int i = 0; i < 4; i++) + { + segments[i] = new Segment(vertices[i], vertices[(i + 1) % 4]); + + vertices[i].Segments[1] = segments[i]; + vertices[(i + 1) % 4].Segments[0] = segments[i]; + + } + int margin = 0; if (Math.Abs(points[0].X - points[2].X) < Math.Abs(points[0].Y - points[1].Y)) { - losVertices = new Vector2[] { - new Vector2(points[0].X+margin, points[0].Y), - new Vector2(points[1].X+margin, points[1].Y), - new Vector2(points[2].X-margin, points[2].Y), - new Vector2(points[3].X-margin, points[3].Y)}; + losVertices[0].Pos = new Vector2(points[0].X + margin, points[0].Y); + losVertices[1].Pos = new Vector2(points[1].X + margin, points[1].Y); + losVertices[2].Pos = new Vector2(points[2].X - margin, points[2].Y); + losVertices[3].Pos = new Vector2(points[3].X - margin, points[3].Y); } else { - losVertices = new Vector2[] { - new Vector2(points[0].X, points[0].Y +margin), - new Vector2(points[1].X, points[1].Y - margin), - new Vector2(points[2].X, points[2].Y - margin), - new Vector2(points[3].X, points[3].Y + margin)}; + losVertices[0].Pos = new Vector2(points[0].X, points[0].Y + margin); + losVertices[1].Pos = new Vector2(points[1].X, points[1].Y - margin); + losVertices[2].Pos = new Vector2(points[2].X, points[2].Y - margin); + losVertices[3].Pos = new Vector2(points[3].X, points[3].Y + margin); } CalculateDimensions(); @@ -263,6 +303,44 @@ namespace Barotrauma.Lights } return transformedBounds.Intersects(rect); } + + /// + /// Returns the segments that are facing towards viewPosition + /// + public List GetVisibleSegments(Vector2 viewPosition) + { + List visibleFaces = new List(); + + for (int i = 0; i < 4; i++) + { + if (ignoreEdge[i]) continue; + + Vector2 middle = (segments[i].Start.Pos + segments[i].End.Pos) / 2; + + Vector2 L = viewPosition - middle; + + Vector2 N = new Vector2( + -(segments[i].End.Pos.Y - segments[i].Start.Pos.Y), + segments[i].End.Pos.X - segments[i].Start.Pos.X); + + if (Vector2.Dot(N, L) < 0) + { + visibleFaces.Add(segments[i]); + } + } + + return visibleFaces; + } + + + public void RefreshWorldPositions() + { + if (parentEntity == null || parentEntity.Submarine == null) return; + for (int i = 0; i < 4; i++) + { + vertices[i].WorldPos = vertices[i].Pos + parentEntity.Submarine.DrawPosition; + } + } private void CalculateShadowVertices(Vector2 lightSourcePos, bool los = true) { @@ -271,7 +349,7 @@ namespace Barotrauma.Lights var vertices = los ? losVertices : this.vertices; //compute facing of each edge, using N*L - for (int i = 0; i < primitiveCount; i++) + for (int i = 0; i < 4; i++) { if (ignoreEdge[i]) { @@ -279,12 +357,10 @@ namespace Barotrauma.Lights continue; } - Vector2 firstVertex = new Vector2(vertices[i].X, vertices[i].Y); - int secondIndex = (i + 1) % primitiveCount; - Vector2 secondVertex = new Vector2(vertices[secondIndex].X, vertices[secondIndex].Y); - Vector2 middle = (firstVertex + secondVertex) / 2; + Vector2 firstVertex = vertices[i].Pos; + Vector2 secondVertex = vertices[(i+1) % 4].Pos; - Vector2 L = lightSourcePos - middle; + Vector2 L = lightSourcePos - ((firstVertex + secondVertex) / 2.0f); Vector2 N = new Vector2( -(secondVertex.Y - firstVertex.Y), @@ -297,10 +373,10 @@ namespace Barotrauma.Lights //belong to the shadow int startingIndex = 0; int endingIndex = 0; - for (int i = 0; i < primitiveCount; i++) + for (int i = 0; i < 4; i++) { int currentEdge = i; - int nextEdge = (i + 1) % primitiveCount; + int nextEdge = (i + 1) % 4; if (backFacing[currentEdge] && !backFacing[nextEdge]) endingIndex = nextEdge; @@ -313,7 +389,7 @@ namespace Barotrauma.Lights if (endingIndex > startingIndex) shadowVertexCount = endingIndex - startingIndex + 1; else - shadowVertexCount = primitiveCount + 1 - startingIndex + endingIndex; + shadowVertexCount = 4 + 1 - startingIndex + endingIndex; //shadowVertices = new VertexPositionColor[shadowVertexCount * 2]; @@ -322,7 +398,7 @@ namespace Barotrauma.Lights int svCount = 0; while (svCount != shadowVertexCount * 2) { - Vector3 vertexPos = new Vector3(vertices[currentIndex], 0.0f); + Vector3 vertexPos = new Vector3(vertices[currentIndex].Pos, 0.0f); int i = los ? svCount : svCount + 1; int j = los ? svCount + 1 : svCount; @@ -336,14 +412,13 @@ namespace Barotrauma.Lights shadowVertices[j] = new VertexPositionColor(); shadowVertices[j].Color = shadowVertices[i].Color; - Vector3 L2P = vertexPos - new Vector3(lightSourcePos, 0); L2P.Normalize(); shadowVertices[j].Position = new Vector3(lightSourcePos, 0) + L2P * 9000; svCount += 2; - currentIndex = (currentIndex + 1) % primitiveCount; + currentIndex = (currentIndex + 1) % 4; } if (los) @@ -356,7 +431,7 @@ namespace Barotrauma.Lights { for (int n = 0; n < 4; n += 3) { - Vector3 penumbraStart = new Vector3((n == 0) ? vertices[startingIndex] : vertices[endingIndex], 0.0f); + Vector3 penumbraStart = new Vector3((n == 0) ? vertices[startingIndex].Pos : vertices[endingIndex].Pos, 0.0f); penumbraVertices[n] = new VertexPositionTexture(); penumbraVertices[n].Position = penumbraStart; diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index 0b64f0206..f37ed9fa9 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -162,7 +162,7 @@ namespace Barotrauma.Lights { ch.DrawShadows(graphics, cam, this, shadowTransform, false); } - } + } private List GetHullsInRange(Submarine sub) { @@ -239,17 +239,33 @@ namespace Barotrauma.Lights return chList.List; }*/ - private void CalculateFanVertices() + private List CalculateFanVertices() { - if (!CastShadows) return; - if (range < 1.0f || color.A < 0.01f) return; + if (!CastShadows) return null; + if (range < 1.0f || color.A < 0.01f) return null; var hulls = ConvexHull.GetHullsInRange(position, range, ParentSub); - //TODO: calculate fan based on hulls + List points = new List(); + foreach (ConvexHull hull in hulls) + { + hull.RefreshWorldPositions(); + points.AddRange(hull.GetVisibleSegments(position).Select(s => s.End)); + } + + Vector2 drawPos = position; + if (ParentSub != null) drawPos += ParentSub.DrawPosition; + + //sort points counter-clockwise + var compareCCW = new CompareSegmentPointCCW(drawPos); + points.Sort(compareCCW); + + //TODO: calculate triangles from points //http://www.redblobgames.com/articles/visibility/ //http://roy-t.nl/index.php/2014/02/27/2d-lighting-and-shadows-preview/ + + return points.Select(p => p.WorldPos).ToList(); } public void Draw(SpriteBatch spriteBatch) @@ -281,7 +297,14 @@ namespace Barotrauma.Lights if (LightSprite != null) { LightSprite.Draw(spriteBatch, drawPos, Color, LightSprite.Origin, -Rotation, 1, SpriteEffect); - } + } + + var verts = CalculateFanVertices(); + + foreach (var vert in verts) + { + GUI.DrawLine(spriteBatch, drawPos, new Vector2(vert.X, -vert.Y), Color.White); + } } public void FlipX() diff --git a/Subsurface/Source/Utils/MathUtils.cs b/Subsurface/Source/Utils/MathUtils.cs index ccdf61cc5..8215b79b9 100644 --- a/Subsurface/Source/Utils/MathUtils.cs +++ b/Subsurface/Source/Utils/MathUtils.cs @@ -276,15 +276,16 @@ namespace Barotrauma public static bool CircleIntersectsRectangle(Vector2 circlePos, float radius, Rectangle rect) { float xDist = Math.Abs(circlePos.X - rect.Center.X); + float yDist = Math.Abs(circlePos.Y - rect.Center.Y); + int halfWidth = rect.Width / 2; + int halfHeight = rect.Height / 2; if (xDist > (halfWidth + radius)) { return false; } - if (xDist <= (halfWidth)) { return true; } + if (yDist > (halfHeight + radius)) { return false; } - float yDist = Math.Abs(circlePos.Y - rect.Center.Y); - int halfHeight = rect.Height / 2; - if (yDist > (halfHeight + radius)) { return false; } + if (xDist <= (halfWidth)) { return true; } if (yDist <= (halfHeight)) { return true; } float distSqX = xDist - halfWidth; @@ -475,4 +476,18 @@ namespace Barotrauma return Math.Sign(d2 - d1); } } + + class CompareSegmentPointCCW : IComparer + { + private Vector2 center; + + public CompareSegmentPointCCW(Vector2 center) + { + this.center = center; + } + public int Compare(Lights.SegmentPoint a, Lights.SegmentPoint b) + { + return CompareCCW.Compare(a.WorldPos, b.WorldPos, center); + } + } } From f3f875e641e7ea0e470456b81a1c60c7ad9adb7a Mon Sep 17 00:00:00 2001 From: Regalis Date: Sun, 26 Feb 2017 18:44:18 +0200 Subject: [PATCH 10/44] Calculating light volumes works now. Very poorly optimized at the moment, todo: cache volumes and only recalculate when needed --- Subsurface/Source/Map/Lights/ConvexHull.cs | 47 +++-- Subsurface/Source/Map/Lights/LightManager.cs | 27 ++- Subsurface/Source/Map/Lights/LightSource.cs | 174 ++++++++++++++++--- Subsurface/Source/Utils/MathUtils.cs | 48 ++++- 4 files changed, 255 insertions(+), 41 deletions(-) diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs index 5a56766e4..7ac0d6c67 100644 --- a/Subsurface/Source/Map/Lights/ConvexHull.cs +++ b/Subsurface/Source/Map/Lights/ConvexHull.cs @@ -74,20 +74,30 @@ namespace Barotrauma.Lights { Start = start; End = end; + + start.Segment = this; + end.Segment = this; } } - class SegmentPoint + struct SegmentPoint { - public Vector2 Pos; - public Segment[] Segments; - + public Vector2 Pos; public Vector2 WorldPos; - public SegmentPoint(Vector2 pos, Segment[] segments) + public Segment Segment; + + public SegmentPoint(Vector2 pos) { Pos = pos; - Segments = segments; + WorldPos = pos; + + Segment = null; + } + + public override string ToString() + { + return Pos.ToString(); } } @@ -225,6 +235,9 @@ namespace Barotrauma.Lights { vertices[i].Pos += amount; losVertices[i].Pos += amount; + + segments[i].Start.Pos += amount; + segments[i].End.Pos += amount; } CalculateDimensions(); @@ -236,16 +249,16 @@ namespace Barotrauma.Lights for (int i = 0; i < 4; i++) { - vertices[i] = new SegmentPoint(points[i], new Segment[2]); - losVertices[i] = new SegmentPoint(points[i], new Segment[2]); + vertices[i] = new SegmentPoint(points[i]); + losVertices[i] = new SegmentPoint(points[i]); } for (int i = 0; i < 4; i++) { segments[i] = new Segment(vertices[i], vertices[(i + 1) % 4]); - vertices[i].Segments[1] = segments[i]; - vertices[(i + 1) % 4].Segments[0] = segments[i]; + //vertices[i].Segments[1] = segments[i]; + //vertices[(i + 1) % 4].Segments[0] = segments[i]; } @@ -315,15 +328,18 @@ namespace Barotrauma.Lights { if (ignoreEdge[i]) continue; - Vector2 middle = (segments[i].Start.Pos + segments[i].End.Pos) / 2; + Vector2 pos1 = vertices[i].WorldPos; + Vector2 pos2 = vertices[(i + 1) % 4].WorldPos; + + Vector2 middle = (pos1 + pos2) / 2; Vector2 L = viewPosition - middle; Vector2 N = new Vector2( - -(segments[i].End.Pos.Y - segments[i].Start.Pos.Y), - segments[i].End.Pos.X - segments[i].Start.Pos.X); + -(pos2.Y - pos1.Y), + pos2.X - pos1.X); - if (Vector2.Dot(N, L) < 0) + if (Vector2.Dot(N, L) > 0) { visibleFaces.Add(segments[i]); } @@ -339,6 +355,9 @@ namespace Barotrauma.Lights for (int i = 0; i < 4; i++) { vertices[i].WorldPos = vertices[i].Pos + parentEntity.Submarine.DrawPosition; + segments[i].Start.WorldPos = segments[i].Start.Pos + parentEntity.Submarine.DrawPosition; + segments[i].End.WorldPos = segments[i].End.Pos + parentEntity.Submarine.DrawPosition; + } } diff --git a/Subsurface/Source/Map/Lights/LightManager.cs b/Subsurface/Source/Map/Lights/LightManager.cs index 4040be2ab..21364e4f9 100644 --- a/Subsurface/Source/Map/Lights/LightManager.cs +++ b/Subsurface/Source/Map/Lights/LightManager.cs @@ -25,6 +25,8 @@ namespace Barotrauma.Lights public Color AmbientLight; RenderTarget2D lightMap, losTexture; + + BasicEffect lightEffect; private static Texture2D alphaClearTexture; @@ -60,6 +62,15 @@ namespace Barotrauma.Lights losTexture = new RenderTarget2D(graphics, GameMain.GraphicsWidth, GameMain.GraphicsHeight); + if (lightEffect == null) + { + lightEffect = new BasicEffect(GameMain.CurrGraphicsDevice); + lightEffect.VertexColorEnabled = false; + + lightEffect.TextureEnabled = true; + lightEffect.Texture = LightSource.LightTexture; + } + hullAmbientLights = new Dictionary(); smoothedHullAmbientLights = new Dictionary(); @@ -132,16 +143,23 @@ namespace Barotrauma.Lights //clear to some small ambient light graphics.Clear(AmbientLight); + graphics.BlendState = BlendState.Additive; spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Additive, null, null, null, null, cam.Transform); + + Matrix transform = cam.ShaderTransform + * Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f; + Vector3 offset = Vector3.Zero;// new Vector3(Submarine.MainSub.DrawPosition.X, Submarine.MainSub.DrawPosition.Y, 0.0f); + + lightEffect.World = Matrix.CreateTranslation(offset) * transform; + foreach (LightSource light in lights) { if (light.Color.A < 1 || light.Range < 1.0f || !light.CastShadows) continue; if (!MathUtils.CircleIntersectsRectangle(light.WorldPosition, light.Range, viewRect)) continue; - light.Draw(spriteBatch); - + light.Draw(spriteBatch, lightEffect); } GameMain.ParticleManager.Draw(spriteBatch, false, Particles.ParticleBlendState.Additive); @@ -178,9 +196,10 @@ namespace Barotrauma.Lights spriteBatch.End(); //clear alpha, to avoid messing stuff up later - ClearAlphaToOne(graphics, spriteBatch); - + //ClearAlphaToOne(graphics, spriteBatch); + graphics.SetRenderTarget(null); + graphics.BlendState = BlendState.AlphaBlend; } public void UpdateObstructVision(GraphicsDevice graphics, SpriteBatch spriteBatch, Camera cam, Vector2 lookAtPosition) diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index f37ed9fa9..cd303ff82 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -239,43 +239,156 @@ namespace Barotrauma.Lights return chList.List; }*/ - private List CalculateFanVertices() + private List FindRaycastHits() { if (!CastShadows) return null; if (range < 1.0f || color.A < 0.01f) return null; + Vector2 drawPos = position; + if (ParentSub != null) drawPos += ParentSub.DrawPosition; + var hulls = ConvexHull.GetHullsInRange(position, range, ParentSub); - + + //find convexhull segments that are close enough and facing towards the light source + List visibleSegments = new List(); List points = new List(); foreach (ConvexHull hull in hulls) { hull.RefreshWorldPositions(); - points.AddRange(hull.GetVisibleSegments(position).Select(s => s.End)); + + var visibleHullSegments = hull.GetVisibleSegments(drawPos); + visibleSegments.AddRange(visibleHullSegments); + + foreach (Segment s in visibleHullSegments) + { + points.Add(s.Start); + points.Add(s.End); + } } + //add a square-shaped boundary to make sure we've got something to construct the triangles from + //even if there aren't enough hull segments around the light source + + //(might be more effective to calculate if we actually need these extra points) + var boundaryCorners = new List { + new SegmentPoint(new Vector2(drawPos.X + range*2, drawPos.Y + range*2)), + new SegmentPoint(new Vector2(drawPos.X + range*2, drawPos.Y - range*2)), + new SegmentPoint(new Vector2(drawPos.X - range*2, drawPos.Y - range*2)), + new SegmentPoint(new Vector2(drawPos.X - range*2, drawPos.Y + range*2)) + }; + + points.AddRange(boundaryCorners); + + var compareCCW = new CompareSegmentPointCW(drawPos); + points.Sort(compareCCW); + + List output = new List(); + + //remove points that are very close to each other + for (int i = 0; i < points.Count - 1; i++) + { + if (Math.Abs(points[i].WorldPos.X - points[i + 1].WorldPos.X) < 3 && + Math.Abs(points[i].WorldPos.Y - points[i + 1].WorldPos.Y) < 3) + { + points.RemoveAt(i + 1); + } + } + + foreach (SegmentPoint p in points) + { + Vector2 dir = Vector2.Normalize(p.WorldPos - drawPos); + Vector2 dirNormal = new Vector2(-dir.Y, dir.X)*3; + + //do two slightly offset raycasts to hit the segment itself and whatever's behind it + Vector2 intersection1 = RayCast(drawPos, drawPos + dir * range * 2 - dirNormal, visibleSegments); + Vector2 intersection2 = RayCast(drawPos, drawPos + dir * range * 2 + dirNormal, visibleSegments); + + //hit almost the same position -> only add one vertex to output + if ((Math.Abs(intersection1.X - intersection2.X) < 5 && + Math.Abs(intersection1.Y - intersection2.Y) < 5)) + { + output.Add(intersection1); + } + else + { + output.Add(intersection1); + output.Add(intersection2); + } + } + + return output; + } + + private Vector2 RayCast(Vector2 rayStart, Vector2 rayEnd, List segments) + { + float closestDist = 0.0f; + Vector2? closestIntersection = null; + + foreach (Segment s in segments) + { + Vector2? intersection = MathUtils.GetAxisAlignedLineIntersection(rayStart, rayEnd, s.Start.WorldPos, s.End.WorldPos); + + if (intersection != null) + { + float dist = Vector2.Distance((Vector2)intersection, rayStart); + if (closestIntersection == null || dist < closestDist) + { + closestDist = dist; + closestIntersection = intersection; + } + } + } + + return closestIntersection == null ? rayEnd : (Vector2)closestIntersection; + } + + private void CalculateVertices(List encounters, + out VertexPositionTexture[] vertexArray, out short[] indexArray) + { + List vertices = new List(); + Vector2 drawPos = position; if (ParentSub != null) drawPos += ParentSub.DrawPosition; - //sort points counter-clockwise - var compareCCW = new CompareSegmentPointCCW(drawPos); - points.Sort(compareCCW); + // Add a vertex for the center of the mesh + vertices.Add(new VertexPositionTexture(new Vector3(drawPos.X, drawPos.Y, 0), + new Vector2(0.5f, 0.5f))); - //TODO: calculate triangles from points - - //http://www.redblobgames.com/articles/visibility/ - //http://roy-t.nl/index.php/2014/02/27/2d-lighting-and-shadows-preview/ + // Add all the other encounter points as vertices + // storing their world position as UV coordinates + foreach (Vector2 vertex in encounters) + { + Vector2 diff = vertex - drawPos; - return points.Select(p => p.WorldPos).ToList(); - } - - public void Draw(SpriteBatch spriteBatch) + vertices.Add(new VertexPositionTexture(new Vector3(vertex.X, vertex.Y, 0), + new Vector2(0.5f, 0.5f) + diff / range / 2)); + } + + // Compute the indices to form triangles + List indices = new List(); + for (int i = 0; i < encounters.Count - 1; i++) + { + indices.Add(0); + indices.Add((short)((i + 2) % vertices.Count)); + indices.Add((short)((i + 1) % vertices.Count)); + } + + indices.Add(0); + indices.Add((short)(1)); + indices.Add((short)(vertices.Count - 1)); + + vertexArray = vertices.ToArray(); + indexArray = indices.ToArray(); + } + + public void Draw(SpriteBatch spriteBatch, BasicEffect lightEffect) { Vector2 drawPos = position; if (ParentSub != null) drawPos += ParentSub.DrawPosition; drawPos.Y = -drawPos.Y; - if (range > 1.0f) + if (range > 1.0f && false) { if (overrideLightTexture == null) { @@ -296,15 +409,36 @@ namespace Barotrauma.Lights if (LightSprite != null) { - LightSprite.Draw(spriteBatch, drawPos, Color, LightSprite.Origin, -Rotation, 1, SpriteEffect); + //LightSprite.Draw(spriteBatch, drawPos, Color, LightSprite.Origin, -Rotation, 1, SpriteEffect); } - var verts = CalculateFanVertices(); + var verts = FindRaycastHits(); - foreach (var vert in verts) + /*for (int i = 0; i < verts.Count; i++) { - GUI.DrawLine(spriteBatch, drawPos, new Vector2(vert.X, -vert.Y), Color.White); - } + Color[] clrs = new Color[] { Color.Green, Color.Cyan, Color.Red, Color.White, Color.Magenta }; + + Color clr = clrs[i % clrs.Length]; + + // GUI.DrawString(spriteBatch, new Vector2(verts[i].X, -verts[i].Y), verts[i].ToString(), clr); + GUI.DrawString(spriteBatch, new Vector2(verts[i].X, -verts[i].Y), i.ToString(), clr); + GUI.DrawLine(spriteBatch, drawPos, new Vector2(verts[i].X, -verts[i].Y), clr, 0,3); + }*/ + + // Generate a triangle list from the encounter points + VertexPositionTexture[] vertices; + short[] indices; + CalculateVertices(verts, out vertices, out indices); + + if (vertices.Length == 0) return; + + lightEffect.DiffuseColor = (new Vector3(color.R, color.G, color.B) * (color.A / 255.0f)) / 255.0f;// color.ToVector3(); + lightEffect.CurrentTechnique.Passes[0].Apply(); + + GameMain.CurrGraphicsDevice.DrawUserIndexedPrimitives + ( + PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, indices.Length / 3 + ); } public void FlipX() diff --git a/Subsurface/Source/Utils/MathUtils.cs b/Subsurface/Source/Utils/MathUtils.cs index 8215b79b9..279fc3088 100644 --- a/Subsurface/Source/Utils/MathUtils.cs +++ b/Subsurface/Source/Utils/MathUtils.cs @@ -208,6 +208,48 @@ namespace Barotrauma return a1 + t * b; } + /// + /// Get the point where line segment (a1, a2) intersects the axis-aligned line segment (axisAligned1, axisAligned2) + /// + public static Vector2? GetAxisAlignedLineIntersection(Vector2 a1, Vector2 a2, Vector2 axisAligned1, Vector2 axisAligned2) + { + if (Math.Abs(axisAligned1.X - axisAligned2.X) < 1.0f) + { + if (Math.Sign(a1.X - axisAligned1.X) == Math.Sign(a2.X - axisAligned1.X)) + return null; + + if (Math.Max(a1.Y, a2.Y) < Math.Min(axisAligned1.Y, axisAligned2.Y)) + return null; + + if (Math.Min(a1.Y, a2.Y) > Math.Max(axisAligned1.Y, axisAligned2.Y)) + return null; + } + else + { + if (Math.Sign(a1.Y - axisAligned1.Y) == Math.Sign(a2.Y - axisAligned1.Y)) + return null; + + if (Math.Max(a1.X, a2.X) < Math.Min(axisAligned1.X, axisAligned2.X)) + return null; + + if (Math.Min(a1.X, a2.X) > Math.Max(axisAligned1.X, axisAligned2.X)) + return null; + } + + Vector2 b = a2 - a1; + Vector2 d = axisAligned2 - axisAligned1; + float bDotDPerp = b.X * d.Y - b.Y * d.X; + + Vector2 c = axisAligned1 - a1; + float t = (c.X * d.Y - c.Y * d.X) / bDotDPerp; + if (t < 0 || t > 1) return null; + + float u = (c.X * b.Y - c.Y * b.X) / bDotDPerp; + if (u < 0 || u > 1) return null; + + return a1 + t * b; + } + public static Vector2? GetLineRectangleIntersection(Vector2 a1, Vector2 a2, Rectangle rect) { Vector2? intersection = GetLineIntersection(a1, a2, @@ -477,17 +519,17 @@ namespace Barotrauma } } - class CompareSegmentPointCCW : IComparer + class CompareSegmentPointCW : IComparer { private Vector2 center; - public CompareSegmentPointCCW(Vector2 center) + public CompareSegmentPointCW(Vector2 center) { this.center = center; } public int Compare(Lights.SegmentPoint a, Lights.SegmentPoint b) { - return CompareCCW.Compare(a.WorldPos, b.WorldPos, center); + return -CompareCCW.Compare(a.WorldPos, b.WorldPos, center); } } } From 68a0320935f5c899188b3c92bc3e1bc5d75b9db8 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 27 Feb 2017 00:41:40 +0200 Subject: [PATCH 11/44] LightSources cache the light vertices in vertex buffers and only recalculate if needed --- Subsurface/Source/GameMain.cs | 12 +- Subsurface/Source/Map/Lights/ConvexHull.cs | 55 +++- Subsurface/Source/Map/Lights/LightManager.cs | 9 +- Subsurface/Source/Map/Lights/LightSource.cs | 324 ++++++++++++------- 4 files changed, 263 insertions(+), 137 deletions(-) diff --git a/Subsurface/Source/GameMain.cs b/Subsurface/Source/GameMain.cs index fb6ac0329..e8c171971 100644 --- a/Subsurface/Source/GameMain.cs +++ b/Subsurface/Source/GameMain.cs @@ -103,6 +103,15 @@ namespace Barotrauma { get { return NetworkMember as GameClient; } } + + /// + /// Total seconds elapsed after startup + /// + public double TotalElapsedTime + { + get; + private set; + } public GameMain() { @@ -297,11 +306,12 @@ namespace Barotrauma protected override void Update(GameTime gameTime) { Timing.Accumulator += gameTime.ElapsedGameTime.TotalSeconds; - bool paused = true; while (Timing.Accumulator >= Timing.Step) { + TotalElapsedTime = gameTime.TotalGameTime.TotalSeconds; + fixedTime.IsRunningSlowly = gameTime.IsRunningSlowly; TimeSpan addTime = new TimeSpan(0, 0, 0, 0, 16); fixedTime.ElapsedGameTime = addTime; diff --git a/Subsurface/Source/Map/Lights/ConvexHull.cs b/Subsurface/Source/Map/Lights/ConvexHull.cs index 7ac0d6c67..2740c7693 100644 --- a/Subsurface/Source/Map/Lights/ConvexHull.cs +++ b/Subsurface/Source/Map/Lights/ConvexHull.cs @@ -110,7 +110,7 @@ namespace Barotrauma.Lights //private Dictionary cachedShadows; public VertexBuffer ShadowBuffer; - + Segment[] segments = new Segment[4]; SegmentPoint[] vertices = new SegmentPoint[4]; SegmentPoint[] losVertices = new SegmentPoint[4]; @@ -136,10 +136,28 @@ namespace Barotrauma.Lights } + private bool enabled; public bool Enabled + { + get + { + return enabled; + } + set + { + if (enabled == value) return; + enabled = value; + LastVertexChangeTime = (float)GameMain.Instance.TotalElapsedTime; + } + } + + /// + /// The elapsed gametime when the vertices of this hull last changed + /// + public float LastVertexChangeTime { get; - set; + private set; } public Rectangle BoundingBox @@ -197,6 +215,8 @@ namespace Barotrauma.Lights private void UpdateIgnoredEdges(ConvexHull ch) { + if (ch == this) return; + //ignore edges that are inside some other convex hull for (int i = 0; i < vertices.Length; i++) { if (vertices[i].Pos.X >= ch.boundingBox.X && vertices[i].Pos.X <= ch.boundingBox.Right && @@ -233,13 +253,15 @@ namespace Barotrauma.Lights { for (int i = 0; i < vertices.Length; i++) { - vertices[i].Pos += amount; - losVertices[i].Pos += amount; + vertices[i].Pos += amount; + losVertices[i].Pos += amount; - segments[i].Start.Pos += amount; - segments[i].End.Pos += amount; + segments[i].Start.Pos += amount; + segments[i].End.Pos += amount; } + LastVertexChangeTime = (float)GameMain.Instance.TotalElapsedTime; + CalculateDimensions(); } @@ -247,6 +269,8 @@ namespace Barotrauma.Lights { Debug.Assert(points.Length == 4, "Only rectangular convex hulls are supported"); + LastVertexChangeTime = (float)GameMain.Instance.TotalElapsedTime; + for (int i = 0; i < 4; i++) { vertices[i] = new SegmentPoint(points[i]); @@ -256,10 +280,6 @@ namespace Barotrauma.Lights for (int i = 0; i < 4; i++) { segments[i] = new Segment(vertices[i], vertices[(i + 1) % 4]); - - //vertices[i].Segments[1] = segments[i]; - //vertices[(i + 1) % 4].Segments[0] = segments[i]; - } int margin = 0; @@ -280,6 +300,21 @@ namespace Barotrauma.Lights } CalculateDimensions(); + + if (parentEntity == null || ignoreEdge == null) return; + for (int i = 0; i<4; i++) + { + ignoreEdge[i] = false; + } + + var chList = HullLists.Find(x => x.Submarine == parentEntity.Submarine); + if (chList != null) + { + foreach (ConvexHull ch in chList.List) + { + UpdateIgnoredEdges(ch); + } + } } /*private void RemoveCachedShadow(Lights.LightSource light) diff --git a/Subsurface/Source/Map/Lights/LightManager.cs b/Subsurface/Source/Map/Lights/LightManager.cs index 21364e4f9..b1ae2f9f9 100644 --- a/Subsurface/Source/Map/Lights/LightManager.cs +++ b/Subsurface/Source/Map/Lights/LightManager.cs @@ -94,7 +94,8 @@ namespace Barotrauma.Lights { foreach (LightSource light in lights) { - light.NeedsHullUpdate = true; + light.NeedsHullCheck = true; + light.NeedsRecalculation = true; } } @@ -152,16 +153,16 @@ namespace Barotrauma.Lights Vector3 offset = Vector3.Zero;// new Vector3(Submarine.MainSub.DrawPosition.X, Submarine.MainSub.DrawPosition.Y, 0.0f); - lightEffect.World = Matrix.CreateTranslation(offset) * transform; - foreach (LightSource light in lights) { if (light.Color.A < 1 || light.Range < 1.0f || !light.CastShadows) continue; if (!MathUtils.CircleIntersectsRectangle(light.WorldPosition, light.Range, viewRect)) continue; - light.Draw(spriteBatch, lightEffect); + light.Draw(spriteBatch, lightEffect, transform); } + lightEffect.World = Matrix.CreateTranslation(offset) * transform; + GameMain.ParticleManager.Draw(spriteBatch, false, Particles.ParticleBlendState.Additive); if (Character.Controlled != null) diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index cd303ff82..4368b05f3 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -15,27 +15,35 @@ namespace Barotrauma.Lights private List hullsInRange; private Color color; - private float range; - - public SpriteEffects SpriteEffect = SpriteEffects.None; - + + private Sprite overrideLightTexture; private Texture2D texture; + public SpriteEffects SpriteEffect = SpriteEffects.None; public Sprite LightSprite; - private Sprite overrideLightTexture; - public Submarine ParentSub; public bool CastShadows; - //what was the range of the light when HullsInRange were last updated - private float prevHullUpdateRange; + //what was the range of the light when lightvolumes were last calculated + private float prevCalculatedRange; + private Vector2 prevCalculatedPosition; - private Vector2 prevHullUpdatePosition; + //do we need to recheck which convex hulls are within range + //(e.g. position or range of the lightsource has changed) + public bool NeedsHullCheck = true; + //do we need to recalculate the vertices of the light volume + public bool NeedsRecalculation = true; - public bool NeedsHullUpdate; + //when were the vertices of the light volume last calculated + private float lastRecalculationTime; + + private DynamicVertexBuffer lightVolumeBuffer; + private DynamicIndexBuffer lightVolumeIndexBuffer; + private int vertexCount; + private int indexCount; private Vector2 position; public Vector2 Position @@ -46,10 +54,11 @@ namespace Barotrauma.Lights if (position == value) return; position = value; - if (Vector2.Distance(prevHullUpdatePosition, position) < 5.0f) return; + if (Vector2.Distance(prevCalculatedPosition, position) < 5.0f) return; - NeedsHullUpdate = true; - prevHullUpdatePosition = position; + NeedsHullCheck = true; + NeedsRecalculation = true; + prevCalculatedPosition = position; } } @@ -90,10 +99,11 @@ namespace Barotrauma.Lights { range = MathHelper.Clamp(value, 0.0f, 2048.0f); - if (Math.Abs(prevHullUpdateRange - range) < 10.0f) return; + if (Math.Abs(prevCalculatedRange - range) < 10.0f) return; - NeedsHullUpdate = true; - prevHullUpdateRange = range; + NeedsHullCheck = true; + NeedsRecalculation = true; + prevCalculatedRange = range; } } @@ -130,9 +140,9 @@ namespace Barotrauma.Lights this.color = color; CastShadows = true; - + texture = LightTexture; - + GameMain.LightManager.AddLight(this); } @@ -162,82 +172,112 @@ namespace Barotrauma.Lights { ch.DrawShadows(graphics, cam, this, shadowTransform, false); } - } - - private List GetHullsInRange(Submarine sub) - { - //find the current list of hulls in range - var chList = hullsInRange.Find(x => x.Submarine == sub); - - //not found -> create one - if (chList == null) - { - chList = new ConvexHullList(sub); - hullsInRange.Add(chList); - } - - Vector2 lightPos = position; - if (ParentSub == null) - { - //light and the convexhull are both outside - if (sub == null) - { - if (NeedsHullUpdate) - { - var fullChList = ConvexHull.HullLists.Find(x => x.Submarine == sub); - if (fullChList != null) - chList.List = fullChList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox)); - } - } - //light is outside, convexhull inside a sub - else - { - lightPos -= sub.Position; - - Rectangle subBorders = sub.Borders; - subBorders.Location += sub.HiddenSubPosition.ToPoint() - new Point(0, sub.Borders.Height); - - //only draw if the light overlaps with the sub - if (!MathUtils.CircleIntersectsRectangle(lightPos, range, subBorders)) return null; - - var fullChList = ConvexHull.HullLists.Find(x => x.Submarine == sub); - chList.List = fullChList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox)); - } - } - else - { - //light is inside, convexhull outside - if (sub == null) return null; - - //light and convexhull are both inside the same sub - if (sub == ParentSub) - { - if (NeedsHullUpdate) - { - var fullChList = ConvexHull.HullLists.Find(x => x.Submarine == sub); - chList.List = fullChList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox)); - } - } - //light and convexhull are inside different subs - else - { - if (sub.DockedTo.Contains(ParentSub) && !NeedsHullUpdate) return chList.List; - - lightPos -= (sub.Position - ParentSub.Position); - - Rectangle subBorders = sub.Borders; - subBorders.Location += sub.HiddenSubPosition.ToPoint() - new Point(0, sub.Borders.Height); - - //only draw if the light overlaps with the sub - if (!MathUtils.CircleIntersectsRectangle(lightPos, range, subBorders)) return null; - - var fullChList = ConvexHull.HullLists.Find(x => x.Submarine == sub); - chList.List = fullChList.List.FindAll(ch => MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox)); - } - } - - return chList.List; }*/ + + /// + /// Update the contents of ConvexHullList and check if we need to recalculate vertices + /// + private void RefreshConvexHullList(ConvexHullList chList, Vector2 lightPos, Submarine sub) + { + var fullChList = ConvexHull.HullLists.Find(x => x.Submarine == sub); + chList.List = fullChList.List.FindAll(ch => ch.Enabled && MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox)); + + NeedsHullCheck = true; + } + + /// + /// Recheck which convex hulls are in range (if needed), + /// and check if we need to recalculate vertices due to changes in the convex hulls + /// + private void CheckHullsInRange() + { + List subs = new List(Submarine.Loaded); + subs.Add(null); + + foreach (Submarine sub in subs) + { + //find the list of convexhulls that belong to the sub + var chList = hullsInRange.Find(x => x.Submarine == sub); + + //not found -> create one + if (chList == null) + { + chList = new ConvexHullList(sub); + hullsInRange.Add(chList); + NeedsRecalculation = true; + } + + if (chList.List.Any(ch => ch.LastVertexChangeTime > lastRecalculationTime)) + { + NeedsRecalculation = true; + } + + Vector2 lightPos = position; + if (ParentSub == null) + { + //light and the convexhulls are both outside + if (sub == null) + { + if (NeedsHullCheck) + { + RefreshConvexHullList(chList, lightPos, null); + } + } + //light is outside, convexhulls inside a sub + else + { + lightPos -= sub.Position; + + Rectangle subBorders = sub.Borders; + subBorders.Location += sub.HiddenSubPosition.ToPoint() - new Point(0, sub.Borders.Height); + + //only draw if the light overlaps with the sub + if (!MathUtils.CircleIntersectsRectangle(lightPos, range, subBorders)) + { + if (chList.List.Count > 0) NeedsRecalculation = true; + chList.List.Clear(); + continue; + } + + RefreshConvexHullList(chList, lightPos, sub); + } + } + else + { + //light is inside, convexhull outside + if (sub == null) continue; + + //light and convexhull are both inside the same sub + if (sub == ParentSub) + { + if (NeedsHullCheck) + { + RefreshConvexHullList(chList, lightPos, sub); + } + } + //light and convexhull are inside different subs + else + { + if (sub.DockedTo.Contains(ParentSub) && !NeedsHullCheck) continue; + + lightPos -= (sub.Position - ParentSub.Position); + + Rectangle subBorders = sub.Borders; + subBorders.Location += sub.HiddenSubPosition.ToPoint() - new Point(0, sub.Borders.Height); + + //only draw if the light overlaps with the sub + if (!MathUtils.CircleIntersectsRectangle(lightPos, range, subBorders)) + { + if (chList.List.Count > 0) NeedsRecalculation = true; + chList.List.Clear(); + continue; + } + + RefreshConvexHullList(chList, lightPos, sub); + } + } + } + } private List FindRaycastHits() { @@ -247,7 +287,11 @@ namespace Barotrauma.Lights Vector2 drawPos = position; if (ParentSub != null) drawPos += ParentSub.DrawPosition; - var hulls = ConvexHull.GetHullsInRange(position, range, ParentSub); + var hulls = new List();// ConvexHull.GetHullsInRange(position, range, ParentSub); + foreach (ConvexHullList chList in hullsInRange) + { + hulls.AddRange(chList.List); + } //find convexhull segments that are close enough and facing towards the light source List visibleSegments = new List(); @@ -256,6 +300,11 @@ namespace Barotrauma.Lights { hull.RefreshWorldPositions(); + if (hull.ParentEntity is Item) + { + int gfhdfgh = 1; + } + var visibleHullSegments = hull.GetVisibleSegments(drawPos); visibleSegments.AddRange(visibleHullSegments); @@ -342,8 +391,7 @@ namespace Barotrauma.Lights return closestIntersection == null ? rayEnd : (Vector2)closestIntersection; } - private void CalculateVertices(List encounters, - out VertexPositionTexture[] vertexArray, out short[] indexArray) + private void CalculateLightVertices(List rayCastHits) { List vertices = new List(); @@ -351,22 +399,22 @@ namespace Barotrauma.Lights if (ParentSub != null) drawPos += ParentSub.DrawPosition; // Add a vertex for the center of the mesh - vertices.Add(new VertexPositionTexture(new Vector3(drawPos.X, drawPos.Y, 0), + vertices.Add(new VertexPositionTexture(new Vector3(position.X, position.Y, 0), new Vector2(0.5f, 0.5f))); // Add all the other encounter points as vertices // storing their world position as UV coordinates - foreach (Vector2 vertex in encounters) + foreach (Vector2 vertex in rayCastHits) { Vector2 diff = vertex - drawPos; - vertices.Add(new VertexPositionTexture(new Vector3(vertex.X, vertex.Y, 0), + vertices.Add(new VertexPositionTexture(new Vector3(position.X + diff.X, position.Y + diff.Y, 0), new Vector2(0.5f, 0.5f) + diff / range / 2)); } // Compute the indices to form triangles List indices = new List(); - for (int i = 0; i < encounters.Count - 1; i++) + for (int i = 0; i < rayCastHits.Count - 1; i++) { indices.Add(0); indices.Add((short)((i + 2) % vertices.Count)); @@ -377,12 +425,38 @@ namespace Barotrauma.Lights indices.Add((short)(1)); indices.Add((short)(vertices.Count - 1)); - vertexArray = vertices.ToArray(); - indexArray = indices.ToArray(); + vertexCount = vertices.Count; + indexCount = indices.Count; + + //TODO: a better way to determine the size of the vertex buffer and handle changes in size? + //now we just create a buffer for 64 verts and make it larger if needed + if (lightVolumeBuffer == null) + { + lightVolumeBuffer = new DynamicVertexBuffer(GameMain.CurrGraphicsDevice, VertexPositionTexture.VertexDeclaration, Math.Max(64, (int)(vertexCount*1.5)), BufferUsage.None); + lightVolumeIndexBuffer = new DynamicIndexBuffer(GameMain.CurrGraphicsDevice, typeof(short), Math.Max(64*3, (int)(indexCount * 1.5)), BufferUsage.None); + } + else if (vertexCount > lightVolumeBuffer.VertexCount) + { + lightVolumeBuffer.Dispose(); + lightVolumeIndexBuffer.Dispose(); + + lightVolumeBuffer = new DynamicVertexBuffer(GameMain.CurrGraphicsDevice, VertexPositionTexture.VertexDeclaration, (int)(vertexCount*1.5), BufferUsage.None); + lightVolumeIndexBuffer = new DynamicIndexBuffer(GameMain.CurrGraphicsDevice, typeof(short), (int)(indexCount * 1.5), BufferUsage.None); + } + + lightVolumeBuffer.SetData(vertices.ToArray()); + lightVolumeIndexBuffer.SetData(indices.ToArray()); } - public void Draw(SpriteBatch spriteBatch, BasicEffect lightEffect) + public void Draw(SpriteBatch spriteBatch, BasicEffect lightEffect, Matrix transform) { + CheckHullsInRange(); + + Vector3 offset = ParentSub == null ? Vector3.Zero : + new Vector3(ParentSub.DrawPosition.X, ParentSub.DrawPosition.Y, 0.0f); + + lightEffect.World = Matrix.CreateTranslation(offset) * transform; + Vector2 drawPos = position; if (ParentSub != null) drawPos += ParentSub.DrawPosition; @@ -412,32 +486,26 @@ namespace Barotrauma.Lights //LightSprite.Draw(spriteBatch, drawPos, Color, LightSprite.Origin, -Rotation, 1, SpriteEffect); } - var verts = FindRaycastHits(); - - /*for (int i = 0; i < verts.Count; i++) + if (NeedsRecalculation) { - Color[] clrs = new Color[] { Color.Green, Color.Cyan, Color.Red, Color.White, Color.Magenta }; + var verts = FindRaycastHits(); + CalculateLightVertices(verts); - Color clr = clrs[i % clrs.Length]; - - // GUI.DrawString(spriteBatch, new Vector2(verts[i].X, -verts[i].Y), verts[i].ToString(), clr); - GUI.DrawString(spriteBatch, new Vector2(verts[i].X, -verts[i].Y), i.ToString(), clr); - GUI.DrawLine(spriteBatch, drawPos, new Vector2(verts[i].X, -verts[i].Y), clr, 0,3); - }*/ - - // Generate a triangle list from the encounter points - VertexPositionTexture[] vertices; - short[] indices; - CalculateVertices(verts, out vertices, out indices); + lastRecalculationTime = (float)GameMain.Instance.TotalElapsedTime; + NeedsRecalculation = false; + } - if (vertices.Length == 0) return; + if (vertexCount == 0) return; lightEffect.DiffuseColor = (new Vector3(color.R, color.G, color.B) * (color.A / 255.0f)) / 255.0f;// color.ToVector3(); lightEffect.CurrentTechnique.Passes[0].Apply(); - - GameMain.CurrGraphicsDevice.DrawUserIndexedPrimitives + + GameMain.CurrGraphicsDevice.SetVertexBuffer(lightVolumeBuffer); + GameMain.CurrGraphicsDevice.Indices = lightVolumeIndexBuffer; + + GameMain.CurrGraphicsDevice.DrawIndexedPrimitives ( - PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, indices.Length / 3 + PrimitiveType.TriangleList, 0, 0, indexCount / 3 ); } @@ -463,6 +531,18 @@ namespace Barotrauma.Lights { if (LightSprite != null) LightSprite.Remove(); + if (lightVolumeBuffer != null) + { + lightVolumeBuffer.Dispose(); + lightVolumeBuffer = null; + } + + if (lightVolumeIndexBuffer != null) + { + lightVolumeIndexBuffer.Dispose(); + lightVolumeIndexBuffer = null; + } + GameMain.LightManager.RemoveLight(this); } } From 22d40077fa858268f858240a1a61d2689d085188 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 27 Feb 2017 18:53:34 +0200 Subject: [PATCH 12/44] Fixed exception in LightSource if ConvexHullList for hulls outside the sub hasn't been generated (i.e. if switching to game mode using console commands), removed some debug code --- Subsurface/Source/Map/Lights/LightSource.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index 4368b05f3..f5b80f5f1 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -180,6 +180,8 @@ namespace Barotrauma.Lights private void RefreshConvexHullList(ConvexHullList chList, Vector2 lightPos, Submarine sub) { var fullChList = ConvexHull.HullLists.Find(x => x.Submarine == sub); + if (fullChList == null) return; + chList.List = fullChList.List.FindAll(ch => ch.Enabled && MathUtils.CircleIntersectsRectangle(lightPos, range, ch.BoundingBox)); NeedsHullCheck = true; @@ -299,12 +301,7 @@ namespace Barotrauma.Lights foreach (ConvexHull hull in hulls) { hull.RefreshWorldPositions(); - - if (hull.ParentEntity is Item) - { - int gfhdfgh = 1; - } - + var visibleHullSegments = hull.GetVisibleSegments(drawPos); visibleSegments.AddRange(visibleHullSegments); From c3b8f2a1dbc29e4a80d38aa90698ebdacc9ce0ad Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 27 Feb 2017 19:02:33 +0200 Subject: [PATCH 13/44] Fixed OpenAL errors when removing looping sounds The sounds didn't save their source id in the Sound.Loop method, so they couldn't stop the playback upon removal which caused errors when unbinding and deleting the (still playing) sound buffer --- Subsurface/Source/Sounds/Sound.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Subsurface/Source/Sounds/Sound.cs b/Subsurface/Source/Sounds/Sound.cs index a334f59b4..9ce6c8079 100644 --- a/Subsurface/Source/Sounds/Sound.cs +++ b/Subsurface/Source/Sounds/Sound.cs @@ -198,8 +198,8 @@ namespace Barotrauma return sourceIndex; } - return SoundManager.Loop(this, sourceIndex, relativePos/100.0f, volume); - + alSourceId = SoundManager.Loop(this, sourceIndex, relativePos / 100.0f, volume); + return alSourceId; } public bool IsPlaying From b635a61bb45fc6d0d72254c78f42d46142222e12 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 27 Feb 2017 19:59:19 +0200 Subject: [PATCH 14/44] Editor UI fixes: UI of the selected item is added to GUIUpdateList in wiring/character mode, save/load/item menus can't be clicked when hidden by wiring/character mode --- Subsurface/Source/Screens/EditMapScreen.cs | 42 +++++++++++++++------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/Subsurface/Source/Screens/EditMapScreen.cs b/Subsurface/Source/Screens/EditMapScreen.cs index 6929e2ae7..7a891a3cc 100644 --- a/Subsurface/Source/Screens/EditMapScreen.cs +++ b/Subsurface/Source/Screens/EditMapScreen.cs @@ -418,6 +418,9 @@ namespace Barotrauma private void CreateSaveScreen() { + if (characterMode) ToggleCharacterMode(); + if (wiringMode) ToggleWiringMode(); + int width = 400, height = 400; int y = 0; @@ -502,6 +505,9 @@ namespace Barotrauma private bool CreateLoadScreen(GUIButton button, object obj) { + if (characterMode) ToggleCharacterMode(); + if (wiringMode) ToggleWiringMode(); + Submarine.RefreshSavedSubs(); int width = 300, height = 400; @@ -596,10 +602,14 @@ namespace Barotrauma private bool SelectTab(GUIButton button, object obj) { + if (characterMode) ToggleCharacterMode(); + if (wiringMode) ToggleWiringMode(); + selectedTab = (int)obj; var searchBox = GUItabs[selectedTab].GetChild(); ClearFilter(searchBox, null); + searchBox.Text = ""; searchBox.AddToGUIUpdateList(); searchBox.Select(); @@ -899,22 +909,28 @@ namespace Barotrauma wiringToolPanel.AddToGUIUpdateList(); } - if (loadFrame != null) - { - loadFrame.AddToGUIUpdateList(); - } - else if (saveFrame != null) - { - saveFrame.AddToGUIUpdateList(); - } - else if (selectedTab > -1) - { - GUItabs[selectedTab].AddToGUIUpdateList(); - } - if ((characterMode || wiringMode) && dummyCharacter != null) { CharacterHUD.AddToGUIUpdateList(dummyCharacter); + if (dummyCharacter.SelectedConstruction != null) + { + dummyCharacter.SelectedConstruction.AddToGUIUpdateList(); + } + } + else + { + if (loadFrame != null) + { + loadFrame.AddToGUIUpdateList(); + } + else if (saveFrame != null) + { + saveFrame.AddToGUIUpdateList(); + } + else if (selectedTab > -1) + { + GUItabs[selectedTab].AddToGUIUpdateList(); + } } GUI.AddToGUIUpdateList(); From f8304ceb7eb36c70a7cc19db261430a6321ab6f9 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 27 Feb 2017 20:55:23 +0200 Subject: [PATCH 15/44] Workaround for exceptions in SetTransformIgnoreContacts http://undertowgames.com/forum/viewtopic.php?f=21&t=5915#p112558 --- Subsurface/Source/Items/Item.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index d28873cee..d7802d5b0 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -598,7 +598,18 @@ namespace Barotrauma if (contained.body != null) { - contained.body.FarseerBody.SetTransformIgnoreContacts(ref simPos, 0.0f); + try + { + contained.body.FarseerBody.SetTransformIgnoreContacts(ref simPos, 0.0f); + } + + catch (NullReferenceException e) + { +#if DEBUG + DebugConsole.ThrowError("SetTransformIgnoreContacts threw an exception in SetContainedItemPositions", e); +#endif + contained.body.SetTransform(simPos, 0.0f); + } } contained.Rect = From 27a883349c62d7bd51e37dd1a53697f37bd44446 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 27 Feb 2017 21:30:39 +0200 Subject: [PATCH 16/44] Server keeps a reference to the StartGame coroutine and checks if it has stopped running before the round has started, and if so, resets autorestart timer and start button (i.e. an exception at any point during startup will trigger the reset) --- Subsurface/Source/Networking/GameServer.cs | 61 ++++++++++++---------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 0492bbe9f..04e515c81 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -38,6 +38,9 @@ namespace Barotrauma.Networking private ServerLog log; private GUIButton showLogButton; + private bool initiatedStartGame; + private CoroutineHandle startGameCoroutine; + private GUIScrollBar clientListScrollBar; public TraitorManager TraitorManager; @@ -305,7 +308,6 @@ namespace Barotrauma.Networking if (settingsFrame != null) settingsFrame.Update(deltaTime); if (log.LogFrame != null) log.LogFrame.Update(deltaTime); - if (!started) return; base.Update(deltaTime); @@ -348,7 +350,21 @@ namespace Barotrauma.Networking return; } } - else if (autoRestart && Screen.Selected == GameMain.NetLobbyScreen && connectedClients.Count>0) + else if (initiatedStartGame) + { + //tried to start up the game and StartGame coroutine is not running anymore + // -> something wen't wrong during startup, re-enable start button and reset AutoRestartTimer + if (startGameCoroutine != null && !CoroutineManager.IsCoroutineRunning(startGameCoroutine)) + { + if (autoRestart) AutoRestartTimer = Math.Max(AutoRestartInterval, 5.0f); + GameMain.NetLobbyScreen.StartButton.Enabled = true; + + UpdateNetLobby(null, null); + startGameCoroutine = null; + initiatedStartGame = false; + } + } + else if (autoRestart && Screen.Selected == GameMain.NetLobbyScreen && connectedClients.Count > 0) { AutoRestartTimer -= deltaTime; if (AutoRestartTimer < 0.0f && GameMain.NetLobbyScreen.StartButton.Enabled) @@ -356,6 +372,7 @@ namespace Barotrauma.Networking StartGameClicked(null,null); } } + for (int i = disconnectedClients.Count - 1; i >= 0; i-- ) { @@ -914,13 +931,15 @@ namespace Barotrauma.Networking } } - GameMain.ShowLoading(StartGame(selectedSub, selectedShuttle, selectedMode), false); + startGameCoroutine = GameMain.ShowLoading(StartGame(selectedSub, selectedShuttle, selectedMode), false); yield return CoroutineStatus.Success; } private IEnumerable StartGame(Submarine selectedSub, Submarine selectedShuttle, GameModePreset selectedMode) { + initiatedStartGame = true; + Item.Spawner.Clear(); Item.Remover.Clear(); @@ -935,34 +954,16 @@ namespace Barotrauma.Networking int teamCount = 1; int hostTeam = 1; + + GameMain.GameSession = new GameSession(selectedSub, "", selectedMode, Mission.MissionTypes[GameMain.NetLobbyScreen.MissionTypeIndex]); - try - { - GameMain.GameSession = new GameSession(selectedSub, "", selectedMode, Mission.MissionTypes[GameMain.NetLobbyScreen.MissionTypeIndex]); - - if (GameMain.GameSession.gameMode.Mission != null && - GameMain.GameSession.gameMode.Mission.AssignTeamIDs(connectedClients,out hostTeam)) - { - teamCount = 2; - } - - GameMain.GameSession.StartShift(GameMain.NetLobbyScreen.LevelSeed, teamCount > 1); - } - - catch (Exception e) + if (GameMain.GameSession.gameMode.Mission != null && + GameMain.GameSession.gameMode.Mission.AssignTeamIDs(connectedClients,out hostTeam)) { - DebugConsole.ThrowError("Failed to start a new round", e); - - //try again in >5 seconds - if (autoRestart) AutoRestartTimer = Math.Max(AutoRestartInterval, 5.0f); - GameMain.NetLobbyScreen.StartButton.Enabled = true; - - UpdateNetLobby(null, null); - - couldNotStart = true; + teamCount = 2; } - if (couldNotStart) yield return CoroutineStatus.Failure; + GameMain.GameSession.StartShift(GameMain.NetLobbyScreen.LevelSeed, teamCount > 1); GameServer.Log("Starting a new round...", Color.Cyan); GameServer.Log("Submarine: " + selectedSub.Name, Color.Cyan); @@ -1082,7 +1083,6 @@ namespace Barotrauma.Networking //give some time for the clients to load the map yield return new WaitForSeconds(2.0f); - gameStarted = true; GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; @@ -1099,7 +1099,10 @@ namespace Barotrauma.Networking } GameMain.NetLobbyScreen.StartButton.Enabled = true; - + + gameStarted = true; + initiatedStartGame = false; + yield return CoroutineStatus.Success; } From 979c82443cddfaeda5cfa7712120763a4d1d9d33 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 27 Feb 2017 21:33:42 +0200 Subject: [PATCH 17/44] Derp: fixed submarine files not being included in saves if the player saves and quits from the single player lobby --- Subsurface/Source/Utils/SaveUtil.cs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/Subsurface/Source/Utils/SaveUtil.cs b/Subsurface/Source/Utils/SaveUtil.cs index b78fee054..83c39e761 100644 --- a/Subsurface/Source/Utils/SaveUtil.cs +++ b/Subsurface/Source/Utils/SaveUtil.cs @@ -28,7 +28,7 @@ namespace Barotrauma Directory.CreateDirectory(tempPath); try { - ClearFolder(tempPath); + ClearFolder(tempPath, new string[] { GameMain.GameSession.Submarine.FilePath }); } catch { @@ -37,7 +37,7 @@ namespace Barotrauma try { - if (Submarine.MainSub != null) + if (Submarine.MainSub != null && Submarine.Loaded.Contains(Submarine.MainSub)) { Submarine.MainSub.FilePath = Path.Combine(tempPath, Submarine.MainSub.Name + ".sub"); Submarine.MainSub.SaveAs(Submarine.MainSub.FilePath); @@ -77,7 +77,7 @@ namespace Barotrauma XDocument doc = ToolBox.TryLoadXml(Path.Combine(TempPath, "gamesession.xml")); - string subPath = Path.Combine(TempPath, ToolBox.GetAttributeString(doc.Root, "submarine", "")); + string subPath = Path.Combine(TempPath, ToolBox.GetAttributeString(doc.Root, "submarine", ""))+".sub"; Submarine selectedMap = new Submarine(subPath, "");// Submarine.Load(); GameMain.GameSession = new GameSession(selectedMap, fileName, doc); @@ -285,19 +285,31 @@ namespace Barotrauma while (DecompressFile(sDir, zipStream, progress)) ; } - private static void ClearFolder(string FolderName) + private static void ClearFolder(string FolderName, string[] ignoredFiles = null) { DirectoryInfo dir = new DirectoryInfo(FolderName); foreach (FileInfo fi in dir.GetFiles()) { + bool ignore = false; + foreach (string ignoredFile in ignoredFiles) + { + if (Path.GetFullPath(fi.FullName).Equals(Path.GetFullPath(ignoredFile))) + { + ignore = true; + break; + } + } + + if (ignore) continue; + fi.IsReadOnly = false; fi.Delete(); } foreach (DirectoryInfo di in dir.GetDirectories()) { - ClearFolder(di.FullName); + ClearFolder(di.FullName, ignoredFiles); di.Delete(); } } From 9e16542b1311e4800f018c89c2b148a1a19528db Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 27 Feb 2017 22:28:10 +0200 Subject: [PATCH 18/44] Replaced the arrows in server lobby buttons with images, made GUIImages rotatable (todo: make them align correctly when rotated/scaled), fixed the size of the sub save warning messagebox --- Subsurface/Source/GUI/GUIImage.cs | 8 +++++--- Subsurface/Source/GUI/GUIMessageBox.cs | 11 +++++++++++ Subsurface/Source/Map/Submarine.cs | 18 +++++++++--------- Subsurface/Source/Screens/NetLobbyScreen.cs | 11 +++++++++-- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/Subsurface/Source/GUI/GUIImage.cs b/Subsurface/Source/GUI/GUIImage.cs index 16dab4c83..becc471c2 100644 --- a/Subsurface/Source/GUI/GUIImage.cs +++ b/Subsurface/Source/GUI/GUIImage.cs @@ -6,9 +6,11 @@ namespace Barotrauma { public class GUIImage : GUIComponent { - Sprite sprite; + public float Rotation; - Rectangle sourceRect; + private Sprite sprite; + + private Rectangle sourceRect; bool crop; @@ -85,7 +87,7 @@ namespace Barotrauma if (sprite != null && sprite.Texture != null) { - spriteBatch.Draw(sprite.Texture, new Vector2(rect.X, rect.Y), sourceRect, currColor * (currColor.A / 255.0f), 0.0f, Vector2.Zero, + spriteBatch.Draw(sprite.Texture, new Vector2(rect.X, rect.Y), sourceRect, currColor * (currColor.A / 255.0f), Rotation, Vector2.Zero, Scale, SpriteEffects.None, 0.0f); } diff --git a/Subsurface/Source/GUI/GUIMessageBox.cs b/Subsurface/Source/GUI/GUIMessageBox.cs index 3546b5766..f6dfd67cd 100644 --- a/Subsurface/Source/GUI/GUIMessageBox.cs +++ b/Subsurface/Source/GUI/GUIMessageBox.cs @@ -42,6 +42,17 @@ namespace Barotrauma : base(new Rectangle(0,0, GameMain.GraphicsWidth, GameMain.GraphicsHeight), Color.Black*0.5f, Alignment.TopLeft, null, parent) { + if (height == 0) + { + string wrappedText = ToolBox.WrapText(text, width, GUI.Font); + string[] lines = wrappedText.Split('\n'); + foreach (string line in lines) + { + height += (int)GUI.Font.MeasureString(line).Y; + } + height += 220; + } + var frame = new GUIFrame(new Rectangle(0,0,width,height), null, Alignment.Center, GUI.Style, this); new GUITextBlock(new Rectangle(0, 0, 0, 30), header, Color.Transparent, Color.White, textAlignment, GUI.Style, frame, true); diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index e3be7b567..8890f5436 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -938,11 +938,11 @@ namespace Barotrauma public void CheckForErrors() { - string errorMsg = ""; + List errorMsgs = new List(); if (!Hull.hullList.Any()) { - errorMsg = "No hulls found in the submarine. Hulls determine the \"borders\" of an individual room and are required for water and air distribution to work correctly."; + errorMsgs.Add("No hulls found in the submarine. Hulls determine the \"borders\" of an individual room and are required for water and air distribution to work correctly."); } foreach (Item item in Item.ItemList) @@ -951,24 +951,24 @@ namespace Barotrauma if (!item.linkedTo.Any()) { - errorMsg += "\nThe submarine contains vents which haven't been linked to an oxygen generator. Select a vent and click an oxygen generator while holding space to link them."; + errorMsgs.Add("The submarine contains vents which haven't been linked to an oxygen generator. Select a vent and click an oxygen generator while holding space to link them."); } } if (WayPoint.WayPointList.Find(wp => !wp.MoveWithLevel && wp.SpawnType == SpawnType.Path) == null) { - errorMsg += "\nNo waypoints found in the submarine. AI controlled crew members won't be able to navigate without waypoints."; + errorMsgs.Add("No waypoints found in the submarine. AI controlled crew members won't be able to navigate without waypoints."); } if (WayPoint.WayPointList.Find(wp => wp.SpawnType == SpawnType.Cargo) == null) { - errorMsg += "\nThe submarine doesn't have spawnpoints for cargo (which are used for determining where to place bought items). " - +"To fix this, create a new spawnpoint and change its \"spawn type\" parameter to \"cargo\"."; + errorMsgs.Add("The submarine doesn't have spawnpoints for cargo (which are used for determining where to place bought items). " + +"To fix this, create a new spawnpoint and change its \"spawn type\" parameter to \"cargo\"."); } - if (!string.IsNullOrWhiteSpace(errorMsg)) + if (errorMsgs.Any()) { - new GUIMessageBox("Warning", errorMsg); + new GUIMessageBox("Warning", string.Join("\n\n", errorMsgs), 400, 0); } foreach (MapEntity e in MapEntity.mapEntityList) @@ -1074,7 +1074,7 @@ namespace Barotrauma { stream = SaveUtil.DecompressFiletoStream(file); } - catch (Exception e) + catch (Exception e) { DebugConsole.ThrowError("Loading submarine \"" + file + "\" failed!", e); return null; diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index fbc55c8f8..587050912 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -515,11 +515,18 @@ namespace Barotrauma infoButton.UserData = -1; infoButton.OnClicked += ViewJobInfo; - GUIButton upButton = new GUIButton(new Rectangle(30, 2, 15, 15), "^", GUI.Style, jobText); + GUIButton upButton = new GUIButton(new Rectangle(30, 2, 15, 15), "", GUI.Style, jobText); + //TODO: make GUIImages align correctly when scaled/rotated + //so there's no need to do this ↓ + new GUIImage(new Rectangle(3,2,0,0), GUI.Arrow, Alignment.Center, upButton).Scale = 0.6f; upButton.UserData = -1; upButton.OnClicked += ChangeJobPreference; - GUIButton downButton = new GUIButton(new Rectangle(50, 2, 15, 15), "˅", GUI.Style, jobText); + GUIButton downButton = new GUIButton(new Rectangle(50, 2, 15, 15), "", GUI.Style, jobText); + var downArrow = new GUIImage(new Rectangle(13,14,0,0), GUI.Arrow, Alignment.Center, downButton); + downArrow.Rotation = MathHelper.Pi; + downArrow.Scale = 0.6f; + downButton.UserData = 1; downButton.OnClicked += ChangeJobPreference; } From eb0d592814f368daa377abba3c7b004d3018d630 Mon Sep 17 00:00:00 2001 From: Regalis Date: Tue, 28 Feb 2017 00:05:13 +0200 Subject: [PATCH 19/44] v0.5.4.4 --- Subsurface/Properties/AssemblyInfo.cs | 4 ++-- Subsurface/changelog.txt | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Subsurface/Properties/AssemblyInfo.cs b/Subsurface/Properties/AssemblyInfo.cs index e7574d2bd..557db3188 100644 --- a/Subsurface/Properties/AssemblyInfo.cs +++ b/Subsurface/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.5.4.3")] -[assembly: AssemblyFileVersion("0.5.4.3")] +[assembly: AssemblyVersion("0.5.4.4")] +[assembly: AssemblyFileVersion("0.5.4.4")] diff --git a/Subsurface/changelog.txt b/Subsurface/changelog.txt index adf12903a..2c6797bca 100644 --- a/Subsurface/changelog.txt +++ b/Subsurface/changelog.txt @@ -1,3 +1,23 @@ +--------------------------------------------------------------------------------------------------------- +v0.5.4.4 +--------------------------------------------------------------------------------------------------------- + +- new fonts +- spectators see indicators for both subs during combat missions +- fixed saves becoming corrupted if the player saves and quits in the "map view" +- fixed "OpenAL not found" errors if trying to run the game with no enabled audio devices +- fixed OpenAL errors when quitting a round +- fixed unconscious/dead characters falling through floors +- the server list accepts multiple servers from the same IP (assuming they're running on different ports) +- fixed autorestart and the start button getting stuck if the server fails to load the respawn shuttle +- fixed server failing to start a round if the cargo spawnpoint has been placed outside the submarine +- fixed AddToGUIUpdateList errors +- fixed SetTransformIgnoreContacts errors +- tickboxes work again in the item UIs in wiring/character mode +- fixed characters standing in an incorrect position when using railgun controllers in a mirrored sub +- spawning a scorpion (an old placeholder enemy) doesn't crash the game anymore +- submarine editor shows a warning if there are structures/items way outside the sub + --------------------------------------------------------------------------------------------------------- v0.5.4.3 --------------------------------------------------------------------------------------------------------- From 4568f34f39feed9bf0470442257e9f9196ee565a Mon Sep 17 00:00:00 2001 From: juanjp600 Date: Tue, 28 Feb 2017 19:19:02 -0300 Subject: [PATCH 20/44] Rotating lights and overridden textures The flashlight has the correct texture now, but something still seems off about the UV coordinates. Scaling is probably incorrect. --- Subsurface/Source/Map/Lights/LightSource.cs | 53 ++++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index f5b80f5f1..c96e4f9fe 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -62,10 +62,18 @@ namespace Barotrauma.Lights } } + private float rotation; public float Rotation { - get; - set; + get { return rotation; } + set + { + if (rotation == value) return; + rotation = value; + + NeedsHullCheck = true; + NeedsRecalculation = true; + } } public Vector2 WorldPosition @@ -395,18 +403,41 @@ namespace Barotrauma.Lights Vector2 drawPos = position; if (ParentSub != null) drawPos += ParentSub.DrawPosition; + float cosAngle = (float)Math.Cos(Rotation); + float sinAngle = -(float)Math.Sin(Rotation); + + Vector2 uvOffset = Vector2.Zero; + Vector2 overrideTextureDims = Vector2.One; + if (overrideLightTexture != null) + { + overrideTextureDims = new Vector2(overrideLightTexture.SourceRect.Width, overrideLightTexture.SourceRect.Height); + uvOffset = (overrideLightTexture.Origin / overrideLightTexture.size) - new Vector2(0.5f, 0.5f); + } + // Add a vertex for the center of the mesh vertices.Add(new VertexPositionTexture(new Vector3(position.X, position.Y, 0), - new Vector2(0.5f, 0.5f))); + new Vector2(0.5f, 0.5f) + uvOffset)); // Add all the other encounter points as vertices // storing their world position as UV coordinates foreach (Vector2 vertex in rayCastHits) { - Vector2 diff = vertex - drawPos; + Vector2 rawDiff = vertex - drawPos; + Vector2 diff = rawDiff; + diff /= range*2.0f; + if (overrideLightTexture != null) + { + diff /= (overrideLightTexture.size / overrideTextureDims); + Vector2 originDiff = diff; - vertices.Add(new VertexPositionTexture(new Vector3(position.X + diff.X, position.Y + diff.Y, 0), - new Vector2(0.5f, 0.5f) + diff / range / 2)); + diff.X = originDiff.X * cosAngle - originDiff.Y * sinAngle; + diff.Y = originDiff.X * sinAngle + originDiff.Y * cosAngle; + + diff += uvOffset; + } + + vertices.Add(new VertexPositionTexture(new Vector3(position.X + rawDiff.X, position.Y + rawDiff.Y, 0), + new Vector2(0.5f, 0.5f) + diff)); } // Compute the indices to form triangles @@ -495,11 +526,19 @@ namespace Barotrauma.Lights if (vertexCount == 0) return; lightEffect.DiffuseColor = (new Vector3(color.R, color.G, color.B) * (color.A / 255.0f)) / 255.0f;// color.ToVector3(); + if (overrideLightTexture != null) + { + lightEffect.Texture = overrideLightTexture.Texture; + } + else + { + lightEffect.Texture = LightTexture; + } lightEffect.CurrentTechnique.Passes[0].Apply(); GameMain.CurrGraphicsDevice.SetVertexBuffer(lightVolumeBuffer); GameMain.CurrGraphicsDevice.Indices = lightVolumeIndexBuffer; - + GameMain.CurrGraphicsDevice.DrawIndexedPrimitives ( PrimitiveType.TriangleList, 0, 0, indexCount / 3 From 84a8232c1ac02f430885b64fed23041aeb21d8fe Mon Sep 17 00:00:00 2001 From: juanjp600 Date: Tue, 28 Feb 2017 19:38:25 -0300 Subject: [PATCH 21/44] Fixed override sprite scaling Now it looks right. --- Subsurface/Source/Map/Lights/LightSource.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index c96e4f9fe..4474d6a36 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -411,7 +411,7 @@ namespace Barotrauma.Lights if (overrideLightTexture != null) { overrideTextureDims = new Vector2(overrideLightTexture.SourceRect.Width, overrideLightTexture.SourceRect.Height); - uvOffset = (overrideLightTexture.Origin / overrideLightTexture.size) - new Vector2(0.5f, 0.5f); + uvOffset = (overrideLightTexture.Origin / overrideTextureDims) - new Vector2(0.5f, 0.5f); } // Add a vertex for the center of the mesh @@ -427,11 +427,11 @@ namespace Barotrauma.Lights diff /= range*2.0f; if (overrideLightTexture != null) { - diff /= (overrideLightTexture.size / overrideTextureDims); Vector2 originDiff = diff; diff.X = originDiff.X * cosAngle - originDiff.Y * sinAngle; diff.Y = originDiff.X * sinAngle + originDiff.Y * cosAngle; + diff *= (overrideTextureDims / overrideLightTexture.size) * 2.0f; diff += uvOffset; } From 3868b703878046ceaa8c64658839518b447145f3 Mon Sep 17 00:00:00 2001 From: juanjp600 Date: Wed, 1 Mar 2017 13:41:37 -0300 Subject: [PATCH 22/44] Fixed windowed door shadows --- Subsurface/Source/Items/Components/Door.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Subsurface/Source/Items/Components/Door.cs b/Subsurface/Source/Items/Components/Door.cs index ec03b232e..a592d749f 100644 --- a/Subsurface/Source/Items/Components/Door.cs +++ b/Subsurface/Source/Items/Components/Door.cs @@ -368,7 +368,7 @@ namespace Barotrauma.Items.Components LinkedGap.ConnectedDoor = this; LinkedGap.Open = openState; - Vector2[] corners = GetConvexHullCorners(doorRect); + Vector2[] corners = GetConvexHullCorners(Rectangle.Empty); convexHull = new ConvexHull(corners, Color.Black, item); if (window != Rectangle.Empty) convexHull2 = new ConvexHull(corners, Color.Black, item); From 1f607c201828ca43ea9a08368891259068ca02cd Mon Sep 17 00:00:00 2001 From: juanjp600 Date: Wed, 1 Mar 2017 13:43:00 -0300 Subject: [PATCH 23/44] Made windowed door's shadow match the sprite more closely --- Subsurface/Content/Items/Door/doors.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Subsurface/Content/Items/Door/doors.xml b/Subsurface/Content/Items/Door/doors.xml index f4326c5ed..f6c6f3c78 100644 --- a/Subsurface/Content/Items/Door/doors.xml +++ b/Subsurface/Content/Items/Door/doors.xml @@ -34,7 +34,7 @@ - + From 871c3bc93c7554fd5db8355387aa5c9f1107d20e Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 1 Mar 2017 19:15:50 +0200 Subject: [PATCH 24/44] Character colliders are disabled when the character is disabled (-> monsters won't automatically drop into abyss in monster missions) --- Subsurface/Source/Characters/Character.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 0df0109bb..07661cf1d 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -64,6 +64,7 @@ namespace Barotrauma { limb.body.Enabled = enabled; } + AnimController.Collider.Enabled = value; } } From 708a67caeb55a3778ffc6d79c82d54a84720177a Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 1 Mar 2017 19:31:26 +0200 Subject: [PATCH 25/44] Switched to fonts that support the cyrillic alphabet --- Subsurface/Content/SmallFont.spritefont | 2 +- Subsurface/Content/SmallFont.xnb | Bin 496912 -> 242960 bytes Subsurface/Content/SpriteFont1.spritefont | 2 +- Subsurface/Content/SpriteFont1.xnb | Bin 529680 -> 267536 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Subsurface/Content/SmallFont.spritefont b/Subsurface/Content/SmallFont.spritefont index d28c47076..411980b11 100644 --- a/Subsurface/Content/SmallFont.spritefont +++ b/Subsurface/Content/SmallFont.spritefont @@ -8,7 +8,7 @@ with. - Exo Light + Exo 2 Light 9 diff --git a/Subsurface/Content/SmallFont.xnb b/Subsurface/Content/SmallFont.xnb index d796cb96fe1ee845c4d5fe77b6b8c98809dd3500..b97ed5240702fde63052f89b5e43de454de38549 100644 GIT binary patch literal 242960 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 diff --git a/Subsurface/Content/SpriteFont1.spritefont b/Subsurface/Content/SpriteFont1.spritefont index 5e812c263..f98d46380 100644 --- a/Subsurface/Content/SpriteFont1.spritefont +++ b/Subsurface/Content/SpriteFont1.spritefont @@ -11,7 +11,7 @@ with. - Exo Medium + Exo 2 Medium ZQj>PW2r40CHf@0KX@y$eo(#hsIM4$i3rP$!f zEZ*JN@r5qy&Q(2OMI$B#T2`u@(oer@y$Kehx)RczFya+gF|!}Sk63W2_5PS9m0`*_=nF=>lwcFM$3B0R&q`a^l#uYyLD7% zEP$|mVnIIdP@N7v>(cP@j;+O2&0>`bK9OeTKg`lgaB9h*zyJ3uBA`dX^}<#VvKpYT z-+PB|7ysW-QcbgT0B`BTl$I52uTaT2)EOkcR!~6lf!002b4jRK9;WE}n7ru3|HIXL zhhrVT?c?`tlNBX=toUFUgT=LyoyeGf4~48VwKPi>yqr8D>-H(X}mbArcv8guWMq=k)p z2sU7i6A}^*#-G?f2z}TeP)V^6(81P2i*v(-XhBTJ2cylTyw+$8EsCe@v!^$!0U^Nw zeFU3;uCqNy{B9!Y7Djiv-KVwI6!#;y(o3?sI8Ahwx7L033-=cucQY&~zoPj~mEWZ? z3Cr9z0x5Qq1Q7v$=trhET*MUeI=8G1)n?Ti!|Mh1GAfP%S&Ez29 zR^cR@QHXJX;r(iLb8OA|F)3;-BvOH$R}Gd_nqX$Eow7B0TB3W&+f#QHFR`k%;jNKo zW@|ZOIT{fWL2U^{gauoi!f3H?`2a1^#eMGdvWc}KJ|NU%Ywv zoGoQQ#>8R!TNIhrr+_nB3!M$p2N^?YSpgL?vY8)(53YSAd=viU79PE>FIFbzWEYO= z@5@;x(o_pY0{s5hH3l_p#`7f9_!D|j2r-nI5H+N=SWQe!!0nZ)|BZI7{IfMiung{s zuJbcNUM+WLxMah^!qR9})_1-Y(*Nl_5Kw2k|F+|gEb1r6vb~nJE1(9!o!&gn!4f1NQIT+ps<2f5|_w^KXaS;t2~w^_5}W_#{4 z2i<>s-wS9>5B`iWHPqFWL;3k(tzKs}BZ`+dkvwEeA3=vFz#ugstTr$16s3Yu>}U}WB~*nz)?{!MKYBHNH_CF%KUS|}!R zrQ?O!NXuD%<$;r`tOrswbzL`F>kd zv?N>(>9aO`l)7aT8?eu8HxG|=10tXovp)Uw=mW!>7r$Oj_Ho=U=(xchuQ(M9`9f(z z7CcFlb4OIZ?NIHSz~$Bs0~d?lT`|m}`_=-diGz0SbZz1X`Yk1u4>j-UX5Z{e&%Coy zew3|i%DF&uSM2x7zF5>7NM(0%bNe%i+b`E2?0*0k_6`=gMuYNB(|my*r#al$)sf!o zrUwgQ_f8sE^xIP>>Sg;?QsIP^{IHuTdGg8Y<$Pxut*v!)J`Ih$(C#twYJY!hfFY5D z1a0Jxgm>-W!Stgm-V9?&j4Q87|_&;*fDyu9%CJOg{XMM%X&UbtIh zBJPE(x1h-hpcHc#oCnR`)RZRm6ci%ND9vj@D3JqFM9ff`Y>3*Nt)MjzxYf@r>yrEJ zR{vPHGUMJ#gE0xR&x?#m%`-W&Ymp}4em6$t2#3UkPeS*H9fr&<(I6%ib1ylxa(#>X zbthXK4Q$s6dAxZ3oq5$8x`g8HQne03&QVy{H5g}_-I7wnzJ3AWAwMMnyiBF5D4AAr z%z509->6nKL;<-BatmpUdA%d=i~qtFxAl@_&KN-^&A9ejZnxXsX7y=6aw>aONXIo4 zep^nBke9f#lr1eZf&#RWC1ck5pJr;{d{ND6Q#$!qq90wBFAdjSsL zn=dl0Nd)lt?*d>oZe3&Ok0aH|kfZOk%)XTcm9psWkpC8wXB%>`#s&+m>ek&zScdpX z7_|PT7H8e1K?M80W2)zid+Ief7bGx8K;^ij0#*1^3^O@nO53l}7?7!X+Y6_ug1auP z8fUR!Q|&D(cx#Sj1k5isG_N%rjBNX?cfk){zKipg%fs~bdC}CN6|O#zZNBgOeZ~o< zXt+lZ*EDb_uxBq!9~{e?ATCs_RQj9SwIFSjxt%X(g_Ir+<|9;i?d~ z%pGpAG6`o4HAM>bN(?G~mW)=G{-);Z!V?*Fgd*js?0DDF2|b)tI;D1O>M+?b+|Rr< z@rqwbAHlu*gdlsqe`U|*_3H)Pn7>ZeF!aD~7L9yL5;Ul86s=z3hm#?b{>59b>#IGQ z?5d{v!R3R>2S#K-JVf%kucoH!Q)f`u;E&+oeBxzheNr|7W|PaAyYN8(zz{GFEjysc zrK>CvAHB%?G1PVF1WJa8PC~5M1eTMN>Mh7KiqeYyU0PLQms^|v{DB(@8ued0weMMM zKRto9?vA_iuEIW-N-*+B%r`CqM4X&-S2My~m`k!&Qf& zRxxF3Zr`{gS2(eD-tqUZ)kn>ONo?_LzmIH)I$}LhJxa1F9?E*dK`8tZNEjSb9SCm(XYM5Aa2J2bf z65YEQLn8W_toEo<5GN({|61Sp&u{a zOGlrg+cMqkx}T72OU_^Ut-H2BpU957?KMG2kY<6|SCbL=xI}t&Ic{Ec#=Helck`v_ z)dAu8BnontW}F%$>UIUhDin?45lbNrETy*w2sttZEuN%msGZKwKaaFmI!1CH!Lxm7 zlpnCL=SDbtEv8koVCh`C=4%d583(qh=}NuiQh}2A{uu^uf4w%x3wZ57GcVSSDjD_Q zdr{Bd;Aggdaxx7G6~<6~MS=q3yfXQ+8sFGF7F^!Cxn)q7-)2IK)Sf z-n=K$;z&oZb#<0}M5Pxkd=D(nmB;i579mJt?E(>Z5p9chmai6FD73QYUZ=g zb}&XkM*$5S%>?oh%-n=Bq4wb0kVf5FPs1zi)vSJ(D?w>(-=p*``whISwl>nQn)VbL z^Q*BjWx$+k5$oS#lT1vWI{T3b5v#x$K9zE2&ov&1p_C}%zvy1933xL69T!b09;1eM5xY5=BiwpL|T|U&VwBzQ(OZz!GWiw|01z9&c-9tpeSr+M}#c^{`wv(5SvoltIEa#HA2bbcqmBGAy$ ziEuxx#JJPJipDKi)dI%ETS4u=hz3{om}C77e4WpiJtp;f)ZxPtjGljS$8DsR)A~bp zC5fcaoGe+oEFwVm$BmR*uWyw`o|-S}e37}#pk+thPh_-?D!@jQ4&F3s}vp@W_h&k*Z#2c z?4zE>eJFJQ(tU#X5%nJ_f%mT1`d?3Az}IEJu@0R`15vAG6@xUw@)M#;Ek3SQdCz;A z6=#`F6C`tbH3rTP;Rb);Co>~w=)*sgbyyNex0caim8(#b7C8g#L-J&;4>bOjB73p zrPW~MMY{%h5NYJ`GDve!_|HJw2eUi2UEl9-;35o0RABshaI#j`aGhZzBDC+=^(Tc4 z0#|qwmw$P!ti|q1u}agOW0zY^E)8ea9PrS^mfx?f0@_-A_84%SoZq!L^-fUGC%?)y6f2s3Z5r2@ERQ5pC6{9)! z^x=;l4|OJqn1IC9=xX#38^H({foBEFjd@l$5X zYj6CoMmhbJrh@AqNhrZ7rRE9&G2=PT1~aXpD_cU*{hzlWa$-C}6yx|_tVS-|i5e?e zYz7IEnLwUGJNx3O%?O%^Ly)6WbyFn1>a}d^99(gC|tNNpc_ei#^YgQ>1q?)TC9S_{+sM=UvenRjf>#g92f1 zVW}u7Ie!`ZCmUr2Z_)Ox=0E@Q6jC?-1KTxOO47 ztDHvNp>XX3I=cqrc+pwLp;DTtvv#~Ngy|>{${0}`U(+uaWMx5_4CuGPmkM@2Fyzgxjdh;oCYd>_n-2O zV;x13$PcXSC4l3AMc3laGoC7!VY7dqs5~)S|9e=f_3h)65CRZZT#V*U!6{cdJy z#9Kf_aB)rQE%~gWwMlsN(i>lSA;oCD$6_OQTG?hZ3WiSK0=!WjjD*4m~;H^-@kM3h~3VD44a?GFpK{4 zU%?;pP;jCYNJ(^d+-9L_J2yOq@ykdevNG^g{Xw0J7?b|TL&|jytnM-9{A7$6D|4UN zx)D84&JZw9r=%XC0GBi19!0`RF5^fnNfIip&V&GUS_g@dPdGEP##`Qdh!aC97D6{q6fU3~ zT_?=vt<+~(*CaoFukaGLhuPQKT%vKxcG-8&{$k)G6Jm3=evuTV%-|<>Pf@A`YjnDW zCWyE|*zeewd%Jkw^p!W%&`mkU=*t`5Pz2fp4c(lD#}v!Arl$Ax~)<4;naWkN9VzI!-nT(3&KakIFvUx7wKpLw+C)iX|N0a-%k7v}(V zl}xN1%LER5PbMWKD#hgf$brdI0s#5IHsUgh1)ryud~D<=x^B{dv>+w9;7^u4EQ=?r zjY)S9F0EYVZ&vAts3FK1riC+#;hT_6@&o`|pX#U^arTY-<4=6tq&5GXp<17#FU*ey zK#Hq15cZQ`ysmT=T5BEFX6^u3`dIG@xcS6`)cY|WVu2I3bf%` z&<7gE{K)NA$_!+{KLV zngag)(gVlHBWzy;jwcB}JD&z&zCA+C&Zu21Tz8Ca`5I7A9Z6QV9;!EqVc?v6Jyj zbGUi0N>^1K$~FCd?x%b)cD1~_uJC4!SegOwC4z^(oH%|F%Q^B+;;q?B_bw6EQdXDm z%Ho-ci5YXU1xh?x3h2w3E)?_PNvFwrOXnmO-|~bfP1IFzlO9heAyPlmknnXf>0jGH zx@W!2XTYFW+9n^KcE3Q?|2ypdc?BxOE2jU$j8glk6*;1>6_=rYIph`SmHmWlDEyhs=si=}?{sxP-m?*3;BCFs7PmA3s+(Gjyz~X7@V$Op* zGUMNl4{!g7BCuuly4R}w;{s`vxOAHeUkF4gx*YK?lJ`=0I~_Q&T5pmjVakx*lMgq#P3+N?n9JraY-Us6IWERY9cnBC0h;;u!-{iB2^hZbZOALsQRiFrNjz?k! z%g`AUEn>|t9q%-V()B;2$2G2tu59z#^RC8UN=i&R94;QSHaB;1cmJET1^3k@UF{)A z0m(vTu87Igl+`nJX{z|C`}cYjdGA%-m~yiA?3fyZTx?cgHlQl0^ffs_gfUl4@-tqk@@AAY?+i)W>g5K zt^ksFc1_-{eNy^@OZ4R+`5)~2zoGyLo|0$Y4TqX~@w)!3%vTT(bw!_CF(|cIc$yph zL{SI?>7)e!w^6Tx#4peGu3#X*WI)Jl2?x_xAYPIGQI1AT9f2An>i(RSc{)3EGXP|7 z9Bj&&$3`_44A+7g*TYfUy{0kfx)Bu=M)h zVsrJ5T~{eR&=+6f5>0&;HvJ*DTEPt+I`L`1+pl_zTA01zZL*uKt5`HpJ0Sb^MkwZ; z@Ychsl_T0LTFIM5=5vJz4fT?{+vH}ANdcqli#;EnHdc?(_VD%7wka9x5)%fOz!>L~ z?TPVYoLvh^w|$ISkY`@V<>;r`_G5je(^<9(o*2p^{D1SUAHO?~tN!v%Gn^W%a<0DY zIM+yTHLF!D#%-ZKw*L*E$=wQbZIyO0Ddru~(KtFofB-k3rGSx&((dEHIuZECTpm?> zK3jTo%cy*D(bVGZ{i5N}0&B#@@n3nw1$)5TVw&Ucu!>0V=HWAJ)3-f16Rk=to+Uvp zwsN9QWMowMNslVaY)7lVwd3B@K_UW$_W-~u!K{%%w(4^wlt8_J2eGc|$vmN8C`vVO6Rmr5$+=ROZw|JW#JX6--g)xCv>`Gk{fv*$YGVqD$&)Oc??TeOH! zO=!jv2c{ASi&K;mCpi+IneHvyYSer<5!Sd?lA854f$B2W4ZP%m29@)*+MZ(w0ojn3U6lbbg49 z*mJZ_#F~eJRfJx3>`gU$$L(jnkwfrZr8{8$`4#_$hcVxfpf+q=z_~*q*?7Tw@u_5* z@DRp6&;7ilsjKObhNj-P?MivrS36VEbTDmWq^fvV(0UY91qv)G%vs6wT(KCP5k2=0 z9lgCbn8Q4ruQLU_Xf?#&=xDXLF3mF((7BPk4yg9#OXt016}DP+S)yR+$SHOfKjM(C z#q{dM^ZP>z!~Twm8PndXDpU0WoB9n6QmH7W*7UeqxNXyz1(wLSj=`YTPE`Ke`?`c< z%m+beY5d()>imr)cbHd?I77(d>e*B4AHDj-@m6CXGcPz5bk?@BOOa4h_<}5mQAF6=_R}Gmyo1A*!fEDKFS9!X{uyt$G=SNh z=##RSM>k}+^}GGi5_`HCt@7fp=_?9w@FeuITBQ*2oN;mr5TmH9kuP81uuGvuv<2}z zRF>q=K*+Qc@0|f_Fp&(T$)L{==R%0LOvRj_XBT+VD!Een5R^)v*&^-v7Jq z53n-dBj|b>dN&=MvCkG_())e`yDL9|z)10tw&VJ*HOVHOe;T<%e zCNinaBe5H7gA^C{peUo=X@B)aY#mHurdaPWP9{X?J26EAR77XYNE~49nk$!jZ%)d8?!-XSMfE5uMsE$Me(7K6&WUb%jv)*Uf(d6#{-T z5>$wv`};LOnD?1i(ej%7Iq;r4^gg&dw|n;hoB&(O0VcN}lPm68fnb=l&#!*sP6Q@L zpEA+Q)?zF`i$7oNx7<f)J7@h8vc-6?@le#Eou%zjwDA^iVG8NalEz)N8SU^ z00BC(uCWH!r_>~ZjJF8&T2cyZq7>tFf@^!%B?HmqyAdxjNtn@%9pTNF;JAUu&wH8- z{$t(d*luPE#kzL{n-*CZur0nYX=RI1-a|~?aQ+RozN*xGdH+}UQIZ>QO)u1@voY$! z{Yjj^22U-#DRRQ7Et%WeN(^K-&N;xK|N1q+cwW&yU8jZn;CeW;%rg52zN;U7dbe=D z+rPqpIpD4;Dq$jnVzyRAa1Ff?>RHz+`GhQisUYJfh5JS=7HWc-I^*Mu?na{U_Ufe= z8$c4r?LNW6qES^*(H+5Irclhu-^qz7%)a!r)o=J51Ug6xRk!gKB-5`uJ{v<$-}SSI ztVH-fiZ9F;u5Ltiu)V#WPNj$(Wt!H&KU1K_vyu@+Q`Fn3NK|Hhuln&yEfL;S!*39_bAv+LJAFnF!6*o6m|QpTynUESc5pl7_<(Hb{w1&GO?1Bgyuz5aXSveK;rw6P zN3IlGwy;E%NR{-p@z3NRnC1JBt%+YoXd?#R_Op|?>j}L?M^k{lt7*)T+jB6xrLobe zGol^uwZH7p5HAu4_X+tN`gwIJimd&E?!P*W?S9B3u(1;v%D{c6#6lnO^$WEh2CSWO zRcsxeUiHOSts2~dKnWjuxZ-b5F1ZcGnOcq~4FN#~fBqwmFxX)FjK1gO&m#$Iz#$;& zGBrH#Xjquh3m^FYAdaK-Ao%H6TzC1>n_5n`5mwepH ziro;og5(si!6Q)}&~x)G-h+JCpP*Qz+wR^xq9&C1{NmM?89|->=Ho-`<>r_`FM%~w z&8@JnAov44&-DEPvq*-JHsTnPYXZY#*3QIuZ!Q!#$<}rp4FW!HMAW_a#{FNoXMxS< z%MjhgE7bxmVKZc_?2k2u;T|Ixxs=&&oRk3(a7t@1h&d#MpAed4S@ChDD#;x!;vK&) z__F}G)KE{ZfYW5|Y&St>otlffwoy`wWz|ucPm9oBHHln^{A@QG)^SXI_P5d$%Qs&W{?u_~9pXOXb|{&_la}M<6qui^fV-~N-CI$^&etufkv@s4 zfh1KIFq?R61}PIy`GTT4eih=YZ*j%QM~O|pREXtsx~a#N0MEba3}buH!s?D={9!;= zqJ1NFIl=u}4%Apz=J&so=ck9Rz4xH~22&?C(^fLkXWh|yoXbbiLywIIT(4UcPBF1e zO{++beWSd_vr@MLY(O2Vb})ue^@mah47|(MPcfLpS^$=~@Gj6kv4^Y2x51#q z=kI-nS`P!#*6tPGixp3TsPPlVTn0yl)-o~NvGW`ASs18V(oxCNiojgZ-iS9El-PmT z<8ilYm1Or|)q@@4Xw5(S6_yOh$&N(6YD44a2s?H0{KY&jO+=5AaE(htQ`O`oDk`|V z?fYs3B^_p)ZICTvw{M~lRE=9oRZ~uE8Ug|X`BgjC%ZV1Eq3<^oKH)oZcfzjHIbA$FJ})K~?!Kx# z%-3+rY3Ih$J%XMb$w$S7&qi^6rA~rqI)`+&9D)L5Hw)8X>rO&4f920co0nR+THRu; zWM5Fbw#NMK8BTb^0~%|GVP6+i(~|8jxIY;RnkRC%8}PLM8gg6*E{ImYMArpCBfwrn zq=yf%-XLxCMV`Ehl9nmYqnE-_9DVs-MVrEhw+cGS)6}73YI|?ox{v(`-6ZLV_K+Gr zYQi}Kt^|on;3&$6PeeZBwom*1|Ad7@=d(i_D6Kbl3NUXnxa1i|u1R~p4MwXV#nY9{uB}FoGmZLKf`F0o zhoo?{yinA4Rn03gRL#uGduyCzVFw2@_NOA?M4RphFm5T16h+TD!ewY^=nCf*6Fdx_ zqTgfB_rb7TWXU?DQ;x{TH7ut#n0ZVx<5;$Oj4>&r5-LTHOLNzET=+TL2{FXIZmIuB_P()@zl&NoMrs0Y;|K`uh5ZbW3}awio>V*bM3 z7`jr!b9M7xM}J9EZ|hrPG0V`GjDhz;D?o|^{nTn2Cg81W7{3eJoyZ{u4j_dA^;G)! zJ)^F<`2xFYY8{&`w&#*OT+WvzNmzgUsUN42)CWDx1Mr!$e6`y z=^$bib ~(6rpcu8mX)4lPxU*QDb$;v~EL2+nGcP5C9^wYXBrT42L=G$=x^T5lMS zxK4y|0Y|XVuQ8(F&XqGMe-GcF)Pt~~o^Wf_CIUgw%V2EYQ;nXg!$mNU$J0M8F1uC> zU*Ig9Mze+C>}-*pA5DpUV*=wo0*S&u2gqYEWY;k6xfzpOtt@NW+G9F|09j=n$6c-V zu!mX3u)6@r$d4aTv1U$x9*TQ{qTR;6`8W^MJ?=&1J{gthEb(=^+6+;+@@A9k1yqlM zbU;l-9wkhf(A6efl*O=r$z4mGYKEM&jOxC_Jx*YxgJ^VRJ}@LzW--GbO7Jw}%AXCX z4~dHkN6!xYT%ycs3OYInV~o{Vok97c*-$Ga+XY3LbEKG5={`ehQ+R9{-oXxif1~_( zHzN9ML`Oy&A!%$0hTBN<0|y=I^7sDV2LE?1rn+37JEM}|eQ?Jg z#W5M2T8GPBh-C|kwrZoYOBbG`v)Ny-$g{c50N#R+yvYf6b3g9_2M6O4-`!gX$S8mI z1f=6r4e6%D#~ntgi=%J%#5&rhdy|HS>mm}beG!AF1ff9xsj4OwmLODlub8{u8BUe{ z_d|*#WAv-nXrz`1@(xV;SeubSc?2T~S>eCMbK|_OhRhOPMa;MxfOh&kb7Io07s>ky zI^P*9SDJNInc^hXkFZB{rFYr)cnLib=mzf?XuOX4L%*r=@%vB8C%kH1UOw1~ zq8_jc4!rOg%#^2?#(5?@~#L`JR#D1T07E~H={itz;#rp+W{bDv8XQoKI_#!S_c zLk%I%a0~sm#@{cYA5mZ=Np0hmev@tPCF*Emz2Nwgs&v_ha&Iry-KWEky;|pHCd&tQ zB!In84`9q~#ztkpVmI3d_MN;O2v>F30?+;5Juj@Bo8ERU{?g{y*M*_EYVmtY#m_3{_*7;(U@0^1v;ehU7{Xxpl_>C&<~gwqdIGwxtunbsS6h}`Ty z)s_o1Wy!s1JBU(ZWmYYwM#zuEYseaXWoTu6cpK3h0+NHf^KOJiW4&<4G(ofL;^Sj? zbt<48Oxr~WD3hC#N&KLLCkqGnWNUaUo&@V1goC~VFkf&uClI|A$MKOs>R}h}Qq;wvQjN#`j0!l|xpSJbV`8ml0M{3)KXF@sYz z-x~{L`@khS^WLm_Mfq(kbcPQG9D>)911ph^lP2^z!OHNefGA_L(m*!=mtfBqUSjxE zA|t>OScWnB=oB_yGzk##FLX&e;f?a$fnn5}ukmU_<8%iE6sd803*C|=C5D-a zOHv{13o*Jl3lBYl@7EW)8+li3a<2x4dNy=)urvp1iP;AY{I_M4W!FELJDa5_EL$z~ z_ZxndoF#aWy?YG0MhYY9+5c)~48$`8xj~0Bt-)n#BHy38F}3YNzsy)aVk^+(O%1l% zafixhWwct%+|OBuHb1!C@=_^tj+m_R@bUHY!|&@V>&r^K98FxpQQxGG{baH_wWRDhDT zg(R};ataXZ&+6>|t`%snf>p$Tf@+KtQ>dl+LGH7YT(w6CFy66f^;c%&xn-0*e*HFT zIN6MhzvR45Pe3ic25O`c9HMXV^;2~zMW!sRl>VUIcl*&aUdOEwtrAru!#FtPXwUKT z`L{h0+a(zIuJ(K6Z2N(Os#;%_iUPI&8^(PqQHg=c!Xh@w>-8by>*aa@y%+=eh0*C3 zsU*Z^<;O;wRP)LLLO1Z-Gqectx`Pb4EPy*>5pYtOH;Q)sYu?^qrU5G0gik}}y!KXp zhIl&IC5qboS+DQ(OTC)UePrG6qt=pd73)D=-%kL!;USB;ZMOoK*w`#T^Tm?jy0?$j z3$(1v;F#XMNqofi>Z7b6M^RsaCZHIG-dc1^br^ns|DKqS8Yj+d`@(o4{yebtYX8Ml zRyhc+y)sV$U7dSiDPti$|AjYDQY#WEAC)P^zDn`~yINUh#%Fbl>66Fl#;5aE3VbZp z7)g1s;qi_5k2c|F4up+RWvTy}2#^b~mdkG&ZpQdu%=ENMVy%^wzIel0;;DXX>=|-- z?^pvShN2#`-SZ}+d+(CNC+&r(4QdSb1qK0@Ph0H4x`OdN1Hkj8;q&KRGlT>7<>-66 zj+crHv62kD#l31J=Z`7}`7`B5xzNA=b^16?xg9;UvH{vBxH(TXucKd=KsX`ZF_&pS z#Z7#C$sKbKBCSO9pYUTbJ4lNLA5-}}hsz$cQzgLUoaHE*FL)sYUb|?A7z&zQyW51! zGNwdOI&V_u*bsRx9A(}j$E9A7PtWDZKQ?sUny6EtIj;$Oe?dE>6aN!02)TWf{~SMG zL3tVF@^2xD8${+nDYF%G-+o-fx$1ZkxzkYN-W_j%Y^wr(27s*VvTMWT z^!tdVQ>`J_C((QS?JG?WL%gn39pA4buHs|G_OSJ^Q2EkK#iU_}3Y~tO9Asp2grh_B z_mHo|u{tkbaFU4t>i)chs&iN^oERM00^~OyMOe`*GsRwuLZdgSsBqXOfmh<0@AgF! zGsknru<)s`;Q0dDqthkST^)3OR@$YYabNB>WbmwD?#=29sV}fD|B@%Ej)E>F8;y(X zp+Jf=1>qJrzUybHzlutdXNF=_|BF5>-9iu4cS*`8QXiD{)nf*?9E^W4Q(-*qp3`7` zCBJ}HMsfn@B3IL@i&I8{nhX?@)n4LTDO9C(=F8`<1-~q+B&D)53cMAf(<>;RGrKuC zEoq7~pIE2ncShUl+R7x3wi>=3mV95av&JB$)CV*tNMFPlaS&0Dk*ml{VkLIs>e8ro zg*6=a&eh3lGa+#*Woi4Fc3(u%#oVfiiYtd3*~B{Xci8B21{e#8`3WB$VDDhYHtKQi znjhrA8*bXB$t;Ew?|oUibyE6&ZuVyvzn}dqh#r3@RfiSV~ETOHhlEi|o5mV67GRiN_#j9Ui-v_pOzG*Nt5f~RquPvRRow5A^t zsQZubuH0$qno_o<)F#N(%?(OD7$v8+PFXZ6`?PpXl9P~JD}#9fX~Js~;w64bNMAy- z0U+t6>I3%sJiSWk*TqfqU3-pf*1vie+~&>HSTr<&xqk@*y%LOFTE6e!o)mbhq&8|8 zxuu?Caf3~iZJ!79ZiFObe$U1xq%wG$i53vbUDTkZ1*lro=ex^J^)FVk@BDtZVhi6f zxE|pzOhYRRZKVpg{xi3vg8O;Gmp1N%ju_?d?&rRjKs`#bpZ=U0NHKxKihQDpr7Bns z-Ed~P=6dX_k};!7-` zIWxo1J|XNLZ#r@t@hVp`E#uK(j_U521WJ6_fAvCfoM%#6XQmAj2Bv`@^om6rMby?A zy|B3%qT!KQc&(Lz!ntxz^f5Whq-Cfh{Xl;y4A?rP$<%WZ&Z>!uXFnKc+p&7s3MKi!oC?SYxOD9<&)r zbu!(+t9Muiiv;LUws@;}d1tI2_{Sg%@g@`gSI{6$cM@fByXHnb?^E8R)bCPzEnOCU z17PGb04xE(@x395t^G|i?7#bBNy?&ClWY4fg9avGxW5qi z5H{oXS@XK{Uul%QK47%z3?$yhnPe%&ULx%q*`vb$(yVPGRps6ns-IdnfXL2Y=rrRS7eXQL{wKFkT&nn)yJ77 zC)=;opVfh)8JBb6oXyz{t@ztZ;5gh1gf_M(;H!uU}7DjhM%m zje1tmr)xy89V8sdG&}pL>jKjB=nSc7Xyxf4{|DNX3kqgx_bzh6-91q?6QfNqSo@~y zRW)Vn)7pQr2{`ArYN9VOK|k(-VH`nmY}xsAnYS?7{L#^*AImkagg$q&C=XZuTCKlW z^lG{6Qj3xomLv;? z?3B+_w#DE79+~56y)$KVb^sZ$pyFoQn<25*cQ*By#wi4W7TukyTUvxzFU!8LewD+K zLaT2T4M@|~lCAu0jp$jyeCjdv2k|TFzS(_aF@`7A`&p${lWOurIJo|}vtb&V+OQuv z&BKDI9-vdcqmSWFs8hUcM=wWjA+$7Uq3w~^lw3ozxVZ8SlBCM)KFtvQ4f=RjA>iD; zWl^Nr^#912Pg^cefAA%C_@kMkx%#{692FE)CDD{lthIpV>FwwREdBz}0HBmLjBI`Q zD|_|-v)g#}TXSS~{xD7P2*2uHJidcUAKuyM~ z@#}GZlD-bcwtL|#jD9Hpk^Jo5ndACR^=|1X`GvbNL8~P)?=T;<9onP`QM|4kE7W5d z#Fk(6)E?qB(OVGX8R#fBkZY4rSk|~u3^f`4E@c|QcAK=`b;G)qSDn6q!+Jq-125}$ zt0MjF=U;d=`KvkP*zH-&$97dVbz=RJt=I}u6>~*v->56G#<~D=DA^6#@Wa%@ndxp5_ULKgFBKx_|l_A=0urRI2u=NpEZ6tYi8dzaCI zx)D_cQ7VBtqdp%vmj}#EuXH`21xR2(7Ec{j*UAVMLJ#{EFI^Tof5eT*t_|4Tc*=;B zER@W&$n7=d(;5gG;QhFchWNVo4B%b%8!px;b!iMgrlEk9POPjUMcy`)^?S!ozCJFMVmY%U@A(U+;jn~bO3UcEAgdOkB_ z8B8#}ZHylnO+Q4Kmn^L}MmQ^Y_qvV(i8fmP**o+%=}p#_-CK_H74?`R!IqaMcS$v4 zWC_>6T<*LXv^WX`(?U4uPEqT)|D(jQusIu5JC7520~Y@9^Xi5P=G&rFd@3 zmuAY@BptRx;KPcQKs?7k1&S6@iu#oZLHc|pu>~pA2Iwzg*xblXFnWEHeri;meJQPs z_Vj1nJ;?K}gvAp8O6>IBaX#}#524!`hqb1wWtO2J7n^*%(QWc=6hC7%y= zw6LyZw;Uv)`SJVCkqYn9G>LvJGyZv!v2FIyQ{F8D#!Mf@4p2s{7G>U@8*@rs`j{MV zbB4D)W~2Q;?64qrC|_lCDnpNEtb&B7m}MUg7DbJAvnR2?1iRkiBp9zW(5~n{-w_

gx7#BQL%yJ~6cQ$uqq?WWZ&x7@^- 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%0D4OM@{z9&vb-J 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

v0J`B%2r(T(plzZdWYz^nP_zDy$hzR?p0-2!6f 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�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 BoHYOd diff --git a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs index d6ff2000c..f9c42db9d 100644 --- a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs +++ b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs @@ -13,13 +13,13 @@ namespace Barotrauma class BackgroundSprite { public readonly BackgroundSpritePrefab Prefab; - public Vector2 Position; + public Vector3 Position; public float Scale; public float Rotation; - public BackgroundSprite(BackgroundSpritePrefab prefab, Vector2 position, float scale, float rotation = 0.0f) + public BackgroundSprite(BackgroundSpritePrefab prefab, Vector3 position, float scale, float rotation = 0.0f) { this.Prefab = prefab; this.Position = position; @@ -99,15 +99,26 @@ namespace Barotrauma rotation += Rand.Range(prefab.RandomRotation.X, prefab.RandomRotation.Y, false); - var newSprite = new BackgroundSprite(prefab, - (Vector2)pos, Rand.Range(prefab.Scale.X, prefab.Scale.Y, false), rotation); + var newSprite = new BackgroundSprite(prefab, + new Vector3((Vector2)pos, Rand.Range(prefab.DepthRange.X, prefab.DepthRange.Y, false)), Rand.Range(prefab.Scale.X, prefab.Scale.Y, false), rotation); - int x = (int)Math.Floor(((Vector2)pos).X / GridSize); - if (x < 0 || x >= sprites.GetLength(0)) continue; - int y = (int)Math.Floor(((Vector2)pos).Y / GridSize); - if (y < 0 || y >= sprites.GetLength(1)) continue; + Vector2 spriteSize = newSprite.Prefab.Sprite.size * newSprite.Scale; - sprites[x,y].Add(newSprite); + int minX = (int)Math.Floor((newSprite.Position.X - spriteSize.X / 2 - newSprite.Position.Z) / GridSize); + int maxX = (int)Math.Floor((newSprite.Position.X + spriteSize.X / 2 + newSprite.Position.Z) / GridSize); + if (minX < 0 || maxX >= sprites.GetLength(0)) continue; + + int minY = (int)Math.Floor((newSprite.Position.Y - spriteSize.Y / 2 - newSprite.Position.Z) / GridSize); + int maxY = (int)Math.Floor((newSprite.Position.Y + spriteSize.Y / 2 + newSprite.Position.Z) / GridSize); + if (minY < 0 || maxY >= sprites.GetLength(1)) continue; + + for (int x = minX; x <= maxX; x++) + { + for (int y = minY; y <= maxY; y++) + { + sprites[x, y].Add(newSprite); + } + } } } @@ -120,6 +131,8 @@ namespace Barotrauma Rand.Range(0.0f, level.Size.X, false), Rand.Range(0.0f, level.Size.Y, false)); + if (!prefab.SpawnOnWalls) return randomPos; + var cells = level.GetCells(randomPos); if (!cells.Any()) return null; @@ -178,49 +191,80 @@ namespace Barotrauma public void DrawSprites(SpriteBatch spriteBatch, Camera cam) { Rectangle indices = Rectangle.Empty; - indices.X = (int)Math.Floor(cam.WorldView.X / (float)GridSize) - 2; + indices.X = (int)Math.Floor(cam.WorldView.X / (float)GridSize); if (indices.X >= sprites.GetLength(0)) return; - - indices.Y = (int)Math.Floor((cam.WorldView.Y - cam.WorldView.Height) / (float)GridSize) - 2; + indices.Y = (int)Math.Floor((cam.WorldView.Y - cam.WorldView.Height) / (float)GridSize); if (indices.Y >= sprites.GetLength(1)) return; - indices.Width = (int)Math.Ceiling(cam.WorldView.Right / (float)GridSize) + 2; + indices.Width = (int)Math.Floor(cam.WorldView.Right / (float)GridSize)+1; if (indices.Width < 0) return; - indices.Height = (int)Math.Ceiling(cam.WorldView.Y / (float)GridSize) + 2; + indices.Height = (int)Math.Floor(cam.WorldView.Y / (float)GridSize)+1; if (indices.Height < 0) return; indices.X = Math.Max(indices.X, 0); indices.Y = Math.Max(indices.Y, 0); - indices.Width = Math.Min(indices.Width, sprites.GetLength(0)); - indices.Height = Math.Min(indices.Height, sprites.GetLength(1)); + indices.Width = Math.Min(indices.Width, sprites.GetLength(0)-1); + indices.Height = Math.Min(indices.Height, sprites.GetLength(1)-1); float swingState = (float)Math.Sin(swingTimer * 0.1f); + List visibleSprites = new List(); + float z = 0.0f; - for (int x = indices.X; x < indices.Width; x++) + for (int x = indices.X; x <= indices.Width; x++) { - for (int y = indices.Y; y < indices.Height; y++) + for (int y = indices.Y; y <= indices.Height; y++) { foreach (BackgroundSprite sprite in sprites[x, y]) { - sprite.Prefab.Sprite.Draw( - spriteBatch, - new Vector2(sprite.Position.X, -sprite.Position.Y), - Color.White, - sprite.Rotation + swingState*sprite.Prefab.SwingAmount, - sprite.Scale, - SpriteEffects.None, - z); - - if (GameMain.DebugDraw) + int drawOrderIndex = 0; + for (int i = 0; i < visibleSprites.Count; i++) { - GUI.DrawRectangle(spriteBatch, new Vector2(sprite.Position.X, -sprite.Position.Y), new Vector2(10.0f, 10.0f), Color.Red, true); + if (visibleSprites[i] == sprite) + { + drawOrderIndex = -1; + break; + } + + if (visibleSprites[i].Position.Z > sprite.Position.Z) + { + break; + } + else + { + drawOrderIndex = i + 1; + } } - z += 0.0001f; + if (drawOrderIndex >= 0) + { + visibleSprites.Insert(drawOrderIndex, sprite); + } } } } + + foreach (BackgroundSprite sprite in visibleSprites) + { + Vector2 camDiff = new Vector2(sprite.Position.X, sprite.Position.Y) - cam.WorldViewCenter; + camDiff.Y = -camDiff.Y; + + sprite.Prefab.Sprite.Draw( + spriteBatch, + new Vector2(sprite.Position.X, -sprite.Position.Y) - camDiff * sprite.Position.Z / 10000.0f, + Color.Lerp(Color.White, Level.Loaded.BackgroundColor, sprite.Position.Z / 5000.0f), + sprite.Rotation + swingState * sprite.Prefab.SwingAmount, + sprite.Scale, + SpriteEffects.None, + z); + + if (GameMain.DebugDraw) + { + GUI.DrawRectangle(spriteBatch, new Vector2(sprite.Position.X, -sprite.Position.Y), new Vector2(10.0f, 10.0f), Color.Red, true); + } + + z += 0.0001f; + } } private BackgroundSpritePrefab GetRandomPrefab(string levelType) diff --git a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpritePrefab.cs b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpritePrefab.cs index 3f98f6206..1568b2caf 100644 --- a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpritePrefab.cs +++ b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpritePrefab.cs @@ -13,10 +13,14 @@ namespace Barotrauma public readonly Vector2 Scale; + public bool SpawnOnWalls; + public readonly bool AlignWithSurface; public readonly Vector2 RandomRotation; + public readonly Vector2 DepthRange; + public readonly float SwingAmount; public readonly int Commonness; @@ -34,9 +38,13 @@ namespace Barotrauma Commonness = ToolBox.GetAttributeInt(element, "commonness", 1); + SpawnOnWalls = ToolBox.GetAttributeBool(element, "spawnonwalls", true); + Scale.X = ToolBox.GetAttributeFloat(element, "minsize", 1.0f); Scale.Y = ToolBox.GetAttributeFloat(element, "maxsize", 1.0f); + DepthRange = ToolBox.GetAttributeVector2(element, "depthrange", Vector2.Zero); + AlignWithSurface = ToolBox.GetAttributeBool(element, "alignwithsurface", false); RandomRotation = ToolBox.GetAttributeVector2(element, "randomrotation", Vector2.Zero); From d6c292a2ccb568e8e89f326b30fa9a3e08c39d6c Mon Sep 17 00:00:00 2001 From: juanjp600 Date: Tue, 7 Mar 2017 13:44:42 -0300 Subject: [PATCH 39/44] SharpFont + ScalableFont implementation https://github.com/Robmaister/SharpFont TODO: replace Code Bold.otf with the full version, fix any bugs, build on Linux, possibly move ToolBox string wrapping and limiting logic to ScalableFont class for better results. --- SharpFont/.gitignore | 52 + SharpFont/.gitmodules | 4 + .../freetype2/2.5.4-alldeps/README.md | 5 + .../patches/fttypes-h-win32.patch | 58 + .../freetype2/2.5.5-alldeps/README.md | 5 + SharpFont/Dependencies/freetype2/FTL.TXT | 169 ++ SharpFont/Dependencies/freetype2/README.md | 86 + SharpFont/Dependencies/freetype2/win64.patch | 71 + SharpFont/LICENSE | 21 + SharpFont/Makefile | 16 + SharpFont/README.md | 120 + SharpFont/Source/.editorconfig | 12 + SharpFont/Source/Settings.StyleCop | 97 + SharpFont/Source/SharpFont.dll.config | 6 + SharpFont/Source/SharpFont.sln | 45 + SharpFont/Source/SharpFont.snk | Bin 0 -> 596 bytes SharpFont/Source/SharpFont/SharpFont.csproj | 65 + .../SharpFontShared/AutoHinterScript.cs | 138 + SharpFont/Source/SharpFontShared/BBox.cs | 190 ++ .../Bdf/Internal/PropertyRec.cs | 45 + .../Source/SharpFontShared/Bdf/Property.cs | 121 + .../SharpFontShared/Bdf/PropertyType.cs | 46 + .../Source/SharpFontShared/BitmapGlyph.cs | 207 ++ .../Source/SharpFontShared/BitmapSize.cs | 145 + .../Source/SharpFontShared/Cache/CMapCache.cs | 100 + .../SharpFontShared/Cache/FaceRequester.cs | 47 + .../SharpFontShared/Cache/ImageCache.cs | 173 ++ .../Source/SharpFontShared/Cache/ImageType.cs | 116 + .../Cache/Internal/CMapCacheRec.cs | 34 + .../Cache/Internal/ImageCacheRec.cs | 34 + .../Cache/Internal/ImageTypeRec.cs | 38 + .../Cache/Internal/ManagerRec.cs | 34 + .../SharpFontShared/Cache/Internal/NodeRec.cs | 34 + .../Cache/Internal/SBitCacheRec.cs | 34 + .../SharpFontShared/Cache/Internal/SBitRec.cs | 46 + .../Cache/Internal/ScalerRec.cs | 40 + .../Source/SharpFontShared/Cache/Manager.cs | 274 ++ .../Source/SharpFontShared/Cache/Node.cs | 87 + .../Source/SharpFontShared/Cache/SBit.cs | 185 ++ .../Source/SharpFontShared/Cache/SBitCache.cs | 173 ++ .../Source/SharpFontShared/Cache/Scaler.cs | 146 + .../SharpFontShared/Cff/HintingEngine.cs | 40 + SharpFont/Source/SharpFontShared/CharMap.cs | 170 ++ .../ClassicKernValidationFlags.cs | 47 + SharpFont/Source/SharpFontShared/Data.cs | 89 + .../Source/SharpFontShared/EmbeddingTypes.cs | 88 + SharpFont/Source/SharpFontShared/Encoding.cs | 135 + SharpFont/Source/SharpFontShared/Error.cs | 298 ++ .../Source/SharpFontShared/FT.Internal.cs | 770 ++++++ SharpFont/Source/SharpFontShared/FT.Public.cs | 262 ++ SharpFont/Source/SharpFontShared/FTBitmap.cs | 546 ++++ SharpFont/Source/SharpFontShared/FTList.cs | 195 ++ SharpFont/Source/SharpFontShared/FTMatrix.cs | 250 ++ SharpFont/Source/SharpFontShared/FTSize.cs | 269 ++ SharpFont/Source/SharpFontShared/FTStream.cs | 315 +++ .../Source/SharpFontShared/FTUnitVector.cs | 46 + SharpFont/Source/SharpFontShared/FTVector.cs | 240 ++ .../Source/SharpFontShared/FTVector26Dot6.cs | 164 ++ SharpFont/Source/SharpFontShared/Face.cs | 2412 +++++++++++++++++ SharpFont/Source/SharpFontShared/FaceFlags.cs | 145 + .../Source/SharpFontShared/Fixed16Dot16.cs | 752 +++++ .../Source/SharpFontShared/Fixed26Dot6.cs | 579 ++++ .../Source/SharpFontShared/Fixed2Dot14.cs | 546 ++++ .../Source/SharpFontShared/Fnt/Header.cs | 594 ++++ .../SharpFontShared/Fnt/Internal/HeaderRec.cs | 77 + .../Source/SharpFontShared/Fnt/WinFntID.cs | 148 + .../SharpFontShared/FreeTypeException.cs | 153 ++ SharpFont/Source/SharpFontShared/Gasp.cs | 70 + SharpFont/Source/SharpFontShared/Generic.cs | 156 ++ SharpFont/Source/SharpFontShared/Glyph.cs | 444 +++ .../Source/SharpFontShared/GlyphBBoxMode.cs | 50 + .../Source/SharpFontShared/GlyphFormat.cs | 67 + .../Source/SharpFontShared/GlyphMetrics.cs | 180 ++ SharpFont/Source/SharpFontShared/GlyphSlot.cs | 475 ++++ .../GlyphToScriptMapProperty.cs | 96 + .../IncreaseXHeightProperty.cs | 97 + .../Internal/BitmapGlyphRec.cs | 38 + .../SharpFontShared/Internal/BitmapRec.cs | 48 + .../SharpFontShared/Internal/BitmapSizeRec.cs | 52 + .../SharpFontShared/Internal/CharMapRec.cs | 46 + .../SharpFontShared/Internal/FaceRec.cs | 90 + .../SharpFontShared/Internal/GenericRec.cs | 36 + .../Internal/GlyphMetricsRec.cs | 53 + .../SharpFontShared/Internal/GlyphRec.cs | 38 + .../SharpFontShared/Internal/GlyphSlotRec.cs | 74 + .../Internal/GlyphToScriptMapPropertyRec.cs | 36 + .../Internal/IncreaseXHeightPropertyRec.cs | 36 + .../SharpFontShared/Internal/ListNodeRec.cs | 39 + .../SharpFontShared/Internal/ListRec.cs | 36 + .../SharpFontShared/Internal/MemoryRec.cs | 40 + .../Internal/ModuleClassRec.cs | 50 + .../SharpFontShared/Internal/NativeObject.cs | 33 + .../Internal/NativeReference.cs | 58 + .../SharpFontShared/Internal/OpenArgsRec.cs | 48 + .../Internal/OutlineFuncsRec.cs | 43 + .../Internal/OutlineGlyphRec.cs | 36 + .../SharpFontShared/Internal/OutlineRec.cs | 42 + .../SharpFontShared/Internal/ParameterRec.cs | 41 + .../Internal/RasterFuncsRec.cs | 40 + .../Internal/RasterParamsRec.cs | 50 + .../Internal/RendererClassRec.cs | 44 + .../Internal/SizeMetricsRec.cs | 46 + .../SharpFontShared/Internal/SizeRec.cs | 39 + .../Internal/SizeRequestRec.cs | 48 + .../SharpFontShared/Internal/SpanRec.cs | 39 + .../SharpFontShared/Internal/StreamDescRec.cs | 42 + .../SharpFontShared/Internal/StreamRec.cs | 51 + .../Source/SharpFontShared/KerningMode.cs | 49 + SharpFont/Source/SharpFontShared/LcdFilter.cs | 61 + SharpFont/Source/SharpFontShared/Library.cs | 897 ++++++ SharpFont/Source/SharpFontShared/ListNode.cs | 108 + SharpFont/Source/SharpFontShared/LoadFlags.cs | 196 ++ .../Source/SharpFontShared/LoadTarget.cs | 88 + SharpFont/Source/SharpFontShared/Memory.cs | 174 ++ SharpFont/Source/SharpFontShared/Module.cs | 43 + .../Source/SharpFontShared/ModuleClass.cs | 194 ++ .../MultipleMasters/Internal/MMAxisRec.cs | 42 + .../MultipleMasters/Internal/MMVarRec.cs | 39 + .../Internal/MultiMasterRec.cs | 39 + .../MultipleMasters/Internal/VarAxisRec.cs | 46 + .../Internal/VarNamedStyleRec.cs | 36 + .../SharpFontShared/MultipleMasters/MMAxis.cs | 111 + .../SharpFontShared/MultipleMasters/MMVar.cs | 134 + .../MultipleMasters/MultiMaster.cs | 114 + .../MultipleMasters/VarAxis.cs | 140 + .../MultipleMasters/VarNamedStyle.cs | 96 + SharpFont/Source/SharpFontShared/OpenArgs.cs | 204 ++ SharpFont/Source/SharpFontShared/OpenFlags.cs | 54 + .../OpenTypeValidationFlags.cs | 58 + .../Source/SharpFontShared/Orientation.cs | 66 + SharpFont/Source/SharpFontShared/Outline.cs | 698 +++++ .../Source/SharpFontShared/OutlineFlags.cs | 102 + .../Source/SharpFontShared/OutlineFuncs.cs | 404 +++ .../Source/SharpFontShared/OutlineGlyph.cs | 177 ++ .../Source/SharpFontShared/PInvokeHelper.cs | 78 + SharpFont/Source/SharpFontShared/ParamTag.cs | 62 + SharpFont/Source/SharpFontShared/Parameter.cs | 106 + SharpFont/Source/SharpFontShared/PixelMode.cs | 87 + .../SharpFontShared/PostScript/BlendFlags.cs | 105 + .../PostScript/DictionaryKeys.cs | 271 ++ .../PostScript/EncodingType.cs | 55 + .../SharpFontShared/PostScript/FaceDict.cs | 209 ++ .../SharpFontShared/PostScript/FaceInfo.cs | 267 ++ .../SharpFontShared/PostScript/FontInfo.cs | 157 ++ .../PostScript/Internal/FaceDictRec.cs | 54 + .../PostScript/Internal/FaceInfoRec.cs | 69 + .../PostScript/Internal/FontInfoRec.cs | 56 + .../PostScript/Internal/PrivateRec.cs | 82 + .../SharpFontShared/PostScript/Private.cs | 346 +++ .../Properties/AssemblyInfo.cs | 67 + SharpFont/Source/SharpFontShared/Raster.cs | 44 + .../Source/SharpFontShared/RasterFlags.cs | 64 + .../Source/SharpFontShared/RasterFuncs.cs | 210 ++ .../Source/SharpFontShared/RasterParams.cs | 237 ++ .../Source/SharpFontShared/RenderMode.cs | 80 + SharpFont/Source/SharpFontShared/Renderer.cs | 69 + .../Source/SharpFontShared/RendererClass.cs | 150 + .../Source/SharpFontShared/Settings.StyleCop | 97 + .../SharpFontShared/SharpFontShared.projitems | 187 ++ .../SharpFontShared/SharpFontShared.shproj | 12 + .../Source/SharpFontShared/SizeMetrics.cs | 167 ++ .../Source/SharpFontShared/SizeRequest.cs | 205 ++ .../Source/SharpFontShared/SizeRequestType.cs | 70 + SharpFont/Source/SharpFontShared/Span.cs | 112 + .../Source/SharpFontShared/StreamDesc.cs | 94 + SharpFont/Source/SharpFontShared/Stroker.cs | 392 +++ .../Source/SharpFontShared/StrokerBorder.cs | 53 + .../Source/SharpFontShared/StrokerLineCap.cs | 49 + .../Source/SharpFontShared/StrokerLineJoin.cs | 69 + .../Source/SharpFontShared/StyleFlags.cs | 49 + SharpFont/Source/SharpFontShared/SubGlyph.cs | 73 + .../Source/SharpFontShared/SubGlyphFlags.cs | 71 + .../SharpFontShared/TrueType/EncodingId.cs | 230 ++ .../SharpFontShared/TrueType/EngineType.cs | 55 + .../Source/SharpFontShared/TrueType/Header.cs | 396 +++ .../SharpFontShared/TrueType/HoriHeader.cs | 274 ++ .../TrueType/Internal/HeaderRec.cs | 65 + .../TrueType/Internal/HoriHeaderRec.cs | 73 + .../TrueType/Internal/MaxProfileRec.cs | 52 + .../TrueType/Internal/OS2Rec.cs | 113 + .../TrueType/Internal/PCLTRec.cs | 85 + .../TrueType/Internal/PostscriptRec.cs | 46 + .../TrueType/Internal/SfntNameRec.cs | 41 + .../TrueType/Internal/VertHeaderRec.cs | 73 + .../SharpFontShared/TrueType/MaxProfile.cs | 258 ++ .../Source/SharpFontShared/TrueType/OS2.cs | 532 ++++ .../Source/SharpFontShared/TrueType/Pclt.cs | 251 ++ .../SharpFontShared/TrueType/PlatformId.cs | 74 + .../SharpFontShared/TrueType/Postscript.cs | 179 ++ .../SharpFontShared/TrueType/SfntName.cs | 152 ++ .../SharpFontShared/TrueType/SfntTag.cs | 70 + .../SharpFontShared/TrueType/VertHeader.cs | 273 ++ .../TrueTypeValidationFlags.cs | 70 + Subsurface/Barotrauma.csproj | 17 + Subsurface/Content/CODE Bold.otf | Bin 0 -> 24108 bytes Subsurface/Content/Exo2-Light.otf | Bin 0 -> 65156 bytes Subsurface/Content/Exo2-Medium.otf | Bin 0 -> 65720 bytes .../Source/Characters/AI/EnemyAIController.cs | 10 +- .../Source/Characters/AI/HumanAIController.cs | 2 +- Subsurface/Source/Characters/Character.cs | 6 +- Subsurface/Source/Characters/CharacterInfo.cs | 2 +- Subsurface/Source/DebugConsole.cs | 4 +- Subsurface/Source/Fonts/ScalableFont.cs | 287 ++ Subsurface/Source/GUI/GUI.cs | 33 +- Subsurface/Source/GUI/GUIButton.cs | 2 +- Subsurface/Source/GUI/GUIComponent.cs | 2 +- Subsurface/Source/GUI/GUITextBlock.cs | 15 +- Subsurface/Source/GUI/GUITextBox.cs | 10 +- Subsurface/Source/GUI/GUITickBox.cs | 2 +- Subsurface/Source/GUI/LoadingScreen.cs | 2 +- Subsurface/Source/GameMain.cs | 10 +- .../Items/Components/Machines/Engine.cs | 2 +- .../Source/Items/Components/Machines/Pump.cs | 2 +- .../Items/Components/Machines/Reactor.cs | 12 +- .../Items/Components/Power/PowerContainer.cs | 4 +- .../Items/Components/Power/PowerTransfer.cs | 4 +- .../Items/Components/Signal/Connection.cs | 2 +- Subsurface/Source/Items/Inventory.cs | 2 +- Subsurface/Source/Map/Hull.cs | 4 +- Subsurface/Source/Map/MapEntityPrefab.cs | 2 +- Subsurface/Source/Map/WayPoint.cs | 4 +- Subsurface/Source/Networking/GameClient.cs | 14 +- Subsurface/Source/Networking/GameServer.cs | 18 +- Subsurface/Source/Networking/NetStats.cs | 8 +- Subsurface/Source/Program.cs | 4 +- Subsurface/Source/Screens/LobbyScreen.cs | 2 +- Subsurface/Source/Screens/MainMenuScreen.cs | 2 +- Subsurface/Source/Screens/ServerListScreen.cs | 2 +- Subsurface/Source/Utils/ToolBox.cs | 8 +- Subsurface/freetype6.dll | Bin 0 -> 452096 bytes Subsurface_Solution.sln | 69 +- 231 files changed, 28528 insertions(+), 94 deletions(-) create mode 100644 SharpFont/.gitignore create mode 100644 SharpFont/.gitmodules create mode 100644 SharpFont/Dependencies/freetype2/2.5.4-alldeps/README.md create mode 100644 SharpFont/Dependencies/freetype2/2.5.4-alldeps/patches/fttypes-h-win32.patch create mode 100644 SharpFont/Dependencies/freetype2/2.5.5-alldeps/README.md create mode 100644 SharpFont/Dependencies/freetype2/FTL.TXT create mode 100644 SharpFont/Dependencies/freetype2/README.md create mode 100644 SharpFont/Dependencies/freetype2/win64.patch create mode 100644 SharpFont/LICENSE create mode 100644 SharpFont/Makefile create mode 100644 SharpFont/README.md create mode 100644 SharpFont/Source/.editorconfig create mode 100644 SharpFont/Source/Settings.StyleCop create mode 100644 SharpFont/Source/SharpFont.dll.config create mode 100644 SharpFont/Source/SharpFont.sln create mode 100644 SharpFont/Source/SharpFont.snk create mode 100644 SharpFont/Source/SharpFont/SharpFont.csproj create mode 100644 SharpFont/Source/SharpFontShared/AutoHinterScript.cs create mode 100644 SharpFont/Source/SharpFontShared/BBox.cs create mode 100644 SharpFont/Source/SharpFontShared/Bdf/Internal/PropertyRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Bdf/Property.cs create mode 100644 SharpFont/Source/SharpFontShared/Bdf/PropertyType.cs create mode 100644 SharpFont/Source/SharpFontShared/BitmapGlyph.cs create mode 100644 SharpFont/Source/SharpFontShared/BitmapSize.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/CMapCache.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/FaceRequester.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/ImageCache.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/ImageType.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/Internal/CMapCacheRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/Internal/ImageCacheRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/Internal/ImageTypeRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/Internal/ManagerRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/Internal/NodeRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/Internal/SBitCacheRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/Internal/SBitRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/Internal/ScalerRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/Manager.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/Node.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/SBit.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/SBitCache.cs create mode 100644 SharpFont/Source/SharpFontShared/Cache/Scaler.cs create mode 100644 SharpFont/Source/SharpFontShared/Cff/HintingEngine.cs create mode 100644 SharpFont/Source/SharpFontShared/CharMap.cs create mode 100644 SharpFont/Source/SharpFontShared/ClassicKernValidationFlags.cs create mode 100644 SharpFont/Source/SharpFontShared/Data.cs create mode 100644 SharpFont/Source/SharpFontShared/EmbeddingTypes.cs create mode 100644 SharpFont/Source/SharpFontShared/Encoding.cs create mode 100644 SharpFont/Source/SharpFontShared/Error.cs create mode 100644 SharpFont/Source/SharpFontShared/FT.Internal.cs create mode 100644 SharpFont/Source/SharpFontShared/FT.Public.cs create mode 100644 SharpFont/Source/SharpFontShared/FTBitmap.cs create mode 100644 SharpFont/Source/SharpFontShared/FTList.cs create mode 100644 SharpFont/Source/SharpFontShared/FTMatrix.cs create mode 100644 SharpFont/Source/SharpFontShared/FTSize.cs create mode 100644 SharpFont/Source/SharpFontShared/FTStream.cs create mode 100644 SharpFont/Source/SharpFontShared/FTUnitVector.cs create mode 100644 SharpFont/Source/SharpFontShared/FTVector.cs create mode 100644 SharpFont/Source/SharpFontShared/FTVector26Dot6.cs create mode 100644 SharpFont/Source/SharpFontShared/Face.cs create mode 100644 SharpFont/Source/SharpFontShared/FaceFlags.cs create mode 100644 SharpFont/Source/SharpFontShared/Fixed16Dot16.cs create mode 100644 SharpFont/Source/SharpFontShared/Fixed26Dot6.cs create mode 100644 SharpFont/Source/SharpFontShared/Fixed2Dot14.cs create mode 100644 SharpFont/Source/SharpFontShared/Fnt/Header.cs create mode 100644 SharpFont/Source/SharpFontShared/Fnt/Internal/HeaderRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Fnt/WinFntID.cs create mode 100644 SharpFont/Source/SharpFontShared/FreeTypeException.cs create mode 100644 SharpFont/Source/SharpFontShared/Gasp.cs create mode 100644 SharpFont/Source/SharpFontShared/Generic.cs create mode 100644 SharpFont/Source/SharpFontShared/Glyph.cs create mode 100644 SharpFont/Source/SharpFontShared/GlyphBBoxMode.cs create mode 100644 SharpFont/Source/SharpFontShared/GlyphFormat.cs create mode 100644 SharpFont/Source/SharpFontShared/GlyphMetrics.cs create mode 100644 SharpFont/Source/SharpFontShared/GlyphSlot.cs create mode 100644 SharpFont/Source/SharpFontShared/GlyphToScriptMapProperty.cs create mode 100644 SharpFont/Source/SharpFontShared/IncreaseXHeightProperty.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/BitmapGlyphRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/BitmapRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/BitmapSizeRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/CharMapRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/FaceRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/GenericRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/GlyphMetricsRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/GlyphRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/GlyphSlotRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/GlyphToScriptMapPropertyRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/IncreaseXHeightPropertyRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/ListNodeRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/ListRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/MemoryRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/ModuleClassRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/NativeObject.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/NativeReference.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/OpenArgsRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/OutlineFuncsRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/OutlineGlyphRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/OutlineRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/ParameterRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/RasterFuncsRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/RasterParamsRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/RendererClassRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/SizeMetricsRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/SizeRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/SizeRequestRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/SpanRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/StreamDescRec.cs create mode 100644 SharpFont/Source/SharpFontShared/Internal/StreamRec.cs create mode 100644 SharpFont/Source/SharpFontShared/KerningMode.cs create mode 100644 SharpFont/Source/SharpFontShared/LcdFilter.cs create mode 100644 SharpFont/Source/SharpFontShared/Library.cs create mode 100644 SharpFont/Source/SharpFontShared/ListNode.cs create mode 100644 SharpFont/Source/SharpFontShared/LoadFlags.cs create mode 100644 SharpFont/Source/SharpFontShared/LoadTarget.cs create mode 100644 SharpFont/Source/SharpFontShared/Memory.cs create mode 100644 SharpFont/Source/SharpFontShared/Module.cs create mode 100644 SharpFont/Source/SharpFontShared/ModuleClass.cs create mode 100644 SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MMAxisRec.cs create mode 100644 SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MMVarRec.cs create mode 100644 SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MultiMasterRec.cs create mode 100644 SharpFont/Source/SharpFontShared/MultipleMasters/Internal/VarAxisRec.cs create mode 100644 SharpFont/Source/SharpFontShared/MultipleMasters/Internal/VarNamedStyleRec.cs create mode 100644 SharpFont/Source/SharpFontShared/MultipleMasters/MMAxis.cs create mode 100644 SharpFont/Source/SharpFontShared/MultipleMasters/MMVar.cs create mode 100644 SharpFont/Source/SharpFontShared/MultipleMasters/MultiMaster.cs create mode 100644 SharpFont/Source/SharpFontShared/MultipleMasters/VarAxis.cs create mode 100644 SharpFont/Source/SharpFontShared/MultipleMasters/VarNamedStyle.cs create mode 100644 SharpFont/Source/SharpFontShared/OpenArgs.cs create mode 100644 SharpFont/Source/SharpFontShared/OpenFlags.cs create mode 100644 SharpFont/Source/SharpFontShared/OpenTypeValidationFlags.cs create mode 100644 SharpFont/Source/SharpFontShared/Orientation.cs create mode 100644 SharpFont/Source/SharpFontShared/Outline.cs create mode 100644 SharpFont/Source/SharpFontShared/OutlineFlags.cs create mode 100644 SharpFont/Source/SharpFontShared/OutlineFuncs.cs create mode 100644 SharpFont/Source/SharpFontShared/OutlineGlyph.cs create mode 100644 SharpFont/Source/SharpFontShared/PInvokeHelper.cs create mode 100644 SharpFont/Source/SharpFontShared/ParamTag.cs create mode 100644 SharpFont/Source/SharpFontShared/Parameter.cs create mode 100644 SharpFont/Source/SharpFontShared/PixelMode.cs create mode 100644 SharpFont/Source/SharpFontShared/PostScript/BlendFlags.cs create mode 100644 SharpFont/Source/SharpFontShared/PostScript/DictionaryKeys.cs create mode 100644 SharpFont/Source/SharpFontShared/PostScript/EncodingType.cs create mode 100644 SharpFont/Source/SharpFontShared/PostScript/FaceDict.cs create mode 100644 SharpFont/Source/SharpFontShared/PostScript/FaceInfo.cs create mode 100644 SharpFont/Source/SharpFontShared/PostScript/FontInfo.cs create mode 100644 SharpFont/Source/SharpFontShared/PostScript/Internal/FaceDictRec.cs create mode 100644 SharpFont/Source/SharpFontShared/PostScript/Internal/FaceInfoRec.cs create mode 100644 SharpFont/Source/SharpFontShared/PostScript/Internal/FontInfoRec.cs create mode 100644 SharpFont/Source/SharpFontShared/PostScript/Internal/PrivateRec.cs create mode 100644 SharpFont/Source/SharpFontShared/PostScript/Private.cs create mode 100644 SharpFont/Source/SharpFontShared/Properties/AssemblyInfo.cs create mode 100644 SharpFont/Source/SharpFontShared/Raster.cs create mode 100644 SharpFont/Source/SharpFontShared/RasterFlags.cs create mode 100644 SharpFont/Source/SharpFontShared/RasterFuncs.cs create mode 100644 SharpFont/Source/SharpFontShared/RasterParams.cs create mode 100644 SharpFont/Source/SharpFontShared/RenderMode.cs create mode 100644 SharpFont/Source/SharpFontShared/Renderer.cs create mode 100644 SharpFont/Source/SharpFontShared/RendererClass.cs create mode 100644 SharpFont/Source/SharpFontShared/Settings.StyleCop create mode 100644 SharpFont/Source/SharpFontShared/SharpFontShared.projitems create mode 100644 SharpFont/Source/SharpFontShared/SharpFontShared.shproj create mode 100644 SharpFont/Source/SharpFontShared/SizeMetrics.cs create mode 100644 SharpFont/Source/SharpFontShared/SizeRequest.cs create mode 100644 SharpFont/Source/SharpFontShared/SizeRequestType.cs create mode 100644 SharpFont/Source/SharpFontShared/Span.cs create mode 100644 SharpFont/Source/SharpFontShared/StreamDesc.cs create mode 100644 SharpFont/Source/SharpFontShared/Stroker.cs create mode 100644 SharpFont/Source/SharpFontShared/StrokerBorder.cs create mode 100644 SharpFont/Source/SharpFontShared/StrokerLineCap.cs create mode 100644 SharpFont/Source/SharpFontShared/StrokerLineJoin.cs create mode 100644 SharpFont/Source/SharpFontShared/StyleFlags.cs create mode 100644 SharpFont/Source/SharpFontShared/SubGlyph.cs create mode 100644 SharpFont/Source/SharpFontShared/SubGlyphFlags.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/EncodingId.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/EngineType.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/Header.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/HoriHeader.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/Internal/HeaderRec.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/Internal/HoriHeaderRec.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/Internal/MaxProfileRec.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/Internal/OS2Rec.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/Internal/PCLTRec.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/Internal/PostscriptRec.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/Internal/SfntNameRec.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/Internal/VertHeaderRec.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/MaxProfile.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/OS2.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/Pclt.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/PlatformId.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/Postscript.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/SfntName.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/SfntTag.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueType/VertHeader.cs create mode 100644 SharpFont/Source/SharpFontShared/TrueTypeValidationFlags.cs create mode 100644 Subsurface/Content/CODE Bold.otf create mode 100644 Subsurface/Content/Exo2-Light.otf create mode 100644 Subsurface/Content/Exo2-Medium.otf create mode 100644 Subsurface/Source/Fonts/ScalableFont.cs create mode 100644 Subsurface/freetype6.dll diff --git a/SharpFont/.gitignore b/SharpFont/.gitignore new file mode 100644 index 000000000..18d28f582 --- /dev/null +++ b/SharpFont/.gitignore @@ -0,0 +1,52 @@ +#Output Directory +/[Bb]inaries + +#OS junk files +[Tt]humbs.db +*.DS_Store + +#Visual Studio files +*.exe +*.pdb +*.user +*.aps +*.pch +*.vspscc +*.vssscc +*_i.c +*_p.c +*.ncb +*.suo +*.tlb +*.tlh +*.bak +*.[Cc]ache +*.ilk +*.log +*.lib +*.sbr +*.sdf +ipch/ +obj/ +[Bb]in +[Dd]ebug*/ +[Rr]elease*/ +Ankh.NoLoad + +#Tooling +_ReSharper*/ +*.resharper +[Tt]est[Rr]esult* + +#Subversion files +.svn + +# Office Temp Files +~$* + +#MonoDevelop files +*.userprefs +*.pidb + +#NuGet +*.nupkg diff --git a/SharpFont/.gitmodules b/SharpFont/.gitmodules new file mode 100644 index 000000000..89d13d9b2 --- /dev/null +++ b/SharpFont/.gitmodules @@ -0,0 +1,4 @@ +[submodule "Dependencies"] + path = Dependencies + url = https://github.com/Robmaister/SharpFont.Dependencies.git + ignore = dirty diff --git a/SharpFont/Dependencies/freetype2/2.5.4-alldeps/README.md b/SharpFont/Dependencies/freetype2/2.5.4-alldeps/README.md new file mode 100644 index 000000000..205b22174 --- /dev/null +++ b/SharpFont/Dependencies/freetype2/2.5.4-alldeps/README.md @@ -0,0 +1,5 @@ +# Notes about these builds + +These builds are statically linked with Zlib 1.2.8, LibPNG 1.6.16, BZip2 1.0.6, and HarfBuzz 0.9.36 (From the ShiftMedia Project). + +The Freetype sources were patched with the fttypes-h-win32.patch file in the patches directory. This patch changes the fttypes.h file's usage of long to __int64 on Windows. diff --git a/SharpFont/Dependencies/freetype2/2.5.4-alldeps/patches/fttypes-h-win32.patch b/SharpFont/Dependencies/freetype2/2.5.4-alldeps/patches/fttypes-h-win32.patch new file mode 100644 index 000000000..20bfc2590 --- /dev/null +++ b/SharpFont/Dependencies/freetype2/2.5.4-alldeps/patches/fttypes-h-win32.patch @@ -0,0 +1,58 @@ +--- .\freetype-2.5.4\include\fttypes.h Tue Dec 2 07:12:12 2014 ++++ .\freetype-2.5.4-patched\include\fttypes.h Sun Dec 28 13:54:21 2014 +@@ -239,9 +239,12 @@ + /* */ + /* A typedef for signed long. */ + /* */ ++#ifdef _WIN32 ++ typedef signed __int64 FT_Long; ++#else + typedef signed long FT_Long; ++#endif + +- + /*************************************************************************/ + /* */ + /* */ +@@ -250,9 +253,12 @@ + /* */ + /* A typedef for unsigned long. */ + /* */ ++#ifdef _WIN32 ++ typedef unsigned __int64 FT_ULong; ++#else + typedef unsigned long FT_ULong; ++#endif + +- + /*************************************************************************/ + /* */ + /* */ +@@ -273,9 +279,12 @@ + /* A signed 26.6 fixed-point type used for vectorial pixel */ + /* coordinates. */ + /* */ ++#ifdef _WIN32 ++ typedef signed __int64 FT_F26Dot6; ++#else + typedef signed long FT_F26Dot6; ++#endif + +- + /*************************************************************************/ + /* */ + /* */ +@@ -285,9 +294,12 @@ + /* This type is used to store 16.16 fixed-point values, like scaling */ + /* values or matrix coefficients. */ + /* */ ++#ifdef _WIN32 ++ typedef signed __int64 FT_Fixed; ++#else + typedef signed long FT_Fixed; ++#endif + +- + /*************************************************************************/ + /* */ + /* */ diff --git a/SharpFont/Dependencies/freetype2/2.5.5-alldeps/README.md b/SharpFont/Dependencies/freetype2/2.5.5-alldeps/README.md new file mode 100644 index 000000000..88b40a02b --- /dev/null +++ b/SharpFont/Dependencies/freetype2/2.5.5-alldeps/README.md @@ -0,0 +1,5 @@ +# Notes about these builds + +These builds are statically linked with Zlib 1.2.8, LibPNG 1.6.16, BZip2 1.0.6, and HarfBuzz 0.9.36 (From the ShiftMedia Project). + +The Freetype sources were patched with the fttypes-h-win32.patch file in the ../2.5.4-alldeps/patches directory. This patch changes the fttypes.h file's usage of long to __int64 on Windows. \ No newline at end of file diff --git a/SharpFont/Dependencies/freetype2/FTL.TXT b/SharpFont/Dependencies/freetype2/FTL.TXT new file mode 100644 index 000000000..bbaba33f4 --- /dev/null +++ b/SharpFont/Dependencies/freetype2/FTL.TXT @@ -0,0 +1,169 @@ + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + http://www.freetype.org + + +--- end of FTL.TXT --- diff --git a/SharpFont/Dependencies/freetype2/README.md b/SharpFont/Dependencies/freetype2/README.md new file mode 100644 index 000000000..44673889a --- /dev/null +++ b/SharpFont/Dependencies/freetype2/README.md @@ -0,0 +1,86 @@ +FreeType2 +========= + +This directory contains all of the FreeType2 builds, a copy of the FreeType +Project License, and a patch file for when compiling new versions of freetype +for 64-bit Windows. + +**WARNING**: These are not standard builds of FreeType on Windows (for 64-bit) +and will not work as a drop-in replacement for someone else's build. This is +why the package is distributed on NuGet as *SharpFont.Dependencies* instead of +*freetype2.redist* or something similar. + +##Compiling FreeType on Windows + +The copies of `freetype6.dll` that the Examples project uses by default are +chosen based on what works on my machine, and I will probably update it as +soon as a new version of FreeType is released. This means that it may not work +on older versions of Windows. If this is the case, you can either modify +the project file to point to another included version of freetype or you can +compile FreeType yourself from source. + +**Note**: Any 32-bit copy of `freetype6.dll` works as a drop-in replacement, +including [this copy][1] from the GnuWin32 project. Older versions such as +that one may crash with a `EntryPointException` when using newer APIs. **This +is not true of 64-bit copies currently** + +Thanks to [this StackOverflow answer][2] for the directions: + + 1. Download the latest [FreeType source code][3]. + 2. Open `builds\win32\vc2010\freetype.sln` (or whatever version of Visual + Studio you have) in Visual Studio. + 3. Change the compile configuration from Debug to Release. + 4. Open the project properties window through Project -> Properties. + 5. In the `General` selection, change the `Target Name` to `freetype6` and + the `Configuration Type` to `Dynamic Library (.dll)`. + 6. **If compiling for 64-bit** + - Apply a patch to the source code (see [Known Issues](#known-issues)). + - Open up Configuration Manager (the last option in the dropdown menu when + changing your compile configuration) and change `Platform` to `x64`. + 7. Open up `ftoption.h` (in the project's `Header Files` section) and add the + following three lines near the `DLL export compilation` section: + +```C +#define FT_EXPORT(x) __declspec(dllexport) x +#define FT_EXPORT_DEF(x) __declspec(dllexport) x +#define FT_BASE(x) __declspec(dllexport) x +``` + +Finally, complile the project (`F6` or Build -> Build Solution). +`freetype6.dll` will be output to `objs\win32\vc2010`. If this is a build that +isn't included in [Dependencies][4], consider forking and submitting a pull +request with your new build. + +## Windows x64 + +A patch file, [win64.patch][5], is included in this directory that will force +several types to be 64 bits wide. On Linux and OS X, the native `long` type is +64 bits wide on x64, but on Windows, it's still 32 bits wide for backwards +compatibility of applications assuming `sizeof(long) == sizeof(int)`. A list +of the affected types: + + - `FT_Long` + - `FT_ULong` + - `FT_Fixed` + - `FT_F26Dot6` + - `FT_Pos` + +To apply the patch file, you need a copy of the `patch` utility built for +Windows. If using msysgit, it is already installed and is available from Git +Bash. Otherwise, a build is available from [GnuWin32][6]. Utilities such as +TortoiseDiff can provide a graphical way to do this same task. + +After downloading and decompressing FreeType2, copy `win64.patch` into the +root folder (i.e. the folder containing `builds/`, `/include`, `/src`, etc.) +and run the following command: + +``` +patch -p0 < win64.patch +``` + +[1]: http://gnuwin32.sourceforge.net/packages/freetype.htm +[2]: http://stackoverflow.com/a/7387618/1122135 +[3]: http://sourceforge.net/projects/freetype/files/freetype2/ +[4]: https://github.com/Robmaister/SharpFont.Dependencies +[5]: https://github.com/Robmaister/SharpFont.Dependencies/blob/master/freetype2/win64.patch +[6]: http://gnuwin32.sourceforge.net/packages/patch.htm diff --git a/SharpFont/Dependencies/freetype2/win64.patch b/SharpFont/Dependencies/freetype2/win64.patch new file mode 100644 index 000000000..a7da056a2 --- /dev/null +++ b/SharpFont/Dependencies/freetype2/win64.patch @@ -0,0 +1,71 @@ +diff -pNaur include_old/ftimage.h include/ftimage.h +--- include_old/ftimage.h Sat Mar 7 18:56:10 2015 ++++ include/ftimage.h Sat Mar 7 22:12:11 2015 +@@ -55,7 +55,11 @@ FT_BEGIN_HEADER + /* on the context, these can represent distances in integer font */ + /* units, or 16.16, or 26.6 fixed-point pixel coordinates. */ + /* */ +- typedef signed long FT_Pos; ++#if _WIN64 ++ typedef signed __int64 FT_Pos; ++#else ++ typedef signed long FT_Pos; ++#endif + + + /*************************************************************************/ +diff -pNaur include_old/fttypes.h include/fttypes.h +--- include_old/fttypes.h Sat Mar 7 21:46:14 2015 ++++ include/fttypes.h Sat Mar 7 21:52:41 2015 +@@ -239,7 +239,11 @@ FT_BEGIN_HEADER + /* */ + /* A typedef for signed long. */ + /* */ +- typedef signed long FT_Long; ++#if _WIN64 ++ typedef signed __int64 FT_Long; ++#else ++ typedef signed long FT_Long; ++#endif + + + /*************************************************************************/ +@@ -250,7 +254,11 @@ FT_BEGIN_HEADER + /* */ + /* A typedef for unsigned long. */ + /* */ +- typedef unsigned long FT_ULong; ++#if _WIN64 ++ typedef unsigned __int64 FT_ULong; ++#else ++ typedef unsigned long FT_ULong; ++#endif + + + /*************************************************************************/ +@@ -273,7 +281,11 @@ FT_BEGIN_HEADER + /* A signed 26.6 fixed-point type used for vectorial pixel */ + /* coordinates. */ + /* */ +- typedef signed long FT_F26Dot6; ++#if _WIN64 ++ typedef signed __int64 FT_F26Dot6; ++#else ++ typedef unsigned long FT_F26Dot6; ++#endif + + + /*************************************************************************/ +@@ -285,7 +297,11 @@ FT_BEGIN_HEADER + /* This type is used to store 16.16 fixed-point values, like scaling */ + /* values or matrix coefficients. */ + /* */ +- typedef signed long FT_Fixed; ++#if _WIN64 ++ typedef signed __int64 FT_Fixed; ++#else ++ typedef unsigned long FT_Fixed; ++#endif + + + /*************************************************************************/ diff --git a/SharpFont/LICENSE b/SharpFont/LICENSE new file mode 100644 index 000000000..9ee67879e --- /dev/null +++ b/SharpFont/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2012-2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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. \ No newline at end of file diff --git a/SharpFont/Makefile b/SharpFont/Makefile new file mode 100644 index 000000000..55320feea --- /dev/null +++ b/SharpFont/Makefile @@ -0,0 +1,16 @@ +XBUILD := xbuild +XBUILDFLAGS_RELEASE := /p:Configuration=Release +XBUILDFLAGS_DEBUG := /p:Configuration=Debug + +SOLUTION := Source/SharpFont.sln + +release: + $(XBUILD) $(XBUILDFLAGS_RELEASE) $(SOLUTION) +debug: + $(XBUILD) $(XBUILDFLAGS_DEBUG) $(SOLUTION) +clean: + $(XBUILD) $(XBUILDFLAGS_DEBUG) $(SOLUTION) /t:Clean + $(XBUILD) $(XBUILDFLAGS_RELEASE) $(SOLUTION) /t:Clean + +.SUFFIXES: +.PHONY: release debug clean diff --git a/SharpFont/README.md b/SharpFont/README.md new file mode 100644 index 000000000..8054930b6 --- /dev/null +++ b/SharpFont/README.md @@ -0,0 +1,120 @@ +SharpFont [![NuGet Version](https://img.shields.io/nuget/vpre/SharpFont.svg)](https://www.nuget.org/packages/SharpFont) [![Gratipay Tips](https://img.shields.io/gratipay/Robmaister.svg)](https://gratipay.com/Robmaister) +========= +### Cross-platform FreeType bindings for .NET + +SharpFont is a library that provides FreeType bindings for .NET. It's MIT +licensed to make sure licensing doesn't get in the way of using the library in +your own projects. Unlike [Tao.FreeType][1], SharpFont provides the full +public API and not just the basic methods needed to render simple text. +Everything from format-specific APIs to the caching subsystem are included. + +SharpFont simplifies the FreeType API in a few ways: + + - The error codes that most FreeType methods return are converted to + exceptions. + - Since the return values are no longer error codes, methods with a single + `out` parameter are returned instead. + - Most methods are instance methods instead of static methods. This avoids + unnecessary redundancy in method calls and creates an API with a .NET + look-and-feel. + +For example, a regular FreeType method looks like this: + +```C +Face face; +int err = FT_New_Face(library, "./myfont.ttf", 0, &face); +``` + +The equivalent code in C# with SharpFont is: + +```CSharp +Face face = new Face(library, "./myfont.ttf"); +``` + +##Quick Start + +###NuGet +SharpFont is available on [NuGet][2]. It can be installed by issuing the +following command in the package manager console: + +``` +PM> Install-Package SharpFont +``` + +###From Source +Clone the repository and compile the solution. Copy `SharpFont.dll` to your +project and include it as a reference. On Windows, you must include a compiled +copy of FreeType2 as `freetype6.dll` in the project's output directory. It is +possible to rename the file by changing the filename constant in +[FT.Internal.cs][3] and recompile. On Linux and OSX (and any other Mono +supported platform), you must also copy `SharpFont.dll.config` to the +project's output directory. + +Two extensions for Visual Studio make it easy to follow the coding format in +this project and prevent lots of spurious whitespace changes. +The [.editorconfig](http://editorconfig.org/) file in the project works with the +[EditorConfig](https://visualstudiogallery.msdn.microsoft.com/c8bccfe2-650c-4b42-bc5c-845e21f96328) +extension and the [Format document on Save](https://visualstudiogallery.msdn.microsoft.com/3ea1c920-69c4-441f-9979-ccc2752dac56) +extension makes it basically automatic. + +####Mono +With the removal of the `WIN64` configurations, the included `Makefile` is +effectively redundant. However, you can still build SharpFont by calling +`make` while in the root directory of this project. + +####FreeType +A large number of FreeType builds for Windows are now available in the +[SharpFont.Dependencies][4] repository. + +##Known Issues + +While SharpFont is fully compatible with and runs on 64-bit Windows, it relies +on a patch for FreeType to do this. This patch is already included in +[SharpFont.Dependencies/freetype2][5]. You do not need to worry about this as +a user of the library. If you are compiling FreeType from source, you can find +the patch and instructions at the same location. + +##License + +As metioned earlier, SharpFont is licensed under the MIT License. The terms of +the MIT license are included in both the [LICENSE][6] file and below: + +``` +Copyright (c) 2012-2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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. +``` + +The Windows binary of FreeType that is included in the Examples project and in +the NuGet package is redistributed under the FreeType License (FTL). + +``` +Portions of this software are copyright (c) 2016 The FreeType Project +(www.freetype.org). All rights reserved. +``` + + +[1]: http://taoframework.svn.sourceforge.net/viewvc/taoframework/trunk/src/Tao.FreeType/ +[2]: https://nuget.org/packages/SharpFont/ +[3]: SharpFont/FT.Internal.cs +[4]: https://github.com/Robmaister/SharpFont.Dependencies +[5]: https://github.com/Robmaister/SharpFont.Dependencies/tree/master/freetype2 +[6]: LICENSE diff --git a/SharpFont/Source/.editorconfig b/SharpFont/Source/.editorconfig new file mode 100644 index 000000000..54d45caba --- /dev/null +++ b/SharpFont/Source/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = crlf +indent_style = tab +insert_final_newline = true +tab_width = 4 +trim_trailing_whitespace = true diff --git a/SharpFont/Source/Settings.StyleCop b/SharpFont/Source/Settings.StyleCop new file mode 100644 index 000000000..2c2aa1c55 --- /dev/null +++ b/SharpFont/Source/Settings.StyleCop @@ -0,0 +1,97 @@ + + + + + + Rec\.cs$ + Marhsaler\.cs$ + + + + + + + + + + False + + + + + + + + + + False + + + + + + + + + + False + + + + + False + + + + + + + + + + False + + + + + + + + + + False + + + + + False + + + + + True + True + + + + + + + False + + + + + + + + + + False + + + + + + + \ No newline at end of file diff --git a/SharpFont/Source/SharpFont.dll.config b/SharpFont/Source/SharpFont.dll.config new file mode 100644 index 000000000..c216adda3 --- /dev/null +++ b/SharpFont/Source/SharpFont.dll.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/SharpFont/Source/SharpFont.sln b/SharpFont/Source/SharpFont.sln new file mode 100644 index 000000000..7d3f623da --- /dev/null +++ b/SharpFont/Source/SharpFont.sln @@ -0,0 +1,45 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpFont", "SharpFont\SharpFont.csproj", "{C293DB32-FA42-486D-B128-5A12522FAE4E}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SharpFontShared", "SharpFontShared\SharpFontShared.shproj", "{2E4773B7-961A-4328-9D77-9749F9071CA2}" +EndProject +Global + GlobalSection(SharedMSBuildProjectFiles) = preSolution + SharpFontShared\SharpFontShared.projitems*{2e4773b7-961a-4328-9d77-9749f9071ca2}*SharedItemsImports = 13 + SharpFontShared\SharpFontShared.projitems*{c293db32-fa42-486d-b128-5a12522fae4e}*SharedItemsImports = 4 + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C293DB32-FA42-486D-B128-5A12522FAE4E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C293DB32-FA42-486D-B128-5A12522FAE4E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + StartupItem = Examples\Examples.csproj + Policies = $0 + $0.DotNetNamingPolicy = $1 + $1.DirectoryNamespaceAssociation = None + $1.ResourceNamePolicy = FileFormatDefault + $0.StandardHeader = $2 + $2.Text = + $2.IncludeInNewFiles = True + $0.VersionControlPolicy = $3 + $3.inheritsSet = Mono + $0.ChangeLogPolicy = $4 + $4.UpdateMode = None + $4.MessageStyle = $5 + $5.LineAlign = 0 + $4.inheritsSet = Mono + EndGlobalSection +EndGlobal diff --git a/SharpFont/Source/SharpFont.snk b/SharpFont/Source/SharpFont.snk new file mode 100644 index 0000000000000000000000000000000000000000..552a3332a087ef2024bcafec022ab09d6aec06b5 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097{oLb3gsQ8(6vVPKx=0R&vY$&znmLiHh zsKdw8u&;#RIF-nfrvy2geVDXd22xb^_2dbj|DlzhyomE(bve_H<%(u7KkU(` z&T^6wug5euU7X4rP%=an68iS#aU8ONgKwG;t_nfLK4Z&jmz@qFdlkn+8$7iO=@-;v^e*W$*m0F(L2lPF zmVTI9%G>`F9b@$|&sZAadSB~e^0J{jaG^ly*!0y20gGllp7(YCm}N1I>AGJUl51gH z2fk + + + Release + AnyCPU + 8.0.30703 + 2.0 + {C293DB32-FA42-486D-B128-5A12522FAE4E} + Library + Properties + SharpFont + SharpFont + v4.5 + 512 + + + true + full + false + ..\..\Binaries\SharpFont\Debug\ + TRACE;DEBUG + prompt + 4 + bin\Debug\SharpFont.xml + true + AnyCPU + + + pdbonly + true + ..\..\Binaries\SharpFont\Release\ + TRACE + prompt + 4 + bin\Release\SharpFont.xml + true + AnyCPU + + + true + + + ..\SharpFont.snk + + + + + + + + PreserveNewest + + + + + + + + diff --git a/SharpFont/Source/SharpFontShared/AutoHinterScript.cs b/SharpFont/Source/SharpFontShared/AutoHinterScript.cs new file mode 100644 index 000000000..71bc7448f --- /dev/null +++ b/SharpFont/Source/SharpFontShared/AutoHinterScript.cs @@ -0,0 +1,138 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + ///

+ /// A list of constants used for the glyph-to-script-map property to specify the script submodule the auto-hinter + /// should use for hinting a particular glyph. + /// + public enum AutoHinterScript + { + /// + /// Don't auto-hint this glyph. + /// + None = 0, + + /// + /// Apply the latin auto-hinter. For the auto-hinter, ‘latin’ is a very broad term, including Cyrillic and + /// Greek also since characters from those scripts share the same design constraints. + /// + /// + /// By default, characters from the following Unicode ranges are assigned to this submodule. + /// + /// U+0020 - U+007F // Basic Latin (no control characters) + /// U+00A0 - U+00FF // Latin-1 Supplement (no control characters) + /// U+0100 - U+017F // Latin Extended-A + /// U+0180 - U+024F // Latin Extended-B + /// U+0250 - U+02AF // IPA Extensions + /// U+02B0 - U+02FF // Spacing Modifier Letters + /// U+0300 - U+036F // Combining Diacritical Marks + /// U+0370 - U+03FF // Greek and Coptic + /// U+0400 - U+04FF // Cyrillic + /// U+0500 - U+052F // Cyrillic Supplement + /// U+1D00 - U+1D7F // Phonetic Extensions + /// U+1D80 - U+1DBF // Phonetic Extensions Supplement + /// U+1DC0 - U+1DFF // Combining Diacritical Marks Supplement + /// U+1E00 - U+1EFF // Latin Extended Additional + /// U+1F00 - U+1FFF // Greek Extended + /// U+2000 - U+206F // General Punctuation + /// U+2070 - U+209F // Superscripts and Subscripts + /// U+20A0 - U+20CF // Currency Symbols + /// U+2150 - U+218F // Number Forms + /// U+2460 - U+24FF // Enclosed Alphanumerics + /// U+2C60 - U+2C7F // Latin Extended-C + /// U+2DE0 - U+2DFF // Cyrillic Extended-A + /// U+2E00 - U+2E7F // Supplemental Punctuation + /// U+A640 - U+A69F // Cyrillic Extended-B + /// U+A720 - U+A7FF // Latin Extended-D + /// U+FB00 - U+FB06 // Alphab. Present. Forms (Latin Ligatures) + /// U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols + /// U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement + /// + Latin = 1, + + /// + /// Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old Vietnamese, and some other scripts. + /// + /// + /// By default, characters from the following Unicode ranges are assigned to this submodule. + /// + /// U+1100 - U+11FF // Hangul Jamo + /// U+2E80 - U+2EFF // CJK Radicals Supplement + /// U+2F00 - U+2FDF // Kangxi Radicals + /// U+2FF0 - U+2FFF // Ideographic Description Characters + /// U+3000 - U+303F // CJK Symbols and Punctuation + /// U+3040 - U+309F // Hiragana + /// U+30A0 - U+30FF // Katakana + /// U+3100 - U+312F // Bopomofo + /// U+3130 - U+318F // Hangul Compatibility Jamo + /// U+3190 - U+319F // Kanbun + /// U+31A0 - U+31BF // Bopomofo Extended + /// U+31C0 - U+31EF // CJK Strokes + /// U+31F0 - U+31FF // Katakana Phonetic Extensions + /// U+3200 - U+32FF // Enclosed CJK Letters and Months + /// U+3300 - U+33FF // CJK Compatibility + /// U+3400 - U+4DBF // CJK Unified Ideographs Extension A + /// U+4DC0 - U+4DFF // Yijing Hexagram Symbols + /// U+4E00 - U+9FFF // CJK Unified Ideographs + /// U+A960 - U+A97F // Hangul Jamo Extended-A + /// U+AC00 - U+D7AF // Hangul Syllables + /// U+D7B0 - U+D7FF // Hangul Jamo Extended-B + /// U+F900 - U+FAFF // CJK Compatibility Ideographs + /// U+FE10 - U+FE1F // Vertical forms + /// U+FE30 - U+FE4F // CJK Compatibility Forms + /// U+FF00 - U+FFEF // Halfwidth and Fullwidth Forms + /// U+1B000 - U+1B0FF // Kana Supplement + /// U+1D300 - U+1D35F // Tai Xuan Hing Symbols + /// U+1F200 - U+1F2FF // Enclosed Ideographic Supplement + /// U+20000 - U+2A6DF // CJK Unified Ideographs Extension B + /// U+2A700 - U+2B73F // CJK Unified Ideographs Extension C + /// U+2B740 - U+2B81F // CJK Unified Ideographs Extension D + /// U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement + /// + Cjk = 2, + + /// + /// Apply the indic auto-hinter, covering all major scripts from the Indian sub-continent and some other + /// related scripts like Thai, Lao, or Tibetan. + /// + /// + /// By default, characters from the following Unicode ranges are assigned to this submodule. + /// + /// U+0900 - U+0DFF // Indic Range + /// U+0F00 - U+0FFF // Tibetan + /// U+1900 - U+194F // Limbu + /// U+1B80 - U+1BBF // Sundanese + /// U+1C80 - U+1CDF // Meetei Mayak + /// U+A800 - U+A82F // Syloti Nagri + /// U+11800 - U+118DF // Sharada + /// + /// Note that currently Indic support is rudimentary only, missing blue zone support. + /// + Indic = 3 + } +} diff --git a/SharpFont/Source/SharpFontShared/BBox.cs b/SharpFont/Source/SharpFontShared/BBox.cs new file mode 100644 index 000000000..50df52ccc --- /dev/null +++ b/SharpFont/Source/SharpFontShared/BBox.cs @@ -0,0 +1,190 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont +{ + /// + /// A structure used to hold an outline's bounding box, i.e., the + /// coordinates of its extrema in the horizontal and vertical directions. + /// + [StructLayout(LayoutKind.Sequential)] + public struct BBox : IEquatable + { + #region Fields + + private FT_Long xMin, yMin; + private FT_Long xMax, yMax; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// The left bound. + /// The bottom bound. + /// The right bound. + /// The upper bound. + public BBox(int left, int bottom, int right, int top) + { + xMin = (IntPtr)left; + yMin = (IntPtr)bottom; + xMax = (IntPtr)right; + yMax = (IntPtr)top; + } + + #endregion + + #region Properties + + /// + /// Gets the horizontal minimum (left-most). + /// + public int Left + { + get + { + return (int)xMin; + } + } + + /// + /// Gets the vertical minimum (bottom-most). + /// + public int Bottom + { + get + { + return (int)yMin; + } + } + + /// + /// Gets the horizontal maximum (right-most). + /// + public int Right + { + get + { + return (int)xMax; + } + } + + /// + /// Gets the vertical maximum (top-most). + /// + public int Top + { + get + { + return (int)yMax; + } + } + + #endregion + + #region Operators + + /// + /// Compares two instances of for equality. + /// + /// A . + /// Another . + /// A value indicating equality. + public static bool operator ==(BBox left, BBox right) + { + return left.Equals(right); + } + + /// + /// Compares two instances of for inequality. + /// + /// A . + /// Another . + /// A value indicating inequality. + public static bool operator !=(BBox left, BBox right) + { + return !left.Equals(right); + } + + #endregion + + #region Methods + + /// + /// Compares this instance of to another for equality. + /// + /// A . + /// A value indicating equality. + public bool Equals(BBox other) + { + return + xMin == other.xMin && + yMin == other.yMin && + xMax == other.xMax && + yMax == other.yMax; + } + + /// + /// Compares this instance of to an object for equality. + /// + /// An object. + /// A value indicating equality. + public override bool Equals(object obj) + { + if (obj is BBox) + return this.Equals((BBox)obj); + + return false; + } + + /// + /// Gets a unique hash code for this instance. + /// + /// A hash code. + public override int GetHashCode() + { + //TODO better hash algo + return xMin.GetHashCode() ^ yMin.GetHashCode() ^ xMax.GetHashCode() ^ yMax.GetHashCode(); + } + + /// + /// Gets a string that represents this instance. + /// + /// A string representation of this instance. + public override string ToString() + { + return "Min: (" + (int)xMin + ", " + (int)yMin + "), Max: (" + (int)xMax + ", " + (int)yMax + ")"; + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Bdf/Internal/PropertyRec.cs b/SharpFont/Source/SharpFontShared/Bdf/Internal/PropertyRec.cs new file mode 100644 index 000000000..e62293bd0 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Bdf/Internal/PropertyRec.cs @@ -0,0 +1,45 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Bdf.Internal +{ + [StructLayout(LayoutKind.Explicit, Pack = 0)] + internal struct PropertyRec + { + [FieldOffset(0)] + internal PropertyType type; + + [FieldOffset(4)] + internal IntPtr atom; + + [FieldOffset(4)] + internal int integer; + + [FieldOffset(4)] + internal uint cardinal; + } +} diff --git a/SharpFont/Source/SharpFontShared/Bdf/Property.cs b/SharpFont/Source/SharpFontShared/Bdf/Property.cs new file mode 100644 index 000000000..35f3f3b84 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Bdf/Property.cs @@ -0,0 +1,121 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Bdf.Internal; + +namespace SharpFont.Bdf +{ + /// + /// This structure models a given BDF/PCF property. + /// + public class Property + { + #region Fields + + private IntPtr reference; + private PropertyRec rec; + + #endregion + + #region Constructors + + internal Property(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the property type. + /// + public PropertyType Type + { + get + { + return rec.type; + } + } + + /// + /// Gets the atom string, if type is . + /// + public string Atom + { + get + { + // only this property throws an exception because the pointer could be to unmanaged memory not owned by + // the process. + if (rec.type != PropertyType.Atom) + throw new InvalidOperationException("The property type is not Atom."); + + return Marshal.PtrToStringAnsi(rec.atom); + } + } + + /// + /// Gets a signed integer, if type is . + /// + public int Integer + { + get + { + return rec.integer; + } + } + + /// + /// Gets an unsigned integer, if type is . + /// + [CLSCompliant(false)] + public uint Cardinal + { + get + { + return rec.cardinal; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Bdf/PropertyType.cs b/SharpFont/Source/SharpFontShared/Bdf/PropertyType.cs new file mode 100644 index 000000000..be90669d5 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Bdf/PropertyType.cs @@ -0,0 +1,46 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.Bdf +{ + /// + /// A list of BDF property types. + /// + public enum PropertyType + { + /// Value 0 is used to indicate a missing property. + None = 0, + + /// Property is a string atom. + Atom = 1, + + /// Property is a 32-bit signed integer. + Integer = 2, + + /// Property is a 32-bit unsigned integer. + Cardinal = 3 + } +} diff --git a/SharpFont/Source/SharpFontShared/BitmapGlyph.cs b/SharpFont/Source/SharpFontShared/BitmapGlyph.cs new file mode 100644 index 000000000..98c399ceb --- /dev/null +++ b/SharpFont/Source/SharpFontShared/BitmapGlyph.cs @@ -0,0 +1,207 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A structure used for bitmap glyph images. This really is a ‘sub-class’ of . + /// + /// + /// You can typecast an to if you have ‘ == + /// ’. This lets you access the bitmap's contents easily. + /// + /// The corresponding pixel buffer is always owned by and is thus created and destroyed + /// with it. + /// + public sealed class BitmapGlyph : IDisposable + { + #region Fields + + private Glyph original; + private BitmapGlyphRec rec; + + #endregion + + #region Constructors + + internal BitmapGlyph(Glyph original) + { + this.original = original; + Reference = original.Reference; //generates the rec. + } + + /// + /// Finalizes an instance of the class. + /// + ~BitmapGlyph() + { + Dispose(false); + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the object has been disposed. + /// + public bool IsDisposed + { + get + { + return original.IsDisposed; + } + } + + /// + /// Gets the root fields. + /// + public Glyph Root + { + get + { + if (IsDisposed) + throw new ObjectDisposedException("Root", "Cannot access a disposed object."); + + return original; + } + } + + /// + /// Gets the left-side bearing, i.e., the horizontal distance from the current pen position to the left border + /// of the glyph bitmap. + /// + public int Left + { + get + { + if (IsDisposed) + throw new ObjectDisposedException("Left", "Cannot access a disposed object."); + + return rec.left; + } + } + + /// + /// Gets the top-side bearing, i.e., the vertical distance from the current pen position to the top border of + /// the glyph bitmap. This distance is positive for upwards y! + /// + public int Top + { + get + { + if (IsDisposed) + throw new ObjectDisposedException("Top", "Cannot access a disposed object."); + + return rec.top; + } + } + + /// + /// Gets a descriptor for the bitmap. + /// + public FTBitmap Bitmap + { + get + { + if (IsDisposed) + throw new ObjectDisposedException("Bitmap", "Cannot access a disposed object."); + + return new FTBitmap(PInvokeHelper.AbsoluteOffsetOf(Reference, "bitmap"), rec.bitmap, null); + } + } + + internal IntPtr Reference + { + get + { + if (IsDisposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + return original.Reference; + } + + set + { + if (IsDisposed) + throw new ObjectDisposedException("Reference", "Cannot modify a disposed object."); + + rec = PInvokeHelper.PtrToStructure(original.Reference); + } + } + + #endregion + + #region Operators + + /// + /// Casts a back up to a . The eqivalent of + /// . + /// + /// A . + /// A . + public static implicit operator Glyph(BitmapGlyph g) + { + return g.original; + } + + #endregion + + #region Methods + + /// + /// A CLS-compliant version of the implicit cast to . + /// + /// A . + public Glyph ToGlyph() + { + return (Glyph)this; + } + + /// + /// Disposes an instance of the class. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (disposing) + { + original.Dispose(); + original = null; + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/BitmapSize.cs b/SharpFont/Source/SharpFontShared/BitmapSize.cs new file mode 100644 index 000000000..ff2fdbc72 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/BitmapSize.cs @@ -0,0 +1,145 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// This structure models the metrics of a bitmap strike (i.e., a set of + /// glyphs for a given point size and resolution) in a bitmap font. It is + /// used for the field of + /// . + /// + /// + /// Windows FNT: The nominal size given in a FNT font is not reliable. Thus + /// when the driver finds it incorrect, it sets ‘size’ to some calculated + /// values and sets ‘x_ppem’ and ‘y_ppem’ to the pixel width and height + /// given in the font, respectively. + /// + /// TrueType embedded bitmaps: ‘size’, ‘width’, and ‘height’ values are not + /// contained in the bitmap strike itself. They are computed from the + /// global font parameters. + /// + public sealed class BitmapSize + { + #region Fields + + private IntPtr reference; + private BitmapSizeRec rec; + + #endregion + + #region Constructors + + internal BitmapSize(IntPtr reference) + { + Reference = reference; + } + + internal BitmapSize(BitmapSizeRec bmpSizeInt) + { + this.rec = bmpSizeInt; + } + + #endregion + + #region Properties + + /// + /// Gets the vertical distance, in pixels, between two consecutive + /// baselines. It is always positive. + /// + public short Height + { + get + { + return rec.height; + } + } + + /// + /// Gets the average width, in pixels, of all glyphs in the strike. + /// + public short Width + { + get + { + return rec.width; + } + } + + /// + /// Gets the nominal size of the strike in 26.6 fractional points. This + /// field is not very useful. + /// + public Fixed26Dot6 Size + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.size); + } + } + + /// + /// Gets the horizontal ppem (nominal width) in 26.6 fractional pixels. + /// + public Fixed26Dot6 NominalWidth + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.x_ppem); + } + } + + /// + /// Gets the vertical ppem (nominal height) in 26.6 fractional pixels. + /// + public Fixed26Dot6 NominalHeight + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.y_ppem); + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/CMapCache.cs b/SharpFont/Source/SharpFontShared/Cache/CMapCache.cs new file mode 100644 index 000000000..f4dc0ef20 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/CMapCache.cs @@ -0,0 +1,100 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.Cache +{ + /// + /// An opaque handle used to model a charmap cache. This cache is to hold character codes -> glyph indices + /// mappings. + /// + public class CMapCache + { + #region Fields + + private IntPtr reference; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// + /// Like all other caches, this one will be destroyed with the cache manager. + /// + /// A handle to the cache manager. + public CMapCache(Manager manager) + { + IntPtr cacheRef; + Error err = FT.FTC_CMapCache_New(manager.Reference, out cacheRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + Reference = cacheRef; + } + + #endregion + + #region Properties + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + } + } + + #endregion + + #region Methods + + /// + /// Translate a character code into a glyph index, using the charmap cache. + /// + /// The source face ID. + /// + /// The index of the charmap in the source face. Any negative value means to use the cache 's + /// default charmap. + /// + /// The character code (in the corresponding charmap). + /// Glyph index. 0 means ‘no glyph’. + [CLSCompliant(false)] + public uint Lookup(IntPtr faceId, int cmapIndex, uint charCode) + { + return FT.FTC_CMapCache_Lookup(Reference, faceId, cmapIndex, charCode); + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/FaceRequester.cs b/SharpFont/Source/SharpFontShared/Cache/FaceRequester.cs new file mode 100644 index 000000000..5081858f7 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/FaceRequester.cs @@ -0,0 +1,47 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Cache +{ + /// + /// A callback function provided by client applications. It is used by the cache manager to translate a given + /// FTC_FaceID into a new valid object, on demand. + /// + /// + /// The third parameter ‘req_data’ is the same as the one passed by the client when + /// is called. + /// + /// The face requester should not perform funny things on the returned face object, like creating a new + /// for it, or setting a transformation through ! + /// + /// The face ID to resolve. + /// A handle to a FreeType library object. + /// Application-provided request data (see note below). + /// A new handle. + /// FreeType error code. 0 means success. + public delegate Error FaceRequester(IntPtr faceId, IntPtr library, IntPtr requestData, out IntPtr aface); +} diff --git a/SharpFont/Source/SharpFontShared/Cache/ImageCache.cs b/SharpFont/Source/SharpFontShared/Cache/ImageCache.cs new file mode 100644 index 000000000..f581b31e8 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/ImageCache.cs @@ -0,0 +1,173 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.Cache +{ + /// + /// A handle to an glyph image cache object. They are designed to hold many distinct glyph images while not + /// exceeding a certain memory threshold. + /// + public class ImageCache + { + #region Fields + + private IntPtr reference; + private Manager parentManager; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The parent manager for the image cache. + public ImageCache(Manager manager) + { + if (manager == null) + throw new ArgumentNullException("manager"); + + IntPtr cacheRef; + Error err = FT.FTC_ImageCache_New(manager.Reference, out cacheRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + parentManager = manager; + Reference = cacheRef; + } + + #endregion + + #region Properties + + internal IntPtr Reference + { + get + { + if (parentManager.IsDisposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + return reference; + } + + set + { + if (parentManager.IsDisposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + reference = value; + } + } + + #endregion + + #region Methods + + /// + /// Retrieve a given glyph image from a glyph image cache. + /// + /// + /// The returned glyph is owned and managed by the glyph image cache. Never try to transform or discard it + /// manually! You can however create a copy with and modify the new one. + /// + /// If ‘node’ is not NULL, it receives the address of the cache node containing the glyph image, + /// after increasing its reference count. This ensures that the node (as well as the ) will + /// always be kept in the cache until you call to ‘release’ it. + /// + /// If ‘node’ is NULL, the cache node is left unchanged, which means that the + /// could be flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that + /// it is persistent! + /// + /// A pointer to a glyph image type descriptor. + /// The glyph index to retrieve. + /// + /// Used to return the address of of the corresponding cache node after incrementing its reference count (see + /// note below). + /// + /// The corresponding object. 0 in case of failure. + [CLSCompliant(false)] + public Glyph Lookup(ImageType type, uint gIndex, out Node node) + { + if (parentManager.IsDisposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + IntPtr glyphRef, nodeRef; + Error err = FT.FTC_ImageCache_Lookup(Reference, type.Reference, gIndex, out glyphRef, out nodeRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + node = new Node(nodeRef); + return new Glyph(glyphRef, null); + } + + /// + /// A variant of that uses a to specify the face ID and its + /// size. + /// + /// + /// The returned glyph is owned and managed by the glyph image cache. Never try to transform or discard it + /// manually! You can however create a copy with and modify the new one. + /// + /// If ‘node’ is not NULL, it receives the address of the cache node containing the glyph image, + /// after increasing its reference count. This ensures that the node (as well as the ) will + /// always be kept in the cache until you call to ‘release’ it. + /// + /// If ‘node’ is NULL, the cache node is left unchanged, which means that the + /// could be flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that + /// it is persistent! + /// + /// Calls to and friends have no effect on cached glyphs; you should always use + /// the FreeType cache API instead. + /// + /// A pointer to a scaler descriptor. + /// The corresponding load flags. + /// The glyph index to retrieve. + /// + /// Used to return the address of of the corresponding cache node after incrementing its reference count (see + /// note below). + /// + /// The corresponding object. 0 in case of failure. + [CLSCompliant(false)] + public Glyph LookupScaler(Scaler scaler, LoadFlags loadFlags, uint gIndex, out Node node) + { + if (parentManager.IsDisposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + IntPtr glyphRef, nodeRef; + Error err = FT.FTC_ImageCache_LookupScaler(Reference, scaler.Reference, loadFlags, gIndex, out glyphRef, out nodeRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + node = new Node(nodeRef); + return new Glyph(glyphRef, null); + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/ImageType.cs b/SharpFont/Source/SharpFontShared/Cache/ImageType.cs new file mode 100644 index 000000000..f9c0e9016 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/ImageType.cs @@ -0,0 +1,116 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Cache.Internal; + +namespace SharpFont.Cache +{ + /// + /// A structure used to model the type of images in a glyph cache. + /// + public class ImageType + { + #region Fields + + private IntPtr reference; + private ImageTypeRec rec; + + #endregion + + #region Constructors + + internal ImageType(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the face ID. + /// + public IntPtr FaceId + { + get + { + return rec.face_id; + } + } + + /// + /// Gets the width in pixels. + /// + public int Width + { + get + { + return rec.width; + } + } + + /// + /// Gets the height in pixels. + /// + public int Height + { + get + { + return rec.height; + } + } + + /// + /// Gets the load flags, as in + /// + [CLSCompliant(false)] + public LoadFlags Flags + { + get + { + return rec.flags; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/Internal/CMapCacheRec.cs b/SharpFont/Source/SharpFontShared/Cache/Internal/CMapCacheRec.cs new file mode 100644 index 000000000..fc170624a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/Internal/CMapCacheRec.cs @@ -0,0 +1,34 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Cache.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct CMapCacheRec + { + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/Internal/ImageCacheRec.cs b/SharpFont/Source/SharpFontShared/Cache/Internal/ImageCacheRec.cs new file mode 100644 index 000000000..97bbd7684 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/Internal/ImageCacheRec.cs @@ -0,0 +1,34 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Cache.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct ImageCacheRec + { + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/Internal/ImageTypeRec.cs b/SharpFont/Source/SharpFontShared/Cache/Internal/ImageTypeRec.cs new file mode 100644 index 000000000..9da34c39c --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/Internal/ImageTypeRec.cs @@ -0,0 +1,38 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Cache.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct ImageTypeRec + { + internal IntPtr face_id; + internal int width; + internal int height; + internal LoadFlags flags; + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/Internal/ManagerRec.cs b/SharpFont/Source/SharpFontShared/Cache/Internal/ManagerRec.cs new file mode 100644 index 000000000..aaa02a762 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/Internal/ManagerRec.cs @@ -0,0 +1,34 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Cache.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct ManagerRec + { + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/Internal/NodeRec.cs b/SharpFont/Source/SharpFontShared/Cache/Internal/NodeRec.cs new file mode 100644 index 000000000..4f26d1145 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/Internal/NodeRec.cs @@ -0,0 +1,34 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Cache.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct NodeRec + { + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/Internal/SBitCacheRec.cs b/SharpFont/Source/SharpFontShared/Cache/Internal/SBitCacheRec.cs new file mode 100644 index 000000000..9b95b407f --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/Internal/SBitCacheRec.cs @@ -0,0 +1,34 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Cache.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct SBitCacheRec + { + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/Internal/SBitRec.cs b/SharpFont/Source/SharpFontShared/Cache/Internal/SBitRec.cs new file mode 100644 index 000000000..b631065cd --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/Internal/SBitRec.cs @@ -0,0 +1,46 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Cache.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct SBitRec + { + internal byte width; + internal byte height; + internal byte left; + internal byte top; + + internal byte format; + internal byte max_grays; + internal short pitch; + internal byte xadvance; + internal byte yadvance; + + internal IntPtr buffer; + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/Internal/ScalerRec.cs b/SharpFont/Source/SharpFontShared/Cache/Internal/ScalerRec.cs new file mode 100644 index 000000000..afc4a2197 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/Internal/ScalerRec.cs @@ -0,0 +1,40 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Cache.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct ScalerRec + { + internal IntPtr face_id; + internal uint width; + internal uint height; + internal int pixel; + internal uint x_res; + internal uint y_res; + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/Manager.cs b/SharpFont/Source/SharpFontShared/Cache/Manager.cs new file mode 100644 index 000000000..82455004f --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/Manager.cs @@ -0,0 +1,274 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Collections.Generic; + +namespace SharpFont.Cache +{ + /// + /// This object corresponds to one instance of the cache-subsystem. It is used to cache one or more + /// objects, along with corresponding objects. + /// + /// The manager intentionally limits the total number of opened and objects + /// to control memory usage. See the ‘max_faces’ and ‘max_sizes’ parameters of + /// . + /// + /// The manager is also used to cache ‘nodes’ of various types while limiting their total memory usage. + /// + /// All limitations are enforced by keeping lists of managed objects in most-recently-used order, and flushing old + /// nodes to make room for new ones. + /// + public sealed class Manager : IDisposable + { + #region Fields + + private IntPtr reference; + private Library parentLibrary; + + private bool disposed; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the Manager class. + /// + /// The parent FreeType library handle to use. + /// + /// Maximum number of opened objects managed by this cache instance. Use 0 for defaults. + /// + /// + /// Maximum number of opened objects managed by this cache instance. Use 0 for defaults. + /// + /// + /// Maximum number of bytes to use for cached data nodes. Use 0 for defaults. Note that this value does not + /// account for managed and objects. + /// + /// + /// An application-provided callback used to translate face IDs into real objects. + /// + /// + /// A generic pointer that is passed to the requester each time it is called (see ). + /// + [CLSCompliant(false)] + public Manager(Library library, uint maxFaces, uint maxSizes, ulong maxBytes, FaceRequester requester, IntPtr requestData) + { + if (library == null) + throw new ArgumentNullException("library"); + + IntPtr mgrRef; + Error err = FT.FTC_Manager_New(library.Reference, maxFaces, maxSizes, maxBytes, requester, requestData, out mgrRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + Reference = mgrRef; + + this.parentLibrary = library; + library.AddChildManager(this); + } + + /// + /// Finalizes an instance of the Manager class. + /// + ~Manager() + { + Dispose(false); + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the object has been disposed. + /// + public bool IsDisposed + { + get + { + return disposed; + } + } + + internal IntPtr Reference + { + get + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + return reference; + } + + set + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + reference = value; + } + } + + #endregion + + #region Public Members + + /// + /// Empty a given cache manager. This simply gets rid of all the currently cached and + /// objects within the manager. + /// + public void Reset() + { + if (disposed) + throw new ObjectDisposedException("Manager", "Cannot access a disposed object."); + + FT.FTC_Manager_Reset(Reference); + } + + /// + /// Retrieve the object that corresponds to a given face ID through a cache manager. + /// + /// + /// The returned object is always owned by the manager. You should never try to discard it + /// yourself. + /// + /// The object doesn't necessarily have a current size object (i.e., + /// can be 0). If you need a specific ‘font size’, use instead. + /// + /// Never change the face's transformation matrix (i.e., never call the + /// function) on a returned face! If you need to transform glyphs, do it yourself after glyph loading. + /// + /// When you perform a lookup, out-of-memory errors are detected within the lookup and force incremental + /// flushes of the cache until enough memory is released for the lookup to succeed. + /// + /// If a lookup fails with the cache has already been completely flushed, and + /// still no memory was available for the operation. + /// + /// The ID of the face object. + /// A handle to the face object. + public Face LookupFace(IntPtr faceId) + { + if (disposed) + throw new ObjectDisposedException("Manager", "Cannot access a disposed object."); + + IntPtr faceRef; + Error err = FT.FTC_Manager_LookupFace(Reference, faceId, out faceRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + //HACK fix this later. + return new Face(faceRef, null); + } + + /// + /// Retrieve the object that corresponds to a given pointer through a + /// cache manager. + /// + /// + /// The returned object is always owned by the/ manager. You should never try to discard + /// it by yourself. + /// + /// You can access the parent object simply as if you need it. + /// Note that this object is also owned by the manager. + /// + /// When you perform a lookup, out-of-memory errors are detected within the lookup and force incremental + /// flushes of the cache until enough memory is released for the lookup to succeed. + /// + /// If a lookup fails with the cache has already been completely flushed, and + /// still no memory is available for the operation. + /// + /// A scaler handle. + /// A handle to the size object. + public FTSize LookupSize(Scaler scaler) + { + if (disposed) + throw new ObjectDisposedException("Manager", "Cannot access a disposed object."); + + IntPtr sizeRef; + Error err = FT.FTC_Manager_LookupSize(Reference, scaler.Reference, out sizeRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + //HACK fix this later. + return new FTSize(sizeRef, false, null); + } + + /// + /// A special function used to indicate to the cache manager that a given FTC_FaceID is no longer valid, either + /// because its content changed, or because it was deallocated or uninstalled. + /// + /// + /// This function flushes all nodes from the cache corresponding to this ‘faceID’, with the + /// exception of nodes with a non-null reference count. + /// + /// Such nodes are however modified internally so as to never appear in later lookups with the same + /// ‘faceID’ value, and to be immediately destroyed when released by all their users. + /// + /// The FTC_FaceID to be removed. + public void RemoveFaceId(IntPtr faceId) + { + if (disposed) + throw new ObjectDisposedException("Manager", "Cannot access a disposed object."); + + FT.FTC_Manager_RemoveFaceID(Reference, faceId); + } + + #endregion + + #region IDisposable Members + + /// + /// Disposes the Manager. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!disposed) + { + disposed = true; + + FT.FTC_Manager_Done(reference); + reference = IntPtr.Zero; + + // removes itself from the parent Library, with a check to prevent this from happening when Library is + // being disposed (Library disposes all it's children with a foreach loop, this causes an + // InvalidOperationException for modifying a collection during enumeration) + if (!parentLibrary.IsDisposed) + parentLibrary.RemoveChildManager(this); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/Node.cs b/SharpFont/Source/SharpFontShared/Cache/Node.cs new file mode 100644 index 000000000..a3f03d60c --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/Node.cs @@ -0,0 +1,87 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.Cache +{ + /// + /// An opaque handle to a cache node object. Each cache node is reference-counted. A node with a count of 0 might + /// be flushed out of a full cache whenever a lookup request is performed. + /// + /// If you look up nodes, you have the ability to ‘acquire’ them, i.e., to increment their reference count. This + /// will prevent the node from being flushed out of the cache until you explicitly ‘release’ it. + /// + /// + /// + /// + public class Node + { + #region Fields + + private IntPtr reference; + + #endregion + + #region Constructors + + internal Node(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + } + } + + #endregion + + #region Public Methods + + /// + /// Decrement a cache node's internal reference count. When the count reaches 0, it is not destroyed but + /// becomes eligible for subsequent cache flushes. + /// + /// The cache manager handle. + public void Unref(Manager manager) + { + FT.FTC_Node_Unref(Reference, manager.Reference); + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/SBit.cs b/SharpFont/Source/SharpFontShared/Cache/SBit.cs new file mode 100644 index 000000000..706de0491 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/SBit.cs @@ -0,0 +1,185 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Cache.Internal; + +namespace SharpFont.Cache +{ + /// + /// A handle to a small bitmap cache. These are special cache objects used to store small glyph bitmaps (and + /// anti-aliased pixmaps) in a much more efficient way than the traditional glyph image cache implemented by + /// . + /// + public class SBit + { + #region Fields + + private IntPtr reference; + private SBitRec rec; + + #endregion + + #region Constructors + + internal SBit(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the bitmap width in pixels. + /// + public byte Width + { + get + { + return rec.width; + } + } + + /// + /// Gets the bitmap height in pixels. + /// + public byte Height + { + get + { + return rec.height; + } + } + + /// + /// Gets the horizontal distance from the pen position to the left bitmap border (a.k.a. ‘left side bearing’, + /// or ‘lsb’). + /// + public byte Left + { + get + { + return rec.left; + } + } + + /// + /// Gets the vertical distance from the pen position (on the baseline) to the upper bitmap border (a.k.a. ‘top + /// side bearing’). The distance is positive for upwards y coordinates. + /// + public byte Top + { + get + { + return rec.top; + } + } + + /// + /// Gets the format of the glyph bitmap (monochrome or gray). + /// + public byte Format + { + get + { + return rec.format; + } + } + + /// + /// Gets the maximum gray level value (in the range 1 to 255). + /// + public byte MaxGrays + { + get + { + return rec.max_grays; + } + } + + /// + /// Gets the number of bytes per bitmap line. May be positive or negative. + /// + public short Pitch + { + get + { + return rec.pitch; + } + } + + /// + /// Gets the horizontal advance width in pixels. + /// + public byte AdvanceX + { + get + { + return rec.xadvance; + } + } + + /// + /// Gets the vertical advance height in pixels. + /// + public byte AdvanceY + { + get + { + return rec.yadvance; + } + } + + /// + /// Gets a pointer to the bitmap pixels. + /// + public IntPtr Buffer + { + get + { + return rec.buffer; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/SBitCache.cs b/SharpFont/Source/SharpFontShared/Cache/SBitCache.cs new file mode 100644 index 000000000..b53436a71 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/SBitCache.cs @@ -0,0 +1,173 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Cache +{ + /// + /// A handle to a small bitmap cache. These are special cache objects used to store small glyph bitmaps (and + /// anti-aliased pixmaps) in a much more efficient way than the traditional glyph image cache implemented by + /// . + /// + public class SBitCache + { + #region Fields + + private IntPtr reference; + private Manager parentManager; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// A handle to the source cache manager. + public SBitCache(Manager manager) + { + if (manager == null) + throw new ArgumentNullException("manager"); + + IntPtr cacheRef; + Error err = FT.FTC_SBitCache_New(manager.Reference, out cacheRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + Reference = cacheRef; + parentManager = manager; + } + + #endregion + + #region Properties + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + } + } + + #endregion + + #region Methods + + /// + /// Look up a given small glyph bitmap in a given sbit cache and ‘lock’ it to prevent its flushing from the + /// cache until needed. + /// + /// + /// The small bitmap descriptor and its bit buffer are owned by the cache and should never be freed by the + /// application. They might as well disappear from memory on the next cache lookup, so don't treat them as + /// persistent data. + /// + /// The descriptor's ‘buffer’ field is set to 0 to indicate a missing glyph bitmap. + /// + /// If ‘node’ is not NULL, it receives the address of the cache node containing the bitmap, after + /// increasing its reference count. This ensures that the node (as well as the image) will always be kept in + /// the cache until you call to ‘release’ it. + /// + /// If ‘node’ is NULL, the cache node is left unchanged, which means that the bitmap could be + /// flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that it is + /// persistent! + /// + /// A pointer to the glyph image type descriptor. + /// The glyph index. + /// + /// Used to return the address of of the corresponding cache node after incrementing its reference count (see + /// note below). + /// + /// A handle to a small bitmap descriptor. + [CLSCompliant(false)] + public SBit Lookup(ImageType type, uint gIndex, out Node node) + { + if (parentManager.IsDisposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + IntPtr sbitRef, nodeRef; + Error err = FT.FTC_SBitCache_Lookup(Reference, type.Reference, gIndex, out sbitRef, out nodeRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + node = new Node(nodeRef); + return new SBit(sbitRef); + } + + /// + /// A variant of that uses a to specify the face ID and its + /// size. + /// + /// + /// The small bitmap descriptor and its bit buffer are owned by the cache and should never be freed by the + /// application. They might as well disappear from memory on the next cache lookup, so don't treat them as + /// persistent data. + /// + /// The descriptor's ‘buffer’ field is set to 0 to indicate a missing glyph bitmap. + /// + /// If ‘node’ is not NULL, it receives the address of the cache node containing the bitmap, after + /// increasing its reference count. This ensures that the node (as well as the image) will always be kept in + /// the cache until you call to ‘release’ it. + /// + /// If ‘node’ is NULL, the cache node is left unchanged, which means that the bitmap could be + /// flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that it is + /// persistent! + /// + /// A pointer to the scaler descriptor. + /// The corresponding load flags. + /// The glyph index. + /// + /// Used to return the address of of the corresponding cache node after incrementing its reference count (see + /// note below). + /// + /// A handle to a small bitmap descriptor. + [CLSCompliant(false)] + public SBit LookupScaler(Scaler scaler, LoadFlags loadFlags, uint gIndex, out Node node) + { + if (parentManager.IsDisposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + IntPtr sbitRef, nodeRef; + Error err = FT.FTC_SBitCache_LookupScaler(Reference, scaler.Reference, loadFlags, gIndex, out sbitRef, out nodeRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + node = new Node(nodeRef); + return new SBit(sbitRef); + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Cache/Scaler.cs b/SharpFont/Source/SharpFontShared/Cache/Scaler.cs new file mode 100644 index 000000000..17c5a795a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cache/Scaler.cs @@ -0,0 +1,146 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Cache.Internal; + +namespace SharpFont.Cache +{ + /// + /// A structure used to describe a given character size in either pixels or points to the cache manager. + /// + /// + /// This type is mainly used to retrieve objects through the cache manager. + /// + /// + public class Scaler + { + #region Fields + + private IntPtr reference; + private ScalerRec rec; + + #endregion + + #region Constructors + + internal Scaler(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the source face ID. + /// + public IntPtr FaceId + { + get + { + return rec.face_id; + } + } + + /// + /// Gets the character width. + /// + [CLSCompliant(false)] + public uint Width + { + get + { + return rec.width; + } + } + + /// + /// Gets the character height. + /// + [CLSCompliant(false)] + public uint Height + { + get + { + return rec.height; + } + } + + /// + /// Gets a value indicating whether the ‘width’ and ‘height’ fields are interpreted as integer pixel character + /// sizes. Otherwise, they are expressed as 1/64th of points. + /// + public bool Pixel + { + get + { + return rec.pixel == 1; + } + } + + /// + /// Gets the horizontal resolution in dpi; only used when ‘pixel’ is value 0. + /// + [CLSCompliant(false)] + public uint ResolutionX + { + get + { + return rec.x_res; + } + } + + /// + /// Gets the vertical resolution in dpi; only used when ‘pixel’ is value 0. + /// + [CLSCompliant(false)] + public uint ResolutionY + { + get + { + return rec.y_res; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Cff/HintingEngine.cs b/SharpFont/Source/SharpFontShared/Cff/HintingEngine.cs new file mode 100644 index 000000000..1370df9d0 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Cff/HintingEngine.cs @@ -0,0 +1,40 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.Cff +{ + /// + /// A list of constants used for the hinting-engine property to select the hinting engine for CFF fonts. + /// + public enum HintingEngine + { + /// Use the old FreeType hinting engine. + FreeType = 0, + + /// Use the hinting engine contributed by Adobe. + Adobe = 1 + } +} diff --git a/SharpFont/Source/SharpFontShared/CharMap.cs b/SharpFont/Source/SharpFontShared/CharMap.cs new file mode 100644 index 000000000..6d4c78b1e --- /dev/null +++ b/SharpFont/Source/SharpFontShared/CharMap.cs @@ -0,0 +1,170 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; +using SharpFont.TrueType; + +namespace SharpFont +{ + /// + /// The base charmap structure. + /// + public sealed class CharMap + { + #region Fields + + private IntPtr reference; + private CharMapRec rec; + + private Face parentFace; + + #endregion + + #region Constructors + + internal CharMap(IntPtr reference, Face parent) + { + Reference = reference; + this.parentFace = parent; + } + + #endregion + + #region Properties + + /// + /// Gets a handle to the parent face object. + /// + public Face Face + { + get + { + return parentFace; + } + } + + /// + /// Gets an tag identifying the charmap. Use this with + /// . + /// + [CLSCompliant(false)] + public Encoding Encoding + { + get + { + return rec.encoding; + } + } + + /// + /// Gets an ID number describing the platform for the following encoding ID. This comes directly from the + /// TrueType specification and should be emulated for other formats. + /// + [CLSCompliant(false)] + public PlatformId PlatformId + { + get + { + return rec.platform_id; + } + } + + /// + /// Gets a platform specific encoding number. This also comes from the TrueType specification and should be + /// emulated similarly. + /// + [CLSCompliant(false)] + public ushort EncodingId + { + get + { + //TODO find some way of getting a proper encoding ID enum... + return rec.encoding_id; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + + #region Methods + + #region Base Interface + + /// + /// Retrieve index of a given charmap. + /// + /// The index into the array of character maps within the face to which ‘charmap’ belongs. + public int GetCharmapIndex() + { + return FT.FT_Get_Charmap_Index(Reference); + } + + #endregion + + #region TrueType Tables + + /// + /// Return TrueType/sfnt specific cmap language ID. Definitions of language ID values are in + /// ‘freetype/ttnameid.h’. + /// + /// + /// The language ID of ‘charmap’. If ‘charmap’ doesn't belong to a TrueType/sfnt face, just return 0 as the + /// default value. + /// + [CLSCompliant(false)] + public uint GetCMapLanguageId() + { + return FT.FT_Get_CMap_Language_ID(Reference); + } + + /// + /// Return TrueType/sfnt specific cmap format. + /// + /// The format of ‘charmap’. If ‘charmap’ doesn't belong to a TrueType/sfnt face, return -1. + public int GetCMapFormat() + { + return FT.FT_Get_CMap_Format(Reference); + } + + #endregion + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/ClassicKernValidationFlags.cs b/SharpFont/Source/SharpFontShared/ClassicKernValidationFlags.cs new file mode 100644 index 000000000..27fe3a079 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/ClassicKernValidationFlags.cs @@ -0,0 +1,47 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of bit-field constants used with to indicate the classic kern + /// dialect or dialects. If the selected type doesn't fit, regards the table + /// as invalid. + /// + [Flags] + [CLSCompliant(false)] + public enum ClassicKernValidationFlags : uint + { + /// Handle the ‘kern’ table as a classic Microsoft kern table. + Microsoft = 0x4000 << 0, + + /// Handle the ‘kern’ table as a classic Apple kern table. + Apple = 0x4000 << 1, + + /// Handle the ‘kern’ as either classic Apple or Microsoft kern table. + All = Microsoft | Apple + } +} diff --git a/SharpFont/Source/SharpFontShared/Data.cs b/SharpFont/Source/SharpFontShared/Data.cs new file mode 100644 index 000000000..712b757ca --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Data.cs @@ -0,0 +1,89 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont +{ + /// + /// Read-only binary data represented as a pointer and a length. + /// + public sealed class Data + { + #region Fields + + private IntPtr reference; + + #endregion + + #region Constructors + + internal Data(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the data. + /// + public IntPtr Pointer + { + get + { + return Marshal.ReadIntPtr(reference, 0); + } + } + + /// + /// Gets the length of the data in bytes. + /// + public int Length + { + get + { + return Marshal.ReadInt32(reference, IntPtr.Size); + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/EmbeddingTypes.cs b/SharpFont/Source/SharpFontShared/EmbeddingTypes.cs new file mode 100644 index 000000000..35b0844be --- /dev/null +++ b/SharpFont/Source/SharpFontShared/EmbeddingTypes.cs @@ -0,0 +1,88 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of bit flags used in the ‘fsType’ field of the OS/2 table in a + /// TrueType or OpenType font and the ‘FSType’ entry in a PostScript font. + /// These bit flags are returned by FT_Get_FSType_Flags; they inform client + /// applications of embedding and subsetting restrictions associated with a + /// font. + /// + /// + /// While the fsType flags can indicate that a font may be embedded, a + /// license with the font vendor may be separately required to use the font + /// in this way. + /// + /// + [Flags] + [CLSCompliant(false)] + public enum EmbeddingTypes : ushort + { + /// + /// Fonts with no fsType bit set may be embedded and permanently + /// installed on the remote system by an application. + /// + Installable = 0x0000, + + /// + /// Fonts that have only this bit set must not be modified, embedded + /// or exchanged in any manner without first obtaining permission of + /// the font software copyright owner. + /// + RestrictedLicense = 0x0002, + + /// + /// If this bit is set, the font may be embedded and temporarily loaded + /// on the remote system. Documents containing Preview & Print + /// fonts must be opened ‘read-only’; no edits can be applied to the + /// document. + /// + PreviewAndPrint = 0x0004, + + /// + /// If this bit is set, the font may be embedded but must only be + /// installed temporarily on other systems. In contrast to Preview + /// & Print fonts, documents containing editable fonts may be + /// opened for reading, editing is permitted, and changes may be saved. + /// + Editable = 0x0008, + + /// + /// If this bit is set, the font may not be subsetted prior to + /// embedding. + /// + NoSubsetting = 0x0100, + + /// + /// If this bit is set, only bitmaps contained in the font may be + /// embedded; no outline data may be embedded. If there are no bitmaps + /// available in the font, then the font is unembeddable. + /// + BitmapOnly = 0x0200 + } +} diff --git a/SharpFont/Source/SharpFontShared/Encoding.cs b/SharpFont/Source/SharpFontShared/Encoding.cs new file mode 100644 index 000000000..284555973 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Encoding.cs @@ -0,0 +1,135 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// An enumeration used to specify character sets supported by charmaps. + /// Used in the FT_Select_Charmap API function. + /// + /// + /// Despite the name, this enumeration lists specific character repertories + /// (i.e., charsets), and not text encoding methods (e.g., UTF-8, UTF-16, + /// etc.). + /// + /// Other encodings might be defined in the future. + /// + [CLSCompliant(false)] + public enum Encoding : uint + { + /// + /// The encoding value 0 is reserved. + /// + None = 0, + + /// + /// Corresponds to the Microsoft Symbol encoding, used to encode + /// mathematical symbols in the 32..255 character code range. + /// + /// + MicrosoftSymbol = ('s' << 24 | 'y' << 16 | 'm' << 8 | 'b'), + + /// + /// Corresponds to the Unicode character set. This value covers all + /// versions of the Unicode repertoire, including ASCII and Latin-1. + /// Most fonts include a Unicode charmap, but not all of them. + /// + /// For example, if you want to access Unicode value U+1F028 (and the + /// font contains it), use value 0x1F028 as the input value for + /// FT_Get_Char_Index. + /// + Unicode = ('u' << 24 | 'n' << 16 | 'i' << 8 | 'c'), + + /// + /// Corresponds to Japanese SJIS encoding. + /// + /// + Sjis = ('s' << 24 | 'j' << 16 | 'i' << 8 | 's'), + + /// + /// Corresponds to an encoding system for Simplified Chinese as used + /// used in mainland China. + /// + GB2312 = ('g' << 24 | 'b' << 16 | ' ' << 8 | ' '), + + /// + /// Corresponds to an encoding system for Traditional Chinese as used + /// in Taiwan and Hong Kong. + /// + Big5 = ('b' << 24 | 'i' << 16 | 'g' << 8 | '5'), + + /// + /// Corresponds to the Korean encoding system known as Wansung. + /// + /// + Wansung = ('w' << 24 | 'a' << 16 | 'n' << 8 | 's'), + + /// + /// The Korean standard character set (KS C 5601-1992), which + /// corresponds to MS Windows code page 1361. This character set + /// includes all possible Hangeul character combinations. + /// + Johab = ('j' << 24 | 'o' << 16 | 'h' << 8 | 'a'), + + /// + /// Corresponds to the Adobe Standard encoding, as found in Type 1, + /// CFF, and OpenType/CFF fonts. It is limited to 256 character codes. + /// + AdobeStandard = ('A' << 24 | 'D' << 16 | 'O' << 8 | 'B'), + + /// + /// Corresponds to the Adobe Expert encoding, as found in Type 1, CFF, + /// and OpenType/CFF fonts. It is limited to 256 character codes. + /// + AdobeExpert = ('A' << 24 | 'D' << 16 | 'B' << 8 | 'E'), + + /// + /// Corresponds to a custom encoding, as found in Type 1, CFF, and + /// OpenType/CFF fonts. It is limited to 256 character codes. + /// + AdobeCustom = ('A' << 24 | 'D' << 16 | 'B' << 8 | 'C'), + + /// + /// Corresponds to a Latin-1 encoding as defined in a Type 1 PostScript + /// font. It is limited to 256 character codes. + /// + AdobeLatin1 = ('l' << 24 | 'a' << 16 | 't' << 8 | '1'), + + /// + /// This value is deprecated and was never used nor reported by + /// FreeType. Don't use or test for it. + /// + [Obsolete("Never used nor reported by FreeType")] + OldLatin2 = ('l' << 24 | 'a' << 16 | 't' << 8 | '2'), + + /// + /// Corresponds to the 8-bit Apple roman encoding. Many TrueType and + /// OpenType fonts contain a charmap for this encoding, since older + /// versions of Mac OS are able to use it. + /// + AppleRoman = ('a' << 24 | 'r' << 16 | 'm' << 8 | 'n'), + } +} diff --git a/SharpFont/Source/SharpFontShared/Error.cs b/SharpFont/Source/SharpFontShared/Error.cs new file mode 100644 index 000000000..9811e7a16 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Error.cs @@ -0,0 +1,298 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// FreeType error codes. + /// + public enum Error + { + /// No error. + Ok = 0x00, + + /// Cannot open resource. + CannotOpenResource = 0x01, + + /// Unknown file format. + UnknownFileFormat = 0x02, + + /// Broken file. + InvalidFileFormat = 0x03, + + /// Invalid FreeType version. + InvalidVersion = 0x04, + + /// Module version is too low. + LowerModuleVersion = 0x05, + + /// Invalid argument. + InvalidArgument = 0x06, + + /// Unimplemented feature. + UnimplementedFeature = 0x07, + + /// Broken table. + InvalidTable = 0x08, + + /// Broken offset within table. + InvalidOffset = 0x09, + + /// Array allocation size too large. + ArrayTooLarge = 0x0A, + + /// Invalid glyph index. + InvalidGlyphIndex = 0x10, + + /// Invalid character code. + InvalidCharacterCode = 0x11, + + /// Unsupported glyph image format. + InvalidGlyphFormat = 0x12, + + /// Cannot render this glyph format. + CannotRenderGlyph = 0x13, + + /// Invalid outline. + InvalidOutline = 0x14, + + /// Invalid composite glyph. + InvalidComposite = 0x15, + + /// Too many hints. + TooManyHints = 0x16, + + /// Invalid pixel size. + InvalidPixelSize = 0x17, + + /// Invalid object handle. + InvalidHandle = 0x20, + + /// Invalid library handle. + InvalidLibraryHandle = 0x21, + + /// Invalid module handle. + InvalidDriverHandle = 0x22, + + /// Invalid face handle. + InvalidFaceHandle = 0x23, + + /// Invalid size handle. + InvalidSizeHandle = 0x24, + + /// Invalid glyph slot handle. + InvalidSlotHandle = 0x25, + + /// Invalid charmap handle. + InvalidCharMapHandle = 0x26, + + /// Invalid cache manager handle. + InvalidCacheHandle = 0x27, + + /// Invalid stream handle. + InvalidStreamHandle = 0x28, + + /// Too many modules. + TooManyDrivers = 0x30, + + /// Too many extensions. + TooManyExtensions = 0x31, + + /// Out of memory. + OutOfMemory = 0x40, + + /// Unlisted object. + UnlistedObject = 0x41, + + /// Cannot open stream. + CannotOpenStream = 0x51, + + /// Invalid stream seek. + InvalidStreamSeek = 0x52, + + /// Invalid stream skip. + InvalidStreamSkip = 0x53, + + /// Invalid stream read. + InvalidStreamRead = 0x54, + + /// Invalid stream operation. + InvalidStreamOperation = 0x55, + + /// Invalid frame operation. + InvalidFrameOperation = 0x56, + + /// Nested frame access. + NestedFrameAccess = 0x57, + + /// Invalid frame read. + InvalidFrameRead = 0x58, + + /// Raster uninitialized. + RasterUninitialized = 0x60, + + /// Raster corrupted. + RasterCorrupted = 0x61, + + /// Raster overflow. + RasterOverflow = 0x62, + + /// Negative height while rastering. + RasterNegativeHeight = 0x63, + + /// Too many registered caches. + TooManyCaches = 0x70, + + /// Invalid opcode. + InvalidOpCode = 0x80, + + /// Too few arguments. + TooFewArguments = 0x81, + + /// Stack overflow. + StackOverflow = 0x82, + + /// Code overflow. + CodeOverflow = 0x83, + + /// Bad argument. + BadArgument = 0x84, + + /// Division by zero. + DivideByZero = 0x85, + + /// Invalid reference. + InvalidReference = 0x86, + + /// Found debug opcode. + DebugOpCode = 0x87, + + /// Found ENDF opcode in execution stream. + EndfInExecStream = 0x88, + + /// Nested DEFS. + NestedDefs = 0x89, + + /// Invalid code range. + InvalidCodeRange = 0x8A, + + /// Execution context too long. + ExecutionTooLong = 0x8B, + + /// Too many function definitions. + TooManyFunctionDefs = 0x8C, + + /// Too many instruction definitions. + TooManyInstructionDefs = 0x8D, + + /// SFNT font table missing. + TableMissing = 0x8E, + + /// Horizontal header (hhea) table missing. + HorizHeaderMissing = 0x8F, + + /// Locations (loca) table missing. + LocationsMissing = 0x90, + + /// Name table missing. + NameTableMissing = 0x91, + + /// Character map (cmap) table missing. + CMapTableMissing = 0x92, + + /// Horizontal metrics (hmtx) table missing. + HmtxTableMissing = 0x93, + + /// PostScript (post) table missing. + PostTableMissing = 0x94, + + /// Invalid horizontal metrics. + InvalidHorizMetrics = 0x95, + + /// Invalid character map (cmap) format. + InvalidCharMapFormat = 0x96, + + /// Invalid ppem value. + InvalidPPem = 0x97, + + /// Invalid vertical metrics. + InvalidVertMetrics = 0x98, + + /// Could not find context. + CouldNotFindContext = 0x99, + + /// Invalid PostScript (post) table format. + InvalidPostTableFormat = 0x9A, + + /// Invalid PostScript (post) table. + InvalidPostTable = 0x9B, + + /// Opcode syntax error. + SyntaxError = 0xA0, + + /// Argument stack underflow. + StackUnderflow = 0xA1, + + /// Ignore this error. + Ignore = 0xA2, + + /// No Unicode glyph name found. + NoUnicodeGlyphName = 0xA3, + + /// `STARTFONT' field missing. + MissingStartfontField = 0xB0, + + /// `FONT' field missing. + MissingFontField = 0xB1, + + /// `SIZE' field missing. + MissingSizeField = 0xB2, + + /// `FONTBOUNDINGBOX' field missing. + MissingFontboudingboxField = 0xB3, + + /// `CHARS' field missing. + MissingCharsField = 0xB4, + + /// `STARTCHAR' field missing. + MissingStartcharField = 0xB5, + + /// `ENCODING' field missing. + MissingEncodingField = 0xB6, + + /// `BBX' field missing. + MissingBbxField = 0xB7, + + /// `BBX' too big. + BbxTooBig = 0xB8, + + /// Font header corrupted or missing fields. + CorruptedFontHeader = 0xB9, + + /// Font glyphs corrupted or missing fields. + CorruptedFontGlyphs = 0xBA + } +} diff --git a/SharpFont/Source/SharpFontShared/FT.Internal.cs b/SharpFont/Source/SharpFontShared/FT.Internal.cs new file mode 100644 index 000000000..b73d35947 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FT.Internal.cs @@ -0,0 +1,770 @@ +#region MIT License +/*Copyright (c) 2012-2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Cache; +using SharpFont.Internal; +using SharpFont.PostScript; +using SharpFont.TrueType; + +namespace SharpFont +{ + /// + /// This file contains all the raw FreeType2 function signatures. + /// + public static partial class FT + { + /// + /// Defines the location of the FreeType DLL. Update SharpFont.dll.config if you change this! + /// +#if SHARPFONT_PLATFORM_IOS + private const string FreetypeDll = "__Internal"; +#else + private const string FreetypeDll = "freetype6"; +#endif + + /// + /// Defines the calling convention for P/Invoking the native freetype methods. + /// + private const CallingConvention CallConvention = CallingConvention.Cdecl; + + #region Core API + + #region FreeType Version + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Library_Version(IntPtr library, out int amajor, out int aminor, out int apatch); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool FT_Face_CheckTrueTypePatents(IntPtr face); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool FT_Face_SetUnpatentedHinting(IntPtr face, [MarshalAs(UnmanagedType.U1)] bool value); + + #endregion + + #region Base Interface + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Init_FreeType(out IntPtr alibrary); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Done_FreeType(IntPtr library); + + [DllImport(FreetypeDll, CallingConvention = CallConvention, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] + internal static extern Error FT_New_Face(IntPtr library, string filepathname, int face_index, out IntPtr aface); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_New_Memory_Face(IntPtr library, IntPtr file_base, int file_size, int face_index, out IntPtr aface); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Open_Face(IntPtr library, IntPtr args, int face_index, out IntPtr aface); + + [DllImport(FreetypeDll, CallingConvention = CallConvention, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] + internal static extern Error FT_Attach_File(IntPtr face, string filepathname); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Attach_Stream(IntPtr face, IntPtr parameters); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Reference_Face(IntPtr face); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Done_Face(IntPtr face); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Select_Size(IntPtr face, int strike_index); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Request_Size(IntPtr face, IntPtr req); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Set_Char_Size(IntPtr face, IntPtr char_width, IntPtr char_height, uint horz_resolution, uint vert_resolution); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Set_Pixel_Sizes(IntPtr face, uint pixel_width, uint pixel_height); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Load_Glyph(IntPtr face, uint glyph_index, int load_flags); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Load_Char(IntPtr face, uint char_code, int load_flags); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Set_Transform(IntPtr face, IntPtr matrix, IntPtr delta); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Render_Glyph(IntPtr slot, RenderMode render_mode); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_Kerning(IntPtr face, uint left_glyph, uint right_glyph, uint kern_mode, out FTVector26Dot6 akerning); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_Track_Kerning(IntPtr face, IntPtr point_size, int degree, out IntPtr akerning); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_Glyph_Name(IntPtr face, uint glyph_index, IntPtr buffer, uint buffer_max); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Get_Postscript_Name(IntPtr face); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Select_Charmap(IntPtr face, Encoding encoding); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Set_Charmap(IntPtr face, IntPtr charmap); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern int FT_Get_Charmap_Index(IntPtr charmap); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern uint FT_Get_Char_Index(IntPtr face, uint charcode); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern uint FT_Get_First_Char(IntPtr face, out uint agindex); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern uint FT_Get_Next_Char(IntPtr face, uint char_code, out uint agindex); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern uint FT_Get_Name_Index(IntPtr face, IntPtr glyph_name); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_SubGlyph_Info(IntPtr glyph, uint sub_index, out int p_index, out SubGlyphFlags p_flags, out int p_arg1, out int p_arg2, out FTMatrix p_transform); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern EmbeddingTypes FT_Get_FSType_Flags(IntPtr face); + + #endregion + + #region Glyph Variants + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern uint FT_Face_GetCharVariantIndex(IntPtr face, uint charcode, uint variantSelector); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern int FT_Face_GetCharVariantIsDefault(IntPtr face, uint charcode, uint variantSelector); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Face_GetVariantSelectors(IntPtr face); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Face_GetVariantsOfChar(IntPtr face, uint charcode); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Face_GetCharsOfVariant(IntPtr face, uint variantSelector); + + #endregion + + #region Glyph Management + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_Glyph(IntPtr slot, out IntPtr aglyph); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Glyph_Copy(IntPtr source, out IntPtr target); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Glyph_Transform(IntPtr glyph, ref FTMatrix matrix, ref FTVector delta); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Glyph_Get_CBox(IntPtr glyph, GlyphBBoxMode bbox_mode, out BBox acbox); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Glyph_To_Bitmap(ref IntPtr the_glyph, RenderMode render_mode, ref FTVector26Dot6 origin, [MarshalAs(UnmanagedType.U1)] bool destroy); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Done_Glyph(IntPtr glyph); + + #endregion + +#if !SHARPFONT_PLATFORM_IOS + #region Mac Specific Interface + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_New_Face_From_FOND(IntPtr library, IntPtr fond, int face_index, out IntPtr aface); + + [DllImport(FreetypeDll, CallingConvention = CallConvention, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] + internal static extern Error FT_GetFile_From_Mac_Name(string fontName, out IntPtr pathSpec, out int face_index); + + [DllImport(FreetypeDll, CallingConvention = CallConvention, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] + internal static extern Error FT_GetFile_From_Mac_ATS_Name(string fontName, out IntPtr pathSpec, out int face_index); + + [DllImport(FreetypeDll, CallingConvention = CallConvention, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] + internal static extern Error FT_GetFilePath_From_Mac_ATS_Name(string fontName, IntPtr path, int maxPathSize, out int face_index); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_New_Face_From_FSSpec(IntPtr library, IntPtr spec, int face_index, out IntPtr aface); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_New_Face_From_FSRef(IntPtr library, IntPtr @ref, int face_index, out IntPtr aface); + #endregion +#endif + + #region Size Management + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_New_Size(IntPtr face, out IntPtr size); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Done_Size(IntPtr size); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Activate_Size(IntPtr size); + + #endregion + + #endregion + + #region Format-Specific API + + #region Multiple Masters + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_Multi_Master(IntPtr face, out IntPtr amaster); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_MM_Var(IntPtr face, out IntPtr amaster); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Set_MM_Design_Coordinates(IntPtr face, uint num_coords, IntPtr coords); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Set_Var_Design_Coordinates(IntPtr face, uint num_coords, IntPtr coords); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Set_MM_Blend_Coordinates(IntPtr face, uint num_coords, IntPtr coords); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Set_Var_Blend_Coordinates(IntPtr face, uint num_coords, IntPtr coords); + + #endregion + + #region TrueType Tables + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Get_Sfnt_Table(IntPtr face, SfntTag tag); + + //TODO find FT_TRUETYPE_TAGS_H and create an enum for "tag" + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Load_Sfnt_Table(IntPtr face, uint tag, int offset, IntPtr buffer, ref uint length); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static unsafe extern Error FT_Sfnt_Table_Info(IntPtr face, uint table_index, SfntTag* tag, out uint length); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern uint FT_Get_CMap_Language_ID(IntPtr charmap); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern int FT_Get_CMap_Format(IntPtr charmap); + + #endregion + + #region Type 1 Tables + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool FT_Has_PS_Glyph_Names(IntPtr face); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_PS_Font_Info(IntPtr face, out PostScript.Internal.FontInfoRec afont_info); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_PS_Font_Private(IntPtr face, out PostScript.Internal.PrivateRec afont_private); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern int FT_Get_PS_Font_Value(IntPtr face, DictionaryKeys key, uint idx, ref IntPtr value, int value_len); + + #endregion + + #region SFNT Names + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern uint FT_Get_Sfnt_Name_Count(IntPtr face); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_Sfnt_Name(IntPtr face, uint idx, out TrueType.Internal.SfntNameRec aname); + + #endregion + + #region BDF and PCF Files + + [DllImport(FreetypeDll, CallingConvention = CallConvention, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] + internal static extern Error FT_Get_BDF_Charset_ID(IntPtr face, out string acharset_encoding, out string acharset_registry); + + [DllImport(FreetypeDll, CallingConvention = CallConvention, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] + internal static extern Error FT_Get_BDF_Property(IntPtr face, string prop_name, out IntPtr aproperty); + + #endregion + + #region CID Fonts + + [DllImport(FreetypeDll, CallingConvention = CallConvention, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] + internal static extern Error FT_Get_CID_Registry_Ordering_Supplement(IntPtr face, out string registry, out string ordering, out int aproperty); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_CID_Is_Internally_CID_Keyed(IntPtr face, out byte is_cid); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_CID_From_Glyph_Index(IntPtr face, uint glyph_index, out uint cid); + + #endregion + + #region PFR Fonts + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_PFR_Metrics(IntPtr face, out uint aoutline_resolution, out uint ametrics_resolution, out IntPtr ametrics_x_scale, out IntPtr ametrics_y_scale); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_PFR_Kerning(IntPtr face, uint left, uint right, out FTVector avector); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_PFR_Advance(IntPtr face, uint gindex, out int aadvance); + + #endregion + + #region Window FNT Files + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_WinFNT_Header(IntPtr face, out IntPtr aheader); + + #endregion + + #region Font Formats + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Get_X11_Font_Format(IntPtr face); + + #endregion + + #region Gasp Table + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Gasp FT_Get_Gasp(IntPtr face, uint ppem); + + #endregion + + #endregion + + #region Support API + + #region Computations + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_MulDiv(IntPtr a, IntPtr b, IntPtr c); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_MulFix(IntPtr a, IntPtr b); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_DivFix(IntPtr a, IntPtr b); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_RoundFix(IntPtr a); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_CeilFix(IntPtr a); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_FloorFix(IntPtr a); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Vector_Transform(ref FTVector vec, ref FTMatrix matrix); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Matrix_Multiply(ref FTMatrix a, ref FTMatrix b); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Matrix_Invert(ref FTMatrix matrix); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Sin(IntPtr angle); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Cos(IntPtr angle); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Tan(IntPtr angle); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Atan2(IntPtr x, IntPtr y); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Angle_Diff(IntPtr angle1, IntPtr angle2); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Vector_Unit(out FTVector vec, IntPtr angle); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Vector_Rotate(ref FTVector vec, IntPtr angle); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Vector_Length(ref FTVector vec); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Vector_Polarize(ref FTVector vec, out IntPtr length, out IntPtr angle); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Vector_From_Polar(out FTVector vec, IntPtr length, IntPtr angle); + + #endregion + + #region List Processing + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_List_Find(IntPtr list, IntPtr data); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_List_Add(IntPtr list, IntPtr node); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_List_Insert(IntPtr list, IntPtr node); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_List_Remove(IntPtr list, IntPtr node); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_List_Up(IntPtr list, IntPtr node); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_List_Iterate(IntPtr list, ListIterator iterator, IntPtr user); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_List_Finalize(IntPtr list, ListDestructor destroy, IntPtr memory, IntPtr user); + + #endregion + + #region Outline Processing + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_New(IntPtr library, uint numPoints, int numContours, out IntPtr anoutline); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_New_Internal(IntPtr memory, uint numPoints, int numContours, out IntPtr anoutline); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_Done(IntPtr library, IntPtr outline); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_Done_Internal(IntPtr memory, IntPtr outline); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_Copy(IntPtr source, ref IntPtr target); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Outline_Translate(IntPtr outline, int xOffset, int yOffset); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Outline_Transform(IntPtr outline, ref FTMatrix matrix); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_Embolden(IntPtr outline, IntPtr strength); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_EmboldenXY(IntPtr outline, int xstrength, int ystrength); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Outline_Reverse(IntPtr outline); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_Check(IntPtr outline); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_Get_BBox(IntPtr outline, out BBox abbox); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_Decompose(IntPtr outline, ref OutlineFuncsRec func_interface, IntPtr user); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Outline_Get_CBox(IntPtr outline, out BBox acbox); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_Get_Bitmap(IntPtr library, IntPtr outline, IntPtr abitmap); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Outline_Render(IntPtr library, IntPtr outline, IntPtr @params); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Orientation FT_Outline_Get_Orientation(IntPtr outline); + + #endregion + + #region Quick retrieval of advance values + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_Advance(IntPtr face, uint gIndex, LoadFlags load_flags, out IntPtr padvance); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Get_Advances(IntPtr face, uint start, uint count, LoadFlags load_flags, out IntPtr padvance); + + #endregion + + #region Bitmap Handling + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Bitmap_New(IntPtr abitmap); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Bitmap_Copy(IntPtr library, IntPtr source, IntPtr target); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Bitmap_Embolden(IntPtr library, IntPtr bitmap, IntPtr xStrength, IntPtr yStrength); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Bitmap_Convert(IntPtr library, IntPtr source, IntPtr target, int alignment); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_GlyphSlot_Own_Bitmap(IntPtr slot); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Bitmap_Done(IntPtr library, IntPtr bitmap); + + #endregion + + #region Glyph Stroker + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern StrokerBorder FT_Outline_GetInsideBorder(IntPtr outline); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern StrokerBorder FT_Outline_GetOutsideBorder(IntPtr outline); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stroker_New(IntPtr library, out IntPtr astroker); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Stroker_Set(IntPtr stroker, int radius, StrokerLineCap line_cap, StrokerLineJoin line_join, IntPtr miter_limit); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Stroker_Rewind(IntPtr stroker); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stroker_ParseOutline(IntPtr stroker, IntPtr outline, [MarshalAs(UnmanagedType.U1)] bool opened); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stroker_BeginSubPath(IntPtr stroker, ref FTVector to, [MarshalAs(UnmanagedType.U1)] bool open); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stroker_EndSubPath(IntPtr stroker); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stroker_LineTo(IntPtr stroker, ref FTVector to); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stroker_ConicTo(IntPtr stroker, ref FTVector control, ref FTVector to); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stroker_CubicTo(IntPtr stroker, ref FTVector control1, ref FTVector control2, ref FTVector to); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stroker_GetBorderCounts(IntPtr stroker, StrokerBorder border, out uint anum_points, out uint anum_contours); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Stroker_ExportBorder(IntPtr stroker, StrokerBorder border, IntPtr outline); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stroker_GetCounts(IntPtr stroker, out uint anum_points, out uint anum_contours); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Stroker_Export(IntPtr stroker, IntPtr outline); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Stroker_Done(IntPtr stroker); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Glyph_Stroke(ref IntPtr pglyph, IntPtr stoker, [MarshalAs(UnmanagedType.U1)] bool destroy); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Glyph_StrokeBorder(ref IntPtr pglyph, IntPtr stoker, [MarshalAs(UnmanagedType.U1)] bool inside, [MarshalAs(UnmanagedType.U1)] bool destroy); + + #endregion + + #region Module Management + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Add_Module(IntPtr library, IntPtr clazz); + + [DllImport(FreetypeDll, CallingConvention = CallConvention, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] + internal static extern IntPtr FT_Get_Module(IntPtr library, string module_name); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Remove_Module(IntPtr library, IntPtr module); + + [DllImport(FreetypeDll, CallingConvention = CallConvention, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] + internal static extern Error FT_Property_Set(IntPtr library, string module_name, string property_name, IntPtr value); + + [DllImport(FreetypeDll, CallingConvention = CallConvention, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] + internal static extern Error FT_Property_Get(IntPtr library, string module_name, string property_name, IntPtr value); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Reference_Library(IntPtr library); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_New_Library(IntPtr memory, out IntPtr alibrary); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Done_Library(IntPtr library); + + //TODO figure out the method signature for debug_hook. (FT_DebugHook_Func) + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Set_Debug_Hook(IntPtr library, uint hook_index, IntPtr debug_hook); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_Add_Default_Modules(IntPtr library); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern IntPtr FT_Get_Renderer(IntPtr library, GlyphFormat format); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Set_Renderer(IntPtr library, IntPtr renderer, uint num_params, IntPtr parameters); + + #endregion + + #region GZIP Streams + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stream_OpenGzip(IntPtr stream, IntPtr source); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Gzip_Uncompress(IntPtr memory, IntPtr output, ref IntPtr output_len, IntPtr input, IntPtr input_len); + + #endregion + + #region LZW Streams + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stream_OpenLZW(IntPtr stream, IntPtr source); + + #endregion + + #region BZIP2 Streams + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Stream_OpenBzip2(IntPtr stream, IntPtr source); + + #endregion + + #region LCD Filtering + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Library_SetLcdFilter(IntPtr library, LcdFilter filter); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_Library_SetLcdFilterWeights(IntPtr library, byte[] weights); + + #endregion + + #endregion + + #region Caching Sub-system + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FTC_Manager_New(IntPtr library, uint max_faces, uint max_sizes, ulong maxBytes, FaceRequester requester, IntPtr req_data, out IntPtr amanager); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FTC_Manager_Reset(IntPtr manager); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FTC_Manager_Done(IntPtr manager); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FTC_Manager_LookupFace(IntPtr manager, IntPtr face_id, out IntPtr aface); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FTC_Manager_LookupSize(IntPtr manager, IntPtr scaler, out IntPtr asize); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FTC_Node_Unref(IntPtr node, IntPtr manager); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FTC_Manager_RemoveFaceID(IntPtr manager, IntPtr face_id); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FTC_CMapCache_New(IntPtr manager, out IntPtr acache); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern uint FTC_CMapCache_Lookup(IntPtr cache, IntPtr face_id, int cmap_index, uint char_code); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FTC_ImageCache_New(IntPtr manager, out IntPtr acache); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FTC_ImageCache_Lookup(IntPtr cache, IntPtr type, uint gindex, out IntPtr aglyph, out IntPtr anode); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FTC_ImageCache_LookupScaler(IntPtr cache, IntPtr scaler, LoadFlags load_flags, uint gindex, out IntPtr aglyph, out IntPtr anode); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FTC_SBitCache_New(IntPtr manager, out IntPtr acache); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FTC_SBitCache_Lookup(IntPtr cache, IntPtr type, uint gindex, out IntPtr sbit, out IntPtr anode); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FTC_SBitCache_LookupScaler(IntPtr cache, IntPtr scaler, LoadFlags load_flags, uint gindex, out IntPtr sbit, out IntPtr anode); + + #endregion + + #region Miscellaneous + + #region OpenType Validation + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_OpenType_Validate(IntPtr face, OpenTypeValidationFlags validation_flags, out IntPtr base_table, out IntPtr gdef_table, out IntPtr gpos_table, out IntPtr gsub_table, out IntPtr jsft_table); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern void FT_OpenType_Free(IntPtr face, IntPtr table); + + #endregion + + #region The TrueType Engine + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern EngineType FT_Get_TrueType_Engine_Type(IntPtr library); + + #endregion + + #region TrueTypeGX/AAT Validation + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_TrueTypeGX_Validate(IntPtr face, TrueTypeValidationFlags validation_flags, byte[][] tables, uint tableLength); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_TrueTypeGX_Free(IntPtr face, IntPtr table); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_ClassicKern_Validate(IntPtr face, ClassicKernValidationFlags validation_flags, out IntPtr ckern_table); + + [DllImport(FreetypeDll, CallingConvention = CallConvention)] + internal static extern Error FT_ClassicKern_Free(IntPtr face, IntPtr table); + + #endregion + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/FT.Public.cs b/SharpFont/Source/SharpFontShared/FT.Public.cs new file mode 100644 index 000000000..676d60162 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FT.Public.cs @@ -0,0 +1,262 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// Miscellaneous FreeType2 functions that don't fit anywhere else. + /// + public static partial class FT + { + #region Computations + + /// + /// A very simple function used to perform the computation ‘(a*b)/c’ with maximal accuracy (it uses a 64-bit + /// intermediate integer whenever necessary). + /// + /// This function isn't necessarily as fast as some processor specific operations, but is at least completely + /// portable. + /// + /// The first multiplier. + /// The second multiplier. + /// The divisor. + /// + /// The result of ‘(a*b)/c’. This function never traps when trying to divide by zero; it simply returns + /// ‘MaxInt’ or ‘MinInt’ depending on the signs of ‘a’ and ‘b’. + /// + [Obsolete("Use Fixed16Dot16.MultiplyDivide() instead.")] + public static Fixed16Dot16 MulDiv(Fixed16Dot16 a, Fixed16Dot16 b, Fixed16Dot16 c) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_MulDiv((IntPtr)a.Value, (IntPtr)b.Value, (IntPtr)c.Value)); + } + + /// + /// A very simple function used to perform the computation ‘(a*b)/0x10000’ with maximal accuracy. Most of the + /// time this is used to multiply a given value by a 16.16 fixed float factor. + /// + /// + /// This function has been optimized for the case where the absolute value of ‘a’ is less than 2048, and ‘b’ is + /// a 16.16 scaling factor. As this happens mainly when scaling from notional units to fractional pixels in + /// FreeType, it resulted in noticeable speed improvements between versions 2.x and 1.x. + /// + /// As a conclusion, always try to place a 16.16 factor as the second argument of this function; this can make + /// a great difference. + /// + /// The first multiplier. + /// The second multiplier. Use a 16.16 factor here whenever possible (see note below). + /// The result of ‘(a*b)/0x10000’. + [Obsolete("Use Fixed16Dot16.MultiplyFix() instead.")] + public static Fixed16Dot16 MulFix(int a, Fixed16Dot16 b) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_MulFix((IntPtr)a, (IntPtr)b.Value)); + } + + /// + /// A very simple function used to perform the computation ‘(a*0x10000)/b’ with maximal accuracy. Most of the + /// time, this is used to divide a given value by a 16.16 fixed float factor. + /// + /// + /// The optimization for is simple: If (a << 16) fits in 32 bits, then the division + /// is computed directly. Otherwise, we use a specialized version of . + /// + /// The first multiplier. + /// The second multiplier. Use a 16.16 factor here whenever possible (see note below). + /// The result of ‘(a*0x10000)/b’. + [Obsolete("Use Fixed16Dot16.DivideFix() instead.")] + public static Fixed16Dot16 DivFix(int a, Fixed16Dot16 b) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_DivFix((IntPtr)a, (IntPtr)b.Value)); + } + + /// + /// A very simple function used to round a 16.16 fixed number. + /// + /// The number to be rounded. + /// The result of ‘(a + 0x8000) & -0x10000’. + [Obsolete("Use Fixed16Dot16.RoundFix() instead.")] + public static Fixed16Dot16 RoundFix(Fixed16Dot16 a) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_RoundFix((IntPtr)a.Value)); + } + + /// + /// A very simple function used to compute the ceiling function of a 16.16 fixed number. + /// + /// The number for which the ceiling function is to be computed. + /// The result of ‘(a + 0x10000 - 1) & -0x10000’. + [Obsolete("Use Fixed16Dot16.CeilingFix() instead.")] + public static Fixed16Dot16 CeilFix(Fixed16Dot16 a) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_CeilFix((IntPtr)a.Value)); + } + + /// + /// A very simple function used to compute the floor function of a 16.16 fixed number. + /// + /// The number for which the floor function is to be computed. + /// The result of ‘a & -0x10000’. + [Obsolete("Use Fixed16Dot16.FloorFix() instead.")] + public static Fixed16Dot16 FloorFix(Fixed16Dot16 a) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_FloorFix((IntPtr)a.Value)); + } + + /// + /// Return the sinus of a given angle in fixed point format. + /// + /// + /// If you need both the sinus and cosinus for a given angle, use the function . + /// + /// The input angle. + /// The sinus value. + [Obsolete("Use Fixed16Dot16.Sin() instead.")] + public static Fixed16Dot16 Sin(Fixed16Dot16 angle) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_Sin((IntPtr)angle.Value)); + } + + /// + /// Return the cosinus of a given angle in fixed point format. + /// + /// + /// If you need both the sinus and cosinus for a given angle, use the function . + /// + /// The input angle. + /// The cosinus value. + [Obsolete("Use Fixed16Dot16.Cos() instead.")] + public static Fixed16Dot16 Cos(Fixed16Dot16 angle) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_Cos((IntPtr)angle.Value)); + } + + /// + /// Return the tangent of a given angle in fixed point format. + /// + /// The input angle. + /// The tangent value. + [Obsolete("Use Fixed16Dot16.Tan() instead.")] + public static Fixed16Dot16 Tan(Fixed16Dot16 angle) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_Tan((IntPtr)angle.Value)); + } + + /// + /// Return the arc-tangent corresponding to a given vector (x,y) in the 2d plane. + /// + /// The horizontal vector coordinate. + /// The vertical vector coordinate. + /// The arc-tangent value (i.e. angle). + [Obsolete("Use Fixed16Dot16.Atan2() instead.")] + public static Fixed16Dot16 Atan2(Fixed16Dot16 x, Fixed16Dot16 y) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_Atan2((IntPtr)x.Value, (IntPtr)y.Value)); + } + + /// + /// Return the difference between two angles. The result is always constrained to the [-PI..PI] interval. + /// + /// First angle. + /// Second angle. + /// Constrained value of ‘value2-value1’. + [Obsolete("Use Fixed16Dot16.AngleDiff() instead.")] + public static Fixed16Dot16 AngleDiff(Fixed16Dot16 angle1, Fixed16Dot16 angle2) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_Angle_Diff((IntPtr)angle1.Value, (IntPtr)angle2.Value)); + } + + #endregion + +#if !SHARPFONT_PLATFORM_IOS + #region Mac Specific Interface + + /// + /// Return an FSSpec for the disk file containing the named font. + /// + /// Mac OS name of the font (e.g., Times New Roman Bold). + /// Index of the face. For passing to . + /// FSSpec to the file. For passing to . + public static IntPtr GetFileFromMacName(string fontName, out int faceIndex) + { + IntPtr fsspec; + + Error err = FT_GetFile_From_Mac_Name(fontName, out fsspec, out faceIndex); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return fsspec; + } + + /// + /// Return an FSSpec for the disk file containing the named font. + /// + /// Mac OS name of the font in ATS framework. + /// Index of the face. For passing to . + /// FSSpec to the file. For passing to . + public static IntPtr GetFileFromMacAtsName(string fontName, out int faceIndex) + { + IntPtr fsspec; + + Error err = FT_GetFile_From_Mac_ATS_Name(fontName, out fsspec, out faceIndex); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return fsspec; + } + + /// + /// Return a pathname of the disk file and face index for given font name which is handled by ATS framework. + /// + /// Mac OS name of the font in ATS framework. + /// + /// Buffer to store pathname of the file. For passing to . The client must + /// allocate this buffer before calling this function. + /// + /// Index of the face. For passing to . + public static unsafe int GetFilePathFromMacAtsName(string fontName, byte[] path) + { + int faceIndex; + + fixed (void* ptr = path) + { + Error err = FT_GetFilePath_From_Mac_ATS_Name(fontName, (IntPtr)ptr, path.Length, out faceIndex); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + return faceIndex; + } + + #endregion +#endif + } +} diff --git a/SharpFont/Source/SharpFontShared/FTBitmap.cs b/SharpFont/Source/SharpFontShared/FTBitmap.cs new file mode 100644 index 000000000..5b2ad7271 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FTBitmap.cs @@ -0,0 +1,546 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015-2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +#if !SHARPFONT_PORTABLE +using System.Drawing; +using System.Drawing.Imaging; +#endif +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A structure used to describe a bitmap or pixmap to the raster. Note that we now manage pixmaps of various + /// depths through the field. + /// + /// + /// For now, the only pixel modes supported by FreeType are mono and grays. However, drivers might be added in the + /// future to support more ‘colorful’ options. + /// + public sealed class FTBitmap : IDisposable + { + #region Fields + + private IntPtr reference; + private BitmapRec rec; + + private Library library; + + private bool disposed; + + //If the bitmap was generated with FT_Bitmap_New. + private bool user; + + //HACK these variables exist to reduce the cost of reflection at runtime. + //Meant to be a temporary fix to https://github.com/Robmaister/SharpFont/issues/62 + //until libgdiplus gets patched. +#if !SHARPFONT_PORTABLE + private bool hasCheckedForMono; + private bool isRunningOnMono; + private System.Reflection.FieldInfo monoPaletteFlagsField; +#endif + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The parent . + public FTBitmap(Library library) + { + IntPtr bitmapRef = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(BitmapRec))); + FT.FT_Bitmap_New(bitmapRef); + Reference = bitmapRef; + + this.library = library; + this.user = true; + } + + internal FTBitmap(IntPtr reference, Library library) + { + Reference = reference; + this.library = library; + } + + internal FTBitmap(IntPtr reference, BitmapRec bmpInt, Library library) + { + this.reference = reference; + this.rec = bmpInt; + this.library = library; + } + + /// + /// Finalizes an instance of the class. + /// + ~FTBitmap() + { + Dispose(false); + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the has been disposed. + /// + public bool IsDisposed + { + get + { + return disposed; + } + } + + /// + /// Gets the number of bitmap rows. + /// + public int Rows + { + get + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + return rec.rows; + } + } + + /// + /// Gets the number of pixels in bitmap row. + /// + public int Width + { + get + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + return rec.width; + } + } + + /// + /// Gets the pitch's absolute value is the number of bytes taken by one bitmap row, including padding. However, + /// the pitch is positive when the bitmap has a ‘down’ flow, and negative when it has an ‘up’ flow. In all + /// cases, the pitch is an offset to add to a bitmap pointer in order to go down one row. + /// + /// Note that ‘padding’ means the alignment of a bitmap to a byte border, and FreeType functions normally align + /// to the smallest possible integer value. + /// + /// For the B/W rasterizer, ‘pitch’ is always an even number. + /// + /// To change the pitch of a bitmap (say, to make it a multiple of 4), use . + /// Alternatively, you might use callback functions to directly render to the application's surface; see the + /// file ‘example2.cpp’ in the tutorial for a demonstration. + /// + public int Pitch + { + get + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + return rec.pitch; + } + } + + /// + /// Gets a typeless pointer to the bitmap buffer. This value should be aligned on 32-bit boundaries in most + /// cases. + /// + public IntPtr Buffer + { + get + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + return rec.buffer; + } + } + + /// + /// Gets the number of gray levels used in the bitmap. This field is only used with + /// . + /// + public short GrayLevels + { + get + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + return rec.num_grays; + } + } + + /// + /// Gets the pixel mode, i.e., how pixel bits are stored. + /// + public PixelMode PixelMode + { + get + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + return rec.pixel_mode; + } + } + + /// + /// Gets how the palette is stored. This field is intended for paletted pixel modes. + /// + [Obsolete("Not used currently.")] + public byte PaletteMode + { + get + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + return rec.palette_mode; + } + } + + /// + /// Gets a typeless pointer to the bitmap palette; this field is intended for paletted pixel modes. + /// + [Obsolete("Not used currently.")] + public IntPtr Palette + { + get + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + return rec.palette; + } + } + + /// + /// Gets the 's buffer as a byte array. + /// + public byte[] BufferData + { + get + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + //TODO deal with negative pitch + byte[] data = new byte[rec.rows * rec.pitch]; + Marshal.Copy(rec.buffer, data, 0, data.Length); + return data; + } + } + + internal IntPtr Reference + { + get + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + return reference; + } + + set + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + + #region Methods + + /// + /// Copy a bitmap into another one. + /// + /// A handle to a library object. + /// A handle to the target bitmap. + public FTBitmap Copy(Library library) + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + if (library == null) + throw new ArgumentNullException("library"); + + FTBitmap newBitmap = new FTBitmap(library); + IntPtr bmpRef = newBitmap.reference; + Error err = FT.FT_Bitmap_Copy(library.Reference, Reference, bmpRef); + newBitmap.Reference = bmpRef; + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return newBitmap; + } + + /// + /// Embolden a bitmap. The new bitmap will be about ‘xStrength’ pixels wider and ‘yStrength’ pixels higher. The + /// left and bottom borders are kept unchanged. + /// + /// + /// The current implementation restricts ‘xStrength’ to be less than or equal to 8 if bitmap is of pixel_mode + /// . + /// + /// If you want to embolden the bitmap owned by a , you should call + /// on the slot first. + /// + /// A handle to a library object. + /// + /// How strong the glyph is emboldened horizontally. Expressed in 26.6 pixel format. + /// + /// + /// How strong the glyph is emboldened vertically. Expressed in 26.6 pixel format. + /// + public void Embolden(Library library, Fixed26Dot6 xStrength, Fixed26Dot6 yStrength) + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + if (library == null) + throw new ArgumentNullException("library"); + + Error err = FT.FT_Bitmap_Embolden(library.Reference, Reference, (IntPtr)xStrength.Value, (IntPtr)yStrength.Value); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, or 8bpp to a bitmap object with depth 8bpp, making the + /// number of used bytes per line (a.k.a. the ‘pitch’) a multiple of ‘alignment’. + /// + /// + /// It is possible to call multiple times without calling + /// (the memory is simply reallocated). + /// + /// Use to finally remove the bitmap object. + /// + /// The ‘library’ argument is taken to have access to FreeType's memory handling functions. + /// + /// A handle to a library object. + /// + /// The pitch of the bitmap is a multiple of this parameter. Common values are 1, 2, or 4. + /// + /// The target bitmap. + public FTBitmap Convert(Library library, int alignment) + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + if (library == null) + throw new ArgumentNullException("library"); + + FTBitmap newBitmap = new FTBitmap(library); + IntPtr bmpRef = newBitmap.reference; + Error err = FT.FT_Bitmap_Convert(library.Reference, Reference, bmpRef, alignment); + newBitmap.Reference = bmpRef; + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return newBitmap; + } + +#if !SHARPFONT_PORTABLE + /// + /// Copies the contents of the to a GDI+ . + /// + /// A GDI+ containing this bitmap's data. + public Bitmap ToGdipBitmap() + { + return ToGdipBitmap(Color.Black); + } + + /// + /// Copies the contents of the to a GDI+ . + /// + /// The color of the text. + /// A GDI+ containing this bitmap's data with a transparent background. + public Bitmap ToGdipBitmap(Color color) + { + if (disposed) + throw new ObjectDisposedException("FTBitmap", "Cannot access a disposed object."); + + if (rec.width == 0 || rec.rows == 0) + throw new InvalidOperationException("Invalid image size - one or both dimensions are 0."); + + //TODO deal with negative pitch + switch (rec.pixel_mode) + { + case PixelMode.Mono: + { + Bitmap bmp = new Bitmap(rec.width, rec.rows, PixelFormat.Format1bppIndexed); + var locked = bmp.LockBits(new Rectangle(0, 0, rec.width, rec.rows), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed); + + for (int i = 0; i < rec.rows; i++) + PInvokeHelper.Copy(Buffer, i * rec.pitch, locked.Scan0, i * locked.Stride, locked.Stride); + + bmp.UnlockBits(locked); + + ColorPalette palette = bmp.Palette; + palette.Entries[0] = Color.FromArgb(0, color); + palette.Entries[1] = Color.FromArgb(255, color); + + bmp.Palette = palette; + return bmp; + } + + case PixelMode.Gray4: + { + Bitmap bmp = new Bitmap(rec.width, rec.rows, PixelFormat.Format4bppIndexed); + var locked = bmp.LockBits(new Rectangle(0, 0, rec.width, rec.rows), ImageLockMode.ReadWrite, PixelFormat.Format4bppIndexed); + + for (int i = 0; i < rec.rows; i++) + PInvokeHelper.Copy(Buffer, i * rec.pitch, locked.Scan0, i * locked.Stride, locked.Stride); + + bmp.UnlockBits(locked); + + ColorPalette palette = bmp.Palette; + for (int i = 0; i < palette.Entries.Length; i++) + { + float a = (i * 17) / 255f; + palette.Entries[i] = Color.FromArgb(i * 17, (int)(color.R * a), (int)(color.G * a), (int)(color.B * a)); + } + + bmp.Palette = palette; + return bmp; + } + + case PixelMode.Gray: + { + Bitmap bmp = new Bitmap(rec.width, rec.rows, PixelFormat.Format8bppIndexed); + var locked = bmp.LockBits(new Rectangle(0, 0, rec.width, rec.rows), ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed); + + for (int i = 0; i < rec.rows; i++) + PInvokeHelper.Copy(Buffer, i * rec.pitch, locked.Scan0, i * locked.Stride, locked.Stride); + + bmp.UnlockBits(locked); + + ColorPalette palette = bmp.Palette; + for (int i = 0; i < palette.Entries.Length; i++) + { + float a = i / 255f; + palette.Entries[i] = Color.FromArgb(i, (int)(color.R * a), (int)(color.G * a), (int)(color.B * a)); + } + + //HACK There's a bug in Mono's libgdiplus requiring the "PaletteHasAlpha" flag to be set for transparency to work properly + //See https://github.com/Robmaister/SharpFont/issues/62 + if (!hasCheckedForMono) + { + hasCheckedForMono = true; + isRunningOnMono = Type.GetType("Mono.Runtime") != null; + if (isRunningOnMono) + { + monoPaletteFlagsField = typeof(ColorPalette).GetField("flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); + } + } + + if (isRunningOnMono) + monoPaletteFlagsField.SetValue(palette, palette.Flags | 1); + + bmp.Palette = palette; + return bmp; + } + + case PixelMode.Lcd: + { + //TODO apply color + int bmpWidth = rec.width / 3; + Bitmap bmp = new Bitmap(bmpWidth, rec.rows, PixelFormat.Format24bppRgb); + var locked = bmp.LockBits(new Rectangle(0, 0, bmpWidth, rec.rows), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); + + for (int i = 0; i < rec.rows; i++) + PInvokeHelper.Copy(Buffer, i * rec.pitch, locked.Scan0, i * locked.Stride, locked.Stride); + + bmp.UnlockBits(locked); + + return bmp; + } + /*case PixelMode.VerticalLcd: + { + int bmpHeight = rec.rows / 3; + Bitmap bmp = new Bitmap(rec.width, bmpHeight, PixelFormat.Format24bppRgb); + var locked = bmp.LockBits(new Rectangle(0, 0, rec.width, bmpHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); + for (int i = 0; i < bmpHeight; i++) + PInvokeHelper.Copy(Buffer, i * rec.pitch, locked.Scan0, i * locked.Stride, rec.width); + bmp.UnlockBits(locked); + + return bmp; + }*/ + + default: + throw new InvalidOperationException("System.Drawing.Bitmap does not support this pixel mode."); + } + } +#endif + + #region IDisposable + + /// + /// Disposes an instance of the class. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!disposed) + { + disposed = true; + + if (user) + { + FT.FT_Bitmap_Done(library.Reference, reference); + Marshal.FreeHGlobal(reference); + } + + reference = IntPtr.Zero; + library = null; + } + } + + #endregion + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/FTList.cs b/SharpFont/Source/SharpFontShared/FTList.cs new file mode 100644 index 000000000..d0597664f --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FTList.cs @@ -0,0 +1,195 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// An iterator function which is called during a list parse by . + /// + /// The current iteration list node. + /// + /// A typeless pointer passed to . Can be used to point to the iteration's state. + /// + /// Error code. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate Error ListIterator(NativeReference node, IntPtr user); + + /// + /// An iterator function which is called during a list finalization by + /// to destroy all elements in a given list. + /// + /// The current system object. + /// The current object to destroy. + /// + /// A typeless pointer passed to . It can be used to point to the iteration's state. + /// + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void ListDestructor(NativeReference memory, IntPtr data, IntPtr user); + + /// + /// A structure used to hold a simple doubly-linked list. These are used in many parts of FreeType. + /// + public sealed class FTList + { + #region Fields + + private IntPtr reference; + private ListRec rec; + + #endregion + + #region Constructors + + internal FTList(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the head (first element) of doubly-linked list. + /// + public ListNode Head + { + get + { + return new ListNode(rec.head); + } + } + + /// + /// Gets the tail (last element) of doubly-linked list. + /// + public ListNode Tail + { + get + { + return new ListNode(rec.tail); + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + + #region Methods + + /// + /// Find the list node for a given listed object. + /// + /// The address of the listed object. + /// List node. NULL if it wasn't found. + public ListNode Find(IntPtr data) + { + return new ListNode(FT.FT_List_Find(Reference, data)); + } + + /// + /// Append an element to the end of a list. + /// + /// The node to append. + public void Add(ListNode node) + { + FT.FT_List_Add(Reference, node.Reference); + } + + /// + /// Insert an element at the head of a list. + /// + /// The node to insert. + public void Insert(ListNode node) + { + FT.FT_List_Insert(Reference, node.Reference); + } + + /// + /// Remove a node from a list. This function doesn't check whether the node is in the list! + /// + /// The node to remove. + public void Remove(ListNode node) + { + FT.FT_List_Remove(Reference, node.Reference); + } + + /// + /// Move a node to the head/top of a list. Used to maintain LRU lists. + /// + /// The node to move. + public void Up(ListNode node) + { + FT.FT_List_Up(Reference, node.Reference); + } + + /// + /// Parse a list and calls a given iterator function on each element. Note that parsing is stopped as soon as + /// one of the iterator calls returns a non-zero value. + /// + /// An iterator function, called on each node of the list. + /// A user-supplied field which is passed as the second argument to the iterator. + public void Iterate(ListIterator iterator, IntPtr user) + { + Error err = FT.FT_List_Iterate(Reference, iterator, user); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Destroy all elements in the list as well as the list itself. + /// + /// + /// This function expects that all nodes added by or have been + /// dynamically allocated. + /// + /// A list destructor that will be applied to each element of the list. + /// The current memory object which handles deallocation. + /// A user-supplied field which is passed as the last argument to the destructor. + public void Finalize(ListDestructor destroy, Memory memory, IntPtr user) + { + FT.FT_List_Finalize(Reference, destroy, memory.Reference, user); + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/FTMatrix.cs b/SharpFont/Source/SharpFontShared/FTMatrix.cs new file mode 100644 index 000000000..f724f95c6 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FTMatrix.cs @@ -0,0 +1,250 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A simple structure used to store a 2x2 matrix. Coefficients are in 16.16 fixed float format. The computation + /// performed is: + /// + /// x' = x*xx + y*xy + /// y' = x*yx + y*yy + /// + /// + [StructLayout(LayoutKind.Sequential)] + public struct FTMatrix : IEquatable + { + #region Fields + + private IntPtr xx, xy; + private IntPtr yx, yy; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// Matrix coefficient XX. + /// Matrix coefficient XY. + /// Matrix coefficient YX. + /// Matrix coefficient YY. + public FTMatrix(int xx, int xy, int yx, int yy) + : this() + { + this.xx = (IntPtr)xx; + this.xy = (IntPtr)xy; + this.yx = (IntPtr)yx; + this.yy = (IntPtr)yy; + } + + /// + /// Initializes a new instance of the struct. + /// + /// Matrix coefficients XX, XY. + /// Matrix coefficients YX, YY. + public FTMatrix(FTVector row0, FTVector row1) + : this(row0.X.Value, row0.Y.Value, row1.X.Value, row1.Y.Value) + { + } + + #endregion + + #region Properties + + /// + /// Gets or sets the matrix coefficient. + /// + public Fixed16Dot16 XX + { + get + { + return Fixed16Dot16.FromRawValue((int)xx); + } + + set + { + xx = (IntPtr)value.Value; + } + } + + /// + /// Gets or sets the matrix coefficient. + /// + public Fixed16Dot16 XY + { + get + { + return Fixed16Dot16.FromRawValue((int)xy); + } + + set + { + xy = (IntPtr)value.Value; + } + } + + /// + /// Gets or sets the matrix coefficient. + /// + public Fixed16Dot16 YX + { + get + { + return Fixed16Dot16.FromRawValue((int)yx); + } + + set + { + yx = (IntPtr)value.Value; + } + } + + /// + /// Gets or sets the matrix coefficient. + /// + public Fixed16Dot16 YY + { + get + { + return Fixed16Dot16.FromRawValue((int)yy); + } + + set + { + yy = (IntPtr)value.Value; + } + } + + #endregion + + #region Operators + + /// + /// Compares two instances of for equality. + /// + /// A . + /// Another . + /// A value indicating equality. + public static bool operator ==(FTMatrix left, FTMatrix right) + { + return left.Equals(right); + } + + /// + /// Compares two instances of for inequality. + /// + /// A . + /// Another . + /// A value indicating inequality. + public static bool operator !=(FTMatrix left, FTMatrix right) + { + return !left.Equals(right); + } + + #endregion + + #region Methods + + /// + /// Perform the matrix operation ‘b = a*b’. + /// + /// + /// The result is undefined if either ‘a’ or ‘b’ is zero. + /// + /// A pointer to matrix ‘a’. + /// A pointer to matrix ‘b’. + public static void Multiply(FTMatrix a, FTMatrix b) + { + FT.FT_Matrix_Multiply(ref a, ref b); + } + + /// + /// Perform the matrix operation ‘b = a*b’. + /// + /// + /// The result is undefined if either ‘a’ or ‘b’ is zero. + /// + /// A pointer to matrix ‘b’. + public void Multiply(FTMatrix b) + { + FT.FT_Matrix_Multiply(ref this, ref b); + } + + /// + /// Invert a 2x2 matrix. Return an error if it can't be inverted. + /// + public void Invert() + { + Error err = FT.FT_Matrix_Invert(ref this); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Compares this instance of to another for equality. + /// + /// A . + /// A value indicating equality. + public bool Equals(FTMatrix other) + { + return + xx == other.xx && + xy == other.xy && + yx == other.yx && + yy == other.yy; + } + + /// + /// Compares this instance of to an object for equality. + /// + /// An object. + /// A value indicating equality. + public override bool Equals(object obj) + { + if (obj is FTMatrix) + return this.Equals((FTMatrix)obj); + else + return false; + } + + /// + /// Gets a unique hash code for this instance. + /// + /// A hash code. + public override int GetHashCode() + { + return xx.GetHashCode() ^ xy.GetHashCode() ^ yx.GetHashCode() ^ yy.GetHashCode(); + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/FTSize.cs b/SharpFont/Source/SharpFontShared/FTSize.cs new file mode 100644 index 000000000..ce07d745d --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FTSize.cs @@ -0,0 +1,269 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015-2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// FreeType root size class structure. A size object models a face object at a given size. + /// + public sealed class FTSize : IDisposable + { + #region Fields + + private bool userAlloc; + private bool disposed; + private bool duplicate; + + private IntPtr reference; + private SizeRec rec; + + private Face parentFace; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The parent face. + public FTSize(Face parent) + { + IntPtr reference; + Error err = FT.FT_New_Size(parent.Reference, out reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + Reference = reference; + userAlloc = true; + } + + internal FTSize(IntPtr reference, bool userAlloc, Face parentFace) + { + Reference = reference; + + this.userAlloc = userAlloc; + + if (parentFace != null) + { + this.parentFace = parentFace; + parentFace.AddChildSize(this); + } + else + { + duplicate = true; + } + } + + /// + /// Finalizes an instance of the FTSize class. + /// + ~FTSize() + { + Dispose(false); + } + + #endregion + + #region Events + + /// + /// Occurs when the size is disposed. + /// + public event EventHandler Disposed; + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the object has been disposed. + /// + public bool IsDisposed + { + get + { + return disposed; + } + } + + /// + /// Gets a handle to the parent face object. + /// + public Face Face + { + get + { + if (disposed) + throw new ObjectDisposedException("Face", "Cannot access a disposed object."); + + return parentFace; + } + } + + /// + /// Gets or sets a typeless pointer, which is unused by the FreeType library or any of its drivers. It can be used by + /// client applications to link their own data to each size object. + /// + [Obsolete("Use the Tag property and Disposed event instead.")] + public Generic Generic + { + get + { + if (disposed) + throw new ObjectDisposedException("Generic", "Cannot access a disposed object."); + + return new Generic(rec.generic); + } + + set + { + if (disposed) + throw new ObjectDisposedException("Generic", "Cannot access a disposed object."); + + value.WriteToUnmanagedMemory(PInvokeHelper.AbsoluteOffsetOf(Reference, "generic")); + Reference = reference; //update rec. + } + } + + /// + /// Gets metrics for this size object. This field is read-only. + /// + public SizeMetrics Metrics + { + get + { + if (disposed) + throw new ObjectDisposedException("Metrics", "Cannot access a disposed object."); + + return new SizeMetrics(rec.metrics); + } + } + + /// + /// Gets or sets an object used to identify this instance of . This object will not be + /// modified or accessed internally. + /// + /// + /// This is a replacement for FT_Generic in FreeType. If you are retrieving the same object multiple times + /// from functions, this object will not appear in new copies. + /// + public object Tag { get; set; } + + internal IntPtr Reference + { + get + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + return reference; + } + + set + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + reference = value; + this.rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + + #region Public Methods + + /// + /// Even though it is possible to create several size objects for a given face (see + /// for details), functions like or + /// only use the one which has been activated last to determine the + /// ‘current character pixel size’. + /// + /// This function can be used to ‘activate’ a previously created size object. + /// + /// + /// If ‘face’ is the size's parent face object, this function changes the value of ‘face->size’ to the input + /// size handle. + /// + public void Activate() + { + if (disposed) + throw new ObjectDisposedException("Activate", "Cannot access a disposed object."); + + Error err = FT.FT_Activate_Size(Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Diposes the FTSize. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + #region Private Methods + + private void Dispose(bool disposing) + { + if (!disposed) + { + disposed = true; + + //only dispose the user allocated sizes that are not duplicates. + if (userAlloc && !duplicate) + { + FT.FT_Done_Size(reference); + } + + // removes itself from the parent Face, with a check to prevent this from happening when Face is + // being disposed (Face disposes all it's children with a foreach loop, this causes an + // InvalidOperationException for modifying a collection during enumeration) + if (parentFace != null && !parentFace.IsDisposed) + parentFace.RemoveChildSize(this); + + reference = IntPtr.Zero; + rec = new SizeRec(); + + EventHandler handler = Disposed; + if (handler != null) + handler(this, EventArgs.Empty); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/FTStream.cs b/SharpFont/Source/SharpFontShared/FTStream.cs new file mode 100644 index 000000000..927c6e072 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FTStream.cs @@ -0,0 +1,315 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A function used to seek and read data from a given input stream. + /// + /// + /// This function might be called to perform a seek or skip operation with a ‘count’ of 0. A non-zero return value + /// then indicates an error. + /// + /// A handle to the source stream. + /// The offset of read in stream (always from start). + /// The address of the read buffer. + /// The number of bytes to read from the stream. + /// The number of bytes effectively read by the stream. + [CLSCompliant(false)] + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate uint StreamIOFunc(NativeReference stream, uint offset, IntPtr buffer, uint count); + + /// + /// A function used to close a given input stream. + /// + /// A handle to the target stream. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void StreamCloseFunc(NativeReference stream); + + /// + /// A handle to an input stream. + /// + public sealed class FTStream : NativeObject + { + #region Fields + + private StreamRec rec; + + #endregion + + #region Constructors + + internal FTStream(IntPtr reference): base(reference) + { + } + + #endregion + + #region Properties + + /// + /// Gets base. For memory-based streams, this is the address of the first stream byte in memory. This field + /// should always be set to NULL for disk-based streams. + /// + public IntPtr Base + { + get + { + return rec.@base; + } + } + + /// + /// Gets the stream size in bytes. + /// + [CLSCompliant(false)] + public uint Size + { + get + { + return (uint)rec.size; + } + } + + /// + /// Gets the current position within the stream. + /// + [CLSCompliant(false)] + public uint Position + { + get + { + return (uint)rec.pos; + } + } + + /// + /// Gets the descriptor. This field is a union that can hold an integer or a pointer. It is used by stream + /// implementations to store file descriptors or ‘FILE*’ pointers. + /// + public StreamDesc Descriptor + { + get + { + return new StreamDesc(PInvokeHelper.AbsoluteOffsetOf(Reference, "descriptor")); + } + } + + /// + /// Gets the path name. This field is completely ignored by FreeType. However, it is often useful during + /// debugging to use it to store the stream's filename (where available). + /// + public StreamDesc PathName + { + get + { + return new StreamDesc(PInvokeHelper.AbsoluteOffsetOf(Reference, "pathname")); + } + } + + /// + /// Gets the stream's input function. + /// + [CLSCompliant(false)] + public StreamIOFunc Read + { + get + { + return rec.read; + } + } + + /// + /// Gets the stream's close function. + /// + public StreamCloseFunc Close + { + get + { + return rec.close; + } + } + + /// + /// Gets the memory manager to use to preload frames. This is set internally by FreeType and shouldn't be + /// touched by stream implementations. + /// + public Memory Memory + { + get + { + return new Memory(PInvokeHelper.AbsoluteOffsetOf(Reference, "memory")); + } + } + + /// + /// Gets the cursor. This field is set and used internally by FreeType when parsing frames. + /// + public IntPtr Cursor + { + get + { + return rec.cursor; + } + } + + /// + /// Gets the limit. This field is set and used internally by FreeType when parsing frames. + /// + public IntPtr Limit + { + get + { + return rec.limit; + } + } + + internal override IntPtr Reference + { + get + { + return base.Reference; + } + + set + { + base.Reference = value; + rec = PInvokeHelper.PtrToStructure(value); + } + } + + #endregion + + #region Methods + + #region GZIP Streams + + /// + /// Open a new stream to parse gzip-compressed font files. This is mainly used to support the compressed + /// ‘*.pcf.gz’ fonts that come with XFree86. + /// + /// + /// The source stream must be opened before calling this function. + /// + /// Calling the internal function ‘FT_Stream_Close’ on the new stream will not call ‘FT_Stream_Close’ on the + /// source stream. None of the stream objects will be released to the heap. + /// + /// The stream implementation is very basic and resets the decompression process each time seeking backwards is + /// needed within the stream. + /// + /// In certain builds of the library, gzip compression recognition is automatically handled when calling + /// or . This means that if no font driver is + /// capable of handling the raw compressed file, the library will try to open a gzipped stream from it and + /// re-open the face with it. + /// + /// This function may return if your build of FreeType was not + /// compiled with zlib support. + /// + /// The source stream. + public void OpenGzip(FTStream source) + { + Error err = FT.FT_Stream_OpenGzip(Reference, source.Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + #endregion + + #region LZW Streams + + /// + /// Open a new stream to parse LZW-compressed font files. This is mainly used to support the compressed + /// ‘*.pcf.Z’ fonts that come with XFree86. + /// + /// + /// The source stream must be opened before calling this function. + /// + /// Calling the internal function ‘FT_Stream_Close’ on the new stream will not call ‘FT_Stream_Close’ on the + /// source stream. None of the stream objects will be released to the heap. + /// + /// The stream implementation is very basic and resets the decompression process each time seeking backwards is + /// needed within the stream. + /// + /// In certain builds of the library, LZW compression recognition is automatically handled when calling + /// or . This means that if no font driver is + /// capable of handling the raw compressed file, the library will try to open a LZW stream from it and re-open + /// the face with it. + /// + /// This function may return if your build of FreeType was not + /// compiled with LZW support. + /// + /// The source stream. + public void OpenLzw(FTStream source) + { + Error err = FT.FT_Stream_OpenLZW(Reference, source.Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + #endregion + + #region BZIP2 Streams + + /// + /// Open a new stream to parse bzip2-compressed font files. This is mainly used to support the compressed + /// ‘*.pcf.bz2’ fonts that come with XFree86. + /// + /// + /// The source stream must be opened before calling this function. + /// + /// Calling the internal function ‘FT_Stream_Close’ on the new stream will not call ‘FT_Stream_Close’ on the + /// source stream. None of the stream objects will be released to the heap. + /// + /// The stream implementation is very basic and resets the decompression process each time seeking backwards is + /// needed within the stream. + /// + /// In certain builds of the library, bzip2 compression recognition is automatically handled when calling + /// or . This means that if no font driver is + /// capable of handling the raw compressed file, the library will try to open a bzip2 stream from it and + /// re-open the face with it. + /// + /// This function may return if your build of FreeType was not + /// compiled with bzip2 support. + /// + /// The source stream. + public void StreamOpenBzip2(FTStream source) + { + Error err = FT.FT_Stream_OpenBzip2(Reference, source.Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + #endregion + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/FTUnitVector.cs b/SharpFont/Source/SharpFontShared/FTUnitVector.cs new file mode 100644 index 000000000..88a0c78fc --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FTUnitVector.cs @@ -0,0 +1,46 @@ +#region MIT License +/*Copyright (c) 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont +{ + /// + /// A simple structure used to store a 2D vector unit vector. Uses types. + /// + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct FTUnitVector + { + /// + /// Horizontal coordinate. + /// + public Fixed2Dot14 X; + + /// + /// Vertical coordinate. + /// + public Fixed2Dot14 Y; + } +} diff --git a/SharpFont/Source/SharpFontShared/FTVector.cs b/SharpFont/Source/SharpFontShared/FTVector.cs new file mode 100644 index 000000000..543fff43d --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FTVector.cs @@ -0,0 +1,240 @@ +#region MIT License +/*Copyright (c) 2012-2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A simple structure used to store a 2D vector. + /// + [StructLayout(LayoutKind.Sequential)] + public struct FTVector : IEquatable + { + #region Fields + + private IntPtr x; + private IntPtr y; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal coordinate. + /// The vertical coordinate. + public FTVector(Fixed16Dot16 x, Fixed16Dot16 y) + : this() + { + this.x = (IntPtr)x.Value; + this.y = (IntPtr)y.Value; + } + + internal FTVector(IntPtr reference) + : this() + { + this.x = Marshal.ReadIntPtr(reference); + this.y = Marshal.ReadIntPtr(reference, IntPtr.Size); + } + + #endregion + + #region Properties + + /// + /// Gets or sets the horizontal coordinate. + /// + public Fixed16Dot16 X + { + get + { + return Fixed16Dot16.FromRawValue((int)x); + } + + set + { + x = (IntPtr)value.Value; + } + } + + /// + /// Gets or sets the vertical coordinate. + /// + public Fixed16Dot16 Y + { + get + { + return Fixed16Dot16.FromRawValue((int)y); + } + + set + { + y = (IntPtr)value.Value; + } + } + + #endregion + + #region Operators + + /// + /// Compares two instances of for equality. + /// + /// A . + /// Another . + /// A value indicating equality. + public static bool operator ==(FTVector left, FTVector right) + { + return left.Equals(right); + } + + /// + /// Compares two instances of for inequality. + /// + /// A . + /// Another . + /// A value indicating inequality. + public static bool operator !=(FTVector left, FTVector right) + { + return !left.Equals(right); + } + + #endregion + + #region Methods + + /// + /// Return the unit vector corresponding to a given angle. After the call, the value of ‘vec.x’ will be + /// ‘sin(angle)’, and the value of ‘vec.y’ will be ‘cos(angle)’. + /// + /// This function is useful to retrieve both the sinus and cosinus of a given angle quickly. + /// + /// The address of angle. + /// The address of target vector. + public static FTVector Unit(Fixed16Dot16 angle) + { + FTVector vec; + FT.FT_Vector_Unit(out vec, (IntPtr)angle.Value); + + return vec; + } + + /// + /// Compute vector coordinates from a length and angle. + /// + /// The vector length. + /// The vector angle. + /// The address of source vector. + public static FTVector FromPolar(Fixed16Dot16 length, Fixed16Dot16 angle) + { + FTVector vec; + FT.FT_Vector_From_Polar(out vec, (IntPtr)length.Value, (IntPtr)angle.Value); + + return vec; + } + + /// + /// Transform a single vector through a 2x2 matrix. + /// + /// + /// The result is undefined if either ‘vector’ or ‘matrix’ is invalid. + /// + /// A pointer to the source 2x2 matrix. + public void Transform(FTMatrix matrix) + { + FT.FT_Vector_Transform(ref this, ref matrix); + } + + /// + /// Rotate a vector by a given angle. + /// + /// The address of angle. + public void Rotate(Fixed16Dot16 angle) + { + FT.FT_Vector_Rotate(ref this, (IntPtr)angle.Value); + } + + /// + /// Return the length of a given vector. + /// + /// The vector length, expressed in the same units that the original vector coordinates. + public Fixed16Dot16 Length() + { + return Fixed16Dot16.FromRawValue((int)FT.FT_Vector_Length(ref this)); + } + + /// + /// Compute both the length and angle of a given vector. + /// + /// The vector length. + /// The vector angle. + public void Polarize(out Fixed16Dot16 length, out Fixed16Dot16 angle) + { + IntPtr tmpLength, tmpAngle; + FT.FT_Vector_Polarize(ref this, out tmpLength, out tmpAngle); + + length = Fixed16Dot16.FromRawValue((int)tmpLength); + angle = Fixed16Dot16.FromRawValue((int)tmpAngle); + } + + /// + /// Compares this instance of to another for equality. + /// + /// A . + /// A value indicating equality. + public bool Equals(FTVector other) + { + return x == other.x && y == other.y; + } + + /// + /// Compares this instance of to an object for equality. + /// + /// An object. + /// A value indicating equality. + public override bool Equals(object obj) + { + if (obj is FTVector) + return this.Equals((FTVector)obj); + else + return false; + } + + /// + /// Gets a unique hash code for this instance. + /// + /// A hash code. + public override int GetHashCode() + { + return x.GetHashCode() ^ y.GetHashCode(); + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/FTVector26Dot6.cs b/SharpFont/Source/SharpFontShared/FTVector26Dot6.cs new file mode 100644 index 000000000..cf89ac38e --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FTVector26Dot6.cs @@ -0,0 +1,164 @@ +#region MIT License +/*Copyright (c) 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont +{ + /// + /// A simple structure used to store a 2D vector. + /// + [StructLayout(LayoutKind.Sequential)] + public struct FTVector26Dot6 : IEquatable + { + #region Fields + + private IntPtr x; + private IntPtr y; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal coordinate. + /// The vertical coordinate. + public FTVector26Dot6(Fixed26Dot6 x, Fixed26Dot6 y) + : this() + { + this.x = (IntPtr)x.Value; + this.y = (IntPtr)y.Value; + } + + internal FTVector26Dot6(IntPtr reference) + : this() + { + this.x = Marshal.ReadIntPtr(reference); + this.y = Marshal.ReadIntPtr(reference, IntPtr.Size); + } + + #endregion + + #region Properties + + /// + /// Gets or sets the horizontal coordinate. + /// + public Fixed26Dot6 X + { + get + { + return Fixed26Dot6.FromRawValue((int)x); + } + + set + { + x = (IntPtr)value.Value; + } + } + + /// + /// Gets or sets the vertical coordinate. + /// + public Fixed26Dot6 Y + { + get + { + return Fixed26Dot6.FromRawValue((int)y); + } + + set + { + y = (IntPtr)value.Value; + } + } + + #endregion + + #region Operators + + /// + /// Compares two instances of for equality. + /// + /// A . + /// Another . + /// A value indicating equality. + public static bool operator ==(FTVector26Dot6 left, FTVector26Dot6 right) + { + return left.Equals(right); + } + + /// + /// Compares two instances of for inequality. + /// + /// A . + /// Another . + /// A value indicating inequality. + public static bool operator !=(FTVector26Dot6 left, FTVector26Dot6 right) + { + return !left.Equals(right); + } + + #endregion + + #region Methods + + /// + /// Compares this instance of to another for equality. + /// + /// A . + /// A value indicating equality. + public bool Equals(FTVector26Dot6 other) + { + return x == other.x && y == other.y; + } + + /// + /// Compares this instance of to an object for equality. + /// + /// An object. + /// A value indicating equality. + public override bool Equals(object obj) + { + if (obj is FTVector26Dot6) + return this.Equals((FTVector26Dot6)obj); + else + return false; + } + + /// + /// Gets a unique hash code for this instance. + /// + /// A hash code. + public override int GetHashCode() + { + return x.GetHashCode() ^ y.GetHashCode(); + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Face.cs b/SharpFont/Source/SharpFontShared/Face.cs new file mode 100644 index 000000000..fea801bdf --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Face.cs @@ -0,0 +1,2412 @@ +#region MIT License +/*Copyright (c) 2012-2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +using SharpFont.Bdf; +using SharpFont.Internal; +using SharpFont.MultipleMasters; +using SharpFont.PostScript; +using SharpFont.TrueType; + +namespace SharpFont +{ + /// + /// FreeType root face class structure. A face object models a typeface in a font file. + /// + /// + /// Fields may be changed after a call to or . + /// + public sealed class Face : NativeObject, IDisposable + { + #region Fields + + private FaceRec rec; + + private bool disposed; + + private GCHandle memoryFaceHandle; + + private Library parentLibrary; + private List childSizes; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class with a default faceIndex of 0. + /// + /// The parent library. + /// The path of the font file. + public Face(Library library, string path) + : this(library, path, 0) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The parent library. + /// The path of the font file. + /// The index of the face to take from the file. + public Face(Library library, string path, int faceIndex) + : this(library) + { + IntPtr reference; + Error err = FT.FT_New_Face(library.Reference, path, faceIndex, out reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + Reference = reference; + } + + //TODO make an overload with a FileStream instead of a byte[] + + /// + /// Initializes a new instance of the class from a file that's already loaded into memory. + /// + /// The parent library. + /// The loaded file. + /// The index of the face to take from the file. + public Face(Library library, byte[] file, int faceIndex) + : this(library) + { + IntPtr reference; + memoryFaceHandle = GCHandle.Alloc(file, GCHandleType.Pinned); + Error err = FT.FT_New_Memory_Face(library.Reference, memoryFaceHandle.AddrOfPinnedObject(), file.Length, faceIndex, out reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + Reference = reference; + } + + /// + /// Initializes a new instance of the class from a file that's already loaded into memory. + /// + /// The parent library. + /// A pointer to a buffer of a loaded file. Must not be freed before . + /// The length of bufferPtr. + /// The index of the face to take from the file. + public Face(Library library, IntPtr bufferPtr, int length, int faceIndex) + : this(library) + { + IntPtr reference; + Error err = FT.FT_New_Memory_Face(library.Reference, bufferPtr, length, faceIndex, out reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + Reference = reference; + } + + /// + /// Initializes a new instance of the class. + /// + /// A pointer to the unmanaged memory containing the Face. + /// The parent . + internal Face(IntPtr reference, Library parent) + : this(parent) + { + Reference = reference; + } + + private Face(Library parent): base(IntPtr.Zero) + { + childSizes = new List(); + + if (parent != null) + { + parentLibrary = parent; + parentLibrary.AddChildFace(this); + } + else + { + //if there's no parent, this is a marshalled duplicate. + FT.FT_Reference_Face(Reference); + } + } + + /// + /// Finalizes an instance of the class. + /// + ~Face() + { + Dispose(false); + } + + #endregion + + #region Events + + /// + /// Occurs when the face is disposed. + /// + public event EventHandler Disposed; + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the object has been disposed. + /// + public bool IsDisposed + { + get + { + return disposed; + } + } + + /// + /// Gets the number of faces in the font file. Some font formats can have multiple faces in a font file. + /// + public int FaceCount + { + get + { + if (disposed) + throw new ObjectDisposedException("FaceCount", "Cannot access a disposed object."); + + return (int)rec.num_faces; + } + } + + /// + /// Gets the index of the face in the font file. It is set to 0 if there is only one face in the font file. + /// + public int FaceIndex + { + get + { + if (disposed) + throw new ObjectDisposedException("FaceIndex", "Cannot access a disposed object."); + + return (int)rec.face_index; + } + } + + /// + /// Gets a set of bit flags that give important information about the face. + /// + /// + public FaceFlags FaceFlags + { + get + { + if (disposed) + throw new ObjectDisposedException("FaceFlags", "Cannot access a disposed object."); + + return (FaceFlags)rec.face_flags; + } + } + + /// + /// Gets a set of bit flags indicating the style of the face. + /// + /// + public StyleFlags StyleFlags + { + get + { + if (disposed) + throw new ObjectDisposedException("StyleFlags", "Cannot access a disposed object."); + + return (StyleFlags)rec.style_flags; + } + } + + /// + /// Gets the number of glyphs in the face. If the face is scalable and has sbits (see ‘num_fixed_sizes’), it is + /// set to the number of outline glyphs. + /// + /// For CID-keyed fonts, this value gives the highest CID used in the font. + /// + public int GlyphCount + { + get + { + if (disposed) + throw new ObjectDisposedException("GlyphCount", "Cannot access a disposed object."); + + return (int)rec.num_glyphs; + } + } + + /// + /// Gets the face's family name. This is an ASCII string, usually in English, which describes the typeface's + /// family (like ‘Times New Roman’, ‘Bodoni’, ‘Garamond’, etc). This is a least common denominator used to list + /// fonts. Some formats (TrueType & OpenType) provide localized and Unicode versions of this string. + /// Applications should use the format specific interface to access them. Can be NULL (e.g., in fonts embedded + /// in a PDF file). + /// + public string FamilyName + { + get + { + if (disposed) + throw new ObjectDisposedException("FamilyName", "Cannot access a disposed object."); + + return Marshal.PtrToStringAnsi(rec.family_name); + } + } + + /// + /// Gets the face's style name. This is an ASCII string, usually in English, which describes the typeface's + /// style (like ‘Italic’, ‘Bold’, ‘Condensed’, etc). Not all font formats provide a style name, so this field + /// is optional, and can be set to NULL. As for ‘family_name’, some formats provide localized and Unicode + /// versions of this string. Applications should use the format specific interface to access them. + /// + public string StyleName + { + get + { + if (disposed) + throw new ObjectDisposedException("StyleName", "Cannot access a disposed object."); + + return Marshal.PtrToStringAnsi(rec.style_name); + } + } + + /// + /// Gets the number of bitmap strikes in the face. Even if the face is scalable, there might still be bitmap + /// strikes, which are called ‘sbits’ in that case. + /// + public int FixedSizesCount + { + get + { + if (disposed) + throw new ObjectDisposedException("FixedSizesCount", "Cannot access a disposed object."); + + return rec.num_fixed_sizes; + } + } + + /// + /// Gets an array of FT_Bitmap_Size for all bitmap strikes in the face. It is set to NULL if there is no bitmap + /// strike. + /// + public BitmapSize[] AvailableSizes + { + get + { + if (disposed) + throw new ObjectDisposedException("AvailableSizes", "Cannot access a disposed object."); + + int count = FixedSizesCount; + + if (count == 0) + return null; + + BitmapSize[] sizes = new BitmapSize[count]; + IntPtr array = rec.available_sizes; + + for (int i = 0; i < count; i++) + { + sizes[i] = new BitmapSize(new IntPtr(array.ToInt64() + IntPtr.Size * i)); + } + + return sizes; + } + } + + /// + /// Gets the number of charmaps in the face. + /// + public int CharmapsCount + { + get + { + if (disposed) + throw new ObjectDisposedException("CharmapsCount", "Cannot access a disposed object."); + + return rec.num_charmaps; + } + } + + /// + /// Gets an array of the charmaps of the face. + /// + public CharMap[] CharMaps + { + get + { + if (disposed) + throw new ObjectDisposedException("CharMaps", "Cannot access a disposed object."); + + int count = CharmapsCount; + + if (count == 0) + return null; + + CharMap[] charmaps = new CharMap[count]; + + unsafe + { + IntPtr* array = (IntPtr*)rec.charmaps; + + for (int i = 0; i < count; i++) + { + charmaps[i] = new CharMap(*array, this); + array++; + } + } + + return charmaps; + } + } + + /// + /// Gets or sets a field reserved for client uses. + /// + /// + [Obsolete("Use the Tag property and Disposed event.")] + public Generic Generic + { + get + { + if (disposed) + throw new ObjectDisposedException("Generic", "Cannot access a disposed object."); + + return new Generic(rec.generic); + } + + set + { + if (disposed) + throw new ObjectDisposedException("Generic", "Cannot access a disposed object."); + + IntPtr reference = Reference; + value.WriteToUnmanagedMemory(PInvokeHelper.AbsoluteOffsetOf(reference, "generic")); + Reference = reference; + } + } + + /// + /// Gets the font bounding box. Coordinates are expressed in font units (see ‘units_per_EM’). The box is large + /// enough to contain any glyph from the font. Thus, ‘bbox.yMax’ can be seen as the ‘maximal ascender’, and + /// ‘bbox.yMin’ as the ‘minimal descender’. Only relevant for scalable formats. + /// + /// Note that the bounding box might be off by (at least) one pixel for hinted fonts. See FT_Size_Metrics for + /// further discussion. + /// + public BBox BBox + { + get + { + if (disposed) + throw new ObjectDisposedException("BBox", "Cannot access a disposed object."); + + return rec.bbox; + } + } + + /// + /// Gets the number of font units per EM square for this face. This is typically 2048 for TrueType fonts, and + /// 1000 for Type 1 fonts. Only relevant for scalable formats. + /// + [CLSCompliant(false)] + public ushort UnitsPerEM + { + get + { + if (disposed) + throw new ObjectDisposedException("UnitsPerEM", "Cannot access a disposed object."); + + return rec.units_per_EM; + } + } + + /// + /// Gets the typographic ascender of the face, expressed in font units. For font formats not having this + /// information, it is set to ‘bbox.yMax’. Only relevant for scalable formats. + /// + public short Ascender + { + get + { + if (disposed) + throw new ObjectDisposedException("Ascender", "Cannot access a disposed object."); + + return rec.ascender; + } + } + + /// + /// Gets the typographic descender of the face, expressed in font units. For font formats not having this + /// information, it is set to ‘bbox.yMin’.Note that this field is usually negative. Only relevant for scalable + /// formats. + /// + public short Descender + { + get + { + if (disposed) + throw new ObjectDisposedException("Descender", "Cannot access a disposed object."); + + return rec.descender; + } + } + + /// + /// Gets the height is the vertical distance between two consecutive baselines, expressed in font units. It is + /// always positive. Only relevant for scalable formats. + /// + public short Height + { + get + { + if (disposed) + throw new ObjectDisposedException("Height", "Cannot access a disposed object."); + + return rec.height; + } + } + + /// + /// Gets the maximal advance width, in font units, for all glyphs in this face. This can be used to make word + /// wrapping computations faster. Only relevant for scalable formats. + /// + public short MaxAdvanceWidth + { + get + { + if (disposed) + throw new ObjectDisposedException("MaxAdvanceWidth", "Cannot access a disposed object."); + + return rec.max_advance_width; + } + } + + /// + /// Gets the maximal advance height, in font units, for all glyphs in this face. This is only relevant for + /// vertical layouts, and is set to ‘height’ for fonts that do not provide vertical metrics. Only relevant for + /// scalable formats. + /// + public short MaxAdvanceHeight + { + get + { + if (disposed) + throw new ObjectDisposedException("MaxAdvanceHeight", "Cannot access a disposed object."); + + return rec.max_advance_height; + } + } + + /// + /// Gets the position, in font units, of the underline line for this face. It is the center of the underlining + /// stem. Only relevant for scalable formats. + /// + public short UnderlinePosition + { + get + { + if (disposed) + throw new ObjectDisposedException("UnderlinePosition", "Cannot access a disposed object."); + + return rec.underline_position; + } + } + + /// + /// Gets the thickness, in font units, of the underline for this face. Only relevant for scalable formats. + /// + public short UnderlineThickness + { + get + { + if (disposed) + throw new ObjectDisposedException("UnderlineThickness", "Cannot access a disposed object."); + + return rec.underline_thickness; + } + } + + /// + /// Gets the face's associated glyph slot(s). + /// + public GlyphSlot Glyph + { + get + { + if (disposed) + throw new ObjectDisposedException("Glyph", "Cannot access a disposed object."); + + return new GlyphSlot(rec.glyph, this, parentLibrary); + } + } + + /// + /// Gets the current active size for this face. + /// + public FTSize Size + { + get + { + if (disposed) + throw new ObjectDisposedException("Size", "Cannot access a disposed object."); + + return new FTSize(rec.size, false, this); + } + } + + /// + /// Gets the current active charmap for this face. + /// + public CharMap CharMap + { + get + { + if (disposed) + throw new ObjectDisposedException("CharMap", "Cannot access a disposed object."); + + if (rec.charmap == IntPtr.Zero) + return null; + + return new CharMap(rec.charmap, this); + } + } + + /// + /// Gets a value indicating whether a face object contains horizontal metrics (this is true for all font + /// formats though). + /// + public bool HasHoriziontal + { + get + { + return (FaceFlags & FaceFlags.Horizontal) == FaceFlags.Horizontal; + } + } + + /// + /// Gets a value indicating whether a face object contains vertical metrics. + /// + public bool HasVertical + { + get + { + return (FaceFlags & FaceFlags.Vertical) == FaceFlags.Vertical; + } + } + + /// + /// Gets a value indicating whether a face object contains kerning data that can be accessed with + /// . + /// + public bool HasKerning + { + get + { + return (FaceFlags & FaceFlags.Kerning) == FaceFlags.Kerning; + } + } + + /// + /// Gets a value indicating whether a face object contains a scalable font face (true for TrueType, Type 1, + /// Type 42, CID, OpenType/CFF, and PFR font formats. + /// + public bool IsScalable + { + get + { + return (FaceFlags & FaceFlags.Scalable) == FaceFlags.Scalable; + } + } + + /// + /// Gets a value indicating whether a face object contains a font whose format is based on the SFNT storage + /// scheme. This usually means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded bitmap fonts. + /// + /// If this macro is true, all functions defined in FT_SFNT_NAMES_H and FT_TRUETYPE_TABLES_H are available. + /// + public bool IsSfnt + { + get + { + return (FaceFlags & FaceFlags.Sfnt) == FaceFlags.Sfnt; + } + } + + /// + /// Gets a value indicating whether a face object contains a font face that contains fixed-width (or + /// ‘monospace’, ‘fixed-pitch’, etc.) glyphs. + /// + public bool IsFixedWidth + { + get + { + return (FaceFlags & FaceFlags.FixedWidth) == FaceFlags.FixedWidth; + } + } + + /// + /// Gets a value indicating whether a face object contains some embedded bitmaps. + /// + /// + public bool HasFixedSizes + { + get + { + return (FaceFlags & FaceFlags.FixedSizes) == FaceFlags.FixedSizes; + } + } + + /// + /// Gets a value indicating whether a face object contains some glyph names that can be accessed through + /// . + /// + public bool HasGlyphNames + { + get + { + return (FaceFlags & FaceFlags.GlyphNames) == FaceFlags.GlyphNames; + } + } + + /// + /// Gets a value indicating whether a face object contains some multiple masters. The functions provided by + /// FT_MULTIPLE_MASTERS_H are then available to choose the exact design you want. + /// + public bool HasMultipleMasters + { + get + { + return (FaceFlags & FaceFlags.MultipleMasters) == FaceFlags.MultipleMasters; + } + } + + /// + /// Gets a value indicating whether a face object contains a CID-keyed font. See the discussion of + /// FT_FACE_FLAG_CID_KEYED for more details. + /// + /// If this macro is true, all functions defined in FT_CID_H are available. + /// + public bool IsCidKeyed + { + get + { + return (FaceFlags & FaceFlags.CidKeyed) == FaceFlags.CidKeyed; + } + } + + /// + /// Gets a value indicating whether a face represents a ‘tricky’ font. See the discussion of + /// FT_FACE_FLAG_TRICKY for more details. + /// + public bool IsTricky + { + get + { + return (FaceFlags & FaceFlags.Tricky) == FaceFlags.Tricky; + } + } + + /// + /// Gets a value indicating whether the font has color glyph tables. + /// + public bool HasColor + { + get + { + return (FaceFlags & FaceFlags.Color) == FaceFlags.Color; + } + } + + /// + /// Gets or sets an object used to identify this instance of . This object will not be + /// modified or accessed internally. + /// + /// + /// This is a replacement for FT_Generic in FreeType. If you are retrieving the same object multiple times + /// from functions, this object will not appear in new copies. + /// + public object Tag { get; set; } + + internal override IntPtr Reference + { + get + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + return base.Reference; + } + + set + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + base.Reference = value; + rec = PInvokeHelper.PtrToStructure(value); + } + } + + #endregion + + #region Methods + + #region FreeType Version + + /// + /// Parse all bytecode instructions of a TrueType font file to check whether any of the patented opcodes are + /// used. This is only useful if you want to be able to use the unpatented hinter with fonts that do not use + /// these opcodes. + /// + /// Note that this function parses all glyph instructions in the font file, which may be slow. + /// + /// + /// Since May 2010, TrueType hinting is no longer patented. + /// + /// True if this is a TrueType font that uses one of the patented opcodes, false otherwise. + public bool CheckTrueTypePatents() + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + return FT.FT_Face_CheckTrueTypePatents(Reference); + } + + /// + /// Enable or disable the unpatented hinter for a given . Only enable it if you have + /// determined that the face doesn't use any patented opcodes. + /// + /// + /// Since May 2010, TrueType hinting is no longer patented. + /// + /// New boolean setting. + /// + /// The old setting value. This will always be false if this is not an SFNT font, or if the unpatented hinter + /// is not compiled in this instance of the library. + /// + /// + public bool SetUnpatentedHinting(bool value) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + return FT.FT_Face_SetUnpatentedHinting(Reference, value); + } + + #endregion + + #region Base Interface + + /// + /// This function calls to attach a file. + /// + /// The pathname. + public void AttachFile(string path) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + Error err = FT.FT_Attach_File(Reference, path); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// ‘Attach’ data to a face object. Normally, this is used to read additional information for the face object. + /// For example, you can attach an AFM file that comes with a Type 1 font to get the kerning values and other + /// metrics. + /// + /// + /// The meaning of the ‘attach’ (i.e., what really happens when the new file is read) is not fixed by FreeType + /// itself. It really depends on the font format (and thus the font driver). + /// + /// Client applications are expected to know what they are doing when invoking this function. Most drivers + /// simply do not implement file attachments. + /// + /// A pointer to which must be filled by the caller. + public void AttachStream(OpenArgs parameters) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + Error err = FT.FT_Attach_Stream(Reference, parameters.Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Select a bitmap strike. + /// + /// + /// The index of the bitmap strike in the field of + /// structure. + /// + public void SelectSize(int strikeIndex) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + Error err = FT.FT_Select_Size(Reference, strikeIndex); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Resize the scale of the active object in a face. + /// + /// A pointer to a . + public unsafe void RequestSize(SizeRequest request) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + Error err = FT.FT_Request_Size(Reference, (IntPtr)(&request)); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// This function calls to request the nominal size (in points). + /// + /// + /// If either the character width or height is zero, it is set equal to the other value. + /// + /// If either the horizontal or vertical resolution is zero, it is set equal to the other value. + /// + /// A character width or height smaller than 1pt is set to 1pt; if both resolution values are zero, they are + /// set to 72dpi. + /// + /// The nominal width, in 26.6 fractional points. + /// The nominal height, in 26.6 fractional points. + /// The horizontal resolution in dpi. + /// The vertical resolution in dpi. + [CLSCompliant(false)] + public void SetCharSize(Fixed26Dot6 width, Fixed26Dot6 height, uint horizontalResolution, uint verticalResolution) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + Error err = FT.FT_Set_Char_Size(Reference, (IntPtr)width.Value, (IntPtr)height.Value, horizontalResolution, verticalResolution); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// This function calls to request the nominal size (in pixels). + /// + /// The nominal width, in pixels. + /// The nominal height, in pixels + [CLSCompliant(false)] + public void SetPixelSizes(uint width, uint height) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + Error err = FT.FT_Set_Pixel_Sizes(Reference, width, height); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// A function used to load a single glyph into the glyph slot of a face object. + /// + /// + /// The loaded glyph may be transformed. See for the details. + /// + /// For subsetted CID-keyed fonts, is returned for invalid CID values (this + /// is, for CID values which don't have a corresponding glyph in the font). See the discussion of the + /// flag for more details. + /// + /// + /// The index of the glyph in the font file. For CID-keyed fonts (either in PS or in CFF format) this argument + /// specifies the CID value. + /// + /// + /// A flag indicating what to load for this glyph. The constants can be used to control + /// the glyph loading process (e.g., whether the outline should be scaled, whether to load bitmaps or not, + /// whether to hint the outline, etc). + /// + /// The target to OR with the flags. + [CLSCompliant(false)] + public void LoadGlyph(uint glyphIndex, LoadFlags flags, LoadTarget target) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + Error err = FT.FT_Load_Glyph(Reference, glyphIndex, (int)flags | (int)target); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// A function used to load a single glyph into the glyph slot of a face object, according to its character + /// code. + /// + /// + /// This function simply calls and + /// + /// + /// The glyph's character code, according to the current charmap used in the face. + /// + /// + /// A flag indicating what to load for this glyph. The constants can be used to control + /// the glyph loading process (e.g., whether the outline should be scaled, whether to load bitmaps or not, + /// whether to hint the outline, etc). + /// + /// The target to OR with the flags. + [CLSCompliant(false)] + public void LoadChar(uint charCode, LoadFlags flags, LoadTarget target) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + Error err = FT.FT_Load_Char(Reference, charCode, (int)flags | (int)target); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// A function used to set the transformation that is applied to glyph images when they are loaded into a glyph + /// slot through . + /// + /// + /// The transformation is only applied to scalable image formats after the glyph has been loaded. It means that + /// hinting is unaltered by the transformation and is performed on the character size given in the last call to + /// or . + /// + /// Note that this also transforms the ‘face.glyph.advance’ field, but not the values in ‘face.glyph.metrics’. + /// + /// + /// A pointer to the transformation's 2x2 matrix. Use the method overloads for the identity matrix. + /// + /// + /// A pointer to the translation vector. Use the method overloads for the null vector. + /// + public unsafe void SetTransform(FTMatrix matrix, FTVector delta) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + FT.FT_Set_Transform(Reference, (IntPtr)(&matrix), (IntPtr)(&delta)); + } + + /// + /// A function used to set the transformation that is applied to glyph images when they are loaded into a glyph + /// slot through with the identity matrix. + /// + /// + /// The transformation is only applied to scalable image formats after the glyph has been loaded. It means that + /// hinting is unaltered by the transformation and is performed on the character size given in the last call to + /// or . + /// + /// Note that this also transforms the ‘face.glyph.advance’ field, but not the values in ‘face.glyph.metrics’. + /// + /// + /// A pointer to the translation vector. Use the method overloads for the null vector. + /// + public unsafe void SetTransform(FTVector delta) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + FT.FT_Set_Transform(Reference, IntPtr.Zero, (IntPtr)(&delta)); + } + + /// + /// A function used to set the transformation that is applied to glyph images when they are loaded into a glyph + /// slot through with the null vector. + /// + /// + /// The transformation is only applied to scalable image formats after the glyph has been loaded. It means that + /// hinting is unaltered by the transformation and is performed on the character size given in the last call to + /// or . + /// + /// Note that this also transforms the ‘face.glyph.advance’ field, but not the values in ‘face.glyph.metrics’. + /// + /// + /// A pointer to the transformation's 2x2 matrix. Use the method overloads for the identity matrix. + /// + public unsafe void SetTransform(FTMatrix matrix) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + FT.FT_Set_Transform(Reference, (IntPtr)(&matrix), IntPtr.Zero); + } + + /// + /// A function used to set the transformation that is applied to glyph images when they are loaded into a glyph + /// slot through with the null vector and the identity matrix. + /// + /// + /// The transformation is only applied to scalable image formats after the glyph has been loaded. It means that + /// hinting is unaltered by the transformation and is performed on the character size given in the last call to + /// or . + /// + /// Note that this also transforms the ‘face.glyph.advance’ field, but not the values in ‘face.glyph.metrics’. + /// + public unsafe void SetTransform() + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + FT.FT_Set_Transform(Reference, IntPtr.Zero, IntPtr.Zero); + } + + /// + /// Return the kerning vector between two glyphs of a same face. + /// + /// + /// Only horizontal layouts (left-to-right & right-to-left) are supported by this method. Other layouts, or + /// more sophisticated kernings, are out of the scope of this API function -- they can be implemented through + /// format-specific interfaces. + /// + /// The index of the left glyph in the kern pair. + /// The index of the right glyph in the kern pair. + /// Determines the scale and dimension of the returned kerning vector. + /// + /// The kerning vector. This is either in font units or in pixels (26.6 format) for scalable formats, and in + /// pixels for fixed-sizes formats. + /// + [CLSCompliant(false)] + public FTVector26Dot6 GetKerning(uint leftGlyph, uint rightGlyph, KerningMode mode) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + FTVector26Dot6 kern; + Error err = FT.FT_Get_Kerning(Reference, leftGlyph, rightGlyph, (uint)mode, out kern); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return kern; + } + + /// + /// Return the track kerning for a given face object at a given size. + /// + /// The point size in 16.16 fractional points. + /// The degree of tightness. + /// The kerning in 16.16 fractional points. + public Fixed16Dot16 GetTrackKerning(Fixed16Dot16 pointSize, int degree) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + IntPtr kerning; + + Error err = FT.FT_Get_Track_Kerning(Reference, (IntPtr)pointSize.Value, degree, out kerning); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return Fixed16Dot16.FromRawValue((int)kerning); + } + + /// + /// Retrieve the ASCII name of a given glyph in a face. This only works for those faces where + /// returns 1. + /// + /// + /// An error is returned if the face doesn't provide glyph names or if the glyph index is invalid. In all cases + /// of failure, the first byte of ‘buffer’ is set to 0 to indicate an empty name. + /// + /// The glyph name is truncated to fit within the buffer if it is too long. The returned string is always + /// zero-terminated. + /// + /// Be aware that FreeType reorders glyph indices internally so that glyph index 0 always corresponds to the + /// ‘missing glyph’ (called ‘.notdef’). + /// + /// This function is not compiled within the library if the config macro ‘FT_CONFIG_OPTION_NO_GLYPH_NAMES’ is + /// defined in ‘include/freetype/config/ftoptions.h’. + /// + /// The glyph index. + /// The maximal number of bytes available in the buffer. + /// The ASCII name of a given glyph in a face. + [CLSCompliant(false)] + public string GetGlyphName(uint glyphIndex, int bufferSize) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + return GetGlyphName(glyphIndex, new byte[bufferSize]); + } + + /// + /// Retrieve the ASCII name of a given glyph in a face. This only works for those faces where + /// returns 1. + /// + /// + /// An error is returned if the face doesn't provide glyph names or if the glyph index is invalid. In all cases + /// of failure, the first byte of ‘buffer’ is set to 0 to indicate an empty name. + /// + /// The glyph name is truncated to fit within the buffer if it is too long. The returned string is always + /// zero-terminated. + /// + /// Be aware that FreeType reorders glyph indices internally so that glyph index 0 always corresponds to the + /// ‘missing glyph’ (called ‘.notdef’). + /// + /// This function is not compiled within the library if the config macro ‘FT_CONFIG_OPTION_NO_GLYPH_NAMES’ is + /// defined in ‘include/freetype/config/ftoptions.h’. + /// + /// The glyph index. + /// The target buffer where the name is copied to. + /// The ASCII name of a given glyph in a face. + [CLSCompliant(false)] + public unsafe string GetGlyphName(uint glyphIndex, byte[] buffer) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + fixed (byte* ptr = buffer) + { + IntPtr intptr = new IntPtr(ptr); + Error err = FT.FT_Get_Glyph_Name(Reference, glyphIndex, intptr, (uint)buffer.Length); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return Marshal.PtrToStringAnsi(intptr); + } + } + + /// + /// Retrieve the ASCII Postscript name of a given face, if available. This only works with Postscript and + /// TrueType fonts. + /// + /// + /// The returned pointer is owned by the face and is destroyed with it. + /// + /// A pointer to the face's Postscript name. NULL if unavailable. + public string GetPostscriptName() + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + return Marshal.PtrToStringAnsi(FT.FT_Get_Postscript_Name(Reference)); + } + + /// + /// Select a given charmap by its encoding tag (as listed in ‘freetype.h’). + /// + /// + /// This function returns an error if no charmap in the face corresponds to the encoding queried here. + /// + /// Because many fonts contain more than a single cmap for Unicode encoding, this function has some special + /// code to select the one which covers Unicode best. It is thus preferable to in + /// this case. + /// + /// A handle to the selected encoding. + [CLSCompliant(false)] + public void SelectCharmap(Encoding encoding) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + Error err = FT.FT_Select_Charmap(Reference, encoding); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Select a given charmap for character code to glyph index mapping. + /// + /// + /// This function returns an error if the charmap is not part of the face (i.e., if it is not listed in the + /// ’ table). + /// + /// A handle to the selected charmap. + public void SetCharmap(CharMap charmap) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + Error err = FT.FT_Set_Charmap(Reference, charmap.Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Return the glyph index of a given character code. This function uses a charmap object to do the mapping. + /// + /// + /// If you use FreeType to manipulate the contents of font files directly, be aware that the glyph index + /// returned by this function doesn't always correspond to the internal indices used within the file. This is + /// done to ensure that value 0 always corresponds to the ‘missing glyph’. + /// + /// The character code. + /// The glyph index. 0 means ‘undefined character code’. + [CLSCompliant(false)] + public uint GetCharIndex(uint charCode) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + return FT.FT_Get_Char_Index(Reference, charCode); + } + + /// + /// This function is used to return the first character code in the current charmap of a given face. It also + /// returns the corresponding glyph index. + /// + /// + /// You should use this function with to be able to parse all character codes + /// available in a given charmap. + /// + /// Note that ‘agindex’ is set to 0 if the charmap is empty. The result itself can be 0 in two cases: if the + /// charmap is empty or when the value 0 is the first valid character code. + /// + /// Glyph index of first character code. 0 if charmap is empty. + /// The charmap's first character code. + [CLSCompliant(false)] + public uint GetFirstChar(out uint glyphIndex) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + return FT.FT_Get_First_Char(Reference, out glyphIndex); + } + + /// + /// This function is used to return the next character code in the current charmap of a given face following + /// the value ‘charCode’, as well as the corresponding glyph index. + /// + /// + /// You should use this function with to walk over all character codes available + /// in a given charmap. See the note for this function for a simple code example. + /// + /// Note that ‘*agindex’ is set to 0 when there are no more codes in the charmap. + /// + /// The starting character code. + /// Glyph index of first character code. 0 if charmap is empty. + /// The charmap's next character code. + [CLSCompliant(false)] + public uint GetNextChar(uint charCode, out uint glyphIndex) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + return FT.FT_Get_Next_Char(Reference, charCode, out glyphIndex); + } + + /// + /// Return the glyph index of a given glyph name. This function uses driver specific objects to do the + /// translation. + /// + /// The glyph name. + /// The glyph index. 0 means ‘undefined character code’. + [CLSCompliant(false)] + public uint GetNameIndex(string name) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + return FT.FT_Get_Name_Index(Reference, Marshal.StringToHGlobalAnsi(name)); + } + + /// + /// Return the flags for a font. + /// + /// + /// Use this function rather than directly reading the ‘fs_type’ field in the + /// structure which is only guaranteed to return the correct results for Type 1 fonts. + /// + /// The fsType flags, . + [CLSCompliant(false)] + public EmbeddingTypes GetFSTypeFlags() + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + return FT.FT_Get_FSType_Flags(Reference); + } + + #endregion + + #region Glyph Variants + + /// + /// Return the glyph index of a given character code as modified by the variation selector. + /// + /// + /// If you use FreeType to manipulate the contents of font files directly, be aware that the glyph index + /// returned by this function doesn't always correspond to the internal indices used within the file. This is + /// done to ensure that value 0 always corresponds to the ‘missing glyph’. + /// + /// This function is only meaningful if a) the font has a variation selector cmap sub table, and b) the current + /// charmap has a Unicode encoding. + /// + /// The character code point in Unicode. + /// The Unicode code point of the variation selector. + /// + /// The glyph index. 0 means either ‘undefined character code’, or ‘undefined selector code’, or ‘no variation + /// selector cmap subtable’, or ‘current CharMap is not Unicode’. + /// + [CLSCompliant(false)] + public uint GetCharVariantIndex(uint charCode, uint variantSelector) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + return FT.FT_Face_GetCharVariantIndex(Reference, charCode, variantSelector); + } + + /// + /// Check whether this variant of this Unicode character is the one to be found in the ‘cmap’. + /// + /// + /// This function is only meaningful if the font has a variation selector cmap subtable. + /// + /// The character codepoint in Unicode. + /// The Unicode codepoint of the variation selector. + /// + /// 1 if found in the standard (Unicode) cmap, 0 if found in the variation selector cmap, or -1 if it is not a + /// variant. + /// + [CLSCompliant(false)] + public int GetCharVariantIsDefault(uint charCode, uint variantSelector) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + return FT.FT_Face_GetCharVariantIsDefault(Reference, charCode, variantSelector); + } + + /// + /// Return a zero-terminated list of Unicode variant selectors found in the font. + /// + /// + /// The last item in the array is 0; the array is owned by the object but can be overwritten + /// or released on the next call to a FreeType function. + /// + /// + /// A pointer to an array of selector code points, or NULL if there is no valid variant selector cmap subtable. + /// + [CLSCompliant(false)] + public uint[] GetVariantSelectors() + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + IntPtr ptr = FT.FT_Face_GetVariantSelectors(Reference); + + List list = new List(); + + //temporary non-zero value to prevent complaining about uninitialized variable. + uint curValue = 1; + + for (int i = 0; curValue != 0; i++) + { + curValue = (uint)Marshal.ReadInt32(Reference, sizeof(uint) * i); + list.Add(curValue); + } + + return list.ToArray(); + } + + /// + /// Return a zero-terminated list of Unicode variant selectors found in the font. + /// + /// + /// The last item in the array is 0; the array is owned by the object but can be overwritten + /// or released on the next call to a FreeType function. + /// + /// The character codepoint in Unicode. + /// + /// A pointer to an array of variant selector code points which are active for the given character, or NULL if + /// the corresponding list is empty. + /// + [CLSCompliant(false)] + public uint[] GetVariantsOfChar(uint charCode) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + IntPtr ptr = FT.FT_Face_GetVariantsOfChar(Reference, charCode); + + List list = new List(); + + //temporary non-zero value to prevent complaining about uninitialized variable. + uint curValue = 1; + + for (int i = 0; curValue != 0; i++) + { + curValue = (uint)Marshal.ReadInt32(Reference, sizeof(uint) * i); + list.Add(curValue); + } + + return list.ToArray(); + } + + /// + /// Return a zero-terminated list of Unicode character codes found for the specified variant selector. + /// + /// + /// The last item in the array is 0; the array is owned by the object but can be overwritten + /// or released on the next call to a FreeType function. + /// + /// The variant selector code point in Unicode. + /// + /// A list of all the code points which are specified by this selector (both default and non-default codes are + /// returned) or NULL if there is no valid cmap or the variant selector is invalid. + /// + [CLSCompliant(false)] + public uint[] GetCharsOfVariant(uint variantSelector) + { + if (disposed) + throw new ObjectDisposedException("face", "Cannot access a disposed object."); + + IntPtr ptr = FT.FT_Face_GetCharsOfVariant(Reference, variantSelector); + + List list = new List(); + + //temporary non-zero value to prevent complaining about uninitialized variable. + uint curValue = 1; + + for (int i = 0; curValue != 0; i++) + { + curValue = (uint)Marshal.ReadInt32(Reference, sizeof(uint) * i); + list.Add(curValue); + } + + return list.ToArray(); + } + + #endregion + + #region Size Management + + /// + /// Create a new size object from a given face object. + /// + /// + /// You need to call in order to select the new size for upcoming calls to + /// , , , , + /// etc. + /// + /// A handle to a new size object. + public FTSize NewSize() + { + return new FTSize(this); + } + + #endregion + + #region Multiple Masters + + /// + /// Retrieve the Multiple Master descriptor of a given font. + /// + /// This function can't be used with GX fonts. + /// + /// The Multiple Masters descriptor. + public MultiMaster GetMultiMaster() + { + IntPtr masterRef; + Error err = FT.FT_Get_Multi_Master(Reference, out masterRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new MultiMaster(masterRef); + } + + /// + /// Retrieve the Multiple Master/GX var descriptor of a given font. + /// + /// + /// The Multiple Masters/GX var descriptor. Allocates a data structure, which the user must free (a single call + /// to FT_FREE will do it). + /// + public MMVar GetMMVar() + { + IntPtr varRef; + Error err = FT.FT_Get_MM_Var(Reference, out varRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new MMVar(varRef); + } + + /// + /// For Multiple Masters fonts, choose an interpolated font design through design coordinates. + /// + /// This function can't be used with GX fonts. + /// + /// An array of design coordinates. + public unsafe void SetMMDesignCoordinates(long[] coords) + { + fixed (void* ptr = coords) + { + IntPtr coordsPtr = (IntPtr)ptr; + Error err = FT.FT_Set_MM_Design_Coordinates(Reference, (uint)coords.Length, coordsPtr); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + } + + /// + /// For Multiple Master or GX Var fonts, choose an interpolated font design through design coordinates. + /// + /// An array of design coordinates. + public unsafe void SetVarDesignCoordinates(long[] coords) + { + fixed (void* ptr = coords) + { + IntPtr coordsPtr = (IntPtr)ptr; + Error err = FT.FT_Set_Var_Design_Coordinates(Reference, (uint)coords.Length, coordsPtr); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + } + + /// + /// For Multiple Masters and GX var fonts, choose an interpolated font design through normalized blend + /// coordinates. + /// + /// The design coordinates array (each element must be between 0 and 1.0). + public unsafe void SetMMBlendCoordinates(long[] coords) + { + fixed (void* ptr = coords) + { + IntPtr coordsPtr = (IntPtr)ptr; + Error err = FT.FT_Set_MM_Blend_Coordinates(Reference, (uint)coords.Length, coordsPtr); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + } + + /// + /// This is another name of . + /// + /// The design coordinates array (each element must be between 0 and 1.0). + public unsafe void SetVarBlendCoordinates(long[] coords) + { + fixed (void* ptr = coords) + { + IntPtr coordsPtr = (IntPtr)ptr; + Error err = FT.FT_Set_Var_Blend_Coordinates(Reference, (uint)coords.Length, coordsPtr); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + } + + #endregion + + #region TrueType Tables + + /// + /// Return a pointer to a given SFNT table within a face. + /// + /// + /// The table is owned by the face object and disappears with it. + /// + /// This function is only useful to access SFNT tables that are loaded by the sfnt, truetype, and opentype + /// drivers. See for a list. + /// + /// The index of the SFNT table. + /// + /// A type-less pointer to the table. This will be 0 in case of error, or if the corresponding table was not + /// found OR loaded from the file. + /// + /// Use a typecast according to ‘tag’ to access the structure elements. + /// + public object GetSfntTable(SfntTag tag) + { + IntPtr tableRef = FT.FT_Get_Sfnt_Table(Reference, tag); + + if (tableRef == IntPtr.Zero) + return null; + + switch (tag) + { + case SfntTag.Header: + return new Header(tableRef); + case SfntTag.HorizontalHeader: + return new HoriHeader(tableRef); + case SfntTag.MaxProfile: + return new MaxProfile(tableRef); + case SfntTag.OS2: + return new OS2(tableRef); + case SfntTag.Pclt: + return new Pclt(tableRef); + case SfntTag.Postscript: + return new Postscript(tableRef); + case SfntTag.VertHeader: + return new VertHeader(tableRef); + default: + return null; + } + } + + /// + /// Load any font table into client memory. + /// + /// + /// If you need to determine the table's length you should first call this function with ‘*length’ set to 0, as + /// in the following example: + /// + /// FT_ULong length = 0; + /// + /// + /// error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); + /// if ( error ) { ... table does not exist ... } + /// + /// buffer = malloc( length ); + /// if ( buffer == NULL ) { ... not enough memory ... } + /// + /// error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); + /// if ( error ) { ... could not load table ... } + /// + /// + /// + /// The four-byte tag of the table to load. Use the value 0 if you want to access the whole font file. + /// Otherwise, you can use one of the definitions found in the FT_TRUETYPE_TAGS_H file, or forge a new one with + /// FT_MAKE_TAG. + /// + /// The starting offset in the table (or file if tag == 0). + /// + /// The target buffer address. The client must ensure that the memory array is big enough to hold the data. + /// + /// + /// If the ‘length’ parameter is NULL, then try to load the whole table. Return an error code if it fails. + /// + /// Else, if ‘*length’ is 0, exit immediately while returning the table's (or file) full size in it. + /// + /// Else the number of bytes to read from the table or file, from the starting offset. + /// + [CLSCompliant(false)] + public void LoadSfntTable(uint tag, int offset, IntPtr buffer, ref uint length) + { + Error err = FT.FT_Load_Sfnt_Table(Reference, tag, offset, buffer, ref length); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Return information on an SFNT table. + /// + /// + /// The index of an SFNT table. The function returns for an invalid value. + /// + /// + /// The name tag of the SFNT table. If the value is NULL, ‘table_index’ is ignored, and ‘length’ returns the + /// number of SFNT tables in the font. + /// + /// The length of the SFNT table (or the number of SFNT tables, depending on ‘tag’). + [CLSCompliant(false)] + public unsafe uint SfntTableInfo(uint tableIndex, SfntTag tag) + { + uint length; + Error err = FT.FT_Sfnt_Table_Info(Reference, tableIndex, &tag, out length); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return length; + } + + /// + /// Only gets the number of SFNT tables. + /// + /// The number of SFNT tables. + [CLSCompliant(false)] + public unsafe uint SfntTableInfo() + { + uint length; + Error err = FT.FT_Sfnt_Table_Info(Reference, 0, null, out length); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return length; + } + + #endregion + + #region Type 1 Tables + + /// + /// Return true if a given face provides reliable PostScript glyph names. This is similar to using the + /// macro, except that certain fonts (mostly TrueType) contain incorrect + /// glyph name tables. + /// + /// When this function returns true, the caller is sure that the glyph names returned by + /// are reliable. + /// + /// Boolean. True if glyph names are reliable. + public bool HasPSGlyphNames() + { + return FT.FT_Has_PS_Glyph_Names(Reference); + } + + /// + /// Retrieve the structure corresponding to a given PostScript font. + /// + /// + /// The string pointers within the font info structure are owned by the face and don't need to be freed by the + /// caller. + /// + /// If the font's format is not PostScript-based, this function will return the + /// error code. + /// + /// Output font info structure pointer. + public FontInfo GetPSFontInfo() + { + PostScript.Internal.FontInfoRec fontInfoRec; + Error err = FT.FT_Get_PS_Font_Info(Reference, out fontInfoRec); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new FontInfo(fontInfoRec); + } + + /// + /// Retrieve the structure corresponding to a given PostScript font. + /// + /// + /// The string pointers within the structure are owned by the face and don't + /// need to be freed by the caller. + /// + /// If the font's format is not PostScript-based, this function returns the + /// error code. + /// + /// Output private dictionary structure pointer. + public Private GetPSFontPrivate() + { + PostScript.Internal.PrivateRec privateRec; + Error err = FT.FT_Get_PS_Font_Private(Reference, out privateRec); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new Private(privateRec); + } + + /// + /// Retrieve the value for the supplied key from a PostScript font. + /// + /// + /// The values returned are not pointers into the internal structures of the face, but are ‘fresh’ copies, so + /// that the memory containing them belongs to the calling application. This also enforces the ‘read-only’ + /// nature of these values, i.e., this function cannot be used to manipulate the face. + /// + /// ‘value’ is a void pointer because the values returned can be of various types. + /// + /// If either ‘value’ is NULL or ‘value_len’ is too small, just the required memory size for the requested + /// entry is returned. + /// + /// The ‘idx’ parameter is used, not only to retrieve elements of, for example, the FontMatrix or FontBBox, but + /// also to retrieve name keys from the CharStrings dictionary, and the charstrings themselves. It is ignored + /// for atomic values. + /// + /// returns a value that is scaled up by 1000. To get the + /// value as in the font stream, you need to divide by 65536000.0 (to remove the FT_Fixed scale, and the x1000 + /// scale). + /// + /// IMPORTANT: Only key/value pairs read by the FreeType interpreter can be retrieved. So, for example, + /// PostScript procedures such as NP, ND, and RD are not available. Arbitrary keys are, obviously, not be + /// available either. + /// + /// If the font's format is not PostScript-based, this function returns the + /// error code. + /// + /// An enumeration value representing the dictionary key to retrieve. + /// For array values, this specifies the index to be returned. + /// A pointer to memory into which to write the value. + /// The size, in bytes, of the memory supplied for the value. + /// + /// The amount of memory (in bytes) required to hold the requested value (if it exists, -1 otherwise). + /// + [CLSCompliant(false)] + public int GetPSFontValue(DictionaryKeys key, uint idx, ref IntPtr value, int valueLength) + { + return FT.FT_Get_PS_Font_Value(Reference, key, idx, ref value, valueLength); + } + + #endregion + + #region SFNT Names + + /// + /// Retrieve the number of name strings in the SFNT ‘name’ table. + /// + /// The number of strings in the ‘name’ table. + [CLSCompliant(false)] + public uint GetSfntNameCount() + { + return FT.FT_Get_Sfnt_Name_Count(Reference); + } + + /// + /// Retrieve a string of the SFNT ‘name’ table for a given index. + /// + /// + /// The ‘string’ array returned in the ‘aname’ structure is not null-terminated. The application should + /// deallocate it if it is no longer in use. + /// + /// Use to get the total number of available ‘name’ table entries, then do a + /// loop until you get the right platform, encoding, and name ID. + /// + /// The index of the ‘name’ string. + /// The indexed structure. + [CLSCompliant(false)] + public SfntName GetSfntName(uint idx) + { + TrueType.Internal.SfntNameRec nameRec; + + Error err = FT.FT_Get_Sfnt_Name(Reference, idx, out nameRec); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new SfntName(nameRec); + } + + #endregion + + #region BDF and PCF Files + + /// + /// Retrieve a BDF font character set identity, according to the BDF specification. + /// + /// + /// This function only works with BDF faces, returning an error otherwise. + /// + /// Charset encoding, as a C string, owned by the face. + /// Charset registry, as a C string, owned by the face. + public void GetBdfCharsetId(out string encoding, out string registry) + { + Error err = FT.FT_Get_BDF_Charset_ID(Reference, out encoding, out registry); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Retrieve a BDF property from a BDF or PCF font file. + /// + /// + /// This function works with BDF and PCF fonts. It returns an error otherwise. It also returns an error if the + /// property is not in the font. + /// + /// A ‘property’ is a either key-value pair within the STARTPROPERTIES ... ENDPROPERTIES block of a BDF font or + /// a key-value pair from the ‘info->props’ array within a ‘FontRec’ structure of a PCF font. + /// + /// Integer properties are always stored as ‘signed’ within PCF fonts; consequently, + /// is a possible return value for BDF fonts only. + /// + /// In case of error, ‘aproperty->type’ is always set to . + /// + /// The property name. + /// The property. + public Property GetBdfProperty(string propertyName) + { + IntPtr propertyRef; + + Error err = FT.FT_Get_BDF_Property(Reference, propertyName, out propertyRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new Property(propertyRef); + } + + #endregion + + #region CID Fonts + + /// + /// Retrieve the Registry/Ordering/Supplement triple (also known as the "R/O/S") from a CID-keyed font. + /// + /// + /// This function only works with CID faces, returning an error otherwise. + /// + /// The registry, as a C string, owned by the face. + /// The ordering, as a C string, owned by the face. + /// The supplement. + public void GetCidRegistryOrderingSupplement(out string registry, out string ordering, out int supplement) + { + Error err = FT.FT_Get_CID_Registry_Ordering_Supplement(Reference, out registry, out ordering, out supplement); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Retrieve the type of the input face, CID keyed or not. In constrast to the + /// macro this function returns successfully also for CID-keyed fonts in an + /// SNFT wrapper. + /// + /// + /// This function only works with CID faces and OpenType fonts, returning an error otherwise. + /// + /// The type of the face as an FT_Bool. + public bool GetCidIsInternallyCidKeyed() + { + byte is_cid; + Error err = FT.FT_Get_CID_Is_Internally_CID_Keyed(Reference, out is_cid); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return is_cid == 1; + } + + /// + /// Retrieve the CID of the input glyph index. + /// + /// + /// This function only works with CID faces and OpenType fonts, returning an error otherwise. + /// + /// The input glyph index. + /// The CID as an uint. + [CLSCompliant(false)] + public uint GetCidFromGlyphIndex(uint glyphIndex) + { + uint cid; + Error err = FT.FT_Get_CID_From_Glyph_Index(Reference, glyphIndex, out cid); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return cid; + } + + #endregion + + #region PFR Fonts + + /// + /// Return the outline and metrics resolutions of a given PFR face. + /// + /// + /// If the input face is not a PFR, this function will return an error. However, in all cases, it will return + /// valid values. + /// + /// + /// Outline resolution. This is equivalent to ‘face->units_per_EM’ for non-PFR fonts. Optional (parameter can + /// be NULL). + /// + /// + /// Metrics resolution. This is equivalent to ‘outline_resolution’ for non-PFR fonts. Optional (parameter can + /// be NULL). + /// + /// + /// A 16.16 fixed-point number used to scale distance expressed in metrics units to device sub-pixels. This is + /// equivalent to ‘face->size->x_scale’, but for metrics only. Optional (parameter can be NULL). + /// + /// + /// Same as ‘ametrics_x_scale’ but for the vertical direction. optional (parameter can be NULL). + /// + [CLSCompliant(false)] + public void GetPfrMetrics(out uint outlineResolution, out uint metricsResolution, out Fixed16Dot16 metricsXScale, out Fixed16Dot16 metricsYScale) + { + IntPtr tmpXScale, tmpYScale; + Error err = FT.FT_Get_PFR_Metrics(Reference, out outlineResolution, out metricsResolution, out tmpXScale, out tmpYScale); + + metricsXScale = Fixed16Dot16.FromRawValue((int)tmpXScale); + metricsYScale = Fixed16Dot16.FromRawValue((int)tmpYScale); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Return the kerning pair corresponding to two glyphs in a PFR face. The distance is expressed in metrics + /// units, unlike the result of . + /// + /// + /// This function always return distances in original PFR metrics units. This is unlike + /// with the mode, which always returns + /// distances converted to outline units. + /// + /// You can use the value of the ‘x_scale’ and ‘y_scale’ parameters returned by to + /// scale these to device sub-pixels. + /// + /// Index of the left glyph. + /// Index of the right glyph. + /// A kerning vector. + [CLSCompliant(false)] + public FTVector GetPfrKerning(uint left, uint right) + { + FTVector vector; + Error err = FT.FT_Get_PFR_Kerning(Reference, left, right, out vector); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return vector; + } + + /// + /// Return a given glyph advance, expressed in original metrics units, from a PFR font. + /// + /// + /// You can use the ‘x_scale’ or ‘y_scale’ results of to convert the advance to + /// device sub-pixels (i.e., 1/64th of pixels). + /// + /// The glyph index. + /// The glyph advance in metrics units. + [CLSCompliant(false)] + public int GetPfrAdvance(uint glyphIndex) + { + int advance; + Error err = FT.FT_Get_PFR_Advance(Reference, glyphIndex, out advance); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return advance; + } + + #endregion + + #region Windows FNT Files + + /// + /// Retrieve a Windows FNT font info header. + /// + /// + /// This function only works with Windows FNT faces, returning an error otherwise. + /// + /// The WinFNT header. + public Fnt.Header GetWinFntHeader() + { + IntPtr headerRef; + Error err = FT.FT_Get_WinFNT_Header(Reference, out headerRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new Fnt.Header(headerRef); + } + + #endregion + + #region Font Formats + + /// + /// Return a string describing the format of a given face, using values which can be used as an X11 + /// FONT_PROPERTY. Possible values are ‘TrueType’, ‘Type 1’, ‘BDF’, ‘PCF’, ‘Type 42’, ‘CID Type 1’, ‘CFF’, + /// ‘PFR’, and ‘Windows FNT’. + /// + /// Font format string. NULL in case of error. + public string GetX11FontFormat() + { + return Marshal.PtrToStringAnsi(FT.FT_Get_X11_Font_Format(Reference)); + } + + #endregion + + #region Gasp Table + + /// + /// Read the ‘gasp’ table from a TrueType or OpenType font file and return the entry corresponding to a given + /// character pixel size. + /// + /// The vertical character pixel size. + /// + /// Bit flags (see ), or if there is no ‘gasp’ table in the face. + /// + [CLSCompliant(false)] + public Gasp GetGasp(uint ppem) + { + return FT.FT_Get_Gasp(Reference, ppem); + } + + #endregion + + #region Quick retrieval of advance values + + /// + /// Retrieve the advance value of a given glyph outline in a . By default, the unhinted + /// advance is returned in font units. + /// + /// + /// This function may fail if you use and if the corresponding font + /// backend doesn't have a quick way to retrieve the advances. + /// + /// A scaled advance is returned in 16.16 format but isn't transformed by the affine transformation specified + /// by . + /// + /// The glyph index. + /// + /// A set of bit flags similar to those used when calling , used to determine what kind + /// of advances you need. + /// + /// + /// The advance value, in either font units or 16.16 format. + /// + /// If is set, this is the vertical advance corresponding to a vertical + /// layout. Otherwise, it is the horizontal advance in a horizontal layout. + /// + [CLSCompliant(false)] + public Fixed16Dot16 GetAdvance(uint glyphIndex, LoadFlags flags) + { + IntPtr padvance; + Error err = FT.FT_Get_Advance(Reference, glyphIndex, flags, out padvance); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return Fixed16Dot16.FromRawValue((int)padvance); + } + + /// + /// Retrieve the advance values of several glyph outlines in an + /// . By default, the unhinted advances are returned + /// in font units. + /// + /// + /// This function may fail if you use + /// and if the + /// corresponding font backend doesn't have a quick way to retrieve the + /// advances. + /// + /// Scaled advances are returned in 16.16 format but aren't transformed + /// by the affine transformation specified by + /// . + /// + /// The first glyph index. + /// The number of advance values you want to retrieve. + /// A set of bit flags similar to those used when calling . + /// The advances, in either font units or 16.16 format. This array must contain at least ‘count’ elements. + /// + /// If is set, these are the vertical advances corresponding to a vertical layout. Otherwise, they are the horizontal advances in a horizontal layout. + [CLSCompliant(false)] + public unsafe Fixed16Dot16[] GetAdvances(uint start, uint count, LoadFlags flags) + { + IntPtr advPtr; + Error err = FT.FT_Get_Advances(Reference, start, count, flags, out advPtr); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + //create a new array and copy the data from the pointer over + Fixed16Dot16[] advances = new Fixed16Dot16[count]; + IntPtr* ptr = (IntPtr*)advPtr; + + for (int i = 0; i < count; i++) + advances[i] = Fixed16Dot16.FromRawValue((int)ptr[i]); + + return advances; + } + + #endregion + + #region OpenType Validation + + /// + /// Validate various OpenType tables to assure that all offsets and indices are valid. The idea is that a + /// higher-level library which actually does the text layout can access those tables without error checking + /// (which can be quite time consuming). + /// + /// + /// This function only works with OpenType fonts, returning an error otherwise. + /// + /// After use, the application should deallocate the five tables with . A NULL value + /// indicates that the table either doesn't exist in the font, or the application hasn't asked for validation. + /// + /// A bit field which specifies the tables to be validated. + /// A pointer to the BASE table. + /// A pointer to the GDEF table. + /// A pointer to the GPOS table. + /// A pointer to the GSUB table. + /// A pointer to the JSTF table. + [CLSCompliant(false)] + public void OpenTypeValidate(OpenTypeValidationFlags flags, out IntPtr baseTable, out IntPtr gdefTable, out IntPtr gposTable, out IntPtr gsubTable, out IntPtr jstfTable) + { + Error err = FT.FT_OpenType_Validate(Reference, flags, out baseTable, out gdefTable, out gposTable, out gsubTable, out jstfTable); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Free the buffer allocated by OpenType validator. + /// + /// + /// This function must be used to free the buffer allocated by only. + /// + /// The pointer to the buffer that is allocated by . + public void OpenTypeFree(IntPtr table) + { + FT.FT_OpenType_Free(Reference, table); + } + + #endregion + + #region TrueTypeGX/AAT Validation + + /// + /// Validate various TrueTypeGX tables to assure that all offsets and indices are valid. The idea is that a + /// higher-level library which actually does the text layout can access those tables without error checking + /// (which can be quite time consuming). + /// + /// + /// This function only works with TrueTypeGX fonts, returning an error otherwise. + /// + /// After use, the application should deallocate the buffers pointed to by each ‘tables’ element, by calling + /// . A NULL value indicates that the table either doesn't exist in the font, the + /// application hasn't asked for validation, or the validator doesn't have the ability to validate the sfnt + /// table. + /// + /// A bit field which specifies the tables to be validated. + /// + /// The array where all validated sfnt tables are stored. The array itself must be allocated by a client. + /// + /// + /// The size of the ‘tables’ array. Normally, FT_VALIDATE_GX_LENGTH should be passed. + /// + [CLSCompliant(false)] + public void TrueTypeGXValidate(TrueTypeValidationFlags flags, byte[][] tables, uint tableLength) + { + FT.FT_TrueTypeGX_Validate(Reference, flags, tables, tableLength); + } + + /// + /// Free the buffer allocated by TrueTypeGX validator. + /// + /// + /// This function must be used to free the buffer allocated by only. + /// + /// The pointer to the buffer allocated by . + public void TrueTypeGXFree(IntPtr table) + { + FT.FT_TrueTypeGX_Free(Reference, table); + } + + /// + /// Validate classic (16-bit format) kern table to assure that the offsets and indices are valid. The idea is + /// that a higher-level library which actually does the text layout can access those tables without error + /// checking (which can be quite time consuming). + /// + /// The ‘kern’ table validator in deals with both the new 32-bit format and + /// the classic 16-bit format, while only supports the classic 16-bit format. + /// + /// + /// After use, the application should deallocate the buffers pointed to by ‘ckern_table’, by calling + /// . A NULL value indicates that the table doesn't exist in the font. + /// + /// A bit field which specifies the dialect to be validated. + /// A pointer to the kern table. + [CLSCompliant(false)] + public IntPtr ClassicKernValidate(ClassicKernValidationFlags flags) + { + IntPtr ckernRef; + FT.FT_ClassicKern_Validate(Reference, flags, out ckernRef); + return ckernRef; + } + + /// + /// Free the buffer allocated by classic Kern validator. + /// + /// + /// This function must be used to free the buffer allocated by only. + /// + /// + /// The pointer to the buffer that is allocated by . + /// + public void ClassicKernFree(IntPtr table) + { + FT.FT_ClassicKern_Free(Reference, table); + } + + #endregion + + /// + /// Disposes the Face. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + internal void AddChildSize(FTSize child) + { + childSizes.Add(child); + } + + internal void RemoveChildSize(FTSize child) + { + childSizes.Remove(child); + } + + private void Dispose(bool disposing) + { + if (!disposed) + { + disposed = true; + + foreach (FTSize s in childSizes) + s.Dispose(); + + childSizes.Clear(); + + FT.FT_Done_Face(base.Reference); + + // removes itself from the parent Library, with a check to prevent this from happening when Library is + // being disposed (Library disposes all it's children with a foreach loop, this causes an + // InvalidOperationException for modifying a collection during enumeration) + if (!parentLibrary.IsDisposed) + parentLibrary.RemoveChildFace(this); + + base.Reference = IntPtr.Zero; + rec = new FaceRec(); + + if (memoryFaceHandle.IsAllocated) + memoryFaceHandle.Free(); + + EventHandler handler = Disposed; + if (handler != null) + handler(this, EventArgs.Empty); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/FaceFlags.cs b/SharpFont/Source/SharpFontShared/FaceFlags.cs new file mode 100644 index 000000000..6d25d76f7 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FaceFlags.cs @@ -0,0 +1,145 @@ +#region MIT License +/*Copyright (c) 2012-2014 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of bit flags used in the ‘face_flags’ field of the structure. They inform client + /// applications of properties of the corresponding face. + /// + [Flags] + public enum FaceFlags : long + { + /// + /// No style flags. + /// + None = 0x0000, + + /// + /// Indicates that the face contains outline glyphs. This doesn't prevent bitmap strikes, i.e., a face can have + /// both this and and set. + /// + Scalable = 0x0001, + + /// + /// Indicates that the face contains bitmap strikes. See also and + /// . + /// + FixedSizes = 0x0002, + + /// + /// Indicates that the face contains fixed-width characters (like Courier, Lucido, MonoType, etc.). + /// + FixedWidth = 0x0004, + + /// + /// Indicates that the face uses the ‘sfnt’ storage scheme. For now, this means TrueType and OpenType. + /// + Sfnt = 0x0008, + + /// + /// Indicates that the face contains horizontal glyph metrics. This should be set for all common formats. + /// + Horizontal = 0x0010, + + /// + /// Indicates that the face contains vertical glyph metrics. This is only available in some formats, not all of + /// them. + /// + Vertical = 0x0020, + + /// + /// Indicates that the face contains kerning information. If set, the kerning distance can be retrieved through + /// the function . Otherwise the function always return the vector (0,0). Note + /// that FreeType doesn't handle kerning data from the ‘GPOS’ table (as present in some OpenType fonts). + /// + Kerning = 0x0040, + + /// + /// THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. + /// + [Obsolete("THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT.")] + FastGlyphs = 0x0080, + + /// + /// Indicates that the font contains multiple masters and is capable of interpolating between them. See the + /// multiple-masters specific API for details. + /// + MultipleMasters = 0x0100, + + /// + /// Indicates that the font contains glyph names that can be retrieved through + /// . Note that some TrueType fonts contain broken glyph name + /// tables. Use the function when needed. + /// + GlyphNames = 0x0200, + + /// + /// Used internally by FreeType to indicate that a face's stream was provided by the client application and + /// should not be destroyed when is called. Don't read or test this flag. + /// + ExternalStream = 0x0400, + + /// + /// Set if the font driver has a hinting machine of its own. For example, with TrueType fonts, it makes sense + /// to use data from the SFNT ‘gasp’ table only if the native TrueType hinting engine (with the bytecode + /// interpreter) is available and active. + /// + Hinter = 0x0800, + + /// + /// Set if the font is CID-keyed. In that case, the font is not accessed by glyph indices but by CID values. + /// For subsetted CID-keyed fonts this has the consequence that not all index values are a valid argument to + /// . Only the CID values for which corresponding glyphs in the subsetted font + /// exist make return successfully; in all other cases you get an + /// error. + /// + /// Note that CID-keyed fonts which are in an SFNT wrapper don't have this flag set since the glyphs are + /// accessed in the normal way (using contiguous indices); the ‘CID-ness’ isn't visible to the application. + /// + CidKeyed = 0x1000, + + /// + /// Set if the font is ‘tricky’, this is, it always needs the font format's native hinting engine to get a + /// reasonable result. A typical example is the Chinese font ‘mingli.ttf’ which uses TrueType bytecode + /// instructions to move and scale all of its subglyphs. + /// + /// It is not possible to autohint such fonts using ; it will also ignore + /// . You have to set both and + /// to really disable hinting; however, you probably never want this + /// except for demonstration purposes. + /// + /// Currently, there are about a dozen TrueType fonts in the list of tricky fonts; they are hard-coded in file + /// ‘ttobjs.c’. + /// + Tricky = 0x2000, + + /// + /// Set if the font has color glyph tables. To access color glyphs use . + /// + Color = 0x4000, + } +} diff --git a/SharpFont/Source/SharpFontShared/Fixed16Dot16.cs b/SharpFont/Source/SharpFontShared/Fixed16Dot16.cs new file mode 100644 index 000000000..f43e26849 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Fixed16Dot16.cs @@ -0,0 +1,752 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont +{ + /// + /// Represents a fixed-point decimal value with 16 bits of decimal precision. + /// + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct Fixed16Dot16 : IEquatable, IComparable + { + #region Fields + + /// + /// The angle pi expressed in FT_Angle units. + /// + public static readonly Fixed16Dot16 AnglePI = new Fixed16Dot16(180); + + /// + /// The angle 2*pi expressed in FT_Angle units. + /// + public static readonly Fixed16Dot16 Angle2PI = new Fixed16Dot16(360); + + /// + /// The angle pi/2 expressed in FT_Angle units. + /// + public static readonly Fixed16Dot16 AnglePI2 = new Fixed16Dot16(90); + + /// + /// The angle pi/4 expressed in FT_Angle units. + /// + public static readonly Fixed16Dot16 AnglePI4 = new Fixed16Dot16(45); + + /// + /// The raw 16.16 integer. + /// + private int value; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// An integer value. + public Fixed16Dot16(int value) + { + this.value = value << 16; + } + + /// + /// Initializes a new instance of the struct. + /// + /// A floating point value. + public Fixed16Dot16(float value) + { + this.value = (int)(value * 65536); + } + + /// + /// Initializes a new instance of the struct. + /// + /// A floating point value. + public Fixed16Dot16(double value) + { + this.value = (int)(value * 65536); + } + + /// + /// Initializes a new instance of the struct. + /// + /// A floating point value. + public Fixed16Dot16(decimal value) + { + this.value = (int)(value * 65536); + } + + #endregion + + #region Properties + + /// + /// Gets the raw 16.16 integer. + /// + public int Value + { + get + { + return value; + } + } + + #endregion + + #region Methods + + #region Static + + /// + /// Creates a from an int containing a 16.16 value. + /// + /// A 16.16 value. + /// An instance of . + public static Fixed16Dot16 FromRawValue(int value) + { + Fixed16Dot16 f = new Fixed16Dot16(); + f.value = value; + return f; + } + + /// + /// Creates a new from a + /// + /// A value. + /// The equivalent value. + public static Fixed16Dot16 FromInt32(int value) + { + return new Fixed16Dot16(value); + } + + /// + /// Creates a new from . + /// + /// A floating-point value. + /// A fixed 16.16 value. + public static Fixed16Dot16 FromSingle(float value) + { + return new Fixed16Dot16(value); + } + + /// + /// Creates a new from a . + /// + /// A floating-point value. + /// A fixed 16.16 value. + public static Fixed16Dot16 FromDouble(double value) + { + return new Fixed16Dot16(value); + } + + /// + /// Creates a new from a . + /// + /// A floating-point value. + /// A fixed 16.16 value. + public static Fixed16Dot16 FromDecimal(decimal value) + { + return new Fixed16Dot16(value); + } + + /// + /// Adds two 16.16 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the addition. + public static Fixed16Dot16 Add(Fixed16Dot16 left, Fixed16Dot16 right) + { + return Fixed16Dot16.FromRawValue(left.value + right.value); + } + + /// + /// Subtacts one 16.16 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the subtraction. + public static Fixed16Dot16 Subtract(Fixed16Dot16 left, Fixed16Dot16 right) + { + return Fixed16Dot16.FromRawValue(left.value - right.value); + } + + /// + /// Multiplies two 16.16 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the multiplication. + public static Fixed16Dot16 Multiply(Fixed16Dot16 left, Fixed16Dot16 right) + { + long mul = (long)left.value * (long)right.value; + Fixed16Dot16 ans = new Fixed16Dot16(); + ans.value = (int)(mul >> 16); + return ans; + } + + /// + /// A very simple function used to perform the computation ‘(a*b)/0x10000’ with maximal accuracy. Most of the + /// time this is used to multiply a given value by a 16.16 fixed float factor. + /// + /// + /// NOTE: This is a native FreeType function. + /// + /// This function has been optimized for the case where the absolute value of ‘a’ is less than 2048, and ‘b’ is + /// a 16.16 scaling factor. As this happens mainly when scaling from notional units to fractional pixels in + /// FreeType, it resulted in noticeable speed improvements between versions 2.x and 1.x. + /// + /// As a conclusion, always try to place a 16.16 factor as the second argument of this function; this can make + /// a great difference. + /// + /// The first multiplier. + /// The second multiplier. Use a 16.16 factor here whenever possible (see note below). + /// The result of ‘(a*b)/0x10000’. + public static Fixed16Dot16 MultiplyFix(int a, Fixed16Dot16 b) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_MulFix((IntPtr)a, (IntPtr)b.Value)); + } + + /// + /// Divides one 16.16 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the division. + public static Fixed16Dot16 Divide(Fixed16Dot16 left, Fixed16Dot16 right) + { + long div = ((long)left.Value << 16) / right.value; + Fixed16Dot16 ans = new Fixed16Dot16(); + ans.value = (int)div; + return ans; + } + + /// + /// A very simple function used to perform the computation ‘(a*0x10000)/b’ with maximal accuracy. Most of the + /// time, this is used to divide a given value by a 16.16 fixed float factor. + /// + /// + /// NOTE: This is a native FreeType function. + /// + /// The optimization for is simple: If (a << 16) fits in 32 bits, then the division + /// is computed directly. Otherwise, we use a specialized version of . + /// + /// The first multiplier. + /// The second multiplier. Use a 16.16 factor here whenever possible (see note below). + /// The result of ‘(a*0x10000)/b’. + public static Fixed16Dot16 DivideFix(int a, Fixed16Dot16 b) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_DivFix((IntPtr)a, (IntPtr)b.Value)); + } + + /// + /// A very simple function used to perform the computation ‘(a*b)/c’ with maximal accuracy (it uses a 64-bit + /// intermediate integer whenever necessary). + /// + /// This function isn't necessarily as fast as some processor specific operations, but is at least completely + /// portable. + /// + /// This is a native FreeType function. + /// The first multiplier. + /// The second multiplier. + /// The divisor. + /// + /// The result of ‘(a*b)/c’. This function never traps when trying to divide by zero; it simply returns + /// ‘MaxInt’ or ‘MinInt’ depending on the signs of ‘a’ and ‘b’. + /// + public static Fixed16Dot16 MultiplyDivide(Fixed16Dot16 a, Fixed16Dot16 b, Fixed16Dot16 c) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_MulDiv((IntPtr)a.Value, (IntPtr)b.Value, (IntPtr)c.Value)); + } + + /// + /// Return the arc-tangent corresponding to a given vector (x,y) in the 2d plane. + /// + /// This is a native FreeType function. + /// The horizontal vector coordinate. + /// The vertical vector coordinate. + /// The arc-tangent value (i.e. angle). + public static Fixed16Dot16 Atan2(Fixed16Dot16 x, Fixed16Dot16 y) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_Atan2((IntPtr)x.Value, (IntPtr)y.Value)); + } + + /// + /// Return the difference between two angles. The result is always constrained to the [-PI..PI] interval. + /// + /// This is a native FreeType function. + /// First angle. + /// Second angle. + /// Constrained value of ‘value2-value1’. + public static Fixed16Dot16 AngleDiff(Fixed16Dot16 angle1, Fixed16Dot16 angle2) + { + return Fixed16Dot16.FromRawValue((int)FT.FT_Angle_Diff((IntPtr)angle1.Value, (IntPtr)angle2.Value)); + } + + #endregion + + #region Operators + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator Fixed16Dot16(short value) + { + return new Fixed16Dot16(value); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static explicit operator Fixed16Dot16(int value) + { + return new Fixed16Dot16(value); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static explicit operator Fixed16Dot16(float value) + { + return new Fixed16Dot16(value); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static explicit operator Fixed16Dot16(double value) + { + return new Fixed16Dot16(value); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static explicit operator Fixed16Dot16(decimal value) + { + return new Fixed16Dot16(value); + } + + /// + /// Casts a to a . + /// + /// + /// This operation can result in a loss of data. + /// + /// A value. + /// The equivalent value. + public static explicit operator int(Fixed16Dot16 value) + { + return value.ToInt32(); + } + + /// + /// Casts a to a . + /// + /// + /// This operation can result in a loss of data. + /// + /// A value. + /// The equivalent value. + public static explicit operator float(Fixed16Dot16 value) + { + return value.ToSingle(); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator double(Fixed16Dot16 value) + { + return value.ToDouble(); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator decimal(Fixed16Dot16 value) + { + return value.ToDecimal(); + } + + /// + /// Adds two 16.16 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the addition. + public static Fixed16Dot16 operator +(Fixed16Dot16 left, Fixed16Dot16 right) + { + return Add(left, right); + } + + /// + /// Subtacts one 16.16 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the subtraction. + public static Fixed16Dot16 operator -(Fixed16Dot16 left, Fixed16Dot16 right) + { + return Subtract(left, right); + } + + /// + /// Multiplies two 16.16 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the multiplication. + public static Fixed16Dot16 operator *(Fixed16Dot16 left, Fixed16Dot16 right) + { + return Multiply(left, right); + } + + /// + /// Divides one 16.16 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the division. + public static Fixed16Dot16 operator /(Fixed16Dot16 left, Fixed16Dot16 right) + { + return Divide(left, right); + } + + /// + /// Compares two instances of for equality. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether the two instances are equal. + public static bool operator ==(Fixed16Dot16 left, Fixed16Dot16 right) + { + return left.Equals(right); + } + + /// + /// Compares two instances of for inequality. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether the two instances are not equal. + public static bool operator !=(Fixed16Dot16 left, Fixed16Dot16 right) + { + return !(left == right); + } + + /// + /// Checks if the left operand is less than the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is less than right. + public static bool operator <(Fixed16Dot16 left, Fixed16Dot16 right) + { + return left.CompareTo(right) < 0; + } + + /// + /// Checks if the left operand is less than or equal to the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is less than or equal to right. + public static bool operator <=(Fixed16Dot16 left, Fixed16Dot16 right) + { + return left.CompareTo(right) <= 0; + } + + /// + /// Checks if the left operand is greater than the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is greater than right. + public static bool operator >(Fixed16Dot16 left, Fixed16Dot16 right) + { + return left.CompareTo(right) > 0; + } + + /// + /// Checks if the left operand is greater than or equal to the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is greater than or equal to right. + public static bool operator >=(Fixed16Dot16 left, Fixed16Dot16 right) + { + return left.CompareTo(right) >= 0; + } + + #endregion + + #region Instance + + /// + /// Removes the decimal part of the value. + /// + /// The truncated number. + public int Floor() + { + return value >> 16; + } + + /// + /// A very simple function used to compute the floor function of a 16.16 fixed number. + /// + /// This is a native FreeType function. + /// The result of ‘a & -0x10000’. + public Fixed16Dot16 FloorFix() + { + //TODO does the P/Invoke overhead make this slower than re-implementing in C#? Test it + return FromRawValue((int)FT.FT_FloorFix((IntPtr)this.Value)); + } + + /// + /// Rounds to the nearest whole number. + /// + /// The nearest whole number. + public int Round() + { + //add 2^15, rounds the integer part up if the decimal value is >= 0.5 + return (value + 32768) >> 16; + } + + /// + /// A very simple function used to round a 16.16 fixed number. + /// + /// This is a native FreeType function. + /// The result of ‘(a + 0x8000) & -0x10000’. + public Fixed16Dot16 RoundFix() + { + return FromRawValue((int)FT.FT_RoundFix((IntPtr)this.Value)); + } + + /// + /// Rounds up to the next whole number. + /// + /// The next whole number. + public int Ceiling() + { + //add 2^16 - 1, rounds the integer part up if there's any decimal value + return (value + 65535) >> 16; + } + + /// + /// A very simple function used to compute the ceiling function of a 16.16 fixed number. + /// + /// This is a native FreeType function. + /// The result of ‘(a + 0x10000 - 1) & -0x10000’. + public Fixed16Dot16 CeilingFix() + { + return FromRawValue((int)FT.FT_CeilFix((IntPtr)this.Value)); + } + + /// + /// Return the sinus of a given angle in fixed point format. + /// + /// + /// NOTE: This is a native FreeType function. + /// + /// If you need both the sinus and cosinus for a given angle, use the function . + /// + /// The sinus value. + public Fixed16Dot16 Sin() + { + return Fixed16Dot16.FromRawValue((int)FT.FT_Sin((IntPtr)this.Value)); + } + + /// + /// Return the cosinus of a given angle in fixed point format. + /// + /// + /// NOTE: This is a native FreeType function. + /// + /// If you need both the sinus and cosinus for a given angle, use the function . + /// + /// The cosinus value. + public Fixed16Dot16 Cos() + { + return Fixed16Dot16.FromRawValue((int)FT.FT_Cos((IntPtr)this.Value)); + } + + /// + /// Return the tangent of a given angle in fixed point format. + /// + /// This is a native FreeType function. + /// The tangent value. + public Fixed16Dot16 Tan() + { + return Fixed16Dot16.FromRawValue((int)FT.FT_Tan((IntPtr)this.Value)); + } + + /// + /// Converts the value to a . The value is floored. + /// + /// An integer value. + public int ToInt32() + { + return Floor(); + } + + /// + /// Converts the value to a . + /// + /// A floating-point value. + public float ToSingle() + { + return value / 65536f; + } + + /// + /// Converts the value to a . + /// + /// A floating-point value. + public double ToDouble() + { + return value / 65536d; + } + + /// + /// Converts the value to a . + /// + /// A decimal value. + public decimal ToDecimal() + { + return value / 65536m; + } + + /// + /// Compares this instance to another for equality. + /// + /// A . + /// A value indicating whether the two instances are equal. + public bool Equals(Fixed16Dot16 other) + { + return value == other.value; + } + + /// + /// Compares this instnace with another and returns an integer that indicates + /// whether the current instance precedes, follows, or occurs in the same position in the sort order as the + /// other . + /// + /// A . + /// A value indicating the relative order of the instances. + public int CompareTo(Fixed16Dot16 other) + { + return value.CompareTo(other.value); + } + + #endregion + + #region Overrides + + /// + /// Returns a string that represents the current object. + /// + /// An object that supplies culture-specific formatting information. + /// A string that represents the current object. + public string ToString(IFormatProvider provider) + { + return ToDecimal().ToString(provider); + } + + /// + /// Returns a string that represents the current object. + /// + /// A numeric format string. + /// A string that represents the current object. + public string ToString(string format) + { + return ToDecimal().ToString(format); + } + + /// + /// Returns a string that represents the current object. + /// + /// A numeric format string. + /// An object that supplies culture-specific formatting information. + /// A string that represents the current object. + public string ToString(string format, IFormatProvider provider) + { + return ToDecimal().ToString(format, provider); + } + + /// + /// Returns a string that represents the current object. + /// + /// A string that represents the current object. + public override string ToString() + { + return ToDecimal().ToString(); + } + + /// + /// Calculates a hash code for the current object. + /// + /// A hash code for the current object. + public override int GetHashCode() + { + return value.GetHashCode(); + } + + /// + /// Determines whether the specified object isequal to the current object. + /// + /// The object to compare with the current object. + /// A value indicating equality between the two objects. + public override bool Equals(object obj) + { + if (obj is Fixed16Dot16) + return this.Equals((Fixed16Dot16)obj); + else if (obj is int) + return value == ((Fixed16Dot16)obj).value; + else + return false; + } + + #endregion + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Fixed26Dot6.cs b/SharpFont/Source/SharpFontShared/Fixed26Dot6.cs new file mode 100644 index 000000000..a83e21bfa --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Fixed26Dot6.cs @@ -0,0 +1,579 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015-2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont +{ + /// + /// Represents a fixed-point decimal value with 6 bits of decimal precision. + /// + [StructLayout(LayoutKind.Sequential)] + public struct Fixed26Dot6 : IEquatable, IComparable + { + #region Fields + + /// + /// The raw 26.6 integer. + /// + private int value; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// An integer value. + public Fixed26Dot6(int value) + { + this.value = value << 6; + } + + /// + /// Initializes a new instance of the struct. + /// + /// A floating point value. + public Fixed26Dot6(float value) + { + this.value = (int)(value * 64); + } + + /// + /// Initializes a new instance of the struct. + /// + /// A floating point value. + public Fixed26Dot6(double value) + { + this.value = (int)(value * 64); + } + + /// + /// Initializes a new instance of the struct. + /// + /// A floating point value. + public Fixed26Dot6(decimal value) + { + this.value = (int)(value * 64); + } + + #endregion + + #region Properties + + /// + /// Gets the raw 26.6 integer. + /// + public int Value + { + get + { + return value; + } + } + + #endregion + + #region Methods + + #region Static + + /// + /// Creates a from an int containing a 26.6 value. + /// + /// A 26.6 value. + /// An instance of . + public static Fixed26Dot6 FromRawValue(int value) + { + Fixed26Dot6 f = new Fixed26Dot6(); + f.value = value; + return f; + } + + /// + /// Creates a new from a + /// + /// A value. + /// The equivalent value. + public static Fixed26Dot6 FromInt32(int value) + { + return new Fixed26Dot6(value); + } + + /// + /// Creates a new from . + /// + /// A floating-point value. + /// A fixed 26.6 value. + public static Fixed26Dot6 FromSingle(float value) + { + return new Fixed26Dot6(value); + } + + /// + /// Creates a new from a . + /// + /// A floating-point value. + /// A fixed 26.6 value. + public static Fixed26Dot6 FromDouble(double value) + { + return new Fixed26Dot6(value); + } + + /// + /// Creates a new from a . + /// + /// A floating-point value. + /// A fixed 26.6 value. + public static Fixed26Dot6 FromDecimal(decimal value) + { + return new Fixed26Dot6(value); + } + + /// + /// Adds two 26.6 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the addition. + public static Fixed26Dot6 Add(Fixed26Dot6 left, Fixed26Dot6 right) + { + return Fixed26Dot6.FromRawValue(left.value + right.value); + } + + /// + /// Subtacts one 26.6 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the subtraction. + public static Fixed26Dot6 Subtract(Fixed26Dot6 left, Fixed26Dot6 right) + { + return Fixed26Dot6.FromRawValue(left.value - right.value); + } + + /// + /// Multiplies two 26.6 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the multiplication. + public static Fixed26Dot6 Multiply(Fixed26Dot6 left, Fixed26Dot6 right) + { + long mul = (long)left.value * (long)right.value; + Fixed26Dot6 ans = new Fixed26Dot6(); + ans.value = (int)(mul >> 6); + return ans; + } + + /// + /// Divides one 26.6 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the division. + public static Fixed26Dot6 Divide(Fixed26Dot6 left, Fixed26Dot6 right) + { + long div = ((long)left.Value << 6) / right.value; + Fixed26Dot6 ans = new Fixed26Dot6(); + ans.value = (int)div; + return ans; + } + + #endregion + + #region Operators + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator Fixed26Dot6(short value) + { + return new Fixed26Dot6(value); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator Fixed26Dot6(int value) + { + return new Fixed26Dot6(value); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator Fixed26Dot6(float value) + { + return new Fixed26Dot6(value); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator Fixed26Dot6(double value) + { + return new Fixed26Dot6(value); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator Fixed26Dot6(decimal value) + { + return new Fixed26Dot6(value); + } + + /// + /// Casts a to a . + /// + /// + /// This operation can result in a loss of data. + /// + /// A value. + /// The equivalent value. + public static explicit operator int(Fixed26Dot6 value) + { + return value.ToInt32(); + } + + /// + /// Casts a to a . + /// + /// + /// This operation can result in a loss of data. + /// + /// A value. + /// The equivalent value. + public static explicit operator float(Fixed26Dot6 value) + { + return value.ToSingle(); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator double(Fixed26Dot6 value) + { + return value.ToDouble(); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator decimal(Fixed26Dot6 value) + { + return value.ToDecimal(); + } + + /// + /// Adds two 26.6 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the addition. + public static Fixed26Dot6 operator +(Fixed26Dot6 left, Fixed26Dot6 right) + { + return Add(left, right); + } + + /// + /// Subtacts one 26.6 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the subtraction. + public static Fixed26Dot6 operator -(Fixed26Dot6 left, Fixed26Dot6 right) + { + return Subtract(left, right); + } + + /// + /// Multiplies two 26.6 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the multiplication. + public static Fixed26Dot6 operator *(Fixed26Dot6 left, Fixed26Dot6 right) + { + return Multiply(left, right); + } + + /// + /// Divides one 26.6 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the division. + public static Fixed26Dot6 operator /(Fixed26Dot6 left, Fixed26Dot6 right) + { + return Divide(left, right); + } + + /// + /// Compares two instances of for equality. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether the two instances are equal. + public static bool operator ==(Fixed26Dot6 left, Fixed26Dot6 right) + { + return left.Equals(right); + } + + /// + /// Compares two instances of for inequality. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether the two instances are not equal. + public static bool operator !=(Fixed26Dot6 left, Fixed26Dot6 right) + { + return !(left == right); + } + + /// + /// Checks if the left operand is less than the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is less than right. + public static bool operator <(Fixed26Dot6 left, Fixed26Dot6 right) + { + return left.CompareTo(right) < 0; + } + + /// + /// Checks if the left operand is less than or equal to the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is less than or equal to right. + public static bool operator <=(Fixed26Dot6 left, Fixed26Dot6 right) + { + return left.CompareTo(right) <= 0; + } + + /// + /// Checks if the left operand is greater than the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is greater than right. + public static bool operator >(Fixed26Dot6 left, Fixed26Dot6 right) + { + return left.CompareTo(right) > 0; + } + + /// + /// Checks if the left operand is greater than or equal to the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is greater than or equal to right. + public static bool operator >=(Fixed26Dot6 left, Fixed26Dot6 right) + { + return left.CompareTo(right) >= 0; + } + + #endregion + + #region Instance + + /// + /// Removes the decimal part of the value. + /// + /// The truncated number. + public int Floor() + { + return value >> 6; + } + + /// + /// Rounds to the nearest whole number. + /// + /// The nearest whole number. + public int Round() + { + //add 2^5, rounds the integer part up if the decimal value is >= 0.5 + return (value + 32) >> 6; + } + + /// + /// Rounds up to the next whole number. + /// + /// The next whole number. + public int Ceiling() + { + //add 2^6 - 1, rounds the integer part up if there's any decimal value + return (value + 63) >> 6; + } + + /// + /// Converts the value to a . The value is floored. + /// + /// An integer value. + public int ToInt32() + { + return Floor(); + } + + /// + /// Converts the value to a . + /// + /// A floating-point value. + public float ToSingle() + { + return value / 64f; + } + + /// + /// Converts the value to a . + /// + /// A floating-point value. + public double ToDouble() + { + return value / 64d; + } + + /// + /// Converts the value to a . + /// + /// A decimal value. + public decimal ToDecimal() + { + return value / 64m; + } + + /// + /// Compares this instance to another for equality. + /// + /// A . + /// A value indicating whether the two instances are equal. + public bool Equals(Fixed26Dot6 other) + { + return value == other.value; + } + + /// + /// Compares this instnace with another and returns an integer that indicates + /// whether the current instance precedes, follows, or occurs in the same position in the sort order as the + /// other . + /// + /// A . + /// A value indicating the relative order of the instances. + public int CompareTo(Fixed26Dot6 other) + { + return value.CompareTo(other.value); + } + + #endregion + + #region Overrides + + /// + /// Returns a string that represents the current object. + /// + /// An object that supplies culture-specific formatting information. + /// A string that represents the current object. + public string ToString(IFormatProvider provider) + { + return ToDecimal().ToString(provider); + } + + /// + /// Returns a string that represents the current object. + /// + /// A numeric format string. + /// A string that represents the current object. + public string ToString(string format) + { + return ToDecimal().ToString(format); + } + + /// + /// Returns a string that represents the current object. + /// + /// A numeric format string. + /// An object that supplies culture-specific formatting information. + /// A string that represents the current object. + public string ToString(string format, IFormatProvider provider) + { + return ToDecimal().ToString(format, provider); + } + + /// + /// Returns a string that represents the current object. + /// + /// A string that represents the current object. + public override string ToString() + { + return ToDecimal().ToString(); + } + + /// + /// Calculates a hash code for the current object. + /// + /// A hash code for the current object. + public override int GetHashCode() + { + return value.GetHashCode(); + } + + /// + /// Determines whether the specified object isequal to the current object. + /// + /// The object to compare with the current object. + /// A value indicating equality between the two objects. + public override bool Equals(object obj) + { + if (obj is Fixed26Dot6) + return this.Equals((Fixed26Dot6)obj); + else if (obj is int) + return value == ((Fixed26Dot6)obj).value; + else + return false; + } + + #endregion + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Fixed2Dot14.cs b/SharpFont/Source/SharpFontShared/Fixed2Dot14.cs new file mode 100644 index 000000000..75460763f --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Fixed2Dot14.cs @@ -0,0 +1,546 @@ +#region MIT License +/*Copyright (c) 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont +{ + /// + /// Represents a fixed-point decimal value with 14 bits of decimal precision. + /// + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct Fixed2Dot14 : IEquatable, IComparable + { + #region Fields + + /// + /// The raw 2.14 short. + /// + private short value; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the struct. + /// + /// An integer value. + public Fixed2Dot14(short value) + { + this.value = (short)(value << 14); + } + + /// + /// Initializes a new instance of the struct. + /// + /// A floating point value. + public Fixed2Dot14(float value) + { + this.value = (short)(value * 16384); + } + + /// + /// Initializes a new instance of the struct. + /// + /// A floating point value. + public Fixed2Dot14(double value) + { + this.value = (short)(value * 16384); + } + + /// + /// Initializes a new instance of the struct. + /// + /// A floating point value. + public Fixed2Dot14(decimal value) + { + this.value = (short)(value * 16384); + } + + #endregion + + #region Properties + + /// + /// Gets the raw 2.14 integer. + /// + public int Value + { + get + { + return value; + } + } + + #endregion + + #region Methods + + #region Static + + /// + /// Creates a from an int containing a 2.14 value. + /// + /// A 2.14 value. + /// An instance of . + public static Fixed2Dot14 FromRawValue(short value) + { + Fixed2Dot14 f = new Fixed2Dot14(); + f.value = value; + return f; + } + + /// + /// Creates a new from a + /// + /// A value. + /// The equivalent value. + public static Fixed2Dot14 FromInt16(short value) + { + return new Fixed2Dot14(value); + } + + /// + /// Creates a new from . + /// + /// A floating-point value. + /// A fixed 2.14 value. + public static Fixed2Dot14 FromSingle(float value) + { + return new Fixed2Dot14(value); + } + + /// + /// Creates a new from . + /// + /// A floating-point value. + /// A fixed 2.14 value. + public static Fixed2Dot14 FromDouble(double value) + { + return new Fixed2Dot14(value); + } + + /// + /// Creates a new from . + /// + /// A floating-point value. + /// A fixed 2.14 value. + public static Fixed2Dot14 FromDecimal(decimal value) + { + return new Fixed2Dot14(value); + } + + /// + /// Adds two 2.14 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the addition. + public static Fixed2Dot14 Add(Fixed2Dot14 left, Fixed2Dot14 right) + { + return Fixed2Dot14.FromRawValue((short)(left.value + right.value)); + } + + /// + /// Subtacts one 2.14 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the subtraction. + public static Fixed2Dot14 Subtract(Fixed2Dot14 left, Fixed2Dot14 right) + { + return Fixed2Dot14.FromRawValue((short)(left.value - right.value)); + } + + /// + /// Multiplies two 2.14 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the multiplication. + public static Fixed2Dot14 Multiply(Fixed2Dot14 left, Fixed2Dot14 right) + { + int mul = (int)left.value * (int)right.value; + Fixed2Dot14 ans; + ans.value = (short)(mul >> 14); + return ans; + } + + /// + /// Divides one 2.14 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the division. + public static Fixed2Dot14 Divide(Fixed2Dot14 left, Fixed2Dot14 right) + { + int div = ((int)left.Value << 6) / right.value; + Fixed2Dot14 ans; + ans.value = (short)div; + return ans; + } + + #endregion + + #region Operators + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static explicit operator Fixed2Dot14(float value) + { + return new Fixed2Dot14(value); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static explicit operator Fixed2Dot14(double value) + { + return new Fixed2Dot14(value); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static explicit operator Fixed2Dot14(decimal value) + { + return new Fixed2Dot14(value); + } + + /// + /// Casts a to a . + /// + /// + /// This operation can result in a loss of data. + /// + /// A value. + /// The equivalent value. + public static explicit operator float(Fixed2Dot14 value) + { + return value.ToSingle(); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator double(Fixed2Dot14 value) + { + return value.ToDouble(); + } + + /// + /// Casts a to a . + /// + /// A value. + /// The equivalent value. + public static implicit operator decimal(Fixed2Dot14 value) + { + return value.ToDecimal(); + } + + /// + /// Adds two 2.14 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the addition. + public static Fixed2Dot14 operator +(Fixed2Dot14 left, Fixed2Dot14 right) + { + return Add(left, right); + } + + /// + /// Subtacts one 2.14 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the subtraction. + public static Fixed2Dot14 operator -(Fixed2Dot14 left, Fixed2Dot14 right) + { + return Subtract(left, right); + } + + /// + /// Multiplies two 2.14 values together. + /// + /// The left operand. + /// The right operand. + /// The result of the multiplication. + public static Fixed2Dot14 operator *(Fixed2Dot14 left, Fixed2Dot14 right) + { + return Multiply(left, right); + } + + /// + /// Divides one 2.14 values from another. + /// + /// The left operand. + /// The right operand. + /// The result of the division. + public static Fixed2Dot14 operator /(Fixed2Dot14 left, Fixed2Dot14 right) + { + return Divide(left, right); + } + + /// + /// Compares two instances of for equality. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether the two instances are equal. + public static bool operator ==(Fixed2Dot14 left, Fixed2Dot14 right) + { + return left.Equals(right); + } + + /// + /// Compares two instances of for inequality. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether the two instances are not equal. + public static bool operator !=(Fixed2Dot14 left, Fixed2Dot14 right) + { + return !(left == right); + } + + /// + /// Checks if the left operand is less than the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is less than right. + public static bool operator <(Fixed2Dot14 left, Fixed2Dot14 right) + { + return left.CompareTo(right) < 0; + } + + /// + /// Checks if the left operand is less than or equal to the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is less than or equal to right. + public static bool operator <=(Fixed2Dot14 left, Fixed2Dot14 right) + { + return left.CompareTo(right) <= 0; + } + + /// + /// Checks if the left operand is greater than the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is greater than right. + public static bool operator >(Fixed2Dot14 left, Fixed2Dot14 right) + { + return left.CompareTo(right) > 0; + } + + /// + /// Checks if the left operand is greater than or equal to the right operand. + /// + /// The left operand. + /// The right operand. + /// A value indicating whether left is greater than or equal to right. + public static bool operator >=(Fixed2Dot14 left, Fixed2Dot14 right) + { + return left.CompareTo(right) >= 0; + } + + #endregion + + #region Instance + + /// + /// Removes the decimal part of the value. + /// + /// The truncated number. + public short Floor() + { + return (short)(value >> 14); + } + + /// + /// Rounds to the nearest whole number. + /// + /// The nearest whole number. + public short Round() + { + //add 2^13, rounds the integer part up if the decimal value is >= 0.5 + return (short)((value + 8192) >> 14); + } + + /// + /// Rounds up to the next whole number. + /// + /// The next whole number. + public short Ceiling() + { + //add 2^14 - 1, rounds the integer part up if there's any decimal value + return (short)((value + 16383) >> 14); + } + + /// + /// Converts the value to a . The value is floored. + /// + /// An integer value. + public short ToInt16() + { + return Floor(); + } + + /// + /// Converts the value to a . + /// + /// A floating-point value. + public float ToSingle() + { + return value / 16384f; + } + + /// + /// Converts the value to a . + /// + /// A floating-point value. + public double ToDouble() + { + return value / 16384d; + } + + /// + /// Converts the value to a . + /// + /// A decimal value. + public decimal ToDecimal() + { + return value / 16384m; + } + + /// + /// Compares this instance to another for equality. + /// + /// A . + /// A value indicating whether the two instances are equal. + public bool Equals(Fixed2Dot14 other) + { + return value == other.value; + } + + /// + /// Compares this instnace with another and returns an integer that indicates + /// whether the current instance precedes, follows, or occurs in the same position in the sort order as the + /// other . + /// + /// A . + /// A value indicating the relative order of the instances. + public int CompareTo(Fixed2Dot14 other) + { + return value.CompareTo(other.value); + } + + #endregion + + #region Overrides + + /// + /// Returns a string that represents the current object. + /// + /// An object that supplies culture-specific formatting information. + /// A string that represents the current object. + public string ToString(IFormatProvider provider) + { + return ToDecimal().ToString(provider); + } + + /// + /// Returns a string that represents the current object. + /// + /// A numeric format string. + /// A string that represents the current object. + public string ToString(string format) + { + return ToDecimal().ToString(format); + } + + /// + /// Returns a string that represents the current object. + /// + /// A numeric format string. + /// An object that supplies culture-specific formatting information. + /// A string that represents the current object. + public string ToString(string format, IFormatProvider provider) + { + return ToDecimal().ToString(format, provider); + } + + /// + /// Returns a string that represents the current object. + /// + /// A string that represents the current object. + public override string ToString() + { + return ToDecimal().ToString(); + } + + /// + /// Calculates a hash code for the current object. + /// + /// A hash code for the current object. + public override int GetHashCode() + { + return value.GetHashCode(); + } + + /// + /// Determines whether the specified object isequal to the current object. + /// + /// The object to compare with the current object. + /// A value indicating equality between the two objects. + public override bool Equals(object obj) + { + if (obj is Fixed2Dot14) + return this.Equals((Fixed2Dot14)obj); + else if (obj is int) + return value == ((Fixed2Dot14)obj).value; + else + return false; + } + + #endregion + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Fnt/Header.cs b/SharpFont/Source/SharpFontShared/Fnt/Header.cs new file mode 100644 index 000000000..2f6f67a41 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Fnt/Header.cs @@ -0,0 +1,594 @@ +#region MIT License +/*Copyright (c) 2012-2014 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Linq; + +using SharpFont.Fnt.Internal; + +namespace SharpFont.Fnt +{ + /// + /// Describes the general appearance of the font. + /// + public enum Family + { + /// + /// Don't care or don't know which family. + /// + DontCare = 0, + + /// + /// The font has a Roman appearance. + /// + Roman = 1, + + /// + /// The font has a Swiss appearance. + /// + Swiss = 2, + + /// + /// The font has a Modern appearance. + /// + Modern = 3, + + /// + /// The font has a script-like appearance. + /// + Script = 4, + + /// + /// The font is decorative. + /// + Decorative = 5 + } + + /// + /// Provides flags for font proportions and color. + /// + [Flags] + [CLSCompliant(false)] + public enum Flags : ushort + { + /// + /// Font is fixed. + /// + Fixed = 1 << 0, + + /// + /// Font is proportional. + /// + Proportional = 1 << 1, + + /// + /// Font is ABC fixed. + /// + AbcFixed = 1 << 2, + + /// + /// Font is ABC proportional. + /// + AbcProportional = 1 << 3, + + /// + /// Font is 2-bit color. + /// + Color1 = 1 << 4, + + /// + /// Font is 4-bit color. + /// + Color16 = 1 << 5, + + /// + /// Font is 8-bit color. + /// + Color256 = 1 << 6, + + /// + /// Font is RGB color. + /// + RgbColor = 1 << 7 + } + + /// + /// Windows FNT Header info. + /// + public class Header + { + #region Fields + + private IntPtr reference; + private HeaderRec rec; + + #endregion + + #region Constructors + + internal Header(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the version format of the file (e.g. 0x0200). + /// + [CLSCompliant(false)] + public ushort Version + { + get + { + return rec.version; + } + } + + /// + /// Gets the size of the file in bytes. + /// + [CLSCompliant(false)] + public uint FileSize + { + get + { + return (uint)rec.file_size; + } + } + + /// + /// Gets the copyright text. + /// Limited to 60 bytes. + /// + public byte[] Copyright + { + get + { + return rec.copyright; + } + } + + /// + /// Gets the filetype (vector or bitmap). This is exclusively for GDI use. + /// + [CLSCompliant(false)] + public ushort FileType + { + get + { + return rec.file_type; + } + } + + /// + /// Gets the nominal point size determined by the designer at which the font looks + /// best. + /// + [CLSCompliant(false)] + public ushort NominalPointSize + { + get + { + return rec.nominal_point_size; + } + } + + /// + /// Gets the nominal vertical resolution in dots per inch. + /// + [CLSCompliant(false)] + public ushort VerticalResolution + { + get + { + return rec.vertical_resolution; + } + } + + /// + /// Gets the nominal horizontal resolution in dots per inch. + /// + [CLSCompliant(false)] + public ushort HorizontalResolution + { + get + { + return rec.horizontal_resolution; + } + } + + /// + /// Gets the height of the font's ascent from the baseline. + /// + [CLSCompliant(false)] + public ushort Ascent + { + get + { + return rec.ascent; + } + } + + /// + /// Gets the amount of leading inside the bounds of . + /// + [CLSCompliant(false)] + public ushort InternalLeading + { + get + { + return rec.internal_leading; + } + } + + /// + /// Gets the amount of leading the designer recommends to be added between + /// rows. + /// + [CLSCompliant(false)] + public ushort ExternalLeading + { + get + { + return rec.external_leading; + } + } + + /// + /// Gets whether the font is italic. + /// + public bool Italic + { + get + { + return (0x01 & rec.italic) == 0x01; + } + } + + /// + /// Ges whether the font includes underlining. + /// + public bool Underline + { + get + { + return (0x01 & rec.underline) == 0x01; + } + } + + /// + /// Ges whether the font includes strikeout. + /// + public bool Strikeout + { + get + { + return (0x01 & rec.strike_out) == 0x01; + } + } + + /// + /// Gets the weight of characters on a scale of 1 to 1000, with + /// 400 being regular weight. + /// + [CLSCompliant(false)] + public ushort Weight + { + get + { + return rec.weight; + } + } + + /// + /// Gets the character set specified by the font. + /// + public byte Charset + { + get + { + return rec.charset; + } + } + + /// + /// Gets the width of the vector grid (vector fonts). For raster fonts, + /// a zero value indicates that characters have variables widths, + /// otherwise, the value is the width of the bitmap for all characters. + /// + [CLSCompliant(false)] + public ushort PixelWidth + { + get + { + return rec.pixel_width; + } + } + + /// + /// Gets the height of the vector grid (vector fonts) or the height + /// of the bitmap for all characters (raster fonts). + /// + [CLSCompliant(false)] + public ushort PixelHeight + { + get + { + return rec.pixel_height; + } + } + + /// + /// Gets whether the font is variable pitch. + /// + public byte PitchAndFamily + { + get + { + return rec.pitch_and_family; + } + } + + /// + /// Gets the width of characters in the font, based on the width of 'X'. + /// + [CLSCompliant(false)] + public ushort AverageWidth + { + get + { + return rec.avg_width; + } + } + + /// + /// Gets the maximum width of all characters in the font. + /// + [CLSCompliant(false)] + public ushort MaximumWidth + { + get + { + return rec.max_width; + } + } + + /// + /// Gets the first character code specified in the font. + /// + public byte FirstChar + { + get + { + return rec.first_char; + } + } + + /// + /// Gets the last character code specified in the font. + /// + public byte LastChar + { + get + { + return rec.last_char; + } + } + + /// + /// Gets the character to substitute when a character is needed that + /// isn't defined in the font. + /// + public byte DefaultChar + { + get + { + return rec.default_char; + } + } + + /// + /// Gets the character that defines word breaks, for purposes of word + /// wrapping and word spacing justification. This value is relative to + /// the , so the character code is this value + /// minus . + /// + public byte BreakChar + { + get + { + return rec.break_char; + } + } + + /// + /// Gets the number of bytes in each row of the bitmap (raster fonts). + /// + [CLSCompliant(false)] + public ushort BytesPerRow + { + get + { + return rec.bytes_per_row; + } + } + + /// + /// Gets the offset in the file, in bytes, to the string that gives the device name. + /// The value is 0 for generic fonts. + /// + [CLSCompliant(false)] + public uint DeviceOffset + { + get + { + return (uint)rec.device_offset; + } + } + + /// + /// Gets the offset in the file, in bytes, to the string that gives the face name + /// (null-terminated). + /// + [CLSCompliant(false)] + public uint FaceNameOffset + { + get + { + return (uint)rec.face_name_offset; + } + } + + /// + /// Gets the absolute machine address of the bitmap, + /// which is set by GDI at load time. + /// + [CLSCompliant(false)] + public uint BitsPointer + { + get + { + return (uint)rec.bits_pointer; + } + } + + /// + /// Gets the offset in the file, in bytes, to the beginning of the character data + /// (raster or vector). + /// + [CLSCompliant(false)] + public uint BitsOffset + { + get + { + return (uint)rec.bits_offset; + } + } + + /// + /// Reservied. + /// + public byte Reserved + { + get + { + return rec.reserved; + } + } + + /// + /// Gets that describe font proportion and color. + /// + [CLSCompliant(false)] + public Flags Flags + { + get + { + return (Flags)rec.flags; + } + } + + /// + /// ASpace has not been used since before Windows 3.0. + /// Set it to 0 for compatibility. + /// + [CLSCompliant(false)] + public ushort ASpace + { + get + { + return rec.A_space; + } + } + + /// + /// BSpace has not been used since before Windows 3.0. + /// Set it to 0 for compatibility. + /// + [CLSCompliant(false)] + public ushort BSpace + { + get + { + return rec.B_space; + } + } + + /// + /// CSpace has not been used since before Windows 3.0. + /// Set it to 0 for compatibility. + /// + [CLSCompliant(false)] + public ushort CSpace + { + get + { + return rec.C_space; + } + } + + /// + /// Gets the offset of the color table. + /// + [CLSCompliant(false)] + public ushort ColorTableOffset + { + get + { + return rec.color_table_offset; + } + } + + /// + /// This field is reserved. + /// + [CLSCompliant(false)] + public uint[] Reserved1 + { + get + { + return rec.reserved1.Select(x => (uint) x).ToArray(); + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Fnt/Internal/HeaderRec.cs b/SharpFont/Source/SharpFontShared/Fnt/Internal/HeaderRec.cs new file mode 100644 index 000000000..7ea86c587 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Fnt/Internal/HeaderRec.cs @@ -0,0 +1,77 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Fnt.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct HeaderRec + { + internal ushort version; + internal FT_ULong file_size; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 60)] + internal byte[] copyright; + internal ushort file_type; + internal ushort nominal_point_size; + internal ushort vertical_resolution; + internal ushort horizontal_resolution; + internal ushort ascent; + internal ushort internal_leading; + internal ushort external_leading; + internal byte italic; + internal byte underline; + internal byte strike_out; + internal ushort weight; + internal byte charset; + internal ushort pixel_width; + internal ushort pixel_height; + internal byte pitch_and_family; + internal ushort avg_width; + internal ushort max_width; + internal byte first_char; + internal byte last_char; + internal byte default_char; + internal byte break_char; + internal ushort bytes_per_row; + internal FT_ULong device_offset; + internal FT_ULong face_name_offset; + internal FT_ULong bits_pointer; + internal FT_ULong bits_offset; + internal byte reserved; + internal FT_ULong flags; + internal ushort A_space; + internal ushort B_space; + internal ushort C_space; + internal ushort color_table_offset; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + internal FT_ULong[] reserved1; + } +} diff --git a/SharpFont/Source/SharpFontShared/Fnt/WinFntID.cs b/SharpFont/Source/SharpFontShared/Fnt/WinFntID.cs new file mode 100644 index 000000000..c26c6693f --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Fnt/WinFntID.cs @@ -0,0 +1,148 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.Fnt +{ + /// + /// A list of valid values for the ‘charset’ byte in . Exact mapping tables for the various + /// cpXXXX encodings (except for cp1361) can be found at in the + /// MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is roughly a superset of + /// MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT. + /// + public enum WinFntId : byte + { + /// + /// ANSI encoding. A superset of ISO 8859-1. + /// + CP1252 = 0, + + /// + /// This is used for font enumeration and font creation as a ‘don't care’ value. Valid font files don't contain + /// this value. When querying for information about the character set of the font that is currently selected + /// into a specified device context, this return value (of the related Windows API) simply denotes failure. + /// + Default = 1, + + /// + /// There is no known mapping table available. + /// + Symbol = 2, + + /// + /// Mac Roman encoding. + /// + Mac = 77, + + /// + /// A superset of Japanese Shift-JIS (with minor deviations). + /// + CP932 = 128, + + /// + /// A superset of Korean Hangul KS C 5601-1987 (with different ordering and minor deviations). + /// + CP949 = 129, + + /// + /// Korean (Johab). + /// + CP1361 = 130, + + /// + /// A superset of simplified Chinese GB 2312-1980 (with different ordering and minor deviations). + /// + CP936 = 134, + + /// + /// A superset of traditional Chinese Big 5 ETen (with different ordering and minor deviations). + /// + CP950 = 136, + + /// + /// A superset of Greek ISO 8859-7 (with minor modifications). + /// + CP1253 = 161, + + /// + /// A superset of Turkish ISO 8859-9. + /// + CP1254 = 162, + + /// + /// For Vietnamese. This encoding doesn't cover all necessary characters. + /// + CP1258 = 163, + + /// + /// A superset of Hebrew ISO 8859-8 (with some modifications). + /// + CP1255 = 177, + + /// + /// A superset of Arabic ISO 8859-6 (with different ordering). + /// + CP1256 = 178, + + /// + /// A superset of Baltic ISO 8859-13 (with some deviations). + /// + CP1257 = 186, + + /// + /// A superset of Russian ISO 8859-5 (with different ordering). + /// + CP1251 = 204, + + /// + /// A superset of Thai TIS 620 and ISO 8859-11. + /// + CP874 = 222, + + /// + /// A superset of East European ISO 8859-2 (with slightly different ordering). + /// + CP1250 = 238, + + /// + /// From Michael Pöttgen <michael@poettgen.de>: + /// The ‘Windows Font Mapping’ article says that is used for the charset of vector + /// fonts, like ‘modern.fon’, ‘roman.fon’, and ‘script.fon’ on Windows. + /// + /// The ‘CreateFont’ documentation says: The value specifies a character set that is + /// operating-system dependent. + /// + /// The ‘IFIMETRICS’ documentation from the ‘Windows Driver Development Kit’ says: This font supports an + /// OEM-specific character set. The OEM character set is system dependent. + /// + /// In general OEM, as opposed to ANSI (i.e., cp1252), denotes the second default codepage that most + /// international versions of Windows have. It is one of the OEM codepages from + /// , and is used for the ‘DOS boxes’, to + /// support legacy applications. A German Windows version for example usually uses ANSI codepage 1252 and OEM + /// codepage 850. + /// + Oem = 255 + } +} diff --git a/SharpFont/Source/SharpFontShared/FreeTypeException.cs b/SharpFont/Source/SharpFontShared/FreeTypeException.cs new file mode 100644 index 000000000..ea10a4a93 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/FreeTypeException.cs @@ -0,0 +1,153 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// An exception that gets thrown when FreeType returns an error code. + /// + public class FreeTypeException : Exception + { + private Error error; + + /// + /// Initializes a new instance of the class. + /// + /// The error returned by FreeType. + public FreeTypeException(Error error) + : base("FreeType error: " + GetErrorMessage(error)) + { + this.error = error; + } + + /// + /// Gets the FreeType error code that caused the exception. + /// + public Error Error + { + get + { + return this.error; + } + } + + private static string GetErrorMessage(Error err) + { + switch (err) + { + case Error.Ok: return "No error."; + case Error.CannotOpenResource: return "Cannot open resource."; + case Error.UnknownFileFormat: return "Unknown file format."; + case Error.InvalidFileFormat: return "Broken file."; + case Error.InvalidVersion: return "Invalid FreeType version."; + case Error.LowerModuleVersion: return "Module version is too low."; + case Error.InvalidArgument: return "Invalid argument."; + case Error.UnimplementedFeature: return "Unimplemented feature."; + case Error.InvalidTable: return "Broken table."; + case Error.InvalidOffset: return "Broken offset within table."; + case Error.ArrayTooLarge: return "Array allocation size too large."; + case Error.InvalidGlyphIndex: return "Invalid glyph index."; + case Error.InvalidCharacterCode: return "Invalid character code."; + case Error.InvalidGlyphFormat: return "Unsupported glyph image format."; + case Error.CannotRenderGlyph: return "Cannot render this glyph format."; + case Error.InvalidOutline: return "Invalid outline."; + case Error.InvalidComposite: return "Invalid composite glyph."; + case Error.TooManyHints: return "Too many hints."; + case Error.InvalidPixelSize: return "Invalid pixel size."; + case Error.InvalidHandle: return "Invalid object handle."; + case Error.InvalidLibraryHandle: return "Invalid library handle."; + case Error.InvalidDriverHandle: return "Invalid module handle."; + case Error.InvalidFaceHandle: return "Invalid face handle."; + case Error.InvalidSizeHandle: return "Invalid size handle."; + case Error.InvalidSlotHandle: return "Invalid glyph slot handle."; + case Error.InvalidCharMapHandle: return "Invalid charmap handle."; + case Error.InvalidCacheHandle: return "Invalid cache manager handle."; + case Error.InvalidStreamHandle: return "Invalid stream handle."; + case Error.TooManyDrivers: return "Too many modules."; + case Error.TooManyExtensions: return "Too many extensions."; + case Error.OutOfMemory: return "Out of memory."; + case Error.UnlistedObject: return "Unlisted object."; + case Error.CannotOpenStream: return "Cannot open stream."; + case Error.InvalidStreamSeek: return "Invalid stream seek."; + case Error.InvalidStreamSkip: return "Invalid stream skip."; + case Error.InvalidStreamRead: return "Invalid stream read."; + case Error.InvalidStreamOperation: return "Invalid stream operation."; + case Error.InvalidFrameOperation: return "Invalid frame operation."; + case Error.NestedFrameAccess: return "Nested frame access."; + case Error.InvalidFrameRead: return "Invalid frame read."; + case Error.RasterUninitialized: return "Raster uninitialized."; + case Error.RasterCorrupted: return "Raster corrupted."; + case Error.RasterOverflow: return "Raster overflow."; + case Error.RasterNegativeHeight: return "Negative height while rastering."; + case Error.TooManyCaches: return "Too many registered caches."; + case Error.InvalidOpCode: return "Invalid opcode."; + case Error.TooFewArguments: return "Too few arguments."; + case Error.StackOverflow: return "Stack overflow."; + case Error.CodeOverflow: return "Code overflow."; + case Error.BadArgument: return "Bad argument."; + case Error.DivideByZero: return "Division by zero."; + case Error.InvalidReference: return "Invalid reference."; + case Error.DebugOpCode: return "Found debug opcode."; + case Error.EndfInExecStream: return "Found ENDF opcode in execution stream."; + case Error.NestedDefs: return "Nested DEFS."; + case Error.InvalidCodeRange: return "Invalid code range."; + case Error.ExecutionTooLong: return "Execution context too long."; + case Error.TooManyFunctionDefs: return "Too many function definitions."; + case Error.TooManyInstructionDefs: return "Too many instruction definitions."; + case Error.TableMissing: return "SFNT font table missing."; + case Error.HorizHeaderMissing: return "Horizontal header (hhea) table missing."; + case Error.LocationsMissing: return "Locations (loca) table missing."; + case Error.NameTableMissing: return "Name table missing."; + case Error.CMapTableMissing: return "Character map (cmap) table missing."; + case Error.HmtxTableMissing: return "Horizontal metrics (hmtx) table missing."; + case Error.PostTableMissing: return "PostScript (post) table missing."; + case Error.InvalidHorizMetrics: return "Invalid horizontal metrics."; + case Error.InvalidCharMapFormat: return "Invalid character map (cmap) format."; + case Error.InvalidPPem: return "Invalid ppem value."; + case Error.InvalidVertMetrics: return "Invalid vertical metrics."; + case Error.CouldNotFindContext: return "Could not find context."; + case Error.InvalidPostTableFormat: return "Invalid PostScript (post) table format."; + case Error.InvalidPostTable: return "Invalid PostScript (post) table."; + case Error.SyntaxError: return "Opcode syntax error."; + case Error.StackUnderflow: return "Argument stack underflow."; + case Error.Ignore: return "Ignore this error."; + case Error.NoUnicodeGlyphName: return "No Unicode glyph name found."; + case Error.MissingStartfontField: return "`STARTFONT' field missing."; + case Error.MissingFontField: return "`FONT' field missing."; + case Error.MissingSizeField: return "`SIZE' field missing."; + case Error.MissingFontboudingboxField: return "`FONTBOUNDINGBOX' field missing."; + case Error.MissingCharsField: return "`CHARS' field missing."; + case Error.MissingStartcharField: return "`STARTCHAR' field missing."; + case Error.MissingEncodingField: return "`ENCODING' field missing."; + case Error.MissingBbxField: return "`BBX' field missing."; + case Error.BbxTooBig: return "`BBX' too big."; + case Error.CorruptedFontHeader: return "Font header corrupted or missing fields."; + case Error.CorruptedFontGlyphs: return "Font glyphs corrupted or missing fields."; + default: return "Encountered an unknown error. Most likely this is a new error that hasn't been included in SharpFont yet. Error:" + (int)err; + } + } + } +} diff --git a/SharpFont/Source/SharpFontShared/Gasp.cs b/SharpFont/Source/SharpFontShared/Gasp.cs new file mode 100644 index 000000000..4f1be20dc --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Gasp.cs @@ -0,0 +1,70 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of values and/or bit-flags returned by the FT_Get_Gasp function. + /// + /// + /// The bit-flags and are to be used for standard font + /// rasterization only. Independently of that, and + /// are to be used if ClearType is enabled (and + /// and are consequently ignored). + /// + /// ‘ClearType’ is Microsoft's implementation of LCD rendering, partly protected by patents. + /// + [Flags] + public enum Gasp + { + /// + /// This special value means that there is no GASP table in this face. It is up to the client to decide what to + /// do. + /// + NoTable = -1, + + /// + /// Grid-fitting and hinting should be performed at the specified ppem. This really means TrueType bytecode + /// interpretation. If this bit is not set, no hinting gets applied. + /// + DoGridfit = 0x01, + + /// + /// Anti-aliased rendering should be performed at the specified ppem. If not set, do monochrome rendering. + /// + DoGray = 0x02, + + /// + /// If set, smoothing along multiple axes must be used with ClearType. + /// + SymmetricSmoothing = 0x08, + + /// + /// Grid-fitting must be used with ClearType's symmetric smoothing. + /// + SymmetricGridfit = 0x10 + } +} diff --git a/SharpFont/Source/SharpFontShared/Generic.cs b/SharpFont/Source/SharpFontShared/Generic.cs new file mode 100644 index 000000000..20b7f8973 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Generic.cs @@ -0,0 +1,156 @@ +#region MIT License +/*Copyright (c) 2012-2014 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// Describe a function used to destroy the ‘client’ data of any FreeType object. See the description of the + /// type for details of usage. + /// + /// + /// The address of the FreeType object which is under finalization. Its client data is accessed through its + /// ‘generic’ field. + /// + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void GenericFinalizer(IntPtr @object); + + /// + /// Client applications often need to associate their own data to a variety of FreeType core objects. For example, + /// a text layout API might want to associate a glyph cache to a given size object. + /// + /// Most FreeType object contains a ‘generic’ field, of type , which usage is left to client + /// applications and font servers. + /// + /// It can be used to store a pointer to client-specific data, as well as the address of a ‘finalizer’ function, + /// which will be called by FreeType when the object is destroyed (for example, the previous client example would + /// put the address of the glyph cache destructor in the ‘finalizer’ field). + /// + [Obsolete("Use the Tag property and Disposed event.")] + public class Generic + { + #region Fields + + private GenericRec rec; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// + /// A typeless pointer to some client data. The data it cointains must stay fixed until finalizer is called. + /// + /// A delegate that gets called when the contained object gets finalized. + public Generic(IntPtr data, GenericFinalizer finalizer) + { + rec.data = data; + //rec.finalizer = finalizer; + } + + internal Generic(GenericRec genInternal) + { + rec = genInternal; + } + + internal Generic(IntPtr reference) + { + rec = PInvokeHelper.PtrToStructure(reference); + } + + internal Generic(IntPtr reference, int offset) + : this(new IntPtr(reference.ToInt64() + offset)) + { + } + + #endregion + + #region Properties + + /// + /// Gets the size of a , in bytes. + /// + public static int SizeInBytes + { + get + { + return Marshal.SizeOf(typeof(GenericRec)); + } + } + + /// + /// Gets or sets a typeless pointer to any client-specified data. This field is completely ignored by the + /// FreeType library. + /// + public IntPtr Data + { + get + { + return rec.data; + } + + set + { + rec.data = value; + } + } + + /// + /// Gets or sets a pointer to a function, which will be called when the object + /// is destroyed. If this field is set to NULL, no code will be called. + /// + /*public GenericFinalizer Finalizer + { + get + { + return rec.finalizer; + } + + set + { + rec.finalizer = value; + } + }*/ + + #endregion + + #region Methods + + //TODO make this private and build it into the setters if the reference isn't IntPtr.Zero. + internal void WriteToUnmanagedMemory(IntPtr location) + { + Marshal.WriteIntPtr(location, rec.data); + //Marshal.WriteIntPtr(location, IntPtr.Size, Marshal.GetFunctionPointerForDelegate(rec.finalizer)); + Marshal.WriteIntPtr(location, IntPtr.Size, rec.finalizer); + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Glyph.cs b/SharpFont/Source/SharpFontShared/Glyph.cs new file mode 100644 index 000000000..c024d8393 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Glyph.cs @@ -0,0 +1,444 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// The root glyph structure contains a given glyph image plus its advance width in 16.16 fixed float format. + /// + public sealed class Glyph : IDisposable + { + #region Fields + + private bool disposed; + + private IntPtr reference; + private GlyphRec rec; + + private Library parentLibrary; + + #endregion + + #region Constructors + + internal Glyph(IntPtr reference, Library parentLibrary) + { + Reference = reference; + + this.parentLibrary = parentLibrary; + parentLibrary.AddChildGlyph(this); + } + + /// + /// Finalizes an instance of the Glyph class. + /// + ~Glyph() + { + Dispose(false); + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the object has been disposed. + /// + public bool IsDisposed + { + get + { + return disposed; + } + } + + /// + /// Gets a handle to the FreeType library object. + /// + public Library Library + { + get + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + return parentLibrary; + } + } + + /// + /// Gets the format of the glyph's image. + /// + [CLSCompliant(false)] + public GlyphFormat Format + { + get + { + if (disposed) + throw new ObjectDisposedException("Format", "Cannot access a disposed object."); + + return rec.format; + } + } + + /// + /// Gets a 16.16 vector that gives the glyph's advance width. + /// + public FTVector Advance + { + get + { + if (disposed) + throw new ObjectDisposedException("Advance", "Cannot access a disposed object."); + + return rec.advance; + } + } + + internal IntPtr Reference + { + get + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + return reference; + } + + set + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + + #region Operators + + /// + /// Downcasts a to a + /// + /// A . + /// A . + /// + /// If the 's format is not . + /// + public static explicit operator BitmapGlyph(Glyph g) + { + if (g.Format == GlyphFormat.Bitmap) + return new BitmapGlyph(g); + else + throw new InvalidCastException("The glyph's format is not GlyphFormat.Bitmap."); + } + + /// + /// Downcasts a to a + /// + /// A . + /// A . + /// + /// If the 's format is not . + /// + public static explicit operator OutlineGlyph(Glyph g) + { + if (g.Format == GlyphFormat.Outline) + return new OutlineGlyph(g); + else + throw new InvalidCastException("The glyph's format is not GlyphFormat.Outline."); + } + + #endregion + + #region Methods + + /// + /// CLS-compliant equivalent of an explicit cast to . + /// + /// A . + public BitmapGlyph ToBitmapGlyph() + { + return (BitmapGlyph)this; + } + + /// + /// CLS-compliant equivalent of an explicit cast to . + /// + /// A . + public OutlineGlyph ToOutlineGlyph() + { + return (OutlineGlyph)this; + } + + /// + /// A function used to copy a glyph image. Note that the created object must be released + /// with . + /// + /// A handle to the target glyph object. 0 in case of error. + public Glyph Copy() + { + if (disposed) + throw new ObjectDisposedException("Glyph", "Cannot access a disposed object."); + + IntPtr glyphRef; + + Error err = FT.FT_Glyph_Copy(Reference, out glyphRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new Glyph(glyphRef, Library); + } + + /// + /// Transform a glyph image if its format is scalable. + /// + /// A pointer to a 2x2 matrix to apply. + /// + /// A pointer to a 2d vector to apply. Coordinates are expressed in 1/64th of a pixel. + /// + public void Transform(FTMatrix matrix, FTVector delta) + { + if (disposed) + throw new ObjectDisposedException("Glyph", "Cannot access a disposed object."); + + Error err = FT.FT_Glyph_Transform(Reference, ref matrix, ref delta); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Return a glyph's ‘control box’. The control box encloses all the outline's points, including Bézier control + /// points. Though it coincides with the exact bounding box for most glyphs, it can be slightly larger in some + /// situations (like when rotating an outline which contains Bézier outside arcs). + /// + /// Computing the control box is very fast, while getting the bounding box can take much more time as it needs + /// to walk over all segments and arcs in the outline. To get the latter, you can use the ‘ftbbox’ component + /// which is dedicated to this single task. + /// + /// + /// Coordinates are relative to the glyph origin, using the y upwards convention. + /// + /// If the glyph has been loaded with , ‘bbox_mode’ must be set to + /// to get unscaled font units in 26.6 pixel format. The value + /// is another name for this constant. + /// + /// If the font is tricky and the glyph has been loaded with , the resulting + /// CBox is meaningless. To get reasonable values for the CBox it is necessary to load the glyph at a large + /// ppem value (so that the hinting instructions can properly shift and scale the subglyphs), then extracting + /// the CBox which can be eventually converted back to font units. + /// + /// Note that the maximum coordinates are exclusive, which means that one can compute the width and height of + /// the glyph image (be it in integer or 26.6 pixels) as: + /// + /// + /// width = bbox.xMax - bbox.xMin; + /// height = bbox.yMax - bbox.yMin; + /// + /// + /// Note also that for 26.6 coordinates, if ‘bbox_mode’ is set to , the + /// coordinates will also be grid-fitted, which corresponds to: + /// + /// + /// bbox.xMin = FLOOR(bbox.xMin); + /// bbox.yMin = FLOOR(bbox.yMin); + /// bbox.xMax = CEILING(bbox.xMax); + /// bbox.yMax = CEILING(bbox.yMax); + /// + /// + /// To get the bbox in pixel coordinates, set ‘bbox_mode’ to . + /// + /// To get the bbox in grid-fitted pixel coordinates, set ‘bbox_mode’ to . + /// + /// The mode which indicates how to interpret the returned bounding box values. + /// + /// The glyph coordinate bounding box. Coordinates are expressed in 1/64th of pixels if it is grid-fitted. + /// + [CLSCompliant(false)] + public BBox GetCBox(GlyphBBoxMode mode) + { + if (disposed) + throw new ObjectDisposedException("Glyph", "Cannot access a disposed object."); + + BBox box; + FT.FT_Glyph_Get_CBox(Reference, mode, out box); + + return box; + } + + /// + /// Convert a given glyph object to a bitmap glyph object. + /// + /// + /// This function does nothing if the glyph format isn't scalable. + /// + /// The glyph image is translated with the ‘origin’ vector before rendering. + /// + /// The first parameter is a pointer to an handle, that will be replaced by this function + /// (with newly allocated data). Typically, you would use (omitting error handling): + /// + /// --sample code ommitted-- + /// + /// An enumeration that describes how the data is rendered. + /// + /// A pointer to a vector used to translate the glyph image before rendering. Can be 0 (if no translation). The + /// origin is expressed in 26.6 pixels. + /// + /// + /// A boolean that indicates that the original glyph image should be destroyed by this function. It is never + /// destroyed in case of error. + /// + public void ToBitmap(RenderMode renderMode, FTVector26Dot6 origin, bool destroy) + { + if (disposed) + throw new ObjectDisposedException("Glyph", "Cannot access a disposed object."); + + IntPtr glyphRef = Reference; + Error err = FT.FT_Glyph_To_Bitmap(ref glyphRef, renderMode, ref origin, destroy); + + Reference = glyphRef; + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + #region Glyph Stroker + + /// + /// Stroke a given outline glyph object with a given stroker. + /// + /// + /// The source glyph is untouched in case of error. + /// + /// A stroker handle. + /// A Boolean. If 1, the source glyph object is destroyed on success. + /// New glyph handle. + public Glyph Stroke(Stroker stroker, bool destroy) + { + if (disposed) + throw new ObjectDisposedException("Glyph", "Cannot access a disposed object."); + + if (stroker == null) + throw new ArgumentNullException("stroker"); + + IntPtr sourceRef = Reference; + Error err = FT.FT_Glyph_Stroke(ref sourceRef, stroker.Reference, destroy); + + if (destroy && err == Error.Ok) + { + //if FT_Glyph_Stroke destroys the glyph, keep the C# side synchronized. + disposed = true; + reference = IntPtr.Zero; + } + + if (err != Error.Ok) + throw new FreeTypeException(err); + + //check if the pointer didn't change. + if (sourceRef == Reference) + return this; + else + return new Glyph(sourceRef, Library); + } + + /// + /// Stroke a given outline glyph object with a given stroker, but only return either its inside or outside + /// border. + /// + /// + /// The source glyph is untouched in case of error. + /// + /// A stroker handle. + /// A Boolean. If 1, return the inside border, otherwise the outside border. + /// A Boolean. If 1, the source glyph object is destroyed on success. + /// New glyph handle. + public Glyph StrokeBorder(Stroker stroker, bool inside, bool destroy) + { + if (disposed) + throw new ObjectDisposedException("Glyph", "Cannot access a disposed object."); + + if (stroker == null) + throw new ArgumentNullException("stroker"); + + IntPtr sourceRef = Reference; + Error err = FT.FT_Glyph_StrokeBorder(ref sourceRef, stroker.Reference, inside, destroy); + + if (destroy && err == Error.Ok) + { + //if FT_Glyph_Stroke destroys the glyph, keep the C# side synchronized. + disposed = true; + reference = IntPtr.Zero; + } + + if (err != Error.Ok) + throw new FreeTypeException(err); + + //check if the pointer didn't change. + if (sourceRef == Reference) + return this; + else + return new Glyph(sourceRef, Library); + } + + #endregion + + /// + /// Disposes the Glyph. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!disposed) + { + disposed = true; + + FT.FT_Done_Glyph(reference); + + // removes itself from the parent Library, with a check to prevent this from happening when Library is + // being disposed (Library disposes all it's children with a foreach loop, this causes an + // InvalidOperationException for modifying a collection during enumeration) + if (!parentLibrary.IsDisposed) + parentLibrary.RemoveChildGlyph(this); + + reference = IntPtr.Zero; + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/GlyphBBoxMode.cs b/SharpFont/Source/SharpFontShared/GlyphBBoxMode.cs new file mode 100644 index 000000000..f0e889c7d --- /dev/null +++ b/SharpFont/Source/SharpFontShared/GlyphBBoxMode.cs @@ -0,0 +1,50 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// The mode how the values of are returned. + /// + [CLSCompliant(false)] + public enum GlyphBBoxMode : uint + { + /// Return unscaled font units. + Unscaled = 0, + + /// Return unfitted 26.6 coordinates. + Subpixels = 0, + + /// Return grid-fitted 26.6 coordinates. + Gridfit = 1, + + /// Return coordinates in integer pixels. + Truncate = 2, + + /// Return grid-fitted pixel coordinates. + Pixels = 3 + } +} diff --git a/SharpFont/Source/SharpFontShared/GlyphFormat.cs b/SharpFont/Source/SharpFontShared/GlyphFormat.cs new file mode 100644 index 000000000..761a5547b --- /dev/null +++ b/SharpFont/Source/SharpFontShared/GlyphFormat.cs @@ -0,0 +1,67 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// An enumeration type used to describe the format of a given glyph image. Note that this version of FreeType only + /// supports two image formats, even though future font drivers will be able to register their own format. + /// + [CLSCompliant(false)] + public enum GlyphFormat : uint + { + /// + /// The value 0 is reserved. + /// + None = 0, + + /// + /// The glyph image is a composite of several other images. This format is only used with + /// , and is used to report compound glyphs (like accented characters). + /// + Composite = ('c' << 24 | 'o' << 16 | 'm' << 8 | 'p'), + + /// + /// The glyph image is a bitmap, and can be described as an . You generally need to + /// access the ‘bitmap’ field of the structure to read it. + /// + Bitmap = ('b' << 24 | 'i' << 16 | 't' << 8 | 's'), + + /// + /// The glyph image is a vectorial outline made of line segments and Bézier arcs; it can be described as an + /// ; you generally want to access the ‘outline’ field of the + /// structure to read it. + /// + Outline = ('o' << 24 | 'u' << 16 | 't' << 8 | 'l'), + + /// + /// The glyph image is a vectorial path with no inside and outside contours. Some Type 1 fonts, like those in + /// the Hershey family, contain glyphs in this format. These are described as , but + /// FreeType isn't currently capable of rendering them correctly. + /// + Plotter = ('p' << 24 | 'l' << 16 | 'o' << 8 | 't') + } +} diff --git a/SharpFont/Source/SharpFontShared/GlyphMetrics.cs b/SharpFont/Source/SharpFontShared/GlyphMetrics.cs new file mode 100644 index 000000000..93cc1615f --- /dev/null +++ b/SharpFont/Source/SharpFontShared/GlyphMetrics.cs @@ -0,0 +1,180 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A structure used to model the metrics of a single glyph. The values are expressed in 26.6 fractional pixel + /// format; if the flag has been used while loading the glyph, values are expressed + /// in font units instead. + /// + /// + /// If not disabled with , the values represent dimensions of the hinted glyph (in + /// case hinting is applicable). + /// + public sealed class GlyphMetrics + { + #region Fields + + private IntPtr reference; + private GlyphMetricsRec rec; + + #endregion + + #region Constructors + + internal GlyphMetrics(IntPtr reference) + { + Reference = reference; + } + + internal GlyphMetrics(GlyphMetricsRec glyphMetInt) + { + this.rec = glyphMetInt; + } + + #endregion + + #region Properties + + /// + /// Gets the glyph's width. If getting metrics from a face loaded with , call + /// to get the unscaled value. + /// + public Fixed26Dot6 Width + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.width); + } + } + + /// + /// Gets the glyph's height. If getting metrics from a face loaded with , call + /// to get the unscaled value. + /// + public Fixed26Dot6 Height + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.height); + } + } + + /// + /// Gets the left side bearing for horizontal layout. If getting metrics from a face loaded with + /// , call to get the unscaled value. + /// + public Fixed26Dot6 HorizontalBearingX + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.horiBearingX); + } + } + + /// + /// Gets the top side bearing for horizontal layout. If getting metrics from a face loaded with + /// , call to get the unscaled value. + /// + public Fixed26Dot6 HorizontalBearingY + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.horiBearingY); + } + } + + /// + /// Gets the advance width for horizontal layout. If getting metrics from a face loaded with + /// , call to get the unscaled value. + /// + public Fixed26Dot6 HorizontalAdvance + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.horiAdvance); + } + } + + /// + /// Gets the left side bearing for vertical layout. If getting metrics from a face loaded with + /// , call to get the unscaled value. + /// + public Fixed26Dot6 VerticalBearingX + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.vertBearingX); + } + } + + /// + /// Gets the top side bearing for vertical layout. Larger positive values mean further below the vertical glyph + /// origin. If getting metrics from a face loaded with , call + /// to get the unscaled value. + /// + public Fixed26Dot6 VerticalBearingY + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.vertBearingY); + } + } + + /// + /// Gets the advance height for vertical layout. Positive values mean the glyph has a positive advance + /// downward. If getting metrics from a face loaded with , call + /// to get the unscaled value. + /// + public Fixed26Dot6 VerticalAdvance + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.vertAdvance); + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/GlyphSlot.cs b/SharpFont/Source/SharpFontShared/GlyphSlot.cs new file mode 100644 index 000000000..ed5818dea --- /dev/null +++ b/SharpFont/Source/SharpFontShared/GlyphSlot.cs @@ -0,0 +1,475 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015-2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// FreeType root glyph slot class structure. A glyph slot is a container where individual glyphs can be loaded, be + /// they in outline or bitmap format. + /// + /// + /// If is called with default flags (see ) + /// the glyph image is loaded in the glyph slot in its native format (e.g., an outline glyph for TrueType and Type + /// 1 formats). + /// + /// This image can later be converted into a bitmap by calling . This function finds the + /// current renderer for the native image's format, then invokes it. + /// + /// The renderer is in charge of transforming the native image through the slot's face transformation fields, then + /// converting it into a bitmap that is returned in ‘slot->bitmap’. + /// + /// Note that ‘slot->bitmap_left’ and ‘slot->bitmap_top’ are also used to specify the position of the bitmap + /// relative to the current pen position (e.g., coordinates (0,0) on the baseline). Of course, ‘slot->format’ is + /// also changed to . + /// + /// + /// + /// FT_Pos origin_x = 0; + /// FT_Pos prev_rsb_delta = 0; + /// + /// + /// for all glyphs do + /// <compute kern between current and previous glyph and add it to + /// `origin_x'> + /// + /// <load glyph with `FT_Load_Glyph'> + /// + /// if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) + /// origin_x -= 64; + /// else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) + /// origin_x += 64; + /// + /// prev_rsb_delta = face->glyph->rsb_delta; + /// + /// <save glyph image, or render glyph, or ...> + /// + /// origin_x += face->glyph->advance.x; + /// endfor + /// + /// + public sealed class GlyphSlot + { + #region Fields + + private IntPtr reference; + private GlyphSlotRec rec; + + private Face parentFace; + private Library parentLibrary; + + #endregion + + #region Constructors + + internal GlyphSlot(IntPtr reference, Face parentFace, Library parentLibrary) + { + Reference = reference; + this.parentFace = parentFace; + this.parentLibrary = parentLibrary; + } + + #endregion + + #region Properties + + /// + /// Gets a handle to the FreeType library instance this slot belongs to. + /// + public Library Library + { + get + { + return parentLibrary; + } + } + + /// + /// Gets a handle to the parent face object. + /// + public Face Face + { + get + { + return parentFace; + } + } + + /// + /// Gets the next . In some cases (like some font tools), several glyph slots per face + /// object can be a good thing. As this is rare, the glyph slots are listed through a direct, single-linked + /// list using its ‘next’ field. + /// + public GlyphSlot Next + { + get + { + return new GlyphSlot(rec.next, parentFace, parentLibrary); + } + } + + /// + /// Gets a typeless pointer which is unused by the FreeType library or any of its drivers. It can be used by + /// client applications to link their own data to each glyph slot object. + /// + [Obsolete("Use the Tag property, Dispose callback not handled currently.")] + public Generic Generic + { + get + { + return new Generic(rec.generic); + } + } + + /// + /// Gets the metrics of the last loaded glyph in the slot. The returned values depend on the last load flags + /// (see the API function) and can be expressed either in 26.6 + /// fractional pixels or font units. + /// + /// Note that even when the glyph image is transformed, the metrics are not. + /// + public GlyphMetrics Metrics + { + get + { + return new GlyphMetrics(rec.metrics); + } + } + + /// + /// Gets the advance width of the unhinted glyph. Its value is expressed in 16.16 fractional pixels, unless + /// is set when loading the glyph. This field can be important to perform + /// correct WYSIWYG layout. Only relevant for outline glyphs. + /// + public Fixed16Dot16 LinearHorizontalAdvance + { + get + { + return Fixed16Dot16.FromRawValue((int)rec.linearHoriAdvance); + } + } + + /// + /// Gets the advance height of the unhinted glyph. Its value is expressed in 16.16 fractional pixels, unless + /// is set when loading the glyph. This field can be important to perform + /// correct WYSIWYG layout. Only relevant for outline glyphs. + /// + public Fixed16Dot16 LinearVerticalAdvance + { + get + { + return Fixed16Dot16.FromRawValue((int)rec.linearVertAdvance); + } + } + + /// + /// Gets the advance. This shorthand is, depending on , the transformed + /// advance width for the glyph (in 26.6 fractional pixel format). As specified with + /// , it uses either the ‘horiAdvance’ or the ‘vertAdvance’ value of + /// ‘metrics’ field. + /// + public FTVector26Dot6 Advance + { + get + { + return rec.advance; + } + } + + /// + /// Gets the glyph format. This field indicates the format of the image contained in the glyph slot. Typically + /// , , or + /// , but others are possible. + /// + [CLSCompliant(false)] + public GlyphFormat Format + { + get + { + return rec.format; + } + } + + /// + /// Gets the bitmap. This field is used as a bitmap descriptor when the slot format is + /// . Note that the address and content of the bitmap buffer can change between + /// calls of and a few other functions. + /// + public FTBitmap Bitmap + { + get + { + return new FTBitmap(PInvokeHelper.AbsoluteOffsetOf(Reference, "bitmap"), rec.bitmap, parentLibrary); + } + } + + /// + /// Gets the bitmap's left bearing expressed in integer pixels. Of course, this is only valid if the format is + /// . + /// + public int BitmapLeft + { + get + { + return rec.bitmap_left; + } + } + + /// + /// Gets the bitmap's top bearing expressed in integer pixels. Remember that this is the distance from the + /// baseline to the top-most glyph scanline, upwards y coordinates being positive. + /// + public int BitmapTop + { + get + { + return rec.bitmap_top; + } + } + + /// + /// Gets the outline descriptor for the current glyph image if its format is . + /// Once a glyph is loaded, ‘outline’ can be transformed, distorted, embolded, etc. However, it must not be + /// freed. + /// + public Outline Outline + { + get + { + return new Outline(PInvokeHelper.AbsoluteOffsetOf(Reference, "outline"), rec.outline); + } + } + + /// + /// Gets the number of subglyphs in a composite glyph. This field is only valid for the composite glyph format + /// that should normally only be loaded with the flag. For now this is + /// internal to FreeType. + /// + [CLSCompliant(false)] + public uint SubglyphsCount + { + get + { + return rec.num_subglyphs; + } + } + + /// + /// Gets an array of subglyph descriptors for composite glyphs. There are ‘num_subglyphs’ elements in there. + /// Currently internal to FreeType. + /// + public SubGlyph[] Subglyphs + { + get + { + int count = (int)SubglyphsCount; + + if (count == 0) + return null; + + SubGlyph[] subglyphs = new SubGlyph[count]; + IntPtr array = rec.subglyphs; + + for (int i = 0; i < count; i++) + { + subglyphs[i] = new SubGlyph((IntPtr)(array.ToInt64() + IntPtr.Size * i)); + } + + return subglyphs; + } + } + + /// + /// Gets the control data. Certain font drivers can also return the control data for a given glyph image (e.g. + /// TrueType bytecode, Type 1 charstrings, etc.). This field is a pointer to such data. + /// + public IntPtr ControlData + { + get + { + return rec.control_data; + } + } + + /// + /// Gets the length in bytes of the control data. + /// + public int ControlLength + { + get + { + return (int)rec.control_len; + } + } + + /// + /// Gets the difference between hinted and unhinted left side bearing while autohinting is active. Zero + /// otherwise. + /// + public int DeltaLsb + { + get + { + return (int)rec.lsb_delta; + } + } + + /// + /// Gets the difference between hinted and unhinted right side bearing while autohinting is active. Zero + /// otherwise. + /// + public int DeltaRsb + { + get + { + return (int)rec.rsb_delta; + } + } + + /// + /// Gets or sets an object used to identify this instance of . This object will not be + /// modified or accessed internally. + /// + /// + /// This is a replacement for FT_Generic in FreeType. If you are retrieving the same object multiple times + /// from functions, this object will not appear in new copies. + /// + public object Tag { get; set; } + + /// + /// Gets other data. Really wicked formats can use this pointer to present their own glyph image to client + /// applications. Note that the application needs to know about the image format. + /// + public IntPtr Other + { + get + { + return rec.other; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + + #region Public Methods + + #region Base Interface + + /// + /// Convert a given glyph image to a bitmap. It does so by inspecting the glyph image format, finding the + /// relevant renderer, and invoking it. + /// + /// This is the render mode used to render the glyph image into a bitmap. + public void RenderGlyph(RenderMode mode) + { + Error err = FT.FT_Render_Glyph(Reference, mode); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Retrieve a description of a given subglyph. Only use it if is + /// ; an error is returned otherwise. + /// + /// + /// The values of ‘*p_arg1’, ‘*p_arg2’, and ‘*p_transform’ must be interpreted depending on the flags returned + /// in ‘*p_flags’. See the TrueType specification for details. + /// + /// + /// The index of the subglyph. Must be less than . + /// + /// The glyph index of the subglyph. + /// The subglyph flags, see . + /// The subglyph's first argument (if any). + /// The subglyph's second argument (if any). + /// The subglyph transformation (if any). + [CLSCompliant(false)] + public void GetSubGlyphInfo(uint subIndex, out int index, out SubGlyphFlags flags, out int arg1, out int arg2, out FTMatrix transform) + { + Error err = FT.FT_Get_SubGlyph_Info(Reference, subIndex, out index, out flags, out arg1, out arg2, out transform); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + #endregion + + #region Glyph Management + + /// + /// A function used to extract a glyph image from a slot. Note that the created object must + /// be released with . + /// + /// A handle to the glyph object. + public Glyph GetGlyph() + { + IntPtr glyphRef; + Error err = FT.FT_Get_Glyph(Reference, out glyphRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new Glyph(glyphRef, Library); + } + + #endregion + + #region Bitmap Handling + + /// + /// Make sure that a glyph slot owns ‘slot->bitmap’. + /// + /// + /// This function is to be used in combination with . + /// + public void OwnBitmap() + { + Error err = FT.FT_GlyphSlot_Own_Bitmap(Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + #endregion + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/GlyphToScriptMapProperty.cs b/SharpFont/Source/SharpFontShared/GlyphToScriptMapProperty.cs new file mode 100644 index 000000000..4159b57cf --- /dev/null +++ b/SharpFont/Source/SharpFontShared/GlyphToScriptMapProperty.cs @@ -0,0 +1,96 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// The data exchange structure for the glyph-to-script-map property. + /// + public class GlyphToScriptMapProperty + { + private GlyphToScriptMapPropertyRec rec; + private Face face; + + /// + /// Initializes a new instance of the class. + /// + /// The face to apply the property to. + public GlyphToScriptMapProperty(Face face) + { + Face = face; + } + + internal GlyphToScriptMapProperty(GlyphToScriptMapPropertyRec rec, Face face) + { + this.rec = rec; + this.face = face; + } + + /// + /// Gets or sets the associated face. + /// + public Face Face + { + get + { + return face; + } + + set + { + face = value; + rec.face = face.Reference; + } + } + + /// + /// Gets or sets the associated map. + /// + public IntPtr Map + { + get + { + return rec.map; + } + + set + { + rec.map = value; + } + } + + internal GlyphToScriptMapPropertyRec Rec + { + get + { + return rec; + } + } + } +} diff --git a/SharpFont/Source/SharpFontShared/IncreaseXHeightProperty.cs b/SharpFont/Source/SharpFontShared/IncreaseXHeightProperty.cs new file mode 100644 index 000000000..162ea3d49 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/IncreaseXHeightProperty.cs @@ -0,0 +1,97 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// The data exchange structure for the increase-x-height property. + /// + public class IncreaseXHeightProperty + { + private IncreaseXHeightPropertyRec rec; + private Face face; + + /// + /// Initializes a new instance of the class. + /// + /// The face to increase the X height of. + public IncreaseXHeightProperty(Face face) + { + this.rec.face = face.Reference; + this.face = face; + } + + internal IncreaseXHeightProperty(IncreaseXHeightPropertyRec rec, Face face) + { + this.rec = rec; + this.face = face; + } + + /// + /// Gets or sets the associated face. + /// + public Face Face + { + get + { + return face; + } + + set + { + face = value; + rec.face = face.Reference; + } + } + + /// + /// Gets or sets the limit property. + /// + [CLSCompliant(false)] + public uint Limit + { + get + { + return rec.limit; + } + + set + { + rec.limit = value; + } + } + + internal IncreaseXHeightPropertyRec Rec + { + get + { + return rec; + } + } + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/BitmapGlyphRec.cs b/SharpFont/Source/SharpFontShared/Internal/BitmapGlyphRec.cs new file mode 100644 index 000000000..394b8a218 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/BitmapGlyphRec.cs @@ -0,0 +1,38 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct BitmapGlyphRec + { + internal GlyphRec root; + internal int left; + internal int top; + internal BitmapRec bitmap; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/BitmapRec.cs b/SharpFont/Source/SharpFontShared/Internal/BitmapRec.cs new file mode 100644 index 000000000..77fdea325 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/BitmapRec.cs @@ -0,0 +1,48 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + /// + /// Internally represents a Bitmap. + /// + /// + /// Refer to for FreeType documentation. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct BitmapRec + { + internal int rows; + internal int width; + internal int pitch; + internal IntPtr buffer; + internal short num_grays; + internal PixelMode pixel_mode; + internal byte palette_mode; + internal IntPtr palette; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/BitmapSizeRec.cs b/SharpFont/Source/SharpFontShared/Internal/BitmapSizeRec.cs new file mode 100644 index 000000000..158cc3131 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/BitmapSizeRec.cs @@ -0,0 +1,52 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + /// + /// Internally represents a BitmapSize. + /// + /// + /// Refer to for FreeType documentation. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct BitmapSizeRec + { + internal short height; + internal short width; + + internal FT_Long size; + + internal FT_Long x_ppem; + internal FT_Long y_ppem; + + internal static int SizeInBytes { get { return Marshal.SizeOf(typeof(BitmapSizeRec)); } } + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/CharMapRec.cs b/SharpFont/Source/SharpFontShared/Internal/CharMapRec.cs new file mode 100644 index 000000000..b36cb6412 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/CharMapRec.cs @@ -0,0 +1,46 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.TrueType; + +namespace SharpFont.Internal +{ + /// + /// Internally represents a CharMap. + /// + /// + /// Refer to for FreeType documentation. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct CharMapRec + { + internal IntPtr face; + internal Encoding encoding; + internal PlatformId platform_id; + internal ushort encoding_id; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/FaceRec.cs b/SharpFont/Source/SharpFontShared/Internal/FaceRec.cs new file mode 100644 index 000000000..6c248b9af --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/FaceRec.cs @@ -0,0 +1,90 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + /// + /// Internally represents a Face. + /// + /// + /// Refer to for FreeType documentation. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct FaceRec + { + internal FT_Long num_faces; + internal FT_Long face_index; + + internal FT_Long face_flags; + internal FT_Long style_flags; + + internal FT_Long num_glyphs; + + internal IntPtr family_name; + internal IntPtr style_name; + + internal int num_fixed_sizes; + internal IntPtr available_sizes; + + internal int num_charmaps; + internal IntPtr charmaps; + + internal GenericRec generic; + + internal BBox bbox; + + internal ushort units_per_EM; + internal short ascender; + internal short descender; + internal short height; + + internal short max_advance_width; + internal short max_advance_height; + + internal short underline_position; + internal short underline_thickness; + + internal IntPtr glyph; + internal IntPtr size; + internal IntPtr charmap; + + private IntPtr driver; + private IntPtr memory; + private IntPtr stream; + + private IntPtr sizes_list; + private GenericRec autohint; + private IntPtr extensions; + + private IntPtr @internal; + + internal static int SizeInBytes { get { return Marshal.SizeOf(typeof(FaceRec)); } } + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/GenericRec.cs b/SharpFont/Source/SharpFontShared/Internal/GenericRec.cs new file mode 100644 index 000000000..9cc80070e --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/GenericRec.cs @@ -0,0 +1,36 @@ +#region MIT License +/*Copyright (c) 2012-2014 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct GenericRec + { + internal IntPtr data; + internal IntPtr finalizer; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/GlyphMetricsRec.cs b/SharpFont/Source/SharpFontShared/Internal/GlyphMetricsRec.cs new file mode 100644 index 000000000..df7496a5a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/GlyphMetricsRec.cs @@ -0,0 +1,53 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + /// + /// Internally represents a GlyphMetrics. + /// + /// + /// Refer to for FreeType documentation. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct GlyphMetricsRec + { + internal FT_Long width; + internal FT_Long height; + + internal FT_Long horiBearingX; + internal FT_Long horiBearingY; + internal FT_Long horiAdvance; + + internal FT_Long vertBearingX; + internal FT_Long vertBearingY; + internal FT_Long vertAdvance; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/GlyphRec.cs b/SharpFont/Source/SharpFontShared/Internal/GlyphRec.cs new file mode 100644 index 000000000..d4c2f64a2 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/GlyphRec.cs @@ -0,0 +1,38 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct GlyphRec + { + internal IntPtr library; + private IntPtr clazz; + internal GlyphFormat format; + internal FTVector advance; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/GlyphSlotRec.cs b/SharpFont/Source/SharpFontShared/Internal/GlyphSlotRec.cs new file mode 100644 index 000000000..d971b7f25 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/GlyphSlotRec.cs @@ -0,0 +1,74 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + /// + /// Internally represents a GlyphSlot. + /// + /// + /// Refer to for FreeType documentation. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct GlyphSlotRec + { + internal IntPtr library; + internal IntPtr face; + internal IntPtr next; + internal uint reserved; + internal GenericRec generic; + + internal GlyphMetricsRec metrics; + internal FT_Long linearHoriAdvance; + internal FT_Long linearVertAdvance; + internal FTVector26Dot6 advance; + + internal GlyphFormat format; + + internal BitmapRec bitmap; + internal int bitmap_left; + internal int bitmap_top; + + internal OutlineRec outline; + + internal uint num_subglyphs; + internal IntPtr subglyphs; + + internal IntPtr control_data; + internal FT_Long control_len; + + internal FT_Long lsb_delta; + internal FT_Long rsb_delta; + + internal IntPtr other; + + private IntPtr @internal; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/GlyphToScriptMapPropertyRec.cs b/SharpFont/Source/SharpFontShared/Internal/GlyphToScriptMapPropertyRec.cs new file mode 100644 index 000000000..bfa7098b8 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/GlyphToScriptMapPropertyRec.cs @@ -0,0 +1,36 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct GlyphToScriptMapPropertyRec + { + internal IntPtr face; + internal IntPtr map; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/IncreaseXHeightPropertyRec.cs b/SharpFont/Source/SharpFontShared/Internal/IncreaseXHeightPropertyRec.cs new file mode 100644 index 000000000..7527a3e1a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/IncreaseXHeightPropertyRec.cs @@ -0,0 +1,36 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct IncreaseXHeightPropertyRec + { + internal IntPtr face; + internal uint limit; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/ListNodeRec.cs b/SharpFont/Source/SharpFontShared/Internal/ListNodeRec.cs new file mode 100644 index 000000000..46984ede3 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/ListNodeRec.cs @@ -0,0 +1,39 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct ListNodeRec + { + internal IntPtr prev; + internal IntPtr next; + internal IntPtr data; + + internal static int SizeInBytes { get { return Marshal.SizeOf(typeof(ListNodeRec)); } } + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/ListRec.cs b/SharpFont/Source/SharpFontShared/Internal/ListRec.cs new file mode 100644 index 000000000..e09d2f602 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/ListRec.cs @@ -0,0 +1,36 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct ListRec + { + internal IntPtr head; + internal IntPtr tail; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/MemoryRec.cs b/SharpFont/Source/SharpFontShared/Internal/MemoryRec.cs new file mode 100644 index 000000000..8b3d1e157 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/MemoryRec.cs @@ -0,0 +1,40 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct MemoryRec + { + internal IntPtr user; + internal AllocFunc alloc; + internal FreeFunc free; + internal ReallocFunc realloc; + + internal static int SizeInBytes { get { return Marshal.SizeOf(typeof(MemoryRec)); } } + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/ModuleClassRec.cs b/SharpFont/Source/SharpFontShared/Internal/ModuleClassRec.cs new file mode 100644 index 000000000..b25622339 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/ModuleClassRec.cs @@ -0,0 +1,50 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct ModuleClassRec + { + internal uint module_flags; + internal FT_Long module_size; + + [MarshalAs(UnmanagedType.LPStr)] + internal string module_name; + internal FT_Long module_version; + internal FT_Long module_requires; + + internal IntPtr module_interface; + + internal ModuleConstructor module_init; + internal ModuleDestructor module_done; + internal ModuleRequester get_interface; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/NativeObject.cs b/SharpFont/Source/SharpFontShared/Internal/NativeObject.cs new file mode 100644 index 000000000..55d58601e --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/NativeObject.cs @@ -0,0 +1,33 @@ +using System; + +namespace SharpFont +{ + /// + /// Provide a consistent means for using pointers as references. + /// + public abstract class NativeObject + { + private IntPtr reference; + + /// + /// Construct a new NativeObject and assign the reference. + /// + /// + protected NativeObject(IntPtr reference) + { + this.reference = reference; + } + + internal virtual IntPtr Reference + { + get + { + return reference; + } + set + { + reference = value; + } + } + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/NativeReference.cs b/SharpFont/Source/SharpFontShared/Internal/NativeReference.cs new file mode 100644 index 000000000..272c23f3a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/NativeReference.cs @@ -0,0 +1,58 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + /// + /// Struct NativeReference + /// + /// + [StructLayout(LayoutKind.Sequential)] + public struct NativeReference where T : NativeObject + { + private readonly IntPtr memoryPtr; + + /// + /// Initializes a new instance of the struct. + /// + /// The memory PTR. + public NativeReference(IntPtr memoryPtr) + { + this.memoryPtr = memoryPtr; + } + + /// + /// Performs an implicit conversion from to . + /// + /// The memory. + /// The result of the conversion. + public static implicit operator NativeReference(T memory) + { + return new NativeReference(memory.Reference); + } + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/OpenArgsRec.cs b/SharpFont/Source/SharpFontShared/Internal/OpenArgsRec.cs new file mode 100644 index 000000000..58740832b --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/OpenArgsRec.cs @@ -0,0 +1,48 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct OpenArgsRec + { + internal OpenFlags flags; + internal IntPtr memory_base; + internal FT_Long memory_size; + + [MarshalAs(UnmanagedType.LPStr)] + internal string pathname; + + internal IntPtr stream; + internal IntPtr driver; + internal int num_params; + internal IntPtr @params; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/OutlineFuncsRec.cs b/SharpFont/Source/SharpFontShared/Internal/OutlineFuncsRec.cs new file mode 100644 index 000000000..e67258c3d --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/OutlineFuncsRec.cs @@ -0,0 +1,43 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct OutlineFuncsRec + { + internal IntPtr moveTo; + internal IntPtr lineTo; + internal IntPtr conicTo; + internal IntPtr cubicTo; + internal int shift; + internal FT_Long delta; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/OutlineGlyphRec.cs b/SharpFont/Source/SharpFontShared/Internal/OutlineGlyphRec.cs new file mode 100644 index 000000000..d0b0d8681 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/OutlineGlyphRec.cs @@ -0,0 +1,36 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct OutlineGlyphRec + { + internal GlyphRec root; + internal OutlineRec outline; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/OutlineRec.cs b/SharpFont/Source/SharpFontShared/Internal/OutlineRec.cs new file mode 100644 index 000000000..a6713120a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/OutlineRec.cs @@ -0,0 +1,42 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct OutlineRec + { + internal short n_contours; + internal short n_points; + + internal IntPtr points; + internal IntPtr tags; + internal IntPtr contours; + + internal OutlineFlags flags; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/ParameterRec.cs b/SharpFont/Source/SharpFontShared/Internal/ParameterRec.cs new file mode 100644 index 000000000..14cae95b4 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/ParameterRec.cs @@ -0,0 +1,41 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct ParameterRec + { + internal FT_ULong tag; + internal IntPtr data; + + internal static int SizeInBytes { get { return Marshal.SizeOf(typeof(ParameterRec)); } } + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/RasterFuncsRec.cs b/SharpFont/Source/SharpFontShared/Internal/RasterFuncsRec.cs new file mode 100644 index 000000000..a3dbc2d6b --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/RasterFuncsRec.cs @@ -0,0 +1,40 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct RasterFuncsRec + { + internal GlyphFormat glyph_format; + internal RasterNewFunc raster_new; + internal RasterResetFunc raster_reset; + internal RasterSetModeFunc raster_set_mode; + internal RasterRenderFunc raster_render; + internal RasterDoneFunc raster_done; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/RasterParamsRec.cs b/SharpFont/Source/SharpFontShared/Internal/RasterParamsRec.cs new file mode 100644 index 000000000..f8fc3e4ee --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/RasterParamsRec.cs @@ -0,0 +1,50 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct RasterParamsRec + { + internal IntPtr target; + internal IntPtr source; + internal RasterFlags flags; + internal RasterSpanFunc gray_spans; + internal RasterSpanFunc black_spans; + + [Obsolete("Unused")] + internal RasterBitTestFunc bit_test; + + [Obsolete("Unused")] + internal RasterBitSetFunc bit_set; + + internal IntPtr user; + internal BBox clip_box; + + internal static int SizeInBytes { get { return Marshal.SizeOf(typeof(RasterParamsRec)); } } + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/RendererClassRec.cs b/SharpFont/Source/SharpFontShared/Internal/RendererClassRec.cs new file mode 100644 index 000000000..8e764f8fe --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/RendererClassRec.cs @@ -0,0 +1,44 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct RendererClassRec + { + internal ModuleClassRec root; + + internal GlyphFormat glyph_format; + + internal IntPtr render_glyph; + internal IntPtr transform_glyph; + internal IntPtr get_glyph_cbox; + internal IntPtr set_mode; + + internal IntPtr raster_class; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/SizeMetricsRec.cs b/SharpFont/Source/SharpFontShared/Internal/SizeMetricsRec.cs new file mode 100644 index 000000000..149c9f581 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/SizeMetricsRec.cs @@ -0,0 +1,46 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct SizeMetricsRec + { + internal ushort x_ppem; + internal ushort y_ppem; + + internal FT_Long x_scale; + internal FT_Long y_scale; + internal FT_Long ascender; + internal FT_Long descender; + internal FT_Long height; + internal FT_Long max_advance; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/SizeRec.cs b/SharpFont/Source/SharpFontShared/Internal/SizeRec.cs new file mode 100644 index 000000000..05cbf061b --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/SizeRec.cs @@ -0,0 +1,39 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct SizeRec + { + internal IntPtr face; + internal GenericRec generic; + internal SizeMetricsRec metrics; + private IntPtr @internal; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/SizeRequestRec.cs b/SharpFont/Source/SharpFontShared/Internal/SizeRequestRec.cs new file mode 100644 index 000000000..ddc8fde87 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/SizeRequestRec.cs @@ -0,0 +1,48 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + /// + /// Internally represents a . + /// + /// + /// Refer to for FreeType documentation. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct SizeRequestRec + { + internal SizeRequestType type; + internal FT_Long width; + internal FT_Long height; + internal uint horiResolution; + internal uint vertResolution; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/SpanRec.cs b/SharpFont/Source/SharpFontShared/Internal/SpanRec.cs new file mode 100644 index 000000000..742411f35 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/SpanRec.cs @@ -0,0 +1,39 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct SpanRec + { + internal short x; + internal ushort len; + internal byte coverage; + + internal static int SizeInBytes { get { return Marshal.SizeOf(typeof(SpanRec)); } } + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/StreamDescRec.cs b/SharpFont/Source/SharpFontShared/Internal/StreamDescRec.cs new file mode 100644 index 000000000..75d2b8ba5 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/StreamDescRec.cs @@ -0,0 +1,42 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Explicit)] + internal struct StreamDescRec + { + [FieldOffset(0)] + internal FT_Long value; + + [FieldOffset(0)] + internal IntPtr pointer; + } +} diff --git a/SharpFont/Source/SharpFontShared/Internal/StreamRec.cs b/SharpFont/Source/SharpFontShared/Internal/StreamRec.cs new file mode 100644 index 000000000..45486b4c0 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Internal/StreamRec.cs @@ -0,0 +1,51 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct StreamRec + { + internal IntPtr @base; + internal FT_ULong size; + internal FT_ULong pos; + + internal StreamDescRec descriptor; + internal StreamDescRec pathname; + internal StreamIOFunc read; + internal StreamCloseFunc close; + + internal IntPtr memory; + internal IntPtr cursor; + internal IntPtr limit; + + internal static int SizeInBytes { get { return Marshal.SizeOf(typeof(StreamRec)); } } + } +} diff --git a/SharpFont/Source/SharpFontShared/KerningMode.cs b/SharpFont/Source/SharpFontShared/KerningMode.cs new file mode 100644 index 000000000..0cf3db41f --- /dev/null +++ b/SharpFont/Source/SharpFontShared/KerningMode.cs @@ -0,0 +1,49 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// An enumeration used to specify which kerning values to return in . + /// + public enum KerningMode + { + /// + /// Return scaled and grid-fitted kerning distances. + /// + Default = 0, + + /// + /// Return scaled but un-grid-fitted kerning distances. + /// + Unfitted, + + /// + /// Return the kerning vector in original font units. + /// + Unscaled + } +} diff --git a/SharpFont/Source/SharpFontShared/LcdFilter.cs b/SharpFont/Source/SharpFontShared/LcdFilter.cs new file mode 100644 index 000000000..075773dd4 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/LcdFilter.cs @@ -0,0 +1,61 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of values to identify various types of LCD filters. + /// + public enum LcdFilter + { + /// + /// Do not perform filtering. When used with subpixel rendering, this results in sometimes severe color + /// fringes. + /// + None = 0, + + /// + /// The default filter reduces color fringes considerably, at the cost of a slight blurriness in the output. + /// + Default = 1, + + /// + /// The light filter is a variant that produces less blurriness at the cost of slightly more color fringes than + /// the default one. It might be better, depending on taste, your monitor, or your personal vision. + /// + Light = 2, + + /// + /// This filter corresponds to the original libXft color filter. It provides high contrast output but can + /// exhibit really bad color fringes if glyphs are not extremely well hinted to the pixel grid. In other words, + /// it only works well if the TrueType bytecode interpreter is enabled and high-quality hinted fonts are used. + /// + /// This filter is only provided for comparison purposes, and might be disabled or stay unsupported in the + /// future. + /// + Legacy = 16 + } +} diff --git a/SharpFont/Source/SharpFontShared/Library.cs b/SharpFont/Source/SharpFontShared/Library.cs new file mode 100644 index 000000000..5d4fc205e --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Library.cs @@ -0,0 +1,897 @@ +#region MIT License +/*Copyright (c) 2012-2014, 2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Linq; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +using SharpFont.Cache; +using SharpFont.Internal; +using SharpFont.TrueType; + +namespace SharpFont +{ + /// + /// A handle to a FreeType library instance. Each ‘library’ is completely independent from the others; it is the + /// ‘root’ of a set of objects like fonts, faces, sizes, etc. + /// + /// It also embeds a memory manager (see ), as well as a scan-line converter object (see + /// ). + /// + /// For multi-threading applications each thread should have its own object. + /// + public sealed class Library : IDisposable + { + #region Fields + + private IntPtr reference; + + private bool customMemory; + private bool disposed; + + private List childFaces; + private List childGlyphs; + private List childOutlines; + private List childStrokers; + private List childManagers; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// + /// SharpFont assumes that you have the correct version of FreeType for your operating system and processor + /// architecture. If you get a here on Windows, there's a good chance + /// that you're trying to run your program as a 64-bit process and have a 32-bit version of FreeType or vice + /// versa. See the SharpFont.Examples project for how to handle this situation. + /// + public Library() + : this(false) + { + IntPtr libraryRef; + Error err = FT.FT_Init_FreeType(out libraryRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + Reference = libraryRef; + } + + /// + /// Initializes a new instance of the class. + /// + /// A custom FreeType memory manager. + public Library(Memory memory) + : this(false) + { + IntPtr libraryRef; + Error err = FT.FT_New_Library(memory.Reference, out libraryRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + Reference = libraryRef; + customMemory = true; + } + + private Library(bool duplicate) + { + childFaces = new List(); + childGlyphs = new List(); + childOutlines = new List(); + childStrokers = new List(); + childManagers = new List(); + } + + /// + /// Finalizes an instance of the class. + /// + ~Library() + { + Dispose(false); + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the object has been disposed. + /// + public bool IsDisposed + { + get + { + return disposed; + } + } + + /// + /// Gets the version of the FreeType library being used. + /// + public Version Version + { + get + { + if (disposed) + throw new ObjectDisposedException("Version", "Cannot access a disposed object."); + + int major, minor, patch; + FT.FT_Library_Version(Reference, out major, out minor, out patch); + return new Version(major, minor, patch); + } + } + + internal IntPtr Reference + { + get + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + return reference; + } + + set + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + reference = value; + } + } + + #endregion + + #region Methods + + #region Base Interface + + /// + /// This function calls to open a font by its pathname. + /// + /// A path to the font file. + /// The index of the face within the font. The first face has index 0. + /// + /// A handle to a new face object. If ‘faceIndex’ is greater than or equal to zero, it must be non-NULL. + /// + /// + public Face NewFace(string path, int faceIndex) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + return new Face(this, path, faceIndex); + } + + /// + /// This function calls to open a font which has been loaded into memory. + /// + /// + /// You must not deallocate the memory before calling . + /// + /// A pointer to the beginning of the font data. + /// The index of the face within the font. The first face has index 0. + /// + /// A handle to a new face object. If ‘faceIndex’ is greater than or equal to zero, it must be non-NULL. + /// + /// + public Face NewMemoryFace(byte[] file, int faceIndex) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + return new Face(this, file, faceIndex); + } + + /// + /// This function calls to open a font which has been loaded into memory. + /// + /// A pointer to the beginning of the font data. + /// Length of the buffer + /// The index of the face within the font. The first face has index 0. + /// + /// A handle to a new face object. If ‘faceIndex’ is greater than or equal to zero, it must be non-NULL. + /// + public Face NewMemoryFace(IntPtr bufferPtr, int length, int faceIndex) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + return new Face(this, bufferPtr, length, faceIndex); + } + + /// + /// Create a object from a given resource described by . + /// + /// + /// Unlike FreeType 1.x, this function automatically creates a glyph slot for the face object which can be + /// accessed directly through . + /// + /// OpenFace can be used to quickly check whether the font format of a given font resource is supported by + /// FreeType. If the ‘faceIndex’ field is negative, the function's return value is 0 if the font format is + /// recognized, or non-zero otherwise; the function returns a more or less empty face handle in ‘*aface’ (if + /// ‘aface’ isn't NULL). The only useful field in this special case is which gives + /// the number of faces within the font file. After examination, the returned structure + /// should be deallocated with a call to . + /// + /// Each new face object created with this function also owns a default object, accessible + /// as . + /// + /// See the discussion of reference counters in the description of FT_Reference_Face. + /// + /// + /// A pointer to an structure which must be filled by the caller. + /// + /// The index of the face within the font. The first face has index 0. + /// + /// A handle to a new face object. If ‘faceIndex’ is greater than or equal to zero, it must be non-NULL. + /// + public Face OpenFace(OpenArgs args, int faceIndex) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + IntPtr faceRef; + + Error err = FT.FT_Open_Face(Reference, args.Reference, faceIndex, out faceRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new Face(faceRef, this); + } + + #endregion + +#if !SHARPFONT_PLATFORM_IOS + #region Mac Specific Interface + + /// + /// Create a new face object from a FOND resource. + /// + /// + /// This function can be used to create objects from fonts that are installed in the system + /// as follows. + /// + /// fond = GetResource( 'FOND', fontName ); + /// error = FT_New_Face_From_FOND( library, fond, 0, &face ); + /// + /// + /// A FOND resource. + /// Only supported for the -1 ‘sanity check’ special case. + /// A handle to a new face object. + public Face NewFaceFromFond(IntPtr fond, int faceIndex) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + IntPtr faceRef; + + Error err = FT.FT_New_Face_From_FOND(Reference, fond, faceIndex, out faceRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new Face(faceRef, this); + } + + /// + /// Create a new face object from a given resource and typeface index using an FSSpec to the font file. + /// + /// + /// is identical to except it accepts an FSSpec instead + /// of a path. + /// + /// FSSpec to the font file. + /// The index of the face within the resource. The first face has index 0. + /// A handle to a new face object. + public Face NewFaceFromFSSpec(IntPtr spec, int faceIndex) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + IntPtr faceRef; + + Error err = FT.FT_New_Face_From_FSSpec(Reference, spec, faceIndex, out faceRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new Face(faceRef, this); + } + + /// + /// Create a new face object from a given resource and typeface index using an FSRef to the font file. + /// + /// + /// is identical to except it accepts an FSRef instead of + /// a path. + /// + /// FSRef to the font file. + /// The index of the face within the resource. The first face has index 0. + /// A handle to a new face object. + public Face NewFaceFromFSRef(IntPtr @ref, int faceIndex) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + IntPtr faceRef; + + Error err = FT.FT_New_Face_From_FSRef(Reference, @ref, faceIndex, out faceRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return new Face(faceRef, this); + } + + #endregion +#endif + + #region Module Management + + /// + /// Add a new module to a given library instance. + /// + /// + /// An error will be returned if a module already exists by that name, or if the module requires a version of + /// FreeType that is too great. + /// + /// A pointer to class descriptor for the module. + public void AddModule(ModuleClass clazz) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + Error err = FT.FT_Add_Module(Reference, clazz.Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Find a module by its name. + /// + /// + /// FreeType's internal modules aren't documented very well, and you should look up the source code for + /// details. + /// + /// The module's name (as an ASCII string). + /// A module handle. 0 if none was found. + public Module GetModule(string moduleName) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + return new Module(FT.FT_Get_Module(Reference, moduleName)); + } + + /// + /// Remove a given module from a library instance. + /// + /// + /// The module object is destroyed by the function in case of success. + /// + /// A handle to a module object. + public void RemoveModule(Module module) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + if (module == null) + throw new ArgumentNullException("module"); + + Error err = FT.FT_Remove_Module(Reference, module.Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Set a property for a given module. + /// + /// The module name. + /// The property name. Properties are described in the ‘Synopsis’ subsection + /// of the module's documentation. + /// + /// Note that only a few modules have properties. + /// A generic pointer to a variable or structure which gives the new value of the property. + /// The exact definition of ‘value’ is dependent on the property; see the ‘Synopsis’ subsection of the module's + /// documentation. + public void PropertySet(string moduleName, string propertyName, IntPtr value) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + Error err = FT.FT_Property_Set(Reference, moduleName, propertyName, value); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Set a property for a given module. + /// + /// The type of property to set. + /// The module name. + /// The property name. Properties are described in the ‘Synopsis’ subsection + /// of the module's documentation. + /// + /// Note that only a few modules have properties. + /// A generic pointer to a variable or structure which gives the new value of the property. + /// The exact definition of ‘value’ is dependent on the property; see the ‘Synopsis’ subsection of the module's + /// documentation. + public void PropertySet(string moduleName, string propertyName, ref T value) + where T : struct + { + GCHandle gch = GCHandle.Alloc(value, GCHandleType.Pinned); + PropertySet(moduleName, propertyName, gch.AddrOfPinnedObject()); + gch.Free(); + } + + /// + /// Set a property for a given module. + /// + /// The type of property to set. + /// The module name. + /// The property name. Properties are described in the ‘Synopsis’ subsection + /// of the module's documentation. + /// + /// Note that only a few modules have properties. + /// A generic pointer to a variable or structure which gives the new value of the property. + /// The exact definition of ‘value’ is dependent on the property; see the ‘Synopsis’ subsection of the module's + /// documentation. + public void PropertySet(string moduleName, string propertyName, T value) + where T : struct + { + PropertySet(moduleName, propertyName, ref value); + } + + /// + /// Set a property for a given module. + /// + /// The module name. + /// The property name. Properties are described in the ‘Synopsis’ subsection + /// of the module's documentation. + /// + /// Note that only a few modules have properties. + /// A generic pointer to a variable or structure which gives the new value of the property. + /// The exact definition of ‘value’ is dependent on the property; see the ‘Synopsis’ subsection of the module's + /// documentation. + public void PropertySet(string moduleName, string propertyName, GlyphToScriptMapProperty value) + { + var rec = value.Rec; + PropertySet(moduleName, propertyName, ref rec); + } + + /// + /// Set a property for a given module. + /// + /// The module name. + /// The property name. Properties are described in the ‘Synopsis’ subsection + /// of the module's documentation. + /// + /// Note that only a few modules have properties. + /// A generic pointer to a variable or structure which gives the new value of the property. + /// The exact definition of ‘value’ is dependent on the property; see the ‘Synopsis’ subsection of the module's + /// documentation. + public void PropertySet(string moduleName, string propertyName, IncreaseXHeightProperty value) + { + var rec = value.Rec; + PropertySet(moduleName, propertyName, ref rec); + } + + /// + /// Get a module's property value. + /// + /// The module name. + /// The property name. Properties are described in the ‘Synopsis’ subsection of the + /// module's documentation. + /// A generic pointer to a variable or structure which gives the value of the property. The + /// exact definition of ‘value’ is dependent on the property; see the ‘Synopsis’ subsection of the module's + /// documentation. + public void PropertyGet(string moduleName, string propertyName, IntPtr value) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + Error err = FT.FT_Property_Get(Reference, moduleName, propertyName, value); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Get a module's property value. + /// + /// The type of property to get. + /// The module name. + /// The property name. Properties are described in the ‘Synopsis’ subsection of the + /// module's documentation. + /// The value read from the module. + public void PropertyGet(string moduleName, string propertyName, out T value) + where T : struct + { + value = default(T); + + GCHandle gch = GCHandle.Alloc(value, GCHandleType.Pinned); + PropertyGet(moduleName, propertyName, gch.AddrOfPinnedObject()); + value = PInvokeHelper.PtrToStructure(gch.AddrOfPinnedObject()); + gch.Free(); + } + + /// + /// Get a module's property value. + /// + /// The module name. + /// The property name. Properties are described in the ‘Synopsis’ subsection of the + /// module's documentation. + /// The value read from the module. + [Obsolete("Use PropertyGetGlyphToScriptMap instead")] + public void PropertyGet(string moduleName, string propertyName, out GlyphToScriptMapProperty value) + { + value = PropertyGetGlyphToScriptMap(moduleName, propertyName); + } + + /// + /// Get a module's property value. + /// + /// The module name. + /// The property name. Properties are described in the ‘Synopsis’ subsection of the + /// module's documentation. + /// The value read from the module. + [Obsolete("Use PropertyGetIncreaseXHeight instead")] + public void PropertyGet(string moduleName, string propertyName, out IncreaseXHeightProperty value) + { + value = PropertyGetIncreaseXHeight(moduleName, propertyName); + } + + /// + /// Gets a module's property value of the type . + /// + /// The module name. + /// The property name. Properties are described in the ‘Synopsis’ subsection of the + /// module's documentation. + /// The value read from the module. + public GlyphToScriptMapProperty PropertyGetGlyphToScriptMap(string moduleName, string propertyName) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + GlyphToScriptMapPropertyRec rec; + PropertyGet(moduleName, propertyName, out rec); + + Face face = childFaces.Find(f => f.Reference == rec.face); + return new GlyphToScriptMapProperty(rec, face); + } + + /// + /// Gets a module's property value of the type . + /// + /// The module name. + /// The property name. Properties are described in the ‘Synopsis’ subsection of the + /// module's documentation. + /// The value read from the module. + public IncreaseXHeightProperty PropertyGetIncreaseXHeight(string moduleName, string propertyName) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + IncreaseXHeightPropertyRec rec; + PropertyGet(moduleName, propertyName, out rec); + + Face face = childFaces.Find(f => f.Reference == rec.face); + return new IncreaseXHeightProperty(rec, face); + } + + /// + /// Set a debug hook function for debugging the interpreter of a font format. + /// + /// + /// Currently, four debug hook slots are available, but only two (for the TrueType and the Type 1 interpreter) + /// are defined. + /// + /// Since the internal headers of FreeType are no longer installed, the symbol ‘FT_DEBUG_HOOK_TRUETYPE’ isn't + /// available publicly. This is a bug and will be fixed in a forthcoming release. + /// + /// The index of the debug hook. You should use the values defined in ‘ftobjs.h’, e.g., + /// ‘FT_DEBUG_HOOK_TRUETYPE’. + /// The function used to debug the interpreter. + [CLSCompliant(false)] + public void SetDebugHook(uint hookIndex, IntPtr debugHook) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + FT.FT_Set_Debug_Hook(Reference, hookIndex, debugHook); + } + + /// + /// Add the set of default drivers to a given library object. This is only useful when you create a library + /// object with (usually to plug a custom memory manager). + /// + public void AddDefaultModules() + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + FT.FT_Add_Default_Modules(Reference); + } + + /// + /// Retrieve the current renderer for a given glyph format. + /// + /// + /// An error will be returned if a module already exists by that name, or if the module requires a version of + /// FreeType that is too great. + /// + /// To add a new renderer, simply use . To retrieve a renderer by its name, use + /// . + /// + /// The glyph format. + /// A renderer handle. 0 if none found. + [CLSCompliant(false)] + public Renderer GetRenderer(GlyphFormat format) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + return new Renderer(FT.FT_Get_Renderer(Reference, format)); + } + + /// + /// Set the current renderer to use, and set additional mode. + /// + /// + /// In case of success, the renderer will be used to convert glyph images in the renderer's known format into + /// bitmaps. + /// + /// This doesn't change the current renderer for other formats. + /// + /// Currently, only the B/W renderer, if compiled with FT_RASTER_OPTION_ANTI_ALIASING (providing a 5-levels + /// anti-aliasing mode; this option must be set directly in ‘ftraster.c’ and is undefined by default) accepts a + /// single tag ‘pal5’ to set its gray palette as a character string with 5 elements. Consequently, the third + /// and fourth argument are zero normally. + /// + /// A handle to the renderer object. + /// The number of additional parameters. + /// Additional parameters. + [CLSCompliant(false)] + public unsafe void SetRenderer(Renderer renderer, uint numParams, Parameter[] parameters) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + if (renderer == null) + throw new ArgumentNullException("renderer"); + + if (parameters == null) + throw new ArgumentNullException("parameters"); + + ParameterRec[] paramRecs = parameters.Select(x => x.Record).ToArray(); + fixed (void* ptr = paramRecs) + { + Error err = FT.FT_Set_Renderer(Reference, renderer.Reference, numParams, (IntPtr)ptr); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + } + + #endregion + + #region LCD Filtering + + /// + /// This function is used to apply color filtering to LCD decimated bitmaps, like the ones used when calling + /// with or + /// . + /// + /// + /// This feature is always disabled by default. Clients must make an explicit call to this function with a + /// ‘filter’ value other than in order to enable it. + /// + /// Due to PATENTS covering subpixel rendering, this function doesn't do anything except returning + /// if the configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is + /// not defined in your build of the library, which should correspond to all default builds of FreeType. + /// + /// The filter affects glyph bitmaps rendered through , + /// , , and . + /// + /// It does not affect the output of and + /// . + /// + /// If this feature is activated, the dimensions of LCD glyph bitmaps are either larger or taller than the + /// dimensions of the corresponding outline with regards to the pixel grid. For example, for + /// , the filter adds up to 3 pixels to the left, and up to 3 pixels to the right. + /// + /// The bitmap offset values are adjusted correctly, so clients shouldn't need to modify their layout and glyph + /// positioning code when enabling the filter. + /// + /// + /// The filter type. + /// + /// You can use here to disable this feature, or + /// to use a default filter that should work well on most LCD screens. + /// + public void SetLcdFilter(LcdFilter filter) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + Error err = FT.FT_Library_SetLcdFilter(Reference, filter); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Use this function to override the filter weights selected by . By default, + /// FreeType uses the quintuple (0x00, 0x55, 0x56, 0x55, 0x00) for , and (0x10, + /// 0x40, 0x70, 0x40, 0x10) for and . + /// + /// + /// Due to PATENTS covering subpixel rendering, this function doesn't do anything except returning + /// if the configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is + /// not defined in your build of the library, which should correspond to all default builds of FreeType. + /// + /// This function must be called after to have any effect. + /// + /// + /// A pointer to an array; the function copies the first five bytes and uses them to specify the filter + /// weights. + /// + public void SetLcdFilterWeights(byte[] weights) + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + if (weights == null) + throw new ArgumentNullException("weights"); + + Error err = FT.FT_Library_SetLcdFilterWeights(Reference, weights); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + #endregion + + #region The TrueType Engine + + /// + /// Return an value to indicate which level of the TrueType virtual machine a given + /// library instance supports. + /// + /// A value indicating which level is supported. + public EngineType GetTrueTypeEngineType() + { + if (disposed) + throw new ObjectDisposedException("Library", "Cannot access a disposed object."); + + return FT.FT_Get_TrueType_Engine_Type(Reference); + } + + #endregion + + /// + /// Disposes the Library. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + internal void AddChildFace(Face child) + { + childFaces.Add(child); + } + + internal void RemoveChildFace(Face child) + { + childFaces.Remove(child); + } + + internal void AddChildGlyph(Glyph child) + { + childGlyphs.Add(child); + } + + internal void RemoveChildGlyph(Glyph child) + { + childGlyphs.Remove(child); + } + + internal void AddChildOutline(Outline child) + { + childOutlines.Add(child); + } + + internal void RemoveChildOutline(Outline child) + { + childOutlines.Remove(child); + } + + internal void AddChildStroker(Stroker child) + { + childStrokers.Add(child); + } + + internal void RemoveChildStroker(Stroker child) + { + childStrokers.Remove(child); + } + + internal void AddChildManager(Manager child) + { + childManagers.Add(child); + } + + internal void RemoveChildManager(Manager child) + { + childManagers.Remove(child); + } + + private void Dispose(bool disposing) + { + if (!disposed) + { + disposed = true; + + //dipose all the children before disposing the library. + foreach (Face f in childFaces) + f.Dispose(); + + foreach (Glyph g in childGlyphs) + g.Dispose(); + + foreach (Outline o in childOutlines) + o.Dispose(); + + foreach (Stroker s in childStrokers) + s.Dispose(); + + foreach (Manager m in childManagers) + m.Dispose(); + + childFaces.Clear(); + childGlyphs.Clear(); + childOutlines.Clear(); + childStrokers.Clear(); + childManagers.Clear(); + + Error err = customMemory ? FT.FT_Done_Library(reference) : FT.FT_Done_FreeType(reference); + reference = IntPtr.Zero; + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/ListNode.cs b/SharpFont/Source/SharpFontShared/ListNode.cs new file mode 100644 index 000000000..dd094d3b4 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/ListNode.cs @@ -0,0 +1,108 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A structure used to hold a single list element. + /// + public class ListNode: NativeObject + { + #region Fields + + private ListNodeRec rec; + + #endregion + + #region Constructors + + internal ListNode(IntPtr reference): base(reference) + { + } + + #endregion + + #region Properties + + /// + /// Gets the previous element in the list. NULL if first. + /// + public ListNode Previous + { + get + { + if (rec.prev == IntPtr.Zero) + return null; + + return new ListNode(rec.prev); + } + } + + /// + /// Gets the next element in the list. NULL if last. + /// + public ListNode Next + { + get + { + if (rec.next == IntPtr.Zero) + return null; + + return new ListNode(rec.next); + } + } + + /// + /// Gets a typeless pointer to the listed object. + /// + public IntPtr Data + { + get + { + return rec.data; + } + } + + internal override IntPtr Reference + { + get + { + return base.Reference; + } + + set + { + base.Reference = value; + rec = PInvokeHelper.PtrToStructure(value); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/LoadFlags.cs b/SharpFont/Source/SharpFontShared/LoadFlags.cs new file mode 100644 index 000000000..54cc15c1a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/LoadFlags.cs @@ -0,0 +1,196 @@ +#region MIT License +/*Copyright (c) 2012-2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of bit-field constants used with to indicate what kind of operations to + /// perform during glyph loading. + /// + /// + /// By default, hinting is enabled and the font's native hinter (see ) is preferred + /// over the auto-hinter. You can disable hinting by setting or change the + /// precedence by setting . You can also set + /// in case you don't want the auto-hinter to be used at all. + /// + /// See the description of for a special exception (affecting only a handful of + /// Asian fonts). + /// + /// Besides deciding which hinter to use, you can also decide which hinting algorithm to use. See + /// for details. + /// + [Flags] + [CLSCompliant(false)] + public enum LoadFlags : uint + { + /// + /// Corresponding to 0, this value is used as the default glyph load operation. In this case, the following + /// happens: + /// + /// + /// FreeType looks for a bitmap for the glyph corresponding to the face's current size. If one is found, the + /// function returns. The bitmap data can be accessed from the glyph slot (see note below). + /// + /// + /// If no embedded bitmap is searched or found, FreeType looks for a scalable outline. If one is found, it is + /// loaded from the font file, scaled to device pixels, then ‘hinted’ to the pixel grid in order to optimize + /// it. The outline data can be accessed from the glyph slot (see note below). + /// + /// + /// Note that by default, the glyph loader doesn't render outlines into bitmaps. The following flags are used + /// to modify this default behaviour to more specific and useful cases. + /// + Default = 0x000000, + + /// + /// Don't scale the outline glyph loaded, but keep it in font units. + /// + /// This flag implies and , and unsets + /// . + /// + NoScale = 0x000001, + + /// + /// Disable hinting. This generally generates ‘blurrier’ bitmap glyph when the glyph is rendered in any of the + /// anti-aliased modes. See also the note below. + /// + /// This flag is implied by . + /// + NoHinting = 0x000002, + + /// + /// Call after the glyph is loaded. By default, the glyph is rendered in + /// mode. This can be overridden by or + /// . + /// + /// This flag is unset by . + /// + Render = 0x000004, + + /// + /// Ignore bitmap strikes when loading. Bitmap-only fonts ignore this flag. + /// + /// always sets this flag. + /// + NoBitmap = 0x000008, + + /// + /// Load the glyph for vertical text layout. Don't use it as it is problematic currently. + /// + VerticalLayout = 0x000010, + + /// + /// Indicates that the auto-hinter is preferred over the font's native hinter. See also the note below. + /// + ForceAutohint = 0x000020, + + /// + /// Indicates that the font driver should crop the loaded bitmap glyph (i.e., remove all space around its black + /// bits). Not all drivers implement this. + /// + CropBitmap = 0x000040, + + /// + /// Indicates that the font driver should perform pedantic verifications during glyph loading. This is mostly + /// used to detect broken glyphs in fonts. By default, FreeType tries to handle broken fonts also. + /// + Pedantic = 0x000080, + + /// + /// Ignored. Deprecated. + /// + [Obsolete("Ignored. Deprecated.")] + IgnoreGlobalAdvanceWidth = 0x000200, + + /// + /// This flag is only used internally. It merely indicates that the font driver should not load composite + /// glyphs recursively. Instead, it should set the ‘num_subglyph’ and ‘subglyphs’ values of the glyph slot + /// accordingly, and set ‘glyph->format’ to . + /// + /// The description of sub-glyphs is not available to client applications for now. + /// + /// This flag implies and . + /// + NoRecurse = 0x000400, + + /// + /// Indicates that the transform matrix set by should be ignored. + /// + IgnoreTransform = 0x000800, + + /// + /// This flag is used with to indicate that you want to render an outline glyph + /// to a 1-bit monochrome bitmap glyph, with 8 pixels packed into each byte of the bitmap data. + /// + /// Note that this has no effect on the hinting algorithm used. You should rather use + /// so that the monochrome-optimized hinting algorithm is used. + /// + Monochrome = 0x001000, + + /// + /// Indicates that the ‘linearHoriAdvance’ and ‘linearVertAdvance’ fields of should be + /// kept in font units. See for details. + /// + LinearDesign = 0x002000, + + /// + /// Disable auto-hinter. See also the note below. + /// + NoAutohint = 0x008000, + + /// + /// This flag is used to request loading of color embedded-bitmap images. The resulting color bitmaps, if + /// available, will have the format. When the flag is not used and color bitmaps + /// are found, they will be converted to 256-level gray bitmaps transparently. Those bitmaps will be in the + /// format. + /// + Color = 0x100000, + + /// + /// This flag sets computing glyph metrics without the use of bundled + /// metrics tables. Well-behaving fonts have optimized bundled metrics + /// and these should be used. This flag is mainly used by font + /// validating or font editing applications which need to ignore, verify + /// or edit those tables. + /// + ComputeMetrics = 0x200000, + + /// + /// A bit-flag to be OR-ed with the ‘flags’ parameter of the and + /// functions. + /// + /// If set, it indicates that you want these functions to fail if the corresponding hinting mode or font driver + /// doesn't allow for very quick advance computation. + /// + /// Typically, glyphs which are either unscaled, unhinted, bitmapped, or light-hinted can have their advance + /// width computed very quickly. + /// + /// Normal and bytecode hinted modes, which require loading, scaling, and hinting of the glyph outline, are + /// extremely slow by comparison. + /// + AdvanceFlagFastOnly = 0x20000000 + } +} diff --git a/SharpFont/Source/SharpFontShared/LoadTarget.cs b/SharpFont/Source/SharpFontShared/LoadTarget.cs new file mode 100644 index 000000000..c41aad440 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/LoadTarget.cs @@ -0,0 +1,88 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of values that are used to select a specific hinting algorithm to use by the hinter. You should OR one + /// of these values to your ‘load_flags’ when calling . + /// + /// Note that font's native hinters may ignore the hinting algorithm you have specified (e.g., the TrueType + /// bytecode interpreter). You can set to ensure that the auto-hinter is + /// used. + /// + /// Also note that is an exception, in that it always implies + /// . + /// + /// + /// You should use only one of the values in your ‘load_flags’. They can't be ORed. + /// + /// If is also set, the glyph is rendered in the corresponding mode (i.e., the mode + /// which matches the used algorithm best) unless is set. + /// + /// You can use a hinting algorithm that doesn't correspond to the same rendering mode. As an example, it is + /// possible to use the ‘light’ hinting algorithm and have the results rendered in horizontal LCD pixel mode, with + /// code like: + /// + /// FT_Load_Glyph( face, glyph_index, + /// load_flags | FT_LOAD_TARGET_LIGHT ); + /// + /// FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); + /// + /// + public enum LoadTarget + { + /// + /// This corresponds to the default hinting algorithm, optimized for standard gray-level rendering. For + /// monochrome output, use instead. + /// + Normal = (RenderMode.Normal & 15) << 16, + + /// + /// A lighter hinting algorithm for non-monochrome modes. Many generated glyphs are more fuzzy but better + /// resemble its original shape. A bit like rendering on Mac OS X. + /// + /// As a special exception, this target implies . + /// + Light = (RenderMode.Light & 15) << 16, + + /// + /// Strong hinting algorithm that should only be used for monochrome output. The result is probably unpleasant + /// if the glyph is rendered in non-monochrome modes. + /// + Mono = (RenderMode.Mono & 15) << 16, + + /// + /// A variant of optimized for horizontally decimated LCD displays. + /// + Lcd = (RenderMode.Lcd & 15) << 16, + + /// + /// A variant of optimized for vertically decimated LCD displays. + /// + VerticalLcd = (RenderMode.VerticalLcd & 15) << 16 + } +} diff --git a/SharpFont/Source/SharpFontShared/Memory.cs b/SharpFont/Source/SharpFontShared/Memory.cs new file mode 100644 index 000000000..9deb8a4a7 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Memory.cs @@ -0,0 +1,174 @@ +#region MIT License +/*Copyright (c) 2012-2014 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A function used to allocate ‘size’ bytes from ‘memory’. + /// + /// A handle to the source memory manager. + /// The size in bytes to allocate. + /// Address of new memory block. 0 in case of failure. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate IntPtr AllocFunc(NativeReference memory, IntPtr size); + + /// + /// A function used to release a given block of memory. + /// + /// A handle to the source memory manager. + /// The address of the target memory block. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void FreeFunc(NativeReference memory, IntPtr block); + + /// + /// A function used to re-allocate a given block of memory. + /// + /// + /// In case of error, the old block must still be available. + /// + /// A handle to the source memory manager. + /// The block's current size in bytes. + /// The block's requested new size. + /// The block's current address. + /// New block address. 0 in case of memory shortage. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate IntPtr ReallocFunc(NativeReference memory, IntPtr currentSize, IntPtr newSize, IntPtr block); + + /// + /// A structure used to describe a given memory manager to FreeType 2. + /// + public class Memory: NativeObject + { + #region Fields + + private MemoryRec rec; + + #endregion + + #region Constructors + + internal Memory(IntPtr reference): base(reference) + { + } + + #endregion + + #region Properties + + /// + /// Gets a generic typeless pointer for user data. + /// + public IntPtr User + { + get + { + return rec.user; + } + } + + /// + /// Gets a pointer type to an allocation function. + /// + public AllocFunc Allocate + { + get + { + return rec.alloc; + } + } + + /// + /// Gets a pointer type to an memory freeing function. + /// + public FreeFunc Free + { + get + { + return rec.free; + } + } + + /// + /// Gets a pointer type to a reallocation function. + /// + public ReallocFunc Reallocate + { + get + { + return rec.realloc; + } + } + + internal override IntPtr Reference + { + get + { + return base.Reference; + } + + set + { + base.Reference = value; + rec = PInvokeHelper.PtrToStructure(value); + } + } + + #endregion + + #region Methods + + /// + /// Decompress a zipped input buffer into an output buffer. This function is modeled after zlib's ‘uncompress’ + /// function. + /// + /// + /// This function may return if your build of FreeType was not + /// compiled with zlib support. + /// + /// The input buffer. + /// The output buffer. + /// The length of the used data in output. + public unsafe int GzipUncompress(byte[] input, byte[] output) + { + IntPtr len = (IntPtr)output.Length; + + fixed (byte* inPtr = input, outPtr = output) + { + Error err = FT.FT_Gzip_Uncompress(Reference, (IntPtr)outPtr, ref len, (IntPtr)inPtr, (IntPtr)input.Length); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + return (int)len; + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Module.cs b/SharpFont/Source/SharpFontShared/Module.cs new file mode 100644 index 000000000..cd59ec699 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Module.cs @@ -0,0 +1,43 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A handle to a given FreeType module object. Each module can be a font driver, a renderer, or anything else that + /// provides services to the formers. + /// + public sealed class Module : NativeObject + { + #region Constructors + + internal Module(IntPtr reference): base(reference) + { + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/ModuleClass.cs b/SharpFont/Source/SharpFontShared/ModuleClass.cs new file mode 100644 index 000000000..d6a80db57 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/ModuleClass.cs @@ -0,0 +1,194 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A function used to initialize (not create) a new module object. + /// + /// The module to initialize. + /// FreeType error code. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate Error ModuleConstructor(NativeReference module); + + /// + /// A function used to finalize (not destroy) a given module object. + /// + /// The module to finalize. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void ModuleDestructor(NativeReference module); + + /// + /// A function used to query a given module for a specific interface. + /// + /// The module that contains the interface. + /// The name of the interface in the module. + /// The interface. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate IntPtr ModuleRequester(NativeReference module, [MarshalAs(UnmanagedType.LPStr)] string name); + + /// + /// The module class descriptor. + /// + public class ModuleClass : NativeObject + { + #region Fields + + private ModuleClassRec rec; + + #endregion + + #region Constructors + + internal ModuleClass(IntPtr reference) : base(reference) + { + } + + #endregion + + #region Properties + + /// + /// Gets bit flags describing the module. + /// + [CLSCompliant(false)] + public uint Flags + { + get + { + return rec.module_flags; + } + } + + /// + /// Gets the size of one module object/instance in bytes. + /// + public int Size + { + get + { + return (int)rec.module_size; + } + } + + /// + /// Gets the name of the module. + /// + public string Name + { + get + { + return rec.module_name; + } + } + + /// + /// Gets the version, as a 16.16 fixed number (major.minor). + /// + public Fixed16Dot16 Version + { + get + { + return Fixed16Dot16.FromRawValue((int)rec.module_version); + } + } + + /// + /// Gets the version of FreeType this module requires, as a 16.16 fixed number (major.minor). Starts at version + /// 2.0, i.e., 0x20000. + /// + public Fixed16Dot16 Requires + { + get + { + return Fixed16Dot16.FromRawValue((int)rec.module_requires); + } + } + + /// + /// Get the module interface. + /// + public IntPtr Interface + { + get + { + return rec.module_interface; + } + } + + /// + /// Gets the initializing function. + /// + public ModuleConstructor Init + { + get + { + return rec.module_init; + } + } + + /// + /// Gets the finalizing function. + /// + public ModuleDestructor Done + { + get + { + return rec.module_done; + } + } + + /// + /// Gets the interface requesting function. + /// + public ModuleRequester GetInterface + { + get + { + return rec.get_interface; + } + } + + internal override IntPtr Reference + { + get + { + return base.Reference; + } + + set + { + base.Reference = value; + rec = PInvokeHelper.PtrToStructure(value); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MMAxisRec.cs b/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MMAxisRec.cs new file mode 100644 index 000000000..75188cff1 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MMAxisRec.cs @@ -0,0 +1,42 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.MultipleMasters.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct MMAxisRec + { + [MarshalAs(UnmanagedType.LPStr)] + internal string name; + + internal FT_Long minimum; + internal FT_Long maximum; + } +} diff --git a/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MMVarRec.cs b/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MMVarRec.cs new file mode 100644 index 000000000..12ce4b690 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MMVarRec.cs @@ -0,0 +1,39 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.MultipleMasters.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct MMVarRec + { + internal uint num_axis; + internal uint num_designs; + internal uint num_namedstyles; + internal IntPtr axis; + internal IntPtr namedstyle; + } +} diff --git a/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MultiMasterRec.cs b/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MultiMasterRec.cs new file mode 100644 index 000000000..8c1d66d25 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/MultiMasterRec.cs @@ -0,0 +1,39 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.MultipleMasters.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct MultiMasterRec + { + internal uint num_axis; + internal uint num_designs; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + internal MMAxisRec[] axis; + } +} diff --git a/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/VarAxisRec.cs b/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/VarAxisRec.cs new file mode 100644 index 000000000..9524436d2 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/VarAxisRec.cs @@ -0,0 +1,46 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.MultipleMasters.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct VarAxisRec + { + [MarshalAs(UnmanagedType.LPStr)] + internal string name; + + internal FT_Long minimum; + internal FT_Long def; + internal FT_Long maximum; + + internal FT_ULong tag; + internal uint strid; + } +} diff --git a/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/VarNamedStyleRec.cs b/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/VarNamedStyleRec.cs new file mode 100644 index 000000000..c0ee4fcf0 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/MultipleMasters/Internal/VarNamedStyleRec.cs @@ -0,0 +1,36 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.MultipleMasters.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct VarNamedStyleRec + { + internal IntPtr coords; + internal uint strid; + } +} diff --git a/SharpFont/Source/SharpFontShared/MultipleMasters/MMAxis.cs b/SharpFont/Source/SharpFontShared/MultipleMasters/MMAxis.cs new file mode 100644 index 000000000..9cbed9a5a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/MultipleMasters/MMAxis.cs @@ -0,0 +1,111 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.MultipleMasters.Internal; + +namespace SharpFont.MultipleMasters +{ + /// + /// A simple structure used to model a given axis in design space for Multiple Masters fonts. + /// + /// This structure can't be used for GX var fonts. + /// + public class MMAxis + { + #region Fields + + private IntPtr reference; + private MMAxisRec rec; + + #endregion + + #region Constructors + + internal MMAxis(IntPtr reference) + { + Reference = reference; + } + + internal MMAxis(MMAxisRec axisInternal) + { + this.rec = axisInternal; + } + + #endregion + + #region Properties + + /// + /// Gets the axis's name. + /// + public string Name + { + get + { + return rec.name; + } + } + + /// + /// Gets the axis's minimum design coordinate. + /// + public int Minimum + { + get + { + return (int)rec.minimum; + } + } + + /// + /// Gets the axis's maximum design coordinate. + /// + public int Maximum + { + get + { + return (int)rec.maximum; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/MultipleMasters/MMVar.cs b/SharpFont/Source/SharpFontShared/MultipleMasters/MMVar.cs new file mode 100644 index 000000000..3969583ab --- /dev/null +++ b/SharpFont/Source/SharpFontShared/MultipleMasters/MMVar.cs @@ -0,0 +1,134 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.MultipleMasters.Internal; + +namespace SharpFont.MultipleMasters +{ + /// + /// A structure used to model the axes and space of a Multiple Masters or GX var distortable font. + /// + /// Some fields are specific to one format and not to the other. + /// + public class MMVar + { + #region Fields + + private IntPtr reference; + private MMVarRec rec; + + #endregion + + #region Constructors + + internal MMVar(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the number of axes. The maximum value is 4 for MM; no limit in GX. + /// + [CLSCompliant(false)] + public uint AxisCount + { + get + { + return rec.num_axis; + } + } + + /// + /// Gets the number of designs; should be normally 2^num_axis for MM fonts. Not meaningful for GX (where every + /// glyph could have a different number of designs). + /// + [CLSCompliant(false)] + public uint DesignsCount + { + get + { + return rec.num_designs; + } + } + + /// + /// Gets the number of named styles; only meaningful for GX which allows certain design coordinates to have a + /// string ID (in the ‘name’ table) associated with them. The font can tell the user that, for example, + /// Weight=1.5 is ‘Bold’. + /// + [CLSCompliant(false)] + public uint NamedStylesCount + { + get + { + return rec.num_namedstyles; + } + } + + /// + /// Gets a table of axis descriptors. GX fonts contain slightly more data than MM. + /// + public VarAxis Axis + { + get + { + return new VarAxis(rec.axis); + } + } + + /// + /// Gets a table of named styles. Only meaningful with GX. + /// + public VarNamedStyle NamedStyle + { + get + { + return new VarNamedStyle(rec.namedstyle); + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/MultipleMasters/MultiMaster.cs b/SharpFont/Source/SharpFontShared/MultipleMasters/MultiMaster.cs new file mode 100644 index 000000000..aa0c53200 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/MultipleMasters/MultiMaster.cs @@ -0,0 +1,114 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.MultipleMasters.Internal; + +namespace SharpFont.MultipleMasters +{ + /// + /// A structure used to model the axes and space of a Multiple Masters font. + /// + /// This structure can't be used for GX var fonts. + /// + public class MultiMaster + { + #region Fields + + private IntPtr reference; + private MultiMasterRec rec; + + #endregion + + #region Constructors + + internal MultiMaster(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the number of axes. Cannot exceed 4. + /// + [CLSCompliant(false)] + public uint AxisCount + { + get + { + return rec.num_axis; + } + } + + /// + /// Gets the number of designs; should be normally 2^num_axis even though the Type 1 specification strangely + /// allows for intermediate designs to be present. This number cannot exceed 16. + /// + [CLSCompliant(false)] + public uint DesignsCount + { + get + { + return rec.num_designs; + } + } + + /// + /// Gets a table of axis descriptors. + /// + public MMAxis[] Axis + { + get + { + MMAxis[] axis = new MMAxis[rec.num_axis]; + + for (int i = 0; i < rec.num_axis; i++) + axis[i] = new MMAxis(rec.axis[i]); + + return axis; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/MultipleMasters/VarAxis.cs b/SharpFont/Source/SharpFontShared/MultipleMasters/VarAxis.cs new file mode 100644 index 000000000..8c9b75241 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/MultipleMasters/VarAxis.cs @@ -0,0 +1,140 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.MultipleMasters.Internal; + +namespace SharpFont.MultipleMasters +{ + /// + /// A simple structure used to model a given axis in design space for Multiple Masters and GX var fonts. + /// + public class VarAxis + { + #region Fields + + private IntPtr reference; + private VarAxisRec rec; + + #endregion + + #region Constructors + + internal VarAxis(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the axis's name. Not always meaningful for GX. + /// + public string Name + { + get + { + return rec.name; + } + } + + /// + /// Gets the axis's minimum design coordinate. + /// + public int Minimum + { + get + { + return (int)rec.minimum; + } + } + + /// + /// Gets the axis's default design coordinate. FreeType computes meaningful default values for MM; it is then + /// an integer value, not in 16.16 format. + /// + public int Default + { + get + { + return (int)rec.def; + } + } + + /// + /// Gets the axis's maximum design coordinate. + /// + public int Maximum + { + get + { + return (int)rec.maximum; + } + } + + /// + /// Gets the axis's tag (the GX equivalent to ‘name’). FreeType provides default values for MM if possible. + /// + [CLSCompliant(false)] + public uint Tag + { + get + { + return (uint)rec.tag; + } + } + + /// + /// Gets the entry in ‘name’ table (another GX version of ‘name’). Not meaningful for MM. + /// + [CLSCompliant(false)] + public uint StrId + { + get + { + return rec.strid; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/MultipleMasters/VarNamedStyle.cs b/SharpFont/Source/SharpFontShared/MultipleMasters/VarNamedStyle.cs new file mode 100644 index 000000000..c6a5c2234 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/MultipleMasters/VarNamedStyle.cs @@ -0,0 +1,96 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.MultipleMasters.Internal; + +namespace SharpFont.MultipleMasters +{ + /// + /// A simple structure used to model a named style in a GX var font. + /// + /// This structure can't be used for MM fonts. + /// + public class VarNamedStyle + { + #region Fields + + private IntPtr reference; + private VarNamedStyleRec rec; + + #endregion + + #region Constructors + + internal VarNamedStyle(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the design coordinates for this style. This is an array with one entry for each axis. + /// + public IntPtr Coordinates + { + get + { + return rec.coords; + } + } + + /// + /// Gets the entry in ‘name’ table identifying this style. + /// + [CLSCompliant(false)] + public uint StrId + { + get + { + return rec.strid; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/OpenArgs.cs b/SharpFont/Source/SharpFontShared/OpenArgs.cs new file mode 100644 index 000000000..d32ac6d2b --- /dev/null +++ b/SharpFont/Source/SharpFontShared/OpenArgs.cs @@ -0,0 +1,204 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A structure used to indicate how to open a new font file or stream. A pointer to such a structure can be used + /// as a parameter for the functions and . + /// + /// + /// The stream type is determined by the contents of which are tested in the following order by + /// : + /// + /// + /// If the bit is set, assume that this is a memory file of + /// bytes, located at . The data are are not copied, and the client is responsible for + /// releasing and destroying them after the corresponding call to . + /// + /// + /// Otherwise, if the bit is set, assume that a custom input stream + /// is used. + /// + /// + /// Otherwise, if the bit is set, assume that this is a normal file and use + /// to open it. + /// + /// + /// If the bit is set, only tries to open the file + /// with the driver whose handler is in . + /// + /// + /// If the bit is set, the parameters given by and + /// is used. They are ignored otherwise. + /// + /// + /// Ideally, both the and fields should be tagged as ‘const’; this is + /// missing for API backwards compatibility. In other words, applications should treat them as read-only. + /// + public sealed class OpenArgs + { + #region Fields + + private IntPtr reference; + private OpenArgsRec rec; + + #endregion + + #region Constructors + + internal OpenArgs(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets a set of bit flags indicating how to use the structure. + /// + public OpenFlags Flags + { + get + { + return rec.flags; + } + } + + /// + /// Gets the first byte of the file in memory. + /// + public IntPtr MemoryBase + { + get + { + return rec.memory_base; + } + } + + /// + /// Gets the size in bytes of the file in memory. + /// + public int MemorySize + { + get + { + return (int)rec.memory_size; + } + } + + /// + /// Gets a pointer to an 8-bit file pathname. + /// + public string PathName + { + get + { + return rec.pathname; + } + } + + /// + /// Gets a handle to a source stream object. + /// + public FTStream Stream + { + get + { + return new FTStream(rec.stream); + } + } + + /// + /// Gets the font driver to use to open the face. If set to 0, FreeType tries to load the face with each one of + /// the drivers in its list. + /// + /// This field is exclusively used by . + public Module Driver + { + get + { + return new Module(rec.driver); + } + } + + /// + /// Gets the number of extra parameters. + /// + public int ParamsCount + { + get + { + return rec.num_params; + } + } + + /// + /// Gets the extra parameters passed to the font driver when opening a new face. + /// + public Parameter[] Params + { + get + { + int count = ParamsCount; + + if (count == 0) + return null; + + Parameter[] parameters = new Parameter[count]; + IntPtr array = rec.@params; + + for (int i = 0; i < count; i++) + { + parameters[i] = new Parameter(new IntPtr(array.ToInt64() + ParameterRec.SizeInBytes * i)); + } + + return parameters; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/OpenFlags.cs b/SharpFont/Source/SharpFontShared/OpenFlags.cs new file mode 100644 index 000000000..84af4fdd7 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/OpenFlags.cs @@ -0,0 +1,54 @@ +#region MIT License +/*Copyright (c) 2012-2014 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of bit-field constants used within the ‘flags’ field of the structure. + /// + /// + /// The , , and flags + /// are mutually exclusive. + /// + [Flags] + public enum OpenFlags + { + /// This is a memory-based stream. + Memory = 0x01, + + /// Copy the stream from the ‘stream’ field. + Stream = 0x02, + + /// Create a new input stream from a C path name. + PathName = 0x04, + + /// Use the ‘driver’ field. + Driver = 0x08, + + /// Use the ‘num_params’ and ‘params’ fields. + Params = 0x10 + } +} diff --git a/SharpFont/Source/SharpFontShared/OpenTypeValidationFlags.cs b/SharpFont/Source/SharpFontShared/OpenTypeValidationFlags.cs new file mode 100644 index 000000000..559f4d810 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/OpenTypeValidationFlags.cs @@ -0,0 +1,58 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of bit-field constants used with to indicate which OpenType tables + /// should be validated. + /// + [Flags] + [CLSCompliant(false)] + public enum OpenTypeValidationFlags : uint + { + /// Validate BASE table. + Base = 0x0100, + + /// Validate GDEF table. + Gdef = 0x0200, + + /// Validate GPOS table. + Gpos = 0x0400, + + /// Validate GSUB table. + Gsub = 0x0800, + + /// Validate JSTF table. + Jstf = 0x1000, + + /// Validate MATH table. + Math = 0x2000, + + /// Validate all OpenType tables. + All = Base | Gdef | Gpos | Gsub | Jstf | Math + } +} diff --git a/SharpFont/Source/SharpFontShared/Orientation.cs b/SharpFont/Source/SharpFontShared/Orientation.cs new file mode 100644 index 000000000..c609c2749 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Orientation.cs @@ -0,0 +1,66 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of values used to describe an outline's contour orientation. + /// + /// The TrueType and PostScript specifications use different conventions to determine whether outline contours + /// should be filled or unfilled. + /// + public enum Orientation + { + /// + /// According to the TrueType specification, clockwise contours must be filled, and counter-clockwise ones must + /// be unfilled. + /// + TrueType = 0, + + /// + /// According to the PostScript specification, counter-clockwise contours must be filled, and clockwise ones + /// must be unfilled. + /// + PostScript = 1, + + /// + /// This is identical to , but is used to remember that in TrueType, everything that is + /// to the right of the drawing direction of a contour must be filled. + /// + FillRight = TrueType, + + /// + /// This is identical to , but is used to remember that in PostScript, everything that + /// is to the left of the drawing direction of a contour must be filled. + /// + FillLeft = PostScript, + + /// + /// The orientation cannot be determined. That is, different parts of the glyph have different orientation. + /// + None + } +} diff --git a/SharpFont/Source/SharpFontShared/Outline.cs b/SharpFont/Source/SharpFontShared/Outline.cs new file mode 100644 index 000000000..6e6dc8463 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Outline.cs @@ -0,0 +1,698 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// This structure is used to describe an outline to the scan-line converter. + /// + /// + /// The B/W rasterizer only checks bit 2 in the ‘tags’ array for the first point of each contour. The drop-out mode + /// as given with , , and + /// in ‘flags’ is then overridden. + /// + public sealed class Outline : IDisposable + { + #region Fields + + private bool disposed; + private bool duplicate; + + private IntPtr reference; + private OutlineRec rec; + + private Library parentLibrary; + private Memory parentMemory; + + #endregion + + #region Constructor + + /// + /// Initializes a new instance of the class. + /// + /// + /// The reason why this function takes a ‘library’ parameter is simply to use the library's memory allocator. + /// + /// + /// A handle to the library object from where the outline is allocated. Note however that the new outline will + /// not necessarily be freed, when destroying the library, by . + /// + /// The maximum number of points within the outline. + /// The maximum number of contours within the outline. + [CLSCompliant(false)] + public Outline(Library library, uint pointsCount, int contoursCount) + { + IntPtr reference; + Error err = FT.FT_Outline_New(library.Reference, pointsCount, contoursCount, out reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + parentLibrary = library; + parentLibrary.AddChildOutline(this); + } + + /// + /// Initializes a new instance of the class. + /// + /// A handle to the memory object from where the outline is allocated. + /// The maximum number of points within the outline. + /// The maximum number of contours within the outline. + [CLSCompliant(false)] + public Outline(Memory memory, uint pointsCount, int contoursCount) + { + IntPtr reference; + Error err = FT.FT_Outline_New_Internal(memory.Reference, pointsCount, contoursCount, out reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + parentMemory = memory; //TODO Should Memory be disposable as well? + } + + internal Outline(IntPtr reference, OutlineRec outlineInt) + { + this.rec = outlineInt; + this.reference = reference; + + duplicate = true; + } + + /// + /// Finalizes an instance of the class. + /// + ~Outline() + { + Dispose(false); + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the has been disposed. + /// + public bool IsDisposed + { + get + { + return disposed; + } + } + + /// + /// Gets the number of contours in the outline. + /// + public short ContoursCount + { + get + { + if (disposed) + throw new ObjectDisposedException("ContoursCount", "Cannot access a disposed object."); + + return rec.n_contours; + } + } + + /// + /// Gets the number of points in the outline. + /// + public short PointsCount + { + get + { + if (disposed) + throw new ObjectDisposedException("PointsCount", "Cannot access a disposed object."); + + return rec.n_points; + } + } + + /// + /// Gets a pointer to an array of ‘PointsCount’ elements, giving the outline's point + /// coordinates. + /// + public FTVector[] Points + { + get + { + if (disposed) + throw new ObjectDisposedException("Points", "Cannot access a disposed object."); + + int count = PointsCount; + + if (count == 0) + return null; + + FTVector[] points = new FTVector[count]; + IntPtr array = rec.points; + + for (int i = 0; i < count; i++) + { + points[i] = new FTVector(new IntPtr(array.ToInt64() + (IntPtr.Size * i * 2))); + } + + return points; + } + } + + /// + /// Gets a pointer to an array of ‘PointsCount’ chars, giving each outline point's type. + /// + /// If bit 0 is unset, the point is ‘off’ the curve, i.e., a Bézier control point, while it is ‘on’ if set. + /// + /// Bit 1 is meaningful for ‘off’ points only. If set, it indicates a third-order Bézier arc control point; and + /// a second-order control point if unset. + /// + /// If bit 2 is set, bits 5-7 contain the drop-out mode (as defined in the OpenType specification; the value is + /// the same as the argument to the SCANMODE instruction). + /// + /// Bits 3 and 4 are reserved for internal purposes. + /// + public byte[] Tags + { + get + { + if (disposed) + throw new ObjectDisposedException("Tags", "Cannot access a disposed object."); + + int count = PointsCount; + + if (count == 0) + return null; + + byte[] tags = new byte[count]; + IntPtr array = rec.tags; + + for (int i = 0; i < count; i++) + { + tags[i] = Marshal.ReadByte(array, sizeof(byte) * i); + } + + return tags; + } + } + + /// + /// Gets an array of ‘ContoursCount’ shorts, giving the end point of each contour within the outline. For + /// example, the first contour is defined by the points ‘0’ to ‘Contours[0]’, the second one is defined by the + /// points ‘Contours[0]+1’ to ‘Contours[1]’, etc. + /// + public short[] Contours + { + get + { + if (disposed) + throw new ObjectDisposedException("Contours", "Cannot access a disposed object."); + + int count = ContoursCount; + + if (count == 0) + return null; + + short[] contours = new short[count]; + IntPtr array = rec.contours; + + for (int i = 0; i < count; i++) + { + contours[i] = Marshal.ReadInt16(array, sizeof(short) * i); + } + + return contours; + } + } + + /// + /// Gets a set of bit flags used to characterize the outline and give hints to the scan-converter and hinter on + /// how to convert/grid-fit it. + /// + /// + public OutlineFlags Flags + { + get + { + if (disposed) + throw new ObjectDisposedException("Flags", "Cannot access a disposed object."); + + return rec.flags; + } + } + + internal IntPtr Reference + { + get + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + return reference; + } + + set + { + if (disposed) + throw new ObjectDisposedException("Reference", "Cannot access a disposed object."); + + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + + #region Methods + + #region Outline Processing + + /// + /// Copy an outline into another one. Both objects must have the same sizes (number of points & number of + /// contours) when this function is called. + /// + /// A handle to the target outline. + public void Copy(Outline target) + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + if (target == null) + throw new ArgumentNullException("target"); + + IntPtr targetRef = target.Reference; + Error err = FT.FT_Outline_Copy(reference, ref targetRef); + target.Reference = reference; + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Apply a simple translation to the points of an outline. + /// + /// The horizontal offset. + /// The vertical offset. + public void Translate(int offsetX, int offsetY) + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + FT.FT_Outline_Translate(reference, offsetX, offsetY); + } + + /// + /// Apply a simple 2x2 matrix to all of an outline's points. Useful for applying rotations, slanting, flipping, + /// etc. + /// + /// + /// You can use if you need to translate the outline's points. + /// + /// A pointer to the transformation matrix. + public void Transform(FTMatrix matrix) + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + FT.FT_Outline_Transform(reference, ref matrix); + } + + /// + /// Embolden an outline. The new outline will be at most 4 times ‘strength’ pixels wider and higher. You may + /// think of the left and bottom borders as unchanged. + /// + /// Negative ‘strength’ values to reduce the outline thickness are possible also. + /// + /// + /// The used algorithm to increase or decrease the thickness of the glyph doesn't change the number of points; + /// this means that certain situations like acute angles or intersections are sometimes handled incorrectly. + /// + /// If you need ‘better’ metrics values you should call or . + /// + /// + /// FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); + /// if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) + /// FT_Outline_Embolden( &face->slot->outline, strength ); + /// + /// How strong the glyph is emboldened. Expressed in 26.6 pixel format. + public void Embolden(Fixed26Dot6 strength) + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + Error err = FT.FT_Outline_Embolden(reference, (IntPtr)strength.Value); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Embolden an outline. The new outline will be ‘xstrength’ pixels wider and ‘ystrength’ pixels higher. + /// Otherwise, it is similar to , which uses the same strength in both directions. + /// + /// + /// How strong the glyph is emboldened in the X direction. Expressed in 26.6 pixel format. + /// + /// + /// How strong the glyph is emboldened in the Y direction. Expressed in 26.6 pixel format. + /// + public void EmboldenXY(int strengthX, int strengthY) + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + Error err = FT.FT_Outline_EmboldenXY(reference, strengthX, strengthY); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Reverse the drawing direction of an outline. This is used to ensure consistent fill conventions for + /// mirrored glyphs. + /// + /// + /// This function toggles the bit flag in the outline's ‘flags’ field. + /// + /// It shouldn't be used by a normal client application, unless it knows what it is doing. + /// + public void Reverse() + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + FT.FT_Outline_Reverse(reference); + } + + /// + /// Check the contents of an outline descriptor. + /// + public void Check() + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + Error err = FT.FT_Outline_Check(reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Compute the exact bounding box of an outline. This is slower than computing the control box. However, it + /// uses an advanced algorithm which returns very quickly when the two boxes coincide. Otherwise, the outline + /// Bézier arcs are traversed to extract their extrema. + /// + /// + /// If the font is tricky and the glyph has been loaded with , the resulting + /// BBox is meaningless. To get reasonable values for the BBox it is necessary to load the glyph at a large + /// ppem value (so that the hinting instructions can properly shift and scale the subglyphs), then extracting + /// the BBox which can be eventually converted back to font units. + /// + /// The outline's exact bounding box. + public BBox GetBBox() + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + BBox bbox; + Error err = FT.FT_Outline_Get_BBox(reference, out bbox); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + return bbox; + } + + /// + /// Walk over an outline's structure to decompose it into individual segments and Bézier arcs. This function + /// also emits ‘move to’ operations to indicate the start of new contours in the outline. + /// + /// + /// A table of ‘emitters’, i.e., function pointers called during decomposition to indicate path operations. + /// + /// + /// A typeless pointer which is passed to each emitter during the decomposition. It can be used to store the + /// state during the decomposition. + /// + public void Decompose(OutlineFuncs funcInterface, IntPtr user) + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + if (funcInterface == null) + throw new ArgumentNullException("funcInterface"); + + OutlineFuncsRec ofRec = funcInterface.Record; + Error err = FT.FT_Outline_Decompose(reference, ref ofRec, user); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Return an outline's ‘control box’. The control box encloses all the outline's points, including Bézier + /// control points. Though it coincides with the exact bounding box for most glyphs, it can be slightly larger + /// in some situations (like when rotating an outline which contains Bézier outside arcs). + /// + /// Computing the control box is very fast, while getting the bounding box can take much more time as it needs + /// to walk over all segments and arcs in the outline. To get the latter, you can use the ‘ftbbox’ component + /// which is dedicated to this single task. + /// + /// See for a discussion of tricky fonts. + /// The outline's control box. + public BBox GetCBox() + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + BBox cbox; + FT.FT_Outline_Get_CBox(reference, out cbox); + + return cbox; + } + + /// + /// Render an outline within a bitmap. The outline's image is simply OR-ed to the target bitmap. + /// + /// + /// This function does NOT CREATE the bitmap, it only renders an outline image within the one you pass to it! + /// Consequently, the various fields in ‘abitmap’ should be set accordingly. + /// + /// It will use the raster corresponding to the default glyph format. + /// + /// The value of the ‘num_grays’ field in ‘abitmap’ is ignored. If you select the gray-level rasterizer, and + /// you want less than 256 gray levels, you have to use directly. + /// + /// A pointer to the target bitmap descriptor. + public void GetBitmap(FTBitmap bitmap) + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + Error err = FT.FT_Outline_Get_Bitmap(parentLibrary.Reference, reference, bitmap.Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Render an outline within a bitmap. The outline's image is simply OR-ed to the target bitmap. + /// + /// + /// This function does NOT CREATE the bitmap, it only renders an outline image within the one you pass to it! + /// Consequently, the various fields in ‘abitmap’ should be set accordingly. + /// + /// It will use the raster corresponding to the default glyph format. + /// + /// The value of the ‘num_grays’ field in ‘abitmap’ is ignored. If you select the gray-level rasterizer, and + /// you want less than 256 gray levels, you have to use directly. + /// + /// A handle to a FreeType library object. + /// A pointer to the target bitmap descriptor. + public void GetBitmap(Library library, FTBitmap bitmap) + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + if (library == null) + throw new ArgumentNullException("library"); + + if (bitmap == null) + throw new ArgumentNullException("bitmap"); + + Error err = FT.FT_Outline_Get_Bitmap(library.Reference, reference, bitmap.Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Render an outline within a bitmap using the current scan-convert. This function uses an + /// structure as an argument, allowing advanced features like direct composition, + /// translucency, etc. + /// + /// + /// You should know what you are doing and how works to use this function. + /// + /// The field ‘params.source’ will be set to ‘outline’ before the scan converter is called, which means that + /// the value you give to it is actually ignored. + /// + /// The gray-level rasterizer always uses 256 gray levels. If you want less gray levels, you have to provide + /// your own span callback. See the value of the ‘flags’ field in the + /// structure for more details. + /// + /// + /// A pointer to an structure used to describe the rendering operation. + /// + public void Render(RasterParams parameters) + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + if (parameters == null) + throw new ArgumentNullException("parameters"); + + Error err = FT.FT_Outline_Render(parentLibrary.Reference, reference, parameters.Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Render an outline within a bitmap using the current scan-convert. This function uses an + /// structure as an argument, allowing advanced features like direct composition, + /// translucency, etc. + /// + /// + /// You should know what you are doing and how works to use this function. + /// + /// The field ‘params.source’ will be set to ‘outline’ before the scan converter is called, which means that + /// the value you give to it is actually ignored. + /// + /// The gray-level rasterizer always uses 256 gray levels. If you want less gray levels, you have to provide + /// your own span callback. See the value of the ‘flags’ field in the + /// structure for more details. + /// + /// A handle to a FreeType library object. + /// + /// A pointer to an structure used to describe the rendering operation. + /// + public void Render(Library library, RasterParams parameters) + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + if (library == null) + throw new ArgumentNullException("library"); + + if (parameters == null) + throw new ArgumentNullException("parameters"); + + Error err = FT.FT_Outline_Render(library.Reference, reference, parameters.Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// This function analyzes a glyph outline and tries to compute its fill orientation (see + /// ). This is done by computing the direction of each global horizontal and/or + /// vertical extrema within the outline. + /// + /// Note that this will return for empty outlines. + /// + /// The orientation. + public Orientation GetOrientation() + { + if (disposed) + throw new ObjectDisposedException("Outline", "Cannot access a disposed object."); + + return FT.FT_Outline_Get_Orientation(reference); + } + + #endregion + + #region Glyph Stroker + + /// + /// Retrieve the value corresponding to the ‘inside’ borders of a given outline. + /// + /// The border index. for empty or invalid outlines. + public StrokerBorder GetInsideBorder() + { + return FT.FT_Outline_GetInsideBorder(Reference); + } + + /// + /// Retrieve the value corresponding to the ‘outside’ borders of a given outline. + /// + /// The border index. for empty or invalid outlines. + public StrokerBorder GetOutsideBorder() + { + return FT.FT_Outline_GetOutsideBorder(Reference); + } + + #endregion + + /// + /// Disposes an instance of the class. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!disposed) + { + disposed = true; + + if (!duplicate) + { + if (parentLibrary != null) + FT.FT_Outline_Done(parentLibrary.Reference, reference); + else + FT.FT_Outline_Done_Internal(parentMemory.Reference, reference); + + // removes itself from the parent Library, with a check to prevent this from happening when Library is + // being disposed (Library disposes all it's children with a foreach loop, this causes an + // InvalidOperationException for modifying a collection during enumeration) + if (!parentLibrary.IsDisposed) + parentLibrary.RemoveChildOutline(this); + } + + reference = IntPtr.Zero; + rec = default(OutlineRec); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/OutlineFlags.cs b/SharpFont/Source/SharpFontShared/OutlineFlags.cs new file mode 100644 index 000000000..aad16f2f5 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/OutlineFlags.cs @@ -0,0 +1,102 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of bit-field constants use for the flags in an outline's ‘flags’ field. + /// + /// + /// The flags , , and + /// are ignored by the smooth rasterizer. + /// + /// There exists a second mechanism to pass the drop-out mode to the B/W rasterizer; see the ‘tags’ field in + /// . + /// + /// Please refer to the description of the ‘SCANTYPE’ instruction in the OpenType specification (in file + /// ‘ttinst1.doc’) how simple drop-outs, smart drop-outs, and stubs are defined. + /// + [Flags] + public enum OutlineFlags + { + /// + /// Value 0 is reserved. + /// + None = 0x0000, + + /// + /// If set, this flag indicates that the outline's field arrays (i.e., ‘points’, ‘flags’, and ‘contours’) are + /// ‘owned’ by the outline object, and should thus be freed when it is destroyed. + /// + Owner = 0x0001, + + /// + /// By default, outlines are filled using the non-zero winding rule. If set to 1, the outline will be filled + /// using the even-odd fill rule (only works with the smooth rasterizer). + /// + EvenOddFill = 0x0002, + + /// + /// By default, outside contours of an outline are oriented in clock-wise direction, as defined in the TrueType + /// specification. This flag is set if the outline uses the opposite direction (typically for Type 1 fonts). + /// This flag is ignored by the scan converter. + /// + ReverseFill = 0x0004, + + /// + /// By default, the scan converter will try to detect drop-outs in an outline and correct the glyph bitmap to + /// ensure consistent shape continuity. If set, this flag hints the scan-line converter to ignore such cases. + /// See below for more information. + /// + IgnoreDropouts = 0x0008, + + /// + /// Select smart dropout control. If unset, use simple dropout control. Ignored if + /// is set. See below for more information. + /// + SmartDropouts = 0x0010, + + /// + /// If set, turn pixels on for ‘stubs’, otherwise exclude them. Ignored if + /// is set. See below for more information. + /// + IncludeStubs = 0x0020, + + /// + /// This flag indicates that the scan-line converter should try to convert this outline to bitmaps with the + /// highest possible quality. It is typically set for small character sizes. Note that this is only a hint that + /// might be completely ignored by a given scan-converter. + /// + HighPrecision = 0x0100, + + /// + /// This flag is set to force a given scan-converter to only use a single pass over the outline to render a + /// bitmap glyph image. Normally, it is set for very large character sizes. It is only a hint that might be + /// completely ignored by a given scan-converter. + /// + SinglePass = 0x0200 + } +} diff --git a/SharpFont/Source/SharpFontShared/OutlineFuncs.cs b/SharpFont/Source/SharpFontShared/OutlineFuncs.cs new file mode 100644 index 000000000..cedfa99c8 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/OutlineFuncs.cs @@ -0,0 +1,404 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A function pointer type used to describe the signature of a ‘move to’ function during outline + /// walking/decomposition. + /// + /// A ‘move to’ is emitted to start a new contour in an outline. + /// + /// A pointer to the target point of the ‘move to’. + /// A typeless pointer which is passed from the caller of the decomposition function. + /// Error code. 0 means success. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate int MoveToFunc(ref FTVector to, IntPtr user); + + /// + /// A function pointer type used to describe the signature of a ‘line to’ function during outline + /// walking/decomposition. + /// + /// A ‘line to’ is emitted to indicate a segment in the outline. + /// + /// A pointer to the target point of the ‘line to’. + /// A typeless pointer which is passed from the caller of the decomposition function. + /// Error code. 0 means success. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate int LineToFunc(ref FTVector to, IntPtr user); + + /// + /// A function pointer type used to describe the signature of a ‘conic to’ function during outline walking or + /// decomposition. + /// + /// A ‘conic to’ is emitted to indicate a second-order Bézier arc in the outline. + /// + /// + /// An intermediate control point between the last position and the new target in ‘to’. + /// + /// A pointer to the target end point of the conic arc. + /// A typeless pointer which is passed from the caller of the decomposition function. + /// Error code. 0 means success. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate int ConicToFunc(ref FTVector control, ref FTVector to, IntPtr user); + + /// + /// A function pointer type used to describe the signature of a ‘cubic to’ function during outline walking or + /// decomposition. + /// + /// A ‘cubic to’ is emitted to indicate a third-order Bézier arc. + /// + /// A pointer to the first Bézier control point. + /// A pointer to the second Bézier control point. + /// A pointer to the target end point. + /// A typeless pointer which is passed from the caller of the decomposition function. + /// Error code. 0 means success. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate int CubicToFunc(ref FTVector control1, ref FTVector control2, ref FTVector to, IntPtr user); + + /// + /// A structure to hold various function pointers used during outline decomposition in order to emit segments, + /// conic, and cubic Béziers. + /// + /// + /// The point coordinates sent to the emitters are the transformed version of the original coordinates (this is + /// important for high accuracy during scan-conversion). The transformation is simple: + /// + /// x' = (x << shift) - delta + /// y' = (x << shift) - delta + /// + /// Set the values of ‘shift’ and ‘delta’ to 0 to get the original point coordinates. + /// + public class OutlineFuncs : IDisposable + { + #region Fields + + private bool isDisposed; + + private MoveToFunc moveToFunc; + private LineToFunc lineToFunc; + private ConicToFunc conicToFunc; + private CubicToFunc cubicToFunc; + + private GCHandle moveToPin; + private GCHandle lineToPin; + private GCHandle conicToPin; + private GCHandle cubicToPin; + + private IntPtr moveToPtr; + private IntPtr lineToPtr; + private IntPtr conicToPtr; + private IntPtr cubicToPtr; + + private int shift; + private IntPtr delta; + + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the OutlineFuncs class. + /// + public OutlineFuncs() + { + } + + /// + /// Initializes a new instance of the OutlineFuncs class. + /// + /// The move to delegate. + /// The line to delegate. + /// The conic to delegate. + /// The cubic to delegate. + /// A value to shift by. + /// A delta to transform by. + /// , , + /// , or is . + public OutlineFuncs(MoveToFunc moveTo, LineToFunc lineTo, ConicToFunc conicTo, CubicToFunc cubicTo, int shift, int delta) + { + if (moveTo == null) + { + throw new ArgumentNullException(nameof(moveTo)); + } + if (lineTo == null) + { + throw new ArgumentNullException(nameof(lineTo)); + } + if (conicTo == null) + { + throw new ArgumentNullException(nameof(conicTo)); + } + if (cubicTo == null) + { + throw new ArgumentNullException(nameof(cubicTo)); + } + + moveToFunc = moveTo; + lineToFunc = lineTo; + conicToFunc = conicTo; + cubicToFunc = cubicTo; + + moveToPtr = Marshal.GetFunctionPointerForDelegate(moveToFunc); + lineToPtr = Marshal.GetFunctionPointerForDelegate(lineToFunc); + conicToPtr = Marshal.GetFunctionPointerForDelegate(conicToFunc); + cubicToPtr = Marshal.GetFunctionPointerForDelegate(cubicToFunc); + + this.shift = shift; + this.delta = (IntPtr) delta; + } + + #endregion + + #region Properties + + /// + /// Gets or sets the ‘move to’ emitter. + /// + public MoveToFunc MoveFunction + { + get + { + ThrowIfDisposed(); + return moveToFunc; + } + set + { + ThrowIfDisposed(); + if (moveToPin.IsAllocated) + { + moveToPin.Free(); + } + moveToFunc = value; + moveToPin = GCHandle.Alloc(moveToFunc); + moveToPtr = Marshal.GetFunctionPointerForDelegate(moveToFunc); + } + } + + /// + /// Gets or sets the segment emitter. + /// + public LineToFunc LineFunction + { + + get + { + ThrowIfDisposed(); + return lineToFunc; + } + set + { + ThrowIfDisposed(); + if (lineToPin.IsAllocated) + { + lineToPin.Free(); + } + lineToFunc = value; + lineToPin = GCHandle.Alloc(lineToFunc); + lineToPtr = Marshal.GetFunctionPointerForDelegate(lineToFunc); + } + } + + /// + /// Gets or sets the second-order Bézier arc emitter. + /// + public ConicToFunc ConicFunction + { + + get + { + ThrowIfDisposed(); + return conicToFunc; + } + set + { + ThrowIfDisposed(); + if (conicToPin.IsAllocated) + { + conicToPin.Free(); + } + conicToFunc = value; + conicToPin = GCHandle.Alloc(conicToFunc); + conicToPtr = Marshal.GetFunctionPointerForDelegate(conicToFunc); + } + } + + /// + /// Gets or sets the third-order Bézier arc emitter. + /// + public CubicToFunc CubicFunction + { + + get + { + ThrowIfDisposed(); + return cubicToFunc; + } + set + { + ThrowIfDisposed(); + if (cubicToPin.IsAllocated) + { + cubicToPin.Free(); + } + cubicToFunc = value; + cubicToPin = GCHandle.Alloc(cubicToFunc); + cubicToPtr = Marshal.GetFunctionPointerForDelegate(cubicToFunc); + } + } + + /// + /// Gets or sets the shift that is applied to coordinates before they are sent to the emitter. + /// + public int Shift + { + get + { + ThrowIfDisposed(); + return shift; + } + + set + { + ThrowIfDisposed(); + shift = value; + } + } + + /// + /// Gets the delta that is applied to coordinates before they are sent to the emitter, but after the + /// shift. + /// + public int Delta + { + get + { + ThrowIfDisposed(); + return (int) delta; + } + + /*set + { + funcsInt.delta = (IntPtr)value; + }*/ + } + + //TODO make a reference parameter instead? + //HACK this copies the struct + internal OutlineFuncsRec Record + { + get + { + ThrowIfDisposed(); + var r = new OutlineFuncsRec(); + r.moveTo = moveToPtr; + r.lineTo = lineToPtr; + r.conicTo = conicToPtr; + r.cubicTo = cubicToPtr; + return r; + } + } + + #endregion + + + #region IDisposable + + /// + /// Helper method to throw an exception if the object is disposed. + /// + /// If the object is already disposed + private void ThrowIfDisposed() + { + if (isDisposed) + { + throw new ObjectDisposedException("OutlineFuncs", "The outline funcs has already been disposed."); + } + } + + /// + /// Finalizer which ensures that the pinned delegates are released. + /// + ~OutlineFuncs() + { + Dispose(false); + } + + /// + /// Disposes this outline funcs, releasing any of the resources held by it. + /// + /// + protected virtual void Dispose(bool disposing) + { + if (isDisposed) + { + return; + } + + if (disposing) + { + // If this class later needs any managed resources, they should be included here. + } + if (moveToPin.IsAllocated) + { + moveToPin.Free(); + } + if (lineToPin.IsAllocated) + { + lineToPin.Free(); + } + if (cubicToPin.IsAllocated) + { + cubicToPin.Free(); + } + if (conicToPin.IsAllocated) + { + conicToPin.Free(); + } + isDisposed = true; + + } + + /// + /// Releases the pinned memory on this object. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + + #endregion + + + + } +} diff --git a/SharpFont/Source/SharpFontShared/OutlineGlyph.cs b/SharpFont/Source/SharpFontShared/OutlineGlyph.cs new file mode 100644 index 000000000..c16978d68 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/OutlineGlyph.cs @@ -0,0 +1,177 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A structure used for outline (vectorial) glyph images. This really is a ‘sub-class’ of . + /// + /// + /// You can typecast an to if you have ‘ + /// == ’. This lets you access the outline's content easily. + /// + /// As the outline is extracted from a glyph slot, its coordinates are expressed normally in 26.6 pixels, unless + /// the flag was used in or + /// . + /// + /// The outline's tables are always owned by the object and are destroyed with it. + /// + public class OutlineGlyph : IDisposable + { + #region Fields + + private Glyph original; + private OutlineGlyphRec rec; + + #endregion + + #region Constructors + + internal OutlineGlyph(Glyph original) + { + this.original = original; + Reference = original.Reference; //sets the rec + } + + /// + /// Finalizes an instance of the class. + /// + ~OutlineGlyph() + { + Dispose(false); + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the object has been disposed. + /// + public bool IsDisposed + { + get + { + return original.IsDisposed; + } + } + + /// + /// Gets the root fields. + /// + public Glyph Root + { + get + { + if (IsDisposed) + throw new ObjectDisposedException("Bitmap", "Cannot access a disposed object."); + + return original; + } + } + + /// + /// Gets a descriptor for the outline. + /// + public Outline Outline + { + get + { + if (IsDisposed) + throw new ObjectDisposedException("Bitmap", "Cannot access a disposed object."); + + return new Outline(PInvokeHelper.AbsoluteOffsetOf(Reference, "outline"), rec.outline); + } + } + + internal IntPtr Reference + { + get + { + if (IsDisposed) + throw new ObjectDisposedException("Bitmap", "Cannot access a disposed object."); + + return original.Reference; + } + + set + { + if (IsDisposed) + throw new ObjectDisposedException("Bitmap", "Cannot access a disposed object."); + + rec = PInvokeHelper.PtrToStructure(original.Reference); + } + } + + #endregion + + #region Operators + + /// + /// Casts a back up to a . The eqivalent of + /// . + /// + /// A . + /// A . + public static implicit operator Glyph(OutlineGlyph g) + { + return g.original; + } + + #endregion + + #region Methods + + /// + /// A CLS-compliant version of the implicit cast to . + /// + /// A . + public Glyph ToGlyph() + { + return (Glyph)this; + } + + /// + /// Disposes an instance of the class. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (disposing) + original.Dispose(); + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/PInvokeHelper.cs b/SharpFont/Source/SharpFontShared/PInvokeHelper.cs new file mode 100644 index 000000000..37255140a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PInvokeHelper.cs @@ -0,0 +1,78 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont +{ + /// + /// Helpful methods to make marshalling simpler. + /// + internal static class PInvokeHelper + { + /// + /// A generic wrapper for . + /// + /// The type to cast to. + /// The pointer that holds the struct. + /// A marshalled struct. + internal static T PtrToStructure(IntPtr reference) + { + return (T)Marshal.PtrToStructure(reference, typeof(T)); + } + + /// + /// A method to copy data from one pointer to another, byte by byte. + /// + /// The source pointer. + /// An offset into the source buffer. + /// The destination pointer. + /// An offset into the destination buffer. + /// The number of bytes to copy. + internal static unsafe void Copy(IntPtr source, int sourceOffset, IntPtr destination, int destinationOffset, int count) + { + byte* src = (byte*)source + sourceOffset; + byte* dst = (byte*)destination + destinationOffset; + byte* end = dst + count; + + while (dst != end) + *dst++ = *src++; + } + + /// + /// A common pattern in SharpFont is to pass a pointer to a memory address inside of a struct. This method + /// works for all cases and provides a generic API. + /// + /// + /// The type of the struct to take an offset from. + /// A pointer to the start of a struct. + /// The name of the field to get an offset to. + /// start + the offset of the fieldName field in T. + internal static IntPtr AbsoluteOffsetOf(IntPtr start, string fieldName) + { + return new IntPtr(start.ToInt64() + Marshal.OffsetOf(typeof(T), fieldName).ToInt64()); + } + } +} diff --git a/SharpFont/Source/SharpFontShared/ParamTag.cs b/SharpFont/Source/SharpFontShared/ParamTag.cs new file mode 100644 index 000000000..01570ed8d --- /dev/null +++ b/SharpFont/Source/SharpFontShared/ParamTag.cs @@ -0,0 +1,62 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// Constants used as the tag of structures. + /// + [CLSCompliant(false)] + public enum ParamTag : uint + { + /// + /// A constant used as the tag of structures to make + /// ignore preferred family subfamily names in ‘name’ table since OpenType version 1.4. For backwards + /// compatibility with legacy systems which has 4-face-per-family restriction. + /// + IgnorePreferredFamily = ('i' << 24 | 'g' << 16 | 'p' << 8 | 'f'), + + /// + /// A constant used as the tag of structures to make + /// ignore preferred subfamily names in ‘name’ table since OpenType version 1.4. For backwards compatibility + /// with legacy systems which has 4-face-per-family restriction. + /// + IgnorePreferredSubfamily = ('i' << 24 | 'g' << 16 | 'p' << 8 | 's'), + + /// + /// A constant used as the tag of structures to indicate an incremental loading object + /// to be used by FreeType. + /// + Incremental = ('i' << 24 | 'n' << 16 | 'c' << 8 | 'r'), + + /// + /// A constant used as the tag of an structure to indicate that unpatented methods only + /// should be used by the TrueType bytecode interpreter for a typeface opened by + /// . + /// + UnpatentedHinting = ('u' << 24 | 'n' << 16 | 'p' << 8 | 'a') + } +} diff --git a/SharpFont/Source/SharpFontShared/Parameter.cs b/SharpFont/Source/SharpFontShared/Parameter.cs new file mode 100644 index 000000000..d6d1b2b11 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Parameter.cs @@ -0,0 +1,106 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A simple structure used to pass more or less generic parameters to . + /// + /// + /// The ID and function of parameters are driver-specific. See the various flags for more + /// information. + /// + public sealed class Parameter + { + #region Fields + + private IntPtr reference; + private ParameterRec rec; + + #endregion + + #region Constructors + + internal Parameter(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets a four-byte identification tag. + /// + [CLSCompliant(false)] + public ParamTag Tag + { + get + { + return (ParamTag)rec.tag; + } + } + + /// + /// Gets a pointer to the parameter data. + /// + public IntPtr Data + { + get + { + return rec.data; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + internal ParameterRec Record + { + get + { + return rec; + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/PixelMode.cs b/SharpFont/Source/SharpFontShared/PixelMode.cs new file mode 100644 index 000000000..c53d6c0bd --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PixelMode.cs @@ -0,0 +1,87 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// An enumeration type used to describe the format of pixels in a given bitmap. Note that additional formats may + /// be added in the future. + /// + public enum PixelMode : byte + { + /// + /// Value 0 is reserved. + /// + None = 0, + + /// + /// A monochrome bitmap, using 1 bit per pixel. Note that pixels are stored in most-significant order (MSB), + /// which means that the left-most pixel in a byte has value 128. + /// + Mono, + + /// + /// An 8-bit bitmap, generally used to represent anti-aliased glyph images. Each pixel is stored in one byte. + /// Note that the number of ‘gray’ levels is stored in the ‘num_grays’ field of the + /// structure (it generally is 256). + /// + Gray, + + /// + /// A 2-bit per pixel bitmap, used to represent embedded anti-aliased bitmaps in font files according to the + /// OpenType specification. We haven't found a single font using this format, however. + /// + Gray2, + + /// + /// A 4-bit per pixel bitmap, representing embedded anti-aliased bitmaps in font files according to the + /// OpenType specification. We haven't found a single font using this format, however. + /// + Gray4, + + /// + /// An 8-bit bitmap, representing RGB or BGR decimated glyph images used for display on LCD displays; the + /// bitmap is three times wider than the original glyph image. See also . + /// + Lcd, + + /// + /// An 8-bit bitmap, representing RGB or BGR decimated glyph images used for display on rotated LCD displays; + /// the bitmap is three times taller than the original glyph image. See also + /// . + /// + VerticalLcd, + + /// + /// An image with four 8-bit channels per pixel, representing a color image (such as emoticons) with alpha + /// channel. For each pixel, the format is BGRA, which means, the blue channel comes first in memory. The color + /// channels are pre-multiplied and in the sRGB colorspace. For example, full red at half-translucent opacity + /// will be represented as ‘00,00,80,80’, not ‘00,00,FF,80’. + /// + /// + Bgra + } +} diff --git a/SharpFont/Source/SharpFontShared/PostScript/BlendFlags.cs b/SharpFont/Source/SharpFontShared/PostScript/BlendFlags.cs new file mode 100644 index 000000000..dd7c8b5e7 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PostScript/BlendFlags.cs @@ -0,0 +1,105 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.PostScript +{ + /// + /// A set of flags used to indicate which fields are present in a given blend dictionary (font info or private). + /// Used to support Multiple Masters fonts. + /// + public enum BlendFlags + { + /// + /// The position of the underline stroke. + /// + UnderlinePosition = 0, + + /// + /// The thickness of the underline stroke. + /// + UnderlineThickness, + + /// + /// The angle of italics. + /// + ItalicAngle, + + /// + /// Set if the font contains BlueValues. + /// + BlueValues, + + /// + /// Set if the font contains OtherBlues. + /// + OtherBlues, + + /// + /// Set if the font contains StandardWidth values. + /// + StandardWidth, + + /// + /// Set if the font contains StandardHeight values. + /// + StandardHeight, + + /// + /// Set if the font contains StemSnapWidths. + /// + StemSnapWidths, + + /// + /// Set if the font contains StemSnapHeights. + /// + StemSnapHeights, + + /// + /// Set if the font contains BlueScale values. + /// + BlueScale, + + /// + /// Set if the font contains BlueShift values. + /// + BlueShift, + + /// + /// Set if the font contains FamilyBlues values. + /// + FamilyBlues, + + /// + /// Set if the font contains FamilyOtherBlues values. + /// + FamilyOtherBlues, + + /// + /// Force bold blending. + /// + ForceBold + } +} diff --git a/SharpFont/Source/SharpFontShared/PostScript/DictionaryKeys.cs b/SharpFont/Source/SharpFontShared/PostScript/DictionaryKeys.cs new file mode 100644 index 000000000..06b49675f --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PostScript/DictionaryKeys.cs @@ -0,0 +1,271 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.PostScript +{ + /// + /// An enumeration used in calls to to identify the Type 1 dictionary entry to + /// retrieve. + /// + /// + public enum DictionaryKeys + { + /// + /// The font's type. Type 1 fonts must have a value of 1. + /// + FontType, + + /// + /// The font's matrix. Typically scaled 1000:1. + /// + FontMatrix, + + /// + /// The font's general bounding box. + /// + FontBBox, + + /// + /// The font's method of painting characters. Type 1 only supports fill (0) and outline (2). + /// + PaintType, + + /// + /// The font's name. + /// + FontName, + + /// + /// A unique identifier for popular fonts assigned by Adobe. + /// + UniqueId, + + /// + /// The number of characters the font can draw. + /// + NumCharStrings, + + /// + /// The char string key. + /// + CharStringKey, + + /// + /// The char string entry. + /// + CharString, + + /// + /// The font's encoding type. + /// + EncodingType, + + /// + /// The font's encoding entry. + /// + EncodingEntry, + + /// + /// The number of charstring subroutines in the font. + /// + NumSubrs, + + /// + /// The font's subroutines. + /// + Subr, + + /// + /// An array with only one real number entry expressing the dominant width of horizontal stems (measured + /// vertically in character space units). + /// + StdHW, + + /// + /// An array with only one real number entry expressing the dominant width of vertical stems (measured + /// horizontally in character space units). + /// + StdVW, + + /// + /// The number of BlueValues the font defines. The value must be at least 0 and at most 14. (7 integer pairs). + /// + NumBlueValues, + + /// + /// An array of integer pairs. The first pair must be the base overshoot position and the base-line. + /// + BlueValue, + + /// + /// An optional entry that specifies the number of character space units to extend (in both directions) the + /// effect of an alignment zone on a horizontal stem. The default value is 1. + /// + BlueFuzz, + + /// + /// The number of OtherBlue values. The value must be at least 0 and at most 10 (5 integer pairs). + /// + NumOtherBlues, + + /// + /// An optional array of integer pairs very similar to those in . + /// + OtherBlue, + + /// + /// The number of FamilyBlue values. + /// + NumFamilyBlues, + + /// + /// An array of integer pairs very similar to those in . + /// + FamilyBlue, + + /// + /// The number of FamilyOtherBlue values. + /// + NumFamilyOtherBlues, + + /// + /// An array of integer pairs very similar to those in . + /// + FamilyOtherBlue, + + /// + /// An optional entry that controls the point size at which overshoot suppression ceases. The default value is + /// 0.039625. + /// + BlueScale, + + /// + /// An optional entry that indicates a character space distance beyond the flat position of alignment zones at + /// which overshoot enforcement for character features occurs. The default value is 7. + /// + BlueShift, + + /// + /// The number of StemSnapH values. Cannot exceed 12. + /// + NumStemSnapH, + + /// + /// An array of up to 12 real numbers of the most common widths (including the dominant width given in the + /// StdHW array) for horizontal stems (measured vertically). These widths must be sorted in increasing order. + /// + StemSnapH, + + /// + /// The number of StemSnapV values. Cannot exceed 12. + /// + NumStemSnapV, + + /// + /// An array of up to 12 real numbers of the most common widths (including the dominant width given in the + /// StdVW array) for vertical stems (measured horizontally). These widths must be sorted in increasing order. + /// + StemSnapV, + + /// + /// A boolean value indicating whether to force bold characters when a regular character is drawn 1-pixel wide. + /// + ForceBold, + + /// + /// Compatibility entry. Use only for font programs in language group 1. + /// + RndStemUp, + + /// + /// Obsolete. Set to {16 16}. Required. + /// + MinFeature, + + /// + /// An integer specifying the number of random bytes at the beginning of charstrings for encryption. By default + /// this value is 4. + /// + LenIV, + + /// + /// Compatibility entry. Set to 5839. + /// + Password, + + /// + /// Identifies the language group of the font. A value of 0 indicates a language that uses Latin, Greek, + /// Cyrillic, etc. characters. A value of 1 indicates a language that consists of Chinese ideographs, Jpaanese + /// Kanji, and Korean Hangul. The default value is 0. + /// + LanguageGroup, + + /// + /// The version identifier for this font. + /// + Version, + + /// + /// The copyright notice of the font. + /// + Notice, + + /// + /// The fullname of the font. + /// + FullName, + + /// + /// The family name of the font. + /// + FamilyName, + + /// + /// The name of the weight of the font. + /// + Weight, + + /// + /// Whether the font is fixed pitch. + /// + IsFixedPitch, + + /// + /// The position of the underline stroke. + /// + UnderlinePosition, + + /// + /// What types of embedding and usages are allowed. + /// + FSType, + + /// + /// The italic angle. + /// + ItalicAngle + } +} diff --git a/SharpFont/Source/SharpFontShared/PostScript/EncodingType.cs b/SharpFont/Source/SharpFontShared/PostScript/EncodingType.cs new file mode 100644 index 000000000..900e72f37 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PostScript/EncodingType.cs @@ -0,0 +1,55 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.PostScript +{ + /// + /// An enumeration describing the ‘Encoding’ entry in a Type 1 dictionary. + /// + public enum EncodingType + { + /// + /// Not encoded. + /// + None = 0, + /// + /// Array encoding. + /// + Array, + /// + /// Standard encoding. + /// + Standard, + /// + /// ISO Latin 1 encoding. + /// + IsoLatin1, + /// + /// Expert encoding. + /// + Expert + } +} diff --git a/SharpFont/Source/SharpFontShared/PostScript/FaceDict.cs b/SharpFont/Source/SharpFontShared/PostScript/FaceDict.cs new file mode 100644 index 000000000..4f965b663 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PostScript/FaceDict.cs @@ -0,0 +1,209 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.PostScript.Internal; + +namespace SharpFont.PostScript +{ + /// + /// A structure used to represent data in a CID top-level dictionary. + /// + public class FaceDict + { + #region Fields + + private IntPtr reference; + private FaceDictRec rec; + + #endregion + + #region Constructors + + internal FaceDict(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the Private structure containing more information. + /// + public Private PrivateDictionary + { + get + { + return new Private(rec.private_dict); + } + } + + /// + /// Gets the length of the BuildChar entry. + /// + [CLSCompliant(false)] + public uint BuildCharLength + { + get + { + return rec.len_buildchar; + } + } + + /// + /// Gets whether to force bold characters when a regular character has + /// strokes drawn 1-pixel wide. + /// + public int ForceBoldThreshold + { + get + { + return (int)rec.forcebold_threshold; + } + } + + /// + /// Gets the width of stroke. + /// + public int StrokeWidth + { + get + { + return (int)rec.stroke_width; + } + } + + /// + /// Gets hinting useful for rendering glyphs such as barcodes and logos that + /// have many counters. + /// + public int ExpansionFactor + { + get + { + return (int)rec.expansion_factor; + } + } + + /// + /// Gets the method for painting strokes (fill or outline). + /// + public byte PaintType + { + get + { + return rec.paint_type; + } + } + + /// + /// Gets the type of font. Must be set to 1 for all Type 1 fonts. + /// + public byte FontType + { + get + { + return rec.font_type; + } + } + + /// + /// Gets the matrix that indicates scaling of space units. + /// + public FTMatrix FontMatrix + { + get + { + return rec.font_matrix; + } + } + + /// + /// Gets the offset of the font. + /// + public FTVector FontOffset + { + get + { + return rec.font_offset; + } + } + + /// + /// Gets the number of subroutines. + /// + [CLSCompliant(false)] + public uint SubrsCount + { + get + { + return rec.num_subrs; + } + } + + /// + /// Gets the offset in bytes, from the start of the + /// data section of the CIDFont to the beginning of the SubrMap. + /// + [CLSCompliant(false)] + public uint SubrmapOffset + { + get + { + return (uint)rec.subrmap_offset; + } + } + + /// + /// Gets the number of bytes needed to store the SD value. + /// + public int SDBytes + { + get + { + return rec.sd_bytes; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/PostScript/FaceInfo.cs b/SharpFont/Source/SharpFontShared/PostScript/FaceInfo.cs new file mode 100644 index 000000000..731a4b775 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PostScript/FaceInfo.cs @@ -0,0 +1,267 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Linq; +using System.Runtime.InteropServices; + +using SharpFont.PostScript.Internal; + +namespace SharpFont.PostScript +{ + /// + /// A structure used to represent CID Face information. + /// + public class FaceInfo + { + #region Fields + + private IntPtr reference; + private FaceInfoRec rec; + + #endregion + + #region Constructors + + internal FaceInfo(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// The name of the font, usually condensed from FullName. + /// + public string CidFontName + { + get + { + return rec.cid_font_name; + } + } + + /// + /// The version number of the font. + /// + public int CidVersion + { + get + { + return (int)rec.cid_version; + } + } + + /// + /// Gets the string identifying the font's manufacturer. + /// + public string Registry + { + get + { + return rec.registry; + } + } + + /// + /// Gets the unique identifier for the character collection. + /// + public string Ordering + { + get + { + return rec.ordering; + } + } + + /// + /// Gets the identifier (supplement number) of the character collection. + /// + public int Supplement + { + get + { + return rec.supplement; + } + } + + /// + /// Gets the dictionary of font info that is not used by the PostScript interpreter. + /// + public FontInfo FontInfo + { + get + { + return new FontInfo(rec.font_info); + } + } + + /// + /// Gets the coordinates of the corners of the bounding box. + /// + public BBox FontBBox + { + get + { + return rec.font_bbox; + } + } + + /// + /// Gets the value to form UniqueID entries for base fonts within a composite font. + /// + [CLSCompliant(false)] + public uint UidBase + { + get + { + return (uint)rec.uid_base; + } + } + + /// + /// Gets the number of entries in the XUID array. + /// + public int XuidCount + { + get + { + return rec.num_xuid; + } + } + + /// + /// Gets the extended unique IDS that identify the form, which allows + /// the PostScript interpreter to cache the output for reuse. + /// + [CLSCompliant(false)] + public uint[] Xuid + { + get + { + return rec.xuid.Select(x => (uint)x).ToArray(); + } + } + + /// + /// Gets the offset in bytes to the charstring offset table. + /// + [CLSCompliant(false)] + public uint CidMapOffset + { + get + { + return (uint)rec.cidmap_offset; + } + } + + /// + /// Gets the length in bytes of the FDArray index. + /// A value of 0 indicates that the charstring offset table doesn't contain + /// any FDArray indexes. + /// + public int FDBytes + { + get + { + return rec.fd_bytes; + } + } + + /// + /// Gets the length of the offset to the charstring for each CID in the CID font. + /// + public int GDBytes + { + get + { + return rec.gd_bytes; + } + } + + /// + /// Gets the number of valid CIDs in the CIDFont. + /// + [CLSCompliant(false)] + public uint CidCount + { + get + { + return (uint)rec.cid_count; + } + } + + /// + /// Gets the number of entries in the FontDicts array. + /// + public int DictsCount + { + get + { + return rec.num_dicts; + } + } + + /// + /// Gets the set of font dictionaries for this font. + /// + public FaceDict FontDicts + { + get + { + return new FaceDict(PInvokeHelper.AbsoluteOffsetOf(Reference, "font_dicts")); + } + } + + /// + /// The offset of the data. + /// + [CLSCompliant(false)] + public uint DataOffset + { + get + { + return (uint)rec.data_offset; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/PostScript/FontInfo.cs b/SharpFont/Source/SharpFontShared/PostScript/FontInfo.cs new file mode 100644 index 000000000..7fd879281 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PostScript/FontInfo.cs @@ -0,0 +1,157 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.PostScript.Internal; + +namespace SharpFont.PostScript +{ + /// + /// A structure used to model a Type 1 or Type 2 FontInfo dictionary. Note that for Multiple Master fonts, each + /// instance has its own FontInfo dictionary. + /// + public class FontInfo + { + #region Fields + + private FontInfoRec rec; + + #endregion + + #region Constructors + + internal FontInfo(FontInfoRec rec) + { + this.rec = rec; + } + + #endregion + + #region Properties + + /// + /// The version of the font. + /// + public string Version + { + get + { + return rec.version; + } + } + + /// + /// The copyright notice for the font. + /// + public string Notice + { + get + { + return rec.notice; + } + } + + /// + /// Gets the font's full name. + /// + public string FullName + { + get + { + return rec.full_name; + } + } + + /// + /// Gets the font's family name. + /// + public string FamilyName + { + get + { + return rec.family_name; + } + } + + /// + /// Gets the weight description of the font + /// + public string Weight + { + get + { + return rec.weight; + } + } + + /// + /// Gets italic angle of the font. + /// + public int ItalicAngle + { + get + { + return (int)rec.italic_angle; + } + } + + /// + /// Gets whether the font is fixed pitch. + /// + public bool IsFixedPitch + { + get + { + return rec.is_fixed_pitch == 1; + } + } + + /// + /// Gets the position of the underline. + /// + public short UnderlinePosition + { + get + { + return rec.underline_position; + } + } + + /// + /// Gets the thickness of the underline stroke. + /// + [CLSCompliant(false)] + public ushort UnderlineThickness + { + get + { + return rec.underline_thickness; + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/PostScript/Internal/FaceDictRec.cs b/SharpFont/Source/SharpFontShared/PostScript/Internal/FaceDictRec.cs new file mode 100644 index 000000000..482083cb4 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PostScript/Internal/FaceDictRec.cs @@ -0,0 +1,54 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.PostScript.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct FaceDictRec + { + internal PrivateRec private_dict; + + internal uint len_buildchar; + internal FT_Long forcebold_threshold; + internal FT_Long stroke_width; + internal FT_Long expansion_factor; + + internal byte paint_type; + internal byte font_type; + internal FTMatrix font_matrix; + internal FTVector font_offset; + + internal uint num_subrs; + internal FT_ULong subrmap_offset; + internal int sd_bytes; + } +} diff --git a/SharpFont/Source/SharpFontShared/PostScript/Internal/FaceInfoRec.cs b/SharpFont/Source/SharpFontShared/PostScript/Internal/FaceInfoRec.cs new file mode 100644 index 000000000..c55d0ca76 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PostScript/Internal/FaceInfoRec.cs @@ -0,0 +1,69 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.PostScript.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct FaceInfoRec + { + [MarshalAs(UnmanagedType.LPStr)] + internal string cid_font_name; + internal FT_Long cid_version; + internal int cid_font_type; + + [MarshalAs(UnmanagedType.LPStr)] + internal string registry; + + [MarshalAs(UnmanagedType.LPStr)] + internal string ordering; + internal int supplement; + + internal FontInfoRec font_info; + internal BBox font_bbox; + internal FT_ULong uid_base; + + internal int num_xuid; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + internal FT_ULong[] xuid; + + internal FT_ULong cidmap_offset; + internal int fd_bytes; + internal int gd_bytes; + internal FT_ULong cid_count; + + internal int num_dicts; + internal IntPtr font_dicts; + + internal FT_ULong data_offset; + } +} diff --git a/SharpFont/Source/SharpFontShared/PostScript/Internal/FontInfoRec.cs b/SharpFont/Source/SharpFontShared/PostScript/Internal/FontInfoRec.cs new file mode 100644 index 000000000..cd06fb2d7 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PostScript/Internal/FontInfoRec.cs @@ -0,0 +1,56 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.PostScript.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct FontInfoRec + { + [MarshalAs(UnmanagedType.LPStr)] + internal string version; + + [MarshalAs(UnmanagedType.LPStr)] + internal string notice; + + [MarshalAs(UnmanagedType.LPStr)] + internal string full_name; + + [MarshalAs(UnmanagedType.LPStr)] + internal string family_name; + + [MarshalAs(UnmanagedType.LPStr)] + internal string weight; + + internal FT_Long italic_angle; + internal byte is_fixed_pitch; + internal short underline_position; + internal ushort underline_thickness; + } +} diff --git a/SharpFont/Source/SharpFontShared/PostScript/Internal/PrivateRec.cs b/SharpFont/Source/SharpFontShared/PostScript/Internal/PrivateRec.cs new file mode 100644 index 000000000..52067e914 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PostScript/Internal/PrivateRec.cs @@ -0,0 +1,82 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.PostScript.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct PrivateRec + { + internal int unique_id; + internal int lenIV; + + internal byte num_blue_values; + internal byte num_other_blues; + internal byte num_family_blues; + internal byte num_family_other_blues; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)] + internal short[] blue_values; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + internal short[] other_blues; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)] + internal short[] family_blues; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + internal short[] family_other_blues; + + internal FT_Long blue_scale; + internal int blue_shift; + internal int blue_fuzz; + + internal ushort standard_width; + internal ushort standard_height; + + internal byte num_snap_widths; + internal byte num_snap_heights; + internal byte force_bold; + internal byte round_stem_up; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)] + internal short[] snap_widths; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 13)] + internal short[] snap_heights; + + internal FT_Long expansion_factor; + + internal FT_Long language_group; + internal FT_Long password; + + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + internal short[] min_feature; + } +} diff --git a/SharpFont/Source/SharpFontShared/PostScript/Private.cs b/SharpFont/Source/SharpFontShared/PostScript/Private.cs new file mode 100644 index 000000000..a846d5831 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/PostScript/Private.cs @@ -0,0 +1,346 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.PostScript.Internal; + +namespace SharpFont.PostScript +{ + /// + /// A structure used to model a Type 1 or Type 2 private dictionary. Note that for Multiple Master fonts, each + /// instance has its own Private dictionary. + /// + public class Private + { + #region Fields + + private PrivateRec rec; + + #endregion + + #region Constructors + + internal Private(PrivateRec rec) + { + this.rec = rec; + } + + #endregion + + #region Properties + + /// + /// Gets the ID unique to the Type 1 font. + /// + public int UniqueId + { + get + { + return rec.unique_id; + } + } + + /// + /// Gets the number of random bytes at the beginning of charstrings (for encryption). + /// + public int LenIV + { + get + { + return rec.lenIV; + } + } + + /// + /// Gets the number of values (pairs) in the Blues array. + /// + public byte BlueValuesCount + { + get + { + return rec.num_blue_values; + } + } + + /// + /// Gets the number of values (pairs) in the OtherBlues array. + /// + public byte OtherBluesCount + { + get + { + return rec.num_other_blues; + } + } + + /// + /// Gets the number of values (pairs) in the FamilyBlues array. + /// + public byte FamilyBluesCount + { + get + { + return rec.num_family_blues; + } + } + + /// + /// Gets the number of values (pairs) in the FamilyOtherBlues array. + /// + public byte FamilyOtherBluesCount + { + get + { + return rec.num_family_other_blues; + } + } + + /// + /// Gets the pairs of blue values. + /// + public short[] BlueValues + { + get + { + return rec.blue_values; + } + } + + /// + /// Gets the pairs of blue values. + /// + public short[] OtherBlues + { + get + { + return rec.other_blues; + } + } + + /// + /// Gets the pairs of blue values. + /// + public short[] FamilyBlues + { + get + { + return rec.family_blues; + } + } + + /// + /// Gets the pairs of blue values. + /// + public short[] FamilyOtherBlues + { + get + { + return rec.family_other_blues; + } + } + + /// + /// Gets the point size at which overshoot suppression ceases. + /// + public int BlueScale + { + get + { + return (int)rec.blue_scale; + } + } + + /// + /// Gets whether characters smaller than the size given by BlueScale + /// should have overshoots suppressed. + /// + public int BlueShift + { + get + { + return rec.blue_shift; + } + } + + /// + /// Gets the number of character space units to extend the effect of an + /// alignment zone on a horizontal stem. Setting this to 0 is recommended + /// because it is unreliable. + /// + public int BlueFuzz + { + get + { + return rec.blue_fuzz; + } + } + + /// + /// Indicates the standard stroke width of vertical stems. + /// + [CLSCompliant(false)] + public ushort StandardWidth + { + get + { + return rec.standard_width; + } + } + + /// + /// Indicates the standard stroke width of horizontal stems. + /// + [CLSCompliant(false)] + public ushort StandardHeight + { + get + { + return rec.standard_height; + } + } + + /// + /// Indicates the number of values in the SnapWidths array. + /// + public byte SnapWidthsCount + { + get + { + return rec.num_snap_widths; + } + } + + /// + /// Indicates the number of values in the SnapHeights array. + /// + public byte SnapHeightsCount + { + get + { + return rec.num_snap_heights; + } + } + + /// + /// Gets whether bold characters should appear thicker than non-bold characters + /// at very small point sizes, where otherwise bold characters might appear the + /// same as non-bold characters. + /// + public bool ForceBold + { + get + { + return rec.force_bold == 1; + } + } + + /// + /// Superseded by the LanguageGroup entry. + /// + public bool RoundStemUp + { + get + { + return rec.round_stem_up == 1; + } + } + + /// + /// StemSnapH is an array of up to 12 values of the most common stroke widths for horizontal stems + /// (measured vertically). + /// + public short[] SnapWidths + { + get + { + return rec.snap_widths; + } + } + + /// + /// StemSnapV is an array of up to 12 values of the most common stroke widths for vertical stems + /// (measured horizontally). + /// + public short[] SnapHeights + { + get + { + return rec.snap_heights; + } + } + + /// + /// The Expansion Factor provides a limit for changing character bounding boxes during + /// processing that adjusts the size of fonts of Language Group 1. + /// + public int ExpansionFactor + { + get + { + return (int)rec.expansion_factor; + } + } + + /// + /// Indicates the aesthetic characteristics of the font. Currently, only LanguageGroup 0 + /// (e.g. Latin, Greek, Cyrillic, etc.) and LanguageGroup 1 (e.g. Chinese ideographs, Japanese + /// Kanji, etc) are recognized. + /// + public int LanguageGroup + { + get + { + return (int)rec.language_group; + } + } + + /// + /// The Password value is required for the Type 1 BuildChar to operate. + /// It must be set to 5839. + /// + public int Password + { + get + { + return (int)rec.password; + } + } + + /// + /// The MinFeature value is required for the Type 1 BuildChar to operate, but is obsolete. + /// It must be set to {16,16}. + /// + public short[] MinFeature + { + get + { + return rec.min_feature; + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Properties/AssemblyInfo.cs b/SharpFont/Source/SharpFontShared/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..05fe76079 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Properties/AssemblyInfo.cs @@ -0,0 +1,67 @@ +#region MIT License +/*Copyright (c) 2012-2016, Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: CLSCompliant(true)] +[assembly: InternalsVisibleTo("SharpFont.HarfBuzz, PublicKey=0024000004800000940000000602000000240000525341310004000001000100bfa6d85b0d27c914bc0fe0b18b7f05e0b2ac082c9e154b1739325f4e5537a3dc24712151df168ff0b28699c42cfc39f5f604c6321615d0dc1cd295422d2d244a172d24de1b01d1ced6854ed8d0cc82dd20409a1555f355160612869002de0bc9a9e50eaaa762ec4ebb46943adc18e829a0eb2ee45f47a2d9d46e808c736c77e9")] + +// 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("SharpFont")] +[assembly: AssemblyDescription("Cross-platform FreeType bindings for C#")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Robmaister")] +[assembly: AssemblyProduct("SharpFont")] +[assembly: AssemblyCopyright("Copyright (c) Robert Rouhani 2012-2016")] +[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("baf287e3-cfcc-4183-ba83-f23a7ecb8373")] + +// 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 Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("4.0.1.200")] +[assembly: AssemblyFileVersion("1.0.0.0")] + +//The SemVer version +[assembly: AssemblyInformationalVersion("4.0.1")] diff --git a/SharpFont/Source/SharpFontShared/Raster.cs b/SharpFont/Source/SharpFontShared/Raster.cs new file mode 100644 index 000000000..9bb2824c2 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Raster.cs @@ -0,0 +1,44 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont +{ + /// + /// A handle (pointer) to a raster object. Each object can be used independently to convert an outline into a + /// bitmap or pixmap. + /// + public class Raster : NativeObject + { + #region Constructors + + internal Raster(IntPtr reference) : base(reference) + { + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/RasterFlags.cs b/SharpFont/Source/SharpFontShared/RasterFlags.cs new file mode 100644 index 000000000..5b5ef8f2a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/RasterFlags.cs @@ -0,0 +1,64 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of bit flag constants as used in the ‘flags’ field of a structure. + /// + [Flags] + public enum RasterFlags + { + /// + /// This value is 0. + /// + Default = 0x0, + + /// + /// This flag is set to indicate that an anti-aliased glyph image should be generated. Otherwise, it will be + /// monochrome (1-bit). + /// + AntiAlias = 0x1, + + /// + /// This flag is set to indicate direct rendering. In this mode, client applications must provide their own + /// span callback. This lets them directly draw or compose over an existing bitmap. If this bit is not set, the + /// target pixmap's buffer must be zeroed before rendering. + /// + /// Note that for now, direct rendering is only possible with anti-aliased glyphs. + /// + Direct = 0x2, + + /// + /// This flag is only used in direct rendering mode. If set, the output will be clipped to a box specified in + /// the ‘clip_box’ field of the structure. + /// + /// Note that by default, the glyph bitmap is clipped to the target pixmap, except in direct rendering mode + /// where all spans are generated if no clipping box is set. + /// + Clip = 0x4 + } +} diff --git a/SharpFont/Source/SharpFontShared/RasterFuncs.cs b/SharpFont/Source/SharpFontShared/RasterFuncs.cs new file mode 100644 index 000000000..58fd14098 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/RasterFuncs.cs @@ -0,0 +1,210 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A function used to create a new raster object. + /// + /// + /// The ‘memory’ parameter is a typeless pointer in order to avoid un-wanted dependencies on the rest of the + /// FreeType code. In practice, it is an object, i.e., a handle to the standard FreeType + /// memory allocator. However, this field can be completely ignored by a given raster implementation. + /// + /// A handle to the memory allocator. + /// A handle to the new raster object. + /// Error code. 0 means success. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate Error RasterNewFunc(IntPtr memory, NativeReference raster); + + /// + /// A function used to destroy a given raster object. + /// + /// A handle to the raster object. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void RasterDoneFunc(NativeReference raster); + + /// + /// FreeType provides an area of memory called the ‘render pool’, available to all registered rasters. This pool + /// can be freely used during a given scan-conversion but is shared by all rasters. Its content is thus transient. + /// + /// This function is called each time the render pool changes, or just after a new raster object is created. + /// + /// + /// Rasters can ignore the render pool and rely on dynamic memory allocation if they want to (a handle to the + /// memory allocator is passed to the raster constructor). However, this is not recommended for efficiency + /// purposes. + /// + /// A handle to the new raster object. + /// The address in memory of the render pool. + /// The size in bytes of the render pool. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void RasterResetFunc(NativeReference raster, IntPtr pool_base, int pool_size); + + /// + /// This function is a generic facility to change modes or attributes in a given raster. This can be used for + /// debugging purposes, or simply to allow implementation-specific ‘features’ in a given raster module. + /// + /// A handle to the new raster object. + /// A 4-byte tag used to name the mode or property. + /// A pointer to the new mode/property to use. + [CLSCompliant(false)] + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void RasterSetModeFunc(NativeReference raster, uint mode, IntPtr args); + + /// + /// Invoke a given raster to scan-convert a given glyph image into a target + /// bitmap. + /// + /// + /// The exact format of the source image depends on the raster's glyph format defined in its + /// structure. It can be an or anything else in order to support a + /// large array of glyph formats. + /// + /// Note also that the render function can fail and return a error code if + /// the raster used does not support direct composition. + /// + /// XXX: For now, the standard raster doesn't support direct composition but this should change for the final + /// release (see the files ‘demos/src/ftgrays.c’ and ‘demos/src/ftgrays2.c’ for examples of distinct + /// implementations which support direct composition). + /// + /// A handle to the raster object. + /// + /// A pointer to an structure used to store the rendering parameters. + /// + /// Error code. 0 means success. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate Error RasterRenderFunc(NativeReference raster, NativeReference @params); + + /// + /// A structure used to describe a given raster class to the library. + /// + public class RasterFuncs: NativeObject + { + #region Fields + + private RasterFuncsRec rec; + + #endregion + + #region Constructors + + internal RasterFuncs(IntPtr reference) : base(reference) + { + } + + #endregion + + #region Properties + + /// + /// Gets the supported glyph format for this raster. + /// + [CLSCompliant(false)] + public GlyphFormat Format + { + get + { + return rec.glyph_format; + } + } + + /// + /// Gets the raster constructor. + /// + public RasterNewFunc New + { + get + { + return rec.raster_new; + } + } + + /// + /// Gets a function used to reset the render pool within the raster. + /// + public RasterResetFunc Reset + { + get + { + return rec.raster_reset; + } + } + + /// + /// Gets a function to set or change modes. + /// + [CLSCompliant(false)] + public RasterSetModeFunc SetMode + { + get + { + return rec.raster_set_mode; + } + } + + /// + /// Gets a function to render a glyph into a given bitmap. + /// + public RasterRenderFunc Render + { + get + { + return rec.raster_render; + } + } + + /// + /// Gets the raster destructor. + /// + public RasterDoneFunc Done + { + get + { + return rec.raster_done; + } + } + + internal override IntPtr Reference + { + get + { + return base.Reference; + } + + set + { + base.Reference = value; + rec = PInvokeHelper.PtrToStructure(value); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/RasterParams.cs b/SharpFont/Source/SharpFontShared/RasterParams.cs new file mode 100644 index 000000000..2673bea92 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/RasterParams.cs @@ -0,0 +1,237 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A function used as a call-back by the anti-aliased renderer in order to let client applications draw themselves + /// the gray pixel spans on each scan line. + /// + /// + /// This callback allows client applications to directly render the gray spans of the anti-aliased bitmap to any + /// kind of surfaces. + /// + /// This can be used to write anti-aliased outlines directly to a given background bitmap, and even perform + /// translucency. + /// + /// Note that the ‘count’ field cannot be greater than a fixed value defined by the ‘FT_MAX_GRAY_SPANS’ + /// configuration macro in ‘ftoption.h’. By default, this value is set to 32, which means that if there are more + /// than 32 spans on a given scanline, the callback is called several times with the same ‘y’ parameter in order to + /// draw all callbacks. + /// + /// Otherwise, the callback is only called once per scan-line, and only for those scanlines that do have ‘gray’ + /// pixels on them. + /// + /// The scanline's y coordinate. + /// The number of spans to draw on this scanline. + /// A table of ‘count’ spans to draw on the scanline. + /// User-supplied data that is passed to the callback. + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void RasterSpanFunc(int y, int count, NativeReference spans, IntPtr user); + + /// + /// THIS TYPE IS DEPRECATED. DO NOT USE IT. + /// + /// A function used as a call-back by the monochrome scan-converter to test whether a given target pixel is already + /// set to the drawing ‘color’. These tests are crucial to implement drop-out control per-se the TrueType spec. + /// + /// The pixel's y coordinate. + /// The pixel's x coordinate. + /// User-supplied data that is passed to the callback. + /// 1 if the pixel is ‘set’, 0 otherwise. + [Obsolete("This type is deprecated. Do not use it. See FreeType docuementation.")] + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate int RasterBitTestFunc(int y, int x, IntPtr user); + + /// + /// THIS TYPE IS DEPRECATED. DO NOT USE IT. + /// + /// A function used as a call-back by the monochrome scan-converter to set an individual target pixel. This is + /// crucial to implement drop-out control according to the TrueType specification. + /// + /// The pixel's y coordinate. + /// The pixel's x coordinate. + /// User-supplied data that is passed to the callback. + [Obsolete("This type is deprecated. Do not use it. See FreeType docuementation.")] + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void RasterBitSetFunc(int y, int x, IntPtr user); + + /// + /// A structure to hold the arguments used by a raster's render function. + /// + /// + /// An anti-aliased glyph bitmap is drawn if the bit flag is set in the ‘flags’ + /// field, otherwise a monochrome bitmap is generated. + /// + /// If the bit flag is set in ‘flags’, the raster will call the ‘gray_spans’ + /// callback to draw gray pixel spans, in the case of an aa glyph bitmap, it will call ‘black_spans’, and + /// ‘bit_test’ and ‘bit_set’ in the case of a monochrome bitmap. This allows direct composition over a pre-existing + /// bitmap through user-provided callbacks to perform the span drawing/composition. + /// + /// Note that the ‘bit_test’ and ‘bit_set’ callbacks are required when rendering a monochrome bitmap, as they are + /// crucial to implement correct drop-out control as defined in the TrueType specification. + /// + public class RasterParams : NativeObject + { + #region Fields + + private RasterParamsRec rec; + + #endregion + + #region Constructors + + internal RasterParams(IntPtr reference) : base(reference) + { + } + + #endregion + + #region Properties + + /// + /// Gets the target bitmap. + /// + public FTBitmap Target + { + get + { + return new FTBitmap(rec.target, null); + } + } + + /// + /// Gets a pointer to the source glyph image (e.g., an ). + /// + public IntPtr Source + { + get + { + return rec.source; + } + } + + /// + /// Gets the rendering flags. + /// + public RasterFlags Flags + { + get + { + return rec.flags; + } + } + + /// + /// Gets the gray span drawing callback. + /// + public RasterSpanFunc GraySpans + { + get + { + return rec.gray_spans; + } + } + + /// + /// Gets the black span drawing callback. UNIMPLEMENTED! + /// + [Obsolete] + public RasterSpanFunc BlackSpans + { + get + { + return rec.black_spans; + } + } + + /// + /// Gets the bit test callback. UNIMPLEMENTED! + /// + [Obsolete] + public RasterBitTestFunc BitTest + { + get + { + return rec.bit_test; + } + } + + /// + /// Gets the bit set callback. UNIMPLEMENTED! + /// + [Obsolete] + public RasterBitSetFunc BitSet + { + get + { + return rec.bit_set; + } + } + + /// + /// Gets the user-supplied data that is passed to each drawing callback. + /// + public IntPtr User + { + get + { + return rec.user; + } + } + + /// + /// Gets an optional clipping box. It is only used in direct rendering mode. Note that coordinates here should + /// be expressed in integer pixels (and not in 26.6 fixed-point units). + /// + public BBox ClipBox + { + get + { + return rec.clip_box; + } + } + + internal override IntPtr Reference + { + get + { + return base.Reference; + } + + set + { + base.Reference = value; + rec = PInvokeHelper.PtrToStructure(value); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/RenderMode.cs b/SharpFont/Source/SharpFontShared/RenderMode.cs new file mode 100644 index 000000000..046c9de22 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/RenderMode.cs @@ -0,0 +1,80 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// An enumeration type that lists the render modes supported by FreeType 2. Each mode corresponds to a specific + /// type of scanline conversion performed on the outline. + /// + /// For bitmap fonts and embedded bitmaps the field in the + /// structure gives the format of the returned bitmap. + /// + /// All modes except use 256 levels of opacity. + /// + /// + /// The LCD-optimized glyph bitmaps produced by can be filtered to reduce + /// color-fringes by using (not active in the default builds). It is up to the + /// caller to either call (if available) or do the filtering itself. + /// + /// The selected render mode only affects vector glyphs of a font. Embedded bitmaps often have a different pixel + /// mode like . You can use to transform them into 8-bit + /// pixmaps. + /// + public enum RenderMode + { + /// + /// This is the default render mode; it corresponds to 8-bit anti-aliased bitmaps. + /// + Normal = 0, + + /// + /// This is equivalent to . It is only defined as a separate value because + /// render modes are also used indirectly to define hinting algorithm selectors. + /// + /// + Light, + + /// + /// This mode corresponds to 1-bit bitmaps (with 2 levels of opacity). + /// + Mono, + + /// + /// This mode corresponds to horizontal RGB and BGR sub-pixel displays like LCD screens. It produces 8-bit + /// bitmaps that are 3 times the width of the original glyph outline in pixels, and which use the + /// mode. + /// + Lcd, + + /// + /// This mode corresponds to vertical RGB and BGR sub-pixel displays (like PDA screens, rotated LCD displays, + /// etc.). It produces 8-bit bitmaps that are 3 times the height of the original glyph outline in pixels and + /// use the mode. + /// + VerticalLcd, + } +} diff --git a/SharpFont/Source/SharpFontShared/Renderer.cs b/SharpFont/Source/SharpFontShared/Renderer.cs new file mode 100644 index 000000000..fc93a1a6a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Renderer.cs @@ -0,0 +1,69 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont +{ + /// + /// A handle to a given FreeType renderer. A renderer is a special module in charge of converting a glyph image to + /// a bitmap, when necessary. Each renderer supports a given glyph image format, and one or more target surface + /// depths. + /// + public class Renderer + { + #region Fields + + private IntPtr reference; + + #endregion + + #region Constructors + + internal Renderer(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/RendererClass.cs b/SharpFont/Source/SharpFontShared/RendererClass.cs new file mode 100644 index 000000000..4f36342d7 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/RendererClass.cs @@ -0,0 +1,150 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// The renderer module class descriptor. + /// + public class RendererClass + { + #region Fields + + private IntPtr reference; + private RendererClassRec rec; + + #endregion + + #region Constructors + + internal RendererClass(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the root fields. + /// + public ModuleClass Root + { + get + { + return new ModuleClass(reference); + } + } + + /// + /// Gets the glyph image format this renderer handles. + /// + [CLSCompliant(false)] + public GlyphFormat Format + { + get + { + return rec.glyph_format; + } + } + + /// + /// Gets a method used to render the image that is in a given glyph slot into a bitmap. + /// + public IntPtr RenderGlyph + { + get + { + return rec.render_glyph; + } + } + + /// + /// Gets a method used to transform the image that is in a given glyph slot. + /// + public IntPtr TransformGlyph + { + get + { + return rec.transform_glyph; + } + } + + /// + /// Gets a method used to access the glyph's cbox. + /// + public IntPtr GetGlyphCBox + { + get + { + return rec.get_glyph_cbox; + } + } + + /// + /// Gets a method used to pass additional parameters. + /// + public IntPtr SetMode + { + get + { + return rec.set_mode; + } + } + + /// + /// Gets a pointer to its raster's class. + /// + /// For renderers only. + public RasterFuncs RasterClass + { + get + { + return new RasterFuncs(PInvokeHelper.AbsoluteOffsetOf(Reference, "raster_class")); + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Settings.StyleCop b/SharpFont/Source/SharpFontShared/Settings.StyleCop new file mode 100644 index 000000000..2c2aa1c55 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Settings.StyleCop @@ -0,0 +1,97 @@ + + + + + + Rec\.cs$ + Marhsaler\.cs$ + + + + + + + + + + False + + + + + + + + + + False + + + + + + + + + + False + + + + + False + + + + + + + + + + False + + + + + + + + + + False + + + + + False + + + + + True + True + + + + + + + False + + + + + + + + + + False + + + + + + + \ No newline at end of file diff --git a/SharpFont/Source/SharpFontShared/SharpFontShared.projitems b/SharpFont/Source/SharpFontShared/SharpFontShared.projitems new file mode 100644 index 000000000..545a9af4b --- /dev/null +++ b/SharpFont/Source/SharpFontShared/SharpFontShared.projitems @@ -0,0 +1,187 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + 2e4773b7-961a-4328-9d77-9749f9071ca2 + + + SharpFont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SharpFont/Source/SharpFontShared/SharpFontShared.shproj b/SharpFont/Source/SharpFontShared/SharpFontShared.shproj new file mode 100644 index 000000000..3aa2efe8c --- /dev/null +++ b/SharpFont/Source/SharpFontShared/SharpFontShared.shproj @@ -0,0 +1,12 @@ + + + + 2e4773b7-961a-4328-9d77-9749f9071ca2 + + + + + + + + diff --git a/SharpFont/Source/SharpFontShared/SizeMetrics.cs b/SharpFont/Source/SharpFontShared/SizeMetrics.cs new file mode 100644 index 000000000..43de64525 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/SizeMetrics.cs @@ -0,0 +1,167 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// The size metrics structure gives the metrics of a size object. + /// + /// + /// The scaling values, if relevant, are determined first during a size changing operation. The remaining fields + /// are then set by the driver. For scalable formats, they are usually set to scaled values of the corresponding + /// fields in . + /// + /// Note that due to glyph hinting, these values might not be exact for certain fonts. Thus they must be treated as + /// unreliable with an error margin of at least one pixel! + /// + /// Indeed, the only way to get the exact metrics is to render all glyphs. As this would be a definite performance + /// hit, it is up to client applications to perform such computations. + /// + /// The structure is valid for bitmap fonts also. + /// + public sealed class SizeMetrics + { + #region Fields + + private SizeMetricsRec rec; + + #endregion + + #region Constructors + + internal SizeMetrics(SizeMetricsRec metricsInternal) + { + rec = metricsInternal; + } + + #endregion + + #region Properties + + /// + /// Gets the width of the scaled EM square in pixels, hence the term ‘ppem’ (pixels per EM). It is also referred to + /// as ‘nominal width’. + /// + [CLSCompliant(false)] + public ushort NominalWidth + { + get + { + return rec.x_ppem; + } + } + + /// + /// Gets the height of the scaled EM square in pixels, hence the term ‘ppem’ (pixels per EM). It is also referred to + /// as ‘nominal height’. + /// + [CLSCompliant(false)] + public ushort NominalHeight + { + get + { + return rec.y_ppem; + } + } + + /// + /// Gets a 16.16 fractional scaling value used to convert horizontal metrics from font units to 26.6 fractional + /// pixels. Only relevant for scalable font formats. + /// + public Fixed16Dot16 ScaleX + { + get + { + return Fixed16Dot16.FromRawValue((int)rec.x_scale); + } + } + + /// + /// Gets a 16.16 fractional scaling value used to convert vertical metrics from font units to 26.6 fractional + /// pixels. Only relevant for scalable font formats. + /// + public Fixed16Dot16 ScaleY + { + get + { + return Fixed16Dot16.FromRawValue((int)rec.y_scale); + } + } + + /// + /// Gets the ascender in 26.6 fractional pixels. + /// + /// + public Fixed26Dot6 Ascender + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.ascender); + } + } + + /// + /// Gets the descender in 26.6 fractional pixels. + /// + /// + public Fixed26Dot6 Descender + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.descender); + } + } + + /// + /// Gets the height in 26.6 fractional pixels. + /// + /// + public Fixed26Dot6 Height + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.height); + } + } + + /// + /// Gets the maximal advance width in 26.6 fractional pixels. + /// + /// + public Fixed26Dot6 MaxAdvance + { + get + { + return Fixed26Dot6.FromRawValue((int)rec.max_advance); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/SizeRequest.cs b/SharpFont/Source/SharpFontShared/SizeRequest.cs new file mode 100644 index 000000000..c2b14ee5a --- /dev/null +++ b/SharpFont/Source/SharpFontShared/SizeRequest.cs @@ -0,0 +1,205 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont +{ + /// + /// A structure used to model a size request. + /// + /// + /// If is zero, then the horizontal scaling value is set equal to the vertical scaling value, + /// and vice versa. + /// + [StructLayout(LayoutKind.Sequential)] + public struct SizeRequest : IEquatable + { + #region Fields + + private SizeRequestType requestType; + private FT_Long width; + private FT_Long height; + private uint horiResolution; + private uint vertResolution; + + #endregion + + #region Properties + + /// + /// Gets the type of request. See . + /// + public SizeRequestType RequestType + { + get + { + return requestType; + } + + set + { + requestType = value; + } + } + + /// + /// Gets or sets the desired width. + /// + public int Width + { + get + { + return (int)width; + } + + set + { + width = (FT_Long)value; + } + } + + /// + /// Gets or sets the desired height. + /// + public int Height + { + get + { + return (int)height; + } + + set + { + height = (FT_Long)value; + } + } + + /// + /// Gets or sets the horizontal resolution. If set to zero, is treated as a 26.6 fractional pixel + /// value. + /// + [CLSCompliant(false)] + public uint HorizontalResolution + { + get + { + return horiResolution; + } + + set + { + horiResolution = value; + } + } + + /// + /// Gets or sets the horizontal resolution. If set to zero, is treated as a 26.6 fractional pixel + /// value. + /// + [CLSCompliant(false)] + public uint VerticalResolution + { + get + { + return vertResolution; + } + + set + { + vertResolution = value; + } + } + + #endregion + + #region Methods + + /// + /// Compares two s for equality. + /// + /// A . + /// Another . + /// A value indicating equality. + public static bool operator ==(SizeRequest left, SizeRequest right) + { + return left.Equals(right); + } + + /// + /// Compares two s for inequality. + /// + /// A . + /// Another . + /// A value indicating inequality. + public static bool operator !=(SizeRequest left, SizeRequest right) + { + return !left.Equals(right); + } + + /// + /// Compares this instance of to another for equality. + /// + /// A . + /// A value indicating equality. + public bool Equals(SizeRequest other) + { + return requestType == other.requestType && + width == other.width && + height == other.height && + horiResolution == other.horiResolution && + vertResolution == other.vertResolution; + } + + /// + /// Compares this instance of to another object for equality. + /// + /// An object. + /// A value indicating equality. + public override bool Equals(object obj) + { + if (obj is SizeRequest) + return this.Equals((SizeRequest)obj); + else + return false; + } + + /// + /// Gets a unique hash code for this instance. + /// + /// A unique hash code. + public override int GetHashCode() + { + return requestType.GetHashCode() ^ width.GetHashCode() ^ height.GetHashCode() ^ horiResolution.GetHashCode() ^ vertResolution.GetHashCode(); + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/SizeRequestType.cs b/SharpFont/Source/SharpFontShared/SizeRequestType.cs new file mode 100644 index 000000000..76e90d671 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/SizeRequestType.cs @@ -0,0 +1,70 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// An enumeration type that lists the supported size request types. + /// + /// + /// The above descriptions only apply to scalable formats. For bitmap formats, the behaviour is up to the driver. + /// + /// See the note section of if you wonder how size + /// requesting relates to scaling values. + /// + public enum SizeRequestType + { + /// + /// The nominal size. The ‘units_per_EM’ field of is used to determine both scaling values. + /// + Normal, + + /// + /// The real dimension. The sum of the the ‘ascender’ and (minus of) the ‘descender’ fields of + /// are used to determine both scaling values. + /// + RealDimensions, + + /// + /// The font bounding box. The width and height of the ‘bbox’ field of are used to determine + /// the horizontal and vertical scaling value, respectively. + /// + BoundingBox, + + /// + /// The ‘max_advance_width’ field of is used to determine the horizontal scaling value; the + /// vertical scaling value is determined the same way as does. + /// Finally, both scaling values are set to the smaller one. This type is useful if you want to specify the + /// font size for, say, a window of a given dimension and 80x24 cells. + /// + Cell, + + /// + /// Specify the scaling values directly. + /// + Scales + } +} diff --git a/SharpFont/Source/SharpFontShared/Span.cs b/SharpFont/Source/SharpFontShared/Span.cs new file mode 100644 index 000000000..f154955c5 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Span.cs @@ -0,0 +1,112 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A structure used to model a single span of gray (or black) pixels when rendering a monochrome or anti-aliased + /// bitmap. + /// + /// + /// This structure is used by the span drawing callback type named which takes the y + /// coordinate of the span as a a parameter. + /// + /// The coverage value is always between 0 and 255. If you want less gray values, the callback function has to + /// reduce them. + /// + public class Span : NativeObject + { + #region Fields + + private SpanRec rec; + + #endregion + + #region Constructors + + internal Span(IntPtr reference) : base(reference) + { + } + + #endregion + + #region Properties + + /// + /// Gets the span's horizontal start position. + /// + public short X + { + get + { + return rec.x; + } + } + + /// + /// Gets the span's length in pixels. + /// + [CLSCompliant(false)] + public ushort Length + { + get + { + return rec.len; + } + } + + /// + /// Gets the span color/coverage, ranging from 0 (background) to 255 (foreground). Only used for anti-aliased + /// rendering. + /// + public byte Coverage + { + get + { + return rec.coverage; + } + } + + internal override IntPtr Reference + { + get + { + return base.Reference; + } + + set + { + base.Reference = value; + rec = PInvokeHelper.PtrToStructure(value); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/StreamDesc.cs b/SharpFont/Source/SharpFontShared/StreamDesc.cs new file mode 100644 index 000000000..0962ad697 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/StreamDesc.cs @@ -0,0 +1,94 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.Internal; + +namespace SharpFont +{ + /// + /// A union type used to store either a long or a pointer. This is used to store a file descriptor or a ‘FILE*’ in + /// an input stream. + /// + public class StreamDesc + { + #region Fields + + private IntPtr reference; + private StreamDescRec rec; + + #endregion + + #region Constructors + + internal StreamDesc(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the as a file descriptor. + /// + public int Value + { + get + { + return (int)rec.value; + } + } + + /// + /// Gets the as an input stream (FILE*). + /// + public IntPtr Pointer + { + get + { + return rec.pointer; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/Stroker.cs b/SharpFont/Source/SharpFontShared/Stroker.cs new file mode 100644 index 000000000..9ae79b4ea --- /dev/null +++ b/SharpFont/Source/SharpFontShared/Stroker.cs @@ -0,0 +1,392 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// Opaque handler to a path stroker object. + /// + public class Stroker : IDisposable + { + #region Fields + + private IntPtr reference; + private bool disposed; + + private Library parentLibrary; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// FreeType library handle. + public Stroker(Library library) + { + IntPtr strokerRef; + Error err = FT.FT_Stroker_New(library.Reference, out strokerRef); + + if (err != Error.Ok) + throw new FreeTypeException(err); + + Reference = strokerRef; + library.AddChildStroker(this); + parentLibrary = library; + } + + /// + /// Finalizes an instance of the class. + /// + ~Stroker() + { + Dispose(false); + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the has been disposed. + /// + public bool IsDisposed + { + get + { + return disposed; + } + } + + internal IntPtr Reference + { + get + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + return reference; + } + + set + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + reference = value; + } + } + + #endregion + + #region Methods + + /// + /// Reset a stroker object's attributes. + /// + /// + /// The radius is expressed in the same units as the outline coordinates. + /// + /// The border radius. + /// The line cap style. + /// The line join style. + /// + /// The miter limit for the and + /// line join styles, expressed as 16.16 fixed point value. + /// + public void Set(int radius, StrokerLineCap lineCap, StrokerLineJoin lineJoin, Fixed16Dot16 miterLimit) + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + FT.FT_Stroker_Set(Reference, radius, lineCap, lineJoin, (IntPtr)miterLimit.Value); + } + + /// + /// Reset a stroker object without changing its attributes. You should call this function before beginning a + /// new series of calls to or . + /// + public void Rewind() + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + FT.FT_Stroker_Rewind(Reference); + } + + /// + /// A convenience function used to parse a whole outline with the stroker. The resulting outline(s) can be + /// retrieved later by functions like and . + /// + /// + /// If ‘opened’ is 0 (the default), the outline is treated as a closed path, and the stroker generates two + /// distinct ‘border’ outlines. + /// + /// If ‘opened’ is 1, the outline is processed as an open path, and the stroker generates a single ‘stroke’ + /// outline. + /// + /// This function calls automatically. + /// + /// The source outline. + /// + /// A boolean. If 1, the outline is treated as an open path instead of a closed one. + /// + public void ParseOutline(Outline outline, bool opened) + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + if (outline == null) + throw new ArgumentNullException("outline"); + + Error err = FT.FT_Stroker_ParseOutline(Reference, outline.Reference, opened); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Start a new sub-path in the stroker. + /// + /// + /// This function is useful when you need to stroke a path that is not stored as an + /// object. + /// + /// A pointer to the start vector. + /// A boolean. If 1, the sub-path is treated as an open one. + public void BeginSubPath(FTVector to, bool open) + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + Error err = FT.FT_Stroker_BeginSubPath(Reference, ref to, open); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Close the current sub-path in the stroker. + /// + /// + /// You should call this function after . If the subpath was not ‘opened’, this + /// function ‘draws’ a single line segment to the start position when needed. + /// + public void EndSubPath() + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + Error err = FT.FT_Stroker_EndSubPath(Reference); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// ‘Draw’ a single line segment in the stroker's current sub-path, from the last position. + /// + /// + /// You should call this function between and . + /// + /// A pointer to the destination point. + public void LineTo(FTVector to) + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + Error err = FT.FT_Stroker_LineTo(Reference, ref to); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// ‘Draw’ a single quadratic Bézier in the stroker's current sub-path, from the last position. + /// + /// + /// You should call this function between and . + /// + /// A pointer to a Bézier control point. + /// A pointer to the destination point. + public void ConicTo(FTVector control, FTVector to) + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + Error err = FT.FT_Stroker_ConicTo(Reference, ref control, ref to); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// ‘Draw’ a single cubic Bézier in the stroker's current sub-path, from the last position. + /// + /// + /// You should call this function between and . + /// + /// A pointer to the first Bézier control point. + /// A pointer to second Bézier control point. + /// A pointer to the destination point. + public void CubicTo(FTVector control1, FTVector control2, FTVector to) + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + Error err = FT.FT_Stroker_CubicTo(Reference, ref control1, ref control2, ref to); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Call this function once you have finished parsing your paths with the stroker. It returns the number of + /// points and contours necessary to export one of the ‘border’ or ‘stroke’ outlines generated by the stroker. + /// + /// + /// When an outline, or a sub-path, is ‘closed’, the stroker generates two independent ‘border’ outlines, named + /// ‘left’ and ‘right’. + /// + /// When the outline, or a sub-path, is ‘opened’, the stroker merges the ‘border’ outlines with caps. The + /// ‘left’ border receives all points, while the ‘right’ border becomes empty. + /// + /// Use the function instead if you want to retrieve the counts associated to both + /// borders. + /// + /// The border index. + /// The number of points. + /// The number of contours. + [CLSCompliant(false)] + public void GetBorderCounts(StrokerBorder border, out uint pointsCount, out uint contoursCount) + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + Error err = FT.FT_Stroker_GetBorderCounts(Reference, border, out pointsCount, out contoursCount); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Call this function after to export the corresponding border to your own + /// structure. + /// + /// Note that this function appends the border points and contours to your outline, but does not try to resize + /// its arrays. + /// + /// + /// Always call this function after to get sure that there is enough room in your + /// object to receive all new data. + /// + /// When an outline, or a sub-path, is ‘closed’, the stroker generates two independent ‘border’ outlines, named + /// ‘left’ and ‘right’. + /// + /// When the outline, or a sub-path, is ‘opened’, the stroker merges the ‘border’ outlines with caps. The + /// ‘left’ border receives all points, while the ‘right’ border becomes empty. + /// + /// Use the function instead if you want to retrieve all borders at once. + /// + /// The border index. + /// The target outline handle. + public void ExportBorder(StrokerBorder border, Outline outline) + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + if (outline == null) + throw new ArgumentNullException("outline"); + + FT.FT_Stroker_ExportBorder(Reference, border, outline.Reference); + } + + /// + /// Call this function once you have finished parsing your paths with the stroker. It returns the number of + /// points and contours necessary to export all points/borders from the stroked outline/path. + /// + /// The number of points. + /// The number of contours. + [CLSCompliant(false)] + public void GetCounts(out uint pointsCount, out uint contoursCount) + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + Error err = FT.FT_Stroker_GetCounts(Reference, out pointsCount, out contoursCount); + + if (err != Error.Ok) + throw new FreeTypeException(err); + } + + /// + /// Call this function after to export all borders to your own + /// structure. + /// + /// Note that this function appends the border points and contours to your outline, but does not try to resize + /// its arrays. + /// + /// The target outline handle. + public void Export(Outline outline) + { + if (disposed) + throw new ObjectDisposedException("Stroker", "Cannot access a disposed object."); + + if (outline == null) + throw new ArgumentNullException("outline"); + + FT.FT_Stroker_Export(Reference, outline.Reference); + } + + /// + /// Disposes an instance of the class. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!disposed) + { + disposed = true; + + FT.FT_Stroker_Done(reference); + + // removes itself from the parent Library, with a check to prevent this from happening when Library is + // being disposed (Library disposes all it's children with a foreach loop, this causes an + // InvalidOperationException for modifying a collection during enumeration) + if (!parentLibrary.IsDisposed) + parentLibrary.RemoveChildStroker(this); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/StrokerBorder.cs b/SharpFont/Source/SharpFontShared/StrokerBorder.cs new file mode 100644 index 000000000..2a08bb3b3 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/StrokerBorder.cs @@ -0,0 +1,53 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// These values are used to select a given stroke border in and + /// . + /// + /// + /// Applications are generally interested in the ‘inside’ and ‘outside’ borders. However, there is no direct + /// mapping between these and the ‘left’ and ‘right’ ones, since this really depends on the glyph's drawing + /// orientation, which varies between font formats. + /// + /// You can however use and to get + /// these. + /// + public enum StrokerBorder + { + /// + /// Select the left border, relative to the drawing direction. + /// + Left = 0, + + /// + /// Select the right border, relative to the drawing direction. + /// + Right + } +} diff --git a/SharpFont/Source/SharpFontShared/StrokerLineCap.cs b/SharpFont/Source/SharpFontShared/StrokerLineCap.cs new file mode 100644 index 000000000..7f43084e2 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/StrokerLineCap.cs @@ -0,0 +1,49 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// These values determine how the end of opened sub-paths are rendered in a stroke. + /// + public enum StrokerLineCap + { + /// + /// The end of lines is rendered as a full stop on the last point itself. + /// + Butt = 0, + + /// + /// The end of lines is rendered as a half-circle around the last point. + /// + Round, + + /// + /// The end of lines is rendered as a square around the last point. + /// + Square + } +} diff --git a/SharpFont/Source/SharpFontShared/StrokerLineJoin.cs b/SharpFont/Source/SharpFontShared/StrokerLineJoin.cs new file mode 100644 index 000000000..770cb2a24 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/StrokerLineJoin.cs @@ -0,0 +1,69 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// These values determine how two joining lines are rendered in a stroker. + /// + public enum StrokerLineJoin + { + /// + /// Used to render rounded line joins. Circular arcs are used to join two lines smoothly. + /// + Round = 0, + + /// + /// Used to render beveled line joins. The outer corner of the joined lines is filled by enclosing the + /// triangular region of the corner with a straight line between the outer corners of each stroke. + /// + Bevel = 1, + + /// + /// Used to render mitered line joins, with fixed bevels if the miter limit is exceeded. The outer edges of the + /// strokes for the two segments are extended until they meet at an angle. If the segments meet at too sharp an + /// angle (such that the miter would extend from the intersection of the segments a distance greater than the + /// product of the miter limit value and the border radius), then a bevel join (see above) is used instead. + /// This prevents long spikes being created. generates a miter line join as used in + /// PostScript and PDF. + /// + MiterVariable = 2, + + /// + /// An alias for , retained for backwards compatibility. + /// + Miter = MiterVariable, + + /// + /// Used to render mitered line joins, with variable bevels if the miter limit is exceeded. The intersection of + /// the strokes is clipped at a line perpendicular to the bisector of the angle between the strokes, at the + /// distance from the intersection of the segments equal to the product of the miter limit value and the border + /// radius. This prevents long spikes being created. generates a mitered line join + /// as used in XPS. + /// + MiterFixed = 3 + } +} diff --git a/SharpFont/Source/SharpFontShared/StyleFlags.cs b/SharpFont/Source/SharpFontShared/StyleFlags.cs new file mode 100644 index 000000000..1951520e3 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/StyleFlags.cs @@ -0,0 +1,49 @@ +#region MIT License +/*Copyright (c) 2012-2014 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of bit-flags used to indicate the style of a given face. These are used in the ‘style_flags’ field of + /// . + /// + /// + /// The style information as provided by FreeType is very basic. More details are beyond the scope and should be + /// done on a higher level (for example, by analyzing various fields of the ‘OS/2’ table in SFNT based fonts). + /// + [Flags] + public enum StyleFlags + { + /// No style flags. + None = 0x00, + + /// Indicates that a given face style is italic or oblique. + Italic = 0x01, + + /// Indicates that a given face is bold. + Bold = 0x02 + } +} diff --git a/SharpFont/Source/SharpFontShared/SubGlyph.cs b/SharpFont/Source/SharpFontShared/SubGlyph.cs new file mode 100644 index 000000000..0db46f1ca --- /dev/null +++ b/SharpFont/Source/SharpFontShared/SubGlyph.cs @@ -0,0 +1,73 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont +{ + /// + /// The subglyph structure is an internal object used to describe subglyphs (for example, in the case of + /// composites). + /// + /// + /// The subglyph implementation is not part of the high-level API, hence the forward structure declaration. + /// + /// You can however retrieve subglyph information with . + /// + public sealed class SubGlyph + { + #region Fields + + private IntPtr reference; + + #endregion + + #region Constructors + + internal SubGlyph(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/SubGlyphFlags.cs b/SharpFont/Source/SharpFontShared/SubGlyphFlags.cs new file mode 100644 index 000000000..8cc64027f --- /dev/null +++ b/SharpFont/Source/SharpFontShared/SubGlyphFlags.cs @@ -0,0 +1,71 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of constants used to describe subglyphs. Please refer to the TrueType specification for the meaning of + /// the various flags. + /// + [Flags] + public enum SubGlyphFlags + { + /// + /// Set this to indicate arguments are word size; otherwise, they are byte size. + /// + ArgsAreWords = 0x0001, + + /// + /// Set this to indicate arguments are X and Y values; otherwise, X and Y indicate point coordinates. + /// + ArgsAreXYValues = 0x0002, + + /// + /// Set this to round XY values to the grid. + /// + RoundXYToGrid = 0x0004, + + /// + /// Set this to indicate the component has a simple scale; otherwise, the scale is 1.0. + /// + Scale = 0x0008, + + /// + /// Set this to indicate that X and Y are scaled independently. + /// + XYScale = 0x0040, + + /// + /// Set this to indicate there is a 2 by 2 transformation used to scale the component. + /// + TwoByTwo = 0x0080, + + /// + /// Set this to forse aw, lsb and rsb for the composite to be equal to those from the original glyph. + /// + UseMyMetrics = 0x0200 + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/EncodingId.cs b/SharpFont/Source/SharpFontShared/TrueType/EncodingId.cs new file mode 100644 index 000000000..ba850c7bc --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/EncodingId.cs @@ -0,0 +1,230 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.TrueType +{ + /// + /// A list of valid values for the ‘encoding_id’ for TT_PLATFORM_APPLE_UNICODE charmaps and name entries. + /// + [CLSCompliant(false)] + public enum AppleEncodingId : ushort + { + /// Unicode version 1.0. + Default = 0, + + /// Unicode 1.1; specifies Hangul characters starting at U+34xx. + Unicode11, + + /// Deprecated (identical to preceding). + Iso10646, + + /// Unicode 2.0 and beyond (UTF-16 BMP only). + Unicode20, + + /// Unicode 3.1 and beyond, using UTF-32. + Unicode32, + + /// From Adobe, not Apple. Not a normal cmap. Specifies variations on a real cmap. + VariantSelector, + } + + /// + /// A list of valid values for the ‘encoding_id’ for TT_PLATFORM_MACINTOSH charmaps and name entries. + /// + [CLSCompliant(false)] + public enum MacEncodingId : ushort + { + /// Roman encoding. + Roman = 0, + + /// Japanese encoding. + Japanese = 1, + + /// Traditional Chinese encoding. + TraditionalChinese = 2, + + /// Korean encoding. + Korean = 3, + + /// Arabic encoding. + Arabic = 4, + + /// Hebrew encoding. + Hebrew = 5, + + /// Greek encoding. + Greek = 6, + + /// Russian encoding. + Russian = 7, + + /// RSymbol encoding. + RSymbol = 8, + + /// Devanagari encoding. + Devanagari = 9, + + /// Gurmukhi encoding. + Gurmukhi = 10, + + /// Gujarati encoding. + Gujarati = 11, + + /// Oriya encoding. + Oriya = 12, + + /// Bengali encoding. + Bengali = 13, + + /// Tamil encoding. + Tamil = 14, + + /// Telugu encoding. + Telugu = 15, + + /// Kannada encoding. + Kannada = 16, + + /// Malayalam encoding. + Malayalam = 17, + + /// Sinhalese encoding. + Sinhalese = 18, + + /// Burmese encoding. + Burmese = 19, + + /// Khmer encoding. + Khmer = 20, + + /// Thai encoding. + Thai = 21, + + /// Laotian encoding. + Laotian = 22, + + /// Georgian encoding. + Georgian = 23, + + /// Amernian encoding. + Armenian = 24, + + /// Maldivian encoding. + Maldivian = 25, + + /// Simplified Chinese encoding. + SimplifiedChinese = 25, + + /// Tibetan encoding. + Tibetan = 26, + + /// Mongolian encoding. + Mongolian = 27, + + /// Geez encoding. + Geez = 28, + + /// Slavic encoding. + Slavic = 29, + + /// Vietnamese encoding. + Vietnamese = 30, + + /// Sindhi encoding. + Sindhi = 31, + + /// No encoding specified. + Uninterpreted = 32, + } + + /// + /// A list of valid values for the ‘encoding_id’ for TT_PLATFORM_MICROSOFT charmaps and name entries. + /// + [CLSCompliant(false)] + public enum MicrosoftEncodingId : ushort + { + /// + /// Corresponds to Microsoft symbol encoding. See FT_ENCODING_MS_SYMBOL. + /// + Symbol = 0, + + /// + /// Corresponds to a Microsoft WGL4 charmap, matching Unicode. See FT_ENCODING_UNICODE. + /// + Unicode = 1, + + /// + /// Corresponds to SJIS Japanese encoding. See FT_ENCODING_SJIS. + /// + Sjis = 2, + + /// + /// Corresponds to Simplified Chinese as used in Mainland China. See FT_ENCODING_GB2312. + /// + GB2312 = 3, + + /// + /// Corresponds to Traditional Chinese as used in Taiwan and Hong Kong. See FT_ENCODING_BIG5. + /// + Big5 = 4, + + /// + /// Corresponds to Korean Wansung encoding. See FT_ENCODING_WANSUNG. + /// + Wansung = 5, + + /// + /// Corresponds to Johab encoding. See FT_ENCODING_JOHAB. + /// + Johab = 6, + + /// + /// Corresponds to UCS-4 or UTF-32 charmaps. This has been added to the OpenType specification version 1.4 + /// (mid-2001.) + /// + Ucs4 = 10, + } + + /// + /// A list of valid values for the ‘encoding_id’ for TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific + /// extension! + /// + [CLSCompliant(false)] + public enum AdobeEncodingId : ushort + { + /// Adobe standard encoding. + Standard = 0, + + /// Adobe expert encoding. + Expert = 1, + + /// Adobe custom encoding. + Custom = 2, + + /// Adobe Latin 1 encoding. + Latin1 = 3 + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/EngineType.cs b/SharpFont/Source/SharpFontShared/TrueType/EngineType.cs new file mode 100644 index 000000000..8b4c88d9e --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/EngineType.cs @@ -0,0 +1,55 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.TrueType +{ + /// + /// A list of values describing which kind of TrueType bytecode engine is implemented in a given + /// instance. It is used by the function. + /// + public enum EngineType + { + /// + /// The library doesn't implement any kind of bytecode interpreter. + /// + None = 0, + + /// + /// The library implements a bytecode interpreter that doesn't support the patented operations of the TrueType + /// virtual machine. + /// + /// Its main use is to load certain Asian fonts which position and scale glyph components with bytecode + /// instructions. It produces bad output for most other fonts. + /// + Unpatented, + + /// + /// The library implements a bytecode interpreter that covers the full instruction set of the TrueType virtual + /// machine (this was governed by patents until May 2010, hence the name). + /// + Patented + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/Header.cs b/SharpFont/Source/SharpFontShared/TrueType/Header.cs new file mode 100644 index 000000000..664ab3c2d --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/Header.cs @@ -0,0 +1,396 @@ +#region MIT License +/*Copyright (c) 2012-2014 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Linq; +using System.Runtime.InteropServices; + +using SharpFont.TrueType.Internal; + +namespace SharpFont.TrueType +{ + /// + /// Provides Mac style flags for the header table. + /// + [Flags] + [CLSCompliant(false)] + public enum HeaderMacStyles : ushort + { + /// + /// Bold style. + /// + Bold = 1 << 0, + + /// + /// Italic style. + /// + Italic = 1 << 2, + + /// + /// Underline style. + /// + Underline = 1 << 3, + + /// + /// Outline style. + /// + Outline = 1 << 4, + + /// + /// Shadow style. + /// + Shadow = 1 << 5, + + /// + /// Condensed style. + /// + Condensed = 1 << 6, + + /// + /// Extended style. + /// + Extended = 1 << 7, + + // bits 7-15 are reserved + } + + /// + /// Provides flags for the header table. + /// + [Flags] + [CLSCompliant(false)] + public enum HeaderFLags : ushort + { + /// + /// The baseline for this font is at the y-origin. + /// + BaselineAtOrigin = 1 << 0, + + /// + /// The left side bearing is at the x-origin. + /// + LeftSidebearingAtOrigin = 1 << 1, + + /// + /// The instructions in this font depend on the point size. + /// + InstructionsDependOnPointSize = 1 << 2, + + /// + /// Use integer values only (no fractional ppem sizes) for internal scaler math. + /// + ForcePpemToIntegers = 1 << 3, + + /// + /// Instructions may alter the advance width and therefore, advance widths might not scale linearly. + /// + InstructionsMayAlterAdvance = 1 << 4, + + // Bits 5-10 are not implemented in TrueType, but should be set according to Apple's specification + + /// + /// The font is designed to be laid out vertically, using the x-origin as the vertical baseline. + /// + FontIsVertical = 1 << 5, + + /// + /// This bit is reserved and must be set to zero. + /// + Reserved6 = 1 << 6, + + /// + /// The font requires layout for linguistic rendering, such as in Arabic fonts. + /// + RequiresLayout = 1 << 7, + + /// + /// The font is an AAT font having metamorphosis effects. + /// + HasMetamorphosisEffects = 1 << 8, + + /// + /// The font contains strong right-to-left glyphs. + /// + RightToLeft = 1 << 9, + + /// + /// The font contains Indic effects. + /// + IsIndic = 1 << 10, + + /// + /// The font data has been compressed and decompressed, making the data lossless. + /// + FontDataIsLossless = 1 << 11, + + /// + /// The font has been converted. + /// + FontIsConverted = 1 << 12, + + /// + /// The font is optimized for ClearType display. + /// + FontIsClearTypeOptimized = 1 << 13, + + /// + /// The glyphs in the cmap subtables are generic representations of code points. + /// If unset, those glyphs represent proper support for those code points. + /// + FontIsLastResort = 1 << 14, + + // Bit 15: reserved + } + + /// + /// A structure used to model a TrueType font header table. All fields follow the TrueType specification. + /// + public class Header + { + #region Fields + + private IntPtr reference; + private HeaderRec rec; + + #endregion + + #region Constructors + + internal Header(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// The version number of this table definition. + /// + public int TableVersion + { + get + { + return (int)rec.Table_Version; + } + } + + /// + /// The version number of the font, provided by the font manufacturer. + /// + public int FontRevision + { + get + { + return (int)rec.Font_Revision; + } + } + + /// + /// Provides a checksum of the font. + /// + public int ChecksumAdjust + { + get + { + return (int)rec.Checksum_Adjust; + } + } + + /// + /// Gets the constant 0x5F0F3CF5. + /// + public int MagicNumber + { + get + { + return (int)rec.Magic_Number; + } + } + + /// + /// Gets font flags for miscellaneous information. + /// + [CLSCompliant(false)] + public HeaderFLags Flags + { + get + { + return (HeaderFLags)rec.Flags; + } + } + + /// + /// Gets the designed number of units per em, also referred to as FUnits. + /// + [CLSCompliant(false)] + public ushort UnitsPerEM + { + get + { + return rec.Units_Per_EM; + } + } + + /// + /// Gets the date and time created. + /// + public int[] Created + { + get + { + return rec.Created.Select(x => (int)x).ToArray(); + } + } + + /// + /// Gets the last time modified. + /// + public int[] Modified + { + get + { + return rec.Modified.Select(x => (int)x).ToArray(); + } + } + + /// + /// Get the minimum X value of all glyph bounding boxes. + /// + public short MinimumX + { + get + { + return rec.xMin; + } + } + + /// + /// Get the minimum Y value of all glyph bounding boxes. + /// + public short MinimumY + { + get + { + return rec.yMin; + } + } + + /// + /// Get the maximum X value of all glyph bounding boxes. + /// + public short MaximumX + { + get + { + return rec.xMax; + } + } + + /// + /// Get the maximum Y value of all glyph bounding boxes. + /// + public short MaximumY + { + get + { + return rec.yMax; + } + } + + /// + /// Gets the basic style of the font (bold, etc.). + /// + [CLSCompliant(false)] + public HeaderMacStyles MacStyle + { + get + { + return (HeaderMacStyles)rec.Mac_Style; + } + } + + /// + /// Gets the smallest readable size, in pixels. + /// + [CLSCompliant(false)] + public ushort LowestRecPpem + { + get + { + return rec.Lowest_Rec_PPEM; + } + } + + /// + /// Gets the direction of glyhps (deprecated). + /// + public short FontDirection + { + get + { + return rec.Font_Direction; + } + } + + /// + /// Gets the length of index: 0 for short, 1 for long. + /// + public short IndexToLocFormat + { + get + { + return rec.Index_To_Loc_Format; + } + } + + /// + /// Gets the format of glyph data. + /// + public short GlyphDataFormat + { + get + { + return rec.Glyph_Data_Format; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/HoriHeader.cs b/SharpFont/Source/SharpFontShared/TrueType/HoriHeader.cs new file mode 100644 index 000000000..621db055c --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/HoriHeader.cs @@ -0,0 +1,274 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.TrueType.Internal; + +namespace SharpFont.TrueType +{ + /// + /// A structure used to model a TrueType horizontal header, the ‘hhea’ table, as well as the corresponding + /// horizontal metrics table, i.e., the ‘hmtx’ table. + /// + /// + /// IMPORTANT: The and structures should be identical except for + /// the names of their fields which are different. + /// + /// This ensures that a single function in the ‘ttload’ module is able to read both the horizontal and vertical + /// headers. + /// + public class HoriHeader + { + #region Fields + + private IntPtr reference; + private HoriHeaderRec rec; + + #endregion + + #region Constructors + + internal HoriHeader(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the table version. + /// + public int Version + { + get + { + return (int)rec.Version; + } + } + + /// + /// Gets the font's ascender, i.e., the distance from the baseline to the top-most of all glyph points found in + /// the font. + /// + /// This value is invalid in many fonts, as it is usually set by the font designer, and often reflects only a + /// portion of the glyphs found in the font (maybe ASCII). + /// + /// You should use the ‘sTypoAscender’ field of the OS/2 table instead if you want the correct one. + /// + public short Ascender + { + get + { + return rec.Ascender; + } + } + + /// + /// Gets the font's descender, i.e., the distance from the baseline to the bottom-most of all glyph points + /// found in the font. It is negative. + /// + /// This value is invalid in many fonts, as it is usually set by the font designer, and often reflects only a + /// portion of the glyphs found in the font (maybe ASCII). + /// + /// You should use the ‘sTypoDescender’ field of the OS/2 table instead if you want the correct one. + /// + public short Descender + { + get + { + return rec.Descender; + } + } + + /// + /// Gets the font's line gap, i.e., the distance to add to the ascender and descender to get the BTB, i.e., the + /// baseline-to-baseline distance for the font. + /// + public short LineGap + { + get + { + return rec.Line_Gap; + } + } + + /// + /// Gets the maximum of all advance widths found in the font. It can be used to compute the maximum width of an + /// arbitrary string of text. + /// + [CLSCompliant(false)] + public ushort AdvanceWidthMax + { + get + { + return rec.advance_Width_Max; + } + } + + /// + /// Gets the minimum left side bearing of all glyphs within the font. + /// + public short MinimumLeftSideBearing + { + get + { + return rec.min_Left_Side_Bearing; + } + } + + /// + /// Gets the minimum right side bearing of all glyphs within the font. + /// + public short MinimumRightSideBearing + { + get + { + return rec.min_Right_Side_Bearing; + } + } + + /// + /// Gets the maximum horizontal extent (i.e., the ‘width’ of a glyph's bounding box) for all glyphs in the + /// font. + /// + public short MaximumExtentX + { + get + { + return rec.xMax_Extent; + } + } + + /// + /// Gets the rise coefficient of the cursor's slope of the cursor (slope=rise/run). + /// + public short CaretSlopeRise + { + get + { + return rec.caret_Slope_Rise; + } + } + + /// + /// Gets the run coefficient of the cursor's slope. + /// + public short CaretSlopeRun + { + get + { + return rec.caret_Slope_Run; + } + } + + /// + /// Gets the amount of offset needed to provide best appearance with slanted fonts. + /// Set to 0 for non-slanted fonts. + /// + public short CaretOffset + { + get + { + return rec.caret_Offset; + } + } + + /// + /// Gets the 8 reserved bytes. + /// + public short[] Reserved + { + get + { + return rec.Reserved; + } + } + + /// + /// Gets 0, always. + /// + public short MetricDataFormat + { + get + { + return rec.metric_Data_Format; + } + } + + /// + /// Gets the number of HMetrics entries in the ‘hmtx’ table -- this value can be smaller than the total number + /// of glyphs in the font. + /// + [CLSCompliant(false)] + public ushort HMetricsCount + { + get + { + return rec.number_Of_HMetrics; + } + } + + /// + /// Gets a pointer into the ‘hmtx’ table. + /// + public IntPtr LongMetrics + { + get + { + return rec.long_metrics; + } + } + + /// + /// Gets a pointer into the ‘hmtx’ table. + /// + public IntPtr ShortMetrics + { + get + { + return rec.short_metrics; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/Internal/HeaderRec.cs b/SharpFont/Source/SharpFontShared/TrueType/Internal/HeaderRec.cs new file mode 100644 index 000000000..c216ac539 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/Internal/HeaderRec.cs @@ -0,0 +1,65 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.TrueType.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct HeaderRec + { + internal FT_Long Table_Version; + internal FT_Long Font_Revision; + + internal FT_Long Checksum_Adjust; + internal FT_Long Magic_Number; + + internal ushort Flags; + internal ushort Units_Per_EM; + + private FT_Long created1; + private FT_Long created2; + internal FT_Long[] Created { get { return new[] {created1, created2}; } } + + private FT_Long modified1; + private FT_Long modified2; + internal FT_Long[] Modified { get { return new[] { modified1, modified2 }; } } + + internal short xMin; + internal short yMin; + internal short xMax; + internal short yMax; + + internal ushort Mac_Style; + internal ushort Lowest_Rec_PPEM; + + internal short Font_Direction; + internal short Index_To_Loc_Format; + internal short Glyph_Data_Format; + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/Internal/HoriHeaderRec.cs b/SharpFont/Source/SharpFontShared/TrueType/Internal/HoriHeaderRec.cs new file mode 100644 index 000000000..19bffee0b --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/Internal/HoriHeaderRec.cs @@ -0,0 +1,73 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.TrueType.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct HoriHeaderRec + { + internal FT_Long Version; + internal short Ascender; + internal short Descender; + internal short Line_Gap; + + internal ushort advance_Width_Max; + + internal short min_Left_Side_Bearing; + internal short min_Right_Side_Bearing; + internal short xMax_Extent; + internal short caret_Slope_Rise; + internal short caret_Slope_Run; + internal short caret_Offset; + + private fixed short reserved[4]; + internal short[] Reserved + { + get + { + var array = new short[4]; + + fixed (short* p = reserved) + { + for (int i = 0; i < array.Length; i++) + array[i] = p[i]; + } + + return array; + } + } + + internal short metric_Data_Format; + internal ushort number_Of_HMetrics; + + internal IntPtr long_metrics; + internal IntPtr short_metrics; + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/Internal/MaxProfileRec.cs b/SharpFont/Source/SharpFontShared/TrueType/Internal/MaxProfileRec.cs new file mode 100644 index 000000000..504f48bd4 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/Internal/MaxProfileRec.cs @@ -0,0 +1,52 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.TrueType.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct MaxProfileRec + { + internal FT_Long version; + internal ushort numGlyphs; + internal ushort maxPoints; + internal ushort maxContours; + internal ushort maxCompositePoints; + internal ushort maxCompositeContours; + internal ushort maxZones; + internal ushort maxTwilightPoints; + internal ushort maxStorage; + internal ushort maxFunctionDefs; + internal ushort maxInstructionDefs; + internal ushort maxStackElements; + internal ushort maxSizeOfInstructions; + internal ushort maxComponentElements; + internal ushort maxComponentDepth; + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/Internal/OS2Rec.cs b/SharpFont/Source/SharpFontShared/TrueType/Internal/OS2Rec.cs new file mode 100644 index 000000000..d54c52a05 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/Internal/OS2Rec.cs @@ -0,0 +1,113 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.TrueType.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct OS2Rec + { + internal ushort version; + internal short xAvgCharWidth; + internal ushort usWeightClass; + internal ushort usWidthClass; + internal EmbeddingTypes fsType; + internal short ySubscriptXSize; + internal short ySubscriptYSize; + internal short ySubscriptXOffset; + internal short ySubscriptYOffset; + internal short ySuperscriptXSize; + internal short ySuperscriptYSize; + internal short ySuperscriptXOffset; + internal short ySuperscriptYOffset; + internal short yStrikeoutSize; + internal short yStrikeoutPosition; + internal short sFamilyClass; + + private fixed byte _panose[10]; + internal byte[] panose + { + get + { + var array = new byte[10]; + + fixed (byte* p = _panose) + { + for (int i = 0; i < array.Length; i++) + array[i] = p[i]; + } + + return array; + } + } + + internal FT_ULong ulUnicodeRange1; + internal FT_ULong ulUnicodeRange2; + internal FT_ULong ulUnicodeRange3; + internal FT_ULong ulUnicodeRange4; + + private fixed byte _achVendID[4]; + internal byte[] achVendID + { + get + { + var array = new byte[4]; + + fixed (byte* p = _achVendID) + { + for (int i = 0; i < array.Length; i++) + array[i] = p[i]; + } + + return array; + } + } + + internal ushort fsSelection; + internal ushort usFirstCharIndex; + internal ushort usLastCharIndex; + internal short sTypoAscender; + internal short sTypoDescender; + internal short sTypoLineGap; + internal ushort usWinAscent; + internal ushort usWinDescent; + + internal FT_ULong ulCodePageRange1; + internal FT_ULong ulCodePageRange2; + + internal short sxHeight; + internal short sCapHeight; + internal ushort usDefaultChar; + internal ushort usBreakChar; + internal ushort usMaxContext; + + internal ushort usLowerOpticalPointSize; + internal ushort usUpperOpticalPointSize; + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/Internal/PCLTRec.cs b/SharpFont/Source/SharpFontShared/TrueType/Internal/PCLTRec.cs new file mode 100644 index 000000000..8638bb49f --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/Internal/PCLTRec.cs @@ -0,0 +1,85 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.TrueType.Internal +{ + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + internal unsafe struct PCLTRec + { + internal FT_Long Version; + internal FT_ULong FontNumber; + internal ushort Pitch; + internal ushort xHeight; + internal ushort Style; + internal ushort TypeFamily; + internal ushort CapHeight; + internal ushort SymbolSet; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] + internal string TypeFace; + + private fixed byte characterComplement[8]; + internal byte[] CharacterComplement + { + get + { + var array = new byte[8]; + fixed (byte* p = characterComplement) + { + for (int i = 0; i < array.Length; i++) + array[i] = p[i]; + } + return array; + } + } + + private fixed byte fileName[6]; + internal byte[] FileName + { + get + { + var array = new byte[6]; + + fixed (byte* p = fileName) + { + for (int i = 0; i < array.Length; i++) + array[i] = p[i]; + } + + return array; + } + } + + internal byte StrokeWeight; + internal byte WidthType; + internal byte SerifStyle; + internal byte Reserved; + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/Internal/PostscriptRec.cs b/SharpFont/Source/SharpFontShared/TrueType/Internal/PostscriptRec.cs new file mode 100644 index 000000000..c20668ed4 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/Internal/PostscriptRec.cs @@ -0,0 +1,46 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.TrueType.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct PostscriptRec + { + internal FT_Long FormatType; + internal FT_Long italicAngle; + internal short underlinePosition; + internal short underlineThickness; + internal FT_ULong isFixedPitch; + internal FT_ULong minMemType42; + internal FT_ULong maxMemType42; + internal FT_ULong minMemType1; + internal FT_ULong maxMemType1; + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/Internal/SfntNameRec.cs b/SharpFont/Source/SharpFontShared/TrueType/Internal/SfntNameRec.cs new file mode 100644 index 000000000..6f21c4977 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/Internal/SfntNameRec.cs @@ -0,0 +1,41 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +namespace SharpFont.TrueType.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal struct SfntNameRec + { + internal PlatformId platform_id; + internal ushort encoding_id; + internal ushort language_id; + internal ushort name_id; + + internal IntPtr @string; + internal uint string_len; + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/Internal/VertHeaderRec.cs b/SharpFont/Source/SharpFontShared/TrueType/Internal/VertHeaderRec.cs new file mode 100644 index 000000000..332e8ad01 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/Internal/VertHeaderRec.cs @@ -0,0 +1,73 @@ +#region MIT License +/*Copyright (c) 2012-2015 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using FT_Long = System.IntPtr; +using FT_ULong = System.UIntPtr; + +namespace SharpFont.TrueType.Internal +{ + [StructLayout(LayoutKind.Sequential)] + internal unsafe struct VertHeaderRec + { + internal FT_Long Version; + internal short Ascender; + internal short Descender; + internal short Line_Gap; + + internal ushort advance_Height_Max; + + internal short min_Top_Side_Bearing; + internal short min_Bottom_Side_Bearing; + internal short yMax_Extent; + internal short caret_Slope_Rise; + internal short caret_Slope_Run; + internal short caret_Offset; + + private fixed short reserved[4]; + internal short[] Reserved + { + get + { + var array = new short[4]; + + fixed (short* p = reserved) + { + for (int i = 0; i < array.Length; i++) + array[i] = p[i]; + } + + return array; + } + } + + internal short metric_Data_Format; + internal ushort number_Of_VMetrics; + + internal IntPtr long_metrics; + internal IntPtr short_metrics; + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/MaxProfile.cs b/SharpFont/Source/SharpFontShared/TrueType/MaxProfile.cs new file mode 100644 index 000000000..8162c824c --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/MaxProfile.cs @@ -0,0 +1,258 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.TrueType.Internal; + +namespace SharpFont.TrueType +{ + /// + /// The maximum profile is a table containing many max values which can be used to pre-allocate arrays. This + /// ensures that no memory allocation occurs during a glyph load. + /// + /// + /// This structure is only used during font loading. + /// + public class MaxProfile + { + #region Fields + + private IntPtr reference; + private MaxProfileRec rec; + + #endregion + + #region Constructors + + internal MaxProfile(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the version number. + /// + public int Version + { + get + { + return (int)rec.version; + } + } + + /// + /// Gets the number of glyphs in this TrueType font. + /// + [CLSCompliant(false)] + public ushort GlyphCount + { + get + { + return rec.numGlyphs; + } + } + + /// + /// Gets the maximum number of points in a non-composite TrueType glyph. See also the structure element + /// ‘maxCompositePoints’. + /// + [CLSCompliant(false)] + public ushort MaxPoints + { + get + { + return rec.maxPoints; + } + } + + /// + /// Gets the maximum number of contours in a non-composite TrueType glyph. See also the structure element + /// ‘maxCompositeContours’. + /// + [CLSCompliant(false)] + public ushort MaxContours + { + get + { + return rec.maxContours; + } + } + + /// + /// Gets the maximum number of points in a composite TrueType glyph. See also the structure element + /// ‘maxPoints’. + /// + [CLSCompliant(false)] + public ushort MaxCompositePoints + { + get + { + return rec.maxCompositePoints; + } + } + + /// + /// Gets the maximum number of contours in a composite TrueType glyph. See also the structure element + /// ‘maxContours’. + /// + [CLSCompliant(false)] + public ushort MaxCompositeContours + { + get + { + return rec.maxCompositeContours; + } + } + + /// + /// Gets the maximum number of zones used for glyph hinting. + /// + [CLSCompliant(false)] + public ushort MaxZones + { + get + { + return rec.maxZones; + } + } + + /// + /// Gets the maximum number of points in the twilight zone used for glyph hinting. + /// + [CLSCompliant(false)] + public ushort MaxTwilightPoints + { + get + { + return rec.maxTwilightPoints; + } + } + + /// + /// Gets the maximum number of elements in the storage area used for glyph hinting. + /// + [CLSCompliant(false)] + public ushort MaxStorage + { + get + { + return rec.maxStorage; + } + } + + /// + /// Gets the maximum number of function definitions in the TrueType bytecode for this font. + /// + [CLSCompliant(false)] + public ushort MaxFunctionDefs + { + get + { + return rec.maxFunctionDefs; + } + } + + /// + /// Gets the maximum number of instruction definitions in the TrueType bytecode for this font. + /// + [CLSCompliant(false)] + public ushort MaxInstructionDefs + { + get + { + return rec.maxInstructionDefs; + } + } + + /// + /// Gets the maximum number of stack elements used during bytecode interpretation. + /// + [CLSCompliant(false)] + public ushort MaxStackElements + { + get + { + return rec.maxStackElements; + } + } + + /// + /// Gets the maximum number of TrueType opcodes used for glyph hinting. + /// + [CLSCompliant(false)] + public ushort MaxSizeOfInstructions + { + get + { + return rec.maxSizeOfInstructions; + } + } + + /// + /// Gets the maximum number of simple (i.e., non- composite) glyphs in a composite glyph. + /// + [CLSCompliant(false)] + public ushort MaxComponentElements + { + get + { + return rec.maxComponentElements; + } + } + + /// + /// Gets the maximum nesting depth of composite glyphs. + /// + [CLSCompliant(false)] + public ushort MaxComponentDepth + { + get + { + return rec.maxComponentDepth; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/OS2.cs b/SharpFont/Source/SharpFontShared/TrueType/OS2.cs new file mode 100644 index 000000000..cf40219b2 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/OS2.cs @@ -0,0 +1,532 @@ +#region MIT License +/*Copyright (c) 2012-2014 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.TrueType.Internal; + +namespace SharpFont.TrueType +{ + /// + /// A structure used to model a TrueType OS/2 table. This is the long table version. All fields comply to the + /// TrueType specification. + /// + /// Note that we now support old Mac fonts which do not include an OS/2 table. In this case, the ‘version’ field is + /// always set to 0xFFFF. + /// + public class OS2 + { + #region Fields + + private IntPtr reference; + private OS2Rec rec; + + #endregion + + #region Constructors + + internal OS2(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// The version of this table. + /// + [CLSCompliant(false)] + public ushort Version + { + get + { + return rec.version; + } + } + + /// + /// The average glyph width, computed by averaging ALL non-zero width glyphs in the font, in pels/em. + /// + public short AverageCharWidth + { + get + { + return rec.xAvgCharWidth; + } + } + + /// + /// The visual weight of the font. + /// + [CLSCompliant(false)] + public ushort WeightClass + { + get + { + return rec.usWeightClass; + } + } + + /// + /// The relative change in width from the normal aspect ratio. + /// + [CLSCompliant(false)] + public ushort WidthClass + { + get + { + return rec.usWidthClass; + } + } + + /// + /// Font embedding and subsetting licensing rights as determined by the font author. + /// + [CLSCompliant(false)] + public EmbeddingTypes EmbeddingType + { + get + { + return rec.fsType; + } + } + + /// + /// The font author's recommendation for sizing glyphs (em square) to create subscripts when a glyph doesn't exist for a subscript. + /// + public short SubscriptSizeX + { + get + { + return rec.ySubscriptXSize; + } + } + + /// + /// The font author's recommendation for sizing glyphs (em height) to create subscripts when a glyph doesn't exist for a subscript. + /// + public short SubscriptSizeY + { + get + { + return rec.ySubscriptYSize; + } + } + + /// + /// The font author's recommendation for vertically positioning subscripts that are created when a glyph doesn't exist for a subscript. + /// + public short SubscriptOffsetX + { + get + { + return rec.ySubscriptXOffset; + } + } + + /// + /// The font author's recommendation for horizontally positioning subscripts that are created when a glyph doesn't exist for a subscript. + /// + public short SubscriptOffsetY + { + get + { + return rec.ySubscriptYOffset; + } + } + + /// + /// The font author's recommendation for sizing glyphs (em square) to create superscripts when a glyph doesn't exist for a subscript. + /// + public short SuperscriptSizeX + { + get + { + return rec.ySuperscriptXSize; + } + } + + /// + /// The font author's recommendation for sizing glyphs (em height) to create superscripts when a glyph doesn't exist for a subscript. + /// + public short SuperscriptSizeY + { + get + { + return rec.ySuperscriptYSize; + } + } + + /// + /// The font author's recommendation for vertically positioning superscripts that are created when a glyph doesn't exist for a subscript. + /// + public short SuperscriptOffsetX + { + get + { + return rec.ySuperscriptXOffset; + } + } + + /// + /// The font author's recommendation for horizontally positioning superscripts that are created when a glyph doesn't exist for a subscript. + /// + public short SuperscriptOffsetY + { + get + { + return rec.ySuperscriptYOffset; + } + } + + /// + /// The thickness of the strikeout stroke. + /// + public short StrikeoutSize + { + get + { + return rec.yStrikeoutSize; + } + } + + /// + /// The position of the top of the strikeout line relative to the baseline. + /// + public short StrikeoutPosition + { + get + { + return rec.yStrikeoutPosition; + } + } + + /// + /// The IBM font family class and subclass, useful for choosing visually similar fonts. + /// + /// Refer to https://www.microsoft.com/typography/otspec160/ibmfc.htm. + public short FamilyClass + { + get + { + return rec.sFamilyClass; + } + } + + //TODO write a PANOSE class from TrueType spec? + /// + /// The Panose values describe visual characteristics of the font. + /// Similar fonts can then be selected based on their Panose values. + /// + public byte[] Panose + { + get + { + return rec.panose; + } + } + + /// + /// Unicode character range, bits 0-31. + /// + [CLSCompliant(false)] + public uint UnicodeRange1 + { + get + { + return (uint)rec.ulUnicodeRange1; + } + } + + /// + /// Unicode character range, bits 32-63. + /// + [CLSCompliant(false)] + public uint UnicodeRange2 + { + get + { + return (uint)rec.ulUnicodeRange2; + } + } + + /// + /// Unicode character range, bits 64-95. + /// + [CLSCompliant(false)] + public uint UnicodeRange3 + { + get + { + return (uint)rec.ulUnicodeRange3; + } + } + + /// + /// Unicode character range, bits 96-127. + /// + [CLSCompliant(false)] + public uint UnicodeRange4 + { + get + { + return (uint)rec.ulUnicodeRange4; + } + } + + /// + /// The vendor's identifier. + /// + public byte[] VendorId + { + get + { + return rec.achVendID; + } + } + + /// + /// Describes variations in the font. + /// + [CLSCompliant(false)] + public ushort SelectionFlags + { + get + { + return rec.fsSelection; + } + } + + /// + /// The minimum Unicode index (character code) in this font. + /// Since this value is limited to 0xFFFF, applications should not use this field. + /// + [CLSCompliant(false)] + public ushort FirstCharIndex + { + get + { + return rec.usFirstCharIndex; + } + } + + /// + /// The maximum Unicode index (character code) in this font. + /// Since this value is limited to 0xFFFF, applications should not use this field. + /// + [CLSCompliant(false)] + public ushort LastCharIndex + { + get + { + return rec.usLastCharIndex; + } + } + + /// + /// The ascender value, useful for computing a default line spacing in conjunction with unitsPerEm. + /// + public short TypographicAscender + { + get + { + return rec.sTypoAscender; + } + } + + /// + /// The descender value, useful for computing a default line spacing in conjunction with unitsPerEm. + /// + public short TypographicDescender + { + get + { + return rec.sTypoDescender; + } + } + + /// + /// The line gap value, useful for computing a default line spacing in conjunction with unitsPerEm. + /// + public short TypographicLineGap + { + get + { + return rec.sTypoLineGap; + } + } + + /// + /// The ascender metric for Windows, usually set to yMax. Windows will clip glyphs that go above this value. + /// + [CLSCompliant(false)] + public ushort WindowsAscent + { + get + { + return rec.usWinAscent; + } + } + + /// + /// The descender metric for Windows, usually set to yMin. Windows will clip glyphs that go below this value. + /// + [CLSCompliant(false)] + public ushort WindowsDescent + { + get + { + return rec.usWinDescent; + } + } + + /// + /// Specifies the code pages encompassed by this font. + /// + [CLSCompliant(false)] + public uint CodePageRange1 + { + get + { + return (uint)rec.ulCodePageRange1; + } + } + + /// + /// Specifies the code pages encompassed by this font. + /// + [CLSCompliant(false)] + public uint CodePageRange2 + { + get + { + return (uint)rec.ulUnicodeRange1; + } + } + + /// + /// The approximate height of non-ascending lowercase letters relative to the baseline. + /// + public short Height + { + get + { + return rec.sxHeight; + } + } + + /// + /// The approximate height of uppercase letters relative to the baseline. + /// + public short CapHeight + { + get + { + return rec.sCapHeight; + } + } + + /// + /// The Unicode index (character code) of the glyph to use when a glyph doesn't exist for the requested character. + /// Since this value is limited to 0xFFFF, applications should not use this field. + /// + [CLSCompliant(false)] + public ushort DefaultChar + { + get + { + return rec.usDefaultChar; + } + } + + /// + /// The Unicode index (character code) of the glyph to use as the break character. + /// The 'space' character is normally the break character. + /// Since this value is limited to 0xFFFF, applications should not use this field. + /// + [CLSCompliant(false)] + public ushort BreakChar + { + get + { + return rec.usBreakChar; + } + } + + /// + /// The maximum number of characters needed to determine glyph context when applying features such as ligatures. + /// + [CLSCompliant(false)] + public ushort MaxContext + { + get + { + return rec.usMaxContext; + } + } + + /// + /// The lowest point size at which the font starts to be used, in twips. + /// + [CLSCompliant(false)] + public ushort LowerOpticalPointSize + { + get + { + return rec.usLowerOpticalPointSize; + } + } + + /// + /// The highest point size at which the font is no longer used, in twips. + /// + [CLSCompliant(false)] + public ushort UpperOpticalPointSize + { + get + { + return rec.usUpperOpticalPointSize; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/Pclt.cs b/SharpFont/Source/SharpFontShared/TrueType/Pclt.cs new file mode 100644 index 000000000..6f9bdd1d7 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/Pclt.cs @@ -0,0 +1,251 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.TrueType.Internal; + +namespace SharpFont.TrueType +{ + /// + /// A structure used to model a TrueType PCLT table. All fields comply to the TrueType specification. + /// + public class Pclt + { + #region Fields + + private IntPtr reference; + private PCLTRec rec; + + #endregion + + #region Constructors + + internal Pclt(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// The version number of this table. Version 1.0 is represented as 0x00010000. + /// + public int Version + { + get + { + return (int)rec.Version; + } + } + + /// + /// A unique identifier for the font. Refer to the specification for the meaning of various bits. + /// + [CLSCompliant(false)] + public uint FontNumber + { + get + { + return (uint)rec.FontNumber; + } + } + + /// + /// The width of the space character, in FUnits (see UnitsPerEm in the head table). + /// + [CLSCompliant(false)] + public ushort Pitch + { + get + { + return rec.Pitch; + } + } + + /// + /// The height of the optical height of the lowercase 'x' in FUnits. + /// This is a separate value from its height measurement. + /// + [CLSCompliant(false)] + public ushort Height + { + get + { + return rec.xHeight; + } + } + + /// + /// Describes structural appearance and effects of letterforms. + /// + [CLSCompliant(false)] + public ushort Style + { + get + { + return rec.Style; + } + } + + /// + /// Encodes the font vendor code and font family code into 16 bits. + /// Refer to the spec for details. + /// + [CLSCompliant(false)] + public ushort TypeFamily + { + get + { + return rec.TypeFamily; + } + } + + /// + /// The height of the optical height of the uppercase 'H' in FUnits. + /// This is a separate value from its height measurement. + /// + [CLSCompliant(false)] + public ushort CapHeight + { + get + { + return rec.CapHeight; + } + } + + /// + /// Encodes the symbol set's number field and ID field. + /// Refer to the spec for details. + /// + [CLSCompliant(false)] + public ushort SymbolSet + { + get + { + return rec.SymbolSet; + } + } + + /// + /// The name and style of the font. The names of fonts within a family should be identical and the + /// style identifiers should be standardized: e.g., Bd, It, BdIt. Length is 16 bytes. + /// + public string Typeface + { + get + { + return rec.TypeFace; + } + } + + /// + /// Identifies the symbol collections provided by the font. Length is 8 bytes. + /// Refer to the spec for details. + /// + public byte[] CharacterComplement + { + get + { + return rec.CharacterComplement; + } + } + + /// + /// A standardized filename of the font. Length is 6 bytes. + /// Refer to the spec for details. + /// + public byte[] FileName + { + get + { + return rec.FileName; + } + } + + /// + /// Indicates the stroke weight. Valid values are in the range -7 to 7. Length is 1 byte. + /// + public byte StrokeWeight + { + get + { + return rec.StrokeWeight; + } + } + + /// + /// Indicates the stroke weight. Valid values are in the range -5 to 5. Length is 1 byte. + /// + public byte WidthType + { + get + { + return rec.WidthType; + } + } + + /// + /// Encodes the serif style. The top two bits indicate sans serif/monoline or serif/contrasting. + /// Valid values for the lower 6 bits are in the range 0 to 12. Length is 1 byte. + /// + public byte SerifStyle + { + get + { + return rec.SerifStyle; + } + } + + /// + /// Reserved. Set to 0. + /// + public byte Reserved + { + get + { + return rec.Reserved; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/PlatformId.cs b/SharpFont/Source/SharpFontShared/TrueType/PlatformId.cs new file mode 100644 index 000000000..cb0b52845 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/PlatformId.cs @@ -0,0 +1,74 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.TrueType +{ + /// + /// A list of valid values for the ‘platform_id’ identifier code in and + /// structures. + /// + [CLSCompliant(false)] + public enum PlatformId : ushort + { + /// + /// Used by Apple to indicate a Unicode character map and/or name entry. See TT_APPLE_ID_XXX for corresponding + /// ‘encoding_id’ values. Note that name entries in this format are coded as big-endian UCS-2 character codes + /// only. + /// + AppleUnicode = 0, + + /// + /// Used by Apple to indicate a MacOS-specific charmap and/or name entry. See TT_MAC_ID_XXX for corresponding + /// ‘encoding_id’ values. Note that most TrueType fonts contain an Apple roman charmap to be usable on MacOS + /// systems (even if they contain a Microsoft charmap as well). + /// + Macintosh = 1, + + /// + /// This value was used to specify ISO/IEC 10646 charmaps. It is however now deprecated. See TT_ISO_ID_XXX for + /// a list of corresponding ‘encoding_id’ values. + /// + Iso = 2, + + /// + /// Used by Microsoft to indicate Windows-specific charmaps. See TT_MS_ID_XXX for a list of corresponding + /// ‘encoding_id’ values. Note that most fonts contain a Unicode charmap using (TT_PLATFORM_MICROSOFT, + /// TT_MS_ID_UNICODE_CS). + /// + Microsoft = 3, + + /// + /// Used to indicate application-specific charmaps. + /// + Custom = 4, + + /// + /// This value isn't part of any font format specification, but is used by FreeType to report Adobe-specific + /// charmaps in an structure. See TT_ADOBE_ID_XXX. + /// + Adobe = 7 + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/Postscript.cs b/SharpFont/Source/SharpFontShared/TrueType/Postscript.cs new file mode 100644 index 000000000..da95afe4d --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/Postscript.cs @@ -0,0 +1,179 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.TrueType.Internal; + +namespace SharpFont.TrueType +{ + /// + /// A structure used to model a TrueType PostScript table. All fields comply to the TrueType specification. This + /// structure does not reference the PostScript glyph names, which can be nevertheless accessed with the ‘ttpost’ + /// module. + /// + public class Postscript + { + #region Fields + + private IntPtr reference; + private PostscriptRec rec; + + #endregion + + #region Constructors + + internal Postscript(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the version of the table information. + /// + public int FormatType + { + get + { + return (int)rec.FormatType; + } + } + + /// + /// Gets the angle of italics, in degrees, counter-clockwise from vertical. + /// + public int ItalicAngle + { + get + { + return (int)rec.italicAngle; + } + } + + /// + /// Gets the recommended position of the underline. + /// + public short UnderlinePosition + { + get + { + return rec.underlinePosition; + } + } + + /// + /// Gets the recommended thickness of the underline. + /// + public short UnderlineThickness + { + get + { + return rec.underlineThickness; + } + } + + /// + /// + /// + [CLSCompliant(false)] + public uint IsFixedPitch + { + get + { + return (uint)rec.isFixedPitch; + } + } + + /// + /// Gets the minimum amount of memory used by the font when an OpenType font is loaded. + /// + [CLSCompliant(false)] + public uint MinimumMemoryType42 + { + get + { + return (uint)rec.minMemType42; + } + } + + /// + /// Gets the maximum amount of memory used by the font when an OpenType font is loaded. + /// + [CLSCompliant(false)] + public uint MaximumMemoryType42 + { + get + { + return (uint)rec.maxMemType42; + } + } + + /// + /// Gets the minimum amount of memory used by the font when an OpenType font is loaded as + /// a Type 1 font. + /// + [CLSCompliant(false)] + public uint MinimumMemoryType1 + { + get + { + return (uint)rec.minMemType1; + } + } + + /// + /// Gets the maximum amount of memory used by the font when an OpenType font is loaded as + /// a Type 1 font. + /// + [CLSCompliant(false)] + public uint MaximumMemoryType1 + { + get + { + return (uint)rec.maxMemType1; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/SfntName.cs b/SharpFont/Source/SharpFontShared/TrueType/SfntName.cs new file mode 100644 index 000000000..1f4b10c14 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/SfntName.cs @@ -0,0 +1,152 @@ +#region MIT License +/*Copyright (c) 2012-2013, 2016 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.TrueType.Internal; + +namespace SharpFont.TrueType +{ + /// + /// A structure used to model an SFNT ‘name’ table entry. + /// + /// + /// Possible values for ‘platform_id’, ‘encoding_id’, ‘language_id’, and ‘name_id’ are given in the file + /// ‘ttnameid.h’. For details please refer to the TrueType or OpenType specification. + /// + /// + /// + /// + /// + public class SfntName + { + #region Fields + + private SfntNameRec rec; + + #endregion + + #region Constructors + + internal SfntName(SfntNameRec rec) + { + this.rec = rec; + } + + #endregion + + #region Properties + + /// + /// Gets the platform ID for ‘string’. + /// + [CLSCompliant(false)] + public PlatformId PlatformId + { + get + { + return rec.platform_id; + } + } + + /// + /// Gets the encoding ID for ‘string’. + /// + [CLSCompliant(false)] + public ushort EncodingId + { + get + { + return rec.encoding_id; + } + } + + /// + /// Gets the language ID for ‘string’. + /// + [CLSCompliant(false)] + public ushort LanguageId + { + get + { + return rec.language_id; + } + } + + /// + /// Gets an identifier for ‘string’. + /// + [CLSCompliant(false)] + public ushort NameId + { + get + { + return rec.name_id; + } + } + + /// + /// This property returns interpreted as UTF-16. + /// + public string String + { + get + { + //TODO it may be possible to consolidate all of these properties + //if the strings follow some sane structure. Otherwise, leave + //them or add more overloads for common encodings like UTF-8. + return Marshal.PtrToStringUni(rec.@string, (int)rec.string_len); + } + } + + /// + /// This property returns interpreted as ANSI. + /// + public string StringAnsi + { + get + { + return Marshal.PtrToStringAnsi(rec.@string, (int)rec.string_len); + } + } + + /// + /// Gets the ‘name’ string. Note that its format differs depending on the (platform,encoding) pair. It can be a + /// Pascal String, a UTF-16 one, etc. + /// + /// Generally speaking, the string is not zero-terminated. Please refer to the TrueType specification for + /// details. + /// + public IntPtr StringPtr + { + get + { + return rec.@string; + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/SfntTag.cs b/SharpFont/Source/SharpFontShared/TrueType/SfntTag.cs new file mode 100644 index 000000000..c13a69726 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/SfntTag.cs @@ -0,0 +1,70 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont.TrueType +{ + /// + /// An enumeration used to specify the index of an SFNT table. Used in the API + /// function. + /// + public enum SfntTag + { + /// + /// The 'head' (header) table. + /// + Header = 0, + + /// + /// The 'maxp' (maximum profile) table. + /// + MaxProfile = 1, + + /// + /// The 'os/2' (OS/2 and Windows) table. + /// + OS2 = 2, + + /// + /// The 'hhea' (horizontal metrics header) table. + /// + HorizontalHeader = 3, + + /// + /// The 'vhea' (vertical metrics header) table. + /// + VertHeader = 4, + + /// + /// The 'post' (PostScript) table. + /// + Postscript = 5, + + /// + /// The 'pclt' (PCL5 data) table. + /// + Pclt = 6 + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueType/VertHeader.cs b/SharpFont/Source/SharpFontShared/TrueType/VertHeader.cs new file mode 100644 index 000000000..238ff98fd --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueType/VertHeader.cs @@ -0,0 +1,273 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; +using System.Runtime.InteropServices; + +using SharpFont.TrueType.Internal; + +namespace SharpFont.TrueType +{ + /// + /// A structure used to model a TrueType vertical header, the ‘vhea’ table, as well as the corresponding vertical + /// metrics table, i.e., the ‘vmtx’ table. + /// + /// + /// IMPORTANT: The and structures should be identical except for + /// the names of their fields which are different. + /// + /// This ensures that a single function in the ‘ttload’ module is able to read both the horizontal and vertical + /// headers. + /// + public class VertHeader + { + #region Fields + + private IntPtr reference; + private VertHeaderRec rec; + + #endregion + + #region Constructors + + internal VertHeader(IntPtr reference) + { + Reference = reference; + } + + #endregion + + #region Properties + + /// + /// Gets the table version. + /// + public int Version + { + get + { + return (int)rec.Version; + } + } + + /// + /// Gets the font's ascender, i.e., the distance from the baseline to the top-most of all glyph points found in + /// the font. + /// + /// This value is invalid in many fonts, as it is usually set by the font designer, and often reflects only a + /// portion of the glyphs found in the font (maybe ASCII). + /// + /// You should use the ‘sTypoAscender’ field of the OS/2 table instead if you want the correct one. + /// + public short Ascender + { + get + { + return rec.Ascender; + } + } + + /// + /// Gets the font's descender, i.e., the distance from the baseline to the bottom-most of all glyph points + /// found in the font. It is negative. + /// + /// This value is invalid in many fonts, as it is usually set by the font designer, and often reflects only a + /// portion of the glyphs found in the font (maybe ASCII). + /// + /// You should use the ‘sTypoDescender’ field of the OS/2 table instead if you want the correct one. + /// + public short Descender + { + get + { + return rec.Descender; + } + } + + /// + /// Gets the font's line gap, i.e., the distance to add to the ascender and descender to get the BTB, i.e., the + /// baseline-to-baseline distance for the font. + /// + public short LineGap + { + get + { + return rec.Line_Gap; + } + } + + /// + /// Gets the maximum of all advance heights found in the font. It can be used to compute the maximum height of + /// an arbitrary string of text. + /// + [CLSCompliant(false)] + public ushort AdvanceHeightMax + { + get + { + return rec.advance_Height_Max; + } + } + + /// + /// Gets the minimum top side bearing of all glyphs within the font. + /// + public short MinimumTopSideBearing + { + get + { + return rec.min_Top_Side_Bearing; + } + } + + /// + /// Gets the minimum bottom side bearing of all glyphs within the font. + /// + public short MinimumBottomSideBearing + { + get + { + return rec.min_Bottom_Side_Bearing; + } + } + + /// + /// Gets the maximum vertical extent (i.e., the ‘height’ of a glyph's bounding box) for all glyphs in the font. + /// + public short MaximumExtentY + { + get + { + return rec.yMax_Extent; + } + } + + /// + /// Gets the rise coefficient of the cursor's slope of the cursor (slope=rise/run). + /// + public short CaretSlopeRise + { + get + { + return rec.caret_Slope_Rise; + } + } + + /// + /// Gets the run coefficient of the cursor's slope. + /// + public short CaretSlopeRun + { + get + { + return rec.caret_Slope_Run; + } + } + + /// + /// Gets the amount of space needed to offset the caret for best appearance. Applies to slanted fonts. + /// For non-slanted fonts, set this to 0. + /// + public short CaretOffset + { + get + { + return rec.caret_Offset; + } + } + + /// + /// Gets the 8 reserved bytes. + /// + public short[] Reserved + { + get + { + return rec.Reserved; + } + } + + /// + /// Gets 0, always. + /// + public short MetricDataFormat + { + get + { + return rec.metric_Data_Format; + } + } + + /// + /// Gets the number of VMetrics entries in the ‘vmtx’ table -- this value can be smaller than the total number + /// of glyphs in the font. + /// + [CLSCompliant(false)] + public ushort VMetricsCount + { + get + { + return rec.number_Of_VMetrics; + } + } + + /// + /// Gets a pointer into the ‘vmtx’ table. + /// + public IntPtr LongMetrics + { + get + { + return rec.long_metrics; + } + } + + /// + /// Gets a pointer into the ‘vmtx’ table. + /// + public IntPtr ShortMetrics + { + get + { + return rec.short_metrics; + } + } + + internal IntPtr Reference + { + get + { + return reference; + } + + set + { + reference = value; + rec = PInvokeHelper.PtrToStructure(reference); + } + } + + #endregion + } +} diff --git a/SharpFont/Source/SharpFontShared/TrueTypeValidationFlags.cs b/SharpFont/Source/SharpFontShared/TrueTypeValidationFlags.cs new file mode 100644 index 000000000..6a74ea2b8 --- /dev/null +++ b/SharpFont/Source/SharpFontShared/TrueTypeValidationFlags.cs @@ -0,0 +1,70 @@ +#region MIT License +/*Copyright (c) 2012-2013 Robert Rouhani + +SharpFont based on Tao.FreeType, Copyright (c) 2003-2007 Tao Framework Team + +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.*/ +#endregion + +using System; + +namespace SharpFont +{ + /// + /// A list of bit-field constants used with to indicate which TrueTypeGX/AAT + /// Type tables should be validated. + /// + [Flags] + [CLSCompliant(false)] + public enum TrueTypeValidationFlags : uint + { + /// Validate ‘feat’ table. + Feat = 0x4000 << 0, + + /// Validate ‘mort’ table. + Mort = 0x4000 << 1, + + /// Validate ‘morx’ table. + Morx = 0x4000 << 2, + + /// Validate ‘bsln’ table. + Bsln = 0x4000 << 3, + + /// Validate ‘just’ table. + Just = 0x4000 << 4, + + /// Validate ‘kern’ table. + Kern = 0x4000 << 5, + + /// Validate ‘opbd’ table. + Opbd = 0x4000 << 6, + + /// Validate ‘trak’ table. + Trak = 0x4000 << 7, + + /// Validate ‘prop’ table. + Prop = 0x4000 << 8, + + /// Validate ‘lcar’ table. + Lcar = 0x4000 << 9, + + /// Validate all TrueTypeGX tables. + All = Feat | Mort | Morx | Bsln | Just | Kern | Opbd | Trak | Prop | Lcar + } +} diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index c6c62a760..2f49a034a 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -110,6 +110,7 @@ + @@ -1042,6 +1043,9 @@ PreserveNewest Designer + + PreserveNewest + PreserveNewest @@ -1217,6 +1221,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -1226,6 +1233,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -1676,6 +1689,10 @@ {49ba1c69-6104-41ac-a5d8-b54fa9f696e8} Lidgren.Network + + {c293db32-fa42-486d-b128-5a12522fae4e} + SharpFont + npy2H)vULjbrwUoT<$C#_&n%sa?W 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 O2iYb1YeCKTiu?tAv~H0A literal 0 HcmV?d00001 diff --git a/Subsurface/Source/Characters/AI/EnemyAIController.cs b/Subsurface/Source/Characters/AI/EnemyAIController.cs index 21ad55bf9..73b0bee77 100644 --- a/Subsurface/Source/Characters/AI/EnemyAIController.cs +++ b/Subsurface/Source/Characters/AI/EnemyAIController.cs @@ -524,7 +524,7 @@ namespace Barotrauma GUI.DrawRectangle(spriteBatch, ConvertUnits.ToDisplayUnits(new Vector2(wallAttackPos.X, -wallAttackPos.Y)) - new Vector2(10.0f, 10.0f), new Vector2(20.0f, 20.0f), Color.Red, false); } - spriteBatch.DrawString(GUI.Font, targetValue.ToString(), pos - Vector2.UnitY*20.0f, Color.Red); + GUI.Font.DrawString(spriteBatch, targetValue.ToString(), pos - Vector2.UnitY*20.0f, Color.Red); } if (selectedAiTarget != null) @@ -534,10 +534,10 @@ namespace Barotrauma new Vector2(selectedAiTarget.WorldPosition.X, -selectedAiTarget.WorldPosition.Y), Color.Red); } - spriteBatch.DrawString(GUI.Font, targetValue.ToString(), pos - Vector2.UnitY * 80.0f, Color.Red); + GUI.Font.DrawString(spriteBatch, targetValue.ToString(), pos - Vector2.UnitY * 80.0f, Color.Red); - spriteBatch.DrawString(GUI.Font, "updatetargets: "+updateTargetsTimer, pos - Vector2.UnitY * 100.0f, Color.Red); - spriteBatch.DrawString(GUI.Font, "cooldown: " + coolDownTimer, pos - Vector2.UnitY * 120.0f, Color.Red); + GUI.Font.DrawString(spriteBatch, "updatetargets: "+updateTargetsTimer, pos - Vector2.UnitY * 100.0f, Color.Red); + GUI.Font.DrawString(spriteBatch, "cooldown: " + coolDownTimer, pos - Vector2.UnitY * 120.0f, Color.Red); IndoorsSteeringManager pathSteering = steeringManager as IndoorsSteeringManager; @@ -556,7 +556,7 @@ namespace Barotrauma new Vector2(pathSteering.CurrentPath.Nodes[i - 1].DrawPosition.X, -pathSteering.CurrentPath.Nodes[i - 1].DrawPosition.Y), Color.LightGreen); - spriteBatch.DrawString(GUI.SmallFont, + GUI.SmallFont.DrawString(spriteBatch, pathSteering.CurrentPath.Nodes[i].ID.ToString(), new Vector2(pathSteering.CurrentPath.Nodes[i].DrawPosition.X, -pathSteering.CurrentPath.Nodes[i].DrawPosition.Y - 10), Color.LightGreen); diff --git a/Subsurface/Source/Characters/AI/HumanAIController.cs b/Subsurface/Source/Characters/AI/HumanAIController.cs index fe25a7bb6..ed63eb9eb 100644 --- a/Subsurface/Source/Characters/AI/HumanAIController.cs +++ b/Subsurface/Source/Characters/AI/HumanAIController.cs @@ -186,7 +186,7 @@ namespace Barotrauma new Vector2(pathSteering.CurrentPath.Nodes[i - 1].DrawPosition.X, -pathSteering.CurrentPath.Nodes[i - 1].DrawPosition.Y), Color.LightGreen); - spriteBatch.DrawString(GUI.SmallFont, + GUI.SmallFont.DrawString(spriteBatch, pathSteering.CurrentPath.Nodes[i].ID.ToString(), new Vector2(pathSteering.CurrentPath.Nodes[i].DrawPosition.X, -pathSteering.CurrentPath.Nodes[i].DrawPosition.Y - 10), Color.LightGreen); diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 47de2f7bb..f00df91bd 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -1387,12 +1387,12 @@ namespace Barotrauma { nameColor = Color.Red; } - spriteBatch.DrawString(GUI.Font, Info.Name, namePos + new Vector2(1.0f/cam.Zoom, 1.0f / cam.Zoom), Color.Black, 0.0f,Vector2.Zero, 1.0f / cam.Zoom,SpriteEffects.None,0.001f); - spriteBatch.DrawString(GUI.Font, Info.Name, namePos, nameColor, 0.0f, Vector2.Zero, 1.0f/cam.Zoom, SpriteEffects.None, 0.0f); + GUI.Font.DrawString(spriteBatch, Info.Name, namePos + new Vector2(1.0f/cam.Zoom, 1.0f / cam.Zoom), Color.Black, 0.0f,Vector2.Zero, 1.0f / cam.Zoom,SpriteEffects.None,0.001f); + GUI.Font.DrawString(spriteBatch, Info.Name, namePos, nameColor, 0.0f, Vector2.Zero, 1.0f/cam.Zoom, SpriteEffects.None, 0.0f); if (GameMain.DebugDraw) { - spriteBatch.DrawString(GUI.Font, ID.ToString(), namePos - new Vector2(0.0f, 20.0f), Color.White); + GUI.Font.DrawString(spriteBatch, ID.ToString(), namePos - new Vector2(0.0f, 20.0f), Color.White); } } diff --git a/Subsurface/Source/Characters/CharacterInfo.cs b/Subsurface/Source/Characters/CharacterInfo.cs index 4eada1df1..b29e93b75 100644 --- a/Subsurface/Source/Characters/CharacterInfo.cs +++ b/Subsurface/Source/Characters/CharacterInfo.cs @@ -223,7 +223,7 @@ namespace Barotrauma { new GUIImage(new Rectangle(0,0,30,30), HeadSprite, Alignment.TopLeft, frame); - SpriteFont font = frame.Rect.Width<280 ? GUI.SmallFont : GUI.Font; + ScalableFont font = frame.Rect.Width<280 ? GUI.SmallFont : GUI.Font; int x = 0, y = 0; new GUITextBlock(new Rectangle(x+60, y, 200, 20), Name, GUI.Style, frame, font); diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index ba9a80569..de8316b29 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -54,14 +54,14 @@ namespace Barotrauma { int x = 20, y = 20; int width = 800, height = 500; - + frame = new GUIFrame(new Rectangle(x, y, width, height), new Color(0.4f, 0.4f, 0.4f, 0.5f)); frame.Color = Color.White * 0.4f; frame.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f); listBox = new GUIListBox(new Rectangle(0, 0, 0, frame.Rect.Height - 40), Color.Black, GUI.Style, frame); listBox.Color = Color.Black * 0.7f; - + textBox = new GUITextBox(new Rectangle(0,0,0,20), Color.Black, Color.White, Alignment.BottomLeft, Alignment.Left, GUI.Style, frame); textBox.Color = Color.Black * 0.7f; diff --git a/Subsurface/Source/Fonts/ScalableFont.cs b/Subsurface/Source/Fonts/ScalableFont.cs new file mode 100644 index 000000000..526394ec9 --- /dev/null +++ b/Subsurface/Source/Fonts/ScalableFont.cs @@ -0,0 +1,287 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SharpFont; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace Barotrauma +{ + public class ScalableFont + { + private static List FontList = new List(); + private static Library Lib = null; + + private string filename; + private Face face; + private uint size; + private int baseHeight; + //private int lineHeight; + private Dictionary texCoords; + private List textures; + private GraphicsDevice graphicsDevice; + + public uint Size + { + get + { + return size; + } + set + { + size = value; + if (graphicsDevice!=null) RenderAtlas(graphicsDevice, charRanges, texDims, baseChar); + } + } + + private uint[] charRanges; + private int texDims; + private uint baseChar; + + private struct GlyphData + { + public int texIndex; + public Vector2 drawOffset; + public float advance; + public Rectangle texCoords; + } + + public ScalableFont(string filename, uint size, GraphicsDevice gd=null) + { + if (Lib == null) Lib = new Library(); + this.filename = filename; + this.face = null; + foreach (ScalableFont font in FontList) + { + if (font.filename == filename) + { + this.face = font.face; + break; + } + } + if (this.face == null) + { + this.face = new Face(Lib, filename); + } + this.size = size; + + this.textures = new List(); + + this.texCoords = new Dictionary(); + + if (gd != null) RenderAtlas(gd); + + FontList.Add(this); + } + + /// + /// Renders the font into at least one texture atlas, which is simply a collection of all glyphs in the ranges defined by charRanges. + /// Don't call this too often or with very large sizes. + /// + /// Graphics device, required to create textures. + /// Character ranges between each even element with their corresponding odd element. Default is 0x20 to 0xFFFF. + /// Texture dimensions. Default is 512x512. + /// Base character used to shift all other characters downwards when rendering. Defaults to T. + public void RenderAtlas(GraphicsDevice gd, uint[] charRanges = null, int texDims = 512, uint baseChar = 0x54) + { + if (charRanges == null) + { + charRanges = new uint[] { 0x20, 0xFFFF }; + } + this.charRanges = charRanges; + this.texDims = texDims; + this.baseChar = baseChar; + + face.SetPixelSizes(0, size); + textures.ForEach(t => t.Dispose()); + textures.Clear(); + texCoords.Clear(); + + uint[] pixelBuffer = new uint[texDims * texDims]; + for (int i = 0; i < texDims * texDims; i++) + { + pixelBuffer[i] = 0; + } + + textures.Add(new Texture2D(gd, texDims, texDims, false, SurfaceFormat.Color)); + int texIndex = 0; + + Vector2 currentCoords = Vector2.Zero; + int nextY = 0; + + face.LoadGlyph(face.GetCharIndex(baseChar), LoadFlags.Default, LoadTarget.Normal); + baseHeight = face.Glyph.Metrics.Height.ToInt32(); + //lineHeight = baseHeight; + for (int i = 0; i < charRanges.Count(); i += 2) + { + uint start = charRanges[i]; + uint end = charRanges[i + 1]; + for (uint j = start; j <= end; j++) + { + uint glyphIndex = face.GetCharIndex(j); + if (glyphIndex == 0) continue; + face.LoadGlyph(glyphIndex, LoadFlags.Default, LoadTarget.Normal); + if (face.Glyph.Metrics.Width == 0 || face.Glyph.Metrics.Height == 0) + { + if (face.Glyph.Metrics.HorizontalAdvance > 0) + { + //glyph is empty, but char still applies advance + GlyphData blankData = new GlyphData(); + blankData.advance = (float)face.Glyph.Metrics.HorizontalAdvance; + blankData.texIndex = -1; //indicates no texture because the glyph is empty + texCoords.Add(j, blankData); + } + continue; + } + //stacktrace doesn't really work that well when RenderGlyph throws an exception + face.Glyph.RenderGlyph(RenderMode.Normal); + byte[] bitmap = face.Glyph.Bitmap.BufferData; + int glyphWidth = face.Glyph.Bitmap.Width; + int glyphHeight = bitmap.Count() / glyphWidth; + + //if (glyphHeight>lineHeight) lineHeight=glyphHeight; + + if (glyphWidth > texDims - 1 || glyphHeight > texDims - 1) + { + throw new Exception(filename + ", " + size.ToString() + ", "+ (char)j + "; Glyph dimensions exceed texture atlas dimensions"); + } + + nextY = Math.Max(nextY, glyphHeight + 2); + + if (currentCoords.X + glyphWidth + 2 > texDims - 1) + { + currentCoords.X = 0; + currentCoords.Y += nextY; + nextY = 0; + } + if (currentCoords.Y + glyphHeight + 2 > texDims - 1) + { + currentCoords.X = 0; + currentCoords.Y = 0; + textures[texIndex].SetData(pixelBuffer); + textures.Add(new Texture2D(gd, texDims, texDims, false, SurfaceFormat.Color)); + texIndex++; + for (int k = 0; k < texDims * texDims; k++) + { + pixelBuffer[k] = 0; + } + } + + GlyphData newData = new GlyphData(); + newData.advance = (float)face.Glyph.Metrics.HorizontalAdvance; + newData.texIndex = texIndex; + newData.texCoords = new Rectangle((int)currentCoords.X, (int)currentCoords.Y, glyphWidth, glyphHeight); + newData.drawOffset = new Vector2(face.Glyph.BitmapLeft, baseHeight*14/10 - face.Glyph.BitmapTop); + texCoords.Add(j, newData); + + for (int y = 0; y < glyphHeight; y++) + { + for (int x = 0; x < glyphWidth; x++) + { + byte byteColor = bitmap[x + y * glyphWidth]; + pixelBuffer[((int)currentCoords.X + x) + ((int)currentCoords.Y + y) * texDims] = (uint)(byteColor << 24 | byteColor << 16 | byteColor << 8 | byteColor); + } + } + + currentCoords.X += glyphWidth + 2; + } + textures[texIndex].SetData(pixelBuffer); + } + + graphicsDevice = gd; + } + + public void DrawString(SpriteBatch sb, string text, Vector2 position, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects se, float layerDepth) + { + if (textures.Count == 0) return; + + int lineNum = 0; + Vector2 currentPos = position; + Vector2 advanceUnit = new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation)); + for (int i = 0; i < text.Length; i++) + { + if (text[i]=='\n') + { + lineNum++; + currentPos = position; + currentPos.X += baseHeight * 18 / 10 * lineNum * advanceUnit.Y; + currentPos.Y += baseHeight * 18 / 10 * lineNum * advanceUnit.X; + continue; + } + uint charIndex = text[i]; + GlyphData gd; + if (texCoords.TryGetValue(charIndex, out gd)) + { + if (gd.texIndex >= 0) + { + Texture2D tex = textures[gd.texIndex]; + Vector2 drawOffset; + drawOffset.X = gd.drawOffset.X * advanceUnit.X - gd.drawOffset.Y * advanceUnit.Y; + drawOffset.Y = gd.drawOffset.X * advanceUnit.Y + gd.drawOffset.Y * advanceUnit.X; + + sb.Draw(tex, currentPos + drawOffset, null, gd.texCoords, origin, rotation, scale, color, se, layerDepth); + } + currentPos += gd.advance * advanceUnit * scale.X; + } + } + } + + public void DrawString(SpriteBatch sb, string text, Vector2 position, Color color, float rotation, Vector2 origin, float scale, SpriteEffects se, float layerDepth) + { + DrawString(sb, text, position, color, rotation, origin, new Vector2(scale), se, layerDepth); + } + + public void DrawString(SpriteBatch sb, string text, Vector2 position, Color color) + { + if (textures.Count == 0) return; + + Vector2 currentPos = position; + for (int i = 0; i < text.Length; i++) + { + if (text[i] == '\n') + { + currentPos.X = position.X; + currentPos.Y += baseHeight * 18 / 10; + continue; + } + uint charIndex = text[i]; + GlyphData gd; + if (texCoords.TryGetValue(charIndex, out gd)) + { + if (gd.texIndex >= 0) + { + Texture2D tex = textures[gd.texIndex]; + sb.Draw(tex, currentPos + gd.drawOffset, gd.texCoords, color); + } + currentPos.X += gd.advance; + } + } + } + + public Vector2 MeasureString(string text) + { + float currentLineX = 0.0f; + Vector2 retVal = Vector2.Zero; + retVal.Y = baseHeight*18/10; + for (int i = 0; i < text.Length; i++) + { + if (text[i] == '\n') + { + currentLineX = 0.0f; + retVal.Y += baseHeight*18/10; + continue; + } + uint charIndex = text[i]; + GlyphData gd; + if (texCoords.TryGetValue(charIndex, out gd)) + { + currentLineX += gd.advance; + } + retVal.X = Math.Max(retVal.X,currentLineX); + } + return retVal; + } + } +} diff --git a/Subsurface/Source/GUI/GUI.cs b/Subsurface/Source/GUI/GUI.cs index 862994141..4e325fa86 100644 --- a/Subsurface/Source/GUI/GUI.cs +++ b/Subsurface/Source/GUI/GUI.cs @@ -31,11 +31,22 @@ namespace Barotrauma public static GUIStyle Style; private static Texture2D t; - public static SpriteFont Font, SmallFont, LargeFont; + public static ScalableFont Font, SmallFont, LargeFont; private static Sprite cursor; private static GraphicsDevice graphicsDevice; + public static GraphicsDevice GraphicsDevice + { + get + { + return graphicsDevice; + } + set + { + graphicsDevice = value; + } + } private static List messages = new List(); @@ -68,9 +79,9 @@ namespace Barotrauma public static void Init(ContentManager content) { - Font = ToolBox.TryLoadFont("SpriteFont1", content); - SmallFont = ToolBox.TryLoadFont("SmallFont", content); - LargeFont = ToolBox.TryLoadFont("LargeFont", content); + Font = new ScalableFont("Content/Exo2-Medium.otf", 14, graphicsDevice); + SmallFont = new ScalableFont("Content/Exo2-Light.otf", 12, graphicsDevice); + LargeFont = new ScalableFont("Content/CODE Bold.otf", 22, graphicsDevice); cursor = new Sprite("Content/UI/cursor.png", Vector2.Zero); @@ -87,10 +98,8 @@ namespace Barotrauma get { return settingsMenuOpen; } } - public static void LoadContent(GraphicsDevice graphics, bool loadSounds = true) + public static void LoadContent(bool loadSounds = true) { - graphicsDevice = graphics; - if (loadSounds) { sounds = new Sound[Enum.GetValues(typeof(GUISoundType)).Length]; @@ -232,7 +241,7 @@ namespace Barotrauma depth); } - public static void DrawString(SpriteBatch sb, Vector2 pos, string text, Color color, Color? backgroundColor=null, int backgroundPadding=0, SpriteFont font = null) + public static void DrawString(SpriteBatch sb, Vector2 pos, string text, Color color, Color? backgroundColor=null, int backgroundPadding=0, ScalableFont font = null) { if (font == null) font = Font; @@ -242,7 +251,7 @@ namespace Barotrauma DrawRectangle(sb, pos - Vector2.One * backgroundPadding, textSize + Vector2.One * 2.0f * backgroundPadding, (Color)backgroundColor, true); } - sb.DrawString(font, text, pos, color); + font.DrawString(sb, text, pos, color); } public static void DrawRectangle(SpriteBatch sb, Vector2 start, Vector2 size, Color clr, bool isFilled = false, float depth = 0.0f, int thickness = 1) @@ -405,7 +414,7 @@ namespace Barotrauma origin = Vector2.Zero; } - sb.DrawString(Font, text, new Vector2(rect.Center.X, rect.Center.Y) , Color.White, 0.0f, origin, 1.0f, SpriteEffects.None, 0.0f); + Font.DrawString(sb, text, new Vector2(rect.Center.X, rect.Center.Y) , Color.White, 0.0f, origin, 1.0f, SpriteEffects.None, 0.0f); return clicked; } @@ -591,12 +600,12 @@ namespace Barotrauma msg.Pos = MathUtils.SmoothStep(msg.Pos, currPos, deltaTime*20.0f); - spriteBatch.DrawString(Font, msg.Text, + Font.DrawString(spriteBatch, msg.Text, new Vector2((int)msg.Pos.X - 1, (int)msg.Pos.Y - 1), Color.Black * alpha*0.5f, 0.0f, new Vector2((int)(0.5f * msg.Size.X), (int)(0.5f * msg.Size.Y)), 1.0f, SpriteEffects.None, 0.0f); - spriteBatch.DrawString(Font, msg.Text, + Font.DrawString(spriteBatch, msg.Text, new Vector2((int)msg.Pos.X, (int)msg.Pos.Y), msg.Color * alpha, 0.0f, new Vector2((int)(0.5f * msg.Size.X), (int)(0.5f * msg.Size.Y)), 1.0f, SpriteEffects.None, 0.0f); diff --git a/Subsurface/Source/GUI/GUIButton.cs b/Subsurface/Source/GUI/GUIButton.cs index c96f149bd..d55676f2a 100644 --- a/Subsurface/Source/GUI/GUIButton.cs +++ b/Subsurface/Source/GUI/GUIButton.cs @@ -84,7 +84,7 @@ namespace Barotrauma set { textBlock.TextColor = value; } } - public override SpriteFont Font + public override ScalableFont Font { get { diff --git a/Subsurface/Source/GUI/GUIComponent.cs b/Subsurface/Source/GUI/GUIComponent.cs index 8af57bd6c..94e4b3d54 100644 --- a/Subsurface/Source/GUI/GUIComponent.cs +++ b/Subsurface/Source/GUI/GUIComponent.cs @@ -99,7 +99,7 @@ namespace Barotrauma protected Color flashColor; protected float flashTimer; - public virtual SpriteFont Font + public virtual ScalableFont Font { get; set; diff --git a/Subsurface/Source/GUI/GUITextBlock.cs b/Subsurface/Source/GUI/GUITextBlock.cs index 5e3ef7697..493461e04 100644 --- a/Subsurface/Source/GUI/GUITextBlock.cs +++ b/Subsurface/Source/GUI/GUITextBlock.cs @@ -14,6 +14,7 @@ namespace Barotrauma protected Vector2 origin; protected Vector2 caretPos; + protected int caretAt; protected Color textColor; @@ -103,8 +104,8 @@ namespace Barotrauma { get { return caretPos; } } - - public GUITextBlock(Rectangle rect, string text, GUIStyle style, GUIComponent parent, SpriteFont font) + + public GUITextBlock(Rectangle rect, string text, GUIStyle style, GUIComponent parent, ScalableFont font) : this(rect, text, style, Alignment.TopLeft, Alignment.TopLeft, parent, false, font) { } @@ -142,7 +143,7 @@ namespace Barotrauma if (textColor != null) this.textColor = (Color)textColor; } - public GUITextBlock(Rectangle rect, string text, GUIStyle style, Alignment alignment = Alignment.TopLeft, Alignment textAlignment = Alignment.TopLeft, GUIComponent parent = null, bool wrap = false, SpriteFont font = null) + public GUITextBlock(Rectangle rect, string text, GUIStyle style, Alignment alignment = Alignment.TopLeft, Alignment textAlignment = Alignment.TopLeft, GUIComponent parent = null, bool wrap = false, ScalableFont font = null) :base (style) { this.Font = font == null ? GUI.Font : font; @@ -174,7 +175,7 @@ namespace Barotrauma wrappedText = text; - Vector2 size = MeasureText(text); + Vector2 size = MeasureText(text); if (Wrap && rect.Width>0) { @@ -184,7 +185,7 @@ namespace Barotrauma size = newSize; } - + if (LimitText && text.Length>1 && size.Y > rect.Height) { string[] lines = text.Split('\n'); @@ -205,7 +206,7 @@ namespace Barotrauma if (textAlignment.HasFlag(Alignment.Bottom)) origin.Y -= (rect.Height / 2.0f - padding.W) - size.Y / 2; - + origin.X = (int)origin.X; origin.Y = (int)origin.Y; @@ -263,7 +264,7 @@ namespace Barotrauma if (!string.IsNullOrEmpty(text)) { - spriteBatch.DrawString(Font, + Font.DrawString(spriteBatch, Wrap ? wrappedText : text, new Vector2(rect.X, rect.Y) + textPos + offset, textColor * (textColor.A / 255.0f), diff --git a/Subsurface/Source/GUI/GUITextBox.cs b/Subsurface/Source/GUI/GUITextBox.cs index 30bdd6c6a..aa0fe900f 100644 --- a/Subsurface/Source/GUI/GUITextBox.cs +++ b/Subsurface/Source/GUI/GUITextBox.cs @@ -15,7 +15,7 @@ namespace Barotrauma bool caretVisible; float caretTimer; - + GUITextBlock textBlock; public delegate bool OnEnterHandler(GUITextBox textBox, string text); @@ -65,7 +65,7 @@ namespace Barotrauma } } - public override SpriteFont Font + public override ScalableFont Font { set { @@ -131,7 +131,7 @@ namespace Barotrauma if (textBlock.Text != "") { - //if you attempt to display a Character that is not in your font + /*//if you attempt to display a Character that is not in your font //you will get an exception, so we filter the characters //remove the filtering if you're using a default Character in your spritefont String filtered = ""; @@ -140,7 +140,7 @@ namespace Barotrauma if (Font.Characters.Contains(c)) filtered += c; } - textBlock.Text = filtered; + textBlock.Text = filtered;*/ if (!Wrap && Font.MeasureString(textBlock.Text).X > rect.Width) { @@ -182,6 +182,8 @@ namespace Barotrauma textBlock = new GUITextBlock(new Rectangle(0,0,0,0), "", color, textColor, textAlignment, style, this); + Font = GUI.Font; + if (style != null) style.Apply(textBlock, this); textBlock.Padding = new Vector4(3.0f, 0.0f, 3.0f, 0.0f); diff --git a/Subsurface/Source/GUI/GUITickBox.cs b/Subsurface/Source/GUI/GUITickBox.cs index 8ed501baa..c54a620dc 100644 --- a/Subsurface/Source/GUI/GUITickBox.cs +++ b/Subsurface/Source/GUI/GUITickBox.cs @@ -65,7 +65,7 @@ namespace Barotrauma { } - public GUITickBox(Rectangle rect, string label, Alignment alignment, SpriteFont font, GUIComponent parent) + public GUITickBox(Rectangle rect, string label, Alignment alignment, ScalableFont font, GUIComponent parent) : base(null) { if (parent != null) diff --git a/Subsurface/Source/GUI/LoadingScreen.cs b/Subsurface/Source/GUI/LoadingScreen.cs index bbf194600..4d0a8863b 100644 --- a/Subsurface/Source/GUI/LoadingScreen.cs +++ b/Subsurface/Source/GUI/LoadingScreen.cs @@ -167,7 +167,7 @@ namespace Barotrauma if (GUI.LargeFont!=null) { - spriteBatch.DrawString(GUI.LargeFont, loadText, + GUI.LargeFont.DrawString(spriteBatch, loadText, new Vector2(GameMain.GraphicsWidth/2.0f - GUI.LargeFont.MeasureString(loadText).X/2.0f, GameMain.GraphicsHeight*0.8f), Color.White); } diff --git a/Subsurface/Source/GameMain.cs b/Subsurface/Source/GameMain.cs index e8c171971..42b657b14 100644 --- a/Subsurface/Source/GameMain.cs +++ b/Subsurface/Source/GameMain.cs @@ -116,7 +116,7 @@ namespace Barotrauma public GameMain() { Graphics = new GraphicsDeviceManager(this); - + Window.Title = "Barotrauma"; Instance = this; @@ -208,6 +208,7 @@ namespace Barotrauma public IEnumerable Load() { + GUI.GraphicsDevice = GraphicsDevice; GUI.Init(Content); GUIComponent.Init(Window); @@ -221,7 +222,7 @@ namespace Barotrauma TitleScreen.LoadState = 1.0f; yield return CoroutineStatus.Running; - GUI.LoadContent(GraphicsDevice); + GUI.LoadContent(); TitleScreen.LoadState = 2.0f; yield return CoroutineStatus.Running; @@ -380,8 +381,7 @@ namespace Barotrauma if (!paused) Timing.Alpha = Timing.Accumulator / Timing.Step; } - - + /// /// This is called when the game should draw itself. /// @@ -399,7 +399,7 @@ namespace Barotrauma { Screen.Selected.Draw(deltaTime, GraphicsDevice, spriteBatch); } - + if (!DebugDraw) return; if (GUIComponent.MouseOn!=null) { diff --git a/Subsurface/Source/Items/Components/Machines/Engine.cs b/Subsurface/Source/Items/Components/Machines/Engine.cs index 3ecec7d7c..97b5ae165 100644 --- a/Subsurface/Source/Items/Components/Machines/Engine.cs +++ b/Subsurface/Source/Items/Components/Machines/Engine.cs @@ -115,7 +115,7 @@ namespace Barotrauma.Items.Components //GUI.DrawRectangle(spriteBatch, new Rectangle(x, y, width, height), Color.Black, true); - spriteBatch.DrawString(GUI.Font, "Force: " + (int)(targetForce) + " %", new Vector2(GuiFrame.Rect.X + 30, GuiFrame.Rect.Y + 30), Color.White); + GUI.Font.DrawString(spriteBatch, "Force: " + (int)(targetForce) + " %", new Vector2(GuiFrame.Rect.X + 30, GuiFrame.Rect.Y + 30), Color.White); } public override void AddToGUIUpdateList() diff --git a/Subsurface/Source/Items/Components/Machines/Pump.cs b/Subsurface/Source/Items/Components/Machines/Pump.cs index c388ff63a..7c96528a4 100644 --- a/Subsurface/Source/Items/Components/Machines/Pump.cs +++ b/Subsurface/Source/Items/Components/Machines/Pump.cs @@ -158,7 +158,7 @@ namespace Barotrauma.Items.Components GuiFrame.Draw(spriteBatch); - spriteBatch.DrawString(GUI.Font, "Pumping speed: " + (int)flowPercentage + " %", new Vector2(x + 40, y + 85), Color.White); + GUI.Font.DrawString(spriteBatch, "Pumping speed: " + (int)flowPercentage + " %", new Vector2(x + 40, y + 85), Color.White); } diff --git a/Subsurface/Source/Items/Components/Machines/Reactor.cs b/Subsurface/Source/Items/Components/Machines/Reactor.cs index 02849c33a..c7a3fad4a 100644 --- a/Subsurface/Source/Items/Components/Machines/Reactor.cs +++ b/Subsurface/Source/Items/Components/Machines/Reactor.cs @@ -443,9 +443,9 @@ namespace Barotrauma.Items.Components //GUI.DrawRectangle(spriteBatch, new Rectangle(x, y, width, height), Color.Black, true); - spriteBatch.DrawString(GUI.Font, "Output: " + (int)temperature + " kW", + GUI.Font.DrawString(spriteBatch, "Output: " + (int)temperature + " kW", new Vector2(x + 450, y + 30), Color.Red); - spriteBatch.DrawString(GUI.Font, "Grid load: " + (int)load + " kW", + GUI.Font.DrawString(spriteBatch, "Grid load: " + (int)load + " kW", new Vector2(x + 600, y + 30), Color.Yellow); float maxLoad = 0.0f; @@ -460,18 +460,18 @@ namespace Barotrauma.Items.Components DrawGraph(loadGraph, spriteBatch, new Rectangle(x + 30, y + 30, 400, 250), Math.Max(10000.0f, maxLoad), xOffset, Color.Yellow); - spriteBatch.DrawString(GUI.Font, "Shutdown Temperature: " + (int)shutDownTemp, new Vector2(x + 450, y + 80), Color.White); + GUI.Font.DrawString(spriteBatch, "Shutdown Temperature: " + (int)shutDownTemp, new Vector2(x + 450, y + 80), Color.White); - //spriteBatch.DrawString(GUI.Font, "Automatic Temperature Control: " + ((autoTemp) ? "ON" : "OFF"), new Vector2(x + 450, y + 180), Color.White); + //GUI.Font.DrawString(spriteBatch, "Automatic Temperature Control: " + ((autoTemp) ? "ON" : "OFF"), new Vector2(x + 450, y + 180), Color.White); y += 300; - spriteBatch.DrawString(GUI.Font, "Fission rate: " + (int)fissionRate + " %", new Vector2(x + 30, y), Color.White); + GUI.Font.DrawString(spriteBatch, "Fission rate: " + (int)fissionRate + " %", new Vector2(x + 30, y), Color.White); DrawGraph(fissionRateGraph, spriteBatch, new Rectangle(x + 30, y + 30, 200, 100), 100.0f, xOffset, Color.Orange); - spriteBatch.DrawString(GUI.Font, "Cooling rate: " + (int)coolingRate + " %", new Vector2(x + 320, y), Color.White); + GUI.Font.DrawString(spriteBatch, "Cooling rate: " + (int)coolingRate + " %", new Vector2(x + 320, y), Color.White); DrawGraph(coolingRateGraph, spriteBatch, new Rectangle(x + 320, y + 30, 200, 100), 100.0f, xOffset, Color.LightBlue); diff --git a/Subsurface/Source/Items/Components/Power/PowerContainer.cs b/Subsurface/Source/Items/Components/Power/PowerContainer.cs index b5377d5b8..f58edf092 100644 --- a/Subsurface/Source/Items/Components/Power/PowerContainer.cs +++ b/Subsurface/Source/Items/Components/Power/PowerContainer.cs @@ -232,11 +232,11 @@ namespace Barotrauma.Items.Components int y = GuiFrame.Rect.Y; //GUI.DrawRectangle(spriteBatch, new Rectangle(x, y, width, height), Color.Black, true); - spriteBatch.DrawString(GUI.Font, + GUI.Font.DrawString(spriteBatch, "Charge: " + (int)charge + "/" + (int)capacity + " kWm (" + (int)((charge / capacity) * 100.0f) + " %)", new Vector2(x + 30, y + 30), Color.White); - spriteBatch.DrawString(GUI.Font, "Recharge rate: " + (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", new Vector2(x + 30, y + 95), Color.White); + GUI.Font.DrawString(spriteBatch, "Recharge rate: " + (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", new Vector2(x + 30, y + 95), Color.White); } public override void AddToGUIUpdateList() diff --git a/Subsurface/Source/Items/Components/Power/PowerTransfer.cs b/Subsurface/Source/Items/Components/Power/PowerTransfer.cs index 9fa4d9b2c..2542019bc 100644 --- a/Subsurface/Source/Items/Components/Power/PowerTransfer.cs +++ b/Subsurface/Source/Items/Components/Power/PowerTransfer.cs @@ -179,8 +179,8 @@ namespace Barotrauma.Items.Components GuiFrame.Draw(spriteBatch); - spriteBatch.DrawString(GUI.Font, "Power: " + (int)(-currPowerConsumption) + " kW", new Vector2(x + 30, y + 30), Color.White); - spriteBatch.DrawString(GUI.Font, "Load: " + (int)powerLoad + " kW", new Vector2(x + 30, y + 100), Color.White); + GUI.Font.DrawString(spriteBatch, "Power: " + (int)(-currPowerConsumption) + " kW", new Vector2(x + 30, y + 30), Color.White); + GUI.Font.DrawString(spriteBatch, "Load: " + (int)powerLoad + " kW", new Vector2(x + 30, y + 100), Color.White); } public override void AddToGUIUpdateList() diff --git a/Subsurface/Source/Items/Components/Signal/Connection.cs b/Subsurface/Source/Items/Components/Signal/Connection.cs index 6e84a083d..1d4fbab66 100644 --- a/Subsurface/Source/Items/Components/Signal/Connection.cs +++ b/Subsurface/Source/Items/Components/Signal/Connection.cs @@ -316,7 +316,7 @@ namespace Barotrauma.Items.Components private void Draw(SpriteBatch spriteBatch, Item item, Vector2 position, Vector2 labelPos, Vector2 wirePosition, bool mouseIn, Wire equippedWire, float wireInterval) { - //spriteBatch.DrawString(GUI.SmallFont, Name, new Vector2(labelPos.X, labelPos.Y-10), Color.White); + //GUI.SmallFont.DrawString(spriteBatch, Name, new Vector2(labelPos.X, labelPos.Y-10), Color.White); GUI.DrawString(spriteBatch, labelPos, Name, IsPower ? Color.Red : Color.White, Color.Black,0, GUI.SmallFont); GUI.DrawRectangle(spriteBatch, new Rectangle((int)position.X-10, (int)position.Y-10, 20, 20), Color.White); diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index 6ef1e3640..f4532972b 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -361,7 +361,7 @@ namespace Barotrauma pos.Y = (int)pos.Y; GUI.DrawRectangle(spriteBatch, pos, rectSize, Color.Black * 0.8f, true); - spriteBatch.DrawString(GUI.Font, toolTip, + GUI.Font.DrawString(spriteBatch, toolTip, new Vector2((int)(pos.X + rectSize.X * 0.5f), (int)(pos.Y + rectSize.Y * 0.5f)), Color.White, 0.0f, new Vector2((int)(textSize.X * 0.5f), (int)(textSize.Y * 0.5f)), diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index ec2ae613c..ee3a51c69 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -603,9 +603,9 @@ namespace Barotrauma if (GameMain.DebugDraw) { - spriteBatch.DrawString(GUI.SmallFont, "Pressure: " + ((int)pressure - rect.Y).ToString() + + GUI.SmallFont.DrawString(spriteBatch, "Pressure: " + ((int)pressure - rect.Y).ToString() + " - Oxygen: " + ((int)OxygenPercentage), new Vector2(drawRect.X + 5, -drawRect.Y + 5), Color.White); - spriteBatch.DrawString(GUI.SmallFont, volume + " / " + FullVolume, new Vector2(drawRect.X + 5, -drawRect.Y + 20), Color.White); + GUI.SmallFont.DrawString(spriteBatch, volume + " / " + FullVolume, new Vector2(drawRect.X + 5, -drawRect.Y + 20), Color.White); } if ((IsSelected || isHighlighted) && editing) diff --git a/Subsurface/Source/Map/MapEntityPrefab.cs b/Subsurface/Source/Map/MapEntityPrefab.cs index 7f6dacd67..24139401d 100644 --- a/Subsurface/Source/Map/MapEntityPrefab.cs +++ b/Subsurface/Source/Map/MapEntityPrefab.cs @@ -232,7 +232,7 @@ namespace Barotrauma public void DrawListLine(SpriteBatch spriteBatch, Vector2 pos, Color color) { - spriteBatch.DrawString(GUI.Font, name, pos, color); + GUI.Font.DrawString(spriteBatch, name, pos, color); } } diff --git a/Subsurface/Source/Map/WayPoint.cs b/Subsurface/Source/Map/WayPoint.cs index 6575a5ff0..05626dfd8 100644 --- a/Subsurface/Source/Map/WayPoint.cs +++ b/Subsurface/Source/Map/WayPoint.cs @@ -158,7 +158,7 @@ namespace Barotrauma //GUI.DrawRectangle(spriteBatch, new Rectangle(drawRect.X, -drawRect.Y, rect.Width, rect.Height), clr, true); - //spriteBatch.DrawString(GUI.SmallFont, Position.ToString(), new Vector2(Position.X, -Position.Y), Color.White); + //GUI.SmallFont.DrawString(spriteBatch, Position.ToString(), new Vector2(Position.X, -Position.Y), Color.White); foreach (MapEntity e in linkedTo) { @@ -314,7 +314,7 @@ namespace Barotrauma - //spriteBatch.DrawString(GUI.font, "Spawnpoint: " + spawnType.ToString() + " +/-", new Vector2(x, y + 40), Color.Black); + //GUI.Font.DrawString(spriteBatch, "Spawnpoint: " + spawnType.ToString() + " +/-", new Vector2(x, y + 40), Color.Black); y = y + 30; diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index bc2617c79..2cbafde69 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -876,23 +876,23 @@ namespace Barotrauma.Networking int x = GameMain.GraphicsWidth - width, y = (int)(GameMain.GraphicsHeight * 0.3f); GUI.DrawRectangle(spriteBatch, new Rectangle(x, y, width, height), Color.Black * 0.7f, true); - spriteBatch.DrawString(GUI.Font, "Network statistics:", new Vector2(x + 10, y + 10), Color.White); + GUI.Font.DrawString(spriteBatch, "Network statistics:", new Vector2(x + 10, y + 10), Color.White); if (client.ServerConnection != null) { - spriteBatch.DrawString(GUI.Font, "Ping: " + (int)(client.ServerConnection.AverageRoundtripTime * 1000.0f) + " ms", new Vector2(x + 10, y + 25), Color.White); + GUI.Font.DrawString(spriteBatch, "Ping: " + (int)(client.ServerConnection.AverageRoundtripTime * 1000.0f) + " ms", new Vector2(x + 10, y + 25), Color.White); y += 15; - spriteBatch.DrawString(GUI.SmallFont, "Received bytes: " + client.Statistics.ReceivedBytes, new Vector2(x + 10, y + 45), Color.White); - spriteBatch.DrawString(GUI.SmallFont, "Received packets: " + client.Statistics.ReceivedPackets, new Vector2(x + 10, y + 60), Color.White); + GUI.SmallFont.DrawString(spriteBatch, "Received bytes: " + client.Statistics.ReceivedBytes, new Vector2(x + 10, y + 45), Color.White); + GUI.SmallFont.DrawString(spriteBatch, "Received packets: " + client.Statistics.ReceivedPackets, new Vector2(x + 10, y + 60), Color.White); - spriteBatch.DrawString(GUI.SmallFont, "Sent bytes: " + client.Statistics.SentBytes, new Vector2(x + 10, y + 75), Color.White); - spriteBatch.DrawString(GUI.SmallFont, "Sent packets: " + client.Statistics.SentPackets, new Vector2(x + 10, y + 90), Color.White); + GUI.SmallFont.DrawString(spriteBatch, "Sent bytes: " + client.Statistics.SentBytes, new Vector2(x + 10, y + 75), Color.White); + GUI.SmallFont.DrawString(spriteBatch, "Sent packets: " + client.Statistics.SentPackets, new Vector2(x + 10, y + 90), Color.White); } else { - spriteBatch.DrawString(GUI.Font, "Disconnected", new Vector2(x + 10, y + 25), Color.White); + GUI.Font.DrawString(spriteBatch, "Disconnected", new Vector2(x + 10, y + 25), Color.White); } diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 2531e252e..5dd1a1f15 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -1433,14 +1433,14 @@ namespace Barotrauma.Networking GUI.DrawRectangle(spriteBatch, new Rectangle(x, y, width, height), Color.Black * 0.7f, true); - spriteBatch.DrawString(GUI.Font, "Network statistics:", new Vector2(x + 10, y + 10), Color.White); + GUI.Font.DrawString(spriteBatch, "Network statistics:", new Vector2(x + 10, y + 10), Color.White); - spriteBatch.DrawString(GUI.SmallFont, "Connections: "+server.ConnectionsCount, new Vector2(x + 10, y + 30), Color.White); - spriteBatch.DrawString(GUI.SmallFont, "Received bytes: " + MathUtils.GetBytesReadable(server.Statistics.ReceivedBytes), new Vector2(x + 10, y + 45), Color.White); - spriteBatch.DrawString(GUI.SmallFont, "Received packets: " + server.Statistics.ReceivedPackets, new Vector2(x + 10, y + 60), Color.White); + GUI.SmallFont.DrawString(spriteBatch, "Connections: "+server.ConnectionsCount, new Vector2(x + 10, y + 30), Color.White); + GUI.SmallFont.DrawString(spriteBatch, "Received bytes: " + MathUtils.GetBytesReadable(server.Statistics.ReceivedBytes), new Vector2(x + 10, y + 45), Color.White); + GUI.SmallFont.DrawString(spriteBatch, "Received packets: " + server.Statistics.ReceivedPackets, new Vector2(x + 10, y + 60), Color.White); - spriteBatch.DrawString(GUI.SmallFont, "Sent bytes: " + MathUtils.GetBytesReadable(server.Statistics.SentBytes), new Vector2(x + 10, y + 75), Color.White); - spriteBatch.DrawString(GUI.SmallFont, "Sent packets: " + server.Statistics.SentPackets, new Vector2(x + 10, y + 90), Color.White); + GUI.SmallFont.DrawString(spriteBatch, "Sent bytes: " + MathUtils.GetBytesReadable(server.Statistics.SentBytes), new Vector2(x + 10, y + 75), Color.White); + GUI.SmallFont.DrawString(spriteBatch, "Sent packets: " + server.Statistics.SentPackets, new Vector2(x + 10, y + 90), Color.White); int resentMessages = 0; @@ -1460,10 +1460,10 @@ namespace Barotrauma.Networking if (y >= startY && y < startY + height - 120) { - spriteBatch.DrawString(GUI.SmallFont, c.name + " ("+c.Connection.RemoteEndPoint.Address.ToString()+")", new Vector2(x + 10, y), clientColor); - spriteBatch.DrawString(GUI.SmallFont, "Ping: " + (int)(c.Connection.AverageRoundtripTime * 1000.0f) + " ms", new Vector2(x+20, y+10), clientColor); + GUI.SmallFont.DrawString(spriteBatch, c.name + " ("+c.Connection.RemoteEndPoint.Address.ToString()+")", new Vector2(x + 10, y), clientColor); + GUI.SmallFont.DrawString(spriteBatch, "Ping: " + (int)(c.Connection.AverageRoundtripTime * 1000.0f) + " ms", new Vector2(x+20, y+10), clientColor); } - if (y + 25 >= startY && y < startY + height - 130) spriteBatch.DrawString(GUI.SmallFont, "Resent messages: " + c.Connection.Statistics.ResentMessages, new Vector2(x + 20, y + 20), clientColor); + if (y + 25 >= startY && y < startY + height - 130) GUI.SmallFont.DrawString(spriteBatch, "Resent messages: " + c.Connection.Statistics.ResentMessages, new Vector2(x + 20, y + 20), clientColor); resentMessages += (int)c.Connection.Statistics.ResentMessages; diff --git a/Subsurface/Source/Networking/NetStats.cs b/Subsurface/Source/Networking/NetStats.cs index 8ef1a651a..bdc19a3e6 100644 --- a/Subsurface/Source/Networking/NetStats.cs +++ b/Subsurface/Source/Networking/NetStats.cs @@ -71,24 +71,24 @@ namespace Barotrauma.Networking graphs[(int)NetStatType.ResentMessages].Draw(spriteBatch, rect, null, 0.0f, Color.Red); - spriteBatch.DrawString(GUI.SmallFont, + GUI.SmallFont.DrawString(spriteBatch, "Peak received: " + MathUtils.GetBytesReadable((int)graphs[(int)NetStatType.ReceivedBytes].LargestValue()) + "/s " + "Avg received: " + MathUtils.GetBytesReadable((int)graphs[(int)NetStatType.ReceivedBytes].Average()) + "/s", new Vector2(rect.X + 10, rect.Y + 10), Color.Cyan); - spriteBatch.DrawString(GUI.SmallFont, "Peak sent: " + MathUtils.GetBytesReadable((int)graphs[(int)NetStatType.SentBytes].LargestValue()) + "/s " + + GUI.SmallFont.DrawString(spriteBatch, "Peak sent: " + MathUtils.GetBytesReadable((int)graphs[(int)NetStatType.SentBytes].LargestValue()) + "/s " + "Avg sent: " + MathUtils.GetBytesReadable((int)graphs[(int)NetStatType.SentBytes].Average()) + "/s", new Vector2(rect.X + 10, rect.Y + 30), Color.Orange); - spriteBatch.DrawString(GUI.SmallFont, "Peak resent: " + graphs[(int)NetStatType.ResentMessages].LargestValue() + " messages/s", + GUI.SmallFont.DrawString(spriteBatch, "Peak resent: " + graphs[(int)NetStatType.ResentMessages].LargestValue() + " messages/s", new Vector2(rect.X + 10, rect.Y + 50), Color.Red); #if DEBUG int y = 10; foreach (KeyValuePair msgBytesSent in server.messageCount.OrderBy(key => -key.Value)) { - spriteBatch.DrawString(GUI.SmallFont, msgBytesSent.Key + ": " + MathUtils.GetBytesReadable(msgBytesSent.Value), + GUI.SmallFont.DrawString(spriteBatch, msgBytesSent.Key + ": " + MathUtils.GetBytesReadable(msgBytesSent.Value), new Vector2(rect.Right - 200, rect.Y + y), Color.Red); y += 15; diff --git a/Subsurface/Source/Program.cs b/Subsurface/Source/Program.cs index f678a1114..eaf57c560 100644 --- a/Subsurface/Source/Program.cs +++ b/Subsurface/Source/Program.cs @@ -139,11 +139,11 @@ namespace Barotrauma if (GameMain.Server != null) { - sb.AppendLine("Server (" + (GameMain.Server.GameStarted ? "Round had started)" : "Round hand't been started)")); + sb.AppendLine("Server (" + (GameMain.Server.GameStarted ? "Round had started)" : "Round hadn't been started)")); } else if (GameMain.Client != null) { - sb.AppendLine("Client (" + (GameMain.Client.GameStarted ? "Round had started)" : "Round hand't been started)")); + sb.AppendLine("Client (" + (GameMain.Client.GameStarted ? "Round had started)" : "Round hadn't been started)")); } sb.AppendLine("\n"); diff --git a/Subsurface/Source/Screens/LobbyScreen.cs b/Subsurface/Source/Screens/LobbyScreen.cs index 50fb6747f..76ac9323f 100644 --- a/Subsurface/Source/Screens/LobbyScreen.cs +++ b/Subsurface/Source/Screens/LobbyScreen.cs @@ -267,7 +267,7 @@ namespace Barotrauma frame.ToolTip = ep.Description; - SpriteFont font = listBox.Rect.Width < 280 ? GUI.SmallFont : GUI.Font; + ScalableFont font = listBox.Rect.Width < 280 ? GUI.SmallFont : GUI.Font; GUITextBlock textBlock = new GUITextBlock( new Rectangle(50, 0, 0, 25), diff --git a/Subsurface/Source/Screens/MainMenuScreen.cs b/Subsurface/Source/Screens/MainMenuScreen.cs index 293e15cbd..f172d3daa 100644 --- a/Subsurface/Source/Screens/MainMenuScreen.cs +++ b/Subsurface/Source/Screens/MainMenuScreen.cs @@ -511,7 +511,7 @@ namespace Barotrauma GUI.Draw((float)deltaTime, spriteBatch, null); - spriteBatch.DrawString(GUI.Font, "Barotrauma v"+GameMain.Version, new Vector2(10, GameMain.GraphicsHeight-20), Color.White); + GUI.Font.DrawString(spriteBatch, "Barotrauma v"+GameMain.Version, new Vector2(10, GameMain.GraphicsHeight-20), Color.White); spriteBatch.End(); } diff --git a/Subsurface/Source/Screens/ServerListScreen.cs b/Subsurface/Source/Screens/ServerListScreen.cs index 44ccd93d0..69f2f08b4 100644 --- a/Subsurface/Source/Screens/ServerListScreen.cs +++ b/Subsurface/Source/Screens/ServerListScreen.cs @@ -60,7 +60,7 @@ namespace Barotrauma if (n > 0) columnX[n] += columnX[n - 1]; } - SpriteFont font = GUI.SmallFont; // serverList.Rect.Width < 400 ? GUI.SmallFont : GUI.Font; + ScalableFont font = GUI.SmallFont; // serverList.Rect.Width < 400 ? GUI.SmallFont : GUI.Font; new GUITextBlock(new Rectangle(middleX, 30, 0, 30), "Password", GUI.Style, menu).Font = font; diff --git a/Subsurface/Source/Utils/ToolBox.cs b/Subsurface/Source/Utils/ToolBox.cs index decd88e39..eb11099ec 100644 --- a/Subsurface/Source/Utils/ToolBox.cs +++ b/Subsurface/Source/Utils/ToolBox.cs @@ -89,7 +89,7 @@ namespace Barotrauma return doc; } - public static SpriteFont TryLoadFont(string file, Microsoft.Xna.Framework.Content.ContentManager contentManager) + /*public static SpriteFont TryLoadFont(string file, Microsoft.Xna.Framework.Content.ContentManager contentManager) { SpriteFont font = null; try @@ -102,7 +102,7 @@ namespace Barotrauma } return font; - } + }*/ public static object GetAttributeObject(XElement element, string name) { @@ -383,7 +383,7 @@ namespace Barotrauma return str.Substring(0, maxCharacters-3) + "..."; } - public static string LimitString(string str, SpriteFont font, int maxWidth) + public static string LimitString(string str, ScalableFont font, int maxWidth) { if (maxWidth <= 0 || string.IsNullOrWhiteSpace(str)) return ""; @@ -465,7 +465,7 @@ namespace Barotrauma return d[n, m]; } - public static string WrapText(string text, float lineLength, SpriteFont font) + public static string WrapText(string text, float lineLength, ScalableFont font) //TODO: could integrate this into the ScalableFont class directly { if (font.MeasureString(text).X < lineLength) return text; diff --git a/Subsurface/freetype6.dll b/Subsurface/freetype6.dll new file mode 100644 index 0000000000000000000000000000000000000000..3a94b26fee34aab9afab4780019d9aa2c226d75f GIT binary patch literal 452096 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 Date: Tue, 7 Mar 2017 13:56:12 -0300 Subject: [PATCH 40/44] Removed GUITextBlock.caretAt Just a leftover of something I tried to implement but never got around to finishing. --- Subsurface/Source/GUI/GUITextBlock.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Subsurface/Source/GUI/GUITextBlock.cs b/Subsurface/Source/GUI/GUITextBlock.cs index 493461e04..133af328d 100644 --- a/Subsurface/Source/GUI/GUITextBlock.cs +++ b/Subsurface/Source/GUI/GUITextBlock.cs @@ -14,7 +14,6 @@ namespace Barotrauma protected Vector2 origin; protected Vector2 caretPos; - protected int caretAt; protected Color textColor; From 2d9f7069983a3fa3fd650edc7437032349ab3dda Mon Sep 17 00:00:00 2001 From: juanjp600 Date: Tue, 7 Mar 2017 15:44:59 -0300 Subject: [PATCH 41/44] Scale applies to newlines in ScalableFont.DrawString --- Subsurface/Source/Fonts/ScalableFont.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Subsurface/Source/Fonts/ScalableFont.cs b/Subsurface/Source/Fonts/ScalableFont.cs index 526394ec9..525621b99 100644 --- a/Subsurface/Source/Fonts/ScalableFont.cs +++ b/Subsurface/Source/Fonts/ScalableFont.cs @@ -206,8 +206,8 @@ namespace Barotrauma { lineNum++; currentPos = position; - currentPos.X += baseHeight * 18 / 10 * lineNum * advanceUnit.Y; - currentPos.Y += baseHeight * 18 / 10 * lineNum * advanceUnit.X; + currentPos.X += baseHeight * 18 / 10 * lineNum * advanceUnit.Y * scale.Y; + currentPos.Y += baseHeight * 18 / 10 * lineNum * advanceUnit.X * scale.Y; continue; } uint charIndex = text[i]; From be72a04d908a2a9b1433d10f85ba55b8822f604d Mon Sep 17 00:00:00 2001 From: Regalis Date: Thu, 9 Mar 2017 20:04:33 +0200 Subject: [PATCH 42/44] Switched to the pro version of Code Bold --- Subsurface/Barotrauma.csproj | 2 +- Subsurface/Content/CODE Bold.otf | Bin 24108 -> 0 bytes Subsurface/Content/Code Pro Bold.otf | Bin 0 -> 92140 bytes Subsurface/Source/GUI/GUI.cs | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 Subsurface/Content/CODE Bold.otf create mode 100644 Subsurface/Content/Code Pro Bold.otf diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index 2f49a034a..c5d619680 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -1221,7 +1221,7 @@ PreserveNewest - + PreserveNewest diff --git a/Subsurface/Content/CODE Bold.otf b/Subsurface/Content/CODE Bold.otf deleted file mode 100644 index 50dd77d237ee7b62a76a179604d23b52037794f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24108 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

dwLl73OA-Ut@-Sd+GW-mq5Qn;)WGnDu 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 literal 0 HcmV?d00001 diff --git a/Subsurface/Source/GUI/GUI.cs b/Subsurface/Source/GUI/GUI.cs index 4e325fa86..7e32ba7e1 100644 --- a/Subsurface/Source/GUI/GUI.cs +++ b/Subsurface/Source/GUI/GUI.cs @@ -81,7 +81,7 @@ namespace Barotrauma { Font = new ScalableFont("Content/Exo2-Medium.otf", 14, graphicsDevice); SmallFont = new ScalableFont("Content/Exo2-Light.otf", 12, graphicsDevice); - LargeFont = new ScalableFont("Content/CODE Bold.otf", 22, graphicsDevice); + LargeFont = new ScalableFont("Content/Code Pro Bold.otf", 22, graphicsDevice); cursor = new Sprite("Content/UI/cursor.png", Vector2.Zero); From 38cd5d5a08b62c331cddfbfa76895f1bb35e2db9 Mon Sep 17 00:00:00 2001 From: Regalis Date: Thu, 9 Mar 2017 20:07:25 +0200 Subject: [PATCH 43/44] Fixed launcher --- Launcher2/LauncherMain.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Launcher2/LauncherMain.cs b/Launcher2/LauncherMain.cs index ea862f64d..438ae76a5 100644 --- a/Launcher2/LauncherMain.cs +++ b/Launcher2/LauncherMain.cs @@ -93,12 +93,13 @@ namespace Launcher2 TextureLoader.Init(GraphicsDevice); + GUI.GraphicsDevice = GraphicsDevice; GUI.Init(Content); // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); - GUI.LoadContent(GraphicsDevice, false); + GUI.LoadContent(false); backgroundTexture = TextureLoader.FromFile("Content/UI/titleBackground.png"); titleTexture = TextureLoader.FromFile("Content/UI/titleText.png"); From ede3f1c3937db55181cf8172b0324ca91e9c9e47 Mon Sep 17 00:00:00 2001 From: Regalis Date: Thu, 9 Mar 2017 20:09:34 +0200 Subject: [PATCH 44/44] Removed old fonts --- Subsurface/Barotrauma.csproj | 9 --- Subsurface/Content/Content.mgcb | 18 ------ Subsurface/Content/LargeFont.spritefont | 42 -------------- Subsurface/Content/LargeFont.xnb | Bin 1332496 -> 0 bytes Subsurface/Content/SmallFont.spritefont | 42 -------------- Subsurface/Content/SmallFont.xnb | Bin 242960 -> 0 bytes Subsurface/Content/SpriteFont1.spritefont | 65 ---------------------- Subsurface/Content/SpriteFont1.xnb | Bin 267536 -> 0 bytes 8 files changed, 176 deletions(-) delete mode 100644 Subsurface/Content/LargeFont.spritefont delete mode 100644 Subsurface/Content/LargeFont.xnb delete mode 100644 Subsurface/Content/SmallFont.spritefont delete mode 100644 Subsurface/Content/SmallFont.xnb delete mode 100644 Subsurface/Content/SpriteFont1.spritefont delete mode 100644 Subsurface/Content/SpriteFont1.xnb diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index c5d619680..1c65d8d87 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -1353,15 +1353,9 @@ PreserveNewest - - PreserveNewest - PreserveNewest - - PreserveNewest - PreserveNewest @@ -1650,9 +1644,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest diff --git a/Subsurface/Content/Content.mgcb b/Subsurface/Content/Content.mgcb index 48c1e7111..9cf60ed0f 100644 --- a/Subsurface/Content/Content.mgcb +++ b/Subsurface/Content/Content.mgcb @@ -13,24 +13,6 @@ #---------------------------------- Content ---------------------------------# -#begin LargeFont.spritefont -/importer:FontDescriptionImporter -/processor:FontDescriptionProcessor -/processorParam:TextureFormat=Color -/build:LargeFont.spritefont - -#begin SmallFont.spritefont -/importer:FontDescriptionImporter -/processor:FontDescriptionProcessor -/processorParam:TextureFormat=Color -/build:SmallFont.spritefont - -#begin SpriteFont1.spritefont -/importer:FontDescriptionImporter -/processor:FontDescriptionProcessor -/processorParam:TextureFormat=Color -/build:SpriteFont1.spritefont - #begin watershader.fx /importer:EffectImporter /processor:EffectProcessor diff --git a/Subsurface/Content/LargeFont.spritefont b/Subsurface/Content/LargeFont.spritefont deleted file mode 100644 index fa7bd48f1..000000000 --- a/Subsurface/Content/LargeFont.spritefont +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Code Pro Bold - - 16 - - 0 - - true - - - - _ - - - - - - Ұ - - - - À - ə - - - - diff --git a/Subsurface/Content/LargeFont.xnb b/Subsurface/Content/LargeFont.xnb deleted file mode 100644 index c7acfd769143411b57898ec928a7e01876a79b09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1332496 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

VnPBgkcPnU3Jaww!#R~F&+1m#N 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≪SMncyQ?3|W)6aT!AAZ+u z#?6_%{tF%Eq?tDVXT4VW;pzRm|9kavR@wUmd&{YRxkvVzOUbg}0of2j_dQVC_g%Qb zb?+Q%ow;X=g$qyE+a@iOrz!UqY@Xi25&5rd@;bQfS3}PuIGWdu1Fml-`ER|{YaM-4 z9ar+79liB&*4NS|Og~*ZxM}BdXZ!qq*53VyjnCTIcQ*L`v<~8yKTv1`UnBpO+x}M0 zW_sp4Y5E#SC(vci_*r=9yX=2cwt0$OX|9j<=DPRX?szuk|8LoXb5*}!3q2>#u^E2b z|FsVc-3*?&vpYNkt(TIg;hFq__pEkTuhwDM1F{QF-K;Z5U7y6ys@I%L*;)FGZg@QX zID1YHO(1)8@__uydR}sGG#S`=?uk$Pp)t%>xtDj=i_g^beL^1}VK8B@Ui|Ws1~k8# z%kqrgeUFxYK5Yrf&zGaq-HOk%FwW8+*&Z67`&d%$9(0bU^N3HLKGRnwj#+->zcJ1} znD=y|q301C?O&<=g9H3#lK<*6{blWmR`UNlwh+F8Y_RetOxsGQ-HSWdnEVa-OU|{X z^`$Uz-Rs9U<-h$ic`(Du&%$>;x?JbU=|bjOMw)qMr0X^DtxTceNhG0(e(XYmKl z+3wHwpII+DUHGjpdR_e1^_p|3xxl>9eUiOp%D+81x$6Ioi`-JrM}slcc*yf39IJZq zvF*9&w{3xLq4Dn3OIgz&tn;yP9MR()o9Sxb4v#$mTgfdPc|T>B`)=~?7CcM-Khsy# zah~0zt2R#v*0t!LezDdXsh4%mwC$%YwP$cl9|HcD!2wPlvYA_-C6H;|#&CE36%PB5 zmzuo%vUT0UF>&_)*3(-L^}89La+{3py(K#4e`|BT`HjmMKJsts`iPTF^Z|_{@#zyZ z^Y;IH*U(e`-@9%=6aS$u^C%vfp1L%gc={aeTwfjGu|H}W-2ISp=AMflJntI5$94~W zMnTuF<^LQTtNq;MGn;vE&$aFMZ6WU(p2Z(HCp}%a89!?G_J5JD?^)r`+PIwY>-r>q zM!i;Y5`OC}a>Dmi`K_7znx-Q;>5j%uo4B>oBWFHRPjJrFx8&Vkz4+LtUVKg-sTaTc z)TJRm^ILmwbE-35ov-!Vo@@86^HKa!el#xoC36cNHa+$&o(u4I9`QY%KH67q`R=

(!ck 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%0DinfulpVy0tRZ=xBXcmJa>wGS4dwu){FSP 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 diff --git a/Subsurface/Content/SmallFont.spritefont b/Subsurface/Content/SmallFont.spritefont deleted file mode 100644 index 411980b11..000000000 --- a/Subsurface/Content/SmallFont.spritefont +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - Exo 2 Light - - 9 - - 0 - - true - - - - _ - - - - - - Ұ - - - - À - ə - - - - diff --git a/Subsurface/Content/SmallFont.xnb b/Subsurface/Content/SmallFont.xnb deleted file mode 100644 index b97ed5240702fde63052f89b5e43de454de38549..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242960 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 - - - - - - Exo 2 Medium - - - 10 - - - 0 - - - true - - - - - - _ - - - - - - Ұ - - - - À - ə - - - - diff --git a/Subsurface/Content/SpriteFont1.xnb b/Subsurface/Content/SpriteFont1.xnb deleted file mode 100644 index af2bfd68496c5ca4187b025f825a353cf2d045cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267536 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

n$+6u*L-_A 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%0A@r=W}yV`MgqO;woqf-0_JtIH)KF>9cJPud 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