OpenWiki

Hi Density Mythology

Palm Notes | Recent Changes | Title Index | User Preferences | Random Page | Help
Difference from prior major revision.
minor diff author diff hide diff

== Мифы вокруг 
HiDensity в PalmOS 5. ==
  
<TableOfContents/>
  
=== Введение ===
<code>
- папа, 
говорят 
водка 
подорожала? 
теперь ты 
будешь 
меньше пить?
- нет сынок, 
теперь ты 
будешь 
меньше есть.
</code>
Объявление 
поддержки 
разрешения 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, так что число не поддерживающих ее машинок все еще велико.

Palm Notes | Recent Changes | Title Index | User Preferences | Random Page | Help
Edit this page | View other revisions
Print this page | View XML
Find page by browsing, searching or an index
Edited March 2, 2005 (hide diff)