Кэш glyph что это

2.2.7.1.8 Glyph Cache Capability Set (TS_GLYPHCACHE_CAPABILITYSET)

The TS_GLYPHCACHE_CAPABILITYSET structure advertises the glyph support level and associated cache sizes. This capability is only sent from client to server.

GlyphCache (40 bytes)

capabilitySetType (2 bytes): A 16-bit, unsigned integer. The type of the capability set. This field MUST be set to CAPSTYPE_GLYPHCACHE (16).

lengthCapability (2 bytes): A 16-bit, unsigned integer. The length in bytes of the capability data, including the size of the capabilitySetType and lengthCapability fields.

GlyphCache (40 bytes): An array of 10 TS_CACHE_DEFINITION structures. An ordered specification of the layout of each of the glyph caches with IDs 0 through to 9 ( [MS-RDPEGDI] section 3.1.1.1.2 ).

FragCache (4 bytes): Fragment cache data. The maximum number of entries allowed in the cache is 256, and the largest allowed maximum size of an element is 256 bytes.

GlyphSupportLevel (2 bytes): A 16-bit, unsigned integer. The level of glyph support.

The client does not support glyph caching. All text output will be sent to the client as expensive Bitmap Updates (sections 2.2.9.1.1.3.1.2 and 2.2.9.1.2.1.2 ).

Indicates support for Revision 1 Cache Glyph Secondary Drawing Orders ([MS-RDPEGDI] section 2.2.2.2.1.2.5 ).

Indicates support for Revision 1 Cache Glyph Secondary Drawing Orders ([MS-RDPEGDI] section 2.2.2.2.1.2.5).

Indicates support for Revision 2 Cache Glyph Secondary Drawing Orders ([MS-RDPEGDI] section 2.2.2.2.1.2.6 ).

If the GlyphSupportLevel is greater than GLYPH_SUPPORT_NONE (0), the client MUST support the GlyphIndex Primary Drawing Order ([MS-RDPEGDI] section 2.2.2.2.1.1.2.13 ) or the FastIndex Primary Drawing Order ([MS-RDPEGDI] section 2.2.2.2.1.1.2.14 ). If the FastIndex Primary Drawing Order is not supported, then support for the GlyphIndex Primary Drawing Order is assumed by the server (order support is specified in the Order Capability Set, as described in section 2.2.7.1.3 ).

pad2octets (2 bytes): A 16-bit, unsigned integer. Padding. Values in this field MUST be ignored.

Источник

Рендеринг шрифтов с помощью масок покрытия, часть 1

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Когда мы приступали к разработке нашего профилировщика производительности, то знали, что будем выполнять почти весь рендеринг UI самостоятельно. Вскоре нам пришлось решать, какой подход выбрать для рендеринга шрифтов. У нас были следующие требования:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Вот увеличение буквы S, растеризированной размеров всего 6×9 текселов. Исходные векторные данные рендерятся как контур, а повёрнутый паттерн сэмплирования рендерится из зелёных и красных прямоугольников. Так как он рендерится с разрешением гораздо больше 6×9, оттенки серого не представлены в конечном оттенке пикселей, в нём отображается оттенок субпикселя. Это очень полезная отладочная визуализация, позволяющая убедиться, что все вычисления на субпиксельном уровне работают верно.

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Идея: хранение покрытия вместо оттенка

Основная проблема, с которым нужно справиться рендерерам шрифтов — это отображение масштабируемых векторных данных шрифта в фиксированнй сетке пикселей. Способ перехода из векторного пространства к готовым пикселям в разных техниках очень отличается. В большинстве таких техник данные кривых перед рендерингом растеризируются во временное хранилище (например в текстуру) для получения определённого размера в пикселях. Временное хранилище используется в качестве кэша глифов: когда один и тот же глиф рендерится несколько раз, глифы берутся из кэша и используются заново, чтобы избежать повторной растеризации.

