UTFT - возможный косяк drawLine?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Короче: долгое время пользую UTFT, и вроде как особо нареканий никаких не было, до сегодняшнего дня. Пишу сюда, чтобы поспрошать - может, кто сталкивался с таким же поведением, а то у мну ощущение, что лыжи просто не едут.

Итак: создаём массив из 199 записей, по этому массиву по простому алгоритму рассчитываются координаты точек для отрисовки графика, используя вызовы drawLine. Рассчитываем точки, рисуем - всё зашибись.

Добавляем в массив ещё одну запись, чтобы было 200. Масштаб графика при этом мельчает до такого состояния, что в просчитанных вызовах drawLine попадаются уже коротенькие горизонтальные или вертикальные линии длиной буквально в один пиксель (вопросы оптимизации отрисовки пока не рассматриваем).

И... UTFT натурально рвёт крышу: график из 200 линий она рисует отрывками, при этом после отрисовки, если спустя пару секунд сделать заливку экрана - авотхер, на экране остаётся рванина. Если повторно вызвать отрисовку с этими же точками - эта тварь отрисовывает нормально, и заливка экрана через пару секунд тоже отрабатывает. И так - как по писаному: КАЖДЫЙ второй вызов отрисовывает нормально, нечётные вызовы - рванина и неотрабатывание fillScr, print и т.д., до нового вызова отрисовки массива с точками по ровно тем же координатам. 

Что самое интересное - если тупо заменить drawLine на fillRect (параметры вызова те же, чтобы быстро проверить методом исключения, короче) - то эта дрянь глючить перестаёт.

Может, кто сталкивался с подобным, и в где-то в кишочках drawLine есть косяк? Других объяснений я пока не нахожу, от слова "совсем", т.к. глючит только отрисовка, и именно при переходе какой-то границы масштаба.

Быстро выкусить из рабочего проекта тестовый пример я не могу, да и не уверен, что нет зависимостей ещё и с контроллером дисплея, но математические вводные крайне просты:

1. Поле отрисовки: 150х100 (X,Y);

2. Исходный список: 200 записей, вида 0,1,3,6,10,... (т.е. интервалы между соседними записями - увеличиваются на единицу);

3. Максимальный интервал между двумя записями - это 0% по оси Y, минимальный - 100% по оси Y (от стартовой координаты Y-оси на экране, ессно);

4. N интервалов между записями надо растащить при отрисовке на M точек по X.

Т.е. набор операций, по сути, тривиален: ищем максимальный интервал в списке, от него рассчитываем текущую координату по Y, координату по X при каждой итерации смещаем на нужный шаг (возможно дробный, просто округляем до целого после расчётов). Ну и рисуем линии по уже рассчитанным координатам, от первой координаты - до второй, от второй - до третьей и т.д.

Такие дела, други. Всё, что меньше 200 - рисуется без вопросов, и чётное кол-во, и нечётное. Всё, что больше 199 - косяк. Оперативки - вагон, дело точно не в ней (не займут 200 точек 30 килобайт, как ни старайся).

Короче - а вдруг кто с таким сталкивался? По предварительным признакам - уж очень похоже на косяк в UTFT. Но не факт, конечно, всякое бывает (однако замена на fillRect какбэ уже намекает, что в той консерватории какая-то скрипка может и лажать).

Всем бобра. И буду признателен, если кто подтвердит, что лыжи - едущие не всегда, и косяк таки не на мне :)

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Решено: UTFT сносит крышу, когда вызываешь отрисовку линии с одинаковыми начальными и конечными координатами, например:

utft.drawLine(5,10,5,10);

Будем бдительнее теперь :)

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan пишет:

Решено: UTFT сносит крышу, когда вызываешь отрисовку линии с одинаковыми начальными и конечными координатами

наверно там в коде где-то есть деление на длину отрезка...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

DIYMan пишет:

Решено: UTFT сносит крышу, когда вызываешь отрисовку линии с одинаковыми начальными и конечными координатами

наверно там в коде где-то есть деление на длину отрезка...

Да хз, сходу не находится. Выяснил эмпирическим путём только, первое условие в drawLine такое:

if (y1==y2)
		drawHLine(x1, y1, x2-x1);

Идём в drawHLine, по вводным, очевидно, x2-x1 == 0, т.к. мы вызываем с одинаковыми координатами, например, drawLine(50,100,50,100). В drawHLine такое (параметр l == 0):

void UTFT::drawHLine(int x, int y, int l)
{
	if (l<0)
	{
		l = -l;
		x -= l;
	}
	cbi(P_CS, B_CS);
	setXY(x, y, x+l, y);
	if (display_transfer_mode == 16)
	{
		//sbi(P_RS, B_RS);
		_fast_fill_16(fch,fcl,l);
	}
	else if ((display_transfer_mode==8) and (fch==fcl))
	{
		//sbi(P_RS, B_RS);
		_fast_fill_8(fch,l);
	}
	else
	{
		for (int i=0; i<l+1; i++)
		{
			LCD_Write_DATA(fch, fcl);
		}
	}
	sbi(P_CS, B_CS);
	clrXY();
}

Вроде как проблема либо в setXY, либо в _fast_fill_16, либо в _fast_fill_8. Дальше рыть пока лень :))