gecko-dev/gfx/2d/SFNTNameTable.h
Haik Aftandilian d46766b464 Bug 1228022 - part 2 - Add support for reading Mac OS Roman encoded names from SFNTNameTables; r=jfkthame
When reading a U16 font name from the SFNTNameTable, a name entry
with platformID == 1 (Macintosh) and platformSpecificID
(aka encodingID) == 0 (Roman) is read as Mac Roman and converted
to U16.

This patch refactors the matchers created in CreateCanonicalU16Matchers
to return name encoding type instead of a boolean. The encoding
type can then be used to call the appropriate decoding function.

CreateCanonicalU16Matchers is also changed so that it doesn't
enqueue unnecessary matchers on OS X. On OS X, if the nametable
record's platformID field is PLATFORM_ID, IsUTF16Encoding() will
always return false so matchers requiring both of those conditions
will never match.

There are several other platformSpecificID's in Mac SFNTameTables
such as Japanese, Traditional Chinese, and Korean. Fonts with names
in those encodings won't have their names properly encoded, but
that should be OK as SFNTData::GetUniqueKey falls back to another
scheme for hashing fonts if the GetU16FullName call fails.

Tests on El Capitan and Sierra revealed Mac's use Microsoft/Unicode
SFNTNameTable names as well as Mac/Roman.

MozReview-Commit-ID: F8fyDVDwHs7

--HG--
extra : transplant_source : %F6%3F%5B%E9y%FD%93%8C%26s%D1n%FC%AEYp%5C%3D%A6j
2016-09-09 13:55:21 -07:00

74 lines
2.2 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_gfx_SFNTNameTable_h
#define mozilla_gfx_SFNTNameTable_h
#include "mozilla/Function.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/Vector.h"
#include "u16string.h"
namespace mozilla {
namespace gfx {
struct NameHeader;
struct NameRecord;
enum ENameDecoder : int;
typedef Vector<function<ENameDecoder(const NameRecord*)>> NameRecordMatchers;
class SFNTNameTable final
{
public:
/**
* Creates a SFNTNameTable if the header data is valid. Note that the data is
* NOT copied, so must exist for the lifetime of the table.
*
* @param aNameData the Name Table data.
* @param aDataLength length
* @return UniquePtr to a SFNTNameTable or nullptr if the header is invalid.
*/
static UniquePtr<SFNTNameTable> Create(const uint8_t *aNameData,
uint32_t aDataLength);
/**
* Gets the full name from the name table. If the full name string is not
* present it will use the family space concatenated with the style.
* This will only read names that are already UTF16 or Mac OS Roman.
*
* @param aU16FullName string to be populated with the full name.
* @return true if the full name is successfully read.
*/
bool GetU16FullName(mozilla::u16string& aU16FullName);
private:
SFNTNameTable(const NameHeader *aNameHeader, const uint8_t *aNameData,
uint32_t aDataLength);
bool ReadU16Name(const NameRecordMatchers& aMatchers, mozilla::u16string& aU16Name);
bool ReadU16NameFromU16Record(const NameRecord *aNameRecord,
mozilla::u16string& aU16Name);
#if defined(XP_MACOSX)
bool ReadU16NameFromMacRomanRecord(const NameRecord *aNameRecord,
mozilla::u16string& aU16Name);
#endif
const NameRecord *mFirstRecord;
const NameRecord *mEndOfRecords;
const uint8_t *mStringData;
const uint32_t mStringDataLength;
};
} // gfx
} // mozilla
#endif // mozilla_gfx_SFNTNameTable_h