powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / разбор кода
25 сообщений из 26, страница 1 из 2
разбор кода
    #39478764
burrunduk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, помогите пожалуйста разобраться с кодом, я новичок в с++ поэтому не до конца все понимаю. Данная функция реализует работу с буфером изображения. Сколько цветов имеет изображение, какова его ширина в пикселях. Я не могу понять действия после условия.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void buf_setpixel(int x, int y, int c)
{
unsigned char mask;
mask= 0x80>>(x&7);
if (c)
*(Buff+x/8+y*VERTEX_width) |=mask;
else
*(Buff+x/8+y*VERTEX_width) &=~mask;
...
Рейтинг: 0 / 0
разбор кода
    #39478766
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burrundukСколько цветов имеет изображениемогу ошибаться, но вроде 2
burrundukкакова его ширина в пикселяхVERTEX_width * 8 точек
burrundukЯ не могу понять действия после условия.
для начала вот эта строчка:
Код: plaintext
1.
mask= 0x80>>(x&7);


если её расписать по битам, это 10000000
x&7 - это отсечение х, если оно больше семи (т.е. тут надо заметить, что 7 это 111, и поэтому x&7 сработает)
после того, как разобрались с x, мы двигаем 10000000 вправо, т.е. это, получается, координата х картинки шириной в 8 пикселов. Если, например, х = 2, то будет 00100000.
Далее, с - признак того, ставим мы точку или стираем.
условие if(c) будет true если с != 0. Возможно логичнее было бы объявить параметр функции как bool c, но фиг знает...
x/8 - сдвиг в Buff с учётом того, что в x передаётся координата в битах. Соответственно, в байтах будет x/8
y*VERTEX_width - сдвиг в Buff с учётом координаты y. Т.е. одна строка картинки - VERTEX_width байт.
* - получение переменной (куска памяти) по указателю Buff
|= mask - битовое сложение(логическое ИЛИ) с mask. Т.е. если в *(Buff+x/8+y*VERTEX_width) было 00000100, а в mask 00100000, то результатом будет 00100100
&=~mask инвертирование маски и умножение (логическое И) т.е. если *(Buff+x/8+y*VERTEX_width) было 10101010, а в mask 00100000, то ~mask = 11011111, а результат будет 10001010
...
Рейтинг: 0 / 0
разбор кода
    #39478770
burrunduk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMbVERTEX_width * 8 точек
почему? чет не допер
...
Рейтинг: 0 / 0
разбор кода
    #39478781
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burrundukпочему? чет не допер
y умножается на VERTEX_width - т.е. VERTEX_width это число байт на одну строчку картинки, ок?
далее, в по x&7 шифтом двигается 1 бит (в 0x80) чтобы получить позицию точки внутри байта. Т.е. получается 8 точек на байт. Итого VERTEX_width * 8 - ширина всей картинки.
х - это (в общем случае) 32 битное целое. Первые 29 битов (x/8) - это позиция точки(байта) в буфере, последние 3 бита(x&7) - позиция точки в байте.
...
Рейтинг: 0 / 0
разбор кода
    #39478786
burrunduk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMb,

а цвет же задается с помощью mask как я понял?
если да то почему 2 цвета?
...
Рейтинг: 0 / 0
разбор кода
    #39478897
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burrundukа цвет же задается с помощью mask как я понял?
если да то почему 2 цвета?цвет задаётся с помощью третьего параметра функции - c
два цвета, в смысле: есть точка, нет точки.
условие if(c) как раз или ставит точку, если c не равно нулю, или убирает точку, если с == 0
mask задаёт позицию точки (бит) в байте
...
Рейтинг: 0 / 0
разбор кода
    #39478898
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burrundukCEMb,

а цвет же задается с помощью mask как я понял?
если да то почему 2 цвета?
не заморачивайся по этой древности
скорее всего это у тебя исходники от драйвера к 16-цветной VGA 640*480, выводимый пиксель задаётся битом, цвет скидывается отдельно, через что уже не помню
...
Рейтинг: 0 / 0
разбор кода
    #39478906
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)не заморачивайся по этой древности
монохромные изображения уже отменили?
...
Рейтинг: 0 / 0
разбор кода
    #39478916
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилkealon(Ruslan)не заморачивайся по этой древности
монохромные изображения уже отменили?
нет, точно так же как это может быть и палитра на два цвета
но скорее всего это VGA буфер, вот такая вот аппаратная магия
...
Рейтинг: 0 / 0
разбор кода
    #39478930
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)но скорее всего это VGA буфер, вот такая вот аппаратная магия
нет разницы буфер в памяти или в VGA адаптере.
какая ещё аппаратная магия - какой ещё разумный способ установки бита в в двумерном битовом массиве?

