Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
880 / 583 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
1

AlphaBlend() & BLENDFUNCTION: какой функционал был убран из документации? Почему? Работает ли он сегодня?

17.01.2020, 23:00. Показов 787. Ответов 2

Есть такая структура: BLENDFUNCTION(ru)
  • Со вторым полем, BlendFlags - всё чётко и понятно:
    Must be zero.
    Должно быть строго равно нулю. Хорошо, будет сделано. Хотя я никогда не понимал зачем так делать - объявлять что-то без функциональности, а потом требовать строгого фиксированного значения...
  • С третьим полем, SourceConstantAlpha - тоже описано всё чётко и ясно, хоть и много текста.
  • А вот первое поле, BlendOp - описано как:
    Currently, the only source and destination blend operation that has been defined is AC_SRC_OVER.
    То есть "в настоящее время единственный возможное значение" AC_SRC_OVER, которое по факту равно нулю. И почему же так странно сформулировано? Почему не написали так же как было у второго поля: "должно быть строго равно нулю"?
  • И последнее поле, AlphaFormat - сформулировано ещё веселее:
    AlphaFormat has the following value.
    { таблица из одной единственной строки }
    То есть "оно имеет вот такое вот значение". Не "должно быть таким", не "может быть такими-то", а просто "имеет значение". И в виде таблицы показан единственный вариант - AC_SRC_ALPHA (который по факту равен единице).
Хотелось бы восстановить пробелы в информации. Вдруг кто-то что-то помнит/знает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2020, 23:00
Ответы с готовыми решениями:

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

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration?
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp; outs, const...