Разница техник хорошо заметна в том, как хранятся данные в промежуточном формате данных. Например система шрифтов Windows растеризирует глифы под конкретный размер в пикселях. Данные хранятся как оттенок на пиксель. Оттенок (shade) описывает наилучшее приближение покрытия глифом этого пикселя. При рендеринге пиксели просто копируются из кэша глифов в целевую пиксельную сетку. При преобразовании данных в пиксельный формат они плохо масштабируются, поэтому при уменьшении масштаба возникают нечёткие глифы, а при увеличении масштаба — глифы, в которых отчётливо заметны блоки. Поэтому для каждого конечного размера глифы рендерятся в кэш глифов.

В технике Signed Distanced Fields используется другой подход. Вместо оттенка для пикселя сохраняется расстояние до ближайшего края глифа. Преимущество этого метода в том, что для кривых краёв данные масштабируются гораздо лучше, чем оттенки. При увеличении масштаба глифа кривые остаются плавными. Недостаток этого подхода в том, что сглаживаются прямые и резкие края. Гораздо большего качества, чем SDF, достигают усовершенствованные решения наподобие FreeType, которые хранят данные оттенков.

В случаях, когда для пикселя сохраняется оттенок, необходимо сначала вычислить его покрытие. Например, в stb_truetype есть хорошие примеры того, как можно вычислять покрытие и оттенок. Ещё один популярный способ аппроксимации покрытия заключается в сэмплировании глифа с большей частотой, чем конечное разрешение. При этом подсчитывается количество сэмплов, попавших в глиф в целевой пиксельной области. Количество попаданий, разделённое на максимальное количество возможных сэмплов, определяет оттенок. Так как покрытие уже преобразовано в оттенок для определённого разрешения пиксельной сетки и выравнивания, размещать глифы между целевыми пикселями невозможно: оттенок не сможет правильно отразить истинное покрытие сэмплами целевого пиксельного окна. По этой, а также некоторым другим причинам, которые мы рассмотрим позже, такие системы не поддерживают субпиксельное перемещение.

Но что, если нам нужно свободно перемещать глиф между пикселями? Если оттенок вычислен заранее, мы не можем узнать, каким должен быть оттенок при перемещении между пикселями в целевой пиксельной области. Однако мы можем отложить преобразование из уровня покрытия в оттенок на момент рендеринга. Чтобы сделать это, мы будем хранить не оттенок, а покрытие. Мы сэмплируем глиф с частотой в 16 целевого разрешения, и для каждого сэмпла сохраняем единственный бит. При сэмплировании на сетке 4×4 достаточно хранить всего 16 бит на пиксель. Это будет наше маской покрытия. Во время рендеринга нам нужно считать, сколько битов попадает в целевое пиксельное окно, имеющее то же разрешение, что и хранилище текселов, но физически не к нему не привязанное. В показанной ниже анимации демонстрируется часть глифа (голубая), растеризируемая в четыре тексела. Каждый тексел разделёна на сетку из ячеек 4×4. Серый прямоугольник обозначает пиксельное окно, динамически перемещающееся по глифу. Во время выполнения для определения оттенка подсчитывается количество сэмплов, попадающих в пиксельное окно.

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Вкратце об основных техниках рендеринга шрифтов

Прежде чем переходить к обсуждению реализации нашей системы рендеринга шрифтов, я хочу вкратце рассказать об основных техниках, используемых в этом процессе: хинтинге шрифтов (font hinting) и субпиксельном рендеринге (subpixel rendering) (в Windows эта техника называется ClearType). Можете пропустить этот раздел, если вас интересует только техника с антиалиасингом.

