Неверно выводятся 4-bit картинки из TImageList

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Неверно выводятся 4-bit картинки из TImageList

Сообщение Browny » 06.09.2007 17:23:45

Неверно выводятся (не маскируется фон) 4-bit картинки из TImageList.
Причина в том, что API-функция ImageList_DrawEx получает из TImageList не совсем верный формат TBitmap (ещё не разобрался, почему).

Следующий код
Код: Выделить всё
ImageList_DrawEx(smallimage.Handle, imgIndex, Form1.Canvas.Handle, x, y, 0, 0, clNone, clNone, ILD_Transparent)
работает для 8,16,24,32 битных рисунков и не работает для 4-битных.

Вот такой вариант:
Код: Выделить всё
var
  aBitmap: TBitmap;
  UseMaskHandle: HBitmap;

begin
  aBitmap:= TBitmap.Create;
  smallimage.GetBitmap(imageIndex, aBitmap);
  UseMaskHandle:=aBitmap.MaskHandle;
  MaskBlt(ToolButton3.Canvas.Handle,5,5,aBitmap.Width, aBitmap.Height,   aBitmap.Canvas.Handle,0,0,UseMaskHandle,0,0);
aBitmap.Free;
end;


тоже работает только с картинками, у которых палитра >4 bit.
В то же время этот код прекрасно работает с 4-битными картинками, если вместо ImageList использовать контейнер Image:
Код: Выделить всё
aBitmap.Assign(Image1.Picture.Bitmap);


Какие варианты? Может, кто богат решением? Заведомо благодарю.

P.S.
Убедительная просьба: в качестве решения не предлагать использовать сторонние компоненты. Не в этом цель..
Аватара пользователя
Browny
новенький
 
Сообщения: 37
Зарегистрирован: 31.08.2007 10:42:55

Сообщение Browny » 10.09.2007 18:12:00

Новое в локализации ошибки:
виновата функция CreateGlyph модуля /ideintf/imagelisteditor.pp.

В случае, когда Adjustment = gaNone, делается Result.Assign(B), а иначе происходит Result.Canvas.Draw(X,Y, B). И после Draw не создаётся маска у нового Glyph'а.

Простейший вариант "ремонта":

Код: Выделить всё
    Result.TransparentColor := TransparentColor;
    Result.Transparent := True;
    Result.TransparentMode := tmAuto;
    Result.Maskhandle:= B.Maskhandle; {новое}


работает, но не совсем корректно. Завтра постараюсь доделать и оформить патч.
Аватара пользователя
Browny
новенький
 
Сообщения: 37
Зарегистрирован: 31.08.2007 10:42:55

Сообщение Павел Ишенин » 10.09.2007 18:50:46

Показал тему Марку (Marc Weustinc) - самый древний активный разработчик. Его последняя работа как раз была связана с графикой. Его ответ заключается в том, что для 4-битных изображений нужна палитра, поддержка которой в настоящий момент не реализована.

Для устранения проблемы необходимо реализовать поддержку палитры.

Если есть желание пообщаться лично, то лучше зайти на irc канал.
Павел Ишенин
постоялец
 
Сообщения: 475
Зарегистрирован: 24.03.2007 10:16:52

Сообщение Browny » 14.09.2007 15:07:42

Относительно 4-битных картинок: ошибался, всё работает. Проблемы не с картинкой, а с добавлением её в ImageList родным property-editor'ом. Если выравнивание картинки отличается от GlyphAdjustment = gaNone, то по краям картинки вылезают поля цветом TransparentColor.

Предварительный патч (базируется на патче Тома Грегоровича) лежит тут: http://brokenplate.mpt.ru/filestorage/lcl-04.09.2007-svn11933-imglistfix-1.rar

upd: http://brokenplate.mpt.ru/filestorage/lcl-04.09.2007-svn11933-imglistfix-1.1.rar

Большой недостаток моего патча в том, что пришлось вмешаться в класс TBitmap и модули, связанные с API. Поэтому: напоминаю, что патч реализован только для Lazarus 0.9.23, Win32, svn 11933, snapshot 04.09.2007. Для более поздних версий его поведение предсказать не могу!
Аватара пользователя
Browny
новенький
 
Сообщения: 37
Зарегистрирован: 31.08.2007 10:42:55


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51

Рейтинг@Mail.ru