internal static async Task ExportFontsAsZipAsync(List <FontVariant> fonts, string name)
        {
            if (await PickFileAsync(name, "ZIP", new[] { ".zip" }) is StorageFile file)
            {
                await Task.Run(async() =>
                {
                    ExportNamingScheme scheme = ResourceHelper.AppSettings.ExportNamingScheme;

                    using var i = await file.OpenStreamForWriteAsync();
                    i.SetLength(0);

                    using ZipArchive z = new ZipArchive(i, ZipArchiveMode.Create);
                    foreach (var font in fonts)
                    {
                        if (DirectWrite.IsFontLocal(font.FontFace))
                        {
                            string fileName       = GetFileName(font, scheme);
                            ZipArchiveEntry entry = z.CreateEntry(fileName);
                            using IOutputStream s = entry.Open().AsOutputStream();
                            await DirectWrite.WriteToStreamAsync(font.FontFace, s);
                        }
                    }
                });

                Messenger.Default.Send(new AppNotificationMessage(true, new ExportFontFileResult(true, file)));
            }
        }
        internal static async Task ExportFontsToFolderAsync(List <FontVariant> fonts)
        {
            FolderPicker picker = new FolderPicker
            {
                SuggestedStartLocation = PickerLocationId.DocumentsLibrary
            };

            picker.FileTypeFilter.Add("*");


            if (await picker.PickSingleFolderAsync() is StorageFolder folder)
            {
                await Task.Run(async() =>
                {
                    ExportNamingScheme scheme = ResourceHelper.AppSettings.ExportNamingScheme;

                    foreach (var font in fonts)
                    {
                        if (DirectWrite.IsFontLocal(font.FontFace))
                        {
                            string fileName  = GetFileName(font, scheme);
                            StorageFile file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
                            await TryWriteToFileAsync(font, file);
                        }
                    }
                });

                Messenger.Default.Send(new AppNotificationMessage(true, new ExportFontFileResult(folder, true)));
            }
        }
