[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