Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Шрифт


Evgeniy_K ©   (2004-07-21 20:04:00) 

У меня есть 4 битовая картинка - матрица букв. Я хочу ее использовать для составления слов, чтобы эффективней было, как лучше сделать? Попиксельно альфаканал накладывать - имхо, не оптимально. Есть ли другой вариант? Direct Draw - JEDI


Evgeniy_K   (2004-07-23 10:37:00) [1]

полупрозрачность я иначе реализовал ;), а то что мне нужно здесь было, мы с киборгом уже решили :)


cyborg   (2004-07-22 18:09:00) [2]

Ладно спорить, мы вчера в аське решили проблему ;), там не прозрачность нужно было ему.


Белый Крыс   (2004-07-22 17:33:00) [3]

Так бы сразу ;). Просто автор изначально указал о полупрозрачных шрифтах.  
>отстой некрасивый
Те же рисованный только в профиль. :)
Почему, да потому что рисованный разве что scale'ом увеличивать, а обычные - лучше.
Потому лучше всего сразу брать отрисованный нужным цветом со всеми затенениями и эффектами шрифты и рисуютсю с колоркеем - самое быстрое и КАЧЕСТВЕННОЕ.
Твои способ не предложит букв с эффектами.
Спасибо. Ссылку не надо. Я это уже бросил.


ПсихЪ_задумчивый   (2004-07-22 17:23:00) [4]

Забыл ссылку дописать: http://tzlab.amillo.net/?desc=cpp/directx.htm- AlphaDLL - несколько функций отрисовки прозрачности, написана на С++, в архиве примеры использования на С++ и на Delphi. Если нужны исходники - в мыло.


ПсихЪ_задумчивый   (2004-07-22 17:21:00) [5]


> Белый Крыс ©   (22.07.04 17:14) [13]