Esempio n. 3
0
        private static string GetFileName(FontVariant font, ExportNamingScheme scheme)
        {
            string fileName = null;
            string ext      = ".ttf";

            var src = DirectWrite.GetFileName(font.FontFace);

            if (!string.IsNullOrWhiteSpace(src))
            {
                var strsrc = Path.GetExtension(src);
                if (!string.IsNullOrWhiteSpace(strsrc))
                {
                    ext = strsrc;
                }
            }

            if (string.IsNullOrEmpty(ext))
            {
                if (scheme == ExportNamingScheme.System)
                {
                    fileName = src;
                }
            }

            if (string.IsNullOrWhiteSpace(fileName))
            {
                fileName = $"{font.FamilyName.Trim()} {font.PreferredName.Trim()}{ext}";
            }

            return($"{Utils.Humanise(Path.GetFileNameWithoutExtension(fileName), false)}{Path.GetExtension(fileName).ToLower()}");
        }
        public static async void RequestExportFontFile(FontVariant variant)
        {
            var scheme  = ResourceHelper.AppSettings.ExportNamingScheme;
            var interop = Utils.GetInterop();

            if (DirectWrite.IsFontLocal(variant.FontFace))
            {
                string filePath = GetFileName(variant, scheme);
                string name     = Path.GetFileNameWithoutExtension(filePath);
                string ext      = Path.GetExtension(filePath);

                if (await PickFileAsync(name, Localization.Get("ExportFontFile/Text"), new[] { ext }, PickerLocationId.DocumentsLibrary) is StorageFile file)
                {
                    try
                    {
                        bool success = await TryWriteToFileAsync(variant, file);

                        Messenger.Default.Send(new AppNotificationMessage(true, new ExportFontFileResult(success, file)));
                        return;
                    }
                    catch
                    {
                    }
                }
            }

            Messenger.Default.Send(new AppNotificationMessage(true, new ExportFontFileResult(null, false)));
        }
        public static List <TypographyFeatureInfo> GetSupportedTypographyFeatures(FontVariant variant)
        {
            var features = DirectWrite.GetSupportedTypography(variant.FontFace).Values.ToList();
            var list     = features.Select(f => new TypographyFeatureInfo((CanvasTypographyFeatureName)f)).OrderBy(f => f.DisplayName).ToList();

            return(list);
        }
        public static async Task <(StorageFile File, ConversionStatus Result)> TryConvertAsync(
            StorageFile file, StorageFolder targetFolder = null)
        {
            if (file.FileType.ToLower().EndsWith("woff"))
            {
                StorageFolder folder = targetFolder ?? ApplicationData.Current.TemporaryFolder;
                string        name   = Path.GetFileNameWithoutExtension(file.DisplayName);

                if (targetFolder is not null) // Avoid threading errors with multiple converts to the same target folder
                {
                    name += $"-{_random.Next(1000,100000)}";
                }

                StorageFile newFile = await folder.CreateFileAsync($"{name}.otf", CreationCollisionOption.ReplaceExisting).AsTask().ConfigureAwait(false);

                ConversionStatus result = await TryConvertWoffToOtfAsync(file, newFile).ConfigureAwait(false);

                if (result == ConversionStatus.OK)
                {
                    if (DirectWrite.HasValidFonts(GetAppUri(newFile)))
                    {
                        return(newFile, ConversionStatus.OK);
                    }
                    else
                    {
                        return(default, ConversionStatus.UnspecifiedError);
        private static async Task <bool> TryWriteToFileAsync(FontVariant font, StorageFile file)
        {
            try
            {
                using IRandomAccessStream s = await file.OpenAsync(FileAccessMode.ReadWrite);

                s.Size = 0;

                using IOutputStream o = s.GetOutputStreamAt(0);
                await DirectWrite.WriteToStreamAsync(font.FontFace, o);

                return(true);
            }
            catch { }

            return(false);
        }
        public TypographyFeatureInfo(CanvasTypographyFeatureName n)
        {
            Feature = n;

            if (IsNamedFeature(Feature))
            {
                DisplayName = Feature.Humanize().Transform(To.TitleCase);
            }
            else
            {
                //
                // For custom font features, we can produce the OpenType feature tag
                // using the feature name.
                //
                uint id = (uint)(Feature);
                DisplayName = DirectWrite.GetTagName(id);
            }
        }
Esempio n. 9
0
        public static async Task <(StorageFile File, ConversionStatus Result)> TryConvertAsync(StorageFile file)
        {
            if (file.FileType.ToLower().EndsWith("woff"))
            {
                var folder  = ApplicationData.Current.TemporaryFolder;
                var newFile = await folder.CreateFileAsync(file.DisplayName + ".otf", CreationCollisionOption.ReplaceExisting).AsTask().ConfigureAwait(false);

                ConversionStatus result = await TryConvertWoffToOtfAsync(file, newFile).ConfigureAwait(false);

                if (result == ConversionStatus.OK)
                {
                    if (DirectWrite.HasValidFonts(GetAppUri(newFile)))
                    {
                        return(newFile, ConversionStatus.OK);
                    }
                    else
                    {
                        return(default, ConversionStatus.UnspecifiedError);
        private static async Task <bool> TryWriteToFileAsync(FontVariant font, StorageFile file)
        {
            try
            {
                using IRandomAccessStream s = await file.OpenAsync(FileAccessMode.ReadWrite).AsTask().ConfigureAwait(false);

                s.Size = 0;

                using IOutputStream o = s.GetOutputStreamAt(0);
                await DirectWrite.WriteToStreamAsync(font.FontFace, o).AsTask().ConfigureAwait(false);

                await s.FlushAsync(); // using statements force synchronous flushes

                return(true);
            }
            catch { }

            return(false);
        }
Esempio n. 11
0
        internal static async Task ExportFontsToFolderAsync(List <FontVariant> fonts)
        {
            if (await PickFolderAsync() is StorageFolder folder)
            {
                await Task.Run(async() =>
                {
                    ExportNamingScheme scheme = ResourceHelper.AppSettings.ExportNamingScheme;

                    foreach (var font in fonts)
                    {
                        if (DirectWrite.IsFontLocal(font.FontFace))
                        {
                            string fileName  = GetFileName(font, scheme);
                            StorageFile file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting).AsTask().ConfigureAwait(false);
                            await TryWriteToFileAsync(font, file).ConfigureAwait(false);
                        }
                    }
                });

                WeakReferenceMessenger.Default.Send(new AppNotificationMessage(true, new ExportFontFileResult(folder, true)));
            }
        }
        public TypographyFeatureInfo(CanvasTypographyFeatureName n, string displayName = null)
        {
            Feature = n;

            if (displayName != null)
            {
                DisplayName = displayName;
            }
            else if (IsNamedFeature(Feature))
            {
                DisplayName = Feature.Humanise();
            }
            else
            {
                //
                // For custom font features, we can produce the OpenType feature tag
                // using the feature name.
                //
                uint id = (uint)(Feature);
                DisplayName = DirectWrite.GetTagName(id);
            }
        }
        private static string GetFileName(FontVariant font, ExportNamingScheme scheme)
        {
            string fileName = null;
            string ext      = ".ttf";

            var src = DirectWrite.GetFileName(font.FontFace);

            if (!string.IsNullOrWhiteSpace(src))
            {
                ext = Path.GetExtension(src);
            }

            if (scheme == ExportNamingScheme.System)
            {
                fileName = src;
            }

            if (string.IsNullOrWhiteSpace(fileName))
            {
                fileName = $"{font.FamilyName} {font.PreferredName}{ext}";
            }

            return($"{Humanizer.To.SentenceCase.Transform(Path.GetFileNameWithoutExtension(fileName))}{Path.GetExtension(fileName).ToLower()}");
        }
 private static IBuffer GetGlyphBuffer(CanvasFontFace fontface, uint unicodeIndex, GlyphImageFormat format)
 {
     return(DirectWrite.GetImageDataBuffer(fontface, 1024, unicodeIndex, format));
 }
Esempio n. 15
0
 /// <unmanaged>HRESULT ID2D1CommandSink::DrawGlyphRun([In] D2D_POINT_2F baselineOrigin,[In] const DWRITE_GLYPH_RUN* glyphRun,[In, Optional] const DWRITE_GLYPH_RUN_DESCRIPTION* glyphRunDescription,[In] ID2D1Brush* foregroundBrush,[In] DWRITE_MEASURING_MODE measuringMode)</unmanaged>	
 public void DrawGlyphRun(RawVector2 baselineOrigin, DirectWrite.GlyphRun glyphRun, DirectWrite.GlyphRunDescription glyphRunDescription, Brush foregroundBrush, MeasuringMode measuringMode)
 {
     DrawGlyphRun_(baselineOrigin, glyphRun, glyphRunDescription, foregroundBrush, measuringMode);
 }