почему не работает скрипт в Chrome & Firefox'e
Прошу помочь разобраться почему не работает скрипт в хроме и файерфоксе ( не происходит переход со...

query='SELECT * FROM resume WHERE ' & ''' & RecSet('place')& ''' & '=' & '''& s_loc &''' & - что не так?
упростил для краткости запрос. в чем ошибка? RecSet - это коннекшн. query='SELECT * FROM resume...

2
880 / 583 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
17.01.2020, 23:02  [ТС] 2
Окей, про первое поле мы можем предположить, что в какой-то период времени, либо были другие варианты, либо их планировалось ввести. Но давайте вчитаемся в "Remarks", и найдём ещё странностей:
  • When the BlendOp member is AC_SRC_OVER, the source bitmap is placed over the destination bitmap based on the alpha values of the source pixels.
    Дак написали же что AC_SRC_OVER это единственное возможное значение BlendOp! Что тогда значит "когда BlendOp равно AC_SRC_OVER"? Оно ж всегда ему равно!
    Кстати, даже если закрыть глаза на формулировку - данное утверждение просто-напросто не верно: будет ли операция "базироваться на alpha от source pixels" или нет - зависит от совершенно другого поля.
  • When the AlphaFormat member is AC_SRC_ALPHA, the source bitmap must be 32 bpp. If it is not, the AlphaBlend function will fail.
    А разве выше не было сказано что AlphaFormat просто "имеет значение" AC_SRC_ALPHA? И никаких других вариантов не указано и не упомянуто? Значит оно всё же может иметь другие значения? Какие? Почему об них вообще ни слова? Но всё же тут можно догадаться, хотя бы по "..this flag.." и "..is not set.." - AlphaFormat это оказывается не "просто константа", а набор флагов. Но тогда наверное не "когда AlphaFormat равен AC_SRC_ALPHA", а "когда установлен флаг"?
    А какие особенности если он не установлен? Есть ли ещё какие-то возможные флаги?
Документация словно не полная. Где-то можно взять более старые версии документации MSDN? Сравнить бы хотелось...
0
880 / 583 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
18.01.2020, 00:57  [ТС] 3
В текущих версиях VC++ объявлено:
C++
1
2
3
4
// currentlly defined blend function
#define AC_SRC_OVER                 0x00
// alpha format flags
#define AC_SRC_ALPHA                0x01
И всё. Больше ничего.
А в текущих версиях Делфи это же самое описывается как:
Delphi
1
2
3
4
5
6
7
8
9
const
  { currentlly defined blend function }
  AC_SRC_OVER             = $00;
  AC_SRC_ALPHA            = $01;
  { alpha format flags }
  AC_SRC_NO_PREMULT_ALPHA = $01;
  AC_SRC_NO_ALPHA         = $02;
  AC_DST_NO_PREMULT_ALPHA = $10;
  AC_DST_NO_ALPHA         = $20;
Но если покопаться в Гугле... Вероятно в каких-то старых версиях VC++ было вот так:
C++
1
2
3
4
5
6
7
// currentlly defined blend function
#define AC_SRC_OVER                 0x00
// alpha format flags
#define AC_SRC_NO_PREMULT_ALPHA     0x01
#define AC_SRC_NO_ALPHA             0x02
#define AC_DST_NO_PREMULT_ALPHA     0x10
#define AC_DST_NO_ALPHA             0x20
А никаких AC_SRC_ALPHA раньше как раз не существовало.

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

Учитывая что все флаги с именами вида AC_*_NO_* просто пропали, а значения пропавшего AC_SRC_NO_PREMULT_ALPHA и появившегося AC_SRC_ALPHA одинаковы...
...могу предположить, что AC_SRC_NO_PREMULT_ALPHA был переименован в AC_SRC_ALPHA, а остальные три флага объявлены как deprecated и убраны из заголовочных файлов.

На каких версиях ОС/API официально присутствовали и работали эти флаги? Что именно они делали? И работает ли это до сих пор?
Особенно любопытно наличие/отсутствие подстроки "PREMULT" во флагах...

Как опознать когда оно изначально появилось и когда оно изменялось? Я пока смог раскопать только такую цитату:
Параметр AC_SRC_NO_PREMULT_ALPHA не описан в MSDN за январь 2000 года и найден экспериментально
При его задании используется альфа-канал растра источника и не используется альфа-канал приемника
Добавлено через 1 час 35 минут
Old constant nameValueNew name
AC_SRC_NO_PREMULT_ALPHA
DecimalHex C++Hex PascalHex Visual Basic
10x01$01&H1
AC_SRC_ALPHA
AC_SRC_NO_ALPHA
DecimalHex C++Hex PascalHex Visual Basic
20x02$02&H2
*deprecated*
AC_DST_NO_PREMULT_ALPHA
DecimalHex C++Hex PascalHex Visual Basic
160x10$10&H10
*deprecated*
AC_DST_NO_ALPHA
DecimalHex C++Hex PascalHex Visual Basic
320x20$20&H20
*deprecated*

Добавлено через 16 минут
Итак, на данный момент известно:
BlendOpBlendFlagsSourceConstantAlphaAlphaFormat
Old headers:
Возможные значения:
AC_SRC_OVER
Возможные значения:
0
Целое число от 0 до 255*A combination (???) of the following values:
Возможные флаги:Описание:
0No flags; ???
AC_SRC_NO_PREMULT_ALPHA???
AC_SRC_NO_ALPHA???
AC_DST_NO_PREMULT_ALPHA???
AC_DST_NO_ALPHA???
New headers:
Возможные значения:
AC_SRC_OVER
Возможные значения:
0
Целое число от 0 до 255*A combination (zero or more) of the following values:
Возможные флаги:Описание:
0No flags; Изображение может быть не 32-битным; ???
AC_SRC_ALPHAНакладываем строго 32-битное изображение; ???

*) Если вы выводите полупрозрачное изображение, то есть "с попиксельной альфой", то есть "как полупрозрачные PNG-картинки" - тогда SourceConstantAlpha рекомендуется устанавливать только в 255.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2020, 00:57

Помощь в написании контрольных, курсовых и дипломных работ здесь.

K&R задание 1.9 Решение с использованием символьного массива, почему не работает?
Здравствуйте! Изучаю язык и азы программирования по книге Ритчи. В ней встречается такое задание....

Как узнать был сегодня бот на сайте или нет?
Как узнать был сегодня бот на сайте или нет? И сколько страниц проиндексировано за день.

Почему используется *& вместо простого указателя и как это работает?
может кто-нибудь объяснить почему используется *&amp; вместо простого указателя и как это работает?...

Какой софт использовать для документации проекта
Подскажите пожалуйста, пишу оконное приложение, с использованием СУБД Firebird, которое нужно...

Нужно кратенько ответить на билеты к пересдаче, кому не трудно, сегодня был экзамен и завалил !SOS!
нужно кратенько ответить на вопросы из билетов, сёгодня был экзамен, я завалил в эту пятницу...

нужно кратенько ответить на билеты к пересдаче, кому не трудно, сегодня был экзамен и завалил !SOS!
нужно кратенько ответить на вопросы из билетов, сёгодня был экзамен, я завалил в эту пятницу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.