Дык с полупрозрачностью на DirectDraw и так ясно - она тормозная, как мой комп. (: Даже если использовать специальные функции, написанные на С++ (http://), это всё равно не помогает.
Поэтому остаётся только использование разноцветный битмэпнутых шрифтов без антиалиасинга. Вот я и предложил метод. А системные шрифты - это отстой некрасивый, подойдёт исключительно для вывода на экран отладочной инфы.


Белый Крыс   (2004-07-22 17:14:00) [6]

>нарисованные заранее формы шрифтов
Это как? Какие формы. Ну я тоже могу любые шрифты и "формы" использовать :).
>так, как отрендерит пользовательская винда.
Не хочу удивить сильно, но она отрисует текст "так, как нужно разработчику". Я этому не удивлен и проблем с этим не встречал.
А вот ЧТО сказано в задании:
Чем ярче пиксель, тем выше прозрачность. [2] Так более того, эти 4 байта и ЕСТЬ данные о прозрачности. Т.е. именно рисуется буква, которая (именно сама буква, а не фон) полупрозрачна. Как сказано в том же 2 посте, там где белый - там прозрачно, черный - непрозрачно, а градации серого - уровни прозрачности, чем светлее, тем прозрачнее(по-крайней мере так написано).
Потому и задан был вопрос. Ведь как сделать ключевые цвета и так ясно, тем более что в принципе  твой вариант автор сам же и изложил [2].
Что касается моей процедуры, это как замена твоего способа(без полупрозрачности), т.е. без bitmap шрифтов.


ПсихЪ_задумчивый   (2004-07-22 16:36:00) [7]


> Белый Крыс ©   (22.07.04 15:32) [11]

Мой способ будет быстрее и обладать большими возможностями, ибо позволит использовать нарисованные заранее формы шрифтов. Нарисованные так, как нужно разработчику, а не так, как отрендерит пользовательская винда.

В задании сказано, что нужно просто заранее выводить с антиалиасингом битмэпнутые шрифты. Но в четыре байта данные о полупрозрачности не воткнёшь, и автор не хочет юзать попиксельную прорисовку...


Белый Крыс   (2004-07-22 15:32:00) [8]

2 ПсихЪ_задумчивый
(((((((;
Если ты ещё раз внимательно прочтёшь всё, что я написал и разберёшьэто, то ты увидешь, что я говорю именно про затухающих краёв, полупрозрачность самих и букв и т.д.
:))
Я прекрасно понял твои слова, потому и говорю что в данном случае с учетом требований о "полупрозрачности и т.д." этот способ не подходит.
Интересно, что будет быстрее, твой способ или вот это

procedure DrawText2(const surf : IDirectDrawSurface7; hFont : HFONT; strText : PCHAR; OX, OY : DWORD; crForeground : COLORREF);
var
   DC : HDC;
   hr : HRESULT;
begin
 DC := 0;
 if( ( surf = nil ) or ( strText = nil ) ) then Exit;
 hr := surf._Restore;
 if( FAILED( hr ) ) then Exit;
 hr := surf.GetDC( DC );
 if( FAILED( hr ) ) then Exit;
 SetBkMode(DC, TRANSPARENT);  /// Обрати внимание
 SetTextColor( DC, crForeground );
 if( hFont <> 0 ) then SelectObject( DC, hFont );
 TextOut( DC, OX, OY, strText, length(strText) );
 hr := surf.ReleaseDC( DC );
 if( FAILED( hr ) ) then Exit;
end;

??


ПсихЪ_задумчивый   (2004-07-22 14:48:00) [9]


> Белый Крыс ©   (22.07.04 14:18) [9]

Если ты ещё раз внимательно прочтёшь всё, что я написал и разберёшь каждый пункт, и тех, которые я написал, то явственно увидишь, что:
1. На БэкБуффер выводятся буквы выбранного в пункте 2 цвета с прозрачным цветом.
2. Градиентной прозрачности, затухающих краёв и ново-хитрых альфа-каналов нет для максимального быстродействия (используется исключительно игра цветовыми ключами).


Белый Крыс   (2004-07-22 14:18:00) [10]

2 ПсихЪ_задумчивый
:) Спасибо. Но вот только первая строчка должна быть не
> Белый Крыс ©   (21.07.04 22:25) [7],
а Evgeniy_K.
Но, я сказал - уровень прозрачности. Т.е. в данном случаем твой способ не подойдет. Потому что требования другие. Нужен не прозрачный фон, а прозрачные буквы. Т.е. сквозь текст просматривался, скажем там, инвентарь. Что касается DirectDraw. То тут можно использовать не BitMap fonts, а обычные. Рисовать WinAPI'вской функцией.


ПсихЪ_задумчивый   (2004-07-22 10:22:00) [11]


> Белый Крыс ©   (21.07.04 22:25) [7]

Лучше для каждой строки или всей текстовой области делать отдельную поверхность. Цвет букв задавать следующим образом.
1.1 Буквы - белые на чёрном фоне (белый - колоркей)
1.2 Поверхность для нанесения текста (колоркей - цвет фона букв, чёрный)
2. Выбираем цвет букв - зелёный
3. Закрашиваем поверхность для нанесения текста зелёным цветом
4. Наносим (блитим, отрисовываем) на эту поверхность буквы с флагом колоркея
5. Получаем зелёные буквы на чёрном фоне
6. Рисуем поверхность куда следует с флагом колоркея
7. Получаем зелёные буквы на нужном вам фоне
8.1 Если текст неизменен - повторяем 6
8.2 Иначе - 2


Белый Крыс   (2004-07-21 22:25:00) [12]

2 Evgeniy_K  
Куда рендериться???
Когда будет происходить вывод шрифта на экран, результируемый цвет пикселя должен просчитываться, используя текущий цвет пиксела и уровень прозрачности (альфы). Понятное дело, это будет происходить каждый кадр.


OSokin   (2004-07-21 20:59:00) [13]

Не понял... У меня было куда все проще... Я просто брал байт или два, расписывал их побитно, брал каждый бит поотдельности, смотрел: 1 - inverted, 0 - transparent...


Evgeniy_K   (2004-07-21 20:40:00) [14]

не будет, ибо рендерится он будет при загрузке, а потом хранится в памяти.


Evgeniy_K   (2004-07-21 20:39:00) [15]

тема закрыта


cyborg   (2004-07-21 20:29:00) [16]

Думаю, что такой шрифт будет тормозить игру.


Evgeniy_K   (2004-07-21 20:24:00) [17]

Шрифт представляет собой четырехбитовую картинку. Чем ярче пиксель, тем выше прозрачность. Т.е. картинка-маска задает альфа канал.

Как работает:
Я выбираю цвет. И потом нужно цветом вывести шрифт, шрифт выводится ч/з маску. Например, черный пиксель - выбранный цвет. Чем светлее пиксель, тем выше его прозрачность, т.е. у меня будет шрифт не монотонный, а с переходами. Где белый цвет - там прозрачные места. Так понятно?


cyborg   (2004-07-21 20:09:00) [18]

Не понятно.
Шрифт - обыкновенная поверхность с цветовым ключём. Каждую букву выводишь на другую поверхность.


Наверх

Титульная страница Поиск, карта сайта Написать письмо