on fly create regions

Тема в разделе "WASM.BEGINNERS", создана пользователем Mad Butcher, 14 ноя 2005.

  1. Mad Butcher

    Mad Butcher New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2005
    Сообщения:
    27
    Есть необходимость создания регионов для окна "на лету",

    для этого используется нижеследующая процедура наглым образом украденная откуда-то(hWin - хендл окна,hBitmap - битмап отрисованный в окне,bm - глобальная структура BITMAP)... Процедура работает, но ОЧЕНЬ МЕДЛЕННО (рисунок средней "сложности" размером 640х480 обрабатывается около 2 миллиардов тактов).

    А теперь собственно вопрос:

    Возможно ли создать регион БОЛЕЕ БЫСТРЫМ способом, чем "тупое" GetPixel ???


    Код (Text):
    1.  
    2. CreateRegionOrig PROC uses esi hWin:DWORD,hBitmap:DWORD
    3. LOCAL var_X:DWORD               ; Col value
    4. LOCAL var_Y:DWORD               ; Row value
    5. LOCAL var_StartLineX:DWORD      ; start location of a region
    6. LOCAL var_FullRegion:DWORD      ; Combination of all Regions found so far
    7. LOCAL var_LineRegion:DWORD      ; Current region
    8. LOCAL var_TransparantColor:DWORD    ; color that is used to indicate transparancy
    9. LOCAL var_Inline:DWORD          ; Inline Region state
    10. mov var_Inline,FALSE
    11. mov var_X,0
    12. mov var_Y,0
    13. mov var_StartLineX,0
    14. invoke CreateRectRgn,0,0,0,0
    15. mov    var_FullRegion,eax
    16. invoke GetDC,hWin
    17. push   eax
    18. invoke CreateCompatibleDC,eax
    19. xchg   eax,esi
    20. push   hWin
    21. call   ReleaseDC
    22. invoke SelectObject,esi,hBitmap
    23. invoke GetPixel,esi,0,0
    24. mov var_TransparantColor,eax
    25. mov ebx, bm.bmHeight
    26. .WHILE var_Y < ebx
    27. mov ebx,bm.bmWidth
    28.     .WHILE var_X <= ebx
    29.     invoke GetPixel,esi,var_X,var_Y
    30.     mov ebx,bm.bmWidth
    31.         .IF eax==var_TransparantColor || var_X==ebx
    32.                 .IF var_Inline==TRUE
    33.                 mov var_Inline,FALSE
    34.                 mov ebx,var_Y
    35.                 inc ebx
    36.                 invoke CreateRectRgn,var_StartLineX,var_Y,var_X,ebx
    37.                 mov var_LineRegion,eax
    38.                 invoke CombineRgn,var_FullRegion,var_FullRegion,var_LineRegion,RGN_OR
    39.                 invoke DeleteObject,var_LineRegion
    40.                 .ENDIF
    41.         .ELSE
    42.                 .IF var_Inline==FALSE
    43.                 mov var_Inline,TRUE
    44.                 push var_X
    45.                 pop var_StartLineX
    46.                 .ENDIF
    47.         .ENDIF
    48.     inc var_X
    49.     mov ebx,bm.bmWidth
    50.     .ENDW
    51. inc var_Y
    52. mov var_X,0
    53. mov ebx,bm.bmHeight
    54. .ENDW
    55. invoke DeleteDC,esi
    56. invoke SetWindowRgn,hWin,var_FullRegion,1
    57. ret
    58. CreateRegionOrig ENDP
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Вместо GetPixel логичнее получить указатель на карту пикселов и работать с ники (см. GetDIBits)
     
  3. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    Выделяй память под битмап и забирай его целиком с помощью GetDIBits. Затем обращайся к пикселам как к обычному двумерному массиву.



    Постоянные вызовы CreateRectRgn, CombineRgn на каждой итерации цикла тоже ужасны, но это уже другая песня. Вообще, лучше подумай, как написать свой алгоритм, потому что этот плох (явно слишком медленный).
     
  4. Mad Butcher

    Mad Butcher New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2005
    Сообщения:
    27
    Спасибо за ответы.

    Ещё один вопрос:

    каков формат описания региона, и

    возможно ли создать прямоугольный регион в размер окна и уже затем напрямую изменять регион ???