Создание UINT32 из 4-х чисел - PullRequest
0 голосов
/ 22 марта 2019

ОК.

Я работаю с кодом FW1FontWrapper для использования с DirectX

: https://archive.codeplex.com/?p=fw1

Это избавило меня от необходимости использовать устаревшие и бесполезныеМеханизм шрифтов работает на основе текстур.

Однако функция DrawString в этом обёртке предъявляет особые требования к представлению цвета.

UINT32 Color : In the format 0xAaBbGgRr

Данные, которые я даю для этой задачи, являются постоянной альфа-версиейзначение: 1.0f.

И 3 переменных значения с плавающей запятой для R, G и B в диапазоне от 0,0f до 1,0f.

Учитывая специфическое расположение цветов в UNIT32, я пытаюсьнаписать функцию, которая создаст этот UNIT32, используя 3 значения с плавающей запятой, которые мне даны.

Моя попытка

UINT32 TextClassA::getColour(SentenceType* sentence)
{
    //Convert each float value to its percentage of 255
    int colorb = 255 * sentence->blue;
    int colorg = 255 * sentence->green;
    int colorr = 255 * sentence->red;

    //convert each int to 8 bit Hex
    UINT8 ucolorb = colorb;
    UINT8 ucolorg = colorg;
    UINT8 ucolorr = colorr;

    //Push each hex back onto a UNIT32
    UINT32 color = 0xFF + (ucolorb << 6) + (ucolorg << 4) + (ucolorr << 2);

    return color;
}

SentenceType

красный, зеленый и синий просто поплавки для каждого значения RGB от 0,0-1,0f

Моя идея.

Было примерно то, что я мог:

  1. конвертировать каждое значение с плавающей запятой в его процент 255 (не слишком беспокоиться ос абсолютной точностью.

  2. Преобразование этих целых значений в UINT8s

  3. Затем вставьте их обратно в UINT32

Ответы [ 2 ]

1 голос
/ 22 марта 2019

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

UINT32 TextClassA::getColour(SentenceType* sentence)
{
    //Convert color components to value between 0 and 255.
    UINT32 r = 255 * sentence->red;
    UINT32 b = 255 * sentence->blue;
    UINT32 g = 255 * sentence->green;

    //Combine the color components in a single value of the form 0xAaBbGgRr
    return 0xFF000000 | r | (b << 16) | (g << 8);
}
0 голосов
/ 22 марта 2019

Я понял это !!!

UINT32 TextClassA::getColour(SentenceType* sentence)
{
    //Convert each float value to its percentage of 255
    int colorb = 255 * sentence->blue;
    int colorg = 255 * sentence->green;
    int colorr = 255 * sentence->red;

    //convert each int to 8 bit Hex
    UINT8 ucolorb = 0x00 + colorb;
    UINT8 ucolorg = 0x00 + colorg;
    UINT8 ucolorr = 0x00 + colorr;

    //Convert each UINT8 to a UINT32
    UINT32 u32colorb = ucolorb;
    UINT32 u32colorg = ucolorg;
    UINT32 u32colorr = ucolorr;

    //Create final UINT32s and push the converted UINT8s back onto each.
    UINT32 u32finalcolorb = 0x00000000 | (u32colorb << 16);
    UINT32 u32finalcolorg = 0x00000000 | (u32colorg << 8);
    UINT32 u32finalcolorr = 0x00000000 | (u32colorr);

    //0xAaBbGgRr
    //Push each hex back onto a UNIT32
    UINT32 color = 0xFF000000 | u32finalcolorb | u32finalcolorg | 
        u32finalcolorr;

    return color;
}

Моя ошибка

... Я полагаю, пытался подтолкнуть UINT8sназад, вызывая переполнение, поэтому мне нужно было сначала преобразовать в UINT32.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...