В процессе реализации рендерера я всё больше узнавал о долгой истории развития рендеринга шрифтов. Исследования полностью сосредоточены на единственном аспекте рендеринга шрифтов — читаемости при малых размерах. Создать отличный рендерер для больших шрифтов достаточно просто, но невероятно сложно написать систему, сохраняющую читаемость при малых размерах. Изучение рендеринга шрифтов имеет многолетнюю историю, поражающую своей глубиной. Почитайте, например, о растровой трагедии. Логично, что это было для компьютерных специалистов основной проблемой, потому что на ранних этапах вычислительных машин разрешение экранов было довольно низким. Должно быть, это стало одной из первых задач, с которыми нужно было справиться разработчикам ОС: как сделать текст читаемым на устройствах с низким разрешением экрана? К моему удивлению, высококачественные системы рендеринга шрифтов очень ориентированы на пиксели. Например, глиф строится таким образом, что начинается на границе пикселя, его ширина кратна количеству пикселей, а содержимое подстраивается под пиксели. Эта техника называется привязкой к сетке. Я привык к работе с компьютерными играми и 3D-графикой, где мир построен из единиц измерения и проецируется в пиксели, поэтому меня это немного удивило. Я выяснил, что в области рендеринга шрифтов это очень важный выбор.

Чтобы показать важность привязки к сетке, давайте рассмотрим возможный сценарий растеризации глифа. Представьте, что глиф растеризируется на пиксельной сетке, но форма глифа неидеально совпадает со структурой сетки:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Антиалиасинг сделает пиксели справа и слева от глифа одинаково серыми. Если глиф немного сдвинуть, чтобы он лучше совпадал с границами пикселей, то будет окрашен только один пиксель, и он станет полностью чёрным:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Теперь, когда глиф хорошо соответствует пикселям, цвета стали не такими смазанными. Разница в резкости очень велика. В западных шрифтах есть множество глифов с горизонтальными и вертикальными линиями, и если они плохо совпадают с пиксельной сеткой, то оттенки серого делают шрифт размытым. Даже самая лучшая техника антиалиасинга не способна справиться с этой проблемой.

В качестве решения был предложен хинтинг шрифтов. Авторы шрифтов должны добавлять в свои шрифты информацию о том, как должны глифы привязываться к пикселям, если они не совпадают идеально. Система рендеринга шрифтов искажает эти кривые, чтобы привязать их к пиксельной сетке. Это значительно увеличивает чёткость шрифта, но имеет свою цену:

Так как разрешение DPI в современных экранах быстро увеличивается, возникает вопрос, так ли нужен будет хинтинг шрифтов в будущем, как сегодня. В нынешнем состоянии я считаю хинтинг шрифтов очень ценной техникой для чёткого рендеринга шрифтов. Однако описанная в моей статье техника в будущем может стать интересной альтернативой, потому что глифы можно свободно располагать на холсте без искажений. И так как по сути это техника антиалиасинга, её можно использовать для любых целей, а не только для рендеринга шрифтов.

Наконец, расскажу вкратце о субпиксельном рендеринге. В прошлом люди осознали, что можно утроить горизонтальное разрешение экрана, воспользовавшись отдельными красным, зелёным и синим лучами компьютерного монитора. Каждый пиксель строится из этих лучей, которые физически разделены. Наш глаз смешивает их значения, создавая единственный цвет пикселя. Когда глиф покрывает только часть пикселя, то включается только тот луч, который накладывается на глиф, что утраивает разрешение по горизонтали. Если увеличить изображение экрана при использовании техники наподобие ClearType, то можно увидеть цвета вокруг краёв глифа:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Интересно, что подход, о котором я расскажу в статье, может быть расширен и на субпиксельный рендеринг. Я уже реализовал его прототип. Единственный его недостаток в том, что из-за добавления фильтрации в техниках наподобие ClearType нам нужно брать больше сэмплов текстур. Возможно, я рассмотрю это в дальнейшем.

Рендеринг глифа с помощью равномерной сетки

Допустим, что мы сэмплировали глиф с разрешение в 16 раз больше целевого и сохранили его в текстуру. О том, как это делается, я расскажу в третьей части статьи. Паттерн сэмплирования — это равномерная сетка, то есть 16 точек сэмплирования равномерно распределены по текселу. Каждый глиф рендерится с тем же разрешением, что и целевое разрешение, мы храним по 16 бит на тексел, и каждый бит соответствует сэмплу. Как мы увидим в процессе вычисления маски покрытия, важен порядок хранения сэмплов. В целом точки сэмплирования и их позиции для одного тексела выглядят так:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Получение текселов