PS VERTEX_width - странный идентификатор, обычно stride или pitch употребляются.
...
Рейтинг: 0 / 0
разбор кода
    #39478946
burrunduk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)burrundukCEMb,

а цвет же задается с помощью mask как я понял?
если да то почему 2 цвета?
не заморачивайся по этой древности
скорее всего это у тебя исходники от драйвера к 16-цветной VGA 640*480, выводимый пиксель задаётся битом, цвет скидывается отдельно, через что уже не помню

так дело в том что сказали именно эту функцию посмотреть и разобраться что к чему) спасибо всем)
...
Рейтинг: 0 / 0
разбор кода
    #39478955
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилPS VERTEX_width - странный идентификаторда уж... векторами пахнет о_О
Вертекс, вообще говоря - точка. Ширина точки... о_О или я что-то не так понял?...
...
Рейтинг: 0 / 0
разбор кода
    #39479133
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилкакая ещё аппаратная магия - какой ещё разумный способ установки бита в в двумерном битовом массиве?
выставляешь бит, а в самом адаптере меняется цвет изменённых пикселей на указанный в регистре - вот такая вот магия

PS: я думаю вопрос бы разрешил код getpixel ...
...
Рейтинг: 0 / 0
разбор кода
    #39479138
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbИзопропилPS VERTEX_width - странный идентификаторда уж... векторами пахнет о_О
Вертекс, вообще говоря - точка. Ширина точки... о_О или я что-то не так понял?...
гугл говорит, что Java-кодеры использовали этот идентификатор в качестве stride

kealon(Ruslan)PS: я думаю вопрос бы разрешил код getpixel ...
его тоже кто-то написать должен
...
Рейтинг: 0 / 0
разбор кода
    #39479174
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилkealon(Ruslan)PS: я думаю вопрос бы разрешил код getpixel ...
его тоже кто-то написать должен
логика подсказывает, что надо поискать там же откуда buf_setpixel
...
Рейтинг: 0 / 0
разбор кода
    #39479183
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

готов принять гипотезу о VGA-адаптере,
но не вижу отличий от работы с монохромной текстурой в памяти(которую в последующем можно покрасить в пару цветов)
...
Рейтинг: 0 / 0
разбор кода
    #39479186
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У VGA - кучка извратных режимов для работы с четырьмя плоскостями.
Причина извратов - настоятельная потребность уместить кадровый буфер в 64Кб. Максимум - в 128Кб.

P.S. LFB у VGA тоже был, но штатно это 320x200x256 (байт на пиксель).
...
Рейтинг: 0 / 0
разбор кода
    #39479325
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovУ VGA - кучка извратных режимов для работы с четырьмя плоскостями.Это было не в VGA, а в EGA.

Basil A. SidorovP.S. LFB у VGA тоже был, но штатно это 320x200x256 (байт на пиксель).Это как раз единственный собственный режим VGA. Все остальные - унасаледованы от текстовых дисплеев, CGA и EGA.

