Author Topic: SWGPTG - 01  (Read 528 times)

caballero

  • Member
  • *****
  • Posts: 1043
    • Abre Ojos Ensamblador
SWGPTG - 01
« on: April 06, 2018, 05:50:35 AM »
SWGPTG - Small Windows Graphics Programming Tutorial with GDI

For the occasion of the opening of this new thread I have decided to post a small tutorial on the programming of graphics with GDI, which is in fact a subset of my Windows Graphics Tutorial with GDI. I'll drop a new post here every weekend (or so) until you/I get tired (that will be soon), as well as here (when I have time) and there. It has two quizzes to exercise us, which we will review in the next weekend (or so).

The size of the client area will be 640x400, which meets the golden ratio of proportionality: 1.6.

You can make use of what you find interesting here with the logical constraints: plagiarism is not allowed and reference is required if you use it.

Surely, many of you who are reading this have already programmed graphics in MS-DOS, probably in 13H mode. The programming of graphics for Windows with GDI is not very different.

PD. Excuse me if any mistake. I did it all in a hurry.


1.- We need a canvas where to paint on

In MS-DOS we wrote at the segment:address A000:0000, now we can not do that, but we will write on the hDC (display device context) that gives us the BeginPaint function that we will place inside the WM_PAINT section / message. However this is very very slow, because it has many different options to deal with. If we paint point to point the wait can be eternalized. To avoid this great inconvenience we will use a data buffer that we will send at once, which is almost immediate.

The data buffer we will create will be a bitmap that we will send to the hDC with a BitBlt or StretchBlt function. We will use the last one. For the creation of the bitmap we will use the function CreateDIBSection, which returns a pointer to the bit values of the created bitmap. This pointer is very important because it is the one that will allow us to write in it very quickly.

Writing to our DIB buffer can be done manually or through GDI functions, such as SetPixel. Contrary to what many people say, SetPixel is not particularly slow in itself, as I demonstrated some time ago here. The writing on the hDC is what is slow. Although, of course, we will always use what gives us the fastest writing speed.

In summary, we could identify the address A000:0000 of MS-DOS with the hDC of WM_PAINT, to which to access effectively we will need an intermediate data buffer with DIB format.


2.- Template

To finish this first post I will attach the templates of several compilers. If they are compiled and executed they will simply show a window populated by a default color. It is not advisable to eat your head on how this file is structured, you just have to take into account the following procedures within the code:

  * Inicio. Here you will include the code that you want to run only once at the application starting. It is called within WM_CREATE. For example to initialize certain variables, etc.
  * PintaObjeto. Here you will include the code that you want to run every time the pre-established time is met. I've put it every 20 milliseconds. It is the code that will renew what appears in our window. It runs inside WM_PAINT.
 
It would be interesting to stop at the following points:
  * To paint in our DIB bitmap we will use the variable pMainDIB, which is the pointer that directs it. To this address we will pass the desired color of the point that has the format AARRGGBB, each one are byte-size, where AA (alpha) = 0 the rest are from 0 to 0xFF. This means that the size of the point to paint is dword, so to move to the next point we will have to increase our pointer in 4 bytes. The pointer starts at the upper left corner and increases to the right, when it ends with the length of the line we will see appear at the first point on the left of the line below.
  * The background color of our main window, set in the WNDCLASSEX structure, must be 0, which indicates that it has no color, otherwise you will get flickering on the screen.
  * The capture of the WinMain procedure messages is done with GetMessage instead of PeekMessage because the latter generates an unnecessary increase in work in most cases, as shown here.
  * When we set the dimension of the window, it is not the client area, which will be lower, so if we want it for this we will have to do some extra accounts, although given that the window is resizable, it may not be worth it .
 
 
3.- Quiz 1
Make a small program that draws a gradient of colors (by your own).



4.- Quiz 2
Free theme to upload note.

EDITED: added the templates 32 and 64 bits for GoAsm and NasmX and a little 64 bits demo for NasmX and the same with a tune in the background made with Fasm 32 bits.
« Last Edit: May 13, 2018, 06:19:41 AM by caballero »
En un lugar de la Mancha de cuyo nombre no quiero acordarme

- There are 10 kind of people: those who know binary numbers and those who don't -

zedd151

  • Member
  • ****
  • Posts: 847
