more of a syntax question than anything and if anyone can point me to a similar thread that would be great.
what would this line do? what it doesn't do work
MOV DWORD ptr ,0FFFFFFh ; Set Pixel to White
i am modifying MOBs MAKEREGION code, i am making a monochrome bitmap instead of a region
i have looked through eoins and scrontys code and have learnt alot from there.
my code is below and the last line makes it crash. what i'm trying to do it set the pixel at 0,0 to white.
i see alot of MOV DWORD ptr , blah blah... what does this mean?
what would this line do? what it doesn't do work
MOV DWORD ptr ,0FFFFFFh ; Set Pixel to White
i am modifying MOBs MAKEREGION code, i am making a monochrome bitmap instead of a region
i have looked through eoins and scrontys code and have learnt alot from there.
my code is below and the last line makes it crash. what i'm trying to do it set the pixel at 0,0 to white.
;********************************************************;
INVOKE CreateCompatibleDC, NULL ; CREATE A DUMMY DC (->_hdc)
MOV _hdc, EAX ;
INVOKE CreateCompatibleDC, NULL ; CREATE ANOTHER DC (->_mhdc)
MOV _mhdc, EAX ;
INVOKE SelectObject, _hdc, bhnd ; SELECT THE BACKGROUND INTO THE DC
MOV bbhnd, EAX; ; KEEP THE OLD VALUE
;
lea EDX,bmi ; EDX HOLDS THE BITMAP INFOE STRUCT
MOV .BITMAPINFOHEADER.biSize,sizeof(BITMAPINFOHEADER)
MOV eax,PICTUREW ; SET THE WIDTH
MOV .BITMAPINFOHEADER.biWidth, eax ;
MOV eax,PICTUREH ; SET THE HEIGHT
MOV .BITMAPINFOHEADER.biHeight,eax ;
MOV .BITMAPINFOHEADER.biPlanes,1 ; MONOCHROME
MOV .BITMAPINFOHEADER.biBitCount,32 ; 32 BIT COLORS... DWORDS
MOV .BITMAPINFOHEADER.biCompression,BI_RGB ; PIX STORAGE FORMAT
MOV .BITMAPINFOHEADER.biSizeImage,0 ;
MOV .BITMAPINFOHEADER.biXPelsPerMeter,0 ;
MOV .BITMAPINFOHEADER.biYPelsPerMeter,0 ;
MOV .BITMAPINFOHEADER.biClrUsed,0 ;
MOV .BITMAPINFOHEADER.biClrImportant,0 ;
;
INVOKE CreateDIBSection,_mhdc,EDX,DIB_RGB_COLORS,addr bitPoint,0,0
MOV mhnd, EAX ; CREATE THE MASK BITMAP
;
XOR EDI, EDI ; SET CURRENT PIXEL TO (0,0)
XOR ESI, ESI ;
MOV EDX, bitPoint ; EX POINTS TO THE BITMAPS' PIXELS
INVOKE GetPixel, _hdc, 0, 0 ; GET PIXELCOLOR AT X:0 Y:0 (->tcol)
MOV tcol, EAX ; NOW tcol HOLDS THE *TRANSPARENT* COLOR
MOV DWORD ptr ,0FFFFFFh ; Set Pixel to White
;********************************************************;
INVOKE CreateCompatibleDC, NULL ; CREATE A DUMMY DC (->_hdc)
MOV _hdc, EAX ;
INVOKE CreateCompatibleDC, NULL ; CREATE ANOTHER DC (->_mhdc)
MOV _mhdc, EAX ;
INVOKE SelectObject, _hdc, bhnd ; SELECT THE BACKGROUND INTO THE DC
MOV bbhnd, EAX; ; KEEP THE OLD VALUE
;
lea EDX,bmi ; EDX HOLDS THE BITMAP INFOE STRUCT
MOV .BITMAPINFOHEADER.biSize,sizeof(BITMAPINFOHEADER)
MOV eax,PICTUREW ; SET THE WIDTH
MOV .BITMAPINFOHEADER.biWidth, eax ;
MOV eax,PICTUREH ; SET THE HEIGHT
MOV .BITMAPINFOHEADER.biHeight,eax ;
MOV .BITMAPINFOHEADER.biPlanes,1 ; MONOCHROME
MOV .BITMAPINFOHEADER.biBitCount,32 ; 32 BIT COLORS... DWORDS
MOV .BITMAPINFOHEADER.biCompression,BI_RGB ; PIX STORAGE FORMAT
MOV .BITMAPINFOHEADER.biSizeImage,0 ;
MOV .BITMAPINFOHEADER.biXPelsPerMeter,0 ;
MOV .BITMAPINFOHEADER.biYPelsPerMeter,0 ;
MOV .BITMAPINFOHEADER.biClrUsed,0 ;
MOV .BITMAPINFOHEADER.biClrImportant,0 ;
;
INVOKE CreateDIBSection,_mhdc,EDX,DIB_RGB_COLORS,addr bitPoint,0,0
MOV mhnd, EAX ; CREATE THE MASK BITMAP
;
XOR EDI, EDI ; SET CURRENT PIXEL TO (0,0)
XOR ESI, ESI ;
MOV EDX, bitPoint ; EX POINTS TO THE BITMAPS' PIXELS
INVOKE GetPixel, _hdc, 0, 0 ; GET PIXELCOLOR AT X:0 Y:0 (->tcol)
MOV tcol, EAX ; NOW tcol HOLDS THE *TRANSPARENT* COLOR
MOV DWORD ptr ,0FFFFFFh ; Set Pixel to White
;********************************************************;
i see alot of MOV DWORD ptr , blah blah... what does this mean?
MOV DWORD ptr , blah blah
=
mov dword ptr ,blah blah
=
mov dword ptr ,blah blah
so if eax holds an address in memory, then..
mov DWORD ptr , 0FFFFFFh would move 0FFFFFFh to the place that eax refers to?
then is ebx holds 4, 8, 12,... ?
mov DWORD ptr , 0AAAAAAh would move 0AAAAAAh to the next byte?
mov DWORD ptr , 0FFFFFFh would move 0FFFFFFh to the place that eax refers to?
then is ebx holds 4, 8, 12,... ?
mov DWORD ptr , 0AAAAAAh would move 0AAAAAAh to the next byte?
eax = pointer
ebx = displacement
So mov DWORD ptr , 0AAAAAAh = move 0AAAAAAh to the next *dword*
ebx = displacement
So mov DWORD ptr , 0AAAAAAh = move 0AAAAAAh to the next *dword*
O.k my head is going to explode!
if anyone had some time could you take a look at this code below.
it *should* when given a bitmap create a monochrome bitmap i can use as a mask and return
it through the third parameter.
i can ffel that i'm close, there's just some piece of info i am missing.. ...well have been missing for about a week now. i have really tried to solve this on my own but...
if anyone had some time could you take a look at this code below.
it *should* when given a bitmap create a monochrome bitmap i can use as a mask and return
it through the third parameter.
i can ffel that i'm close, there's just some piece of info i am missing.. ...well have been missing for about a week now. i have really tried to solve this on my own but...
; #######################################################;
;
MAKEMASK PROC USES ESI EDI EDX \ ; MAKEMASK HWND, BITMAPHANDLE, BITMASK HANDLE
hwnd: DWORD, bhnd: DWORD, mhnd: DWORD ;
LOCAL d_dc, f_dc, bbhnd: DWORD, bmhnd : DWORD,;
tcol, _hdc : DWORD, _mhdc : DWORD, ps : PAINTSTRUCT
;
;********************************************************;
; GET THE DEVICE CONTEXTS + EDI, ESI AND TRANS COLOR ;
; INITIALISED ;
; ;
; EDI, EDX = 0 -> TOP LEFT OF BITMAP ;
; TCOL = (0,0) -> TOP LEFT COLOUR TRANSPARENT ;
; ;
;********************************************************;
INVOKE CreateCompatibleDC, NULL ; CREATE A DUMMY DC (->_hdc)
MOV _hdc, EAX ;
INVOKE CreateCompatibleDC, NULL ; CREATE ANOTHER DC (->_mhdc)
MOV _mhdc, EAX ;
INVOKE SelectObject, _hdc, bhnd ; SELECT THE BACKGROUND INTO THE DC
MOV bbhnd, EAX; ; KEEP THE OLD VALUE
;
lea EDX,bmi ; EDX HOLDS THE BITMAP INFOE STRUCT
MOV .BITMAPINFOHEADER.biSize,sizeof(BITMAPINFOHEADER)
MOV eax,PICTUREW ; SET THE WIDTH
MOV .BITMAPINFOHEADER.biWidth, eax ;
MOV eax,PICTUREH ; SET THE HEIGHT
MOV .BITMAPINFOHEADER.biHeight,eax ;
MOV .BITMAPINFOHEADER.biPlanes,1 ; MONOCHROME
MOV .BITMAPINFOHEADER.biBitCount,1 ; SIMPLE MONOCHROME
MOV .BITMAPINFOHEADER.biCompression,BI_RGB ; PIX STORAGE FORMAT
MOV .BITMAPINFOHEADER.biSizeImage,0 ;
MOV .BITMAPINFOHEADER.biXPelsPerMeter,0 ;
MOV .BITMAPINFOHEADER.biYPelsPerMeter,0 ;
MOV .BITMAPINFOHEADER.biClrUsed,0 ;
MOV .BITMAPINFOHEADER.biClrImportant,0 ;
;
INVOKE CreateDIBSection,_mhdc,EDX,DIB_RGB_COLORS,addr bitPoint,0,0
MOV mhnd, EAX ; CREATE THE MASK BITMAP
INVOKE SelectObject, _mhdc, mhnd
MOV bmhnd, eax
;
XOR EDI, EDI ; SET CURRENT PIXEL TO (0,0)
XOR EDX, EDX ;
INVOKE GetPixel, _hdc, 0, 0 ; GET PIXELCOLOR AT X:0 Y:0 (->tcol)
MOV tcol, EAX ; NOW tcol HOLDS THE *TRANSPARENT* COLOR
INVOKE SetPixel, _mhdc, 0, 0, 1
;********************************************************;
; THIS IS THE MAIN LOOP ----------> START HERE ;
;********************************************************;
_MLOOP: INVOKE GetPixel, _hdc, EDI, EDX ; GET PIXELCOLOR AT X:EDI Y:ESI...
CMP EAX, tcol ; *IF* CURRENT COLOR = TRANSPARENT???
JZ _SETBG ; THEN JUMP TO _SETBG
JMP _SETFG ; ELSE JUMP TO _SETFG
_SETBG: INVOKE SetPixel, _mhdc, EDI, EDX, 1
JMP _INC ; INCREMENT THE COUNTERS
_SETFG: INVOKE SetPixel, _mhdc, EDI, EDX, 0
JMP _INC ; INCREMENT THE COUNTERS
_INC: INC EDI ; NEXT COL IN ROW
CMP EDI, PICTUREW ; *IF* AT THE END OF THE ROW???
JBE _MLOOP ; NO? JUMP TO BEGINNING AND DO NEXT PIXEL; SAME ROW
XOR EDI, EDI ; YES? SET X = 0
INC EDX ; Y = Y + 1 (NEXT ROW)
CMP EDX, PICTUREH ; *IF* HAVE WE REACHED THE VERY END?
JB _MLOOP ; NO? NEXT ROW OF BITMAP
;********************************************************;
_EXIT: INVOKE SelectObject, _hdc, bbhnd ;
INVOKE SelectObject, _mhdc, bmhnd
INVOKE DeleteDC, _hdc ; CLOSE THE BITMAP-DCS...
INVOKE DeleteDC, _mhdc ;
RET ;
;********************************************************;
MAKEMASK ENDP ;
;
MAKEMASK PROC USES ESI EDI EDX \ ; MAKEMASK HWND, BITMAPHANDLE, BITMASK HANDLE
hwnd: DWORD, bhnd: DWORD, mhnd: DWORD ;
LOCAL d_dc, f_dc, bbhnd: DWORD, bmhnd : DWORD,;
tcol, _hdc : DWORD, _mhdc : DWORD, ps : PAINTSTRUCT
;
;********************************************************;
; GET THE DEVICE CONTEXTS + EDI, ESI AND TRANS COLOR ;
; INITIALISED ;
; ;
; EDI, EDX = 0 -> TOP LEFT OF BITMAP ;
; TCOL = (0,0) -> TOP LEFT COLOUR TRANSPARENT ;
; ;
;********************************************************;
INVOKE CreateCompatibleDC, NULL ; CREATE A DUMMY DC (->_hdc)
MOV _hdc, EAX ;
INVOKE CreateCompatibleDC, NULL ; CREATE ANOTHER DC (->_mhdc)
MOV _mhdc, EAX ;
INVOKE SelectObject, _hdc, bhnd ; SELECT THE BACKGROUND INTO THE DC
MOV bbhnd, EAX; ; KEEP THE OLD VALUE
;
lea EDX,bmi ; EDX HOLDS THE BITMAP INFOE STRUCT
MOV .BITMAPINFOHEADER.biSize,sizeof(BITMAPINFOHEADER)
MOV eax,PICTUREW ; SET THE WIDTH
MOV .BITMAPINFOHEADER.biWidth, eax ;
MOV eax,PICTUREH ; SET THE HEIGHT
MOV .BITMAPINFOHEADER.biHeight,eax ;
MOV .BITMAPINFOHEADER.biPlanes,1 ; MONOCHROME
MOV .BITMAPINFOHEADER.biBitCount,1 ; SIMPLE MONOCHROME
MOV .BITMAPINFOHEADER.biCompression,BI_RGB ; PIX STORAGE FORMAT
MOV .BITMAPINFOHEADER.biSizeImage,0 ;
MOV .BITMAPINFOHEADER.biXPelsPerMeter,0 ;
MOV .BITMAPINFOHEADER.biYPelsPerMeter,0 ;
MOV .BITMAPINFOHEADER.biClrUsed,0 ;
MOV .BITMAPINFOHEADER.biClrImportant,0 ;
;
INVOKE CreateDIBSection,_mhdc,EDX,DIB_RGB_COLORS,addr bitPoint,0,0
MOV mhnd, EAX ; CREATE THE MASK BITMAP
INVOKE SelectObject, _mhdc, mhnd
MOV bmhnd, eax
;
XOR EDI, EDI ; SET CURRENT PIXEL TO (0,0)
XOR EDX, EDX ;
INVOKE GetPixel, _hdc, 0, 0 ; GET PIXELCOLOR AT X:0 Y:0 (->tcol)
MOV tcol, EAX ; NOW tcol HOLDS THE *TRANSPARENT* COLOR
INVOKE SetPixel, _mhdc, 0, 0, 1
;********************************************************;
; THIS IS THE MAIN LOOP ----------> START HERE ;
;********************************************************;
_MLOOP: INVOKE GetPixel, _hdc, EDI, EDX ; GET PIXELCOLOR AT X:EDI Y:ESI...
CMP EAX, tcol ; *IF* CURRENT COLOR = TRANSPARENT???
JZ _SETBG ; THEN JUMP TO _SETBG
JMP _SETFG ; ELSE JUMP TO _SETFG
_SETBG: INVOKE SetPixel, _mhdc, EDI, EDX, 1
JMP _INC ; INCREMENT THE COUNTERS
_SETFG: INVOKE SetPixel, _mhdc, EDI, EDX, 0
JMP _INC ; INCREMENT THE COUNTERS
_INC: INC EDI ; NEXT COL IN ROW
CMP EDI, PICTUREW ; *IF* AT THE END OF THE ROW???
JBE _MLOOP ; NO? JUMP TO BEGINNING AND DO NEXT PIXEL; SAME ROW
XOR EDI, EDI ; YES? SET X = 0
INC EDX ; Y = Y + 1 (NEXT ROW)
CMP EDX, PICTUREH ; *IF* HAVE WE REACHED THE VERY END?
JB _MLOOP ; NO? NEXT ROW OF BITMAP
;********************************************************;
_EXIT: INVOKE SelectObject, _hdc, bbhnd ;
INVOKE SelectObject, _mhdc, bmhnd
INVOKE DeleteDC, _hdc ; CLOSE THE BITMAP-DCS...
INVOKE DeleteDC, _mhdc ;
RET ;
;********************************************************;
MAKEMASK ENDP ;
You can save some jmps
Anyway I am not too sure about what went wrong, since I do not really play much with GDI.
I don't really understand what you mean by that. You return value by eax, not parameter. the leave instructions clears the stuffs on the stack indirectly.
_MLOOP:
INVOKE GetPixel, _hdc, EDI, EDX ; GET PIXELCOLOR AT X:EDI Y:ESI...
xor ecx,ecx ;<-
CMP EAX, tcol
sete cl;<-
INVOKE SetPixel, _mhdc, EDI, EDX, ecx;<-
INC EDI ; NEXT COL IN ROW
CMP EDI, PICTUREW
jnz _MLOOP;<- i think jnz works the same
XOR EDI, EDI ; YES? SET X = 0
INC EDX ; Y = Y + 1 (NEXT ROW)
CMP EDX, PICTUREH ; *IF* HAVE WE REACHED THE VERY END?
jb _MLOOP
Anyway I am not too sure about what went wrong, since I do not really play much with GDI.
it *should* when given a bitmap create a monochrome bitmap i can use as a mask and return it through the third parameter.
I don't really understand what you mean by that. You return value by eax, not parameter. the leave instructions clears the stuffs on the stack indirectly.
what i meant was that at the end of this proc, mhnd would point to a monochrome bitmap that could be used to mask the input bitmap.
i'll try what you said a little later today.
thanks.
BTW. what's -> sete cl
i'll try what you said a little later today.
thanks.
BTW. what's -> sete cl
Crunchi,
I did something similar to bazik's problem... http://www.asmcommunity.net/board/index.php?topic=13238&pagenumber=2
at the middle of the code, you can see an example on drawing pixels.
you can remove all the unnecessary stuff except the 2 blits.
you might want to look with your glasses or use a magnifying glass :tongue: , it's at the top left corner of the window.
:grin:
I did something similar to bazik's problem... http://www.asmcommunity.net/board/index.php?topic=13238&pagenumber=2
at the middle of the code, you can see an example on drawing pixels.
you can remove all the unnecessary stuff except the 2 blits.
you might want to look with your glasses or use a magnifying glass :tongue: , it's at the top left corner of the window.
:grin:
sete cl = set the value in cl to 1 if zero flag is set.