Мы будем сдвигать пиксельное окно по битам покрытия, сохранённым в текселах. Нам нужно ответить на следующий вопрос: сколько сэмплов попадёт в наше пиксельное окно? Его иллюстрирует следующее изображение:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Здесь мы видим четыре тексела, на которые частично наложен глиф. Один пиксель (обозначен синим) покрывает часть текселов. Нужно определить, сколько сэмплов пересекает наше пиксельное окно. Сначала нам нужно следующее:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Разность между левым нижним углом пикселя и левым нижним углом тексельной сетки — это относительная позиция пиксельного окна в нормализованных координатах. На этом изображении позиция пиксельного окна будет равна [0.69, 0.37]. В коде:

С помощью инструкции textureGather мы можем получить четыре тексела за раз. Она доступна только в OpenGL 4.0 и выше, поэтому вместо неё можно выполнить четыре texelFetch. Если мы просто будем передавать textureGather UV-координаты, то при идеальном совпадении пиксельного окна с текселом возникнет проблема:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Здесь мы видим три горизонтальных тексела с пиксельным окном (показано синим), точно совпадающим с центральным текселом. Вычисленный вес близок к 1.0, но textureGather вместо него выбрал центральный и правый текселы. Причина в том, что выполняемые textureGather вычисления могут незначительно отличаться от вычисления веса с плавающей запятой. Разница в округлении вычислений, выполняемых в GPU, и вычислений веса с плавающей запятой приводят к глитчам вокруг центров пикселей.

Чтобы решить эту проблему, нужно сделать так, чтобы вычисления веса гарантированно совпадали с сэмплированием textureGather. Для этого мы никогда не будем сэмплировать центры пикселей, и вместо этого всегда будем выполнять сэмплирование в центре тексельной сетки 2×2. Из вычисленной и уже округлённой вниз левой нижней позиции тексела мы прибавляем полный тексел, чтобы добраться до центра тексельной сетки.

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

На этом изображении видно, что благодаря использованию центра тексельной сетки четыре точки сэмплирования, взятые textureGather, всегда будут находиться в центре текселов. В коде:

vec2 centerTexelPos = (bottomLeftTexelPos + vec2(1.0, 1.0)) / size;
uvec4 result = textureGather(fontSampler, centerTexelPos, 0);

Горизонтальная маска пиксельного окна

Мы получили четыре тексела и все вместе они формируют сетку битов покрытия 8×8. Чтобы подсчитать биты в пиксельном окне, нам сначала нужно обнулить биты, находящиеся за пределами пиксельного окна. Чтобы сделать это, мы создадим маску пиксельного окна и выполним побитовое И между пиксельной маской и масками покрытия тексела. Горизонтальное и вертикальное маскирование выполняются по отдельности.

Горизонтальная пиксельная маска должна двигаться вместе с горизонтальным весом, как показано на данной анимации:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

На изображении видно 8-битную маску со значением 0x0F0, сдвигающимся вправо (слева вставляются нули). В анимации маска линейно анимируется с весом, но в реальности битовый сдвиг — это пошаговая операция. Маска меняет значение, когда пиксельное окно пересекает границу сэмпла. В следующей анимации это показано красным и зелёным столбцами, анимированными пошагово. Значение меняется только при пересечении центров сэмплов:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Чтобы маска двигалась только в центре ячейки, но не на её краях, достаточно будет простого округления:

unsigned int pixelMask = 0x0F0 >> int(round(weight.x * 4.0));

Теперь у нас есть пиксельная маска полной 8-битной строки, занимающей два тексела. Если мы выберем правильный тип хранения в нашей 16-битной маске покрытия, то существуют способы комбинирования левого и правого тексела и выполнения горизонтального маскирования пикселей для полной 8-битной строки за раз. Однако это становится проблематичным при вертикальном маскировании, когда мы переходим к повёрнутым сеткам. Поэтому вместо этого мы скомбинируем друг с другом два левых тексела и отдельно два правых тексела, чтобы создать две 32-битных маски покрытия. Мы маскируем левые и правые результаты по отдельности.

