Jump to content

_GDIPlus_PathGetWorldBounds Question


Recommended Posts

#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>

Example()

Func Example()
    Local $hGUI, $hGraphic, $hBrush, $hPen, $hPen2, $hPath, $aBounds
    ; Create GUI
    $hGUI = GUICreate("GDI+", 800, 300)
    GUISetState(@SW_SHOW)
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI) ;Create a graphics object from a window handle
    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, $GDIP_SMOOTHINGMODE_HIGHQUALITY) ;Sets the graphics object rendering quality (antialiasing)
    _GDIPlus_GraphicsClear($hGraphic, 0xFFFFFFFF)
    $hBrush = _GDIPlus_BrushCreateSolid(0x7F8800AA)
    $hPen = _GDIPlus_PenCreate ( 0xFF8800AA, 1 )
    $hPen2 = _GDIPlus_PenCreate ( 0xFFFF0000, 1 )

;~  Local $aPoints = [[4,0],[0,0],[0,99],[99,99],[99,0]]
;~  Local $aPoints = [[4,0],[1,1],[1,2],[2,2],[2,1]]
;~  Local $aPoints = [[4,0],[100,100],[100,209],[209,209],[209,100]]
    Local $aPoints = [[4,0],[101,101],[101,200],[200,200],[200,101]]

    $hPath = _GDIPlus_PathCreate() ;Create new path object
    _GDIPlus_PathAddPolygon($hPath, $aPoints)
    $aBounds = _GDIPlus_PathGetWorldBounds($hPath)
    ConsoleWrite ( '+ $aBounds[x] : ' & $aBounds[0] & ', $aBounds[y] : ' & $aBounds[1] & ', $aBounds[w] : ' & $aBounds[2] & ', $aBounds[h] : ' & $aBounds[3] & @Crlf )
    For $i = 1 To $aPoints[0][0]
        _GDIPlus_GraphicsDrawRect($hGraphic, $aPoints[$i][0] - 2, $aPoints[$i][1] - 2, 4, 4, $hPen2)
    Next
    _GDIPlus_GraphicsFillPath($hGraphic, $hPath, $hBrush) ;Fill path to graphics handle (GUI)
    _GDIPlus_GraphicsDrawPath($hGraphic, $hPath, $hPen) ;Draw path to graphics handle (GUI)

;~  $hRegion = _GDIPlus_RegionCreateFromPath ( $hPath )
;~  $aBounds = _GDIPlus_RegionGetBounds ( $hRegion, $hGraphic )
;~  ConsoleWrite ( '+ $aBounds[x] : ' & $aBounds[0] & ', $aBounds[y] : ' & $aBounds[1] & ', $aBounds[w] : ' & $aBounds[2] & ', $aBounds[h] : ' & $aBounds[3] & @Crlf )

    ; Loop until the user exits.
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    ; Clean up resources
    _GDIPlus_PathDispose($hPath)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
EndFunc   ;==>Example

The width and height return by _GDIPlus_PathGetWorldBounds function seems to be false...

Is it me or something is wrong ?

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Link to comment
Share on other sites

 mikell and UEZ

Local $aPoints = [[4,0],[0,0],[0,99],[99,99],[99,0]] ; Result should be 100 instead of 99
Local $aPoints = [[4,0],[1,1],[1,2],[2,2],[2,1]] ;  ;  Result should be 2 instead of 1
Local $aPoints = [[4,0],[100,100],[100,209],[209,209],[209,100]] ; Result should be 110 instead of 109
Local $aPoints = [[4,0],[101,101],[101,200],[200,200],[200,101]] ; Result should be 100 instead of 99

I can understand it can look confuse, but coordinates are based 0, but not dimensions.

 

AutoIt 3.3.14.2 X86 - SciTE 3.6.0WIN 8.1 X64 - Other Example Scripts

Link to comment
Share on other sites

For

Local $aPoints = [[4,0],[100,100],[100,100],[100,100],[100,100]]

w = 0, h = 0

 

Local $aPoints = [[4,0],[100,100],[100,100],[100,100],[100,101]]

w = 0, h = 1

 

Local $aPoints = [[4,0],[100,100],[101,100],[100,100],[100,101]]

w = 1, h = 1

 

Width and height are just added to the coordinate which are zero based.

Local $aPoints = [[4,0],[100,100],[100,100],[100,100],[200,101]]

w = 100, h = 1

 

When w = 0 and h = 0 then nothing will be displayed. To display a something either w or h must be greater than 0.

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

No, the width and height is 1 and not 2 as you think. I know what you mean but internally it's not calculated that way.

E.g.

_GDIPlus_PathAddRectangle($hPath, 0, 0, 0, 0), _GDIPlus_PathAddRectangle($hPath, 0, 0, 0, 1), _GDIPlus_PathAddRectangle($hPath, 0, 0, 1, 0) result is always

w = 0, h = 0

whereas _GDIPlus_PathAddRectangle($hPath, 0, 0, 1, 1)

w = 1, h = 1 which are 4 pixels at 0,0.

 

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

13 minutes ago, wakillon said:

What's the interest of this method of calcul ?

I don't know ¯\_(ツ)_/¯ - only MS knows...

 

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

Well, I assume the logic how the width and height is calculated is different. Probably the coders smoked some shit before coding that stuff.

You cannot set only one pixel using the draw functions. Width and height is always somehow added to the x,y position.

 

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...