Оказывается, когда при создании окна в функции 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, которые на единицу меньше размеров всего рабочего стола.
Точные размеры окон
А можно переписать эту формулу в нормальном виде?diamond wrote:Так вот, правильные размеры этого массива должны быть (xsize+1)>>scale * (ysize+1)>>scale, что совершенно нетривиально.
diamond
Нумерация везде ведется от 0 до Nmax-1 (например, от 0 до 799), по этому вполне очевидно, что возвращаемое значение на 1 меньше. Возвращается то значение, с которым работает ядро.
Я так понимаю, ты исходил из расчета нумерации от 1 до Xmax. Но нуль в данном случае тоже единица измерения.
Нумерация везде ведется от 0 до Nmax-1 (например, от 0 до 799), по этому вполне очевидно, что возвращаемое значение на 1 меньше. Возвращается то значение, с которым работает ядро.
Я так понимаю, ты исходил из расчета нумерации от 1 до Xmax. Но нуль в данном случае тоже единица измерения.
Violinier
В ассемблерном варианте: ((xsize+1) shr scale) mul ((ysize+1) shr scale)
Mario79
В документации четко сказано: "размер", а не "максимальная координата". Но чтобы создать окно размером 100*100 пикселей, нужно передавать 0-й функции значение 99. Когда сказано "eax = (размер по оси x)*65536 + (размер по оси y)", естественно ожидать, что будет возвращаться что-нибудь типа 800*65536+600.
Подход с возвращением/установкой не размера, а максимальной координаты абсолютно законен, но при этом все-таки в документации надо писать именно о максимальной координате, а не размере.
В ассемблерном варианте: ((xsize+1) shr scale) mul ((ysize+1) shr scale)
Mario79
В документации четко сказано: "размер", а не "максимальная координата". Но чтобы создать окно размером 100*100 пикселей, нужно передавать 0-й функции значение 99. Когда сказано "eax = (размер по оси x)*65536 + (размер по оси y)", естественно ожидать, что будет возвращаться что-нибудь типа 800*65536+600.
Подход с возвращением/установкой не размера, а максимальной координаты абсолютно законен, но при этом все-таки в документации надо писать именно о максимальной координате, а не размере.
diamond
Документацию мы, конечно, пытаемся исправить своими небольшими силами. Писалась она не нами, так что ошибки могут быть.
Мне собственно интересно, а как ты выяснил, что рисуется именно 99, а не 100 или не 98 или не 101 пиксель?
Линейкой измерял экран? Считал по увеличенному скриншоту?
Документацию мы, конечно, пытаемся исправить своими небольшими силами. Писалась она не нами, так что ошибки могут быть.
Мне собственно интересно, а как ты выяснил, что рисуется именно 99, а не 100 или не 98 или не 101 пиксель?
Линейкой измерял экран? Считал по увеличенному скриншоту?
Я об этом узнал, когда писал MeOSEmul Там оказалось, что что-то не сходится, и я понял, в чём дело
Смотрел в исходниках ядра, когда разбирался для своего эмулятора, как работает нестандартная форма окон. Заодно и стандартную форму изучил.
Who is online
Users browsing this forum: No registered users and 19 guests