Маски для левых текселов используют верхние 4 бита пиксельной маски, а маски для правых текселов используют нижние 4 бита. В равномерной сетке каждая строка имеет одинаковую горизонтальную маску, поэтому мы можем просто скопировать маску для каждой строки, после чего горизонтальная маска будет готова:

unsigned int leftRowMask = pixelMask >> 4;
unsigned int rightRowMask = pixelMask & 0xF;
unsigned int leftMask = (leftRowMask

Чтобы выполнить маскирование, мы скомбинируем два левых тексела и два правых тексела, после чего замаскируем горизонтальные строки:

unsigned int left = ((topLeft & leftMask)

Теперь результат может выглядеть так:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Мы уже можем подсчитать биты этого результата с помощью инструкции bitCount. Мы должны делить не на 16, а на 32, потому что после вертикального маскирования у нас всё равно может остаться 32 потенциальных бита, а не 16. Вот полный рендер глифа на этом этапе:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Здесь мы видим увеличенную букву S, отрендеренную на основе исходных векторных данных (белого контура), и визуализацию точек сэмплирования. Если точка зелёная, то она находится внутри глифа, если красная — то нет. Оттенки серого отображают вычисленные на данном этапе оттенки. В процессе рендеринга шрифтов существует множество возможностей для ошибок, начиная от растеризации, способом хранения данных в текстурном атласе и до вычислений финального оттенка. Подобные визуализации невероятно полезны для проверки правильности вычислений. Они особенно важны для отладки артефактов на субпиксельном уровне.

Вертикальное маскирование

Теперь мы готовы к выполнению маскирования вертикальных битов. Для маскирования по вертикали мы используем немного другой способ. Чтобы разобраться с вертикальным сдвигом, важно вспомнить то, как мы сохраняли биты: в построковом порядке. Нижняя строка занимает четыре наименее значимых бита, а верхняя строка — четыре наиболее значимых бита. Мы можем просто очищать одну за одной, сдвигая их на основании вертикальной позиции пиксельного окна.

Мы создадим единую маску, покрывающую всю высоту двух текселов. В результате мы хотим сохранить четыре полных строки текселов и замаскировать все остальные, то есть маской будет 4×4 бита, что равно значению 0xFFFF. На основании позиции пиксельного окна мы сдвигаем нижние строки и очищаем верхние строки.

int shiftDown = int(round(weightY * 4.0)) * 4;
left = (left >> shiftDown) & 0xFFFF;
right = (right >> shiftDown) & 0xFFFF;

В результате мы также замаскировали вертикальные биты за пределами пиксельного окна:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Теперь нам достаточно подсчитать биты, оставшиеся в текселах, что можно сделать операцией bitCount, потом разделить результат на 16 и получить нужный оттенок!

float shade = (bitCount(left) + bitCount(right)) / 16.0;

Теперь полный рендер буквы выглядит так:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

В продолжении…

Во второй части мы сделаем следующий шаг и посмотрим, как можно применить эту технику к повёрнутым сеткам. Мы будем рассчитывать вот такую схему:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

И мы увидим, что почти всё это можно свести к нескольким таблицам.

Благодарю Себастьяна Аалтонена (@SebAaltonen) за его помощь в решении проблемы с textureGather и, разумеется Михиля ван дер Леу (@MvdleeuwGG) за его идеи и интересные беседы по вечерам.

Источник

Кэш glyph что это

Схема

Для более подробной информации смотрите документацию на библиотеку LiquidMenu.

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Что вызывает Glyph Launcher Ошибка 1034?

Прежде чем пытаться какое-либо решение

1. Очистка ненужных файлов системы

2. Флеш DNS

Записи DNS-кэша со временем повреждаются, что может привести к тому, что в Glyph отобразится ошибка 1034. Эта ошибка также указывает на наличие некоторых препятствий для доступа в Интернет. В этом случае очистка кеша DNS может решить проблему. Несмотря на то, что Glyph использует DNS только время от времени, он все еще требует их в своем рукопожатии.

3. Запустите Glyph от имени администратора

Glyph необходим неограниченный доступ к определенным файлам / службам в вашей системе. Если безопасность Windows ограничивает доступ Glyph к определенным файлам / службам, то Glyph отобразит ошибку 1034. Обычно частые обновления Windows также могут автоматически понижать разрешения Glypth из-за обновленных определений.

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

4. Очистите загрузочную Windows или используйте безопасный режим Windows с сетью

Ошибка 1034 средства запуска Glyph может возникать из-за конфликтующих приложений, которые мешают его работе. Чтобы исключить это, либо очистите загрузочную Windows, либо используйте безопасный режим Windows с поддержкой сети. Используя это, вы сможете определить проблемное приложение, которое вызывало проблему, а затем либо удалить его, либо отключить навсегда.

Если Glyph работает правильно, найдите проблемное приложение и решите проблему между приложением и Glyph.

5. Изменить сетевое соединение

6. Временно отключите антивирус и брандмауэр

Антивирус и брандмауэр помогают нам защитить наши системы от угроз безопасности. Иногда эти приложения блокируют законную работу подлинного программного обеспечения. Если ваш антивирус / брандмауэр блокирует определенные операции Glyph, то Glyph может показать ошибку 1034. В этом случае отключение Антивируса и брандмауэра (временно) может решить проблему. Но перед этим проверьте файлы карантина вашего антивируса, чтобы убедиться, что ни одного из файлов Glyph нет. Не забудьте потом включить Антивирус и Брандмауэр.

Предупреждение. Отключите настройки антивируса или брандмауэра на свой страх и риск, поскольку этот шаг сделает вашу систему более уязвимой для мошеннических, вирусных или злонамеренных атак.

Если Glyph работает правильно, добавьте исключение для GlyphClient. GlyphDownloader, GlyphInstall-9999-1001 и GlyphInstall-0-131 в вашем антивирусе / брандмауэре.

7. Обновите Glyph до последней версии

Панель запуска Glyph регулярно обновляется для улучшения производительности и исправления в ней лазеек. Если ошибка, с которой вы сталкиваетесь в настоящее время, является результатом известной ошибки, которая уже была исправлена ​​в последней версии, то обновление до последней версии решит проблему.

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

8. Ремонт Glyph Установка

Если ваша установка Glyph как-то не завершена или повреждена, мы можем попробовать восстановить ее, прежде чем полностью переустановить. Переустановка приведет к потере всех ваших пользовательских профилей и личных предпочтений. В процессе восстановления манифест будет сравниваться с вашими локальными файлами.

9. Переустановите глиф

Если вам пока ничего не помогло, то пришло время перейти к последнему средству удаления, а затем переустановить Glyph с нуля. Сохраните всю вашу важную работу, прежде чем продолжить.

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

FreeRDP – открытая реализация Remote Desktop Protocol (RDP), протокола, реализующего удаленное управление компьютером, разработанного компанией Microsoft. Проект поддерживает множество платформ, среди которых Windows, Linux, macOS и даже iOS с Android. Этот проект выбран первым в рамках цикла статей, посвященных проверке RDP-клиентов с помощью статического анализатора PVS-Studio.

Немного истории

Проект FreeRDP появился после того, как Microsoft открыла спецификации своего проприетарного протокола RDP. На тот момент существовал клиент rdesktop, реализация которого базируется на результатах Reverse Engineering.

В процессе реализации протокола становилось сложнее добавлять новый функционал из-за существовавшей тогда архитектуры проекта. Изменения в ней породили конфликт между разработчиками, что привело к созданию форка rdesktop — FreeRDP. Дальнейшее распространение продукта было ограничено лицензией GPLv2, в результате чего было принято решение о релицензировании на Apache License v2. Однако не все были согласны менять лицензию своего кода, поэтому разработчики решили переписать проект, в результате чего мы имеем современный вид кодовой базы.

Более подробно об истории проекта можно прочесть в заметке официального блога: «The history of the FreeRDP project».

В статье представлены лишь те ошибки, которые показались мне наиболее интересными.

Утечка памяти

Данный фрагмент был взят из подсистемы winpr, реализующей обертку WINAPI для не-Windows систем, т.е. это легкий аналог Wine. Здесь можно заметить утечку: память, выделенная функцией getcwd, освобождается только при обработке специальных случаев. Для устранения ошибки нужно добавить вызов free после memcpy.

Выход за границы массива

В этом примере новый элемент добавляется в список, даже если количество элементов достигло максимального. Здесь достаточно заменить оператор glyphCache. Таким образом, проверку if (cache) можно опустить.

Ошибка управления ресурсами

Дескриптор файла fp, созданный вызовом функции CreateFile, по ошибке закрыт функцией fclose из стандартной библиотеки, а не CloseHandle.

Одинаковые условия

Очистка нулевых указателей

В функцию free можно передавать нулевой указатель и анализатор об этом знает. Но если выявляется ситуация, при которой указатель всегда передаётся нулевым, как в этом фрагменте, будет выдано предупреждение.

Указатель mszGroupsA изначально равен NULL и больше нигде не инициализируется. Единственная ветвь кода, где указатель мог инициализироваться, является недостижимой.

Скорее всего, подобные забытые переменные возникают в процессе рефакторинга и их можно просто удалить.

Возможное переполнение

V1028 Possible overflow. Consider casting operands, not the result. makecert.c 1087

Приведение результата к long не является защитой от переполнения, так как само вычисление происходит с использованием типа int.

Разыменование указателя в инициализации

Здесь указатель context разыменовывается в инициализации — раньше, чем происходит его проверка.

Были найдены и другие ошибки такого типа:

Бессмысленное условие

Легко заметить, что первое условие не имеет смысла из-за присваивания соответствующего значения ранее.

Некорректный разбор строки

V560 A part of conditional expression is always true: (rc >= 0). proxy.c 222

Анализатор для этого фрагмента выдает сразу 2 предупреждения. Спецификатор %u ожидает переменную типа unsigned int, но переменная sub имеет тип int. Далее мы видим подозрительную проверку: условие справа не имеет смысла, так как в начале идет сравнение с единицей. Не знаю, что имел в виду автор этого кода, но тут явно что-то не так.

Неупорядоченные проверки

Отмеченные условия будут всегда ложны, так как выполнение дойдет до второго условия только в том случае, когда status == SEC_E_OK. Правильный код может выглядеть так:

Заключение

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Sergey Larin. Checking FreeRDP with PVS-Studio

Шрифты используются для визуализации текста в компонентах Label и GUI-нодах Text. Defold поддерживает несколько форматов файлов шрифтов:

Шрифты, добавленные в проект, автоматически конвертируются в текстуру, которую Defold может визуализировать. Доступны два метода визуализации шрифтов, каждый из которых имеет свои преимущества и недостатки:

Создание шрифта

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Перетащите необходимый шрифт в браузер Assets в подходящее для него расположение.

В свойстве Font укажите файл шрифта и, при необходимости, настройте остальные свойства.

Свойства

Поддержка теней обеспечивается встроенными шейдерами материала шрифта и работает как в однослойном, так и в многослойном режиме рендеринга. Если многослойный рендеринг шрифта или поддержка теней не нужны, лучше использовать более простой шейдер, такой как builtins/font-singlelayer.fp.

При значении 0 размер кэша устанавливается автоматически.

Шрифты Distance Field

Шрифты Distance Field (карта расстояний) вместо растровых данных хранят расстояние до границы глифа в текстуре. Когда движок рендерит шрифт, требуется специальный шейдер, чтобы интерпретировать данные о расстоянии и использовать их для отрисовки глифа. Шрифты Distance Field более ресурсоемки, чем растровые, но обеспечивают большую гибкость в выборе размера.

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Обязательно измените свойство Material шрифта на builtins/fonts/font-df.material (или любой другой материал, который может обрабатывать данные карты расстояния) при создании шрифта, иначе при выводе шрифта на экран будет использоваться неподходящий шейдер.

Растровые шрифты BMFont

В дополнение к генерируемым растровым картам Defold поддерживает предварительно запеченные растровые шрифты формата “BMFont”. Эти шрифты представляют собой PNG-изображение в виде страницы с глифами. Кроме того, файл .fnt содержит информацию о том, где на странице находится каждый глиф, а также информацию о размере и кернинге. (Следует учесть, что Defold не поддерживает XML-версию формата .fnt, который используется в Phaser и в некоторых других инструментах).

Эти типы шрифтов не обеспечивают повышения производительности по сравнению с растровыми шрифтами, генерируемыми из файлов TrueType или OpenType, но могут включать произвольную графику, расцветку и тени непосредственно в изображении.

Для создания BMFont следует воспользоваться инструментом для генерирования соответствующих файлов. Существует несколько вариантов:

    — только для Windows, предоставляется AngelCode. — бесплатное приложение на базе Adobe Air для Windows и macOS. — инструмент с открытым исходным кодом на языке Java. — коммерческий инструмент для macOS от 71 Squared. — коммерческий инструмент для macOS от Sovapps.

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Чтобы шрифт отображался корректно, не забудьте установить его свойство Material в builtins/fonts/font-fnt.material.

Артефакты и рекомендации

Как правило, растровые шрифты лучше всего подходят для рендеринга без масштабирования. Они быстрее выводятся на экран, чем шрифты с картой расстояний.

Шрифты Distance Field очень хорошо реагируют на масштабирование. С другой стороны, растровые шрифты, будучи просто пиксельными изображениями, будут увеличиваться в размере, поэтому пиксели будут расти при масштабировании шрифта, что приведет к появлению блочных артефактов, то есть угловатости. Ниже приведен образец шрифта размером 48 пикселей, увеличенный в 4 раза.

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

При уменьшении масштаба растровые текстуры могут качественно и эффективно масштабироваться и сглаживаться средствами GPU. Растровый шрифт лучше сохраняет свой цвет, чем шрифт с картой расстояний. Вот масштаб того же образца шрифта размером 48 пикселей, уменьшенный до 1/5 размера:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Шрифты Distance Field должны быть отрендерены до целевого размера, достаточно большого для хранения информации о расстояниях и возможности описать кривые глифов шрифта. Это тот же шрифт, что и выше, но размером 18 пикселей и увеличенный в 10 раз. Разумеется, этого слишком мало для кодирования форм этого шрифта:

Кэш glyph что это. Смотреть фото Кэш glyph что это. Смотреть картинку Кэш glyph что это. Картинка про Кэш glyph что это. Фото Кэш glyph что это

Если поддержка теней и контуров не требуется, установите соответствующие им значения альфа в 0. В противном случае данные о тенях и контурах все равно будут генерироваться, что приведет к излишнему потреблению памяти.

Кэш шрифта

Ресурс шрифта в Defold приводит к появлению двух вещей во время выполнения: текстуры и данных шрифта.

Во время выполнения, при рендеринге текста, движок сначала обходит глифы подлежащие рендерингу, чтобы проверить, какие глифы доступны в кэше текстур. Для каждого глифа, отсутствующего в кэше текстур глифов, будет произведена загрузка текстуры из растровых данных, хранящихся в данных шрифта.

Например, чтобы сгенерировать градиент в фрагментном шейдере, достаточно написать:

float horizontal_gradient = fract(var_texcoord0.y / texture_size_recip.w);

Подробнее об унифицированных шейдерных переменных см. В руководстве по шейдерам.

Did you spot an error or do you have a suggestion? Please let us know on GitHub!

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *