Секреты отрисовки битмапов в гаугах — Панели и приборы

Название обобщёное, тема обширная. Для начала предисловие: Гриффитса + СДК читал, набор и назначение флагов отрисовки иконок, стрингов и т.д. знаю. Вопрос следующий: есть кнопка, она отрисовывается без использования IMAGE_USE_BRIGHT, а есть картинка, которая имеет прозрачный (в смысле СДК) фон и текстовую надпись, которая выводится комбинацией флагов IMAGE_USE_BRIGHT | IMAGE_USE_TRANSPARENCY. Т.е. замес в том, что бы иметь картинку кнопки, которая реагировала бы правильно на освещение панели, но в то же время имела надпись, которая бы была независима от этого освещения. Всё нормально, что касается функциональной части, а вот с визуальной беда. Картинки выводятся не чётко, игра с флагом IMAGE_BILINEAR_COLOR ничего не даёт. В другое время любая другая панель такими недостатками не страдает. Заметил так же, что от этого недостатка избавлены панели, написаные на ХМЛ. Что же тогда я делаю не так и как получить чёткий текст на кнопках? Решение «своя картинка для каждого статуса панели» пока не рассматривается (на самый последок его оставлю). Просто есть отличный артворк, который симом корёжится до безобразия и никак от этого не избавится.

Ответов: 11

Ну что, совсем не у кого нет идеи, как в С гауги наложить одну картинку на другую, да так, что бы верхнюю не размазывало сглаживанием?

Андрей, как у вас решена светящаяся часть? И сколько бит у тебя её битмап? Нужно обязательно 8 бит, Indexed Colors. Тогда битмап не будет менятся. В ХМЛ тоже есть подобная проблема(проявляется правда в отсутствии прозрачности по краю текста), но она решается аккуратным перегоном всех битмапов в 8бит индексированные цвета.

Или даже лучше в битмап надписи включить кусочек фона. Т.е. что-бы у тебя было как можно меньше сложного прозрачного контура.

Сообщение отредактировал Kirill Konovalov: 11 Май 2012 — 02:20

Kirill Konovalov (11 Май 2012 — 02:19) писал:

Андрей, как у вас решена светящаяся часть? И сколько бит у тебя её битмап? Нужно обязательно 8 бит, Indexed Colors. Тогда битмап не будет менятся. В ХМЛ тоже есть подобная проблема(проявляется правда в отсутствии прозрачности по краю текста), но она решается аккуратным перегоном всех битмапов в 8бит индексированные цвета.

Или даже лучше в битмап надписи включить кусочек фона. Т.е. что-бы у тебя было как можно меньше сложного прозрачного контура.

Ну, Кирилл, обижаешь :) Мало того, ты эти глюки сам видел. С твоим предложением будет проблема в подсветке надписи ночью, ибо этот кусочек фона тоже будет подсвечиваться, это выглядит страшно. По поводу формата битмапов — ну это как бы основны :) Я по простоте душевной думал, может здесь какие неписаные правила есть? Кстати, что ещё заметил, под семёркой отрисовка более мягче и чётче нежели под ХР.

Сообщение отредактировал icebear: 11 Май 2012 — 19:56

А, т.е. это те-же самые проблемы, понял. Я просто подумал, что-то другое, наверное не совсем понял.

Да, есть разница в отрисовке на разных системах. более того — есть даже разница в отрисовке на одной и той-же системе, но на разных видеокартах-это я когда компьютер сменил- заметил Нвидиа и АТИ совершенно по-разному это воспроизводят…

На ХМЛ я перестал пользоваться «рисованным текстом». Если это не «лампы с фоном». Т.е. я просто избегаю «сложных огибающих». Пишу текстом напрямую, тем более — есть способ писать по-русски, если кодировать хмл в УТФ-8.

Сообщение отредактировал Kirill Konovalov: 12 Май 2012 — 00:39

icebear (10 Май 2012 — 20:22) писал:

Ну что, совсем не у кого нет идеи, как в С гауги наложить одну картинку на другую, да так, что бы верхнюю не размазывало сглаживанием?

Верхнюю картинку, чем делаешь (STATIC или ICON)?
Если STSTIC-ом — попробуй ICON с количеством битмапов — 1 (у меня всегда STSTIC один — фоновый битмап прибра). Это чисто так, предположение. Вполне возможно, что пустое.

icebear (07 Май 2012 — 18:28) писал:

… есть кнопка, она отрисовывается без использования IMAGE_USE_BRIGHT, а есть картинка, которая имеет прозрачный (в смысле СДК) фон и текстовую надпись, которая выводится комбинацией флагов IMAGE_USE_BRIGHT | IMAGE_USE_TRANSPARENCY

