static UIFont LoadAndRegisterEmbeddedFont(string resourceId, nfloat size, Assembly assembly)
 {
     using (var stream = EmbeddedResourceCache.GetStream(resourceId, assembly))
     {
         if (stream == null)
         {
             Console.WriteLine("Could not open Embedded Resource [" + resourceId + "]");
             return(null);
         }
         var data = NSData.FromStream(stream);
         if (data == null)
         {
             Console.WriteLine("Could not retrieve data from Embedded Resource [" + resourceId + "].");
             return(null);
         }
         var provider = new CGDataProvider(data);
         var font     = CGFont.CreateFromProvider(provider);
         if (!CTFontManager.RegisterGraphicsFont(font, out NSError error))
         {
             if (error.Code != 105)
             {
                 Console.WriteLine("Could load but failed to register [" + resourceId + "] font.  Error messages:");
                 Console.WriteLine("\tdescription: " + error.Description);
                 throw new MissingMemberException("Failed to register [" + resourceId + "] font.  Error messages in console.");
             }
         }
         _embeddedResourceFonts.Add(resourceId, font.PostScriptName);
         return(UIFont.FromName(font.PostScriptName, size));
     }
 }
Exemple #2
0
        static Typeface LoadAndRegisterEmbeddedFont(string resouceId, Assembly assembly)
        {
            using (var inputStream = EmbeddedResourceCache.GetStream(resouceId, assembly))
            {
                if (inputStream == null)
                {
                    System.Console.WriteLine("Embedded Resource for FontFamily \"" + resouceId + "\" not found.");
                    return(null);
                }

                var cachedFontDir = new File(CustomFontDirRoot + "/ResourceFonts");
                if (!cachedFontDir.Exists())
                {
                    cachedFontDir.Mkdir();
                }

                var cachedFontFile = new File(cachedFontDir, resouceId);
                using (var outputStream = new FileOutputStream(cachedFontFile))
                {
                    const int bufferSize = 1024;
                    var       buffer     = new byte[bufferSize];
                    int       length     = -1;
                    while ((length = inputStream.Read(buffer, 0, bufferSize)) > 0)
                    {
                        outputStream.Write(buffer, 0, length);
                    }
                }
                Typeface typeface = Typeface.CreateFromFile(cachedFontFile);
                if (typeface == null)
                {
                    System.Console.WriteLine("Embedded Resource font file (" + resouceId + ") could not be loaded as an Android Typeface.");
                    return(null);
                }
                _fontFiles.Add(resouceId, cachedFontFile.AbsolutePath);
                return(typeface);
            }
        }
        public static string ReconcileFontFamily(string f9pFontFamily)
        {
            if (string.IsNullOrWhiteSpace(f9pFontFamily))
            {
                return(DefaultSystemFontFamily);
            }

            string localStorageFileName = null;
            string uri        = null;
            string resourceId = null;

            switch (f9pFontFamily.ToLower())
            {
            case "monospace":
                return("Consolas");

            case "serif":
                return("Cambria");

            case "sans-serif":
                return("Segoe UI");

            case "stixgeneral":
                resourceId    = "Forms9Patch.Resources.Fonts.STIXGeneral.otf";
                f9pFontFamily = resourceId + "#" + "STIXGeneral";
                break;
            }

            if (EmbeddedFontSources.ContainsKey(f9pFontFamily))
            {
                return(EmbeddedFontSources[f9pFontFamily]);
            }

            var idParts = f9pFontFamily.Split('#');

            resourceId = idParts[0];

            if (localStorageFileName == null)
            {
                // we've got to go hunting for this ... and UWP doesn't give us much help
                // first, try the main assembly!
                var    targetParts    = f9pFontFamily.Split('.');
                string targetAsmNameA = "invalid_assembly_name";
                if (targetParts.Contains("Resources"))
                {
                    targetAsmNameA = "";
                    foreach (var part in targetParts)
                    {
                        if (part == "Resources")
                        {
                            break;
                        }
                        targetAsmNameA += part + ".";
                    }
                    if (targetAsmNameA.Length > 0)
                    {
                        targetAsmNameA = targetAsmNameA.Substring(0, targetAsmNameA.Length - 1);
                    }
                }
                var targetAsmNameB = targetParts.First();

                var appAsmName = Forms9Patch.ApplicationInfoService.Assembly.GetName().Name;
                if (targetAsmNameA == appAsmName || targetAsmNameB == appAsmName)
                {
                    localStorageFileName = EmbeddedResourceCache.LocalStorageSubPathForEmbeddedResource(resourceId, Forms9Patch.ApplicationInfoService.Assembly);
                    if (localStorageFileName != null)
                    {
                        uri = EmbeddedResourceCache.ApplicationUri(resourceId, Forms9Patch.ApplicationInfoService.Assembly);
                    }
                }

                // if that doesn't work, look through all known assemblies
                if (localStorageFileName == null)
                {
                    foreach (var asm in Settings.AssembliesToInclude)
                    {
                        var asmName = asm.GetName().Name;
                        if (targetAsmNameA == asmName || targetAsmNameB == asmName)
                        {
                            localStorageFileName = EmbeddedResourceCache.LocalStorageSubPathForEmbeddedResource(resourceId, asm);
                            uri = EmbeddedResourceCache.ApplicationUri(resourceId, asm);
                            break;
                        }
                    }
                }
            }

            if (localStorageFileName == null)
            {
                return(f9pFontFamily);
            }

            string fontName = null;

            if (idParts.Count() > 1)
            {
                fontName = idParts.Last();
            }
            else
            {
                //var cachedFilePath = System.IO.Path.Combine(P42.Utils.Environment.ApplicationDataPath, localStorageFileName);
                var cachedFilePath = System.IO.Path.Combine(P42.Utils.EmbeddedResourceCache.FolderPath(), localStorageFileName);
                fontName = TTFAnalyzer.FontFamily(cachedFilePath);
            }
            //var uwpFontFamily = "ms-appdata:///local/" + localStorageFileName.Replace('\\','/') + (string.IsNullOrWhiteSpace(fontName) ? null : "#" + fontName);
            var uwpFontFamily = uri + (string.IsNullOrWhiteSpace(fontName) ? null : "#" + fontName);

            //var uwpFontFamily = "ms-appdata:///local/EmbeddedResourceCache/02fe60e0da81514d145d946ab9ad9b97#Pacifico";
            //foreach (var c in uwpFontFamily)
            //    System.Diagnostics.Debug.WriteLine("c=["+c+"]["+(int)c+"]");
            EmbeddedFontSources.Add(f9pFontFamily, uwpFontFamily);
            return(uwpFontFamily);
        }
        public static Typeface TypefaceForFontFamily(string fontFamily, Assembly assembly = null)
        {
            //string fontFilePath;
            if (fontFamily == null)
            {
                //return Typeface.Default;
                return(null);
            }

            Typeface result;

            if (fontFamily.ToLower() == "monospace")
            {
                result = TrySystemFont("monospace");
                if (result != null)
                {
                    return(result);
                }
                result = TrySystemFont("Droid Sans Mono");
                if (result != null)
                {
                    return(result);
                }
            }
            if (fontFamily.ToLower() == "serif")
            {
                result = TrySystemFont("serif");
                if (result != null)
                {
                    return(result);
                }
                result = TrySystemFont("Droid Serif");
                if (result != null)
                {
                    return(result);
                }
            }
            if (fontFamily.ToLower() == "sans-serif")
            {
                result = TrySystemFont("sans-serif");
                if (result != null)
                {
                    return(result);
                }
                result = TrySystemFont("normal");
                if (result != null)
                {
                    return(result);
                }
                result = TrySystemFont("Roboto");
                if (result != null)
                {
                    return(result);
                }
                result = TrySystemFont("Droid Sans");
                if (result != null)
                {
                    return(result);
                }
            }

            result = TrySystemFont(fontFamily);
            if (result != null)
            {
                return(result);
            }

            if (fontFamily.Contains(".Resources.Fonts."))
            {
                // it's an Embedded Resource
                if (!fontFamily.ToLower().EndsWith(".ttf") && !fontFamily.ToLower().EndsWith(".otf"))
                {
                    throw new InvalidObjectException("Embedded Font file names must end with \".ttf\" or \".otf\".");
                }
                // what is the assembly?

                /*
                 * var assemblyName = fontFamily.Substring(0, fontFamily.IndexOf(".Resources.Fonts."));
                 *
                 * //var assembly = System.Reflection.Assembly.Load (assemblyName);
                 * var assembly = ReflectionExtensions.GetAssemblyByName(assemblyName) ?? Forms9Patch.Droid.Settings.ApplicationAssembly;
                 *
                 * if (assembly == null)
                 * {
                 *  // try using the current application assembly instead (as is the case with Shared Applications)
                 *  assembly = ReflectionExtensions.GetAssemblyByName(assemblyName + ".Droid");
                 *  ///System.Console.WriteLine ("Assembly for FontFamily \"" + fontFamily + "\" not found.");
                 *  //return null;
                 * }
                 */
                // move it to the Application's CustomFontDirRoot
                using (var inputStream = EmbeddedResourceCache.GetStream(fontFamily, assembly))
                {
                    if (inputStream == null)
                    {
                        System.Console.WriteLine("Embedded Resource for FontFamily \"" + fontFamily + "\" not found.");
                        return(null);
                    }

                    var cachedFontDir = new File(CustomFontDirRoot + "/ResourceFonts");
                    if (!cachedFontDir.Exists())
                    {
                        cachedFontDir.Mkdir();
                    }

                    var cachedFontFile = new File(cachedFontDir, fontFamily);
                    using (var outputStream = new FileOutputStream(cachedFontFile))
                    {
                        const int bufferSize = 1024;
                        var       buffer     = new byte[bufferSize];
                        int       length     = -1;
                        while ((length = inputStream.Read(buffer, 0, bufferSize)) > 0)
                        {
                            outputStream.Write(buffer, 0, length);
                        }
                    }
                    Typeface typeface = Typeface.CreateFromFile(cachedFontFile);
                    if (typeface == null)
                    {
                        System.Console.WriteLine("Embedded Resource font file (" + fontFamily + ") could not be loaded as an Android Typeface.");
                        return(null);
                    }
                    _fontFiles.Add(fontFamily, cachedFontFile.AbsolutePath);
                    return(typeface);
                }
            }
            return(null);
        }
        internal static UIFont EmbeddedFont(string resourceId, nfloat size, Assembly assembly = null)
        {
            if (resourceId == "STIXGeneral")
            {
                resourceId = "Forms9Patch.Resources.Fonts.STIXGeneral.otf";
            }

            if (_embeddedResourceFonts.ContainsKey(resourceId))
            {
                string family = _embeddedResourceFonts[resourceId];
                return(UIFont.FromName(family, size));
            }
            if (resourceId.Contains(".Resources.Fonts."))
            {
                // it's an Embedded Resource
                if (!resourceId.ToLower().EndsWith(".ttf") && !resourceId.ToLower().EndsWith(".otf"))
                {
                    throw new MissingMemberException("Embedded Font file names must end with \".ttf\" or \".otf\".");
                }
                lock (_loadFontLock)
                {
                    // what is the assembly?

                    /*
                     * var assemblyName = resourceId.Substring(0, resourceId.IndexOf(".Resources.Fonts."));
                     * //var assembly = System.Reflection.Assembly.Load (assemblyName);
                     * var assembly = ReflectionExtensions.GetAssemblyByName(assemblyName);
                     * if (assembly == null)
                     * {
                     *  // try using the current application assembly instead (as is the case with Shared Applications)
                     *  assembly = ReflectionExtensions.GetAssemblyByName(assemblyName + ".Droid");
                     *  //Console.WriteLine ("Assembly for Resource ID \"" + resourceID + "\" not found.");
                     *  //return null;
                     * }
                     */
                    // load it!
                    using (var stream = EmbeddedResourceCache.GetStream(resourceId, assembly))
                    {
                        if (stream == null)
                        {
                            Console.WriteLine("Could not open Embedded Resource [" + resourceId + "]");
                            return(null);
                        }
                        var data = NSData.FromStream(stream);
                        if (data == null)
                        {
                            Console.WriteLine("Could not retrieve data from Embedded Resource [" + resourceId + "].");
                            return(null);
                        }
                        var provider = new CGDataProvider(data);
                        var font     = CGFont.CreateFromProvider(provider);
                        if (!CTFontManager.RegisterGraphicsFont(font, out NSError error))
                        {
                            if (error.Code != 105)
                            {
                                Console.WriteLine("Could load but failed to register [" + resourceId + "] font.  Error messages:");
                                Console.WriteLine("\tdescription: " + error.Description);
                                throw new MissingMemberException("Failed to register [" + resourceId + "] font.  Error messages in console.");
                            }
                        }
                        _embeddedResourceFonts.Add(resourceId, font.PostScriptName);
                        return(UIFont.FromName(font.PostScriptName, size));
                    }
                }
            }
            return(null);
        }