----- Original Message ----- From: "Graeme Geldenhuys" <graemeg.li...@gmail.com>
To: "FPC-Pascal users discussions" <fpc-pascal@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
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to