Re: SWGPTG - 01
« Reply #1 on: April 06, 2018, 06:19:27 AM »
Gracias, caballero! This is the kind of topic that should jumpstart this forum.

Should put the word "Tutorial" in the title, imo.

zedd
« Last Edit: April 06, 2018, 07:36:34 AM by zedd151 »
I'm not always the sharpest knife in the drawer, but I have my moments.  :P

LordAdef

  • Member
  • ****
  • Posts: 588
Re: SWGPTG - 01
« Reply #2 on: April 06, 2018, 09:18:17 AM »
Nice Caballero!

I foresee a great future for our game corner. Asm used to be the king of games in the good old times. It´s still used a lot and soon I guess people will come here for the "iron taste"

ps: I´ll a good time studying this one!

caballero

  • Member
  • *****
  • Posts: 1043
    • Abre Ojos Ensamblador
Re: SWGPTG - 01
« Reply #3 on: April 08, 2018, 05:44:39 AM »
Finally I found the right way to modify my messages :icon_redface: So this post may be removed, the new zip is already in the first post... Sorry
« Last Edit: April 09, 2018, 04:21:13 AM by caballero »
En un lugar de la Mancha de cuyo nombre no quiero acordarme

- There are 10 kind of people: those who know binary numbers and those who don't -

caballero

  • Member
  • *****
  • Posts: 1043
    • Abre Ojos Ensamblador
Re: SWGPTG - 01
« Reply #4 on: April 10, 2018, 04:58:09 AM »
Hello. I have noticed an odd behaviour with 64 bits programming, common for all the compilers, that I will chase when I have time.

The correct way should be:
Code: [Select]
invoke    StretchBlt, [hdc], 0, 0, [vdxClient], [vdyClient], [bufDIBDC], 0, 0, cdXSize, cdYSize, SRCCOPY

And works ok for the "floor" demo example for any compiler. Nevertheless, in my computer, only for the template appear vertical dark lines between the flat color. In another computer is ok.

In my computer I have to put the next code if I want to work ok:
Code: [Select]
invoke    StretchBlt, [hdc], 0, 0, addr vdxClient, addr vdyClient, [bufDIBDC], 0, 0, cdXSize, cdYSize, SRCCOPY

Does anyone noticed anything strange? Has anyone checked anything?
En un lugar de la Mancha de cuyo nombre no quiero acordarme

- There are 10 kind of people: those who know binary numbers and those who don't -

caballero

  • Member
  • *****
  • Posts: 1043
    • Abre Ojos Ensamblador
Re: SWGPTG - 01
« Reply #5 on: April 10, 2018, 07:44:02 PM »
Fixed!
En un lugar de la Mancha de cuyo nombre no quiero acordarme

- There are 10 kind of people: those who know binary numbers and those who don't -

caballero

  • Member
  • *****
  • Posts: 1043
    • Abre Ojos Ensamblador
Re: SWGPTG - 01
« Reply #6 on: April 21, 2018, 06:00:52 AM »
tuto canceled by lack of quorum :bgrin:
En un lugar de la Mancha de cuyo nombre no quiero acordarme

- There are 10 kind of people: those who know binary numbers and those who don't -

LordAdef

  • Member
  • ****
  • Posts: 588
Re: SWGPTG - 01
« Reply #7 on: April 21, 2018, 06:04:09 AM »
No!!


I'm here waiting for it, bring it on!

caballero

  • Member
  • *****
  • Posts: 1043
    • Abre Ojos Ensamblador
Re: SWGPTG - 01
« Reply #8 on: May 13, 2018, 06:21:49 AM »
I have added poasm to the template list and some arrangements
En un lugar de la Mancha de cuyo nombre no quiero acordarme

- There are 10 kind of people: those who know binary numbers and those who don't -

HSE

  • Member
  • ****
  • Posts: 764
  • <AMD>< 7-32>
Re: SWGPTG - 01
« Reply #9 on: May 13, 2018, 10:40:03 AM »
Fantastic :t

(attached plantilla with some Masm32 macros)

caballero

  • Member
  • *****
  • Posts: 1043
    • Abre Ojos Ensamblador
Re: SWGPTG - 01
« Reply #10 on: May 13, 2018, 05:20:55 PM »
Thank you for your contribution, Héctor :t
En un lugar de la Mancha de cuyo nombre no quiero acordarme

- There are 10 kind of people: those who know binary numbers and those who don't -