TRIVERTEX

Тема в разделе "WASM.ASSEMBLER", создана пользователем cresta, 18 окт 2004.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Приветствую всех.

    Народ, пожалуйста, помогите побороть TRIVERTEX, а то он меня уже одолел :-\

    Речь о API GradientFill. В двух разных языках пробовал - работает, на asm'e никак не могу передать в



    ф-цию параметры. Нужно передать массив из двух элементов, каждый из которых - структуры TRIVERTEX


    Код (Text):
    1. typedef struct _TRIVERTEX {
    2.     LONG        x;
    3.     Long        y;
    4.     COLOR16     Red;
    5.     COLOR16     Green;
    6.     COLOR16     Blue;
    7.     COLOR16     Alpha;
    8. }TRIVERTEX, *PTRIVERTEX;




    элемент типа GRADIENT_RECT


    Код (Text):
    1. typedef struct _GRADIENT_RECT {
    2.     ULONG    UpperLeft;
    3.     ULONG    LowerRight;
    4. }GRADIENT_RECT, *PGRADIENT_RECT;




    В MSDN есть пример на Си:


    Код (Text):
    1. TRIVERTEX        vert[2] ;
    2. GRADIENT_RECT    gRect;
    3. vert [0] .x      = 0;
    4. vert [0] .y      = 0;
    5. vert [0] .Red    = 0x0000;
    6. vert [0] .Green  = 0x0000;
    7. vert [0] .Blue   = 0x0000;
    8. vert [0] .Alpha  = 0x0000;
    9.  
    10. vert [1] .x      = 100;
    11. vert [1] .y      = 32;
    12. vert [1] .Red    = 0x0000;
    13. vert [1] .Green  = 0x0000;
    14. vert [1] .Blue   = 0xff00;
    15. vert [1] .Alpha  = 0x0000;
    16.  
    17. gRect.UpperLeft  = 0;
    18. gRect.LowerRight = 1;
    19. GradientFill(hdc,vert,2,&gRect,1,GRADIENT_FILL_RECT_H);




    который "To draw a shaded rectangle from [0,0] to [100,32]". В asm'e никак не хочет работать - просто



    черное окно и всё.

    Пробовал делать и с assume edi: и просто подряд две переменные типа TRIVERTEX, в надежде, что они будут



    восприняты как два элемента массива, и ещё как-то (даже и не вспомню, всё что пробовал). В Инете ни



    единой строки асмовой на эту тему не нашёл. Может, кто работал с GradientFill, подскажите, как это



    делается.
     
  2. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Из опыта работы с другими структурами могу сказать, заполняй сначала 0.

    Затем в С-шных структурах умалчивается выравнивание, например:
    Код (Text):
    1.  
    2. PARTITION_INFORMATION_MBR struct
    3.   PartitionType       UCHAR           ?
    4.   BootIndicator       BOOLEAN         ?
    5.   RecognizedPartition BOOLEAN         ?
    6.   align 2
    7.   HiddenSectors       ULONG           ?
    8. PARTITION_INFORMATION_MBR       ends
    9.  


    Фишка была как раз в align 2 без этого не работало ;))
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Align ставил перед структурой, но чтобы внутри - не пробовал. Счас попробую.
     
  4. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Есть вариант такой
    Код (Text):
    1.  
    2. TRIVERTEX struct
    3.     x       :LONG    ?
    4.     y       :Long    ?
    5.     Red     :COLOR16 ?
    6.     align 2
    7.     Green   :COLOR16 ?
    8.     align 2
    9.     Blue    :COLOR16 ?
    10.     align 2
    11.     Alpha   :COLOR16 ?
    12. TRIVERTEX ends
    13.  


    т.к. COLOR16 - размером в WORD

    попробуй вывести значение sizeof(TRIVERTEX) и сразу все встанет на свои места :)
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    SteelRat



    Да, я сразу и смотрел SIZEOF = 16. С использованием структуры пока не сделал, сделал таким вот странным способом (но работает:))


    Код (Text):
    1. TrivertexProc proc
    2.     LOCAL GradRect      :GRADIENT_RECT
    3.     LOCAL hDC       :DWORD
    4.    
    5. .data
    6.     tv_x0       dd  1
    7.     tv_y0       dd  90
    8.     tv_red0     dw  0f000h
    9.     tv_green0   dw  0f000h
    10.     tv_blue0        dw  00000h
    11.     tv_alpha0   dw  0
    12.     tv_x1       dd  599
    13.     tv_y1       dd  300
    14.     tv_red1     dw  0
    15.     tv_green1   dw  0ff00h
    16.     tv_blue1        dw  0ff00h
    17.     tv_alpha1   dw  0
    18. .code
    19.     mov tv_red0,    0ff00h
    20.     mov tv_green0,  0ff00h
    21.     mov tv_blue0,   0ff00h
    22.     mov GradRect.UpperLeft,0
    23.     mov GradRect.LowerRight,1
    24.    
    25.     invoke GetWindowDC,hWnd
    26.     mov hDC, eax
    27.     invoke GradientFill,hDC,ADDR tv_x0,2,ADDR GradRect,1,1
    28.     invoke ReleaseDC,hWnd,hDC
    29.     ret
    30. TrivertexProc endp




    Или если на стеке хранить, то всё к верху ногами разворачивать:


    Код (Text):
    1. TrivertexProc proc
    2.     LOCAL TV1_alpha     :WORD
    3.     LOCAL TV1_blue      :WORD
    4.     LOCAL TV1_green     :WORD
    5.     LOCAL TV1_red       :WORD
    6.     LOCAL TV1_y     :DWORD
    7.     LOCAL TV1_x     :DWORD
    8.     LOCAL TV0_alpha     :WORD
    9.     LOCAL TV0_blue      :WORD
    10.     LOCAL TV0_green     :WORD
    11.     LOCAL TV0_red       :WORD
    12.     LOCAL TV0_y     :DWORD
    13.     LOCAL TV0_x     :DWORD
    14.    
    15.     LOCAL GradRect      :GRADIENT_RECT
    16.     LOCAL hDC       :DWORD
    17.    
    18.     mov TV0_x,  1
    19.     mov TV0_y,  90
    20.     mov TV0_red,    0f000h
    21.     mov TV0_green,  0f000h
    22.     mov TV0_blue,   00000h
    23.     mov TV0_alpha,  0
    24.     mov TV1_x,  599
    25.     mov TV1_y,  300
    26.     mov TV1_red,    00000h
    27.     mov TV1_green,  0ff00h
    28.     mov TV1_blue,   0ff000h
    29.     mov TV1_alpha,  0
    30.    
    31.     mov GradRect.UpperLeft,0
    32.     mov GradRect.LowerRight,1
    33.    
    34.     invoke GetWindowDC,hWnd
    35.     mov hDC, eax
    36.     invoke GradientFill,hDC,ADDR TV0_x,2,ADDR GradRect,1,1
    37.     invoke ReleaseDC,hWnd,hDC
    38.     ret
    39. TrivertexProc endp




    Причём без align'ов. Осталось со структурами разобраться.
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Со структурой тоже разобрался: надо было учесть, что в стеке адреса идут вниз, и передавать адрес не первого а второго элемента массива. Т.е. если располагать переменную в секции .data, то offset TV1 == offset TV0 + 16, а если на стеке offset TV1 == offset TV0 - 16.



    Ну вроде всё.