Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2008, 13:12   #1
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
Вопрос Нужна оптимизация дельфинского кода

Химичу с альфа-прозрачностью. Встроенных механизмов работы с PNG в винде увы нет, приходится доставать альфа-канал из png и пихать в 32-битный BMP. Из-за Round и операций с вещественными числами работает не так быстро, как хотелось бы

Код:
type TRGBQuadArray = array[WORD] of TRGBQuad;
     PRGBQuadArray = ^TRGBQuadArray;

     TByteArray = array[Word] of Byte;
     PByteArray = ^TByteArray;

...............................

Var Row: PRGBQuadArray;
    PNGAlphaRow: PByteArray;

...............................

    PNG := TPNGObject.Create;
    PNG.LoadFromFile('D:\Program Files\Borland\Delphi7\Projects\Outbox\dance1.png');

    BMP := TBitmap.Create;
    BMP.PixelFormat := pf32Bit;
    BMP.Width := PNG.Width;
    BMP.Height := PNG.Height;
    BMP.Canvas.Draw(0, 0, PNG);

    //--> вход в уголок маньяка =)
    //    заполняем альфа-канал BMP
    //    и соответственно поправляем цвет
    //    вот это место надо бы оптимизировать, в идеале - ассемблерная вставка =) Кто-нить может помочь?

    for i := 0 to BMP.Height - 1 do
    begin
      Row := BMP.Scanline[i];
      PNGAlphaRow := PNG.AlphaScanline[i];
      for j := 0 to BMP.Width - 1 do
      begin
        Row[j].rgbReserved := PNGAlphaRow[j];
        Row[j].rgbBlue := Round(Row[j].rgbBlue * Row[j].rgbReserved / 255);
        Row[j].rgbGreen := Round(Row[j].rgbGreen * Row[j].rgbReserved / 255);
        Row[j].rgbRed := Round(Row[j].rgbRed * Row[j].rgbReserved / 255);
      end;
    end;
пыщь

Последний раз редактировалось JTG; 29.05.2008 в 13:17.
JTG вне форума Ответить с цитированием
Старый 29.05.2008, 13:18   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Встроенных механизмов работы с PNG в винде увы нет...
Это почему это?
Цитата:
StretchDIBits
The StretchDIBits function copies the color data for a rectangle of pixels in a DIB to the specified destination rectangle. If the destination rectangle is larger than the source rectangle, this function stretches the rows and columns of color data to fit the destination rectangle. If the destination rectangle is smaller than the source rectangle, this function compresses the rows and columns by using the specified raster operation.

Windows 98/Me, Windows 2000/XP: StretchDIBits has been extended to allow a JPEG or PNG image to be passed as the source image.
B_N вне форума Ответить с цитированием
Старый 29.05.2008, 14:01   #3
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

2JTG

1. делить на 256
Row[j].rgbBlue := Row[j].rgbBlue * Row[j].rgbReserved shr 8;

2. если возможно, перейти на pf24Bit - недавно оптимизировали - пост#509
http://programmersforum.ru/showthread.php?t=338&page=51
alexBlack вне форума Ответить с цитированием
Старый 29.05.2008, 14:17   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

2B_N

Мне StretchDIBits кажись не нужно
Там дальше идёт вот это
Код:
DC := GetDC(0);
UpdateLayeredWindow(Window, DC, @TopLeft, @BmpSize, BMP.Canvas.Handle, @BmpTopLeft, clNone, @BlendFunction, ULW_ALPHA);
ReleaseDC(0, DC);
чтоб отрисовать окно. Параметр hSrcDC (BMP.Canvas.Handle) содержит хендл поверхности с рисунком и альфа-каналом.

Если имеется ввиду напрямую скопировать PNG в hSrcDC - не выйдет, в StretchDIBits содержимое передаётся через параметр lpBitsInfo:TBitmapInfo, в котором и находится тот же "An array of RGBQUAD". Вообщем нужно оптимизировать именно сам процесс заполнения массива

2alexBlack
pf24Bit не подходит, т.к. пропадёт альфа-канал
пыщь

Последний раз редактировалось JTG; 29.05.2008 в 14:21.
JTG вне форума Ответить с цитированием
Старый 29.05.2008, 14:26   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

2 JTG

Ну а просто сопроцессором Вы не пробовали ещё? Быстрее, наверное, уже ничего не придумать (только видеоадаптер, почему я и упоминаю про виндышную поддержку PNG, как таковую, не обязательно именно StretchDIBits). Может быть ещё попробовать через MMX, как руки дойдут, поэкспериментирую....
B_N вне форума Ответить с цитированием
Старый 29.05.2008, 14:28   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

JTG смотри что я предложу:
Код:
 asm
   mov eax,255;
   fld [b]
   fmul [c]
   fdiv [e]
   frndint
   fst [a];
 end;
если интерпретировать твою формулу то у меня она выглядит как:
a := Round(b * c / 255);

Счет явно быстрее будет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.05.2008, 14:53   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Упс) Вот это я перемудрил Там вроде всё работает и с целочисленным делением. В MSDN написали Dst.Red = Src.Red * (SCA/255.0), вот я слеш автоматом и поставил
--
Вот, если кто пользуется AIMP - ждите в скором времени плагин. Пытаюсь переписать FLDance из FLStudio 8
пыщь

Последний раз редактировалось JTG; 29.05.2008 в 15:04.
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация кода [Smarik] Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 20.08.2008 15:00
Оптимизация кода. MAKTECYMA Общие вопросы C/C++ 2 05.06.2008 16:48
Оптимизация кода программы insi Фриланс 2 17.05.2008 18:30
Нужна помощь в написании кода Михаил Юрьевич Общие вопросы Delphi 2 27.12.2007 09:32