Page 1 of 1

Точные размеры окон

Posted: Mon Jan 16, 2006 5:27 pm
by diamond
Оказывается, когда при создании окна в функции 0 указываются (и заносятся во внутренние переменные ядра) размеры по осям x,y, реальные ширина и высота на один пиксель больше! (При этом код прорисовки рамки работает правильно). Это незаметно для обычных окон, но становится существенным для окон нестандартной формы. В документации по поводу функции 50 (установка нестандартной формы) сказано, что в данных 0 соответствует отсутствию пикселя, 1 соответствует наличию, прочие значения зарезервированы. Нетрудно догадаться, что имеется в виду двумерный массив, казалось бы, размеров xsize*ysize. Так вот, правильные размеры этого массива должны быть (xsize+1)>>scale * (ysize+1)>>scale, что совершенно нетривиально. Об этом есть комментарий в исходниках circle.asm, но до исходников нужно еще добраться и в документацию они не входят. Кстати, если xsize+1 не делится на 2^scale нацело, то будут глюки, на правой границе кусок формы окна будет браться с левой границы одним пикселем ниже.
Это же объясняет возвращаемое значение функции получения размеров desktop'а. В sysfuncr.txt по этому поводу сказано только, что "возвращаемое значение в eax" без пояснений по поводу формата этого значения. Конечно, по аналогии с другими функциями можно догадаться, что eax=xsize*65536+ysize, но при этом xsize,ysize - размеры окна desktop'a, которые на единицу меньше размеров всего рабочего стола.

Re: Точные размеры окон

Posted: Mon Jan 16, 2006 7:34 pm
by Violinier
diamond wrote:Так вот, правильные размеры этого массива должны быть (xsize+1)>>scale * (ysize+1)>>scale, что совершенно нетривиально.
А можно переписать эту формулу в нормальном виде?

Posted: Fri Jan 20, 2006 8:16 pm
by Mario79
diamond
Нумерация везде ведется от 0 до Nmax-1 (например, от 0 до 799), по этому вполне очевидно, что возвращаемое значение на 1 меньше. Возвращается то значение, с которым работает ядро.
Я так понимаю, ты исходил из расчета нумерации от 1 до Xmax. Но нуль в данном случае тоже единица измерения.

Posted: Mon Jan 23, 2006 5:11 pm
by diamond
Violinier
В ассемблерном варианте: ((xsize+1) shr scale) mul ((ysize+1) shr scale)
Mario79
В документации четко сказано: "размер", а не "максимальная координата". Но чтобы создать окно размером 100*100 пикселей, нужно передавать 0-й функции значение 99. Когда сказано "eax = (размер по оси x)*65536 + (размер по оси y)", естественно ожидать, что будет возвращаться что-нибудь типа 800*65536+600.
Подход с возвращением/установкой не размера, а максимальной координаты абсолютно законен, но при этом все-таки в документации надо писать именно о максимальной координате, а не размере.

Posted: Mon Jan 23, 2006 9:58 pm
by Mario79
diamond
Документацию мы, конечно, пытаемся исправить своими небольшими силами. Писалась она не нами, так что ошибки могут быть.
Мне собственно интересно, а как ты выяснил, что рисуется именно 99, а не 100 или не 98 или не 101 пиксель?
Линейкой измерял экран? Считал по увеличенному скриншоту?

Posted: Mon Jan 23, 2006 10:53 pm
by mike.dld
Я об этом узнал, когда писал MeOSEmul :) Там оказалось, что что-то не сходится, и я понял, в чём дело

Posted: Mon Jan 30, 2006 4:38 pm
by diamond
Смотрел в исходниках ядра, когда разбирался для своего эмулятора, как работает нестандартная форма окон. Заодно и стандартную форму изучил.