Beispiel #1
0
        public void ReadTableHeaders()
        {
            var writer = new BigEndianBinaryWriter();

            writer.WriteTrueTypeFileHeader(2, 0, 0, 0);
            writer.WriteTableHeader("name", 0, 10, 0);
            writer.WriteTableHeader("cmap", 0, 1, 0);

            var reader = new FontReader(writer.GetStream());

            Assert.Equal(2, reader.Headers.Count);
        }
        public void LoadFontDescription_CultureNamePriority_Exactmatch()
        {
            var usCulture = new CultureInfo(0x0409);
            var c1        = new CultureInfo(1034); // spanish - international
            var c2        = new CultureInfo(3082); // spanish - traditional

            var writer = new BigEndianBinaryWriter();

            writer.WriteTrueTypeFileHeader(1, 0, 0, 0);
            writer.WriteTableHeader("name", 0, 28, 999);
            writer.WriteNameTable(
                (WellKnownIds.NameIds.FullFontName, "name_c1", c1),
                (WellKnownIds.NameIds.FontSubfamilyName, "sub_c1", c1),
                (WellKnownIds.NameIds.FontFamilyName, "fam_c1", c1),
                (WellKnownIds.NameIds.FullFontName, "name_c2", c2),
                (WellKnownIds.NameIds.FontSubfamilyName, "sub_c2", c2),
                (WellKnownIds.NameIds.FontFamilyName, "fam_c2", c2),
                (WellKnownIds.NameIds.FullFontName, "name_us", usCulture),
                (WellKnownIds.NameIds.FontSubfamilyName, "sub_us", usCulture),
                (WellKnownIds.NameIds.FontFamilyName, "fam_us", usCulture));

            var description = FontDescription.LoadDescription(writer.GetStream());

            // unknown culture shoudl prioritise US, but missing so will return first
            Assert.Equal("name_c2", description.FontName(c2));
            Assert.Equal("sub_c2", description.FontSubFamilyName(c2));
            Assert.Equal("fam_c2", description.FontFamily(c2));
        }
        public void LoadFontDescription_GetNameById()
        {
            var c1 = new CultureInfo(1034); // spanish - international
            var c2 = new CultureInfo(3082); // spanish - traditional

            var writer = new BigEndianBinaryWriter();

            writer.WriteTrueTypeFileHeader(1, 0, 0, 0);
            writer.WriteTableHeader("name", 0, 28, 999);
            writer.WriteNameTable(
                (KnownNameIds.FullFontName, "name_c1", c1),
                (KnownNameIds.FontSubfamilyName, "sub_c1", c1),
                (KnownNameIds.FontFamilyName, "fam_c1", c1),
                (KnownNameIds.FullFontName, "name_c2", c2),
                (KnownNameIds.FontSubfamilyName, "sub_c2", c2),
                (KnownNameIds.FontFamilyName, "fam_c2", c2));

            var description = FontDescription.LoadDescription(writer.GetStream());

            Assert.Equal("name_c1", description.GetNameById(c1, KnownNameIds.FullFontName));
            Assert.Equal("sub_c1", description.GetNameById(c1, KnownNameIds.FontSubfamilyName));
            Assert.Equal("fam_c1", description.GetNameById(c1, KnownNameIds.FontFamilyName));

            Assert.Equal("name_c2", description.GetNameById(c2, KnownNameIds.FullFontName));
            Assert.Equal("sub_c2", description.GetNameById(c2, KnownNameIds.FontSubfamilyName));
            Assert.Equal("fam_c2", description.GetNameById(c2, KnownNameIds.FontFamilyName));
        }
        public void LoadFontDescription()
        {
            var writer = new BigEndianBinaryWriter();

            writer.WriteTrueTypeFileHeader(1, 0, 0, 0);
            writer.WriteTableHeader("name", 0, 28, 999);
            writer.WriteNameTable(
                new Dictionary <WellKnownIds.NameIds, string>
            {
                { WellKnownIds.NameIds.FullFontName, "name" },
                { WellKnownIds.NameIds.FontSubfamilyName, "sub" },
                { WellKnownIds.NameIds.FontFamilyName, "fam" }
            });

            var description = FontDescription.LoadDescription(writer.GetStream());

            Assert.Equal("name", description.FontNameInvariantCulture);
            Assert.Equal("sub", description.FontSubFamilyNameInvariantCulture);
            Assert.Equal("fam", description.FontFamilyInvariantCulture);
        }
        private static void WriteFileHeader(this BigEndianBinaryWriter writer, uint version, params TableHeader[] headers)
        {
            // file header
            // Type Name | name          | Description
            // ----------|---------------|------------------------------
            // uint32    | sfntVersion   | 0x00010000 or 0x4F54544F('OTTO') — see below.
            // uint16    | numTables     | Number of tables.
            // uint16    | searchRange   | (Maximum power of 2 <= numTables) x 16.
            // uint16    | entrySelector | Log2(maximum power of 2 <= numTables).
            // uint16    | rangeShift    | NumTables x 16 - searchRange.
            writer.WriteUInt32(version);
            writer.WriteUInt16((ushort)headers.Length);
            writer.WriteUInt16(0);
            writer.WriteUInt16(0);
            writer.WriteUInt16(0);
            int offset = 12;

            offset += headers.Length * 16;
            foreach (TableHeader h in headers)
            {
                writer.WriteTableHeader(h.Tag, h.CheckSum, (uint)offset, h.Length);
                offset += (int)h.Length;
            }
        }