[fpc-pascal] X, Y co-ordinate system under OS/2

Paul Nicholls paulfnicholls at gmail.com
Thu Oct 29 03:44:44 CET 2009


----- Original Message ----- 
From: "Graeme Geldenhuys" <graemeg.lists at gmail.com>
To: "FPC-Pascal users discussions" <fpc-pascal at lists.freepascal.org>
Sent: Thursday, October 08, 2009 1:31 AM
Subject: [fpc-pascal] X, Y co-ordinate system under OS/2


> Hi,
>
> I'm porting an OS/2 application to Linux & Windows.  From what I can
> see in the code, it looks like co-ordinates (0,0) is in the bottom
> left corner of the screen. Whereas Windows and Linux, co-ordinates
> (0,0) is in the Top Left of the screen.
>
> Is my assumption correct?  If so, DAMN! This is going to cause a lot
> of work. :-/
>
>
> Regards,
>  - Graeme -

Hi Graeme, I know this is a oldish post, but I had some thoughts on this 
just today :)

I'm making a simple GUI system for a game, and I needed to have screen 
origin independant input coordinates for the GUI (simpler to think about 
when using), and can be used in different world coordinate systems.

So, I have this in my GUI class:

properties
----------
FOriginX : Integer;  // is the screen's top-left coordinate in final 'world' 
coordiantes
FOriginY : Integer;
FDownDir : Integer;  // is either +1, or -1 (+1 for world y coordinates 
increasing downwards, and -1 for increasing upwards

methods
---------
Function  TIMGUI.ScreenToWorldX(Const sx : Integer) : Integer;
Begin
    Result := FOriginX + sx;
End;
{..............................................................................}

{..............................................................................}
Function  TIMGUI.ScreenToWorldY(Const sy : Integer) : Integer;
Begin
    Result := FOriginY + sy * FDownDir;
End;

with the GUI screen, I assume that the top left is 0,0 and the bottom right 
is (width,height) just like in windows.

Now if I want to draw a button, I just do this:

(x,y)
    +-------+
    |       |
    |       |
    +-------+
            (x+w,y+h)

Procedure FIMGUI.DrawRadioButton(x,y,w,h : Integer; text : AnsiString);
Begin
    mx := x + h Div 2;
    my := y + h Div 2;
    r  := h Div 2;

    x1 := ScreenToWorldX(mx-r);
    y1 := ScreenToWorldY(my-r);

    x2 := ScreenToWorldX(mx+r);
    y2 := ScreenToWorldY(my+r);
{...}
        // radio button background
        DrawRoundedRect(x1,y1,
                        x2,y2,
                        0,r,cLineWidth,
                        FBackgroundColor.r,
                        FBackgroundColor.g,
                        FBackgroundColor.b,
                        FBackgroundColor.a,
                        True,5);

        // radio button border
        DrawRoundedRect(x1,y1,
                        x2,y2,
                        0,r,cLineWidth,
                        FBorderColor.r,
                        FBorderColor.g,
                        FBorderColor.b,
                        FBorderColor.a,
                        False,5);

        r := Trunc(r * 0.65);

        x1 := ScreenToWorldX(mx-r);
        y1 := ScreenToWorldY(my-r);

        x2 := ScreenToWorldX(mx+r);
        y2 := ScreenToWorldY(my+r);

        // radio button active dot
        If active Then
            DrawRoundedRect(x1,y1,
                            x2,y2,
                            0,r,cLineWidth,
                            FBorderColor.r,
                            FBorderColor.g,
                            FBorderColor.b,
                            FBorderColor.a,
                            True,5);

        If text = ''  Then Exit;
        If font = Nil Then Exit;

        FontH := font.MaxHeight;
        FontX := ScreenToWorldX(x+h+4);
        FontY := ScreenToWorldY(my - FontH Div 2);

        glEnable(GL_TEXTURE_2D);
        If FUIState.HotItem = id Then
            glColor4fv(@FHotColor)
        Else
            glColor4fv(@FFontColor);
        font.Draw(FontX,FontY,text,0);
{...}
End;

I hope this helps?

cheers,
Paul 




More information about the fpc-pascal mailing list