===== Мифы вокруг HiDensity в PalmOS 5. ===== ==== Введение ==== - папа, говорят водка подорожала? теперь ты будешь меньше пить? - нет сынок, теперь ты будешь меньше есть. Объявление поддержки разрешения 320x320 в PalmOS 5 несколько сбило с толку. Статья объясняет как реализован HiDensity displays в PalmOS и что как поддержка позволяет использовать большее разрешение экрана. ==== Классические экраны ==== Для начала рассмотрим архитектуру подсистемы вывода информации классических версий PalmOS. === Window Manager ==== Основанием подсистемы вывода является Window Manager. Я объединил этим понятием функции API Win* и Bmp*. Эти функции работают с объектами окон и изображений. Битмап представляет собой не просто картинку, но семейство картинок. Каждая картинка ассоциируется с определенной глубиной цвета. Другой тип битмапа - экранный битмап, который занимает пространство не в оперативной памяти, а на экране, в видеопамяти. Практически все Bmp* API позволяет не задумываться о реальном местоположении битмапа. Уровнем выше находится Win* API. Эта библиотека реализует работу с окнами и базируется на битмапах. Окно - это поверхность для рисования, к которой привязан битмап. Функции Win* API инкапсулируют особенности конкретного битмапа и позволяют оптимизировать работу с экраном. === Form Manager === Form Manager - это набор библиотек, предоставляющий управление формами и контролами на них. Форма - это специализированное окно. Менеджер форм занимается рисованием форм и контролов на окнах с помощью Win* API. Когда на форме рисуется битмап, который отображается с правильной глубиной цвета, в этом нет заслуг менеджера форм. Всю работу по поиску нужной картинки в семействе делает Bmp* API. ==== High Denstiy Display ==== В PalmOS 5 была предложена идея дисплеев высокой плотности (хотя существует одна модель с PalmOS 4.2 и поддержкой HiDensity). Эта поддержка позволяла использовать дисплеи с большим разрешением, чем 160x160. HiDensity API проектировалось как абстрактное, позволяющее использовать произвольные разрешения, кратные 160x160: 320x320 (2x), 480x480 (3x) 240x240 (1.5x). В действительности существуют только модели с двухкратными дисплеями. Стоит помнить, что увеличение разрешения не означает увеличения физических размеров экрана. То есть каждый пиксель стал в 4 раза меньше. Также стояла задача совместимости с предыдущими API. Для решения этих проблем было принято решение: программная поддержка нужна не для того, чтобы втиснуть в 4 раза больше информации, а чтобы такой же объем информации выглядил качественнее. Слово "качественнее" означает, что битмапы и шрифты будут прорисованы с наилучшим разрешением, но даже если таких шрифтов и битмапов нет, изображения и текст будут занимать те же самые позиции на экране, но будут выглядеть скромнее. Такая идеология подразумевает, что разработчику вообще ничего не нужно менять в коде. Он просто обеспечивает HiDensity шрифты и битмапы, а ОС сама выбирает нужный объект из семейства в зависимости от экрана на конкретной машине. Формы продолжают проектироваться со стандартной плотностью, в которой и задаются все координаты. Возникает вопрос - а как будет себя вести операции рисования линий и точек? Неужели они не смогут поставить точку в один пиксел, а не зажечь квадрат 2x2? Для рисовальщиков вручную было введено понятие текущей координатной системы. По сути дела, это размерность экрана, которой оперирует пользователь. При переходе от текущей КС к родной КС экрана происходит умножение координат на коэффициент преобразования. Так, при рисовании в kCoordinatesStandard (немодифицированная программа) на двойном экране происходит удвоение всех координат. При работе в kCoordinatesDouble происходит простая передача всех координат "как есть". === Window manager ==== Как изменился Window Manager в PalmOS 5? Не слишком существенно, но перетряхнуть пришлось много. У битмапов появилось новое свойство - плотность. Теперь битмапы в семействе различаются не только глубиной цвета, но и плотностью. Родная плотность используется для вычисления мнодителя для преобразований от текущей системы координат. В реализациях функций Win* API и Bmp* API пришлось добавить перевод параметров из текущей КС в родную КС битмапа. При подборе нужной картинки из битмапа учитывается КС. === FormManager === Form Manager не изменился. Это означает, что он до сих пор просто рисует в текущей КС то, что от него требуют отрисовать. PalmSource предполагает, что к моменту запуска функций Form Manager текущей КС будет kCoordinatesStandard, и все формы будут указаны в стандартных координатах. Такой подход приводит к тому, что на HiDensity экран помещается ровно столько же, сколько и на обычный экран, отличия только в качестве картинки. Если нужно что-то отрисовать в двойной плотности, то временно переключите КС и после отрисовки верните обратно. Что будет, если установить КС в kCoordinatesDouble и попытаться отрисовать обычную форму? Она будет нарисована в верхней левой четверти экрана. Такой подход сподвигает некоторых на попытку нарисовать форму 320x320. Этого делать не стоит. Почему? * Не велит PalmSource. Возможно этот довод "не катит", но что вы будуте делать если описанные действия перестанут выполняться * Не все инструменты поддерживают создание таких форм. * Во время показа HiDensity диалога может выскочить системное сообщение - диалог аларма или алерт. Они будут отрисованы в левом верхним углу крошечным окошком. Это некрасиво. ==== WinSetScalingMode ==== В поисках решения задачи "хочу field с маленькими шрифтами" народ бросается на функцию WinSetScalingMode. Эта функция позволяет по-отдельности регулировать масштабирование битмапов и шрифтов. Но! Обратите внимание, что она поддерживается только с версии PalmOS 5.3, так что число не поддерживающих ее машинок все еще велико.