Как использовать Cairo Graphics в 16-битном цветовом режиме?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как использовать Cairo Graphics в 16-битном цветовом режиме?

Сообщение Anonymous »

Я использую Каирскую графическую библиотеку (https://www.cairographics.org/) и в настоящее время получаю экспорт своего приложения с разрешением 8 бит на канал с помощью следующей функции:

Код: Выделить всё

// Write pixel 8-bit
PF_Pixel* sampleIntegral8(PF_EffectWorld& def, int x, int y) {
return (PF_Pixel*)((char*)def.data +
(y * def.rowbytes) +
(x * sizeof(PF_Pixel)));
}

PF_Err cairoCopy8(void* refcon, A_long threadInd, A_long itemNum,
A_long iterTotal)
{
cairoRefcon* data = (cairoRefcon*)refcon;
int i = itemNum;
PF_Err err = PF_Err_NONE;
uint32_t* rowP;
PF_Pixel8* worldPtr = sampleIntegral8(data->output, 0, i);
rowP = (uint32_t*)(data->data + i * data->stride);
for (int x = 0; x < data->output.width; x++) {
worldPtr->alpha = rowP[x] >> 24;
if (worldPtr->alpha)
{
float rf = A_u_char(rowP[x] >> 16) / (float)worldPtr->alpha;
float gf = A_u_char(rowP[x] >> 8) / (float)worldPtr->alpha;
float bf = A_u_char(rowP[x] >> 0) / (float)worldPtr->alpha;
worldPtr->red = A_u_char(rf * PF_MAX_CHAN8);
worldPtr->green = A_u_char(gf * PF_MAX_CHAN8);
worldPtr->blue = A_u_char(bf * PF_MAX_CHAN8);
}
worldPtr++;
}

return err;
}
Это взято из примера, расположенного здесь: https://github.com/nithishakumar/Patter ... ttern.cppЯ попытался адаптировать этот код для экспорта в 16-битном формате (мои расчеты должны быть правильно выполнены в 16-битном формате), используя следующий код:

Код: Выделить всё

PF_Pixel16* sampleIntegral16(PF_EffectWorld& def, int x, int y) {
return (PF_Pixel16*)((char*)def.data +
(y * def.rowbytes) +
(x * sizeof(PF_Pixel16)));
}

PF_Err cairoCopy16(void* refcon, A_long threadInd, A_long itemNum,
A_long iterTotal)
{
cairoRefcon* data = (cairoRefcon*)refcon;
int i = itemNum;
PF_Err err = PF_Err_NONE;
uint32_t* rowP;
PF_Pixel16* worldPtr = sampleIntegral16(data->output, 0, i);
rowP = (uint32_t*)(data->data + i * data->stride);
for (int x = 0; x < data->output.width; x++) {
worldPtr->alpha = rowP[x] >> 24;
if (worldPtr->alpha)
{
float rf = A_u_char(rowP[x] >> 16) / (float)worldPtr->alpha;
float gf = A_u_char(rowP[x] >> 8) / (float)worldPtr->alpha;
float bf = A_u_char(rowP[x] >> 0) / (float)worldPtr->alpha;
worldPtr->red = A_u_char(rf * PF_MAX_CHAN16);
worldPtr->green = A_u_char(gf * PF_MAX_CHAN16);
worldPtr->blue = A_u_char(bf * PF_MAX_CHAN16);
}
worldPtr++;
}

return err;
}
Однако это не работает. Я подозреваю, что это потому, что он требует другого битового сдвига, чем 8-битный, но я просто не понимаю битового сдвига. Возможно, это не так.
Может ли кто-нибудь помочь мне понять, что не так, и помочь мне заставить эту 8-битную функцию работать для 16-битной?
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/791 ... color-mode
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»