Кэширование (интернационализация)
Uniscribe сохраняет сопоставления юникода к глифу (cmap), ширину глифа и таблицы формирования скриптов OpenType. Дескриптор таблиц для определенного шрифта определенного размера называется кэшем скриптов. Многие функции Uniscribe вызывают как параметр дескриптора контекста устройства, так и указатель на структуру SCRIPT_CACHE. Эти функции сначала ищут сведения в кэше скриптов, используя контекст устройства только в том случае, если необходимые таблицы еще не кэшируются. При вызове функций ScriptShape, ScriptPlaceили ScriptTextOut приложение должно передать указатель на структуру SCRIPT_CACHE. Дескриптор должен быть инициализирован в NULL перед тем, как приложение впервые передаст его функции Uniscribe. Приложение никогда не должно передавать один и тот же идентификатор для разных шрифтов или разных размеров шрифтов.
Приложение может освободить кэш скриптов в любое время. Uniscribe поддерживает счетчики ссылок в кэшах шрифтов и шейперов, освобождает данные шрифта только при освобождении всех размеров шрифта и освобождает данные шейпера только при освобождении всех шрифтов, поддерживаемых шейпером. Когда приложение закончит работу со стилем, оно должно вызвать функцию ScriptFreeCache, чтобы освободить кэш скрипта для стиля.
Для ScriptShape и ScriptPlaceприложению разрешено передавать нулевой контекст устройства. Чаще всего вызов завершится успешно, так как необходимые таблицы уже кэшируются. Если для формирования или размещения требуется доступ к контексту устройства, то ScriptShape или ScriptPlace немедленно возвращает код ошибки E_PENDING. Затем приложение должно выбрать шрифт в контексте устройства. Для большинства приложений это помогает повысить производительность, избегая повторной подготовки дескриптора контекста устройства с вызовами SelectObject.
Связанные разделы