User Tools

Site Tools


hidensitymythology

Мифы вокруг HiDensity в PalmOS 5.

Введение

- папа, говорят водка подорожала? теперь ты будешь меньше пить?
- нет сынок, теперь ты будешь меньше есть.

Объявление поддержки разрешения 320×320 в 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). Эта поддержка позволяла использовать дисплеи с большим разрешением, чем 160×160.

HiDensity API проектировалось как абстрактное, позволяющее использовать произвольные разрешения, кратные 160×160: 320×320 (2x), 480×480 (3x) 240×240 (1.5x). В действительности существуют только модели с двухкратными дисплеями.

Стоит помнить, что увеличение разрешения не означает увеличения физических размеров экрана. То есть каждый пиксель стал в 4 раза меньше. Также стояла задача совместимости с предыдущими API. Для решения этих проблем было принято решение: программная поддержка нужна не для того, чтобы втиснуть в 4 раза больше информации, а чтобы такой же объем информации выглядил качественнее. Слово “качественнее” означает, что битмапы и шрифты будут прорисованы с наилучшим разрешением, но даже если таких шрифтов и битмапов нет, изображения и текст будут занимать те же самые позиции на экране, но будут выглядеть скромнее.

Такая идеология подразумевает, что разработчику вообще ничего не нужно менять в коде. Он просто обеспечивает HiDensity шрифты и битмапы, а ОС сама выбирает нужный объект из семейства в зависимости от экрана на конкретной машине. Формы продолжают проектироваться со стандартной плотностью, в которой и задаются все координаты.

Возникает вопрос - а как будет себя вести операции рисования линий и точек? Неужели они не смогут поставить точку в один пиксел, а не зажечь квадрат 2×2?

Для рисовальщиков вручную было введено понятие текущей координатной системы. По сути дела, это размерность экрана, которой оперирует пользователь. При переходе от текущей КС к родной КС экрана происходит умножение координат на коэффициент преобразования. Так, при рисовании в kCoordinatesStandard (немодифицированная программа) на двойном экране происходит удвоение всех координат. При работе в kCoordinatesDouble происходит простая передача всех координат “как есть”.

Window manager

Как изменился Window Manager в PalmOS 5? Не слишком существенно, но перетряхнуть пришлось много.

У битмапов появилось новое свойство - плотность. Теперь битмапы в семействе различаются не только глубиной цвета, но и плотностью. Родная плотность используется для вычисления мнодителя для преобразований от текущей системы координат.

В реализациях функций Win* API и Bmp* API пришлось добавить перевод параметров из текущей КС в родную КС битмапа. При подборе нужной картинки из битмапа учитывается КС.

FormManager

Form Manager не изменился. Это означает, что он до сих пор просто рисует в текущей КС то, что от него требуют отрисовать.

PalmSource предполагает, что к моменту запуска функций Form Manager текущей КС будет kCoordinatesStandard, и все формы будут указаны в стандартных координатах. Такой подход приводит к тому, что на HiDensity экран помещается ровно столько же, сколько и на обычный экран, отличия только в качестве картинки. Если нужно что-то отрисовать в двойной плотности, то временно переключите КС и после отрисовки верните обратно.

Что будет, если установить КС в kCoordinatesDouble и попытаться отрисовать обычную форму? Она будет нарисована в верхней левой четверти экрана. Такой подход сподвигает некоторых на попытку нарисовать форму 320×320. Этого делать не стоит. Почему?

  • Не велит PalmSource. Возможно этот довод “не катит”, но что вы будуте делать если описанные действия перестанут выполняться
  • Не все инструменты поддерживают создание таких форм.
  • Во время показа HiDensity диалога может выскочить системное сообщение - диалог аларма или алерт. Они будут отрисованы в левом верхним углу крошечным окошком. Это некрасиво.

WinSetScalingMode

В поисках решения задачи “хочу field с маленькими шрифтами” народ бросается на функцию WinSetScalingMode. Эта функция позволяет по-отдельности регулировать масштабирование битмапов и шрифтов. Но! Обратите внимание, что она поддерживается только с версии PalmOS 5.3, так что число не поддерживающих ее машинок все еще велико.

hidensitymythology.txt · Last modified: 2005/03/02 16:55 by 127.0.0.1