67 lines
2.8 KiB
C
67 lines
2.8 KiB
C
|
// В файле 1.xpm должен быть определён рисунок с именем dummy
|
|||
|
// В нём — двухцветный рисунок, чёрная линия на любом (непрозрачном) фоне
|
|||
|
#define NAME dummy
|
|||
|
|
|||
|
#include "1.xpm"
|
|||
|
#include <stdint.h>
|
|||
|
#include <stdio.h>
|
|||
|
|
|||
|
#define MAX_W (1000)
|
|||
|
|
|||
|
uint16_t array[MAX_W];
|
|||
|
|
|||
|
|
|||
|
int parse_xpm(char** xpm, uint16_t *result)
|
|||
|
{
|
|||
|
int width=0, height=0, colors=0, syms_per_pixel=0;
|
|||
|
char black; // Сюда запомним, каким символом обозначается чёрный цвет (цвет линии)
|
|||
|
int color = 1; // 0 - чёрный цвет, а нам нужно его найти как раз. Поэтому инициализируем любым ненулевым значением
|
|||
|
int line = 0; // Текушая строка файла при его разборе
|
|||
|
|
|||
|
sscanf (xpm[line++], "%d%d%d%d", &width, &height, &colors, &syms_per_pixel); // читаем первую строку
|
|||
|
|
|||
|
// width = width<MAX_W ? width : MAX_W; // /Дли примера считаем, что в этом отношении файл корректен, но можно и передавать в функцию размер массива для оценки
|
|||
|
|
|||
|
if(colors != 2 || syms_per_pixel != 1) // если больше двух цветов или не один символ на элемент изображения (хм) — нафиг такое, лень парсить
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
while (color != 0 && line < colors+1) //Ищем чёрный цвет
|
|||
|
{
|
|||
|
sscanf(xpm[line++], "%c c #%x", &black, &color);
|
|||
|
}
|
|||
|
|
|||
|
if (color != 0) // Чёрный цвет не найден
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
for (; line < height; line++)
|
|||
|
{
|
|||
|
for (int pos = 0; pos < width ; pos ++)
|
|||
|
{
|
|||
|
if (NAME[line][pos] == black) // Как только на данной высоте наткнулись на чёрный цвет, тут же запоминаем высоту в массив; таким образом мы получаем форму сигнала,
|
|||
|
// снятую с нижней части чёрной линии на одноцветном фоне
|
|||
|
{
|
|||
|
array[pos] = height - line + 3; //+3, так как здесь у нас номер строки в файле, которая на три больше, чем номер строки в изображении (первые три строки - служебная информация: строка с размером и две строки с цветами)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return width;
|
|||
|
}
|
|||
|
|
|||
|
int main (int arc, char ** argv)
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
int width = parse_xpm(NAME, array);
|
|||
|
for (int i = 0; i < width; i++)
|
|||
|
{
|
|||
|
printf("%d ", array[i]);
|
|||
|
}
|
|||
|
putchar('\n');
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|