1 /*
2     SDL - Simple DirectMedia Layer
3     Copyright (C) 1997-2012 Sam Lantinga
4 
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Lesser General Public
7     License as published by the Free Software Foundation; either
8     version 2.1 of the License, or (at your option) any later version.
9 
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Lesser General Public License for more details.
14 
15     You should have received a copy of the GNU Lesser General Public
16     License along with this library; if not, write to the Free Software
17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18 
19     Sam Lantinga
20     slouken@libsdl.org
21 */
22 #include "SDL_config.h"
23 
24 #ifndef _SDL_gapivideo_h
25 #define _SDL_gapivideo_h
26 
27 #include "SDL_mouse.h"
28 #include "SDL_mutex.h"
29 #include "../SDL_sysvideo.h"
30 #include "../windib/SDL_gapidibvideo.h"
31 
32 /* From gx.h, since it's not really C compliant */
33 
34 struct GXDisplayProperties {
35     DWORD cxWidth;
36     DWORD cyHeight;         // notice lack of 'th' in the word height.
37     long cbxPitch;          // number of bytes to move right one x pixel - can be negative.
38     long cbyPitch;          // number of bytes to move down one y pixel - can be negative.
39     long cBPP;              // # of bits in each pixel
40     DWORD ffFormat;         // format flags.
41 };
42 
43 struct GXKeyList {
44     short vkUp;             // key for up
45     POINT ptUp;             // x,y position of key/button.  Not on screen but in screen coordinates.
46     short vkDown;
47     POINT ptDown;
48     short vkLeft;
49     POINT ptLeft;
50     short vkRight;
51     POINT ptRight;
52     short vkA;
53     POINT ptA;
54     short vkB;
55     POINT ptB;
56     short vkC;
57     POINT ptC;
58     short vkStart;
59     POINT ptStart;
60 };
61 
62 typedef int   (*PFNGXOpenDisplay)(HWND hWnd, DWORD dwFlags);
63 typedef int   (*PFNGXCloseDisplay)();
64 typedef void* (*PFNGXBeginDraw)();
65 typedef int   (*PFNGXEndDraw)();
66 typedef int   (*PFNGXOpenInput)();
67 typedef int   (*PFNGXCloseInput)();
68 typedef struct GXDisplayProperties (*PFNGXGetDisplayProperties)();
69 typedef struct GXKeyList (*PFNGXGetDefaultKeys)(int iOptions);
70 typedef int   (*PFNGXSuspend)();
71 typedef int   (*PFNGXResume)();
72 typedef int   (*PFNGXSetViewport)( DWORD dwTop, DWORD dwHeight, DWORD dwReserved1, DWORD dwReserved2 );
73 typedef BOOL  (*PFNGXIsDisplayDRAMBuffer)();
74 
75 struct GapiFunc
76 {
77     PFNGXOpenDisplay          GXOpenDisplay;
78     PFNGXCloseDisplay         GXCloseDisplay;
79     PFNGXBeginDraw            GXBeginDraw;
80     PFNGXEndDraw              GXEndDraw;
81     PFNGXOpenInput            GXOpenInput;
82     PFNGXCloseInput           GXCloseInput;
83     PFNGXGetDisplayProperties GXGetDisplayProperties;
84     PFNGXGetDefaultKeys       GXGetDefaultKeys;
85     PFNGXSuspend              GXSuspend;
86     PFNGXResume               GXResume;
87     PFNGXSetViewport          GXSetViewport;
88     PFNGXIsDisplayDRAMBuffer  GXIsDisplayDRAMBuffer;
89 };
90 
91 #define kfLandscape	0x8			// Screen is rotated 270 degrees
92 #define kfPalette	0x10		// Pixel values are indexes into a palette
93 #define kfDirect	0x20		// Pixel values contain actual level information
94 #define kfDirect555	0x40		// 5 bits each for red, green and blue values in a pixel.
95 #define kfDirect565	0x80		// 5 red bits, 6 green bits and 5 blue bits per pixel
96 #define kfDirect888	0x100		// 8 bits each for red, green and blue values in a pixel.
97 #define kfDirect444	0x200		// 4 red, 4 green, 4 blue
98 #define kfDirectInverted 0x400
99 
100 #define GX_FULLSCREEN	0x01		// for OpenDisplay()
101 #define GX_NORMALKEYS   0x02
102 #define GX_LANDSCAPEKEYS        0x03
103 
104 
105 /* GAPI video mode */
106 typedef enum {
107 	GAPI_NONE = 0,
108 	GAPI_DIRECT_565,
109 	GAPI_DIRECT_555,
110 	GAPI_MONO,
111 	GAPI_PALETTE
112 } GAPIVideoMode;
113 
114 typedef unsigned short PIXEL;
115 
116 /* Private display data
117    begin with DIB private structure to allow DIB events code sharing
118 */
119 struct GapiInfo {
120 	/* Rotation which has to be applied to the key (arrow keys) and mouse events measured in quarters of a circle
121 	 * counter clockwise */
122 	int coordinateTransform;
123 	char hiresFix; /* using hires mode without defining hires resource */
124 	int invert; //TODO this is only written but never read, so it should be removed
125 
126 #define NUM_MODELISTS	4		/* 8, 16, 24, and 32 bits-per-pixel */
127 	int SDL_nummodes[NUM_MODELISTS];
128 	SDL_Rect **SDL_modelist[NUM_MODELISTS];
129 
130 
131 	// The orientation of the video mode user wants to get
132 	// Probably restricted to UP and RIGHT
133 	SDL_ScreenOrientation userOrientation;
134 	SDL_ScreenOrientation systemOrientation;
135 // --------------
136 	int useGXOpenDisplay; /* use GXOpenDispplay */
137 	int alreadyGXOpened;
138 	int w, h;
139 	// The orientation of GAPI framebuffer.
140 	// Never changes on the same device.
141 	SDL_ScreenOrientation gapiOrientation;
142 
143 	void *buffer; // may be 8, 16, 24, 32 bpp
144 	PIXEL *videoMem;
145 	BOOL needUpdate;
146 	struct GXKeyList keyList;
147 	struct GapiFunc gxFunc;
148 	struct GXDisplayProperties gxProperties;
149 	GAPIVideoMode videoMode;
150 	int colorscale;
151 	int dstLineStep;  // in bytes
152 	int dstPixelStep; // in bytes
153 	int startOffset; // in bytes
154 	int useVga;
155 	int suspended; // do not pu anything into video memory
156 };
157 
158 
159 
160 #endif /* _SDL_gapivideo_h */
161