Tôi biết đó là một câu hỏi cũ nhưng tôi thấy rất khó để sử dụng CreateFontPackage
API từ C# (như đã đề cập bởi câu trả lời @ josh3736 của) vì vậy tôi nghĩ để chia sẻ mã của tôi.
Tôi đang sử dụng API với glyphIndices, bạn có thể sử dụng nó trực tiếp với các ký tự bằng cách xóa cờ TTFCFP_FLAGS_GLYPHLIST
.
Đây là mã của tôi:
public byte[] CreateSubset(byte[] inputData, IEnumerable<ushort> glyphIndices)
{
AllocProc allocProc = Marshal.AllocHGlobal;
ReallocProc reallocProc = (p, c) =>
p == IntPtr.Zero
? Marshal.AllocHGlobal(c)
: Marshal.ReAllocHGlobal(p, c);
FreeProc freeProc = Marshal.FreeHGlobal;
var resultCode = CreateFontPackage(
inputData, (uint) inputData.Length,
out var bufferPtr,
out _,
out var bytesWritten,
TTFCFP_FLAGS_SUBSET | TTFCFP_FLAGS_GLYPHLIST,
0,
TTFMFP_SUBSET,
0,
TTFCFP_MS_PLATFORMID,
TTFCFP_UNICODE_CHAR_SET,
glyphIndices,
(ushort)glyphIndices.Length,
allocProc, reallocProc, freeProc, (IntPtr)0);
if (resultCode != 0 || bufferPtr == IntPtr.Zero)
{
return null;
}
try
{
var buffer = new byte[bytesWritten];
Marshal.Copy(bufferPtr, buffer, 0, buffer.Length);
return buffer;
}
finally
{
freeProc(bufferPtr);
}
}
internal const ushort TTFCFP_FLAGS_SUBSET = 0x0001;
internal const ushort TTFCFP_FLAGS_COMPRESS = 0x0002;
internal const ushort TTFCFP_FLAGS_TTC = 0x0004;
internal const ushort TTFCFP_FLAGS_GLYPHLIST = 0x0008;
internal const ushort TTFMFP_SUBSET = 0x0000;
internal const ushort TTFCFP_UNICODE_PLATFORMID = 0x0000;
internal const ushort TTFCFP_MS_PLATFORMID = 0x0003;
internal const ushort TTFCFP_UNICODE_CHAR_SET = 0x0001;
[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
private delegate IntPtr AllocProc(Int32 size);
[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
private delegate IntPtr ReallocProc(IntPtr memBlock, IntPtr size);
[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
private delegate void FreeProc(IntPtr memBlock);
[DllImport("FontSub.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)]
private static extern uint CreateFontPackage(
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]
byte[] puchSrcBuffer,
uint ulSrcBufferSize,
out IntPtr puchFontPackageBufferPtr,
out uint pulFontPackageBufferSize,
out uint pulBytesWritten,
ushort usFlags,
ushort usTtcIndex,
ushort usSubsetFormat,
ushort usSubsetLanguage,
ushort usSubsetPlatform,
ushort usSubsetEncoding,
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 12)]
ushort[] pusSubsetKeepList,
ushort usSubsetKeepListCount,
AllocProc lpfnAllocate,
ReallocProc lpfnReAllocate,
FreeProc lpfnFree,
IntPtr lpvReserved
);
tôi đã sử dụng với mã chỉ với các file TTF, cho TTC (bộ sưu tập font chữ), bạn cần phải thay đổi một vài điều nhưng nó phải làm việc dù sao.
Tôi tự hỏi mục đích của tuyên bố gt là gì? Nó không được sử dụng sau khi nó được khai báo ... –
@ BrianTHOMAS, vâng, xin lỗi về điều đó, nó là một tạo phẩm từ nhiều mã hơn. nó không được sử dụng trong ví dụ này. vui lòng chỉnh sửa mã. –