· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› TRIVERTEX

Посл.отвђт Сообщенiе


Дата: Окт 18, 2004 15:26:47

Приветствую всех.
Народ, пожалуйста, помогите побороть TRIVERTEX, а то он меня уже одолел :-\
Речь о API GradientFill. В двух разных языках пробовал - работает, на asm'e никак не могу передать в

ф-цию параметры. Нужно передать массив из двух элементов, каждый из которых - структуры TRIVERTEX
typedef struct _TRIVERTEX {
    LONG        x;
    Long        y;
    COLOR16     Red;
    COLOR16     Green;
    COLOR16     Blue;
    COLOR16     Alpha;
}TRIVERTEX, *PTRIVERTEX;


элемент типа GRADIENT_RECT
typedef struct _GRADIENT_RECT {
    ULONG    UpperLeft;
    ULONG    LowerRight;
}GRADIENT_RECT, *PGRADIENT_RECT;


В MSDN есть пример на Си:
TRIVERTEX        vert[2] ;
GRADIENT_RECT    gRect;
vert [0] .x      = 0;
vert [0] .y      = 0;
vert [0] .Red    = 0x0000;
vert [0] .Green  = 0x0000;
vert [0] .Blue   = 0x0000;
vert [0] .Alpha  = 0x0000;

vert [1] .x      = 100;
vert [1] .y      = 32; 
vert [1] .Red    = 0x0000;
vert [1] .Green  = 0x0000;
vert [1] .Blue   = 0xff00;
vert [1] .Alpha  = 0x0000;

gRect.UpperLeft  = 0;
gRect.LowerRight = 1;
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, подскажите, как это

делается.


Дата: Окт 18, 2004 16:18:57

Из опыта работы с другими структурами могу сказать, заполняй сначала 0.
Затем в С-шных структурах умалчивается выравнивание, например:
PARTITION_INFORMATION_MBR struct
  PartitionType       UCHAR           ?
  BootIndicator       BOOLEAN         ?
  RecognizedPartition BOOLEAN         ?
  align 2
  HiddenSectors       ULONG           ?
PARTITION_INFORMATION_MBR       ends

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


Дата: Окт 18, 2004 17:49:33

Align ставил перед структурой, но чтобы внутри - не пробовал. Счас попробую.


Дата: Окт 18, 2004 18:14:28

Есть вариант такой
TRIVERTEX struct
    x		:LONG    ?
    y		:Long    ?
    Red		:COLOR16 ?
    align 2
    Green	:COLOR16 ?
    align 2
    Blue	:COLOR16 ?
    align 2
    Alpha	:COLOR16 ?
TRIVERTEX ends

т.к. COLOR16 - размером в WORD
попробуй вывести значение sizeof(TRIVERTEX) и сразу все встанет на свои места :)


Дата: Окт 18, 2004 19:16:40

SteelRat

Да, я сразу и смотрел SIZEOF = 16. С использованием структуры пока не сделал, сделал таким вот странным способом (но работает:))
TrivertexProc proc
	LOCAL GradRect		:GRADIENT_RECT
	LOCAL hDC		:DWORD
	
.data
	tv_x0		dd  1
	tv_y0		dd  90
	tv_red0 	dw  0f000h
	tv_green0	dw  0f000h
	tv_blue0        dw  00000h
	tv_alpha0	dw  0
	tv_x1		dd  599
	tv_y1		dd  300
	tv_red1 	dw  0
	tv_green1	dw  0ff00h
	tv_blue1        dw  0ff00h
	tv_alpha1	dw  0
.code
	mov tv_red0,	0ff00h
	mov tv_green0,	0ff00h
	mov tv_blue0,	0ff00h
	mov GradRect.UpperLeft,0
	mov GradRect.LowerRight,1
	
	invoke GetWindowDC,hWnd
	mov hDC, eax
	invoke GradientFill,hDC,ADDR tv_x0,2,ADDR GradRect,1,1
	invoke ReleaseDC,hWnd,hDC
	ret
TrivertexProc endp


Или если на стеке хранить, то всё к верху ногами разворачивать:
TrivertexProc proc
	LOCAL TV1_alpha		:WORD
	LOCAL TV1_blue		:WORD
	LOCAL TV1_green		:WORD
	LOCAL TV1_red		:WORD
	LOCAL TV1_y		:DWORD
	LOCAL TV1_x		:DWORD
	LOCAL TV0_alpha		:WORD
	LOCAL TV0_blue		:WORD
	LOCAL TV0_green		:WORD
	LOCAL TV0_red		:WORD
	LOCAL TV0_y		:DWORD
	LOCAL TV0_x		:DWORD
	
	LOCAL GradRect		:GRADIENT_RECT
	LOCAL hDC		:DWORD
	
	mov TV0_x,	1
	mov TV0_y,	90
	mov TV0_red,	0f000h 
	mov TV0_green,	0f000h 
	mov TV0_blue,	00000h 
	mov TV0_alpha,	0
	mov TV1_x,	599
	mov TV1_y,	300
	mov TV1_red,	00000h 
	mov TV1_green,	0ff00h 
	mov TV1_blue,	0ff000h 
	mov TV1_alpha,	0
	
	mov GradRect.UpperLeft,0
	mov GradRect.LowerRight,1
	
	invoke GetWindowDC,hWnd
	mov hDC, eax
	invoke GradientFill,hDC,ADDR TV0_x,2,ADDR GradRect,1,1 
	invoke ReleaseDC,hWnd,hDC
	ret
TrivertexProc endp


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


Дата: Окт 18, 2004 19:57:42

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

Ну вроде всё.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.053