А с чего это вы вспомонили о древнем железе?
...
Рейтинг: 0 / 0
разбор кода
    #39479401
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилгугл говорит, что Java-кодеры использовали этот идентификатор в качестве strideа что такое stride? Что-то гугл мне не помог :(

Кстати, я тут припоминаю: маска в иконках делается ровно такой вот побитовой монохромной картинкой. Там как раз две битмапы, одна цветная, другая точечная. В своё время делал парсер инфы из иконок и курсоров.
В век 32-битных картинок с альфой про это уже никто просто не помнит
...
Рейтинг: 0 / 0
разбор кода
    #39479458
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

полноценные многомерные массивы и вырезки из них остались нынче только в фортране....

stride можно найти в std::valarray (точнее - std::slice, std::gslice )
http://www.cplusplus.com/reference/valarray/gslice/
...
Рейтинг: 0 / 0
разбор кода
    #39479466
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbВ век 32-битных картинок с альфой про это уже никто просто не помнит

монохромные изображения никуда не делись

32-битные картинки с альфой - тож разные бывают
разрядность каналов не обязана быть одинаковой для всех каналов
GL_RGBA8 - да - это типовой случай - по 8 бит на канал
но есть ещё GL_RGB10_A2 - по 10 бит на RGB и 2 бита на альфу
и GL_RGB5_A1 - по 5 бит на канал и 1 бит на альфу
...
Рейтинг: 0 / 0
разбор кода
    #39479826
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЭто было не в VGA, а в EGAЭто было у обоих. Причём у VGA были дополнительные извраты, которых не было у EGA.
...
Рейтинг: 0 / 0
разбор кода
    #39479908
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovWhite OwlЭто было не в VGA, а в EGAЭто было у обоих. Причём у VGA были дополнительные извраты, которых не было у EGA.VGA полностью обратно совместим с EGA. Единственным новшеством в VGA был 256-и цветный режим с размером экрана 320*200. Все остальные режимы унаследованы. 16-и цветные от EGA и 4-х цветные от CGA.
После VGA, было изобретено несколько дестяков вариантов SVGA и XVGA. Но примерно в то-же время наконец вышли Window95 и OS/2 которые ввели в обиход понятие "видео драйверов" и больше с железом напрямую никто не работал (ну кроме тех кто пишет эти драйвера).
...
Рейтинг: 0 / 0
разбор кода
    #39479914
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕдинственным новшеством в VGA был 256-и цветный режим с размером экрана 320*200У меня есть печатное издание актуальных годов и я могу обоснованно утверждать, что вы ошибаетесь.
В частности, кроме физических различий, появились и дополнительные регистры и дополнительные "плоскостные" режимы, программируемые этими самыми регистрами.

P.S. "Физичиеские различия": аналоговый выходной сигнал, 720 точек по горизонтали и 400/480 - по вертикали, другие частоты развёрток.
...
Рейтинг: 0 / 0
разбор кода
    #39480053
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovWhite OwlЕдинственным новшеством в VGA был 256-и цветный режим с размером экрана 320*200У меня есть печатное издание актуальных годов и я могу обоснованно утверждать, что вы ошибаетесь.А у меня есть личный опыт работы на CGA, EGA и VGA тех годов. А вот печатные издания не выжили.... Впрочем, они никогда не были главным источником знаний по низкоуровневой работе с железом. В те времена была более актуальна база знаний Ральфа Брауна. Клиент к ней садился резидентом и вызвался по хот-кею.
Дай угадаю, у тебя книжка Фролова? :) Он довольно много написал и наиздавал в 90-х, но его книги никогда не пользовались успехом - слишком уж он в них скакал галопом по европам и вместо настоящих справочников и/или учебников писал научпоп.

Basil A. SidorovВ частности, кроме физических различий, появились и дополнительные регистры и дополнительные "плоскостные" режимы, программируемые этими самыми регистрами.Увы, но это уже расширения для оригинального VGA, так называемые SVGA. Единственный плоскостной режим был режим номер 13h.

Basil A. SidorovP.S. "Физичиеские различия": аналоговый выходной сигнал, 720 точек по горизонтали и 400/480 - по вертикали, другие частоты развёрток.Да, в принципе можно было загнать видео-карту в такие режимы, но в том-то и дело, что это уже "extended" режимы. Они существовали за счет того что сама IBM (которая изобрела и стандартизировала VGA) самостоятельно изготовила не так уж много плат. В основном их производили разные другие компании по лицензии от IBM (а иногда и без лицензии). И эти режимы не были официальными, никто не гарантировал что клиентская машина включится в таком режиме и сможет работать не сжигая видео-плату и/или монитор.
Настройку расширений придумали намного позже...
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / разбор кода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]