Чисто тоже предположение.
Попробуй кнопку рисовать тоже с флагом IMAGE_USE_TRANSPARENCY, если есть области с нулевым цветом — забей темным, но не нулевым.
Второе.
А что если попробовать использовать не IMAGE_USE_BRIGHT, а IMAGE_USE_LUMINOUS? В доке вот что пишется:
IMAGE_USE_BRIGHTUse this to make the image appear lit at night. Maps the element’s image colors to the section of the palette that doesn’t change during the transition from day to night. The image colors will not change.
Т.е. цвета этого битма соотносятся с палитрой, не изменяемой днем/ночью.
IMAGE_USE_LUMINOUSImage is bright when the interior light is on.
С этим флагом цвета битмапа изменяются на яркий, в момент, когда включили освещение. Мож, по виду, так будет нормально, а использование этого флага повлияет на четкость отображения верхнего битмапа.

Все это чисто предположение, чисто танцы с бубном, но вдруг поможет.

Кстати, я не понял, когда именно у тебя нечетко рисуется верхний битмап днем, ночью или всегда?

Еще.
Чисто на всякий случай.
Флагами можно управлять на лету с помощью операций:
element->image_flags |= {Флаг}
element->image_flags &= ~{Флаг}

«element» берешь либо непосредсвенно в CallBack-е данного элемента или в CallBack-е прибора:
pgauge->elements_list[0]-> … next_element[X]-> …

Сообщение отредактировал serg_p: 13 Май 2012 — 19:55

Серег, в «темной» кабине у него должны светиться надписи. Так что Люминоус ему не подойдет.

Тут проблема не в том. Проблема как и ранее, как мне кажется, в неверной(вернее недостаточной) подготовке битмапов под стандарты гаугописания.

Я так и не смог тогда въехать что именно не так рисовалось, но рисовалось не так. Я когда сам рисую битмапы(сейчас нет разницы -хмл или не хмл) — у меня у самого есть такие проблемы часто. А вот если я беру, например, битмапы Степана- у меня таких проблем нет. В одном и том-же приборе.

Тут есть проблема в четкой отрисовке края. Почему-то например фотошоп у меня всегда дает небольшой(в 1 пиксел) черный ореол на прозрачности. а вот если я его потом Вручную прокрашиваю все ещё раз черным(уже в Индексированных цветах)- он перестает давать этот ореол.

Так что мне кажется, что дело все-же в самих битмапах.

Андрей, ради интереса, выдери какие-нибудь чужие битмапы, попробуй, которые точно работают? Если на них будут те-же проблемы- то тогда да- программная часть, а если на них все нормально, то проблема как я и предполагаю- в части художественной.

Сообщение отредактировал Kirill Konovalov: 14 Май 2012 — 04:09

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

Фокус с флагом люминисценции пробовал — те же яйца. Идея с двойной прозрачностью не вышла. Манипуляции с флагами иконок (да, я конечно же вывожу иконки, не статические картинки) не поможет. Я выключил сглаживание на надписях вообще. Кстати, от размера кнопок не зависит, в оригинале у нас сейчас один битмап кнопки оверхеда имеет размер 109х134 пикселей, это более чем достаточно. Я просто не могу понять систему, по которой сим отрисовывает кнопки. Ведь куча панелей с нормальной графикой. Я уже ПТ поковырял, у вас нету ни одно кнопки с такими  данными, фриварные панели другие тоже поковырял. Ведь там с точки зрения кода и возможностей сделать как-то отлично от всех практически нет. Можно было это всё решить отрисовывая панель через гди, но там сразу две проблема — фпс станут раком и будет заморочка с освещением. Вобщем дальше буду искать, найду решение — сообщу.

Kirill Konovalov (14 Май 2012 — 04:07) писал:

… Серег, в «темной» кабине у него должны светиться надписи. Так что Люминоус ему не подойдет. …

Наверное, я неясно выразил мысль. Я советовал применить LUMINOUS не к надписи, а к кнопке.

icebear (14 Май 2012 — 13:58) писал:

… Я выключил сглаживание на надписях вообще. …

А это каким флагом делается?

Сообщение отредактировал serg_p: 14 Май 2012 — 23:56

serg_p (14 Май 2012 — 22:58) писал:

Наверное, я неясно выразил мысль. Я советовал применить LUMINOUS не к надписи, а к кнопке.

Ах вот оно! Щас проверю.

Проверил, вобщем те же, только сбоку.

serg_p (14 Май 2012 — 22:58) писал:

А это каким флагом делается?

Это от противного :) Сглаживание включается IMAGE_BILINEAR_COLOR (пардон, поправил), собсно если этого флага нет — не будет и сглаживания.

Сообщение отредактировал icebear: 15 Май 2012 — 00:23

Вобщем решили мы эту проблему. Решение вышло черезчур сложным, даже нет, накладным. Но зато даёт отличный результат, как можно увидеть не скриншоте. Весь замес состоит в наличии нескольких картинок для одной кнопки и их отображения в зависимости от освещения (панели или по высоте солнца). Именно большое кол-во картинок делает решение накладным, программирование простое.

Прикрепленные изображения

  • el.png

Хорошо выглядит. Даже очень хорошо!