Приведение массива к двумерному
Jan. 23rd, 2018 05:38 pmТупняка псот.
Встала задача "по быстрому" сделать вывод изображений и текста на экранчик через фреймбуффер на Beaglebone. Всё без сторонних либ (тюкю сборка rootfs будет своя, да и просто понять как это работает на нулевом уровне). Для тех кто в танке, считайте что у меня просто одномерный массив (байтов, шортов или 32-х разрядный) размером 1024х768 (или другие разрешения) в который я пишу и получаю изображение на экране. Первая и главная задача - это выводить текст. Да не по горизонтали, а вертикальный текст (имею в виду чтобы дисплей расположен был вертикально. Горизонтально удалось, а вот вертикально уже затупил.

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

Указатель на массив выглядит как:
Вопрос совсем тупой: как преобразовать этот массив к виду arra[1024][768] (или другим разрешениям, они могут быть разные)? Чтобы можно было поставить точку там где ты хочешь? А то в уме уже начинаю путаться, уже второй день туплю.
Так же картинки. Как в старые добрые времена ДОС. Научился выводить pgm изображение, но нужен цвет. Либо преобразованное изображение с помощью программы LCD Image Converter. А вот решил bmp запилить побырому, чтобы можно было подложку менять. Взял примерчик отсюда . Сделал файлик test.bmp 1024x768 16bit

Получаю ссылку на битмам. Копирую её и получаю странный кал.

Цвета побиты, вместо одного сердца - тьма сердечек. Может я чего-то не понимаю? Кто делал, подскажите. Может у кого есть лёгкий пример, как выудить bitmap из bmp-файла. Спасибо!
Встала задача "по быстрому" сделать вывод изображений и текста на экранчик через фреймбуффер на Beaglebone. Всё без сторонних либ (тюкю сборка rootfs будет своя, да и просто понять как это работает на нулевом уровне). Для тех кто в танке, считайте что у меня просто одномерный массив (байтов, шортов или 32-х разрядный) размером 1024х768 (или другие разрешения) в который я пишу и получаю изображение на экране. Первая и главная задача - это выводить текст. Да не по горизонтали, а вертикальный текст (имею в виду чтобы дисплей расположен был вертикально. Горизонтально удалось, а вот вертикально уже затупил.

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

Указатель на массив выглядит как:
static uint16_t *fbp = 0;
Вопрос совсем тупой: как преобразовать этот массив к виду arra[1024][768] (или другим разрешениям, они могут быть разные)? Чтобы можно было поставить точку там где ты хочешь? А то в уме уже начинаю путаться, уже второй день туплю.
Так же картинки. Как в старые добрые времена ДОС. Научился выводить pgm изображение, но нужен цвет. Либо преобразованное изображение с помощью программы LCD Image Converter. А вот решил bmp запилить побырому, чтобы можно было подложку менять. Взял примерчик отсюда . Сделал файлик test.bmp 1024x768 16bit

Получаю ссылку на битмам. Копирую её и получаю странный кал.

Цвета побиты, вместо одного сердца - тьма сердечек. Может я чего-то не понимаю? Кто делал, подскажите. Может у кого есть лёгкий пример, как выудить bitmap из bmp-файла. Спасибо!
no subject
Date: 2018-01-23 03:18 pm (UTC)Непонятно зачем преобразовывать массив если можно преобразовать координаты в индекс?
i = y * 1024 + x;no subject
Date: 2018-01-23 04:18 pm (UTC)https://askubuntu.com/questions/237963/how-do-i-rotate-my-display-when-not-using-an-x-server
Пусть система решает предъявленную задачу. А у самого голова не болит.
no subject
Date: 2018-01-23 06:11 pm (UTC)no subject
Date: 2018-01-23 06:21 pm (UTC)no subject
Date: 2018-01-25 08:58 am (UTC)no subject
Date: 2018-01-23 04:27 pm (UTC)Но на мой взгляд правильнее описать, как сказано комментарием выше. Твой подход не то, что прямо говнокод, просто так не принято.
no subject
Date: 2018-01-23 04:39 pm (UTC)no subject
Date: 2018-01-23 04:42 pm (UTC)no subject
Date: 2018-01-23 04:43 pm (UTC)P.S.
Да, важность #pragma pack необходимость анализа заголовка конечно не отменяет.
no subject
Date: 2018-01-23 04:47 pm (UTC)no subject
Date: 2018-01-23 04:51 pm (UTC)https://en.wikipedia.org/wiki/BMP_file_format
Или ее же, но по русски. BMP файл это не только массив данных о пикселях. Как, собственно и область данных фреймбуфера.
no subject
Date: 2018-01-23 04:52 pm (UTC)no subject
Date: 2018-01-23 04:57 pm (UTC)no subject
Date: 2018-01-23 05:01 pm (UTC)no subject
Date: 2018-01-23 04:55 pm (UTC)Область данных фреймбуфера содержит битмаповский заголовок? Ты сделал мой день!
no subject
Date: 2018-01-23 05:01 pm (UTC)И зачем же нужна эта структура? И самое главное, разве она не имеет наипрямейшего отношения к области данных фреймбуфера?
no subject
Date: 2018-01-23 05:09 pm (UTC)no subject
Date: 2018-01-23 05:25 pm (UTC)struct fb_var_screeninfo - собственно он. Не имея его оперировать областью данных неразумно. Ибо даже разрешение неизвестно.
no subject
Date: 2018-01-23 05:39 pm (UTC)_Область данных_ фреймбуфера в общем случае это видеопамять, нет там заголовков никаких, уж тем более битмаповских :)))
no subject
Date: 2018-01-23 05:46 pm (UTC)no subject
Date: 2018-01-23 04:56 pm (UTC)no subject
Date: 2018-01-23 05:05 pm (UTC)Перечитал. Или туп как дерево, или меня обвиняют не в тех грехах ;-)
Взял битмап. Было, сконвертировал как понял - было, вывел и получил лажу - было. При этом лажа по внешнему виду как раз напоминает неправильный разбор колор мапа. И где ошибка?
no subject
Date: 2018-01-23 05:12 pm (UTC)>Вопрос совсем тупой: как преобразовать этот массив к виду arra[1024][768] (или другим разрешениям, они могут быть разные)? Чтобы можно было поставить точку там где ты хочешь? А то в уме уже начинаю путаться, уже второй день туплю.
Про конверсию битмапов я вообще ничего не писал.
no subject
Date: 2018-01-23 05:19 pm (UTC)пойти в мордорсделать приведение в типу uint16_t**, uint32_t** или uint8_t**. Надо читать входные данные, анализировать колор мап, преобразовывать и писать в массив. А для вывода наоборот. Либо подбирать такой формат картинки, который бы в точности повторял формат фреймбуфера. И только-то.Так что это не я не понимаю, как работает фреймбуфер. А читал да. Не внимательно. Признаю. Исправлюсь. А в целом - да повернуть fbcon и не париться. В ядре неплохо оптимизированы функции поворота. Не идеально, но весьма неплохо.
no subject
Date: 2018-01-23 05:36 pm (UTC)no subject
Date: 2018-01-23 05:51 pm (UTC)__u32 xres; /* visible resolution */
__u32 yres;
__u32 xres_virtual; /* virtual resolution */
__u32 yres_virtual;
__u32 xoffset; /* offset from virtual to visible */
__u32 yoffset; /* resolution */
__u32 bits_per_pixel; /* guess what */
из fix_screeninfo или их аналоги из заголовка битмапа. Иначе все бесполезно. Не надо меня тролить. Не люблю. Мы в двух параллельных ветках говорим об дном и том же. И тут размер массива будет xres*yres, а xres_virtual*yres_virtual. Что частенько совсем не одно и то же. А без bits_per_pixel мы не узнаем размер элемента массива. И только после этого стоит вспомнить о pragma pack. Правда к этому моменту выяснится, что _virtual как раз и нужен для выравнивания, а потому pack по сути ничего не изменит. И ровно аналогично при разборе битмапа. Там все те же поля, но по другому названные.
no subject
Date: 2018-01-23 05:54 pm (UTC)no subject
Date: 2018-01-23 05:55 pm (UTC)no subject
Date: 2018-01-23 05:59 pm (UTC)no subject
Date: 2018-01-23 06:11 pm (UTC)no subject
Date: 2018-01-23 06:19 pm (UTC)Что до физического устройства - так не только простых 16-и битных. Есть странные варианты типа RGB 5:5:5, или 32-х битные с альфа-каналом (который на самом деле яркостный) и все они хранятся так же. И отличаются только колор мапом и полем bits_per_pixel.
no subject
Date: 2018-01-23 05:46 pm (UTC)no subject
Date: 2018-01-23 04:50 pm (UTC)no subject
Date: 2018-01-23 05:48 pm (UTC)no subject
Date: 2018-01-23 05:51 pm (UTC)Но в твоем случае лучше делать как в первом комментарии.
no subject
Date: 2018-01-23 05:53 pm (UTC)no subject
Date: 2018-01-23 05:57 pm (UTC)typedef struct {
uint16_t a[1024][768]
} FB_ARRAY
#pragma pack(pop)
FB_ARRAY* fba = (FB_ARRAY*)(0x12345678)
fba->a[10][20] = 30;
но так делать не стоит :)
no subject
Date: 2018-01-23 06:00 pm (UTC)no subject
Date: 2018-02-02 07:57 am (UTC)в реалиях gcc/clang лучше использовать __attribute((packed)). Тогда не остаётся шансов забыть pack(pop).
no subject
Date: 2018-02-02 08:10 am (UTC)Я как-то забыл и микроконтроллерный код вырос раза в два. Но когда структур 5-6 тупо писать лень. Сам себя по рукам ведь бить не будешь, хех.
no subject
Date: 2018-02-02 08:32 am (UTC)Ещё в инсте чел из Транзаса рассказывая про прагмы, рассказал кулстори как уволил нахрен чела, который забыл такой pragma pack закрыть из-за чего куча народу кучу времени ловила абсолютно странные баги в странных местах.
no subject
Date: 2018-02-02 08:52 am (UTC)А если пошло багами - дело не в прагме, а в говнокоде. Так что там всех уволить надо :)
no subject
Date: 2018-02-02 09:56 am (UTC)А насчёт уволить за говнокод - тогда можно вообще всех программистов увольнять :)
no subject
Date: 2018-02-02 10:37 am (UTC)no subject
Date: 2018-02-02 11:30 am (UTC)no subject
Date: 2018-02-02 12:22 pm (UTC)