//Apache2, 2017-present, WinterDev
//Apache2, 2014-2016, Samuel Carlsson, WinterDev
using System.IO;
using System.Text;
namespace Typography.OpenFont.Tables
{
//https://docs.microsoft.com/en-us/typography/opentype/spec/name
public class NameEntry : TableEntry
{
public const string _N = "name";
public override string Name => _N;
//
protected override void ReadContentFrom(BinaryReader reader)
{
ushort uFSelector = reader.ReadUInt16();
ushort uNRCount = reader.ReadUInt16();
ushort uStorageOffset = reader.ReadUInt16();
uint offset = this.Header.Offset;
for (int j = 0; j <= uNRCount; j++)
{
var ttRecord = new TT_NAME_RECORD()
{
uPlatformID = reader.ReadUInt16(),
uEncodingID = reader.ReadUInt16(),
uLanguageID = reader.ReadUInt16(),
uNameID = reader.ReadUInt16(),
uStringLength = reader.ReadUInt16(),
uStringOffset = reader.ReadUInt16(),
};
long nPos = reader.BaseStream.Position;
reader.BaseStream.Seek(offset + ttRecord.uStringOffset + uStorageOffset, SeekOrigin.Begin);
byte[] buf = reader.ReadBytes(ttRecord.uStringLength);
Encoding enc2;
if (ttRecord.uEncodingID == 3 || ttRecord.uEncodingID == 1)
{
enc2 = Encoding.BigEndianUnicode;
}
else
{
enc2 = Encoding.UTF8;
}
string strRet = enc2.GetString(buf, 0, buf.Length);
//....
switch ((NameIdKind)ttRecord.uNameID)
{
default:
//skip
break;
case NameIdKind.VersionString:
VersionString = strRet;
break;
case NameIdKind.FontFamilyName:
FontName = strRet;
break;
case NameIdKind.FontSubfamilyName:
FontSubFamily = strRet;
break;
case NameIdKind.UniqueFontIden:
UniqueFontIden = strRet;
break;
case NameIdKind.FullFontName:
FullFontName = strRet;
break;
//
case NameIdKind.PostScriptName:
PostScriptName = strRet;
break;
case NameIdKind.PostScriptCID_FindfontName:
PostScriptCID_FindfontName = strRet;
break;
//
case NameIdKind.TypographicFamilyName:
TypographicFamilyName = strRet;
break;
case NameIdKind.TypographyicSubfamilyName:
TypographyicSubfamilyName = strRet;
break;
}
//move to saved pos
reader.BaseStream.Seek(nPos, SeekOrigin.Begin);
}
}
///
/// Font Family name.
/// This family name is assumed to be shared among fonts that
/// differ only in weight or style (italic, oblique).
///
/// Font Family name is used in combination with Font Subfamily name (name ID 2)...
///
public string FontName { get; private set; }
///
/// Font Subfamily name. The Font Subfamily name distinguishes the fonts in a group with the
/// same Font Family name (name ID 1).
/// This is assumed to address style (italic, oblique) and weight variants only.
///
/// A font with no distinctive weight or style (e.g. medium weight, not italic, and OS/2.fsSelection bit 6 set)
/// should use the string “Regular” as the Font Subfamily name (for English language).
///
public string FontSubFamily { get; private set; }
public string UniqueFontIden { get; private set; }
///
/// Full font name that reflects all family and relevant subfamily descriptors.
/// The full font name is generally a combination of name IDs 1 and 2, or
/// of name IDs 16 and 17, or a similar human-readable variant.
///
public string FullFontName { get; set; }
public string VersionString { get; set; }
///
/// PostScript name for the font; Name ID 6 specifies a string which is used to invoke a PostScript language font that corresponds to this OpenType font.
/// When translated to ASCII, the name string must be no longer than 63 characters and restricted to the printable ASCII subset,
/// codes 33 to 126, except for the 10 characters '[', ']', '(', ')', '{', '}', '<', '>', '/', '%'.
///
///In a CFF OpenType font, there is no requirement that this name be the same as the font name in the CFF’s Name INDEX.Thus,
///the same CFF may be shared among multiple font components in a Font Collection.
///...
///
public string PostScriptName { get; set; }
public string PostScriptCID_FindfontName { get; set; }
//
public string TypographicFamilyName { get; set; }
public string TypographyicSubfamilyName { get; set; }
struct TT_NAME_RECORD
{
public ushort uPlatformID;
public ushort uEncodingID;
public ushort uLanguageID;
public ushort uNameID;
public ushort uStringLength;
public ushort uStringOffset;
}
enum NameIdKind
{
//...
//[A] The key information for this table for Microsoft platforms
//relates to the use of strings 1, 2, 4, 16 and 17.
//...
CopyRightNotice, //0
FontFamilyName, //1 , [A]
FontSubfamilyName,//2, [A]
UniqueFontIden, //3
FullFontName, //4, [A]
VersionString,//5
PostScriptName,//6
Trademark,//7
ManufacturerName,//8
Designer,//9
Description, //10
UrlVendor, //11
UrlDesigner,//12
LicenseDescription, //13
LicenseInfoUrl,//14
Reserved,//15
TypographicFamilyName,//16 , [A]
TypographyicSubfamilyName,//17, [A]
CompatibleFull,//18
SampleText,//19
PostScriptCID_FindfontName,//20
//------------------
WWSFamilyName,//21
WWSSubfamilyName,//22
//------------------
LightBackgroundPalette,//23, CPAL
DarkBackgroundPalette,//24, CPAL
//------------------
VariationsPostScriptNamePrefix,//25
}
}
}