From 03d686432d3192ca45738b4c629c964a0b45d197 Mon Sep 17 00:00:00 2001 From: Iristyle Date: Thu, 7 Mar 2013 14:22:07 -0500 Subject: [PATCH] Bumped SourceCodePro to 1.017 - Totally overhauled font install process since the previous version required lots of interaction / prompting to upgrade existing fonts AND had a clunky UI dialog when installing fonts for the first time - Leveraging Windows Powershell sample script that compiles C# on the fly to call Win32 APIs that deal with fonts - Elevate to admin to run the new stuff - no reboot required --- SourceCodePro/SourceCodePro.nuspec | 51 ++- SourceCodePro/tools/chocolateyInstall.ps1 | 29 +- core/FontHelpers.ps1 | 523 ++++++++++++++++++++++ 3 files changed, 598 insertions(+), 5 deletions(-) create mode 100644 core/FontHelpers.ps1 diff --git a/SourceCodePro/SourceCodePro.nuspec b/SourceCodePro/SourceCodePro.nuspec index 9628aa0..62b9822 100644 --- a/SourceCodePro/SourceCodePro.nuspec +++ b/SourceCodePro/SourceCodePro.nuspec @@ -3,7 +3,7 @@ SourceCodePro Source Code Pro Programming Font - 1.010 + 1.017.1 Adobe Systems Incorporated Ethan Brown Monospaced OpenType programming font @@ -14,9 +14,56 @@ https://github.com/adobe/Source-Code-Pro/blob/master/LICENSE.txt false http://blogs.adobe.com/typblography/files/2012/09/SourceCodeSplash.png - + version 1.017 created 2013/01/11 + + Updates the hinting to the default asterisk in some styles that were missed in the previous version. + Updates the design of the asterisk glyphs, bar, and broken bar. + + +version 1.016 created 2013/01/09 + + Updates the hinting to the default asterisk in all styles. + Adds an new Medium weight to the font project. + Updates design of the following glyphs to center them within glyph height/width: + lighttrpldashhorzbxd + heavytrpldashhorzbxd + lighttrpldashvertbxd + heavytrpldashvertbxd + lightquaddashhorzbxd + heavyquaddashhorzbxd + lightquaddashvertbxd + heavyquaddashvertbxd + lightdbldashhorzbxd + heavydbldashhorzbxd + lightdbldashvertbxd + heavydbldashvertbxd + + +version 1.013 created 2012/11/29 + + Updates design of asterisk and hyphen to accommodate coders' preferences. + Realigns math and punctuation glyphs. + Adds a stylistic set <ss01> for typographic alternates. + Adds a stylistic set <ss04> for alternate dollar sign. + Adds a small number of IPA characters. + Adds box drawing characters and block elements. + + +version 1.011 created 2012/10/19 + + Rebuilt fonts with new MakeOTF version. + +version 1.010 created 2012/09/30 + + Fixed TrueType hinting problem in Bold ampersand. + +version 1.009 created 2012/09/20 + + First release. + + diff --git a/SourceCodePro/tools/chocolateyInstall.ps1 b/SourceCodePro/tools/chocolateyInstall.ps1 index e89eeab..619e683 100644 --- a/SourceCodePro/tools/chocolateyInstall.ps1 +++ b/SourceCodePro/tools/chocolateyInstall.ps1 @@ -1,7 +1,16 @@ +function Get-CurrentDirectory +{ + $thisName = $MyInvocation.MyCommand.Name + [IO.Path]::GetDirectoryName((Get-Content function:$thisName).File) +} + try { $package = 'SourceCodePro' - $fontUrl = 'https://github.com/downloads/adobe/Source-Code-Pro/SourceCodePro_FontsOnly-1.010.zip' + $fontHelpersPath = (Join-Path (Get-CurrentDirectory) 'FontHelpers.ps1') + . $fontHelpersPath + + $fontUrl = 'http://sourceforge.net/projects/sourcecodepro.adobe/files/SourceCodePro_FontsOnly-1.017.zip/download' $destination = Join-Path $Env:Temp 'SourceCodePro' Install-ChocolateyZipPackage -url $fontUrl -unzipLocation $destination @@ -9,8 +18,22 @@ try { $shell = New-Object -ComObject Shell.Application $fontsFolder = $shell.Namespace(0x14) - Get-ChildItem $destination -Recurse -Filter *.otf | - % { $fontsFolder.CopyHere($_.FullName) } + $fontFiles = Get-ChildItem $destination -Recurse -Filter *.otf + + # unfortunately the font install process totally ignores shell flags :( + # http://social.technet.microsoft.com/Forums/en-IE/winserverpowershell/thread/fcc98ba5-6ce4-466b-a927-bb2cc3851b59 + # so resort to a nasty hack of compiling some C#, and running as admin instead of just using CopyHere(file, options) + $commands = $fontFiles | + % { Join-Path $fontsFolder.Self.Path $_.Name } | + ? { Test-Path $_ } | + % { "Remove-SingleFont '$_' -Force;" } + + # http://blogs.technet.com/b/deploymentguys/archive/2010/12/04/adding-and-removing-fonts-with-windows-powershell.aspx + $fontFiles | + % { $commands += "Add-SingleFont '$($_.FullName)';" } + + $toExecute = ". $fontHelpersPath;" + ($commands -join ';') + Start-ChocolateyProcessAsAdmin $toExecute Remove-Item $destination -Recurse diff --git a/core/FontHelpers.ps1 b/core/FontHelpers.ps1 new file mode 100644 index 0000000..334e478 --- /dev/null +++ b/core/FontHelpers.ps1 @@ -0,0 +1,523 @@ +######################################################################################### +# MICROSOFT LEGAL STATEMENT FOR SAMPLE SCRIPTS/CODE +######################################################################################### +# This Sample Code is provided for the purpose of illustration only and is not +# intended to be used in a production environment. +# +# THIS SAMPLE CODE AND ANY RELATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY +# OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +# +# We grant You a nonexclusive, royalty-free right to use and modify the Sample Code +# and to reproduce and distribute the object code form of the Sample Code, provided +# that You agree: +# (i) to not use Our name, logo, or trademarks to market Your software product +# in which the Sample Code is embedded; +# (ii) to include a valid copyright notice on Your software product in which +# the Sample Code is embedded; and +# (iii) to indemnify, hold harmless, and defend Us and Our suppliers from and +# against any claims or lawsuits, including attorneys’ fees, that arise +# or result from the use or distribution of the Sample Code. +######################################################################################### + +#****************************************************************************** +# File: FontHelpers.ps1 - derived from Add-Font.ps1 / Remove-Font.ps1 +# Url : http://blogs.technet.com/b/deploymentguys/archive/2010/12/04/adding-and-removing-fonts-with-windows-powershell.aspx +# Date: 09/22/2010 +# Version: 1.0.0 +# +# Purpose: PowerShell script to install Windows fonts. +# +# Usage: Add-Font -help | -path "" +# +# Copyright (C) 2010 Microsoft Corporation +# +# +# Revisions: +# ---------- +# 1.0.0 09/22/2010 Created script. +# +#****************************************************************************** + +#requires -Version 2.0 + + +#******************************************************************* +# Declare Global Variables and Constants +#******************************************************************* + +# Define constants +set-variable CSIDL_FONTS 0x14 -option constant + +# Create hashtable containing valid font file extensions and text to append to Registry entry name. +$hashFontFileTypes = @{} +$hashFontFileTypes.Add(".fon", "") +$hashFontFileTypes.Add(".fnt", "") +$hashFontFileTypes.Add(".ttf", " (TrueType)") +$hashFontFileTypes.Add(".ttc", " (TrueType)") +$hashFontFileTypes.Add(".otf", " (OpenType)") +# Type 1 fonts require handling multiple resource files. +# Not supported in this script +#$hashFontFileTypes.Add(".mmm", "") +#$hashFontFileTypes.Add(".pbf", "") +#$hashFontFileTypes.Add(".pfm", "") + +# Initialize variables +$invocation = (Get-Variable MyInvocation -Scope 0).Value +$scriptPath = Split-Path $Invocation.MyCommand.Path +$fontRegistryPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" + + +#******************************************************************* +# Load C# code +#******************************************************************* +$fontCSharpCode = @' +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Runtime.InteropServices; + +namespace FontResource +{ + public class AddRemoveFonts + { + private static IntPtr HWND_BROADCAST = new IntPtr(0xffff); + private static IntPtr HWND_TOP = new IntPtr(0); + private static IntPtr HWND_BOTTOM = new IntPtr(1); + private static IntPtr HWND_TOPMOST = new IntPtr(-1); + private static IntPtr HWND_NOTOPMOST = new IntPtr(-2); + private static IntPtr HWND_MESSAGE = new IntPtr(-3); + + [DllImport("gdi32.dll")] + static extern int AddFontResource(string lpFilename); + + [DllImport("gdi32.dll")] + static extern int RemoveFontResource(string lpFileName); + + [DllImport("user32.dll",CharSet=CharSet.Auto)] + private static extern int SendMessage(IntPtr hWnd, WM wMsg, IntPtr wParam, IntPtr lParam); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("user32.dll", SetLastError = true)] + private static extern bool PostMessage(IntPtr hWnd, WM Msg, IntPtr wParam, IntPtr lParam); + + public static int AddFont(string fontFilePath) { + FileInfo fontFile = new FileInfo(fontFilePath); + if (!fontFile.Exists) + { + return 0; + } + try + { + int retVal = AddFontResource(fontFilePath); + + //This version of SendMessage is a blocking call until all windows respond. + //long result = SendMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + //Alternatively PostMessage instead of SendMessage to prevent application hang + bool posted = PostMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + return retVal; + } + catch + { + return 0; + } + } + + public static int RemoveFont(string fontFileName) { + //FileInfo fontFile = new FileInfo(fontFileName); + //if (!fontFile.Exists) + //{ + // return false; + //} + try + { + int retVal = RemoveFontResource(fontFileName); + + //This version of SendMessage is a blocking call until all windows respond. + //long result = SendMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + //Alternatively PostMessage instead of SendMessage to prevent application hang + bool posted = PostMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + return retVal; + } + catch + { + return 0; + } + } + + public enum WM : uint + { + NULL = 0x0000, + CREATE = 0x0001, + DESTROY = 0x0002, + MOVE = 0x0003, + SIZE = 0x0005, + ACTIVATE = 0x0006, + SETFOCUS = 0x0007, + KILLFOCUS = 0x0008, + ENABLE = 0x000A, + SETREDRAW = 0x000B, + SETTEXT = 0x000C, + GETTEXT = 0x000D, + GETTEXTLENGTH = 0x000E, + PAINT = 0x000F, + CLOSE = 0x0010, + QUERYENDSESSION = 0x0011, + QUERYOPEN = 0x0013, + ENDSESSION = 0x0016, + QUIT = 0x0012, + ERASEBKGND = 0x0014, + SYSCOLORCHANGE = 0x0015, + SHOWWINDOW = 0x0018, + WININICHANGE = 0x001A, + SETTINGCHANGE = WM.WININICHANGE, + DEVMODECHANGE = 0x001B, + ACTIVATEAPP = 0x001C, + FONTCHANGE = 0x001D, + TIMECHANGE = 0x001E, + CANCELMODE = 0x001F, + SETCURSOR = 0x0020, + MOUSEACTIVATE = 0x0021, + CHILDACTIVATE = 0x0022, + QUEUESYNC = 0x0023, + GETMINMAXINFO = 0x0024, + PAINTICON = 0x0026, + ICONERASEBKGND = 0x0027, + NEXTDLGCTL = 0x0028, + SPOOLERSTATUS = 0x002A, + DRAWITEM = 0x002B, + MEASUREITEM = 0x002C, + DELETEITEM = 0x002D, + VKEYTOITEM = 0x002E, + CHARTOITEM = 0x002F, + SETFONT = 0x0030, + GETFONT = 0x0031, + SETHOTKEY = 0x0032, + GETHOTKEY = 0x0033, + QUERYDRAGICON = 0x0037, + COMPAREITEM = 0x0039, + GETOBJECT = 0x003D, + COMPACTING = 0x0041, + COMMNOTIFY = 0x0044, + WINDOWPOSCHANGING = 0x0046, + WINDOWPOSCHANGED = 0x0047, + POWER = 0x0048, + COPYDATA = 0x004A, + CANCELJOURNAL = 0x004B, + NOTIFY = 0x004E, + INPUTLANGCHANGEREQUEST = 0x0050, + INPUTLANGCHANGE = 0x0051, + TCARD = 0x0052, + HELP = 0x0053, + USERCHANGED = 0x0054, + NOTIFYFORMAT = 0x0055, + CONTEXTMENU = 0x007B, + STYLECHANGING = 0x007C, + STYLECHANGED = 0x007D, + DISPLAYCHANGE = 0x007E, + GETICON = 0x007F, + SETICON = 0x0080, + NCCREATE = 0x0081, + NCDESTROY = 0x0082, + NCCALCSIZE = 0x0083, + NCHITTEST = 0x0084, + NCPAINT = 0x0085, + NCACTIVATE = 0x0086, + GETDLGCODE = 0x0087, + SYNCPAINT = 0x0088, + NCMOUSEMOVE = 0x00A0, + NCLBUTTONDOWN = 0x00A1, + NCLBUTTONUP = 0x00A2, + NCLBUTTONDBLCLK = 0x00A3, + NCRBUTTONDOWN = 0x00A4, + NCRBUTTONUP = 0x00A5, + NCRBUTTONDBLCLK = 0x00A6, + NCMBUTTONDOWN = 0x00A7, + NCMBUTTONUP = 0x00A8, + NCMBUTTONDBLCLK = 0x00A9, + NCXBUTTONDOWN = 0x00AB, + NCXBUTTONUP = 0x00AC, + NCXBUTTONDBLCLK = 0x00AD, + INPUT_DEVICE_CHANGE = 0x00FE, + INPUT = 0x00FF, + KEYFIRST = 0x0100, + KEYDOWN = 0x0100, + KEYUP = 0x0101, + CHAR = 0x0102, + DEADCHAR = 0x0103, + SYSKEYDOWN = 0x0104, + SYSKEYUP = 0x0105, + SYSCHAR = 0x0106, + SYSDEADCHAR = 0x0107, + UNICHAR = 0x0109, + KEYLAST = 0x0109, + IME_STARTCOMPOSITION = 0x010D, + IME_ENDCOMPOSITION = 0x010E, + IME_COMPOSITION = 0x010F, + IME_KEYLAST = 0x010F, + INITDIALOG = 0x0110, + COMMAND = 0x0111, + SYSCOMMAND = 0x0112, + TIMER = 0x0113, + HSCROLL = 0x0114, + VSCROLL = 0x0115, + INITMENU = 0x0116, + INITMENUPOPUP = 0x0117, + MENUSELECT = 0x011F, + MENUCHAR = 0x0120, + ENTERIDLE = 0x0121, + MENURBUTTONUP = 0x0122, + MENUDRAG = 0x0123, + MENUGETOBJECT = 0x0124, + UNINITMENUPOPUP = 0x0125, + MENUCOMMAND = 0x0126, + CHANGEUISTATE = 0x0127, + UPDATEUISTATE = 0x0128, + QUERYUISTATE = 0x0129, + CTLCOLORMSGBOX = 0x0132, + CTLCOLOREDIT = 0x0133, + CTLCOLORLISTBOX = 0x0134, + CTLCOLORBTN = 0x0135, + CTLCOLORDLG = 0x0136, + CTLCOLORSCROLLBAR = 0x0137, + CTLCOLORSTATIC = 0x0138, + MOUSEFIRST = 0x0200, + MOUSEMOVE = 0x0200, + LBUTTONDOWN = 0x0201, + LBUTTONUP = 0x0202, + LBUTTONDBLCLK = 0x0203, + RBUTTONDOWN = 0x0204, + RBUTTONUP = 0x0205, + RBUTTONDBLCLK = 0x0206, + MBUTTONDOWN = 0x0207, + MBUTTONUP = 0x0208, + MBUTTONDBLCLK = 0x0209, + MOUSEWHEEL = 0x020A, + XBUTTONDOWN = 0x020B, + XBUTTONUP = 0x020C, + XBUTTONDBLCLK = 0x020D, + MOUSEHWHEEL = 0x020E, + MOUSELAST = 0x020E, + PARENTNOTIFY = 0x0210, + ENTERMENULOOP = 0x0211, + EXITMENULOOP = 0x0212, + NEXTMENU = 0x0213, + SIZING = 0x0214, + CAPTURECHANGED = 0x0215, + MOVING = 0x0216, + POWERBROADCAST = 0x0218, + DEVICECHANGE = 0x0219, + MDICREATE = 0x0220, + MDIDESTROY = 0x0221, + MDIACTIVATE = 0x0222, + MDIRESTORE = 0x0223, + MDINEXT = 0x0224, + MDIMAXIMIZE = 0x0225, + MDITILE = 0x0226, + MDICASCADE = 0x0227, + MDIICONARRANGE = 0x0228, + MDIGETACTIVE = 0x0229, + MDISETMENU = 0x0230, + ENTERSIZEMOVE = 0x0231, + EXITSIZEMOVE = 0x0232, + DROPFILES = 0x0233, + MDIREFRESHMENU = 0x0234, + IME_SETCONTEXT = 0x0281, + IME_NOTIFY = 0x0282, + IME_CONTROL = 0x0283, + IME_COMPOSITIONFULL = 0x0284, + IME_SELECT = 0x0285, + IME_CHAR = 0x0286, + IME_REQUEST = 0x0288, + IME_KEYDOWN = 0x0290, + IME_KEYUP = 0x0291, + MOUSEHOVER = 0x02A1, + MOUSELEAVE = 0x02A3, + NCMOUSEHOVER = 0x02A0, + NCMOUSELEAVE = 0x02A2, + WTSSESSION_CHANGE = 0x02B1, + TABLET_FIRST = 0x02c0, + TABLET_LAST = 0x02df, + CUT = 0x0300, + COPY = 0x0301, + PASTE = 0x0302, + CLEAR = 0x0303, + UNDO = 0x0304, + RENDERFORMAT = 0x0305, + RENDERALLFORMATS = 0x0306, + DESTROYCLIPBOARD = 0x0307, + DRAWCLIPBOARD = 0x0308, + PAINTCLIPBOARD = 0x0309, + VSCROLLCLIPBOARD = 0x030A, + SIZECLIPBOARD = 0x030B, + ASKCBFORMATNAME = 0x030C, + CHANGECBCHAIN = 0x030D, + HSCROLLCLIPBOARD = 0x030E, + QUERYNEWPALETTE = 0x030F, + PALETTEISCHANGING = 0x0310, + PALETTECHANGED = 0x0311, + HOTKEY = 0x0312, + PRINT = 0x0317, + PRINTCLIENT = 0x0318, + APPCOMMAND = 0x0319, + THEMECHANGED = 0x031A, + CLIPBOARDUPDATE = 0x031D, + DWMCOMPOSITIONCHANGED = 0x031E, + DWMNCRENDERINGCHANGED = 0x031F, + DWMCOLORIZATIONCOLORCHANGED = 0x0320, + DWMWINDOWMAXIMIZEDCHANGE = 0x0321, + GETTITLEBARINFOEX = 0x033F, + HANDHELDFIRST = 0x0358, + HANDHELDLAST = 0x035F, + AFXFIRST = 0x0360, + AFXLAST = 0x037F, + PENWINFIRST = 0x0380, + PENWINLAST = 0x038F, + APP = 0x8000, + USER = 0x0400, + CPL_LAUNCH = USER+0x1000, + CPL_LAUNCHED = USER+0x1001, + SYSTIMER = 0x118 + } + + } +} +'@ +Add-Type $fontCSharpCode + + +#******************************************************************* +# Declare Functions +#******************************************************************* + +#******************************************************************* +# Function Get-SpecialFolder() +# +# Purpose: Convert a CSIDL string to a folder parh string +# +# Input: $id CSIDL folder identifier string +# +# Returns: Folder path +# +#******************************************************************* +function Get-SpecialFolder($id) +{ + $shell = New-Object –COM "Shell.Application" + $folder = $shell.NameSpace($id) + $specialFolder = $folder.Self.Path + $specialFolder +} + + +#******************************************************************* +# Function Add-SingleFont() +# +# Purpose: Install a font file +# +# Input: $file Font file path +# +# Returns: 0 - success, 1 - failure +# +#******************************************************************* +function Add-SingleFont($filePath) +{ + try + { + [string]$filePath = (resolve-path $filePath).path + [string]$fileDir = split-path $filePath + [string]$fileName = split-path $filePath -leaf + [string]$fileExt = (Get-Item $filePath).extension + [string]$fileBaseName = $fileName -replace($fileExt ,"") + + $shell = new-object -com shell.application + $myFolder = $shell.Namespace($fileDir) + $fileobj = $myFolder.Items().Item($fileName) + $fontName = $myFolder.GetDetailsOf($fileobj,21) + + if ($fontName -eq "") { $fontName = $fileBaseName } + + copy-item $filePath -destination $fontsFolderPath + + $fontFinalPath = Join-Path $fontsFolderPath $fileName + $retVal = [FontResource.AddRemoveFonts]::AddFont($fontFinalPath) + + if ($retVal -eq 0) { + Write-Host "Font $($filePath) installation failed" + Write-Host "" + 1 + } + else + { + Write-Host "Font $($filePath) installed successfully" + Write-Host "" + Set-ItemProperty -path "$($fontRegistryPath)" -name "$($fontName)$($hashFontFileTypes.item($fileExt))" -value "$($fileName)" -type STRING + 0 + } + "" + } + catch + { + Write-Host "An error occured installing $($filePath)" + Write-Host "" + Write-Host "$($error[0].ToString())" + Write-Host "" + 1 + } +} + +#******************************************************************* +# Function Remove-SingleFont() +# +# Purpose: Uninstall a font file +# +# Input: $file Font file name +# +# Returns: 0 - success, 1 - failure +# +#******************************************************************* +function Remove-SingleFont($file) +{ + try + { + $fontFinalPath = Join-Path $fontsFolderPath $file + $retVal = [FontResource.AddRemoveFonts]::RemoveFont($fontFinalPath) + if ($retVal -eq 0) { + Write-Host "Font $($file) removal failed" + Write-Host "" + 1 + } + else + { + $fontRegistryvaluename = (Get-RegistryStringNameFromValue $fontRegistryPath $file) + if ($fontRegistryvaluename -ne "") + { + Remove-ItemProperty -path $fontRegistryPath -name $fontRegistryvaluename + } + remove-item $fontFinalPath + Write-Host "$($error[0].ToString())" + Write-Host "Font $($file) removed successfully" + Write-Host "" + 0 + } + "" + } + catch + { + Write-Host "An error occured removing $($file)" + Write-Host "" + Write-Host "$($error[0].ToString())" + Write-Host "" + 1 + } +} + +#******************************************************************* +# Main Script +#******************************************************************* + +$fontsFolderPath = Get-SpecialFolder($CSIDL_FONTS)