Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 2020-04-12 18:48:39 ЛС | профиль | цитата
nesco писал(а):
но увы, без тех плюшек, которое присутствовали в старом компоненте

Предположим, что ImageLoader-a не существует. И перечислим те "самые плюшки".
Есть у нас элемент GIF, который действительно принимает gif из ресурса, и выдает BMP (размером 640x864), заполняя области прозрачности неким магическим цветом (которого, например, нет в картинках). Далее - 3 магических "плюшки"
1)   Выводим верхушку из этого BMP на PaintBox (640x480) с помощью Img_Bmp.
2)   По номеру спрайта (некими замороченными вычислениями) мы можем вытащить спрайт из из этого самого BMP (с магическим цветом прозрачности) с помощью Img_Bmp - в элемент Bitmap (размером 64x64).
3)   И теперь мы можем отрисовать этот Bitmap на PaintBox с учетом цвета прозрачности. Как бы в Img_Bmp такая возможность заложена.

Вот они - те самые "плюшки". С первыми двумя особых проблем нет. Суетливо немного, но - без проблем.
А вот третья, как оказалось -- не работает. Точнее: работает, но только один раз. Первый. Это такое хитрое устройство KOL:
procedure TBitmap.StretchDrawTransparent(DC: HDC; const Rect: TRect; TranspColor: TColor);
begin
if TranspColor = clNone then
StretchDraw( DC, Rect )
else
begin
if GetHandle = 0 then Exit;
TranspColor := Color2RGB( TranspColor );
if (fTransMaskBmp = nil) or (fTransColor <> TranspColor) then // Вот оно, блин !!!!!!!!!!!
begin
if fTransMaskBmp = nil then
fTransMaskBmp := NewBitmap( 0, 0 {fWidth, fHeight} );
fTransColor := TranspColor; // Вот оно, блин !!!!!!!!!!!
// Create here mask bitmap:
fTransMaskBmp.Assign( @Self );
fTransMaskBmp.Convert2Mask( TranspColor );
end;
StretchDrawMasked( DC, Rect, fTransMaskBmp.Handle );
end;
-- по первому обращению сгенерировали маску, и все нормально. Реально -- нормально.
А по второму обращению с тем же самым TranspColor - маска не меняется. Хотя содержимое самой картинки возможно (а у нас-то - точно) изменилось.
Менять KOL - дело не кошерное... Мало ли о чем думал "начальник транспортного цеха". Нет знания - менять нельзя.
Можно сделать изменения в Img_Bmp:
............
implementation

type
{$ifndef F_P}
TBmp = object(TBitmap)end;
PBmp = ^TBmp;
{$else}
PBmp = class(TBitmap)end;
{$endif}

procedure THIImg_Bmp._work_doDraw;
............
if _prop_Transparent then begin
PBmp(src).fTransColor := clNone; // доступ к protected-данным (added by Galkov)
src.DrawTransparent(pDC, oldx1, oldy1, _prop_TransparentColor);
end else
src.Draw(pDC, oldx1, oldy1);
............

nesco, ты готов на такие изменения
По кодам - одна строчка (см. комментарий)
Про DrawSource=Context -- ничего не скажу. Вроде бы ему и сейчас Transparent - по барабану (и мне кажется - это твоя доработка).
Не отмалчивайся, блин

А я, в свою очередь - сделаю типа апдейт SpriteDemo.
Давненько уже бубликов не наблюдал...
карма: 9

0
Редактировалось 5 раз(а), последний 2020-04-12 18:54:35