Q

Home » Work » Source Code For TARDIS

Source Code For TARDIS

Enter your email address to follow this blog and receive notifications of new posts by email.

Join 45 other followers

Not long ago, someone asked me

“Realistically, what do you want to do?”

Ok. I get it. Your idea of realism. Not mine.

I have been a programmer for a long time, and went through what can be classified as a cathartic change in my thinking processes. Before then. I had been artificially limited – capped if you will – to a way of thinking that was proving to be toxic to me and my body.

So I changed my mind. You know, much like a computer based OS being replaced from Unix to Windows.

Saying it’s an upgrade would be a lie. It’s simply a different, and healthier – for me – thinking process.

So what do I want to do – realistically, taking into account this is your limited idea of realism and not mine?

Ok, Ok, I’ll play and artificially limit my career and life selections – for now – to what’s currently within the realms of the way I used to think.

I’d like to program again.

Only this time. I’d like to build an online world. An online world with an economy to parallel the United States economy. An online world with different career path choices. An online world based in the year 2409 when it gets turned on. An online world where sure, there’s some aspects of war involved – but it’s in space and planet Earth is safe from it. An online world where you can take any profession you choose, whether that’s a lawyer, a doctor, a teacher, a captain of a starship, an engineer, a trader, and more.

I suppose that’s what I am spending my time doing right now, is studying how cultures are made. What creates a world? How did Earth’s culture really evolve and where did it come from and including all the stories of gods and kings?  Where did gravity come from, where does time come from, and what creates and develops deviances in thinking processes to make an online universe richer and fuller than the world I am currently surrounded by?

It’s not that I am interested in replacing Earth. I’m interested in providing more options.

Choices.

Now I suspect much of my ‘change in thinking’ has come in a weird way from the world around me to get me away from development and systematic thinking and more into understanding people, love, and happiness itself, not just for myself, but for those who might choose to be involved with my world.

To understand why the concepts of heaven and hell exist. What a Death Star really means. The importance of death and what it does. And the importance of developmental choice and both evolution and change within a system I create.

I’d once called evolution change to placate my mom. But I realize now that was mistaken. Evolution is positive and beneficial change. Not gyrational change for the sake of change.

And being sincere. If I had the money and resources. Since I have all the time in the world, I would put together this world I am imagining and continue doing the research to make it richer, more entertaining, and deeper with the culture than anything I have ever seen or imagined before.

Mr Gates recently said if he had one super power, it would be to have more time and energy.

Mr Gates, as long as you’re identifying problems in terms that only you can solve by releasing the money you have which has diminished the time and energy available to the rest of the world.

You’re never going to see the problems you create problems resolved.

I invite you to partner with me and quit playing whack a mole fighting evolution that the rest of the world craves and wants.

You can’t always be in control. And sometimes. As I have learned. A little humility and a lot of collaboration can go a long way in making sure this turns out to be a win/win for you and I and the rest of the world.

Here’s source code I created to build a TARDIS leveraging standard libraries you and I both share in three dimensional space.

Finally. Trust. You’re going to have to trust me as much as you’d trust yourself.

Personally, I would prefer you always be the one to take the lead step.

Should we do this tango again. and again. and again.

Untitled Page

// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	TARDIS.CPP
// 
// Description: Contains the code for the T.A.R.D.I.S.
// ----------------------------------------------------------------------------

#include "ACME.H"

STARPOINT allStars[NUMSTARS];
POSITION internalDoorPosition;
POSITION internalCharacterStartLocation;

const float MOVX = 0.0100f;// 0.005
const float MOVY = 0.01f;
const float CMOVX = 0.001f;
const float CMOVY = 0.0004f;

const float INTERNALDOORYOFFSET = -100.0f;

float erx = 0.0f;
float ery = 0.0f;
const float EROTX = 0.0f;
const float EROTY = 0.1f;

// Earth's Clouds
float ercx = 0.0f;
float ercy = 0.0f;
const float EROTCX = 0.0f;
const float EROTCY = -0.1f;

float sunx = 0.0f;
float suny = 0.0f;
const float SUNCX = 0.0f;
const float SUNCY = 0.1f;

// Black Hole's rotation
float bhrx = 0.0f;
float bhry = 0.0f;
float bhrz = 0.0f;
const float BHROTX = 0.0f;
const float BHROTY = 0.1f;
const float BHROTZ = 0.0f;

float sfrx = 0.000f;
float sfry = 0.000f;
float sfrz = 0.000f;

const float STARFIELDROTATEX = 0.01f;
const float STARFIELDROTATEY = 0.05f; //1f;
const float STARFIELDROTATEZ = 0.1f;

const float ONEINCH = 1.0f/12.0f;
int curColor = 0x000000;
// Canvas Sizefor main 'flooring'
const float CANVASSIZE = 20.0f;

float myX = MOVX, myY = MOVY;
float myCX = MOVX, myCY = MOVY;
float myRX = 0.0001f;
float myROS = 0.0f;

const float INTMOVX = 0.01f; // 0.005
const float INTMOVY = 0.05f;
float myOX = INTMOVX, myOY = INTMOVY;
//float myCX = INTMOVX, myCY = INTMOVY;

extern GLPosition3D *creatorLocation;
extern GLRotation3D *creatorRotation;

// Toggles for editting
bool isGridOn = false;
bool isRoomOn = true;
bool isHudOn = false;
bool isFrontDoorOpen = false;
bool externalView = true;

// Skins (textures) used
GLSkin *woodTexture;
GLSkin *bareWoodTexture;
GLSkin *spaceTexture;
GLSkin *externalFloorTexture;
GLSkin *policeBoxSign;
GLSkin *tardisTop;
GLSkin *glassFixture;
GLSkin *screwDown;
GLSkin *screwDownTop;
GLSkin *clearGlassTexture;
GLSkin *publicTardisSign;
GLSkin *prismaticSkin;
GLSkin *earthTexture;
GLSkin *blackHoleScrunch;
GLSkin *earthCloudsTexture;
GLSkin *sunSkin;
GLSkin *interiorUpperWallTexture;
GLSkin *interiorOuterWallTexture;
GLSkin *consolePad;

// Bottom Floor Texture
GLSkin *bottomFloorTexture;
GLSkin *interiorWoodFloorTexture;

LCARSCanvas *myCanvas;

GLUquadricObj *myQuadratic;	


void drawHUD()
{
	glDepthMask(GL_FALSE);
	glDisable(GL_DEPTH_TEST);
	glDisable(GL_TEXTURE_2D);
	//glDisable(GL_LIGHTING);

	glPushMatrix();
	{
		glMatrixMode(GL_PROJECTION);
			glLoadIdentity();
			gluOrtho2D(0,WorldConstants::SCREENWIDTH,WorldConstants::SCREENHEIGHT, 0); //left,right,bottom,top

		glMatrixMode(GL_MODELVIEW);
			glLoadIdentity();

		// ---------------------------------------------------------------------------------- 
		// TODO!!!!!!!!!!!!!!!!!!!:
		//	Need to fix caption - and allow for dynamic font setting. 
		//	GOING to require messing with GLText2D to apply it to the buttons!
		// ---------------------------------------------------------------------------------- 

		// Draw the +/-Button
		if( myCanvas == NULL )
		{
			myCanvas = new LCARSCanvas();
			myCanvas->Left( 10 );
			myCanvas->Top( WorldConstants::SCREENHEIGHT -100 );
			myCanvas->Width( WorldConstants::SCREENWIDTH-20 );
			myCanvas->Height( 85 );

			LCARSButton *myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 10 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::MENUORANGE );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 140 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::KLINGONBROWN );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 270 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::VULCANYELLOW  );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 400 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::EARTHOCEANBLUE  );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 530 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::ISISPURPLE  );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 660 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::EARTHSKYBLUE );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 10 );
			myButton->Top( 50 );
			myButton->Height( 30 );
			myButton->Width( myCanvas->Width() - 10 );
			myButton->ForegroundColor( LCARSConstants::PUMPKINORANGE );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );
		}

		myCanvas->Draw();

		glDepthMask(GL_FALSE);
		glEnable(GL_DEPTH_TEST);
		glEnable(GL_TEXTURE_2D);
		//glEnable(GL_LIGHTING);
	}
	glPopMatrix();

	glMatrixMode(GL_PROJECTION);						// Select The Projection Matrix
		glLoadIdentity();									// Reset The Projection Matrix
		//gluPerspective(45.0f,(GLfloat)WorldConstants::SCREENWIDTH/(GLfloat)WorldConstants::SCREENHEIGHT,0.1f,250.0f);
		gluPerspective(45.0f,(GLfloat)WorldConstants::SCREENWIDTH/(GLfloat)WorldConstants::SCREENHEIGHT,0.1f,250.0f);
}

void drawFloor()
{
	glColor4f(1.0f, 1.0f, 1.0f, 1.0);
	glPushMatrix();
	{
		glMatrixMode(GL_TEXTURE);
			glEnable(GL_TEXTURE_2D);
			glBindTexture(GL_TEXTURE_2D, externalFloorTexture->myTexture );
			glScalef(CANVASSIZE/5, CANVASSIZE/5, 1.0f); // rescale

		// Q's note: The floor is drawn a butt hair (ok. maybe this is a tad more) away from 
		// zero to allow for no conflict between the texture of the obejcts we create on 
		// the scene....
		glMatrixMode(GL_MODELVIEW);
			glBegin(GL_QUADS);
				//glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-CANVASSIZE, -1.01f, -CANVASSIZE );
				glTexCoord2f(1.0f, 0.0f); glVertex3f( CANVASSIZE, -1.01f, -CANVASSIZE );
				glTexCoord2f(1.0f, 1.0f); glVertex3f( CANVASSIZE, -1.01f, CANVASSIZE );
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-CANVASSIZE, -1.01f, CANVASSIZE );
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef(5.0f/CANVASSIZE, 5.0f/CANVASSIZE, 1.0f); // rescale
	
	}
	glPopMatrix();

}

void drawGrid()
{
	glDisable(GL_TEXTURE_2D);
	glDisable(GL_LIGHTING);
	glLineWidth(1.0f);

	for( int x = -(int)CANVASSIZE; x<=(int)CANVASSIZE;x++) { //glColor3f( ( (float)0x66 /(float)0xff ), ( (float)0x11/(float)0xff), ( (float)0x11/(float)0xff) ); glBegin( GL_LINES ); { glVertex3f( CANVASSIZE, -1.0f, (float)x ); glVertex3f( -CANVASSIZE, -1.0f, float(x) ); } glEnd(); glBegin( GL_LINES ); { glVertex3f( (float)x, -1.0f, CANVASSIZE ); glVertex3f( float(x), -1.0f, -CANVASSIZE ); } glEnd(); } } void drawSpaceSkyBox() { glEnable(GL_TEXTURE_2D); //glDisable(GL_LIGHTING); sfrx += STARFIELDROTATEX; sfry += STARFIELDROTATEY; sfrz += STARFIELDROTATEZ; // Clear the current textures (to draw space) //glMatrixMode(GL_TEXTURE); // glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); //glRotatef( sfrz, 0.0f, 0.0f, 1.0f); glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); // Rotate the whole model being drawn. glRotatef( sfrx, 1.0f, 0.0f, 0.0f ); glRotatef( sfry, 0.0f, 1.0f, 0.0f ); //glRotatef( sfrz, 0.0f, 0.0f, 1.0f ); glMatrixMode(GL_TEXTURE); //glRotatef( 90.0f, 1.0f, 0.0f, 0.0f ); glBindTexture(GL_TEXTURE_2D, earthTexture->myTexture );

	glMatrixMode(GL_MODELVIEW);
		erx += EROTX;
		ery += EROTY;

		glTranslatef( allStars[0].posx, allStars[0].posy, allStars[0].posz );
		glRotatef( erx, 1.0f, 0.0f, 0.0f );
		glRotatef( ery, 0.0f, 1.0f, 0.0f );
		// These rotate the earth so the United Staets 'faces' us
		glRotatef( -120.0f, 1.0f, 0.0f, 0.0f );
		// ^^^^ These rotate the earth so the United Staets 'faces' us

		gluSphere( myQuadratic, 30.0f, 30, 30 );

		glRotatef( 120.0f, 1.0f, 0.0f, 0.0f );

		glRotatef( -ery, 0.0f, 1.0f, 0.0f );
		glRotatef( -erx, 1.0f, 0.0f, 0.0f );
		glTranslatef( -allStars[0].posx, -allStars[0].posy, -allStars[0].posz );
	
	glMatrixMode(GL_TEXTURE);
		//glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		glBindTexture(GL_TEXTURE_2D, earthCloudsTexture->myTexture );
		glEnable( GL_BLEND );
		glColor4f( 1.0f, 1.0f, 1.0f, 0.5f );

	glMatrixMode(GL_MODELVIEW);
		ercx += EROTCX;
		ercy += EROTCY;

		glTranslatef( allStars[0].posx, allStars[0].posy, allStars[0].posz );
		glRotatef( ercx, 1.0f, 0.0f, 0.0f );
		glRotatef( ercy, 0.0f, 1.0f, 0.0f );

		// These rotate the earth so the United Staets 'faces' us
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
		glRotatef( -20.0f, 0.0f, 1.0f, 0.0f );

		gluSphere( myQuadratic, 34.0f, 30, 30 );

		glRotatef( 20.0f, 0.0f, 1.0f, 0.0f );
		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );

		glRotatef( -ercy, 0.0f, 1.0f, 0.0f );
		glRotatef( -ercx, 1.0f, 0.0f, 0.0f );
		glTranslatef( -allStars[0].posx, -allStars[0].posy, -allStars[0].posz );
		
	glMatrixMode(GL_TEXTURE);
		glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
		glDisable( GL_BLEND );
		//glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		glBindTexture(GL_TEXTURE_2D, blackHoleScrunch->myTexture );

	glMatrixMode(GL_MODELVIEW);
		bhrx += BHROTX; bhry += BHROTY; bhrz += BHROTZ;
		glRotatef( bhrx, 1.0f, 0.0f, 0.0f );
		glRotatef( bhry, 0.0f, 1.0f, 0.0f );
		glRotatef( bhrz, 0.0f, 0.0f, 1.0f );

		glTranslatef( 120.0f, 0.0f, 120.0f );
		glBegin( GL_QUADS );
			// Top Face
			glNormal3f( 0.0f, 1.0f, 0.0f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 0.0f, 20.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 40.0f, 20.0f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f(70.0f, 40.0f,  20.0f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f(70.0f, 0.0f, 20.0f);
		glEnd();
		glTranslatef( -120.0f, 0.0f, -120.0f );
		
		glRotatef( -bhrz, 0.0f, 0.0f, 1.0f );
		glRotatef( -bhry, 0.0f, 1.0f, 0.0f );
		glRotatef( -bhrx, 1.0f, 0.0f, 0.0f );

	glMatrixMode(GL_TEXTURE);
		glBindTexture(GL_TEXTURE_2D, sunSkin->myTexture );
		glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		sunx += SUNCX;
		suny += SUNCY;

		glTranslatef( allStars[1].posx, allStars[1].posy, allStars[1].posz );
		// These rotate the earth so the United Staets 'faces' us
		gluSphere( myQuadratic, 10.0f, 30, 30 );
		glTranslatef( -allStars[1].posx, -allStars[1].posy, -allStars[01].posz );
		
	glMatrixMode(GL_MODELVIEW);
		glDisable(GL_TEXTURE_2D);

		glBegin(GL_POINTS);
			for(int curStar = 2; curStar < NUMSTARS; curStar++) { glVertex3f( allStars[curStar].posx, allStars[curStar].posy, allStars[curStar].posz ); } glEnd(); // Rotate the whole model being drawn. //glRotatef( -sfrz, 0.0f, 0.0f, 1.0f ); glRotatef( -sfry, 0.0f, 1.0f, 0.0f ); glRotatef( -sfrx, 1.0f, 0.0f, 0.0f ); //glRotatef( -sfrz, 0.0f, 0.0f, 1.0f); glEnable(GL_TEXTURE_2D); } void drawTARDISInterior() { // TODO: DRAW THIS ALL INSIDE THE TARDIS!!!! // MOVE TO THE location of this entry way - this is effectively 0,0,0 // for the internal location glMatrixMode(GL_MODELVIEW); glTranslatef( 0.0f, INTERNALDOORYOFFSET, 0.0f ); #pragma region BOTTOMFLOOR_MAINENTRY glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, bottomFloorTexture->myTexture );
		glScalef( 8.0f, 8.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		gluDisk(myQuadratic,0.0f,20.0f,32,32);
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/8.0f, 1.0f/8.0f, 1.0f );

#pragma endregion BOTTOMFLOOR_MAINENTRY
#pragma region MAINFLOOR

	glMatrixMode(GL_TEXTURE);
		glBindTexture(GL_TEXTURE_2D, interiorWoodFloorTexture->myTexture );
		glScalef( 12.0f, 12.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, 106.0f /12.0f, 0.0f );

		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		// TODO: THERE is a break in this floor leading to the lower level. 
		// Gonna have to play with size info....
		gluPartialDisk(myQuadratic,46.0f/12.0f,206.0f/12.0f,32,32,0,360);
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

		glTranslatef( 0.0f, -(106.0f /12.0f), 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/12.0f, 1.0f/12.0f, 1.0f );


	glMatrixMode(GL_TEXTURE);
		glBindTexture(GL_TEXTURE_2D, consolePad->myTexture );
		glScalef( 2.0f, 2.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, 106.0f /12.0f, 0.0f );

		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		gluDisk(myQuadratic, 0.0f,46.0f/12.0f,32,32);
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

		glTranslatef( 0.0f, -(106.0f /12.0f), 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/2.0f, 1.0f/2.0f, 1.0f );

	// Seam divider between console and wood
	glMatrixMode(GL_TEXTURE);
		glBindTexture(GL_TEXTURE_2D, consolePad->myTexture );
		glScalef( 5.0f, 5.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, 106.0f /12.0f, 0.0f );

		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		gluDisk(myQuadratic, 0.0f,46.0f/12.0f,32,32);
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

		glTranslatef( 0.0f, -(106.0f /12.0f), 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/5.0f, 1.0f/5.0f, 1.0f );


#pragma endregion MAINFLOOR
#pragma region MAINFLOOR_ENTRY
	//glMatrixMode(GL_TEXTURE);
	//	glBindTexture(GL_TEXTURE_2D, interiorWoodFloorTexture->myTexture );
	//	glScalef( 12.0f, 12.0f, 1.0f );

	//glMatrixMode(GL_MODELVIEW);
	//	// Main floor positioning 
	//	glTranslatef( 0.0f, 106.0f /12.0f, 0.0f );

	//	glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
	//	gluPartialDisk(myQuadratic,46.0f/12.0f,206.0f/12.0f,32,32,0,360);
	//	glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

	//	glTranslatef( 0.0f, -(106.0f /12.0f), 0.0f );

	//glMatrixMode(GL_TEXTURE);
	//	glScalef( 1.0f/12.0f, 1.0f/12.0f, 1.0f );


#pragma endregion MAINFLOOR_ENTRY
#pragma region MAINFLOOR_TOPWALL

	glMatrixMode(GL_TEXTURE);
		glBindTexture(GL_TEXTURE_2D, interiorUpperWallTexture->myTexture );
		glScalef( 16.0f, 1.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, (106.0f/12.0f)+5.0f, 0.0f );

		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		gluCylinder( myQuadratic, 206.0f/12.0f, 206.0f/12.0f, 5.0f, 30, 30 );
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

		glTranslatef( 0.0f, -(106.0f /12.0f), 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/16.0f, 1.0f, 1.0f );

#pragma endregion MAINFLOOR_TOPWALL

#pragma region BELLY_MAINEXTERIORWALL
	//myOX += INTMOVX;
	//myOY += INTMOVY;

	glMatrixMode(GL_TEXTURE);
		
		glBindTexture(GL_TEXTURE_2D, interiorOuterWallTexture->myTexture );
		glScalef( 20.0f, 20.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, 5.0f, 0.0f );

		//glRotatef( myOX, 1.0f, 0.0f, 0.0f );
		//glRotatef( myOY, 0.0f, 1.0f, 0.0f );
		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		gluSphere( myQuadratic, (206.0f/12.0f)+6.0f, 30, 30 );
		//gluCylinder( myQuadratic,(206.0f/12.0f)+6.0f,(206.0f/12.0f)+6.0f,17.5f,32,32);
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
		//glRotatef( -myOY, 0.0f, 1.0f, 0.0f );
		//glRotatef( -myOX, 1.0f, 0.0f, 0.0f );

		glTranslatef( 0.0f, -5.0f, 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/20.0f, 1.0f/20.0f, 1.0f );

#pragma endregion BELLY_MAINEXTERIORWALL

		if( isFrontDoorOpen )
		{
			glEnable(GL_BLEND);
			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

			//glTranslatef( internalDoorPosition.posx, internalDoorPosition.posy, internalDoorPosition.posz );
			// glMatrixMode(GL_TEXTURE);

			// window is opaque
			glColor4f(	1.0f, 0.0f, 0.0f, 0.4f);

			glMatrixMode(GL_MODELVIEW);
				glBegin(GL_QUADS);
					// Front Face
					glTexCoord2f(0.0f, 0.0f); glVertex3f(internalDoorPosition.posx+17.0f, (106.0f/12.0f)-5.0f, -2.0f);
					glTexCoord2f(1.0f, 0.0f); glVertex3f(internalDoorPosition.posx+17.0f, (106.0f/12.0f)-5.0f,  +2.0f ); //(206.0f/12.0f)
					glTexCoord2f(1.0f, 1.0f); glVertex3f(internalDoorPosition.posx+17.0f, (106.0f/12.0f), +2.0f);
					glTexCoord2f(0.0f, 1.0f); glVertex3f(internalDoorPosition.posx+17.0f, (106.0f/12.0f), -2.0f);
				glEnd();

			glDisable(GL_BLEND);
			//glTranslatef( -internalDoorPosition.posx, -internalDoorPosition.posy, -internalDoorPosition.posz );
		}

	// MOVE TO THE location of this entry way - this is effectively 0,0,0 
	// for the internal location
	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, -INTERNALDOORYOFFSET, 0.0f );

}

void drawTARDISExterior()
{
	float basePlateStart = 2.25f/12.0f;
	float myTop = (86.75f/12.0f);
	float myHeight = 5.5f /12.0f;
	float myWid = 44.0f /12.0f;
	float offset = (myWid/2.0f)-(ONEINCH*6.0f);
	float roffset = (-myWid/2.0f)+(ONEINCH*6.0f);

	float tempVal = 0.0f;
	float offsetVal = 0.0f;

	// START DRAWING MAIN SECTION ---------------------------------------------------
	glPushMatrix();
	{
		glMatrixMode(GL_MODELVIEW);
			glTranslatef(0.0f, -1.0f, 0.0f); 

//#ifdef DOIT
#pragma region FLOORBOARDS
		// ------ START SECTION The main EXTERNAL floor board.
		glMatrixMode(GL_TEXTURE);
			glColor3f( 1.0f, 1.0f, 1.0f );
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef(12.0f, 1.0, 1.0f); // scale texture

			// ---------------------------------------------------------------------------
			// Draw the Bottom Plate
			// ---------------------------------------------------------------------------
			glBegin(GL_QUADS);
				// Front Face
				glNormal3f( 0.0f, 0.0f, 1.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0833333f,  0.0f,  2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0833333f,  0.0f,  2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0833333f,  0.125f,  2.0833333f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.08333330f, 0.125f,  2.0833333f);
				// Back Face
				glNormal3f( 0.0f, 0.0f,-1.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0833333f, 0.0f, -2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.0833333f, 0.0f, -2.0833333f);
				// Right Face
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0833333f, 0.0f, -2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.0833333f, 0.125f,  2.0833333f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.0833333f, 0.0f,  2.0833333f);
				// Left Face
				glNormal3f(-1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0833333f, 0.0f, -2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0833333f, 0.0f,  2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0833333f, 0.125f,  2.0833333f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0833333f, 0.125f, -2.0833333f);
			glEnd();

		// DESCALE
		glMatrixMode(GL_TEXTURE);
			glScalef(1/12.0f, 1.0, 1.0f); // scale texture

		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				// Top Face
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0833333f, 0.125f,  2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0833333f, 0.125f,  2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0833333f, 0.125f, -2.0833333f);
				// Bottom Face
				glNormal3f( 0.0f,-1.0f, 0.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0833333f, 0.0f, -2.0833333f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.0833333f, 0.0f, -2.0833333f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.0833333f, 0.0f,  2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0833333f, 0.0f,  2.0833333f);
			glEnd();
		// ------ END SECTION The main EXTERNAL floor board.

		// ------ START SECTION secondary floor board.
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef(12.0f, 1.0, 1.0f); // scale texture

		glMatrixMode(GL_MODELVIEW);
			glBegin(GL_QUADS);
				// Front Face
				glNormal3f( 0.0f, 0.0f, 1.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0833333f,  0.125f,  2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0833333f,  0.125f,  2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0f,  0.1875f,  2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f,  2.0f);
				// Back Face
				glNormal3f( 0.0f, 0.0f,-1.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.0f, 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.0833333f, 0.125f, -2.0833333f);
				// Right Face
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0f, 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.0f, 0.1875f,  2.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.0833333f, 0.125f,  2.0833333f);
				// Left Face
				glNormal3f(-1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0833333f, 0.125f,  2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 0.1875f,  2.0F);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f, -2.0f);
			glEnd();

		// DESCALE
		glMatrixMode(GL_TEXTURE);
			glScalef(1.0f/12.0f, 1.0, 1.0f); // scale texture

		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				// Top Face
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f,  2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0f, 0.1875f,  2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0f, 0.1875f, -2.0f);
			glEnd();
		
		// ------ END SECTION secondary floor board.
#pragma endregion FLOORBOARDS

#pragma region ONEINCHCORNERRODS
		// ------ START SECTION ONE
		//		  posts board.
		//			TODO: THIS ENTIRE SECTION WILL ROTATE 90 degrees for displaying.
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glColor4f( 1.0f, 0.5f, 0.6f, 0.7f ); 
			glScalef(1.0, 12.0, 1.0f); // scale texture

		glMatrixMode(GL_MODELVIEW);
			// Rod and Cap #1
			offsetVal = 0.041666f;
			tempVal = 2.0f - offsetVal;
			const float rodLength = 85.5f/12.0f;

			glTranslatef(tempVal, 0.1875f, tempVal); 
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			gluCylinder( myQuadratic, offsetVal, offsetVal, rodLength, 30, 30 );
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			glTranslatef(-(tempVal), -0.1875f, -(tempVal)); 

			glTranslatef(tempVal, rodLength + 0.1875f, tempVal); 
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			gluDisk(myQuadratic, 0.0,offsetVal,30,30);
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			glTranslatef(-(tempVal), -(rodLength + 0.1875f), -(tempVal)); 

			// Rod and Cap #2
			glTranslatef(tempVal, 0.1875f, -tempVal); 
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			gluCylinder( myQuadratic, offsetVal, offsetVal, rodLength, 30, 30 );
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			glTranslatef(-(tempVal), -0.1875f, (tempVal)); 

			glTranslatef(tempVal, rodLength+0.1875f, -tempVal); 
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			gluDisk(myQuadratic, 0.0,offsetVal,30,30);
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			glTranslatef(-(tempVal), -(rodLength+0.1875f), (tempVal)); 

			// Rod and Cap #3
			glTranslatef(-tempVal, 0.1875f, -tempVal); 
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			gluCylinder( myQuadratic, offsetVal, offsetVal, rodLength, 30, 30 );
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			glTranslatef((tempVal), -0.1875f, (tempVal)); 

			glTranslatef(-tempVal, rodLength+0.1875f, -tempVal); 
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			gluDisk(myQuadratic, 0.0,offsetVal,30,30);
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			glTranslatef((tempVal), -(rodLength+0.1875f), (tempVal)); 

			// Rod and Cap #4
			glTranslatef(-tempVal, 0.1875f, tempVal); 
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			gluCylinder( myQuadratic, offsetVal, offsetVal, rodLength, 30, 30 );
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			glTranslatef((tempVal), -0.1875f, -(tempVal)); 

			glTranslatef(-tempVal, rodLength+0.1875f, tempVal); 
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			gluDisk(myQuadratic, 0.0,offsetVal,30,30);
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			glTranslatef((tempVal), -(rodLength+0.1875f), -(tempVal)); 

		glMatrixMode(GL_TEXTURE);
			glScalef(1.0f, 1.0f/12.0f, 1.0f); // scale texture
			glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); 

#pragma endregion ONEINCHCORNERRODS
#pragma region FRONTANDBACKPLANKS

		// Front LEFT 1" plank
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef(6.0f, 1.0f, 1.0f); // scale texture

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
			glEnd();
		
		// End CAP
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

		// Front LEFT 1" plank
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f, -( 2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
			glEnd();
		
		// End CAP
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
			glEnd();
		
		// End CAP
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
			glEnd();
		
		// End CAP
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef(1.0f/6.0f, 1.0f, 1.0f); // scale texture

#pragma endregion FRONTANDBACKPLANKS
#pragma region RIGHTANDLEFTPLANKS
		// Front LEFT 1" plank
		glMatrixMode(GL_TEXTURE);
			glScalef(6.0f, 1.0f, 1.0f); // scale texture

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f);
			glEnd();
		
		// End CAP
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-( 2.0f - ONEINCH), 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, -2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -2.0f);
			glEnd();
		
		// End CAP
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, -2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -2.0f);
			glEnd();
		
		// End CAP
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f);
			glEnd();
		
		// End CAP
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef(1.0f/6.0f, 1.0f, 1.0f); // scale texture

#pragma endregion RIGHTANDLEFTPLANKS
#pragma region STRUCTURALSUPPORTS
	// Texture alignment checked....
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glColor4f( 0.8f, 0.5f, 1.0f, 1.0f );
			glScalef( 1.0f, 6.0f, 1.0f );

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, basePlateStart, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  basePlateStart, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, basePlateStart, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  basePlateStart, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, basePlateStart, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH,  basePlateStart, 2.0f - (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, basePlateStart, -2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH,  basePlateStart, -2.0f + (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, basePlateStart, -2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  basePlateStart, -2.0f + ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, basePlateStart, -2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  basePlateStart, -2.0f + ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, basePlateStart, 2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + ONEINCH,  basePlateStart, 2.0f - (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, basePlateStart, -2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + ONEINCH,  basePlateStart, -2.0f + (ONEINCH*5.0f));
			glEnd();

			// START INNER
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), basePlateStart, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  basePlateStart, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), basePlateStart, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  basePlateStart, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), basePlateStart, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  basePlateStart, -2.0f + ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), basePlateStart, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  basePlateStart, -2.0f + ONEINCH);
			glEnd();

		// Second Four
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), basePlateStart, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH,  basePlateStart, 2.0f - (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), basePlateStart, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH,  basePlateStart, -2.0f + (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), basePlateStart, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + ONEINCH,  basePlateStart, 2.0f - (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), basePlateStart, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + ONEINCH,  basePlateStart, -2.0f + (ONEINCH*5.0f));
			glEnd();

		// END CAPS
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
			glEnd();
			
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
			glEnd();
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
			glEnd();
			
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
			glEnd();
			
		glMatrixMode(GL_TEXTURE);
			glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
			glScalef( 1.0f, 1.0f/6.0f, 1.0f );

		// Front Door 4"x4"
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			
		myTop = (80.0f+2.25f)/12.0f;
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH),  myTop, 2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH),  myTop, 2.0f-(4.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH),  myTop, 2.0f-(4.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH),  myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH),  myTop, 2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH),  myTop, 2.0f);
			glEnd();

		// End front/door structural reinforcement
		
		// Start all the way around structural reinforcement
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef( 3.0f, 1.0f, 1.0f );

		myTop = (85.5f+2.25)/12.0f;
		for( int x = 0;x<4;x++) { glMatrixMode(GL_MODELVIEW); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH)); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH)); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.5f*ONEINCH)); glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f); glEnd(); glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); } glMatrixMode(GL_TEXTURE); glScalef( 1.0f/3.0f, 1.0f, 1.0f ); glMatrixMode(GL_MODELVIEW); glRotatef( -360.0f, 0.0f, 1.0f, 0.0f ); #pragma endregion STRUCTURALSUPPORTS #pragma region ROOFSIDEPANELS // 2" x 4" x 44" myTop = (86.5f+2.25f+1.5f)/12.0f; //top at (86.5f+2.25+1.5f)/12.0f = 90.25 // "Tier 1" glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef( 1.0f, 3.0f, 1.0f );

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop - (4.0f*ONEINCH), 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop, -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop, -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH),  myTop - (4.0f*ONEINCH), -2.0f + (2.0f*ONEINCH));
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef( 1.0f, 1.0f/3.0f, 1.0f );

			// "Tier 2"
		glMatrixMode(GL_TEXTURE);
			// TODO: Need a more interesting panelled top
			glBindTexture(GL_TEXTURE_2D, tardisTop->myTexture );

		glMatrixMode(GL_MODELVIEW);
			myTop= myTop + 1.5f*ONEINCH;
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop - (4.0f*ONEINCH), 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (2.5f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.5f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop, -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (2.5f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.5f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop, -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.5f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.5f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop, -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop, -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.5f*ONEINCH),  myTop - (4.0f*ONEINCH), -2.0f + (2.5f*ONEINCH));
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef( 1.0f, 3.0f, 1.0f );

		myTop = (86.5f+2.25f+1.5f)/12.0f; //top at (86.5f+2.25+1.5f)/12.0f = 90.25
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH),  myTop, 2.0f - (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH),  myTop, -2.0f + (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH),  myTop, -2.0f + (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH),  myTop, -2.0f + (2.0f*ONEINCH));
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef( 1.0f, 1.0f/3.0f, 1.0f );


#pragma endregion ROOFSIDEPANELS
#pragma region ROOFPANEL

		glMatrixMode(GL_TEXTURE);
			// TODO: Need a more interesting panelled top
			glBindTexture(GL_TEXTURE_2D, tardisTop->myTexture );

		myTop = (86.5f+2.25f+3.0f)/12.0f; //top at (86.5f+2.25+1.5f)/12.0f = 90.25
		glMatrixMode(GL_MODELVIEW);
		for( int x=0;x<4;x++) { glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH)); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + (ONEINCH*3.0f), 4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + (ONEINCH*3.0f), 4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH)); glEnd(); glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); } glRotatef( -360.0f, 0.0f, 1.0f, 0.0f ); #pragma endregion ROOFPANEL #pragma region LIGHTMOUNT myTop = (86.5f+2.25f+6.0f)/12.0f; glMatrixMode(GL_MODELVIEW); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glEnd(); #pragma endregion LIGHTMOUNT #pragma region TOPLIGHTFIXTURE glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, glassFixture->myTexture );
			
		myTop = (86.5f+2.25f+7.0f)/12.0f; 
		glMatrixMode(GL_MODELVIEW);
			glTranslatef( 0.0f, myTop, 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (2.125f /12.0f ), (2.125f /12.0f ), (6.0f /12.0f ),30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -myTop, 0.0f );

			glTranslatef( 0.0f, myTop + 0.5f, 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluDisk( myQuadratic, 0.0f, (2.125f/12.0f), 30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -(myTop +0.5f), 0.0f );

		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, tardisTop->myTexture );

		// The retaining rods
		glMatrixMode(GL_MODELVIEW);
			glTranslatef( (1.65f /12.0f ), myTop, (1.65f /12.0f ) );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (0.135f /12.0f ), (0.135f /12.0f ), (6.0f /12.0f ),30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( -(1.65f /12.0f ), -myTop, -(1.65f /12.0f ) );

			glTranslatef( (1.65f /12.0f ), myTop, -(1.65f /12.0f ) );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (0.135f /12.0f ), (0.135f /12.0f ), (6.0f /12.0f ),30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( -(1.65f /12.0f ), -myTop, (1.65f /12.0f ) );


			glTranslatef( -(1.65f /12.0f ), myTop, -(1.65f /12.0f ) );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (0.135f /12.0f ), (0.135f /12.0f ), (6.0f /12.0f ),30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( (1.65f /12.0f ), -myTop, (1.65f /12.0f ) );

			glTranslatef( -(1.65f /12.0f ), myTop, (1.65f /12.0f ) );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (0.135f /12.0f ), (0.135f /12.0f ), (6.0f /12.0f ),30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( (1.65f /12.0f ), -myTop, -(1.65f /12.0f ) );

			// blue ring around the top
			glTranslatef( 0.0f, myTop + (5.5f/12.0f), 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (2.2f/12.0f ), (2.2f/12.0f ), ONEINCH/2,30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -(myTop + (5.5f/12.0f)), 0.0f );

			glTranslatef( 0.0f, myTop + (6.025f/12.0f), 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluDisk( myQuadratic, 0.0f, (2.35f/12.0f ), 30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -(myTop + (6.025f/12.0f)), 0.0f );

			glTranslatef( 0.0f, myTop + (5.95f/12.0f), 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, ONEINCH*2.55f, ONEINCH/10, ONEINCH*1.5, 30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -(myTop + (5.95f/12.0f)), 0.0f );

		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, screwDown->myTexture );

		glMatrixMode(GL_MODELVIEW);
			// The top lock for the lamp fixture
			myTop = myTop + (5.95f/12.0f) + ONEINCH*1.45f;
			glTranslatef( 0.0f, myTop, 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, ONEINCH/6, ONEINCH/6, ONEINCH/3, 30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -myTop, 0.0f );

		// It's cap
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, screwDownTop->myTexture ); // 
			
		glMatrixMode(GL_MODELVIEW);
			// The top lock for the lamp fixture	
			myTop = myTop + ONEINCH/3;
			glTranslatef( 0.0f, myTop, 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluDisk( myQuadratic, 0, ONEINCH/6 , 30, 30 ); 
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -myTop, 0.0f );

#pragma endregion TOPLIGHTFIXTURE 

#pragma region WALLPANELS
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef( 3.0f, 1.0f, 1.0f );

		myTop = 2.25f/12.0f; 
		// OTHER THREE WALLS
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, -2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + 56.5f/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop + 56.5f/12.0f, -2.0f + ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, myTop, 19.0f/12.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, myTop, -19.0f/12.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, myTop + 56.5f/12.0f, -19.0f/12.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, myTop + 56.5f/12.0f, 19.0f/12.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, myTop, 19.0f/12.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, myTop, -19.0f/12.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, myTop + 56.5f/12.0f, -19.0f/12.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, myTop + 56.5f/12.0f, 19.0f/12.0f);
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef( 1.0f/3.0f, 1.0f, 1.0f );

		glMatrixMode(GL_TEXTURE);
			glScalef( 1.0f, 2.0f, 1.0f );

		glMatrixMode(GL_MODELVIEW);
			myTop = (76.0f+2.25f+4.0f)/12.0f; 
			for( int x=0;x<4;x++) { glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, -2.0f + ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop, -2.0f + ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop -(6.5f/12.0f), -2.0f + ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop -(6.5f/12.0f), -2.0f + ONEINCH); glEnd(); glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); } glRotatef( -360.0f, 0.0f, 1.0f, 0.0f ); glMatrixMode(GL_TEXTURE); glScalef( 1.0f, 1.0f/2.0f, 1.0f ); #pragma endregion WALLPANELS #pragma region WALLHINGE glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef( 1.0f, 12.0f, 0.0f );

		myTop = (76.0f+2.25f)/12.0f; 

		glMatrixMode(GL_MODELVIEW);
		// Only draw front strut if the front door is closed. 
		if( !isFrontDoorOpen )
		{
			for( int y=0; y <=1; y += 1 ) { glTranslatef( (y==0)?0.0f:internalDoorPosition.posx, (y==0)?0.0f:internalDoorPosition.posy, (y==0)?0.0f:internalDoorPosition.posz ); glMatrixMode(GL_MODELVIEW); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.75/12.0f, myTop, 2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), 2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), 2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop , 2.0f + (ONEINCH/4)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.75/12.0f, myTop, 2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), 2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), 2.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(0.75/12.0f, myTop , 2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop, 2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), 2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), 2.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop , 2.0f); glEnd(); glTranslatef( (y==0)?0.0f:-internalDoorPosition.posx, (y==0)?0.0f:-internalDoorPosition.posy, (y==0)?0.0f:-internalDoorPosition.posz ); } } glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.75/12.0f, myTop, -2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), -2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), -2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop , -2.0f + (ONEINCH/4)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.75/12.0f, myTop, -2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), -2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), -2.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(0.75/12.0f, myTop , -2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop, -2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), -2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), -2.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop , -2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop, 0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop - (76.0f/12.0f), -0.75/12.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop , -0.75/12.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop, 0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f , myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( -2.0f, myTop , 0.75/12.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop, -0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop - (76.0f/12.0f), -0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop - (76.0f/12.0f), -0.75/12.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, myTop , -0.75/12.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f -(ONEINCH/4), myTop, 0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH/4), myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH/4), myTop - (76.0f/12.0f), -0.75/12.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH/4), myTop , -0.75/12.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH/4), myTop, 0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH/4), myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f, myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, myTop , 0.75/12.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH/4), myTop, -0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH/4), myTop - (76.0f/12.0f), -0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f, myTop - (76.0f/12.0f), -0.75/12.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, myTop , -0.75/12.0f); glEnd(); glMatrixMode(GL_TEXTURE); glScalef( 1.0f, 1.0f/12.0f, 0.0f ); #pragma endregion WALLHINGE #pragma region FRONTDOOR glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef(3.0f, 1.0f, 1.0f );

		myTop = 2.25f/12.0f; 
		// THE FRONT DOOR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		if( !isFrontDoorOpen )
		{
			for( int y=0; y <=1; y += 1 ) { glTranslatef( (y==0)?0.0f:internalDoorPosition.posx, (y==0)?0.0f:internalDoorPosition.posy, (y==0)?0.0f:internalDoorPosition.posz ); glMatrixMode(GL_MODELVIEW); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/2)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop, 2.0f-(ONEINCH/2)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH/2)); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH/2)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/2)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop, 2.0f-(ONEINCH/2)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH/2)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH/2)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f); glEnd(); glTranslatef( (y==0)?0.0f:-internalDoorPosition.posx, (y==0)?0.0f:-internalDoorPosition.posy, (y==0)?0.0f:-internalDoorPosition.posz ); } } // Start Drawing Panels glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, tardisTop->myTexture );

		glMatrixMode(GL_MODELVIEW);
		for( int x = 0; x<4; x++ )
		{			
			// Only draw the front door if it's closed, draw the other sides all the time. 
			if( (x==0 && !isFrontDoorOpen ) ) 
			{
				for( int y=0; y <=1; y += 1 )
				{
					myTop = 2.25f/12.0f;
					glTranslatef(	(y==0)?0.0f:internalDoorPosition.posx,
									(y==0)?0.0f:internalDoorPosition.posy, 
									(y==0)?0.0f:internalDoorPosition.posz );

					glBegin( GL_QUADS );
						glNormal3f( 1.0f, 0.0f, 0.0f);
						glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
						glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (4.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (4.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glEnd();

					glBegin( GL_QUADS );
						glNormal3f( 1.0f, 0.0f, 0.0f);
						glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
						glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 1.0f); glVertex3f(-15.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glEnd();

					glBegin( GL_QUADS );
						glNormal3f( 1.0f, 0.0f, 0.0f);
						glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
						glTexCoord2f(0.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 1.0f); glVertex3f(15.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glEnd();

					glBegin( GL_QUADS );
						glNormal3f( 1.0f, 0.0f, 0.0f);
						glTexCoord2f(0.0f, 0.0f); glVertex3f(3.25f/12.0f, myTop, 2.0f-(ONEINCH/4));
						glTexCoord2f(0.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.25f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glEnd();

					for( int z = 0; z<4; z++ ) { myTop+=18.0/12.0f; if( z==0 ) myTop+= 0.5f/12.0f; glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (3.5f/12.0f), 2.0f-(ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (3.5f/12.0f), 2.0f-(ONEINCH/4)); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4)); glEnd(); } glTranslatef( (y==0)?0.0f:-internalDoorPosition.posx, (y==0)?0.0f:-internalDoorPosition.posy, (y==0)?0.0f:-internalDoorPosition.posz ); } } else if ( x>0 ) 
			{
				myTop = 2.25f/12.0f;
				glBegin( GL_QUADS );
					glNormal3f( 1.0f, 0.0f, 0.0f);
					glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (4.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (4.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
				glEnd();

				glBegin( GL_QUADS );
					glNormal3f( 1.0f, 0.0f, 0.0f);
					glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 1.0f); glVertex3f(-15.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
				glEnd();

				glBegin( GL_QUADS );
					glNormal3f( 1.0f, 0.0f, 0.0f);
					glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glTexCoord2f(0.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 1.0f); glVertex3f(15.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
				glEnd();

				glBegin( GL_QUADS );
					glNormal3f( 1.0f, 0.0f, 0.0f);
					glTexCoord2f(0.0f, 0.0f); glVertex3f(3.25f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glTexCoord2f(0.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.25f/12.0f, myTop, 2.0f-(ONEINCH/4));
				glEnd();

				for( int z = 0; z<4; z++ ) { myTop+=18.0/12.0f; if( z==0 )myTop+= 0.5f/12.0f; glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (3.5f/12.0f), 2.0f-(ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (3.5f/12.0f), 2.0f-(ONEINCH/4)); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4)); glEnd(); } } glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); } glRotatef( -360.0f, 0.0f, 1.0f, 0.0f ); glMatrixMode(GL_TEXTURE); glScalef(1.0f/3.0f, 1.0f, 1.0f ); #pragma endregion FRONTDOOR #pragma region FRONTDOORSIGNS if( !isFrontDoorOpen ) { glMatrixMode(GL_TEXTURE); // glRotatef( 180.0, 1.0f, 0.0f, 0.0f ); glBindTexture(GL_TEXTURE_2D, publicTardisSign->myTexture );

		myTop = 56.75f/12.0f;
		// THE FRONT DOOR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop, 2.0f-(ONEINCH/3));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.25f/12.0f, myTop, 2.0f-(ONEINCH/3));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop - 14.5f/12.0f, 2.0f-(ONEINCH/3));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-15.0f/12.0f, myTop - 14.5f/12.0f, 2.0f-(ONEINCH/3));
			glEnd();

		glMatrixMode(GL_TEXTURE);
//			glRotatef( -180.0, 1.0f, 0.0f, 0.0f );
		}

#pragma endregion FRONTDOORSIGN

// ------------------------------------------
// NO LIGHTING ON THE POLICE SIGN and SIGN BACK!!!!!!!!
// ------------------------------------------
#pragma region TARDISFRONTSIGNBACK
	myTop = (86.75f/12.0f);
	for( int x=0;x<4;x++) { // FRONT 5.5"x44"x1" plank - top is 86.75 glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, prismaticSkin->myTexture );
			glScalef( 1.0f, 3.0f, 0.0f );
			glTranslatef(myX, myY, 0.0); 

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, myTop, -(myWid/2.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, myTop, myWid/2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop -myHeight, myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, myTop -myHeight, -(myWid/2.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop, -(myWid/2.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f - ONEINCH, myTop, myWid/2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f - ONEINCH, myTop -myHeight, myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop -myHeight, -(myWid/2.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop, -myWid/2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, myTop, -myWid/2.0f );
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop -myHeight, -myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop -myHeight, -myWid/2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop, myWid/2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, myTop, myWid/2.0f );
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop -myHeight, myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop -myHeight, myWid/2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop, myWid/2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f - ONEINCH, myTop, -myWid/2.0f );
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop, -myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, myTop, myWid/2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop - myHeight , myWid/2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f - ONEINCH, myTop- myHeight , -myWid/2.0f );
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop- myHeight , -myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, myTop- myHeight , myWid/2.0f);
			glEnd();

		// FRONT PLATE DRAWING DONE
		glRotatef(90.0f, 0.0f, 1.0f, 0.0f );

		glMatrixMode(GL_TEXTURE);
			glTranslatef(-myX, -myY, 0.0); 
			glScalef( 1.0f, 1.0f/3.0f, 0.0f );
		}

		glRotatef(-360.0f, 0.0f, 1.0f, 0.0f );
#pragma endregion TARDISFRONTSIGNBACK
#pragma region POLICEBOXTOPSIGNFRONT
		for( int x=0;x<4;x++) { glMatrixMode(GL_TEXTURE); glTranslatef(myCX, myCY, 0.0f); glBindTexture(GL_TEXTURE_2D, spaceTexture->myTexture );
			glScalef( 1.0f, 6.0f, 0.0f );
			//glRotatef( 90, 1.0f, 0.0f, 0.0f );

		// THIS SECTION DRAWS THE 
		// START FRONT PLATE "POLICE BOX" Sign retainer
		// LEFTSIDE of the police sign
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop - myHeight, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, offset);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, offset);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop, offset);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop-myHeight+(ONEINCH*0.5f), offset-(ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop-(ONEINCH*0.5f), offset-(ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, offset);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + ONEINCH, offset-ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + (ONEINCH/2), offset-(ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), offset-(ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, offset-ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight + ONEINCH, offset-ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + ONEINCH, offset-ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, offset-ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop- ONEINCH, offset-ONEINCH);
			glEnd();

		// RIGHT SIDE of the police sign
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop - myHeight, roffset );
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, roffset );
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, roffset );
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop, roffset );
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, roffset );
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop-myHeight+(ONEINCH*0.5f), roffset +(ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop-(ONEINCH*0.5f), roffset +(ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, roffset );
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + ONEINCH, roffset +ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + (ONEINCH/2), roffset +(ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), roffset +(ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, roffset +ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight + ONEINCH, roffset +ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + ONEINCH, roffset +ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, roffset +ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop- ONEINCH, roffset +ONEINCH);
			glEnd();

		// TOP AND BOTTOM SIDE of the police sign
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, offset);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, roffset);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop, roffset);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop - myHeight, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, offset);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, roffset);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop - myHeight, roffset);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), offset- (ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), roffset+ (ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, roffset);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop  - myHeight + (ONEINCH/2), offset- (ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop  - myHeight + (ONEINCH/2), roffset+ (ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, roffset);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + (ONEINCH/2), offset  - (ONEINCH/2));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight +  (ONEINCH/2), roffset + (ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight +  ONEINCH, roffset+ (ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight +  ONEINCH, offset - (ONEINCH/2));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), offset  - (ONEINCH/2));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), roffset + (ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, roffset+ (ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, offset - (ONEINCH/2));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, offset  - (ONEINCH/2));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, roffset + (ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - ONEINCH, roffset + (ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - ONEINCH, offset - (ONEINCH/2));
			glEnd();

		// DESCALE
		glMatrixMode(GL_TEXTURE);
			glScalef( 1.0f, 1.0f/6.0f, 0.0f );
			glTranslatef(-myCX, -myCY, -0.0); 

		// And the POLICE BOX SIGN (YAY!)
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, policeBoxSign->myTexture );

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - ONEINCH, offset  - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - ONEINCH, roffset + ONEINCH);
				glTexCoord2f(90.0f/1024.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight + ONEINCH, roffset + ONEINCH);
				glTexCoord2f(90.0f/1024.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight + ONEINCH, offset - ONEINCH );
			glEnd();
		glRotatef(90.0f, 0.0f, 1.0f, 0.0f );
		}
		glRotatef(-360.0f, 0.0f, 1.0f, 0.0f );

#pragma endregion POLICEBOXTOPSIGNFRONT

#pragma region TARDISWINDOWS
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, clearGlassTexture->myTexture );
			glEnable(GL_BLEND);
			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

		myTop = (76.0f+2.25f-3.5f)/12.0f; 
		for( int x=0;x<4;x++) { // MAIN STRUT glMatrixMode(GL_MODELVIEW); if( (!isFrontDoorOpen && x==0 )|| x>0 )
			{
				// window is opaque
				glColor4f(	0.7f, 0.7f, 1.0f, 0.4f);

				if( x==0)
				{
				for( int y=0; y <=1; y += 1 ) { glTranslatef( (y==0)?0.0f:internalDoorPosition.posx, (y==0)?0.0f:internalDoorPosition.posy, (y==0)?0.0f:internalDoorPosition.posz ); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glEnd(); glTranslatef( (y==0)?0.0f:-internalDoorPosition.posx, (y==0)?0.0f:-internalDoorPosition.posy, (y==0)?0.0f:-internalDoorPosition.posz ); } } else { // window is opaque glColor4f( 0.7f, 0.7f, 1.0f, 0.4f); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glEnd(); } glColor4f( 1.0f, 1.0f,1.0f, 1.0f ); glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); } } glRotatef( -360.0f, 0.0f, 1.0f, 0.0f ); glMatrixMode(GL_TEXTURE); glDisable(GL_BLEND); #pragma endregion TARDISWINDOWS } glPopMatrix(); } int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing { if( isRightButtonPressed && isLeftButtonPressed ) { xpos -= (float)sin(heading*piover180) * 0.05f; zpos -= (float)cos(heading*piover180) * 0.05f; } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer glLoadIdentity(); // Reset The View GLfloat xtrans = -xpos; GLfloat ztrans = -zpos; GLfloat ytrans = -walkbias-0.25f; GLfloat sceneroty = 360.0f - yrot; // Only 'rotate' the camera if the mouse button is pressed and it's been checked. // This creates a 'snap to' effect for the camera when the mouse is unpressed, but // it's so much extra work to figure out axes and rotational positions to make it // appear natural, I have opted to retain the snap to for simplicity's sake. if( creatorRotation->y != 0.0f && isRightButtonPressed )
	{
		glRotatef(-1 * 90.0f * creatorRotation->z, 1.0f, 0.0f, 0.0f);
		glRotatef(-1 * 90.0f * creatorRotation->x, 0.0f, 1.0f, 0.0f);
	}

	glRotatef(lookupdown,0.0f,0,0);
	glRotatef(sceneroty,0,1.0f,0);

	glTranslatef(xtrans, ytrans, ztrans);
	
	myX += MOVX;
	myY += MOVY;
	myCX += CMOVX;
	myCY += CMOVY;

	// Set the creator's location
	glTranslatef( 0.0f, -creatorLocation->y, -0.0f );
	
	drawSpaceSkyBox();
	if( isGridOn )
		drawGrid();
	drawFloor();
	
	drawTARDISExterior();
	drawTARDISInterior();

	

	if( isHudOn )
		drawHUD();

	// What I need TODO/ 'to work on' from here:
	// 1) The terrain looks unrealnot real, there's jaggies making it look unnatural. 
	//    So gotta find out what effects will get it to look more natural. 
	//    So the next model will focus on basic objects with realism and blending, 
	//    materials and lighting.
	// 3) Next version will work on viewport / "Bigger on the inside g


	// -----------------------------------------------------------------------
	// ALWAYS PREPARE the model for the final "view" for rendering...
	// -----------------------------------------------------------------------
	glMatrixMode(GL_MODELVIEW); 
		glDepthMask(GL_TRUE);
		glEnable(GL_DEPTH_TEST);
		glEnable(GL_TEXTURE_2D);
	//	glDisable(GL_LIGHTING);

	return TRUE;										// Everything Went OK
}

float distanceFromMeIn3D(STARPOINT point)
{
   float diff_x, diff_y, diff_z;    // to store differences along x, y and z axes
   float distance;                  // to store final distance value
 
   // calculate the difference between the two points
   diff_x = point.posx - 0.0f;
   diff_y = point.posy - 0.0f;
   diff_z = point.posz - 0.0f; 
 
   // calculate the Euclidean distance between the two points
   distance = sqrt(pow(diff_x,2)+pow(diff_y,2)+pow(diff_z,2));
 
   return distance;  // return the distance as a float
}

void MakeItSoNumberOne()
{
	myQuadratic=gluNewQuadric();
	gluQuadricNormals(myQuadratic, GLU_SMOOTH);	
	gluQuadricTexture(myQuadratic, GL_TRUE); // was GL_TRUE

	// General personal rules for texture loading:
	// Bitmap (.bmp extension): If it's going to be rotated or tiled dynamically (animations), 
	//		then it has to be bitmap because the libraries I am using has compatability issues
	// Other image formats: work perfectly fine for static placement and are preferred (size)

	// External Textures
 	woodTexture = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Graphics/TardisSkin.bmp"); 
 	bareWoodTexture = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Graphics/Wood2.bmp"); 
	spaceTexture = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Data/Space.bmp");				// Tiled and animated
	externalFloorTexture = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Graphics/tundra.bmp");	// Tiled
	policeBoxSign = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Graphics/PBMainSign.jpg");
	tardisTop = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Graphics/TardisTop.jpg");
	glassFixture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/glass.jpg");
	screwDown = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/ScrewDown.jpg");
	screwDownTop = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/ScrewDownTop.jpg");
	clearGlassTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/GlassTexture.jpg");
	publicTardisSign = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/PoliceBoxoorSign.jpg");
	prismaticSkin = new  GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/PRISMATIC.bmp");		// Tiled and animated
	blackHoleScrunch = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/BlackHole.bmp");		// Transparency not showing, and the black is coming across impure with the other SOIL LIB 
	earthTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/EarthOriginal1024.jpg");
	earthCloudsTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/EarthCloudTexture.jpg");
	sunSkin = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/sun.jpg");
	
	// Internal textures
	bottomFloorTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Floor/BottomFloor3.bmp");
	interiorWoodFloorTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Floor/Carpet.bmp");
	interiorUpperWallTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/BrickWall/BrickWall.bmp");
	interiorOuterWallTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Wall/Wall3.bmp"); // wall1 is 2nd fave so far
	consolePad  = new GLSkin("C:/develop/Project T.A.R.D.I.S/Floor/WoodFloorMyFavorite.bmp"); // new GLSkin("C:/develop/Project T.A.R.D.I.S/Console/Floor2.bmp"); 

	// Build the stars
	for(int curStar = 2; curStar < NUMSTARS; curStar++)
		{
			do {
			allStars[curStar].posx = (float)(rand() % 200);
			allStars[curStar].posy = (float)(rand() % 200);
			allStars[curStar].posz = (float)(rand() % 200);

			if( (rand() % 2 ) == 1 ) 
				allStars[curStar].posx = -allStars[curStar].posx;
			if( (rand() % 2 ) == 1 ) 
				allStars[curStar].posy = -allStars[curStar].posy;
			if( (rand() % 2 ) == 1 ) 
				allStars[curStar].posz = -allStars[curStar].posz;
			}
			while( distanceFromMeIn3D( allStars[curStar] ) <= 20.0 ); } //Earth's Position allStars[0].posx = -80.0f; allStars[0].posy = 10.0f; allStars[0].posz = 130.0f; //Sun's Position allStars[1].posx = -40.0f; allStars[1].posy = 30.0f; allStars[1].posz = 100.0f; // After all the textures have loaded - set the lighting //Use the color as the ambient and diffuse material glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); //White specular material color, shininess 16 /*glMaterialfv(GL_FRONT, GL_SPECULAR, white); glMaterialf(GL_FRONT, GL_SHININESS, 16.0f);*/ internalDoorPosition.posx = 0.0f; internalDoorPosition.posy = INTERNALDOORYOFFSET + (106.0f/12.0f); internalDoorPosition.posz = (106.0f/12.0f)+6.0f; internalCharacterStartLocation.posx = internalDoorPosition.posx; internalCharacterStartLocation.posy = internalDoorPosition.posy + 4.0f; // five feet off the floor internalCharacterStartLocation.posz = internalDoorPosition.posz - 1.0f; moveToExternalStartingLocation(); } void gitOuttaDodge() { delete woodTexture; delete spaceTexture; delete policeBoxSign; delete bareWoodTexture; delete tardisTop; delete glassFixture; delete screwDown; delete screwDownTop; delete clearGlassTexture; delete publicTardisSign; delete prismaticSkin; delete earthTexture; delete blackHoleScrunch; delete sunSkin; delete consolePad; // delete the internal textures delete bottomFloorTexture; delete interiorWoodFloorTexture; delete interiorUpperWallTexture; delete interiorOuterWallTexture; delete externalFloorTexture; delete earthCloudsTexture; // Delete positional and locational information delete creatorLocation; delete creatorRotation; // Delete the HUD delete myCanvas; gluDeleteQuadric(myQuadratic); // Delete The Quadratic To Free System Resources OutputMemoryLeaksDetected(); return; } // ---------------------------------------------------------------------------- // Author: Q // FileName: TARDIS.CPP // // Description: Contains the code for the T.A.R.D.I.S. // ---------------------------------------------------------------------------- #include "ACME.H" STARPOINT allStars[NUMSTARS]; POSITION internalDoorPosition; POSITION internalCharacterStartLocation; const float MOVX = 0.0100f;// 0.005 const float MOVY = 0.01f; const float CMOVX = 0.001f; const float CMOVY = 0.0004f; const float INTERNALDOORYOFFSET = -100.0f; float erx = 0.0f; float ery = 0.0f; const float EROTX = 0.0f; const float EROTY = 0.1f; // Earth's Clouds float ercx = 0.0f; float ercy = 0.0f; const float EROTCX = 0.0f; const float EROTCY = -0.1f; float sunx = 0.0f; float suny = 0.0f; const float SUNCX = 0.0f; const float SUNCY = 0.1f; // Black Hole's rotation float bhrx = 0.0f; float bhry = 0.0f; float bhrz = 0.0f; const float BHROTX = 0.0f; const float BHROTY = 0.1f; const float BHROTZ = 0.0f; float sfrx = 0.000f; float sfry = 0.000f; float sfrz = 0.000f; const float STARFIELDROTATEX = 0.01f; const float STARFIELDROTATEY = 0.05f; //1f; const float STARFIELDROTATEZ = 0.1f; const float ONEINCH = 1.0f/12.0f; int curColor = 0x000000; // Canvas Sizefor main 'flooring' const float CANVASSIZE = 20.0f; float myX = MOVX, myY = MOVY; float myCX = MOVX, myCY = MOVY; float myRX = 0.0001f; float myROS = 0.0f; const float INTMOVX = 0.01f; // 0.005 const float INTMOVY = 0.05f; float myOX = INTMOVX, myOY = INTMOVY; //float myCX = INTMOVX, myCY = INTMOVY; extern GLPosition3D *creatorLocation; extern GLRotation3D *creatorRotation; // Toggles for editting bool isGridOn = false; bool isRoomOn = true; bool isHudOn = false; bool isFrontDoorOpen = false; bool externalView = true; // Skins (textures) used GLSkin *woodTexture; GLSkin *bareWoodTexture; GLSkin *spaceTexture; GLSkin *externalFloorTexture; GLSkin *policeBoxSign; GLSkin *tardisTop; GLSkin *glassFixture; GLSkin *screwDown; GLSkin *screwDownTop; GLSkin *clearGlassTexture; GLSkin *publicTardisSign; GLSkin *prismaticSkin; GLSkin *earthTexture; GLSkin *blackHoleScrunch; GLSkin *earthCloudsTexture; GLSkin *sunSkin; GLSkin *interiorUpperWallTexture; GLSkin *interiorOuterWallTexture; GLSkin *consolePad; // Bottom Floor Texture GLSkin *bottomFloorTexture; GLSkin *interiorWoodFloorTexture; LCARSCanvas *myCanvas; GLUquadricObj *myQuadratic; void drawHUD() { glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); glDisable(GL_TEXTURE_2D); //glDisable(GL_LIGHTING); glPushMatrix(); { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0,WorldConstants::SCREENWIDTH,WorldConstants::SCREENHEIGHT, 0); //left,right,bottom,top glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // ---------------------------------------------------------------------------------- // TODO!!!!!!!!!!!!!!!!!!!: // Need to fix caption - and allow for dynamic font setting. // GOING to require messing with GLText2D to apply it to the buttons! // ---------------------------------------------------------------------------------- // Draw the +/-Button if( myCanvas == NULL ) { myCanvas = new LCARSCanvas(); myCanvas->Left( 10 );
			myCanvas->Top( WorldConstants::SCREENHEIGHT -100 );
			myCanvas->Width( WorldConstants::SCREENWIDTH-20 );
			myCanvas->Height( 85 );

			LCARSButton *myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 10 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::MENUORANGE );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 140 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::KLINGONBROWN );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 270 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::VULCANYELLOW  );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 400 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::EARTHOCEANBLUE  );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 530 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::ISISPURPLE  );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 660 );
			myButton->Top( 10 );
			myButton->Height( 30 );
			myButton->Width( 120 );
			myButton->ForegroundColor( LCARSConstants::EARTHSKYBLUE );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );

			myButton = new LCARSButton();
			myButton->Canvas( myCanvas );
			myButton->Left( 10 );
			myButton->Top( 50 );
			myButton->Height( 30 );
			myButton->Width( myCanvas->Width() - 10 );
			myButton->ForegroundColor( LCARSConstants::PUMPKINORANGE );
			myButton->BackgroundColor( LCARSConstants::DEEPSEABLUE );
			myButton->Caption( "Hello World!" );
			myCanvas->Add( myButton );
		}

		myCanvas->Draw();

		glDepthMask(GL_FALSE);
		glEnable(GL_DEPTH_TEST);
		glEnable(GL_TEXTURE_2D);
		//glEnable(GL_LIGHTING);
	}
	glPopMatrix();

	glMatrixMode(GL_PROJECTION);						// Select The Projection Matrix
		glLoadIdentity();									// Reset The Projection Matrix
		//gluPerspective(45.0f,(GLfloat)WorldConstants::SCREENWIDTH/(GLfloat)WorldConstants::SCREENHEIGHT,0.1f,250.0f);
		gluPerspective(45.0f,(GLfloat)WorldConstants::SCREENWIDTH/(GLfloat)WorldConstants::SCREENHEIGHT,0.1f,250.0f);
}

void drawFloor()
{
	glColor4f(1.0f, 1.0f, 1.0f, 1.0);
	glPushMatrix();
	{
		glMatrixMode(GL_TEXTURE);
			glEnable(GL_TEXTURE_2D);
			glBindTexture(GL_TEXTURE_2D, externalFloorTexture->myTexture );
			glScalef(CANVASSIZE/5, CANVASSIZE/5, 1.0f); // rescale

		// Q's note: The floor is drawn a butt hair (ok. maybe this is a tad more) away from 
		// zero to allow for no conflict between the texture of the obejcts we create on 
		// the scene....
		glMatrixMode(GL_MODELVIEW);
			glBegin(GL_QUADS);
				//glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-CANVASSIZE, -1.01f, -CANVASSIZE );
				glTexCoord2f(1.0f, 0.0f); glVertex3f( CANVASSIZE, -1.01f, -CANVASSIZE );
				glTexCoord2f(1.0f, 1.0f); glVertex3f( CANVASSIZE, -1.01f, CANVASSIZE );
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-CANVASSIZE, -1.01f, CANVASSIZE );
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef(5.0f/CANVASSIZE, 5.0f/CANVASSIZE, 1.0f); // rescale
	
	}
	glPopMatrix();

}

void drawGrid()
{
	glDisable(GL_TEXTURE_2D);
	glDisable(GL_LIGHTING);
	glLineWidth(1.0f);

	for( int x = -(int)CANVASSIZE; x<=(int)CANVASSIZE;x++) { //glColor3f( ( (float)0x66 /(float)0xff ), ( (float)0x11/(float)0xff), ( (float)0x11/(float)0xff) ); glBegin( GL_LINES ); { glVertex3f( CANVASSIZE, -1.0f, (float)x ); glVertex3f( -CANVASSIZE, -1.0f, float(x) ); } glEnd(); glBegin( GL_LINES ); { glVertex3f( (float)x, -1.0f, CANVASSIZE ); glVertex3f( float(x), -1.0f, -CANVASSIZE ); } glEnd(); } } void drawSpaceSkyBox() { glEnable(GL_TEXTURE_2D); //glDisable(GL_LIGHTING); sfrx += STARFIELDROTATEX; sfry += STARFIELDROTATEY; sfrz += STARFIELDROTATEZ; // Clear the current textures (to draw space) //glMatrixMode(GL_TEXTURE); // glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); //glRotatef( sfrz, 0.0f, 0.0f, 1.0f); glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); // Rotate the whole model being drawn. glRotatef( sfrx, 1.0f, 0.0f, 0.0f ); glRotatef( sfry, 0.0f, 1.0f, 0.0f ); //glRotatef( sfrz, 0.0f, 0.0f, 1.0f ); glMatrixMode(GL_TEXTURE); //glRotatef( 90.0f, 1.0f, 0.0f, 0.0f ); glBindTexture(GL_TEXTURE_2D, earthTexture->myTexture );

	glMatrixMode(GL_MODELVIEW);
		erx += EROTX;
		ery += EROTY;

		glTranslatef( allStars[0].posx, allStars[0].posy, allStars[0].posz );
		glRotatef( erx, 1.0f, 0.0f, 0.0f );
		glRotatef( ery, 0.0f, 1.0f, 0.0f );
		// These rotate the earth so the United Staets 'faces' us
		glRotatef( -120.0f, 1.0f, 0.0f, 0.0f );
		// ^^^^ These rotate the earth so the United Staets 'faces' us

		gluSphere( myQuadratic, 30.0f, 30, 30 );

		glRotatef( 120.0f, 1.0f, 0.0f, 0.0f );

		glRotatef( -ery, 0.0f, 1.0f, 0.0f );
		glRotatef( -erx, 1.0f, 0.0f, 0.0f );
		glTranslatef( -allStars[0].posx, -allStars[0].posy, -allStars[0].posz );
	
	glMatrixMode(GL_TEXTURE);
		//glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		glBindTexture(GL_TEXTURE_2D, earthCloudsTexture->myTexture );
		glEnable( GL_BLEND );
		glColor4f( 1.0f, 1.0f, 1.0f, 0.5f );

	glMatrixMode(GL_MODELVIEW);
		ercx += EROTCX;
		ercy += EROTCY;

		glTranslatef( allStars[0].posx, allStars[0].posy, allStars[0].posz );
		glRotatef( ercx, 1.0f, 0.0f, 0.0f );
		glRotatef( ercy, 0.0f, 1.0f, 0.0f );

		// These rotate the earth so the United Staets 'faces' us
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
		glRotatef( -20.0f, 0.0f, 1.0f, 0.0f );

		gluSphere( myQuadratic, 34.0f, 30, 30 );

		glRotatef( 20.0f, 0.0f, 1.0f, 0.0f );
		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );

		glRotatef( -ercy, 0.0f, 1.0f, 0.0f );
		glRotatef( -ercx, 1.0f, 0.0f, 0.0f );
		glTranslatef( -allStars[0].posx, -allStars[0].posy, -allStars[0].posz );
		
	glMatrixMode(GL_TEXTURE);
		glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
		glDisable( GL_BLEND );
		//glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		glBindTexture(GL_TEXTURE_2D, blackHoleScrunch->myTexture );

	glMatrixMode(GL_MODELVIEW);
		bhrx += BHROTX; bhry += BHROTY; bhrz += BHROTZ;
		glRotatef( bhrx, 1.0f, 0.0f, 0.0f );
		glRotatef( bhry, 0.0f, 1.0f, 0.0f );
		glRotatef( bhrz, 0.0f, 0.0f, 1.0f );

		glTranslatef( 120.0f, 0.0f, 120.0f );
		glBegin( GL_QUADS );
			// Top Face
			glNormal3f( 0.0f, 1.0f, 0.0f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, 0.0f, 20.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f, 40.0f, 20.0f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f(70.0f, 40.0f,  20.0f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f(70.0f, 0.0f, 20.0f);
		glEnd();
		glTranslatef( -120.0f, 0.0f, -120.0f );
		
		glRotatef( -bhrz, 0.0f, 0.0f, 1.0f );
		glRotatef( -bhry, 0.0f, 1.0f, 0.0f );
		glRotatef( -bhrx, 1.0f, 0.0f, 0.0f );

	glMatrixMode(GL_TEXTURE);
		glBindTexture(GL_TEXTURE_2D, sunSkin->myTexture );
		glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		sunx += SUNCX;
		suny += SUNCY;

		glTranslatef( allStars[1].posx, allStars[1].posy, allStars[1].posz );
		// These rotate the earth so the United Staets 'faces' us
		gluSphere( myQuadratic, 10.0f, 30, 30 );
		glTranslatef( -allStars[1].posx, -allStars[1].posy, -allStars[01].posz );
		
	glMatrixMode(GL_MODELVIEW);
		glDisable(GL_TEXTURE_2D);

		glBegin(GL_POINTS);
			for(int curStar = 2; curStar < NUMSTARS; curStar++) { glVertex3f( allStars[curStar].posx, allStars[curStar].posy, allStars[curStar].posz ); } glEnd(); // Rotate the whole model being drawn. //glRotatef( -sfrz, 0.0f, 0.0f, 1.0f ); glRotatef( -sfry, 0.0f, 1.0f, 0.0f ); glRotatef( -sfrx, 1.0f, 0.0f, 0.0f ); //glRotatef( -sfrz, 0.0f, 0.0f, 1.0f); glEnable(GL_TEXTURE_2D); } void drawTARDISInterior() { // TODO: DRAW THIS ALL INSIDE THE TARDIS!!!! // MOVE TO THE location of this entry way - this is effectively 0,0,0 // for the internal location glMatrixMode(GL_MODELVIEW); glTranslatef( 0.0f, INTERNALDOORYOFFSET, 0.0f ); #pragma region BOTTOMFLOOR_MAINENTRY glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, bottomFloorTexture->myTexture );
		glScalef( 8.0f, 8.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		gluDisk(myQuadratic,0.0f,20.0f,32,32);
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/8.0f, 1.0f/8.0f, 1.0f );

#pragma endregion BOTTOMFLOOR_MAINENTRY
#pragma region MAINFLOOR

	glMatrixMode(GL_TEXTURE);
		glBindTexture(GL_TEXTURE_2D, interiorWoodFloorTexture->myTexture );
		glScalef( 12.0f, 12.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, 106.0f /12.0f, 0.0f );

		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		// TODO: THERE is a break in this floor leading to the lower level. 
		// Gonna have to play with size info....
		gluPartialDisk(myQuadratic,46.0f/12.0f,206.0f/12.0f,32,32,0,360);
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

		glTranslatef( 0.0f, -(106.0f /12.0f), 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/12.0f, 1.0f/12.0f, 1.0f );


	glMatrixMode(GL_TEXTURE);
		glBindTexture(GL_TEXTURE_2D, consolePad->myTexture );
		glScalef( 2.0f, 2.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, 106.0f /12.0f, 0.0f );

		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		gluDisk(myQuadratic, 0.0f,46.0f/12.0f,32,32);
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

		glTranslatef( 0.0f, -(106.0f /12.0f), 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/2.0f, 1.0f/2.0f, 1.0f );

	// Seam divider between console and wood
	glMatrixMode(GL_TEXTURE);
		glBindTexture(GL_TEXTURE_2D, consolePad->myTexture );
		glScalef( 5.0f, 5.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, 106.0f /12.0f, 0.0f );

		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		gluDisk(myQuadratic, 0.0f,46.0f/12.0f,32,32);
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

		glTranslatef( 0.0f, -(106.0f /12.0f), 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/5.0f, 1.0f/5.0f, 1.0f );


#pragma endregion MAINFLOOR
#pragma region MAINFLOOR_ENTRY
	//glMatrixMode(GL_TEXTURE);
	//	glBindTexture(GL_TEXTURE_2D, interiorWoodFloorTexture->myTexture );
	//	glScalef( 12.0f, 12.0f, 1.0f );

	//glMatrixMode(GL_MODELVIEW);
	//	// Main floor positioning 
	//	glTranslatef( 0.0f, 106.0f /12.0f, 0.0f );

	//	glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
	//	gluPartialDisk(myQuadratic,46.0f/12.0f,206.0f/12.0f,32,32,0,360);
	//	glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

	//	glTranslatef( 0.0f, -(106.0f /12.0f), 0.0f );

	//glMatrixMode(GL_TEXTURE);
	//	glScalef( 1.0f/12.0f, 1.0f/12.0f, 1.0f );


#pragma endregion MAINFLOOR_ENTRY
#pragma region MAINFLOOR_TOPWALL

	glMatrixMode(GL_TEXTURE);
		glBindTexture(GL_TEXTURE_2D, interiorUpperWallTexture->myTexture );
		glScalef( 16.0f, 1.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, (106.0f/12.0f)+5.0f, 0.0f );

		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		gluCylinder( myQuadratic, 206.0f/12.0f, 206.0f/12.0f, 5.0f, 30, 30 );
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );

		glTranslatef( 0.0f, -(106.0f /12.0f), 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/16.0f, 1.0f, 1.0f );

#pragma endregion MAINFLOOR_TOPWALL

#pragma region BELLY_MAINEXTERIORWALL
	//myOX += INTMOVX;
	//myOY += INTMOVY;

	glMatrixMode(GL_TEXTURE);
		
		glBindTexture(GL_TEXTURE_2D, interiorOuterWallTexture->myTexture );
		glScalef( 20.0f, 20.0f, 1.0f );

	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, 5.0f, 0.0f );

		//glRotatef( myOX, 1.0f, 0.0f, 0.0f );
		//glRotatef( myOY, 0.0f, 1.0f, 0.0f );
		glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
		gluSphere( myQuadratic, (206.0f/12.0f)+6.0f, 30, 30 );
		//gluCylinder( myQuadratic,(206.0f/12.0f)+6.0f,(206.0f/12.0f)+6.0f,17.5f,32,32);
		glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
		//glRotatef( -myOY, 0.0f, 1.0f, 0.0f );
		//glRotatef( -myOX, 1.0f, 0.0f, 0.0f );

		glTranslatef( 0.0f, -5.0f, 0.0f );

	glMatrixMode(GL_TEXTURE);
		glScalef( 1.0f/20.0f, 1.0f/20.0f, 1.0f );

#pragma endregion BELLY_MAINEXTERIORWALL

		if( isFrontDoorOpen )
		{
			glEnable(GL_BLEND);
			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

			//glTranslatef( internalDoorPosition.posx, internalDoorPosition.posy, internalDoorPosition.posz );
			// glMatrixMode(GL_TEXTURE);

			// window is opaque
			glColor4f(	1.0f, 0.0f, 0.0f, 0.4f);

			glMatrixMode(GL_MODELVIEW);
				glBegin(GL_QUADS);
					// Front Face
					glTexCoord2f(0.0f, 0.0f); glVertex3f(internalDoorPosition.posx+17.0f, (106.0f/12.0f)-5.0f, -2.0f);
					glTexCoord2f(1.0f, 0.0f); glVertex3f(internalDoorPosition.posx+17.0f, (106.0f/12.0f)-5.0f,  +2.0f ); //(206.0f/12.0f)
					glTexCoord2f(1.0f, 1.0f); glVertex3f(internalDoorPosition.posx+17.0f, (106.0f/12.0f), +2.0f);
					glTexCoord2f(0.0f, 1.0f); glVertex3f(internalDoorPosition.posx+17.0f, (106.0f/12.0f), -2.0f);
				glEnd();

			glDisable(GL_BLEND);
			//glTranslatef( -internalDoorPosition.posx, -internalDoorPosition.posy, -internalDoorPosition.posz );
		}

	// MOVE TO THE location of this entry way - this is effectively 0,0,0 
	// for the internal location
	glMatrixMode(GL_MODELVIEW);
		glTranslatef( 0.0f, -INTERNALDOORYOFFSET, 0.0f );

}

void drawTARDISExterior()
{
	float basePlateStart = 2.25f/12.0f;
	float myTop = (86.75f/12.0f);
	float myHeight = 5.5f /12.0f;
	float myWid = 44.0f /12.0f;
	float offset = (myWid/2.0f)-(ONEINCH*6.0f);
	float roffset = (-myWid/2.0f)+(ONEINCH*6.0f);

	float tempVal = 0.0f;
	float offsetVal = 0.0f;

	// START DRAWING MAIN SECTION ---------------------------------------------------
	glPushMatrix();
	{
		glMatrixMode(GL_MODELVIEW);
			glTranslatef(0.0f, -1.0f, 0.0f); 

//#ifdef DOIT
#pragma region FLOORBOARDS
		// ------ START SECTION The main EXTERNAL floor board.
		glMatrixMode(GL_TEXTURE);
			glColor3f( 1.0f, 1.0f, 1.0f );
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef(12.0f, 1.0, 1.0f); // scale texture

			// ---------------------------------------------------------------------------
			// Draw the Bottom Plate
			// ---------------------------------------------------------------------------
			glBegin(GL_QUADS);
				// Front Face
				glNormal3f( 0.0f, 0.0f, 1.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0833333f,  0.0f,  2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0833333f,  0.0f,  2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0833333f,  0.125f,  2.0833333f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.08333330f, 0.125f,  2.0833333f);
				// Back Face
				glNormal3f( 0.0f, 0.0f,-1.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0833333f, 0.0f, -2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.0833333f, 0.0f, -2.0833333f);
				// Right Face
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0833333f, 0.0f, -2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.0833333f, 0.125f,  2.0833333f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.0833333f, 0.0f,  2.0833333f);
				// Left Face
				glNormal3f(-1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0833333f, 0.0f, -2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0833333f, 0.0f,  2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0833333f, 0.125f,  2.0833333f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0833333f, 0.125f, -2.0833333f);
			glEnd();

		// DESCALE
		glMatrixMode(GL_TEXTURE);
			glScalef(1/12.0f, 1.0, 1.0f); // scale texture

		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				// Top Face
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0833333f, 0.125f,  2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0833333f, 0.125f,  2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0833333f, 0.125f, -2.0833333f);
				// Bottom Face
				glNormal3f( 0.0f,-1.0f, 0.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0833333f, 0.0f, -2.0833333f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.0833333f, 0.0f, -2.0833333f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.0833333f, 0.0f,  2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0833333f, 0.0f,  2.0833333f);
			glEnd();
		// ------ END SECTION The main EXTERNAL floor board.

		// ------ START SECTION secondary floor board.
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef(12.0f, 1.0, 1.0f); // scale texture

		glMatrixMode(GL_MODELVIEW);
			glBegin(GL_QUADS);
				// Front Face
				glNormal3f( 0.0f, 0.0f, 1.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0833333f,  0.125f,  2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0833333f,  0.125f,  2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0f,  0.1875f,  2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f,  2.0f);
				// Back Face
				glNormal3f( 0.0f, 0.0f,-1.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.0f, 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.0833333f, 0.125f, -2.0833333f);
				// Right Face
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0f, 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.0f, 0.1875f,  2.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.0833333f, 0.125f,  2.0833333f);
				// Left Face
				glNormal3f(-1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0833333f, 0.125f, -2.0833333f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0833333f, 0.125f,  2.0833333f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 0.1875f,  2.0F);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f, -2.0f);
			glEnd();

		// DESCALE
		glMatrixMode(GL_TEXTURE);
			glScalef(1.0f/12.0f, 1.0, 1.0f); // scale texture

		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				// Top Face
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f,  2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.0f, 0.1875f,  2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.0f, 0.1875f, -2.0f);
			glEnd();
		
		// ------ END SECTION secondary floor board.
#pragma endregion FLOORBOARDS

#pragma region ONEINCHCORNERRODS
		// ------ START SECTION ONE
		//		  posts board.
		//			TODO: THIS ENTIRE SECTION WILL ROTATE 90 degrees for displaying.
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glColor4f( 1.0f, 0.5f, 0.6f, 0.7f ); 
			glScalef(1.0, 12.0, 1.0f); // scale texture

		glMatrixMode(GL_MODELVIEW);
			// Rod and Cap #1
			offsetVal = 0.041666f;
			tempVal = 2.0f - offsetVal;
			const float rodLength = 85.5f/12.0f;

			glTranslatef(tempVal, 0.1875f, tempVal); 
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			gluCylinder( myQuadratic, offsetVal, offsetVal, rodLength, 30, 30 );
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			glTranslatef(-(tempVal), -0.1875f, -(tempVal)); 

			glTranslatef(tempVal, rodLength + 0.1875f, tempVal); 
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			gluDisk(myQuadratic, 0.0,offsetVal,30,30);
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			glTranslatef(-(tempVal), -(rodLength + 0.1875f), -(tempVal)); 

			// Rod and Cap #2
			glTranslatef(tempVal, 0.1875f, -tempVal); 
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			gluCylinder( myQuadratic, offsetVal, offsetVal, rodLength, 30, 30 );
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			glTranslatef(-(tempVal), -0.1875f, (tempVal)); 

			glTranslatef(tempVal, rodLength+0.1875f, -tempVal); 
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			gluDisk(myQuadratic, 0.0,offsetVal,30,30);
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			glTranslatef(-(tempVal), -(rodLength+0.1875f), (tempVal)); 

			// Rod and Cap #3
			glTranslatef(-tempVal, 0.1875f, -tempVal); 
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			gluCylinder( myQuadratic, offsetVal, offsetVal, rodLength, 30, 30 );
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			glTranslatef((tempVal), -0.1875f, (tempVal)); 

			glTranslatef(-tempVal, rodLength+0.1875f, -tempVal); 
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			gluDisk(myQuadratic, 0.0,offsetVal,30,30);
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			glTranslatef((tempVal), -(rodLength+0.1875f), (tempVal)); 

			// Rod and Cap #4
			glTranslatef(-tempVal, 0.1875f, tempVal); 
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			gluCylinder( myQuadratic, offsetVal, offsetVal, rodLength, 30, 30 );
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			glTranslatef((tempVal), -0.1875f, -(tempVal)); 

			glTranslatef(-tempVal, rodLength+0.1875f, tempVal); 
			glRotatef(90, 1, 0, 0); // Rotate around X axis
			gluDisk(myQuadratic, 0.0,offsetVal,30,30);
			glRotatef(-90, 1, 0, 0); // Rotate around X axis
			glTranslatef((tempVal), -(rodLength+0.1875f), -(tempVal)); 

		glMatrixMode(GL_TEXTURE);
			glScalef(1.0f, 1.0f/12.0f, 1.0f); // scale texture
			glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); 

#pragma endregion ONEINCHCORNERRODS
#pragma region FRONTANDBACKPLANKS

		// Front LEFT 1" plank
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef(6.0f, 1.0f, 1.0f); // scale texture

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
			glEnd();
		
		// End CAP
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

		// Front LEFT 1" plank
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f, -( 2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
			glEnd();
		
		// End CAP
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
			glEnd();
		
		// End CAP
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - (ONEINCH * 5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
			glEnd();
		
		// End CAP
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - (ONEINCH * 5.0f)));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef(1.0f/6.0f, 1.0f, 1.0f); // scale texture

#pragma endregion FRONTANDBACKPLANKS
#pragma region RIGHTANDLEFTPLANKS
		// Front LEFT 1" plank
		glMatrixMode(GL_TEXTURE);
			glScalef(6.0f, 1.0f, 1.0f); // scale texture

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f);
			glEnd();
		
		// End CAP
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-( 2.0f - ONEINCH), 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, -2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -2.0f);
			glEnd();
		
		// End CAP
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, -2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -2.0f);
			glEnd();
		
		// End CAP
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH * 5.0f), 0.1875f + rodLength, -(2.0f - ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, 0.1875f + rodLength, -(2.0f - ONEINCH));
			glEnd();

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f);
			glEnd();
		
		// End CAP
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-(2.0f - (ONEINCH * 5.0f)), 0.1875f + rodLength, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-(2.0f - ONEINCH), 0.1875f + rodLength, 2.0f - ONEINCH);
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef(1.0f/6.0f, 1.0f, 1.0f); // scale texture

#pragma endregion RIGHTANDLEFTPLANKS
#pragma region STRUCTURALSUPPORTS
	// Texture alignment checked....
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glColor4f( 0.8f, 0.5f, 1.0f, 1.0f );
			glScalef( 1.0f, 6.0f, 1.0f );

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, basePlateStart, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  basePlateStart, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, basePlateStart, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  basePlateStart, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, basePlateStart, 2.0f - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH,  basePlateStart, 2.0f - (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, basePlateStart, -2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH,  basePlateStart, -2.0f + (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, basePlateStart, -2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  basePlateStart, -2.0f + ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, basePlateStart, -2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  basePlateStart, -2.0f + ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, basePlateStart, 2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + ONEINCH,  basePlateStart, 2.0f - (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, basePlateStart, -2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + ONEINCH,  basePlateStart, -2.0f + (ONEINCH*5.0f));
			glEnd();

			// START INNER
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), basePlateStart, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  basePlateStart, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), basePlateStart, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  basePlateStart, 2.0f - ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), basePlateStart, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  basePlateStart, -2.0f + ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), basePlateStart, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  basePlateStart, -2.0f + ONEINCH);
			glEnd();

		// Second Four
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), basePlateStart, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH,  basePlateStart, 2.0f - (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), basePlateStart, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH,  basePlateStart, -2.0f + (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), basePlateStart, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + ONEINCH,  basePlateStart, 2.0f - (ONEINCH*5.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), basePlateStart, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + ONEINCH,  basePlateStart, -2.0f + (ONEINCH*5.0f));
			glEnd();

		// END CAPS
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
			glEnd();
			
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  (86.5f+2.25f)/12.0f, 2.0f - ONEINCH);
			glEnd();
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH*5.0f),  (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
			glEnd();
			
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f), (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + (ONEINCH*5.0f));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH*5.0f),  (86.5f+2.25f)/12.0f, -2.0f + ONEINCH);
			glEnd();
			
		glMatrixMode(GL_TEXTURE);
			glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
			glScalef( 1.0f, 1.0f/6.0f, 1.0f );

		// Front Door 4"x4"
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			
		myTop = (80.0f+2.25f)/12.0f;
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH),  myTop, 2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH),  myTop, 2.0f-(4.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH),  myTop, 2.0f-(4.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH),  myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH),  myTop, 2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(4.0f/12.0f), 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH),  myTop, 2.0f);
			glEnd();

		// End front/door structural reinforcement
		
		// Start all the way around structural reinforcement
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef( 3.0f, 1.0f, 1.0f );

		myTop = (85.5f+2.25)/12.0f;
		for( int x = 0;x<4;x++) { glMatrixMode(GL_MODELVIEW); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH)); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH)); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f-(4.5f*ONEINCH)); glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f-(5.0f*ONEINCH), myTop, 2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop-(5.5f/12.0f), 2.0f-(4.0f*ONEINCH)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f-(4.0f*ONEINCH)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f+(5.0f*ONEINCH), myTop, 2.0f); glEnd(); glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); } glMatrixMode(GL_TEXTURE); glScalef( 1.0f/3.0f, 1.0f, 1.0f ); glMatrixMode(GL_MODELVIEW); glRotatef( -360.0f, 0.0f, 1.0f, 0.0f ); #pragma endregion STRUCTURALSUPPORTS #pragma region ROOFSIDEPANELS // 2" x 4" x 44" myTop = (86.5f+2.25f+1.5f)/12.0f; //top at (86.5f+2.25+1.5f)/12.0f = 90.25 // "Tier 1" glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef( 1.0f, 3.0f, 1.0f );

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop - (4.0f*ONEINCH), 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop, -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop, -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH),  myTop - (4.0f*ONEINCH), -2.0f + (2.0f*ONEINCH));
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef( 1.0f, 1.0f/3.0f, 1.0f );

			// "Tier 2"
		glMatrixMode(GL_TEXTURE);
			// TODO: Need a more interesting panelled top
			glBindTexture(GL_TEXTURE_2D, tardisTop->myTexture );

		glMatrixMode(GL_MODELVIEW);
			myTop= myTop + 1.5f*ONEINCH;
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop - (4.0f*ONEINCH), 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (2.5f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.5f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop, -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (2.5f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.5f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop, -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.5f*ONEINCH),  myTop - (4.0f*ONEINCH), 2.0f - (2.5f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop, -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop, -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop - (4.0f*ONEINCH), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.5f*ONEINCH),  myTop - (4.0f*ONEINCH), -2.0f + (2.5f*ONEINCH));
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef( 1.0f, 3.0f, 1.0f );

		myTop = (86.5f+2.25f+1.5f)/12.0f; //top at (86.5f+2.25+1.5f)/12.0f = 90.25
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH),  myTop, 2.0f - (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, -2.0f + (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH),  myTop, -2.0f + (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (2.0f*ONEINCH),  myTop, -2.0f + (2.0f*ONEINCH));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH), myTop, 2.0f - (2.0f*ONEINCH));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), 2.0f - (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop + (ONEINCH/2.0f), -2.0f + (2.5f*ONEINCH));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.0f*ONEINCH),  myTop, -2.0f + (2.0f*ONEINCH));
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef( 1.0f, 1.0f/3.0f, 1.0f );


#pragma endregion ROOFSIDEPANELS
#pragma region ROOFPANEL

		glMatrixMode(GL_TEXTURE);
			// TODO: Need a more interesting panelled top
			glBindTexture(GL_TEXTURE_2D, tardisTop->myTexture );

		myTop = (86.5f+2.25f+3.0f)/12.0f; //top at (86.5f+2.25+1.5f)/12.0f = 90.25
		glMatrixMode(GL_MODELVIEW);
		for( int x=0;x<4;x++) { glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH)); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + (ONEINCH*3.0f), 4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + (ONEINCH*3.0f), 4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (2.5f*ONEINCH), myTop, 2.0f - (2.5f*ONEINCH)); glEnd(); glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); } glRotatef( -360.0f, 0.0f, 1.0f, 0.0f ); #pragma endregion ROOFPANEL #pragma region LIGHTMOUNT myTop = (86.5f+2.25f+6.0f)/12.0f; glMatrixMode(GL_MODELVIEW); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop, -4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop, 4.0f*ONEINCH); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, -4.0f*ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(-4.0f*ONEINCH, myTop + ONEINCH, 4.0f*ONEINCH); glEnd(); #pragma endregion LIGHTMOUNT #pragma region TOPLIGHTFIXTURE glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, glassFixture->myTexture );
			
		myTop = (86.5f+2.25f+7.0f)/12.0f; 
		glMatrixMode(GL_MODELVIEW);
			glTranslatef( 0.0f, myTop, 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (2.125f /12.0f ), (2.125f /12.0f ), (6.0f /12.0f ),30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -myTop, 0.0f );

			glTranslatef( 0.0f, myTop + 0.5f, 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluDisk( myQuadratic, 0.0f, (2.125f/12.0f), 30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -(myTop +0.5f), 0.0f );

		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, tardisTop->myTexture );

		// The retaining rods
		glMatrixMode(GL_MODELVIEW);
			glTranslatef( (1.65f /12.0f ), myTop, (1.65f /12.0f ) );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (0.135f /12.0f ), (0.135f /12.0f ), (6.0f /12.0f ),30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( -(1.65f /12.0f ), -myTop, -(1.65f /12.0f ) );

			glTranslatef( (1.65f /12.0f ), myTop, -(1.65f /12.0f ) );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (0.135f /12.0f ), (0.135f /12.0f ), (6.0f /12.0f ),30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( -(1.65f /12.0f ), -myTop, (1.65f /12.0f ) );


			glTranslatef( -(1.65f /12.0f ), myTop, -(1.65f /12.0f ) );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (0.135f /12.0f ), (0.135f /12.0f ), (6.0f /12.0f ),30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( (1.65f /12.0f ), -myTop, (1.65f /12.0f ) );

			glTranslatef( -(1.65f /12.0f ), myTop, (1.65f /12.0f ) );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (0.135f /12.0f ), (0.135f /12.0f ), (6.0f /12.0f ),30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( (1.65f /12.0f ), -myTop, -(1.65f /12.0f ) );

			// blue ring around the top
			glTranslatef( 0.0f, myTop + (5.5f/12.0f), 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, (2.2f/12.0f ), (2.2f/12.0f ), ONEINCH/2,30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -(myTop + (5.5f/12.0f)), 0.0f );

			glTranslatef( 0.0f, myTop + (6.025f/12.0f), 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluDisk( myQuadratic, 0.0f, (2.35f/12.0f ), 30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -(myTop + (6.025f/12.0f)), 0.0f );

			glTranslatef( 0.0f, myTop + (5.95f/12.0f), 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, ONEINCH*2.55f, ONEINCH/10, ONEINCH*1.5, 30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -(myTop + (5.95f/12.0f)), 0.0f );

		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, screwDown->myTexture );

		glMatrixMode(GL_MODELVIEW);
			// The top lock for the lamp fixture
			myTop = myTop + (5.95f/12.0f) + ONEINCH*1.45f;
			glTranslatef( 0.0f, myTop, 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluCylinder( myQuadratic, ONEINCH/6, ONEINCH/6, ONEINCH/3, 30, 30 );
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -myTop, 0.0f );

		// It's cap
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, screwDownTop->myTexture ); // 
			
		glMatrixMode(GL_MODELVIEW);
			// The top lock for the lamp fixture	
			myTop = myTop + ONEINCH/3;
			glTranslatef( 0.0f, myTop, 0.0f );
			glRotatef( -90.0f, 1.0f, 0.0f, 0.0f );
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				gluDisk( myQuadratic, 0, ONEINCH/6 , 30, 30 ); 
			glEnd();
			glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
			glTranslatef( 0.0f, -myTop, 0.0f );

#pragma endregion TOPLIGHTFIXTURE 

#pragma region WALLPANELS
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef( 3.0f, 1.0f, 1.0f );

		myTop = 2.25f/12.0f; 
		// OTHER THREE WALLS
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, -2.0f + ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + 56.5f/12.0f, -2.0f + ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop + 56.5f/12.0f, -2.0f + ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, myTop, 19.0f/12.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, myTop, -19.0f/12.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + ONEINCH, myTop + 56.5f/12.0f, -19.0f/12.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + ONEINCH, myTop + 56.5f/12.0f, 19.0f/12.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - ONEINCH, myTop, 19.0f/12.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - ONEINCH, myTop, -19.0f/12.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - ONEINCH, myTop + 56.5f/12.0f, -19.0f/12.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - ONEINCH, myTop + 56.5f/12.0f, 19.0f/12.0f);
			glEnd();

		glMatrixMode(GL_TEXTURE);
			glScalef( 1.0f/3.0f, 1.0f, 1.0f );

		glMatrixMode(GL_TEXTURE);
			glScalef( 1.0f, 2.0f, 1.0f );

		glMatrixMode(GL_MODELVIEW);
			myTop = (76.0f+2.25f+4.0f)/12.0f; 
			for( int x=0;x<4;x++) { glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, -2.0f + ONEINCH); glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop, -2.0f + ONEINCH); glTexCoord2f(1.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop -(6.5f/12.0f), -2.0f + ONEINCH); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop -(6.5f/12.0f), -2.0f + ONEINCH); glEnd(); glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); } glRotatef( -360.0f, 0.0f, 1.0f, 0.0f ); glMatrixMode(GL_TEXTURE); glScalef( 1.0f, 1.0f/2.0f, 1.0f ); #pragma endregion WALLPANELS #pragma region WALLHINGE glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef( 1.0f, 12.0f, 0.0f );

		myTop = (76.0f+2.25f)/12.0f; 

		glMatrixMode(GL_MODELVIEW);
		// Only draw front strut if the front door is closed. 
		if( !isFrontDoorOpen )
		{
			for( int y=0; y <=1; y += 1 ) { glTranslatef( (y==0)?0.0f:internalDoorPosition.posx, (y==0)?0.0f:internalDoorPosition.posy, (y==0)?0.0f:internalDoorPosition.posz ); glMatrixMode(GL_MODELVIEW); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.75/12.0f, myTop, 2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), 2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), 2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop , 2.0f + (ONEINCH/4)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.75/12.0f, myTop, 2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), 2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), 2.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(0.75/12.0f, myTop , 2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop, 2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), 2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), 2.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop , 2.0f); glEnd(); glTranslatef( (y==0)?0.0f:-internalDoorPosition.posx, (y==0)?0.0f:-internalDoorPosition.posy, (y==0)?0.0f:-internalDoorPosition.posz ); } } glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.75/12.0f, myTop, -2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), -2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), -2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop , -2.0f + (ONEINCH/4)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.75/12.0f, myTop, -2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), -2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.75/12.0f, myTop - (76.0f/12.0f), -2.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(0.75/12.0f, myTop , -2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop, -2.0f + (ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), -2.0f + (ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.75/12.0f, myTop - (76.0f/12.0f), -2.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.75/12.0f, myTop , -2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop, 0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop - (76.0f/12.0f), -0.75/12.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop , -0.75/12.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop, 0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f , myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( -2.0f, myTop , 0.75/12.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop, -0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f + (ONEINCH/4), myTop - (76.0f/12.0f), -0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop - (76.0f/12.0f), -0.75/12.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, myTop , -0.75/12.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f -(ONEINCH/4), myTop, 0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH/4), myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f - (ONEINCH/4), myTop - (76.0f/12.0f), -0.75/12.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f - (ONEINCH/4), myTop , -0.75/12.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH/4), myTop, 0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH/4), myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f, myTop - (76.0f/12.0f), 0.75/12.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, myTop , 0.75/12.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f - (ONEINCH/4), myTop, -0.75/12.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f - (ONEINCH/4), myTop - (76.0f/12.0f), -0.75/12.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f, myTop - (76.0f/12.0f), -0.75/12.0f ); glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f, myTop , -0.75/12.0f); glEnd(); glMatrixMode(GL_TEXTURE); glScalef( 1.0f, 1.0f/12.0f, 0.0f ); #pragma endregion WALLHINGE #pragma region FRONTDOOR glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, woodTexture->myTexture );
			glScalef(3.0f, 1.0f, 1.0f );

		myTop = 2.25f/12.0f; 
		// THE FRONT DOOR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		if( !isFrontDoorOpen )
		{
			for( int y=0; y <=1; y += 1 ) { glTranslatef( (y==0)?0.0f:internalDoorPosition.posx, (y==0)?0.0f:internalDoorPosition.posy, (y==0)?0.0f:internalDoorPosition.posz ); glMatrixMode(GL_MODELVIEW); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/2)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop, 2.0f-(ONEINCH/2)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH/2)); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH/2)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/2)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop, 2.0f-(ONEINCH/2)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH/2)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH/2)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f-(ONEINCH*1.5f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(0.0f, myTop + 56.0f/12.0f, 2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop + 56.0f/12.0f, 2.0f); glEnd(); glTranslatef( (y==0)?0.0f:-internalDoorPosition.posx, (y==0)?0.0f:-internalDoorPosition.posy, (y==0)?0.0f:-internalDoorPosition.posz ); } } // Start Drawing Panels glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, tardisTop->myTexture );

		glMatrixMode(GL_MODELVIEW);
		for( int x = 0; x<4; x++ )
		{			
			// Only draw the front door if it's closed, draw the other sides all the time. 
			if( (x==0 && !isFrontDoorOpen ) ) 
			{
				for( int y=0; y <=1; y += 1 )
				{
					myTop = 2.25f/12.0f;
					glTranslatef(	(y==0)?0.0f:internalDoorPosition.posx,
									(y==0)?0.0f:internalDoorPosition.posy, 
									(y==0)?0.0f:internalDoorPosition.posz );

					glBegin( GL_QUADS );
						glNormal3f( 1.0f, 0.0f, 0.0f);
						glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
						glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (4.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (4.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glEnd();

					glBegin( GL_QUADS );
						glNormal3f( 1.0f, 0.0f, 0.0f);
						glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
						glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 1.0f); glVertex3f(-15.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glEnd();

					glBegin( GL_QUADS );
						glNormal3f( 1.0f, 0.0f, 0.0f);
						glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
						glTexCoord2f(0.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 1.0f); glVertex3f(15.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glEnd();

					glBegin( GL_QUADS );
						glNormal3f( 1.0f, 0.0f, 0.0f);
						glTexCoord2f(0.0f, 0.0f); glVertex3f(3.25f/12.0f, myTop, 2.0f-(ONEINCH/4));
						glTexCoord2f(0.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
						glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.25f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glEnd();

					for( int z = 0; z<4; z++ ) { myTop+=18.0/12.0f; if( z==0 ) myTop+= 0.5f/12.0f; glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (3.5f/12.0f), 2.0f-(ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (3.5f/12.0f), 2.0f-(ONEINCH/4)); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4)); glEnd(); } glTranslatef( (y==0)?0.0f:-internalDoorPosition.posx, (y==0)?0.0f:-internalDoorPosition.posy, (y==0)?0.0f:-internalDoorPosition.posz ); } } else if ( x>0 ) 
			{
				myTop = 2.25f/12.0f;
				glBegin( GL_QUADS );
					glNormal3f( 1.0f, 0.0f, 0.0f);
					glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (4.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (4.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
				glEnd();

				glBegin( GL_QUADS );
					glNormal3f( 1.0f, 0.0f, 0.0f);
					glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 1.0f); glVertex3f(-15.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
				glEnd();

				glBegin( GL_QUADS );
					glNormal3f( 1.0f, 0.0f, 0.0f);
					glTexCoord2f(0.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glTexCoord2f(0.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 1.0f); glVertex3f(15.0f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop, 2.0f-(ONEINCH/4));
				glEnd();

				glBegin( GL_QUADS );
					glNormal3f( 1.0f, 0.0f, 0.0f);
					glTexCoord2f(0.0f, 0.0f); glVertex3f(3.25f/12.0f, myTop, 2.0f-(ONEINCH/4));
					glTexCoord2f(0.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop + (76.0f/12.0f), 2.0f-(ONEINCH/4));
					glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.25f/12.0f, myTop, 2.0f-(ONEINCH/4));
				glEnd();

				for( int z = 0; z<4; z++ ) { myTop+=18.0/12.0f; if( z==0 )myTop+= 0.5f/12.0f; glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-19.0f/12.0f, myTop, 2.0f-(ONEINCH/4)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-19.0f/12.0f, myTop + (3.5f/12.0f), 2.0f-(ONEINCH/4)); glTexCoord2f(1.0f, 1.0f); glVertex3f(19.0f/12.0f, myTop + (3.5f/12.0f), 2.0f-(ONEINCH/4)); glTexCoord2f(1.0f, 0.0f); glVertex3f(19.0f/12.0f, myTop, 2.0f-(ONEINCH/4)); glEnd(); } } glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); } glRotatef( -360.0f, 0.0f, 1.0f, 0.0f ); glMatrixMode(GL_TEXTURE); glScalef(1.0f/3.0f, 1.0f, 1.0f ); #pragma endregion FRONTDOOR #pragma region FRONTDOORSIGNS if( !isFrontDoorOpen ) { glMatrixMode(GL_TEXTURE); // glRotatef( 180.0, 1.0f, 0.0f, 0.0f ); glBindTexture(GL_TEXTURE_2D, publicTardisSign->myTexture );

		myTop = 56.75f/12.0f;
		// THE FRONT DOOR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop, 2.0f-(ONEINCH/3));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-3.25f/12.0f, myTop, 2.0f-(ONEINCH/3));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop - 14.5f/12.0f, 2.0f-(ONEINCH/3));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-15.0f/12.0f, myTop - 14.5f/12.0f, 2.0f-(ONEINCH/3));
			glEnd();

		glMatrixMode(GL_TEXTURE);
//			glRotatef( -180.0, 1.0f, 0.0f, 0.0f );
		}

#pragma endregion FRONTDOORSIGN

// ------------------------------------------
// NO LIGHTING ON THE POLICE SIGN and SIGN BACK!!!!!!!!
// ------------------------------------------
#pragma region TARDISFRONTSIGNBACK
	myTop = (86.75f/12.0f);
	for( int x=0;x<4;x++) { // FRONT 5.5"x44"x1" plank - top is 86.75 glMatrixMode(GL_TEXTURE); glBindTexture(GL_TEXTURE_2D, prismaticSkin->myTexture );
			glScalef( 1.0f, 3.0f, 0.0f );
			glTranslatef(myX, myY, 0.0); 

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, myTop, -(myWid/2.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, myTop, myWid/2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop -myHeight, myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, myTop -myHeight, -(myWid/2.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop, -(myWid/2.0f));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f - ONEINCH, myTop, myWid/2.0f);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f - ONEINCH, myTop -myHeight, myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop -myHeight, -(myWid/2.0f));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop, -myWid/2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, myTop, -myWid/2.0f );
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop -myHeight, -myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop -myHeight, -myWid/2.0f);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop, myWid/2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f, myTop, myWid/2.0f );
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop -myHeight, myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop -myHeight, myWid/2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop, myWid/2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f - ONEINCH, myTop, -myWid/2.0f );
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop, -myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, myTop, myWid/2.0f);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f - ONEINCH, myTop - myHeight , myWid/2.0f);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.0f - ONEINCH, myTop- myHeight , -myWid/2.0f );
				glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.0f, myTop- myHeight , -myWid/2.0f);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, myTop- myHeight , myWid/2.0f);
			glEnd();

		// FRONT PLATE DRAWING DONE
		glRotatef(90.0f, 0.0f, 1.0f, 0.0f );

		glMatrixMode(GL_TEXTURE);
			glTranslatef(-myX, -myY, 0.0); 
			glScalef( 1.0f, 1.0f/3.0f, 0.0f );
		}

		glRotatef(-360.0f, 0.0f, 1.0f, 0.0f );
#pragma endregion TARDISFRONTSIGNBACK
#pragma region POLICEBOXTOPSIGNFRONT
		for( int x=0;x<4;x++) { glMatrixMode(GL_TEXTURE); glTranslatef(myCX, myCY, 0.0f); glBindTexture(GL_TEXTURE_2D, spaceTexture->myTexture );
			glScalef( 1.0f, 6.0f, 0.0f );
			//glRotatef( 90, 1.0f, 0.0f, 0.0f );

		// THIS SECTION DRAWS THE 
		// START FRONT PLATE "POLICE BOX" Sign retainer
		// LEFTSIDE of the police sign
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop - myHeight, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, offset);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, offset);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop, offset);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop-myHeight+(ONEINCH*0.5f), offset-(ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop-(ONEINCH*0.5f), offset-(ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, offset);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + ONEINCH, offset-ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + (ONEINCH/2), offset-(ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), offset-(ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, offset-ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight + ONEINCH, offset-ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + ONEINCH, offset-ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, offset-ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop- ONEINCH, offset-ONEINCH);
			glEnd();

		// RIGHT SIDE of the police sign
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop - myHeight, roffset );
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, roffset );
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, roffset );
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop, roffset );
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, roffset );
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop-myHeight+(ONEINCH*0.5f), roffset +(ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop-(ONEINCH*0.5f), roffset +(ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, roffset );
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + ONEINCH, roffset +ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + (ONEINCH/2), roffset +(ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), roffset +(ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, roffset +ONEINCH);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight + ONEINCH, roffset +ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + ONEINCH, roffset +ONEINCH);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, roffset +ONEINCH);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop- ONEINCH, roffset +ONEINCH);
			glEnd();

		// TOP AND BOTTOM SIDE of the police sign
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, offset);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, roffset);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop, roffset);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop - myHeight, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, offset);
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, roffset);
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + ONEINCH, myTop - myHeight, roffset);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), offset- (ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), roffset+ (ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop, roffset);
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, offset);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop  - myHeight + (ONEINCH/2), offset- (ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop  - myHeight + (ONEINCH/2), roffset+ (ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight, roffset);
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight + (ONEINCH/2), offset  - (ONEINCH/2));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight +  (ONEINCH/2), roffset + (ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight +  ONEINCH, roffset+ (ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - myHeight +  ONEINCH, offset - (ONEINCH/2));
			glEnd();
		
			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), offset  - (ONEINCH/2));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - (ONEINCH/2), roffset + (ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, roffset+ (ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, offset - (ONEINCH/2));
			glEnd();

			glBegin( GL_QUADS );
				glNormal3f( 0.0f, 1.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, offset  - (ONEINCH/2));
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*2.0f), myTop - ONEINCH, roffset + (ONEINCH/2));
				glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - ONEINCH, roffset + (ONEINCH/2));
				glTexCoord2f(1.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - ONEINCH, offset - (ONEINCH/2));
			glEnd();

		// DESCALE
		glMatrixMode(GL_TEXTURE);
			glScalef( 1.0f, 1.0f/6.0f, 0.0f );
			glTranslatef(-myCX, -myCY, -0.0); 

		// And the POLICE BOX SIGN (YAY!)
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, policeBoxSign->myTexture );

		glMatrixMode(GL_MODELVIEW);
			glBegin( GL_QUADS );
				glNormal3f( 1.0f, 0.0f, 0.0f);
				glTexCoord2f(0.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - ONEINCH, offset  - ONEINCH);
				glTexCoord2f(0.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - ONEINCH, roffset + ONEINCH);
				glTexCoord2f(90.0f/1024.0f, 1.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight + ONEINCH, roffset + ONEINCH);
				glTexCoord2f(90.0f/1024.0f, 0.0f); glVertex3f(2.0f + (ONEINCH*1.75f), myTop - myHeight + ONEINCH, offset - ONEINCH );
			glEnd();
		glRotatef(90.0f, 0.0f, 1.0f, 0.0f );
		}
		glRotatef(-360.0f, 0.0f, 1.0f, 0.0f );

#pragma endregion POLICEBOXTOPSIGNFRONT

#pragma region TARDISWINDOWS
		glMatrixMode(GL_TEXTURE);
			glBindTexture(GL_TEXTURE_2D, clearGlassTexture->myTexture );
			glEnable(GL_BLEND);
			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

		myTop = (76.0f+2.25f-3.5f)/12.0f; 
		for( int x=0;x<4;x++) { // MAIN STRUT glMatrixMode(GL_MODELVIEW); if( (!isFrontDoorOpen && x==0 )|| x>0 )
			{
				// window is opaque
				glColor4f(	0.7f, 0.7f, 1.0f, 0.4f);

				if( x==0)
				{
				for( int y=0; y <=1; y += 1 ) { glTranslatef( (y==0)?0.0f:internalDoorPosition.posx, (y==0)?0.0f:internalDoorPosition.posy, (y==0)?0.0f:internalDoorPosition.posz ); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glEnd(); glTranslatef( (y==0)?0.0f:-internalDoorPosition.posx, (y==0)?0.0f:-internalDoorPosition.posy, (y==0)?0.0f:-internalDoorPosition.posz ); } } else { // window is opaque glColor4f( 0.7f, 0.7f, 1.0f, 0.4f); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glEnd(); glBegin( GL_QUADS ); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(0.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop, 2.0f-(ONEINCH*0.25f)); glTexCoord2f(1.0f, 1.0f); glVertex3f(-3.25f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glTexCoord2f(1.0f, 0.0f); glVertex3f(-15.0f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f)); glEnd(); } glColor4f( 1.0f, 1.0f,1.0f, 1.0f ); glRotatef( 90.0f, 0.0f, 1.0f, 0.0f ); } } glRotatef( -360.0f, 0.0f, 1.0f, 0.0f ); glMatrixMode(GL_TEXTURE); glDisable(GL_BLEND); #pragma endregion TARDISWINDOWS } glPopMatrix(); } int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing { if( isRightButtonPressed && isLeftButtonPressed ) { xpos -= (float)sin(heading*piover180) * 0.05f; zpos -= (float)cos(heading*piover180) * 0.05f; } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer glLoadIdentity(); // Reset The View GLfloat xtrans = -xpos; GLfloat ztrans = -zpos; GLfloat ytrans = -walkbias-0.25f; GLfloat sceneroty = 360.0f - yrot; // Only 'rotate' the camera if the mouse button is pressed and it's been checked. // This creates a 'snap to' effect for the camera when the mouse is unpressed, but // it's so much extra work to figure out axes and rotational positions to make it // appear natural, I have opted to retain the snap to for simplicity's sake. if( creatorRotation->y != 0.0f && isRightButtonPressed )
	{
		glRotatef(-1 * 90.0f * creatorRotation->z, 1.0f, 0.0f, 0.0f);
		glRotatef(-1 * 90.0f * creatorRotation->x, 0.0f, 1.0f, 0.0f);
	}

	glRotatef(lookupdown,0.0f,0,0);
	glRotatef(sceneroty,0,1.0f,0);

	glTranslatef(xtrans, ytrans, ztrans);
	
	myX += MOVX;
	myY += MOVY;
	myCX += CMOVX;
	myCY += CMOVY;

	// Set the creator's location
	glTranslatef( 0.0f, -creatorLocation->y, -0.0f );
	
	drawSpaceSkyBox();
	if( isGridOn )
		drawGrid();
	drawFloor();
	
	drawTARDISExterior();
	drawTARDISInterior();

	

	if( isHudOn )
		drawHUD();

	// What I need TODO/ 'to work on' from here:
	// 1) The terrain looks unrealnot real, there's jaggies making it look unnatural. 
	//    So gotta find out what effects will get it to look more natural. 
	//    So the next model will focus on basic objects with realism and blending, 
	//    materials and lighting.
	// 3) Next version will work on viewport / "Bigger on the inside g


	// -----------------------------------------------------------------------
	// ALWAYS PREPARE the model for the final "view" for rendering...
	// -----------------------------------------------------------------------
	glMatrixMode(GL_MODELVIEW); 
		glDepthMask(GL_TRUE);
		glEnable(GL_DEPTH_TEST);
		glEnable(GL_TEXTURE_2D);
	//	glDisable(GL_LIGHTING);

	return TRUE;										// Everything Went OK
}

float distanceFromMeIn3D(STARPOINT point)
{
   float diff_x, diff_y, diff_z;    // to store differences along x, y and z axes
   float distance;                  // to store final distance value
 
   // calculate the difference between the two points
   diff_x = point.posx - 0.0f;
   diff_y = point.posy - 0.0f;
   diff_z = point.posz - 0.0f; 
 
   // calculate the Euclidean distance between the two points
   distance = sqrt(pow(diff_x,2)+pow(diff_y,2)+pow(diff_z,2));
 
   return distance;  // return the distance as a float
}

void MakeItSoNumberOne()
{
	myQuadratic=gluNewQuadric();
	gluQuadricNormals(myQuadratic, GLU_SMOOTH);	
	gluQuadricTexture(myQuadratic, GL_TRUE); // was GL_TRUE

	// General personal rules for texture loading:
	// Bitmap (.bmp extension): If it's going to be rotated or tiled dynamically (animations), 
	//		then it has to be bitmap because the libraries I am using has compatability issues
	// Other image formats: work perfectly fine for static placement and are preferred (size)

	// External Textures
 	woodTexture = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Graphics/TardisSkin.bmp"); 
 	bareWoodTexture = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Graphics/Wood2.bmp"); 
	spaceTexture = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Data/Space.bmp");				// Tiled and animated
	externalFloorTexture = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Graphics/tundra.bmp");	// Tiled
	policeBoxSign = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Graphics/PBMainSign.jpg");
	tardisTop = new GLSkin( "C:/develop/Project T.A.R.D.I.S/Graphics/TardisTop.jpg");
	glassFixture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/glass.jpg");
	screwDown = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/ScrewDown.jpg");
	screwDownTop = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/ScrewDownTop.jpg");
	clearGlassTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/GlassTexture.jpg");
	publicTardisSign = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/PoliceBoxoorSign.jpg");
	prismaticSkin = new  GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/PRISMATIC.bmp");		// Tiled and animated
	blackHoleScrunch = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/BlackHole.bmp");		// Transparency not showing, and the black is coming across impure with the other SOIL LIB 
	earthTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/EarthOriginal1024.jpg");
	earthCloudsTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/EarthCloudTexture.jpg");
	sunSkin = new GLSkin("C:/develop/Project T.A.R.D.I.S/Graphics/sun.jpg");
	
	// Internal textures
	bottomFloorTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Floor/BottomFloor3.bmp");
	interiorWoodFloorTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Floor/Carpet.bmp");
	interiorUpperWallTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/BrickWall/BrickWall.bmp");
	interiorOuterWallTexture = new GLSkin("C:/develop/Project T.A.R.D.I.S/Wall/Wall3.bmp"); // wall1 is 2nd fave so far
	consolePad  = new GLSkin("C:/develop/Project T.A.R.D.I.S/Floor/WoodFloorMyFavorite.bmp"); // new GLSkin("C:/develop/Project T.A.R.D.I.S/Console/Floor2.bmp"); 

	// Build the stars
	for(int curStar = 2; curStar < NUMSTARS; curStar++)
		{
			do {
			allStars[curStar].posx = (float)(rand() % 200);
			allStars[curStar].posy = (float)(rand() % 200);
			allStars[curStar].posz = (float)(rand() % 200);

			if( (rand() % 2 ) == 1 ) 
				allStars[curStar].posx = -allStars[curStar].posx;
			if( (rand() % 2 ) == 1 ) 
				allStars[curStar].posy = -allStars[curStar].posy;
			if( (rand() % 2 ) == 1 ) 
				allStars[curStar].posz = -allStars[curStar].posz;
			}
			while( distanceFromMeIn3D( allStars[curStar] ) <= 20.0 ); } //Earth's Position allStars[0].posx = -80.0f; allStars[0].posy = 10.0f; allStars[0].posz = 130.0f; //Sun's Position allStars[1].posx = -40.0f; allStars[1].posy = 30.0f; allStars[1].posz = 100.0f; // After all the textures have loaded - set the lighting //Use the color as the ambient and diffuse material glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); //White specular material color, shininess 16 /*glMaterialfv(GL_FRONT, GL_SPECULAR, white); glMaterialf(GL_FRONT, GL_SHININESS, 16.0f);*/ internalDoorPosition.posx = 0.0f; internalDoorPosition.posy = INTERNALDOORYOFFSET + (106.0f/12.0f); internalDoorPosition.posz = (106.0f/12.0f)+6.0f; internalCharacterStartLocation.posx = internalDoorPosition.posx; internalCharacterStartLocation.posy = internalDoorPosition.posy + 4.0f; // five feet off the floor internalCharacterStartLocation.posz = internalDoorPosition.posz - 1.0f; moveToExternalStartingLocation(); } void gitOuttaDodge() { delete woodTexture; delete spaceTexture; delete policeBoxSign; delete bareWoodTexture; delete tardisTop; delete glassFixture; delete screwDown; delete screwDownTop; delete clearGlassTexture; delete publicTardisSign; delete prismaticSkin; delete earthTexture; delete blackHoleScrunch; delete sunSkin; delete consolePad; // delete the internal textures delete bottomFloorTexture; delete interiorWoodFloorTexture; delete interiorUpperWallTexture; delete interiorOuterWallTexture; delete externalFloorTexture; delete earthCloudsTexture; // Delete positional and locational information delete creatorLocation; delete creatorRotation; // Delete the HUD delete myCanvas; gluDeleteQuadric(myQuadratic); // Delete The Quadratic To Free System Resources OutputMemoryLeaksDetected(); return; } // ---------------------------------------------------------------------------- // Author: Q // FileName: GLSkin.CPP // // Description: Contains the code for skinning objects // ---------------------------------------------------------------------------- #include "ACME.H" // Forward declaration AUX_RGBImageRec *LoadBMP(const char *Filename); int LoadGLTextures( const char *filename ); GLSkin::GLSkin(const char *filename) { LoadGLTexture( filename ); } int GLSkin::LoadGLTexture( const char *filename ) // Load Bitmaps And Convert To Textures { int Status=FALSE; // Status Indicator AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Texture memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL char *myFile = (char *)malloc( strlen( filename ) + 1 ); strcpy( myFile, filename ); myFile = _strrev( myFile ); // Use the standard loader for BMP files, it's a tad faster. if( _strnicmp( myFile, "PMB", 3 ) == 0 ) { if (TextureImage[0]=LoadBMP(filename)) { glGenTextures(1, &myTexture); // Generate one texture glBindTexture(GL_TEXTURE_2D, myTexture); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
		    }
		}
	else
		{
		// Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
		myTexture = SOIL_load_OGL_texture
					(
					filename,
					SOIL_LOAD_AUTO, // remember there's alpha (SOIL_LOAD_RGBA)
					SOIL_CREATE_NEW_ID,
					SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT //| SOIL_FLAG_MULTIPLY_ALPHA
					);

		if( myTexture == 0 )
			OutputDebugString(_T( SOIL_last_result() ));
		else
			glBindTexture(GL_TEXTURE_2D, myTexture);
		}
	if(myTexture != 0)
 	{
		Status=TRUE;									// Set The Status To TRUE

		// Create Nearest Filtered Texture
		glBindTexture(GL_TEXTURE_2D, myTexture);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
		//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
		//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
		//glGenerateMipmap(GL_TEXTURE_2D);
		
		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
	}

	if (TextureImage[0])								// If Texture Exists
	{
		if (TextureImage[0]->data)						// If Texture Image Exists
		{
			free(TextureImage[0]->data);				// Free The Texture Image Memory
		}

		free(TextureImage[0]);							// Free The Image Structure
	}

	free( myFile );
	return Status;										// Return The Status
}

AUX_RGBImageRec *GLSkin::LoadBMP(const char *Filename)				// Loads A Bitmap Image
{
	FILE *File=NULL;									// File Handle

	if (!Filename)										// Make Sure A Filename Was Given
	{
		return NULL;									// If Not Return NULL
	}

	File=fopen(Filename,"r");							// Check To See If The File Exists

	if (File)											// Does The File Exist?
	{
		fclose(File);									// Close The Handle
		return auxDIBImageLoad(Filename);				// Load The Bitmap And Return A Pointer
	}

	return NULL;										// If Load Failed Return NULL
}
// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	CommandProcessor.CPP
// 
// Description: Contains the code for skinning objects
// ----------------------------------------------------------------------------

#include "CommandProcessor.h"

CommandProcessor::COMMANDS CommandProcessor::ProcessCommand(char *sCommand) 
{
	return CommandProcessor::OPENDOOR;
}
// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	ACME.H
// 
// Description: My Precompiled Headers file, ACME for short.
// ----------------------------------------------------------------------------
// ACME.H
#ifndef ACME_H
#define ACME_H

#pragma once
#include 
#include 			// Header File For Standard Input/Output
#include 
#include 
#include 
#include 
#include <gl\gl.h>			// Header File For The OpenGL32 Library
#include <gl\glu.h>			// Header File For The GLu32 Library
#include 		// Header File For The Glaux Library
#include 
#include "GLMain.h"
#include "GLLookAndFeel.h"
#include "GLPrimitives.h"
#include "GlobalHeader.h"
#include "LCARSControls.h"
#include "GLText2D.h"
#include "SOIL.H"

#define Interface class

#define DeclareInterface(name) Interface name { \
          public: \
          virtual ~name() {}

#define DeclareBasedInterface(name, base) class name : public base { \
          public: \
          virtual ~name() {}

#define EndInterface };

#define implements public

struct STARPOINT
{
	float posx;
	float posy;
	float posz;
};

struct POSITION
{
	float posx;
	float posy;
	float posz;
};

const int NUMSTARS = 3000;
extern STARPOINT allStars[NUMSTARS];
extern POSITION internalDoorPosition;
extern POSITION internalCharacterStartLocation;


#endif
// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	CommandProcessor.H
// 
// Description: Header information / definition for command processing
// ----------------------------------------------------------------------------

// CommandProcessor.h
#ifndef COMMANDPROCESSOR_H
#define COMMANDPROCESSOR_H

class CommandProcessor
{
public:
	enum COMMANDS
	{
		OPENDOOR = 0x0000001
	};

public:
	static COMMANDS ProcessCommand( char *sCommand );
};

#endif
/*++ BUILD Version: 0004    // Increment this if a change has global effects

Copyright (c) 1985-95, Microsoft Corporation

Module Name:

    glaux.h

Abstract:

    Procedure declarations, constant definitions and macros for the OpenGL
    Auxiliary Library.

--*/

#ifndef __GLAUX_H__
#define __GLAUX_H__

/*
 * (c) Copyright 1993, Silicon Graphics, Inc.
 * ALL RIGHTS RESERVED 
 * Permission to use, copy, modify, and distribute this software for 
 * any purpose and without fee is hereby granted, provided that the above
 * copyright notice appear in all copies and that both the copyright notice
 * and this permission notice appear in supporting documentation, and that 
 * the name of Silicon Graphics, Inc. not be used in advertising
 * or publicity pertaining to distribution of the software without specific,
 * written prior permission. 
 *
 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
 * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
 * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
 * 
 * US Government Users Restricted Rights 
 * Use, duplication, or disclosure by the Government is subject to
 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
 * clause at DFARS 252.227-7013 and/or in similar or successor
 * clauses in the FAR or the DOD or NASA FAR Supplement.
 * Unpublished-- rights reserved under the copyright laws of the
 * United States.  Contractor/manufacturer is Silicon Graphics,
 * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
 *
 * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
 */

#include 
#include <GL/gl.h>
#include <GL/glu.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
** ToolKit Window Types
** In the future, AUX_RGBA may be a combination of both RGB and ALPHA
*/

#define AUX_RGB             0
#define AUX_RGBA            AUX_RGB
#define AUX_INDEX           1
#define AUX_SINGLE          0
#define AUX_DOUBLE          2
#define AUX_DIRECT          0
#define AUX_INDIRECT        4

#define AUX_ACCUM           8
#define AUX_ALPHA           16
#define AUX_DEPTH24         32      /* 24-bit depth buffer */
#define AUX_STENCIL         64
#define AUX_AUX             128
#define AUX_DEPTH16         256     /* 16-bit depth buffer */
#define AUX_FIXED_332_PAL   512
#define AUX_DEPTH           AUX_DEPTH16 /* default is 16-bit depth buffer */

/* 
** Window Masks
*/

#define AUX_WIND_IS_RGB(x)      (((x) & AUX_INDEX) == 0)
#define AUX_WIND_IS_INDEX(x)    (((x) & AUX_INDEX) != 0)
#define AUX_WIND_IS_SINGLE(x)   (((x) & AUX_DOUBLE) == 0)
#define AUX_WIND_IS_DOUBLE(x)   (((x) & AUX_DOUBLE) != 0)
#define AUX_WIND_IS_INDIRECT(x) (((x) & AUX_INDIRECT) != 0)
#define AUX_WIND_IS_DIRECT(x)   (((x) & AUX_INDIRECT) == 0)
#define AUX_WIND_HAS_ACCUM(x)   (((x) & AUX_ACCUM) != 0)
#define AUX_WIND_HAS_ALPHA(x)   (((x) & AUX_ALPHA) != 0)
#define AUX_WIND_HAS_DEPTH(x)   (((x) & (AUX_DEPTH24 | AUX_DEPTH16)) != 0)
#define AUX_WIND_HAS_STENCIL(x) (((x) & AUX_STENCIL) != 0)
#define AUX_WIND_USES_FIXED_332_PAL(x)  (((x) & AUX_FIXED_332_PAL) != 0)

/*
** ToolKit Event Structure
*/

typedef struct _AUX_EVENTREC {
    GLint event;
    GLint data[4];
} AUX_EVENTREC;

/* 
** ToolKit Event Types
*/
#define AUX_EXPOSE      1
#define AUX_CONFIG      2
#define AUX_DRAW        4
#define AUX_KEYEVENT    8
#define AUX_MOUSEDOWN   16
#define AUX_MOUSEUP     32
#define AUX_MOUSELOC    64

/*
** Toolkit Event Data Indices
*/
#define AUX_WINDOWX             0
#define AUX_WINDOWY             1
#define AUX_MOUSEX              0
#define AUX_MOUSEY              1
#define AUX_MOUSESTATUS         3
#define AUX_KEY                 0
#define AUX_KEYSTATUS           1

/*
** ToolKit Event Status Messages
*/
#define AUX_LEFTBUTTON          1
#define AUX_RIGHTBUTTON         2
#define AUX_MIDDLEBUTTON        4
#define AUX_SHIFT               1
#define AUX_CONTROL             2

/* 
** ToolKit Key Codes
*/
#define AUX_RETURN              0x0D
#define AUX_ESCAPE              0x1B
#define AUX_SPACE               0x20
#define AUX_LEFT                0x25
#define AUX_UP                  0x26
#define AUX_RIGHT               0x27
#define AUX_DOWN                0x28
#define AUX_A                   'A'
#define AUX_B                   'B'
#define AUX_C                   'C'
#define AUX_D                   'D'
#define AUX_E                   'E'
#define AUX_F                   'F'
#define AUX_G                   'G'
#define AUX_H                   'H'
#define AUX_I                   'I'
#define AUX_J                   'J'
#define AUX_K                   'K'
#define AUX_L                   'L'
#define AUX_M                   'M'
#define AUX_N                   'N'
#define AUX_O                   'O'
#define AUX_P                   'P'
#define AUX_Q                   'Q'
#define AUX_R                   'R'
#define AUX_S                   'S'
#define AUX_T                   'T'
#define AUX_U                   'U'
#define AUX_V                   'V'
#define AUX_W                   'W'
#define AUX_X                   'X'
#define AUX_Y                   'Y'
#define AUX_Z                   'Z'
#define AUX_a                   'a'
#define AUX_b                   'b'
#define AUX_c                   'c'
#define AUX_d                   'd'
#define AUX_e                   'e'
#define AUX_f                   'f'
#define AUX_g                   'g'
#define AUX_h                   'h'
#define AUX_i                   'i'
#define AUX_j                   'j'
#define AUX_k                   'k'
#define AUX_l                   'l'
#define AUX_m                   'm'
#define AUX_n                   'n'
#define AUX_o                   'o'
#define AUX_p                   'p'
#define AUX_q                   'q'
#define AUX_r                   'r'
#define AUX_s                   's'
#define AUX_t                   't'
#define AUX_u                   'u'
#define AUX_v                   'v'
#define AUX_w                   'w'
#define AUX_x                   'x'
#define AUX_y                   'y'
#define AUX_z                   'z'
#define AUX_0                   '0'
#define AUX_1                   '1'
#define AUX_2                   '2'
#define AUX_3                   '3'
#define AUX_4                   '4'
#define AUX_5                   '5'
#define AUX_6                   '6'
#define AUX_7                   '7'
#define AUX_8                   '8'
#define AUX_9                   '9'

/*
** ToolKit Gets and Sets
*/
#define AUX_FD                  1  /* return fd (long) */
#define AUX_COLORMAP            3  /* pass buf of r, g and b (unsigned char) */
#define AUX_GREYSCALEMAP        4
#define AUX_FOGMAP              5  /* pass fog and color bits (long) */
#define AUX_ONECOLOR            6  /* pass index, r, g, and b (long) */

/*
** Color Macros
*/

#define AUX_BLACK               0
#define AUX_RED                 13
#define AUX_GREEN               14
#define AUX_YELLOW              15
#define AUX_BLUE                16
#define AUX_MAGENTA             17
#define AUX_CYAN                18
#define AUX_WHITE               19

extern float auxRGBMap[20][3];

#define AUX_SETCOLOR(x, y) (AUX_WIND_IS_RGB((x)) ? \
                           glColor3fv(auxRGBMap[(y)]) : glIndexf((y)))

/*
** RGB Image Structure
*/

typedef struct _AUX_RGBImageRec {
    GLint sizeX, sizeY;
    unsigned char *data;
} AUX_RGBImageRec;

/*
** Prototypes
*/

void APIENTRY auxInitDisplayMode(GLenum);
void APIENTRY auxInitPosition(int, int, int, int);

/* GLenum APIENTRY auxInitWindow(LPCTSTR); */
#ifdef UNICODE
#define auxInitWindow auxInitWindowW
#else
#define auxInitWindow auxInitWindowA
#endif
GLenum APIENTRY auxInitWindowA(LPCSTR);
GLenum APIENTRY auxInitWindowW(LPCWSTR);

void APIENTRY auxCloseWindow(void);
void APIENTRY auxQuit(void);
void APIENTRY auxSwapBuffers(void);

typedef void (CALLBACK* AUXMAINPROC)(void);
void APIENTRY auxMainLoop(AUXMAINPROC);

typedef void (CALLBACK* AUXEXPOSEPROC)(int, int);
void APIENTRY auxExposeFunc(AUXEXPOSEPROC);

typedef void (CALLBACK* AUXRESHAPEPROC)(GLsizei, GLsizei);
void APIENTRY auxReshapeFunc(AUXRESHAPEPROC);

typedef void (CALLBACK* AUXIDLEPROC)(void);
void APIENTRY auxIdleFunc(AUXIDLEPROC);

typedef void (CALLBACK* AUXKEYPROC)(void);
void APIENTRY auxKeyFunc(int, AUXKEYPROC);

typedef void (CALLBACK* AUXMOUSEPROC)(AUX_EVENTREC *);
void APIENTRY auxMouseFunc(int, int, AUXMOUSEPROC);

int  APIENTRY auxGetColorMapSize(void);
void APIENTRY auxGetMouseLoc(int *, int *);
void APIENTRY auxSetOneColor(int, float, float, float);
void APIENTRY auxSetFogRamp(int, int);
void APIENTRY auxSetGreyRamp(void);
void APIENTRY auxSetRGBMap(int, float *);

/* AUX_RGBImageRec * APIENTRY auxRGBImageLoad(LPCTSTR); */
#ifdef UNICODE
#define auxRGBImageLoad auxRGBImageLoadW
#else
#define auxRGBImageLoad auxRGBImageLoadA
#endif
AUX_RGBImageRec * APIENTRY auxRGBImageLoadA(LPCSTR);
AUX_RGBImageRec * APIENTRY auxRGBImageLoadW(LPCWSTR);

#ifdef UNICODE
#define auxDIBImageLoad auxDIBImageLoadW
#else
#define auxDIBImageLoad auxDIBImageLoadA
#endif
AUX_RGBImageRec * APIENTRY auxDIBImageLoadA(LPCSTR);
AUX_RGBImageRec * APIENTRY auxDIBImageLoadW(LPCWSTR);

void APIENTRY auxCreateFont(void);
/* void APIENTRY auxDrawStr(LPCTSTR); */
#ifdef UNICODE
#define auxDrawStr auxDrawStrW
#else
#define auxDrawStr auxDrawStrA
#endif
void APIENTRY auxDrawStrA(LPCSTR);
void APIENTRY auxDrawStrW(LPCWSTR);

void APIENTRY auxWireSphere(GLdouble);
void APIENTRY auxSolidSphere(GLdouble);
void APIENTRY auxWireCube(GLdouble);
void APIENTRY auxSolidCube(GLdouble);
void APIENTRY auxWireBox(GLdouble, GLdouble, GLdouble);
void APIENTRY auxSolidBox(GLdouble, GLdouble, GLdouble);
void APIENTRY auxWireTorus(GLdouble, GLdouble);
void APIENTRY auxSolidTorus(GLdouble, GLdouble);
void APIENTRY auxWireCylinder(GLdouble, GLdouble);
void APIENTRY auxSolidCylinder(GLdouble, GLdouble);
void APIENTRY auxWireIcosahedron(GLdouble);
void APIENTRY auxSolidIcosahedron(GLdouble);
void APIENTRY auxWireOctahedron(GLdouble);
void APIENTRY auxSolidOctahedron(GLdouble);
void APIENTRY auxWireTetrahedron(GLdouble);
void APIENTRY auxSolidTetrahedron(GLdouble);
void APIENTRY auxWireDodecahedron(GLdouble);
void APIENTRY auxSolidDodecahedron(GLdouble);
void APIENTRY auxWireCone(GLdouble, GLdouble);
void APIENTRY auxSolidCone(GLdouble, GLdouble);
void APIENTRY auxWireTeapot(GLdouble);
void APIENTRY auxSolidTeapot(GLdouble);

/*
** Window specific functions
** hwnd, hdc, and hglrc valid after auxInitWindow()
*/
HWND  APIENTRY auxGetHWND(void);
HDC   APIENTRY auxGetHDC(void);
HGLRC APIENTRY auxGetHGLRC(void);

/*
** Viewperf support functions and constants
*/
/* Display Mode Selection Criteria */
enum {
    AUX_USE_ID = 1,
    AUX_EXACT_MATCH,
    AUX_MINIMUM_CRITERIA
};
void   APIENTRY auxInitDisplayModePolicy(GLenum);
GLenum APIENTRY auxInitDisplayModeID(GLint);
GLenum APIENTRY auxGetDisplayModePolicy(void);
GLint  APIENTRY auxGetDisplayModeID(void);
GLenum APIENTRY auxGetDisplayMode(void);

#ifdef __cplusplus
}
#endif

#endif /* __GLAUX_H__ */
// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLLookAndFeel.H
// 
// Description: Contains the header information for MY GL look and feel 
// ----------------------------------------------------------------------------

// GLLookAndFeel.h
#ifndef GLLOOKANDFEEL_H
#define GLLOOKANDFEEL_H

#ifndef GL_BGR
#define GL_BGR 0x80E0
#endif

class ClientArea
{
public:
	static int GetWidth( HWND myHWnd )
	{
		RECT curRect;
		GetClientRect( myHWnd, &curRect );
		return curRect.right - curRect.left;
	}

	static int GetHeight( HWND myHWnd )
	{
		RECT curRect;
		GetClientRect( myHWnd, &curRect );
		return curRect.top - curRect.bottom;
	}
};

class GLSkin
{
private:
	int LoadGLTexture( const char *filename );
	AUX_RGBImageRec *LoadBMP( const char *Filename);

public:
	GLSkin( const char *filename );
	~GLSkin(){ glDeleteTextures( 1, &myTexture ); }
	GLuint	myTexture;
};

class GLVector3D
{
	public:
	GLdouble x,y,z;

	GLVector3D()
		{
			x=y=z=0.0; 
			return;
		}

	GLVector3D( GLdouble dx, GLdouble dy, GLdouble dz )
		{
			x = dx; y = dy; z = dz;
			return;
		}
};

class GLRotation3D
{
	public:
	GLfloat x,y,z;

	GLRotation3D()
		{
			x=y=z=0.0; 
			return;
		}

	GLRotation3D( GLfloat dx, GLfloat dy, GLfloat dz )
		{
			x = dx; y = dy; z = dz;
			return;
		}
};


class GLPosition3D
{
public:
	// GL only supports singles. I prefer a bit more precision.
	GLfloat x;
	GLfloat y;
	GLfloat z;

	GLPosition3D()
		{
			x=y=z=0.0; 
			return;
		}

	GLPosition3D( GLfloat dx, GLfloat dy, GLfloat dz )
		{
			x = dx; y = dy; z = dz;
			return;
		}

	// Converts from relative viewport positions based on GL positions
	GLVector3D GetOGLPos()
		{
			GLint viewport[4];
			GLdouble modelview[16];
			GLdouble projection[16];
			GLdouble posX, posY, posZ;
			
			glMatrixMode(GL_PROJECTION);
			glPushMatrix();
			glLoadIdentity();
		 
			glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
			glGetDoublev( GL_PROJECTION_MATRIX, projection );
			glGetIntegerv( GL_VIEWPORT, viewport );

			glPopMatrix();
			glMatrixMode(GL_MODELVIEW);

			gluUnProject( x, y, 1, modelview, projection, viewport, &posX, &posY, &posZ);

			return GLVector3D(posX, posY, posZ);
		}
};

class GLColor
{
public:
	GLfloat r,g,b, opacity;

	GLColor()
		{
			r=g=b=0.0; 
			opacity = 1.0; // no transparency
			return;
		}

	// hexadecimal funcitonality
	void setValue( int color )
	{
		r = (float) ( ( color & 0xff0000 ) >>16 ) / 256.0f;
		g = (float) ( ( color & 0x00ff00 ) >>8) / 256.0f;
		b = (float) ( color & 0x0000ff ) / 256.0f;
	}

	void setValue( GLfloat  dr, GLfloat  dg, GLfloat  db, GLfloat  op )
		{
			r = dg; g = dg; b = db;
			opacity = op;
			return;
		}
};
// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLMain.H
// 
// Description: Contains the header information for the GL Text window 
// ----------------------------------------------------------------------------
// GLMain.H
#ifndef GLMain_H
#define GLMain_H

#ifndef WINVER                // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0501        // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#ifndef _WIN32_WINNT        // Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x0501        // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif                       

#ifndef _WIN32_WINDOWS        // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0501 // Change this to the appropriate value to target Windows Me or later.
#endif
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSEWHEEL                   0x020A
#endif

// Forward definitions
GLvoid KillGLWindow(GLvoid);
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag);

// MUST be implemented in caller hook
LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);	// Declaration For WndProc
int InitGL(GLvoid);
int DrawGLScene(GLvoid);
GLvoid ReSizeGLScene(GLsizei width, GLsizei height);
void MakeItSoNumberOne();
void gitOuttaDodge();

// Creator locational relevant functions defined in GLMain
extern void moveToExternalStartingLocation();
extern void moveToInternalStartingLocation();

// Locally contained definitions
extern HWND hWnd;
extern HDC hDC; 

extern bool	fullscreen;
extern bool	keys[256];			// Array Used For The Keyboard Routine
extern bool	active;		// Window Active Flag Set To TRUE By Default
extern GLfloat	z;				// Depth Into The Screen
extern float heading;
extern float xpos;
extern float zpos;
extern const float piover180;
extern GLfloat	yrot;				// Y Rotation
extern GLfloat walkbias;
extern GLfloat walkbiasangle;
extern GLfloat lookupdown;
extern float myROS;
//extern GLPosition3D *creatorLocation;

extern bool isLeftButtonPressed;
extern bool isRightButtonPressed;
extern bool isGridOn;
extern bool isRoomOn;
extern bool isHudOn;
extern bool isFrontDoorOpen;
extern bool externalView;


const float	M_PI =3.14159f;




#endif

#endif

// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GlobalHeader.H
// 
// Description: Contains the header information for the globals - should only
//				be used for debugging state NOT for carrying information across
//				process boundaries. 
// ----------------------------------------------------------------------------
// GlobalHeader.H
#ifndef GLOBALHEADER_H
#define GLOBALHEADER_H

// Memory Leak and Debug Shtuff Detection
#ifdef _CRTDBG_MAP_ALLOC
	// TURN ON MEMORY LEAK DETECTION CODE HERE:
	#define _CRTDBG_MAP_ALLOC
#endif

#ifdef _DEBUG
#include 
#ifndef DBG_NEW
  #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
  #define new DBG_NEW
#endif
static void OutputMemoryLeaksDetected()
{
	OutputDebugStringW(L"Detecting Memory Leaks....\r\n");
	if( _CrtDumpMemoryLeaks() )
		OutputDebugStringW(L"Memory Leaks Detected.. DONE!\r\n");
	else
		OutputDebugStringW(L"No Memory Leaks Detected!\r\n");
	return;
}
#endif  // _DEBUG

class WorldConstants
{
public:
		static const int PIHIGHER = 3;
		static const int PILOWER = 14159;

		static const int  SPEEDOFLIGHT = 186000; // Miles per second.
 
		static const int SCREENWIDTH = 1600;
		static const int SCREENHEIGHT = 900;

};
const GLdouble pi = 3.1415926535897932384626433832795;

// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLPrimitives.H
// 
// Description: Contains the header information for the GL Text window 
// ----------------------------------------------------------------------------
// GlPrimitives.h
#ifndef GLPRIMITIVES_H
#define GLPRIMITIVES_H

const	int RESOLUTION = 32;  // For spheres and cylinders, the nuimber of segments 
class GLPrimitive
{
protected:
	GLSkin *mySkin;
	GLSkin *preferredBGSkin;
	GLUquadricObj *myQuadratic;

	GLPosition3D myPosition;
	GLRotation3D myRotation;

	void beginDraw();
	void endDraw();

public:
	GLPrimitive();
	~GLPrimitive();
	virtual GLvoid Draw() = 0; // MUST implement if you inherit
	
	// Multiuple versions of set skin, for optimization purposes
	void setSkin( GLSkin *skin );	
	void setSkin( char szFileName[250] );

	void setPreferredBGSkin(GLSkin *skin);
	GLSkin *getPreferredBGSkin();
	void setPosition( GLPosition3D pos );
	void setRotation( GLRotation3D rot );
	void stopRotation();
};

class GLCube : public GLPrimitive
{
public:
	GLvoid Draw();
};

class GLCylinder : public GLPrimitive
{
protected:
	GLfloat myBottomRadius;
	GLfloat myTopRadius;
	GLfloat myHeight;

public:
	GLCylinder( GLfloat bottomRadius, GLfloat topRadius, GLfloat height );

	GLvoid Draw();
	GLvoid setDimensions( GLfloat bottomRadius, GLfloat topRadius, GLfloat height );
};

class GLDisk: public GLPrimitive
{
public:
	GLvoid Draw();
};

class GLSphere: public GLPrimitive
{
public:
	GLvoid Draw();
};

class GLCone: public GLPrimitive
{
public:
	GLvoid Draw();
};

class GLPyramid: public GLPrimitive
{

public:
	GLvoid Draw();
};

class GLSegmentedDisk: public GLPrimitive
{
private:
	int		part1;				// Start Of Disc ( NEW )
	int		part2;				// End Of Disc ( NEW )
	int		p1;				// Increase 1 ( NEW )
	int		p2;				// Increase 2 ( NEW )


public:
	GLSegmentedDisk()
		{
			p1=0; part1=0; 
			p2=1; part2=0;
		}
	GLvoid Draw();
};

class GLSquare: public GLPrimitive
{

public:
	GLvoid Draw();
};


class GLCircle: public GLPrimitive
{
public:
	GLvoid Draw();
};

class GLSaturn: public GLPrimitive
{
private:
	GLSkin			*myRings;

public:
	void setRingsSkin(GLSkin *skin) {myRings = skin;}
	GLvoid Draw();
};


class GLAtom: public GLPrimitive
{
private:
	GLSkin			*myElectronSkin;

public:
	GLAtom();
	void setElectronSkin(GLSkin *skin) {myElectronSkin = skin;}
	GLvoid Draw();
};

#endif


#endif


// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLText2D.H
// 
// Description: Contains the header information for the GL Text window 
// ----------------------------------------------------------------------------
// GLText2D.H
#ifndef GLText2D_H
#define GLText2D_H

class GLText2D
{
private:
	GLuint			base;				// Base Display List For The Font Set
	GLColor			myColor;

	GLvoid			BuildFont(GLvoid);
	GLvoid			KillFont(GLvoid);

public:
	GLText2D();
	~GLText2D();
	GLvoid Write( GLfloat x, GLfloat y, const char *fmt, ...);

	// Default will be red 
	void setColor( GLfloat red, GLfloat blue, GLfloat green, GLfloat opacity );
};

#endif


/*++ BUILD Version: 0004    // Increment this if a change has global effects

Copyright (c) 1985-95, Microsoft Corporation

Module Name:

    glu.h

Abstract:

    Procedure declarations, constant definitions and macros for the OpenGL
    Utility Library.

--*/

#ifndef __glu_h__
#ifndef __GLU_H__

#define __glu_h__
#define __GLU_H__

#include <GL/gl.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
** Copyright 1991-1993, Silicon Graphics, Inc.
** All Rights Reserved.
** 
** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
** the contents of this file may not be disclosed to third parties, copied or
** duplicated in any form, in whole or in part, without the prior written
** permission of Silicon Graphics, Inc.
** 
** RESTRICTED RIGHTS LEGEND:
** Use, duplication or disclosure by the Government is subject to restrictions
** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
** rights reserved under the Copyright Laws of the United States.
*/

/*
** Return the error string associated with a particular error code.
** This will return 0 for an invalid error code.
**
** The generic function prototype that can be compiled for ANSI or Unicode
** is defined as follows:
**
** LPCTSTR APIENTRY gluErrorStringWIN (GLenum errCode);
*/
#ifdef UNICODE
#define gluErrorStringWIN(errCode) ((LPCSTR)  gluErrorUnicodeStringEXT(errCode))
#else
#define gluErrorStringWIN(errCode) ((LPCWSTR) gluErrorString(errCode))
#endif

const GLubyte* APIENTRY gluErrorString (
    GLenum   errCode);

const wchar_t* APIENTRY gluErrorUnicodeStringEXT (
    GLenum   errCode);

const GLubyte* APIENTRY gluGetString (
    GLenum   name);

void APIENTRY gluOrtho2D (
    GLdouble left, 
    GLdouble right, 
    GLdouble bottom, 
    GLdouble top);

void APIENTRY gluPerspective (
    GLdouble fovy, 
    GLdouble aspect, 
    GLdouble zNear, 
    GLdouble zFar);

void APIENTRY gluPickMatrix (
    GLdouble x, 
    GLdouble y, 
    GLdouble width, 
    GLdouble height, 
    GLint    viewport[4]);

void APIENTRY gluLookAt (
    GLdouble eyex, 
    GLdouble eyey, 
    GLdouble eyez, 
    GLdouble centerx, 
    GLdouble centery, 
    GLdouble centerz, 
    GLdouble upx, 
    GLdouble upy, 
    GLdouble upz);

int APIENTRY gluProject (
    GLdouble        objx, 
    GLdouble        objy, 
    GLdouble        objz,  
    const GLdouble  modelMatrix[16], 
    const GLdouble  projMatrix[16], 
    const GLint     viewport[4], 
    GLdouble        *winx, 
    GLdouble        *winy, 
    GLdouble        *winz);

int APIENTRY gluUnProject (
    GLdouble       winx, 
    GLdouble       winy, 
    GLdouble       winz, 
    const GLdouble modelMatrix[16], 
    const GLdouble projMatrix[16], 
    const GLint    viewport[4], 
    GLdouble       *objx, 
    GLdouble       *objy, 
    GLdouble       *objz);


int APIENTRY gluScaleImage (
    GLenum      format, 
    GLint       widthin, 
    GLint       heightin, 
    GLenum      typein, 
    const void  *datain, 
    GLint       widthout, 
    GLint       heightout, 
    GLenum      typeout, 
    void        *dataout);


int APIENTRY gluBuild1DMipmaps (
    GLenum      target, 
    GLint       components, 
    GLint       width, 
    GLenum      format, 
    GLenum      type, 
    const void  *data);

int APIENTRY gluBuild2DMipmaps (
    GLenum      target, 
    GLint       components, 
    GLint       width, 
    GLint       height, 
    GLenum      format, 
    GLenum      type, 
    const void  *data);

#ifdef __cplusplus

class GLUnurbs;
class GLUquadric;
class GLUtesselator;

/* backwards compatibility: */
typedef class GLUnurbs GLUnurbsObj;
typedef class GLUquadric GLUquadricObj;
typedef class GLUtesselator GLUtesselatorObj;
typedef class GLUtesselator GLUtriangulatorObj;

#else

typedef struct GLUnurbs GLUnurbs;
typedef struct GLUquadric GLUquadric;
typedef struct GLUtesselator GLUtesselator;

/* backwards compatibility: */
typedef struct GLUnurbs GLUnurbsObj;
typedef struct GLUquadric GLUquadricObj;
typedef struct GLUtesselator GLUtesselatorObj;
typedef struct GLUtesselator GLUtriangulatorObj;

#endif


GLUquadric* APIENTRY gluNewQuadric (void);
void APIENTRY gluDeleteQuadric (
    GLUquadric          *state);

void APIENTRY gluQuadricNormals (
    GLUquadric          *quadObject, 
    GLenum              normals);

void APIENTRY gluQuadricTexture (
    GLUquadric          *quadObject, 
    GLboolean           textureCoords);

void APIENTRY gluQuadricOrientation (
    GLUquadric          *quadObject, 
    GLenum              orientation);

void APIENTRY gluQuadricDrawStyle (
    GLUquadric          *quadObject, 
    GLenum              drawStyle);

void APIENTRY gluCylinder (
    GLUquadric          *qobj, 
    GLdouble            baseRadius, 
    GLdouble            topRadius, 
    GLdouble            height, 
    GLint               slices, 
    GLint               stacks);

void APIENTRY gluDisk (
    GLUquadric          *qobj, 
    GLdouble            innerRadius, 
    GLdouble            outerRadius, 
    GLint               slices, 
    GLint               loops);

void APIENTRY gluPartialDisk (
    GLUquadric          *qobj, 
    GLdouble            innerRadius, 
    GLdouble            outerRadius, 
    GLint               slices, 
    GLint               loops, 
    GLdouble            startAngle, 
    GLdouble            sweepAngle);

void APIENTRY gluSphere (
    GLUquadric          *qobj, 
    GLdouble            radius, 
    GLint               slices, 
    GLint               stacks);

void APIENTRY gluQuadricCallback (
    GLUquadric          *qobj, 
    GLenum              which, 
    void                (CALLBACK* fn)());

GLUtesselator* APIENTRY  gluNewTess(          
    void );

void APIENTRY  gluDeleteTess(       
    GLUtesselator       *tess );

void APIENTRY  gluTessBeginPolygon( 
    GLUtesselator       *tess,
    void                *polygon_data );

void APIENTRY  gluTessBeginContour( 
    GLUtesselator       *tess );

void APIENTRY  gluTessVertex(       
    GLUtesselator       *tess,
    GLdouble            coords[3], 
    void                *data );

void APIENTRY  gluTessEndContour(   
    GLUtesselator       *tess );

void APIENTRY  gluTessEndPolygon(   
    GLUtesselator       *tess );

void APIENTRY  gluTessProperty(     
    GLUtesselator       *tess,
    GLenum              which, 
    GLdouble            value );
 
void APIENTRY  gluTessNormal(       
    GLUtesselator       *tess, 
    GLdouble            x,
    GLdouble            y, 
    GLdouble            z );

void APIENTRY  gluTessCallback(     
    GLUtesselator       *tess,
    GLenum              which, 
    void                (CALLBACK *fn)());

void APIENTRY  gluGetTessProperty(  
    GLUtesselator       *tess,
    GLenum              which, 
    GLdouble            *value );
 
GLUnurbs* APIENTRY gluNewNurbsRenderer (void);

void APIENTRY gluDeleteNurbsRenderer (
    GLUnurbs            *nobj);

void APIENTRY gluBeginSurface (
    GLUnurbs            *nobj);

void APIENTRY gluBeginCurve (
    GLUnurbs            *nobj);

void APIENTRY gluEndCurve (
    GLUnurbs            *nobj);

void APIENTRY gluEndSurface (
    GLUnurbs            *nobj);

void APIENTRY gluBeginTrim (
    GLUnurbs            *nobj);

void APIENTRY gluEndTrim (
    GLUnurbs            *nobj);

void APIENTRY gluPwlCurve (
    GLUnurbs            *nobj, 
    GLint               count, 
    GLfloat             *array, 
    GLint               stride, 
    GLenum              type);

void APIENTRY gluNurbsCurve (
    GLUnurbs            *nobj, 
    GLint               nknots, 
    GLfloat             *knot, 
    GLint               stride, 
    GLfloat             *ctlarray, 
    GLint               order, 
    GLenum              type);

void APIENTRY 
gluNurbsSurface(     
    GLUnurbs            *nobj, 
    GLint               sknot_count, 
    float               *sknot, 
    GLint               tknot_count, 
    GLfloat             *tknot, 
    GLint               s_stride, 
    GLint               t_stride, 
    GLfloat             *ctlarray, 
    GLint               sorder, 
    GLint               torder, 
    GLenum              type);

void APIENTRY 
gluLoadSamplingMatrices (
    GLUnurbs            *nobj, 
    const GLfloat       modelMatrix[16], 
    const GLfloat       projMatrix[16], 
    const GLint         viewport[4] );

void APIENTRY 
gluNurbsProperty (
    GLUnurbs            *nobj, 
    GLenum              property, 
    GLfloat             value );

void APIENTRY 
gluGetNurbsProperty (
    GLUnurbs            *nobj, 
    GLenum              property, 
    GLfloat             *value );

void APIENTRY 
gluNurbsCallback (
    GLUnurbs            *nobj, 
    GLenum              which, 
    void                (CALLBACK* fn)() );


/****           Callback function prototypes    ****/

/* gluQuadricCallback */
typedef void (CALLBACK* GLUquadricErrorProc) (GLenum);

/* gluTessCallback */
typedef void (CALLBACK* GLUtessBeginProc)        (GLenum);
typedef void (CALLBACK* GLUtessEdgeFlagProc)     (GLboolean);
typedef void (CALLBACK* GLUtessVertexProc)       (void *);
typedef void (CALLBACK* GLUtessEndProc)          (void);
typedef void (CALLBACK* GLUtessErrorProc)        (GLenum);
typedef void (CALLBACK* GLUtessCombineProc)      (GLdouble[3],
                                                  void*[4], 
                                                  GLfloat[4],
                                                  void** );
typedef void (CALLBACK* GLUtessBeginDataProc)    (GLenum, void *);
typedef void (CALLBACK* GLUtessEdgeFlagDataProc) (GLboolean, void *);
typedef void (CALLBACK* GLUtessVertexDataProc)   (void *, void *);
typedef void (CALLBACK* GLUtessEndDataProc)      (void *);
typedef void (CALLBACK* GLUtessErrorDataProc)    (GLenum, void *);
typedef void (CALLBACK* GLUtessCombineDataProc)  (GLdouble[3],
                                                  void*[4], 
                                                  GLfloat[4],
                                                  void**,
                                                  void* );

/* gluNurbsCallback */
typedef void (CALLBACK* GLUnurbsErrorProc)   (GLenum);


/****           Generic constants               ****/

/* Version */
#define GLU_VERSION_1_1                 1
#define GLU_VERSION_1_2                 1

/* Errors: (return value 0 = no error) */
#define GLU_INVALID_ENUM        100900
#define GLU_INVALID_VALUE       100901
#define GLU_OUT_OF_MEMORY       100902
#define GLU_INCOMPATIBLE_GL_VERSION     100903

/* StringName */
#define GLU_VERSION             100800
#define GLU_EXTENSIONS          100801

/* Boolean */
#define GLU_TRUE                GL_TRUE
#define GLU_FALSE               GL_FALSE


/****           Quadric constants               ****/

/* QuadricNormal */
#define GLU_SMOOTH              100000
#define GLU_FLAT                100001
#define GLU_NONE                100002

/* QuadricDrawStyle */
#define GLU_POINT               100010
#define GLU_LINE                100011
#define GLU_FILL                100012
#define GLU_SILHOUETTE          100013

/* QuadricOrientation */
#define GLU_OUTSIDE             100020
#define GLU_INSIDE              100021

/* Callback types: */
/*      GLU_ERROR               100103 */


/****           Tesselation constants           ****/

#define GLU_TESS_MAX_COORD              1.0e150

/* TessProperty */
#define GLU_TESS_WINDING_RULE           100140
#define GLU_TESS_BOUNDARY_ONLY          100141
#define GLU_TESS_TOLERANCE              100142

/* TessWinding */
#define GLU_TESS_WINDING_ODD            100130
#define GLU_TESS_WINDING_NONZERO        100131
#define GLU_TESS_WINDING_POSITIVE       100132
#define GLU_TESS_WINDING_NEGATIVE       100133
#define GLU_TESS_WINDING_ABS_GEQ_TWO    100134

/* TessCallback */
#define GLU_TESS_BEGIN          100100  /* void (CALLBACK*)(GLenum    type)  */
#define GLU_TESS_VERTEX         100101  /* void (CALLBACK*)(void      *data) */
#define GLU_TESS_END            100102  /* void (CALLBACK*)(void)            */
#define GLU_TESS_ERROR          100103  /* void (CALLBACK*)(GLenum    errno) */
#define GLU_TESS_EDGE_FLAG      100104  /* void (CALLBACK*)(GLboolean boundaryEdge)  */
#define GLU_TESS_COMBINE        100105  /* void (CALLBACK*)(GLdouble  coords[3],
                                                            void      *data[4],
                                                            GLfloat   weight[4],
                                                            void      **dataOut)     */
#define GLU_TESS_BEGIN_DATA     100106  /* void (CALLBACK*)(GLenum    type,  
                                                            void      *polygon_data) */
#define GLU_TESS_VERTEX_DATA    100107  /* void (CALLBACK*)(void      *data, 
                                                            void      *polygon_data) */
#define GLU_TESS_END_DATA       100108  /* void (CALLBACK*)(void      *polygon_data) */
#define GLU_TESS_ERROR_DATA     100109  /* void (CALLBACK*)(GLenum    errno, 
                                                            void      *polygon_data) */
#define GLU_TESS_EDGE_FLAG_DATA 100110  /* void (CALLBACK*)(GLboolean boundaryEdge,
                                                            void      *polygon_data) */
#define GLU_TESS_COMBINE_DATA   100111  /* void (CALLBACK*)(GLdouble  coords[3],
                                                            void      *data[4],
                                                            GLfloat   weight[4],
                                                            void      **dataOut,
                                                            void      *polygon_data) */

/* TessError */
#define GLU_TESS_ERROR1     100151
#define GLU_TESS_ERROR2     100152
#define GLU_TESS_ERROR3     100153
#define GLU_TESS_ERROR4     100154
#define GLU_TESS_ERROR5     100155
#define GLU_TESS_ERROR6     100156
#define GLU_TESS_ERROR7     100157
#define GLU_TESS_ERROR8     100158

#define GLU_TESS_MISSING_BEGIN_POLYGON  GLU_TESS_ERROR1
#define GLU_TESS_MISSING_BEGIN_CONTOUR  GLU_TESS_ERROR2
#define GLU_TESS_MISSING_END_POLYGON    GLU_TESS_ERROR3
#define GLU_TESS_MISSING_END_CONTOUR    GLU_TESS_ERROR4
#define GLU_TESS_COORD_TOO_LARGE        GLU_TESS_ERROR5
#define GLU_TESS_NEED_COMBINE_CALLBACK  GLU_TESS_ERROR6

/****           NURBS constants                 ****/

/* NurbsProperty */
#define GLU_AUTO_LOAD_MATRIX    100200
#define GLU_CULLING             100201
#define GLU_SAMPLING_TOLERANCE  100203
#define GLU_DISPLAY_MODE        100204
#define GLU_PARAMETRIC_TOLERANCE        100202
#define GLU_SAMPLING_METHOD             100205
#define GLU_U_STEP                      100206
#define GLU_V_STEP                      100207

/* NurbsSampling */
#define GLU_PATH_LENGTH                 100215
#define GLU_PARAMETRIC_ERROR            100216
#define GLU_DOMAIN_DISTANCE             100217


/* NurbsTrim */
#define GLU_MAP1_TRIM_2         100210
#define GLU_MAP1_TRIM_3         100211

/* NurbsDisplay */
/*      GLU_FILL                100012 */
#define GLU_OUTLINE_POLYGON     100240
#define GLU_OUTLINE_PATCH       100241

/* NurbsCallback */
/*      GLU_ERROR               100103 */

/* NurbsErrors */
#define GLU_NURBS_ERROR1        100251
#define GLU_NURBS_ERROR2        100252
#define GLU_NURBS_ERROR3        100253
#define GLU_NURBS_ERROR4        100254
#define GLU_NURBS_ERROR5        100255
#define GLU_NURBS_ERROR6        100256
#define GLU_NURBS_ERROR7        100257
#define GLU_NURBS_ERROR8        100258
#define GLU_NURBS_ERROR9        100259
#define GLU_NURBS_ERROR10       100260
#define GLU_NURBS_ERROR11       100261
#define GLU_NURBS_ERROR12       100262
#define GLU_NURBS_ERROR13       100263
#define GLU_NURBS_ERROR14       100264
#define GLU_NURBS_ERROR15       100265
#define GLU_NURBS_ERROR16       100266
#define GLU_NURBS_ERROR17       100267
#define GLU_NURBS_ERROR18       100268
#define GLU_NURBS_ERROR19       100269
#define GLU_NURBS_ERROR20       100270
#define GLU_NURBS_ERROR21       100271
#define GLU_NURBS_ERROR22       100272
#define GLU_NURBS_ERROR23       100273
#define GLU_NURBS_ERROR24       100274
#define GLU_NURBS_ERROR25       100275
#define GLU_NURBS_ERROR26       100276
#define GLU_NURBS_ERROR27       100277
#define GLU_NURBS_ERROR28       100278
#define GLU_NURBS_ERROR29       100279
#define GLU_NURBS_ERROR30       100280
#define GLU_NURBS_ERROR31       100281
#define GLU_NURBS_ERROR32       100282
#define GLU_NURBS_ERROR33       100283
#define GLU_NURBS_ERROR34       100284
#define GLU_NURBS_ERROR35       100285
#define GLU_NURBS_ERROR36       100286
#define GLU_NURBS_ERROR37       100287

/****           Backwards compatibility for old tesselator           ****/

void APIENTRY   gluBeginPolygon( GLUtesselator *tess );

void APIENTRY   gluNextContour(  GLUtesselator *tess, 
                                 GLenum        type );

void APIENTRY   gluEndPolygon(   GLUtesselator *tess );

/* Contours types -- obsolete! */
#define GLU_CW          100120
#define GLU_CCW         100121
#define GLU_INTERIOR    100122
#define GLU_EXTERIOR    100123
#define GLU_UNKNOWN     100124

/* Names without "TESS_" prefix */
#define GLU_BEGIN       GLU_TESS_BEGIN
#define GLU_VERTEX      GLU_TESS_VERTEX
#define GLU_END         GLU_TESS_END
#define GLU_ERROR       GLU_TESS_ERROR
#define GLU_EDGE_FLAG   GLU_TESS_EDGE_FLAG

#ifdef __cplusplus
}
#endif

#endif /* __GLU_H__ */
#endif /* __glu_h__ */

// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	LCARSControls.H
// 
// Description: Contains the header information for the LCARS Controls 
// ----------------------------------------------------------------------------
// LCARSControls.H
#ifndef LCARSControls_H
#define LCARSControls_H

class LCARSControlBase;
class LCARSCanvas; // Forward declaration

// Constants used - may want to think about separting this out to a different file.
class LCARSConstants
{
public:
	static enum Colors
	{
		SUNYELLOW = 0xffff99,
		VULCANYELLOW = 0xffcc66,
		MENUORANGE = 0xff9933,
		POSEIDENPURPLE = 0x664466,
		ISISPURPLE = 0xcc99cc,
		EARTHSKYBLUE = 0x99ccff,
		EARTHOCEANBLUE = 0x3366cc,
		DEEPSEABLUE	 = 0x006699,

		LILYPURPLE = 0x9999cc,
		ORIONPURPLE = 0x9999ff,
		NEUTRONPURPLE = 0xcc99cc,
		PIGSKINPINK = 0xcc6699,
		PUSSYPINK = 0xcc6666,	// credit Sid for this one
		SKINCOLOR = 0xff9966,
		PUMPKINORANGE = 0xff9900,
		VULCANHORIZON = 0xffcc66,

		NITROGENBLUE = 0x6688cc, // credit Sid for this one
		NEPTUNEBLUE = 0x4455bb, // Colaborate with credit Sid for this one
		//= 0x9977aa,
		LAVALILAC = 0x774466,	// Thank you, Brenda
		FERRENGIORANGE = 0xdd6644,
		KLINGONBROWN = 0xaa5533,
		//= 0xbb6622,
		//= 0xee9955,

		GALAXYBLUE = 0xccddff,
		HYDROGEN3BLUE = 0x5599ff,
		CELESTIALTEARS = 0x3366ff, // Thank you, Brenda
		//= 0x0011ee,
		NEBULABLUE = 0x000088,
		//= 0xbbaa55,
		TERRASUNSET = 0xbb4411, // Thank you, Brenda
		FLASHBROWN = 0x882211 // tentative
	};
};


class LCARSControlBase
{
private:
	// These are used to limit the color range for the foreground color selection
	LCARSConstants::Colors myFGColor;
	LCARSConstants::Colors myBGColor;

	int myTop;
	int myLeft;
	int myHeight;
	int myWidth;
	int myHH;
	int myRight;
	int myBottom;

protected:
	LCARSCanvas *myCanvas;

	// and this is used to repaint...
	GLColor myGLFGColor;
	GLColor myGLBGColor;


public:
	LCARSCanvas *Canvas();
	void Canvas( LCARSCanvas* value );

	LCARSConstants::Colors ForegroundColor();
	void ForegroundColor( LCARSConstants::Colors value );

	LCARSConstants::Colors BackgroundColor();
	void BackgroundColor( LCARSConstants::Colors value );

	LCARSControlBase();
	LCARSControlBase( LCARSCanvas *current );

	virtual GLvoid Draw() = 0;

	// Implementation of destruction is in the inheritor...
	virtual ~LCARSControlBase(){};

	int Width();
	void Width( int  value );

	int  Height();
	void Height( int  value );

	int  Left();
	void Left( int  value );

	int  Top();
	void Top( int  value );

	int Right();
	int Bottom();

	int HalfHeight();

	CString Name();
	void Name( CString value );
};

class LCARSCanvas: public LCARSControlBase
{
protected:
	std::list<LCARSControlBase*> myControls;

public:
	// Wraps up (deletes) objects attached to the palette.
	~LCARSCanvas();
	
	// Adds a new control to this 'canvas'
	void	Add( LCARSControlBase *control );

	// Functions
	GLvoid Draw(); 
};

class LCARSButton: public LCARSControlBase
{
private:
	char *myCaption;

protected:
	//GLText2D *myText;

public:
	LCARSButton();
	~LCARSButton();

	// Functions
	GLvoid Draw(); 

	// Properties
	char *Caption();
	void Caption( char* value );
};



#endif

// resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Project T.A.R.D.I.S..rc

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        101
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

/*++ BUILD Version: 0004    // Increment this if a change has global effects

Copyright (c) 1985-96, Microsoft Corporation

Module Name:

    gl.h

Abstract:

    Procedure declarations, constant definitions and macros for the OpenGL
    component.

--*/

#ifndef __gl_h_
#ifndef __GL_H__

#define __gl_h_
#define __GL_H__

#ifdef __cplusplus
extern "C" {
#endif

/*
** Copyright 1996 Silicon Graphics, Inc.
** All Rights Reserved.
**
** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
** the contents of this file may not be disclosed to third parties, copied or
** duplicated in any form, in whole or in part, without the prior written
** permission of Silicon Graphics, Inc.
**
** RESTRICTED RIGHTS LEGEND:
** Use, duplication or disclosure by the Government is subject to restrictions
** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
** rights reserved under the Copyright Laws of the United States.
*/

typedef unsigned int GLenum;
typedef unsigned char GLboolean;
typedef unsigned int GLbitfield;
typedef signed char GLbyte;
typedef short GLshort;
typedef int GLint;
typedef int GLsizei;
typedef unsigned char GLubyte;
typedef unsigned short GLushort;
typedef unsigned int GLuint;
typedef float GLfloat;
typedef float GLclampf;
typedef double GLdouble;
typedef double GLclampd;
typedef void GLvoid;

/*************************************************************/

/* Version */
#define GL_VERSION_1_1                    1

/* AccumOp */
#define GL_ACCUM                          0x0100
#define GL_LOAD                           0x0101
#define GL_RETURN                         0x0102
#define GL_MULT                           0x0103
#define GL_ADD                            0x0104

/* AlphaFunction */
#define GL_NEVER                          0x0200
#define GL_LESS                           0x0201
#define GL_EQUAL                          0x0202
#define GL_LEQUAL                         0x0203
#define GL_GREATER                        0x0204
#define GL_NOTEQUAL                       0x0205
#define GL_GEQUAL                         0x0206
#define GL_ALWAYS                         0x0207

/* AttribMask */
#define GL_CURRENT_BIT                    0x00000001
#define GL_POINT_BIT                      0x00000002
#define GL_LINE_BIT                       0x00000004
#define GL_POLYGON_BIT                    0x00000008
#define GL_POLYGON_STIPPLE_BIT            0x00000010
#define GL_PIXEL_MODE_BIT                 0x00000020
#define GL_LIGHTING_BIT                   0x00000040
#define GL_FOG_BIT                        0x00000080
#define GL_DEPTH_BUFFER_BIT               0x00000100
#define GL_ACCUM_BUFFER_BIT               0x00000200
#define GL_STENCIL_BUFFER_BIT             0x00000400
#define GL_VIEWPORT_BIT                   0x00000800
#define GL_TRANSFORM_BIT                  0x00001000
#define GL_ENABLE_BIT                     0x00002000
#define GL_COLOR_BUFFER_BIT               0x00004000
#define GL_HINT_BIT                       0x00008000
#define GL_EVAL_BIT                       0x00010000
#define GL_LIST_BIT                       0x00020000
#define GL_TEXTURE_BIT                    0x00040000
#define GL_SCISSOR_BIT                    0x00080000
#define GL_ALL_ATTRIB_BITS                0x000fffff

/* BeginMode */
#define GL_POINTS                         0x0000
#define GL_LINES                          0x0001
#define GL_LINE_LOOP                      0x0002
#define GL_LINE_STRIP                     0x0003
#define GL_TRIANGLES                      0x0004
#define GL_TRIANGLE_STRIP                 0x0005
#define GL_TRIANGLE_FAN                   0x0006
#define GL_QUADS                          0x0007
#define GL_QUAD_STRIP                     0x0008
#define GL_POLYGON                        0x0009

/* BlendingFactorDest */
#define GL_ZERO                           0
#define GL_ONE                            1
#define GL_SRC_COLOR                      0x0300
#define GL_ONE_MINUS_SRC_COLOR            0x0301
#define GL_SRC_ALPHA                      0x0302
#define GL_ONE_MINUS_SRC_ALPHA            0x0303
#define GL_DST_ALPHA                      0x0304
#define GL_ONE_MINUS_DST_ALPHA            0x0305

/* BlendingFactorSrc */
/*      GL_ZERO */
/*      GL_ONE */
#define GL_DST_COLOR                      0x0306
#define GL_ONE_MINUS_DST_COLOR            0x0307
#define GL_SRC_ALPHA_SATURATE             0x0308
/*      GL_SRC_ALPHA */
/*      GL_ONE_MINUS_SRC_ALPHA */
/*      GL_DST_ALPHA */
/*      GL_ONE_MINUS_DST_ALPHA */

/* Boolean */
#define GL_TRUE                           1
#define GL_FALSE                          0

/* ClearBufferMask */
/*      GL_COLOR_BUFFER_BIT */
/*      GL_ACCUM_BUFFER_BIT */
/*      GL_STENCIL_BUFFER_BIT */
/*      GL_DEPTH_BUFFER_BIT */

/* ClientArrayType */
/*      GL_VERTEX_ARRAY */
/*      GL_NORMAL_ARRAY */
/*      GL_COLOR_ARRAY */
/*      GL_INDEX_ARRAY */
/*      GL_TEXTURE_COORD_ARRAY */
/*      GL_EDGE_FLAG_ARRAY */

/* ClipPlaneName */
#define GL_CLIP_PLANE0                    0x3000
#define GL_CLIP_PLANE1                    0x3001
#define GL_CLIP_PLANE2                    0x3002
#define GL_CLIP_PLANE3                    0x3003
#define GL_CLIP_PLANE4                    0x3004
#define GL_CLIP_PLANE5                    0x3005

/* ColorMaterialFace */
/*      GL_FRONT */
/*      GL_BACK */
/*      GL_FRONT_AND_BACK */

/* ColorMaterialParameter */
/*      GL_AMBIENT */
/*      GL_DIFFUSE */
/*      GL_SPECULAR */
/*      GL_EMISSION */
/*      GL_AMBIENT_AND_DIFFUSE */

/* ColorPointerType */
/*      GL_BYTE */
/*      GL_UNSIGNED_BYTE */
/*      GL_SHORT */
/*      GL_UNSIGNED_SHORT */
/*      GL_INT */
/*      GL_UNSIGNED_INT */
/*      GL_FLOAT */
/*      GL_DOUBLE */

/* CullFaceMode */
/*      GL_FRONT */
/*      GL_BACK */
/*      GL_FRONT_AND_BACK */

/* DataType */
#define GL_BYTE                           0x1400
#define GL_UNSIGNED_BYTE                  0x1401
#define GL_SHORT                          0x1402
#define GL_UNSIGNED_SHORT                 0x1403
#define GL_INT                            0x1404
#define GL_UNSIGNED_INT                   0x1405
#define GL_FLOAT                          0x1406
#define GL_2_BYTES                        0x1407
#define GL_3_BYTES                        0x1408
#define GL_4_BYTES                        0x1409
#define GL_DOUBLE                         0x140A

/* DepthFunction */
/*      GL_NEVER */
/*      GL_LESS */
/*      GL_EQUAL */
/*      GL_LEQUAL */
/*      GL_GREATER */
/*      GL_NOTEQUAL */
/*      GL_GEQUAL */
/*      GL_ALWAYS */

/* DrawBufferMode */
#define GL_NONE                           0
#define GL_FRONT_LEFT                     0x0400
#define GL_FRONT_RIGHT                    0x0401
#define GL_BACK_LEFT                      0x0402
#define GL_BACK_RIGHT                     0x0403
#define GL_FRONT                          0x0404
#define GL_BACK                           0x0405
#define GL_LEFT                           0x0406
#define GL_RIGHT                          0x0407
#define GL_FRONT_AND_BACK                 0x0408
#define GL_AUX0                           0x0409
#define GL_AUX1                           0x040A
#define GL_AUX2                           0x040B
#define GL_AUX3                           0x040C

/* Enable */
/*      GL_FOG */
/*      GL_LIGHTING */
/*      GL_TEXTURE_1D */
/*      GL_TEXTURE_2D */
/*      GL_LINE_STIPPLE */
/*      GL_POLYGON_STIPPLE */
/*      GL_CULL_FACE */
/*      GL_ALPHA_TEST */
/*      GL_BLEND */
/*      GL_INDEX_LOGIC_OP */
/*      GL_COLOR_LOGIC_OP */
/*      GL_DITHER */
/*      GL_STENCIL_TEST */
/*      GL_DEPTH_TEST */
/*      GL_CLIP_PLANE0 */
/*      GL_CLIP_PLANE1 */
/*      GL_CLIP_PLANE2 */
/*      GL_CLIP_PLANE3 */
/*      GL_CLIP_PLANE4 */
/*      GL_CLIP_PLANE5 */
/*      GL_LIGHT0 */
/*      GL_LIGHT1 */
/*      GL_LIGHT2 */
/*      GL_LIGHT3 */
/*      GL_LIGHT4 */
/*      GL_LIGHT5 */
/*      GL_LIGHT6 */
/*      GL_LIGHT7 */
/*      GL_TEXTURE_GEN_S */
/*      GL_TEXTURE_GEN_T */
/*      GL_TEXTURE_GEN_R */
/*      GL_TEXTURE_GEN_Q */
/*      GL_MAP1_VERTEX_3 */
/*      GL_MAP1_VERTEX_4 */
/*      GL_MAP1_COLOR_4 */
/*      GL_MAP1_INDEX */
/*      GL_MAP1_NORMAL */
/*      GL_MAP1_TEXTURE_COORD_1 */
/*      GL_MAP1_TEXTURE_COORD_2 */
/*      GL_MAP1_TEXTURE_COORD_3 */
/*      GL_MAP1_TEXTURE_COORD_4 */
/*      GL_MAP2_VERTEX_3 */
/*      GL_MAP2_VERTEX_4 */
/*      GL_MAP2_COLOR_4 */
/*      GL_MAP2_INDEX */
/*      GL_MAP2_NORMAL */
/*      GL_MAP2_TEXTURE_COORD_1 */
/*      GL_MAP2_TEXTURE_COORD_2 */
/*      GL_MAP2_TEXTURE_COORD_3 */
/*      GL_MAP2_TEXTURE_COORD_4 */
/*      GL_POINT_SMOOTH */
/*      GL_LINE_SMOOTH */
/*      GL_POLYGON_SMOOTH */
/*      GL_SCISSOR_TEST */
/*      GL_COLOR_MATERIAL */
/*      GL_NORMALIZE */
/*      GL_AUTO_NORMAL */
/*      GL_VERTEX_ARRAY */
/*      GL_NORMAL_ARRAY */
/*      GL_COLOR_ARRAY */
/*      GL_INDEX_ARRAY */
/*      GL_TEXTURE_COORD_ARRAY */
/*      GL_EDGE_FLAG_ARRAY */
/*      GL_POLYGON_OFFSET_POINT */
/*      GL_POLYGON_OFFSET_LINE */
/*      GL_POLYGON_OFFSET_FILL */

/* ErrorCode */
#define GL_NO_ERROR                       0
#define GL_INVALID_ENUM                   0x0500
#define GL_INVALID_VALUE                  0x0501
#define GL_INVALID_OPERATION              0x0502
#define GL_STACK_OVERFLOW                 0x0503
#define GL_STACK_UNDERFLOW                0x0504
#define GL_OUT_OF_MEMORY                  0x0505

/* FeedBackMode */
#define GL_2D                             0x0600
#define GL_3D                             0x0601
#define GL_3D_COLOR                       0x0602
#define GL_3D_COLOR_TEXTURE               0x0603
#define GL_4D_COLOR_TEXTURE               0x0604

/* FeedBackToken */
#define GL_PASS_THROUGH_TOKEN             0x0700
#define GL_POINT_TOKEN                    0x0701
#define GL_LINE_TOKEN                     0x0702
#define GL_POLYGON_TOKEN                  0x0703
#define GL_BITMAP_TOKEN                   0x0704
#define GL_DRAW_PIXEL_TOKEN               0x0705
#define GL_COPY_PIXEL_TOKEN               0x0706
#define GL_LINE_RESET_TOKEN               0x0707

/* FogMode */
/*      GL_LINEAR */
#define GL_EXP                            0x0800
#define GL_EXP2                           0x0801


/* FogParameter */
/*      GL_FOG_COLOR */
/*      GL_FOG_DENSITY */
/*      GL_FOG_END */
/*      GL_FOG_INDEX */
/*      GL_FOG_MODE */
/*      GL_FOG_START */

/* FrontFaceDirection */
#define GL_CW                             0x0900
#define GL_CCW                            0x0901

/* GetMapTarget */
#define GL_COEFF                          0x0A00
#define GL_ORDER                          0x0A01
#define GL_DOMAIN                         0x0A02

/* GetPixelMap */
/*      GL_PIXEL_MAP_I_TO_I */
/*      GL_PIXEL_MAP_S_TO_S */
/*      GL_PIXEL_MAP_I_TO_R */
/*      GL_PIXEL_MAP_I_TO_G */
/*      GL_PIXEL_MAP_I_TO_B */
/*      GL_PIXEL_MAP_I_TO_A */
/*      GL_PIXEL_MAP_R_TO_R */
/*      GL_PIXEL_MAP_G_TO_G */
/*      GL_PIXEL_MAP_B_TO_B */
/*      GL_PIXEL_MAP_A_TO_A */

/* GetPointerTarget */
/*      GL_VERTEX_ARRAY_POINTER */
/*      GL_NORMAL_ARRAY_POINTER */
/*      GL_COLOR_ARRAY_POINTER */
/*      GL_INDEX_ARRAY_POINTER */
/*      GL_TEXTURE_COORD_ARRAY_POINTER */
/*      GL_EDGE_FLAG_ARRAY_POINTER */

/* GetTarget */
#define GL_CURRENT_COLOR                  0x0B00
#define GL_CURRENT_INDEX                  0x0B01
#define GL_CURRENT_NORMAL                 0x0B02
#define GL_CURRENT_TEXTURE_COORDS         0x0B03
#define GL_CURRENT_RASTER_COLOR           0x0B04
#define GL_CURRENT_RASTER_INDEX           0x0B05
#define GL_CURRENT_RASTER_TEXTURE_COORDS  0x0B06
#define GL_CURRENT_RASTER_POSITION        0x0B07
#define GL_CURRENT_RASTER_POSITION_VALID  0x0B08
#define GL_CURRENT_RASTER_DISTANCE        0x0B09
#define GL_POINT_SMOOTH                   0x0B10
#define GL_POINT_SIZE                     0x0B11
#define GL_POINT_SIZE_RANGE               0x0B12
#define GL_POINT_SIZE_GRANULARITY         0x0B13
#define GL_LINE_SMOOTH                    0x0B20
#define GL_LINE_WIDTH                     0x0B21
#define GL_LINE_WIDTH_RANGE               0x0B22
#define GL_LINE_WIDTH_GRANULARITY         0x0B23
#define GL_LINE_STIPPLE                   0x0B24
#define GL_LINE_STIPPLE_PATTERN           0x0B25
#define GL_LINE_STIPPLE_REPEAT            0x0B26
#define GL_LIST_MODE                      0x0B30
#define GL_MAX_LIST_NESTING               0x0B31
#define GL_LIST_BASE                      0x0B32
#define GL_LIST_INDEX                     0x0B33
#define GL_POLYGON_MODE                   0x0B40
#define GL_POLYGON_SMOOTH                 0x0B41
#define GL_POLYGON_STIPPLE                0x0B42
#define GL_EDGE_FLAG                      0x0B43
#define GL_CULL_FACE                      0x0B44
#define GL_CULL_FACE_MODE                 0x0B45
#define GL_FRONT_FACE                     0x0B46
#define GL_LIGHTING                       0x0B50
#define GL_LIGHT_MODEL_LOCAL_VIEWER       0x0B51
#define GL_LIGHT_MODEL_TWO_SIDE           0x0B52
#define GL_LIGHT_MODEL_AMBIENT            0x0B53
#define GL_SHADE_MODEL                    0x0B54
#define GL_COLOR_MATERIAL_FACE            0x0B55
#define GL_COLOR_MATERIAL_PARAMETER       0x0B56
#define GL_COLOR_MATERIAL                 0x0B57
#define GL_FOG                            0x0B60
#define GL_FOG_INDEX                      0x0B61
#define GL_FOG_DENSITY                    0x0B62
#define GL_FOG_START                      0x0B63
#define GL_FOG_END                        0x0B64
#define GL_FOG_MODE                       0x0B65
#define GL_FOG_COLOR                      0x0B66
#define GL_DEPTH_RANGE                    0x0B70
#define GL_DEPTH_TEST                     0x0B71
#define GL_DEPTH_WRITEMASK                0x0B72
#define GL_DEPTH_CLEAR_VALUE              0x0B73
#define GL_DEPTH_FUNC                     0x0B74
#define GL_ACCUM_CLEAR_VALUE              0x0B80
#define GL_STENCIL_TEST                   0x0B90
#define GL_STENCIL_CLEAR_VALUE            0x0B91
#define GL_STENCIL_FUNC                   0x0B92
#define GL_STENCIL_VALUE_MASK             0x0B93
#define GL_STENCIL_FAIL                   0x0B94
#define GL_STENCIL_PASS_DEPTH_FAIL        0x0B95
#define GL_STENCIL_PASS_DEPTH_PASS        0x0B96
#define GL_STENCIL_REF                    0x0B97
#define GL_STENCIL_WRITEMASK              0x0B98
#define GL_MATRIX_MODE                    0x0BA0
#define GL_NORMALIZE                      0x0BA1
#define GL_VIEWPORT                       0x0BA2
#define GL_MODELVIEW_STACK_DEPTH          0x0BA3
#define GL_PROJECTION_STACK_DEPTH         0x0BA4
#define GL_TEXTURE_STACK_DEPTH            0x0BA5
#define GL_MODELVIEW_MATRIX               0x0BA6
#define GL_PROJECTION_MATRIX              0x0BA7
#define GL_TEXTURE_MATRIX                 0x0BA8
#define GL_ATTRIB_STACK_DEPTH             0x0BB0
#define GL_CLIENT_ATTRIB_STACK_DEPTH      0x0BB1
#define GL_ALPHA_TEST                     0x0BC0
#define GL_ALPHA_TEST_FUNC                0x0BC1
#define GL_ALPHA_TEST_REF                 0x0BC2
#define GL_DITHER                         0x0BD0
#define GL_BLEND_DST                      0x0BE0
#define GL_BLEND_SRC                      0x0BE1
#define GL_BLEND                          0x0BE2
#define GL_LOGIC_OP_MODE                  0x0BF0
#define GL_INDEX_LOGIC_OP                 0x0BF1
#define GL_COLOR_LOGIC_OP                 0x0BF2
#define GL_AUX_BUFFERS                    0x0C00
#define GL_DRAW_BUFFER                    0x0C01
#define GL_READ_BUFFER                    0x0C02
#define GL_SCISSOR_BOX                    0x0C10
#define GL_SCISSOR_TEST                   0x0C11
#define GL_INDEX_CLEAR_VALUE              0x0C20
#define GL_INDEX_WRITEMASK                0x0C21
#define GL_COLOR_CLEAR_VALUE              0x0C22
#define GL_COLOR_WRITEMASK                0x0C23
#define GL_INDEX_MODE                     0x0C30
#define GL_RGBA_MODE                      0x0C31
#define GL_DOUBLEBUFFER                   0x0C32
#define GL_STEREO                         0x0C33
#define GL_RENDER_MODE                    0x0C40
#define GL_PERSPECTIVE_CORRECTION_HINT    0x0C50
#define GL_POINT_SMOOTH_HINT              0x0C51
#define GL_LINE_SMOOTH_HINT               0x0C52
#define GL_POLYGON_SMOOTH_HINT            0x0C53
#define GL_FOG_HINT                       0x0C54
#define GL_TEXTURE_GEN_S                  0x0C60
#define GL_TEXTURE_GEN_T                  0x0C61
#define GL_TEXTURE_GEN_R                  0x0C62
#define GL_TEXTURE_GEN_Q                  0x0C63
#define GL_PIXEL_MAP_I_TO_I               0x0C70
#define GL_PIXEL_MAP_S_TO_S               0x0C71
#define GL_PIXEL_MAP_I_TO_R               0x0C72
#define GL_PIXEL_MAP_I_TO_G               0x0C73
#define GL_PIXEL_MAP_I_TO_B               0x0C74
#define GL_PIXEL_MAP_I_TO_A               0x0C75
#define GL_PIXEL_MAP_R_TO_R               0x0C76
#define GL_PIXEL_MAP_G_TO_G               0x0C77
#define GL_PIXEL_MAP_B_TO_B               0x0C78
#define GL_PIXEL_MAP_A_TO_A               0x0C79
#define GL_PIXEL_MAP_I_TO_I_SIZE          0x0CB0
#define GL_PIXEL_MAP_S_TO_S_SIZE          0x0CB1
#define GL_PIXEL_MAP_I_TO_R_SIZE          0x0CB2
#define GL_PIXEL_MAP_I_TO_G_SIZE          0x0CB3
#define GL_PIXEL_MAP_I_TO_B_SIZE          0x0CB4
#define GL_PIXEL_MAP_I_TO_A_SIZE          0x0CB5
#define GL_PIXEL_MAP_R_TO_R_SIZE          0x0CB6
#define GL_PIXEL_MAP_G_TO_G_SIZE          0x0CB7
#define GL_PIXEL_MAP_B_TO_B_SIZE          0x0CB8
#define GL_PIXEL_MAP_A_TO_A_SIZE          0x0CB9
#define GL_UNPACK_SWAP_BYTES              0x0CF0
#define GL_UNPACK_LSB_FIRST               0x0CF1
#define GL_UNPACK_ROW_LENGTH              0x0CF2
#define GL_UNPACK_SKIP_ROWS               0x0CF3
#define GL_UNPACK_SKIP_PIXELS             0x0CF4
#define GL_UNPACK_ALIGNMENT               0x0CF5
#define GL_PACK_SWAP_BYTES                0x0D00
#define GL_PACK_LSB_FIRST                 0x0D01
#define GL_PACK_ROW_LENGTH                0x0D02
#define GL_PACK_SKIP_ROWS                 0x0D03
#define GL_PACK_SKIP_PIXELS               0x0D04
#define GL_PACK_ALIGNMENT                 0x0D05
#define GL_MAP_COLOR                      0x0D10
#define GL_MAP_STENCIL                    0x0D11
#define GL_INDEX_SHIFT                    0x0D12
#define GL_INDEX_OFFSET                   0x0D13
#define GL_RED_SCALE                      0x0D14
#define GL_RED_BIAS                       0x0D15
#define GL_ZOOM_X                         0x0D16
#define GL_ZOOM_Y                         0x0D17
#define GL_GREEN_SCALE                    0x0D18
#define GL_GREEN_BIAS                     0x0D19
#define GL_BLUE_SCALE                     0x0D1A
#define GL_BLUE_BIAS                      0x0D1B
#define GL_ALPHA_SCALE                    0x0D1C
#define GL_ALPHA_BIAS                     0x0D1D
#define GL_DEPTH_SCALE                    0x0D1E
#define GL_DEPTH_BIAS                     0x0D1F
#define GL_MAX_EVAL_ORDER                 0x0D30
#define GL_MAX_LIGHTS                     0x0D31
#define GL_MAX_CLIP_PLANES                0x0D32
#define GL_MAX_TEXTURE_SIZE               0x0D33
#define GL_MAX_PIXEL_MAP_TABLE            0x0D34
#define GL_MAX_ATTRIB_STACK_DEPTH         0x0D35
#define GL_MAX_MODELVIEW_STACK_DEPTH      0x0D36
#define GL_MAX_NAME_STACK_DEPTH           0x0D37
#define GL_MAX_PROJECTION_STACK_DEPTH     0x0D38
#define GL_MAX_TEXTURE_STACK_DEPTH        0x0D39
#define GL_MAX_VIEWPORT_DIMS              0x0D3A
#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH  0x0D3B
#define GL_SUBPIXEL_BITS                  0x0D50
#define GL_INDEX_BITS                     0x0D51
#define GL_RED_BITS                       0x0D52
#define GL_GREEN_BITS                     0x0D53
#define GL_BLUE_BITS                      0x0D54
#define GL_ALPHA_BITS                     0x0D55
#define GL_DEPTH_BITS                     0x0D56
#define GL_STENCIL_BITS                   0x0D57
#define GL_ACCUM_RED_BITS                 0x0D58
#define GL_ACCUM_GREEN_BITS               0x0D59
#define GL_ACCUM_BLUE_BITS                0x0D5A
#define GL_ACCUM_ALPHA_BITS               0x0D5B
#define GL_NAME_STACK_DEPTH               0x0D70
#define GL_AUTO_NORMAL                    0x0D80
#define GL_MAP1_COLOR_4                   0x0D90
#define GL_MAP1_INDEX                     0x0D91
#define GL_MAP1_NORMAL                    0x0D92
#define GL_MAP1_TEXTURE_COORD_1           0x0D93
#define GL_MAP1_TEXTURE_COORD_2           0x0D94
#define GL_MAP1_TEXTURE_COORD_3           0x0D95
#define GL_MAP1_TEXTURE_COORD_4           0x0D96
#define GL_MAP1_VERTEX_3                  0x0D97
#define GL_MAP1_VERTEX_4                  0x0D98
#define GL_MAP2_COLOR_4                   0x0DB0
#define GL_MAP2_INDEX                     0x0DB1
#define GL_MAP2_NORMAL                    0x0DB2
#define GL_MAP2_TEXTURE_COORD_1           0x0DB3
#define GL_MAP2_TEXTURE_COORD_2           0x0DB4
#define GL_MAP2_TEXTURE_COORD_3           0x0DB5
#define GL_MAP2_TEXTURE_COORD_4           0x0DB6
#define GL_MAP2_VERTEX_3                  0x0DB7
#define GL_MAP2_VERTEX_4                  0x0DB8
#define GL_MAP1_GRID_DOMAIN               0x0DD0
#define GL_MAP1_GRID_SEGMENTS             0x0DD1
#define GL_MAP2_GRID_DOMAIN               0x0DD2
#define GL_MAP2_GRID_SEGMENTS             0x0DD3
#define GL_TEXTURE_1D                     0x0DE0
#define GL_TEXTURE_2D                     0x0DE1
#define GL_FEEDBACK_BUFFER_POINTER        0x0DF0
#define GL_FEEDBACK_BUFFER_SIZE           0x0DF1
#define GL_FEEDBACK_BUFFER_TYPE           0x0DF2
#define GL_SELECTION_BUFFER_POINTER       0x0DF3
#define GL_SELECTION_BUFFER_SIZE          0x0DF4
/*      GL_TEXTURE_BINDING_1D */
/*      GL_TEXTURE_BINDING_2D */
/*      GL_VERTEX_ARRAY */
/*      GL_NORMAL_ARRAY */
/*      GL_COLOR_ARRAY */
/*      GL_INDEX_ARRAY */
/*      GL_TEXTURE_COORD_ARRAY */
/*      GL_EDGE_FLAG_ARRAY */
/*      GL_VERTEX_ARRAY_SIZE */
/*      GL_VERTEX_ARRAY_TYPE */
/*      GL_VERTEX_ARRAY_STRIDE */
/*      GL_NORMAL_ARRAY_TYPE */
/*      GL_NORMAL_ARRAY_STRIDE */
/*      GL_COLOR_ARRAY_SIZE */
/*      GL_COLOR_ARRAY_TYPE */
/*      GL_COLOR_ARRAY_STRIDE */
/*      GL_INDEX_ARRAY_TYPE */
/*      GL_INDEX_ARRAY_STRIDE */
/*      GL_TEXTURE_COORD_ARRAY_SIZE */
/*      GL_TEXTURE_COORD_ARRAY_TYPE */
/*      GL_TEXTURE_COORD_ARRAY_STRIDE */
/*      GL_EDGE_FLAG_ARRAY_STRIDE */
/*      GL_POLYGON_OFFSET_FACTOR */
/*      GL_POLYGON_OFFSET_UNITS */

/* GetTextureParameter */
/*      GL_TEXTURE_MAG_FILTER */
/*      GL_TEXTURE_MIN_FILTER */
/*      GL_TEXTURE_WRAP_S */
/*      GL_TEXTURE_WRAP_T */
#define GL_TEXTURE_WIDTH                  0x1000
#define GL_TEXTURE_HEIGHT                 0x1001
#define GL_TEXTURE_INTERNAL_FORMAT        0x1003
#define GL_TEXTURE_BORDER_COLOR           0x1004
#define GL_TEXTURE_BORDER                 0x1005
/*      GL_TEXTURE_RED_SIZE */
/*      GL_TEXTURE_GREEN_SIZE */
/*      GL_TEXTURE_BLUE_SIZE */
/*      GL_TEXTURE_ALPHA_SIZE */
/*      GL_TEXTURE_LUMINANCE_SIZE */
/*      GL_TEXTURE_INTENSITY_SIZE */
/*      GL_TEXTURE_PRIORITY */
/*      GL_TEXTURE_RESIDENT */

/* HintMode */
#define GL_DONT_CARE                      0x1100
#define GL_FASTEST                        0x1101
#define GL_NICEST                         0x1102

/* HintTarget */
/*      GL_PERSPECTIVE_CORRECTION_HINT */
/*      GL_POINT_SMOOTH_HINT */
/*      GL_LINE_SMOOTH_HINT */
/*      GL_POLYGON_SMOOTH_HINT */
/*      GL_FOG_HINT */
/*      GL_PHONG_HINT */

/* IndexPointerType */
/*      GL_SHORT */
/*      GL_INT */
/*      GL_FLOAT */
/*      GL_DOUBLE */

/* LightModelParameter */
/*      GL_LIGHT_MODEL_AMBIENT */
/*      GL_LIGHT_MODEL_LOCAL_VIEWER */
/*      GL_LIGHT_MODEL_TWO_SIDE */

/* LightName */
#define GL_LIGHT0                         0x4000
#define GL_LIGHT1                         0x4001
#define GL_LIGHT2                         0x4002
#define GL_LIGHT3                         0x4003
#define GL_LIGHT4                         0x4004
#define GL_LIGHT5                         0x4005
#define GL_LIGHT6                         0x4006
#define GL_LIGHT7                         0x4007

/* LightParameter */
#define GL_AMBIENT                        0x1200
#define GL_DIFFUSE                        0x1201
#define GL_SPECULAR                       0x1202
#define GL_POSITION                       0x1203
#define GL_SPOT_DIRECTION                 0x1204
#define GL_SPOT_EXPONENT                  0x1205
#define GL_SPOT_CUTOFF                    0x1206
#define GL_CONSTANT_ATTENUATION           0x1207
#define GL_LINEAR_ATTENUATION             0x1208
#define GL_QUADRATIC_ATTENUATION          0x1209

/* InterleavedArrays */
/*      GL_V2F */
/*      GL_V3F */
/*      GL_C4UB_V2F */
/*      GL_C4UB_V3F */
/*      GL_C3F_V3F */
/*      GL_N3F_V3F */
/*      GL_C4F_N3F_V3F */
/*      GL_T2F_V3F */
/*      GL_T4F_V4F */
/*      GL_T2F_C4UB_V3F */
/*      GL_T2F_C3F_V3F */
/*      GL_T2F_N3F_V3F */
/*      GL_T2F_C4F_N3F_V3F */
/*      GL_T4F_C4F_N3F_V4F */

/* ListMode */
#define GL_COMPILE                        0x1300
#define GL_COMPILE_AND_EXECUTE            0x1301

/* ListNameType */
/*      GL_BYTE */
/*      GL_UNSIGNED_BYTE */
/*      GL_SHORT */
/*      GL_UNSIGNED_SHORT */
/*      GL_INT */
/*      GL_UNSIGNED_INT */
/*      GL_FLOAT */
/*      GL_2_BYTES */
/*      GL_3_BYTES */
/*      GL_4_BYTES */

/* LogicOp */
#define GL_CLEAR                          0x1500
#define GL_AND                            0x1501
#define GL_AND_REVERSE                    0x1502
#define GL_COPY                           0x1503
#define GL_AND_INVERTED                   0x1504
#define GL_NOOP                           0x1505
#define GL_XOR                            0x1506
#define GL_OR                             0x1507
#define GL_NOR                            0x1508
#define GL_EQUIV                          0x1509
#define GL_INVERT                         0x150A
#define GL_OR_REVERSE                     0x150B
#define GL_COPY_INVERTED                  0x150C
#define GL_OR_INVERTED                    0x150D
#define GL_NAND                           0x150E
#define GL_SET                            0x150F

/* MapTarget */
/*      GL_MAP1_COLOR_4 */
/*      GL_MAP1_INDEX */
/*      GL_MAP1_NORMAL */
/*      GL_MAP1_TEXTURE_COORD_1 */
/*      GL_MAP1_TEXTURE_COORD_2 */
/*      GL_MAP1_TEXTURE_COORD_3 */
/*      GL_MAP1_TEXTURE_COORD_4 */
/*      GL_MAP1_VERTEX_3 */
/*      GL_MAP1_VERTEX_4 */
/*      GL_MAP2_COLOR_4 */
/*      GL_MAP2_INDEX */
/*      GL_MAP2_NORMAL */
/*      GL_MAP2_TEXTURE_COORD_1 */
/*      GL_MAP2_TEXTURE_COORD_2 */
/*      GL_MAP2_TEXTURE_COORD_3 */
/*      GL_MAP2_TEXTURE_COORD_4 */
/*      GL_MAP2_VERTEX_3 */
/*      GL_MAP2_VERTEX_4 */

/* MaterialFace */
/*      GL_FRONT */
/*      GL_BACK */
/*      GL_FRONT_AND_BACK */

/* MaterialParameter */
#define GL_EMISSION                       0x1600
#define GL_SHININESS                      0x1601
#define GL_AMBIENT_AND_DIFFUSE            0x1602
#define GL_COLOR_INDEXES                  0x1603
/*      GL_AMBIENT */
/*      GL_DIFFUSE */
/*      GL_SPECULAR */

/* MatrixMode */
#define GL_MODELVIEW                      0x1700
#define GL_PROJECTION                     0x1701
#define GL_TEXTURE                        0x1702

/* MeshMode1 */
/*      GL_POINT */
/*      GL_LINE */

/* MeshMode2 */
/*      GL_POINT */
/*      GL_LINE */
/*      GL_FILL */

/* NormalPointerType */
/*      GL_BYTE */
/*      GL_SHORT */
/*      GL_INT */
/*      GL_FLOAT */
/*      GL_DOUBLE */

/* PixelCopyType */
#define GL_COLOR                          0x1800
#define GL_DEPTH                          0x1801
#define GL_STENCIL                        0x1802

/* PixelFormat */
#define GL_COLOR_INDEX                    0x1900
#define GL_STENCIL_INDEX                  0x1901
#define GL_DEPTH_COMPONENT                0x1902
#define GL_RED                            0x1903
#define GL_GREEN                          0x1904
#define GL_BLUE                           0x1905
#define GL_ALPHA                          0x1906
#define GL_RGB                            0x1907
#define GL_RGBA                           0x1908
#define GL_LUMINANCE                      0x1909
#define GL_LUMINANCE_ALPHA                0x190A

/* PixelMap */
/*      GL_PIXEL_MAP_I_TO_I */
/*      GL_PIXEL_MAP_S_TO_S */
/*      GL_PIXEL_MAP_I_TO_R */
/*      GL_PIXEL_MAP_I_TO_G */
/*      GL_PIXEL_MAP_I_TO_B */
/*      GL_PIXEL_MAP_I_TO_A */
/*      GL_PIXEL_MAP_R_TO_R */
/*      GL_PIXEL_MAP_G_TO_G */
/*      GL_PIXEL_MAP_B_TO_B */
/*      GL_PIXEL_MAP_A_TO_A */

/* PixelStore */
/*      GL_UNPACK_SWAP_BYTES */
/*      GL_UNPACK_LSB_FIRST */
/*      GL_UNPACK_ROW_LENGTH */
/*      GL_UNPACK_SKIP_ROWS */
/*      GL_UNPACK_SKIP_PIXELS */
/*      GL_UNPACK_ALIGNMENT */
/*      GL_PACK_SWAP_BYTES */
/*      GL_PACK_LSB_FIRST */
/*      GL_PACK_ROW_LENGTH */
/*      GL_PACK_SKIP_ROWS */
/*      GL_PACK_SKIP_PIXELS */
/*      GL_PACK_ALIGNMENT */

/* PixelTransfer */
/*      GL_MAP_COLOR */
/*      GL_MAP_STENCIL */
/*      GL_INDEX_SHIFT */
/*      GL_INDEX_OFFSET */
/*      GL_RED_SCALE */
/*      GL_RED_BIAS */
/*      GL_GREEN_SCALE */
/*      GL_GREEN_BIAS */
/*      GL_BLUE_SCALE */
/*      GL_BLUE_BIAS */
/*      GL_ALPHA_SCALE */
/*      GL_ALPHA_BIAS */
/*      GL_DEPTH_SCALE */
/*      GL_DEPTH_BIAS */

/* PixelType */
#define GL_BITMAP                         0x1A00
/*      GL_BYTE */
/*      GL_UNSIGNED_BYTE */
/*      GL_SHORT */
/*      GL_UNSIGNED_SHORT */
/*      GL_INT */
/*      GL_UNSIGNED_INT */
/*      GL_FLOAT */

/* PolygonMode */
#define GL_POINT                          0x1B00
#define GL_LINE                           0x1B01
#define GL_FILL                           0x1B02

/* ReadBufferMode */
/*      GL_FRONT_LEFT */
/*      GL_FRONT_RIGHT */
/*      GL_BACK_LEFT */
/*      GL_BACK_RIGHT */
/*      GL_FRONT */
/*      GL_BACK */
/*      GL_LEFT */
/*      GL_RIGHT */
/*      GL_AUX0 */
/*      GL_AUX1 */
/*      GL_AUX2 */
/*      GL_AUX3 */

/* RenderingMode */
#define GL_RENDER                         0x1C00
#define GL_FEEDBACK                       0x1C01
#define GL_SELECT                         0x1C02

/* ShadingModel */
#define GL_FLAT                           0x1D00
#define GL_SMOOTH                         0x1D01


/* StencilFunction */
/*      GL_NEVER */
/*      GL_LESS */
/*      GL_EQUAL */
/*      GL_LEQUAL */
/*      GL_GREATER */
/*      GL_NOTEQUAL */
/*      GL_GEQUAL */
/*      GL_ALWAYS */

/* StencilOp */
/*      GL_ZERO */
#define GL_KEEP                           0x1E00
#define GL_REPLACE                        0x1E01
#define GL_INCR                           0x1E02
#define GL_DECR                           0x1E03
/*      GL_INVERT */

/* StringName */
#define GL_VENDOR                         0x1F00
#define GL_RENDERER                       0x1F01
#define GL_VERSION                        0x1F02
#define GL_EXTENSIONS                     0x1F03

/* TextureCoordName */
#define GL_S                              0x2000
#define GL_T                              0x2001
#define GL_R                              0x2002
#define GL_Q                              0x2003

/* TexCoordPointerType */
/*      GL_SHORT */
/*      GL_INT */
/*      GL_FLOAT */
/*      GL_DOUBLE */

/* TextureEnvMode */
#define GL_MODULATE                       0x2100
#define GL_DECAL                          0x2101
/*      GL_BLEND */
/*      GL_REPLACE */

/* TextureEnvParameter */
#define GL_TEXTURE_ENV_MODE               0x2200
#define GL_TEXTURE_ENV_COLOR              0x2201

/* TextureEnvTarget */
#define GL_TEXTURE_ENV                    0x2300

/* TextureGenMode */
#define GL_EYE_LINEAR                     0x2400
#define GL_OBJECT_LINEAR                  0x2401
#define GL_SPHERE_MAP                     0x2402

/* TextureGenParameter */
#define GL_TEXTURE_GEN_MODE               0x2500
#define GL_OBJECT_PLANE                   0x2501
#define GL_EYE_PLANE                      0x2502

/* TextureMagFilter */
#define GL_NEAREST                        0x2600
#define GL_LINEAR                         0x2601

/* TextureMinFilter */
/*      GL_NEAREST */
/*      GL_LINEAR */
#define GL_NEAREST_MIPMAP_NEAREST         0x2700
#define GL_LINEAR_MIPMAP_NEAREST          0x2701
#define GL_NEAREST_MIPMAP_LINEAR          0x2702
#define GL_LINEAR_MIPMAP_LINEAR           0x2703

/* TextureParameterName */
#define GL_TEXTURE_MAG_FILTER             0x2800
#define GL_TEXTURE_MIN_FILTER             0x2801
#define GL_TEXTURE_WRAP_S                 0x2802
#define GL_TEXTURE_WRAP_T                 0x2803
/*      GL_TEXTURE_BORDER_COLOR */
/*      GL_TEXTURE_PRIORITY */

/* TextureTarget */
/*      GL_TEXTURE_1D */
/*      GL_TEXTURE_2D */
/*      GL_PROXY_TEXTURE_1D */
/*      GL_PROXY_TEXTURE_2D */

/* TextureWrapMode */
#define GL_CLAMP                          0x2900
#define GL_REPEAT                         0x2901

/* VertexPointerType */
/*      GL_SHORT */
/*      GL_INT */
/*      GL_FLOAT */
/*      GL_DOUBLE */

/* ClientAttribMask */
#define GL_CLIENT_PIXEL_STORE_BIT         0x00000001
#define GL_CLIENT_VERTEX_ARRAY_BIT        0x00000002
#define GL_CLIENT_ALL_ATTRIB_BITS         0xffffffff

/* polygon_offset */
#define GL_POLYGON_OFFSET_FACTOR          0x8038
#define GL_POLYGON_OFFSET_UNITS           0x2A00
#define GL_POLYGON_OFFSET_POINT           0x2A01
#define GL_POLYGON_OFFSET_LINE            0x2A02
#define GL_POLYGON_OFFSET_FILL            0x8037

/* texture */
#define GL_ALPHA4                         0x803B
#define GL_ALPHA8                         0x803C
#define GL_ALPHA12                        0x803D
#define GL_ALPHA16                        0x803E
#define GL_LUMINANCE4                     0x803F
#define GL_LUMINANCE8                     0x8040
#define GL_LUMINANCE12                    0x8041
#define GL_LUMINANCE16                    0x8042
#define GL_LUMINANCE4_ALPHA4              0x8043
#define GL_LUMINANCE6_ALPHA2              0x8044
#define GL_LUMINANCE8_ALPHA8              0x8045
#define GL_LUMINANCE12_ALPHA4             0x8046
#define GL_LUMINANCE12_ALPHA12            0x8047
#define GL_LUMINANCE16_ALPHA16            0x8048
#define GL_INTENSITY                      0x8049
#define GL_INTENSITY4                     0x804A
#define GL_INTENSITY8                     0x804B
#define GL_INTENSITY12                    0x804C
#define GL_INTENSITY16                    0x804D
#define GL_R3_G3_B2                       0x2A10
#define GL_RGB4                           0x804F
#define GL_RGB5                           0x8050
#define GL_RGB8                           0x8051
#define GL_RGB10                          0x8052
#define GL_RGB12                          0x8053
#define GL_RGB16                          0x8054
#define GL_RGBA2                          0x8055
#define GL_RGBA4                          0x8056
#define GL_RGB5_A1                        0x8057
#define GL_RGBA8                          0x8058
#define GL_RGB10_A2                       0x8059
#define GL_RGBA12                         0x805A
#define GL_RGBA16                         0x805B
#define GL_TEXTURE_RED_SIZE               0x805C
#define GL_TEXTURE_GREEN_SIZE             0x805D
#define GL_TEXTURE_BLUE_SIZE              0x805E
#define GL_TEXTURE_ALPHA_SIZE             0x805F
#define GL_TEXTURE_LUMINANCE_SIZE         0x8060
#define GL_TEXTURE_INTENSITY_SIZE         0x8061
#define GL_PROXY_TEXTURE_1D               0x8063
#define GL_PROXY_TEXTURE_2D               0x8064

/* texture_object */
#define GL_TEXTURE_PRIORITY               0x8066
#define GL_TEXTURE_RESIDENT               0x8067
#define GL_TEXTURE_BINDING_1D             0x8068
#define GL_TEXTURE_BINDING_2D             0x8069

/* vertex_array */
#define GL_VERTEX_ARRAY                   0x8074
#define GL_NORMAL_ARRAY                   0x8075
#define GL_COLOR_ARRAY                    0x8076
#define GL_INDEX_ARRAY                    0x8077
#define GL_TEXTURE_COORD_ARRAY            0x8078
#define GL_EDGE_FLAG_ARRAY                0x8079
#define GL_VERTEX_ARRAY_SIZE              0x807A
#define GL_VERTEX_ARRAY_TYPE              0x807B
#define GL_VERTEX_ARRAY_STRIDE            0x807C
#define GL_NORMAL_ARRAY_TYPE              0x807E
#define GL_NORMAL_ARRAY_STRIDE            0x807F
#define GL_COLOR_ARRAY_SIZE               0x8081
#define GL_COLOR_ARRAY_TYPE               0x8082
#define GL_COLOR_ARRAY_STRIDE             0x8083
#define GL_INDEX_ARRAY_TYPE               0x8085
#define GL_INDEX_ARRAY_STRIDE             0x8086
#define GL_TEXTURE_COORD_ARRAY_SIZE       0x8088
#define GL_TEXTURE_COORD_ARRAY_TYPE       0x8089
#define GL_TEXTURE_COORD_ARRAY_STRIDE     0x808A
#define GL_EDGE_FLAG_ARRAY_STRIDE         0x808C
#define GL_VERTEX_ARRAY_POINTER           0x808E
#define GL_NORMAL_ARRAY_POINTER           0x808F
#define GL_COLOR_ARRAY_POINTER            0x8090
#define GL_INDEX_ARRAY_POINTER            0x8091
#define GL_TEXTURE_COORD_ARRAY_POINTER    0x8092
#define GL_EDGE_FLAG_ARRAY_POINTER        0x8093
#define GL_V2F                            0x2A20
#define GL_V3F                            0x2A21
#define GL_C4UB_V2F                       0x2A22
#define GL_C4UB_V3F                       0x2A23
#define GL_C3F_V3F                        0x2A24
#define GL_N3F_V3F                        0x2A25
#define GL_C4F_N3F_V3F                    0x2A26
#define GL_T2F_V3F                        0x2A27
#define GL_T4F_V4F                        0x2A28
#define GL_T2F_C4UB_V3F                   0x2A29
#define GL_T2F_C3F_V3F                    0x2A2A
#define GL_T2F_N3F_V3F                    0x2A2B
#define GL_T2F_C4F_N3F_V3F                0x2A2C
#define GL_T4F_C4F_N3F_V4F                0x2A2D

/* Extensions */
#define GL_EXT_vertex_array               1
#define GL_EXT_bgra                       1
#define GL_EXT_paletted_texture           1
#define GL_WIN_swap_hint                  1
#define GL_WIN_draw_range_elements        1
// #define GL_WIN_phong_shading              1
// #define GL_WIN_specular_fog               1

/* EXT_vertex_array */
#define GL_VERTEX_ARRAY_EXT               0x8074
#define GL_NORMAL_ARRAY_EXT               0x8075
#define GL_COLOR_ARRAY_EXT                0x8076
#define GL_INDEX_ARRAY_EXT                0x8077
#define GL_TEXTURE_COORD_ARRAY_EXT        0x8078
#define GL_EDGE_FLAG_ARRAY_EXT            0x8079
#define GL_VERTEX_ARRAY_SIZE_EXT          0x807A
#define GL_VERTEX_ARRAY_TYPE_EXT          0x807B
#define GL_VERTEX_ARRAY_STRIDE_EXT        0x807C
#define GL_VERTEX_ARRAY_COUNT_EXT         0x807D
#define GL_NORMAL_ARRAY_TYPE_EXT          0x807E
#define GL_NORMAL_ARRAY_STRIDE_EXT        0x807F
#define GL_NORMAL_ARRAY_COUNT_EXT         0x8080
#define GL_COLOR_ARRAY_SIZE_EXT           0x8081
#define GL_COLOR_ARRAY_TYPE_EXT           0x8082
#define GL_COLOR_ARRAY_STRIDE_EXT         0x8083
#define GL_COLOR_ARRAY_COUNT_EXT          0x8084
#define GL_INDEX_ARRAY_TYPE_EXT           0x8085
#define GL_INDEX_ARRAY_STRIDE_EXT         0x8086
#define GL_INDEX_ARRAY_COUNT_EXT          0x8087
#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT   0x8088
#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT   0x8089
#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT  0x808B
#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT     0x808C
#define GL_EDGE_FLAG_ARRAY_COUNT_EXT      0x808D
#define GL_VERTEX_ARRAY_POINTER_EXT       0x808E
#define GL_NORMAL_ARRAY_POINTER_EXT       0x808F
#define GL_COLOR_ARRAY_POINTER_EXT        0x8090
#define GL_INDEX_ARRAY_POINTER_EXT        0x8091
#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
#define GL_EDGE_FLAG_ARRAY_POINTER_EXT    0x8093
#define GL_DOUBLE_EXT                     GL_DOUBLE

/* EXT_bgra */
#define GL_BGR_EXT                        0x80E0
#define GL_BGRA_EXT                       0x80E1

/* EXT_paletted_texture */

/* These must match the GL_COLOR_TABLE_*_SGI enumerants */
#define GL_COLOR_TABLE_FORMAT_EXT         0x80D8
#define GL_COLOR_TABLE_WIDTH_EXT          0x80D9
#define GL_COLOR_TABLE_RED_SIZE_EXT       0x80DA
#define GL_COLOR_TABLE_GREEN_SIZE_EXT     0x80DB
#define GL_COLOR_TABLE_BLUE_SIZE_EXT      0x80DC
#define GL_COLOR_TABLE_ALPHA_SIZE_EXT     0x80DD
#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE
#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF

#define GL_COLOR_INDEX1_EXT               0x80E2
#define GL_COLOR_INDEX2_EXT               0x80E3
#define GL_COLOR_INDEX4_EXT               0x80E4
#define GL_COLOR_INDEX8_EXT               0x80E5
#define GL_COLOR_INDEX12_EXT              0x80E6
#define GL_COLOR_INDEX16_EXT              0x80E7

/* WIN_draw_range_elements */
#define GL_MAX_ELEMENTS_VERTICES_WIN      0x80E8
#define GL_MAX_ELEMENTS_INDICES_WIN       0x80E9

/* WIN_phong_shading */
#define GL_PHONG_WIN                      0x80EA 
#define GL_PHONG_HINT_WIN                 0x80EB 

/* WIN_specular_fog */
#define GL_FOG_SPECULAR_TEXTURE_WIN       0x80EC

/* For compatibility with OpenGL v1.0 */
#define GL_LOGIC_OP GL_INDEX_LOGIC_OP
#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT

/*************************************************************/

WINGDIAPI void APIENTRY glAccum (GLenum op, GLfloat value);
WINGDIAPI void APIENTRY glAlphaFunc (GLenum func, GLclampf ref);
WINGDIAPI GLboolean APIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences);
WINGDIAPI void APIENTRY glArrayElement (GLint i);
WINGDIAPI void APIENTRY glBegin (GLenum mode);
WINGDIAPI void APIENTRY glBindTexture (GLenum target, GLuint texture);
WINGDIAPI void APIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap);
WINGDIAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
WINGDIAPI void APIENTRY glCallList (GLuint list);
WINGDIAPI void APIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists);
WINGDIAPI void APIENTRY glClear (GLbitfield mask);
WINGDIAPI void APIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
WINGDIAPI void APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
WINGDIAPI void APIENTRY glClearDepth (GLclampd depth);
WINGDIAPI void APIENTRY glClearIndex (GLfloat c);
WINGDIAPI void APIENTRY glClearStencil (GLint s);
WINGDIAPI void APIENTRY glClipPlane (GLenum plane, const GLdouble *equation);
WINGDIAPI void APIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue);
WINGDIAPI void APIENTRY glColor3bv (const GLbyte *v);
WINGDIAPI void APIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue);
WINGDIAPI void APIENTRY glColor3dv (const GLdouble *v);
WINGDIAPI void APIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue);
WINGDIAPI void APIENTRY glColor3fv (const GLfloat *v);
WINGDIAPI void APIENTRY glColor3i (GLint red, GLint green, GLint blue);
WINGDIAPI void APIENTRY glColor3iv (const GLint *v);
WINGDIAPI void APIENTRY glColor3s (GLshort red, GLshort green, GLshort blue);
WINGDIAPI void APIENTRY glColor3sv (const GLshort *v);
WINGDIAPI void APIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue);
WINGDIAPI void APIENTRY glColor3ubv (const GLubyte *v);
WINGDIAPI void APIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue);
WINGDIAPI void APIENTRY glColor3uiv (const GLuint *v);
WINGDIAPI void APIENTRY glColor3us (GLushort red, GLushort green, GLushort blue);
WINGDIAPI void APIENTRY glColor3usv (const GLushort *v);
WINGDIAPI void APIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
WINGDIAPI void APIENTRY glColor4bv (const GLbyte *v);
WINGDIAPI void APIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
WINGDIAPI void APIENTRY glColor4dv (const GLdouble *v);
WINGDIAPI void APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
WINGDIAPI void APIENTRY glColor4fv (const GLfloat *v);
WINGDIAPI void APIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha);
WINGDIAPI void APIENTRY glColor4iv (const GLint *v);
WINGDIAPI void APIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha);
WINGDIAPI void APIENTRY glColor4sv (const GLshort *v);
WINGDIAPI void APIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
WINGDIAPI void APIENTRY glColor4ubv (const GLubyte *v);
WINGDIAPI void APIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha);
WINGDIAPI void APIENTRY glColor4uiv (const GLuint *v);
WINGDIAPI void APIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha);
WINGDIAPI void APIENTRY glColor4usv (const GLushort *v);
WINGDIAPI void APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
WINGDIAPI void APIENTRY glColorMaterial (GLenum face, GLenum mode);
WINGDIAPI void APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
WINGDIAPI void APIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
WINGDIAPI void APIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border);
WINGDIAPI void APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
WINGDIAPI void APIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width);
WINGDIAPI void APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
WINGDIAPI void APIENTRY glCullFace (GLenum mode);
WINGDIAPI void APIENTRY glDeleteLists (GLuint list, GLsizei range);
WINGDIAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
WINGDIAPI void APIENTRY glDepthFunc (GLenum func);
WINGDIAPI void APIENTRY glDepthMask (GLboolean flag);
WINGDIAPI void APIENTRY glDepthRange (GLclampd zNear, GLclampd zFar);
WINGDIAPI void APIENTRY glDisable (GLenum cap);
WINGDIAPI void APIENTRY glDisableClientState (GLenum array);
WINGDIAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
WINGDIAPI void APIENTRY glDrawBuffer (GLenum mode);
WINGDIAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
WINGDIAPI void APIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
WINGDIAPI void APIENTRY glEdgeFlag (GLboolean flag);
WINGDIAPI void APIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer);
WINGDIAPI void APIENTRY glEdgeFlagv (const GLboolean *flag);
WINGDIAPI void APIENTRY glEnable (GLenum cap);
WINGDIAPI void APIENTRY glEnableClientState (GLenum array);
WINGDIAPI void APIENTRY glEnd (void);
WINGDIAPI void APIENTRY glEndList (void);
WINGDIAPI void APIENTRY glEvalCoord1d (GLdouble u);
WINGDIAPI void APIENTRY glEvalCoord1dv (const GLdouble *u);
WINGDIAPI void APIENTRY glEvalCoord1f (GLfloat u);
WINGDIAPI void APIENTRY glEvalCoord1fv (const GLfloat *u);
WINGDIAPI void APIENTRY glEvalCoord2d (GLdouble u, GLdouble v);
WINGDIAPI void APIENTRY glEvalCoord2dv (const GLdouble *u);
WINGDIAPI void APIENTRY glEvalCoord2f (GLfloat u, GLfloat v);
WINGDIAPI void APIENTRY glEvalCoord2fv (const GLfloat *u);
WINGDIAPI void APIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2);
WINGDIAPI void APIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
WINGDIAPI void APIENTRY glEvalPoint1 (GLint i);
WINGDIAPI void APIENTRY glEvalPoint2 (GLint i, GLint j);
WINGDIAPI void APIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer);
WINGDIAPI void APIENTRY glFinish (void);
WINGDIAPI void APIENTRY glFlush (void);
WINGDIAPI void APIENTRY glFogf (GLenum pname, GLfloat param);
WINGDIAPI void APIENTRY glFogfv (GLenum pname, const GLfloat *params);
WINGDIAPI void APIENTRY glFogi (GLenum pname, GLint param);
WINGDIAPI void APIENTRY glFogiv (GLenum pname, const GLint *params);
WINGDIAPI void APIENTRY glFrontFace (GLenum mode);
WINGDIAPI void APIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
WINGDIAPI GLuint APIENTRY glGenLists (GLsizei range);
WINGDIAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures);
WINGDIAPI void APIENTRY glGetBooleanv (GLenum pname, GLboolean *params);
WINGDIAPI void APIENTRY glGetClipPlane (GLenum plane, GLdouble *equation);
WINGDIAPI void APIENTRY glGetDoublev (GLenum pname, GLdouble *params);
WINGDIAPI GLenum APIENTRY glGetError (void);
WINGDIAPI void APIENTRY glGetFloatv (GLenum pname, GLfloat *params);
WINGDIAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *params);
WINGDIAPI void APIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params);
WINGDIAPI void APIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params);
WINGDIAPI void APIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v);
WINGDIAPI void APIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v);
WINGDIAPI void APIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v);
WINGDIAPI void APIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params);
WINGDIAPI void APIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params);
WINGDIAPI void APIENTRY glGetPixelMapfv (GLenum map, GLfloat *values);
WINGDIAPI void APIENTRY glGetPixelMapuiv (GLenum map, GLuint *values);
WINGDIAPI void APIENTRY glGetPixelMapusv (GLenum map, GLushort *values);
WINGDIAPI void APIENTRY glGetPointerv (GLenum pname, GLvoid* *params);
WINGDIAPI void APIENTRY glGetPolygonStipple (GLubyte *mask);
WINGDIAPI const GLubyte * APIENTRY glGetString (GLenum name);
WINGDIAPI void APIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params);
WINGDIAPI void APIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params);
WINGDIAPI void APIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params);
WINGDIAPI void APIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params);
WINGDIAPI void APIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params);
WINGDIAPI void APIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels);
WINGDIAPI void APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params);
WINGDIAPI void APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params);
WINGDIAPI void APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params);
WINGDIAPI void APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params);
WINGDIAPI void APIENTRY glHint (GLenum target, GLenum mode);
WINGDIAPI void APIENTRY glIndexMask (GLuint mask);
WINGDIAPI void APIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer);
WINGDIAPI void APIENTRY glIndexd (GLdouble c);
WINGDIAPI void APIENTRY glIndexdv (const GLdouble *c);
WINGDIAPI void APIENTRY glIndexf (GLfloat c);
WINGDIAPI void APIENTRY glIndexfv (const GLfloat *c);
WINGDIAPI void APIENTRY glIndexi (GLint c);
WINGDIAPI void APIENTRY glIndexiv (const GLint *c);
WINGDIAPI void APIENTRY glIndexs (GLshort c);
WINGDIAPI void APIENTRY glIndexsv (const GLshort *c);
WINGDIAPI void APIENTRY glIndexub (GLubyte c);
WINGDIAPI void APIENTRY glIndexubv (const GLubyte *c);
WINGDIAPI void APIENTRY glInitNames (void);
WINGDIAPI void APIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer);
WINGDIAPI GLboolean APIENTRY glIsEnabled (GLenum cap);
WINGDIAPI GLboolean APIENTRY glIsList (GLuint list);
WINGDIAPI GLboolean APIENTRY glIsTexture (GLuint texture);
WINGDIAPI void APIENTRY glLightModelf (GLenum pname, GLfloat param);
WINGDIAPI void APIENTRY glLightModelfv (GLenum pname, const GLfloat *params);
WINGDIAPI void APIENTRY glLightModeli (GLenum pname, GLint param);
WINGDIAPI void APIENTRY glLightModeliv (GLenum pname, const GLint *params);
WINGDIAPI void APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param);
WINGDIAPI void APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params);
WINGDIAPI void APIENTRY glLighti (GLenum light, GLenum pname, GLint param);
WINGDIAPI void APIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params);
WINGDIAPI void APIENTRY glLineStipple (GLint factor, GLushort pattern);
WINGDIAPI void APIENTRY glLineWidth (GLfloat width);
WINGDIAPI void APIENTRY glListBase (GLuint base);
WINGDIAPI void APIENTRY glLoadIdentity (void);
WINGDIAPI void APIENTRY glLoadMatrixd (const GLdouble *m);
WINGDIAPI void APIENTRY glLoadMatrixf (const GLfloat *m);
WINGDIAPI void APIENTRY glLoadName (GLuint name);
WINGDIAPI void APIENTRY glLogicOp (GLenum opcode);
WINGDIAPI void APIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points);
WINGDIAPI void APIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points);
WINGDIAPI void APIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points);
WINGDIAPI void APIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points);
WINGDIAPI void APIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2);
WINGDIAPI void APIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2);
WINGDIAPI void APIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
WINGDIAPI void APIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
WINGDIAPI void APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param);
WINGDIAPI void APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params);
WINGDIAPI void APIENTRY glMateriali (GLenum face, GLenum pname, GLint param);
WINGDIAPI void APIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params);
WINGDIAPI void APIENTRY glMatrixMode (GLenum mode);
WINGDIAPI void APIENTRY glMultMatrixd (const GLdouble *m);
WINGDIAPI void APIENTRY glMultMatrixf (const GLfloat *m);
WINGDIAPI void APIENTRY glNewList (GLuint list, GLenum mode);
WINGDIAPI void APIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz);
WINGDIAPI void APIENTRY glNormal3bv (const GLbyte *v);
WINGDIAPI void APIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz);
WINGDIAPI void APIENTRY glNormal3dv (const GLdouble *v);
WINGDIAPI void APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz);
WINGDIAPI void APIENTRY glNormal3fv (const GLfloat *v);
WINGDIAPI void APIENTRY glNormal3i (GLint nx, GLint ny, GLint nz);
WINGDIAPI void APIENTRY glNormal3iv (const GLint *v);
WINGDIAPI void APIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz);
WINGDIAPI void APIENTRY glNormal3sv (const GLshort *v);
WINGDIAPI void APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer);
WINGDIAPI void APIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
WINGDIAPI void APIENTRY glPassThrough (GLfloat token);
WINGDIAPI void APIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values);
WINGDIAPI void APIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values);
WINGDIAPI void APIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values);
WINGDIAPI void APIENTRY glPixelStoref (GLenum pname, GLfloat param);
WINGDIAPI void APIENTRY glPixelStorei (GLenum pname, GLint param);
WINGDIAPI void APIENTRY glPixelTransferf (GLenum pname, GLfloat param);
WINGDIAPI void APIENTRY glPixelTransferi (GLenum pname, GLint param);
WINGDIAPI void APIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor);
WINGDIAPI void APIENTRY glPointSize (GLfloat size);
WINGDIAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode);
WINGDIAPI void APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
WINGDIAPI void APIENTRY glPolygonStipple (const GLubyte *mask);
WINGDIAPI void APIENTRY glPopAttrib (void);
WINGDIAPI void APIENTRY glPopClientAttrib (void);
WINGDIAPI void APIENTRY glPopMatrix (void);
WINGDIAPI void APIENTRY glPopName (void);
WINGDIAPI void APIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities);
WINGDIAPI void APIENTRY glPushAttrib (GLbitfield mask);
WINGDIAPI void APIENTRY glPushClientAttrib (GLbitfield mask);
WINGDIAPI void APIENTRY glPushMatrix (void);
WINGDIAPI void APIENTRY glPushName (GLuint name);
WINGDIAPI void APIENTRY glRasterPos2d (GLdouble x, GLdouble y);
WINGDIAPI void APIENTRY glRasterPos2dv (const GLdouble *v);
WINGDIAPI void APIENTRY glRasterPos2f (GLfloat x, GLfloat y);
WINGDIAPI void APIENTRY glRasterPos2fv (const GLfloat *v);
WINGDIAPI void APIENTRY glRasterPos2i (GLint x, GLint y);
WINGDIAPI void APIENTRY glRasterPos2iv (const GLint *v);
WINGDIAPI void APIENTRY glRasterPos2s (GLshort x, GLshort y);
WINGDIAPI void APIENTRY glRasterPos2sv (const GLshort *v);
WINGDIAPI void APIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z);
WINGDIAPI void APIENTRY glRasterPos3dv (const GLdouble *v);
WINGDIAPI void APIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z);
WINGDIAPI void APIENTRY glRasterPos3fv (const GLfloat *v);
WINGDIAPI void APIENTRY glRasterPos3i (GLint x, GLint y, GLint z);
WINGDIAPI void APIENTRY glRasterPos3iv (const GLint *v);
WINGDIAPI void APIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z);
WINGDIAPI void APIENTRY glRasterPos3sv (const GLshort *v);
WINGDIAPI void APIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
WINGDIAPI void APIENTRY glRasterPos4dv (const GLdouble *v);
WINGDIAPI void APIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
WINGDIAPI void APIENTRY glRasterPos4fv (const GLfloat *v);
WINGDIAPI void APIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w);
WINGDIAPI void APIENTRY glRasterPos4iv (const GLint *v);
WINGDIAPI void APIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w);
WINGDIAPI void APIENTRY glRasterPos4sv (const GLshort *v);
WINGDIAPI void APIENTRY glReadBuffer (GLenum mode);
WINGDIAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
WINGDIAPI void APIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
WINGDIAPI void APIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2);
WINGDIAPI void APIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
WINGDIAPI void APIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2);
WINGDIAPI void APIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2);
WINGDIAPI void APIENTRY glRectiv (const GLint *v1, const GLint *v2);
WINGDIAPI void APIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2);
WINGDIAPI void APIENTRY glRectsv (const GLshort *v1, const GLshort *v2);
WINGDIAPI GLint APIENTRY glRenderMode (GLenum mode);
WINGDIAPI void APIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
WINGDIAPI void APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
WINGDIAPI void APIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z);
WINGDIAPI void APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z);
WINGDIAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
WINGDIAPI void APIENTRY glSelectBuffer (GLsizei size, GLuint *buffer);
WINGDIAPI void APIENTRY glShadeModel (GLenum mode);
WINGDIAPI void APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
WINGDIAPI void APIENTRY glStencilMask (GLuint mask);
WINGDIAPI void APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
WINGDIAPI void APIENTRY glTexCoord1d (GLdouble s);
WINGDIAPI void APIENTRY glTexCoord1dv (const GLdouble *v);
WINGDIAPI void APIENTRY glTexCoord1f (GLfloat s);
WINGDIAPI void APIENTRY glTexCoord1fv (const GLfloat *v);
WINGDIAPI void APIENTRY glTexCoord1i (GLint s);
WINGDIAPI void APIENTRY glTexCoord1iv (const GLint *v);
WINGDIAPI void APIENTRY glTexCoord1s (GLshort s);
WINGDIAPI void APIENTRY glTexCoord1sv (const GLshort *v);
WINGDIAPI void APIENTRY glTexCoord2d (GLdouble s, GLdouble t);
WINGDIAPI void APIENTRY glTexCoord2dv (const GLdouble *v);
WINGDIAPI void APIENTRY glTexCoord2f (GLfloat s, GLfloat t);
WINGDIAPI void APIENTRY glTexCoord2fv (const GLfloat *v);
WINGDIAPI void APIENTRY glTexCoord2i (GLint s, GLint t);
WINGDIAPI void APIENTRY glTexCoord2iv (const GLint *v);
WINGDIAPI void APIENTRY glTexCoord2s (GLshort s, GLshort t);
WINGDIAPI void APIENTRY glTexCoord2sv (const GLshort *v);
WINGDIAPI void APIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r);
WINGDIAPI void APIENTRY glTexCoord3dv (const GLdouble *v);
WINGDIAPI void APIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r);
WINGDIAPI void APIENTRY glTexCoord3fv (const GLfloat *v);
WINGDIAPI void APIENTRY glTexCoord3i (GLint s, GLint t, GLint r);
WINGDIAPI void APIENTRY glTexCoord3iv (const GLint *v);
WINGDIAPI void APIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r);
WINGDIAPI void APIENTRY glTexCoord3sv (const GLshort *v);
WINGDIAPI void APIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q);
WINGDIAPI void APIENTRY glTexCoord4dv (const GLdouble *v);
WINGDIAPI void APIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q);
WINGDIAPI void APIENTRY glTexCoord4fv (const GLfloat *v);
WINGDIAPI void APIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q);
WINGDIAPI void APIENTRY glTexCoord4iv (const GLint *v);
WINGDIAPI void APIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q);
WINGDIAPI void APIENTRY glTexCoord4sv (const GLshort *v);
WINGDIAPI void APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
WINGDIAPI void APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param);
WINGDIAPI void APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params);
WINGDIAPI void APIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param);
WINGDIAPI void APIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params);
WINGDIAPI void APIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param);
WINGDIAPI void APIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params);
WINGDIAPI void APIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param);
WINGDIAPI void APIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params);
WINGDIAPI void APIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param);
WINGDIAPI void APIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params);
WINGDIAPI void APIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
WINGDIAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
WINGDIAPI void APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
WINGDIAPI void APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params);
WINGDIAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
WINGDIAPI void APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params);
WINGDIAPI void APIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels);
WINGDIAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
WINGDIAPI void APIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z);
WINGDIAPI void APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z);
WINGDIAPI void APIENTRY glVertex2d (GLdouble x, GLdouble y);
WINGDIAPI void APIENTRY glVertex2dv (const GLdouble *v);
WINGDIAPI void APIENTRY glVertex2f (GLfloat x, GLfloat y);
WINGDIAPI void APIENTRY glVertex2fv (const GLfloat *v);
WINGDIAPI void APIENTRY glVertex2i (GLint x, GLint y);
WINGDIAPI void APIENTRY glVertex2iv (const GLint *v);
WINGDIAPI void APIENTRY glVertex2s (GLshort x, GLshort y);
WINGDIAPI void APIENTRY glVertex2sv (const GLshort *v);
WINGDIAPI void APIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z);
WINGDIAPI void APIENTRY glVertex3dv (const GLdouble *v);
WINGDIAPI void APIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z);
WINGDIAPI void APIENTRY glVertex3fv (const GLfloat *v);
WINGDIAPI void APIENTRY glVertex3i (GLint x, GLint y, GLint z);
WINGDIAPI void APIENTRY glVertex3iv (const GLint *v);
WINGDIAPI void APIENTRY glVertex3s (GLshort x, GLshort y, GLshort z);
WINGDIAPI void APIENTRY glVertex3sv (const GLshort *v);
WINGDIAPI void APIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w);
WINGDIAPI void APIENTRY glVertex4dv (const GLdouble *v);
WINGDIAPI void APIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w);
WINGDIAPI void APIENTRY glVertex4fv (const GLfloat *v);
WINGDIAPI void APIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w);
WINGDIAPI void APIENTRY glVertex4iv (const GLint *v);
WINGDIAPI void APIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w);
WINGDIAPI void APIENTRY glVertex4sv (const GLshort *v);
WINGDIAPI void APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
WINGDIAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);

/* EXT_vertex_array */
typedef void (APIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i);
typedef void (APIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);
typedef void (APIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer);
typedef void (APIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer);
typedef void (APIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params);
typedef void (APIENTRY * PFNGLARRAYELEMENTARRAYEXTPROC)(GLenum mode, GLsizei count, const GLvoid* pi);

/* WIN_draw_range_elements */
typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSWINPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);

/* WIN_swap_hint */
typedef void (APIENTRY * PFNGLADDSWAPHINTRECTWINPROC)  (GLint x, GLint y, GLsizei width, GLsizei height);

/* EXT_paletted_texture */
typedef void (APIENTRY * PFNGLCOLORTABLEEXTPROC)
    (GLenum target, GLenum internalFormat, GLsizei width, GLenum format,
     GLenum type, const GLvoid *data);
typedef void (APIENTRY * PFNGLCOLORSUBTABLEEXTPROC)
    (GLenum target, GLsizei start, GLsizei count, GLenum format,
     GLenum type, const GLvoid *data);
typedef void (APIENTRY * PFNGLGETCOLORTABLEEXTPROC)
    (GLenum target, GLenum format, GLenum type, GLvoid *data);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)
    (GLenum target, GLenum pname, GLint *params);
typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)
    (GLenum target, GLenum pname, GLfloat *params);

#ifdef __cplusplus
}
#endif

#endif /* __GL_H__ */
#endif /* __gl_h_ */

/*++ BUILD Version: 0004    // Increment this if a change has global effects

Copyright (c) 1985-95, Microsoft Corporation

Module Name:

    glu.h

Abstract:

    Procedure declarations, constant definitions and macros for the OpenGL
    Utility Library.

--*/

#ifndef __glu_h__
#ifndef __GLU_H__

#define __glu_h__
#define __GLU_H__

#include <GL/gl.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
** Copyright 1991-1993, Silicon Graphics, Inc.
** All Rights Reserved.
** 
** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
** the contents of this file may not be disclosed to third parties, copied or
** duplicated in any form, in whole or in part, without the prior written
** permission of Silicon Graphics, Inc.
** 
** RESTRICTED RIGHTS LEGEND:
** Use, duplication or disclosure by the Government is subject to restrictions
** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
** rights reserved under the Copyright Laws of the United States.
*/

/*
** Return the error string associated with a particular error code.
** This will return 0 for an invalid error code.
**
** The generic function prototype that can be compiled for ANSI or Unicode
** is defined as follows:
**
** LPCTSTR APIENTRY gluErrorStringWIN (GLenum errCode);
*/
#ifdef UNICODE
#define gluErrorStringWIN(errCode) ((LPCSTR)  gluErrorUnicodeStringEXT(errCode))
#else
#define gluErrorStringWIN(errCode) ((LPCWSTR) gluErrorString(errCode))
#endif

const GLubyte* APIENTRY gluErrorString (
    GLenum   errCode);

const wchar_t* APIENTRY gluErrorUnicodeStringEXT (
    GLenum   errCode);

const GLubyte* APIENTRY gluGetString (
    GLenum   name);

void APIENTRY gluOrtho2D (
    GLdouble left, 
    GLdouble right, 
    GLdouble bottom, 
    GLdouble top);

void APIENTRY gluPerspective (
    GLdouble fovy, 
    GLdouble aspect, 
    GLdouble zNear, 
    GLdouble zFar);

void APIENTRY gluPickMatrix (
    GLdouble x, 
    GLdouble y, 
    GLdouble width, 
    GLdouble height, 
    GLint    viewport[4]);

void APIENTRY gluLookAt (
    GLdouble eyex, 
    GLdouble eyey, 
    GLdouble eyez, 
    GLdouble centerx, 
    GLdouble centery, 
    GLdouble centerz, 
    GLdouble upx, 
    GLdouble upy, 
    GLdouble upz);

int APIENTRY gluProject (
    GLdouble        objx, 
    GLdouble        objy, 
    GLdouble        objz,  
    const GLdouble  modelMatrix[16], 
    const GLdouble  projMatrix[16], 
    const GLint     viewport[4], 
    GLdouble        *winx, 
    GLdouble        *winy, 
    GLdouble        *winz);

int APIENTRY gluUnProject (
    GLdouble       winx, 
    GLdouble       winy, 
    GLdouble       winz, 
    const GLdouble modelMatrix[16], 
    const GLdouble projMatrix[16], 
    const GLint    viewport[4], 
    GLdouble       *objx, 
    GLdouble       *objy, 
    GLdouble       *objz);


int APIENTRY gluScaleImage (
    GLenum      format, 
    GLint       widthin, 
    GLint       heightin, 
    GLenum      typein, 
    const void  *datain, 
    GLint       widthout, 
    GLint       heightout, 
    GLenum      typeout, 
    void        *dataout);


int APIENTRY gluBuild1DMipmaps (
    GLenum      target, 
    GLint       components, 
    GLint       width, 
    GLenum      format, 
    GLenum      type, 
    const void  *data);

int APIENTRY gluBuild2DMipmaps (
    GLenum      target, 
    GLint       components, 
    GLint       width, 
    GLint       height, 
    GLenum      format, 
    GLenum      type, 
    const void  *data);

#ifdef __cplusplus

class GLUnurbs;
class GLUquadric;
class GLUtesselator;

/* backwards compatibility: */
typedef class GLUnurbs GLUnurbsObj;
typedef class GLUquadric GLUquadricObj;
typedef class GLUtesselator GLUtesselatorObj;
typedef class GLUtesselator GLUtriangulatorObj;

#else

typedef struct GLUnurbs GLUnurbs;
typedef struct GLUquadric GLUquadric;
typedef struct GLUtesselator GLUtesselator;

/* backwards compatibility: */
typedef struct GLUnurbs GLUnurbsObj;
typedef struct GLUquadric GLUquadricObj;
typedef struct GLUtesselator GLUtesselatorObj;
typedef struct GLUtesselator GLUtriangulatorObj;

#endif


GLUquadric* APIENTRY gluNewQuadric (void);
void APIENTRY gluDeleteQuadric (
    GLUquadric          *state);

void APIENTRY gluQuadricNormals (
    GLUquadric          *quadObject, 
    GLenum              normals);

void APIENTRY gluQuadricTexture (
    GLUquadric          *quadObject, 
    GLboolean           textureCoords);

void APIENTRY gluQuadricOrientation (
    GLUquadric          *quadObject, 
    GLenum              orientation);

void APIENTRY gluQuadricDrawStyle (
    GLUquadric          *quadObject, 
    GLenum              drawStyle);

void APIENTRY gluCylinder (
    GLUquadric          *qobj, 
    GLdouble            baseRadius, 
    GLdouble            topRadius, 
    GLdouble            height, 
    GLint               slices, 
    GLint               stacks);

void APIENTRY gluDisk (
    GLUquadric          *qobj, 
    GLdouble            innerRadius, 
    GLdouble            outerRadius, 
    GLint               slices, 
    GLint               loops);

void APIENTRY gluPartialDisk (
    GLUquadric          *qobj, 
    GLdouble            innerRadius, 
    GLdouble            outerRadius, 
    GLint               slices, 
    GLint               loops, 
    GLdouble            startAngle, 
    GLdouble            sweepAngle);

void APIENTRY gluSphere (
    GLUquadric          *qobj, 
    GLdouble            radius, 
    GLint               slices, 
    GLint               stacks);

void APIENTRY gluQuadricCallback (
    GLUquadric          *qobj, 
    GLenum              which, 
    void                (CALLBACK* fn)());

GLUtesselator* APIENTRY  gluNewTess(          
    void );

void APIENTRY  gluDeleteTess(       
    GLUtesselator       *tess );

void APIENTRY  gluTessBeginPolygon( 
    GLUtesselator       *tess,
    void                *polygon_data );

void APIENTRY  gluTessBeginContour( 
    GLUtesselator       *tess );

void APIENTRY  gluTessVertex(       
    GLUtesselator       *tess,
    GLdouble            coords[3], 
    void                *data );

void APIENTRY  gluTessEndContour(   
    GLUtesselator       *tess );

void APIENTRY  gluTessEndPolygon(   
    GLUtesselator       *tess );

void APIENTRY  gluTessProperty(     
    GLUtesselator       *tess,
    GLenum              which, 
    GLdouble            value );
 
void APIENTRY  gluTessNormal(       
    GLUtesselator       *tess, 
    GLdouble            x,
    GLdouble            y, 
    GLdouble            z );

void APIENTRY  gluTessCallback(     
    GLUtesselator       *tess,
    GLenum              which, 
    void                (CALLBACK *fn)());

void APIENTRY  gluGetTessProperty(  
    GLUtesselator       *tess,
    GLenum              which, 
    GLdouble            *value );
 
GLUnurbs* APIENTRY gluNewNurbsRenderer (void);

void APIENTRY gluDeleteNurbsRenderer (
    GLUnurbs            *nobj);

void APIENTRY gluBeginSurface (
    GLUnurbs            *nobj);

void APIENTRY gluBeginCurve (
    GLUnurbs            *nobj);

void APIENTRY gluEndCurve (
    GLUnurbs            *nobj);

void APIENTRY gluEndSurface (
    GLUnurbs            *nobj);

void APIENTRY gluBeginTrim (
    GLUnurbs            *nobj);

void APIENTRY gluEndTrim (
    GLUnurbs            *nobj);

void APIENTRY gluPwlCurve (
    GLUnurbs            *nobj, 
    GLint               count, 
    GLfloat             *array, 
    GLint               stride, 
    GLenum              type);

void APIENTRY gluNurbsCurve (
    GLUnurbs            *nobj, 
    GLint               nknots, 
    GLfloat             *knot, 
    GLint               stride, 
    GLfloat             *ctlarray, 
    GLint               order, 
    GLenum              type);

void APIENTRY 
gluNurbsSurface(     
    GLUnurbs            *nobj, 
    GLint               sknot_count, 
    float               *sknot, 
    GLint               tknot_count, 
    GLfloat             *tknot, 
    GLint               s_stride, 
    GLint               t_stride, 
    GLfloat             *ctlarray, 
    GLint               sorder, 
    GLint               torder, 
    GLenum              type);

void APIENTRY 
gluLoadSamplingMatrices (
    GLUnurbs            *nobj, 
    const GLfloat       modelMatrix[16], 
    const GLfloat       projMatrix[16], 
    const GLint         viewport[4] );

void APIENTRY 
gluNurbsProperty (
    GLUnurbs            *nobj, 
    GLenum              property, 
    GLfloat             value );

void APIENTRY 
gluGetNurbsProperty (
    GLUnurbs            *nobj, 
    GLenum              property, 
    GLfloat             *value );

void APIENTRY 
gluNurbsCallback (
    GLUnurbs            *nobj, 
    GLenum              which, 
    void                (CALLBACK* fn)() );


/****           Callback function prototypes    ****/

/* gluQuadricCallback */
typedef void (CALLBACK* GLUquadricErrorProc) (GLenum);

/* gluTessCallback */
typedef void (CALLBACK* GLUtessBeginProc)        (GLenum);
typedef void (CALLBACK* GLUtessEdgeFlagProc)     (GLboolean);
typedef void (CALLBACK* GLUtessVertexProc)       (void *);
typedef void (CALLBACK* GLUtessEndProc)          (void);
typedef void (CALLBACK* GLUtessErrorProc)        (GLenum);
typedef void (CALLBACK* GLUtessCombineProc)      (GLdouble[3],
                                                  void*[4], 
                                                  GLfloat[4],
                                                  void** );
typedef void (CALLBACK* GLUtessBeginDataProc)    (GLenum, void *);
typedef void (CALLBACK* GLUtessEdgeFlagDataProc) (GLboolean, void *);
typedef void (CALLBACK* GLUtessVertexDataProc)   (void *, void *);
typedef void (CALLBACK* GLUtessEndDataProc)      (void *);
typedef void (CALLBACK* GLUtessErrorDataProc)    (GLenum, void *);
typedef void (CALLBACK* GLUtessCombineDataProc)  (GLdouble[3],
                                                  void*[4], 
                                                  GLfloat[4],
                                                  void**,
                                                  void* );

/* gluNurbsCallback */
typedef void (CALLBACK* GLUnurbsErrorProc)   (GLenum);


/****           Generic constants               ****/

/* Version */
#define GLU_VERSION_1_1                 1
#define GLU_VERSION_1_2                 1

/* Errors: (return value 0 = no error) */
#define GLU_INVALID_ENUM        100900
#define GLU_INVALID_VALUE       100901
#define GLU_OUT_OF_MEMORY       100902
#define GLU_INCOMPATIBLE_GL_VERSION     100903

/* StringName */
#define GLU_VERSION             100800
#define GLU_EXTENSIONS          100801

/* Boolean */
#define GLU_TRUE                GL_TRUE
#define GLU_FALSE               GL_FALSE


/****           Quadric constants               ****/

/* QuadricNormal */
#define GLU_SMOOTH              100000
#define GLU_FLAT                100001
#define GLU_NONE                100002

/* QuadricDrawStyle */
#define GLU_POINT               100010
#define GLU_LINE                100011
#define GLU_FILL                100012
#define GLU_SILHOUETTE          100013

/* QuadricOrientation */
#define GLU_OUTSIDE             100020
#define GLU_INSIDE              100021

/* Callback types: */
/*      GLU_ERROR               100103 */


/****           Tesselation constants           ****/

#define GLU_TESS_MAX_COORD              1.0e150

/* TessProperty */
#define GLU_TESS_WINDING_RULE           100140
#define GLU_TESS_BOUNDARY_ONLY          100141
#define GLU_TESS_TOLERANCE              100142

/* TessWinding */
#define GLU_TESS_WINDING_ODD            100130
#define GLU_TESS_WINDING_NONZERO        100131
#define GLU_TESS_WINDING_POSITIVE       100132
#define GLU_TESS_WINDING_NEGATIVE       100133
#define GLU_TESS_WINDING_ABS_GEQ_TWO    100134

/* TessCallback */
#define GLU_TESS_BEGIN          100100  /* void (CALLBACK*)(GLenum    type)  */
#define GLU_TESS_VERTEX         100101  /* void (CALLBACK*)(void      *data) */
#define GLU_TESS_END            100102  /* void (CALLBACK*)(void)            */
#define GLU_TESS_ERROR          100103  /* void (CALLBACK*)(GLenum    errno) */
#define GLU_TESS_EDGE_FLAG      100104  /* void (CALLBACK*)(GLboolean boundaryEdge)  */
#define GLU_TESS_COMBINE        100105  /* void (CALLBACK*)(GLdouble  coords[3],
                                                            void      *data[4],
                                                            GLfloat   weight[4],
                                                            void      **dataOut)     */
#define GLU_TESS_BEGIN_DATA     100106  /* void (CALLBACK*)(GLenum    type,  
                                                            void      *polygon_data) */
#define GLU_TESS_VERTEX_DATA    100107  /* void (CALLBACK*)(void      *data, 
                                                            void      *polygon_data) */
#define GLU_TESS_END_DATA       100108  /* void (CALLBACK*)(void      *polygon_data) */
#define GLU_TESS_ERROR_DATA     100109  /* void (CALLBACK*)(GLenum    errno, 
                                                            void      *polygon_data) */
#define GLU_TESS_EDGE_FLAG_DATA 100110  /* void (CALLBACK*)(GLboolean boundaryEdge,
                                                            void      *polygon_data) */
#define GLU_TESS_COMBINE_DATA   100111  /* void (CALLBACK*)(GLdouble  coords[3],
                                                            void      *data[4],
                                                            GLfloat   weight[4],
                                                            void      **dataOut,
                                                            void      *polygon_data) */

/* TessError */
#define GLU_TESS_ERROR1     100151
#define GLU_TESS_ERROR2     100152
#define GLU_TESS_ERROR3     100153
#define GLU_TESS_ERROR4     100154
#define GLU_TESS_ERROR5     100155
#define GLU_TESS_ERROR6     100156
#define GLU_TESS_ERROR7     100157
#define GLU_TESS_ERROR8     100158

#define GLU_TESS_MISSING_BEGIN_POLYGON  GLU_TESS_ERROR1
#define GLU_TESS_MISSING_BEGIN_CONTOUR  GLU_TESS_ERROR2
#define GLU_TESS_MISSING_END_POLYGON    GLU_TESS_ERROR3
#define GLU_TESS_MISSING_END_CONTOUR    GLU_TESS_ERROR4
#define GLU_TESS_COORD_TOO_LARGE        GLU_TESS_ERROR5
#define GLU_TESS_NEED_COMBINE_CALLBACK  GLU_TESS_ERROR6

/****           NURBS constants                 ****/

/* NurbsProperty */
#define GLU_AUTO_LOAD_MATRIX    100200
#define GLU_CULLING             100201
#define GLU_SAMPLING_TOLERANCE  100203
#define GLU_DISPLAY_MODE        100204
#define GLU_PARAMETRIC_TOLERANCE        100202
#define GLU_SAMPLING_METHOD             100205
#define GLU_U_STEP                      100206
#define GLU_V_STEP                      100207

/* NurbsSampling */
#define GLU_PATH_LENGTH                 100215
#define GLU_PARAMETRIC_ERROR            100216
#define GLU_DOMAIN_DISTANCE             100217


/* NurbsTrim */
#define GLU_MAP1_TRIM_2         100210
#define GLU_MAP1_TRIM_3         100211

/* NurbsDisplay */
/*      GLU_FILL                100012 */
#define GLU_OUTLINE_POLYGON     100240
#define GLU_OUTLINE_PATCH       100241

/* NurbsCallback */
/*      GLU_ERROR               100103 */

/* NurbsErrors */
#define GLU_NURBS_ERROR1        100251
#define GLU_NURBS_ERROR2        100252
#define GLU_NURBS_ERROR3        100253
#define GLU_NURBS_ERROR4        100254
#define GLU_NURBS_ERROR5        100255
#define GLU_NURBS_ERROR6        100256
#define GLU_NURBS_ERROR7        100257
#define GLU_NURBS_ERROR8        100258
#define GLU_NURBS_ERROR9        100259
#define GLU_NURBS_ERROR10       100260
#define GLU_NURBS_ERROR11       100261
#define GLU_NURBS_ERROR12       100262
#define GLU_NURBS_ERROR13       100263
#define GLU_NURBS_ERROR14       100264
#define GLU_NURBS_ERROR15       100265
#define GLU_NURBS_ERROR16       100266
#define GLU_NURBS_ERROR17       100267
#define GLU_NURBS_ERROR18       100268
#define GLU_NURBS_ERROR19       100269
#define GLU_NURBS_ERROR20       100270
#define GLU_NURBS_ERROR21       100271
#define GLU_NURBS_ERROR22       100272
#define GLU_NURBS_ERROR23       100273
#define GLU_NURBS_ERROR24       100274
#define GLU_NURBS_ERROR25       100275
#define GLU_NURBS_ERROR26       100276
#define GLU_NURBS_ERROR27       100277
#define GLU_NURBS_ERROR28       100278
#define GLU_NURBS_ERROR29       100279
#define GLU_NURBS_ERROR30       100280
#define GLU_NURBS_ERROR31       100281
#define GLU_NURBS_ERROR32       100282
#define GLU_NURBS_ERROR33       100283
#define GLU_NURBS_ERROR34       100284
#define GLU_NURBS_ERROR35       100285
#define GLU_NURBS_ERROR36       100286
#define GLU_NURBS_ERROR37       100287

/****           Backwards compatibility for old tesselator           ****/

void APIENTRY   gluBeginPolygon( GLUtesselator *tess );

void APIENTRY   gluNextContour(  GLUtesselator *tess, 
                                 GLenum        type );

void APIENTRY   gluEndPolygon(   GLUtesselator *tess );

/* Contours types -- obsolete! */
#define GLU_CW          100120
#define GLU_CCW         100121
#define GLU_INTERIOR    100122
#define GLU_EXTERIOR    100123
#define GLU_UNKNOWN     100124

/* Names without "TESS_" prefix */
#define GLU_BEGIN       GLU_TESS_BEGIN
#define GLU_VERTEX      GLU_TESS_VERTEX
#define GLU_END         GLU_TESS_END
#define GLU_ERROR       GLU_TESS_ERROR
#define GLU_EDGE_FLAG   GLU_TESS_EDGE_FLAG

#ifdef __cplusplus
}
#endif

#endif /* __GLU_H__ */
#endif /* __glu_h__ */

/****************************************************************************
*                                                                           *
* winuser.h -- USER procedure declarations, constant definitions and macros *
*                                                                           *
* Copyright (c) Microsoft Corporation. All rights reserved.                 *
*                                                                           *
****************************************************************************/



#ifndef _WINUSER_
#define _WINUSER_



#pragma once

//
// Define API decoration for direct importing of DLL references.
//

#if !defined(_USER32_)
#define WINUSERAPI DECLSPEC_IMPORT
#define WINABLEAPI DECLSPEC_IMPORT
#else
#define WINUSERAPI
#define WINABLEAPI
#endif

#ifdef _MAC
#include 
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#ifndef WINVER
#define WINVER  0x0500      /* version 5.0 */
#endif /* !WINVER */

#include 

#ifndef NOUSER

typedef HANDLE HDWP;
typedef VOID MENUTEMPLATEA;
typedef VOID MENUTEMPLATEW;
#ifdef UNICODE
typedef MENUTEMPLATEW MENUTEMPLATE;
#else
typedef MENUTEMPLATEA MENUTEMPLATE;
#endif // UNICODE
typedef PVOID LPMENUTEMPLATEA;
typedef PVOID LPMENUTEMPLATEW;
#ifdef UNICODE
typedef LPMENUTEMPLATEW LPMENUTEMPLATE;
#else
typedef LPMENUTEMPLATEA LPMENUTEMPLATE;
#endif // UNICODE

typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);

#ifdef STRICT

typedef INT_PTR (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM);
typedef VOID (CALLBACK* TIMERPROC)(HWND, UINT, UINT_PTR, DWORD);
typedef BOOL (CALLBACK* GRAYSTRINGPROC)(HDC, LPARAM, int);
typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);
typedef LRESULT (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
typedef VOID (CALLBACK* SENDASYNCPROC)(HWND, UINT, ULONG_PTR, LRESULT);

typedef BOOL (CALLBACK* PROPENUMPROCA)(HWND, LPCSTR, HANDLE);
typedef BOOL (CALLBACK* PROPENUMPROCW)(HWND, LPCWSTR, HANDLE);

typedef BOOL (CALLBACK* PROPENUMPROCEXA)(HWND, LPSTR, HANDLE, ULONG_PTR);
typedef BOOL (CALLBACK* PROPENUMPROCEXW)(HWND, LPWSTR, HANDLE, ULONG_PTR);

typedef int (CALLBACK* EDITWORDBREAKPROCA)(LPSTR lpch, int ichCurrent, int cch, int code);
typedef int (CALLBACK* EDITWORDBREAKPROCW)(LPWSTR lpch, int ichCurrent, int cch, int code);

#if(WINVER >= 0x0400)
typedef BOOL (CALLBACK* DRAWSTATEPROC)(HDC hdc, LPARAM lData, WPARAM wData, int cx, int cy);
#endif /* WINVER >= 0x0400 */


#else /* !STRICT */

typedef FARPROC DLGPROC;
typedef FARPROC TIMERPROC;
typedef FARPROC GRAYSTRINGPROC;
typedef FARPROC WNDENUMPROC;
typedef FARPROC HOOKPROC;
typedef FARPROC SENDASYNCPROC;

typedef FARPROC EDITWORDBREAKPROCA;
typedef FARPROC EDITWORDBREAKPROCW;

typedef FARPROC PROPENUMPROCA;
typedef FARPROC PROPENUMPROCW;

typedef FARPROC PROPENUMPROCEXA;
typedef FARPROC PROPENUMPROCEXW;

#if(WINVER >= 0x0400)
typedef FARPROC DRAWSTATEPROC;
#endif /* WINVER >= 0x0400 */


#endif /* !STRICT */

#ifdef UNICODE
typedef PROPENUMPROCW        PROPENUMPROC;
typedef PROPENUMPROCEXW      PROPENUMPROCEX;
typedef EDITWORDBREAKPROCW   EDITWORDBREAKPROC;
#else  /* !UNICODE */
typedef PROPENUMPROCA        PROPENUMPROC;
typedef PROPENUMPROCEXA      PROPENUMPROCEX;
typedef EDITWORDBREAKPROCA   EDITWORDBREAKPROC;
#endif /* UNICODE */

#ifdef STRICT

typedef BOOL (CALLBACK* NAMEENUMPROCA)(LPSTR, LPARAM);
typedef BOOL (CALLBACK* NAMEENUMPROCW)(LPWSTR, LPARAM);

typedef NAMEENUMPROCA   WINSTAENUMPROCA;
typedef NAMEENUMPROCA   DESKTOPENUMPROCA;
typedef NAMEENUMPROCW   WINSTAENUMPROCW;
typedef NAMEENUMPROCW   DESKTOPENUMPROCW;


#else /* !STRICT */

typedef FARPROC NAMEENUMPROCA;
typedef FARPROC NAMEENUMPROCW;
typedef FARPROC WINSTAENUMPROCA;
typedef FARPROC DESKTOPENUMPROCA;
typedef FARPROC WINSTAENUMPROCW;
typedef FARPROC DESKTOPENUMPROCW;


#endif /* !STRICT */

#ifdef UNICODE
typedef WINSTAENUMPROCW     WINSTAENUMPROC;
typedef DESKTOPENUMPROCW    DESKTOPENUMPROC;


#else  /* !UNICODE */
typedef WINSTAENUMPROCA     WINSTAENUMPROC;
typedef DESKTOPENUMPROCA    DESKTOPENUMPROC;

#endif /* UNICODE */

#define IS_INTRESOURCE(_r) ((((ULONG_PTR)(_r)) >> 16) == 0)
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
#ifdef UNICODE
#define MAKEINTRESOURCE  MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE  MAKEINTRESOURCEA
#endif // !UNICODE

#ifndef NORESOURCE

/*
 * Predefined Resource Types
 */
#define RT_CURSOR           MAKEINTRESOURCE(1)
#define RT_BITMAP           MAKEINTRESOURCE(2)
#define RT_ICON             MAKEINTRESOURCE(3)
#define RT_MENU             MAKEINTRESOURCE(4)
#define RT_DIALOG           MAKEINTRESOURCE(5)
#define RT_STRING           MAKEINTRESOURCE(6)
#define RT_FONTDIR          MAKEINTRESOURCE(7)
#define RT_FONT             MAKEINTRESOURCE(8)
#define RT_ACCELERATOR      MAKEINTRESOURCE(9)
#define RT_RCDATA           MAKEINTRESOURCE(10)
#define RT_MESSAGETABLE     MAKEINTRESOURCE(11)

#define DIFFERENCE     11
#define RT_GROUP_CURSOR MAKEINTRESOURCE((ULONG_PTR)(RT_CURSOR) + DIFFERENCE)
#define RT_GROUP_ICON   MAKEINTRESOURCE((ULONG_PTR)(RT_ICON) + DIFFERENCE)
#define RT_VERSION      MAKEINTRESOURCE(16)
#define RT_DLGINCLUDE   MAKEINTRESOURCE(17)
#if(WINVER >= 0x0400)
#define RT_PLUGPLAY     MAKEINTRESOURCE(19)
#define RT_VXD          MAKEINTRESOURCE(20)
#define RT_ANICURSOR    MAKEINTRESOURCE(21)
#define RT_ANIICON      MAKEINTRESOURCE(22)
#endif /* WINVER >= 0x0400 */
#define RT_HTML         MAKEINTRESOURCE(23)
#ifdef RC_INVOKED
#define RT_MANIFEST                        24
#define CREATEPROCESS_MANIFEST_RESOURCE_ID  1
#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2
#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3
#define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID 1   /* inclusive */
#define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID 16  /* inclusive */
#else  /* RC_INVOKED */
#define RT_MANIFEST                        MAKEINTRESOURCE(24)
#define CREATEPROCESS_MANIFEST_RESOURCE_ID MAKEINTRESOURCE( 1)
#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(2)
#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(3)
#define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE( 1 /*inclusive*/)
#define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID MAKEINTRESOURCE(16 /*inclusive*/)
#endif /* RC_INVOKED */


#endif /* !NORESOURCE */

#if defined(DEPRECATE_SUPPORTED)
#pragma warning(push)
#pragma warning(disable:4995)
#endif

WINUSERAPI
int
WINAPI
wvsprintfA(
    __out LPSTR,
    __in __format_string LPCSTR,
    __in va_list arglist);
WINUSERAPI
int
WINAPI
wvsprintfW(
    __out LPWSTR,
    __in __format_string LPCWSTR,
    __in va_list arglist);
#ifdef UNICODE
#define wvsprintf  wvsprintfW
#else
#define wvsprintf  wvsprintfA
#endif // !UNICODE

WINUSERAPI
int
WINAPIV
wsprintfA(
    __out LPSTR,
    __in __format_string LPCSTR,
    ...);
WINUSERAPI
int
WINAPIV
wsprintfW(
    __out LPWSTR,
    __in __format_string LPCWSTR,
    ...);
#ifdef UNICODE
#define wsprintf  wsprintfW
#else
#define wsprintf  wsprintfA
#endif // !UNICODE

#if defined(DEPRECATE_SUPPORTED)
#pragma warning(pop)
#endif


/*
 * SPI_SETDESKWALLPAPER defined constants
 */
#define SETWALLPAPER_DEFAULT    ((LPWSTR)-1)

#ifndef NOSCROLL

/*
 * Scroll Bar Constants
 */
#define SB_HORZ             0
#define SB_VERT             1
#define SB_CTL              2
#define SB_BOTH             3

/*
 * Scroll Bar Commands
 */
#define SB_LINEUP           0
#define SB_LINELEFT         0
#define SB_LINEDOWN         1
#define SB_LINERIGHT        1
#define SB_PAGEUP           2
#define SB_PAGELEFT         2
#define SB_PAGEDOWN         3
#define SB_PAGERIGHT        3
#define SB_THUMBPOSITION    4
#define SB_THUMBTRACK       5
#define SB_TOP              6
#define SB_LEFT             6
#define SB_BOTTOM           7
#define SB_RIGHT            7
#define SB_ENDSCROLL        8

#endif /* !NOSCROLL */

#ifndef NOSHOWWINDOW


/*
 * ShowWindow() Commands
 */
#define SW_HIDE             0
#define SW_SHOWNORMAL       1
#define SW_NORMAL           1
#define SW_SHOWMINIMIZED    2
#define SW_SHOWMAXIMIZED    3
#define SW_MAXIMIZE         3
#define SW_SHOWNOACTIVATE   4
#define SW_SHOW             5
#define SW_MINIMIZE         6
#define SW_SHOWMINNOACTIVE  7
#define SW_SHOWNA           8
#define SW_RESTORE          9
#define SW_SHOWDEFAULT      10
#define SW_FORCEMINIMIZE    11
#define SW_MAX              11


/*
 * Old ShowWindow() Commands
 */
#define HIDE_WINDOW         0
#define SHOW_OPENWINDOW     1
#define SHOW_ICONWINDOW     2
#define SHOW_FULLSCREEN     3
#define SHOW_OPENNOACTIVATE 4

/*
 * Identifiers for the WM_SHOWWINDOW message
 */
#define SW_PARENTCLOSING    1
#define SW_OTHERZOOM        2
#define SW_PARENTOPENING    3
#define SW_OTHERUNZOOM      4


#endif /* !NOSHOWWINDOW */

#if(WINVER >= 0x0500)
/*
 * AnimateWindow() Commands
 */
#define AW_HOR_POSITIVE             0x00000001
#define AW_HOR_NEGATIVE             0x00000002
#define AW_VER_POSITIVE             0x00000004
#define AW_VER_NEGATIVE             0x00000008
#define AW_CENTER                   0x00000010
#define AW_HIDE                     0x00010000
#define AW_ACTIVATE                 0x00020000
#define AW_SLIDE                    0x00040000
#define AW_BLEND                    0x00080000

#endif /* WINVER >= 0x0500 */


/*
 * WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags
 */
#define KF_EXTENDED       0x0100
#define KF_DLGMODE        0x0800
#define KF_MENUMODE       0x1000
#define KF_ALTDOWN        0x2000
#define KF_REPEAT         0x4000
#define KF_UP             0x8000

#ifndef NOVIRTUALKEYCODES


/*
 * Virtual Keys, Standard Set
 */
#define VK_LBUTTON        0x01
#define VK_RBUTTON        0x02
#define VK_CANCEL         0x03
#define VK_MBUTTON        0x04    /* NOT contiguous with L & RBUTTON */

#if(_WIN32_WINNT >= 0x0500)
#define VK_XBUTTON1       0x05    /* NOT contiguous with L & RBUTTON */
#define VK_XBUTTON2       0x06    /* NOT contiguous with L & RBUTTON */
#endif /* _WIN32_WINNT >= 0x0500 */

/*
 * 0x07 : unassigned
 */

#define VK_BACK           0x08
#define VK_TAB            0x09

/*
 * 0x0A - 0x0B : reserved
 */

#define VK_CLEAR          0x0C
#define VK_RETURN         0x0D

#define VK_SHIFT          0x10
#define VK_CONTROL        0x11
#define VK_MENU           0x12
#define VK_PAUSE          0x13
#define VK_CAPITAL        0x14

#define VK_KANA           0x15
#define VK_HANGEUL        0x15  /* old name - should be here for compatibility */
#define VK_HANGUL         0x15
#define VK_JUNJA          0x17
#define VK_FINAL          0x18
#define VK_HANJA          0x19
#define VK_KANJI          0x19

#define VK_ESCAPE         0x1B

#define VK_CONVERT        0x1C
#define VK_NONCONVERT     0x1D
#define VK_ACCEPT         0x1E
#define VK_MODECHANGE     0x1F

#define VK_SPACE          0x20
#define VK_PRIOR          0x21
#define VK_NEXT           0x22
#define VK_END            0x23
#define VK_HOME           0x24
#define VK_LEFT           0x25
#define VK_UP             0x26
#define VK_RIGHT          0x27
#define VK_DOWN           0x28
#define VK_SELECT         0x29
#define VK_PRINT          0x2A
#define VK_EXECUTE        0x2B
#define VK_SNAPSHOT       0x2C
#define VK_INSERT         0x2D
#define VK_DELETE         0x2E
#define VK_HELP           0x2F

/*
 * VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
 * 0x40 : unassigned
 * VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
 */

#define VK_LWIN           0x5B
#define VK_RWIN           0x5C
#define VK_APPS           0x5D

/*
 * 0x5E : reserved
 */

#define VK_SLEEP          0x5F

#define VK_NUMPAD0        0x60
#define VK_NUMPAD1        0x61
#define VK_NUMPAD2        0x62
#define VK_NUMPAD3        0x63
#define VK_NUMPAD4        0x64
#define VK_NUMPAD5        0x65
#define VK_NUMPAD6        0x66
#define VK_NUMPAD7        0x67
#define VK_NUMPAD8        0x68
#define VK_NUMPAD9        0x69
#define VK_MULTIPLY       0x6A
#define VK_ADD            0x6B
#define VK_SEPARATOR      0x6C
#define VK_SUBTRACT       0x6D
#define VK_DECIMAL        0x6E
#define VK_DIVIDE         0x6F
#define VK_F1             0x70
#define VK_F2             0x71
#define VK_F3             0x72
#define VK_F4             0x73
#define VK_F5             0x74
#define VK_F6             0x75
#define VK_F7             0x76
#define VK_F8             0x77
#define VK_F9             0x78
#define VK_F10            0x79
#define VK_F11            0x7A
#define VK_F12            0x7B
#define VK_F13            0x7C
#define VK_F14            0x7D
#define VK_F15            0x7E
#define VK_F16            0x7F
#define VK_F17            0x80
#define VK_F18            0x81
#define VK_F19            0x82
#define VK_F20            0x83
#define VK_F21            0x84
#define VK_F22            0x85
#define VK_F23            0x86
#define VK_F24            0x87

/*
 * 0x88 - 0x8F : unassigned
 */

#define VK_NUMLOCK        0x90
#define VK_SCROLL         0x91

/*
 * NEC PC-9800 kbd definitions
 */
#define VK_OEM_NEC_EQUAL  0x92   // '=' key on numpad

/*
 * Fujitsu/OASYS kbd definitions
 */
#define VK_OEM_FJ_JISHO   0x92   // 'Dictionary' key
#define VK_OEM_FJ_MASSHOU 0x93   // 'Unregister word' key
#define VK_OEM_FJ_TOUROKU 0x94   // 'Register word' key
#define VK_OEM_FJ_LOYA    0x95   // 'Left OYAYUBI' key
#define VK_OEM_FJ_ROYA    0x96   // 'Right OYAYUBI' key

/*
 * 0x97 - 0x9F : unassigned
 */

/*
 * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
 * Used only as parameters to GetAsyncKeyState() and GetKeyState().
 * No other API or message will distinguish left and right keys in this way.
 */
#define VK_LSHIFT         0xA0
#define VK_RSHIFT         0xA1
#define VK_LCONTROL       0xA2
#define VK_RCONTROL       0xA3
#define VK_LMENU          0xA4
#define VK_RMENU          0xA5

#if(_WIN32_WINNT >= 0x0500)
#define VK_BROWSER_BACK        0xA6
#define VK_BROWSER_FORWARD     0xA7
#define VK_BROWSER_REFRESH     0xA8
#define VK_BROWSER_STOP        0xA9
#define VK_BROWSER_SEARCH      0xAA
#define VK_BROWSER_FAVORITES   0xAB
#define VK_BROWSER_HOME        0xAC

#define VK_VOLUME_MUTE         0xAD
#define VK_VOLUME_DOWN         0xAE
#define VK_VOLUME_UP           0xAF
#define VK_MEDIA_NEXT_TRACK    0xB0
#define VK_MEDIA_PREV_TRACK    0xB1
#define VK_MEDIA_STOP          0xB2
#define VK_MEDIA_PLAY_PAUSE    0xB3
#define VK_LAUNCH_MAIL         0xB4
#define VK_LAUNCH_MEDIA_SELECT 0xB5
#define VK_LAUNCH_APP1         0xB6
#define VK_LAUNCH_APP2         0xB7

#endif /* _WIN32_WINNT >= 0x0500 */

/*
 * 0xB8 - 0xB9 : reserved
 */

#define VK_OEM_1          0xBA   // ';:' for US
#define VK_OEM_PLUS       0xBB   // '+' any country
#define VK_OEM_COMMA      0xBC   // ',' any country
#define VK_OEM_MINUS      0xBD   // '-' any country
#define VK_OEM_PERIOD     0xBE   // '.' any country
#define VK_OEM_2          0xBF   // '/?' for US
#define VK_OEM_3          0xC0   // '`~' for US

/*
 * 0xC1 - 0xD7 : reserved
 */

/*
 * 0xD8 - 0xDA : unassigned
 */

#define VK_OEM_4          0xDB  //  '[{' for US
#define VK_OEM_5          0xDC  //  '\|' for US
#define VK_OEM_6          0xDD  //  ']}' for US
#define VK_OEM_7          0xDE  //  ''"' for US
#define VK_OEM_8          0xDF

/*
 * 0xE0 : reserved
 */

/*
 * Various extended or enhanced keyboards
 */
#define VK_OEM_AX         0xE1  //  'AX' key on Japanese AX kbd
#define VK_OEM_102        0xE2  //  "<>" or "\|" on RT 102-key kbd.
#define VK_ICO_HELP       0xE3  //  Help key on ICO
#define VK_ICO_00         0xE4  //  00 key on ICO

#if(WINVER >= 0x0400)
#define VK_PROCESSKEY     0xE5
#endif /* WINVER >= 0x0400 */

#define VK_ICO_CLEAR      0xE6


#if(_WIN32_WINNT >= 0x0500)
#define VK_PACKET         0xE7
#endif /* _WIN32_WINNT >= 0x0500 */

/*
 * 0xE8 : unassigned
 */

/*
 * Nokia/Ericsson definitions
 */
#define VK_OEM_RESET      0xE9
#define VK_OEM_JUMP       0xEA
#define VK_OEM_PA1        0xEB
#define VK_OEM_PA2        0xEC
#define VK_OEM_PA3        0xED
#define VK_OEM_WSCTRL     0xEE
#define VK_OEM_CUSEL      0xEF
#define VK_OEM_ATTN       0xF0
#define VK_OEM_FINISH     0xF1
#define VK_OEM_COPY       0xF2
#define VK_OEM_AUTO       0xF3
#define VK_OEM_ENLW       0xF4
#define VK_OEM_BACKTAB    0xF5

#define VK_ATTN           0xF6
#define VK_CRSEL          0xF7
#define VK_EXSEL          0xF8
#define VK_EREOF          0xF9
#define VK_PLAY           0xFA
#define VK_ZOOM           0xFB
#define VK_NONAME         0xFC
#define VK_PA1            0xFD
#define VK_OEM_CLEAR      0xFE

/*
 * 0xFF : reserved
 */


#endif /* !NOVIRTUALKEYCODES */

#ifndef NOWH

/*
 * SetWindowsHook() codes
 */
#define WH_MIN              (-1)
#define WH_MSGFILTER        (-1)
#define WH_JOURNALRECORD    0
#define WH_JOURNALPLAYBACK  1
#define WH_KEYBOARD         2
#define WH_GETMESSAGE       3
#define WH_CALLWNDPROC      4
#define WH_CBT              5
#define WH_SYSMSGFILTER     6
#define WH_MOUSE            7
#if defined(_WIN32_WINDOWS)
#define WH_HARDWARE         8
#endif
#define WH_DEBUG            9
#define WH_SHELL           10
#define WH_FOREGROUNDIDLE  11
#if(WINVER >= 0x0400)
#define WH_CALLWNDPROCRET  12
#endif /* WINVER >= 0x0400 */

#if (_WIN32_WINNT >= 0x0400)
#define WH_KEYBOARD_LL     13
#define WH_MOUSE_LL        14
#endif // (_WIN32_WINNT >= 0x0400)

#if(WINVER >= 0x0400)
#if (_WIN32_WINNT >= 0x0400)
#define WH_MAX             14
#else
#define WH_MAX             12
#endif // (_WIN32_WINNT >= 0x0400)
#else
#define WH_MAX             11
#endif

#define WH_MINHOOK         WH_MIN
#define WH_MAXHOOK         WH_MAX

/*
 * Hook Codes
 */
#define HC_ACTION           0
#define HC_GETNEXT          1
#define HC_SKIP             2
#define HC_NOREMOVE         3
#define HC_NOREM            HC_NOREMOVE
#define HC_SYSMODALON       4
#define HC_SYSMODALOFF      5

/*
 * CBT Hook Codes
 */
#define HCBT_MOVESIZE       0
#define HCBT_MINMAX         1
#define HCBT_QS             2
#define HCBT_CREATEWND      3
#define HCBT_DESTROYWND     4
#define HCBT_ACTIVATE       5
#define HCBT_CLICKSKIPPED   6
#define HCBT_KEYSKIPPED     7
#define HCBT_SYSCOMMAND     8
#define HCBT_SETFOCUS       9

/*
 * HCBT_CREATEWND parameters pointed to by lParam
 */
typedef struct tagCBT_CREATEWNDA
{
    struct tagCREATESTRUCTA *lpcs;
    HWND           hwndInsertAfter;
} CBT_CREATEWNDA, *LPCBT_CREATEWNDA;
/*
 * HCBT_CREATEWND parameters pointed to by lParam
 */
typedef struct tagCBT_CREATEWNDW
{
    struct tagCREATESTRUCTW *lpcs;
    HWND           hwndInsertAfter;
} CBT_CREATEWNDW, *LPCBT_CREATEWNDW;
#ifdef UNICODE
typedef CBT_CREATEWNDW CBT_CREATEWND;
typedef LPCBT_CREATEWNDW LPCBT_CREATEWND;
#else
typedef CBT_CREATEWNDA CBT_CREATEWND;
typedef LPCBT_CREATEWNDA LPCBT_CREATEWND;
#endif // UNICODE

/*
 * HCBT_ACTIVATE structure pointed to by lParam
 */
typedef struct tagCBTACTIVATESTRUCT
{
    BOOL    fMouse;
    HWND    hWndActive;
} CBTACTIVATESTRUCT, *LPCBTACTIVATESTRUCT;

#if(_WIN32_WINNT >= 0x0501)
/*
 * WTSSESSION_NOTIFICATION struct pointed by lParam, for WM_WTSSESSION_CHANGE
 */
typedef struct tagWTSSESSION_NOTIFICATION
{
    DWORD cbSize;
    DWORD dwSessionId;

} WTSSESSION_NOTIFICATION, *PWTSSESSION_NOTIFICATION;

/*
 * codes passed in WPARAM for WM_WTSSESSION_CHANGE
 */

#define WTS_CONSOLE_CONNECT                0x1
#define WTS_CONSOLE_DISCONNECT             0x2
#define WTS_REMOTE_CONNECT                 0x3
#define WTS_REMOTE_DISCONNECT              0x4
#define WTS_SESSION_LOGON                  0x5
#define WTS_SESSION_LOGOFF                 0x6
#define WTS_SESSION_LOCK                   0x7
#define WTS_SESSION_UNLOCK                 0x8
#define WTS_SESSION_REMOTE_CONTROL         0x9

#endif /* _WIN32_WINNT >= 0x0501 */

/*
 * WH_MSGFILTER Filter Proc Codes
 */
#define MSGF_DIALOGBOX      0
#define MSGF_MESSAGEBOX     1
#define MSGF_MENU           2
#define MSGF_SCROLLBAR      5
#define MSGF_NEXTWINDOW     6
#define MSGF_MAX            8                       // unused
#define MSGF_USER           4096

/*
 * Shell support
 */
#define HSHELL_WINDOWCREATED        1
#define HSHELL_WINDOWDESTROYED      2
#define HSHELL_ACTIVATESHELLWINDOW  3

#if(WINVER >= 0x0400)
#define HSHELL_WINDOWACTIVATED      4
#define HSHELL_GETMINRECT           5
#define HSHELL_REDRAW               6
#define HSHELL_TASKMAN              7
#define HSHELL_LANGUAGE             8
#define HSHELL_SYSMENU              9
#define HSHELL_ENDTASK              10
#endif /* WINVER >= 0x0400 */
#if(_WIN32_WINNT >= 0x0500)
#define HSHELL_ACCESSIBILITYSTATE   11
#define HSHELL_APPCOMMAND           12
#endif /* _WIN32_WINNT >= 0x0500 */

#if(_WIN32_WINNT >= 0x0501)
#define HSHELL_WINDOWREPLACED       13
#define HSHELL_WINDOWREPLACING      14
#endif /* _WIN32_WINNT >= 0x0501 */


#define HSHELL_HIGHBIT            0x8000
#define HSHELL_FLASH              (HSHELL_REDRAW|HSHELL_HIGHBIT)
#define HSHELL_RUDEAPPACTIVATED   (HSHELL_WINDOWACTIVATED|HSHELL_HIGHBIT)

#if(_WIN32_WINNT >= 0x0500)
/* cmd for HSHELL_APPCOMMAND and WM_APPCOMMAND */
#define APPCOMMAND_BROWSER_BACKWARD       1
#define APPCOMMAND_BROWSER_FORWARD        2
#define APPCOMMAND_BROWSER_REFRESH        3
#define APPCOMMAND_BROWSER_STOP           4
#define APPCOMMAND_BROWSER_SEARCH         5
#define APPCOMMAND_BROWSER_FAVORITES      6
#define APPCOMMAND_BROWSER_HOME           7
#define APPCOMMAND_VOLUME_MUTE            8
#define APPCOMMAND_VOLUME_DOWN            9
#define APPCOMMAND_VOLUME_UP              10
#define APPCOMMAND_MEDIA_NEXTTRACK        11
#define APPCOMMAND_MEDIA_PREVIOUSTRACK    12
#define APPCOMMAND_MEDIA_STOP             13
#define APPCOMMAND_MEDIA_PLAY_PAUSE       14
#define APPCOMMAND_LAUNCH_MAIL            15
#define APPCOMMAND_LAUNCH_MEDIA_SELECT    16
#define APPCOMMAND_LAUNCH_APP1            17
#define APPCOMMAND_LAUNCH_APP2            18
#define APPCOMMAND_BASS_DOWN              19
#define APPCOMMAND_BASS_BOOST             20
#define APPCOMMAND_BASS_UP                21
#define APPCOMMAND_TREBLE_DOWN            22
#define APPCOMMAND_TREBLE_UP              23
#if(_WIN32_WINNT >= 0x0501)
#define APPCOMMAND_MICROPHONE_VOLUME_MUTE 24
#define APPCOMMAND_MICROPHONE_VOLUME_DOWN 25
#define APPCOMMAND_MICROPHONE_VOLUME_UP   26
#define APPCOMMAND_HELP                   27
#define APPCOMMAND_FIND                   28
#define APPCOMMAND_NEW                    29
#define APPCOMMAND_OPEN                   30
#define APPCOMMAND_CLOSE                  31
#define APPCOMMAND_SAVE                   32
#define APPCOMMAND_PRINT                  33
#define APPCOMMAND_UNDO                   34
#define APPCOMMAND_REDO                   35
#define APPCOMMAND_COPY                   36
#define APPCOMMAND_CUT                    37
#define APPCOMMAND_PASTE                  38
#define APPCOMMAND_REPLY_TO_MAIL          39
#define APPCOMMAND_FORWARD_MAIL           40
#define APPCOMMAND_SEND_MAIL              41
#define APPCOMMAND_SPELL_CHECK            42
#define APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE    43
#define APPCOMMAND_MIC_ON_OFF_TOGGLE      44
#define APPCOMMAND_CORRECTION_LIST        45
#define APPCOMMAND_MEDIA_PLAY             46
#define APPCOMMAND_MEDIA_PAUSE            47
#define APPCOMMAND_MEDIA_RECORD           48
#define APPCOMMAND_MEDIA_FAST_FORWARD     49
#define APPCOMMAND_MEDIA_REWIND           50
#define APPCOMMAND_MEDIA_CHANNEL_UP       51
#define APPCOMMAND_MEDIA_CHANNEL_DOWN     52
#endif /* _WIN32_WINNT >= 0x0501 */
#if(_WIN32_WINNT >= 0x0600)
#define APPCOMMAND_DELETE                 53
#define APPCOMMAND_DWM_FLIP3D             54
#endif /* _WIN32_WINNT >= 0x0600 */

#define FAPPCOMMAND_MOUSE 0x8000
#define FAPPCOMMAND_KEY   0
#define FAPPCOMMAND_OEM   0x1000
#define FAPPCOMMAND_MASK  0xF000

#define GET_APPCOMMAND_LPARAM(lParam) ((short)(HIWORD(lParam) & ~FAPPCOMMAND_MASK))
#define GET_DEVICE_LPARAM(lParam)     ((WORD)(HIWORD(lParam) & FAPPCOMMAND_MASK))
#define GET_MOUSEORKEY_LPARAM         GET_DEVICE_LPARAM
#define GET_FLAGS_LPARAM(lParam)      (LOWORD(lParam))
#define GET_KEYSTATE_LPARAM(lParam)   GET_FLAGS_LPARAM(lParam)
#endif /* _WIN32_WINNT >= 0x0500 */

typedef struct
{
    HWND    hwnd;
    RECT    rc;
} SHELLHOOKINFO, *LPSHELLHOOKINFO;

/*
 * Message Structure used in Journaling
 */
typedef struct tagEVENTMSG {
    UINT    message;
    UINT    paramL;
    UINT    paramH;
    DWORD    time;
    HWND     hwnd;
} EVENTMSG, *PEVENTMSGMSG, NEAR *NPEVENTMSGMSG, FAR *LPEVENTMSGMSG;

typedef struct tagEVENTMSG *PEVENTMSG, NEAR *NPEVENTMSG, FAR *LPEVENTMSG;

/*
 * Message structure used by WH_CALLWNDPROC
 */
typedef struct tagCWPSTRUCT {
    LPARAM  lParam;
    WPARAM  wParam;
    UINT    message;
    HWND    hwnd;
} CWPSTRUCT, *PCWPSTRUCT, NEAR *NPCWPSTRUCT, FAR *LPCWPSTRUCT;

#if(WINVER >= 0x0400)
/*
 * Message structure used by WH_CALLWNDPROCRET
 */
typedef struct tagCWPRETSTRUCT {
    LRESULT lResult;
    LPARAM  lParam;
    WPARAM  wParam;
    UINT    message;
    HWND    hwnd;
} CWPRETSTRUCT, *PCWPRETSTRUCT, NEAR *NPCWPRETSTRUCT, FAR *LPCWPRETSTRUCT;

#endif /* WINVER >= 0x0400 */

#if (_WIN32_WINNT >= 0x0400)

/*
 * Low level hook flags
 */

#define LLKHF_EXTENDED       (KF_EXTENDED >> 8)
#define LLKHF_INJECTED       0x00000010
#define LLKHF_ALTDOWN        (KF_ALTDOWN >> 8)
#define LLKHF_UP             (KF_UP >> 8)

#define LLMHF_INJECTED       0x00000001

/*
 * Structure used by WH_KEYBOARD_LL
 */
typedef struct tagKBDLLHOOKSTRUCT {
    DWORD   vkCode;
    DWORD   scanCode;
    DWORD   flags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

/*
 * Structure used by WH_MOUSE_LL
 */
typedef struct tagMSLLHOOKSTRUCT {
    POINT   pt;
    DWORD   mouseData;
    DWORD   flags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCT, FAR *LPMSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;

#endif // (_WIN32_WINNT >= 0x0400)

/*
 * Structure used by WH_DEBUG
 */
typedef struct tagDEBUGHOOKINFO
{
    DWORD   idThread;
    DWORD   idThreadInstaller;
    LPARAM  lParam;
    WPARAM  wParam;
    int     code;
} DEBUGHOOKINFO, *PDEBUGHOOKINFO, NEAR *NPDEBUGHOOKINFO, FAR* LPDEBUGHOOKINFO;

/*
 * Structure used by WH_MOUSE
 */
typedef struct tagMOUSEHOOKSTRUCT {
    POINT   pt;
    HWND    hwnd;
    UINT    wHitTestCode;
    ULONG_PTR dwExtraInfo;
} MOUSEHOOKSTRUCT, FAR *LPMOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;

#if(_WIN32_WINNT >= 0x0500)
#ifdef __cplusplus
typedef struct tagMOUSEHOOKSTRUCTEX : public tagMOUSEHOOKSTRUCT
{
    DWORD   mouseData;
} MOUSEHOOKSTRUCTEX, *LPMOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX;
#else // ndef __cplusplus
typedef struct tagMOUSEHOOKSTRUCTEX
{
    MOUSEHOOKSTRUCT;
    DWORD   mouseData;
} MOUSEHOOKSTRUCTEX, *LPMOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX;
#endif
#endif /* _WIN32_WINNT >= 0x0500 */

#if(WINVER >= 0x0400)
/*
 * Structure used by WH_HARDWARE
 */
typedef struct tagHARDWAREHOOKSTRUCT {
    HWND    hwnd;
    UINT    message;
    WPARAM  wParam;
    LPARAM  lParam;
} HARDWAREHOOKSTRUCT, FAR *LPHARDWAREHOOKSTRUCT, *PHARDWAREHOOKSTRUCT;
#endif /* WINVER >= 0x0400 */
#endif /* !NOWH */

/*
 * Keyboard Layout API
 */
#define HKL_PREV            0
#define HKL_NEXT            1


#define KLF_ACTIVATE        0x00000001
#define KLF_SUBSTITUTE_OK   0x00000002
#define KLF_REORDER         0x00000008
#if(WINVER >= 0x0400)
#define KLF_REPLACELANG     0x00000010
#define KLF_NOTELLSHELL     0x00000080
#endif /* WINVER >= 0x0400 */
#define KLF_SETFORPROCESS   0x00000100
#if(_WIN32_WINNT >= 0x0500)
#define KLF_SHIFTLOCK       0x00010000
#define KLF_RESET           0x40000000
#endif /* _WIN32_WINNT >= 0x0500 */


#if(WINVER >= 0x0500)
/*
 * Bits in wParam of WM_INPUTLANGCHANGEREQUEST message
 */
#define INPUTLANGCHANGE_SYSCHARSET 0x0001
#define INPUTLANGCHANGE_FORWARD    0x0002
#define INPUTLANGCHANGE_BACKWARD   0x0004
#endif /* WINVER >= 0x0500 */

/*
 * Size of KeyboardLayoutName (number of characters), including nul terminator
 */
#define KL_NAMELENGTH 9

WINUSERAPI
HKL
WINAPI
LoadKeyboardLayoutA(
    __in LPCSTR pwszKLID,
    __in UINT Flags);
WINUSERAPI
HKL
WINAPI
LoadKeyboardLayoutW(
    __in LPCWSTR pwszKLID,
    __in UINT Flags);
#ifdef UNICODE
#define LoadKeyboardLayout  LoadKeyboardLayoutW
#else
#define LoadKeyboardLayout  LoadKeyboardLayoutA
#endif // !UNICODE


#if(WINVER >= 0x0400)
WINUSERAPI
HKL
WINAPI
ActivateKeyboardLayout(
    __in HKL hkl,
    __in UINT Flags);
#else
WINUSERAPI
BOOL
WINAPI
ActivateKeyboardLayout(
    __in HKL hkl,
    __in UINT Flags);
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0400)
WINUSERAPI
int
WINAPI
ToUnicodeEx(
    __in UINT wVirtKey,
    __in UINT wScanCode,
    __in_bcount(256) CONST BYTE *lpKeyState,
    __out_ecount(cchBuff) LPWSTR pwszBuff,
    __in int cchBuff,
    __in UINT wFlags,
    __in_opt HKL dwhkl);
#endif /* WINVER >= 0x0400 */

WINUSERAPI
BOOL
WINAPI
UnloadKeyboardLayout(
    __in HKL hkl);

WINUSERAPI
BOOL
WINAPI
GetKeyboardLayoutNameA(
    __out_ecount(KL_NAMELENGTH) LPSTR pwszKLID);
WINUSERAPI
BOOL
WINAPI
GetKeyboardLayoutNameW(
    __out_ecount(KL_NAMELENGTH) LPWSTR pwszKLID);
#ifdef UNICODE
#define GetKeyboardLayoutName  GetKeyboardLayoutNameW
#else
#define GetKeyboardLayoutName  GetKeyboardLayoutNameA
#endif // !UNICODE

#if(WINVER >= 0x0400)
WINUSERAPI
int
WINAPI
GetKeyboardLayoutList(
    __in int nBuff,
    __out_ecount_part_opt(nBuff, return) HKL FAR *lpList);

WINUSERAPI
HKL
WINAPI
GetKeyboardLayout(
    __in DWORD idThread);

#endif /* WINVER >= 0x0400 */


#if(WINVER >= 0x0500)

typedef struct tagMOUSEMOVEPOINT {
    int   x;
    int   y;
    DWORD time;
    ULONG_PTR dwExtraInfo;
} MOUSEMOVEPOINT, *PMOUSEMOVEPOINT, FAR* LPMOUSEMOVEPOINT;

/*
 * Values for resolution parameter of GetMouseMovePointsEx
 */
#define GMMP_USE_DISPLAY_POINTS          1
#define GMMP_USE_HIGH_RESOLUTION_POINTS  2

WINUSERAPI
int
WINAPI
GetMouseMovePointsEx(
    __in UINT cbSize,
    __in LPMOUSEMOVEPOINT lppt,
    __out_ecount(nBufPoints) LPMOUSEMOVEPOINT lpptBuf,
    __in int nBufPoints,
    __in DWORD resolution);

#endif /* WINVER >= 0x0500 */

#ifndef NODESKTOP
/*
 * Desktop-specific access flags
 */
#define DESKTOP_READOBJECTS         0x0001L
#define DESKTOP_CREATEWINDOW        0x0002L
#define DESKTOP_CREATEMENU          0x0004L
#define DESKTOP_HOOKCONTROL         0x0008L
#define DESKTOP_JOURNALRECORD       0x0010L
#define DESKTOP_JOURNALPLAYBACK     0x0020L
#define DESKTOP_ENUMERATE           0x0040L
#define DESKTOP_WRITEOBJECTS        0x0080L
#define DESKTOP_SWITCHDESKTOP       0x0100L

/*
 * Desktop-specific control flags
 */
#define DF_ALLOWOTHERACCOUNTHOOK    0x0001L

#ifdef _WINGDI_
#ifndef NOGDI

WINUSERAPI
HDESK
WINAPI
CreateDesktopA(
    __in LPCSTR lpszDesktop,
    __reserved LPCSTR lpszDevice,
    __reserved DEVMODEA* pDevmode,
    __in DWORD dwFlags,
    __in ACCESS_MASK dwDesiredAccess,
    __in_opt LPSECURITY_ATTRIBUTES lpsa);
WINUSERAPI
HDESK
WINAPI
CreateDesktopW(
    __in LPCWSTR lpszDesktop,
    __reserved LPCWSTR lpszDevice,
    __reserved DEVMODEW* pDevmode,
    __in DWORD dwFlags,
    __in ACCESS_MASK dwDesiredAccess,
    __in_opt LPSECURITY_ATTRIBUTES lpsa);
#ifdef UNICODE
#define CreateDesktop  CreateDesktopW
#else
#define CreateDesktop  CreateDesktopA
#endif // !UNICODE

WINUSERAPI
HDESK
WINAPI
CreateDesktopExA(
    __in LPCSTR lpszDesktop,
    __reserved LPCSTR lpszDevice,
    __reserved DEVMODEA* pDevmode,
    __in DWORD dwFlags,
    __in ACCESS_MASK dwDesiredAccess,
    __in_opt LPSECURITY_ATTRIBUTES lpsa,
    __in ULONG ulHeapSize,
    __reserved PVOID pvoid);
WINUSERAPI
HDESK
WINAPI
CreateDesktopExW(
    __in LPCWSTR lpszDesktop,
    __reserved LPCWSTR lpszDevice,
    __reserved DEVMODEW* pDevmode,
    __in DWORD dwFlags,
    __in ACCESS_MASK dwDesiredAccess,
    __in_opt LPSECURITY_ATTRIBUTES lpsa,
    __in ULONG ulHeapSize,
    __reserved PVOID pvoid);
#ifdef UNICODE
#define CreateDesktopEx  CreateDesktopExW
#else
#define CreateDesktopEx  CreateDesktopExA
#endif // !UNICODE

#endif /* NOGDI */
#endif /* _WINGDI_ */

WINUSERAPI
HDESK
WINAPI
OpenDesktopA(
    __in LPCSTR lpszDesktop,
    __in DWORD dwFlags,
    __in BOOL fInherit,
    __in ACCESS_MASK dwDesiredAccess);
WINUSERAPI
HDESK
WINAPI
OpenDesktopW(
    __in LPCWSTR lpszDesktop,
    __in DWORD dwFlags,
    __in BOOL fInherit,
    __in ACCESS_MASK dwDesiredAccess);
#ifdef UNICODE
#define OpenDesktop  OpenDesktopW
#else
#define OpenDesktop  OpenDesktopA
#endif // !UNICODE

WINUSERAPI
HDESK
WINAPI
OpenInputDesktop(
    __in DWORD dwFlags,
    __in BOOL fInherit,
    __in ACCESS_MASK dwDesiredAccess);


WINUSERAPI
BOOL
WINAPI
EnumDesktopsA(
    __in_opt HWINSTA hwinsta,
    __in DESKTOPENUMPROCA lpEnumFunc,
    __in LPARAM lParam);
WINUSERAPI
BOOL
WINAPI
EnumDesktopsW(
    __in_opt HWINSTA hwinsta,
    __in DESKTOPENUMPROCW lpEnumFunc,
    __in LPARAM lParam);
#ifdef UNICODE
#define EnumDesktops  EnumDesktopsW
#else
#define EnumDesktops  EnumDesktopsA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
EnumDesktopWindows(
    __in_opt HDESK hDesktop,
    __in WNDENUMPROC lpfn,
    __in LPARAM lParam);

WINUSERAPI
BOOL
WINAPI
SwitchDesktop(
    __in HDESK hDesktop);


WINUSERAPI
BOOL
WINAPI
SetThreadDesktop(
     __in HDESK hDesktop);

WINUSERAPI
BOOL
WINAPI
CloseDesktop(
    __in HDESK hDesktop);

WINUSERAPI
HDESK
WINAPI
GetThreadDesktop(
    __in DWORD dwThreadId);

#endif  /* !NODESKTOP */

#ifndef NOWINDOWSTATION
/*
 * Windowstation-specific access flags
 */
#define WINSTA_ENUMDESKTOPS         0x0001L
#define WINSTA_READATTRIBUTES       0x0002L
#define WINSTA_ACCESSCLIPBOARD      0x0004L
#define WINSTA_CREATEDESKTOP        0x0008L
#define WINSTA_WRITEATTRIBUTES      0x0010L
#define WINSTA_ACCESSGLOBALATOMS    0x0020L
#define WINSTA_EXITWINDOWS          0x0040L
#define WINSTA_ENUMERATE            0x0100L
#define WINSTA_READSCREEN           0x0200L

#define WINSTA_ALL_ACCESS           (WINSTA_ENUMDESKTOPS  | WINSTA_READATTRIBUTES  | WINSTA_ACCESSCLIPBOARD | \
                                     WINSTA_CREATEDESKTOP | WINSTA_WRITEATTRIBUTES | WINSTA_ACCESSGLOBALATOMS | \
                                     WINSTA_EXITWINDOWS   | WINSTA_ENUMERATE       | WINSTA_READSCREEN)

/*
 * Windowstation creation flags.
 */
#define CWF_CREATE_ONLY          0x00000001

/*
 * Windowstation-specific attribute flags
 */
#define WSF_VISIBLE                 0x0001L

WINUSERAPI
HWINSTA
WINAPI
CreateWindowStationA(
    __in_opt LPCSTR lpwinsta,
    __in DWORD dwFlags,
    __in ACCESS_MASK dwDesiredAccess,
    __in_opt LPSECURITY_ATTRIBUTES lpsa);
WINUSERAPI
HWINSTA
WINAPI
CreateWindowStationW(
    __in_opt LPCWSTR lpwinsta,
    __in DWORD dwFlags,
    __in ACCESS_MASK dwDesiredAccess,
    __in_opt LPSECURITY_ATTRIBUTES lpsa);
#ifdef UNICODE
#define CreateWindowStation  CreateWindowStationW
#else
#define CreateWindowStation  CreateWindowStationA
#endif // !UNICODE

WINUSERAPI
HWINSTA
WINAPI
OpenWindowStationA(
    __in LPCSTR lpszWinSta,
    __in BOOL fInherit,
    __in ACCESS_MASK dwDesiredAccess);
WINUSERAPI
HWINSTA
WINAPI
OpenWindowStationW(
    __in LPCWSTR lpszWinSta,
    __in BOOL fInherit,
    __in ACCESS_MASK dwDesiredAccess);
#ifdef UNICODE
#define OpenWindowStation  OpenWindowStationW
#else
#define OpenWindowStation  OpenWindowStationA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
EnumWindowStationsA(
    __in WINSTAENUMPROCA lpEnumFunc,
    __in LPARAM lParam);
WINUSERAPI
BOOL
WINAPI
EnumWindowStationsW(
    __in WINSTAENUMPROCW lpEnumFunc,
    __in LPARAM lParam);
#ifdef UNICODE
#define EnumWindowStations  EnumWindowStationsW
#else
#define EnumWindowStations  EnumWindowStationsA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
CloseWindowStation(
    __in HWINSTA hWinSta);

WINUSERAPI
BOOL
WINAPI
SetProcessWindowStation(
    __in HWINSTA hWinSta);

WINUSERAPI
HWINSTA
WINAPI
GetProcessWindowStation(
    VOID);
#endif  /* !NOWINDOWSTATION */

#ifndef NOSECURITY

WINUSERAPI
BOOL
WINAPI
SetUserObjectSecurity(
    __in HANDLE hObj,
    __in PSECURITY_INFORMATION pSIRequested,
    __in PSECURITY_DESCRIPTOR pSID);

WINUSERAPI
BOOL
WINAPI
GetUserObjectSecurity(
    __in HANDLE hObj,
    __in PSECURITY_INFORMATION pSIRequested,
    __out_bcount_opt(nLength) PSECURITY_DESCRIPTOR pSID,
    __in DWORD nLength,
    __out LPDWORD lpnLengthNeeded);

#define UOI_FLAGS       1
#define UOI_NAME        2
#define UOI_TYPE        3
#define UOI_USER_SID    4
#if(WINVER >= 0x0600)
#define UOI_HEAPSIZE    5
#define UOI_IO          6
#endif /* WINVER >= 0x0600 */

typedef struct tagUSEROBJECTFLAGS {
    BOOL fInherit;
    BOOL fReserved;
    DWORD dwFlags;
} USEROBJECTFLAGS, *PUSEROBJECTFLAGS;

WINUSERAPI
BOOL
WINAPI
GetUserObjectInformationA(
    __in HANDLE hObj,
    __in int nIndex,
    __out_bcount_opt(nLength) PVOID pvInfo,
    __in DWORD nLength,
    __out_opt LPDWORD lpnLengthNeeded);
WINUSERAPI
BOOL
WINAPI
GetUserObjectInformationW(
    __in HANDLE hObj,
    __in int nIndex,
    __out_bcount_opt(nLength) PVOID pvInfo,
    __in DWORD nLength,
    __out_opt LPDWORD lpnLengthNeeded);
#ifdef UNICODE
#define GetUserObjectInformation  GetUserObjectInformationW
#else
#define GetUserObjectInformation  GetUserObjectInformationA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
SetUserObjectInformationA(
    __in HANDLE hObj,
    __in int nIndex,
    __in_bcount(nLength) PVOID pvInfo,
    __in DWORD nLength);
WINUSERAPI
BOOL
WINAPI
SetUserObjectInformationW(
    __in HANDLE hObj,
    __in int nIndex,
    __in_bcount(nLength) PVOID pvInfo,
    __in DWORD nLength);
#ifdef UNICODE
#define SetUserObjectInformation  SetUserObjectInformationW
#else
#define SetUserObjectInformation  SetUserObjectInformationA
#endif // !UNICODE

#endif  /* !NOSECURITY */

#if(WINVER >= 0x0400)
typedef struct tagWNDCLASSEXA {
    UINT        cbSize;
    /* Win 3.x */
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCSTR      lpszMenuName;
    LPCSTR      lpszClassName;
    /* Win 4.0 */
    HICON       hIconSm;
} WNDCLASSEXA, *PWNDCLASSEXA, NEAR *NPWNDCLASSEXA, FAR *LPWNDCLASSEXA;
typedef struct tagWNDCLASSEXW {
    UINT        cbSize;
    /* Win 3.x */
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName;
    /* Win 4.0 */
    HICON       hIconSm;
} WNDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;
#ifdef UNICODE
typedef WNDCLASSEXW WNDCLASSEX;
typedef PWNDCLASSEXW PWNDCLASSEX;
typedef NPWNDCLASSEXW NPWNDCLASSEX;
typedef LPWNDCLASSEXW LPWNDCLASSEX;
#else
typedef WNDCLASSEXA WNDCLASSEX;
typedef PWNDCLASSEXA PWNDCLASSEX;
typedef NPWNDCLASSEXA NPWNDCLASSEX;
typedef LPWNDCLASSEXA LPWNDCLASSEX;
#endif // UNICODE
#endif /* WINVER >= 0x0400 */

typedef struct tagWNDCLASSA {
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCSTR      lpszMenuName;
    LPCSTR      lpszClassName;
} WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;
typedef struct tagWNDCLASSW {
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName;
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
#ifdef UNICODE
typedef WNDCLASSW WNDCLASS;
typedef PWNDCLASSW PWNDCLASS;
typedef NPWNDCLASSW NPWNDCLASS;
typedef LPWNDCLASSW LPWNDCLASS;
#else
typedef WNDCLASSA WNDCLASS;
typedef PWNDCLASSA PWNDCLASS;
typedef NPWNDCLASSA NPWNDCLASS;
typedef LPWNDCLASSA LPWNDCLASS;
#endif // UNICODE

WINUSERAPI
BOOL
WINAPI
IsHungAppWindow(
    __in HWND hwnd);


#if(WINVER >= 0x0501)
WINUSERAPI
VOID
WINAPI
DisableProcessWindowsGhosting(
    VOID);
#endif /* WINVER >= 0x0501 */


#ifndef NOMSG

/*
 * Message structure
 */
typedef struct tagMSG {
    HWND        hwnd;
    UINT        message;
    WPARAM      wParam;
    LPARAM      lParam;
    DWORD       time;
    POINT       pt;
#ifdef _MAC
    DWORD       lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;

#define POINTSTOPOINT(pt, pts)                          \
        { (pt).x = (LONG)(SHORT)LOWORD(*(LONG*)&pts);   \
          (pt).y = (LONG)(SHORT)HIWORD(*(LONG*)&pts); }

#define POINTTOPOINTS(pt)      (MAKELONG((short)((pt).x), (short)((pt).y)))
#define MAKEWPARAM(l, h)      ((WPARAM)(DWORD)MAKELONG(l, h))
#define MAKELPARAM(l, h)      ((LPARAM)(DWORD)MAKELONG(l, h))
#define MAKELRESULT(l, h)     ((LRESULT)(DWORD)MAKELONG(l, h))


#endif /* !NOMSG */

#ifndef NOWINOFFSETS

/*
 * Window field offsets for GetWindowLong()
 */
#define GWL_WNDPROC         (-4)
#define GWL_HINSTANCE       (-6)
#define GWL_HWNDPARENT      (-8)
#define GWL_STYLE           (-16)
#define GWL_EXSTYLE         (-20)
#define GWL_USERDATA        (-21)
#define GWL_ID              (-12)

#ifdef _WIN64

#undef GWL_WNDPROC
#undef GWL_HINSTANCE
#undef GWL_HWNDPARENT
#undef GWL_USERDATA

#endif /* _WIN64 */

#define GWLP_WNDPROC        (-4)
#define GWLP_HINSTANCE      (-6)
#define GWLP_HWNDPARENT     (-8)
#define GWLP_USERDATA       (-21)
#define GWLP_ID             (-12)

/*
 * Class field offsets for GetClassLong()
 */
#define GCL_MENUNAME        (-8)
#define GCL_HBRBACKGROUND   (-10)
#define GCL_HCURSOR         (-12)
#define GCL_HICON           (-14)
#define GCL_HMODULE         (-16)
#define GCL_CBWNDEXTRA      (-18)
#define GCL_CBCLSEXTRA      (-20)
#define GCL_WNDPROC         (-24)
#define GCL_STYLE           (-26)
#define GCW_ATOM            (-32)

#if(WINVER >= 0x0400)
#define GCL_HICONSM         (-34)
#endif /* WINVER >= 0x0400 */

#ifdef _WIN64

#undef GCL_MENUNAME
#undef GCL_HBRBACKGROUND
#undef GCL_HCURSOR
#undef GCL_HICON
#undef GCL_HMODULE
#undef GCL_WNDPROC
#undef GCL_HICONSM

#endif /* _WIN64 */

#define GCLP_MENUNAME       (-8)
#define GCLP_HBRBACKGROUND  (-10)
#define GCLP_HCURSOR        (-12)
#define GCLP_HICON          (-14)
#define GCLP_HMODULE        (-16)
#define GCLP_WNDPROC        (-24)
#define GCLP_HICONSM        (-34)

#endif /* !NOWINOFFSETS */

#ifndef NOWINMESSAGES


/*
 * Window Messages
 */

#define WM_NULL                         0x0000
#define WM_CREATE                       0x0001
#define WM_DESTROY                      0x0002
#define WM_MOVE                         0x0003
#define WM_SIZE                         0x0005

#define WM_ACTIVATE                     0x0006
/*
 * WM_ACTIVATE state values
 */
#define     WA_INACTIVE     0
#define     WA_ACTIVE       1
#define     WA_CLICKACTIVE  2

#define WM_SETFOCUS                     0x0007
#define WM_KILLFOCUS                    0x0008
#define WM_ENABLE                       0x000A
#define WM_SETREDRAW                    0x000B
#define WM_SETTEXT                      0x000C
#define WM_GETTEXT                      0x000D
#define WM_GETTEXTLENGTH                0x000E
#define WM_PAINT                        0x000F
#define WM_CLOSE                        0x0010
#ifndef _WIN32_WCE
#define WM_QUERYENDSESSION              0x0011
#define WM_QUERYOPEN                    0x0013
#define WM_ENDSESSION                   0x0016
#endif
#define WM_QUIT                         0x0012
#define WM_ERASEBKGND                   0x0014
#define WM_SYSCOLORCHANGE               0x0015
#define WM_SHOWWINDOW                   0x0018
#define WM_WININICHANGE                 0x001A
#if(WINVER >= 0x0400)
#define WM_SETTINGCHANGE                WM_WININICHANGE
#endif /* WINVER >= 0x0400 */


#define WM_DEVMODECHANGE                0x001B
#define WM_ACTIVATEAPP                  0x001C
#define WM_FONTCHANGE                   0x001D
#define WM_TIMECHANGE                   0x001E
#define WM_CANCELMODE                   0x001F
#define WM_SETCURSOR                    0x0020
#define WM_MOUSEACTIVATE                0x0021
#define WM_CHILDACTIVATE                0x0022
#define WM_QUEUESYNC                    0x0023

#define WM_GETMINMAXINFO                0x0024
/*
 * Struct pointed to by WM_GETMINMAXINFO lParam
 */
typedef struct tagMINMAXINFO {
    POINT ptReserved;
    POINT ptMaxSize;
    POINT ptMaxPosition;
    POINT ptMinTrackSize;
    POINT ptMaxTrackSize;
} MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;

#define WM_PAINTICON                    0x0026
#define WM_ICONERASEBKGND               0x0027
#define WM_NEXTDLGCTL                   0x0028
#define WM_SPOOLERSTATUS                0x002A
#define WM_DRAWITEM                     0x002B
#define WM_MEASUREITEM                  0x002C
#define WM_DELETEITEM                   0x002D
#define WM_VKEYTOITEM                   0x002E
#define WM_CHARTOITEM                   0x002F
#define WM_SETFONT                      0x0030
#define WM_GETFONT                      0x0031
#define WM_SETHOTKEY                    0x0032
#define WM_GETHOTKEY                    0x0033
#define WM_QUERYDRAGICON                0x0037
#define WM_COMPAREITEM                  0x0039
#if(WINVER >= 0x0500)
#ifndef _WIN32_WCE
#define WM_GETOBJECT                    0x003D
#endif
#endif /* WINVER >= 0x0500 */
#define WM_COMPACTING                   0x0041
#define WM_COMMNOTIFY                   0x0044  /* no longer suported */
#define WM_WINDOWPOSCHANGING            0x0046
#define WM_WINDOWPOSCHANGED             0x0047

#define WM_POWER                        0x0048
/*
 * wParam for WM_POWER window message and DRV_POWER driver notification
 */
#define PWR_OK              1
#define PWR_FAIL            (-1)
#define PWR_SUSPENDREQUEST  1
#define PWR_SUSPENDRESUME   2
#define PWR_CRITICALRESUME  3

#define WM_COPYDATA                     0x004A
#define WM_CANCELJOURNAL                0x004B


/*
 * lParam of WM_COPYDATA message points to...
 */
typedef struct tagCOPYDATASTRUCT {
    ULONG_PTR dwData;
    DWORD cbData;
    __field_bcount(cbData) PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;

#if(WINVER >= 0x0400)
typedef struct tagMDINEXTMENU
{
    HMENU   hmenuIn;
    HMENU   hmenuNext;
    HWND    hwndNext;
} MDINEXTMENU, * PMDINEXTMENU, FAR * LPMDINEXTMENU;
#endif /* WINVER >= 0x0400 */


#if(WINVER >= 0x0400)
#define WM_NOTIFY                       0x004E
#define WM_INPUTLANGCHANGEREQUEST       0x0050
#define WM_INPUTLANGCHANGE              0x0051
#define WM_TCARD                        0x0052
#define WM_HELP                         0x0053
#define WM_USERCHANGED                  0x0054
#define WM_NOTIFYFORMAT                 0x0055

#define NFR_ANSI                             1
#define NFR_UNICODE                          2
#define NF_QUERY                             3
#define NF_REQUERY                           4

#define WM_CONTEXTMENU                  0x007B
#define WM_STYLECHANGING                0x007C
#define WM_STYLECHANGED                 0x007D
#define WM_DISPLAYCHANGE                0x007E
#define WM_GETICON                      0x007F
#define WM_SETICON                      0x0080
#endif /* WINVER >= 0x0400 */

#define WM_NCCREATE                     0x0081
#define WM_NCDESTROY                    0x0082
#define WM_NCCALCSIZE                   0x0083
#define WM_NCHITTEST                    0x0084
#define WM_NCPAINT                      0x0085
#define WM_NCACTIVATE                   0x0086
#define WM_GETDLGCODE                   0x0087
#ifndef _WIN32_WCE
#define WM_SYNCPAINT                    0x0088
#endif
#define WM_NCMOUSEMOVE                  0x00A0
#define WM_NCLBUTTONDOWN                0x00A1
#define WM_NCLBUTTONUP                  0x00A2
#define WM_NCLBUTTONDBLCLK              0x00A3
#define WM_NCRBUTTONDOWN                0x00A4
#define WM_NCRBUTTONUP                  0x00A5
#define WM_NCRBUTTONDBLCLK              0x00A6
#define WM_NCMBUTTONDOWN                0x00A7
#define WM_NCMBUTTONUP                  0x00A8
#define WM_NCMBUTTONDBLCLK              0x00A9



#if(_WIN32_WINNT >= 0x0500)
#define WM_NCXBUTTONDOWN                0x00AB
#define WM_NCXBUTTONUP                  0x00AC
#define WM_NCXBUTTONDBLCLK              0x00AD
#endif /* _WIN32_WINNT >= 0x0500 */


#if(_WIN32_WINNT >= 0x0501)
#define WM_INPUT_DEVICE_CHANGE          0x00FE
#endif /* _WIN32_WINNT >= 0x0501 */

#if(_WIN32_WINNT >= 0x0501)
#define WM_INPUT                        0x00FF
#endif /* _WIN32_WINNT >= 0x0501 */

#define WM_KEYFIRST                     0x0100
#define WM_KEYDOWN                      0x0100
#define WM_KEYUP                        0x0101
#define WM_CHAR                         0x0102
#define WM_DEADCHAR                     0x0103
#define WM_SYSKEYDOWN                   0x0104
#define WM_SYSKEYUP                     0x0105
#define WM_SYSCHAR                      0x0106
#define WM_SYSDEADCHAR                  0x0107
#if(_WIN32_WINNT >= 0x0501)
#define WM_UNICHAR                      0x0109
#define WM_KEYLAST                      0x0109
#define UNICODE_NOCHAR                  0xFFFF
#else
#define WM_KEYLAST                      0x0108
#endif /* _WIN32_WINNT >= 0x0501 */

#if(WINVER >= 0x0400)
#define WM_IME_STARTCOMPOSITION         0x010D
#define WM_IME_ENDCOMPOSITION           0x010E
#define WM_IME_COMPOSITION              0x010F
#define WM_IME_KEYLAST                  0x010F
#endif /* WINVER >= 0x0400 */

#define WM_INITDIALOG                   0x0110
#define WM_COMMAND                      0x0111
#define WM_SYSCOMMAND                   0x0112
#define WM_TIMER                        0x0113
#define WM_HSCROLL                      0x0114
#define WM_VSCROLL                      0x0115
#define WM_INITMENU                     0x0116
#define WM_INITMENUPOPUP                0x0117
#if(WINVER >= 0x0601)
#define WM_GESTURE                      0x0119
#define WM_GESTURENOTIFY                0x011A
#endif /* WINVER >= 0x0601 */
#define WM_MENUSELECT                   0x011F
#define WM_MENUCHAR                     0x0120
#define WM_ENTERIDLE                    0x0121
#if(WINVER >= 0x0500)
#ifndef _WIN32_WCE
#define WM_MENURBUTTONUP                0x0122
#define WM_MENUDRAG                     0x0123
#define WM_MENUGETOBJECT                0x0124
#define WM_UNINITMENUPOPUP              0x0125
#define WM_MENUCOMMAND                  0x0126

#ifndef _WIN32_WCE
#if(_WIN32_WINNT >= 0x0500)
#define WM_CHANGEUISTATE                0x0127
#define WM_UPDATEUISTATE                0x0128
#define WM_QUERYUISTATE                 0x0129

/*
 * LOWORD(wParam) values in WM_*UISTATE*
 */
#define UIS_SET                         1
#define UIS_CLEAR                       2
#define UIS_INITIALIZE                  3

/*
 * HIWORD(wParam) values in WM_*UISTATE*
 */
#define UISF_HIDEFOCUS                  0x1
#define UISF_HIDEACCEL                  0x2
#if(_WIN32_WINNT >= 0x0501)
#define UISF_ACTIVE                     0x4
#endif /* _WIN32_WINNT >= 0x0501 */
#endif /* _WIN32_WINNT >= 0x0500 */
#endif

#endif
#endif /* WINVER >= 0x0500 */

#define WM_CTLCOLORMSGBOX               0x0132
#define WM_CTLCOLOREDIT                 0x0133
#define WM_CTLCOLORLISTBOX              0x0134
#define WM_CTLCOLORBTN                  0x0135
#define WM_CTLCOLORDLG                  0x0136
#define WM_CTLCOLORSCROLLBAR            0x0137
#define WM_CTLCOLORSTATIC               0x0138
#define MN_GETHMENU                     0x01E1

#define WM_MOUSEFIRST                   0x0200
#define WM_MOUSEMOVE                    0x0200
#define WM_LBUTTONDOWN                  0x0201
#define WM_LBUTTONUP                    0x0202
#define WM_LBUTTONDBLCLK                0x0203
#define WM_RBUTTONDOWN                  0x0204
#define WM_RBUTTONUP                    0x0205
#define WM_RBUTTONDBLCLK                0x0206
#define WM_MBUTTONDOWN                  0x0207
#define WM_MBUTTONUP                    0x0208
#define WM_MBUTTONDBLCLK                0x0209
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSEWHEEL                   0x020A
#endif
#if (_WIN32_WINNT >= 0x0500)
#define WM_XBUTTONDOWN                  0x020B
#define WM_XBUTTONUP                    0x020C
#define WM_XBUTTONDBLCLK                0x020D
#endif
#if (_WIN32_WINNT >= 0x0600)
#define WM_MOUSEHWHEEL                  0x020E
#endif

#if (_WIN32_WINNT >= 0x0600)
#define WM_MOUSELAST                    0x020E
#elif (_WIN32_WINNT >= 0x0500)
#define WM_MOUSELAST                    0x020D
#elif (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define WM_MOUSELAST                    0x020A
#else
#define WM_MOUSELAST                    0x0209
#endif /* (_WIN32_WINNT >= 0x0600) */


#if(_WIN32_WINNT >= 0x0400)
/* Value for rolling one detent */
#define WHEEL_DELTA                     120
#define GET_WHEEL_DELTA_WPARAM(wParam)  ((short)HIWORD(wParam))

/* Setting to scroll one page for SPI_GET/SETWHEELSCROLLLINES */
#define WHEEL_PAGESCROLL                (UINT_MAX)
#endif /* _WIN32_WINNT >= 0x0400 */

#if(_WIN32_WINNT >= 0x0500)
#define GET_KEYSTATE_WPARAM(wParam)     (LOWORD(wParam))
#define GET_NCHITTEST_WPARAM(wParam)    ((short)LOWORD(wParam))
#define GET_XBUTTON_WPARAM(wParam)      (HIWORD(wParam))

/* XButton values are WORD flags */
#define XBUTTON1      0x0001
#define XBUTTON2      0x0002
/* Were there to be an XBUTTON3, its value would be 0x0004 */
#endif /* _WIN32_WINNT >= 0x0500 */

#define WM_PARENTNOTIFY                 0x0210
#define WM_ENTERMENULOOP                0x0211
#define WM_EXITMENULOOP                 0x0212

#if(WINVER >= 0x0400)
#define WM_NEXTMENU                     0x0213
#define WM_SIZING                       0x0214
#define WM_CAPTURECHANGED               0x0215
#define WM_MOVING                       0x0216
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0400)


#define WM_POWERBROADCAST               0x0218

#ifndef _WIN32_WCE
#define PBT_APMQUERYSUSPEND             0x0000
#define PBT_APMQUERYSTANDBY             0x0001

#define PBT_APMQUERYSUSPENDFAILED       0x0002
#define PBT_APMQUERYSTANDBYFAILED       0x0003

#define PBT_APMSUSPEND                  0x0004
#define PBT_APMSTANDBY                  0x0005

#define PBT_APMRESUMECRITICAL           0x0006
#define PBT_APMRESUMESUSPEND            0x0007
#define PBT_APMRESUMESTANDBY            0x0008

#define PBTF_APMRESUMEFROMFAILURE       0x00000001

#define PBT_APMBATTERYLOW               0x0009
#define PBT_APMPOWERSTATUSCHANGE        0x000A

#define PBT_APMOEMEVENT                 0x000B


#define PBT_APMRESUMEAUTOMATIC          0x0012
#if (_WIN32_WINNT >= 0x0502)
#ifndef PBT_POWERSETTINGCHANGE
#define PBT_POWERSETTINGCHANGE          0x8013
typedef struct {
    GUID PowerSetting;
    DWORD DataLength;
    UCHAR Data[1];
} POWERBROADCAST_SETTING, *PPOWERBROADCAST_SETTING;


#endif // PBT_POWERSETTINGCHANGE

#endif // (_WIN32_WINNT >= 0x0502)
#endif

#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0400)
#define WM_DEVICECHANGE                 0x0219
#endif /* WINVER >= 0x0400 */

#define WM_MDICREATE                    0x0220
#define WM_MDIDESTROY                   0x0221
#define WM_MDIACTIVATE                  0x0222
#define WM_MDIRESTORE                   0x0223
#define WM_MDINEXT                      0x0224
#define WM_MDIMAXIMIZE                  0x0225
#define WM_MDITILE                      0x0226
#define WM_MDICASCADE                   0x0227
#define WM_MDIICONARRANGE               0x0228
#define WM_MDIGETACTIVE                 0x0229


#define WM_MDISETMENU                   0x0230
#define WM_ENTERSIZEMOVE                0x0231
#define WM_EXITSIZEMOVE                 0x0232
#define WM_DROPFILES                    0x0233
#define WM_MDIREFRESHMENU               0x0234

#if(WINVER >= 0x0601)
#define WM_TOUCH                        0x0240
#endif /* WINVER >= 0x0601 */


#if(WINVER >= 0x0400)
#define WM_IME_SETCONTEXT               0x0281
#define WM_IME_NOTIFY                   0x0282
#define WM_IME_CONTROL                  0x0283
#define WM_IME_COMPOSITIONFULL          0x0284
#define WM_IME_SELECT                   0x0285
#define WM_IME_CHAR                     0x0286
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0500)
#define WM_IME_REQUEST                  0x0288
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0400)
#define WM_IME_KEYDOWN                  0x0290
#define WM_IME_KEYUP                    0x0291
#endif /* WINVER >= 0x0400 */

#if((_WIN32_WINNT >= 0x0400) || (WINVER >= 0x0500))
#define WM_MOUSEHOVER                   0x02A1
#define WM_MOUSELEAVE                   0x02A3
#endif
#if(WINVER >= 0x0500)
#define WM_NCMOUSEHOVER                 0x02A0
#define WM_NCMOUSELEAVE                 0x02A2
#endif /* WINVER >= 0x0500 */

#if(_WIN32_WINNT >= 0x0501)
#define WM_WTSSESSION_CHANGE            0x02B1

#define WM_TABLET_FIRST                 0x02c0
#define WM_TABLET_LAST                  0x02df
#endif /* _WIN32_WINNT >= 0x0501 */

#define WM_CUT                          0x0300
#define WM_COPY                         0x0301
#define WM_PASTE                        0x0302
#define WM_CLEAR                        0x0303
#define WM_UNDO                         0x0304
#define WM_RENDERFORMAT                 0x0305
#define WM_RENDERALLFORMATS             0x0306
#define WM_DESTROYCLIPBOARD             0x0307
#define WM_DRAWCLIPBOARD                0x0308
#define WM_PAINTCLIPBOARD               0x0309
#define WM_VSCROLLCLIPBOARD             0x030A
#define WM_SIZECLIPBOARD                0x030B
#define WM_ASKCBFORMATNAME              0x030C
#define WM_CHANGECBCHAIN                0x030D
#define WM_HSCROLLCLIPBOARD             0x030E
#define WM_QUERYNEWPALETTE              0x030F
#define WM_PALETTEISCHANGING            0x0310
#define WM_PALETTECHANGED               0x0311
#define WM_HOTKEY                       0x0312

#if(WINVER >= 0x0400)
#define WM_PRINT                        0x0317
#define WM_PRINTCLIENT                  0x0318
#endif /* WINVER >= 0x0400 */

#if(_WIN32_WINNT >= 0x0500)
#define WM_APPCOMMAND                   0x0319
#endif /* _WIN32_WINNT >= 0x0500 */

#if(_WIN32_WINNT >= 0x0501)
#define WM_THEMECHANGED                 0x031A
#endif /* _WIN32_WINNT >= 0x0501 */


#if(_WIN32_WINNT >= 0x0501)
#define WM_CLIPBOARDUPDATE              0x031D
#endif /* _WIN32_WINNT >= 0x0501 */

#if(_WIN32_WINNT >= 0x0600)
#define WM_DWMCOMPOSITIONCHANGED        0x031E
#define WM_DWMNCRENDERINGCHANGED        0x031F
#define WM_DWMCOLORIZATIONCOLORCHANGED  0x0320
#define WM_DWMWINDOWMAXIMIZEDCHANGE     0x0321
#endif /* _WIN32_WINNT >= 0x0600 */

#if(_WIN32_WINNT >= 0x0601)
#define WM_DWMSENDICONICTHUMBNAIL           0x0323
#define WM_DWMSENDICONICLIVEPREVIEWBITMAP   0x0326
#endif /* _WIN32_WINNT >= 0x0601 */


#if(WINVER >= 0x0600)
#define WM_GETTITLEBARINFOEX            0x033F
#endif /* WINVER >= 0x0600 */

#if(WINVER >= 0x0400)

#define WM_HANDHELDFIRST                0x0358
#define WM_HANDHELDLAST                 0x035F

#define WM_AFXFIRST                     0x0360
#define WM_AFXLAST                      0x037F
#endif /* WINVER >= 0x0400 */

#define WM_PENWINFIRST                  0x0380
#define WM_PENWINLAST                   0x038F


#if(WINVER >= 0x0400)
#define WM_APP                          0x8000
#endif /* WINVER >= 0x0400 */


/*
 * NOTE: All Message Numbers below 0x0400 are RESERVED.
 *
 * Private Window Messages Start Here:
 */
#define WM_USER                         0x0400

#if(WINVER >= 0x0400)

/*  wParam for WM_SIZING message  */
#define WMSZ_LEFT           1
#define WMSZ_RIGHT          2
#define WMSZ_TOP            3
#define WMSZ_TOPLEFT        4
#define WMSZ_TOPRIGHT       5
#define WMSZ_BOTTOM         6
#define WMSZ_BOTTOMLEFT     7
#define WMSZ_BOTTOMRIGHT    8
#endif /* WINVER >= 0x0400 */

#ifndef NONCMESSAGES

/*
 * WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
 */
#define HTERROR             (-2)
#define HTTRANSPARENT       (-1)
#define HTNOWHERE           0
#define HTCLIENT            1
#define HTCAPTION           2
#define HTSYSMENU           3
#define HTGROWBOX           4
#define HTSIZE              HTGROWBOX
#define HTMENU              5
#define HTHSCROLL           6
#define HTVSCROLL           7
#define HTMINBUTTON         8
#define HTMAXBUTTON         9
#define HTLEFT              10
#define HTRIGHT             11
#define HTTOP               12
#define HTTOPLEFT           13
#define HTTOPRIGHT          14
#define HTBOTTOM            15
#define HTBOTTOMLEFT        16
#define HTBOTTOMRIGHT       17
#define HTBORDER            18
#define HTREDUCE            HTMINBUTTON
#define HTZOOM              HTMAXBUTTON
#define HTSIZEFIRST         HTLEFT
#define HTSIZELAST          HTBOTTOMRIGHT
#if(WINVER >= 0x0400)
#define HTOBJECT            19
#define HTCLOSE             20
#define HTHELP              21
#endif /* WINVER >= 0x0400 */


/*
 * SendMessageTimeout values
 */
#define SMTO_NORMAL         0x0000
#define SMTO_BLOCK          0x0001
#define SMTO_ABORTIFHUNG    0x0002
#if(WINVER >= 0x0500)
#define SMTO_NOTIMEOUTIFNOTHUNG 0x0008
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0600)
#define SMTO_ERRORONEXIT    0x0020
#endif /* WINVER >= 0x0600 */

#endif /* !NONCMESSAGES */

/*
 * WM_MOUSEACTIVATE Return Codes
 */
#define MA_ACTIVATE         1
#define MA_ACTIVATEANDEAT   2
#define MA_NOACTIVATE       3
#define MA_NOACTIVATEANDEAT 4

/*
 * WM_SETICON / WM_GETICON Type Codes
 */
#define ICON_SMALL          0
#define ICON_BIG            1
#if(_WIN32_WINNT >= 0x0501)
#define ICON_SMALL2         2
#endif /* _WIN32_WINNT >= 0x0501 */


WINUSERAPI
UINT
WINAPI
RegisterWindowMessageA(
    __in LPCSTR lpString);
WINUSERAPI
UINT
WINAPI
RegisterWindowMessageW(
    __in LPCWSTR lpString);
#ifdef UNICODE
#define RegisterWindowMessage  RegisterWindowMessageW
#else
#define RegisterWindowMessage  RegisterWindowMessageA
#endif // !UNICODE


/*
 * WM_SIZE message wParam values
 */
#define SIZE_RESTORED       0
#define SIZE_MINIMIZED      1
#define SIZE_MAXIMIZED      2
#define SIZE_MAXSHOW        3
#define SIZE_MAXHIDE        4

/*
 * Obsolete constant names
 */
#define SIZENORMAL          SIZE_RESTORED
#define SIZEICONIC          SIZE_MINIMIZED
#define SIZEFULLSCREEN      SIZE_MAXIMIZED
#define SIZEZOOMSHOW        SIZE_MAXSHOW
#define SIZEZOOMHIDE        SIZE_MAXHIDE

/*
 * WM_WINDOWPOSCHANGING/CHANGED struct pointed to by lParam
 */
typedef struct tagWINDOWPOS {
    HWND    hwnd;
    HWND    hwndInsertAfter;
    int     x;
    int     y;
    int     cx;
    int     cy;
    UINT    flags;
} WINDOWPOS, *LPWINDOWPOS, *PWINDOWPOS;

/*
 * WM_NCCALCSIZE parameter structure
 */
typedef struct tagNCCALCSIZE_PARAMS {
    RECT       rgrc[3];
    PWINDOWPOS lppos;
} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;

/*
 * WM_NCCALCSIZE "window valid rect" return values
 */
#define WVR_ALIGNTOP        0x0010
#define WVR_ALIGNLEFT       0x0020
#define WVR_ALIGNBOTTOM     0x0040
#define WVR_ALIGNRIGHT      0x0080
#define WVR_HREDRAW         0x0100
#define WVR_VREDRAW         0x0200
#define WVR_REDRAW         (WVR_HREDRAW | \
                            WVR_VREDRAW)
#define WVR_VALIDRECTS      0x0400


#ifndef NOKEYSTATES

/*
 * Key State Masks for Mouse Messages
 */
#define MK_LBUTTON          0x0001
#define MK_RBUTTON          0x0002
#define MK_SHIFT            0x0004
#define MK_CONTROL          0x0008
#define MK_MBUTTON          0x0010
#if(_WIN32_WINNT >= 0x0500)
#define MK_XBUTTON1         0x0020
#define MK_XBUTTON2         0x0040
#endif /* _WIN32_WINNT >= 0x0500 */

#endif /* !NOKEYSTATES */


#if(_WIN32_WINNT >= 0x0400)
#ifndef NOTRACKMOUSEEVENT

#define TME_HOVER       0x00000001
#define TME_LEAVE       0x00000002
#if(WINVER >= 0x0500)
#define TME_NONCLIENT   0x00000010
#endif /* WINVER >= 0x0500 */
#define TME_QUERY       0x40000000
#define TME_CANCEL      0x80000000


#define HOVER_DEFAULT   0xFFFFFFFF
#endif /* _WIN32_WINNT >= 0x0400 */

#if(_WIN32_WINNT >= 0x0400)
typedef struct tagTRACKMOUSEEVENT {
    DWORD cbSize;
    DWORD dwFlags;
    HWND  hwndTrack;
    DWORD dwHoverTime;
} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;

WINUSERAPI
BOOL
WINAPI
TrackMouseEvent(
    __inout LPTRACKMOUSEEVENT lpEventTrack);
#endif /* _WIN32_WINNT >= 0x0400 */

#if(_WIN32_WINNT >= 0x0400)

#endif /* !NOTRACKMOUSEEVENT */
#endif /* _WIN32_WINNT >= 0x0400 */


#endif /* !NOWINMESSAGES */

#ifndef NOWINSTYLES


/*
 * Window Styles
 */
#define WS_OVERLAPPED       0x00000000L
#define WS_POPUP            0x80000000L
#define WS_CHILD            0x40000000L
#define WS_MINIMIZE         0x20000000L
#define WS_VISIBLE          0x10000000L
#define WS_DISABLED         0x08000000L
#define WS_CLIPSIBLINGS     0x04000000L
#define WS_CLIPCHILDREN     0x02000000L
#define WS_MAXIMIZE         0x01000000L
#define WS_CAPTION          0x00C00000L     /* WS_BORDER | WS_DLGFRAME  */
#define WS_BORDER           0x00800000L
#define WS_DLGFRAME         0x00400000L
#define WS_VSCROLL          0x00200000L
#define WS_HSCROLL          0x00100000L
#define WS_SYSMENU          0x00080000L
#define WS_THICKFRAME       0x00040000L
#define WS_GROUP            0x00020000L
#define WS_TABSTOP          0x00010000L

#define WS_MINIMIZEBOX      0x00020000L
#define WS_MAXIMIZEBOX      0x00010000L


#define WS_TILED            WS_OVERLAPPED
#define WS_ICONIC           WS_MINIMIZE
#define WS_SIZEBOX          WS_THICKFRAME
#define WS_TILEDWINDOW      WS_OVERLAPPEDWINDOW

/*
 * Common Window Styles
 */
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED     | \
                             WS_CAPTION        | \
                             WS_SYSMENU        | \
                             WS_THICKFRAME     | \
                             WS_MINIMIZEBOX    | \
                             WS_MAXIMIZEBOX)

#define WS_POPUPWINDOW      (WS_POPUP          | \
                             WS_BORDER         | \
                             WS_SYSMENU)

#define WS_CHILDWINDOW      (WS_CHILD)

/*
 * Extended Window Styles
 */
#define WS_EX_DLGMODALFRAME     0x00000001L
#define WS_EX_NOPARENTNOTIFY    0x00000004L
#define WS_EX_TOPMOST           0x00000008L
#define WS_EX_ACCEPTFILES       0x00000010L
#define WS_EX_TRANSPARENT       0x00000020L
#if(WINVER >= 0x0400)
#define WS_EX_MDICHILD          0x00000040L
#define WS_EX_TOOLWINDOW        0x00000080L
#define WS_EX_WINDOWEDGE        0x00000100L
#define WS_EX_CLIENTEDGE        0x00000200L
#define WS_EX_CONTEXTHELP       0x00000400L

#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0400)

#define WS_EX_RIGHT             0x00001000L
#define WS_EX_LEFT              0x00000000L
#define WS_EX_RTLREADING        0x00002000L
#define WS_EX_LTRREADING        0x00000000L
#define WS_EX_LEFTSCROLLBAR     0x00004000L
#define WS_EX_RIGHTSCROLLBAR    0x00000000L

#define WS_EX_CONTROLPARENT     0x00010000L
#define WS_EX_STATICEDGE        0x00020000L
#define WS_EX_APPWINDOW         0x00040000L


#define WS_EX_OVERLAPPEDWINDOW  (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)
#define WS_EX_PALETTEWINDOW     (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)

#endif /* WINVER >= 0x0400 */

#if(_WIN32_WINNT >= 0x0500)
#define WS_EX_LAYERED           0x00080000

#endif /* _WIN32_WINNT >= 0x0500 */


#if(WINVER >= 0x0500)
#define WS_EX_NOINHERITLAYOUT   0x00100000L // Disable inheritence of mirroring by children
#define WS_EX_LAYOUTRTL         0x00400000L // Right to left mirroring
#endif /* WINVER >= 0x0500 */

#if(_WIN32_WINNT >= 0x0501)
#define WS_EX_COMPOSITED        0x02000000L
#endif /* _WIN32_WINNT >= 0x0501 */
#if(_WIN32_WINNT >= 0x0500)
#define WS_EX_NOACTIVATE        0x08000000L
#endif /* _WIN32_WINNT >= 0x0500 */


/*
 * Class styles
 */
#define CS_VREDRAW          0x0001
#define CS_HREDRAW          0x0002
#define CS_DBLCLKS          0x0008
#define CS_OWNDC            0x0020
#define CS_CLASSDC          0x0040
#define CS_PARENTDC         0x0080
#define CS_NOCLOSE          0x0200
#define CS_SAVEBITS         0x0800
#define CS_BYTEALIGNCLIENT  0x1000
#define CS_BYTEALIGNWINDOW  0x2000
#define CS_GLOBALCLASS      0x4000

#define CS_IME              0x00010000
#if(_WIN32_WINNT >= 0x0501)
#define CS_DROPSHADOW       0x00020000
#endif /* _WIN32_WINNT >= 0x0501 */



#endif /* !NOWINSTYLES */
#if(WINVER >= 0x0400)
/* WM_PRINT flags */
#define PRF_CHECKVISIBLE    0x00000001L
#define PRF_NONCLIENT       0x00000002L
#define PRF_CLIENT          0x00000004L
#define PRF_ERASEBKGND      0x00000008L
#define PRF_CHILDREN        0x00000010L
#define PRF_OWNED           0x00000020L

/* 3D border styles */
#define BDR_RAISEDOUTER 0x0001
#define BDR_SUNKENOUTER 0x0002
#define BDR_RAISEDINNER 0x0004
#define BDR_SUNKENINNER 0x0008

#define BDR_OUTER       (BDR_RAISEDOUTER | BDR_SUNKENOUTER)
#define BDR_INNER       (BDR_RAISEDINNER | BDR_SUNKENINNER)
#define BDR_RAISED      (BDR_RAISEDOUTER | BDR_RAISEDINNER)
#define BDR_SUNKEN      (BDR_SUNKENOUTER | BDR_SUNKENINNER)


#define EDGE_RAISED     (BDR_RAISEDOUTER | BDR_RAISEDINNER)
#define EDGE_SUNKEN     (BDR_SUNKENOUTER | BDR_SUNKENINNER)
#define EDGE_ETCHED     (BDR_SUNKENOUTER | BDR_RAISEDINNER)
#define EDGE_BUMP       (BDR_RAISEDOUTER | BDR_SUNKENINNER)

/* Border flags */
#define BF_LEFT         0x0001
#define BF_TOP          0x0002
#define BF_RIGHT        0x0004
#define BF_BOTTOM       0x0008

#define BF_TOPLEFT      (BF_TOP | BF_LEFT)
#define BF_TOPRIGHT     (BF_TOP | BF_RIGHT)
#define BF_BOTTOMLEFT   (BF_BOTTOM | BF_LEFT)
#define BF_BOTTOMRIGHT  (BF_BOTTOM | BF_RIGHT)
#define BF_RECT         (BF_LEFT | BF_TOP | BF_RIGHT | BF_BOTTOM)

#define BF_DIAGONAL     0x0010

// For diagonal lines, the BF_RECT flags specify the end point of the
// vector bounded by the rectangle parameter.
#define BF_DIAGONAL_ENDTOPRIGHT     (BF_DIAGONAL | BF_TOP | BF_RIGHT)
#define BF_DIAGONAL_ENDTOPLEFT      (BF_DIAGONAL | BF_TOP | BF_LEFT)
#define BF_DIAGONAL_ENDBOTTOMLEFT   (BF_DIAGONAL | BF_BOTTOM | BF_LEFT)
#define BF_DIAGONAL_ENDBOTTOMRIGHT  (BF_DIAGONAL | BF_BOTTOM | BF_RIGHT)


#define BF_MIDDLE       0x0800  /* Fill in the middle */
#define BF_SOFT         0x1000  /* For softer buttons */
#define BF_ADJUST       0x2000  /* Calculate the space left over */
#define BF_FLAT         0x4000  /* For flat rather than 3D borders */
#define BF_MONO         0x8000  /* For monochrome borders */


WINUSERAPI
BOOL
WINAPI
DrawEdge(
    __in HDC hdc,
    __inout LPRECT qrc,
    __in UINT edge,
    __in UINT grfFlags);

/* flags for DrawFrameControl */

#define DFC_CAPTION             1
#define DFC_MENU                2
#define DFC_SCROLL              3
#define DFC_BUTTON              4
#if(WINVER >= 0x0500)
#define DFC_POPUPMENU           5
#endif /* WINVER >= 0x0500 */

#define DFCS_CAPTIONCLOSE       0x0000
#define DFCS_CAPTIONMIN         0x0001
#define DFCS_CAPTIONMAX         0x0002
#define DFCS_CAPTIONRESTORE     0x0003
#define DFCS_CAPTIONHELP        0x0004

#define DFCS_MENUARROW          0x0000
#define DFCS_MENUCHECK          0x0001
#define DFCS_MENUBULLET         0x0002
#define DFCS_MENUARROWRIGHT     0x0004
#define DFCS_SCROLLUP           0x0000
#define DFCS_SCROLLDOWN         0x0001
#define DFCS_SCROLLLEFT         0x0002
#define DFCS_SCROLLRIGHT        0x0003
#define DFCS_SCROLLCOMBOBOX     0x0005
#define DFCS_SCROLLSIZEGRIP     0x0008
#define DFCS_SCROLLSIZEGRIPRIGHT 0x0010

#define DFCS_BUTTONCHECK        0x0000
#define DFCS_BUTTONRADIOIMAGE   0x0001
#define DFCS_BUTTONRADIOMASK    0x0002
#define DFCS_BUTTONRADIO        0x0004
#define DFCS_BUTTON3STATE       0x0008
#define DFCS_BUTTONPUSH         0x0010

#define DFCS_INACTIVE           0x0100
#define DFCS_PUSHED             0x0200
#define DFCS_CHECKED            0x0400

#if(WINVER >= 0x0500)
#define DFCS_TRANSPARENT        0x0800
#define DFCS_HOT                0x1000
#endif /* WINVER >= 0x0500 */

#define DFCS_ADJUSTRECT         0x2000
#define DFCS_FLAT               0x4000
#define DFCS_MONO               0x8000

WINUSERAPI
BOOL
WINAPI
DrawFrameControl(
    __in HDC,
    __inout LPRECT,
    __in UINT,
    __in UINT);


/* flags for DrawCaption */
#define DC_ACTIVE           0x0001
#define DC_SMALLCAP         0x0002
#define DC_ICON             0x0004
#define DC_TEXT             0x0008
#define DC_INBUTTON         0x0010
#if(WINVER >= 0x0500)
#define DC_GRADIENT         0x0020
#endif /* WINVER >= 0x0500 */
#if(_WIN32_WINNT >= 0x0501)
#define DC_BUTTONS          0x1000
#endif /* _WIN32_WINNT >= 0x0501 */

WINUSERAPI
BOOL
WINAPI
DrawCaption(
    __in HWND hwnd,
    __in HDC hdc,
    __in CONST RECT * lprect,
    __in UINT flags);


#define IDANI_OPEN          1
#define IDANI_CAPTION       3

WINUSERAPI
BOOL
WINAPI
DrawAnimatedRects(
    __in_opt HWND hwnd,
    __in int idAni,
    __in CONST RECT *lprcFrom,
    __in CONST RECT *lprcTo);

#endif /* WINVER >= 0x0400 */

#ifndef NOCLIPBOARD


/*
 * Predefined Clipboard Formats
 */
#define CF_TEXT             1
#define CF_BITMAP           2
#define CF_METAFILEPICT     3
#define CF_SYLK             4
#define CF_DIF              5
#define CF_TIFF             6
#define CF_OEMTEXT          7
#define CF_DIB              8
#define CF_PALETTE          9
#define CF_PENDATA          10
#define CF_RIFF             11
#define CF_WAVE             12
#define CF_UNICODETEXT      13
#define CF_ENHMETAFILE      14
#if(WINVER >= 0x0400)
#define CF_HDROP            15
#define CF_LOCALE           16
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0500)
#define CF_DIBV5            17
#endif /* WINVER >= 0x0500 */

#if(WINVER >= 0x0500)
#define CF_MAX              18
#elif(WINVER >= 0x0400)
#define CF_MAX              17
#else
#define CF_MAX              15
#endif

#define CF_OWNERDISPLAY     0x0080
#define CF_DSPTEXT          0x0081
#define CF_DSPBITMAP        0x0082
#define CF_DSPMETAFILEPICT  0x0083
#define CF_DSPENHMETAFILE   0x008E

/*
 * "Private" formats don't get GlobalFree()'d
 */
#define CF_PRIVATEFIRST     0x0200
#define CF_PRIVATELAST      0x02FF

/*
 * "GDIOBJ" formats do get DeleteObject()'d
 */
#define CF_GDIOBJFIRST      0x0300
#define CF_GDIOBJLAST       0x03FF


#endif /* !NOCLIPBOARD */

/*
 * Defines for the fVirt field of the Accelerator table structure.
 */
#define FVIRTKEY  TRUE          /* Assumed to be == TRUE */
#define FNOINVERT 0x02
#define FSHIFT    0x04
#define FCONTROL  0x08
#define FALT      0x10

typedef struct tagACCEL {
#ifndef _MAC
    BYTE   fVirt;               /* Also called the flags field */
    WORD   key;
    WORD   cmd;
#else
    WORD   fVirt;               /* Also called the flags field */
    WORD   key;
    DWORD  cmd;
#endif
} ACCEL, *LPACCEL;

typedef struct tagPAINTSTRUCT {
    HDC         hdc;
    BOOL        fErase;
    RECT        rcPaint;
    BOOL        fRestore;
    BOOL        fIncUpdate;
    BYTE        rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;

typedef struct tagCREATESTRUCTA {
    LPVOID      lpCreateParams;
    HINSTANCE   hInstance;
    HMENU       hMenu;
    HWND        hwndParent;
    int         cy;
    int         cx;
    int         y;
    int         x;
    LONG        style;
    LPCSTR      lpszName;
    LPCSTR      lpszClass;
    DWORD       dwExStyle;
} CREATESTRUCTA, *LPCREATESTRUCTA;
typedef struct tagCREATESTRUCTW {
    LPVOID      lpCreateParams;
    HINSTANCE   hInstance;
    HMENU       hMenu;
    HWND        hwndParent;
    int         cy;
    int         cx;
    int         y;
    int         x;
    LONG        style;
    LPCWSTR     lpszName;
    LPCWSTR     lpszClass;
    DWORD       dwExStyle;
} CREATESTRUCTW, *LPCREATESTRUCTW;
#ifdef UNICODE
typedef CREATESTRUCTW CREATESTRUCT;
typedef LPCREATESTRUCTW LPCREATESTRUCT;
#else
typedef CREATESTRUCTA CREATESTRUCT;
typedef LPCREATESTRUCTA LPCREATESTRUCT;
#endif // UNICODE

typedef struct tagWINDOWPLACEMENT {
    UINT  length;
    UINT  flags;
    UINT  showCmd;
    POINT ptMinPosition;
    POINT ptMaxPosition;
    RECT  rcNormalPosition;
#ifdef _MAC
    RECT  rcDevice;
#endif
} WINDOWPLACEMENT;
typedef WINDOWPLACEMENT *PWINDOWPLACEMENT, *LPWINDOWPLACEMENT;

#define WPF_SETMINPOSITION          0x0001
#define WPF_RESTORETOMAXIMIZED      0x0002
#if(_WIN32_WINNT >= 0x0500)
#define WPF_ASYNCWINDOWPLACEMENT    0x0004
#endif /* _WIN32_WINNT >= 0x0500 */

#if(WINVER >= 0x0400)
typedef struct tagNMHDR
{
    HWND      hwndFrom;
    UINT_PTR  idFrom;
    UINT      code;         // NM_ code
}   NMHDR;
typedef NMHDR FAR * LPNMHDR;

typedef struct tagSTYLESTRUCT
{
    DWORD   styleOld;
    DWORD   styleNew;
} STYLESTRUCT, * LPSTYLESTRUCT;
#endif /* WINVER >= 0x0400 */


/*
 * Owner draw control types
 */
#define ODT_MENU        1
#define ODT_LISTBOX     2
#define ODT_COMBOBOX    3
#define ODT_BUTTON      4
#if(WINVER >= 0x0400)
#define ODT_STATIC      5
#endif /* WINVER >= 0x0400 */

/*
 * Owner draw actions
 */
#define ODA_DRAWENTIRE  0x0001
#define ODA_SELECT      0x0002
#define ODA_FOCUS       0x0004

/*
 * Owner draw state
 */
#define ODS_SELECTED    0x0001
#define ODS_GRAYED      0x0002
#define ODS_DISABLED    0x0004
#define ODS_CHECKED     0x0008
#define ODS_FOCUS       0x0010
#if(WINVER >= 0x0400)
#define ODS_DEFAULT         0x0020
#define ODS_COMBOBOXEDIT    0x1000
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0500)
#define ODS_HOTLIGHT        0x0040
#define ODS_INACTIVE        0x0080
#if(_WIN32_WINNT >= 0x0500)
#define ODS_NOACCEL         0x0100
#define ODS_NOFOCUSRECT     0x0200
#endif /* _WIN32_WINNT >= 0x0500 */
#endif /* WINVER >= 0x0500 */

/*
 * MEASUREITEMSTRUCT for ownerdraw
 */
typedef struct tagMEASUREITEMSTRUCT {
    UINT       CtlType;
    UINT       CtlID;
    UINT       itemID;
    UINT       itemWidth;
    UINT       itemHeight;
    ULONG_PTR  itemData;
} MEASUREITEMSTRUCT, NEAR *PMEASUREITEMSTRUCT, FAR *LPMEASUREITEMSTRUCT;

/*
 * DRAWITEMSTRUCT for ownerdraw
 */
typedef struct tagDRAWITEMSTRUCT {
    UINT        CtlType;
    UINT        CtlID;
    UINT        itemID;
    UINT        itemAction;
    UINT        itemState;
    HWND        hwndItem;
    HDC         hDC;
    RECT        rcItem;
    ULONG_PTR   itemData;
} DRAWITEMSTRUCT, NEAR *PDRAWITEMSTRUCT, FAR *LPDRAWITEMSTRUCT;

/*
 * DELETEITEMSTRUCT for ownerdraw
 */
typedef struct tagDELETEITEMSTRUCT {
    UINT       CtlType;
    UINT       CtlID;
    UINT       itemID;
    HWND       hwndItem;
    ULONG_PTR  itemData;
} DELETEITEMSTRUCT, NEAR *PDELETEITEMSTRUCT, FAR *LPDELETEITEMSTRUCT;

/*
 * COMPAREITEMSTUCT for ownerdraw sorting
 */
typedef struct tagCOMPAREITEMSTRUCT {
    UINT        CtlType;
    UINT        CtlID;
    HWND        hwndItem;
    UINT        itemID1;
    ULONG_PTR   itemData1;
    UINT        itemID2;
    ULONG_PTR   itemData2;
    DWORD       dwLocaleId;
} COMPAREITEMSTRUCT, NEAR *PCOMPAREITEMSTRUCT, FAR *LPCOMPAREITEMSTRUCT;

#ifndef NOMSG

/*
 * Message Function Templates
 */

WINUSERAPI
BOOL
WINAPI
GetMessageA(
    __out LPMSG lpMsg,
    __in_opt HWND hWnd,
    __in UINT wMsgFilterMin,
    __in UINT wMsgFilterMax);
WINUSERAPI
BOOL
WINAPI
GetMessageW(
    __out LPMSG lpMsg,
    __in_opt HWND hWnd,
    __in UINT wMsgFilterMin,
    __in UINT wMsgFilterMax);
#ifdef UNICODE
#define GetMessage  GetMessageW
#else
#define GetMessage  GetMessageA
#endif // !UNICODE

#if defined(_M_CEE)
#undef GetMessage
__inline
BOOL
GetMessage(
    LPMSG lpMsg,
    HWND hWnd,
    UINT wMsgFilterMin,
    UINT wMsgFilterMax
    )
{
#ifdef UNICODE
    return GetMessageW(
#else
    return GetMessageA(
#endif
        lpMsg,
        hWnd,
        wMsgFilterMin,
        wMsgFilterMax
        );
}
#endif  /* _M_CEE */


WINUSERAPI
BOOL
WINAPI
TranslateMessage(
    __in CONST MSG *lpMsg);

WINUSERAPI
LRESULT
WINAPI
DispatchMessageA(
    __in CONST MSG *lpMsg);
WINUSERAPI
LRESULT
WINAPI
DispatchMessageW(
    __in CONST MSG *lpMsg);
#ifdef UNICODE
#define DispatchMessage  DispatchMessageW
#else
#define DispatchMessage  DispatchMessageA
#endif // !UNICODE

#if defined(_M_CEE)
#undef DispatchMessage
__inline
LRESULT
DispatchMessage(
    CONST MSG *lpMsg
    )
{
#ifdef UNICODE
    return DispatchMessageW(
#else
    return DispatchMessageA(
#endif
        lpMsg
        );
}
#endif  /* _M_CEE */

WINUSERAPI
BOOL
WINAPI
SetMessageQueue(
    __in int cMessagesMax);

WINUSERAPI
BOOL
WINAPI
PeekMessageA(
    __out LPMSG lpMsg,
    __in_opt HWND hWnd,
    __in UINT wMsgFilterMin,
    __in UINT wMsgFilterMax,
    __in UINT wRemoveMsg);
WINUSERAPI
BOOL
WINAPI
PeekMessageW(
    __out LPMSG lpMsg,
    __in_opt HWND hWnd,
    __in UINT wMsgFilterMin,
    __in UINT wMsgFilterMax,
    __in UINT wRemoveMsg);
#ifdef UNICODE
#define PeekMessage  PeekMessageW
#else
#define PeekMessage  PeekMessageA
#endif // !UNICODE


/*
 * PeekMessage() Options
 */
#define PM_NOREMOVE         0x0000
#define PM_REMOVE           0x0001
#define PM_NOYIELD          0x0002
#if(WINVER >= 0x0500)
#define PM_QS_INPUT         (QS_INPUT << 16)
#define PM_QS_POSTMESSAGE   ((QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER) << 16)
#define PM_QS_PAINT         (QS_PAINT << 16)
#define PM_QS_SENDMESSAGE   (QS_SENDMESSAGE << 16) #endif /* WINVER >= 0x0500 */


#endif /* !NOMSG */

WINUSERAPI
BOOL
WINAPI
RegisterHotKey(
    __in_opt HWND hWnd,
    __in int id,
    __in UINT fsModifiers,
    __in UINT vk);

WINUSERAPI
BOOL
WINAPI
UnregisterHotKey(
    __in_opt HWND hWnd,
    __in int id);

#define MOD_ALT         0x0001
#define MOD_CONTROL     0x0002
#define MOD_SHIFT       0x0004
#define MOD_WIN         0x0008
#if(WINVER >= 0x0601)
#define MOD_NOREPEAT    0x4000
#endif /* WINVER >= 0x0601 */


#define IDHOT_SNAPWINDOW        (-1)    /* SHIFT-PRINTSCRN  */
#define IDHOT_SNAPDESKTOP       (-2)    /* PRINTSCRN        */

#ifdef WIN_INTERNAL
    #ifndef LSTRING
    #define NOLSTRING
    #endif /* LSTRING */
    #ifndef LFILEIO
    #define NOLFILEIO
    #endif /* LFILEIO */
#endif /* WIN_INTERNAL */

#if(WINVER >= 0x0400)

#define ENDSESSION_LOGOFF    0x80000000

#define ENDSESSION_CRITICAL  0x40000000

#define ENDSESSION_CLOSEAPP  0x00000001
#endif /* WINVER >= 0x0400 */

#define EWX_LOGOFF          0
#define EWX_SHUTDOWN        0x00000001
#define EWX_REBOOT          0x00000002
#define EWX_FORCE           0x00000004
#define EWX_POWEROFF        0x00000008
#if(_WIN32_WINNT >= 0x0500)
#define EWX_FORCEIFHUNG     0x00000010
#endif /* _WIN32_WINNT >= 0x0500 */
#define EWX_QUICKRESOLVE    0x00000020
#if(_WIN32_WINNT >= 0x0600)
#define EWX_RESTARTAPPS     0x00000040
#endif /* _WIN32_WINNT >= 0x0600 */


#define ExitWindows(dwReserved, Code) ExitWindowsEx(EWX_LOGOFF, 0xFFFFFFFF)

__drv_when((uFlags&(EWX_POWEROFF|EWX_SHUTDOWN|EWX_FORCE))!=0,
    __drv_preferredFunction("InitiateSystemShutdownEx",
        "Legacy API. Rearchitect to avoid Reboot"))
WINUSERAPI
BOOL
WINAPI
ExitWindowsEx(
    __in UINT uFlags,
    __in DWORD dwReason);

WINUSERAPI
BOOL
WINAPI
SwapMouseButton(
    __in BOOL fSwap);

WINUSERAPI
DWORD
WINAPI
GetMessagePos(
    VOID);

WINUSERAPI
LONG
WINAPI
GetMessageTime(
    VOID);

WINUSERAPI
LPARAM
WINAPI
GetMessageExtraInfo(
    VOID);

#if(_WIN32_WINNT >= 0x0501)
WINUSERAPI
BOOL
WINAPI
IsWow64Message(
    VOID);
#endif /* _WIN32_WINNT >= 0x0501 */

#if(WINVER >= 0x0400)
WINUSERAPI
LPARAM
WINAPI
SetMessageExtraInfo(
    __in LPARAM lParam);
#endif /* WINVER >= 0x0400 */

WINUSERAPI
LRESULT
WINAPI
SendMessageA(
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
LRESULT
WINAPI
SendMessageW(
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define SendMessage  SendMessageW
#else
#define SendMessage  SendMessageA
#endif // !UNICODE

#if defined(_M_CEE)
#undef SendMessage
__inline
LRESULT
SendMessage(
    HWND hWnd,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
    )
{
#ifdef UNICODE
    return SendMessageW(
#else
    return SendMessageA(
#endif
        hWnd,
        Msg,
        wParam,
        lParam
        );
}
#endif  /* _M_CEE */



WINUSERAPI
LRESULT
WINAPI
SendMessageTimeoutA(
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam,
    __in UINT fuFlags,
    __in UINT uTimeout,
    __out_opt PDWORD_PTR lpdwResult);
WINUSERAPI
LRESULT
WINAPI
SendMessageTimeoutW(
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam,
    __in UINT fuFlags,
    __in UINT uTimeout,
    __out_opt PDWORD_PTR lpdwResult);
#ifdef UNICODE
#define SendMessageTimeout  SendMessageTimeoutW
#else
#define SendMessageTimeout  SendMessageTimeoutA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
SendNotifyMessageA(
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
BOOL
WINAPI
SendNotifyMessageW(
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define SendNotifyMessage  SendNotifyMessageW
#else
#define SendNotifyMessage  SendNotifyMessageA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
SendMessageCallbackA(
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam,
    __in SENDASYNCPROC lpResultCallBack,
    __in ULONG_PTR dwData);
WINUSERAPI
BOOL
WINAPI
SendMessageCallbackW(
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam,
    __in SENDASYNCPROC lpResultCallBack,
    __in ULONG_PTR dwData);
#ifdef UNICODE
#define SendMessageCallback  SendMessageCallbackW
#else
#define SendMessageCallback  SendMessageCallbackA
#endif // !UNICODE

#if(_WIN32_WINNT >= 0x0501)
typedef struct {
    UINT  cbSize;
    HDESK hdesk;
    HWND  hwnd;
    LUID  luid;
} BSMINFO, *PBSMINFO;

WINUSERAPI
long
WINAPI
BroadcastSystemMessageExA(
    __in DWORD flags,
    __inout_opt LPDWORD lpInfo,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam,
    __out_opt PBSMINFO pbsmInfo);
WINUSERAPI
long
WINAPI
BroadcastSystemMessageExW(
    __in DWORD flags,
    __inout_opt LPDWORD lpInfo,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam,
    __out_opt PBSMINFO pbsmInfo);
#ifdef UNICODE
#define BroadcastSystemMessageEx  BroadcastSystemMessageExW
#else
#define BroadcastSystemMessageEx  BroadcastSystemMessageExA
#endif // !UNICODE
#endif /* _WIN32_WINNT >= 0x0501 */

#if(WINVER >= 0x0400)

#if defined(_WIN32_WINNT)
WINUSERAPI
long
WINAPI
BroadcastSystemMessageA(
    __in DWORD flags,
    __inout_opt LPDWORD lpInfo,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
long
WINAPI
BroadcastSystemMessageW(
    __in DWORD flags,
    __inout_opt LPDWORD lpInfo,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define BroadcastSystemMessage  BroadcastSystemMessageW
#else
#define BroadcastSystemMessage  BroadcastSystemMessageA
#endif // !UNICODE
#elif defined(_WIN32_WINDOWS)
// The Win95 version isn't A/W decorated
WINUSERAPI
long
WINAPI
BroadcastSystemMessage(
    __in DWORD flags,
    __inout_opt LPDWORD lpInfo,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);

#endif

//Broadcast Special Message Recipient list
#define BSM_ALLCOMPONENTS       0x00000000
#define BSM_VXDS                0x00000001
#define BSM_NETDRIVER           0x00000002
#define BSM_INSTALLABLEDRIVERS  0x00000004
#define BSM_APPLICATIONS        0x00000008
#define BSM_ALLDESKTOPS         0x00000010

//Broadcast Special Message Flags
#define BSF_QUERY               0x00000001
#define BSF_IGNORECURRENTTASK   0x00000002
#define BSF_FLUSHDISK           0x00000004
#define BSF_NOHANG              0x00000008
#define BSF_POSTMESSAGE         0x00000010
#define BSF_FORCEIFHUNG         0x00000020
#define BSF_NOTIMEOUTIFNOTHUNG  0x00000040
#if(_WIN32_WINNT >= 0x0500)
#define BSF_ALLOWSFW            0x00000080
#define BSF_SENDNOTIFYMESSAGE   0x00000100
#endif /* _WIN32_WINNT >= 0x0500 */
#if(_WIN32_WINNT >= 0x0501)
#define BSF_RETURNHDESK         0x00000200
#define BSF_LUID                0x00000400
#endif /* _WIN32_WINNT >= 0x0501 */

#define BROADCAST_QUERY_DENY         0x424D5144  // Return this value to deny a query.
#endif /* WINVER >= 0x0400 */

// RegisterDeviceNotification

#if(WINVER >= 0x0500)
typedef  PVOID           HDEVNOTIFY;
typedef  HDEVNOTIFY     *PHDEVNOTIFY;

#define DEVICE_NOTIFY_WINDOW_HANDLE          0x00000000
#define DEVICE_NOTIFY_SERVICE_HANDLE         0x00000001
#if(_WIN32_WINNT >= 0x0501)
#define DEVICE_NOTIFY_ALL_INTERFACE_CLASSES  0x00000004
#endif /* _WIN32_WINNT >= 0x0501 */

WINUSERAPI
HDEVNOTIFY
WINAPI
RegisterDeviceNotificationA(
    __in HANDLE hRecipient,
    __in LPVOID NotificationFilter,
    __in DWORD Flags);
WINUSERAPI
HDEVNOTIFY
WINAPI
RegisterDeviceNotificationW(
    __in HANDLE hRecipient,
    __in LPVOID NotificationFilter,
    __in DWORD Flags);
#ifdef UNICODE
#define RegisterDeviceNotification  RegisterDeviceNotificationW
#else
#define RegisterDeviceNotification  RegisterDeviceNotificationA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
UnregisterDeviceNotification(
    __in HDEVNOTIFY Handle
    );

#if (_WIN32_WINNT >= 0x0502)

#if !defined(_HPOWERNOTIFY_DEF_)

#define _HPOWERNOTIFY_DEF_

typedef  PVOID           HPOWERNOTIFY;
typedef  HPOWERNOTIFY   *PHPOWERNOTIFY;

#endif

WINUSERAPI
HPOWERNOTIFY
WINAPI
RegisterPowerSettingNotification(
    IN HANDLE hRecipient,
    IN LPCGUID PowerSettingGuid,
    IN DWORD Flags
    );

WINUSERAPI
BOOL
WINAPI
UnregisterPowerSettingNotification(
    IN HPOWERNOTIFY Handle
    );
#endif // (_WIN32_WINNT >= 0x0502)
#endif /* WINVER >= 0x0500 */


WINUSERAPI
BOOL
WINAPI
PostMessageA(
    __in_opt HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
BOOL
WINAPI
PostMessageW(
    __in_opt HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define PostMessage  PostMessageW
#else
#define PostMessage  PostMessageA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
PostThreadMessageA(
    __in DWORD idThread,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
BOOL
WINAPI
PostThreadMessageW(
    __in DWORD idThread,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define PostThreadMessage  PostThreadMessageW
#else
#define PostThreadMessage  PostThreadMessageA
#endif // !UNICODE

#define PostAppMessageA(idThread, wMsg, wParam, lParam)\
        PostThreadMessageA((DWORD)idThread, wMsg, wParam, lParam)
#define PostAppMessageW(idThread, wMsg, wParam, lParam)\
        PostThreadMessageW((DWORD)idThread, wMsg, wParam, lParam)
#ifdef UNICODE
#define PostAppMessage  PostAppMessageW
#else
#define PostAppMessage  PostAppMessageA
#endif // !UNICODE

/*
 * Special HWND value for use with PostMessage() and SendMessage()
 */
#define HWND_BROADCAST  ((HWND)0xffff)

#if(WINVER >= 0x0500)
#define HWND_MESSAGE     ((HWND)-3)
#endif /* WINVER >= 0x0500 */

WINUSERAPI
BOOL
WINAPI
AttachThreadInput(
    __in DWORD idAttach,
    __in DWORD idAttachTo,
    __in BOOL fAttach);


WINUSERAPI
BOOL
WINAPI
ReplyMessage(
    __in LRESULT lResult);

WINUSERAPI
BOOL
WINAPI
WaitMessage(
    VOID);


WINUSERAPI
DWORD
WINAPI
WaitForInputIdle(
    __in HANDLE hProcess,
    __in DWORD dwMilliseconds);

WINUSERAPI
#ifndef _MAC
LRESULT
WINAPI
#else
LRESULT
CALLBACK
#endif
DefWindowProcA(
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
#ifndef _MAC
LRESULT
WINAPI
#else
LRESULT
CALLBACK
#endif
DefWindowProcW(
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define DefWindowProc  DefWindowProcW
#else
#define DefWindowProc  DefWindowProcA
#endif // !UNICODE

WINUSERAPI
VOID
WINAPI
PostQuitMessage(
    __in int nExitCode);

#ifdef STRICT

WINUSERAPI
LRESULT
WINAPI
CallWindowProcA(
    __in WNDPROC lpPrevWndFunc,
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
LRESULT
WINAPI
CallWindowProcW(
    __in WNDPROC lpPrevWndFunc,
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define CallWindowProc  CallWindowProcW
#else
#define CallWindowProc  CallWindowProcA
#endif // !UNICODE

#else /* !STRICT */

WINUSERAPI
LRESULT
WINAPI
CallWindowProcA(
    __in FARPROC lpPrevWndFunc,
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
LRESULT
WINAPI
CallWindowProcW(
    __in FARPROC lpPrevWndFunc,
    __in HWND hWnd,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define CallWindowProc  CallWindowProcW
#else
#define CallWindowProc  CallWindowProcA
#endif // !UNICODE

#endif /* !STRICT */

WINUSERAPI
BOOL
WINAPI
InSendMessage(
    VOID);

#if(WINVER >= 0x0500)
WINUSERAPI
DWORD
WINAPI
InSendMessageEx(
    __reserved LPVOID lpReserved);

/*
 * InSendMessageEx return value
 */
#define ISMEX_NOSEND      0x00000000
#define ISMEX_SEND        0x00000001
#define ISMEX_NOTIFY      0x00000002
#define ISMEX_CALLBACK    0x00000004
#define ISMEX_REPLIED     0x00000008
#endif /* WINVER >= 0x0500 */

WINUSERAPI
UINT
WINAPI
GetDoubleClickTime(
    VOID);

WINUSERAPI
BOOL
WINAPI
SetDoubleClickTime(
    __in UINT);

WINUSERAPI
ATOM
WINAPI
RegisterClassA(
    __in CONST WNDCLASSA *lpWndClass);
WINUSERAPI
ATOM
WINAPI
RegisterClassW(
    __in CONST WNDCLASSW *lpWndClass);
#ifdef UNICODE
#define RegisterClass  RegisterClassW
#else
#define RegisterClass  RegisterClassA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
UnregisterClassA(
    __in LPCSTR lpClassName,
    __in_opt HINSTANCE hInstance);
WINUSERAPI
BOOL
WINAPI
UnregisterClassW(
    __in LPCWSTR lpClassName,
    __in_opt HINSTANCE hInstance);
#ifdef UNICODE
#define UnregisterClass  UnregisterClassW
#else
#define UnregisterClass  UnregisterClassA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
GetClassInfoA(
    __in_opt HINSTANCE hInstance,
    __in LPCSTR lpClassName,
    __out LPWNDCLASSA lpWndClass);
WINUSERAPI
BOOL
WINAPI
GetClassInfoW(
    __in_opt HINSTANCE hInstance,
    __in LPCWSTR lpClassName,
    __out LPWNDCLASSW lpWndClass);
#ifdef UNICODE
#define GetClassInfo  GetClassInfoW
#else
#define GetClassInfo  GetClassInfoA
#endif // !UNICODE

#if(WINVER >= 0x0400)
WINUSERAPI
ATOM
WINAPI
RegisterClassExA(
    __in CONST WNDCLASSEXA *);
WINUSERAPI
ATOM
WINAPI
RegisterClassExW(
    __in CONST WNDCLASSEXW *);
#ifdef UNICODE
#define RegisterClassEx  RegisterClassExW
#else
#define RegisterClassEx  RegisterClassExA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
GetClassInfoExA(
    __in_opt HINSTANCE hInstance,
    __in LPCSTR lpszClass,
    __out LPWNDCLASSEXA lpwcx);
WINUSERAPI
BOOL
WINAPI
GetClassInfoExW(
    __in_opt HINSTANCE hInstance,
    __in LPCWSTR lpszClass,
    __out LPWNDCLASSEXW lpwcx);
#ifdef UNICODE
#define GetClassInfoEx  GetClassInfoExW
#else
#define GetClassInfoEx  GetClassInfoExA
#endif // !UNICODE

#endif /* WINVER >= 0x0400 */

#define CW_USEDEFAULT       ((int)0x80000000)

/*
 * Special value for CreateWindow, et al.
 */
#define HWND_DESKTOP        ((HWND)0)

#if(_WIN32_WINNT >= 0x0501)
typedef BOOLEAN (WINAPI * PREGISTERCLASSNAMEW)(LPCWSTR);
#endif /* _WIN32_WINNT >= 0x0501 */

WINUSERAPI
HWND
WINAPI
CreateWindowExA(
    __in DWORD dwExStyle,
    __in_opt LPCSTR lpClassName,
    __in_opt LPCSTR lpWindowName,
    __in DWORD dwStyle,
    __in int X,
    __in int Y,
    __in int nWidth,
    __in int nHeight,
    __in_opt HWND hWndParent,
    __in_opt HMENU hMenu,
    __in_opt HINSTANCE hInstance,
    __in_opt LPVOID lpParam);
WINUSERAPI
HWND
WINAPI
CreateWindowExW(
    __in DWORD dwExStyle,
    __in_opt LPCWSTR lpClassName,
    __in_opt LPCWSTR lpWindowName,
    __in DWORD dwStyle,
    __in int X,
    __in int Y,
    __in int nWidth,
    __in int nHeight,
    __in_opt HWND hWndParent,
    __in_opt HMENU hMenu,
    __in_opt HINSTANCE hInstance,
    __in_opt LPVOID lpParam);
#ifdef UNICODE
#define CreateWindowEx  CreateWindowExW
#else
#define CreateWindowEx  CreateWindowExA
#endif // !UNICODE

#define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
#define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\
CreateWindowExW(0L, lpClassName, lpWindowName, dwStyle, x, y,\
nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
#ifdef UNICODE
#define CreateWindow  CreateWindowW
#else
#define CreateWindow  CreateWindowA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
IsWindow(
    __in_opt HWND hWnd);


WINUSERAPI
BOOL
WINAPI
IsMenu(
    __in HMENU hMenu);

WINUSERAPI
BOOL
WINAPI
IsChild(
    __in HWND hWndParent,
    __in HWND hWnd);

WINUSERAPI
BOOL
WINAPI
DestroyWindow(
    __in HWND hWnd);

WINUSERAPI
BOOL
WINAPI
ShowWindow(
    __in HWND hWnd,
    __in int nCmdShow);

#if(WINVER >= 0x0500)
WINUSERAPI
BOOL
WINAPI
AnimateWindow(
    __in HWND hWnd,
    __in DWORD dwTime,
    __in DWORD dwFlags);
#endif /* WINVER >= 0x0500 */

#if(_WIN32_WINNT >= 0x0500)
#if defined(_WINGDI_) && !defined(NOGDI)

WINUSERAPI
BOOL
WINAPI
UpdateLayeredWindow(
    __in HWND hWnd,
    __in_opt HDC hdcDst,
    __in_opt POINT* pptDst,
    __in_opt SIZE* psize,
    __in_opt HDC hdcSrc,
    __in_opt POINT* pptSrc,
    __in COLORREF crKey,
    __in_opt BLENDFUNCTION* pblend,
    __in DWORD dwFlags);

/*
 * Layered Window Update information
 */
typedef struct tagUPDATELAYEREDWINDOWINFO
{
    __in DWORD cbSize;
    __in_opt HDC hdcDst;
    __in_opt const POINT* pptDst;
    __in_opt const SIZE* psize;
    __in_opt HDC hdcSrc;
    __in_opt const POINT* pptSrc;
    __in_opt COLORREF crKey;
    __in_opt const BLENDFUNCTION* pblend;
    __in DWORD dwFlags;
    __in_opt const RECT* prcDirty;
} UPDATELAYEREDWINDOWINFO, *PUPDATELAYEREDWINDOWINFO;


#if (_WIN32_WINNT < 0x0502)
typedef
#endif /* _WIN32_WINNT < 0x0502 */ WINUSERAPI BOOL WINAPI UpdateLayeredWindowIndirect( __in HWND hWnd, __in const UPDATELAYEREDWINDOWINFO* pULWInfo); #endif #if(_WIN32_WINNT >= 0x0501)
WINUSERAPI
BOOL
WINAPI
GetLayeredWindowAttributes(
    __in HWND hwnd,
    __out_opt COLORREF* pcrKey,
    __out_opt BYTE* pbAlpha,
    __out_opt DWORD* pdwFlags);

#define PW_CLIENTONLY           0x00000001


WINUSERAPI
BOOL
WINAPI
PrintWindow(
    __in HWND hwnd,
    __in HDC hdcBlt,
    __in UINT nFlags);

#endif /* _WIN32_WINNT >= 0x0501 */

WINUSERAPI
BOOL
WINAPI
SetLayeredWindowAttributes(
    __in HWND hwnd,
    __in COLORREF crKey,
    __in BYTE bAlpha,
    __in DWORD dwFlags);

#define LWA_COLORKEY            0x00000001
#define LWA_ALPHA               0x00000002


#define ULW_COLORKEY            0x00000001
#define ULW_ALPHA               0x00000002
#define ULW_OPAQUE              0x00000004

#define ULW_EX_NORESIZE         0x00000008

#endif /* _WIN32_WINNT >= 0x0500 */


#if(WINVER >= 0x0400)
WINUSERAPI
BOOL
WINAPI
ShowWindowAsync(
    __in  HWND hWnd,
    __in  int nCmdShow);
#endif /* WINVER >= 0x0400 */

WINUSERAPI
BOOL
WINAPI
FlashWindow(
    __in  HWND hWnd,
    __in  BOOL bInvert);

#if(WINVER >= 0x0500)
typedef struct {
    UINT  cbSize;
    HWND  hwnd;
    DWORD dwFlags;
    UINT  uCount;
    DWORD dwTimeout;
} FLASHWINFO, *PFLASHWINFO;

WINUSERAPI
BOOL
WINAPI
FlashWindowEx(
    __in PFLASHWINFO pfwi);

#define FLASHW_STOP         0
#define FLASHW_CAPTION      0x00000001
#define FLASHW_TRAY         0x00000002
#define FLASHW_ALL          (FLASHW_CAPTION | FLASHW_TRAY)
#define FLASHW_TIMER        0x00000004
#define FLASHW_TIMERNOFG    0x0000000C

#endif /* WINVER >= 0x0500 */

WINUSERAPI
BOOL
WINAPI
ShowOwnedPopups(
    __in  HWND hWnd,
    __in  BOOL fShow);

WINUSERAPI
BOOL
WINAPI
OpenIcon(
    __in  HWND hWnd);

WINUSERAPI
BOOL
WINAPI
CloseWindow(
    __in  HWND hWnd);

WINUSERAPI
BOOL
WINAPI
MoveWindow(
    __in HWND hWnd,
    __in int X,
    __in int Y,
    __in int nWidth,
    __in int nHeight,
    __in BOOL bRepaint);

WINUSERAPI
BOOL
WINAPI
SetWindowPos(
    __in HWND hWnd,
    __in_opt HWND hWndInsertAfter,
    __in int X,
    __in int Y,
    __in int cx,
    __in int cy,
    __in UINT uFlags);

WINUSERAPI
BOOL
WINAPI
GetWindowPlacement(
    __in HWND hWnd,
    __inout WINDOWPLACEMENT *lpwndpl);

WINUSERAPI
BOOL
WINAPI
SetWindowPlacement(
    __in HWND hWnd,
    __in CONST WINDOWPLACEMENT *lpwndpl);

#if(_WIN32_WINNT >= 0x0601)
#define WDA_NONE        0x00000000
#define WDA_MONITOR     0x00000001


WINUSERAPI
BOOL
WINAPI
GetWindowDisplayAffinity(
    __in HWND hWnd,
    __out DWORD* pdwAffinity);

WINUSERAPI
BOOL
WINAPI
SetWindowDisplayAffinity(
    __in HWND hWnd,
    __in DWORD dwAffinity);

#endif /* _WIN32_WINNT >= 0x0601 */

#ifndef NODEFERWINDOWPOS

WINUSERAPI
HDWP
WINAPI
BeginDeferWindowPos(
    __in int nNumWindows);

WINUSERAPI
HDWP
WINAPI
DeferWindowPos(
    __in HDWP hWinPosInfo,
    __in HWND hWnd,
    __in_opt HWND hWndInsertAfter,
    __in int x,
    __in int y,
    __in int cx,
    __in int cy,
    __in UINT uFlags);

WINUSERAPI
BOOL
WINAPI
EndDeferWindowPos(
    __in HDWP hWinPosInfo);

#endif /* !NODEFERWINDOWPOS */

WINUSERAPI
BOOL
WINAPI
IsWindowVisible(
    __in HWND hWnd);

WINUSERAPI
BOOL
WINAPI
IsIconic(
    __in HWND hWnd);

WINUSERAPI
BOOL
WINAPI
AnyPopup(
    VOID);

WINUSERAPI
BOOL
WINAPI
BringWindowToTop(
    __in HWND hWnd);

WINUSERAPI
BOOL
WINAPI
IsZoomed(
    __in HWND hWnd);

/*
 * SetWindowPos Flags
 */
#define SWP_NOSIZE          0x0001
#define SWP_NOMOVE          0x0002
#define SWP_NOZORDER        0x0004
#define SWP_NOREDRAW        0x0008
#define SWP_NOACTIVATE      0x0010
#define SWP_FRAMECHANGED    0x0020  /* The frame changed: send WM_NCCALCSIZE */
#define SWP_SHOWWINDOW      0x0040
#define SWP_HIDEWINDOW      0x0080
#define SWP_NOCOPYBITS      0x0100
#define SWP_NOOWNERZORDER   0x0200  /* Don't do owner Z ordering */
#define SWP_NOSENDCHANGING  0x0400  /* Don't send WM_WINDOWPOSCHANGING */

#define SWP_DRAWFRAME       SWP_FRAMECHANGED
#define SWP_NOREPOSITION    SWP_NOOWNERZORDER

#if(WINVER >= 0x0400)
#define SWP_DEFERERASE      0x2000
#define SWP_ASYNCWINDOWPOS  0x4000
#endif /* WINVER >= 0x0400 */


#define HWND_TOP        ((HWND)0)
#define HWND_BOTTOM     ((HWND)1)
#define HWND_TOPMOST    ((HWND)-1)
#define HWND_NOTOPMOST  ((HWND)-2)

#ifndef NOCTLMGR

/*
 * WARNING:
 * The following structures must NOT be DWORD padded because they are
 * followed by strings, etc that do not have to be DWORD aligned.
 */
#include 

/*
 * original NT 32 bit dialog template:
 */
typedef struct {
    DWORD style;
    DWORD dwExtendedStyle;
    WORD cdit;
    short x;
    short y;
    short cx;
    short cy;
} DLGTEMPLATE;
typedef DLGTEMPLATE *LPDLGTEMPLATEA;
typedef DLGTEMPLATE *LPDLGTEMPLATEW;
#ifdef UNICODE
typedef LPDLGTEMPLATEW LPDLGTEMPLATE;
#else
typedef LPDLGTEMPLATEA LPDLGTEMPLATE;
#endif // UNICODE
typedef CONST DLGTEMPLATE *LPCDLGTEMPLATEA;
typedef CONST DLGTEMPLATE *LPCDLGTEMPLATEW;
#ifdef UNICODE
typedef LPCDLGTEMPLATEW LPCDLGTEMPLATE;
#else
typedef LPCDLGTEMPLATEA LPCDLGTEMPLATE;
#endif // UNICODE

/*
 * 32 bit Dialog item template.
 */
typedef struct {
    DWORD style;
    DWORD dwExtendedStyle;
    short x;
    short y;
    short cx;
    short cy;
    WORD id;
} DLGITEMTEMPLATE;
typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEA;
typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEW;
#ifdef UNICODE
typedef PDLGITEMTEMPLATEW PDLGITEMTEMPLATE;
#else
typedef PDLGITEMTEMPLATEA PDLGITEMTEMPLATE;
#endif // UNICODE
typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEA;
typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEW;
#ifdef UNICODE
typedef LPDLGITEMTEMPLATEW LPDLGITEMTEMPLATE;
#else
typedef LPDLGITEMTEMPLATEA LPDLGITEMTEMPLATE;
#endif // UNICODE


#include  /* Resume normal packing */

WINUSERAPI
HWND
WINAPI
CreateDialogParamA(
    __in_opt HINSTANCE hInstance,
    __in LPCSTR lpTemplateName,
    __in_opt HWND hWndParent,
    __in_opt DLGPROC lpDialogFunc,
    __in LPARAM dwInitParam);
WINUSERAPI
HWND
WINAPI
CreateDialogParamW(
    __in_opt HINSTANCE hInstance,
    __in LPCWSTR lpTemplateName,
    __in_opt HWND hWndParent,
    __in_opt DLGPROC lpDialogFunc,
    __in LPARAM dwInitParam);
#ifdef UNICODE
#define CreateDialogParam  CreateDialogParamW
#else
#define CreateDialogParam  CreateDialogParamA
#endif // !UNICODE

WINUSERAPI
HWND
WINAPI
CreateDialogIndirectParamA(
    __in_opt HINSTANCE hInstance,
    __in LPCDLGTEMPLATEA lpTemplate,
    __in_opt HWND hWndParent,
    __in_opt DLGPROC lpDialogFunc,
    __in LPARAM dwInitParam);
WINUSERAPI
HWND
WINAPI
CreateDialogIndirectParamW(
    __in_opt HINSTANCE hInstance,
    __in LPCDLGTEMPLATEW lpTemplate,
    __in_opt HWND hWndParent,
    __in_opt DLGPROC lpDialogFunc,
    __in LPARAM dwInitParam);
#ifdef UNICODE
#define CreateDialogIndirectParam  CreateDialogIndirectParamW
#else
#define CreateDialogIndirectParam  CreateDialogIndirectParamA
#endif // !UNICODE

#define CreateDialogA(hInstance, lpName, hWndParent, lpDialogFunc) \
CreateDialogParamA(hInstance, lpName, hWndParent, lpDialogFunc, 0L)
#define CreateDialogW(hInstance, lpName, hWndParent, lpDialogFunc) \
CreateDialogParamW(hInstance, lpName, hWndParent, lpDialogFunc, 0L)
#ifdef UNICODE
#define CreateDialog  CreateDialogW
#else
#define CreateDialog  CreateDialogA
#endif // !UNICODE

#define CreateDialogIndirectA(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
CreateDialogIndirectParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
#define CreateDialogIndirectW(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
CreateDialogIndirectParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
#ifdef UNICODE
#define CreateDialogIndirect  CreateDialogIndirectW
#else
#define CreateDialogIndirect  CreateDialogIndirectA
#endif // !UNICODE

WINUSERAPI
INT_PTR
WINAPI
DialogBoxParamA(
    __in_opt HINSTANCE hInstance,
    __in LPCSTR lpTemplateName,
    __in_opt HWND hWndParent,
    __in_opt DLGPROC lpDialogFunc,
    __in LPARAM dwInitParam);
WINUSERAPI
INT_PTR
WINAPI
DialogBoxParamW(
    __in_opt HINSTANCE hInstance,
    __in LPCWSTR lpTemplateName,
    __in_opt HWND hWndParent,
    __in_opt DLGPROC lpDialogFunc,
    __in LPARAM dwInitParam);
#ifdef UNICODE
#define DialogBoxParam  DialogBoxParamW
#else
#define DialogBoxParam  DialogBoxParamA
#endif // !UNICODE

WINUSERAPI
INT_PTR
WINAPI
DialogBoxIndirectParamA(
    __in_opt HINSTANCE hInstance,
    __in LPCDLGTEMPLATEA hDialogTemplate,
    __in_opt HWND hWndParent,
    __in_opt DLGPROC lpDialogFunc,
    __in LPARAM dwInitParam);
WINUSERAPI
INT_PTR
WINAPI
DialogBoxIndirectParamW(
    __in_opt HINSTANCE hInstance,
    __in LPCDLGTEMPLATEW hDialogTemplate,
    __in_opt HWND hWndParent,
    __in_opt DLGPROC lpDialogFunc,
    __in LPARAM dwInitParam);
#ifdef UNICODE
#define DialogBoxIndirectParam  DialogBoxIndirectParamW
#else
#define DialogBoxIndirectParam  DialogBoxIndirectParamA
#endif // !UNICODE

#define DialogBoxA(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
DialogBoxParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
#define DialogBoxW(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
DialogBoxParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
#ifdef UNICODE
#define DialogBox  DialogBoxW
#else
#define DialogBox  DialogBoxA
#endif // !UNICODE

#define DialogBoxIndirectA(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
DialogBoxIndirectParamA(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
#define DialogBoxIndirectW(hInstance, lpTemplate, hWndParent, lpDialogFunc) \
DialogBoxIndirectParamW(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
#ifdef UNICODE
#define DialogBoxIndirect  DialogBoxIndirectW
#else
#define DialogBoxIndirect  DialogBoxIndirectA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
EndDialog(
    __in HWND hDlg,
    __in INT_PTR nResult);

WINUSERAPI
HWND
WINAPI
GetDlgItem(
    __in_opt HWND hDlg,
    __in int nIDDlgItem);

WINUSERAPI
BOOL
WINAPI
SetDlgItemInt(
    __in HWND hDlg,
    __in int nIDDlgItem,
    __in UINT uValue,
    __in BOOL bSigned);

WINUSERAPI
UINT
WINAPI
GetDlgItemInt(
    __in HWND hDlg,
    __in int nIDDlgItem,
    __out_opt BOOL *lpTranslated,
    __in BOOL bSigned);

WINUSERAPI
BOOL
WINAPI
SetDlgItemTextA(
    __in HWND hDlg,
    __in int nIDDlgItem,
    __in LPCSTR lpString);
WINUSERAPI
BOOL
WINAPI
SetDlgItemTextW(
    __in HWND hDlg,
    __in int nIDDlgItem,
    __in LPCWSTR lpString);
#ifdef UNICODE
#define SetDlgItemText  SetDlgItemTextW
#else
#define SetDlgItemText  SetDlgItemTextA
#endif // !UNICODE

WINUSERAPI
UINT
WINAPI
GetDlgItemTextA(
    __in HWND hDlg,
    __in int nIDDlgItem,
    __out_ecount(cchMax) LPSTR lpString,
    __in int cchMax);
WINUSERAPI
UINT
WINAPI
GetDlgItemTextW(
    __in HWND hDlg,
    __in int nIDDlgItem,
    __out_ecount(cchMax) LPWSTR lpString,
    __in int cchMax);
#ifdef UNICODE
#define GetDlgItemText  GetDlgItemTextW
#else
#define GetDlgItemText  GetDlgItemTextA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
CheckDlgButton(
    __in HWND hDlg,
    __in int nIDButton,
    __in UINT uCheck);

WINUSERAPI
BOOL
WINAPI
CheckRadioButton(
    __in HWND hDlg,
    __in int nIDFirstButton,
    __in int nIDLastButton,
    __in int nIDCheckButton);

WINUSERAPI
UINT
WINAPI
IsDlgButtonChecked(
    __in HWND hDlg,
    __in int nIDButton);

WINUSERAPI
LRESULT
WINAPI
SendDlgItemMessageA(
    __in HWND hDlg,
    __in int nIDDlgItem,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
LRESULT
WINAPI
SendDlgItemMessageW(
    __in HWND hDlg,
    __in int nIDDlgItem,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define SendDlgItemMessage  SendDlgItemMessageW
#else
#define SendDlgItemMessage  SendDlgItemMessageA
#endif // !UNICODE

WINUSERAPI
HWND
WINAPI
GetNextDlgGroupItem(
    __in HWND hDlg,
    __in_opt HWND hCtl,
    __in BOOL bPrevious);

WINUSERAPI
HWND
WINAPI
GetNextDlgTabItem(
    __in HWND hDlg,
    __in_opt HWND hCtl,
    __in BOOL bPrevious);

WINUSERAPI
int
WINAPI
GetDlgCtrlID(
    __in HWND hWnd);

WINUSERAPI
long
WINAPI
GetDialogBaseUnits(VOID);

WINUSERAPI
#ifndef _MAC
LRESULT
WINAPI
#else
LRESULT
CALLBACK
#endif
DefDlgProcA(
    __in HWND hDlg,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
#ifndef _MAC
LRESULT
WINAPI
#else
LRESULT
CALLBACK
#endif
DefDlgProcW(
    __in HWND hDlg,
    __in UINT Msg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define DefDlgProc  DefDlgProcW
#else
#define DefDlgProc  DefDlgProcA
#endif // !UNICODE

/*
 * Window extra byted needed for private dialog classes.
 */
#ifndef _MAC
#define DLGWINDOWEXTRA 30
#else
#define DLGWINDOWEXTRA 48
#endif

#endif /* !NOCTLMGR */

#ifndef NOMSG

WINUSERAPI
BOOL
WINAPI
CallMsgFilterA(
    __in LPMSG lpMsg,
    __in int nCode);
WINUSERAPI
BOOL
WINAPI
CallMsgFilterW(
    __in LPMSG lpMsg,
    __in int nCode);
#ifdef UNICODE
#define CallMsgFilter  CallMsgFilterW
#else
#define CallMsgFilter  CallMsgFilterA
#endif // !UNICODE

#endif /* !NOMSG */

#ifndef NOCLIPBOARD

/*
 * Clipboard Manager Functions
 */

WINUSERAPI
BOOL
WINAPI
OpenClipboard(
    __in_opt HWND hWndNewOwner);

WINUSERAPI
BOOL
WINAPI
CloseClipboard(
    VOID);


#if(WINVER >= 0x0500)

WINUSERAPI
DWORD
WINAPI
GetClipboardSequenceNumber(
    VOID);

#endif /* WINVER >= 0x0500 */

WINUSERAPI
HWND
WINAPI
GetClipboardOwner(
    VOID);

WINUSERAPI
HWND
WINAPI
SetClipboardViewer(
    __in HWND hWndNewViewer);

WINUSERAPI
HWND
WINAPI
GetClipboardViewer(
    VOID);

WINUSERAPI
BOOL
WINAPI
ChangeClipboardChain(
    __in HWND hWndRemove,
    __in HWND hWndNewNext);

WINUSERAPI
HANDLE
WINAPI
SetClipboardData(
    __in UINT uFormat,
    __in_opt HANDLE hMem);

WINUSERAPI
HANDLE
WINAPI
GetClipboardData(
    __in UINT uFormat);

WINUSERAPI
UINT
WINAPI
RegisterClipboardFormatA(
    __in LPCSTR lpszFormat);
WINUSERAPI
UINT
WINAPI
RegisterClipboardFormatW(
    __in LPCWSTR lpszFormat);
#ifdef UNICODE
#define RegisterClipboardFormat  RegisterClipboardFormatW
#else
#define RegisterClipboardFormat  RegisterClipboardFormatA
#endif // !UNICODE

WINUSERAPI
int
WINAPI
CountClipboardFormats(
    VOID);

WINUSERAPI
UINT
WINAPI
EnumClipboardFormats(
    __in UINT format);

WINUSERAPI
int
WINAPI
GetClipboardFormatNameA(
    __in UINT format,
    __out_ecount(cchMaxCount) LPSTR lpszFormatName,
    __in int cchMaxCount);
WINUSERAPI
int
WINAPI
GetClipboardFormatNameW(
    __in UINT format,
    __out_ecount(cchMaxCount) LPWSTR lpszFormatName,
    __in int cchMaxCount);
#ifdef UNICODE
#define GetClipboardFormatName  GetClipboardFormatNameW
#else
#define GetClipboardFormatName  GetClipboardFormatNameA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
EmptyClipboard(
    VOID);

WINUSERAPI
BOOL
WINAPI
IsClipboardFormatAvailable(
    __in UINT format);

WINUSERAPI
int
WINAPI
GetPriorityClipboardFormat(
    __in_ecount(cFormats) UINT *paFormatPriorityList,
    __in int cFormats);

WINUSERAPI
HWND
WINAPI
GetOpenClipboardWindow(
    VOID);

#if(WINVER >= 0x0600)
WINUSERAPI
BOOL
WINAPI
AddClipboardFormatListener(
    __in HWND hwnd);

WINUSERAPI
BOOL
WINAPI
RemoveClipboardFormatListener(
    __in HWND hwnd);

WINUSERAPI
BOOL
WINAPI
GetUpdatedClipboardFormats(
    __out_ecount(cFormats) __notnull PUINT lpuiFormats,
    __in UINT cFormats,
    __out __notnull PUINT pcFormatsOut);
#endif /* WINVER >= 0x0600 */
#endif /* !NOCLIPBOARD */

/*
 * Character Translation Routines
 */

WINUSERAPI
BOOL
WINAPI
CharToOemA(
    __in_xcount(strlen(pSrc) + 1) LPCSTR pSrc,
    __out_xcount(strlen(pSrc) + 1) LPSTR pDst);
WINUSERAPI
BOOL
WINAPI
CharToOemW(
    __in_xcount(strlen(pSrc) + 1) LPCWSTR pSrc,
    __out_xcount(strlen(pSrc) + 1) LPSTR pDst);
#ifdef UNICODE
#define CharToOem  CharToOemW
#else
#define CharToOem  CharToOemA
#endif // !UNICODE

__drv_preferredFunction("OemToCharBuff","Does not validate buffer size")
WINUSERAPI
BOOL
WINAPI
OemToCharA(
    __in_xcount(strlen(pSrc) + 1) LPCSTR pSrc,
    __out_xcount(strlen(pSrc) + 1) LPSTR pDst);
__drv_preferredFunction("OemToCharBuff","Does not validate buffer size")
WINUSERAPI
BOOL
WINAPI
OemToCharW(
    __in_xcount(strlen(pSrc) + 1) LPCSTR pSrc,
    __out_xcount(strlen(pSrc) + 1) LPWSTR pDst);
#ifdef UNICODE
#define OemToChar  OemToCharW
#else
#define OemToChar  OemToCharA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
CharToOemBuffA(
    __in LPCSTR lpszSrc,
    __out_ecount(cchDstLength) LPSTR lpszDst,
    __in DWORD cchDstLength);
WINUSERAPI
BOOL
WINAPI
CharToOemBuffW(
    __in LPCWSTR lpszSrc,
    __out_ecount(cchDstLength) LPSTR lpszDst,
    __in DWORD cchDstLength);
#ifdef UNICODE
#define CharToOemBuff  CharToOemBuffW
#else
#define CharToOemBuff  CharToOemBuffA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
OemToCharBuffA(
    __in LPCSTR lpszSrc,
    __out_ecount(cchDstLength) LPSTR lpszDst,
    __in DWORD cchDstLength);
WINUSERAPI
BOOL
WINAPI
OemToCharBuffW(
    __in LPCSTR lpszSrc,
    __out_ecount(cchDstLength) LPWSTR lpszDst,
    __in DWORD cchDstLength);
#ifdef UNICODE
#define OemToCharBuff  OemToCharBuffW
#else
#define OemToCharBuff  OemToCharBuffA
#endif // !UNICODE

WINUSERAPI
LPSTR
WINAPI
CharUpperA(
    __inout LPSTR lpsz);
WINUSERAPI
LPWSTR
WINAPI
CharUpperW(
    __inout LPWSTR lpsz);
#ifdef UNICODE
#define CharUpper  CharUpperW
#else
#define CharUpper  CharUpperA
#endif // !UNICODE

WINUSERAPI
DWORD
WINAPI
CharUpperBuffA(
    __inout_ecount(cchLength) LPSTR lpsz,
    __in DWORD cchLength);
WINUSERAPI
DWORD
WINAPI
CharUpperBuffW(
    __inout_ecount(cchLength) LPWSTR lpsz,
    __in DWORD cchLength);
#ifdef UNICODE
#define CharUpperBuff  CharUpperBuffW
#else
#define CharUpperBuff  CharUpperBuffA
#endif // !UNICODE

WINUSERAPI
LPSTR
WINAPI
CharLowerA(
    __inout LPSTR lpsz);
WINUSERAPI
LPWSTR
WINAPI
CharLowerW(
    __inout LPWSTR lpsz);
#ifdef UNICODE
#define CharLower  CharLowerW
#else
#define CharLower  CharLowerA
#endif // !UNICODE

WINUSERAPI
DWORD
WINAPI
CharLowerBuffA(
    __inout_ecount(cchLength) LPSTR lpsz,
    __in DWORD cchLength);
WINUSERAPI
DWORD
WINAPI
CharLowerBuffW(
    __inout_ecount(cchLength) LPWSTR lpsz,
    __in DWORD cchLength);
#ifdef UNICODE
#define CharLowerBuff  CharLowerBuffW
#else
#define CharLowerBuff  CharLowerBuffA
#endif // !UNICODE

WINUSERAPI
LPSTR
WINAPI
CharNextA(
    __in LPCSTR lpsz);
WINUSERAPI
LPWSTR
WINAPI
CharNextW(
    __in LPCWSTR lpsz);
#ifdef UNICODE
#define CharNext  CharNextW
#else
#define CharNext  CharNextA
#endif // !UNICODE

WINUSERAPI
LPSTR
WINAPI
CharPrevA(
    __in LPCSTR lpszStart,
    __in LPCSTR lpszCurrent);
WINUSERAPI
LPWSTR
WINAPI
CharPrevW(
    __in LPCWSTR lpszStart,
    __in LPCWSTR lpszCurrent);
#ifdef UNICODE
#define CharPrev  CharPrevW
#else
#define CharPrev  CharPrevA
#endif // !UNICODE

#if(WINVER >= 0x0400)
WINUSERAPI
LPSTR
WINAPI
CharNextExA(
     __in WORD CodePage,
     __in LPCSTR lpCurrentChar,
     __in DWORD dwFlags);

WINUSERAPI
LPSTR
WINAPI
CharPrevExA(
     __in WORD CodePage,
     __in LPCSTR lpStart,
     __in LPCSTR lpCurrentChar,
     __in DWORD dwFlags);
#endif /* WINVER >= 0x0400 */

/*
 * Compatibility defines for character translation routines
 */
#define AnsiToOem CharToOemA
#define OemToAnsi OemToCharA
#define AnsiToOemBuff CharToOemBuffA
#define OemToAnsiBuff OemToCharBuffA
#define AnsiUpper CharUpperA
#define AnsiUpperBuff CharUpperBuffA
#define AnsiLower CharLowerA
#define AnsiLowerBuff CharLowerBuffA
#define AnsiNext CharNextA
#define AnsiPrev CharPrevA

#ifndef  NOLANGUAGE
/*
 * Language dependent Routines
 */

WINUSERAPI
BOOL
WINAPI
IsCharAlphaA(
    __in CHAR ch);
WINUSERAPI
BOOL
WINAPI
IsCharAlphaW(
    __in WCHAR ch);
#ifdef UNICODE
#define IsCharAlpha  IsCharAlphaW
#else
#define IsCharAlpha  IsCharAlphaA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
IsCharAlphaNumericA(
    __in CHAR ch);
WINUSERAPI
BOOL
WINAPI
IsCharAlphaNumericW(
    __in WCHAR ch);
#ifdef UNICODE
#define IsCharAlphaNumeric  IsCharAlphaNumericW
#else
#define IsCharAlphaNumeric  IsCharAlphaNumericA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
IsCharUpperA(
    __in CHAR ch);
WINUSERAPI
BOOL
WINAPI
IsCharUpperW(
    __in WCHAR ch);
#ifdef UNICODE
#define IsCharUpper  IsCharUpperW
#else
#define IsCharUpper  IsCharUpperA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
IsCharLowerA(
    __in CHAR ch);
WINUSERAPI
BOOL
WINAPI
IsCharLowerW(
    __in WCHAR ch);
#ifdef UNICODE
#define IsCharLower  IsCharLowerW
#else
#define IsCharLower  IsCharLowerA
#endif // !UNICODE

#endif  /* !NOLANGUAGE */

WINUSERAPI
HWND
WINAPI
SetFocus(
    __in_opt HWND hWnd);

WINUSERAPI
HWND
WINAPI
GetActiveWindow(
    VOID);

WINUSERAPI
HWND
WINAPI
GetFocus(
    VOID);

WINUSERAPI
UINT
WINAPI
GetKBCodePage(
    VOID);

WINUSERAPI
SHORT
WINAPI
GetKeyState(
    __in int nVirtKey);

WINUSERAPI
SHORT
WINAPI
GetAsyncKeyState(
    __in int vKey);

WINUSERAPI
BOOL
WINAPI
GetKeyboardState(
    __out_ecount(256) PBYTE lpKeyState);

WINUSERAPI
BOOL
WINAPI
SetKeyboardState(
    __in_ecount(256) LPBYTE lpKeyState);

WINUSERAPI
int
WINAPI
GetKeyNameTextA(
    __in LONG lParam,
    __out_ecount(cchSize) LPSTR lpString,
    __in int cchSize);
WINUSERAPI
int
WINAPI
GetKeyNameTextW(
    __in LONG lParam,
    __out_ecount(cchSize) LPWSTR lpString,
    __in int cchSize);
#ifdef UNICODE
#define GetKeyNameText  GetKeyNameTextW
#else
#define GetKeyNameText  GetKeyNameTextA
#endif // !UNICODE

WINUSERAPI
int
WINAPI
GetKeyboardType(
    __in int nTypeFlag);

WINUSERAPI
int
WINAPI
ToAscii(
    __in UINT uVirtKey,
    __in UINT uScanCode,
    __in_ecount_opt(256) CONST BYTE *lpKeyState,
    __out LPWORD lpChar,
    __in UINT uFlags);

#if(WINVER >= 0x0400)
WINUSERAPI
int
WINAPI
ToAsciiEx(
    __in UINT uVirtKey,
    __in UINT uScanCode,
    __in_ecount_opt(256) CONST BYTE *lpKeyState,
    __out LPWORD lpChar,
    __in UINT uFlags,
    __in_opt HKL dwhkl);
#endif /* WINVER >= 0x0400 */

WINUSERAPI
int
WINAPI
ToUnicode(
    __in UINT wVirtKey,
    __in UINT wScanCode,
    __in_bcount_opt(256) CONST BYTE *lpKeyState,
    __out_ecount(cchBuff) LPWSTR pwszBuff,
    __in int cchBuff,
    __in UINT wFlags);

WINUSERAPI
DWORD
WINAPI
OemKeyScan(
    __in WORD wOemChar);

WINUSERAPI
SHORT
WINAPI
VkKeyScanA(
    __in CHAR ch);
WINUSERAPI
SHORT
WINAPI
VkKeyScanW(
    __in WCHAR ch);
#ifdef UNICODE
#define VkKeyScan  VkKeyScanW
#else
#define VkKeyScan  VkKeyScanA
#endif // !UNICODE

#if(WINVER >= 0x0400)
WINUSERAPI
SHORT
WINAPI
VkKeyScanExA(
    __in CHAR ch,
    __in HKL dwhkl);
WINUSERAPI
SHORT
WINAPI
VkKeyScanExW(
    __in WCHAR ch,
    __in HKL dwhkl);
#ifdef UNICODE
#define VkKeyScanEx  VkKeyScanExW
#else
#define VkKeyScanEx  VkKeyScanExA
#endif // !UNICODE
#endif /* WINVER >= 0x0400 */
#define KEYEVENTF_EXTENDEDKEY 0x0001
#define KEYEVENTF_KEYUP       0x0002
#if(_WIN32_WINNT >= 0x0500)
#define KEYEVENTF_UNICODE     0x0004
#define KEYEVENTF_SCANCODE    0x0008
#endif /* _WIN32_WINNT >= 0x0500 */

WINUSERAPI
VOID
WINAPI
keybd_event(
    __in BYTE bVk,
    __in BYTE bScan,
    __in DWORD dwFlags,
    __in ULONG_PTR dwExtraInfo);

#define MOUSEEVENTF_MOVE        0x0001 /* mouse move */
#define MOUSEEVENTF_LEFTDOWN    0x0002 /* left button down */
#define MOUSEEVENTF_LEFTUP      0x0004 /* left button up */
#define MOUSEEVENTF_RIGHTDOWN   0x0008 /* right button down */
#define MOUSEEVENTF_RIGHTUP     0x0010 /* right button up */
#define MOUSEEVENTF_MIDDLEDOWN  0x0020 /* middle button down */
#define MOUSEEVENTF_MIDDLEUP    0x0040 /* middle button up */
#define MOUSEEVENTF_XDOWN       0x0080 /* x button down */
#define MOUSEEVENTF_XUP         0x0100 /* x button down */
#define MOUSEEVENTF_WHEEL       0x0800 /* wheel button rolled */
#if (_WIN32_WINNT >= 0x0600)
#define MOUSEEVENTF_HWHEEL      0x01000 /* hwheel button rolled */
#endif
#if(WINVER >= 0x0600)
#define MOUSEEVENTF_MOVE_NOCOALESCE 0x2000 /* do not coalesce mouse moves */
#endif /* WINVER >= 0x0600 */
#define MOUSEEVENTF_VIRTUALDESK 0x4000 /* map to entire virtual desktop */
#define MOUSEEVENTF_ABSOLUTE    0x8000 /* absolute move */

WINUSERAPI
VOID
WINAPI
mouse_event(
    __in DWORD dwFlags,
    __in DWORD dx,
    __in DWORD dy,
    __in DWORD dwData,
    __in ULONG_PTR dwExtraInfo);

#if (_WIN32_WINNT > 0x0400)

typedef struct tagMOUSEINPUT {
    LONG    dx;
    LONG    dy;
    DWORD   mouseData;
    DWORD   dwFlags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} MOUSEINPUT, *PMOUSEINPUT, FAR* LPMOUSEINPUT;

typedef struct tagKEYBDINPUT {
    WORD    wVk;
    WORD    wScan;
    DWORD   dwFlags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT, FAR* LPKEYBDINPUT;

typedef struct tagHARDWAREINPUT {
    DWORD   uMsg;
    WORD    wParamL;
    WORD    wParamH;
} HARDWAREINPUT, *PHARDWAREINPUT, FAR* LPHARDWAREINPUT;

#define INPUT_MOUSE     0
#define INPUT_KEYBOARD  1
#define INPUT_HARDWARE  2

typedef struct tagINPUT {
    DWORD   type;

    union
    {
        MOUSEINPUT      mi;
        KEYBDINPUT      ki;
        HARDWAREINPUT   hi;
    };
} INPUT, *PINPUT, FAR* LPINPUT;

WINUSERAPI
UINT
WINAPI
SendInput(
    __in UINT cInputs,                     // number of input in the array
    __in_ecount(cInputs) LPINPUT pInputs,  // array of inputs
    __in int cbSize);                      // sizeof(INPUT)

#endif // (_WIN32_WINNT > 0x0400)

#if(WINVER >= 0x0601)

/*
 * Touch Input defines and functions
 */

/*
 * Touch input handle
 */
DECLARE_HANDLE(HTOUCHINPUT);

typedef struct tagTOUCHINPUT {
    LONG x;
    LONG y;
    HANDLE hSource;
    DWORD dwID;
    DWORD dwFlags;
    DWORD dwMask;
    DWORD dwTime;
    ULONG_PTR dwExtraInfo;
    DWORD cxContact;
    DWORD cyContact;
} TOUCHINPUT, *PTOUCHINPUT;
typedef TOUCHINPUT const * PCTOUCHINPUT;


/*
 * Conversion of touch input coordinates to pixels
 */
#define TOUCH_COORD_TO_PIXEL(l)         ((l) / 100)

/*
 * Touch input flag values (TOUCHINPUT.dwFlags)
 */
#define TOUCHEVENTF_MOVE            0x0001
#define TOUCHEVENTF_DOWN            0x0002
#define TOUCHEVENTF_UP              0x0004
#define TOUCHEVENTF_INRANGE         0x0008
#define TOUCHEVENTF_PRIMARY         0x0010
#define TOUCHEVENTF_NOCOALESCE      0x0020
#define TOUCHEVENTF_PEN             0x0040
#define TOUCHEVENTF_PALM            0x0080

/*
 * Touch input mask values (TOUCHINPUT.dwMask)
 */
#define TOUCHINPUTMASKF_TIMEFROMSYSTEM  0x0001  // the dwTime field contains a system generated value
#define TOUCHINPUTMASKF_EXTRAINFO       0x0002  // the dwExtraInfo field is valid
#define TOUCHINPUTMASKF_CONTACTAREA     0x0004  // the cxContact and cyContact fields are valid

WINUSERAPI
BOOL
WINAPI
GetTouchInputInfo(
    __in HTOUCHINPUT hTouchInput,               // input event handle; from touch message lParam
    __in UINT cInputs,                          // number of elements in the array
    __out_ecount(cInputs) PTOUCHINPUT pInputs,  // array of touch inputs
    __in int cbSize);                           // sizeof(TOUCHINPUT)

WINUSERAPI
BOOL
WINAPI
CloseTouchInputHandle(
    __in HTOUCHINPUT hTouchInput);                   // input event handle; from touch message lParam


/*
 * RegisterTouchWindow flag values
 */
#define TWF_FINETOUCH       (0x00000001)
#define TWF_WANTPALM        (0x00000002)

WINUSERAPI
BOOL
WINAPI
RegisterTouchWindow(
    __in HWND hwnd,
    __in ULONG ulFlags);

WINUSERAPI
BOOL
WINAPI
UnregisterTouchWindow(
    __in HWND hwnd);

WINUSERAPI
BOOL
WINAPI
IsTouchWindow(
    __in HWND hwnd,
    __out_opt PULONG pulFlags);

#endif /* WINVER >= 0x0601 */

#if(_WIN32_WINNT >= 0x0500)
typedef struct tagLASTINPUTINFO {
    UINT cbSize;
    DWORD dwTime;
} LASTINPUTINFO, * PLASTINPUTINFO;

WINUSERAPI
BOOL
WINAPI
GetLastInputInfo(
    __out PLASTINPUTINFO plii);
#endif /* _WIN32_WINNT >= 0x0500 */

WINUSERAPI
UINT
WINAPI
MapVirtualKeyA(
    __in UINT uCode,
    __in UINT uMapType);
WINUSERAPI
UINT
WINAPI
MapVirtualKeyW(
    __in UINT uCode,
    __in UINT uMapType);
#ifdef UNICODE
#define MapVirtualKey  MapVirtualKeyW
#else
#define MapVirtualKey  MapVirtualKeyA
#endif // !UNICODE

#if(WINVER >= 0x0400)
WINUSERAPI
UINT
WINAPI
MapVirtualKeyExA(
    __in UINT uCode,
    __in UINT uMapType,
    __in_opt HKL dwhkl);
WINUSERAPI
UINT
WINAPI
MapVirtualKeyExW(
    __in UINT uCode,
    __in UINT uMapType,
    __in_opt HKL dwhkl);
#ifdef UNICODE
#define MapVirtualKeyEx  MapVirtualKeyExW
#else
#define MapVirtualKeyEx  MapVirtualKeyExA
#endif // !UNICODE

#define MAPVK_VK_TO_VSC     (0)
#define MAPVK_VSC_TO_VK     (1)
#define MAPVK_VK_TO_CHAR    (2)
#define MAPVK_VSC_TO_VK_EX  (3)
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0600)
#define MAPVK_VK_TO_VSC_EX  (4)
#endif /* WINVER >= 0x0600 */

WINUSERAPI
BOOL
WINAPI
GetInputState(
    VOID);

WINUSERAPI
DWORD
WINAPI
GetQueueStatus(
    __in UINT flags);


WINUSERAPI
HWND
WINAPI
GetCapture(
    VOID);

WINUSERAPI
HWND
WINAPI
SetCapture(
    __in HWND hWnd);

WINUSERAPI
BOOL
WINAPI
ReleaseCapture(
    VOID);

WINUSERAPI
DWORD
WINAPI
MsgWaitForMultipleObjects(
    __in DWORD nCount,
    __in_ecount_opt(nCount) CONST HANDLE *pHandles,
    __in BOOL fWaitAll,
    __in DWORD dwMilliseconds,
    __in DWORD dwWakeMask);

WINUSERAPI
DWORD
WINAPI
MsgWaitForMultipleObjectsEx(
    __in DWORD nCount,
    __in_ecount_opt(nCount) CONST HANDLE *pHandles,
    __in DWORD dwMilliseconds,
    __in DWORD dwWakeMask,
    __in DWORD dwFlags);


#define MWMO_WAITALL        0x0001
#define MWMO_ALERTABLE      0x0002
#define MWMO_INPUTAVAILABLE 0x0004

/*
 * Queue status flags for GetQueueStatus() and MsgWaitForMultipleObjects()
 */
#define QS_KEY              0x0001
#define QS_MOUSEMOVE        0x0002
#define QS_MOUSEBUTTON      0x0004
#define QS_POSTMESSAGE      0x0008
#define QS_TIMER            0x0010
#define QS_PAINT            0x0020
#define QS_SENDMESSAGE      0x0040
#define QS_HOTKEY           0x0080
#define QS_ALLPOSTMESSAGE   0x0100
#if(_WIN32_WINNT >= 0x0501)
#define QS_RAWINPUT         0x0400
#endif /* _WIN32_WINNT >= 0x0501 */

#define QS_MOUSE           (QS_MOUSEMOVE     | \
                            QS_MOUSEBUTTON)

#if (_WIN32_WINNT >= 0x0501)
#define QS_INPUT           (QS_MOUSE         | \
                            QS_KEY           | \
                            QS_RAWINPUT)
#else
#define QS_INPUT           (QS_MOUSE         | \
                            QS_KEY)
#endif // (_WIN32_WINNT >= 0x0501)

#define QS_ALLEVENTS       (QS_INPUT         | \
                            QS_POSTMESSAGE   | \
                            QS_TIMER         | \
                            QS_PAINT         | \
                            QS_HOTKEY)

#define QS_ALLINPUT        (QS_INPUT         | \
                            QS_POSTMESSAGE   | \
                            QS_TIMER         | \
                            QS_PAINT         | \
                            QS_HOTKEY        | \
                            QS_SENDMESSAGE)


#define USER_TIMER_MAXIMUM  0x7FFFFFFF
#define USER_TIMER_MINIMUM  0x0000000A

/*
 * Windows Functions
 */

WINUSERAPI
UINT_PTR
WINAPI
SetTimer(
    __in_opt HWND hWnd,
    __in UINT_PTR nIDEvent,
    __in UINT uElapse,
    __in_opt TIMERPROC lpTimerFunc);

WINUSERAPI
BOOL
WINAPI
KillTimer(
    __in_opt HWND hWnd,
    __in UINT_PTR uIDEvent);

WINUSERAPI
BOOL
WINAPI
IsWindowUnicode(
    __in HWND hWnd);

WINUSERAPI
BOOL
WINAPI
EnableWindow(
    __in HWND hWnd,
    __in BOOL bEnable);

WINUSERAPI
BOOL
WINAPI
IsWindowEnabled(
    __in HWND hWnd);

WINUSERAPI
HACCEL
WINAPI
LoadAcceleratorsA(
    __in_opt HINSTANCE hInstance,
    __in LPCSTR lpTableName);
WINUSERAPI
HACCEL
WINAPI
LoadAcceleratorsW(
    __in_opt HINSTANCE hInstance,
    __in LPCWSTR lpTableName);
#ifdef UNICODE
#define LoadAccelerators  LoadAcceleratorsW
#else
#define LoadAccelerators  LoadAcceleratorsA
#endif // !UNICODE

WINUSERAPI
HACCEL
WINAPI
CreateAcceleratorTableA(
    __in_ecount(cAccel) LPACCEL paccel,
    __in int cAccel);
WINUSERAPI
HACCEL
WINAPI
CreateAcceleratorTableW(
    __in_ecount(cAccel) LPACCEL paccel,
    __in int cAccel);
#ifdef UNICODE
#define CreateAcceleratorTable  CreateAcceleratorTableW
#else
#define CreateAcceleratorTable  CreateAcceleratorTableA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
DestroyAcceleratorTable(
    __in HACCEL hAccel);

WINUSERAPI
int
WINAPI
CopyAcceleratorTableA(
    __in HACCEL hAccelSrc,
    __out_ecount_part_opt(cAccelEntries, return) LPACCEL lpAccelDst,
    __in int cAccelEntries);
WINUSERAPI
int
WINAPI
CopyAcceleratorTableW(
    __in HACCEL hAccelSrc,
    __out_ecount_part_opt(cAccelEntries, return) LPACCEL lpAccelDst,
    __in int cAccelEntries);
#ifdef UNICODE
#define CopyAcceleratorTable  CopyAcceleratorTableW
#else
#define CopyAcceleratorTable  CopyAcceleratorTableA
#endif // !UNICODE

#ifndef NOMSG

WINUSERAPI
int
WINAPI
TranslateAcceleratorA(
    __in HWND hWnd,
    __in HACCEL hAccTable,
    __in LPMSG lpMsg);
WINUSERAPI
int
WINAPI
TranslateAcceleratorW(
    __in HWND hWnd,
    __in HACCEL hAccTable,
    __in LPMSG lpMsg);
#ifdef UNICODE
#define TranslateAccelerator  TranslateAcceleratorW
#else
#define TranslateAccelerator  TranslateAcceleratorA
#endif // !UNICODE

#endif /* !NOMSG */

#ifndef NOSYSMETRICS

/*
 * GetSystemMetrics() codes
 */

#define SM_CXSCREEN             0
#define SM_CYSCREEN             1
#define SM_CXVSCROLL            2
#define SM_CYHSCROLL            3
#define SM_CYCAPTION            4
#define SM_CXBORDER             5
#define SM_CYBORDER             6
#define SM_CXDLGFRAME           7
#define SM_CYDLGFRAME           8
#define SM_CYVTHUMB             9
#define SM_CXHTHUMB             10
#define SM_CXICON               11
#define SM_CYICON               12
#define SM_CXCURSOR             13
#define SM_CYCURSOR             14
#define SM_CYMENU               15
#define SM_CXFULLSCREEN         16
#define SM_CYFULLSCREEN         17
#define SM_CYKANJIWINDOW        18
#define SM_MOUSEPRESENT         19
#define SM_CYVSCROLL            20
#define SM_CXHSCROLL            21
#define SM_DEBUG                22
#define SM_SWAPBUTTON           23
#define SM_RESERVED1            24
#define SM_RESERVED2            25
#define SM_RESERVED3            26
#define SM_RESERVED4            27
#define SM_CXMIN                28
#define SM_CYMIN                29
#define SM_CXSIZE               30
#define SM_CYSIZE               31
#define SM_CXFRAME              32
#define SM_CYFRAME              33
#define SM_CXMINTRACK           34
#define SM_CYMINTRACK           35
#define SM_CXDOUBLECLK          36
#define SM_CYDOUBLECLK          37
#define SM_CXICONSPACING        38
#define SM_CYICONSPACING        39
#define SM_MENUDROPALIGNMENT    40
#define SM_PENWINDOWS           41
#define SM_DBCSENABLED          42
#define SM_CMOUSEBUTTONS        43

#if(WINVER >= 0x0400)
#define SM_CXFIXEDFRAME           SM_CXDLGFRAME  /* ;win40 name change */
#define SM_CYFIXEDFRAME           SM_CYDLGFRAME  /* ;win40 name change */
#define SM_CXSIZEFRAME            SM_CXFRAME     /* ;win40 name change */
#define SM_CYSIZEFRAME            SM_CYFRAME     /* ;win40 name change */

#define SM_SECURE               44
#define SM_CXEDGE               45
#define SM_CYEDGE               46
#define SM_CXMINSPACING         47
#define SM_CYMINSPACING         48
#define SM_CXSMICON             49
#define SM_CYSMICON             50
#define SM_CYSMCAPTION          51
#define SM_CXSMSIZE             52
#define SM_CYSMSIZE             53
#define SM_CXMENUSIZE           54
#define SM_CYMENUSIZE           55
#define SM_ARRANGE              56
#define SM_CXMINIMIZED          57
#define SM_CYMINIMIZED          58
#define SM_CXMAXTRACK           59
#define SM_CYMAXTRACK           60
#define SM_CXMAXIMIZED          61
#define SM_CYMAXIMIZED          62
#define SM_NETWORK              63
#define SM_CLEANBOOT            67
#define SM_CXDRAG               68
#define SM_CYDRAG               69
#endif /* WINVER >= 0x0400 */
#define SM_SHOWSOUNDS           70
#if(WINVER >= 0x0400)
#define SM_CXMENUCHECK          71   /* Use instead of GetMenuCheckMarkDimensions()! */
#define SM_CYMENUCHECK          72
#define SM_SLOWMACHINE          73
#define SM_MIDEASTENABLED       74
#endif /* WINVER >= 0x0400 */

#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
#define SM_MOUSEWHEELPRESENT    75
#endif
#if(WINVER >= 0x0500)
#define SM_XVIRTUALSCREEN       76
#define SM_YVIRTUALSCREEN       77
#define SM_CXVIRTUALSCREEN      78
#define SM_CYVIRTUALSCREEN      79
#define SM_CMONITORS            80
#define SM_SAMEDISPLAYFORMAT    81
#endif /* WINVER >= 0x0500 */
#if(_WIN32_WINNT >= 0x0500)
#define SM_IMMENABLED           82
#endif /* _WIN32_WINNT >= 0x0500 */
#if(_WIN32_WINNT >= 0x0501)
#define SM_CXFOCUSBORDER        83
#define SM_CYFOCUSBORDER        84
#endif /* _WIN32_WINNT >= 0x0501 */

#if(_WIN32_WINNT >= 0x0501)
#define SM_TABLETPC             86
#define SM_MEDIACENTER          87
#define SM_STARTER              88
#define SM_SERVERR2             89
#endif /* _WIN32_WINNT >= 0x0501 */

#if(_WIN32_WINNT >= 0x0600)
#define SM_MOUSEHORIZONTALWHEELPRESENT    91
#define SM_CXPADDEDBORDER       92
#endif /* _WIN32_WINNT >= 0x0600 */

#if(WINVER >= 0x0601)

#define SM_DIGITIZER            94
#define SM_MAXIMUMTOUCHES       95
#endif /* WINVER >= 0x0601 */

#if (WINVER < 0x0500) && (!defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0400)) #define SM_CMETRICS 76 #elif WINVER == 0x500 #define SM_CMETRICS 83 #elif WINVER == 0x501 #define SM_CMETRICS 91 #elif WINVER == 0x600 #define SM_CMETRICS 93 #else #define SM_CMETRICS 97 #endif #if(WINVER >= 0x0500)
#define SM_REMOTESESSION        0x1000


#if(_WIN32_WINNT >= 0x0501)
#define SM_SHUTTINGDOWN         0x2000
#endif /* _WIN32_WINNT >= 0x0501 */

#if(WINVER >= 0x0501)
#define SM_REMOTECONTROL        0x2001
#endif /* WINVER >= 0x0501 */

#if(WINVER >= 0x0501)
#define SM_CARETBLINKINGENABLED 0x2002
#endif /* WINVER >= 0x0501 */

#endif /* WINVER >= 0x0500 */


WINUSERAPI
int
WINAPI
GetSystemMetrics(
    __in int nIndex);


#endif /* !NOSYSMETRICS */

#ifndef NOMENUS

WINUSERAPI
HMENU
WINAPI
LoadMenuA(
    __in_opt HINSTANCE hInstance,
    __in LPCSTR lpMenuName);
WINUSERAPI
HMENU
WINAPI
LoadMenuW(
    __in_opt HINSTANCE hInstance,
    __in LPCWSTR lpMenuName);
#ifdef UNICODE
#define LoadMenu  LoadMenuW
#else
#define LoadMenu  LoadMenuA
#endif // !UNICODE

WINUSERAPI
HMENU
WINAPI
LoadMenuIndirectA(
    __in CONST MENUTEMPLATEA *lpMenuTemplate);
WINUSERAPI
HMENU
WINAPI
LoadMenuIndirectW(
    __in CONST MENUTEMPLATEW *lpMenuTemplate);
#ifdef UNICODE
#define LoadMenuIndirect  LoadMenuIndirectW
#else
#define LoadMenuIndirect  LoadMenuIndirectA
#endif // !UNICODE

WINUSERAPI
HMENU
WINAPI
GetMenu(
    __in HWND hWnd);

WINUSERAPI
BOOL
WINAPI
SetMenu(
    __in HWND hWnd,
    __in_opt HMENU hMenu);

WINUSERAPI
BOOL
WINAPI
ChangeMenuA(
    __in HMENU hMenu,
    __in UINT cmd,
    __in_opt LPCSTR lpszNewItem,
    __in UINT cmdInsert,
    __in UINT flags);
WINUSERAPI
BOOL
WINAPI
ChangeMenuW(
    __in HMENU hMenu,
    __in UINT cmd,
    __in_opt LPCWSTR lpszNewItem,
    __in UINT cmdInsert,
    __in UINT flags);
#ifdef UNICODE
#define ChangeMenu  ChangeMenuW
#else
#define ChangeMenu  ChangeMenuA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
HiliteMenuItem(
    __in HWND hWnd,
    __in HMENU hMenu,
    __in UINT uIDHiliteItem,
    __in UINT uHilite);

WINUSERAPI
int
WINAPI
GetMenuStringA(
    __in HMENU hMenu,
    __in UINT uIDItem,
    __out_ecount_opt(cchMax) LPSTR lpString,
    __in int cchMax,
    __in UINT flags);
WINUSERAPI
int
WINAPI
GetMenuStringW(
    __in HMENU hMenu,
    __in UINT uIDItem,
    __out_ecount_opt(cchMax) LPWSTR lpString,
    __in int cchMax,
    __in UINT flags);
#ifdef UNICODE
#define GetMenuString  GetMenuStringW
#else
#define GetMenuString  GetMenuStringA
#endif // !UNICODE

WINUSERAPI
UINT
WINAPI
GetMenuState(
    __in HMENU hMenu,
    __in UINT uId,
    __in UINT uFlags);

WINUSERAPI
BOOL
WINAPI
DrawMenuBar(
    __in HWND hWnd);

#if(_WIN32_WINNT >= 0x0501)
#define PMB_ACTIVE      0x00000001

#endif /* _WIN32_WINNT >= 0x0501 */


WINUSERAPI
HMENU
WINAPI
GetSystemMenu(
    __in HWND hWnd,
    __in BOOL bRevert);


WINUSERAPI
HMENU
WINAPI
CreateMenu(
    VOID);

WINUSERAPI
HMENU
WINAPI
CreatePopupMenu(
    VOID);

WINUSERAPI
BOOL
WINAPI
DestroyMenu(
    __in HMENU hMenu);

WINUSERAPI
DWORD
WINAPI
CheckMenuItem(
    __in HMENU hMenu,
    __in UINT uIDCheckItem,
    __in UINT uCheck);

WINUSERAPI
BOOL
WINAPI
EnableMenuItem(
    __in HMENU hMenu,
    __in UINT uIDEnableItem,
    __in UINT uEnable);

WINUSERAPI
HMENU
WINAPI
GetSubMenu(
    __in HMENU hMenu,
    __in int nPos);

WINUSERAPI
UINT
WINAPI
GetMenuItemID(
    __in HMENU hMenu,
    __in int nPos);

WINUSERAPI
int
WINAPI
GetMenuItemCount(
    __in_opt HMENU hMenu);

WINUSERAPI
BOOL
WINAPI
InsertMenuA(
    __in HMENU hMenu,
    __in UINT uPosition,
    __in UINT uFlags,
    __in UINT_PTR uIDNewItem,
    __in_opt LPCSTR lpNewItem);
WINUSERAPI
BOOL
WINAPI
InsertMenuW(
    __in HMENU hMenu,
    __in UINT uPosition,
    __in UINT uFlags,
    __in UINT_PTR uIDNewItem,
    __in_opt LPCWSTR lpNewItem);
#ifdef UNICODE
#define InsertMenu  InsertMenuW
#else
#define InsertMenu  InsertMenuA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
AppendMenuA(
    __in HMENU hMenu,
    __in UINT uFlags,
    __in UINT_PTR uIDNewItem,
    __in_opt LPCSTR lpNewItem);
WINUSERAPI
BOOL
WINAPI
AppendMenuW(
    __in HMENU hMenu,
    __in UINT uFlags,
    __in UINT_PTR uIDNewItem,
    __in_opt LPCWSTR lpNewItem);
#ifdef UNICODE
#define AppendMenu  AppendMenuW
#else
#define AppendMenu  AppendMenuA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
ModifyMenuA(
    __in HMENU hMnu,
    __in UINT uPosition,
    __in UINT uFlags,
    __in UINT_PTR uIDNewItem,
    __in_opt LPCSTR lpNewItem);
WINUSERAPI
BOOL
WINAPI
ModifyMenuW(
    __in HMENU hMnu,
    __in UINT uPosition,
    __in UINT uFlags,
    __in UINT_PTR uIDNewItem,
    __in_opt LPCWSTR lpNewItem);
#ifdef UNICODE
#define ModifyMenu  ModifyMenuW
#else
#define ModifyMenu  ModifyMenuA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI RemoveMenu(
    __in HMENU hMenu,
    __in UINT uPosition,
    __in UINT uFlags);

WINUSERAPI
BOOL
WINAPI
DeleteMenu(
    __in HMENU hMenu,
    __in UINT uPosition,
    __in UINT uFlags);

WINUSERAPI
BOOL
WINAPI
SetMenuItemBitmaps(
    __in HMENU hMenu,
    __in UINT uPosition,
    __in UINT uFlags,
    __in_opt HBITMAP hBitmapUnchecked,
    __in_opt HBITMAP hBitmapChecked);

WINUSERAPI
LONG
WINAPI
GetMenuCheckMarkDimensions(
    VOID);

WINUSERAPI
BOOL
WINAPI
TrackPopupMenu(
    __in HMENU hMenu,
    __in UINT uFlags,
    __in int x,
    __in int y,
    __in int nReserved,
    __in HWND hWnd,
    __in_opt CONST RECT *prcRect);

#if(WINVER >= 0x0400)
/* return codes for WM_MENUCHAR */
#define MNC_IGNORE  0
#define MNC_CLOSE   1
#define MNC_EXECUTE 2
#define MNC_SELECT  3

typedef struct tagTPMPARAMS
{
    UINT    cbSize;     /* Size of structure */
    RECT    rcExclude;  /* Screen coordinates of rectangle to exclude when positioning */
}   TPMPARAMS;
typedef TPMPARAMS FAR *LPTPMPARAMS;

WINUSERAPI
BOOL
WINAPI
TrackPopupMenuEx(
    __in HMENU,
    __in UINT,
    __in int,
    __in int,
    __in HWND,
    __in_opt LPTPMPARAMS);
#endif /* WINVER >= 0x0400 */

#if(_WIN32_WINNT >= 0x0601)
WINUSERAPI
BOOL
WINAPI
CalculatePopupWindowPosition(
    __in const POINT *anchorPoint,
    __in const SIZE *windowSize,
    __in UINT /* TPM_XXX values */ flags,
    __in_opt RECT *excludeRect,
    __out RECT *popupWindowPosition);

#endif /* _WIN32_WINNT >= 0x0601 */

#if(WINVER >= 0x0500)

#define MNS_NOCHECK         0x80000000
#define MNS_MODELESS        0x40000000
#define MNS_DRAGDROP        0x20000000
#define MNS_AUTODISMISS     0x10000000
#define MNS_NOTIFYBYPOS     0x08000000
#define MNS_CHECKORBMP      0x04000000

#define MIM_MAXHEIGHT               0x00000001
#define MIM_BACKGROUND              0x00000002
#define MIM_HELPID                  0x00000004
#define MIM_MENUDATA                0x00000008
#define MIM_STYLE                   0x00000010
#define MIM_APPLYTOSUBMENUS         0x80000000

typedef struct tagMENUINFO
{
    DWORD   cbSize;
    DWORD   fMask;
    DWORD   dwStyle;
    UINT    cyMax;
    HBRUSH  hbrBack;
    DWORD   dwContextHelpID;
    ULONG_PTR dwMenuData;
}   MENUINFO, FAR *LPMENUINFO;
typedef MENUINFO CONST FAR *LPCMENUINFO;

WINUSERAPI
BOOL
WINAPI
GetMenuInfo(
    __in HMENU,
    __inout LPMENUINFO);

WINUSERAPI
BOOL
WINAPI
SetMenuInfo(
    __in HMENU,
    __in LPCMENUINFO);

WINUSERAPI
BOOL
WINAPI
EndMenu(
        VOID);

/*
 * WM_MENUDRAG return values.
 */
#define MND_CONTINUE       0
#define MND_ENDMENU        1

typedef struct tagMENUGETOBJECTINFO
{
    DWORD dwFlags;
    UINT uPos;
    HMENU hmenu;
    PVOID riid;
    PVOID pvObj;
} MENUGETOBJECTINFO, * PMENUGETOBJECTINFO;

/*
 * MENUGETOBJECTINFO dwFlags values
 */
#define MNGOF_TOPGAP         0x00000001
#define MNGOF_BOTTOMGAP      0x00000002

/*
 * WM_MENUGETOBJECT return values
 */
#define MNGO_NOINTERFACE     0x00000000
#define MNGO_NOERROR         0x00000001
#endif /* WINVER >= 0x0500 */

#if(WINVER >= 0x0400)
#define MIIM_STATE       0x00000001
#define MIIM_ID          0x00000002
#define MIIM_SUBMENU     0x00000004
#define MIIM_CHECKMARKS  0x00000008
#define MIIM_TYPE        0x00000010
#define MIIM_DATA        0x00000020
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0500)
#define MIIM_STRING      0x00000040
#define MIIM_BITMAP      0x00000080
#define MIIM_FTYPE       0x00000100

#define HBMMENU_CALLBACK            ((HBITMAP) -1)
#define HBMMENU_SYSTEM              ((HBITMAP)  1)
#define HBMMENU_MBAR_RESTORE        ((HBITMAP)  2)
#define HBMMENU_MBAR_MINIMIZE       ((HBITMAP)  3)
#define HBMMENU_MBAR_CLOSE          ((HBITMAP)  5)
#define HBMMENU_MBAR_CLOSE_D        ((HBITMAP)  6)
#define HBMMENU_MBAR_MINIMIZE_D     ((HBITMAP)  7)
#define HBMMENU_POPUP_CLOSE         ((HBITMAP)  8)
#define HBMMENU_POPUP_RESTORE       ((HBITMAP)  9)
#define HBMMENU_POPUP_MAXIMIZE      ((HBITMAP) 10)
#define HBMMENU_POPUP_MINIMIZE      ((HBITMAP) 11)
#endif /* WINVER >= 0x0500 */

#if(WINVER >= 0x0400)
typedef struct tagMENUITEMINFOA
{
    UINT     cbSize;
    UINT     fMask;
    UINT     fType;         // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
    UINT     fState;        // used if MIIM_STATE
    UINT     wID;           // used if MIIM_ID
    HMENU    hSubMenu;      // used if MIIM_SUBMENU
    HBITMAP  hbmpChecked;   // used if MIIM_CHECKMARKS
    HBITMAP  hbmpUnchecked; // used if MIIM_CHECKMARKS
    ULONG_PTR dwItemData;   // used if MIIM_DATA
    __field_ecount_opt(cch) LPSTR    dwTypeData;    // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
    UINT     cch;           // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
#if(WINVER >= 0x0500)
    HBITMAP  hbmpItem;      // used if MIIM_BITMAP
#endif /* WINVER >= 0x0500 */
}   MENUITEMINFOA, FAR *LPMENUITEMINFOA;
typedef struct tagMENUITEMINFOW
{
    UINT     cbSize;
    UINT     fMask;
    UINT     fType;         // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
    UINT     fState;        // used if MIIM_STATE
    UINT     wID;           // used if MIIM_ID
    HMENU    hSubMenu;      // used if MIIM_SUBMENU
    HBITMAP  hbmpChecked;   // used if MIIM_CHECKMARKS
    HBITMAP  hbmpUnchecked; // used if MIIM_CHECKMARKS
    ULONG_PTR dwItemData;   // used if MIIM_DATA
    __field_ecount_opt(cch) LPWSTR   dwTypeData;    // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
    UINT     cch;           // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
#if(WINVER >= 0x0500)
    HBITMAP  hbmpItem;      // used if MIIM_BITMAP
#endif /* WINVER >= 0x0500 */
}   MENUITEMINFOW, FAR *LPMENUITEMINFOW;
#ifdef UNICODE
typedef MENUITEMINFOW MENUITEMINFO;
typedef LPMENUITEMINFOW LPMENUITEMINFO;
#else
typedef MENUITEMINFOA MENUITEMINFO;
typedef LPMENUITEMINFOA LPMENUITEMINFO;
#endif // UNICODE
typedef MENUITEMINFOA CONST FAR *LPCMENUITEMINFOA;
typedef MENUITEMINFOW CONST FAR *LPCMENUITEMINFOW;
#ifdef UNICODE
typedef LPCMENUITEMINFOW LPCMENUITEMINFO;
#else
typedef LPCMENUITEMINFOA LPCMENUITEMINFO;
#endif // UNICODE


WINUSERAPI
BOOL
WINAPI
InsertMenuItemA(
    __in HMENU hmenu,
    __in UINT item,
    __in BOOL fByPosition,
    __in LPCMENUITEMINFOA lpmi);
WINUSERAPI
BOOL
WINAPI
InsertMenuItemW(
    __in HMENU hmenu,
    __in UINT item,
    __in BOOL fByPosition,
    __in LPCMENUITEMINFOW lpmi);
#ifdef UNICODE
#define InsertMenuItem  InsertMenuItemW
#else
#define InsertMenuItem  InsertMenuItemA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
GetMenuItemInfoA(
    __in HMENU hmenu,
    __in UINT item,
    __in BOOL fByPosition,
    __inout LPMENUITEMINFOA lpmii);
WINUSERAPI
BOOL
WINAPI
GetMenuItemInfoW(
    __in HMENU hmenu,
    __in UINT item,
    __in BOOL fByPosition,
    __inout LPMENUITEMINFOW lpmii);
#ifdef UNICODE
#define GetMenuItemInfo  GetMenuItemInfoW
#else
#define GetMenuItemInfo  GetMenuItemInfoA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
SetMenuItemInfoA(
    __in HMENU hmenu,
    __in UINT item,
    __in BOOL fByPositon,
    __in LPCMENUITEMINFOA lpmii);
WINUSERAPI
BOOL
WINAPI
SetMenuItemInfoW(
    __in HMENU hmenu,
    __in UINT item,
    __in BOOL fByPositon,
    __in LPCMENUITEMINFOW lpmii);
#ifdef UNICODE
#define SetMenuItemInfo  SetMenuItemInfoW
#else
#define SetMenuItemInfo  SetMenuItemInfoA
#endif // !UNICODE


#define GMDI_USEDISABLED    0x0001L
#define GMDI_GOINTOPOPUPS   0x0002L

WINUSERAPI
UINT
WINAPI
GetMenuDefaultItem(
    __in HMENU hMenu,
    __in UINT fByPos,
    __in UINT gmdiFlags);

WINUSERAPI
BOOL
WINAPI
SetMenuDefaultItem(
    __in HMENU hMenu,
    __in UINT uItem,
    __in UINT fByPos);

WINUSERAPI
BOOL
WINAPI
GetMenuItemRect(
    __in_opt HWND hWnd,
    __in HMENU hMenu,
    __in UINT uItem,
    __out LPRECT lprcItem);

WINUSERAPI
int
WINAPI
MenuItemFromPoint(
    __in_opt HWND hWnd,
    __in HMENU hMenu,
    __in POINT ptScreen);
#endif /* WINVER >= 0x0400 */

/*
 * Flags for TrackPopupMenu
 */
#define TPM_LEFTBUTTON  0x0000L
#define TPM_RIGHTBUTTON 0x0002L
#define TPM_LEFTALIGN   0x0000L
#define TPM_CENTERALIGN 0x0004L
#define TPM_RIGHTALIGN  0x0008L
#if(WINVER >= 0x0400)
#define TPM_TOPALIGN        0x0000L
#define TPM_VCENTERALIGN    0x0010L
#define TPM_BOTTOMALIGN     0x0020L

#define TPM_HORIZONTAL      0x0000L     /* Horz alignment matters more */
#define TPM_VERTICAL        0x0040L     /* Vert alignment matters more */
#define TPM_NONOTIFY        0x0080L     /* Don't send any notification msgs */
#define TPM_RETURNCMD       0x0100L
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0500)
#define TPM_RECURSE         0x0001L
#define TPM_HORPOSANIMATION 0x0400L
#define TPM_HORNEGANIMATION 0x0800L
#define TPM_VERPOSANIMATION 0x1000L
#define TPM_VERNEGANIMATION 0x2000L
#if(_WIN32_WINNT >= 0x0500)
#define TPM_NOANIMATION     0x4000L
#endif /* _WIN32_WINNT >= 0x0500 */
#if(_WIN32_WINNT >= 0x0501)
#define TPM_LAYOUTRTL       0x8000L
#endif /* _WIN32_WINNT >= 0x0501 */
#endif /* WINVER >= 0x0500 */
#if(_WIN32_WINNT >= 0x0601)
#define TPM_WORKAREA        0x10000L
#endif /* _WIN32_WINNT >= 0x0601 */


#endif /* !NOMENUS */


#if(WINVER >= 0x0400)
//
// Drag-and-drop support
// Obsolete - use OLE instead
//
typedef struct tagDROPSTRUCT
{
    HWND    hwndSource;
    HWND    hwndSink;
    DWORD   wFmt;
    ULONG_PTR dwData;
    POINT   ptDrop;
    DWORD   dwControlData;
} DROPSTRUCT, *PDROPSTRUCT, *LPDROPSTRUCT;

#define DOF_EXECUTABLE      0x8001      // wFmt flags
#define DOF_DOCUMENT        0x8002
#define DOF_DIRECTORY       0x8003
#define DOF_MULTIPLE        0x8004
#define DOF_PROGMAN         0x0001
#define DOF_SHELLDATA       0x0002

#define DO_DROPFILE         0x454C4946L
#define DO_PRINTFILE        0x544E5250L

WINUSERAPI
DWORD
WINAPI
DragObject(
    __in HWND hwndParent,
    __in HWND hwndFrom,
    __in UINT fmt,
    __in ULONG_PTR data,
    __in_opt HCURSOR hcur);

WINUSERAPI
BOOL
WINAPI
DragDetect(
    __in HWND hwnd,
    __in POINT pt);
#endif /* WINVER >= 0x0400 */

WINUSERAPI
BOOL
WINAPI
DrawIcon(
    __in HDC hDC,
    __in int X,
    __in int Y,
    __in HICON hIcon);

#ifndef NODRAWTEXT

/*
 * DrawText() Format Flags
 */
#define DT_TOP                      0x00000000
#define DT_LEFT                     0x00000000
#define DT_CENTER                   0x00000001
#define DT_RIGHT                    0x00000002
#define DT_VCENTER                  0x00000004
#define DT_BOTTOM                   0x00000008
#define DT_WORDBREAK                0x00000010
#define DT_SINGLELINE               0x00000020
#define DT_EXPANDTABS               0x00000040
#define DT_TABSTOP                  0x00000080
#define DT_NOCLIP                   0x00000100
#define DT_EXTERNALLEADING          0x00000200
#define DT_CALCRECT                 0x00000400
#define DT_NOPREFIX                 0x00000800
#define DT_INTERNAL                 0x00001000

#if(WINVER >= 0x0400)
#define DT_EDITCONTROL              0x00002000
#define DT_PATH_ELLIPSIS            0x00004000
#define DT_END_ELLIPSIS             0x00008000
#define DT_MODIFYSTRING             0x00010000
#define DT_RTLREADING               0x00020000
#define DT_WORD_ELLIPSIS            0x00040000
#if(WINVER >= 0x0500)
#define DT_NOFULLWIDTHCHARBREAK     0x00080000
#if(_WIN32_WINNT >= 0x0500)
#define DT_HIDEPREFIX               0x00100000
#define DT_PREFIXONLY               0x00200000
#endif /* _WIN32_WINNT >= 0x0500 */
#endif /* WINVER >= 0x0500 */

typedef struct tagDRAWTEXTPARAMS
{
    UINT    cbSize;
    int     iTabLength;
    int     iLeftMargin;
    int     iRightMargin;
    UINT    uiLengthDrawn;
} DRAWTEXTPARAMS, FAR *LPDRAWTEXTPARAMS;
#endif /* WINVER >= 0x0400 */


WINUSERAPI
int
WINAPI
DrawTextA(
    __in HDC hdc,
    __inout_ecount_opt(cchText) LPCSTR lpchText,
    __in int cchText,
    __inout LPRECT lprc,
    __in UINT format);
WINUSERAPI
int
WINAPI
DrawTextW(
    __in HDC hdc,
    __inout_ecount_opt(cchText) LPCWSTR lpchText,
    __in int cchText,
    __inout LPRECT lprc,
    __in UINT format);
#ifdef UNICODE
#define DrawText  DrawTextW
#else
#define DrawText  DrawTextA
#endif // !UNICODE

#if defined(_M_CEE)
#undef DrawText
__inline
int
DrawText(
    HDC hdc,
    LPCTSTR lpchText,
    int cchText,
    LPRECT lprc,
    UINT format
    )
{
#ifdef UNICODE
    return DrawTextW(
#else
    return DrawTextA(
#endif
        hdc,
    lpchText,
    cchText,
    lprc,
    format
        );
}
#endif  /* _M_CEE */


#if(WINVER >= 0x0400)
WINUSERAPI
int
WINAPI
DrawTextExA(
    __in HDC hdc,
    __inout_ecount_opt(cchText) LPSTR lpchText,
    __in int cchText,
    __inout LPRECT lprc,
    __in UINT format,
    __in_opt LPDRAWTEXTPARAMS lpdtp);
WINUSERAPI
int
WINAPI
DrawTextExW(
    __in HDC hdc,
    __inout_ecount_opt(cchText) LPWSTR lpchText,
    __in int cchText,
    __inout LPRECT lprc,
    __in UINT format,
    __in_opt LPDRAWTEXTPARAMS lpdtp);
#ifdef UNICODE
#define DrawTextEx  DrawTextExW
#else
#define DrawTextEx  DrawTextExA
#endif // !UNICODE
#endif /* WINVER >= 0x0400 */

#endif /* !NODRAWTEXT */

WINUSERAPI
BOOL
WINAPI
GrayStringA(
    __in HDC hDC,
    __in_opt HBRUSH hBrush,
    __in_opt GRAYSTRINGPROC lpOutputFunc,
    __in LPARAM lpData,
    __in int nCount,
    __in int X,
    __in int Y,
    __in int nWidth,
    __in int nHeight);
WINUSERAPI
BOOL
WINAPI
GrayStringW(
    __in HDC hDC,
    __in_opt HBRUSH hBrush,
    __in_opt GRAYSTRINGPROC lpOutputFunc,
    __in LPARAM lpData,
    __in int nCount,
    __in int X,
    __in int Y,
    __in int nWidth,
    __in int nHeight);
#ifdef UNICODE
#define GrayString  GrayStringW
#else
#define GrayString  GrayStringA
#endif // !UNICODE

#if(WINVER >= 0x0400)
/* Monolithic state-drawing routine */
/* Image type */
#define DST_COMPLEX     0x0000
#define DST_TEXT        0x0001
#define DST_PREFIXTEXT  0x0002
#define DST_ICON        0x0003
#define DST_BITMAP      0x0004

/* State type */
#define DSS_NORMAL      0x0000
#define DSS_UNION       0x0010  /* Gray string appearance */
#define DSS_DISABLED    0x0020
#define DSS_MONO        0x0080
#if(_WIN32_WINNT >= 0x0500)
#define DSS_HIDEPREFIX  0x0200
#define DSS_PREFIXONLY  0x0400
#endif /* _WIN32_WINNT >= 0x0500 */
#define DSS_RIGHT       0x8000

WINUSERAPI
BOOL
WINAPI
DrawStateA(
    __in HDC hdc,
    __in_opt HBRUSH hbrFore,
    __in_opt DRAWSTATEPROC qfnCallBack,
    __in LPARAM lData,
    __in WPARAM wData,
    __in int x,
    __in int y,
    __in int cx,
    __in int cy,
    __in UINT uFlags);
WINUSERAPI
BOOL
WINAPI
DrawStateW(
    __in HDC hdc,
    __in_opt HBRUSH hbrFore,
    __in_opt DRAWSTATEPROC qfnCallBack,
    __in LPARAM lData,
    __in WPARAM wData,
    __in int x,
    __in int y,
    __in int cx,
    __in int cy,
    __in UINT uFlags);
#ifdef UNICODE
#define DrawState  DrawStateW
#else
#define DrawState  DrawStateA
#endif // !UNICODE
#endif /* WINVER >= 0x0400 */

WINUSERAPI
LONG
WINAPI
TabbedTextOutA(
    __in HDC hdc,
    __in int x,
    __in int y,
    __in_ecount(chCount) LPCSTR lpString,
    __in int chCount,
    __in int nTabPositions,
    __in_ecount_opt(nTabPositions) CONST INT *lpnTabStopPositions,
    __in int nTabOrigin);
WINUSERAPI
LONG
WINAPI
TabbedTextOutW(
    __in HDC hdc,
    __in int x,
    __in int y,
    __in_ecount(chCount) LPCWSTR lpString,
    __in int chCount,
    __in int nTabPositions,
    __in_ecount_opt(nTabPositions) CONST INT *lpnTabStopPositions,
    __in int nTabOrigin);
#ifdef UNICODE
#define TabbedTextOut  TabbedTextOutW
#else
#define TabbedTextOut  TabbedTextOutA
#endif // !UNICODE

WINUSERAPI
DWORD
WINAPI
GetTabbedTextExtentA(
    __in HDC hdc,
    __in_ecount(chCount) LPCSTR lpString,
    __in int chCount,
    __in int nTabPositions,
    __in_ecount_opt(nTabPositions) CONST INT *lpnTabStopPositions);
WINUSERAPI
DWORD
WINAPI
GetTabbedTextExtentW(
    __in HDC hdc,
    __in_ecount(chCount) LPCWSTR lpString,
    __in int chCount,
    __in int nTabPositions,
    __in_ecount_opt(nTabPositions) CONST INT *lpnTabStopPositions);
#ifdef UNICODE
#define GetTabbedTextExtent  GetTabbedTextExtentW
#else
#define GetTabbedTextExtent  GetTabbedTextExtentA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
UpdateWindow(
    __in HWND hWnd);

WINUSERAPI
HWND
WINAPI
SetActiveWindow(
    __in HWND hWnd);

WINUSERAPI
HWND
WINAPI
GetForegroundWindow(
    VOID);

#if(WINVER >= 0x0400)
WINUSERAPI
BOOL
WINAPI
PaintDesktop(
    __in HDC hdc);

WINUSERAPI
VOID
WINAPI
SwitchToThisWindow(
    __in HWND hwnd,
    __in BOOL fUnknown);
#endif /* WINVER >= 0x0400 */


WINUSERAPI
BOOL
WINAPI
SetForegroundWindow(
    __in HWND hWnd);

#if(_WIN32_WINNT >= 0x0500)
WINUSERAPI
BOOL
WINAPI
AllowSetForegroundWindow(
    __in DWORD dwProcessId);

#define ASFW_ANY    ((DWORD)-1)

WINUSERAPI
BOOL
WINAPI
LockSetForegroundWindow(
    __in UINT uLockCode);

#define LSFW_LOCK       1
#define LSFW_UNLOCK     2

#endif /* _WIN32_WINNT >= 0x0500 */

WINUSERAPI
HWND
WINAPI
WindowFromDC(
    __in HDC hDC);

WINUSERAPI
HDC
WINAPI
GetDC(
    __in_opt HWND hWnd);

WINUSERAPI
HDC
WINAPI
GetDCEx(
    __in_opt HWND hWnd,
    __in_opt HRGN hrgnClip,
    __in DWORD flags);

/*
 * GetDCEx() flags
 */
#define DCX_WINDOW           0x00000001L
#define DCX_CACHE            0x00000002L
#define DCX_NORESETATTRS     0x00000004L
#define DCX_CLIPCHILDREN     0x00000008L
#define DCX_CLIPSIBLINGS     0x00000010L
#define DCX_PARENTCLIP       0x00000020L
#define DCX_EXCLUDERGN       0x00000040L
#define DCX_INTERSECTRGN     0x00000080L
#define DCX_EXCLUDEUPDATE    0x00000100L
#define DCX_INTERSECTUPDATE  0x00000200L
#define DCX_LOCKWINDOWUPDATE 0x00000400L

#define DCX_VALIDATE         0x00200000L

WINUSERAPI
HDC
WINAPI
GetWindowDC(
    __in_opt HWND hWnd);

WINUSERAPI
int
WINAPI
ReleaseDC(
    __in_opt HWND hWnd,
    __in HDC hDC);

WINUSERAPI
HDC
WINAPI
BeginPaint(
    __in HWND hWnd,
    __out LPPAINTSTRUCT lpPaint);

WINUSERAPI
BOOL
WINAPI
EndPaint(
    __in HWND hWnd,
    __in CONST PAINTSTRUCT *lpPaint);

WINUSERAPI
BOOL
WINAPI
GetUpdateRect(
    __in HWND hWnd,
    __out_opt LPRECT lpRect,
    __in BOOL bErase);

WINUSERAPI
int
WINAPI
GetUpdateRgn(
    __in HWND hWnd,
    __in HRGN hRgn,
    __in BOOL bErase);

WINUSERAPI
int
WINAPI
SetWindowRgn(
    __in HWND hWnd,
    __in_opt HRGN hRgn,
    __in BOOL bRedraw);


WINUSERAPI
int
WINAPI
GetWindowRgn(
    __in HWND hWnd,
    __in HRGN hRgn);

#if(_WIN32_WINNT >= 0x0501)

WINUSERAPI
int
WINAPI
GetWindowRgnBox(
    __in HWND hWnd,
    __out LPRECT lprc);

#endif /* _WIN32_WINNT >= 0x0501 */

WINUSERAPI
int
WINAPI
ExcludeUpdateRgn(
    __in HDC hDC,
    __in HWND hWnd);

WINUSERAPI
BOOL
WINAPI
InvalidateRect(
    __in_opt HWND hWnd,
    __in_opt CONST RECT *lpRect,
    __in BOOL bErase);

WINUSERAPI
BOOL
WINAPI
ValidateRect(
    __in_opt HWND hWnd,
    __in_opt CONST RECT *lpRect);

WINUSERAPI
BOOL
WINAPI
InvalidateRgn(
    __in HWND hWnd,
    __in_opt HRGN hRgn,
    __in BOOL bErase);

WINUSERAPI
BOOL
WINAPI
ValidateRgn(
    __in HWND hWnd,
    __in_opt HRGN hRgn);


WINUSERAPI
BOOL
WINAPI
RedrawWindow(
    __in_opt HWND hWnd,
    __in_opt CONST RECT *lprcUpdate,
    __in_opt HRGN hrgnUpdate,
    __in UINT flags);

/*
 * RedrawWindow() flags
 */
#define RDW_INVALIDATE          0x0001
#define RDW_INTERNALPAINT       0x0002
#define RDW_ERASE               0x0004

#define RDW_VALIDATE            0x0008
#define RDW_NOINTERNALPAINT     0x0010
#define RDW_NOERASE             0x0020

#define RDW_NOCHILDREN          0x0040
#define RDW_ALLCHILDREN         0x0080

#define RDW_UPDATENOW           0x0100
#define RDW_ERASENOW            0x0200

#define RDW_FRAME               0x0400
#define RDW_NOFRAME             0x0800


/*
 * LockWindowUpdate API
 */

WINUSERAPI
BOOL
WINAPI
LockWindowUpdate(
    __in_opt HWND hWndLock);

WINUSERAPI
BOOL
WINAPI
ScrollWindow(
    __in HWND hWnd,
    __in int XAmount,
    __in int YAmount,
    __in_opt CONST RECT *lpRect,
    __in_opt CONST RECT *lpClipRect);

WINUSERAPI
BOOL
WINAPI
ScrollDC(
    __in HDC hDC,
    __in int dx,
    __in int dy,
    __in_opt CONST RECT *lprcScroll,
    __in_opt CONST RECT *lprcClip,
    __in_opt HRGN hrgnUpdate,
    __out_opt LPRECT lprcUpdate);

WINUSERAPI
int
WINAPI
ScrollWindowEx(
    __in HWND hWnd,
    __in int dx,
    __in int dy,
    __in_opt CONST RECT *prcScroll,
    __in_opt CONST RECT *prcClip,
    __in_opt HRGN hrgnUpdate,
    __out_opt LPRECT prcUpdate,
    __in UINT flags);

#define SW_SCROLLCHILDREN   0x0001  /* Scroll children within *lprcScroll. */
#define SW_INVALIDATE       0x0002  /* Invalidate after scrolling */
#define SW_ERASE            0x0004  /* If SW_INVALIDATE, don't send WM_ERASEBACKGROUND */
#if(WINVER >= 0x0500)
#define SW_SMOOTHSCROLL     0x0010  /* Use smooth scrolling */
#endif /* WINVER >= 0x0500 */

#ifndef NOSCROLL

WINUSERAPI
int
WINAPI
SetScrollPos(
    __in HWND hWnd,
    __in int nBar,
    __in int nPos,
    __in BOOL bRedraw);

WINUSERAPI
int
WINAPI
GetScrollPos(
    __in HWND hWnd,
    __in int nBar);

WINUSERAPI
BOOL
WINAPI
SetScrollRange(
    __in HWND hWnd,
    __in int nBar,
    __in int nMinPos,
    __in int nMaxPos,
    __in BOOL bRedraw);

WINUSERAPI
BOOL
WINAPI
GetScrollRange(
    __in HWND hWnd,
    __in int nBar,
    __out LPINT lpMinPos,
    __out LPINT lpMaxPos);

WINUSERAPI
BOOL
WINAPI
ShowScrollBar(
    __in HWND hWnd,
    __in int wBar,
    __in BOOL bShow);

WINUSERAPI
BOOL
WINAPI
EnableScrollBar(
    __in HWND hWnd,
    __in UINT wSBflags,
    __in UINT wArrows);


/*
 * EnableScrollBar() flags
 */
#define ESB_ENABLE_BOTH     0x0000
#define ESB_DISABLE_BOTH    0x0003

#define ESB_DISABLE_LEFT    0x0001
#define ESB_DISABLE_RIGHT   0x0002

#define ESB_DISABLE_UP      0x0001
#define ESB_DISABLE_DOWN    0x0002

#define ESB_DISABLE_LTUP    ESB_DISABLE_LEFT
#define ESB_DISABLE_RTDN    ESB_DISABLE_RIGHT


#endif  /* !NOSCROLL */

WINUSERAPI
BOOL
WINAPI
SetPropA(
    __in HWND hWnd,
    __in LPCSTR lpString,
    __in_opt HANDLE hData);
WINUSERAPI
BOOL
WINAPI
SetPropW(
    __in HWND hWnd,
    __in LPCWSTR lpString,
    __in_opt HANDLE hData);
#ifdef UNICODE
#define SetProp  SetPropW
#else
#define SetProp  SetPropA
#endif // !UNICODE

WINUSERAPI
HANDLE
WINAPI
GetPropA(
    __in HWND hWnd,
    __in LPCSTR lpString);
WINUSERAPI
HANDLE
WINAPI
GetPropW(
    __in HWND hWnd,
    __in LPCWSTR lpString);
#ifdef UNICODE
#define GetProp  GetPropW
#else
#define GetProp  GetPropA
#endif // !UNICODE

WINUSERAPI
HANDLE
WINAPI
RemovePropA(
    __in HWND hWnd,
    __in LPCSTR lpString);
WINUSERAPI
HANDLE
WINAPI
RemovePropW(
    __in HWND hWnd,
    __in LPCWSTR lpString);
#ifdef UNICODE
#define RemoveProp  RemovePropW
#else
#define RemoveProp  RemovePropA
#endif // !UNICODE

WINUSERAPI
int
WINAPI
EnumPropsExA(
    __in HWND hWnd,
    __in PROPENUMPROCEXA lpEnumFunc,
    __in LPARAM lParam);
WINUSERAPI
int
WINAPI
EnumPropsExW(
    __in HWND hWnd,
    __in PROPENUMPROCEXW lpEnumFunc,
    __in LPARAM lParam);
#ifdef UNICODE
#define EnumPropsEx  EnumPropsExW
#else
#define EnumPropsEx  EnumPropsExA
#endif // !UNICODE

WINUSERAPI
int
WINAPI
EnumPropsA(
    __in HWND hWnd,
    __in PROPENUMPROCA lpEnumFunc);
WINUSERAPI
int
WINAPI
EnumPropsW(
    __in HWND hWnd,
    __in PROPENUMPROCW lpEnumFunc);
#ifdef UNICODE
#define EnumProps  EnumPropsW
#else
#define EnumProps  EnumPropsA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
SetWindowTextA(
    __in HWND hWnd,
    __in_opt LPCSTR lpString);
WINUSERAPI
BOOL
WINAPI
SetWindowTextW(
    __in HWND hWnd,
    __in_opt LPCWSTR lpString);
#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif // !UNICODE

WINUSERAPI
int
WINAPI
GetWindowTextA(
    __in HWND hWnd,
    __out_ecount(nMaxCount) LPSTR lpString,
    __in int nMaxCount);
WINUSERAPI
int
WINAPI
GetWindowTextW(
    __in HWND hWnd,
    __out_ecount(nMaxCount) LPWSTR lpString,
    __in int nMaxCount);
#ifdef UNICODE
#define GetWindowText  GetWindowTextW
#else
#define GetWindowText  GetWindowTextA
#endif // !UNICODE

WINUSERAPI
int
WINAPI
GetWindowTextLengthA(
    __in HWND hWnd);
WINUSERAPI
int
WINAPI
GetWindowTextLengthW(
    __in HWND hWnd);
#ifdef UNICODE
#define GetWindowTextLength  GetWindowTextLengthW
#else
#define GetWindowTextLength  GetWindowTextLengthA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
GetClientRect(
    __in HWND hWnd,
    __out LPRECT lpRect);

WINUSERAPI
BOOL
WINAPI
GetWindowRect(
    __in HWND hWnd,
    __out LPRECT lpRect);

WINUSERAPI
BOOL
WINAPI
AdjustWindowRect(
    __inout LPRECT lpRect,
    __in DWORD dwStyle,
    __in BOOL bMenu);

WINUSERAPI
BOOL
WINAPI
AdjustWindowRectEx(
    __inout LPRECT lpRect,
    __in DWORD dwStyle,
    __in BOOL bMenu,
    __in DWORD dwExStyle);


#if(WINVER >= 0x0400)
#define HELPINFO_WINDOW    0x0001
#define HELPINFO_MENUITEM  0x0002
typedef struct tagHELPINFO      /* Structure pointed to by lParam of WM_HELP */
{
    UINT    cbSize;             /* Size in bytes of this struct  */
    int     iContextType;       /* Either HELPINFO_WINDOW or HELPINFO_MENUITEM */
    int     iCtrlId;            /* Control Id or a Menu item Id. */
    HANDLE  hItemHandle;        /* hWnd of control or hMenu.     */
    DWORD_PTR dwContextId;      /* Context Id associated with this item */
    POINT   MousePos;           /* Mouse Position in screen co-ordinates */
}  HELPINFO, FAR *LPHELPINFO;

WINUSERAPI
BOOL
WINAPI
SetWindowContextHelpId(
    __in HWND,
    __in DWORD);

WINUSERAPI
DWORD
WINAPI
GetWindowContextHelpId(
    __in HWND);

WINUSERAPI
BOOL
WINAPI
SetMenuContextHelpId(
    __in HMENU,
    __in DWORD);

WINUSERAPI
DWORD
WINAPI
GetMenuContextHelpId(
    __in HMENU);

#endif /* WINVER >= 0x0400 */


#ifndef NOMB

/*
 * MessageBox() Flags
 */
#define MB_OK                       0x00000000L
#define MB_OKCANCEL                 0x00000001L
#define MB_ABORTRETRYIGNORE         0x00000002L
#define MB_YESNOCANCEL              0x00000003L
#define MB_YESNO                    0x00000004L
#define MB_RETRYCANCEL              0x00000005L
#if(WINVER >= 0x0500)
#define MB_CANCELTRYCONTINUE        0x00000006L
#endif /* WINVER >= 0x0500 */


#define MB_ICONHAND                 0x00000010L
#define MB_ICONQUESTION             0x00000020L
#define MB_ICONEXCLAMATION          0x00000030L
#define MB_ICONASTERISK             0x00000040L

#if(WINVER >= 0x0400)
#define MB_USERICON                 0x00000080L
#define MB_ICONWARNING              MB_ICONEXCLAMATION
#define MB_ICONERROR                MB_ICONHAND
#endif /* WINVER >= 0x0400 */

#define MB_ICONINFORMATION          MB_ICONASTERISK
#define MB_ICONSTOP                 MB_ICONHAND

#define MB_DEFBUTTON1               0x00000000L
#define MB_DEFBUTTON2               0x00000100L
#define MB_DEFBUTTON3               0x00000200L
#if(WINVER >= 0x0400)
#define MB_DEFBUTTON4               0x00000300L
#endif /* WINVER >= 0x0400 */

#define MB_APPLMODAL                0x00000000L
#define MB_SYSTEMMODAL              0x00001000L
#define MB_TASKMODAL                0x00002000L
#if(WINVER >= 0x0400)
#define MB_HELP                     0x00004000L // Help Button
#endif /* WINVER >= 0x0400 */

#define MB_NOFOCUS                  0x00008000L
#define MB_SETFOREGROUND            0x00010000L
#define MB_DEFAULT_DESKTOP_ONLY     0x00020000L

#if(WINVER >= 0x0400)
#define MB_TOPMOST                  0x00040000L
#define MB_RIGHT                    0x00080000L
#define MB_RTLREADING               0x00100000L

#endif /* WINVER >= 0x0400 */

#ifdef _WIN32_WINNT
#if (_WIN32_WINNT >= 0x0400)
#define MB_SERVICE_NOTIFICATION          0x00200000L
#else
#define MB_SERVICE_NOTIFICATION          0x00040000L
#endif
#define MB_SERVICE_NOTIFICATION_NT3X     0x00040000L
#endif

#define MB_TYPEMASK                 0x0000000FL
#define MB_ICONMASK                 0x000000F0L
#define MB_DEFMASK                  0x00000F00L
#define MB_MODEMASK                 0x00003000L
#define MB_MISCMASK                 0x0000C000L

WINUSERAPI
int
WINAPI
MessageBoxA(
    __in_opt HWND hWnd,
    __in_opt LPCSTR lpText,
    __in_opt LPCSTR lpCaption,
    __in UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
    __in_opt HWND hWnd,
    __in_opt LPCWSTR lpText,
    __in_opt LPCWSTR lpCaption,
    __in UINT uType);
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA
#endif // !UNICODE

#if defined(_M_CEE)
#undef MessageBox
__inline
int
MessageBox(
    HWND hWnd,
    LPCTSTR lpText,
    LPCTSTR lpCaption,
    UINT uType
    )
{
#ifdef UNICODE
    return MessageBoxW(
#else
    return MessageBoxA(
#endif
        hWnd,
    lpText,
    lpCaption,
    uType
        );
}
#endif  /* _M_CEE */

WINUSERAPI
int
WINAPI
MessageBoxExA(
    __in_opt HWND hWnd,
    __in_opt LPCSTR lpText,
    __in_opt LPCSTR lpCaption,
    __in UINT uType,
    __in WORD wLanguageId);
WINUSERAPI
int
WINAPI
MessageBoxExW(
    __in_opt HWND hWnd,
    __in_opt LPCWSTR lpText,
    __in_opt LPCWSTR lpCaption,
    __in UINT uType,
    __in WORD wLanguageId);
#ifdef UNICODE
#define MessageBoxEx  MessageBoxExW
#else
#define MessageBoxEx  MessageBoxExA
#endif // !UNICODE

#if(WINVER >= 0x0400)

typedef VOID (CALLBACK *MSGBOXCALLBACK)(LPHELPINFO lpHelpInfo);

typedef struct tagMSGBOXPARAMSA
{
    UINT        cbSize;
    HWND        hwndOwner;
    HINSTANCE   hInstance;
    LPCSTR      lpszText;
    LPCSTR      lpszCaption;
    DWORD       dwStyle;
    LPCSTR      lpszIcon;
    DWORD_PTR   dwContextHelpId;
    MSGBOXCALLBACK      lpfnMsgBoxCallback;
    DWORD       dwLanguageId;
} MSGBOXPARAMSA, *PMSGBOXPARAMSA, *LPMSGBOXPARAMSA;
typedef struct tagMSGBOXPARAMSW
{
    UINT        cbSize;
    HWND        hwndOwner;
    HINSTANCE   hInstance;
    LPCWSTR     lpszText;
    LPCWSTR     lpszCaption;
    DWORD       dwStyle;
    LPCWSTR     lpszIcon;
    DWORD_PTR   dwContextHelpId;
    MSGBOXCALLBACK      lpfnMsgBoxCallback;
    DWORD       dwLanguageId;
} MSGBOXPARAMSW, *PMSGBOXPARAMSW, *LPMSGBOXPARAMSW;
#ifdef UNICODE
typedef MSGBOXPARAMSW MSGBOXPARAMS;
typedef PMSGBOXPARAMSW PMSGBOXPARAMS;
typedef LPMSGBOXPARAMSW LPMSGBOXPARAMS;
#else
typedef MSGBOXPARAMSA MSGBOXPARAMS;
typedef PMSGBOXPARAMSA PMSGBOXPARAMS;
typedef LPMSGBOXPARAMSA LPMSGBOXPARAMS;
#endif // UNICODE

WINUSERAPI
int
WINAPI
MessageBoxIndirectA(
    __in CONST MSGBOXPARAMSA * lpmbp);
WINUSERAPI
int
WINAPI
MessageBoxIndirectW(
    __in CONST MSGBOXPARAMSW * lpmbp);
#ifdef UNICODE
#define MessageBoxIndirect  MessageBoxIndirectW
#else
#define MessageBoxIndirect  MessageBoxIndirectA
#endif // !UNICODE
#endif /* WINVER >= 0x0400 */


WINUSERAPI
BOOL
WINAPI
MessageBeep(
    __in UINT uType);

#endif /* !NOMB */


WINUSERAPI
int
WINAPI
ShowCursor(
    __in BOOL bShow);

WINUSERAPI
BOOL
WINAPI
SetCursorPos(
    __in int X,
    __in int Y);

#if(WINVER >= 0x0600)
WINUSERAPI
BOOL
WINAPI
SetPhysicalCursorPos(
    __in int X,
    __in int Y);
#endif /* WINVER >= 0x0600 */

WINUSERAPI
HCURSOR
WINAPI
SetCursor(
    __in_opt HCURSOR hCursor);

WINUSERAPI
BOOL
WINAPI
GetCursorPos(
    __out LPPOINT lpPoint);

#if(WINVER >= 0x0600)
WINUSERAPI
BOOL
WINAPI
GetPhysicalCursorPos(
    __out LPPOINT lpPoint);
#endif /* WINVER >= 0x0600 */

WINUSERAPI
BOOL
WINAPI
ClipCursor(
    __in_opt CONST RECT *lpRect);

WINUSERAPI
BOOL
WINAPI
GetClipCursor(
    __out LPRECT lpRect);

WINUSERAPI
HCURSOR
WINAPI
GetCursor(
    VOID);

WINUSERAPI
BOOL
WINAPI
CreateCaret(
    __in HWND hWnd,
    __in_opt HBITMAP hBitmap,
    __in int nWidth,
    __in int nHeight);

WINUSERAPI
UINT
WINAPI
GetCaretBlinkTime(
    VOID);

WINUSERAPI
BOOL
WINAPI
SetCaretBlinkTime(
    __in UINT uMSeconds);

WINUSERAPI
BOOL
WINAPI
DestroyCaret(
    VOID);

WINUSERAPI
BOOL
WINAPI
HideCaret(
    __in_opt HWND hWnd);

WINUSERAPI
BOOL
WINAPI
ShowCaret(
    __in_opt HWND hWnd);

WINUSERAPI
BOOL
WINAPI
SetCaretPos(
    __in int X,
    __in int Y);

WINUSERAPI
BOOL
WINAPI
GetCaretPos(
    __out LPPOINT lpPoint);

WINUSERAPI
BOOL
WINAPI
ClientToScreen(
    __in HWND hWnd,
    __inout LPPOINT lpPoint);

WINUSERAPI
BOOL
WINAPI
ScreenToClient(
    __in HWND hWnd,
    __inout LPPOINT lpPoint);

#if(WINVER >= 0x0600)
WINUSERAPI
BOOL
WINAPI
LogicalToPhysicalPoint(
    __in HWND hWnd,
    __inout LPPOINT lpPoint);

WINUSERAPI
BOOL
WINAPI
PhysicalToLogicalPoint(
    __in HWND hWnd,
    __inout LPPOINT lpPoint);

#endif /* WINVER >= 0x0600 */

WINUSERAPI
int
WINAPI
MapWindowPoints(
    __in_opt HWND hWndFrom,
    __in_opt HWND hWndTo,
    __inout_ecount(cPoints) LPPOINT lpPoints,
    __in UINT cPoints);

WINUSERAPI
HWND
WINAPI
WindowFromPoint(
    __in POINT Point);

#if(WINVER >= 0x0600)
WINUSERAPI
HWND
WINAPI
WindowFromPhysicalPoint(
    __in POINT Point);
#endif /* WINVER >= 0x0600 */

WINUSERAPI
HWND
WINAPI
ChildWindowFromPoint(
    __in HWND hWndParent,
    __in POINT Point);

#if(WINVER >= 0x0400)
#define CWP_ALL             0x0000
#define CWP_SKIPINVISIBLE   0x0001
#define CWP_SKIPDISABLED    0x0002
#define CWP_SKIPTRANSPARENT 0x0004

WINUSERAPI
HWND
WINAPI
ChildWindowFromPointEx(
    __in HWND hwnd,
    __in POINT pt,
    __in UINT flags);
#endif /* WINVER >= 0x0400 */

#ifndef NOCOLOR

/*
 * Color Types
 */
#define CTLCOLOR_MSGBOX         0
#define CTLCOLOR_EDIT           1
#define CTLCOLOR_LISTBOX        2
#define CTLCOLOR_BTN            3
#define CTLCOLOR_DLG            4
#define CTLCOLOR_SCROLLBAR      5
#define CTLCOLOR_STATIC         6
#define CTLCOLOR_MAX            7

#define COLOR_SCROLLBAR         0
#define COLOR_BACKGROUND        1
#define COLOR_ACTIVECAPTION     2
#define COLOR_INACTIVECAPTION   3
#define COLOR_MENU              4
#define COLOR_WINDOW            5
#define COLOR_WINDOWFRAME       6
#define COLOR_MENUTEXT          7
#define COLOR_WINDOWTEXT        8
#define COLOR_CAPTIONTEXT       9
#define COLOR_ACTIVEBORDER      10
#define COLOR_INACTIVEBORDER    11
#define COLOR_APPWORKSPACE      12
#define COLOR_HIGHLIGHT         13
#define COLOR_HIGHLIGHTTEXT     14
#define COLOR_BTNFACE           15
#define COLOR_BTNSHADOW         16
#define COLOR_GRAYTEXT          17
#define COLOR_BTNTEXT           18
#define COLOR_INACTIVECAPTIONTEXT 19
#define COLOR_BTNHIGHLIGHT      20

#if(WINVER >= 0x0400)
#define COLOR_3DDKSHADOW        21
#define COLOR_3DLIGHT           22
#define COLOR_INFOTEXT          23
#define COLOR_INFOBK            24
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0500)
#define COLOR_HOTLIGHT          26
#define COLOR_GRADIENTACTIVECAPTION 27
#define COLOR_GRADIENTINACTIVECAPTION 28
#if(WINVER >= 0x0501)
#define COLOR_MENUHILIGHT       29
#define COLOR_MENUBAR           30
#endif /* WINVER >= 0x0501 */
#endif /* WINVER >= 0x0500 */

#if(WINVER >= 0x0400)
#define COLOR_DESKTOP           COLOR_BACKGROUND
#define COLOR_3DFACE            COLOR_BTNFACE
#define COLOR_3DSHADOW          COLOR_BTNSHADOW
#define COLOR_3DHIGHLIGHT       COLOR_BTNHIGHLIGHT
#define COLOR_3DHILIGHT         COLOR_BTNHIGHLIGHT
#define COLOR_BTNHILIGHT        COLOR_BTNHIGHLIGHT
#endif /* WINVER >= 0x0400 */


WINUSERAPI
DWORD
WINAPI
GetSysColor(
    __in int nIndex);

#if(WINVER >= 0x0400)
WINUSERAPI
HBRUSH
WINAPI
GetSysColorBrush(
    __in int nIndex);


#endif /* WINVER >= 0x0400 */

WINUSERAPI
BOOL
WINAPI
SetSysColors(
    __in int cElements,
    __in_ecount(cElements) CONST INT * lpaElements,
    __in_ecount(cElements) CONST COLORREF * lpaRgbValues);

#endif /* !NOCOLOR */

WINUSERAPI
BOOL
WINAPI
DrawFocusRect(
    __in HDC hDC,
    __in CONST RECT * lprc);

WINUSERAPI
int
WINAPI
FillRect(
    __in HDC hDC,
    __in CONST RECT *lprc,
    __in HBRUSH hbr);

WINUSERAPI
int
WINAPI
FrameRect(
    __in HDC hDC,
    __in CONST RECT *lprc,
    __in HBRUSH hbr);

WINUSERAPI
BOOL
WINAPI
InvertRect(
    __in HDC hDC,
    __in CONST RECT *lprc);

WINUSERAPI
BOOL
WINAPI
SetRect(
    __out LPRECT lprc,
    __in int xLeft,
    __in int yTop,
    __in int xRight,
    __in int yBottom);

WINUSERAPI
BOOL
WINAPI
SetRectEmpty(
    __out LPRECT lprc);

WINUSERAPI
BOOL
WINAPI
CopyRect(
    __out LPRECT lprcDst,
    __in CONST RECT *lprcSrc);

WINUSERAPI
BOOL
WINAPI
InflateRect(
    __inout LPRECT lprc,
    __in int dx,
    __in int dy);

WINUSERAPI
BOOL
WINAPI
IntersectRect(
    __out LPRECT lprcDst,
    __in CONST RECT *lprcSrc1,
    __in CONST RECT *lprcSrc2);

WINUSERAPI
BOOL
WINAPI
UnionRect(
    __out LPRECT lprcDst,
    __in CONST RECT *lprcSrc1,
    __in CONST RECT *lprcSrc2);

WINUSERAPI
BOOL
WINAPI
SubtractRect(
    __out LPRECT lprcDst,
    __in CONST RECT *lprcSrc1,
    __in CONST RECT *lprcSrc2);

WINUSERAPI
BOOL
WINAPI
OffsetRect(
    __inout LPRECT lprc,
    __in int dx,
    __in int dy);

WINUSERAPI
BOOL
WINAPI
IsRectEmpty(
    __in CONST RECT *lprc);

WINUSERAPI
BOOL
WINAPI
EqualRect(
    __in CONST RECT *lprc1,
    __in CONST RECT *lprc2);

WINUSERAPI
BOOL
WINAPI
PtInRect(
    __in CONST RECT *lprc,
    __in POINT pt);

#ifndef NOWINOFFSETS

WINUSERAPI
WORD
WINAPI
GetWindowWord(
    __in HWND hWnd,
    __in int nIndex);

WINUSERAPI
WORD
WINAPI
SetWindowWord(
    __in HWND hWnd,
    __in int nIndex,
    __in WORD wNewWord);

WINUSERAPI
LONG
WINAPI
GetWindowLongA(
    __in HWND hWnd,
    __in int nIndex);
WINUSERAPI
LONG
WINAPI
GetWindowLongW(
    __in HWND hWnd,
    __in int nIndex);
#ifdef UNICODE
#define GetWindowLong  GetWindowLongW
#else
#define GetWindowLong  GetWindowLongA
#endif // !UNICODE

WINUSERAPI
LONG
WINAPI
SetWindowLongA(
    __in HWND hWnd,
    __in int nIndex,
    __in LONG dwNewLong);
WINUSERAPI
LONG
WINAPI
SetWindowLongW(
    __in HWND hWnd,
    __in int nIndex,
    __in LONG dwNewLong);
#ifdef UNICODE
#define SetWindowLong  SetWindowLongW
#else
#define SetWindowLong  SetWindowLongA
#endif // !UNICODE

#ifdef _WIN64

WINUSERAPI
LONG_PTR
WINAPI
GetWindowLongPtrA(
    __in HWND hWnd,
    __in int nIndex);
WINUSERAPI
LONG_PTR
WINAPI
GetWindowLongPtrW(
    __in HWND hWnd,
    __in int nIndex);
#ifdef UNICODE
#define GetWindowLongPtr  GetWindowLongPtrW
#else
#define GetWindowLongPtr  GetWindowLongPtrA
#endif // !UNICODE

WINUSERAPI
LONG_PTR
WINAPI
SetWindowLongPtrA(
    __in HWND hWnd,
    __in int nIndex,
    __in LONG_PTR dwNewLong);
WINUSERAPI
LONG_PTR
WINAPI
SetWindowLongPtrW(
    __in HWND hWnd,
    __in int nIndex,
    __in LONG_PTR dwNewLong);
#ifdef UNICODE
#define SetWindowLongPtr  SetWindowLongPtrW
#else
#define SetWindowLongPtr  SetWindowLongPtrA
#endif // !UNICODE

#else  /* _WIN64 */

#define GetWindowLongPtrA   GetWindowLongA
#define GetWindowLongPtrW   GetWindowLongW
#ifdef UNICODE
#define GetWindowLongPtr  GetWindowLongPtrW
#else
#define GetWindowLongPtr  GetWindowLongPtrA
#endif // !UNICODE

#define SetWindowLongPtrA   SetWindowLongA
#define SetWindowLongPtrW   SetWindowLongW
#ifdef UNICODE
#define SetWindowLongPtr  SetWindowLongPtrW
#else
#define SetWindowLongPtr  SetWindowLongPtrA
#endif // !UNICODE

#endif /* _WIN64 */

WINUSERAPI
WORD
WINAPI
GetClassWord(
    __in HWND hWnd,
    __in int nIndex);

WINUSERAPI
WORD
WINAPI
SetClassWord(
    __in HWND hWnd,
    __in int nIndex,
    __in WORD wNewWord);

WINUSERAPI
DWORD
WINAPI
GetClassLongA(
    __in HWND hWnd,
    __in int nIndex);
WINUSERAPI
DWORD
WINAPI
GetClassLongW(
    __in HWND hWnd,
    __in int nIndex);
#ifdef UNICODE
#define GetClassLong  GetClassLongW
#else
#define GetClassLong  GetClassLongA
#endif // !UNICODE

WINUSERAPI
DWORD
WINAPI
SetClassLongA(
    __in HWND hWnd,
    __in int nIndex,
    __in LONG dwNewLong);
WINUSERAPI
DWORD
WINAPI
SetClassLongW(
    __in HWND hWnd,
    __in int nIndex,
    __in LONG dwNewLong);
#ifdef UNICODE
#define SetClassLong  SetClassLongW
#else
#define SetClassLong  SetClassLongA
#endif // !UNICODE

#ifdef _WIN64

WINUSERAPI
ULONG_PTR
WINAPI
GetClassLongPtrA(
    __in HWND hWnd,
    __in int nIndex);
WINUSERAPI
ULONG_PTR
WINAPI
GetClassLongPtrW(
    __in HWND hWnd,
    __in int nIndex);
#ifdef UNICODE
#define GetClassLongPtr  GetClassLongPtrW
#else
#define GetClassLongPtr  GetClassLongPtrA
#endif // !UNICODE

WINUSERAPI
ULONG_PTR
WINAPI
SetClassLongPtrA(
    __in HWND hWnd,
    __in int nIndex,
    __in LONG_PTR dwNewLong);
WINUSERAPI
ULONG_PTR
WINAPI
SetClassLongPtrW(
    __in HWND hWnd,
    __in int nIndex,
    __in LONG_PTR dwNewLong);
#ifdef UNICODE
#define SetClassLongPtr  SetClassLongPtrW
#else
#define SetClassLongPtr  SetClassLongPtrA
#endif // !UNICODE

#else  /* _WIN64 */

#define GetClassLongPtrA    GetClassLongA
#define GetClassLongPtrW    GetClassLongW
#ifdef UNICODE
#define GetClassLongPtr  GetClassLongPtrW
#else
#define GetClassLongPtr  GetClassLongPtrA
#endif // !UNICODE

#define SetClassLongPtrA    SetClassLongA
#define SetClassLongPtrW    SetClassLongW
#ifdef UNICODE
#define SetClassLongPtr  SetClassLongPtrW
#else
#define SetClassLongPtr  SetClassLongPtrA
#endif // !UNICODE

#endif /* _WIN64 */

#endif /* !NOWINOFFSETS */

#if(WINVER >= 0x0500)
WINUSERAPI
BOOL
WINAPI
GetProcessDefaultLayout(
    __out DWORD *pdwDefaultLayout);

WINUSERAPI
BOOL
WINAPI
SetProcessDefaultLayout(
    __in DWORD dwDefaultLayout);
#endif /* WINVER >= 0x0500 */

WINUSERAPI
HWND
WINAPI
GetDesktopWindow(
    VOID);


WINUSERAPI
HWND
WINAPI
GetParent(
    __in HWND hWnd);

WINUSERAPI
HWND
WINAPI
SetParent(
    __in HWND hWndChild,
    __in_opt HWND hWndNewParent);

WINUSERAPI
BOOL
WINAPI
EnumChildWindows(
    __in_opt HWND hWndParent,
    __in WNDENUMPROC lpEnumFunc,
    __in LPARAM lParam);

WINUSERAPI
HWND
WINAPI
FindWindowA(
    __in_opt LPCSTR lpClassName,
    __in_opt LPCSTR lpWindowName);
WINUSERAPI
HWND
WINAPI
FindWindowW(
    __in_opt LPCWSTR lpClassName,
    __in_opt LPCWSTR lpWindowName);
#ifdef UNICODE
#define FindWindow  FindWindowW
#else
#define FindWindow  FindWindowA
#endif // !UNICODE

#if(WINVER >= 0x0400)
WINUSERAPI
HWND
WINAPI
FindWindowExA(
    __in_opt HWND hWndParent,
    __in_opt HWND hWndChildAfter,
    __in_opt LPCSTR lpszClass,
    __in_opt LPCSTR lpszWindow);
WINUSERAPI
HWND
WINAPI
FindWindowExW(
    __in_opt HWND hWndParent,
    __in_opt HWND hWndChildAfter,
    __in_opt LPCWSTR lpszClass,
    __in_opt LPCWSTR lpszWindow);
#ifdef UNICODE
#define FindWindowEx  FindWindowExW
#else
#define FindWindowEx  FindWindowExA
#endif // !UNICODE

WINUSERAPI
HWND
WINAPI
GetShellWindow(
    VOID);

#endif /* WINVER >= 0x0400 */


WINUSERAPI
BOOL
WINAPI
RegisterShellHookWindow(
    __in HWND hwnd);

WINUSERAPI
BOOL
WINAPI
DeregisterShellHookWindow(
    __in HWND hwnd);

WINUSERAPI
BOOL
WINAPI
EnumWindows(
    __in WNDENUMPROC lpEnumFunc,
    __in LPARAM lParam);

WINUSERAPI
BOOL
WINAPI
EnumThreadWindows(
    __in DWORD dwThreadId,
    __in WNDENUMPROC lpfn,
    __in LPARAM lParam);

#define EnumTaskWindows(hTask, lpfn, lParam) EnumThreadWindows(HandleToUlong(hTask), lpfn, lParam)

WINUSERAPI
int
WINAPI
GetClassNameA(
    __in HWND hWnd,
    __out_ecount_part(nMaxCount, return) LPSTR lpClassName,
    __in int nMaxCount
    );
WINUSERAPI
int
WINAPI
GetClassNameW(
    __in HWND hWnd,
    __out_ecount_part(nMaxCount, return) LPWSTR lpClassName,
    __in int nMaxCount
    );
#ifdef UNICODE
#define GetClassName  GetClassNameW
#else
#define GetClassName  GetClassNameA
#endif // !UNICODE

#if defined(_M_CEE)
#undef GetClassName
__inline
int
GetClassName(
    HWND hWnd,
    LPTSTR lpClassName,
    int nMaxCount
    )
{
#ifdef UNICODE
    return GetClassNameW(
#else
    return GetClassNameA(
#endif
        hWnd,
    lpClassName,
    nMaxCount
        );
}
#endif  /* _M_CEE */



WINUSERAPI
HWND
WINAPI
GetTopWindow(
    __in_opt HWND hWnd);

#define GetNextWindow(hWnd, wCmd) GetWindow(hWnd, wCmd)
#define GetSysModalWindow() (NULL)
#define SetSysModalWindow(hWnd) (NULL)

WINUSERAPI
DWORD
WINAPI
GetWindowThreadProcessId(
    __in HWND hWnd,
    __out_opt LPDWORD lpdwProcessId);

#if(_WIN32_WINNT >= 0x0501)
WINUSERAPI
BOOL
WINAPI
IsGUIThread(
    __in BOOL bConvert);

#endif /* _WIN32_WINNT >= 0x0501 */


#define GetWindowTask(hWnd) \
        ((HANDLE)(DWORD_PTR)GetWindowThreadProcessId(hWnd, NULL))

WINUSERAPI
HWND
WINAPI
GetLastActivePopup(
    __in HWND hWnd);

/*
 * GetWindow() Constants
 */
#define GW_HWNDFIRST        0
#define GW_HWNDLAST         1
#define GW_HWNDNEXT         2
#define GW_HWNDPREV         3
#define GW_OWNER            4
#define GW_CHILD            5
#if(WINVER <= 0x0400) #define GW_MAX 5 #else #define GW_ENABLEDPOPUP 6 #define GW_MAX 6 #endif WINUSERAPI HWND WINAPI GetWindow( __in HWND hWnd, __in UINT uCmd); #ifndef NOWH #ifdef STRICT WINUSERAPI HHOOK WINAPI SetWindowsHookA( __in int nFilterType, __in HOOKPROC pfnFilterProc); WINUSERAPI HHOOK WINAPI SetWindowsHookW( __in int nFilterType, __in HOOKPROC pfnFilterProc); #ifdef UNICODE #define SetWindowsHook SetWindowsHookW #else #define SetWindowsHook SetWindowsHookA #endif // !UNICODE #else /* !STRICT */ WINUSERAPI HOOKPROC WINAPI SetWindowsHookA( __in int nFilterType, __in HOOKPROC pfnFilterProc); WINUSERAPI HOOKPROC WINAPI SetWindowsHookW( __in int nFilterType, __in HOOKPROC pfnFilterProc); #ifdef UNICODE #define SetWindowsHook SetWindowsHookW #else #define SetWindowsHook SetWindowsHookA #endif // !UNICODE #endif /* !STRICT */ WINUSERAPI BOOL WINAPI UnhookWindowsHook( __in int nCode, __in HOOKPROC pfnFilterProc); WINUSERAPI HHOOK WINAPI SetWindowsHookExA( __in int idHook, __in HOOKPROC lpfn, __in_opt HINSTANCE hmod, __in DWORD dwThreadId); WINUSERAPI HHOOK WINAPI SetWindowsHookExW( __in int idHook, __in HOOKPROC lpfn, __in_opt HINSTANCE hmod, __in DWORD dwThreadId); #ifdef UNICODE #define SetWindowsHookEx SetWindowsHookExW #else #define SetWindowsHookEx SetWindowsHookExA #endif // !UNICODE WINUSERAPI BOOL WINAPI UnhookWindowsHookEx( __in HHOOK hhk); WINUSERAPI LRESULT WINAPI CallNextHookEx( __in_opt HHOOK hhk, __in int nCode, __in WPARAM wParam, __in LPARAM lParam); /* * Macros for source-level compatibility with old functions. */ #ifdef STRICT #define DefHookProc(nCode, wParam, lParam, phhk)\ CallNextHookEx(*phhk, nCode, wParam, lParam) #else #define DefHookProc(nCode, wParam, lParam, phhk)\ CallNextHookEx((HHOOK)*phhk, nCode, wParam, lParam) #endif /* STRICT */ #endif /* !NOWH */ #ifndef NOMENUS /* ;win40 -- A lot of MF_* flags have been renamed as MFT_* and MFS_* flags */ /* * Menu flags for Add/Check/EnableMenuItem() */ #define MF_INSERT 0x00000000L #define MF_CHANGE 0x00000080L #define MF_APPEND 0x00000100L #define MF_DELETE 0x00000200L #define MF_REMOVE 0x00001000L #define MF_BYCOMMAND 0x00000000L #define MF_BYPOSITION 0x00000400L #define MF_SEPARATOR 0x00000800L #define MF_ENABLED 0x00000000L #define MF_GRAYED 0x00000001L #define MF_DISABLED 0x00000002L #define MF_UNCHECKED 0x00000000L #define MF_CHECKED 0x00000008L #define MF_USECHECKBITMAPS 0x00000200L #define MF_STRING 0x00000000L #define MF_BITMAP 0x00000004L #define MF_OWNERDRAW 0x00000100L #define MF_POPUP 0x00000010L #define MF_MENUBARBREAK 0x00000020L #define MF_MENUBREAK 0x00000040L #define MF_UNHILITE 0x00000000L #define MF_HILITE 0x00000080L #if(WINVER >= 0x0400)
#define MF_DEFAULT          0x00001000L
#endif /* WINVER >= 0x0400 */
#define MF_SYSMENU          0x00002000L
#define MF_HELP             0x00004000L
#if(WINVER >= 0x0400)
#define MF_RIGHTJUSTIFY     0x00004000L
#endif /* WINVER >= 0x0400 */

#define MF_MOUSESELECT      0x00008000L
#if(WINVER >= 0x0400)
#define MF_END              0x00000080L  /* Obsolete -- only used by old RES files */
#endif /* WINVER >= 0x0400 */


#if(WINVER >= 0x0400)
#define MFT_STRING          MF_STRING
#define MFT_BITMAP          MF_BITMAP
#define MFT_MENUBARBREAK    MF_MENUBARBREAK
#define MFT_MENUBREAK       MF_MENUBREAK
#define MFT_OWNERDRAW       MF_OWNERDRAW
#define MFT_RADIOCHECK      0x00000200L
#define MFT_SEPARATOR       MF_SEPARATOR
#define MFT_RIGHTORDER      0x00002000L
#define MFT_RIGHTJUSTIFY    MF_RIGHTJUSTIFY

/* Menu flags for Add/Check/EnableMenuItem() */
#define MFS_GRAYED          0x00000003L
#define MFS_DISABLED        MFS_GRAYED
#define MFS_CHECKED         MF_CHECKED
#define MFS_HILITE          MF_HILITE
#define MFS_ENABLED         MF_ENABLED
#define MFS_UNCHECKED       MF_UNCHECKED
#define MFS_UNHILITE        MF_UNHILITE
#define MFS_DEFAULT         MF_DEFAULT
#endif /* WINVER >= 0x0400 */


#if(WINVER >= 0x0400)

WINUSERAPI
BOOL
WINAPI
CheckMenuRadioItem(
    __in HMENU hmenu,
    __in UINT first,
    __in UINT last,
    __in UINT check,
    __in UINT flags);
#endif /* WINVER >= 0x0400 */

/*
 * Menu item resource format
 */
typedef struct {
    WORD versionNumber;
    WORD offset;
} MENUITEMTEMPLATEHEADER, *PMENUITEMTEMPLATEHEADER;

typedef struct {        // version 0
    WORD mtOption;
    WORD mtID;
    WCHAR mtString[1];
} MENUITEMTEMPLATE, *PMENUITEMTEMPLATE;
#define MF_END             0x00000080L

#endif /* !NOMENUS */

#ifndef NOSYSCOMMANDS

/*
 * System Menu Command Values
 */
#define SC_SIZE         0xF000
#define SC_MOVE         0xF010
#define SC_MINIMIZE     0xF020
#define SC_MAXIMIZE     0xF030
#define SC_NEXTWINDOW   0xF040
#define SC_PREVWINDOW   0xF050
#define SC_CLOSE        0xF060
#define SC_VSCROLL      0xF070
#define SC_HSCROLL      0xF080
#define SC_MOUSEMENU    0xF090
#define SC_KEYMENU      0xF100
#define SC_ARRANGE      0xF110
#define SC_RESTORE      0xF120
#define SC_TASKLIST     0xF130
#define SC_SCREENSAVE   0xF140
#define SC_HOTKEY       0xF150
#if(WINVER >= 0x0400)
#define SC_DEFAULT      0xF160
#define SC_MONITORPOWER 0xF170
#define SC_CONTEXTHELP  0xF180
#define SC_SEPARATOR    0xF00F
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0600)
#define SCF_ISSECURE    0x00000001
#endif /* WINVER >= 0x0600 */

#define GET_SC_WPARAM(wParam) ((int)wParam & 0xFFF0)

/*
 * Obsolete names
 */
#define SC_ICON         SC_MINIMIZE
#define SC_ZOOM         SC_MAXIMIZE

#endif /* !NOSYSCOMMANDS */

/*
 * Resource Loading Routines
 */

WINUSERAPI
HBITMAP
WINAPI
LoadBitmapA(
    __in_opt HINSTANCE hInstance,
    __in LPCSTR lpBitmapName);
WINUSERAPI
HBITMAP
WINAPI
LoadBitmapW(
    __in_opt HINSTANCE hInstance,
    __in LPCWSTR lpBitmapName);
#ifdef UNICODE
#define LoadBitmap  LoadBitmapW
#else
#define LoadBitmap  LoadBitmapA
#endif // !UNICODE

WINUSERAPI
HCURSOR
WINAPI
LoadCursorA(
    __in_opt HINSTANCE hInstance,
    __in LPCSTR lpCursorName);
WINUSERAPI
HCURSOR
WINAPI
LoadCursorW(
    __in_opt HINSTANCE hInstance,
    __in LPCWSTR lpCursorName);
#ifdef UNICODE
#define LoadCursor  LoadCursorW
#else
#define LoadCursor  LoadCursorA
#endif // !UNICODE

WINUSERAPI
HCURSOR
WINAPI
LoadCursorFromFileA(
    __in LPCSTR lpFileName);
WINUSERAPI
HCURSOR
WINAPI
LoadCursorFromFileW(
    __in LPCWSTR lpFileName);
#ifdef UNICODE
#define LoadCursorFromFile  LoadCursorFromFileW
#else
#define LoadCursorFromFile  LoadCursorFromFileA
#endif // !UNICODE

WINUSERAPI
HCURSOR
WINAPI
CreateCursor(
    __in_opt HINSTANCE hInst,
    __in int xHotSpot,
    __in int yHotSpot,
    __in int nWidth,
    __in int nHeight,
    __in CONST VOID *pvANDPlane,
    __in CONST VOID *pvXORPlane);

WINUSERAPI
BOOL
WINAPI
DestroyCursor(
    __in HCURSOR hCursor);

#ifndef _MAC
#define CopyCursor(pcur) ((HCURSOR)CopyIcon((HICON)(pcur)))
#else
WINUSERAPI
HCURSOR
WINAPI
CopyCursor(
    __in HCURSOR hCursor);
#endif

/*
 * Standard Cursor IDs
 */
#define IDC_ARROW           MAKEINTRESOURCE(32512)
#define IDC_IBEAM           MAKEINTRESOURCE(32513)
#define IDC_WAIT            MAKEINTRESOURCE(32514)
#define IDC_CROSS           MAKEINTRESOURCE(32515)
#define IDC_UPARROW         MAKEINTRESOURCE(32516)
#define IDC_SIZE            MAKEINTRESOURCE(32640)  /* OBSOLETE: use IDC_SIZEALL */
#define IDC_ICON            MAKEINTRESOURCE(32641)  /* OBSOLETE: use IDC_ARROW */
#define IDC_SIZENWSE        MAKEINTRESOURCE(32642)
#define IDC_SIZENESW        MAKEINTRESOURCE(32643)
#define IDC_SIZEWE          MAKEINTRESOURCE(32644)
#define IDC_SIZENS          MAKEINTRESOURCE(32645)
#define IDC_SIZEALL         MAKEINTRESOURCE(32646)
#define IDC_NO              MAKEINTRESOURCE(32648) /*not in win3.1 */
#if(WINVER >= 0x0500)
#define IDC_HAND            MAKEINTRESOURCE(32649)
#endif /* WINVER >= 0x0500 */
#define IDC_APPSTARTING     MAKEINTRESOURCE(32650) /*not in win3.1 */
#if(WINVER >= 0x0400)
#define IDC_HELP            MAKEINTRESOURCE(32651)
#endif /* WINVER >= 0x0400 */

WINUSERAPI
BOOL
WINAPI
SetSystemCursor(
    __in HCURSOR hcur,
    __in DWORD id);

typedef struct _ICONINFO {
    BOOL    fIcon;
    DWORD   xHotspot;
    DWORD   yHotspot;
    HBITMAP hbmMask;
    HBITMAP hbmColor;
} ICONINFO;
typedef ICONINFO *PICONINFO;

WINUSERAPI
HICON
WINAPI
LoadIconA(
    __in_opt HINSTANCE hInstance,
    __in LPCSTR lpIconName);
WINUSERAPI
HICON
WINAPI
LoadIconW(
    __in_opt HINSTANCE hInstance,
    __in LPCWSTR lpIconName);
#ifdef UNICODE
#define LoadIcon  LoadIconW
#else
#define LoadIcon  LoadIconA
#endif // !UNICODE


WINUSERAPI
UINT
WINAPI
PrivateExtractIconsA(
    __in LPCSTR szFileName,
    __in int nIconIndex,
    __in int cxIcon,
    __in int cyIcon,
    __out_ecount_part_opt(nIcons, return) HICON *phicon,
    __out_ecount_part_opt(nIcons, return) UINT *piconid,
    __in UINT nIcons,
    __in UINT flags);
WINUSERAPI
UINT
WINAPI
PrivateExtractIconsW(
    __in LPCWSTR szFileName,
    __in int nIconIndex,
    __in int cxIcon,
    __in int cyIcon,
    __out_ecount_part_opt(nIcons, return) HICON *phicon,
    __out_ecount_part_opt(nIcons, return) UINT *piconid,
    __in UINT nIcons,
    __in UINT flags);
#ifdef UNICODE
#define PrivateExtractIcons  PrivateExtractIconsW
#else
#define PrivateExtractIcons  PrivateExtractIconsA
#endif // !UNICODE

WINUSERAPI
HICON
WINAPI
CreateIcon(
    __in_opt HINSTANCE hInstance,
    __in int nWidth,
    __in int nHeight,
    __in BYTE cPlanes,
    __in BYTE cBitsPixel,
    __in CONST BYTE *lpbANDbits,
    __in CONST BYTE *lpbXORbits);

WINUSERAPI
BOOL
WINAPI
DestroyIcon(
    __in HICON hIcon);

WINUSERAPI
int
WINAPI
LookupIconIdFromDirectory(
    __in PBYTE presbits,
    __in BOOL fIcon);

#if(WINVER >= 0x0400)
WINUSERAPI
int
WINAPI
LookupIconIdFromDirectoryEx(
    __in PBYTE presbits,
    __in BOOL fIcon,
    __in int cxDesired,
    __in int cyDesired,
    __in UINT Flags);
#endif /* WINVER >= 0x0400 */

WINUSERAPI
HICON
WINAPI
CreateIconFromResource(
    __in PBYTE presbits,
    __in DWORD dwResSize,
    __in BOOL fIcon,
    __in DWORD dwVer);

#if(WINVER >= 0x0400)
WINUSERAPI
HICON
WINAPI
CreateIconFromResourceEx(
    __in PBYTE presbits,
    __in DWORD dwResSize,
    __in BOOL fIcon,
    __in DWORD dwVer,
    __in int cxDesired,
    __in int cyDesired,
    __in UINT Flags);

/* Icon/Cursor header */
typedef struct tagCURSORSHAPE
{
    int     xHotSpot;
    int     yHotSpot;
    int     cx;
    int     cy;
    int     cbWidth;
    BYTE    Planes;
    BYTE    BitsPixel;
} CURSORSHAPE, FAR *LPCURSORSHAPE;
#endif /* WINVER >= 0x0400 */

#define IMAGE_BITMAP        0
#define IMAGE_ICON          1
#define IMAGE_CURSOR        2
#if(WINVER >= 0x0400)
#define IMAGE_ENHMETAFILE   3

#define LR_DEFAULTCOLOR     0x00000000
#define LR_MONOCHROME       0x00000001
#define LR_COLOR            0x00000002
#define LR_COPYRETURNORG    0x00000004
#define LR_COPYDELETEORG    0x00000008
#define LR_LOADFROMFILE     0x00000010
#define LR_LOADTRANSPARENT  0x00000020
#define LR_DEFAULTSIZE      0x00000040
#define LR_VGACOLOR         0x00000080
#define LR_LOADMAP3DCOLORS  0x00001000
#define LR_CREATEDIBSECTION 0x00002000
#define LR_COPYFROMRESOURCE 0x00004000
#define LR_SHARED           0x00008000

WINUSERAPI
HANDLE
WINAPI
LoadImageA(
    __in_opt HINSTANCE hInst,
    __in LPCSTR name,
    __in UINT type,
    __in int cx,
    __in int cy,
    __in UINT fuLoad);
WINUSERAPI
HANDLE
WINAPI
LoadImageW(
    __in_opt HINSTANCE hInst,
    __in LPCWSTR name,
    __in UINT type,
    __in int cx,
    __in int cy,
    __in UINT fuLoad);
#ifdef UNICODE
#define LoadImage  LoadImageW
#else
#define LoadImage  LoadImageA
#endif // !UNICODE

WINUSERAPI
HANDLE
WINAPI
CopyImage(
    __in HANDLE h,
    __in UINT type,
    __in int cx,
    __in int cy,
    __in UINT flags);

#define DI_MASK         0x0001
#define DI_IMAGE        0x0002
#define DI_NORMAL       0x0003
#define DI_COMPAT       0x0004
#define DI_DEFAULTSIZE  0x0008
#if(_WIN32_WINNT >= 0x0501)
#define DI_NOMIRROR     0x0010
#endif /* _WIN32_WINNT >= 0x0501 */

WINUSERAPI BOOL WINAPI DrawIconEx(
    __in HDC hdc,
    __in int xLeft,
    __in int yTop,
    __in HICON hIcon,
    __in int cxWidth,
    __in int cyWidth,
    __in UINT istepIfAniCur,
    __in_opt HBRUSH hbrFlickerFreeDraw,
    __in UINT diFlags);

#endif /* WINVER >= 0x0400 */

WINUSERAPI
HICON
WINAPI
CreateIconIndirect(
    __in PICONINFO piconinfo);

WINUSERAPI
HICON
WINAPI
CopyIcon(
    __in HICON hIcon);

WINUSERAPI
BOOL
WINAPI
GetIconInfo(
    __in HICON hIcon,
    __out PICONINFO piconinfo);

#if(_WIN32_WINNT >= 0x0600)
typedef struct _ICONINFOEXA {
    DWORD   cbSize;
    BOOL    fIcon;
    DWORD   xHotspot;
    DWORD   yHotspot;
    HBITMAP hbmMask;
    HBITMAP hbmColor;
    WORD    wResID;
    CHAR    szModName[MAX_PATH];
    CHAR    szResName[MAX_PATH];
} ICONINFOEXA, *PICONINFOEXA;
typedef struct _ICONINFOEXW {
    DWORD   cbSize;
    BOOL    fIcon;
    DWORD   xHotspot;
    DWORD   yHotspot;
    HBITMAP hbmMask;
    HBITMAP hbmColor;
    WORD    wResID;
    WCHAR   szModName[MAX_PATH];
    WCHAR   szResName[MAX_PATH];
} ICONINFOEXW, *PICONINFOEXW;
#ifdef UNICODE
typedef ICONINFOEXW ICONINFOEX;
typedef PICONINFOEXW PICONINFOEX;
#else
typedef ICONINFOEXA ICONINFOEX;
typedef PICONINFOEXA PICONINFOEX;
#endif // UNICODE

WINUSERAPI
BOOL
WINAPI
GetIconInfoExA(
    __in HICON hicon,
    __inout PICONINFOEXA piconinfo);
WINUSERAPI
BOOL
WINAPI
GetIconInfoExW(
    __in HICON hicon,
    __inout PICONINFOEXW piconinfo);
#ifdef UNICODE
#define GetIconInfoEx  GetIconInfoExW
#else
#define GetIconInfoEx  GetIconInfoExA
#endif // !UNICODE
#endif /* _WIN32_WINNT >= 0x0600 */

#if(WINVER >= 0x0400)
#define RES_ICON    1
#define RES_CURSOR  2
#endif /* WINVER >= 0x0400 */

#ifdef OEMRESOURCE


/*
 * OEM Resource Ordinal Numbers
 */
#define OBM_CLOSE           32754
#define OBM_UPARROW         32753
#define OBM_DNARROW         32752
#define OBM_RGARROW         32751
#define OBM_LFARROW         32750
#define OBM_REDUCE          32749
#define OBM_ZOOM            32748
#define OBM_RESTORE         32747
#define OBM_REDUCED         32746
#define OBM_ZOOMD           32745
#define OBM_RESTORED        32744
#define OBM_UPARROWD        32743
#define OBM_DNARROWD        32742
#define OBM_RGARROWD        32741
#define OBM_LFARROWD        32740
#define OBM_MNARROW         32739
#define OBM_COMBO           32738
#define OBM_UPARROWI        32737
#define OBM_DNARROWI        32736
#define OBM_RGARROWI        32735
#define OBM_LFARROWI        32734

#define OBM_OLD_CLOSE       32767
#define OBM_SIZE            32766
#define OBM_OLD_UPARROW     32765
#define OBM_OLD_DNARROW     32764
#define OBM_OLD_RGARROW     32763
#define OBM_OLD_LFARROW     32762
#define OBM_BTSIZE          32761
#define OBM_CHECK           32760
#define OBM_CHECKBOXES      32759
#define OBM_BTNCORNERS      32758
#define OBM_OLD_REDUCE      32757
#define OBM_OLD_ZOOM        32756
#define OBM_OLD_RESTORE     32755


#define OCR_NORMAL          32512
#define OCR_IBEAM           32513
#define OCR_WAIT            32514
#define OCR_CROSS           32515
#define OCR_UP              32516
#define OCR_SIZE            32640   /* OBSOLETE: use OCR_SIZEALL */
#define OCR_ICON            32641   /* OBSOLETE: use OCR_NORMAL */
#define OCR_SIZENWSE        32642
#define OCR_SIZENESW        32643
#define OCR_SIZEWE          32644
#define OCR_SIZENS          32645
#define OCR_SIZEALL         32646
#define OCR_ICOCUR          32647   /* OBSOLETE: use OIC_WINLOGO */
#define OCR_NO              32648
#if(WINVER >= 0x0500)
#define OCR_HAND            32649
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0400)
#define OCR_APPSTARTING     32650
#endif /* WINVER >= 0x0400 */


#define OIC_SAMPLE          32512
#define OIC_HAND            32513
#define OIC_QUES            32514
#define OIC_BANG            32515
#define OIC_NOTE            32516
#if(WINVER >= 0x0400)
#define OIC_WINLOGO         32517
#define OIC_WARNING         OIC_BANG
#define OIC_ERROR           OIC_HAND
#define OIC_INFORMATION     OIC_NOTE
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0600)
#define OIC_SHIELD          32518
#endif /* WINVER >= 0x0600 */



#endif /* OEMRESOURCE */

#define ORD_LANGDRIVER    1     /* The ordinal number for the entry point of
                                ** language drivers.
                                */

#ifndef NOICONS

/*
 * Standard Icon IDs
 */
#ifdef RC_INVOKED
#define IDI_APPLICATION     32512
#define IDI_HAND            32513
#define IDI_QUESTION        32514
#define IDI_EXCLAMATION     32515
#define IDI_ASTERISK        32516
#if(WINVER >= 0x0400)
#define IDI_WINLOGO         32517
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0600)
#define IDI_SHIELD          32518
#endif /* WINVER >= 0x0600 */
#else
#define IDI_APPLICATION     MAKEINTRESOURCE(32512)
#define IDI_HAND            MAKEINTRESOURCE(32513)
#define IDI_QUESTION        MAKEINTRESOURCE(32514)
#define IDI_EXCLAMATION     MAKEINTRESOURCE(32515)
#define IDI_ASTERISK        MAKEINTRESOURCE(32516)
#if(WINVER >= 0x0400)
#define IDI_WINLOGO         MAKEINTRESOURCE(32517)
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0600)
#define IDI_SHIELD          MAKEINTRESOURCE(32518)
#endif /* WINVER >= 0x0600 */
#endif /* RC_INVOKED */

#if(WINVER >= 0x0400)
#define IDI_WARNING     IDI_EXCLAMATION
#define IDI_ERROR       IDI_HAND
#define IDI_INFORMATION IDI_ASTERISK
#endif /* WINVER >= 0x0400 */


#endif /* !NOICONS */


WINUSERAPI
int
WINAPI
LoadStringA(
    __in_opt HINSTANCE hInstance,
    __in UINT uID,
    __out_ecount_part(cchBufferMax, return + 1) LPSTR lpBuffer,
    __in int cchBufferMax);
WINUSERAPI
int
WINAPI
LoadStringW(
    __in_opt HINSTANCE hInstance,
    __in UINT uID,
    __out_ecount_part(cchBufferMax, return + 1) LPWSTR lpBuffer,
    __in int cchBufferMax);
#ifdef UNICODE
#define LoadString  LoadStringW
#else
#define LoadString  LoadStringA
#endif // !UNICODE


/*
 * Dialog Box Command IDs
 */
#define IDOK                1
#define IDCANCEL            2
#define IDABORT             3
#define IDRETRY             4
#define IDIGNORE            5
#define IDYES               6
#define IDNO                7
#if(WINVER >= 0x0400)
#define IDCLOSE         8
#define IDHELP          9
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0500)
#define IDTRYAGAIN      10
#define IDCONTINUE      11
#endif /* WINVER >= 0x0500 */

#if(WINVER >= 0x0501)
#ifndef IDTIMEOUT
#define IDTIMEOUT 32000
#endif
#endif /* WINVER >= 0x0501 */


#ifndef NOCTLMGR

/*
 * Control Manager Structures and Definitions
 */

#ifndef NOWINSTYLES


/*
 * Edit Control Styles
 */
#define ES_LEFT             0x0000L
#define ES_CENTER           0x0001L
#define ES_RIGHT            0x0002L
#define ES_MULTILINE        0x0004L
#define ES_UPPERCASE        0x0008L
#define ES_LOWERCASE        0x0010L
#define ES_PASSWORD         0x0020L
#define ES_AUTOVSCROLL      0x0040L
#define ES_AUTOHSCROLL      0x0080L
#define ES_NOHIDESEL        0x0100L
#define ES_OEMCONVERT       0x0400L
#define ES_READONLY         0x0800L
#define ES_WANTRETURN       0x1000L
#if(WINVER >= 0x0400)
#define ES_NUMBER           0x2000L
#endif /* WINVER >= 0x0400 */


#endif /* !NOWINSTYLES */

/*
 * Edit Control Notification Codes
 */
#define EN_SETFOCUS         0x0100
#define EN_KILLFOCUS        0x0200
#define EN_CHANGE           0x0300
#define EN_UPDATE           0x0400
#define EN_ERRSPACE         0x0500
#define EN_MAXTEXT          0x0501
#define EN_HSCROLL          0x0601
#define EN_VSCROLL          0x0602

#if(_WIN32_WINNT >= 0x0500)
#define EN_ALIGN_LTR_EC     0x0700
#define EN_ALIGN_RTL_EC     0x0701
#endif /* _WIN32_WINNT >= 0x0500 */

#if(WINVER >= 0x0400)
/* Edit control EM_SETMARGIN parameters */
#define EC_LEFTMARGIN       0x0001
#define EC_RIGHTMARGIN      0x0002
#define EC_USEFONTINFO      0xffff
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0500)
/* wParam of EM_GET/SETIMESTATUS  */
#define EMSIS_COMPOSITIONSTRING        0x0001

/* lParam for EMSIS_COMPOSITIONSTRING  */
#define EIMES_GETCOMPSTRATONCE         0x0001
#define EIMES_CANCELCOMPSTRINFOCUS     0x0002
#define EIMES_COMPLETECOMPSTRKILLFOCUS 0x0004
#endif /* WINVER >= 0x0500 */

#ifndef NOWINMESSAGES


/*
 * Edit Control Messages
 */
#define EM_GETSEL               0x00B0
#define EM_SETSEL               0x00B1
#define EM_GETRECT              0x00B2
#define EM_SETRECT              0x00B3
#define EM_SETRECTNP            0x00B4
#define EM_SCROLL               0x00B5
#define EM_LINESCROLL           0x00B6
#define EM_SCROLLCARET          0x00B7
#define EM_GETMODIFY            0x00B8
#define EM_SETMODIFY            0x00B9
#define EM_GETLINECOUNT         0x00BA
#define EM_LINEINDEX            0x00BB
#define EM_SETHANDLE            0x00BC
#define EM_GETHANDLE            0x00BD
#define EM_GETTHUMB             0x00BE
#define EM_LINELENGTH           0x00C1
#define EM_REPLACESEL           0x00C2
#define EM_GETLINE              0x00C4
#define EM_LIMITTEXT            0x00C5
#define EM_CANUNDO              0x00C6
#define EM_UNDO                 0x00C7
#define EM_FMTLINES             0x00C8
#define EM_LINEFROMCHAR         0x00C9
#define EM_SETTABSTOPS          0x00CB
#define EM_SETPASSWORDCHAR      0x00CC
#define EM_EMPTYUNDOBUFFER      0x00CD
#define EM_GETFIRSTVISIBLELINE  0x00CE
#define EM_SETREADONLY          0x00CF
#define EM_SETWORDBREAKPROC     0x00D0
#define EM_GETWORDBREAKPROC     0x00D1
#define EM_GETPASSWORDCHAR      0x00D2
#if(WINVER >= 0x0400)
#define EM_SETMARGINS           0x00D3
#define EM_GETMARGINS           0x00D4
#define EM_SETLIMITTEXT         EM_LIMITTEXT   /* ;win40 Name change */
#define EM_GETLIMITTEXT         0x00D5
#define EM_POSFROMCHAR          0x00D6
#define EM_CHARFROMPOS          0x00D7
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0500)
#define EM_SETIMESTATUS         0x00D8
#define EM_GETIMESTATUS         0x00D9
#endif /* WINVER >= 0x0500 */


#endif /* !NOWINMESSAGES */

/*
 * EDITWORDBREAKPROC code values
 */
#define WB_LEFT            0
#define WB_RIGHT           1
#define WB_ISDELIMITER     2


/*
 * Button Control Styles
 */
#define BS_PUSHBUTTON       0x00000000L
#define BS_DEFPUSHBUTTON    0x00000001L
#define BS_CHECKBOX         0x00000002L
#define BS_AUTOCHECKBOX     0x00000003L
#define BS_RADIOBUTTON      0x00000004L
#define BS_3STATE           0x00000005L
#define BS_AUTO3STATE       0x00000006L
#define BS_GROUPBOX         0x00000007L
#define BS_USERBUTTON       0x00000008L
#define BS_AUTORADIOBUTTON  0x00000009L
#define BS_PUSHBOX          0x0000000AL
#define BS_OWNERDRAW        0x0000000BL
#define BS_TYPEMASK         0x0000000FL
#define BS_LEFTTEXT         0x00000020L
#if(WINVER >= 0x0400)
#define BS_TEXT             0x00000000L
#define BS_ICON             0x00000040L
#define BS_BITMAP           0x00000080L
#define BS_LEFT             0x00000100L
#define BS_RIGHT            0x00000200L
#define BS_CENTER           0x00000300L
#define BS_TOP              0x00000400L
#define BS_BOTTOM           0x00000800L
#define BS_VCENTER          0x00000C00L
#define BS_PUSHLIKE         0x00001000L
#define BS_MULTILINE        0x00002000L
#define BS_NOTIFY           0x00004000L
#define BS_FLAT             0x00008000L
#define BS_RIGHTBUTTON      BS_LEFTTEXT
#endif /* WINVER >= 0x0400 */

/*
 * User Button Notification Codes
 */
#define BN_CLICKED          0
#define BN_PAINT            1
#define BN_HILITE           2
#define BN_UNHILITE         3
#define BN_DISABLE          4
#define BN_DOUBLECLICKED    5
#if(WINVER >= 0x0400)
#define BN_PUSHED           BN_HILITE
#define BN_UNPUSHED         BN_UNHILITE
#define BN_DBLCLK           BN_DOUBLECLICKED
#define BN_SETFOCUS         6
#define BN_KILLFOCUS        7
#endif /* WINVER >= 0x0400 */

/*
 * Button Control Messages
 */
#define BM_GETCHECK        0x00F0
#define BM_SETCHECK        0x00F1
#define BM_GETSTATE        0x00F2
#define BM_SETSTATE        0x00F3
#define BM_SETSTYLE        0x00F4
#if(WINVER >= 0x0400)
#define BM_CLICK           0x00F5
#define BM_GETIMAGE        0x00F6
#define BM_SETIMAGE        0x00F7
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0600)
#define BM_SETDONTCLICK    0x00F8
#endif /* WINVER >= 0x0600 */

#if(WINVER >= 0x0400)
#define BST_UNCHECKED      0x0000
#define BST_CHECKED        0x0001
#define BST_INDETERMINATE  0x0002
#define BST_PUSHED         0x0004
#define BST_FOCUS          0x0008
#endif /* WINVER >= 0x0400 */

/*
 * Static Control Constants
 */
#define SS_LEFT             0x00000000L
#define SS_CENTER           0x00000001L
#define SS_RIGHT            0x00000002L
#define SS_ICON             0x00000003L
#define SS_BLACKRECT        0x00000004L
#define SS_GRAYRECT         0x00000005L
#define SS_WHITERECT        0x00000006L
#define SS_BLACKFRAME       0x00000007L
#define SS_GRAYFRAME        0x00000008L
#define SS_WHITEFRAME       0x00000009L
#define SS_USERITEM         0x0000000AL
#define SS_SIMPLE           0x0000000BL
#define SS_LEFTNOWORDWRAP   0x0000000CL
#if(WINVER >= 0x0400)
#define SS_OWNERDRAW        0x0000000DL
#define SS_BITMAP           0x0000000EL
#define SS_ENHMETAFILE      0x0000000FL
#define SS_ETCHEDHORZ       0x00000010L
#define SS_ETCHEDVERT       0x00000011L
#define SS_ETCHEDFRAME      0x00000012L
#define SS_TYPEMASK         0x0000001FL
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0501)
#define SS_REALSIZECONTROL  0x00000040L
#endif /* WINVER >= 0x0501 */
#define SS_NOPREFIX         0x00000080L /* Don't do "&" character translation */
#if(WINVER >= 0x0400)
#define SS_NOTIFY           0x00000100L
#define SS_CENTERIMAGE      0x00000200L
#define SS_RIGHTJUST        0x00000400L
#define SS_REALSIZEIMAGE    0x00000800L
#define SS_SUNKEN           0x00001000L
#define SS_EDITCONTROL      0x00002000L
#define SS_ENDELLIPSIS      0x00004000L
#define SS_PATHELLIPSIS     0x00008000L
#define SS_WORDELLIPSIS     0x0000C000L
#define SS_ELLIPSISMASK     0x0000C000L
#endif /* WINVER >= 0x0400 */



#ifndef NOWINMESSAGES
/*
 * Static Control Mesages
 */
#define STM_SETICON         0x0170
#define STM_GETICON         0x0171
#if(WINVER >= 0x0400)
#define STM_SETIMAGE        0x0172
#define STM_GETIMAGE        0x0173
#define STN_CLICKED         0
#define STN_DBLCLK          1
#define STN_ENABLE          2
#define STN_DISABLE         3
#endif /* WINVER >= 0x0400 */
#define STM_MSGMAX          0x0174
#endif /* !NOWINMESSAGES */

/*
 * Dialog window class
 */
#define WC_DIALOG       (MAKEINTATOM(0x8002))

/*
 * Get/SetWindowWord/Long offsets for use with WC_DIALOG windows
 */
#define DWL_MSGRESULT   0
#define DWL_DLGPROC     4
#define DWL_USER        8

#ifdef _WIN64

#undef DWL_MSGRESULT
#undef DWL_DLGPROC
#undef DWL_USER

#endif /* _WIN64 */

#define DWLP_MSGRESULT  0
#define DWLP_DLGPROC    DWLP_MSGRESULT + sizeof(LRESULT)
#define DWLP_USER       DWLP_DLGPROC + sizeof(DLGPROC)

/*
 * Dialog Manager Routines
 */

#ifndef NOMSG

WINUSERAPI
BOOL
WINAPI
IsDialogMessageA(
    __in HWND hDlg,
    __in LPMSG lpMsg);
WINUSERAPI
BOOL
WINAPI
IsDialogMessageW(
    __in HWND hDlg,
    __in LPMSG lpMsg);
#ifdef UNICODE
#define IsDialogMessage  IsDialogMessageW
#else
#define IsDialogMessage  IsDialogMessageA
#endif // !UNICODE

#endif /* !NOMSG */

WINUSERAPI
BOOL
WINAPI
MapDialogRect(
    __in HWND hDlg,
    __inout LPRECT lpRect);

WINUSERAPI
int
WINAPI
DlgDirListA(
    __in HWND hDlg,
    __inout LPSTR lpPathSpec,
    __in int nIDListBox,
    __in int nIDStaticPath,
    __in UINT uFileType);
WINUSERAPI
int
WINAPI
DlgDirListW(
    __in HWND hDlg,
    __inout LPWSTR lpPathSpec,
    __in int nIDListBox,
    __in int nIDStaticPath,
    __in UINT uFileType);
#ifdef UNICODE
#define DlgDirList  DlgDirListW
#else
#define DlgDirList  DlgDirListA
#endif // !UNICODE

/*
 * DlgDirList, DlgDirListComboBox flags values
 */
#define DDL_READWRITE       0x0000
#define DDL_READONLY        0x0001
#define DDL_HIDDEN          0x0002
#define DDL_SYSTEM          0x0004
#define DDL_DIRECTORY       0x0010
#define DDL_ARCHIVE         0x0020

#define DDL_POSTMSGS        0x2000
#define DDL_DRIVES          0x4000
#define DDL_EXCLUSIVE       0x8000

WINUSERAPI
BOOL
WINAPI
DlgDirSelectExA(
    __in HWND hwndDlg,
    __out_ecount(chCount) LPSTR lpString,
    __in int chCount,
    __in int idListBox);
WINUSERAPI
BOOL
WINAPI
DlgDirSelectExW(
    __in HWND hwndDlg,
    __out_ecount(chCount) LPWSTR lpString,
    __in int chCount,
    __in int idListBox);
#ifdef UNICODE
#define DlgDirSelectEx  DlgDirSelectExW
#else
#define DlgDirSelectEx  DlgDirSelectExA
#endif // !UNICODE

WINUSERAPI
int
WINAPI
DlgDirListComboBoxA(
    __in HWND hDlg,
    __inout LPSTR lpPathSpec,
    __in int nIDComboBox,
    __in int nIDStaticPath,
    __in UINT uFiletype);
WINUSERAPI
int
WINAPI
DlgDirListComboBoxW(
    __in HWND hDlg,
    __inout LPWSTR lpPathSpec,
    __in int nIDComboBox,
    __in int nIDStaticPath,
    __in UINT uFiletype);
#ifdef UNICODE
#define DlgDirListComboBox  DlgDirListComboBoxW
#else
#define DlgDirListComboBox  DlgDirListComboBoxA
#endif // !UNICODE

WINUSERAPI
BOOL
WINAPI
DlgDirSelectComboBoxExA(
    __in HWND hwndDlg,
    __out_ecount(cchOut) LPSTR lpString,
    __in int cchOut,
    __in int idComboBox);
WINUSERAPI
BOOL
WINAPI
DlgDirSelectComboBoxExW(
    __in HWND hwndDlg,
    __out_ecount(cchOut) LPWSTR lpString,
    __in int cchOut,
    __in int idComboBox);
#ifdef UNICODE
#define DlgDirSelectComboBoxEx  DlgDirSelectComboBoxExW
#else
#define DlgDirSelectComboBoxEx  DlgDirSelectComboBoxExA
#endif // !UNICODE



/*
 * Dialog Styles
 */
#define DS_ABSALIGN         0x01L
#define DS_SYSMODAL         0x02L
#define DS_LOCALEDIT        0x20L   /* Edit items get Local storage. */
#define DS_SETFONT          0x40L   /* User specified font for Dlg controls */
#define DS_MODALFRAME       0x80L   /* Can be combined with WS_CAPTION  */
#define DS_NOIDLEMSG        0x100L  /* WM_ENTERIDLE message will not be sent */
#define DS_SETFOREGROUND    0x200L  /* not in win3.1 */


#if(WINVER >= 0x0400)
#define DS_3DLOOK           0x0004L
#define DS_FIXEDSYS         0x0008L
#define DS_NOFAILCREATE     0x0010L
#define DS_CONTROL          0x0400L
#define DS_CENTER           0x0800L
#define DS_CENTERMOUSE      0x1000L
#define DS_CONTEXTHELP      0x2000L

#define DS_SHELLFONT        (DS_SETFONT | DS_FIXEDSYS)
#endif /* WINVER >= 0x0400 */

#if(_WIN32_WCE >= 0x0500)
#define DS_USEPIXELS        0x8000L
#endif


#define DM_GETDEFID         (WM_USER+0)
#define DM_SETDEFID         (WM_USER+1)

#if(WINVER >= 0x0400)
#define DM_REPOSITION       (WM_USER+2)
#endif /* WINVER >= 0x0400 */
/*
 * Returned in HIWORD() of DM_GETDEFID result if msg is supported
 */
#define DC_HASDEFID         0x534B

/*
 * Dialog Codes
 */
#define DLGC_WANTARROWS     0x0001      /* Control wants arrow keys         */
#define DLGC_WANTTAB        0x0002      /* Control wants tab keys           */
#define DLGC_WANTALLKEYS    0x0004      /* Control wants all keys           */
#define DLGC_WANTMESSAGE    0x0004      /* Pass message to control          */
#define DLGC_HASSETSEL      0x0008      /* Understands EM_SETSEL message    */
#define DLGC_DEFPUSHBUTTON  0x0010      /* Default pushbutton               */
#define DLGC_UNDEFPUSHBUTTON 0x0020     /* Non-default pushbutton           */
#define DLGC_RADIOBUTTON    0x0040      /* Radio button                     */
#define DLGC_WANTCHARS      0x0080      /* Want WM_CHAR messages            */
#define DLGC_STATIC         0x0100      /* Static item: don't include       */
#define DLGC_BUTTON         0x2000      /* Button item: can be checked      */

#define LB_CTLCODE          0L

/*
 * Listbox Return Values
 */
#define LB_OKAY             0
#define LB_ERR              (-1)
#define LB_ERRSPACE         (-2)

/*
**  The idStaticPath parameter to DlgDirList can have the following values
**  ORed if the list box should show other details of the files along with
**  the name of the files;
*/
                                  /* all other details also will be returned */


/*
 * Listbox Notification Codes
 */
#define LBN_ERRSPACE        (-2)
#define LBN_SELCHANGE       1
#define LBN_DBLCLK          2
#define LBN_SELCANCEL       3
#define LBN_SETFOCUS        4
#define LBN_KILLFOCUS       5



#ifndef NOWINMESSAGES

/*
 * Listbox messages
 */
#define LB_ADDSTRING            0x0180
#define LB_INSERTSTRING         0x0181
#define LB_DELETESTRING         0x0182
#define LB_SELITEMRANGEEX       0x0183
#define LB_RESETCONTENT         0x0184
#define LB_SETSEL               0x0185
#define LB_SETCURSEL            0x0186
#define LB_GETSEL               0x0187
#define LB_GETCURSEL            0x0188
#define LB_GETTEXT              0x0189
#define LB_GETTEXTLEN           0x018A
#define LB_GETCOUNT             0x018B
#define LB_SELECTSTRING         0x018C
#define LB_DIR                  0x018D
#define LB_GETTOPINDEX          0x018E
#define LB_FINDSTRING           0x018F
#define LB_GETSELCOUNT          0x0190
#define LB_GETSELITEMS          0x0191
#define LB_SETTABSTOPS          0x0192
#define LB_GETHORIZONTALEXTENT  0x0193
#define LB_SETHORIZONTALEXTENT  0x0194
#define LB_SETCOLUMNWIDTH       0x0195
#define LB_ADDFILE              0x0196
#define LB_SETTOPINDEX          0x0197
#define LB_GETITEMRECT          0x0198
#define LB_GETITEMDATA          0x0199
#define LB_SETITEMDATA          0x019A
#define LB_SELITEMRANGE         0x019B
#define LB_SETANCHORINDEX       0x019C
#define LB_GETANCHORINDEX       0x019D
#define LB_SETCARETINDEX        0x019E
#define LB_GETCARETINDEX        0x019F
#define LB_SETITEMHEIGHT        0x01A0
#define LB_GETITEMHEIGHT        0x01A1
#define LB_FINDSTRINGEXACT      0x01A2
#define LB_SETLOCALE            0x01A5
#define LB_GETLOCALE            0x01A6
#define LB_SETCOUNT             0x01A7
#if(WINVER >= 0x0400)
#define LB_INITSTORAGE          0x01A8
#define LB_ITEMFROMPOINT        0x01A9
#endif /* WINVER >= 0x0400 */
#if(_WIN32_WCE >= 0x0400)
#define LB_MULTIPLEADDSTRING    0x01B1
#endif


#if(_WIN32_WINNT >= 0x0501)
#define LB_GETLISTBOXINFO       0x01B2
#endif /* _WIN32_WINNT >= 0x0501 */

#if(_WIN32_WINNT >= 0x0501)
#define LB_MSGMAX               0x01B3
#elif(_WIN32_WCE >= 0x0400)
#define LB_MSGMAX               0x01B1
#elif(WINVER >= 0x0400)
#define LB_MSGMAX               0x01B0
#else
#define LB_MSGMAX               0x01A8
#endif

#endif /* !NOWINMESSAGES */

#ifndef NOWINSTYLES


/*
 * Listbox Styles
 */
#define LBS_NOTIFY            0x0001L
#define LBS_SORT              0x0002L
#define LBS_NOREDRAW          0x0004L
#define LBS_MULTIPLESEL       0x0008L
#define LBS_OWNERDRAWFIXED    0x0010L
#define LBS_OWNERDRAWVARIABLE 0x0020L
#define LBS_HASSTRINGS        0x0040L
#define LBS_USETABSTOPS       0x0080L
#define LBS_NOINTEGRALHEIGHT  0x0100L
#define LBS_MULTICOLUMN       0x0200L
#define LBS_WANTKEYBOARDINPUT 0x0400L
#define LBS_EXTENDEDSEL       0x0800L
#define LBS_DISABLENOSCROLL   0x1000L
#define LBS_NODATA            0x2000L
#if(WINVER >= 0x0400)
#define LBS_NOSEL             0x4000L
#endif /* WINVER >= 0x0400 */
#define LBS_COMBOBOX          0x8000L

#define LBS_STANDARD          (LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)


#endif /* !NOWINSTYLES */


/*
 * Combo Box return Values
 */
#define CB_OKAY             0
#define CB_ERR              (-1)
#define CB_ERRSPACE         (-2)


/*
 * Combo Box Notification Codes
 */
#define CBN_ERRSPACE        (-1)
#define CBN_SELCHANGE       1
#define CBN_DBLCLK          2
#define CBN_SETFOCUS        3
#define CBN_KILLFOCUS       4
#define CBN_EDITCHANGE      5
#define CBN_EDITUPDATE      6
#define CBN_DROPDOWN        7
#define CBN_CLOSEUP         8
#define CBN_SELENDOK        9
#define CBN_SELENDCANCEL    10

#ifndef NOWINSTYLES

/*
 * Combo Box styles
 */
#define CBS_SIMPLE            0x0001L
#define CBS_DROPDOWN          0x0002L
#define CBS_DROPDOWNLIST      0x0003L
#define CBS_OWNERDRAWFIXED    0x0010L
#define CBS_OWNERDRAWVARIABLE 0x0020L
#define CBS_AUTOHSCROLL       0x0040L
#define CBS_OEMCONVERT        0x0080L
#define CBS_SORT              0x0100L
#define CBS_HASSTRINGS        0x0200L
#define CBS_NOINTEGRALHEIGHT  0x0400L
#define CBS_DISABLENOSCROLL   0x0800L
#if(WINVER >= 0x0400)
#define CBS_UPPERCASE         0x2000L
#define CBS_LOWERCASE         0x4000L
#endif /* WINVER >= 0x0400 */

#endif  /* !NOWINSTYLES */


/*
 * Combo Box messages
 */
#ifndef NOWINMESSAGES
#define CB_GETEDITSEL               0x0140
#define CB_LIMITTEXT                0x0141
#define CB_SETEDITSEL               0x0142
#define CB_ADDSTRING                0x0143
#define CB_DELETESTRING             0x0144
#define CB_DIR                      0x0145
#define CB_GETCOUNT                 0x0146
#define CB_GETCURSEL                0x0147
#define CB_GETLBTEXT                0x0148
#define CB_GETLBTEXTLEN             0x0149
#define CB_INSERTSTRING             0x014A
#define CB_RESETCONTENT             0x014B
#define CB_FINDSTRING               0x014C
#define CB_SELECTSTRING             0x014D
#define CB_SETCURSEL                0x014E
#define CB_SHOWDROPDOWN             0x014F
#define CB_GETITEMDATA              0x0150
#define CB_SETITEMDATA              0x0151
#define CB_GETDROPPEDCONTROLRECT    0x0152
#define CB_SETITEMHEIGHT            0x0153
#define CB_GETITEMHEIGHT            0x0154
#define CB_SETEXTENDEDUI            0x0155
#define CB_GETEXTENDEDUI            0x0156
#define CB_GETDROPPEDSTATE          0x0157
#define CB_FINDSTRINGEXACT          0x0158
#define CB_SETLOCALE                0x0159
#define CB_GETLOCALE                0x015A
#if(WINVER >= 0x0400)
#define CB_GETTOPINDEX              0x015b
#define CB_SETTOPINDEX              0x015c
#define CB_GETHORIZONTALEXTENT      0x015d
#define CB_SETHORIZONTALEXTENT      0x015e
#define CB_GETDROPPEDWIDTH          0x015f
#define CB_SETDROPPEDWIDTH          0x0160
#define CB_INITSTORAGE              0x0161
#if(_WIN32_WCE >= 0x0400)
#define CB_MULTIPLEADDSTRING        0x0163
#endif
#endif /* WINVER >= 0x0400 */

#if(_WIN32_WINNT >= 0x0501)
#define CB_GETCOMBOBOXINFO          0x0164
#endif /* _WIN32_WINNT >= 0x0501 */

#if(_WIN32_WINNT >= 0x0501)
#define CB_MSGMAX                   0x0165
#elif(_WIN32_WCE >= 0x0400)
#define CB_MSGMAX                   0x0163
#elif(WINVER >= 0x0400)
#define CB_MSGMAX                   0x0162
#else
#define CB_MSGMAX                   0x015B
#endif
#endif  /* !NOWINMESSAGES */



#ifndef NOWINSTYLES


/*
 * Scroll Bar Styles
 */
#define SBS_HORZ                    0x0000L
#define SBS_VERT                    0x0001L
#define SBS_TOPALIGN                0x0002L
#define SBS_LEFTALIGN               0x0002L
#define SBS_BOTTOMALIGN             0x0004L
#define SBS_RIGHTALIGN              0x0004L
#define SBS_SIZEBOXTOPLEFTALIGN     0x0002L
#define SBS_SIZEBOXBOTTOMRIGHTALIGN 0x0004L
#define SBS_SIZEBOX                 0x0008L
#if(WINVER >= 0x0400)
#define SBS_SIZEGRIP                0x0010L
#endif /* WINVER >= 0x0400 */


#endif /* !NOWINSTYLES */

/*
 * Scroll bar messages
 */
#ifndef NOWINMESSAGES
#define SBM_SETPOS                  0x00E0 /*not in win3.1 */
#define SBM_GETPOS                  0x00E1 /*not in win3.1 */
#define SBM_SETRANGE                0x00E2 /*not in win3.1 */
#define SBM_SETRANGEREDRAW          0x00E6 /*not in win3.1 */
#define SBM_GETRANGE                0x00E3 /*not in win3.1 */
#define SBM_ENABLE_ARROWS           0x00E4 /*not in win3.1 */
#if(WINVER >= 0x0400)
#define SBM_SETSCROLLINFO           0x00E9
#define SBM_GETSCROLLINFO           0x00EA
#endif /* WINVER >= 0x0400 */

#if(_WIN32_WINNT >= 0x0501)
#define SBM_GETSCROLLBARINFO        0x00EB
#endif /* _WIN32_WINNT >= 0x0501 */

#if(WINVER >= 0x0400)
#define SIF_RANGE           0x0001
#define SIF_PAGE            0x0002
#define SIF_POS             0x0004
#define SIF_DISABLENOSCROLL 0x0008
#define SIF_TRACKPOS        0x0010
#define SIF_ALL             (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS)

typedef struct tagSCROLLINFO
{
    UINT    cbSize;
    UINT    fMask;
    int     nMin;
    int     nMax;
    UINT    nPage;
    int     nPos;
    int     nTrackPos;
}   SCROLLINFO, FAR *LPSCROLLINFO;
typedef SCROLLINFO CONST FAR *LPCSCROLLINFO;

WINUSERAPI
int
WINAPI
SetScrollInfo(
    __in HWND hwnd,
    __in int nBar,
    __in LPCSCROLLINFO lpsi,
    __in BOOL redraw);

WINUSERAPI
BOOL
WINAPI
GetScrollInfo(
    __in HWND hwnd,
    __in int nBar,
    __inout LPSCROLLINFO lpsi);

#endif /* WINVER >= 0x0400 */
#endif /* !NOWINMESSAGES */
#endif /* !NOCTLMGR */

#ifndef NOMDI

/*
 * MDI client style bits
 */
#define MDIS_ALLCHILDSTYLES    0x0001

/*
 * wParam Flags for WM_MDITILE and WM_MDICASCADE messages.
 */
#define MDITILE_VERTICAL       0x0000 /*not in win3.1 */
#define MDITILE_HORIZONTAL     0x0001 /*not in win3.1 */
#define MDITILE_SKIPDISABLED   0x0002 /*not in win3.1 */
#if(_WIN32_WINNT >= 0x0500)
#define MDITILE_ZORDER         0x0004
#endif /* _WIN32_WINNT >= 0x0500 */

typedef struct tagMDICREATESTRUCTA {
    LPCSTR   szClass;
    LPCSTR   szTitle;
    HANDLE hOwner;
    int x;
    int y;
    int cx;
    int cy;
    DWORD style;
    LPARAM lParam;        /* app-defined stuff */
} MDICREATESTRUCTA, *LPMDICREATESTRUCTA;
typedef struct tagMDICREATESTRUCTW {
    LPCWSTR  szClass;
    LPCWSTR  szTitle;
    HANDLE hOwner;
    int x;
    int y;
    int cx;
    int cy;
    DWORD style;
    LPARAM lParam;        /* app-defined stuff */
} MDICREATESTRUCTW, *LPMDICREATESTRUCTW;
#ifdef UNICODE
typedef MDICREATESTRUCTW MDICREATESTRUCT;
typedef LPMDICREATESTRUCTW LPMDICREATESTRUCT;
#else
typedef MDICREATESTRUCTA MDICREATESTRUCT;
typedef LPMDICREATESTRUCTA LPMDICREATESTRUCT;
#endif // UNICODE

typedef struct tagCLIENTCREATESTRUCT {
    HANDLE hWindowMenu;
    UINT idFirstChild;
} CLIENTCREATESTRUCT, *LPCLIENTCREATESTRUCT;

WINUSERAPI
LRESULT
WINAPI
DefFrameProcA(
    __in HWND hWnd,
    __in_opt HWND hWndMDIClient,
    __in UINT uMsg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
LRESULT
WINAPI
DefFrameProcW(
    __in HWND hWnd,
    __in_opt HWND hWndMDIClient,
    __in UINT uMsg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define DefFrameProc  DefFrameProcW
#else
#define DefFrameProc  DefFrameProcA
#endif // !UNICODE

WINUSERAPI
#ifndef _MAC
LRESULT
WINAPI
#else
LRESULT
CALLBACK
#endif
DefMDIChildProcA(
    __in HWND hWnd,
    __in UINT uMsg,
    __in WPARAM wParam,
    __in LPARAM lParam);
WINUSERAPI
#ifndef _MAC
LRESULT
WINAPI
#else
LRESULT
CALLBACK
#endif
DefMDIChildProcW(
    __in HWND hWnd,
    __in UINT uMsg,
    __in WPARAM wParam,
    __in LPARAM lParam);
#ifdef UNICODE
#define DefMDIChildProc  DefMDIChildProcW
#else
#define DefMDIChildProc  DefMDIChildProcA
#endif // !UNICODE

#ifndef NOMSG

WINUSERAPI
BOOL
WINAPI
TranslateMDISysAccel(
    __in HWND hWndClient,
    __in LPMSG lpMsg);

#endif /* !NOMSG */

WINUSERAPI
UINT
WINAPI
ArrangeIconicWindows(
    __in HWND hWnd);

WINUSERAPI
HWND
WINAPI
CreateMDIWindowA(
    __in LPCSTR lpClassName,
    __in LPCSTR lpWindowName,
    __in DWORD dwStyle,
    __in int X,
    __in int Y,
    __in int nWidth,
    __in int nHeight,
    __in_opt HWND hWndParent,
    __in_opt HINSTANCE hInstance,
    __in LPARAM lParam);
WINUSERAPI
HWND
WINAPI
CreateMDIWindowW(
    __in LPCWSTR lpClassName,
    __in LPCWSTR lpWindowName,
    __in DWORD dwStyle,
    __in int X,
    __in int Y,
    __in int nWidth,
    __in int nHeight,
    __in_opt HWND hWndParent,
    __in_opt HINSTANCE hInstance,
    __in LPARAM lParam);
#ifdef UNICODE
#define CreateMDIWindow  CreateMDIWindowW
#else
#define CreateMDIWindow  CreateMDIWindowA
#endif // !UNICODE

#if(WINVER >= 0x0400)
WINUSERAPI
WORD
WINAPI
TileWindows(
    __in_opt HWND hwndParent,
    __in UINT wHow,
    __in_opt CONST RECT * lpRect,
    __in UINT cKids,
    __in_ecount_opt(cKids) const HWND FAR * lpKids);

WINUSERAPI
WORD
WINAPI CascadeWindows(
    __in_opt HWND hwndParent,
    __in UINT wHow,
    __in_opt CONST RECT * lpRect,
    __in UINT cKids,
    __in_ecount_opt(cKids) const HWND FAR * lpKids);

#endif /* WINVER >= 0x0400 */
#endif /* !NOMDI */

#endif /* !NOUSER */

/****** Help support ********************************************************/

#ifndef NOHELP

typedef DWORD HELPPOLY;
typedef struct tagMULTIKEYHELPA {
#ifndef _MAC
    DWORD  mkSize;
#else
    WORD   mkSize;
#endif
    CHAR   mkKeylist;
    CHAR   szKeyphrase[1];
} MULTIKEYHELPA, *PMULTIKEYHELPA, *LPMULTIKEYHELPA;
typedef struct tagMULTIKEYHELPW {
#ifndef _MAC
    DWORD  mkSize;
#else
    WORD   mkSize;
#endif
    WCHAR  mkKeylist;
    WCHAR  szKeyphrase[1];
} MULTIKEYHELPW, *PMULTIKEYHELPW, *LPMULTIKEYHELPW;
#ifdef UNICODE
typedef MULTIKEYHELPW MULTIKEYHELP;
typedef PMULTIKEYHELPW PMULTIKEYHELP;
typedef LPMULTIKEYHELPW LPMULTIKEYHELP;
#else
typedef MULTIKEYHELPA MULTIKEYHELP;
typedef PMULTIKEYHELPA PMULTIKEYHELP;
typedef LPMULTIKEYHELPA LPMULTIKEYHELP;
#endif // UNICODE

typedef struct tagHELPWININFOA {
    int  wStructSize;
    int  x;
    int  y;
    int  dx;
    int  dy;
    int  wMax;
    CHAR   rgchMember[2];
} HELPWININFOA, *PHELPWININFOA, *LPHELPWININFOA;
typedef struct tagHELPWININFOW {
    int  wStructSize;
    int  x;
    int  y;
    int  dx;
    int  dy;
    int  wMax;
    WCHAR  rgchMember[2];
} HELPWININFOW, *PHELPWININFOW, *LPHELPWININFOW;
#ifdef UNICODE
typedef HELPWININFOW HELPWININFO;
typedef PHELPWININFOW PHELPWININFO;
typedef LPHELPWININFOW LPHELPWININFO;
#else
typedef HELPWININFOA HELPWININFO;
typedef PHELPWININFOA PHELPWININFO;
typedef LPHELPWININFOA LPHELPWININFO;
#endif // UNICODE


/*
 * Commands to pass to WinHelp()
 */
#define HELP_CONTEXT      0x0001L  /* Display topic in ulTopic */
#define HELP_QUIT         0x0002L  /* Terminate help */
#define HELP_INDEX        0x0003L  /* Display index */
#define HELP_CONTENTS     0x0003L
#define HELP_HELPONHELP   0x0004L  /* Display help on using help */
#define HELP_SETINDEX     0x0005L  /* Set current Index for multi index help */
#define HELP_SETCONTENTS  0x0005L
#define HELP_CONTEXTPOPUP 0x0008L
#define HELP_FORCEFILE    0x0009L
#define HELP_KEY          0x0101L  /* Display topic for keyword in offabData */
#define HELP_COMMAND      0x0102L
#define HELP_PARTIALKEY   0x0105L
#define HELP_MULTIKEY     0x0201L
#define HELP_SETWINPOS    0x0203L
#if(WINVER >= 0x0400)
#define HELP_CONTEXTMENU  0x000a
#define HELP_FINDER       0x000b
#define HELP_WM_HELP      0x000c
#define HELP_SETPOPUP_POS 0x000d

#define HELP_TCARD              0x8000
#define HELP_TCARD_DATA         0x0010
#define HELP_TCARD_OTHER_CALLER 0x0011

// These are in winhelp.h in Win95.
#define IDH_NO_HELP                     28440
#define IDH_MISSING_CONTEXT             28441 // Control doesn't have matching help context
#define IDH_GENERIC_HELP_BUTTON         28442 // Property sheet help button
#define IDH_OK                          28443
#define IDH_CANCEL                      28444
#define IDH_HELP                        28445

#endif /* WINVER >= 0x0400 */



WINUSERAPI
BOOL
WINAPI
WinHelpA(
    __in_opt HWND hWndMain,
    __in_opt LPCSTR lpszHelp,
    __in UINT uCommand,
    __in ULONG_PTR dwData);
WINUSERAPI
BOOL
WINAPI
WinHelpW(
    __in_opt HWND hWndMain,
    __in_opt LPCWSTR lpszHelp,
    __in UINT uCommand,
    __in ULONG_PTR dwData);
#ifdef UNICODE
#define WinHelp  WinHelpW
#else
#define WinHelp  WinHelpA
#endif // !UNICODE

#endif /* !NOHELP */

#if(WINVER >= 0x0500)

#define GR_GDIOBJECTS       0       /* Count of GDI objects */
#define GR_USEROBJECTS      1       /* Count of USER objects */
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0601)
#define GR_GDIOBJECTS_PEAK  2       /* Peak count of GDI objects */
#define GR_USEROBJECTS_PEAK 4       /* Peak count of USER objects */
#endif /* WINVER >= 0x0601 */

#if(WINVER >= 0x0601)
#define GR_GLOBAL           ((HANDLE)-2)
#endif /* WINVER >= 0x0601 */

#if(WINVER >= 0x0500)
WINUSERAPI
DWORD
WINAPI
GetGuiResources(
    __in HANDLE hProcess,
    __in DWORD uiFlags);
#endif /* WINVER >= 0x0500 */


#ifndef NOSYSPARAMSINFO

/*
 * Parameter for SystemParametersInfo.
 */

#define SPI_GETBEEP                 0x0001
#define SPI_SETBEEP                 0x0002
#define SPI_GETMOUSE                0x0003
#define SPI_SETMOUSE                0x0004
#define SPI_GETBORDER               0x0005
#define SPI_SETBORDER               0x0006
#define SPI_GETKEYBOARDSPEED        0x000A
#define SPI_SETKEYBOARDSPEED        0x000B
#define SPI_LANGDRIVER              0x000C
#define SPI_ICONHORIZONTALSPACING   0x000D
#define SPI_GETSCREENSAVETIMEOUT    0x000E
#define SPI_SETSCREENSAVETIMEOUT    0x000F
#define SPI_GETSCREENSAVEACTIVE     0x0010
#define SPI_SETSCREENSAVEACTIVE     0x0011
#define SPI_GETGRIDGRANULARITY      0x0012
#define SPI_SETGRIDGRANULARITY      0x0013
#define SPI_SETDESKWALLPAPER        0x0014
#define SPI_SETDESKPATTERN          0x0015
#define SPI_GETKEYBOARDDELAY        0x0016
#define SPI_SETKEYBOARDDELAY        0x0017
#define SPI_ICONVERTICALSPACING     0x0018
#define SPI_GETICONTITLEWRAP        0x0019
#define SPI_SETICONTITLEWRAP        0x001A
#define SPI_GETMENUDROPALIGNMENT    0x001B
#define SPI_SETMENUDROPALIGNMENT    0x001C
#define SPI_SETDOUBLECLKWIDTH       0x001D
#define SPI_SETDOUBLECLKHEIGHT      0x001E
#define SPI_GETICONTITLELOGFONT     0x001F
#define SPI_SETDOUBLECLICKTIME      0x0020
#define SPI_SETMOUSEBUTTONSWAP      0x0021
#define SPI_SETICONTITLELOGFONT     0x0022
#define SPI_GETFASTTASKSWITCH       0x0023
#define SPI_SETFASTTASKSWITCH       0x0024
#if(WINVER >= 0x0400)
#define SPI_SETDRAGFULLWINDOWS      0x0025
#define SPI_GETDRAGFULLWINDOWS      0x0026
#define SPI_GETNONCLIENTMETRICS     0x0029
#define SPI_SETNONCLIENTMETRICS     0x002A
#define SPI_GETMINIMIZEDMETRICS     0x002B
#define SPI_SETMINIMIZEDMETRICS     0x002C
#define SPI_GETICONMETRICS          0x002D
#define SPI_SETICONMETRICS          0x002E
#define SPI_SETWORKAREA             0x002F
#define SPI_GETWORKAREA             0x0030
#define SPI_SETPENWINDOWS           0x0031

#define SPI_GETHIGHCONTRAST         0x0042
#define SPI_SETHIGHCONTRAST         0x0043
#define SPI_GETKEYBOARDPREF         0x0044
#define SPI_SETKEYBOARDPREF         0x0045
#define SPI_GETSCREENREADER         0x0046
#define SPI_SETSCREENREADER         0x0047
#define SPI_GETANIMATION            0x0048
#define SPI_SETANIMATION            0x0049
#define SPI_GETFONTSMOOTHING        0x004A
#define SPI_SETFONTSMOOTHING        0x004B
#define SPI_SETDRAGWIDTH            0x004C
#define SPI_SETDRAGHEIGHT           0x004D
#define SPI_SETHANDHELD             0x004E
#define SPI_GETLOWPOWERTIMEOUT      0x004F
#define SPI_GETPOWEROFFTIMEOUT      0x0050
#define SPI_SETLOWPOWERTIMEOUT      0x0051
#define SPI_SETPOWEROFFTIMEOUT      0x0052
#define SPI_GETLOWPOWERACTIVE       0x0053
#define SPI_GETPOWEROFFACTIVE       0x0054
#define SPI_SETLOWPOWERACTIVE       0x0055
#define SPI_SETPOWEROFFACTIVE       0x0056
#define SPI_SETCURSORS              0x0057
#define SPI_SETICONS                0x0058
#define SPI_GETDEFAULTINPUTLANG     0x0059
#define SPI_SETDEFAULTINPUTLANG     0x005A
#define SPI_SETLANGTOGGLE           0x005B
#define SPI_GETWINDOWSEXTENSION     0x005C
#define SPI_SETMOUSETRAILS          0x005D
#define SPI_GETMOUSETRAILS          0x005E
#define SPI_SETSCREENSAVERRUNNING   0x0061
#define SPI_SCREENSAVERRUNNING     SPI_SETSCREENSAVERRUNNING
#endif /* WINVER >= 0x0400 */
#define SPI_GETFILTERKEYS          0x0032
#define SPI_SETFILTERKEYS          0x0033
#define SPI_GETTOGGLEKEYS          0x0034
#define SPI_SETTOGGLEKEYS          0x0035
#define SPI_GETMOUSEKEYS           0x0036
#define SPI_SETMOUSEKEYS           0x0037
#define SPI_GETSHOWSOUNDS          0x0038
#define SPI_SETSHOWSOUNDS          0x0039
#define SPI_GETSTICKYKEYS          0x003A
#define SPI_SETSTICKYKEYS          0x003B
#define SPI_GETACCESSTIMEOUT       0x003C
#define SPI_SETACCESSTIMEOUT       0x003D
#if(WINVER >= 0x0400)
#define SPI_GETSERIALKEYS          0x003E
#define SPI_SETSERIALKEYS          0x003F
#endif /* WINVER >= 0x0400 */
#define SPI_GETSOUNDSENTRY         0x0040
#define SPI_SETSOUNDSENTRY         0x0041
#if(_WIN32_WINNT >= 0x0400)
#define SPI_GETSNAPTODEFBUTTON     0x005F
#define SPI_SETSNAPTODEFBUTTON     0x0060
#endif /* _WIN32_WINNT >= 0x0400 */
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
#define SPI_GETMOUSEHOVERWIDTH     0x0062
#define SPI_SETMOUSEHOVERWIDTH     0x0063
#define SPI_GETMOUSEHOVERHEIGHT    0x0064
#define SPI_SETMOUSEHOVERHEIGHT    0x0065
#define SPI_GETMOUSEHOVERTIME      0x0066
#define SPI_SETMOUSEHOVERTIME      0x0067
#define SPI_GETWHEELSCROLLLINES    0x0068
#define SPI_SETWHEELSCROLLLINES    0x0069
#define SPI_GETMENUSHOWDELAY       0x006A
#define SPI_SETMENUSHOWDELAY       0x006B

#if (_WIN32_WINNT >= 0x0600)
#define SPI_GETWHEELSCROLLCHARS   0x006C
#define SPI_SETWHEELSCROLLCHARS   0x006D
#endif

#define SPI_GETSHOWIMEUI          0x006E
#define SPI_SETSHOWIMEUI          0x006F
#endif


#if(WINVER >= 0x0500)
#define SPI_GETMOUSESPEED         0x0070
#define SPI_SETMOUSESPEED         0x0071
#define SPI_GETSCREENSAVERRUNNING 0x0072
#define SPI_GETDESKWALLPAPER      0x0073
#endif /* WINVER >= 0x0500 */

#if(WINVER >= 0x0600)
#define SPI_GETAUDIODESCRIPTION   0x0074
#define SPI_SETAUDIODESCRIPTION   0x0075

#define SPI_GETSCREENSAVESECURE   0x0076
#define SPI_SETSCREENSAVESECURE   0x0077
#endif /* WINVER >= 0x0600 */

#if(_WIN32_WINNT >= 0x0601)
#define SPI_GETHUNGAPPTIMEOUT           0x0078
#define SPI_SETHUNGAPPTIMEOUT           0x0079
#define SPI_GETWAITTOKILLTIMEOUT        0x007A
#define SPI_SETWAITTOKILLTIMEOUT        0x007B
#define SPI_GETWAITTOKILLSERVICETIMEOUT 0x007C
#define SPI_SETWAITTOKILLSERVICETIMEOUT 0x007D
#define SPI_GETMOUSEDOCKTHRESHOLD       0x007E
#define SPI_SETMOUSEDOCKTHRESHOLD       0x007F
#define SPI_GETPENDOCKTHRESHOLD         0x0080
#define SPI_SETPENDOCKTHRESHOLD         0x0081
#define SPI_GETWINARRANGING             0x0082
#define SPI_SETWINARRANGING             0x0083
#define SPI_GETMOUSEDRAGOUTTHRESHOLD    0x0084
#define SPI_SETMOUSEDRAGOUTTHRESHOLD    0x0085
#define SPI_GETPENDRAGOUTTHRESHOLD      0x0086
#define SPI_SETPENDRAGOUTTHRESHOLD      0x0087
#define SPI_GETMOUSESIDEMOVETHRESHOLD   0x0088
#define SPI_SETMOUSESIDEMOVETHRESHOLD   0x0089
#define SPI_GETPENSIDEMOVETHRESHOLD     0x008A
#define SPI_SETPENSIDEMOVETHRESHOLD     0x008B
#define SPI_GETDRAGFROMMAXIMIZE         0x008C
#define SPI_SETDRAGFROMMAXIMIZE         0x008D
#define SPI_GETSNAPSIZING               0x008E
#define SPI_SETSNAPSIZING               0x008F
#define SPI_GETDOCKMOVING               0x0090
#define SPI_SETDOCKMOVING               0x0091
#endif /* _WIN32_WINNT >= 0x0601 */


#if(WINVER >= 0x0500)
#define SPI_GETACTIVEWINDOWTRACKING         0x1000
#define SPI_SETACTIVEWINDOWTRACKING         0x1001
#define SPI_GETMENUANIMATION                0x1002
#define SPI_SETMENUANIMATION                0x1003
#define SPI_GETCOMBOBOXANIMATION            0x1004
#define SPI_SETCOMBOBOXANIMATION            0x1005
#define SPI_GETLISTBOXSMOOTHSCROLLING       0x1006
#define SPI_SETLISTBOXSMOOTHSCROLLING       0x1007
#define SPI_GETGRADIENTCAPTIONS             0x1008
#define SPI_SETGRADIENTCAPTIONS             0x1009
#define SPI_GETKEYBOARDCUES                 0x100A
#define SPI_SETKEYBOARDCUES                 0x100B
#define SPI_GETMENUUNDERLINES               SPI_GETKEYBOARDCUES
#define SPI_SETMENUUNDERLINES               SPI_SETKEYBOARDCUES
#define SPI_GETACTIVEWNDTRKZORDER           0x100C
#define SPI_SETACTIVEWNDTRKZORDER           0x100D
#define SPI_GETHOTTRACKING                  0x100E
#define SPI_SETHOTTRACKING                  0x100F
#define SPI_GETMENUFADE                     0x1012
#define SPI_SETMENUFADE                     0x1013
#define SPI_GETSELECTIONFADE                0x1014
#define SPI_SETSELECTIONFADE                0x1015
#define SPI_GETTOOLTIPANIMATION             0x1016
#define SPI_SETTOOLTIPANIMATION             0x1017
#define SPI_GETTOOLTIPFADE                  0x1018
#define SPI_SETTOOLTIPFADE                  0x1019
#define SPI_GETCURSORSHADOW                 0x101A
#define SPI_SETCURSORSHADOW                 0x101B
#if(_WIN32_WINNT >= 0x0501)
#define SPI_GETMOUSESONAR                   0x101C
#define SPI_SETMOUSESONAR                   0x101D
#define SPI_GETMOUSECLICKLOCK               0x101E
#define SPI_SETMOUSECLICKLOCK               0x101F
#define SPI_GETMOUSEVANISH                  0x1020
#define SPI_SETMOUSEVANISH                  0x1021
#define SPI_GETFLATMENU                     0x1022
#define SPI_SETFLATMENU                     0x1023
#define SPI_GETDROPSHADOW                   0x1024
#define SPI_SETDROPSHADOW                   0x1025
#define SPI_GETBLOCKSENDINPUTRESETS         0x1026
#define SPI_SETBLOCKSENDINPUTRESETS         0x1027
#endif /* _WIN32_WINNT >= 0x0501 */

#define SPI_GETUIEFFECTS                    0x103E
#define SPI_SETUIEFFECTS                    0x103F

#if(_WIN32_WINNT >= 0x0600)
#define SPI_GETDISABLEOVERLAPPEDCONTENT     0x1040
#define SPI_SETDISABLEOVERLAPPEDCONTENT     0x1041
#define SPI_GETCLIENTAREAANIMATION          0x1042
#define SPI_SETCLIENTAREAANIMATION          0x1043
#define SPI_GETCLEARTYPE                    0x1048
#define SPI_SETCLEARTYPE                    0x1049
#define SPI_GETSPEECHRECOGNITION            0x104A
#define SPI_SETSPEECHRECOGNITION            0x104B
#endif /* _WIN32_WINNT >= 0x0600 */

#define SPI_GETFOREGROUNDLOCKTIMEOUT        0x2000
#define SPI_SETFOREGROUNDLOCKTIMEOUT        0x2001
#define SPI_GETACTIVEWNDTRKTIMEOUT          0x2002
#define SPI_SETACTIVEWNDTRKTIMEOUT          0x2003
#define SPI_GETFOREGROUNDFLASHCOUNT         0x2004
#define SPI_SETFOREGROUNDFLASHCOUNT         0x2005
#define SPI_GETCARETWIDTH                   0x2006
#define SPI_SETCARETWIDTH                   0x2007

#if(_WIN32_WINNT >= 0x0501)
#define SPI_GETMOUSECLICKLOCKTIME           0x2008
#define SPI_SETMOUSECLICKLOCKTIME           0x2009
#define SPI_GETFONTSMOOTHINGTYPE            0x200A
#define SPI_SETFONTSMOOTHINGTYPE            0x200B

/* constants for SPI_GETFONTSMOOTHINGTYPE and SPI_SETFONTSMOOTHINGTYPE: */
#define FE_FONTSMOOTHINGSTANDARD            0x0001
#define FE_FONTSMOOTHINGCLEARTYPE           0x0002

#define SPI_GETFONTSMOOTHINGCONTRAST           0x200C
#define SPI_SETFONTSMOOTHINGCONTRAST           0x200D

#define SPI_GETFOCUSBORDERWIDTH             0x200E
#define SPI_SETFOCUSBORDERWIDTH             0x200F
#define SPI_GETFOCUSBORDERHEIGHT            0x2010
#define SPI_SETFOCUSBORDERHEIGHT            0x2011

#define SPI_GETFONTSMOOTHINGORIENTATION           0x2012
#define SPI_SETFONTSMOOTHINGORIENTATION           0x2013

/* constants for SPI_GETFONTSMOOTHINGORIENTATION and SPI_SETFONTSMOOTHINGORIENTATION: */
#define FE_FONTSMOOTHINGORIENTATIONBGR   0x0000
#define FE_FONTSMOOTHINGORIENTATIONRGB   0x0001
#endif /* _WIN32_WINNT >= 0x0501 */

#if(_WIN32_WINNT >= 0x0600)
#define SPI_GETMINIMUMHITRADIUS             0x2014
#define SPI_SETMINIMUMHITRADIUS             0x2015
#define SPI_GETMESSAGEDURATION              0x2016
#define SPI_SETMESSAGEDURATION              0x2017
#endif /* _WIN32_WINNT >= 0x0600 */

#endif /* WINVER >= 0x0500 */

/*
 * Flags
 */
#define SPIF_UPDATEINIFILE    0x0001
#define SPIF_SENDWININICHANGE 0x0002
#define SPIF_SENDCHANGE       SPIF_SENDWININICHANGE


#define METRICS_USEDEFAULT -1
#ifdef _WINGDI_
#ifndef NOGDI
typedef struct tagNONCLIENTMETRICSA
{
    UINT    cbSize;
    int     iBorderWidth;
    int     iScrollWidth;
    int     iScrollHeight;
    int     iCaptionWidth;
    int     iCaptionHeight;
    LOGFONTA lfCaptionFont;
    int     iSmCaptionWidth;
    int     iSmCaptionHeight;
    LOGFONTA lfSmCaptionFont;
    int     iMenuWidth;
    int     iMenuHeight;
    LOGFONTA lfMenuFont;
    LOGFONTA lfStatusFont;
    LOGFONTA lfMessageFont;
#if(WINVER >= 0x0600)
    int     iPaddedBorderWidth;
#endif /* WINVER >= 0x0600 */
}   NONCLIENTMETRICSA, *PNONCLIENTMETRICSA, FAR* LPNONCLIENTMETRICSA;
typedef struct tagNONCLIENTMETRICSW
{
    UINT    cbSize;
    int     iBorderWidth;
    int     iScrollWidth;
    int     iScrollHeight;
    int     iCaptionWidth;
    int     iCaptionHeight;
    LOGFONTW lfCaptionFont;
    int     iSmCaptionWidth;
    int     iSmCaptionHeight;
    LOGFONTW lfSmCaptionFont;
    int     iMenuWidth;
    int     iMenuHeight;
    LOGFONTW lfMenuFont;
    LOGFONTW lfStatusFont;
    LOGFONTW lfMessageFont;
#if(WINVER >= 0x0600)
    int     iPaddedBorderWidth;
#endif /* WINVER >= 0x0600 */
}   NONCLIENTMETRICSW, *PNONCLIENTMETRICSW, FAR* LPNONCLIENTMETRICSW;
#ifdef UNICODE
typedef NONCLIENTMETRICSW NONCLIENTMETRICS;
typedef PNONCLIENTMETRICSW PNONCLIENTMETRICS;
typedef LPNONCLIENTMETRICSW LPNONCLIENTMETRICS;
#else
typedef NONCLIENTMETRICSA NONCLIENTMETRICS;
typedef PNONCLIENTMETRICSA PNONCLIENTMETRICS;
typedef LPNONCLIENTMETRICSA LPNONCLIENTMETRICS;
#endif // UNICODE
#endif /* NOGDI */
#endif /* _WINGDI_ */

#define ARW_BOTTOMLEFT              0x0000L
#define ARW_BOTTOMRIGHT             0x0001L
#define ARW_TOPLEFT                 0x0002L
#define ARW_TOPRIGHT                0x0003L
#define ARW_STARTMASK               0x0003L
#define ARW_STARTRIGHT              0x0001L
#define ARW_STARTTOP                0x0002L

#define ARW_LEFT                    0x0000L
#define ARW_RIGHT                   0x0000L
#define ARW_UP                      0x0004L
#define ARW_DOWN                    0x0004L
#define ARW_HIDE                    0x0008L

typedef struct tagMINIMIZEDMETRICS
{
    UINT    cbSize;
    int     iWidth;
    int     iHorzGap;
    int     iVertGap;
    int     iArrange;
}   MINIMIZEDMETRICS, *PMINIMIZEDMETRICS, *LPMINIMIZEDMETRICS;

#ifdef _WINGDI_
#ifndef NOGDI
typedef struct tagICONMETRICSA
{
    UINT    cbSize;
    int     iHorzSpacing;
    int     iVertSpacing;
    int     iTitleWrap;
    LOGFONTA lfFont;
}   ICONMETRICSA, *PICONMETRICSA, *LPICONMETRICSA;
typedef struct tagICONMETRICSW
{
    UINT    cbSize;
    int     iHorzSpacing;
    int     iVertSpacing;
    int     iTitleWrap;
    LOGFONTW lfFont;
}   ICONMETRICSW, *PICONMETRICSW, *LPICONMETRICSW;
#ifdef UNICODE
typedef ICONMETRICSW ICONMETRICS;
typedef PICONMETRICSW PICONMETRICS;
typedef LPICONMETRICSW LPICONMETRICS;
#else
typedef ICONMETRICSA ICONMETRICS;
typedef PICONMETRICSA PICONMETRICS;
typedef LPICONMETRICSA LPICONMETRICS;
#endif // UNICODE
#endif /* NOGDI */
#endif /* _WINGDI_ */

typedef struct tagANIMATIONINFO
{
    UINT    cbSize;
    int     iMinAnimate;
}   ANIMATIONINFO, *LPANIMATIONINFO;

typedef struct tagSERIALKEYSA
{
    UINT    cbSize;
    DWORD   dwFlags;
    LPSTR     lpszActivePort;
    LPSTR     lpszPort;
    UINT    iBaudRate;
    UINT    iPortState;
    UINT    iActive;
}   SERIALKEYSA, *LPSERIALKEYSA;
typedef struct tagSERIALKEYSW
{
    UINT    cbSize;
    DWORD   dwFlags;
    LPWSTR    lpszActivePort;
    LPWSTR    lpszPort;
    UINT    iBaudRate;
    UINT    iPortState;
    UINT    iActive;
}   SERIALKEYSW, *LPSERIALKEYSW;
#ifdef UNICODE
typedef SERIALKEYSW SERIALKEYS;
typedef LPSERIALKEYSW LPSERIALKEYS;
#else
typedef SERIALKEYSA SERIALKEYS;
typedef LPSERIALKEYSA LPSERIALKEYS;
#endif // UNICODE

/* flags for SERIALKEYS dwFlags field */
#define SERKF_SERIALKEYSON  0x00000001
#define SERKF_AVAILABLE     0x00000002
#define SERKF_INDICATOR     0x00000004


typedef struct tagHIGHCONTRASTA
{
    UINT    cbSize;
    DWORD   dwFlags;
    LPSTR   lpszDefaultScheme;
}   HIGHCONTRASTA, *LPHIGHCONTRASTA;
typedef struct tagHIGHCONTRASTW
{
    UINT    cbSize;
    DWORD   dwFlags;
    LPWSTR  lpszDefaultScheme;
}   HIGHCONTRASTW, *LPHIGHCONTRASTW;
#ifdef UNICODE
typedef HIGHCONTRASTW HIGHCONTRAST;
typedef LPHIGHCONTRASTW LPHIGHCONTRAST;
#else
typedef HIGHCONTRASTA HIGHCONTRAST;
typedef LPHIGHCONTRASTA LPHIGHCONTRAST;
#endif // UNICODE

/* flags for HIGHCONTRAST dwFlags field */
#define HCF_HIGHCONTRASTON  0x00000001
#define HCF_AVAILABLE       0x00000002
#define HCF_HOTKEYACTIVE    0x00000004
#define HCF_CONFIRMHOTKEY   0x00000008
#define HCF_HOTKEYSOUND     0x00000010
#define HCF_INDICATOR       0x00000020
#define HCF_HOTKEYAVAILABLE 0x00000040
#define HCF_LOGONDESKTOP    0x00000100
#define HCF_DEFAULTDESKTOP  0x00000200

/* Flags for ChangeDisplaySettings */
#define CDS_UPDATEREGISTRY           0x00000001
#define CDS_TEST                     0x00000002
#define CDS_FULLSCREEN               0x00000004
#define CDS_GLOBAL                   0x00000008
#define CDS_SET_PRIMARY              0x00000010
#define CDS_VIDEOPARAMETERS          0x00000020
#if(WINVER >= 0x0600)
#define CDS_ENABLE_UNSAFE_MODES      0x00000100
#define CDS_DISABLE_UNSAFE_MODES     0x00000200
#endif /* WINVER >= 0x0600 */
#define CDS_RESET                    0x40000000
#define CDS_RESET_EX                 0x20000000
#define CDS_NORESET                  0x10000000

#include 

/* Return values for ChangeDisplaySettings */
#define DISP_CHANGE_SUCCESSFUL       0
#define DISP_CHANGE_RESTART          1
#define DISP_CHANGE_FAILED          -1
#define DISP_CHANGE_BADMODE         -2
#define DISP_CHANGE_NOTUPDATED      -3
#define DISP_CHANGE_BADFLAGS        -4
#define DISP_CHANGE_BADPARAM        -5
#if(_WIN32_WINNT >= 0x0501)
#define DISP_CHANGE_BADDUALVIEW     -6
#endif /* _WIN32_WINNT >= 0x0501 */

#ifdef _WINGDI_
#ifndef NOGDI

WINUSERAPI
LONG
WINAPI
ChangeDisplaySettingsA(
    __in_opt DEVMODEA* lpDevMode,
    __in DWORD dwFlags);
WINUSERAPI
LONG
WINAPI
ChangeDisplaySettingsW(
    __in_opt DEVMODEW* lpDevMode,
    __in DWORD dwFlags);
#ifdef UNICODE
#define ChangeDisplaySettings  ChangeDisplaySettingsW
#else
#define ChangeDisplaySettings  ChangeDisplaySettingsA
#endif // !UNICODE

WINUSERAPI
LONG
WINAPI
ChangeDisplaySettingsExA(
    __in_opt LPCSTR lpszDeviceName,
    __in_opt DEVMODEA* lpDevMode,
    __reserved HWND hwnd,
    __in DWORD dwflags,
    __in_opt LPVOID lParam);
WINUSERAPI
LONG
WINAPI
ChangeDisplaySettingsExW(
    __in_opt LPCWSTR lpszDeviceName,
    __in_opt DEVMODEW* lpDevMode,
    __reserved HWND hwnd,
    __in DWORD dwflags,
    __in_opt LPVOID lParam);
#ifdef UNICODE
#define ChangeDisplaySettingsEx  ChangeDisplaySettingsExW
#else
#define ChangeDisplaySettingsEx  ChangeDisplaySettingsExA
#endif // !UNICODE

#define ENUM_CURRENT_SETTINGS       ((DWORD)-1)
#define ENUM_REGISTRY_SETTINGS      ((DWORD)-2)

WINUSERAPI
BOOL
WINAPI
EnumDisplaySettingsA(
    __in_opt LPCSTR lpszDeviceName,
    __in DWORD iModeNum,
    __inout DEVMODEA* lpDevMode);
WINUSERAPI
BOOL
WINAPI
EnumDisplaySettingsW(
    __in_opt LPCWSTR lpszDeviceName,
    __in DWORD iModeNum,
    __inout DEVMODEW* lpDevMode);
#ifdef UNICODE
#define EnumDisplaySettings  EnumDisplaySettingsW
#else
#define EnumDisplaySettings  EnumDisplaySettingsA
#endif // !UNICODE

#if(WINVER >= 0x0500)

WINUSERAPI
BOOL
WINAPI
EnumDisplaySettingsExA(
    __in_opt LPCSTR lpszDeviceName,
    __in DWORD iModeNum,
    __inout DEVMODEA* lpDevMode,
    __in DWORD dwFlags);
WINUSERAPI
BOOL
WINAPI
EnumDisplaySettingsExW(
    __in_opt LPCWSTR lpszDeviceName,
    __in DWORD iModeNum,
    __inout DEVMODEW* lpDevMode,
    __in DWORD dwFlags);
#ifdef UNICODE
#define EnumDisplaySettingsEx  EnumDisplaySettingsExW
#else
#define EnumDisplaySettingsEx  EnumDisplaySettingsExA
#endif // !UNICODE

/* Flags for EnumDisplaySettingsEx */
#define EDS_RAWMODE                   0x00000002
#define EDS_ROTATEDMODE               0x00000004

WINUSERAPI
BOOL
WINAPI
EnumDisplayDevicesA(
    __in_opt LPCSTR lpDevice,
    __in DWORD iDevNum,
    __inout PDISPLAY_DEVICEA lpDisplayDevice,
    __in DWORD dwFlags);
WINUSERAPI
BOOL
WINAPI
EnumDisplayDevicesW(
    __in_opt LPCWSTR lpDevice,
    __in DWORD iDevNum,
    __inout PDISPLAY_DEVICEW lpDisplayDevice,
    __in DWORD dwFlags);
#ifdef UNICODE
#define EnumDisplayDevices  EnumDisplayDevicesW
#else
#define EnumDisplayDevices  EnumDisplayDevicesA
#endif // !UNICODE

/* Flags for EnumDisplayDevices */
#define EDD_GET_DEVICE_INTERFACE_NAME 0x00000001

#endif /* WINVER >= 0x0500 */

#if(WINVER >= 0x0601)

WINUSERAPI
LONG
WINAPI
GetDisplayConfigBufferSizes(
    __in UINT32 flags,
    __out UINT32* numPathArrayElements,
    __out UINT32* numModeInfoArrayElements);

WINUSERAPI
LONG
WINAPI
SetDisplayConfig(
    __in UINT32 numPathArrayElements,
    __in_ecount_opt(numPathArrayElements) DISPLAYCONFIG_PATH_INFO* pathArray,
    __in UINT32 numModeInfoArrayElements,
    __in_ecount_opt(numModeInfoArrayElements) DISPLAYCONFIG_MODE_INFO* modeInfoArray,
    __in UINT32 flags);

WINUSERAPI
LONG
WINAPI
QueryDisplayConfig(
    __in UINT32 flags,
    __inout UINT32* numPathArrayElements,
    __out_ecount_part(*numPathArrayElements, *numPathArrayElements) DISPLAYCONFIG_PATH_INFO* pathArray,
    __inout UINT32* numModeInfoArrayElements,
    __out_ecount_part(*numModeInfoArrayElements, *numModeInfoArrayElements) DISPLAYCONFIG_MODE_INFO* modeInfoArray,
    __out DISPLAYCONFIG_TOPOLOGY_ID* currentTopologyId);

WINUSERAPI
LONG
WINAPI
DisplayConfigGetDeviceInfo(
    __inout DISPLAYCONFIG_DEVICE_INFO_HEADER* requestPacket);

WINUSERAPI
LONG
WINAPI
DisplayConfigSetDeviceInfo(
    __in DISPLAYCONFIG_DEVICE_INFO_HEADER* setPacket);

#endif /* WINVER >= 0x0601 */

#endif /* NOGDI */
#endif /* _WINGDI_ */


WINUSERAPI
BOOL
WINAPI
SystemParametersInfoA(
    __in UINT uiAction,
    __in UINT uiParam,
    __inout_opt PVOID pvParam,
    __in UINT fWinIni);
WINUSERAPI
BOOL
WINAPI
SystemParametersInfoW(
    __in UINT uiAction,
    __in UINT uiParam,
    __inout_opt PVOID pvParam,
    __in UINT fWinIni);
#ifdef UNICODE
#define SystemParametersInfo  SystemParametersInfoW
#else
#define SystemParametersInfo  SystemParametersInfoA
#endif // !UNICODE


#endif  /* !NOSYSPARAMSINFO  */

/*
 * Accessibility support
 */
typedef struct tagFILTERKEYS
{
    UINT  cbSize;
    DWORD dwFlags;
    DWORD iWaitMSec;            // Acceptance Delay
    DWORD iDelayMSec;           // Delay Until Repeat
    DWORD iRepeatMSec;          // Repeat Rate
    DWORD iBounceMSec;          // Debounce Time
} FILTERKEYS, *LPFILTERKEYS;

/*
 * FILTERKEYS dwFlags field
 */
#define FKF_FILTERKEYSON    0x00000001
#define FKF_AVAILABLE       0x00000002
#define FKF_HOTKEYACTIVE    0x00000004
#define FKF_CONFIRMHOTKEY   0x00000008
#define FKF_HOTKEYSOUND     0x00000010
#define FKF_INDICATOR       0x00000020
#define FKF_CLICKON         0x00000040

typedef struct tagSTICKYKEYS
{
    UINT  cbSize;
    DWORD dwFlags;
} STICKYKEYS, *LPSTICKYKEYS;

/*
 * STICKYKEYS dwFlags field
 */
#define SKF_STICKYKEYSON    0x00000001
#define SKF_AVAILABLE       0x00000002
#define SKF_HOTKEYACTIVE    0x00000004
#define SKF_CONFIRMHOTKEY   0x00000008
#define SKF_HOTKEYSOUND     0x00000010
#define SKF_INDICATOR       0x00000020
#define SKF_AUDIBLEFEEDBACK 0x00000040
#define SKF_TRISTATE        0x00000080
#define SKF_TWOKEYSOFF      0x00000100
#if(_WIN32_WINNT >= 0x0500)
#define SKF_LALTLATCHED       0x10000000
#define SKF_LCTLLATCHED       0x04000000
#define SKF_LSHIFTLATCHED     0x01000000
#define SKF_RALTLATCHED       0x20000000
#define SKF_RCTLLATCHED       0x08000000
#define SKF_RSHIFTLATCHED     0x02000000
#define SKF_LWINLATCHED       0x40000000
#define SKF_RWINLATCHED       0x80000000
#define SKF_LALTLOCKED        0x00100000
#define SKF_LCTLLOCKED        0x00040000
#define SKF_LSHIFTLOCKED      0x00010000
#define SKF_RALTLOCKED        0x00200000
#define SKF_RCTLLOCKED        0x00080000
#define SKF_RSHIFTLOCKED      0x00020000
#define SKF_LWINLOCKED        0x00400000
#define SKF_RWINLOCKED        0x00800000
#endif /* _WIN32_WINNT >= 0x0500 */

typedef struct tagMOUSEKEYS
{
    UINT cbSize;
    DWORD dwFlags;
    DWORD iMaxSpeed;
    DWORD iTimeToMaxSpeed;
    DWORD iCtrlSpeed;
    DWORD dwReserved1;
    DWORD dwReserved2;
} MOUSEKEYS, *LPMOUSEKEYS;

/*
 * MOUSEKEYS dwFlags field
 */
#define MKF_MOUSEKEYSON     0x00000001
#define MKF_AVAILABLE       0x00000002
#define MKF_HOTKEYACTIVE    0x00000004
#define MKF_CONFIRMHOTKEY   0x00000008
#define MKF_HOTKEYSOUND     0x00000010
#define MKF_INDICATOR       0x00000020
#define MKF_MODIFIERS       0x00000040
#define MKF_REPLACENUMBERS  0x00000080
#if(_WIN32_WINNT >= 0x0500)
#define MKF_LEFTBUTTONSEL   0x10000000
#define MKF_RIGHTBUTTONSEL  0x20000000
#define MKF_LEFTBUTTONDOWN  0x01000000
#define MKF_RIGHTBUTTONDOWN 0x02000000
#define MKF_MOUSEMODE       0x80000000
#endif /* _WIN32_WINNT >= 0x0500 */

typedef struct tagACCESSTIMEOUT
{
    UINT  cbSize;
    DWORD dwFlags;
    DWORD iTimeOutMSec;
} ACCESSTIMEOUT, *LPACCESSTIMEOUT;

/*
 * ACCESSTIMEOUT dwFlags field
 */
#define ATF_TIMEOUTON       0x00000001
#define ATF_ONOFFFEEDBACK   0x00000002

/* values for SOUNDSENTRY iFSGrafEffect field */
#define SSGF_NONE       0
#define SSGF_DISPLAY    3

/* values for SOUNDSENTRY iFSTextEffect field */
#define SSTF_NONE       0
#define SSTF_CHARS      1
#define SSTF_BORDER     2
#define SSTF_DISPLAY    3

/* values for SOUNDSENTRY iWindowsEffect field */
#define SSWF_NONE     0
#define SSWF_TITLE    1
#define SSWF_WINDOW   2
#define SSWF_DISPLAY  3
#define SSWF_CUSTOM   4

typedef struct tagSOUNDSENTRYA
{
    UINT cbSize;
    DWORD dwFlags;
    DWORD iFSTextEffect;
    DWORD iFSTextEffectMSec;
    DWORD iFSTextEffectColorBits;
    DWORD iFSGrafEffect;
    DWORD iFSGrafEffectMSec;
    DWORD iFSGrafEffectColor;
    DWORD iWindowsEffect;
    DWORD iWindowsEffectMSec;
    LPSTR   lpszWindowsEffectDLL;
    DWORD iWindowsEffectOrdinal;
} SOUNDSENTRYA, *LPSOUNDSENTRYA;
typedef struct tagSOUNDSENTRYW
{
    UINT cbSize;
    DWORD dwFlags;
    DWORD iFSTextEffect;
    DWORD iFSTextEffectMSec;
    DWORD iFSTextEffectColorBits;
    DWORD iFSGrafEffect;
    DWORD iFSGrafEffectMSec;
    DWORD iFSGrafEffectColor;
    DWORD iWindowsEffect;
    DWORD iWindowsEffectMSec;
    LPWSTR  lpszWindowsEffectDLL;
    DWORD iWindowsEffectOrdinal;
} SOUNDSENTRYW, *LPSOUNDSENTRYW;
#ifdef UNICODE
typedef SOUNDSENTRYW SOUNDSENTRY;
typedef LPSOUNDSENTRYW LPSOUNDSENTRY;
#else
typedef SOUNDSENTRYA SOUNDSENTRY;
typedef LPSOUNDSENTRYA LPSOUNDSENTRY;
#endif // UNICODE

/*
 * SOUNDSENTRY dwFlags field
 */
#define SSF_SOUNDSENTRYON   0x00000001
#define SSF_AVAILABLE       0x00000002
#define SSF_INDICATOR       0x00000004

#if(_WIN32_WINNT >= 0x0600)
WINUSERAPI
BOOL
WINAPI
SoundSentry(VOID);
#endif /* _WIN32_WINNT >= 0x0600 */

typedef struct tagTOGGLEKEYS
{
    UINT cbSize;
    DWORD dwFlags;
} TOGGLEKEYS, *LPTOGGLEKEYS;

/*
 * TOGGLEKEYS dwFlags field
 */
#define TKF_TOGGLEKEYSON    0x00000001
#define TKF_AVAILABLE       0x00000002
#define TKF_HOTKEYACTIVE    0x00000004
#define TKF_CONFIRMHOTKEY   0x00000008
#define TKF_HOTKEYSOUND     0x00000010
#define TKF_INDICATOR       0x00000020

#if(_WIN32_WINNT >= 0x0600)
typedef struct tagAUDIODESCRIPTION {
    UINT cbSize;   // sizeof(AudioDescriptionType)
    BOOL Enabled;  // On/Off
    LCID Locale;   // locale ID for language
} AUDIODESCRIPTION, *LPAUDIODESCRIPTION;
#endif /* _WIN32_WINNT >= 0x0600 */


/*
 * Set debug level
 */

WINUSERAPI
VOID
WINAPI
SetDebugErrorLevel(
    __in DWORD dwLevel);

/*
 * SetLastErrorEx() types.
 */

#define SLE_ERROR       0x00000001
#define SLE_MINORERROR  0x00000002
#define SLE_WARNING     0x00000003

WINUSERAPI
VOID
WINAPI
SetLastErrorEx(
    __in DWORD dwErrCode,
    __in DWORD dwType);

WINUSERAPI
int
WINAPI
InternalGetWindowText(
    __in HWND hWnd,
    __out_ecount_part(cchMaxCount, return + 1) LPWSTR pString,
    __in int cchMaxCount);


#if defined(WINNT)
WINUSERAPI
BOOL
WINAPI
EndTask(
    __in HWND hWnd,
    __in BOOL fShutDown,
    __in BOOL fForce);
#endif

WINUSERAPI
BOOL
WINAPI
CancelShutdown(
    VOID);


#if(WINVER >= 0x0500)

/*
 * Multimonitor API.
 */

#define MONITOR_DEFAULTTONULL       0x00000000
#define MONITOR_DEFAULTTOPRIMARY    0x00000001
#define MONITOR_DEFAULTTONEAREST    0x00000002

WINUSERAPI
HMONITOR
WINAPI
MonitorFromPoint(
    __in POINT pt,
    __in DWORD dwFlags);

WINUSERAPI
HMONITOR
WINAPI
MonitorFromRect(
    __in LPCRECT lprc,
    __in DWORD dwFlags);

WINUSERAPI
HMONITOR
WINAPI
MonitorFromWindow(
    __in HWND hwnd,
    __in DWORD dwFlags);

#define MONITORINFOF_PRIMARY        0x00000001

#ifndef CCHDEVICENAME
#define CCHDEVICENAME 32
#endif

typedef struct tagMONITORINFO
{
    DWORD   cbSize;
    RECT    rcMonitor;
    RECT    rcWork;
    DWORD   dwFlags;
} MONITORINFO, *LPMONITORINFO;

#ifdef __cplusplus
typedef struct tagMONITORINFOEXA : public tagMONITORINFO
{
    CHAR        szDevice[CCHDEVICENAME];
} MONITORINFOEXA, *LPMONITORINFOEXA;
typedef struct tagMONITORINFOEXW : public tagMONITORINFO
{
    WCHAR       szDevice[CCHDEVICENAME];
} MONITORINFOEXW, *LPMONITORINFOEXW;
#ifdef UNICODE
typedef MONITORINFOEXW MONITORINFOEX;
typedef LPMONITORINFOEXW LPMONITORINFOEX;
#else
typedef MONITORINFOEXA MONITORINFOEX;
typedef LPMONITORINFOEXA LPMONITORINFOEX;
#endif // UNICODE
#else // ndef __cplusplus
typedef struct tagMONITORINFOEXA
{
    MONITORINFO;
    CHAR        szDevice[CCHDEVICENAME];
} MONITORINFOEXA, *LPMONITORINFOEXA;
typedef struct tagMONITORINFOEXW
{
    MONITORINFO;
    WCHAR       szDevice[CCHDEVICENAME];
} MONITORINFOEXW, *LPMONITORINFOEXW;
#ifdef UNICODE
typedef MONITORINFOEXW MONITORINFOEX;
typedef LPMONITORINFOEXW LPMONITORINFOEX;
#else
typedef MONITORINFOEXA MONITORINFOEX;
typedef LPMONITORINFOEXA LPMONITORINFOEX;
#endif // UNICODE
#endif

WINUSERAPI
BOOL
WINAPI
GetMonitorInfoA(
    __in HMONITOR hMonitor,
    __inout LPMONITORINFO lpmi);
WINUSERAPI
BOOL
WINAPI
GetMonitorInfoW(
    __in HMONITOR hMonitor,
    __inout LPMONITORINFO lpmi);
#ifdef UNICODE
#define GetMonitorInfo  GetMonitorInfoW
#else
#define GetMonitorInfo  GetMonitorInfoA
#endif // !UNICODE

typedef BOOL (CALLBACK* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM);

WINUSERAPI
BOOL
WINAPI
EnumDisplayMonitors(
    __in_opt HDC hdc,
    __in_opt LPCRECT lprcClip,
    __in MONITORENUMPROC lpfnEnum,
    __in LPARAM dwData);


#ifndef NOWINABLE

/*
 * WinEvents - Active Accessibility hooks
 */

WINUSERAPI
VOID
WINAPI
NotifyWinEvent(
    __in DWORD event,
    __in HWND  hwnd,
    __in LONG  idObject,
    __in LONG  idChild);

typedef VOID (CALLBACK* WINEVENTPROC)(
    HWINEVENTHOOK hWinEventHook,
    DWORD         event,
    HWND          hwnd,
    LONG          idObject,
    LONG          idChild,
    DWORD         idEventThread,
    DWORD         dwmsEventTime);

WINUSERAPI
HWINEVENTHOOK
WINAPI
SetWinEventHook(
    __in DWORD eventMin,
    __in DWORD eventMax,
    __in_opt HMODULE hmodWinEventProc,
    __in WINEVENTPROC pfnWinEventProc,
    __in DWORD idProcess,
    __in DWORD idThread,
    __in DWORD dwFlags);

#if(_WIN32_WINNT >= 0x0501)
WINUSERAPI
BOOL
WINAPI
IsWinEventHookInstalled(
    __in DWORD event);
#endif /* _WIN32_WINNT >= 0x0501 */

/*
 * dwFlags for SetWinEventHook
 */
#define WINEVENT_OUTOFCONTEXT   0x0000  // Events are ASYNC
#define WINEVENT_SKIPOWNTHREAD  0x0001  // Don't call back for events on installer's thread
#define WINEVENT_SKIPOWNPROCESS 0x0002  // Don't call back for events on installer's process
#define WINEVENT_INCONTEXT      0x0004  // Events are SYNC, this causes your dll to be injected into every process

WINUSERAPI
BOOL
WINAPI
UnhookWinEvent(
    __in HWINEVENTHOOK hWinEventHook);

/*
 * idObject values for WinEventProc and NotifyWinEvent
 */

/*
 * hwnd + idObject can be used with OLEACC.DLL's OleGetObjectFromWindow()
 * to get an interface pointer to the container.  indexChild is the item
 * within the container in question.  Setup a VARIANT with vt VT_I4 and
 * lVal the indexChild and pass that in to all methods.  Then you
 * are raring to go.
 */


/*
 * Common object IDs (cookies, only for sending WM_GETOBJECT to get at the
 * thing in question).  Positive IDs are reserved for apps (app specific),
 * negative IDs are system things and are global, 0 means "just little old
 * me".
 */
#define     CHILDID_SELF        0
#define     INDEXID_OBJECT      0
#define     INDEXID_CONTAINER   0

/*
 * Reserved IDs for system objects
 */
#define     OBJID_WINDOW        ((LONG)0x00000000)
#define     OBJID_SYSMENU       ((LONG)0xFFFFFFFF)
#define     OBJID_TITLEBAR      ((LONG)0xFFFFFFFE)
#define     OBJID_MENU          ((LONG)0xFFFFFFFD)
#define     OBJID_CLIENT        ((LONG)0xFFFFFFFC)
#define     OBJID_VSCROLL       ((LONG)0xFFFFFFFB)
#define     OBJID_HSCROLL       ((LONG)0xFFFFFFFA)
#define     OBJID_SIZEGRIP      ((LONG)0xFFFFFFF9)
#define     OBJID_CARET         ((LONG)0xFFFFFFF8)
#define     OBJID_CURSOR        ((LONG)0xFFFFFFF7)
#define     OBJID_ALERT         ((LONG)0xFFFFFFF6)
#define     OBJID_SOUND         ((LONG)0xFFFFFFF5)
#define     OBJID_QUERYCLASSNAMEIDX ((LONG)0xFFFFFFF4)
#define     OBJID_NATIVEOM      ((LONG)0xFFFFFFF0)

/*
 * EVENT DEFINITION
 */
#define EVENT_MIN           0x00000001
#define EVENT_MAX           0x7FFFFFFF

/*
 *  EVENT_SYSTEM_SOUND
 *  Sent when a sound is played.  Currently nothing is generating this, we
 *  this event when a system sound (for menus, etc) is played.  Apps
 *  generate this, if accessible, when a private sound is played.  For
 *  example, if Mail plays a "New Mail" sound.
 *
 *  System Sounds:
 *  (Generated by PlaySoundEvent in USER itself)
 *      hwnd            is NULL
 *      idObject        is OBJID_SOUND
 *      idChild         is sound child ID if one
 *  App Sounds:
 *  (PlaySoundEvent won't generate notification; up to app)
 *      hwnd + idObject gets interface pointer to Sound object
 *      idChild identifies the sound in question
 *  are going to be cleaning up the SOUNDSENTRY feature in the control panel
 *  and will use this at that time.  Applications implementing WinEvents
 *  are perfectly welcome to use it.  Clients of IAccessible* will simply
 *  turn around and get back a non-visual object that describes the sound.
 */
#define EVENT_SYSTEM_SOUND              0x0001

/*
 * EVENT_SYSTEM_ALERT
 * System Alerts:
 * (Generated by MessageBox() calls for example)
 *      hwnd            is hwndMessageBox
 *      idObject        is OBJID_ALERT
 * App Alerts:
 * (Generated whenever)
 *      hwnd+idObject gets interface pointer to Alert
 */
#define EVENT_SYSTEM_ALERT              0x0002

/*
 * EVENT_SYSTEM_FOREGROUND
 * Sent when the foreground (active) window changes, even if it is changing
 * to another window in the same thread as the previous one.
 *      hwnd            is hwndNewForeground
 *      idObject        is OBJID_WINDOW
 *      idChild    is INDEXID_OBJECT
 */
#define EVENT_SYSTEM_FOREGROUND         0x0003

/*
 * Menu
 *      hwnd            is window (top level window or popup menu window)
 *      idObject        is ID of control (OBJID_MENU, OBJID_SYSMENU, OBJID_SELF for popup)
 *      idChild         is CHILDID_SELF
 *
 * EVENT_SYSTEM_MENUSTART
 * EVENT_SYSTEM_MENUEND
 * For MENUSTART, hwnd+idObject+idChild refers to the control with the menu bar,
 *  or the control bringing up the context menu.
 *
 * Sent when entering into and leaving from menu mode (system, app bar, and
 * track popups).
 */
#define EVENT_SYSTEM_MENUSTART          0x0004
#define EVENT_SYSTEM_MENUEND            0x0005

/*
 * EVENT_SYSTEM_MENUPOPUPSTART
 * EVENT_SYSTEM_MENUPOPUPEND
 * Sent when a menu popup comes up and just before it is taken down.  Note
 * that for a call to TrackPopupMenu(), a client will see EVENT_SYSTEM_MENUSTART
 * followed almost immediately by EVENT_SYSTEM_MENUPOPUPSTART for the popup
 * being shown.
 *
 * For MENUPOPUP, hwnd+idObject+idChild refers to the NEW popup coming up, not the
 * parent item which is hierarchical.  You can get the parent menu/popup by
 * asking for the accParent object.
 */
#define EVENT_SYSTEM_MENUPOPUPSTART     0x0006
#define EVENT_SYSTEM_MENUPOPUPEND       0x0007


/*
 * EVENT_SYSTEM_CAPTURESTART
 * EVENT_SYSTEM_CAPTUREEND
 * Sent when a window takes the capture and releases the capture.
 */
#define EVENT_SYSTEM_CAPTURESTART       0x0008
#define EVENT_SYSTEM_CAPTUREEND         0x0009

/*
 * Move Size
 * EVENT_SYSTEM_MOVESIZESTART
 * EVENT_SYSTEM_MOVESIZEEND
 * Sent when a window enters and leaves move-size dragging mode.
 */
#define EVENT_SYSTEM_MOVESIZESTART      0x000A
#define EVENT_SYSTEM_MOVESIZEEND        0x000B

/*
 * Context Help
 * EVENT_SYSTEM_CONTEXTHELPSTART
 * EVENT_SYSTEM_CONTEXTHELPEND
 * Sent when a window enters and leaves context sensitive help mode.
 */
#define EVENT_SYSTEM_CONTEXTHELPSTART   0x000C
#define EVENT_SYSTEM_CONTEXTHELPEND     0x000D

/*
 * Drag & Drop
 * EVENT_SYSTEM_DRAGDROPSTART
 * EVENT_SYSTEM_DRAGDROPEND
 * Send the START notification just before going into drag&drop loop.  Send
 * the END notification just after canceling out.
 * Note that it is up to apps and OLE to generate this, since the system
 * doesn't know.  Like EVENT_SYSTEM_SOUND, it will be a while before this
 * is prevalent.
 */
#define EVENT_SYSTEM_DRAGDROPSTART      0x000E
#define EVENT_SYSTEM_DRAGDROPEND        0x000F

/*
 * Dialog
 * Send the START notification right after the dialog is completely
 *  initialized and visible.  Send the END right before the dialog
 *  is hidden and goes away.
 * EVENT_SYSTEM_DIALOGSTART
 * EVENT_SYSTEM_DIALOGEND
 */
#define EVENT_SYSTEM_DIALOGSTART        0x0010
#define EVENT_SYSTEM_DIALOGEND          0x0011

/*
 * EVENT_SYSTEM_SCROLLING
 * EVENT_SYSTEM_SCROLLINGSTART
 * EVENT_SYSTEM_SCROLLINGEND
 * Sent when beginning and ending the tracking of a scrollbar in a window,
 * and also for scrollbar controls.
 */
#define EVENT_SYSTEM_SCROLLINGSTART     0x0012
#define EVENT_SYSTEM_SCROLLINGEND       0x0013

/*
 * Alt-Tab Window
 * Send the START notification right after the switch window is initialized
 * and visible.  Send the END right before it is hidden and goes away.
 * EVENT_SYSTEM_SWITCHSTART
 * EVENT_SYSTEM_SWITCHEND
 */
#define EVENT_SYSTEM_SWITCHSTART        0x0014
#define EVENT_SYSTEM_SWITCHEND          0x0015

/*
 * EVENT_SYSTEM_MINIMIZESTART
 * EVENT_SYSTEM_MINIMIZEEND
 * Sent when a window minimizes and just before it restores.
 */
#define EVENT_SYSTEM_MINIMIZESTART      0x0016
#define EVENT_SYSTEM_MINIMIZEEND        0x0017


#if(_WIN32_WINNT >= 0x0600)
#define EVENT_SYSTEM_DESKTOPSWITCH      0x0020
#endif /* _WIN32_WINNT >= 0x0600 */


#if(_WIN32_WINNT >= 0x0601)
#define EVENT_SYSTEM_END        0x00FF

#define EVENT_OEM_DEFINED_START     0x0101
#define EVENT_OEM_DEFINED_END       0x01FF

#define EVENT_UIA_EVENTID_START         0x4E00
#define EVENT_UIA_EVENTID_END           0x4EFF

#define EVENT_UIA_PROPID_START          0x7500
#define EVENT_UIA_PROPID_END            0x75FF
#endif /* _WIN32_WINNT >= 0x0601 */

#if(_WIN32_WINNT >= 0x0501)
#define EVENT_CONSOLE_CARET             0x4001
#define EVENT_CONSOLE_UPDATE_REGION     0x4002
#define EVENT_CONSOLE_UPDATE_SIMPLE     0x4003
#define EVENT_CONSOLE_UPDATE_SCROLL     0x4004
#define EVENT_CONSOLE_LAYOUT            0x4005
#define EVENT_CONSOLE_START_APPLICATION 0x4006
#define EVENT_CONSOLE_END_APPLICATION   0x4007

/*
 * Flags for EVENT_CONSOLE_START/END_APPLICATION.
 */
#if defined(_WIN64)
#define CONSOLE_APPLICATION_16BIT       0x0000
#else
#define CONSOLE_APPLICATION_16BIT       0x0001
#endif

/*
 * Flags for EVENT_CONSOLE_CARET
 */
#define CONSOLE_CARET_SELECTION         0x0001
#define CONSOLE_CARET_VISIBLE           0x0002
#endif /* _WIN32_WINNT >= 0x0501 */

#if(_WIN32_WINNT >= 0x0601)
#define EVENT_CONSOLE_END       0x40FF
#endif /* _WIN32_WINNT >= 0x0601 */

/*
 * Object events
 *
 * The system AND apps generate these.  The system generates these for
 * real windows.  Apps generate these for objects within their window which
 * act like a separate control, e.g. an item in a list view.
 *
 * When the system generate them, dwParam2 is always WMOBJID_SELF.  When
 * apps generate them, apps put the has-meaning-to-the-app-only ID value
 * in dwParam2.
 * For all events, if you want detailed accessibility information, callers
 * should
 *      * Call AccessibleObjectFromWindow() with the hwnd, idObject parameters
 *          of the event, and IID_IAccessible as the REFIID, to get back an
 *          IAccessible* to talk to
 *      * Initialize and fill in a VARIANT as VT_I4 with lVal the idChild
 *          parameter of the event.
 *      * If idChild isn't zero, call get_accChild() in the container to see
 *          if the child is an object in its own right.  If so, you will get
 *          back an IDispatch* object for the child.  You should release the
 *          parent, and call QueryInterface() on the child object to get its
 *          IAccessible*.  Then you talk directly to the child.  Otherwise,
 *          if get_accChild() returns you nothing, you should continue to
 *          use the child VARIANT.  You will ask the container for the properties
 *          of the child identified by the VARIANT.  In other words, the
 *          child in this case is accessible but not a full-blown object.
 *          Like a button on a titlebar which is 'small' and has no children.
 */

/*
 * For all EVENT_OBJECT events,
 *      hwnd is the dude to Send the WM_GETOBJECT message to (unless NULL,
 *          see above for system things)
 *      idObject is the ID of the object that can resolve any queries a
 *          client might have.  It's a way to deal with windowless controls,
 *          controls that are just drawn on the screen in some larger parent
 *          window (like SDM), or standard frame elements of a window.
 *      idChild is the piece inside of the object that is affected.  This
 *          allows clients to access things that are too small to have full
 *          blown objects in their own right.  Like the thumb of a scrollbar.
 *          The hwnd/idObject pair gets you to the container, the dude you
 *          probably want to talk to most of the time anyway.  The idChild
 *          can then be passed into the acc properties to get the name/value
 *          of it as needed.
 *
 * Example #1:
 *      System propagating a listbox selection change
 *      EVENT_OBJECT_SELECTION
 *          hwnd == listbox hwnd
 *          idObject == OBJID_WINDOW
 *          idChild == new selected item, or CHILDID_SELF if
 *              nothing now selected within container.
 *      Word '97 propagating a listbox selection change
 *          hwnd == SDM window
 *          idObject == SDM ID to get at listbox 'control'
 *          idChild == new selected item, or CHILDID_SELF if
 *              nothing
 *
 * Example #2:
 *      System propagating a menu item selection on the menu bar
 *      EVENT_OBJECT_SELECTION
 *          hwnd == top level window
 *          idObject == OBJID_MENU
 *          idChild == ID of child menu bar item selected
 *
 * Example #3:
 *      System propagating a dropdown coming off of said menu bar item
 *      EVENT_OBJECT_CREATE
 *          hwnd == popup item
 *          idObject == OBJID_WINDOW
 *          idChild == CHILDID_SELF
 *
 * Example #4:
 *
 * For EVENT_OBJECT_REORDER, the object referred to by hwnd/idObject is the
 * PARENT container in which the zorder is occurring.  This is because if
 * one child is zordering, all of them are changing their relative zorder.
 */
#define EVENT_OBJECT_CREATE                 0x8000  // hwnd + ID + idChild is created item
#define EVENT_OBJECT_DESTROY                0x8001  // hwnd + ID + idChild is destroyed item
#define EVENT_OBJECT_SHOW                   0x8002  // hwnd + ID + idChild is shown item
#define EVENT_OBJECT_HIDE                   0x8003  // hwnd + ID + idChild is hidden item
#define EVENT_OBJECT_REORDER                0x8004  // hwnd + ID + idChild is parent of zordering children
/*
 * NOTE:
 * Minimize the number of notifications!
 *
 * When you are hiding a parent object, obviously all child objects are no
 * longer visible on screen.  They still have the same "visible" status,
 * but are not truly visible.  Hence do not send HIDE notifications for the
 * children also.  One implies all.  The same goes for SHOW.
 */


#define EVENT_OBJECT_FOCUS                  0x8005  // hwnd + ID + idChild is focused item
#define EVENT_OBJECT_SELECTION              0x8006  // hwnd + ID + idChild is selected item (if only one), or idChild is OBJID_WINDOW if complex
#define EVENT_OBJECT_SELECTIONADD           0x8007  // hwnd + ID + idChild is item added
#define EVENT_OBJECT_SELECTIONREMOVE        0x8008  // hwnd + ID + idChild is item removed
#define EVENT_OBJECT_SELECTIONWITHIN        0x8009  // hwnd + ID + idChild is parent of changed selected items

/*
 * NOTES:
 * There is only one "focused" child item in a parent.  This is the place
 * keystrokes are going at a given moment.  Hence only send a notification
 * about where the NEW focus is going.  A NEW item getting the focus already
 * implies that the OLD item is losing it.
 *
 * SELECTION however can be multiple.  Hence the different SELECTION
 * notifications.  Here's when to use each:
 *
 * (1) Send a SELECTION notification in the simple single selection
 *     case (like the focus) when the item with the selection is
 *     merely moving to a different item within a container.  hwnd + ID
 *     is the container control, idChildItem is the new child with the
 *     selection.
 *
 * (2) Send a SELECTIONADD notification when a new item has simply been added
 *     to the selection within a container.  This is appropriate when the
 *     number of newly selected items is very small.  hwnd + ID is the
 *     container control, idChildItem is the new child added to the selection.
 *
 * (3) Send a SELECTIONREMOVE notification when a new item has simply been
 *     removed from the selection within a container.  This is appropriate
 *     when the number of newly selected items is very small, just like
 *     SELECTIONADD.  hwnd + ID is the container control, idChildItem is the
 *     new child removed from the selection.
 *
 * (4) Send a SELECTIONWITHIN notification when the selected items within a
 *     control have changed substantially.  Rather than propagate a large
 *     number of changes to reflect removal for some items, addition of
 *     others, just tell somebody who cares that a lot happened.  It will
 *     be faster an easier for somebody watching to just turn around and
 *     query the container control what the new bunch of selected items
 *     are.
 */

#define EVENT_OBJECT_STATECHANGE            0x800A  // hwnd + ID + idChild is item w/ state change
/*
 * Examples of when to send an EVENT_OBJECT_STATECHANGE include
 *      * It is being enabled/disabled (USER does for windows)
 *      * It is being pressed/released (USER does for buttons)
 *      * It is being checked/unchecked (USER does for radio/check buttons)
 */
#define EVENT_OBJECT_LOCATIONCHANGE         0x800B  // hwnd + ID + idChild is moved/sized item

/*
 * Note:
 * A LOCATIONCHANGE is not sent for every child object when the parent
 * changes shape/moves.  Send one notification for the topmost object
 * that is changing.  For example, if the user resizes a top level window,
 * USER will generate a LOCATIONCHANGE for it, but not for the menu bar,
 * title bar, scrollbars, etc.  that are also changing shape/moving.
 *
 * In other words, it only generates LOCATIONCHANGE notifications for
 * real windows that are moving/sizing.  It will not generate a LOCATIONCHANGE
 * for every non-floating child window when the parent moves (the children are
 * logically moving also on screen, but not relative to the parent).
 *
 * Now, if the app itself resizes child windows as a result of being
 * sized, USER will generate LOCATIONCHANGEs for those dudes also because
 * it doesn't know better.
 *
 * Note also that USER will generate LOCATIONCHANGE notifications for two
 * non-window sys objects:
 *      (1) System caret
 *      (2) Cursor
 */

#define EVENT_OBJECT_NAMECHANGE             0x800C  // hwnd + ID + idChild is item w/ name change
#define EVENT_OBJECT_DESCRIPTIONCHANGE      0x800D  // hwnd + ID + idChild is item w/ desc change
#define EVENT_OBJECT_VALUECHANGE            0x800E  // hwnd + ID + idChild is item w/ value change
#define EVENT_OBJECT_PARENTCHANGE           0x800F  // hwnd + ID + idChild is item w/ new parent
#define EVENT_OBJECT_HELPCHANGE             0x8010  // hwnd + ID + idChild is item w/ help change
#define EVENT_OBJECT_DEFACTIONCHANGE        0x8011  // hwnd + ID + idChild is item w/ def action change
#define EVENT_OBJECT_ACCELERATORCHANGE      0x8012  // hwnd + ID + idChild is item w/ keybd accel change

#if(_WIN32_WINNT >= 0x0600)
#define EVENT_OBJECT_INVOKED                0x8013  // hwnd + ID + idChild is item invoked
#define EVENT_OBJECT_TEXTSELECTIONCHANGED   0x8014  // hwnd + ID + idChild is item w? test selection change

/*
 * EVENT_OBJECT_CONTENTSCROLLED
 * Sent when ending the scrolling of a window object.
 *
 * Unlike the similar event (EVENT_SYSTEM_SCROLLEND), this event will be
 * associated with the scrolling window itself. There is no difference
 * between horizontal or vertical scrolling.
 *
 * This event should be posted whenever scroll action is completed, including
 * when it is scrolled by scroll bars, mouse wheel, or keyboard navigations.
 *
 *   example:
 *          hwnd == window that is scrolling
 *          idObject == OBJID_CLIENT
 *          idChild == CHILDID_SELF
 */
#define EVENT_OBJECT_CONTENTSCROLLED        0x8015
#endif /* _WIN32_WINNT >= 0x0600 */

#if(_WIN32_WINNT >= 0x0601)
#define EVENT_SYSTEM_ARRANGMENTPREVIEW      0x8016
#endif /* _WIN32_WINNT >= 0x0601 */

#if(_WIN32_WINNT >= 0x0601)
#define EVENT_OBJECT_END                    0x80FF

#define EVENT_AIA_START                     0xA000
#define EVENT_AIA_END                       0xAFFF
#endif /* _WIN32_WINNT >= 0x0601 */


/*
 * Child IDs
 */


/*
 * System Sounds (idChild of system SOUND notification)
 */
#define SOUND_SYSTEM_STARTUP            1
#define SOUND_SYSTEM_SHUTDOWN           2
#define SOUND_SYSTEM_BEEP               3
#define SOUND_SYSTEM_ERROR              4
#define SOUND_SYSTEM_QUESTION           5
#define SOUND_SYSTEM_WARNING            6
#define SOUND_SYSTEM_INFORMATION        7
#define SOUND_SYSTEM_MAXIMIZE           8
#define SOUND_SYSTEM_MINIMIZE           9
#define SOUND_SYSTEM_RESTOREUP          10
#define SOUND_SYSTEM_RESTOREDOWN        11
#define SOUND_SYSTEM_APPSTART           12
#define SOUND_SYSTEM_FAULT              13
#define SOUND_SYSTEM_APPEND             14
#define SOUND_SYSTEM_MENUCOMMAND        15
#define SOUND_SYSTEM_MENUPOPUP          16
#define CSOUND_SYSTEM                   16

/*
 * System Alerts (indexChild of system ALERT notification)
 */
#define ALERT_SYSTEM_INFORMATIONAL      1       // MB_INFORMATION
#define ALERT_SYSTEM_WARNING            2       // MB_WARNING
#define ALERT_SYSTEM_ERROR              3       // MB_ERROR
#define ALERT_SYSTEM_QUERY              4       // MB_QUESTION
#define ALERT_SYSTEM_CRITICAL           5       // HardSysErrBox
#define CALERT_SYSTEM                   6

typedef struct tagGUITHREADINFO
{
    DWORD   cbSize;
    DWORD   flags;
    HWND    hwndActive;
    HWND    hwndFocus;
    HWND    hwndCapture;
    HWND    hwndMenuOwner;
    HWND    hwndMoveSize;
    HWND    hwndCaret;
    RECT    rcCaret;
} GUITHREADINFO, *PGUITHREADINFO, FAR * LPGUITHREADINFO;

#define GUI_CARETBLINKING   0x00000001
#define GUI_INMOVESIZE      0x00000002
#define GUI_INMENUMODE      0x00000004
#define GUI_SYSTEMMENUMODE  0x00000008
#define GUI_POPUPMENUMODE   0x00000010
#if(_WIN32_WINNT >= 0x0501)
#if defined(_WIN64)
#define GUI_16BITTASK       0x00000000
#else
#define GUI_16BITTASK       0x00000020
#endif
#endif /* _WIN32_WINNT >= 0x0501 */

WINUSERAPI
BOOL
WINAPI
GetGUIThreadInfo(
    __in DWORD idThread,
    __inout PGUITHREADINFO pgui);

WINUSERAPI
BOOL
WINAPI
BlockInput(
    BOOL fBlockIt);

#if(_WIN32_WINNT >= 0x0600)

#define USER_DEFAULT_SCREEN_DPI 96

WINUSERAPI
BOOL
WINAPI
SetProcessDPIAware(
    VOID);

WINUSERAPI
BOOL
WINAPI
IsProcessDPIAware(
    VOID);
#endif /* _WIN32_WINNT >= 0x0600 */

WINUSERAPI
UINT
WINAPI
GetWindowModuleFileNameA(
    __in HWND hwnd,
    __out_ecount_part(cchFileNameMax, return) LPSTR pszFileName,
    __in UINT cchFileNameMax);
WINUSERAPI
UINT
WINAPI
GetWindowModuleFileNameW(
    __in HWND hwnd,
    __out_ecount_part(cchFileNameMax, return) LPWSTR pszFileName,
    __in UINT cchFileNameMax);
#ifdef UNICODE
#define GetWindowModuleFileName  GetWindowModuleFileNameW
#else
#define GetWindowModuleFileName  GetWindowModuleFileNameA
#endif // !UNICODE

#ifndef NO_STATE_FLAGS
#define STATE_SYSTEM_UNAVAILABLE        0x00000001  // Disabled
#define STATE_SYSTEM_SELECTED           0x00000002
#define STATE_SYSTEM_FOCUSED            0x00000004
#define STATE_SYSTEM_PRESSED            0x00000008
#define STATE_SYSTEM_CHECKED            0x00000010
#define STATE_SYSTEM_MIXED              0x00000020  // 3-state checkbox or toolbar button
#define STATE_SYSTEM_INDETERMINATE      STATE_SYSTEM_MIXED
#define STATE_SYSTEM_READONLY           0x00000040
#define STATE_SYSTEM_HOTTRACKED         0x00000080
#define STATE_SYSTEM_DEFAULT            0x00000100
#define STATE_SYSTEM_EXPANDED           0x00000200
#define STATE_SYSTEM_COLLAPSED          0x00000400
#define STATE_SYSTEM_BUSY               0x00000800
#define STATE_SYSTEM_FLOATING           0x00001000  // Children "owned" not "contained" by parent
#define STATE_SYSTEM_MARQUEED           0x00002000
#define STATE_SYSTEM_ANIMATED           0x00004000
#define STATE_SYSTEM_INVISIBLE          0x00008000
#define STATE_SYSTEM_OFFSCREEN          0x00010000
#define STATE_SYSTEM_SIZEABLE           0x00020000
#define STATE_SYSTEM_MOVEABLE           0x00040000
#define STATE_SYSTEM_SELFVOICING        0x00080000
#define STATE_SYSTEM_FOCUSABLE          0x00100000
#define STATE_SYSTEM_SELECTABLE         0x00200000
#define STATE_SYSTEM_LINKED             0x00400000
#define STATE_SYSTEM_TRAVERSED          0x00800000
#define STATE_SYSTEM_MULTISELECTABLE    0x01000000  // Supports multiple selection
#define STATE_SYSTEM_EXTSELECTABLE      0x02000000  // Supports extended selection
#define STATE_SYSTEM_ALERT_LOW          0x04000000  // This information is of low priority
#define STATE_SYSTEM_ALERT_MEDIUM       0x08000000  // This information is of medium priority
#define STATE_SYSTEM_ALERT_HIGH         0x10000000  // This information is of high priority
#define STATE_SYSTEM_PROTECTED          0x20000000  // access to this is restricted
#define STATE_SYSTEM_VALID              0x3FFFFFFF
#endif

#define CCHILDREN_TITLEBAR              5
#define CCHILDREN_SCROLLBAR             5

/*
 * Information about the global cursor.
 */
typedef struct tagCURSORINFO
{
    DWORD   cbSize;
    DWORD   flags;
    HCURSOR hCursor;
    POINT   ptScreenPos;
} CURSORINFO, *PCURSORINFO, *LPCURSORINFO;

#define CURSOR_SHOWING     0x00000001

WINUSERAPI
BOOL
WINAPI
GetCursorInfo(
    __inout PCURSORINFO pci);

/*
 * Window information snapshot
 */
typedef struct tagWINDOWINFO
{
    DWORD cbSize;
    RECT rcWindow;
    RECT rcClient;
    DWORD dwStyle;
    DWORD dwExStyle;
    DWORD dwWindowStatus;
    UINT cxWindowBorders;
    UINT cyWindowBorders;
    ATOM atomWindowType;
    WORD wCreatorVersion;
} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;

#define WS_ACTIVECAPTION    0x0001

WINUSERAPI
BOOL
WINAPI
GetWindowInfo(
    __in HWND hwnd,
    __inout PWINDOWINFO pwi);

/*
 * Titlebar information.
 */
typedef struct tagTITLEBARINFO
{
    DWORD cbSize;
    RECT rcTitleBar;
    DWORD rgstate[CCHILDREN_TITLEBAR + 1];
} TITLEBARINFO, *PTITLEBARINFO, *LPTITLEBARINFO;

WINUSERAPI
BOOL
WINAPI
GetTitleBarInfo(
    __in HWND hwnd,
    __inout PTITLEBARINFO pti);

#if(WINVER >= 0x0600)
typedef struct tagTITLEBARINFOEX
{
    DWORD cbSize;
    RECT rcTitleBar;
    DWORD rgstate[CCHILDREN_TITLEBAR + 1];
    RECT rgrect[CCHILDREN_TITLEBAR + 1];
} TITLEBARINFOEX, *PTITLEBARINFOEX, *LPTITLEBARINFOEX;
#endif /* WINVER >= 0x0600 */

/*
 * Menubar information
 */
typedef struct tagMENUBARINFO
{
    DWORD cbSize;
    RECT rcBar;          // rect of bar, popup, item
    HMENU hMenu;         // real menu handle of bar, popup
    HWND hwndMenu;       // hwnd of item submenu if one
    BOOL fBarFocused:1;  // bar, popup has the focus
    BOOL fFocused:1;     // item has the focus
} MENUBARINFO, *PMENUBARINFO, *LPMENUBARINFO;

WINUSERAPI
BOOL
WINAPI
GetMenuBarInfo(
    __in HWND hwnd,
    __in LONG idObject,
    __in LONG idItem,
    __inout PMENUBARINFO pmbi);

/*
 * Scrollbar information
 */
typedef struct tagSCROLLBARINFO
{
    DWORD cbSize;
    RECT rcScrollBar;
    int dxyLineButton;
    int xyThumbTop;
    int xyThumbBottom;
    int reserved;
    DWORD rgstate[CCHILDREN_SCROLLBAR + 1];
} SCROLLBARINFO, *PSCROLLBARINFO, *LPSCROLLBARINFO;

WINUSERAPI
BOOL
WINAPI
GetScrollBarInfo(
    __in HWND hwnd,
    __in LONG idObject,
    __inout PSCROLLBARINFO psbi);

/*
 * Combobox information
 */
typedef struct tagCOMBOBOXINFO
{
    DWORD cbSize;
    RECT rcItem;
    RECT rcButton;
    DWORD stateButton;
    HWND hwndCombo;
    HWND hwndItem;
    HWND hwndList;
} COMBOBOXINFO, *PCOMBOBOXINFO, *LPCOMBOBOXINFO;

WINUSERAPI
BOOL
WINAPI
GetComboBoxInfo(
    __in HWND hwndCombo,
    __inout PCOMBOBOXINFO pcbi);

/*
 * The "real" ancestor window
 */
#define     GA_PARENT       1
#define     GA_ROOT         2
#define     GA_ROOTOWNER    3

WINUSERAPI
HWND
WINAPI
GetAncestor(
    __in HWND hwnd,
    __in UINT gaFlags);


/*
 * This gets the REAL child window at the point.  If it is in the dead
 * space of a group box, it will try a sibling behind it.  But static
 * fields will get returned.  In other words, it is kind of a cross between
 * ChildWindowFromPointEx and WindowFromPoint.
 */
WINUSERAPI
HWND
WINAPI
RealChildWindowFromPoint(
    __in HWND hwndParent,
    __in POINT ptParentClientCoords);


/*
 * This gets the name of the window TYPE, not class.  This allows us to
 * recognize ThunderButton32 et al.
 */
WINUSERAPI
UINT
WINAPI
RealGetWindowClassA(
    __in HWND hwnd,
    __out_ecount_part(cchClassNameMax, return) LPSTR ptszClassName,
    __in UINT cchClassNameMax);
/*
 * This gets the name of the window TYPE, not class.  This allows us to
 * recognize ThunderButton32 et al.
 */
WINUSERAPI
UINT
WINAPI
RealGetWindowClassW(
    __in HWND hwnd,
    __out_ecount_part(cchClassNameMax, return) LPWSTR ptszClassName,
    __in UINT cchClassNameMax);
#ifdef UNICODE
#define RealGetWindowClass  RealGetWindowClassW
#else
#define RealGetWindowClass  RealGetWindowClassA
#endif // !UNICODE

/*
 * Alt-Tab Switch window information.
 */
typedef struct tagALTTABINFO
{
    DWORD cbSize;
    int cItems;
    int cColumns;
    int cRows;
    int iColFocus;
    int iRowFocus;
    int cxItem;
    int cyItem;
    POINT ptStart;
} ALTTABINFO, *PALTTABINFO, *LPALTTABINFO;

WINUSERAPI
BOOL
WINAPI
GetAltTabInfoA(
    __in_opt HWND hwnd,
    __in int iItem,
    __inout PALTTABINFO pati,
    __out_ecount_opt(cchItemText) LPSTR pszItemText,
    __in UINT cchItemText);
WINUSERAPI
BOOL
WINAPI
GetAltTabInfoW(
    __in_opt HWND hwnd,
    __in int iItem,
    __inout PALTTABINFO pati,
    __out_ecount_opt(cchItemText) LPWSTR pszItemText,
    __in UINT cchItemText);
#ifdef UNICODE
#define GetAltTabInfo  GetAltTabInfoW
#else
#define GetAltTabInfo  GetAltTabInfoA
#endif // !UNICODE

/*
 * Listbox information.
 * Returns the number of items per row.
 */
WINUSERAPI
DWORD
WINAPI
GetListBoxInfo(
    __in HWND hwnd);

#endif /* NOWINABLE */
#endif /* WINVER >= 0x0500 */


#if(_WIN32_WINNT >= 0x0500)
WINUSERAPI
BOOL
WINAPI
LockWorkStation(
    VOID);
#endif /* _WIN32_WINNT >= 0x0500 */

#if(_WIN32_WINNT >= 0x0500)

WINUSERAPI
BOOL
WINAPI
UserHandleGrantAccess(
    __in HANDLE hUserHandle,
    __in HANDLE hJob,
    __in BOOL   bGrant);

#endif /* _WIN32_WINNT >= 0x0500 */

#if(_WIN32_WINNT >= 0x0501)

/*
 * Raw Input Messages.
 */

DECLARE_HANDLE(HRAWINPUT);

/*
 * WM_INPUT wParam
 */

/*
 * Use this macro to get the input code from wParam.
 */
#define GET_RAWINPUT_CODE_WPARAM(wParam)    ((wParam) & 0xff)

/*
 * The input is in the regular message flow,
 * the app is required to call DefWindowProc
 * so that the system can perform clean ups.
 */
#define RIM_INPUT       0

/*
 * The input is sink only. The app is expected
 * to behave nicely.
 */
#define RIM_INPUTSINK   1


/*
 * Raw Input data header
 */
typedef struct tagRAWINPUTHEADER {
    DWORD dwType;
    DWORD dwSize;
    HANDLE hDevice;
    WPARAM wParam;
} RAWINPUTHEADER, *PRAWINPUTHEADER, *LPRAWINPUTHEADER;

/*
 * Type of the raw input
 */
#define RIM_TYPEMOUSE       0
#define RIM_TYPEKEYBOARD    1
#define RIM_TYPEHID         2

/*
 * Raw format of the mouse input
 */
typedef struct tagRAWMOUSE {
    /*
     * Indicator flags.
     */
    USHORT usFlags;

    /*
     * The transition state of the mouse buttons.
     */
    union {
        ULONG ulButtons;
        struct  {
            USHORT  usButtonFlags;
            USHORT  usButtonData;
        };
    };


    /*
     * The raw state of the mouse buttons.
     */
    ULONG ulRawButtons;

    /*
     * The signed relative or absolute motion in the X direction.
     */
    LONG lLastX;

    /*
     * The signed relative or absolute motion in the Y direction.
     */
    LONG lLastY;

    /*
     * Device-specific additional information for the event.
     */
    ULONG ulExtraInformation;

} RAWMOUSE, *PRAWMOUSE, *LPRAWMOUSE;

/*
 * Define the mouse button state indicators.
 */

#define RI_MOUSE_LEFT_BUTTON_DOWN   0x0001  // Left Button changed to down.
#define RI_MOUSE_LEFT_BUTTON_UP     0x0002  // Left Button changed to up.
#define RI_MOUSE_RIGHT_BUTTON_DOWN  0x0004  // Right Button changed to down.
#define RI_MOUSE_RIGHT_BUTTON_UP    0x0008  // Right Button changed to up.
#define RI_MOUSE_MIDDLE_BUTTON_DOWN 0x0010  // Middle Button changed to down.
#define RI_MOUSE_MIDDLE_BUTTON_UP   0x0020  // Middle Button changed to up.

#define RI_MOUSE_BUTTON_1_DOWN      RI_MOUSE_LEFT_BUTTON_DOWN
#define RI_MOUSE_BUTTON_1_UP        RI_MOUSE_LEFT_BUTTON_UP
#define RI_MOUSE_BUTTON_2_DOWN      RI_MOUSE_RIGHT_BUTTON_DOWN
#define RI_MOUSE_BUTTON_2_UP        RI_MOUSE_RIGHT_BUTTON_UP
#define RI_MOUSE_BUTTON_3_DOWN      RI_MOUSE_MIDDLE_BUTTON_DOWN
#define RI_MOUSE_BUTTON_3_UP        RI_MOUSE_MIDDLE_BUTTON_UP

#define RI_MOUSE_BUTTON_4_DOWN      0x0040
#define RI_MOUSE_BUTTON_4_UP        0x0080
#define RI_MOUSE_BUTTON_5_DOWN      0x0100
#define RI_MOUSE_BUTTON_5_UP        0x0200

/*
 * If usButtonFlags has RI_MOUSE_WHEEL, the wheel delta is stored in usButtonData.
 * Take it as a signed value.
 */
#define RI_MOUSE_WHEEL              0x0400

/*
 * Define the mouse indicator flags.
 */
#define MOUSE_MOVE_RELATIVE         0
#define MOUSE_MOVE_ABSOLUTE         1
#define MOUSE_VIRTUAL_DESKTOP    0x02  // the coordinates are mapped to the virtual desktop
#define MOUSE_ATTRIBUTES_CHANGED 0x04  // requery for mouse attributes
#if(WINVER >= 0x0600)
#define MOUSE_MOVE_NOCOALESCE    0x08  // do not coalesce mouse moves
#endif /* WINVER >= 0x0600 */

/*
 * Raw format of the keyboard input
 */
typedef struct tagRAWKEYBOARD {
    /*
     * The "make" scan code (key depression).
     */
    USHORT MakeCode;

    /*
     * The flags field indicates a "break" (key release) and other
     * miscellaneous scan code information defined in ntddkbd.h.
     */
    USHORT Flags;

    USHORT Reserved;

    /*
     * Windows message compatible information
     */
    USHORT VKey;
    UINT   Message;

    /*
     * Device-specific additional information for the event.
     */
    ULONG ExtraInformation;


} RAWKEYBOARD, *PRAWKEYBOARD, *LPRAWKEYBOARD;


/*
 * Define the keyboard overrun MakeCode.
 */

#define KEYBOARD_OVERRUN_MAKE_CODE    0xFF

/*
 * Define the keyboard input data Flags.
 */
#define RI_KEY_MAKE             0
#define RI_KEY_BREAK            1
#define RI_KEY_E0               2
#define RI_KEY_E1               4
#define RI_KEY_TERMSRV_SET_LED  8
#define RI_KEY_TERMSRV_SHADOW   0x10


/*
 * Raw format of the input from Human Input Devices
 */
typedef struct tagRAWHID {
    DWORD dwSizeHid;    // byte size of each report
    DWORD dwCount;      // number of input packed
    BYTE bRawData[1];
} RAWHID, *PRAWHID, *LPRAWHID;

/*
 * RAWINPUT data structure.
 */
typedef struct tagRAWINPUT {
    RAWINPUTHEADER header;
    union {
        RAWMOUSE    mouse;
        RAWKEYBOARD keyboard;
        RAWHID      hid;
    } data;
} RAWINPUT, *PRAWINPUT, *LPRAWINPUT;

#ifdef _WIN64
#define RAWINPUT_ALIGN(x)   (((x) + sizeof(QWORD) - 1) & ~(sizeof(QWORD) - 1))
#else   // _WIN64
#define RAWINPUT_ALIGN(x)   (((x) + sizeof(DWORD) - 1) & ~(sizeof(DWORD) - 1))
#endif  // _WIN64

#define NEXTRAWINPUTBLOCK(ptr) ((PRAWINPUT)RAWINPUT_ALIGN((ULONG_PTR)((PBYTE)(ptr) + (ptr)->header.dwSize)))

/*
 * Flags for GetRawInputData
 */

#define RID_INPUT               0x10000003
#define RID_HEADER              0x10000005

WINUSERAPI
UINT
WINAPI
GetRawInputData(
    __in HRAWINPUT hRawInput,
    __in UINT uiCommand,
    __out_bcount_part_opt(*pcbSize, return) LPVOID pData,
    __inout PUINT pcbSize,
    __in UINT cbSizeHeader);

/*
 * Raw Input Device Information
 */
#define RIDI_PREPARSEDDATA      0x20000005
#define RIDI_DEVICENAME         0x20000007  // the return valus is the character length, not the byte size
#define RIDI_DEVICEINFO         0x2000000b

typedef struct tagRID_DEVICE_INFO_MOUSE {
    DWORD dwId;
    DWORD dwNumberOfButtons;
    DWORD dwSampleRate;
    BOOL  fHasHorizontalWheel;
} RID_DEVICE_INFO_MOUSE, *PRID_DEVICE_INFO_MOUSE;

typedef struct tagRID_DEVICE_INFO_KEYBOARD {
    DWORD dwType;
    DWORD dwSubType;
    DWORD dwKeyboardMode;
    DWORD dwNumberOfFunctionKeys;
    DWORD dwNumberOfIndicators;
    DWORD dwNumberOfKeysTotal;
} RID_DEVICE_INFO_KEYBOARD, *PRID_DEVICE_INFO_KEYBOARD;

typedef struct tagRID_DEVICE_INFO_HID {
    DWORD dwVendorId;
    DWORD dwProductId;
    DWORD dwVersionNumber;

    /*
     * Top level collection UsagePage and Usage
     */
    USHORT usUsagePage;
    USHORT usUsage;
} RID_DEVICE_INFO_HID, *PRID_DEVICE_INFO_HID;

typedef struct tagRID_DEVICE_INFO {
    DWORD cbSize;
    DWORD dwType;
    union {
        RID_DEVICE_INFO_MOUSE mouse;
        RID_DEVICE_INFO_KEYBOARD keyboard;
        RID_DEVICE_INFO_HID hid;
    };
} RID_DEVICE_INFO, *PRID_DEVICE_INFO, *LPRID_DEVICE_INFO;

WINUSERAPI
UINT
WINAPI
GetRawInputDeviceInfoA(
    __in_opt HANDLE hDevice,
    __in UINT uiCommand,
    __inout_bcount_part_opt(*pcbSize, *pcbSize) LPVOID pData,
    __inout PUINT pcbSize);
WINUSERAPI
UINT
WINAPI
GetRawInputDeviceInfoW(
    __in_opt HANDLE hDevice,
    __in UINT uiCommand,
    __inout_bcount_part_opt(*pcbSize, *pcbSize) LPVOID pData,
    __inout PUINT pcbSize);
#ifdef UNICODE
#define GetRawInputDeviceInfo  GetRawInputDeviceInfoW
#else
#define GetRawInputDeviceInfo  GetRawInputDeviceInfoA
#endif // !UNICODE


/*
 * Raw Input Bulk Read: GetRawInputBuffer
 */
WINUSERAPI
UINT
WINAPI
GetRawInputBuffer(
    __out_bcount_opt(*pcbSize) PRAWINPUT pData,
    __inout PUINT pcbSize,
    __in UINT cbSizeHeader);

/*
 * Raw Input request APIs
 */
typedef struct tagRAWINPUTDEVICE {
    USHORT usUsagePage; // Toplevel collection UsagePage
    USHORT usUsage;     // Toplevel collection Usage
    DWORD dwFlags;
    HWND hwndTarget;    // Target hwnd. NULL = follows keyboard focus
} RAWINPUTDEVICE, *PRAWINPUTDEVICE, *LPRAWINPUTDEVICE;

typedef CONST RAWINPUTDEVICE* PCRAWINPUTDEVICE;

#define RIDEV_REMOVE            0x00000001
#define RIDEV_EXCLUDE           0x00000010
#define RIDEV_PAGEONLY          0x00000020
#define RIDEV_NOLEGACY          0x00000030
#define RIDEV_INPUTSINK         0x00000100
#define RIDEV_CAPTUREMOUSE      0x00000200  // effective when mouse nolegacy is specified, otherwise it would be an error
#define RIDEV_NOHOTKEYS         0x00000200  // effective for keyboard.
#define RIDEV_APPKEYS           0x00000400  // effective for keyboard.
#if(_WIN32_WINNT >= 0x0501)
#define RIDEV_EXINPUTSINK       0x00001000
#define RIDEV_DEVNOTIFY         0x00002000
#endif /* _WIN32_WINNT >= 0x0501 */
#define RIDEV_EXMODEMASK        0x000000F0

#define RIDEV_EXMODE(mode)  ((mode) & RIDEV_EXMODEMASK)

#if(_WIN32_WINNT >= 0x0501)
/*
 * Flags for the WM_INPUT_DEVICE_CHANGE message.
 */
#define GIDC_ARRIVAL             1
#define GIDC_REMOVAL             2
#endif /* _WIN32_WINNT >= 0x0501 */

#if (_WIN32_WINNT >= 0x0601)
#define GET_DEVICE_CHANGE_WPARAM(wParam)  (LOWORD(wParam))
#elif (_WIN32_WINNT >= 0x0501)
#define GET_DEVICE_CHANGE_LPARAM(lParam)  (LOWORD(lParam))
#endif /* (_WIN32_WINNT >= 0x0601) */

WINUSERAPI
BOOL
WINAPI
RegisterRawInputDevices(
    __in_ecount(uiNumDevices) PCRAWINPUTDEVICE pRawInputDevices,
    __in UINT uiNumDevices,
    __in UINT cbSize);

WINUSERAPI
UINT
WINAPI
GetRegisteredRawInputDevices(
    __out_ecount_opt( *puiNumDevices) PRAWINPUTDEVICE pRawInputDevices,
    __inout PUINT puiNumDevices,
    __in UINT cbSize);


typedef struct tagRAWINPUTDEVICELIST {
    HANDLE hDevice;
    DWORD dwType;
} RAWINPUTDEVICELIST, *PRAWINPUTDEVICELIST;

WINUSERAPI
UINT
WINAPI
GetRawInputDeviceList(
    __out_ecount_opt(*puiNumDevices) PRAWINPUTDEVICELIST pRawInputDeviceList,
    __inout PUINT puiNumDevices,
    __in UINT cbSize);

WINUSERAPI
LRESULT
WINAPI
DefRawInputProc(
    __in_ecount(nInput) PRAWINPUT* paRawInput,
    __in INT nInput,
    __in UINT cbSizeHeader);

#endif /* _WIN32_WINNT >= 0x0501 */


#if(WINVER >= 0x0600)

/*
 * Message Filter
 */

#define MSGFLT_ADD 1
#define MSGFLT_REMOVE 2

WINUSERAPI
BOOL
WINAPI
ChangeWindowMessageFilter(
    __in UINT message,
    __in DWORD dwFlag);

#endif /* WINVER >= 0x0600 */

#if(WINVER >= 0x0601)

/*
 * Message filter info values (CHANGEFILTERSTRUCT.ExtStatus)
 */
#define MSGFLTINFO_NONE                         (0)
#define MSGFLTINFO_ALREADYALLOWED_FORWND        (1)
#define MSGFLTINFO_ALREADYDISALLOWED_FORWND     (2)
#define MSGFLTINFO_ALLOWED_HIGHER               (3)

typedef struct tagCHANGEFILTERSTRUCT {
    DWORD cbSize;
    DWORD ExtStatus;
} CHANGEFILTERSTRUCT, *PCHANGEFILTERSTRUCT;

/*
 * Message filter action values (action parameter to ChangeWindowMessageFilterEx)
 */
#define MSGFLT_RESET                            (0)
#define MSGFLT_ALLOW                            (1)
#define MSGFLT_DISALLOW                         (2)

WINUSERAPI
BOOL
WINAPI
ChangeWindowMessageFilterEx(
    __in HWND hwnd,                                         // Window
    __in UINT message,                                      // WM_ message
    __in DWORD action,                                      // Message filter action value
    __inout_opt PCHANGEFILTERSTRUCT pChangeFilterStruct);   // Optional

#endif /* WINVER >= 0x0601 */


#if(WINVER >= 0x0601)

/*
 * Gesture defines and functions
 */

/*
 * Gesture information handle
 */
DECLARE_HANDLE(HGESTUREINFO);


/*
 * Gesture flags - GESTUREINFO.dwFlags
 */
#define GF_BEGIN                        0x00000001
#define GF_INERTIA                      0x00000002
#define GF_END                          0x00000004

/*
 * Gesture IDs
 */
#define GID_BEGIN                       1
#define GID_END                         2
#define GID_ZOOM                        3
#define GID_PAN                         4
#define GID_ROTATE                      5
#define GID_TWOFINGERTAP                6
#define GID_PRESSANDTAP                 7
#define GID_ROLLOVER                    GID_PRESSANDTAP

/*
 * Gesture information structure
 *   - Pass the HGESTUREINFO received in the WM_GESTURE message lParam into the
 *     GetGestureInfo function to retrieve this information.
 *   - If cbExtraArgs is non-zero, pass the HGESTUREINFO received in the WM_GESTURE
 *     message lParam into the GetGestureExtraArgs function to retrieve extended
 *     argument information.
 */
typedef struct tagGESTUREINFO {
    UINT cbSize;                    // size, in bytes, of this structure (including variable length Args field)
    DWORD dwFlags;                  // see GF_* flags
    DWORD dwID;                     // gesture ID, see GID_* defines
    HWND hwndTarget;                // handle to window targeted by this gesture
    POINTS ptsLocation;             // current location of this gesture
    DWORD dwInstanceID;             // internally used
    DWORD dwSequenceID;             // internally used
    ULONGLONG ullArguments;         // arguments for gestures whose arguments fit in 8 BYTES
    UINT cbExtraArgs;               // size, in bytes, of extra arguments, if any, that accompany this gesture
} GESTUREINFO, *PGESTUREINFO;
typedef GESTUREINFO const * PCGESTUREINFO;


/*
 * Gesture notification structure
 *   - The WM_GESTURENOTIFY message lParam contains a pointer to this structure.
 *   - The WM_GESTURENOTIFY message notifies a window that gesture recognition is
 *     in progress and a gesture will be generated if one is recognized under the
 *     current gesture settings.
 */
typedef struct tagGESTURENOTIFYSTRUCT {
    UINT cbSize;                    // size, in bytes, of this structure
    DWORD dwFlags;                  // unused
    HWND hwndTarget;                // handle to window targeted by the gesture
    POINTS ptsLocation;             // starting location
    DWORD dwInstanceID;             // internally used
} GESTURENOTIFYSTRUCT, *PGESTURENOTIFYSTRUCT;

/*
 * Gesture argument helpers
 *   - Angle should be a double in the range of -2pi to +2pi
 *   - Argument should be an unsigned 16-bit value
 */
#define GID_ROTATE_ANGLE_TO_ARGUMENT(_arg_)     ((USHORT)((((_arg_) + 2.0 * 3.14159265) / (4.0 * 3.14159265)) * 65535.0))
#define GID_ROTATE_ANGLE_FROM_ARGUMENT(_arg_)   ((((double)(_arg_) / 65535.0) * 4.0 * 3.14159265) - 2.0 * 3.14159265)

/*
 * Gesture information retrieval
 *   - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message.
 */
WINUSERAPI
BOOL
WINAPI
GetGestureInfo(
    __in HGESTUREINFO hGestureInfo,
    __out PGESTUREINFO pGestureInfo);

/*
 * Gesture extra arguments retrieval
 *   - HGESTUREINFO is received by a window in the lParam of a WM_GESTURE message.
 *   - Size, in bytes, of the extra argument data is available in the cbExtraArgs
 *     field of the GESTUREINFO structure retrieved using the GetGestureInfo function.
 */
WINUSERAPI
BOOL
WINAPI
GetGestureExtraArgs(
    __in HGESTUREINFO hGestureInfo,
    __in UINT cbExtraArgs,
    __out_bcount(cbExtraArgs) PBYTE pExtraArgs);

/*
 * Gesture information handle management
 *   - If an application processes the WM_GESTURE message, then once it is done
 *     with the associated HGESTUREINFO, the application is responsible for
 *     closing the handle using this function. Failure to do so may result in
 *     process memory leaks.
 *   - If the message is instead passed to DefWindowProc, or is forwarded using
 *     one of the PostMessage or SendMessage class of API functions, the handle
 *     is transfered with the message and need not be closed by the application.
 */
WINUSERAPI
BOOL
WINAPI
CloseGestureInfoHandle(
    __in HGESTUREINFO hGestureInfo);


/*
 * Gesture configuration structure
 *   - Used in SetGestureConfig and GetGestureConfig
 *   - Note that any setting not included in either GESTURECONFIG.dwWant or
 *     GESTURECONFIG.dwBlock will use the parent window's preferences or
 *     system defaults.
 */
typedef struct tagGESTURECONFIG {
    DWORD dwID;                     // gesture ID
    DWORD dwWant;                   // settings related to gesture ID that are to be turned on
    DWORD dwBlock;                  // settings related to gesture ID that are to be turned off
} GESTURECONFIG, *PGESTURECONFIG;

/*
 * Gesture configuration flags - GESTURECONFIG.dwWant or GESTURECONFIG.dwBlock
 */

/*
 * Common gesture configuration flags - set GESTURECONFIG.dwID to zero
 */
#define GC_ALLGESTURES                              0x00000001

/*
 * Zoom gesture configuration flags - set GESTURECONFIG.dwID to GID_ZOOM
 */
#define GC_ZOOM                                     0x00000001

/*
 * Pan gesture configuration flags - set GESTURECONFIG.dwID to GID_PAN
 */
#define GC_PAN                                      0x00000001
#define GC_PAN_WITH_SINGLE_FINGER_VERTICALLY        0x00000002
#define GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY      0x00000004
#define GC_PAN_WITH_GUTTER                          0x00000008
#define GC_PAN_WITH_INERTIA                         0x00000010

/*
 * Rotate gesture configuration flags - set GESTURECONFIG.dwID to GID_ROTATE
 */
#define GC_ROTATE                                   0x00000001

/*
 * Two finger tap gesture configuration flags - set GESTURECONFIG.dwID to GID_TWOFINGERTAP
 */
#define GC_TWOFINGERTAP                             0x00000001

/*
 * PressAndTap gesture configuration flags - set GESTURECONFIG.dwID to GID_PRESSANDTAP
 */
#define GC_PRESSANDTAP                              0x00000001
#define GC_ROLLOVER                                 GC_PRESSANDTAP

#define GESTURECONFIGMAXCOUNT           256             // Maximum number of gestures that can be included
                                                        // in a single call to SetGestureConfig / GetGestureConfig

WINUSERAPI
BOOL
WINAPI
SetGestureConfig(
    __in HWND hwnd,                                     // window for which configuration is specified
    __in DWORD dwReserved,                              // reserved, must be 0
    __in UINT cIDs,                                     // count of GESTURECONFIG structures
    __in_ecount(cIDs) PGESTURECONFIG pGestureConfig,    // array of GESTURECONFIG structures, dwIDs will be processed in the
                                                        // order specified and repeated occurances will overwrite previous ones
    __in UINT cbSize);                                  // sizeof(GESTURECONFIG)


#define GCF_INCLUDE_ANCESTORS           0x00000001      // If specified, GetGestureConfig returns consolidated configuration
                                                        // for the specified window and it's parent window chain

WINUSERAPI
BOOL
WINAPI
GetGestureConfig(
    __in HWND hwnd,                                     // window for which configuration is required
    __in DWORD dwReserved,                              // reserved, must be 0
    __in DWORD dwFlags,                                 // see GCF_* flags
    __in PUINT pcIDs,                                   // *pcIDs contains the size, in number of GESTURECONFIG structures,
                                                        // of the buffer pointed to by pGestureConfig
    __inout_ecount(*pcIDs) PGESTURECONFIG pGestureConfig,
                                                        // pointer to buffer to receive the returned array of GESTURECONFIG structures
    __in UINT cbSize);                                  // sizeof(GESTURECONFIG)



#endif /* WINVER >= 0x0601 */

#if(WINVER >= 0x0601)

/*
 * GetSystemMetrics(SM_DIGITIZER) flag values
 */
#define NID_INTEGRATED_TOUCH  0x00000001
#define NID_EXTERNAL_TOUCH    0x00000002
#define NID_INTEGRATED_PEN    0x00000004
#define NID_EXTERNAL_PEN      0x00000008
#define NID_MULTI_INPUT       0x00000040
#define NID_READY             0x00000080

#endif /* WINVER >= 0x0601 */


#define MAX_STR_BLOCKREASON 256

WINUSERAPI
BOOL
WINAPI
ShutdownBlockReasonCreate(
    __in HWND hWnd,
    __in LPCWSTR pwszReason);

WINUSERAPI
BOOL
WINAPI
ShutdownBlockReasonQuery(
    __in HWND hWnd,
    __out_ecount_opt(*pcchBuff) LPWSTR pwszBuff,
    __inout DWORD *pcchBuff);

WINUSERAPI
BOOL
WINAPI
ShutdownBlockReasonDestroy(
    __in HWND hWnd);




#if !defined(RC_INVOKED) /* RC complains about long symbols in #ifs */
#if defined(ISOLATION_AWARE_ENABLED) && (ISOLATION_AWARE_ENABLED != 0)
#include "winuser.inl"
#endif /* ISOLATION_AWARE_ENABLED */
#endif /* RC */

#ifdef __cplusplus
}
#endif  /* __cplusplus */

#endif /* !_WINUSER_ */




/**************************************************************************
*                                                                         *
* wingdi.h -- GDI procedure declarations, constant definitions and macros *
*                                                                         *
* Copyright (c) Microsoft Corp. All rights reserved.                      *
*                                                                         *
**************************************************************************/

#ifndef _WINGDI_
#define _WINGDI_


#pragma once

#if _MSC_VER >= 1200
#pragma warning(push)
#pragma warning(disable: 4201)      // nonstandard extension used : nameless struct/union
#endif

#ifdef _MAC
#include 
#endif


//
// Define API decoration for direct importing of DLL references.
//

#if !defined(_GDI32_)
#define WINGDIAPI DECLSPEC_IMPORT
#else
#define WINGDIAPI
#endif

//
// Define API decoration for direct importing of DLL references.
//

#if !defined(_SPOOL32_)
#define WINSPOOLAPI DECLSPEC_IMPORT
#else
#define WINSPOOLAPI
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifndef WINVER
#define WINVER 0x0500   // version 5.0
#endif /* WINVER */

#ifndef NOGDI

#ifndef NORASTEROPS

/* Binary raster ops */
#define R2_BLACK            1   /*  0       */
#define R2_NOTMERGEPEN      2   /* DPon     */
#define R2_MASKNOTPEN       3   /* DPna     */
#define R2_NOTCOPYPEN       4   /* PN       */
#define R2_MASKPENNOT       5   /* PDna     */
#define R2_NOT              6   /* Dn       */
#define R2_XORPEN           7   /* DPx      */
#define R2_NOTMASKPEN       8   /* DPan     */
#define R2_MASKPEN          9   /* DPa      */
#define R2_NOTXORPEN        10  /* DPxn     */
#define R2_NOP              11  /* D        */
#define R2_MERGENOTPEN      12  /* DPno     */
#define R2_COPYPEN          13  /* P        */
#define R2_MERGEPENNOT      14  /* PDno     */
#define R2_MERGEPEN         15  /* DPo      */
#define R2_WHITE            16  /*  1       */
#define R2_LAST             16

/* Ternary raster operations */
#define SRCCOPY             (DWORD)0x00CC0020 /* dest = source                   */
#define SRCPAINT            (DWORD)0x00EE0086 /* dest = source OR dest           */
#define SRCAND              (DWORD)0x008800C6 /* dest = source AND dest          */
#define SRCINVERT           (DWORD)0x00660046 /* dest = source XOR dest          */
#define SRCERASE            (DWORD)0x00440328 /* dest = source AND (NOT dest )   */
#define NOTSRCCOPY          (DWORD)0x00330008 /* dest = (NOT source)             */
#define NOTSRCERASE         (DWORD)0x001100A6 /* dest = (NOT src) AND (NOT dest) */
#define MERGECOPY           (DWORD)0x00C000CA /* dest = (source AND pattern)     */
#define MERGEPAINT          (DWORD)0x00BB0226 /* dest = (NOT source) OR dest     */
#define PATCOPY             (DWORD)0x00F00021 /* dest = pattern                  */
#define PATPAINT            (DWORD)0x00FB0A09 /* dest = DPSnoo                   */
#define PATINVERT           (DWORD)0x005A0049 /* dest = pattern XOR dest         */
#define DSTINVERT           (DWORD)0x00550009 /* dest = (NOT dest)               */
#define BLACKNESS           (DWORD)0x00000042 /* dest = BLACK                    */
#define WHITENESS           (DWORD)0x00FF0062 /* dest = WHITE                    */
#if(WINVER >= 0x0500)

#define NOMIRRORBITMAP               (DWORD)0x80000000 /* Do not Mirror the bitmap in this call */
#define CAPTUREBLT                   (DWORD)0x40000000 /* Include layered windows */
#endif /* WINVER >= 0x0500 */


/* Quaternary raster codes */
#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore)) #endif /* NORASTEROPS */ #define GDI_ERROR (0xFFFFFFFFL) #if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
#define HGDI_ERROR (LongToHandle(0xFFFFFFFFL))
#else
#define HGDI_ERROR ((HANDLE)-1)
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WINXP)

/* Region Flags */
#define ERROR               0
#define NULLREGION          1
#define SIMPLEREGION        2
#define COMPLEXREGION       3
#define RGN_ERROR ERROR

/* CombineRgn() Styles */
#define RGN_AND             1
#define RGN_OR              2
#define RGN_XOR             3
#define RGN_DIFF            4
#define RGN_COPY            5
#define RGN_MIN             RGN_AND
#define RGN_MAX             RGN_COPY

/* StretchBlt() Modes */
#define BLACKONWHITE                 1
#define WHITEONBLACK                 2
#define COLORONCOLOR                 3
#define HALFTONE                     4
#define MAXSTRETCHBLTMODE            4

#if(WINVER >= 0x0400)
/* New StretchBlt() Modes */
#define STRETCH_ANDSCANS    BLACKONWHITE
#define STRETCH_ORSCANS     WHITEONBLACK
#define STRETCH_DELETESCANS COLORONCOLOR
#define STRETCH_HALFTONE    HALFTONE
#endif /* WINVER >= 0x0400 */

/* PolyFill() Modes */
#define ALTERNATE                    1
#define WINDING                      2
#define POLYFILL_LAST                2

/* Layout Orientation Options */
#if(WINVER >= 0x0500)
#define LAYOUT_RTL                         0x00000001 // Right to left
#define LAYOUT_BTT                         0x00000002 // Bottom to top
#define LAYOUT_VBH                         0x00000004 // Vertical before horizontal
#define LAYOUT_ORIENTATIONMASK             (LAYOUT_RTL | LAYOUT_BTT | LAYOUT_VBH)
#define LAYOUT_BITMAPORIENTATIONPRESERVED  0x00000008
#endif /* WINVER >= 0x0500 */

/* Text Alignment Options */
#define TA_NOUPDATECP                0
#define TA_UPDATECP                  1

#define TA_LEFT                      0
#define TA_RIGHT                     2
#define TA_CENTER                    6

#define TA_TOP                       0
#define TA_BOTTOM                    8
#define TA_BASELINE                  24
#if (WINVER >= 0x0400)
#define TA_RTLREADING                256
#define TA_MASK       (TA_BASELINE+TA_CENTER+TA_UPDATECP+TA_RTLREADING)
#else
#define TA_MASK       (TA_BASELINE+TA_CENTER+TA_UPDATECP)
#endif

#define VTA_BASELINE TA_BASELINE
#define VTA_LEFT     TA_BOTTOM
#define VTA_RIGHT    TA_TOP
#define VTA_CENTER   TA_CENTER
#define VTA_BOTTOM   TA_RIGHT
#define VTA_TOP      TA_LEFT

#define ETO_OPAQUE                   0x0002
#define ETO_CLIPPED                  0x0004
#if(WINVER >= 0x0400)
#define ETO_GLYPH_INDEX              0x0010
#define ETO_RTLREADING               0x0080
#define ETO_NUMERICSLOCAL            0x0400
#define ETO_NUMERICSLATIN            0x0800
#define ETO_IGNORELANGUAGE           0x1000
#endif /* WINVER >= 0x0400 */
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define ETO_PDY                      0x2000
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#if (_WIN32_WINNT >= _WIN32_WINNT_LONGHORN)
#define ETO_REVERSE_INDEX_MAP        0x10000
#endif

#define ASPECT_FILTERING             0x0001

/* Bounds Accumulation APIs */

#define DCB_RESET       0x0001
#define DCB_ACCUMULATE  0x0002
#define DCB_DIRTY       DCB_ACCUMULATE
#define DCB_SET         (DCB_RESET | DCB_ACCUMULATE)
#define DCB_ENABLE      0x0004
#define DCB_DISABLE     0x0008

#ifndef NOMETAFILE

/* Metafile Functions */
#define META_SETBKCOLOR              0x0201
#define META_SETBKMODE               0x0102
#define META_SETMAPMODE              0x0103
#define META_SETROP2                 0x0104
#define META_SETRELABS               0x0105
#define META_SETPOLYFILLMODE         0x0106
#define META_SETSTRETCHBLTMODE       0x0107
#define META_SETTEXTCHAREXTRA        0x0108
#define META_SETTEXTCOLOR            0x0209
#define META_SETTEXTJUSTIFICATION    0x020A
#define META_SETWINDOWORG            0x020B
#define META_SETWINDOWEXT            0x020C
#define META_SETVIEWPORTORG          0x020D
#define META_SETVIEWPORTEXT          0x020E
#define META_OFFSETWINDOWORG         0x020F
#define META_SCALEWINDOWEXT          0x0410
#define META_OFFSETVIEWPORTORG       0x0211
#define META_SCALEVIEWPORTEXT        0x0412
#define META_LINETO                  0x0213
#define META_MOVETO                  0x0214
#define META_EXCLUDECLIPRECT         0x0415
#define META_INTERSECTCLIPRECT       0x0416
#define META_ARC                     0x0817
#define META_ELLIPSE                 0x0418
#define META_FLOODFILL               0x0419
#define META_PIE                     0x081A
#define META_RECTANGLE               0x041B
#define META_ROUNDRECT               0x061C
#define META_PATBLT                  0x061D
#define META_SAVEDC                  0x001E
#define META_SETPIXEL                0x041F
#define META_OFFSETCLIPRGN           0x0220
#define META_TEXTOUT                 0x0521
#define META_BITBLT                  0x0922
#define META_STRETCHBLT              0x0B23
#define META_POLYGON                 0x0324
#define META_POLYLINE                0x0325
#define META_ESCAPE                  0x0626
#define META_RESTOREDC               0x0127
#define META_FILLREGION              0x0228
#define META_FRAMEREGION             0x0429
#define META_INVERTREGION            0x012A
#define META_PAINTREGION             0x012B
#define META_SELECTCLIPREGION        0x012C
#define META_SELECTOBJECT            0x012D
#define META_SETTEXTALIGN            0x012E
#define META_CHORD                   0x0830
#define META_SETMAPPERFLAGS          0x0231
#define META_EXTTEXTOUT              0x0a32
#define META_SETDIBTODEV             0x0d33
#define META_SELECTPALETTE           0x0234
#define META_REALIZEPALETTE          0x0035
#define META_ANIMATEPALETTE          0x0436
#define META_SETPALENTRIES           0x0037
#define META_POLYPOLYGON             0x0538
#define META_RESIZEPALETTE           0x0139
#define META_DIBBITBLT               0x0940
#define META_DIBSTRETCHBLT           0x0b41
#define META_DIBCREATEPATTERNBRUSH   0x0142
#define META_STRETCHDIB              0x0f43
#define META_EXTFLOODFILL            0x0548
#if(WINVER >= 0x0500)
#define META_SETLAYOUT               0x0149
#endif /* WINVER >= 0x0500 */
#define META_DELETEOBJECT            0x01f0
#define META_CREATEPALETTE           0x00f7
#define META_CREATEPATTERNBRUSH      0x01F9
#define META_CREATEPENINDIRECT       0x02FA
#define META_CREATEFONTINDIRECT      0x02FB
#define META_CREATEBRUSHINDIRECT     0x02FC
#define META_CREATEREGION            0x06FF

#if(WINVER >= 0x0400)
typedef struct _DRAWPATRECT {
        POINT ptPosition;
        POINT ptSize;
        WORD wStyle;
        WORD wPattern;
} DRAWPATRECT, *PDRAWPATRECT;
#endif /* WINVER >= 0x0400 */

#endif /* NOMETAFILE */

/* GDI Escapes */
#define NEWFRAME                     1
#define ABORTDOC                     2
#define NEXTBAND                     3
#define SETCOLORTABLE                4
#define GETCOLORTABLE                5
#define FLUSHOUTPUT                  6
#define DRAFTMODE                    7
#define QUERYESCSUPPORT              8
#define SETABORTPROC                 9
#define STARTDOC                     10
#define ENDDOC                       11
#define GETPHYSPAGESIZE              12
#define GETPRINTINGOFFSET            13
#define GETSCALINGFACTOR             14
#define MFCOMMENT                    15
#define GETPENWIDTH                  16
#define SETCOPYCOUNT                 17
#define SELECTPAPERSOURCE            18
#define DEVICEDATA                   19
#define PASSTHROUGH                  19
#define GETTECHNOLGY                 20
#define GETTECHNOLOGY                20
#define SETLINECAP                   21
#define SETLINEJOIN                  22
#define SETMITERLIMIT                23
#define BANDINFO                     24
#define DRAWPATTERNRECT              25
#define GETVECTORPENSIZE             26
#define GETVECTORBRUSHSIZE           27
#define ENABLEDUPLEX                 28
#define GETSETPAPERBINS              29
#define GETSETPRINTORIENT            30
#define ENUMPAPERBINS                31
#define SETDIBSCALING                32
#define EPSPRINTING                  33
#define ENUMPAPERMETRICS             34
#define GETSETPAPERMETRICS           35
#define POSTSCRIPT_DATA              37
#define POSTSCRIPT_IGNORE            38
#define MOUSETRAILS                  39
#define GETDEVICEUNITS               42

#define GETEXTENDEDTEXTMETRICS       256
#define GETEXTENTTABLE               257
#define GETPAIRKERNTABLE             258
#define GETTRACKKERNTABLE            259
#define EXTTEXTOUT                   512
#define GETFACENAME                  513
#define DOWNLOADFACE                 514
#define ENABLERELATIVEWIDTHS         768
#define ENABLEPAIRKERNING            769
#define SETKERNTRACK                 770
#define SETALLJUSTVALUES             771
#define SETCHARSET                   772

#define STRETCHBLT                   2048
#define METAFILE_DRIVER              2049
#define GETSETSCREENPARAMS           3072
#define QUERYDIBSUPPORT              3073
#define BEGIN_PATH                   4096
#define CLIP_TO_PATH                 4097
#define END_PATH                     4098
#define EXT_DEVICE_CAPS              4099
#define RESTORE_CTM                  4100
#define SAVE_CTM                     4101
#define SET_ARC_DIRECTION            4102
#define SET_BACKGROUND_COLOR         4103
#define SET_POLY_MODE                4104
#define SET_SCREEN_ANGLE             4105
#define SET_SPREAD                   4106
#define TRANSFORM_CTM                4107
#define SET_CLIP_BOX                 4108
#define SET_BOUNDS                   4109
#define SET_MIRROR_MODE              4110
#define OPENCHANNEL                  4110
#define DOWNLOADHEADER               4111
#define CLOSECHANNEL                 4112
#define POSTSCRIPT_PASSTHROUGH       4115
#define ENCAPSULATED_POSTSCRIPT      4116

#define POSTSCRIPT_IDENTIFY          4117   /* new escape for NT5 pscript driver */
#define POSTSCRIPT_INJECTION         4118   /* new escape for NT5 pscript driver */

#define CHECKJPEGFORMAT              4119
#define CHECKPNGFORMAT               4120

#define GET_PS_FEATURESETTING        4121   /* new escape for NT5 pscript driver */

#define GDIPLUS_TS_QUERYVER          4122   /* private escape */
#define GDIPLUS_TS_RECORD            4123   /* private escape */

/*
 * Return Values for MILCORE_TS_QUERYVER
 */

#if (_WIN32_WINNT >= _WIN32_WINNT_LONGHORN)
#define MILCORE_TS_QUERYVER_RESULT_FALSE        0x0
#define MILCORE_TS_QUERYVER_RESULT_TRUE  0x7FFFFFFF
#endif // (_WIN32_WINNT >= _WIN32_WINNT_LONGHORN)


#define SPCLPASSTHROUGH2             4568   /* new escape for NT5 pscript driver */

/*
 * Parameters for POSTSCRIPT_IDENTIFY escape
 */

#define PSIDENT_GDICENTRIC    0
#define PSIDENT_PSCENTRIC     1

/*
 * Header structure for the input buffer to POSTSCRIPT_INJECTION escape
 */

typedef struct _PSINJECTDATA {

    DWORD   DataBytes;      /* number of raw data bytes (NOT including this header) */
    WORD    InjectionPoint; /* injection point */
    WORD    PageNumber;     /* page number to apply the injection */

    /* Followed by raw data to be injected */

} PSINJECTDATA, *PPSINJECTDATA;

/*
 * Constants for PSINJECTDATA.InjectionPoint field
 */

#define PSINJECT_BEGINSTREAM                1
#define PSINJECT_PSADOBE                    2
#define PSINJECT_PAGESATEND                 3
#define PSINJECT_PAGES                      4

#define PSINJECT_DOCNEEDEDRES               5
#define PSINJECT_DOCSUPPLIEDRES             6
#define PSINJECT_PAGEORDER                  7
#define PSINJECT_ORIENTATION                8
#define PSINJECT_BOUNDINGBOX                9
#define PSINJECT_DOCUMENTPROCESSCOLORS      10

#define PSINJECT_COMMENTS                   11
#define PSINJECT_BEGINDEFAULTS              12
#define PSINJECT_ENDDEFAULTS                13
#define PSINJECT_BEGINPROLOG                14
#define PSINJECT_ENDPROLOG                  15
#define PSINJECT_BEGINSETUP                 16
#define PSINJECT_ENDSETUP                   17
#define PSINJECT_TRAILER                    18
#define PSINJECT_EOF                        19
#define PSINJECT_ENDSTREAM                  20
#define PSINJECT_DOCUMENTPROCESSCOLORSATEND 21

#define PSINJECT_PAGENUMBER                 100
#define PSINJECT_BEGINPAGESETUP             101
#define PSINJECT_ENDPAGESETUP               102
#define PSINJECT_PAGETRAILER                103
#define PSINJECT_PLATECOLOR                 104

#define PSINJECT_SHOWPAGE                   105
#define PSINJECT_PAGEBBOX                   106
#define PSINJECT_ENDPAGECOMMENTS            107

#define PSINJECT_VMSAVE                     200
#define PSINJECT_VMRESTORE                  201

/*
 * InjectionPoint for publisher mode PScript5 OEM plugin to
 * generate DSC comment for included font resource
 */
#define PSINJECT_DLFONT                     0xdddddddd

/*
 * Parameter for GET_PS_FEATURESETTING escape
 */

#define FEATURESETTING_NUP                  0
#define FEATURESETTING_OUTPUT               1
#define FEATURESETTING_PSLEVEL              2
#define FEATURESETTING_CUSTPAPER            3
#define FEATURESETTING_MIRROR               4
#define FEATURESETTING_NEGATIVE             5
#define FEATURESETTING_PROTOCOL             6

#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
//
// The range of selectors between FEATURESETTING_PRIVATE_BEGIN and
// FEATURESETTING_PRIVATE_END is reserved by Microsoft for private use
//
#define FEATURESETTING_PRIVATE_BEGIN 0x1000
#define FEATURESETTING_PRIVATE_END   0x1FFF
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WINXP)

/*
 * Information about output options
 */

typedef struct _PSFEATURE_OUTPUT {

    BOOL bPageIndependent;
    BOOL bSetPageDevice;

} PSFEATURE_OUTPUT, *PPSFEATURE_OUTPUT;

/*
 * Information about custom paper size
 */

typedef struct _PSFEATURE_CUSTPAPER {

    LONG lOrientation;
    LONG lWidth;
    LONG lHeight;
    LONG lWidthOffset;
    LONG lHeightOffset;

} PSFEATURE_CUSTPAPER, *PPSFEATURE_CUSTPAPER;

/* Value returned for FEATURESETTING_PROTOCOL */
#define PSPROTOCOL_ASCII             0
#define PSPROTOCOL_BCP               1
#define PSPROTOCOL_TBCP              2
#define PSPROTOCOL_BINARY            3

/* Flag returned from QUERYDIBSUPPORT */
#define QDI_SETDIBITS                1
#define QDI_GETDIBITS                2
#define QDI_DIBTOSCREEN              4
#define QDI_STRETCHDIB               8

/* Spooler Error Codes */
#define SP_NOTREPORTED               0x4000
#define SP_ERROR                     (-1)
#define SP_APPABORT                  (-2)
#define SP_USERABORT                 (-3)
#define SP_OUTOFDISK                 (-4)
#define SP_OUTOFMEMORY               (-5)

#define PR_JOBSTATUS                 0x0000

/* Object Definitions for EnumObjects() */
#define OBJ_PEN             1
#define OBJ_BRUSH           2
#define OBJ_DC              3
#define OBJ_METADC          4
#define OBJ_PAL             5
#define OBJ_FONT            6
#define OBJ_BITMAP          7
#define OBJ_REGION          8
#define OBJ_METAFILE        9
#define OBJ_MEMDC           10
#define OBJ_EXTPEN          11
#define OBJ_ENHMETADC       12
#define OBJ_ENHMETAFILE     13
#define OBJ_COLORSPACE      14

#define GDI_OBJ_LAST        OBJ_COLORSPACE

/* xform stuff */
#define MWT_IDENTITY        1
#define MWT_LEFTMULTIPLY    2
#define MWT_RIGHTMULTIPLY   3

#define MWT_MIN             MWT_IDENTITY
#define MWT_MAX             MWT_RIGHTMULTIPLY

#define _XFORM_
typedef struct  tagXFORM
  {
    FLOAT   eM11;
    FLOAT   eM12;
    FLOAT   eM21;
    FLOAT   eM22;
    FLOAT   eDx;
    FLOAT   eDy;
  } XFORM, *PXFORM, FAR *LPXFORM;

/* Bitmap Header Definition */
typedef struct tagBITMAP
  {
    LONG        bmType;
    LONG        bmWidth;
    LONG        bmHeight;
    LONG        bmWidthBytes;
    WORD        bmPlanes;
    WORD        bmBitsPixel;
    LPVOID      bmBits;
  } BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;

#include 
typedef struct tagRGBTRIPLE {
        BYTE    rgbtBlue;
        BYTE    rgbtGreen;
        BYTE    rgbtRed;
} RGBTRIPLE, *PRGBTRIPLE, NEAR *NPRGBTRIPLE, FAR *LPRGBTRIPLE;
#include 

typedef struct tagRGBQUAD {
        BYTE    rgbBlue;
        BYTE    rgbGreen;
        BYTE    rgbRed;
        BYTE    rgbReserved;
} RGBQUAD;
typedef RGBQUAD FAR* LPRGBQUAD;

#if(WINVER >= 0x0400)

/* Image Color Matching color definitions */

#define CS_ENABLE                       0x00000001L
#define CS_DISABLE                      0x00000002L
#define CS_DELETE_TRANSFORM             0x00000003L

/* Logcolorspace signature */

#define LCS_SIGNATURE           'PSOC'

/* Logcolorspace lcsType values */

#define LCS_sRGB                'sRGB'
#define LCS_WINDOWS_COLOR_SPACE 'Win '  // Windows default color space

typedef LONG   LCSCSTYPE;
#define LCS_CALIBRATED_RGB              0x00000000L

typedef LONG    LCSGAMUTMATCH;
#define LCS_GM_BUSINESS                 0x00000001L
#define LCS_GM_GRAPHICS                 0x00000002L
#define LCS_GM_IMAGES                   0x00000004L
#define LCS_GM_ABS_COLORIMETRIC         0x00000008L

/* ICM Defines for results from CheckColorInGamut() */
#define CM_OUT_OF_GAMUT                 255
#define CM_IN_GAMUT                     0

/* UpdateICMRegKey Constants               */
#define ICM_ADDPROFILE                  1
#define ICM_DELETEPROFILE               2
#define ICM_QUERYPROFILE                3
#define ICM_SETDEFAULTPROFILE           4
#define ICM_REGISTERICMATCHER           5
#define ICM_UNREGISTERICMATCHER         6
#define ICM_QUERYMATCH                  7

/* Macros to retrieve CMYK values from a COLORREF */
#define GetKValue(cmyk)      ((BYTE)(cmyk))
#define GetYValue(cmyk)      ((BYTE)((cmyk)>> 8))
#define GetMValue(cmyk)      ((BYTE)((cmyk)>>16))
#define GetCValue(cmyk)      ((BYTE)((cmyk)>>24))

#define CMYK(c,m,y,k)       ((COLORREF)((((BYTE)(k)|((WORD)((BYTE)(y))<<8))|(((DWORD)(BYTE)(m))<<16))|(((DWORD)(BYTE)(c))<<24))) typedef long FXPT16DOT16, FAR *LPFXPT16DOT16; typedef long FXPT2DOT30, FAR *LPFXPT2DOT30; /* ICM Color Definitions */ // The following two structures are used for defining RGB's in terms of CIEXYZ. typedef struct tagCIEXYZ { FXPT2DOT30 ciexyzX; FXPT2DOT30 ciexyzY; FXPT2DOT30 ciexyzZ; } CIEXYZ; typedef CIEXYZ FAR *LPCIEXYZ; typedef struct tagICEXYZTRIPLE { CIEXYZ ciexyzRed; CIEXYZ ciexyzGreen; CIEXYZ ciexyzBlue; } CIEXYZTRIPLE; typedef CIEXYZTRIPLE FAR *LPCIEXYZTRIPLE; // The next structures the logical color space. Unlike pens and brushes, // but like palettes, there is only one way to create a LogColorSpace. // A pointer to it must be passed, its elements can't be pushed as // arguments. typedef struct tagLOGCOLORSPACEA { DWORD lcsSignature; DWORD lcsVersion; DWORD lcsSize; LCSCSTYPE lcsCSType; LCSGAMUTMATCH lcsIntent; CIEXYZTRIPLE lcsEndpoints; DWORD lcsGammaRed; DWORD lcsGammaGreen; DWORD lcsGammaBlue; CHAR lcsFilename[MAX_PATH]; } LOGCOLORSPACEA, *LPLOGCOLORSPACEA; typedef struct tagLOGCOLORSPACEW { DWORD lcsSignature; DWORD lcsVersion; DWORD lcsSize; LCSCSTYPE lcsCSType; LCSGAMUTMATCH lcsIntent; CIEXYZTRIPLE lcsEndpoints; DWORD lcsGammaRed; DWORD lcsGammaGreen; DWORD lcsGammaBlue; WCHAR lcsFilename[MAX_PATH]; } LOGCOLORSPACEW, *LPLOGCOLORSPACEW; #ifdef UNICODE typedef LOGCOLORSPACEW LOGCOLORSPACE; typedef LPLOGCOLORSPACEW LPLOGCOLORSPACE; #else typedef LOGCOLORSPACEA LOGCOLORSPACE; typedef LPLOGCOLORSPACEA LPLOGCOLORSPACE; #endif // UNICODE #endif /* WINVER >= 0x0400 */

/* structures for defining DIBs */
typedef struct tagBITMAPCOREHEADER {
        DWORD   bcSize;                 /* used to get to color table */
        WORD    bcWidth;
        WORD    bcHeight;
        WORD    bcPlanes;
        WORD    bcBitCount;
} BITMAPCOREHEADER, FAR *LPBITMAPCOREHEADER, *PBITMAPCOREHEADER;

typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;
        LONG       biWidth;
        LONG       biHeight;
        WORD       biPlanes;
        WORD       biBitCount;
        DWORD      biCompression;
        DWORD      biSizeImage;
        LONG       biXPelsPerMeter;
        LONG       biYPelsPerMeter;
        DWORD      biClrUsed;
        DWORD      biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

#if(WINVER >= 0x0400)
typedef struct {
        DWORD        bV4Size;
        LONG         bV4Width;
        LONG         bV4Height;
        WORD         bV4Planes;
        WORD         bV4BitCount;
        DWORD        bV4V4Compression;
        DWORD        bV4SizeImage;
        LONG         bV4XPelsPerMeter;
        LONG         bV4YPelsPerMeter;
        DWORD        bV4ClrUsed;
        DWORD        bV4ClrImportant;
        DWORD        bV4RedMask;
        DWORD        bV4GreenMask;
        DWORD        bV4BlueMask;
        DWORD        bV4AlphaMask;
        DWORD        bV4CSType;
        CIEXYZTRIPLE bV4Endpoints;
        DWORD        bV4GammaRed;
        DWORD        bV4GammaGreen;
        DWORD        bV4GammaBlue;
} BITMAPV4HEADER, FAR *LPBITMAPV4HEADER, *PBITMAPV4HEADER;
#endif /* WINVER >= 0x0400 */

#if (WINVER >= 0x0500)
typedef struct {
        DWORD        bV5Size;
        LONG         bV5Width;
        LONG         bV5Height;
        WORD         bV5Planes;
        WORD         bV5BitCount;
        DWORD        bV5Compression;
        DWORD        bV5SizeImage;
        LONG         bV5XPelsPerMeter;
        LONG         bV5YPelsPerMeter;
        DWORD        bV5ClrUsed;
        DWORD        bV5ClrImportant;
        DWORD        bV5RedMask;
        DWORD        bV5GreenMask;
        DWORD        bV5BlueMask;
        DWORD        bV5AlphaMask;
        DWORD        bV5CSType;
        CIEXYZTRIPLE bV5Endpoints;
        DWORD        bV5GammaRed;
        DWORD        bV5GammaGreen;
        DWORD        bV5GammaBlue;
        DWORD        bV5Intent;
        DWORD        bV5ProfileData;
        DWORD        bV5ProfileSize;
        DWORD        bV5Reserved;
} BITMAPV5HEADER, FAR *LPBITMAPV5HEADER, *PBITMAPV5HEADER;

// Values for bV5CSType
#define PROFILE_LINKED          'LINK'
#define PROFILE_EMBEDDED        'MBED'
#endif

/* constants for the biCompression field */
#define BI_RGB        0L
#define BI_RLE8       1L
#define BI_RLE4       2L
#define BI_BITFIELDS  3L
#define BI_JPEG       4L
#define BI_PNG        5L
#if (_WIN32_WINNT >= _WIN32_WINNT_NT4)
#endif

typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD             bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;

typedef struct tagBITMAPCOREINFO {
    BITMAPCOREHEADER    bmciHeader;
    RGBTRIPLE           bmciColors[1];
} BITMAPCOREINFO, FAR *LPBITMAPCOREINFO, *PBITMAPCOREINFO;

#include 
typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
#include 

#define MAKEPOINTS(l)       (*((POINTS FAR *)&(l)))

#if(WINVER >= 0x0400)
#ifndef NOFONTSIG
typedef struct tagFONTSIGNATURE
{
    DWORD fsUsb[4];
    DWORD fsCsb[2];
} FONTSIGNATURE, *PFONTSIGNATURE,FAR *LPFONTSIGNATURE;

typedef struct tagCHARSETINFO
{
    UINT ciCharset;
    UINT ciACP;
    FONTSIGNATURE fs;
} CHARSETINFO, *PCHARSETINFO, NEAR *NPCHARSETINFO, FAR *LPCHARSETINFO;

#define TCI_SRCCHARSET  1
#define TCI_SRCCODEPAGE 2
#define TCI_SRCFONTSIG  3
#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
#define TCI_SRCLOCALE   0x1000
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WINXP)

typedef struct tagLOCALESIGNATURE
{
    DWORD lsUsb[4];
    DWORD lsCsbDefault[2];
    DWORD lsCsbSupported[2];
} LOCALESIGNATURE, *PLOCALESIGNATURE,FAR *LPLOCALESIGNATURE;


#endif
#endif /* WINVER >= 0x0400 */

#ifndef NOMETAFILE

/* Clipboard Metafile Picture Structure */
typedef struct tagHANDLETABLE
  {
    HGDIOBJ     objectHandle[1];
  } HANDLETABLE, *PHANDLETABLE, FAR *LPHANDLETABLE;

typedef struct tagMETARECORD
  {
    DWORD       rdSize;
    WORD        rdFunction;
    WORD        rdParm[1];
  } METARECORD;
typedef struct tagMETARECORD UNALIGNED *PMETARECORD;
typedef struct tagMETARECORD UNALIGNED FAR *LPMETARECORD;

typedef struct tagMETAFILEPICT
  {
    LONG        mm;
    LONG        xExt;
    LONG        yExt;
    HMETAFILE   hMF;
  } METAFILEPICT, FAR *LPMETAFILEPICT;

#include 
typedef struct tagMETAHEADER
{
    WORD        mtType;
    WORD        mtHeaderSize;
    WORD        mtVersion;
    DWORD       mtSize;
    WORD        mtNoObjects;
    DWORD       mtMaxRecord;
    WORD        mtNoParameters;
} METAHEADER;
typedef struct tagMETAHEADER UNALIGNED *PMETAHEADER;
typedef struct tagMETAHEADER UNALIGNED FAR *LPMETAHEADER;

#include 

/* Enhanced Metafile structures */
typedef struct tagENHMETARECORD
{
    DWORD   iType;              // Record type EMR_XXX
    DWORD   nSize;              // Record size in bytes
    DWORD   dParm[1];           // Parameters
} ENHMETARECORD, *PENHMETARECORD, *LPENHMETARECORD;

typedef struct tagENHMETAHEADER
{
    DWORD   iType;              // Record typeEMR_HEADER
    DWORD   nSize;              // Record size in bytes.  This may be greater
                                // than the sizeof(ENHMETAHEADER).
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    RECTL   rclFrame;           // Inclusive-inclusive Picture Frame of metafile in .01 mm units
    DWORD   dSignature;         // Signature.  Must be ENHMETA_SIGNATURE.
    DWORD   nVersion;           // Version number
    DWORD   nBytes;             // Size of the metafile in bytes
    DWORD   nRecords;           // Number of records in the metafile
    WORD    nHandles;           // Number of handles in the handle table
                                // Handle index zero is reserved.
    WORD    sReserved;          // Reserved.  Must be zero.
    DWORD   nDescription;       // Number of chars in the unicode description string
                                // This is 0 if there is no description string
    DWORD   offDescription;     // Offset to the metafile description record.
                                // This is 0 if there is no description string
    DWORD   nPalEntries;        // Number of entries in the metafile palette.
    SIZEL   szlDevice;          // Size of the reference device in pels
    SIZEL   szlMillimeters;     // Size of the reference device in millimeters
#if(WINVER >= 0x0400)
    DWORD   cbPixelFormat;      // Size of PIXELFORMATDESCRIPTOR information
                                // This is 0 if no pixel format is set
    DWORD   offPixelFormat;     // Offset to PIXELFORMATDESCRIPTOR
                                // This is 0 if no pixel format is set
    DWORD   bOpenGL;            // TRUE if OpenGL commands are present in
                                // the metafile, otherwise FALSE
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0500)
    SIZEL   szlMicrometers;     // Size of the reference device in micrometers
#endif /* WINVER >= 0x0500 */

} ENHMETAHEADER, *PENHMETAHEADER, *LPENHMETAHEADER;

#endif /* NOMETAFILE */

#ifndef NOTEXTMETRIC

/* tmPitchAndFamily flags */
#define TMPF_FIXED_PITCH    0x01
#define TMPF_VECTOR             0x02
#define TMPF_DEVICE             0x08
#define TMPF_TRUETYPE       0x04

//
// BCHAR definition for APPs
//
#ifdef UNICODE
    typedef WCHAR BCHAR;
#else
    typedef BYTE BCHAR;
#endif

#ifndef _TEXTMETRIC_DEFINED
#define _TEXTMETRIC_DEFINED
#include 
typedef struct tagTEXTMETRICA
{
    LONG        tmHeight;
    LONG        tmAscent;
    LONG        tmDescent;
    LONG        tmInternalLeading;
    LONG        tmExternalLeading;
    LONG        tmAveCharWidth;
    LONG        tmMaxCharWidth;
    LONG        tmWeight;
    LONG        tmOverhang;
    LONG        tmDigitizedAspectX;
    LONG        tmDigitizedAspectY;
    BYTE        tmFirstChar;
    BYTE        tmLastChar;
    BYTE        tmDefaultChar;
    BYTE        tmBreakChar;
    BYTE        tmItalic;
    BYTE        tmUnderlined;
    BYTE        tmStruckOut;
    BYTE        tmPitchAndFamily;
    BYTE        tmCharSet;
} TEXTMETRICA, *PTEXTMETRICA, NEAR *NPTEXTMETRICA, FAR *LPTEXTMETRICA;
typedef struct tagTEXTMETRICW
{
    LONG        tmHeight;
    LONG        tmAscent;
    LONG        tmDescent;
    LONG        tmInternalLeading;
    LONG        tmExternalLeading;
    LONG        tmAveCharWidth;
    LONG        tmMaxCharWidth;
    LONG        tmWeight;
    LONG        tmOverhang;
    LONG        tmDigitizedAspectX;
    LONG        tmDigitizedAspectY;
    WCHAR       tmFirstChar;
    WCHAR       tmLastChar;
    WCHAR       tmDefaultChar;
    WCHAR       tmBreakChar;
    BYTE        tmItalic;
    BYTE        tmUnderlined;
    BYTE        tmStruckOut;
    BYTE        tmPitchAndFamily;
    BYTE        tmCharSet;
} TEXTMETRICW, *PTEXTMETRICW, NEAR *NPTEXTMETRICW, FAR *LPTEXTMETRICW;
#ifdef UNICODE
typedef TEXTMETRICW TEXTMETRIC;
typedef PTEXTMETRICW PTEXTMETRIC;
typedef NPTEXTMETRICW NPTEXTMETRIC;
typedef LPTEXTMETRICW LPTEXTMETRIC;
#else
typedef TEXTMETRICA TEXTMETRIC;
typedef PTEXTMETRICA PTEXTMETRIC;
typedef NPTEXTMETRICA NPTEXTMETRIC;
typedef LPTEXTMETRICA LPTEXTMETRIC;
#endif // UNICODE
#include 
#endif // !_TEXTMETRIC_DEFINED

/* ntmFlags field flags */
#define NTM_REGULAR     0x00000040L
#define NTM_BOLD        0x00000020L
#define NTM_ITALIC      0x00000001L

/* new in NT 5.0 */

#define NTM_NONNEGATIVE_AC  0x00010000
#define NTM_PS_OPENTYPE     0x00020000
#define NTM_TT_OPENTYPE     0x00040000
#define NTM_MULTIPLEMASTER  0x00080000
#define NTM_TYPE1           0x00100000
#define NTM_DSIG            0x00200000

#include 
typedef struct tagNEWTEXTMETRICA
{
    LONG        tmHeight;
    LONG        tmAscent;
    LONG        tmDescent;
    LONG        tmInternalLeading;
    LONG        tmExternalLeading;
    LONG        tmAveCharWidth;
    LONG        tmMaxCharWidth;
    LONG        tmWeight;
    LONG        tmOverhang;
    LONG        tmDigitizedAspectX;
    LONG        tmDigitizedAspectY;
    BYTE        tmFirstChar;
    BYTE        tmLastChar;
    BYTE        tmDefaultChar;
    BYTE        tmBreakChar;
    BYTE        tmItalic;
    BYTE        tmUnderlined;
    BYTE        tmStruckOut;
    BYTE        tmPitchAndFamily;
    BYTE        tmCharSet;
    DWORD   ntmFlags;
    UINT    ntmSizeEM;
    UINT    ntmCellHeight;
    UINT    ntmAvgWidth;
} NEWTEXTMETRICA, *PNEWTEXTMETRICA, NEAR *NPNEWTEXTMETRICA, FAR *LPNEWTEXTMETRICA;
typedef struct tagNEWTEXTMETRICW
{
    LONG        tmHeight;
    LONG        tmAscent;
    LONG        tmDescent;
    LONG        tmInternalLeading;
    LONG        tmExternalLeading;
    LONG        tmAveCharWidth;
    LONG        tmMaxCharWidth;
    LONG        tmWeight;
    LONG        tmOverhang;
    LONG        tmDigitizedAspectX;
    LONG        tmDigitizedAspectY;
    WCHAR       tmFirstChar;
    WCHAR       tmLastChar;
    WCHAR       tmDefaultChar;
    WCHAR       tmBreakChar;
    BYTE        tmItalic;
    BYTE        tmUnderlined;
    BYTE        tmStruckOut;
    BYTE        tmPitchAndFamily;
    BYTE        tmCharSet;
    DWORD   ntmFlags;
    UINT    ntmSizeEM;
    UINT    ntmCellHeight;
    UINT    ntmAvgWidth;
} NEWTEXTMETRICW, *PNEWTEXTMETRICW, NEAR *NPNEWTEXTMETRICW, FAR *LPNEWTEXTMETRICW;
#ifdef UNICODE
typedef NEWTEXTMETRICW NEWTEXTMETRIC;
typedef PNEWTEXTMETRICW PNEWTEXTMETRIC;
typedef NPNEWTEXTMETRICW NPNEWTEXTMETRIC;
typedef LPNEWTEXTMETRICW LPNEWTEXTMETRIC;
#else
typedef NEWTEXTMETRICA NEWTEXTMETRIC;
typedef PNEWTEXTMETRICA PNEWTEXTMETRIC;
typedef NPNEWTEXTMETRICA NPNEWTEXTMETRIC;
typedef LPNEWTEXTMETRICA LPNEWTEXTMETRIC;
#endif // UNICODE
#include 

#if(WINVER >= 0x0400)
typedef struct tagNEWTEXTMETRICEXA
{
    NEWTEXTMETRICA  ntmTm;
    FONTSIGNATURE   ntmFontSig;
}NEWTEXTMETRICEXA;
typedef struct tagNEWTEXTMETRICEXW
{
    NEWTEXTMETRICW  ntmTm;
    FONTSIGNATURE   ntmFontSig;
}NEWTEXTMETRICEXW;
#ifdef UNICODE
typedef NEWTEXTMETRICEXW NEWTEXTMETRICEX;
#else
typedef NEWTEXTMETRICEXA NEWTEXTMETRICEX;
#endif // UNICODE
#endif /* WINVER >= 0x0400 */

#endif /* NOTEXTMETRIC */
/* GDI Logical Objects: */

/* Pel Array */
typedef struct tagPELARRAY
  {
    LONG        paXCount;
    LONG        paYCount;
    LONG        paXExt;
    LONG        paYExt;
    BYTE        paRGBs;
  } PELARRAY, *PPELARRAY, NEAR *NPPELARRAY, FAR *LPPELARRAY;

/* Logical Brush (or Pattern) */
typedef struct tagLOGBRUSH
  {
    UINT        lbStyle;
    COLORREF    lbColor;
    ULONG_PTR   lbHatch;
  } LOGBRUSH, *PLOGBRUSH, NEAR *NPLOGBRUSH, FAR *LPLOGBRUSH;

typedef struct tagLOGBRUSH32
  {
    UINT        lbStyle;
    COLORREF    lbColor;
    ULONG       lbHatch;
  } LOGBRUSH32, *PLOGBRUSH32, NEAR *NPLOGBRUSH32, FAR *LPLOGBRUSH32;

typedef LOGBRUSH            PATTERN;
typedef PATTERN             *PPATTERN;
typedef PATTERN NEAR        *NPPATTERN;
typedef PATTERN FAR         *LPPATTERN;

/* Logical Pen */
typedef struct tagLOGPEN
  {
    UINT        lopnStyle;
    POINT       lopnWidth;
    COLORREF    lopnColor;
  } LOGPEN, *PLOGPEN, NEAR *NPLOGPEN, FAR *LPLOGPEN;

typedef struct tagEXTLOGPEN {
    DWORD       elpPenStyle;
    DWORD       elpWidth;
    UINT        elpBrushStyle;
    COLORREF    elpColor;
    ULONG_PTR   elpHatch;
    DWORD       elpNumEntries;
    DWORD       elpStyleEntry[1];
} EXTLOGPEN, *PEXTLOGPEN, NEAR *NPEXTLOGPEN, FAR *LPEXTLOGPEN;

typedef struct tagEXTLOGPEN32 {
    DWORD       elpPenStyle;
    DWORD       elpWidth;
    UINT        elpBrushStyle;
    COLORREF    elpColor;
    ULONG       elpHatch;
    DWORD       elpNumEntries;
    DWORD       elpStyleEntry[1];
} EXTLOGPEN32, *PEXTLOGPEN32, NEAR *NPEXTLOGPEN32, FAR *LPEXTLOGPEN32;

#ifndef _PALETTEENTRY_DEFINED
#define _PALETTEENTRY_DEFINED
typedef struct tagPALETTEENTRY {
    BYTE        peRed;
    BYTE        peGreen;
    BYTE        peBlue;
    BYTE        peFlags;
} PALETTEENTRY, *PPALETTEENTRY, FAR *LPPALETTEENTRY;
#endif // !_PALETTEENTRY_DEFINED

#ifndef _LOGPALETTE_DEFINED
#define _LOGPALETTE_DEFINED
/* Logical Palette */
typedef struct tagLOGPALETTE {
    WORD        palVersion;
    WORD        palNumEntries;
    __field_ecount_opt(palNumEntries) PALETTEENTRY        palPalEntry[1];
} LOGPALETTE, *PLOGPALETTE, NEAR *NPLOGPALETTE, FAR *LPLOGPALETTE;
#endif // !_LOGPALETTE_DEFINED


/* Logical Font */
#define LF_FACESIZE         32

typedef struct tagLOGFONTA
{
    LONG      lfHeight;
    LONG      lfWidth;
    LONG      lfEscapement;
    LONG      lfOrientation;
    LONG      lfWeight;
    BYTE      lfItalic;
    BYTE      lfUnderline;
    BYTE      lfStrikeOut;
    BYTE      lfCharSet;
    BYTE      lfOutPrecision;
    BYTE      lfClipPrecision;
    BYTE      lfQuality;
    BYTE      lfPitchAndFamily;
    CHAR      lfFaceName[LF_FACESIZE];
} LOGFONTA, *PLOGFONTA, NEAR *NPLOGFONTA, FAR *LPLOGFONTA;
typedef struct tagLOGFONTW
{
    LONG      lfHeight;
    LONG      lfWidth;
    LONG      lfEscapement;
    LONG      lfOrientation;
    LONG      lfWeight;
    BYTE      lfItalic;
    BYTE      lfUnderline;
    BYTE      lfStrikeOut;
    BYTE      lfCharSet;
    BYTE      lfOutPrecision;
    BYTE      lfClipPrecision;
    BYTE      lfQuality;
    BYTE      lfPitchAndFamily;
    WCHAR     lfFaceName[LF_FACESIZE];
} LOGFONTW, *PLOGFONTW, NEAR *NPLOGFONTW, FAR *LPLOGFONTW;
#ifdef UNICODE
typedef LOGFONTW LOGFONT;
typedef PLOGFONTW PLOGFONT;
typedef NPLOGFONTW NPLOGFONT;
typedef LPLOGFONTW LPLOGFONT;
#else
typedef LOGFONTA LOGFONT;
typedef PLOGFONTA PLOGFONT;
typedef NPLOGFONTA NPLOGFONT;
typedef LPLOGFONTA LPLOGFONT;
#endif // UNICODE

#define LF_FULLFACESIZE     64

/* Structure passed to FONTENUMPROC */
typedef struct tagENUMLOGFONTA
{
    LOGFONTA elfLogFont;
    BYTE     elfFullName[LF_FULLFACESIZE];
    BYTE     elfStyle[LF_FACESIZE];
} ENUMLOGFONTA, FAR* LPENUMLOGFONTA;
/* Structure passed to FONTENUMPROC */
typedef struct tagENUMLOGFONTW
{
    LOGFONTW elfLogFont;
    WCHAR    elfFullName[LF_FULLFACESIZE];
    WCHAR    elfStyle[LF_FACESIZE];
} ENUMLOGFONTW, FAR* LPENUMLOGFONTW;
#ifdef UNICODE
typedef ENUMLOGFONTW ENUMLOGFONT;
typedef LPENUMLOGFONTW LPENUMLOGFONT;
#else
typedef ENUMLOGFONTA ENUMLOGFONT;
typedef LPENUMLOGFONTA LPENUMLOGFONT;
#endif // UNICODE

#if(WINVER >= 0x0400)
typedef struct tagENUMLOGFONTEXA
{
    LOGFONTA    elfLogFont;
    BYTE        elfFullName[LF_FULLFACESIZE];
    BYTE        elfStyle[LF_FACESIZE];
    BYTE        elfScript[LF_FACESIZE];
} ENUMLOGFONTEXA, FAR *LPENUMLOGFONTEXA;
typedef struct tagENUMLOGFONTEXW
{
    LOGFONTW    elfLogFont;
    WCHAR       elfFullName[LF_FULLFACESIZE];
    WCHAR       elfStyle[LF_FACESIZE];
    WCHAR       elfScript[LF_FACESIZE];
} ENUMLOGFONTEXW, FAR *LPENUMLOGFONTEXW;
#ifdef UNICODE
typedef ENUMLOGFONTEXW ENUMLOGFONTEX;
typedef LPENUMLOGFONTEXW LPENUMLOGFONTEX;
#else
typedef ENUMLOGFONTEXA ENUMLOGFONTEX;
typedef LPENUMLOGFONTEXA LPENUMLOGFONTEX;
#endif // UNICODE
#endif /* WINVER >= 0x0400 */

#define OUT_DEFAULT_PRECIS          0
#define OUT_STRING_PRECIS           1
#define OUT_CHARACTER_PRECIS        2
#define OUT_STROKE_PRECIS           3
#define OUT_TT_PRECIS               4
#define OUT_DEVICE_PRECIS           5
#define OUT_RASTER_PRECIS           6
#define OUT_TT_ONLY_PRECIS          7
#define OUT_OUTLINE_PRECIS          8
#define OUT_SCREEN_OUTLINE_PRECIS   9
#define OUT_PS_ONLY_PRECIS          10

#define CLIP_DEFAULT_PRECIS     0
#define CLIP_CHARACTER_PRECIS   1
#define CLIP_STROKE_PRECIS      2
#define CLIP_MASK               0xf
#define CLIP_LH_ANGLES          (1<<4)
#define CLIP_TT_ALWAYS          (2<<4) #if (_WIN32_WINNT >= _WIN32_WINNT_LONGHORN)
#define CLIP_DFA_DISABLE        (4<<4) #endif // (_WIN32_WINNT >= _WIN32_WINNT_LONGHORN)
#define CLIP_EMBEDDED           (8<<4) #define DEFAULT_QUALITY 0 #define DRAFT_QUALITY 1 #define PROOF_QUALITY 2 #if(WINVER >= 0x0400)
#define NONANTIALIASED_QUALITY  3
#define ANTIALIASED_QUALITY     4
#endif /* WINVER >= 0x0400 */

#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
#define CLEARTYPE_QUALITY       5
#define CLEARTYPE_NATURAL_QUALITY       6
#endif

#define DEFAULT_PITCH           0
#define FIXED_PITCH             1
#define VARIABLE_PITCH          2
#if(WINVER >= 0x0400)
#define MONO_FONT               8
#endif /* WINVER >= 0x0400 */

#define ANSI_CHARSET            0
#define DEFAULT_CHARSET         1
#define SYMBOL_CHARSET          2
#define SHIFTJIS_CHARSET        128
#define HANGEUL_CHARSET         129
#define HANGUL_CHARSET          129
#define GB2312_CHARSET          134
#define CHINESEBIG5_CHARSET     136
#define OEM_CHARSET             255
#if(WINVER >= 0x0400)
#define JOHAB_CHARSET           130
#define HEBREW_CHARSET          177
#define ARABIC_CHARSET          178
#define GREEK_CHARSET           161
#define TURKISH_CHARSET         162
#define VIETNAMESE_CHARSET      163
#define THAI_CHARSET            222
#define EASTEUROPE_CHARSET      238
#define RUSSIAN_CHARSET         204

#define MAC_CHARSET             77
#define BALTIC_CHARSET          186

#define FS_LATIN1               0x00000001L
#define FS_LATIN2               0x00000002L
#define FS_CYRILLIC             0x00000004L
#define FS_GREEK                0x00000008L
#define FS_TURKISH              0x00000010L
#define FS_HEBREW               0x00000020L
#define FS_ARABIC               0x00000040L
#define FS_BALTIC               0x00000080L
#define FS_VIETNAMESE           0x00000100L
#define FS_THAI                 0x00010000L
#define FS_JISJAPAN             0x00020000L
#define FS_CHINESESIMP          0x00040000L
#define FS_WANSUNG              0x00080000L
#define FS_CHINESETRAD          0x00100000L
#define FS_JOHAB                0x00200000L
#define FS_SYMBOL               0x80000000L
#endif /* WINVER >= 0x0400 */

/* Font Families */
#define FF_DONTCARE         (0<<4)  /* Don't care or don't know. */
#define FF_ROMAN            (1<<4)  /* Variable stroke width, serifed. */
                                    /* Times Roman, Century Schoolbook, etc. */
#define FF_SWISS            (2<<4)  /* Variable stroke width, sans-serifed. */
                                    /* Helvetica, Swiss, etc. */
#define FF_MODERN           (3<<4)  /* Constant stroke width, serifed or sans-serifed. */
                                    /* Pica, Elite, Courier, etc. */
#define FF_SCRIPT           (4<<4)  /* Cursive, etc. */
#define FF_DECORATIVE       (5<<4)  /* Old English, etc. */

/* Font Weights */
#define FW_DONTCARE         0
#define FW_THIN             100
#define FW_EXTRALIGHT       200
#define FW_LIGHT            300
#define FW_NORMAL           400
#define FW_MEDIUM           500
#define FW_SEMIBOLD         600
#define FW_BOLD             700
#define FW_EXTRABOLD        800
#define FW_HEAVY            900

#define FW_ULTRALIGHT       FW_EXTRALIGHT
#define FW_REGULAR          FW_NORMAL
#define FW_DEMIBOLD         FW_SEMIBOLD
#define FW_ULTRABOLD        FW_EXTRABOLD
#define FW_BLACK            FW_HEAVY

#define PANOSE_COUNT               10
#define PAN_FAMILYTYPE_INDEX        0
#define PAN_SERIFSTYLE_INDEX        1
#define PAN_WEIGHT_INDEX            2
#define PAN_PROPORTION_INDEX        3
#define PAN_CONTRAST_INDEX          4
#define PAN_STROKEVARIATION_INDEX   5
#define PAN_ARMSTYLE_INDEX          6
#define PAN_LETTERFORM_INDEX        7
#define PAN_MIDLINE_INDEX           8
#define PAN_XHEIGHT_INDEX           9

#define PAN_CULTURE_LATIN           0

typedef struct tagPANOSE
{
    BYTE    bFamilyType;
    BYTE    bSerifStyle;
    BYTE    bWeight;
    BYTE    bProportion;
    BYTE    bContrast;
    BYTE    bStrokeVariation;
    BYTE    bArmStyle;
    BYTE    bLetterform;
    BYTE    bMidline;
    BYTE    bXHeight;
} PANOSE, * LPPANOSE;

#define PAN_ANY                         0 /* Any                            */
#define PAN_NO_FIT                      1 /* No Fit                         */

#define PAN_FAMILY_TEXT_DISPLAY         2 /* Text and Display               */
#define PAN_FAMILY_SCRIPT               3 /* Script                         */
#define PAN_FAMILY_DECORATIVE           4 /* Decorative                     */
#define PAN_FAMILY_PICTORIAL            5 /* Pictorial                      */

#define PAN_SERIF_COVE                  2 /* Cove                           */
#define PAN_SERIF_OBTUSE_COVE           3 /* Obtuse Cove                    */
#define PAN_SERIF_SQUARE_COVE           4 /* Square Cove                    */
#define PAN_SERIF_OBTUSE_SQUARE_COVE    5 /* Obtuse Square Cove             */
#define PAN_SERIF_SQUARE                6 /* Square                         */
#define PAN_SERIF_THIN                  7 /* Thin                           */
#define PAN_SERIF_BONE                  8 /* Bone                           */
#define PAN_SERIF_EXAGGERATED           9 /* Exaggerated                    */
#define PAN_SERIF_TRIANGLE             10 /* Triangle                       */
#define PAN_SERIF_NORMAL_SANS          11 /* Normal Sans                    */
#define PAN_SERIF_OBTUSE_SANS          12 /* Obtuse Sans                    */
#define PAN_SERIF_PERP_SANS            13 /* Prep Sans                      */
#define PAN_SERIF_FLARED               14 /* Flared                         */
#define PAN_SERIF_ROUNDED              15 /* Rounded                        */

#define PAN_WEIGHT_VERY_LIGHT           2 /* Very Light                     */
#define PAN_WEIGHT_LIGHT                3 /* Light                          */
#define PAN_WEIGHT_THIN                 4 /* Thin                           */
#define PAN_WEIGHT_BOOK                 5 /* Book                           */
#define PAN_WEIGHT_MEDIUM               6 /* Medium                         */
#define PAN_WEIGHT_DEMI                 7 /* Demi                           */
#define PAN_WEIGHT_BOLD                 8 /* Bold                           */
#define PAN_WEIGHT_HEAVY                9 /* Heavy                          */
#define PAN_WEIGHT_BLACK               10 /* Black                          */
#define PAN_WEIGHT_NORD                11 /* Nord                           */

#define PAN_PROP_OLD_STYLE              2 /* Old Style                      */
#define PAN_PROP_MODERN                 3 /* Modern                         */
#define PAN_PROP_EVEN_WIDTH             4 /* Even Width                     */
#define PAN_PROP_EXPANDED               5 /* Expanded                       */
#define PAN_PROP_CONDENSED              6 /* Condensed                      */
#define PAN_PROP_VERY_EXPANDED          7 /* Very Expanded                  */
#define PAN_PROP_VERY_CONDENSED         8 /* Very Condensed                 */
#define PAN_PROP_MONOSPACED             9 /* Monospaced                     */

#define PAN_CONTRAST_NONE               2 /* None                           */
#define PAN_CONTRAST_VERY_LOW           3 /* Very Low                       */
#define PAN_CONTRAST_LOW                4 /* Low                            */
#define PAN_CONTRAST_MEDIUM_LOW         5 /* Medium Low                     */
#define PAN_CONTRAST_MEDIUM             6 /* Medium                         */
#define PAN_CONTRAST_MEDIUM_HIGH        7 /* Mediim High                    */
#define PAN_CONTRAST_HIGH               8 /* High                           */
#define PAN_CONTRAST_VERY_HIGH          9 /* Very High                      */

#define PAN_STROKE_GRADUAL_DIAG         2 /* Gradual/Diagonal               */
#define PAN_STROKE_GRADUAL_TRAN         3 /* Gradual/Transitional           */
#define PAN_STROKE_GRADUAL_VERT         4 /* Gradual/Vertical               */
#define PAN_STROKE_GRADUAL_HORZ         5 /* Gradual/Horizontal             */
#define PAN_STROKE_RAPID_VERT           6 /* Rapid/Vertical                 */
#define PAN_STROKE_RAPID_HORZ           7 /* Rapid/Horizontal               */
#define PAN_STROKE_INSTANT_VERT         8 /* Instant/Vertical               */

#define PAN_STRAIGHT_ARMS_HORZ          2 /* Straight Arms/Horizontal       */
#define PAN_STRAIGHT_ARMS_WEDGE         3 /* Straight Arms/Wedge            */
#define PAN_STRAIGHT_ARMS_VERT          4 /* Straight Arms/Vertical         */
#define PAN_STRAIGHT_ARMS_SINGLE_SERIF  5 /* Straight Arms/Single-Serif     */
#define PAN_STRAIGHT_ARMS_DOUBLE_SERIF  6 /* Straight Arms/Double-Serif     */
#define PAN_BENT_ARMS_HORZ              7 /* Non-Straight Arms/Horizontal   */
#define PAN_BENT_ARMS_WEDGE             8 /* Non-Straight Arms/Wedge        */
#define PAN_BENT_ARMS_VERT              9 /* Non-Straight Arms/Vertical     */
#define PAN_BENT_ARMS_SINGLE_SERIF     10 /* Non-Straight Arms/Single-Serif */
#define PAN_BENT_ARMS_DOUBLE_SERIF     11 /* Non-Straight Arms/Double-Serif */

#define PAN_LETT_NORMAL_CONTACT         2 /* Normal/Contact                 */
#define PAN_LETT_NORMAL_WEIGHTED        3 /* Normal/Weighted                */
#define PAN_LETT_NORMAL_BOXED           4 /* Normal/Boxed                   */
#define PAN_LETT_NORMAL_FLATTENED       5 /* Normal/Flattened               */
#define PAN_LETT_NORMAL_ROUNDED         6 /* Normal/Rounded                 */
#define PAN_LETT_NORMAL_OFF_CENTER      7 /* Normal/Off Center              */
#define PAN_LETT_NORMAL_SQUARE          8 /* Normal/Square                  */
#define PAN_LETT_OBLIQUE_CONTACT        9 /* Oblique/Contact                */
#define PAN_LETT_OBLIQUE_WEIGHTED      10 /* Oblique/Weighted               */
#define PAN_LETT_OBLIQUE_BOXED         11 /* Oblique/Boxed                  */
#define PAN_LETT_OBLIQUE_FLATTENED     12 /* Oblique/Flattened              */
#define PAN_LETT_OBLIQUE_ROUNDED       13 /* Oblique/Rounded                */
#define PAN_LETT_OBLIQUE_OFF_CENTER    14 /* Oblique/Off Center             */
#define PAN_LETT_OBLIQUE_SQUARE        15 /* Oblique/Square                 */

#define PAN_MIDLINE_STANDARD_TRIMMED    2 /* Standard/Trimmed               */
#define PAN_MIDLINE_STANDARD_POINTED    3 /* Standard/Pointed               */
#define PAN_MIDLINE_STANDARD_SERIFED    4 /* Standard/Serifed               */
#define PAN_MIDLINE_HIGH_TRIMMED        5 /* High/Trimmed                   */
#define PAN_MIDLINE_HIGH_POINTED        6 /* High/Pointed                   */
#define PAN_MIDLINE_HIGH_SERIFED        7 /* High/Serifed                   */
#define PAN_MIDLINE_CONSTANT_TRIMMED    8 /* Constant/Trimmed               */
#define PAN_MIDLINE_CONSTANT_POINTED    9 /* Constant/Pointed               */
#define PAN_MIDLINE_CONSTANT_SERIFED   10 /* Constant/Serifed               */
#define PAN_MIDLINE_LOW_TRIMMED        11 /* Low/Trimmed                    */
#define PAN_MIDLINE_LOW_POINTED        12 /* Low/Pointed                    */
#define PAN_MIDLINE_LOW_SERIFED        13 /* Low/Serifed                    */

#define PAN_XHEIGHT_CONSTANT_SMALL      2 /* Constant/Small                 */
#define PAN_XHEIGHT_CONSTANT_STD        3 /* Constant/Standard              */
#define PAN_XHEIGHT_CONSTANT_LARGE      4 /* Constant/Large                 */
#define PAN_XHEIGHT_DUCKING_SMALL       5 /* Ducking/Small                  */
#define PAN_XHEIGHT_DUCKING_STD         6 /* Ducking/Standard               */
#define PAN_XHEIGHT_DUCKING_LARGE       7 /* Ducking/Large                  */


#define ELF_VENDOR_SIZE     4

/* The extended logical font       */
/* An extension of the ENUMLOGFONT */

typedef struct tagEXTLOGFONTA {
    LOGFONTA    elfLogFont;
    BYTE        elfFullName[LF_FULLFACESIZE];
    BYTE        elfStyle[LF_FACESIZE];
    DWORD       elfVersion;     /* 0 for the first release of NT */
    DWORD       elfStyleSize;
    DWORD       elfMatch;
    DWORD       elfReserved;
    BYTE        elfVendorId[ELF_VENDOR_SIZE];
    DWORD       elfCulture;     /* 0 for Latin                   */
    PANOSE      elfPanose;
} EXTLOGFONTA, *PEXTLOGFONTA, NEAR *NPEXTLOGFONTA, FAR *LPEXTLOGFONTA;
typedef struct tagEXTLOGFONTW {
    LOGFONTW    elfLogFont;
    WCHAR       elfFullName[LF_FULLFACESIZE];
    WCHAR       elfStyle[LF_FACESIZE];
    DWORD       elfVersion;     /* 0 for the first release of NT */
    DWORD       elfStyleSize;
    DWORD       elfMatch;
    DWORD       elfReserved;
    BYTE        elfVendorId[ELF_VENDOR_SIZE];
    DWORD       elfCulture;     /* 0 for Latin                   */
    PANOSE      elfPanose;
} EXTLOGFONTW, *PEXTLOGFONTW, NEAR *NPEXTLOGFONTW, FAR *LPEXTLOGFONTW;
#ifdef UNICODE
typedef EXTLOGFONTW EXTLOGFONT;
typedef PEXTLOGFONTW PEXTLOGFONT;
typedef NPEXTLOGFONTW NPEXTLOGFONT;
typedef LPEXTLOGFONTW LPEXTLOGFONT;
#else
typedef EXTLOGFONTA EXTLOGFONT;
typedef PEXTLOGFONTA PEXTLOGFONT;
typedef NPEXTLOGFONTA NPEXTLOGFONT;
typedef LPEXTLOGFONTA LPEXTLOGFONT;
#endif // UNICODE

#define ELF_VERSION         0
#define ELF_CULTURE_LATIN   0

/* EnumFonts Masks */
#define RASTER_FONTTYPE     0x0001
#define DEVICE_FONTTYPE     0x0002
#define TRUETYPE_FONTTYPE   0x0004

#define RGB(r,g,b)          ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) #define PALETTERGB(r,g,b) (0x02000000 | RGB(r,g,b)) #define PALETTEINDEX(i) ((COLORREF)(0x01000000 | (DWORD)(WORD)(i))) /* palette entry flags */ #define PC_RESERVED 0x01 /* palette index used for animation */ #define PC_EXPLICIT 0x02 /* palette index is explicit to device */ #define PC_NOCOLLAPSE 0x04 /* do not match color to system palette */ #define GetRValue(rgb) (LOBYTE(rgb)) #define GetGValue(rgb) (LOBYTE(((WORD)(rgb)) >> 8))
#define GetBValue(rgb)      (LOBYTE((rgb)>>16))

/* Background Modes */
#define TRANSPARENT         1
#define OPAQUE              2
#define BKMODE_LAST         2

/* Graphics Modes */

#define GM_COMPATIBLE       1
#define GM_ADVANCED         2
#define GM_LAST             2

/* PolyDraw and GetPath point types */
#define PT_CLOSEFIGURE      0x01
#define PT_LINETO           0x02
#define PT_BEZIERTO         0x04
#define PT_MOVETO           0x06

/* Mapping Modes */
#define MM_TEXT             1
#define MM_LOMETRIC         2
#define MM_HIMETRIC         3
#define MM_LOENGLISH        4
#define MM_HIENGLISH        5
#define MM_TWIPS            6
#define MM_ISOTROPIC        7
#define MM_ANISOTROPIC      8

/* Min and Max Mapping Mode values */
#define MM_MIN              MM_TEXT
#define MM_MAX              MM_ANISOTROPIC
#define MM_MAX_FIXEDSCALE   MM_TWIPS

/* Coordinate Modes */
#define ABSOLUTE            1
#define RELATIVE            2

/* Stock Logical Objects */
#define WHITE_BRUSH         0
#define LTGRAY_BRUSH        1
#define GRAY_BRUSH          2
#define DKGRAY_BRUSH        3
#define BLACK_BRUSH         4
#define NULL_BRUSH          5
#define HOLLOW_BRUSH        NULL_BRUSH
#define WHITE_PEN           6
#define BLACK_PEN           7
#define NULL_PEN            8
#define OEM_FIXED_FONT      10
#define ANSI_FIXED_FONT     11
#define ANSI_VAR_FONT       12
#define SYSTEM_FONT         13
#define DEVICE_DEFAULT_FONT 14
#define DEFAULT_PALETTE     15
#define SYSTEM_FIXED_FONT   16

#if(WINVER >= 0x0400)
#define DEFAULT_GUI_FONT    17
#endif /* WINVER >= 0x0400 */

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define DC_BRUSH            18
#define DC_PEN              19
#endif

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define STOCK_LAST          19
#elif (WINVER >= 0x0400)
#define STOCK_LAST          17
#else
#define STOCK_LAST          16
#endif

#define CLR_INVALID     0xFFFFFFFF

/* Brush Styles */
#define BS_SOLID            0
#define BS_NULL             1
#define BS_HOLLOW           BS_NULL
#define BS_HATCHED          2
#define BS_PATTERN          3
#define BS_INDEXED          4
#define BS_DIBPATTERN       5
#define BS_DIBPATTERNPT     6
#define BS_PATTERN8X8       7
#define BS_DIBPATTERN8X8    8
#define BS_MONOPATTERN      9

/* Hatch Styles */
#define HS_HORIZONTAL       0       /* ----- */
#define HS_VERTICAL         1       /* ||||| */
#define HS_FDIAGONAL        2       /* \\\\\ */
#define HS_BDIAGONAL        3       /* ///// */
#define HS_CROSS            4       /* +++++ */
#define HS_DIAGCROSS        5       /* xxxxx */
#define HS_API_MAX          12

/* Pen Styles */
#define PS_SOLID            0
#define PS_DASH             1       /* -------  */
#define PS_DOT              2       /* .......  */
#define PS_DASHDOT          3       /* _._._._  */
#define PS_DASHDOTDOT       4       /* _.._.._  */
#define PS_NULL             5
#define PS_INSIDEFRAME      6
#define PS_USERSTYLE        7
#define PS_ALTERNATE        8
#define PS_STYLE_MASK       0x0000000F

#define PS_ENDCAP_ROUND     0x00000000
#define PS_ENDCAP_SQUARE    0x00000100
#define PS_ENDCAP_FLAT      0x00000200
#define PS_ENDCAP_MASK      0x00000F00

#define PS_JOIN_ROUND       0x00000000
#define PS_JOIN_BEVEL       0x00001000
#define PS_JOIN_MITER       0x00002000
#define PS_JOIN_MASK        0x0000F000

#define PS_COSMETIC         0x00000000
#define PS_GEOMETRIC        0x00010000
#define PS_TYPE_MASK        0x000F0000

#define AD_COUNTERCLOCKWISE 1
#define AD_CLOCKWISE        2

/* Device Parameters for GetDeviceCaps() */
#define DRIVERVERSION 0     /* Device driver version                    */
#define TECHNOLOGY    2     /* Device classification                    */
#define HORZSIZE      4     /* Horizontal size in millimeters           */
#define VERTSIZE      6     /* Vertical size in millimeters             */
#define HORZRES       8     /* Horizontal width in pixels               */
#define VERTRES       10    /* Vertical height in pixels                */
#define BITSPIXEL     12    /* Number of bits per pixel                 */
#define PLANES        14    /* Number of planes                         */
#define NUMBRUSHES    16    /* Number of brushes the device has         */
#define NUMPENS       18    /* Number of pens the device has            */
#define NUMMARKERS    20    /* Number of markers the device has         */
#define NUMFONTS      22    /* Number of fonts the device has           */
#define NUMCOLORS     24    /* Number of colors the device supports     */
#define PDEVICESIZE   26    /* Size required for device descriptor      */
#define CURVECAPS     28    /* Curve capabilities                       */
#define LINECAPS      30    /* Line capabilities                        */
#define POLYGONALCAPS 32    /* Polygonal capabilities                   */
#define TEXTCAPS      34    /* Text capabilities                        */
#define CLIPCAPS      36    /* Clipping capabilities                    */
#define RASTERCAPS    38    /* Bitblt capabilities                      */
#define ASPECTX       40    /* Length of the X leg                      */
#define ASPECTY       42    /* Length of the Y leg                      */
#define ASPECTXY      44    /* Length of the hypotenuse                 */

#define LOGPIXELSX    88    /* Logical pixels/inch in X                 */
#define LOGPIXELSY    90    /* Logical pixels/inch in Y                 */

#define SIZEPALETTE  104    /* Number of entries in physical palette    */
#define NUMRESERVED  106    /* Number of reserved entries in palette    */
#define COLORRES     108    /* Actual color resolution                  */

// Printing related DeviceCaps. These replace the appropriate Escapes

#define PHYSICALWIDTH   110 /* Physical Width in device units           */
#define PHYSICALHEIGHT  111 /* Physical Height in device units          */
#define PHYSICALOFFSETX 112 /* Physical Printable Area x margin         */
#define PHYSICALOFFSETY 113 /* Physical Printable Area y margin         */
#define SCALINGFACTORX  114 /* Scaling factor x                         */
#define SCALINGFACTORY  115 /* Scaling factor y                         */

// Display driver specific

#define VREFRESH        116  /* Current vertical refresh rate of the    */
                             /* display device (for displays only) in Hz*/
#define DESKTOPVERTRES  117  /* Horizontal width of entire desktop in   */
                             /* pixels                                  */
#define DESKTOPHORZRES  118  /* Vertical height of entire desktop in    */
                             /* pixels                                  */
#define BLTALIGNMENT    119  /* Preferred blt alignment                 */

#if(WINVER >= 0x0500)
#define SHADEBLENDCAPS  120  /* Shading and blending caps               */
#define COLORMGMTCAPS   121  /* Color Management caps                   */
#endif /* WINVER >= 0x0500 */

#ifndef NOGDICAPMASKS

/* Device Capability Masks: */

/* Device Technologies */
#define DT_PLOTTER          0   /* Vector plotter                   */
#define DT_RASDISPLAY       1   /* Raster display                   */
#define DT_RASPRINTER       2   /* Raster printer                   */
#define DT_RASCAMERA        3   /* Raster camera                    */
#define DT_CHARSTREAM       4   /* Character-stream, PLP            */
#define DT_METAFILE         5   /* Metafile, VDM                    */
#define DT_DISPFILE         6   /* Display-file                     */

/* Curve Capabilities */
#define CC_NONE             0   /* Curves not supported             */
#define CC_CIRCLES          1   /* Can do circles                   */
#define CC_PIE              2   /* Can do pie wedges                */
#define CC_CHORD            4   /* Can do chord arcs                */
#define CC_ELLIPSES         8   /* Can do ellipese                  */
#define CC_WIDE             16  /* Can do wide lines                */
#define CC_STYLED           32  /* Can do styled lines              */
#define CC_WIDESTYLED       64  /* Can do wide styled lines         */
#define CC_INTERIORS        128 /* Can do interiors                 */
#define CC_ROUNDRECT        256 /*                                  */

/* Line Capabilities */
#define LC_NONE             0   /* Lines not supported              */
#define LC_POLYLINE         2   /* Can do polylines                 */
#define LC_MARKER           4   /* Can do markers                   */
#define LC_POLYMARKER       8   /* Can do polymarkers               */
#define LC_WIDE             16  /* Can do wide lines                */
#define LC_STYLED           32  /* Can do styled lines              */
#define LC_WIDESTYLED       64  /* Can do wide styled lines         */
#define LC_INTERIORS        128 /* Can do interiors                 */

/* Polygonal Capabilities */
#define PC_NONE             0   /* Polygonals not supported         */
#define PC_POLYGON          1   /* Can do polygons                  */
#define PC_RECTANGLE        2   /* Can do rectangles                */
#define PC_WINDPOLYGON      4   /* Can do winding polygons          */
#define PC_TRAPEZOID        4   /* Can do trapezoids                */
#define PC_SCANLINE         8   /* Can do scanlines                 */
#define PC_WIDE             16  /* Can do wide borders              */
#define PC_STYLED           32  /* Can do styled borders            */
#define PC_WIDESTYLED       64  /* Can do wide styled borders       */
#define PC_INTERIORS        128 /* Can do interiors                 */
#define PC_POLYPOLYGON      256 /* Can do polypolygons              */
#define PC_PATHS            512 /* Can do paths                     */

/* Clipping Capabilities */
#define CP_NONE             0   /* No clipping of output            */
#define CP_RECTANGLE        1   /* Output clipped to rects          */
#define CP_REGION           2   /* obsolete                         */

/* Text Capabilities */
#define TC_OP_CHARACTER     0x00000001  /* Can do OutputPrecision   CHARACTER      */
#define TC_OP_STROKE        0x00000002  /* Can do OutputPrecision   STROKE         */
#define TC_CP_STROKE        0x00000004  /* Can do ClipPrecision     STROKE         */
#define TC_CR_90            0x00000008  /* Can do CharRotAbility    90             */
#define TC_CR_ANY           0x00000010  /* Can do CharRotAbility    ANY            */
#define TC_SF_X_YINDEP      0x00000020  /* Can do ScaleFreedom      X_YINDEPENDENT */
#define TC_SA_DOUBLE        0x00000040  /* Can do ScaleAbility      DOUBLE         */
#define TC_SA_INTEGER       0x00000080  /* Can do ScaleAbility      INTEGER        */
#define TC_SA_CONTIN        0x00000100  /* Can do ScaleAbility      CONTINUOUS     */
#define TC_EA_DOUBLE        0x00000200  /* Can do EmboldenAbility   DOUBLE         */
#define TC_IA_ABLE          0x00000400  /* Can do ItalisizeAbility  ABLE           */
#define TC_UA_ABLE          0x00000800  /* Can do UnderlineAbility  ABLE           */
#define TC_SO_ABLE          0x00001000  /* Can do StrikeOutAbility  ABLE           */
#define TC_RA_ABLE          0x00002000  /* Can do RasterFontAble    ABLE           */
#define TC_VA_ABLE          0x00004000  /* Can do VectorFontAble    ABLE           */
#define TC_RESERVED         0x00008000
#define TC_SCROLLBLT        0x00010000  /* Don't do text scroll with blt           */

#endif /* NOGDICAPMASKS */

/* Raster Capabilities */
#define RC_NONE
#define RC_BITBLT           1       /* Can do standard BLT.             */
#define RC_BANDING          2       /* Device requires banding support  */
#define RC_SCALING          4       /* Device requires scaling support  */
#define RC_BITMAP64         8       /* Device can support >64K bitmap   */
#define RC_GDI20_OUTPUT     0x0010      /* has 2.0 output calls         */
#define RC_GDI20_STATE      0x0020
#define RC_SAVEBITMAP       0x0040
#define RC_DI_BITMAP        0x0080      /* supports DIB to memory       */
#define RC_PALETTE          0x0100      /* supports a palette           */
#define RC_DIBTODEV         0x0200      /* supports DIBitsToDevice      */
#define RC_BIGFONT          0x0400      /* supports >64K fonts          */
#define RC_STRETCHBLT       0x0800      /* supports StretchBlt          */
#define RC_FLOODFILL        0x1000      /* supports FloodFill           */
#define RC_STRETCHDIB       0x2000      /* supports StretchDIBits       */
#define RC_OP_DX_OUTPUT     0x4000
#define RC_DEVBITS          0x8000

#if(WINVER >= 0x0500)

/* Shading and blending caps */
#define SB_NONE             0x00000000
#define SB_CONST_ALPHA      0x00000001
#define SB_PIXEL_ALPHA      0x00000002
#define SB_PREMULT_ALPHA    0x00000004

#define SB_GRAD_RECT        0x00000010
#define SB_GRAD_TRI         0x00000020

/* Color Management caps */
#define CM_NONE             0x00000000
#define CM_DEVICE_ICM       0x00000001
#define CM_GAMMA_RAMP       0x00000002
#define CM_CMYK_COLOR       0x00000004

#endif /* WINVER >= 0x0500 */


/* DIB color table identifiers */

#define DIB_RGB_COLORS      0 /* color table in RGBs */
#define DIB_PAL_COLORS      1 /* color table in palette indices */

/* constants for Get/SetSystemPaletteUse() */

#define SYSPAL_ERROR    0
#define SYSPAL_STATIC   1
#define SYSPAL_NOSTATIC 2
#define SYSPAL_NOSTATIC256 3

/* constants for CreateDIBitmap */
#define CBM_INIT        0x04L   /* initialize bitmap */

/* ExtFloodFill style flags */
#define  FLOODFILLBORDER   0
#define  FLOODFILLSURFACE  1

/* size of a device name string */
#define CCHDEVICENAME 32

/* size of a form name string */
#define CCHFORMNAME 32

#if (_WIN32_WINNT >= ((OSVER(NTDDI_WINXPSP2)) >> 16))
typedef struct _devicemodeA {
    BYTE   dmDeviceName[CCHDEVICENAME];
    WORD dmSpecVersion;
    WORD dmDriverVersion;
    WORD dmSize;
    WORD dmDriverExtra;
    DWORD dmFields;
    union {
      /* printer only fields */
      struct {
        short dmOrientation;
        short dmPaperSize;
        short dmPaperLength;
        short dmPaperWidth;
        short dmScale;
        short dmCopies;
        short dmDefaultSource;
        short dmPrintQuality;
      };
      /* display only fields */
      struct {
        POINTL dmPosition;
        DWORD  dmDisplayOrientation;
        DWORD  dmDisplayFixedOutput;
      };
    };
    short dmColor;
    short dmDuplex;
    short dmYResolution;
    short dmTTOption;
    short dmCollate;
    BYTE   dmFormName[CCHFORMNAME];
    WORD   dmLogPixels;
    DWORD  dmBitsPerPel;
    DWORD  dmPelsWidth;
    DWORD  dmPelsHeight;
    union {
        DWORD  dmDisplayFlags;
        DWORD  dmNup;
    };
    DWORD  dmDisplayFrequency;
#if(WINVER >= 0x0400)
    DWORD  dmICMMethod;
    DWORD  dmICMIntent;
    DWORD  dmMediaType;
    DWORD  dmDitherType;
    DWORD  dmReserved1;
    DWORD  dmReserved2;
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= _WIN32_WINNT_NT4)
    DWORD  dmPanningWidth;
    DWORD  dmPanningHeight;
#endif
#endif /* WINVER >= 0x0400 */
} DEVMODEA, *PDEVMODEA, *NPDEVMODEA, *LPDEVMODEA;
typedef struct _devicemodeW {
    WCHAR  dmDeviceName[CCHDEVICENAME];
    WORD dmSpecVersion;
    WORD dmDriverVersion;
    WORD dmSize;
    WORD dmDriverExtra;
    DWORD dmFields;
    union {
      /* printer only fields */
      struct {
        short dmOrientation;
        short dmPaperSize;
        short dmPaperLength;
        short dmPaperWidth;
        short dmScale;
        short dmCopies;
        short dmDefaultSource;
        short dmPrintQuality;
      };
      /* display only fields */
      struct {
        POINTL dmPosition;
        DWORD  dmDisplayOrientation;
        DWORD  dmDisplayFixedOutput;
      };
    };
    short dmColor;
    short dmDuplex;
    short dmYResolution;
    short dmTTOption;
    short dmCollate;
    WCHAR  dmFormName[CCHFORMNAME];
    WORD   dmLogPixels;
    DWORD  dmBitsPerPel;
    DWORD  dmPelsWidth;
    DWORD  dmPelsHeight;
    union {
        DWORD  dmDisplayFlags;
        DWORD  dmNup;
    };
    DWORD  dmDisplayFrequency;
#if(WINVER >= 0x0400)
    DWORD  dmICMMethod;
    DWORD  dmICMIntent;
    DWORD  dmMediaType;
    DWORD  dmDitherType;
    DWORD  dmReserved1;
    DWORD  dmReserved2;
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= _WIN32_WINNT_NT4)
    DWORD  dmPanningWidth;
    DWORD  dmPanningHeight;
#endif
#endif /* WINVER >= 0x0400 */
} DEVMODEW, *PDEVMODEW, *NPDEVMODEW, *LPDEVMODEW;
#ifdef UNICODE
typedef DEVMODEW DEVMODE;
typedef PDEVMODEW PDEVMODE;
typedef NPDEVMODEW NPDEVMODE;
typedef LPDEVMODEW LPDEVMODE;
#else
typedef DEVMODEA DEVMODE;
typedef PDEVMODEA PDEVMODE;
typedef NPDEVMODEA NPDEVMODE;
typedef LPDEVMODEA LPDEVMODE;
#endif // UNICODE
#else
typedef struct _devicemodeA {
    BYTE   dmDeviceName[CCHDEVICENAME];
    WORD dmSpecVersion;
    WORD dmDriverVersion;
    WORD dmSize;
    WORD dmDriverExtra;
    DWORD dmFields;
    union {
      struct {
        short dmOrientation;
        short dmPaperSize;
        short dmPaperLength;
        short dmPaperWidth;
      };
      POINTL dmPosition;
    };
    short dmScale;
    short dmCopies;
    short dmDefaultSource;
    short dmPrintQuality;
    short dmColor;
    short dmDuplex;
    short dmYResolution;
    short dmTTOption;
    short dmCollate;
    BYTE   dmFormName[CCHFORMNAME];
    WORD   dmLogPixels;
    DWORD  dmBitsPerPel;
    DWORD  dmPelsWidth;
    DWORD  dmPelsHeight;
    union {
        DWORD  dmDisplayFlags;
        DWORD  dmNup;
    };
    DWORD  dmDisplayFrequency;
#if(WINVER >= 0x0400)
    DWORD  dmICMMethod;
    DWORD  dmICMIntent;
    DWORD  dmMediaType;
    DWORD  dmDitherType;
    DWORD  dmReserved1;
    DWORD  dmReserved2;
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= _WIN32_WINNT_NT4)
    DWORD  dmPanningWidth;
    DWORD  dmPanningHeight;
#endif
#endif /* WINVER >= 0x0400 */
} DEVMODEA, *PDEVMODEA, *NPDEVMODEA, *LPDEVMODEA;
typedef struct _devicemodeW {
    WCHAR  dmDeviceName[CCHDEVICENAME];
    WORD dmSpecVersion;
    WORD dmDriverVersion;
    WORD dmSize;
    WORD dmDriverExtra;
    DWORD dmFields;
    union {
      struct {
        short dmOrientation;
        short dmPaperSize;
        short dmPaperLength;
        short dmPaperWidth;
      };
      POINTL dmPosition;
    };
    short dmScale;
    short dmCopies;
    short dmDefaultSource;
    short dmPrintQuality;
    short dmColor;
    short dmDuplex;
    short dmYResolution;
    short dmTTOption;
    short dmCollate;
    WCHAR  dmFormName[CCHFORMNAME];
    WORD   dmLogPixels;
    DWORD  dmBitsPerPel;
    DWORD  dmPelsWidth;
    DWORD  dmPelsHeight;
    union {
        DWORD  dmDisplayFlags;
        DWORD  dmNup;
    };
    DWORD  dmDisplayFrequency;
#if(WINVER >= 0x0400)
    DWORD  dmICMMethod;
    DWORD  dmICMIntent;
    DWORD  dmMediaType;
    DWORD  dmDitherType;
    DWORD  dmReserved1;
    DWORD  dmReserved2;
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= _WIN32_WINNT_NT4)
    DWORD  dmPanningWidth;
    DWORD  dmPanningHeight;
#endif
#endif /* WINVER >= 0x0400 */
} DEVMODEW, *PDEVMODEW, *NPDEVMODEW, *LPDEVMODEW;
#ifdef UNICODE
typedef DEVMODEW DEVMODE;
typedef PDEVMODEW PDEVMODE;
typedef NPDEVMODEW NPDEVMODE;
typedef LPDEVMODEW LPDEVMODE;
#else
typedef DEVMODEA DEVMODE;
typedef PDEVMODEA PDEVMODE;
typedef NPDEVMODEA NPDEVMODE;
typedef LPDEVMODEA LPDEVMODE;
#endif // UNICODE
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WINXP)
/* current version of specification */
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= _WIN32_WINNT_NT4)
#define DM_SPECVERSION 0x0401
#elif (WINVER >= 0x0400)
#define DM_SPECVERSION 0x0400
#else
#define DM_SPECVERSION 0x0320
#endif /* WINVER */

/* field selection bits */
#define DM_ORIENTATION          0x00000001L
#define DM_PAPERSIZE            0x00000002L
#define DM_PAPERLENGTH          0x00000004L
#define DM_PAPERWIDTH           0x00000008L
#define DM_SCALE                0x00000010L
#if(WINVER >= 0x0500)
#define DM_POSITION             0x00000020L
#define DM_NUP                  0x00000040L
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0501)
#define DM_DISPLAYORIENTATION   0x00000080L
#endif /* WINVER >= 0x0501 */
#define DM_COPIES               0x00000100L
#define DM_DEFAULTSOURCE        0x00000200L
#define DM_PRINTQUALITY         0x00000400L
#define DM_COLOR                0x00000800L
#define DM_DUPLEX               0x00001000L
#define DM_YRESOLUTION          0x00002000L
#define DM_TTOPTION             0x00004000L
#define DM_COLLATE              0x00008000L
#define DM_FORMNAME             0x00010000L
#define DM_LOGPIXELS            0x00020000L
#define DM_BITSPERPEL           0x00040000L
#define DM_PELSWIDTH            0x00080000L
#define DM_PELSHEIGHT           0x00100000L
#define DM_DISPLAYFLAGS         0x00200000L
#define DM_DISPLAYFREQUENCY     0x00400000L
#if(WINVER >= 0x0400)
#define DM_ICMMETHOD            0x00800000L
#define DM_ICMINTENT            0x01000000L
#define DM_MEDIATYPE            0x02000000L
#define DM_DITHERTYPE           0x04000000L
#define DM_PANNINGWIDTH         0x08000000L
#define DM_PANNINGHEIGHT        0x10000000L
#endif /* WINVER >= 0x0400 */
#if(WINVER >= 0x0501)
#define DM_DISPLAYFIXEDOUTPUT   0x20000000L
#endif /* WINVER >= 0x0501 */


/* orientation selections */
#define DMORIENT_PORTRAIT   1
#define DMORIENT_LANDSCAPE  2

/* paper selections */
#define DMPAPER_FIRST                DMPAPER_LETTER
#define DMPAPER_LETTER               1  /* Letter 8 1/2 x 11 in               */
#define DMPAPER_LETTERSMALL          2  /* Letter Small 8 1/2 x 11 in         */
#define DMPAPER_TABLOID              3  /* Tabloid 11 x 17 in                 */
#define DMPAPER_LEDGER               4  /* Ledger 17 x 11 in                  */
#define DMPAPER_LEGAL                5  /* Legal 8 1/2 x 14 in                */
#define DMPAPER_STATEMENT            6  /* Statement 5 1/2 x 8 1/2 in         */
#define DMPAPER_EXECUTIVE            7  /* Executive 7 1/4 x 10 1/2 in        */
#define DMPAPER_A3                   8  /* A3 297 x 420 mm                    */
#define DMPAPER_A4                   9  /* A4 210 x 297 mm                    */
#define DMPAPER_A4SMALL             10  /* A4 Small 210 x 297 mm              */
#define DMPAPER_A5                  11  /* A5 148 x 210 mm                    */
#define DMPAPER_B4                  12  /* B4 (JIS) 250 x 354                 */
#define DMPAPER_B5                  13  /* B5 (JIS) 182 x 257 mm              */
#define DMPAPER_FOLIO               14  /* Folio 8 1/2 x 13 in                */
#define DMPAPER_QUARTO              15  /* Quarto 215 x 275 mm                */
#define DMPAPER_10X14               16  /* 10x14 in                           */
#define DMPAPER_11X17               17  /* 11x17 in                           */
#define DMPAPER_NOTE                18  /* Note 8 1/2 x 11 in                 */
#define DMPAPER_ENV_9               19  /* Envelope #9 3 7/8 x 8 7/8          */
#define DMPAPER_ENV_10              20  /* Envelope #10 4 1/8 x 9 1/2         */
#define DMPAPER_ENV_11              21  /* Envelope #11 4 1/2 x 10 3/8        */
#define DMPAPER_ENV_12              22  /* Envelope #12 4 \276 x 11           */
#define DMPAPER_ENV_14              23  /* Envelope #14 5 x 11 1/2            */
#define DMPAPER_CSHEET              24  /* C size sheet                       */
#define DMPAPER_DSHEET              25  /* D size sheet                       */
#define DMPAPER_ESHEET              26  /* E size sheet                       */
#define DMPAPER_ENV_DL              27  /* Envelope DL 110 x 220mm            */
#define DMPAPER_ENV_C5              28  /* Envelope C5 162 x 229 mm           */
#define DMPAPER_ENV_C3              29  /* Envelope C3  324 x 458 mm          */
#define DMPAPER_ENV_C4              30  /* Envelope C4  229 x 324 mm          */
#define DMPAPER_ENV_C6              31  /* Envelope C6  114 x 162 mm          */
#define DMPAPER_ENV_C65             32  /* Envelope C65 114 x 229 mm          */
#define DMPAPER_ENV_B4              33  /* Envelope B4  250 x 353 mm          */
#define DMPAPER_ENV_B5              34  /* Envelope B5  176 x 250 mm          */
#define DMPAPER_ENV_B6              35  /* Envelope B6  176 x 125 mm          */
#define DMPAPER_ENV_ITALY           36  /* Envelope 110 x 230 mm              */
#define DMPAPER_ENV_MONARCH         37  /* Envelope Monarch 3.875 x 7.5 in    */
#define DMPAPER_ENV_PERSONAL        38  /* 6 3/4 Envelope 3 5/8 x 6 1/2 in    */
#define DMPAPER_FANFOLD_US          39  /* US Std Fanfold 14 7/8 x 11 in      */
#define DMPAPER_FANFOLD_STD_GERMAN  40  /* German Std Fanfold 8 1/2 x 12 in   */
#define DMPAPER_FANFOLD_LGL_GERMAN  41  /* German Legal Fanfold 8 1/2 x 13 in */
#if(WINVER >= 0x0400)
#define DMPAPER_ISO_B4              42  /* B4 (ISO) 250 x 353 mm              */
#define DMPAPER_JAPANESE_POSTCARD   43  /* Japanese Postcard 100 x 148 mm     */
#define DMPAPER_9X11                44  /* 9 x 11 in                          */
#define DMPAPER_10X11               45  /* 10 x 11 in                         */
#define DMPAPER_15X11               46  /* 15 x 11 in                         */
#define DMPAPER_ENV_INVITE          47  /* Envelope Invite 220 x 220 mm       */
#define DMPAPER_RESERVED_48         48  /* RESERVED--DO NOT USE               */
#define DMPAPER_RESERVED_49         49  /* RESERVED--DO NOT USE               */
#define DMPAPER_LETTER_EXTRA        50  /* Letter Extra 9 \275 x 12 in        */
#define DMPAPER_LEGAL_EXTRA         51  /* Legal Extra 9 \275 x 15 in         */
#define DMPAPER_TABLOID_EXTRA       52  /* Tabloid Extra 11.69 x 18 in        */
#define DMPAPER_A4_EXTRA            53  /* A4 Extra 9.27 x 12.69 in           */
#define DMPAPER_LETTER_TRANSVERSE   54  /* Letter Transverse 8 \275 x 11 in   */
#define DMPAPER_A4_TRANSVERSE       55  /* A4 Transverse 210 x 297 mm         */
#define DMPAPER_LETTER_EXTRA_TRANSVERSE 56 /* Letter Extra Transverse 9\275 x 12 in */
#define DMPAPER_A_PLUS              57  /* SuperA/SuperA/A4 227 x 356 mm      */
#define DMPAPER_B_PLUS              58  /* SuperB/SuperB/A3 305 x 487 mm      */
#define DMPAPER_LETTER_PLUS         59  /* Letter Plus 8.5 x 12.69 in         */
#define DMPAPER_A4_PLUS             60  /* A4 Plus 210 x 330 mm               */
#define DMPAPER_A5_TRANSVERSE       61  /* A5 Transverse 148 x 210 mm         */
#define DMPAPER_B5_TRANSVERSE       62  /* B5 (JIS) Transverse 182 x 257 mm   */
#define DMPAPER_A3_EXTRA            63  /* A3 Extra 322 x 445 mm              */
#define DMPAPER_A5_EXTRA            64  /* A5 Extra 174 x 235 mm              */
#define DMPAPER_B5_EXTRA            65  /* B5 (ISO) Extra 201 x 276 mm        */
#define DMPAPER_A2                  66  /* A2 420 x 594 mm                    */
#define DMPAPER_A3_TRANSVERSE       67  /* A3 Transverse 297 x 420 mm         */
#define DMPAPER_A3_EXTRA_TRANSVERSE 68  /* A3 Extra Transverse 322 x 445 mm   */
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0500)
#define DMPAPER_DBL_JAPANESE_POSTCARD 69 /* Japanese Double Postcard 200 x 148 mm */
#define DMPAPER_A6                  70  /* A6 105 x 148 mm                 */
#define DMPAPER_JENV_KAKU2          71  /* Japanese Envelope Kaku #2       */
#define DMPAPER_JENV_KAKU3          72  /* Japanese Envelope Kaku #3       */
#define DMPAPER_JENV_CHOU3          73  /* Japanese Envelope Chou #3       */
#define DMPAPER_JENV_CHOU4          74  /* Japanese Envelope Chou #4       */
#define DMPAPER_LETTER_ROTATED      75  /* Letter Rotated 11 x 8 1/2 11 in */
#define DMPAPER_A3_ROTATED          76  /* A3 Rotated 420 x 297 mm         */
#define DMPAPER_A4_ROTATED          77  /* A4 Rotated 297 x 210 mm         */
#define DMPAPER_A5_ROTATED          78  /* A5 Rotated 210 x 148 mm         */
#define DMPAPER_B4_JIS_ROTATED      79  /* B4 (JIS) Rotated 364 x 257 mm   */
#define DMPAPER_B5_JIS_ROTATED      80  /* B5 (JIS) Rotated 257 x 182 mm   */
#define DMPAPER_JAPANESE_POSTCARD_ROTATED 81 /* Japanese Postcard Rotated 148 x 100 mm */
#define DMPAPER_DBL_JAPANESE_POSTCARD_ROTATED 82 /* Double Japanese Postcard Rotated 148 x 200 mm */
#define DMPAPER_A6_ROTATED          83  /* A6 Rotated 148 x 105 mm         */
#define DMPAPER_JENV_KAKU2_ROTATED  84  /* Japanese Envelope Kaku #2 Rotated */
#define DMPAPER_JENV_KAKU3_ROTATED  85  /* Japanese Envelope Kaku #3 Rotated */
#define DMPAPER_JENV_CHOU3_ROTATED  86  /* Japanese Envelope Chou #3 Rotated */
#define DMPAPER_JENV_CHOU4_ROTATED  87  /* Japanese Envelope Chou #4 Rotated */
#define DMPAPER_B6_JIS              88  /* B6 (JIS) 128 x 182 mm           */
#define DMPAPER_B6_JIS_ROTATED      89  /* B6 (JIS) Rotated 182 x 128 mm   */
#define DMPAPER_12X11               90  /* 12 x 11 in                      */
#define DMPAPER_JENV_YOU4           91  /* Japanese Envelope You #4        */
#define DMPAPER_JENV_YOU4_ROTATED   92  /* Japanese Envelope You #4 Rotated*/
#define DMPAPER_P16K                93  /* PRC 16K 146 x 215 mm            */
#define DMPAPER_P32K                94  /* PRC 32K 97 x 151 mm             */
#define DMPAPER_P32KBIG             95  /* PRC 32K(Big) 97 x 151 mm        */
#define DMPAPER_PENV_1              96  /* PRC Envelope #1 102 x 165 mm    */
#define DMPAPER_PENV_2              97  /* PRC Envelope #2 102 x 176 mm    */
#define DMPAPER_PENV_3              98  /* PRC Envelope #3 125 x 176 mm    */
#define DMPAPER_PENV_4              99  /* PRC Envelope #4 110 x 208 mm    */
#define DMPAPER_PENV_5              100 /* PRC Envelope #5 110 x 220 mm    */
#define DMPAPER_PENV_6              101 /* PRC Envelope #6 120 x 230 mm    */
#define DMPAPER_PENV_7              102 /* PRC Envelope #7 160 x 230 mm    */
#define DMPAPER_PENV_8              103 /* PRC Envelope #8 120 x 309 mm    */
#define DMPAPER_PENV_9              104 /* PRC Envelope #9 229 x 324 mm    */
#define DMPAPER_PENV_10             105 /* PRC Envelope #10 324 x 458 mm   */
#define DMPAPER_P16K_ROTATED        106 /* PRC 16K Rotated                 */
#define DMPAPER_P32K_ROTATED        107 /* PRC 32K Rotated                 */
#define DMPAPER_P32KBIG_ROTATED     108 /* PRC 32K(Big) Rotated            */
#define DMPAPER_PENV_1_ROTATED      109 /* PRC Envelope #1 Rotated 165 x 102 mm */
#define DMPAPER_PENV_2_ROTATED      110 /* PRC Envelope #2 Rotated 176 x 102 mm */
#define DMPAPER_PENV_3_ROTATED      111 /* PRC Envelope #3 Rotated 176 x 125 mm */
#define DMPAPER_PENV_4_ROTATED      112 /* PRC Envelope #4 Rotated 208 x 110 mm */
#define DMPAPER_PENV_5_ROTATED      113 /* PRC Envelope #5 Rotated 220 x 110 mm */
#define DMPAPER_PENV_6_ROTATED      114 /* PRC Envelope #6 Rotated 230 x 120 mm */
#define DMPAPER_PENV_7_ROTATED      115 /* PRC Envelope #7 Rotated 230 x 160 mm */
#define DMPAPER_PENV_8_ROTATED      116 /* PRC Envelope #8 Rotated 309 x 120 mm */
#define DMPAPER_PENV_9_ROTATED      117 /* PRC Envelope #9 Rotated 324 x 229 mm */
#define DMPAPER_PENV_10_ROTATED     118 /* PRC Envelope #10 Rotated 458 x 324 mm */
#endif /* WINVER >= 0x0500 */

#if (WINVER >= 0x0500)
#define DMPAPER_LAST                DMPAPER_PENV_10_ROTATED
#elif (WINVER >= 0x0400)
#define DMPAPER_LAST                DMPAPER_A3_EXTRA_TRANSVERSE
#else
#define DMPAPER_LAST                DMPAPER_FANFOLD_LGL_GERMAN
#endif

#define DMPAPER_USER                256

/* bin selections */
#define DMBIN_FIRST         DMBIN_UPPER
#define DMBIN_UPPER         1
#define DMBIN_ONLYONE       1
#define DMBIN_LOWER         2
#define DMBIN_MIDDLE        3
#define DMBIN_MANUAL        4
#define DMBIN_ENVELOPE      5
#define DMBIN_ENVMANUAL     6
#define DMBIN_AUTO          7
#define DMBIN_TRACTOR       8
#define DMBIN_SMALLFMT      9
#define DMBIN_LARGEFMT      10
#define DMBIN_LARGECAPACITY 11
#define DMBIN_CASSETTE      14
#define DMBIN_FORMSOURCE    15
#define DMBIN_LAST          DMBIN_FORMSOURCE

#define DMBIN_USER          256     /* device specific bins start here */

/* print qualities */
#define DMRES_DRAFT         (-1)
#define DMRES_LOW           (-2)
#define DMRES_MEDIUM        (-3)
#define DMRES_HIGH          (-4)

/* color enable/disable for color printers */
#define DMCOLOR_MONOCHROME  1
#define DMCOLOR_COLOR       2

/* duplex enable */
#define DMDUP_SIMPLEX    1
#define DMDUP_VERTICAL   2
#define DMDUP_HORIZONTAL 3

/* TrueType options */
#define DMTT_BITMAP     1       /* print TT fonts as graphics */
#define DMTT_DOWNLOAD   2       /* download TT fonts as soft fonts */
#define DMTT_SUBDEV     3       /* substitute device fonts for TT fonts */
#if(WINVER >= 0x0400)
#define DMTT_DOWNLOAD_OUTLINE 4 /* download TT fonts as outline soft fonts */
#endif /* WINVER >= 0x0400 */

/* Collation selections */
#define DMCOLLATE_FALSE  0
#define DMCOLLATE_TRUE   1

#if(WINVER >= 0x0501)
/* DEVMODE dmDisplayOrientation specifiations */
#define DMDO_DEFAULT    0
#define DMDO_90         1
#define DMDO_180        2
#define DMDO_270        3

/* DEVMODE dmDisplayFixedOutput specifiations */
#define DMDFO_DEFAULT   0
#define DMDFO_STRETCH   1
#define DMDFO_CENTER    2
#endif /* WINVER >= 0x0501 */

/* DEVMODE dmDisplayFlags flags */

// #define DM_GRAYSCALE            0x00000001 /* This flag is no longer valid */
#define DM_INTERLACED           0x00000002
#define DMDISPLAYFLAGS_TEXTMODE 0x00000004

/* dmNup , multiple logical page per physical page options */
#define DMNUP_SYSTEM        1
#define DMNUP_ONEUP         2

#if(WINVER >= 0x0400)
/* ICM methods */
#define DMICMMETHOD_NONE    1   /* ICM disabled */
#define DMICMMETHOD_SYSTEM  2   /* ICM handled by system */
#define DMICMMETHOD_DRIVER  3   /* ICM handled by driver */
#define DMICMMETHOD_DEVICE  4   /* ICM handled by device */

#define DMICMMETHOD_USER  256   /* Device-specific methods start here */

/* ICM Intents */
#define DMICM_SATURATE          1   /* Maximize color saturation */
#define DMICM_CONTRAST          2   /* Maximize color contrast */
#define DMICM_COLORIMETRIC       3   /* Use specific color metric */
#define DMICM_ABS_COLORIMETRIC   4   /* Use specific color metric */

#define DMICM_USER        256   /* Device-specific intents start here */

/* Media types */

#define DMMEDIA_STANDARD      1   /* Standard paper */
#define DMMEDIA_TRANSPARENCY  2   /* Transparency */
#define DMMEDIA_GLOSSY        3   /* Glossy paper */

#define DMMEDIA_USER        256   /* Device-specific media start here */

/* Dither types */
#define DMDITHER_NONE       1      /* No dithering */
#define DMDITHER_COARSE     2      /* Dither with a coarse brush */
#define DMDITHER_FINE       3      /* Dither with a fine brush */
#define DMDITHER_LINEART    4      /* LineArt dithering */
#define DMDITHER_ERRORDIFFUSION 5  /* LineArt dithering */
#define DMDITHER_RESERVED6      6      /* LineArt dithering */
#define DMDITHER_RESERVED7      7      /* LineArt dithering */
#define DMDITHER_RESERVED8      8      /* LineArt dithering */
#define DMDITHER_RESERVED9      9      /* LineArt dithering */
#define DMDITHER_GRAYSCALE  10     /* Device does grayscaling */

#define DMDITHER_USER     256   /* Device-specific dithers start here */
#endif /* WINVER >= 0x0400 */

typedef struct _DISPLAY_DEVICEA {
    DWORD  cb;
    CHAR   DeviceName[32];
    CHAR   DeviceString[128];
    DWORD  StateFlags;
    CHAR   DeviceID[128];
    CHAR   DeviceKey[128];
} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA, *LPDISPLAY_DEVICEA;
typedef struct _DISPLAY_DEVICEW {
    DWORD  cb;
    WCHAR  DeviceName[32];
    WCHAR  DeviceString[128];
    DWORD  StateFlags;
    WCHAR  DeviceID[128];
    WCHAR  DeviceKey[128];
} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW, *LPDISPLAY_DEVICEW;
#ifdef UNICODE
typedef DISPLAY_DEVICEW DISPLAY_DEVICE;
typedef PDISPLAY_DEVICEW PDISPLAY_DEVICE;
typedef LPDISPLAY_DEVICEW LPDISPLAY_DEVICE;
#else
typedef DISPLAY_DEVICEA DISPLAY_DEVICE;
typedef PDISPLAY_DEVICEA PDISPLAY_DEVICE;
typedef LPDISPLAY_DEVICEA LPDISPLAY_DEVICE;
#endif // UNICODE

#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 0x00000001
#define DISPLAY_DEVICE_MULTI_DRIVER        0x00000002
#define DISPLAY_DEVICE_PRIMARY_DEVICE      0x00000004
#define DISPLAY_DEVICE_MIRRORING_DRIVER    0x00000008
#define DISPLAY_DEVICE_VGA_COMPATIBLE      0x00000010
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define DISPLAY_DEVICE_REMOVABLE           0x00000020
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define DISPLAY_DEVICE_MODESPRUNED         0x08000000
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define DISPLAY_DEVICE_REMOTE              0x04000000
#define DISPLAY_DEVICE_DISCONNECT          0x02000000
#endif
#define DISPLAY_DEVICE_TS_COMPATIBLE       0x00200000
#if (_WIN32_WINNT >= _WIN32_WINNT_LONGHORN)
#define DISPLAY_DEVICE_UNSAFE_MODES_ON     0x00080000
#endif

/* Child device state */
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define DISPLAY_DEVICE_ACTIVE              0x00000001
#define DISPLAY_DEVICE_ATTACHED            0x00000002
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)

#if(WINVER >= 0x0601)

#define DISPLAYCONFIG_MAXPATH 1024        // Maximum display path in system.
                                          // Max adapter (16) * Max source (16) *
                                          // Max clone pre source (4)

typedef struct DISPLAYCONFIG_RATIONAL
{
    UINT32    Numerator;
    UINT32    Denominator;
} DISPLAYCONFIG_RATIONAL;

typedef enum
{
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER                   = -1,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15                    =  0,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO                  =  1,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO         =  2,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO         =  3,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI                     =  4,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI                    =  5,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS                    =  6,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN                   =  8,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI                     =  9,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL    = 10,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED    = 11,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL            = 12,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED            = 13,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE              = 14,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL                = 0x80000000,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32            = 0xFFFFFFFF
} DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY;

typedef enum
{
    DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED                 = 0,
    DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE                 = 1,
    DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED                  = 2,
    DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST  = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
    DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST  = 3,
    DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32                = 0xFFFFFFFF
} DISPLAYCONFIG_SCANLINE_ORDERING;

typedef struct DISPLAYCONFIG_2DREGION
{
    UINT32 cx;
    UINT32 cy;
} DISPLAYCONFIG_2DREGION;

typedef struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
{
    UINT64                          pixelRate;
    DISPLAYCONFIG_RATIONAL          hSyncFreq;
    DISPLAYCONFIG_RATIONAL          vSyncFreq;
    DISPLAYCONFIG_2DREGION          activeSize;
    DISPLAYCONFIG_2DREGION          totalSize;
    UINT32                          videoStandard;
    DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
} DISPLAYCONFIG_VIDEO_SIGNAL_INFO;

typedef enum
{
    DISPLAYCONFIG_SCALING_IDENTITY                  = 1,
    DISPLAYCONFIG_SCALING_CENTERED                  = 2,
    DISPLAYCONFIG_SCALING_STRETCHED                 = 3,
    DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX    = 4,
    DISPLAYCONFIG_SCALING_CUSTOM                    = 5,
    DISPLAYCONFIG_SCALING_PREFERRED                 = 128,
    DISPLAYCONFIG_SCALING_FORCE_UINT32              = 0xFFFFFFFF
} DISPLAYCONFIG_SCALING;

typedef enum
{
    DISPLAYCONFIG_ROTATION_IDENTITY     = 1,
    DISPLAYCONFIG_ROTATION_ROTATE90     = 2,
    DISPLAYCONFIG_ROTATION_ROTATE180    = 3,
    DISPLAYCONFIG_ROTATION_ROTATE270    = 4,
    DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
} DISPLAYCONFIG_ROTATION;

typedef enum
{
    DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
    DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
    DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
} DISPLAYCONFIG_MODE_INFO_TYPE;

typedef enum
{
    DISPLAYCONFIG_PIXELFORMAT_8BPP          = 1,
    DISPLAYCONFIG_PIXELFORMAT_16BPP         = 2,
    DISPLAYCONFIG_PIXELFORMAT_24BPP         = 3,
    DISPLAYCONFIG_PIXELFORMAT_32BPP         = 4,
    DISPLAYCONFIG_PIXELFORMAT_NONGDI        = 5,
    DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32  = 0xffffffff
} DISPLAYCONFIG_PIXELFORMAT;

typedef struct DISPLAYCONFIG_SOURCE_MODE
{
    UINT32                      width;
    UINT32                      height;
    DISPLAYCONFIG_PIXELFORMAT   pixelFormat;
    POINTL                      position;
} DISPLAYCONFIG_SOURCE_MODE;

typedef struct DISPLAYCONFIG_TARGET_MODE
{
    DISPLAYCONFIG_VIDEO_SIGNAL_INFO   targetVideoSignalInfo;
} DISPLAYCONFIG_TARGET_MODE;

typedef struct DISPLAYCONFIG_MODE_INFO
{
    DISPLAYCONFIG_MODE_INFO_TYPE    infoType;
    UINT32                          id;
    LUID                            adapterId;
    union
    {
        DISPLAYCONFIG_TARGET_MODE   targetMode;
        DISPLAYCONFIG_SOURCE_MODE   sourceMode;
    };
} DISPLAYCONFIG_MODE_INFO;

#define DISPLAYCONFIG_PATH_MODE_IDX_INVALID     0xffffffff

typedef struct DISPLAYCONFIG_PATH_SOURCE_INFO
{
    LUID    adapterId;
    UINT32  id;
    UINT32  modeInfoIdx;
    UINT32  statusFlags;
} DISPLAYCONFIG_PATH_SOURCE_INFO;

//
// Flags for source info structure (from OS to application through QDC)
//

#define DISPLAYCONFIG_SOURCE_IN_USE     0x00000001

typedef struct DISPLAYCONFIG_PATH_TARGET_INFO
{
    LUID                                    adapterId;
    UINT32                                  id;
    UINT32                                  modeInfoIdx;
    DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY   outputTechnology;
    DISPLAYCONFIG_ROTATION                  rotation;
    DISPLAYCONFIG_SCALING                   scaling;
    DISPLAYCONFIG_RATIONAL                  refreshRate;
    DISPLAYCONFIG_SCANLINE_ORDERING         scanLineOrdering;
    BOOL                                    targetAvailable;
    UINT32                                  statusFlags;
} DISPLAYCONFIG_PATH_TARGET_INFO;

//
// Status flags for target info structure (from OS to application through QDC)
//
#define DISPLAYCONFIG_TARGET_IN_USE                         0x00000001
#define DISPLAYCONFIG_TARGET_FORCIBLE                       0x00000002
#define DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_BOOT       0x00000004
#define DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_PATH       0x00000008
#define DISPLAYCONFIG_TARGET_FORCED_AVAILABILITY_SYSTEM     0x00000010

typedef struct DISPLAYCONFIG_PATH_INFO
{
    DISPLAYCONFIG_PATH_SOURCE_INFO  sourceInfo;
    DISPLAYCONFIG_PATH_TARGET_INFO  targetInfo;
    UINT32                          flags;
} DISPLAYCONFIG_PATH_INFO;

//
// Flags for path info structure (from OS to application through QDC)
//

#define DISPLAYCONFIG_PATH_ACTIVE       0x00000001

typedef enum
{
      DISPLAYCONFIG_TOPOLOGY_INTERNAL       = 0x00000001,
      DISPLAYCONFIG_TOPOLOGY_CLONE          = 0x00000002,
      DISPLAYCONFIG_TOPOLOGY_EXTEND         = 0x00000004,
      DISPLAYCONFIG_TOPOLOGY_EXTERNAL       = 0x00000008,
      DISPLAYCONFIG_TOPOLOGY_FORCE_UINT32   = 0xFFFFFFFF
} DISPLAYCONFIG_TOPOLOGY_ID;

typedef enum
{
      DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME             = 1,
      DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME             = 2,
      DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE   = 3,
      DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME            = 4,
      DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE      = 5,
      DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32                = 0xFFFFFFFF
} DISPLAYCONFIG_DEVICE_INFO_TYPE;

typedef struct DISPLAYCONFIG_DEVICE_INFO_HEADER
{
    DISPLAYCONFIG_DEVICE_INFO_TYPE  type;
    UINT32                          size;
    LUID                            adapterId;
    UINT32                          id;
} DISPLAYCONFIG_DEVICE_INFO_HEADER;

typedef struct DISPLAYCONFIG_SOURCE_DEVICE_NAME
{
    DISPLAYCONFIG_DEVICE_INFO_HEADER            header;
    WCHAR                                       viewGdiDeviceName[CCHDEVICENAME];
} DISPLAYCONFIG_SOURCE_DEVICE_NAME;

typedef struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS
{
    union
    {
        struct
        {
            UINT32  friendlyNameFromEdid : 1;
            UINT32  friendlyNameForced : 1;
            UINT32  edidIdsValid : 1;
            UINT32  reserved : 29;
        };
        UINT32  value;
    };
} DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS;

typedef struct DISPLAYCONFIG_TARGET_DEVICE_NAME
{
    DISPLAYCONFIG_DEVICE_INFO_HEADER            header;
    DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS      flags;
    DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY       outputTechnology;
    UINT16                                      edidManufactureId;
    UINT16                                      edidProductCodeId;
    UINT32                                      connectorInstance;
    WCHAR                                       monitorFriendlyDeviceName[64];
    WCHAR                                       monitorDevicePath[128];
} DISPLAYCONFIG_TARGET_DEVICE_NAME;

typedef struct DISPLAYCONFIG_TARGET_PREFERRED_MODE
{
    DISPLAYCONFIG_DEVICE_INFO_HEADER    header;
    UINT32                              width;
    UINT32                              height;
    DISPLAYCONFIG_TARGET_MODE           targetMode;
} DISPLAYCONFIG_TARGET_PREFERRED_MODE;

typedef struct DISPLAYCONFIG_ADAPTER_NAME
{
    DISPLAYCONFIG_DEVICE_INFO_HEADER    header;
    WCHAR                               adapterDevicePath[128];
} DISPLAYCONFIG_ADAPTER_NAME;

typedef struct DISPLAYCONFIG_SET_TARGET_PERSISTENCE
{
    DISPLAYCONFIG_DEVICE_INFO_HEADER    header;
    union
    {
        struct
        {
            UINT32 bootPersistenceOn    : 1;
            UINT32 reserved             : 31;
        };
        UINT32 value;
    };
} DISPLAYCONFIG_SET_TARGET_PERSISTENCE;

//
// Definitions to be used by GetDisplayConfigBufferSizes and QueryDisplayConfig.
//

#define QDC_ALL_PATHS                   0x00000001
#define QDC_ONLY_ACTIVE_PATHS           0x00000002
#define QDC_DATABASE_CURRENT            0x00000004

//
// Definitions used by SetDisplayConfig.
//

#define SDC_TOPOLOGY_INTERNAL           0x00000001
#define SDC_TOPOLOGY_CLONE              0x00000002
#define SDC_TOPOLOGY_EXTEND             0x00000004
#define SDC_TOPOLOGY_EXTERNAL           0x00000008
#define SDC_TOPOLOGY_SUPPLIED           0x00000010
#define SDC_USE_DATABASE_CURRENT        (SDC_TOPOLOGY_INTERNAL | SDC_TOPOLOGY_CLONE | SDC_TOPOLOGY_EXTEND | SDC_TOPOLOGY_EXTERNAL)

#define SDC_USE_SUPPLIED_DISPLAY_CONFIG 0x00000020
#define SDC_VALIDATE                    0x00000040
#define SDC_APPLY                       0x00000080
#define SDC_NO_OPTIMIZATION             0x00000100
#define SDC_SAVE_TO_DATABASE            0x00000200
#define SDC_ALLOW_CHANGES               0x00000400
#define SDC_PATH_PERSIST_IF_REQUIRED    0x00000800
#define SDC_FORCE_MODE_ENUMERATION      0x00001000
#define SDC_ALLOW_PATH_ORDER_CHANGES    0x00002000


#endif /* WINVER >= 0x0601 */

/* GetRegionData/ExtCreateRegion */

#define RDH_RECTANGLES  1

typedef struct _RGNDATAHEADER {
    DWORD   dwSize;
    DWORD   iType;
    DWORD   nCount;
    DWORD   nRgnSize;
    RECT    rcBound;
} RGNDATAHEADER, *PRGNDATAHEADER;

typedef struct _RGNDATA {
    RGNDATAHEADER   rdh;
    char            Buffer[1];
} RGNDATA, *PRGNDATA, NEAR *NPRGNDATA, FAR *LPRGNDATA;


/* for GetRandomRgn */
#define SYSRGN  4


typedef struct _ABC {
    int     abcA;
    UINT    abcB;
    int     abcC;
} ABC, *PABC, NEAR *NPABC, FAR *LPABC;

typedef struct _ABCFLOAT {
    FLOAT   abcfA;
    FLOAT   abcfB;
    FLOAT   abcfC;
} ABCFLOAT, *PABCFLOAT, NEAR *NPABCFLOAT, FAR *LPABCFLOAT;

#ifndef NOTEXTMETRIC

#ifdef _MAC
#include "pshpack4.h"
#endif
typedef struct _OUTLINETEXTMETRICA {
    UINT    otmSize;
    TEXTMETRICA otmTextMetrics;
    BYTE    otmFiller;
    PANOSE  otmPanoseNumber;
    UINT    otmfsSelection;
    UINT    otmfsType;
     int    otmsCharSlopeRise;
     int    otmsCharSlopeRun;
     int    otmItalicAngle;
    UINT    otmEMSquare;
     int    otmAscent;
     int    otmDescent;
    UINT    otmLineGap;
    UINT    otmsCapEmHeight;
    UINT    otmsXHeight;
    RECT    otmrcFontBox;
     int    otmMacAscent;
     int    otmMacDescent;
    UINT    otmMacLineGap;
    UINT    otmusMinimumPPEM;
    POINT   otmptSubscriptSize;
    POINT   otmptSubscriptOffset;
    POINT   otmptSuperscriptSize;
    POINT   otmptSuperscriptOffset;
    UINT    otmsStrikeoutSize;
     int    otmsStrikeoutPosition;
     int    otmsUnderscoreSize;
     int    otmsUnderscorePosition;
    PSTR    otmpFamilyName;
    PSTR    otmpFaceName;
    PSTR    otmpStyleName;
    PSTR    otmpFullName;
} OUTLINETEXTMETRICA, *POUTLINETEXTMETRICA, NEAR *NPOUTLINETEXTMETRICA, FAR *LPOUTLINETEXTMETRICA;
typedef struct _OUTLINETEXTMETRICW {
    UINT    otmSize;
    TEXTMETRICW otmTextMetrics;
    BYTE    otmFiller;
    PANOSE  otmPanoseNumber;
    UINT    otmfsSelection;
    UINT    otmfsType;
     int    otmsCharSlopeRise;
     int    otmsCharSlopeRun;
     int    otmItalicAngle;
    UINT    otmEMSquare;
     int    otmAscent;
     int    otmDescent;
    UINT    otmLineGap;
    UINT    otmsCapEmHeight;
    UINT    otmsXHeight;
    RECT    otmrcFontBox;
     int    otmMacAscent;
     int    otmMacDescent;
    UINT    otmMacLineGap;
    UINT    otmusMinimumPPEM;
    POINT   otmptSubscriptSize;
    POINT   otmptSubscriptOffset;
    POINT   otmptSuperscriptSize;
    POINT   otmptSuperscriptOffset;
    UINT    otmsStrikeoutSize;
     int    otmsStrikeoutPosition;
     int    otmsUnderscoreSize;
     int    otmsUnderscorePosition;
    PSTR    otmpFamilyName;
    PSTR    otmpFaceName;
    PSTR    otmpStyleName;
    PSTR    otmpFullName;
} OUTLINETEXTMETRICW, *POUTLINETEXTMETRICW, NEAR *NPOUTLINETEXTMETRICW, FAR *LPOUTLINETEXTMETRICW;
#ifdef UNICODE
typedef OUTLINETEXTMETRICW OUTLINETEXTMETRIC;
typedef POUTLINETEXTMETRICW POUTLINETEXTMETRIC;
typedef NPOUTLINETEXTMETRICW NPOUTLINETEXTMETRIC;
typedef LPOUTLINETEXTMETRICW LPOUTLINETEXTMETRIC;
#else
typedef OUTLINETEXTMETRICA OUTLINETEXTMETRIC;
typedef POUTLINETEXTMETRICA POUTLINETEXTMETRIC;
typedef NPOUTLINETEXTMETRICA NPOUTLINETEXTMETRIC;
typedef LPOUTLINETEXTMETRICA LPOUTLINETEXTMETRIC;
#endif // UNICODE

#ifdef _MAC
#include "poppack.h"
#endif

#endif /* NOTEXTMETRIC */


typedef struct tagPOLYTEXTA
{
    int       x;
    int       y;
    UINT      n;
    LPCSTR    lpstr;
    UINT      uiFlags;
    RECT      rcl;
    int      *pdx;
} POLYTEXTA, *PPOLYTEXTA, NEAR *NPPOLYTEXTA, FAR *LPPOLYTEXTA;
typedef struct tagPOLYTEXTW
{
    int       x;
    int       y;
    UINT      n;
    LPCWSTR   lpstr;
    UINT      uiFlags;
    RECT      rcl;
    int      *pdx;
} POLYTEXTW, *PPOLYTEXTW, NEAR *NPPOLYTEXTW, FAR *LPPOLYTEXTW;
#ifdef UNICODE
typedef POLYTEXTW POLYTEXT;
typedef PPOLYTEXTW PPOLYTEXT;
typedef NPPOLYTEXTW NPPOLYTEXT;
typedef LPPOLYTEXTW LPPOLYTEXT;
#else
typedef POLYTEXTA POLYTEXT;
typedef PPOLYTEXTA PPOLYTEXT;
typedef NPPOLYTEXTA NPPOLYTEXT;
typedef LPPOLYTEXTA LPPOLYTEXT;
#endif // UNICODE

typedef struct _FIXED {
#ifndef _MAC
    WORD    fract;
    short   value;
#else
    short   value;
    WORD    fract;
#endif
} FIXED;


typedef struct _MAT2 {
     FIXED  eM11;
     FIXED  eM12;
     FIXED  eM21;
     FIXED  eM22;
} MAT2, FAR *LPMAT2;



typedef struct _GLYPHMETRICS {
    UINT    gmBlackBoxX;
    UINT    gmBlackBoxY;
    POINT   gmptGlyphOrigin;
    short   gmCellIncX;
    short   gmCellIncY;
} GLYPHMETRICS, FAR *LPGLYPHMETRICS;

//  GetGlyphOutline constants

#define GGO_METRICS        0
#define GGO_BITMAP         1
#define GGO_NATIVE         2
#define GGO_BEZIER         3

#if(WINVER >= 0x0400)
#define  GGO_GRAY2_BITMAP   4
#define  GGO_GRAY4_BITMAP   5
#define  GGO_GRAY8_BITMAP   6
#define  GGO_GLYPH_INDEX    0x0080
#endif /* WINVER >= 0x0400 */

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define  GGO_UNHINTED       0x0100
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)

#define TT_POLYGON_TYPE   24

#define TT_PRIM_LINE       1
#define TT_PRIM_QSPLINE    2
#define TT_PRIM_CSPLINE    3

typedef struct tagPOINTFX
{
    FIXED x;
    FIXED y;
} POINTFX, FAR* LPPOINTFX;

typedef struct tagTTPOLYCURVE
{
    WORD    wType;
    WORD    cpfx;
    POINTFX apfx[1];
} TTPOLYCURVE, FAR* LPTTPOLYCURVE;

typedef struct tagTTPOLYGONHEADER
{
    DWORD   cb;
    DWORD   dwType;
    POINTFX pfxStart;
} TTPOLYGONHEADER, FAR* LPTTPOLYGONHEADER;


#if(WINVER >= 0x0400)
#define GCP_DBCS           0x0001
#define GCP_REORDER        0x0002
#define GCP_USEKERNING     0x0008
#define GCP_GLYPHSHAPE     0x0010
#define GCP_LIGATE         0x0020
////#define GCP_GLYPHINDEXING  0x0080
#define GCP_DIACRITIC      0x0100
#define GCP_KASHIDA        0x0400
#define GCP_ERROR          0x8000
#define FLI_MASK           0x103B

#define GCP_JUSTIFY        0x00010000L
////#define GCP_NODIACRITICS   0x00020000L
#define FLI_GLYPHS         0x00040000L
#define GCP_CLASSIN        0x00080000L
#define GCP_MAXEXTENT      0x00100000L
#define GCP_JUSTIFYIN      0x00200000L
#define GCP_DISPLAYZWG      0x00400000L
#define GCP_SYMSWAPOFF      0x00800000L
#define GCP_NUMERICOVERRIDE 0x01000000L
#define GCP_NEUTRALOVERRIDE 0x02000000L
#define GCP_NUMERICSLATIN   0x04000000L
#define GCP_NUMERICSLOCAL   0x08000000L

#define GCPCLASS_LATIN                  1
#define GCPCLASS_HEBREW                 2
#define GCPCLASS_ARABIC                 2
#define GCPCLASS_NEUTRAL                3
#define GCPCLASS_LOCALNUMBER            4
#define GCPCLASS_LATINNUMBER            5
#define GCPCLASS_LATINNUMERICTERMINATOR 6
#define GCPCLASS_LATINNUMERICSEPARATOR  7
#define GCPCLASS_NUMERICSEPARATOR       8
#define GCPCLASS_PREBOUNDLTR         0x80
#define GCPCLASS_PREBOUNDRTL         0x40
#define GCPCLASS_POSTBOUNDLTR        0x20
#define GCPCLASS_POSTBOUNDRTL        0x10

#define GCPGLYPH_LINKBEFORE          0x8000
#define GCPGLYPH_LINKAFTER           0x4000


typedef struct tagGCP_RESULTSA
    {
    DWORD   lStructSize;
    LPSTR     lpOutString;
    UINT FAR *lpOrder;
    int FAR  *lpDx;
    int FAR  *lpCaretPos;
    LPSTR   lpClass;
    LPWSTR  lpGlyphs;
    UINT    nGlyphs;
    int     nMaxFit;
    } GCP_RESULTSA, FAR* LPGCP_RESULTSA;
typedef struct tagGCP_RESULTSW
    {
    DWORD   lStructSize;
    LPWSTR    lpOutString;
    UINT FAR *lpOrder;
    int FAR  *lpDx;
    int FAR  *lpCaretPos;
    LPSTR   lpClass;
    LPWSTR  lpGlyphs;
    UINT    nGlyphs;
    int     nMaxFit;
    } GCP_RESULTSW, FAR* LPGCP_RESULTSW;
#ifdef UNICODE
typedef GCP_RESULTSW GCP_RESULTS;
typedef LPGCP_RESULTSW LPGCP_RESULTS;
#else
typedef GCP_RESULTSA GCP_RESULTS;
typedef LPGCP_RESULTSA LPGCP_RESULTS;
#endif // UNICODE
#endif /* WINVER >= 0x0400 */

typedef struct _RASTERIZER_STATUS {
    short   nSize;
    short   wFlags;
    short   nLanguageID;
} RASTERIZER_STATUS, FAR *LPRASTERIZER_STATUS;

/* bits defined in wFlags of RASTERIZER_STATUS */
#define TT_AVAILABLE    0x0001
#define TT_ENABLED      0x0002

/* Pixel format descriptor */
typedef struct tagPIXELFORMATDESCRIPTOR
{
    WORD  nSize;
    WORD  nVersion;
    DWORD dwFlags;
    BYTE  iPixelType;
    BYTE  cColorBits;
    BYTE  cRedBits;
    BYTE  cRedShift;
    BYTE  cGreenBits;
    BYTE  cGreenShift;
    BYTE  cBlueBits;
    BYTE  cBlueShift;
    BYTE  cAlphaBits;
    BYTE  cAlphaShift;
    BYTE  cAccumBits;
    BYTE  cAccumRedBits;
    BYTE  cAccumGreenBits;
    BYTE  cAccumBlueBits;
    BYTE  cAccumAlphaBits;
    BYTE  cDepthBits;
    BYTE  cStencilBits;
    BYTE  cAuxBuffers;
    BYTE  iLayerType;
    BYTE  bReserved;
    DWORD dwLayerMask;
    DWORD dwVisibleMask;
    DWORD dwDamageMask;
} PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR, FAR *LPPIXELFORMATDESCRIPTOR;

/* pixel types */
#define PFD_TYPE_RGBA        0
#define PFD_TYPE_COLORINDEX  1

/* layer types */
#define PFD_MAIN_PLANE       0
#define PFD_OVERLAY_PLANE    1
#define PFD_UNDERLAY_PLANE   (-1)

/* PIXELFORMATDESCRIPTOR flags */
#define PFD_DOUBLEBUFFER            0x00000001
#define PFD_STEREO                  0x00000002
#define PFD_DRAW_TO_WINDOW          0x00000004
#define PFD_DRAW_TO_BITMAP          0x00000008
#define PFD_SUPPORT_GDI             0x00000010
#define PFD_SUPPORT_OPENGL          0x00000020
#define PFD_GENERIC_FORMAT          0x00000040
#define PFD_NEED_PALETTE            0x00000080
#define PFD_NEED_SYSTEM_PALETTE     0x00000100
#define PFD_SWAP_EXCHANGE           0x00000200
#define PFD_SWAP_COPY               0x00000400
#define PFD_SWAP_LAYER_BUFFERS      0x00000800
#define PFD_GENERIC_ACCELERATED     0x00001000
#define PFD_SUPPORT_DIRECTDRAW      0x00002000
#define PFD_DIRECT3D_ACCELERATED    0x00004000
#define PFD_SUPPORT_COMPOSITION     0x00008000

/* PIXELFORMATDESCRIPTOR flags for use in ChoosePixelFormat only */
#define PFD_DEPTH_DONTCARE          0x20000000
#define PFD_DOUBLEBUFFER_DONTCARE   0x40000000
#define PFD_STEREO_DONTCARE         0x80000000

#ifdef STRICT
#if !defined(NOTEXTMETRIC)
typedef int (CALLBACK* OLDFONTENUMPROCA)(CONST LOGFONTA *, CONST TEXTMETRICA *, DWORD, LPARAM);
typedef int (CALLBACK* OLDFONTENUMPROCW)(CONST LOGFONTW *, CONST TEXTMETRICW *, DWORD, LPARAM);
#ifdef UNICODE
#define OLDFONTENUMPROC  OLDFONTENUMPROCW
#else
#define OLDFONTENUMPROC  OLDFONTENUMPROCA
#endif // !UNICODE
#else
typedef int (CALLBACK* OLDFONTENUMPROCA)(CONST LOGFONTA *, CONST VOID *, DWORD, LPARAM);
typedef int (CALLBACK* OLDFONTENUMPROCW)(CONST LOGFONTW *, CONST VOID *, DWORD, LPARAM);
#ifdef UNICODE
#define OLDFONTENUMPROC  OLDFONTENUMPROCW
#else
#define OLDFONTENUMPROC  OLDFONTENUMPROCA
#endif // !UNICODE
#endif

typedef OLDFONTENUMPROCA    FONTENUMPROCA;
typedef OLDFONTENUMPROCW    FONTENUMPROCW;
#ifdef UNICODE
typedef FONTENUMPROCW FONTENUMPROC;
#else
typedef FONTENUMPROCA FONTENUMPROC;
#endif // UNICODE

typedef int (CALLBACK* GOBJENUMPROC)(LPVOID, LPARAM);
typedef VOID (CALLBACK* LINEDDAPROC)(int, int, LPARAM);
#else
typedef FARPROC OLDFONTENUMPROC;
typedef FARPROC FONTENUMPROCA;
typedef FARPROC FONTENUMPROCW;
#ifdef UNICODE
typedef FONTENUMPROCW FONTENUMPROC;
#else
typedef FONTENUMPROCA FONTENUMPROC;
#endif // UNICODE
typedef FARPROC GOBJENUMPROC;
typedef FARPROC LINEDDAPROC;
#endif



WINGDIAPI int WINAPI AddFontResourceA(__in LPCSTR);
WINGDIAPI int WINAPI AddFontResourceW(__in LPCWSTR);
#ifdef UNICODE
#define AddFontResource  AddFontResourceW
#else
#define AddFontResource  AddFontResourceA
#endif // !UNICODE

__gdi_entry WINGDIAPI BOOL  WINAPI AnimatePalette( __in HPALETTE hPal, __in UINT iStartIndex, __in  UINT cEntries, __in_ecount(cEntries) CONST PALETTEENTRY * ppe);
__gdi_entry WINGDIAPI BOOL  WINAPI Arc( __in HDC hdc, __in int x1, __in int y1, __in int x2, __in int y2, __in int x3, __in int y3, __in int x4, __in int y4);
__gdi_entry WINGDIAPI BOOL  WINAPI BitBlt( __in HDC hdc, __in int x, __in int y, __in int cx, __in int cy, __in_opt HDC hdcSrc, __in int x1, __in int y1, __in DWORD rop);
WINGDIAPI BOOL  WINAPI CancelDC( __in HDC hdc);
__gdi_entry WINGDIAPI BOOL  WINAPI Chord( __in HDC hdc, __in int x1, __in int y1, __in int x2, __in int y2, __in int x3, __in int y3, __in int x4, __in int y4);
WINGDIAPI int   WINAPI ChoosePixelFormat( __in HDC hdc, __in CONST PIXELFORMATDESCRIPTOR *ppfd);
WINGDIAPI HMETAFILE  WINAPI CloseMetaFile( __in HDC hdc);
WINGDIAPI int     WINAPI CombineRgn( __in_opt HRGN hrgnDst, __in_opt HRGN hrgnSrc1, __in_opt HRGN hrgnSrc2, __in int iMode);
WINGDIAPI HMETAFILE WINAPI CopyMetaFileA( __in HMETAFILE, __in_opt LPCSTR);
WINGDIAPI HMETAFILE WINAPI CopyMetaFileW( __in HMETAFILE, __in_opt LPCWSTR);
#ifdef UNICODE
#define CopyMetaFile  CopyMetaFileW
#else
#define CopyMetaFile  CopyMetaFileA
#endif // !UNICODE
__gdi_entry WINGDIAPI HBITMAP WINAPI CreateBitmap( __in int nWidth, __in int nHeight, __in UINT nPlanes, __in UINT nBitCount, __in_opt CONST VOID *lpBits);
__gdi_entry WINGDIAPI HBITMAP WINAPI CreateBitmapIndirect( __in CONST BITMAP *pbm);
__gdi_entry WINGDIAPI HBRUSH  WINAPI CreateBrushIndirect( __in CONST LOGBRUSH *plbrush);
WINGDIAPI HBITMAP WINAPI CreateCompatibleBitmap( __in HDC hdc, __in int cx, __in int cy);
WINGDIAPI HBITMAP WINAPI CreateDiscardableBitmap( __in HDC hdc, __in int cx, __in int cy);
WINGDIAPI HDC     WINAPI CreateCompatibleDC( __in_opt HDC hdc);
WINGDIAPI HDC     WINAPI CreateDCA( __in_opt LPCSTR pwszDriver, __in_opt LPCSTR pwszDevice, __in_opt LPCSTR pszPort, __in_opt CONST DEVMODEA * pdm);
WINGDIAPI HDC     WINAPI CreateDCW( __in_opt LPCWSTR pwszDriver, __in_opt LPCWSTR pwszDevice, __in_opt LPCWSTR pszPort, __in_opt CONST DEVMODEW * pdm);
#ifdef UNICODE
#define CreateDC  CreateDCW
#else
#define CreateDC  CreateDCA
#endif // !UNICODE
WINGDIAPI HBITMAP WINAPI CreateDIBitmap( __in HDC hdc, __in_opt CONST BITMAPINFOHEADER *pbmih, __in DWORD flInit, __in_opt CONST VOID *pjBits, __in_opt CONST BITMAPINFO *pbmi, __in UINT iUsage);
WINGDIAPI HBRUSH  WINAPI CreateDIBPatternBrush( __in HGLOBAL h, __in UINT iUsage);
__gdi_entry WINGDIAPI HBRUSH  WINAPI CreateDIBPatternBrushPt( __in CONST VOID *lpPackedDIB, __in UINT iUsage);
WINGDIAPI HRGN    WINAPI CreateEllipticRgn( __in int x1, __in int y1, __in int x2, __in int y2);
WINGDIAPI HRGN    WINAPI CreateEllipticRgnIndirect( __in CONST RECT *lprect);
__gdi_entry WINGDIAPI HFONT   WINAPI CreateFontIndirectA( __in CONST LOGFONTA *lplf);
__gdi_entry WINGDIAPI HFONT   WINAPI CreateFontIndirectW( __in CONST LOGFONTW *lplf);
#ifdef UNICODE
#define CreateFontIndirect  CreateFontIndirectW
#else
#define CreateFontIndirect  CreateFontIndirectA
#endif // !UNICODE
WINGDIAPI HFONT   WINAPI CreateFontA( __in int cHeight, __in int cWidth, __in int cEscapement, __in int cOrientation, __in int cWeight, __in DWORD bItalic,
                             __in DWORD bUnderline, __in DWORD bStrikeOut, __in DWORD iCharSet, __in DWORD iOutPrecision, __in DWORD iClipPrecision,
                             __in DWORD iQuality, __in DWORD iPitchAndFamily, __in_opt LPCSTR pszFaceName);
WINGDIAPI HFONT   WINAPI CreateFontW( __in int cHeight, __in int cWidth, __in int cEscapement, __in int cOrientation, __in int cWeight, __in DWORD bItalic,
                             __in DWORD bUnderline, __in DWORD bStrikeOut, __in DWORD iCharSet, __in DWORD iOutPrecision, __in DWORD iClipPrecision,
                             __in DWORD iQuality, __in DWORD iPitchAndFamily, __in_opt LPCWSTR pszFaceName);
#ifdef UNICODE
#define CreateFont  CreateFontW
#else
#define CreateFont  CreateFontA
#endif // !UNICODE

WINGDIAPI HBRUSH  WINAPI CreateHatchBrush( __in int iHatch, __in COLORREF color);
WINGDIAPI HDC     WINAPI CreateICA( __in_opt LPCSTR pszDriver, __in_opt LPCSTR pszDevice, __in_opt LPCSTR pszPort, __in_opt CONST DEVMODEA * pdm);
WINGDIAPI HDC     WINAPI CreateICW( __in_opt LPCWSTR pszDriver, __in_opt LPCWSTR pszDevice, __in_opt LPCWSTR pszPort, __in_opt CONST DEVMODEW * pdm);
#ifdef UNICODE
#define CreateIC  CreateICW
#else
#define CreateIC  CreateICA
#endif // !UNICODE
WINGDIAPI HDC     WINAPI CreateMetaFileA( __in_opt LPCSTR pszFile);
WINGDIAPI HDC     WINAPI CreateMetaFileW( __in_opt LPCWSTR pszFile);
#ifdef UNICODE
#define CreateMetaFile  CreateMetaFileW
#else
#define CreateMetaFile  CreateMetaFileA
#endif // !UNICODE
__gdi_entry WINGDIAPI HPALETTE WINAPI CreatePalette( __in_xcount(2*sizeof(WORD) + plpal->palNumEntries * sizeof(PALETTEENTRY)) CONST LOGPALETTE * plpal);
WINGDIAPI HPEN    WINAPI CreatePen( __in int iStyle, __in int cWidth, __in COLORREF color);
__gdi_entry WINGDIAPI HPEN    WINAPI CreatePenIndirect( __in CONST LOGPEN *plpen);
WINGDIAPI HRGN    WINAPI CreatePolyPolygonRgn(  __in CONST POINT *pptl,
                                                __in CONST INT  *pc,
                                                __in int cPoly,
                                                __in int iMode);
__gdi_entry WINGDIAPI HBRUSH  WINAPI CreatePatternBrush( __in HBITMAP hbm);
WINGDIAPI HRGN    WINAPI CreateRectRgn( __in int x1, __in int y1, __in int x2, __in int y2);
WINGDIAPI HRGN    WINAPI CreateRectRgnIndirect( __in CONST RECT *lprect);
WINGDIAPI HRGN    WINAPI CreateRoundRectRgn( __in int x1, __in int y1, __in int x2, __in int y2, __in int w, __in int h);
WINGDIAPI BOOL    WINAPI CreateScalableFontResourceA( __in DWORD fdwHidden, __in LPCSTR lpszFont, __in LPCSTR lpszFile, __in_opt LPCSTR lpszPath);
WINGDIAPI BOOL    WINAPI CreateScalableFontResourceW( __in DWORD fdwHidden, __in LPCWSTR lpszFont, __in LPCWSTR lpszFile, __in_opt LPCWSTR lpszPath);
#ifdef UNICODE
#define CreateScalableFontResource  CreateScalableFontResourceW
#else
#define CreateScalableFontResource  CreateScalableFontResourceA
#endif // !UNICODE
WINGDIAPI HBRUSH  WINAPI CreateSolidBrush( __in COLORREF color);

WINGDIAPI BOOL WINAPI DeleteDC( __in HDC hdc);
WINGDIAPI BOOL WINAPI DeleteMetaFile( __in HMETAFILE hmf);
__gdi_entry WINGDIAPI BOOL WINAPI DeleteObject( __in HGDIOBJ ho);
WINGDIAPI int  WINAPI DescribePixelFormat(  __in HDC hdc,
                                            __in int iPixelFormat,
                                            __in UINT nBytes,
                                            __out_bcount_opt(nBytes) LPPIXELFORMATDESCRIPTOR ppfd);

/* define types of pointers to ExtDeviceMode() and DeviceCapabilities()
 * functions for Win 3.1 compatibility
 */

typedef UINT   (CALLBACK* LPFNDEVMODE)(HWND, HMODULE, LPDEVMODE, LPSTR, LPSTR, LPDEVMODE, LPSTR, UINT);

typedef DWORD  (CALLBACK* LPFNDEVCAPS)(LPSTR, LPSTR, UINT, LPSTR, LPDEVMODE);

/* mode selections for the device mode function */
#define DM_UPDATE           1
#define DM_COPY             2
#define DM_PROMPT           4
#define DM_MODIFY           8

#define DM_IN_BUFFER        DM_MODIFY
#define DM_IN_PROMPT        DM_PROMPT
#define DM_OUT_BUFFER       DM_COPY
#define DM_OUT_DEFAULT      DM_UPDATE

/* device capabilities indices */
#define DC_FIELDS           1
#define DC_PAPERS           2
#define DC_PAPERSIZE        3
#define DC_MINEXTENT        4
#define DC_MAXEXTENT        5
#define DC_BINS             6
#define DC_DUPLEX           7
#define DC_SIZE             8
#define DC_EXTRA            9
#define DC_VERSION          10
#define DC_DRIVER           11
#define DC_BINNAMES         12
#define DC_ENUMRESOLUTIONS  13
#define DC_FILEDEPENDENCIES 14
#define DC_TRUETYPE         15
#define DC_PAPERNAMES       16
#define DC_ORIENTATION      17
#define DC_COPIES           18
#if(WINVER >= 0x0400)
#define DC_BINADJUST            19
#define DC_EMF_COMPLIANT        20
#define DC_DATATYPE_PRODUCED    21
#define DC_COLLATE              22
#define DC_MANUFACTURER         23
#define DC_MODEL                24
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0500)
#define DC_PERSONALITY          25
#define DC_PRINTRATE            26
#define DC_PRINTRATEUNIT        27
#define   PRINTRATEUNIT_PPM     1
#define   PRINTRATEUNIT_CPS     2
#define   PRINTRATEUNIT_LPM     3
#define   PRINTRATEUNIT_IPM     4
#define DC_PRINTERMEM           28
#define DC_MEDIAREADY           29
#define DC_STAPLE               30
#define DC_PRINTRATEPPM         31
#define DC_COLORDEVICE          32
#define DC_NUP                  33
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define DC_MEDIATYPENAMES       34
#define DC_MEDIATYPES           35
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#endif /* WINVER >= 0x0500 */

/* bit fields of the return value (DWORD) for DC_TRUETYPE */
#define DCTT_BITMAP             0x0000001L
#define DCTT_DOWNLOAD           0x0000002L
#define DCTT_SUBDEV             0x0000004L
#if(WINVER >= 0x0400)
#define DCTT_DOWNLOAD_OUTLINE   0x0000008L

/* return values for DC_BINADJUST */
#define DCBA_FACEUPNONE       0x0000
#define DCBA_FACEUPCENTER     0x0001
#define DCBA_FACEUPLEFT       0x0002
#define DCBA_FACEUPRIGHT      0x0003
#define DCBA_FACEDOWNNONE     0x0100
#define DCBA_FACEDOWNCENTER   0x0101
#define DCBA_FACEDOWNLEFT     0x0102
#define DCBA_FACEDOWNRIGHT    0x0103
#endif /* WINVER >= 0x0400 */

WINSPOOLAPI
int
WINAPI
DeviceCapabilitiesA(
    __in                LPCSTR         pDevice,
    __in_opt            LPCSTR         pPort,
    __in                WORD             fwCapability,
    __out_xcount_opt(1) LPSTR          pOutput,
    __in_opt            CONST DEVMODEA   *pDevMode
    );
WINSPOOLAPI
int
WINAPI
DeviceCapabilitiesW(
    __in                LPCWSTR         pDevice,
    __in_opt            LPCWSTR         pPort,
    __in                WORD             fwCapability,
    __out_xcount_opt(1) LPWSTR          pOutput,
    __in_opt            CONST DEVMODEW   *pDevMode
    );
#ifdef UNICODE
#define DeviceCapabilities  DeviceCapabilitiesW
#else
#define DeviceCapabilities  DeviceCapabilitiesA
#endif // !UNICODE

WINGDIAPI int  WINAPI DrawEscape(   __in HDC    hdc,
                                    __in int    iEscape,
                                    __in int    cjIn,
                                    __in_bcount_opt(cjIn) LPCSTR lpIn);

__gdi_entry WINGDIAPI BOOL WINAPI Ellipse( __in HDC hdc, __in int left, __in int top,  __in int right, __in int bottom);

#if(WINVER >= 0x0400)
WINGDIAPI int  WINAPI EnumFontFamiliesExA( __in HDC hdc, __in LPLOGFONTA lpLogfont, __in FONTENUMPROCA lpProc, __in LPARAM lParam, __in DWORD dwFlags);
WINGDIAPI int  WINAPI EnumFontFamiliesExW( __in HDC hdc, __in LPLOGFONTW lpLogfont, __in FONTENUMPROCW lpProc, __in LPARAM lParam, __in DWORD dwFlags);
#ifdef UNICODE
#define EnumFontFamiliesEx  EnumFontFamiliesExW
#else
#define EnumFontFamiliesEx  EnumFontFamiliesExA
#endif // !UNICODE
#endif /* WINVER >= 0x0400 */

WINGDIAPI int  WINAPI EnumFontFamiliesA( __in HDC hdc, __in_opt LPCSTR lpLogfont, __in FONTENUMPROCA lpProc, __in LPARAM lParam);
WINGDIAPI int  WINAPI EnumFontFamiliesW( __in HDC hdc, __in_opt LPCWSTR lpLogfont, __in FONTENUMPROCW lpProc, __in LPARAM lParam);
#ifdef UNICODE
#define EnumFontFamilies  EnumFontFamiliesW
#else
#define EnumFontFamilies  EnumFontFamiliesA
#endif // !UNICODE
WINGDIAPI int  WINAPI EnumFontsA( __in HDC hdc, __in_opt LPCSTR lpLogfont,  __in FONTENUMPROCA lpProc, __in LPARAM lParam);
WINGDIAPI int  WINAPI EnumFontsW( __in HDC hdc, __in_opt LPCWSTR lpLogfont,  __in FONTENUMPROCW lpProc, __in LPARAM lParam);
#ifdef UNICODE
#define EnumFonts  EnumFontsW
#else
#define EnumFonts  EnumFontsA
#endif // !UNICODE

#ifdef STRICT
WINGDIAPI int  WINAPI EnumObjects( __in HDC hdc, __in int nType, __in GOBJENUMPROC lpFunc, __in LPARAM lParam);
#else
WINGDIAPI int  WINAPI EnumObjects( __in HDC hdc, __in int nType, __in GOBJENUMPROC lpFunc, __in LPVOID lParam);
#endif


WINGDIAPI BOOL WINAPI EqualRgn( __in HRGN hrgn1, __in HRGN hrgn2);
__gdi_entry WINGDIAPI int  WINAPI Escape(   __in HDC hdc,
                                __in int iEscape,
                                __in int cjIn,
                                __in_bcount_opt(cjIn) LPCSTR pvIn,
                                __out_opt LPVOID pvOut);
WINGDIAPI int  WINAPI ExtEscape(    __in HDC hdc,
                                    __in int iEscape,
                                    __in int cjInput,
                                    __in_bcount_opt(cjInput) LPCSTR lpInData,
                                    __in int cjOutput,
                                    __out_bcount_opt(cjOutput) LPSTR lpOutData);
__gdi_entry WINGDIAPI int  WINAPI ExcludeClipRect( __in HDC hdc, __in int left, __in int top, __in int right, __in int bottom);
__gdi_entry WINGDIAPI HRGN WINAPI ExtCreateRegion( __in_opt CONST XFORM * lpx, __in DWORD nCount, __in_bcount(nCount) CONST RGNDATA * lpData);
__gdi_entry WINGDIAPI BOOL WINAPI ExtFloodFill( __in HDC hdc, __in int x, __in int y, __in COLORREF color, __in UINT type);
__gdi_entry WINGDIAPI BOOL WINAPI FillRgn( __in HDC hdc, __in HRGN hrgn, __in HBRUSH hbr);
__gdi_entry WINGDIAPI BOOL WINAPI FloodFill( __in HDC hdc, __in int x, __in int y, __in COLORREF color);
__gdi_entry WINGDIAPI BOOL WINAPI FrameRgn( __in HDC hdc, __in HRGN hrgn, __in HBRUSH hbr, __in int w, __in int h);
WINGDIAPI int  WINAPI GetROP2( __in HDC hdc);
WINGDIAPI BOOL WINAPI GetAspectRatioFilterEx( __in HDC hdc, __out LPSIZE lpsize);
WINGDIAPI COLORREF WINAPI GetBkColor( __in HDC hdc);

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
WINGDIAPI COLORREF WINAPI GetDCBrushColor( __in HDC hdc);
WINGDIAPI COLORREF WINAPI GetDCPenColor( __in HDC hdc);
#endif

WINGDIAPI
int
WINAPI
GetBkMode(
    __in HDC hdc
    );

WINGDIAPI
LONG
WINAPI
GetBitmapBits(
    __in HBITMAP hbit,
    __in LONG cb,
    __out_bcount(cb) LPVOID lpvBits
    );

WINGDIAPI BOOL  WINAPI GetBitmapDimensionEx( __in HBITMAP hbit, __out LPSIZE lpsize);
WINGDIAPI UINT  WINAPI GetBoundsRect( __in HDC hdc, __out LPRECT lprect, __in UINT flags);

WINGDIAPI BOOL  WINAPI GetBrushOrgEx( __in HDC hdc, __out LPPOINT lppt);

WINGDIAPI BOOL  WINAPI GetCharWidthA( __in HDC hdc, __in UINT iFirst, __in UINT iLast, __out_ecount(iLast + 1 - iFirst) LPINT lpBuffer);
WINGDIAPI BOOL  WINAPI GetCharWidthW( __in HDC hdc, __in UINT iFirst, __in UINT iLast, __out_ecount(iLast + 1 - iFirst) LPINT lpBuffer);
#ifdef UNICODE
#define GetCharWidth  GetCharWidthW
#else
#define GetCharWidth  GetCharWidthA
#endif // !UNICODE
WINGDIAPI BOOL  WINAPI GetCharWidth32A( __in HDC hdc, __in UINT iFirst, __in UINT iLast,  __out_ecount(iLast + 1 - iFirst) LPINT lpBuffer);
WINGDIAPI BOOL  WINAPI GetCharWidth32W( __in HDC hdc, __in UINT iFirst, __in UINT iLast,  __out_ecount(iLast + 1 - iFirst) LPINT lpBuffer);
#ifdef UNICODE
#define GetCharWidth32  GetCharWidth32W
#else
#define GetCharWidth32  GetCharWidth32A
#endif // !UNICODE
WINGDIAPI BOOL  APIENTRY GetCharWidthFloatA( __in HDC hdc, __in UINT iFirst, __in UINT iLast, __out_ecount(iLast + 1 - iFirst) PFLOAT lpBuffer);
WINGDIAPI BOOL  APIENTRY GetCharWidthFloatW( __in HDC hdc, __in UINT iFirst, __in UINT iLast, __out_ecount(iLast + 1 - iFirst) PFLOAT lpBuffer);
#ifdef UNICODE
#define GetCharWidthFloat  GetCharWidthFloatW
#else
#define GetCharWidthFloat  GetCharWidthFloatA
#endif // !UNICODE

WINGDIAPI BOOL  APIENTRY GetCharABCWidthsA( __in HDC hdc,
                                            __in UINT wFirst,
                                            __in UINT wLast,
                                            __out_ecount(wLast - wFirst + 1) LPABC lpABC);
WINGDIAPI BOOL  APIENTRY GetCharABCWidthsW( __in HDC hdc,
                                            __in UINT wFirst,
                                            __in UINT wLast,
                                            __out_ecount(wLast - wFirst + 1) LPABC lpABC);
#ifdef UNICODE
#define GetCharABCWidths  GetCharABCWidthsW
#else
#define GetCharABCWidths  GetCharABCWidthsA
#endif // !UNICODE

WINGDIAPI BOOL  APIENTRY GetCharABCWidthsFloatA( __in HDC hdc, __in UINT iFirst, __in UINT iLast, __out_ecount(iLast + 1 - iFirst) LPABCFLOAT lpABC);
WINGDIAPI BOOL  APIENTRY GetCharABCWidthsFloatW( __in HDC hdc, __in UINT iFirst, __in UINT iLast, __out_ecount(iLast + 1 - iFirst) LPABCFLOAT lpABC);
#ifdef UNICODE
#define GetCharABCWidthsFloat  GetCharABCWidthsFloatW
#else
#define GetCharABCWidthsFloat  GetCharABCWidthsFloatA
#endif // !UNICODE
WINGDIAPI int   WINAPI GetClipBox( __in HDC hdc,  __out LPRECT lprect);
WINGDIAPI int   WINAPI GetClipRgn( __in HDC hdc, __in HRGN hrgn);
WINGDIAPI int   WINAPI GetMetaRgn( __in HDC hdc, __in HRGN hrgn);
WINGDIAPI HGDIOBJ WINAPI GetCurrentObject( __in HDC hdc, __in UINT type);
WINGDIAPI BOOL  WINAPI GetCurrentPositionEx( __in HDC hdc,  __out LPPOINT lppt);
WINGDIAPI int   WINAPI GetDeviceCaps( __in_opt HDC hdc, __in int index);
WINGDIAPI int   WINAPI GetDIBits( __in HDC hdc, __in HBITMAP hbm, __in UINT start, __in UINT cLines,  __out_opt LPVOID lpvBits, __inout_xcount(sizeof(BITMAPINFOHEADER)) LPBITMAPINFO lpbmi, __in UINT usage);  // SAL actual size of lpbmi is computed from structure elements

__success(return != GDI_ERROR)
WINGDIAPI DWORD WINAPI GetFontData (    __in HDC     hdc,
                                        __in DWORD   dwTable,
                                        __in DWORD   dwOffset,
                                        __out_bcount_part_opt(cjBuffer, return) PVOID pvBuffer,
                                        __in DWORD   cjBuffer
                                        );

WINGDIAPI DWORD WINAPI GetGlyphOutlineA(    __in HDC hdc,
                                            __in UINT uChar,
                                            __in UINT fuFormat,
                                            __out LPGLYPHMETRICS lpgm,
                                            __in DWORD cjBuffer,
                                            __out_bcount_opt(cjBuffer) LPVOID pvBuffer,
                                            __in CONST MAT2 *lpmat2
                                        );
WINGDIAPI DWORD WINAPI GetGlyphOutlineW(    __in HDC hdc,
                                            __in UINT uChar,
                                            __in UINT fuFormat,
                                            __out LPGLYPHMETRICS lpgm,
                                            __in DWORD cjBuffer,
                                            __out_bcount_opt(cjBuffer) LPVOID pvBuffer,
                                            __in CONST MAT2 *lpmat2
                                        );
#ifdef UNICODE
#define GetGlyphOutline  GetGlyphOutlineW
#else
#define GetGlyphOutline  GetGlyphOutlineA
#endif // !UNICODE

WINGDIAPI int   WINAPI GetGraphicsMode( __in HDC hdc);
WINGDIAPI int   WINAPI GetMapMode( __in HDC hdc);
WINGDIAPI UINT  WINAPI GetMetaFileBitsEx(__in HMETAFILE hMF, __in UINT cbBuffer, __out_bcount_opt(cbBuffer) LPVOID lpData);
WINGDIAPI HMETAFILE   WINAPI GetMetaFileA( __in LPCSTR lpName);
WINGDIAPI HMETAFILE   WINAPI GetMetaFileW( __in LPCWSTR lpName);
#ifdef UNICODE
#define GetMetaFile  GetMetaFileW
#else
#define GetMetaFile  GetMetaFileA
#endif // !UNICODE
WINGDIAPI COLORREF WINAPI GetNearestColor( __in HDC hdc, __in COLORREF color);
WINGDIAPI UINT  WINAPI GetNearestPaletteIndex( __in HPALETTE h, __in COLORREF color);
WINGDIAPI DWORD WINAPI GetObjectType( __in HGDIOBJ h);

#ifndef NOTEXTMETRIC

WINGDIAPI UINT APIENTRY GetOutlineTextMetricsA( __in HDC hdc,
                                                __in UINT cjCopy,
                                                __out_bcount_opt(cjCopy) LPOUTLINETEXTMETRICA potm);
WINGDIAPI UINT APIENTRY GetOutlineTextMetricsW( __in HDC hdc,
                                                __in UINT cjCopy,
                                                __out_bcount_opt(cjCopy) LPOUTLINETEXTMETRICW potm);
#ifdef UNICODE
#define GetOutlineTextMetrics  GetOutlineTextMetricsW
#else
#define GetOutlineTextMetrics  GetOutlineTextMetricsA
#endif // !UNICODE

#endif /* NOTEXTMETRIC */

__range(0,cEntries)
WINGDIAPI UINT  WINAPI GetPaletteEntries(   __in HPALETTE hpal,
                                            __in UINT iStart,
                                            __in UINT cEntries,
                                            __out_ecount_part_opt(cEntries,return) LPPALETTEENTRY pPalEntries);
WINGDIAPI COLORREF WINAPI GetPixel( __in HDC hdc, __in int x, __in int y);
WINGDIAPI int   WINAPI GetPixelFormat( __in HDC hdc);
WINGDIAPI int   WINAPI GetPolyFillMode( __in HDC hdc);
WINGDIAPI BOOL  WINAPI GetRasterizerCaps(   __out_bcount(cjBytes) LPRASTERIZER_STATUS lpraststat,
                                            __in UINT cjBytes);

WINGDIAPI int   WINAPI GetRandomRgn (__in HDC hdc, __in HRGN hrgn, __in INT i);
WINGDIAPI DWORD WINAPI GetRegionData(   __in HRGN hrgn,
                                        __in DWORD nCount,
                                        __out_bcount_part_opt(nCount, return) LPRGNDATA lpRgnData);
WINGDIAPI int   WINAPI GetRgnBox( __in HRGN hrgn,  __out LPRECT lprc);
WINGDIAPI HGDIOBJ WINAPI GetStockObject( __in int i);
WINGDIAPI int   WINAPI GetStretchBltMode(__in HDC hdc);
WINGDIAPI
UINT
WINAPI
GetSystemPaletteEntries(
    __in HDC  hdc,
    __in UINT iStart,
    __in UINT cEntries,
    __out_ecount_opt(cEntries) LPPALETTEENTRY pPalEntries
    );

WINGDIAPI UINT  WINAPI GetSystemPaletteUse(__in HDC hdc);
WINGDIAPI int   WINAPI GetTextCharacterExtra(__in HDC hdc);
WINGDIAPI UINT  WINAPI GetTextAlign(__in HDC hdc);
WINGDIAPI COLORREF WINAPI GetTextColor(__in HDC hdc);

WINGDIAPI
BOOL
APIENTRY
GetTextExtentPointA(
    __in HDC hdc,
    __in_ecount(c) LPCSTR lpString,
    __in int c,
    __out LPSIZE lpsz
    );
WINGDIAPI
BOOL
APIENTRY
GetTextExtentPointW(
    __in HDC hdc,
    __in_ecount(c) LPCWSTR lpString,
    __in int c,
    __out LPSIZE lpsz
    );
#ifdef UNICODE
#define GetTextExtentPoint  GetTextExtentPointW
#else
#define GetTextExtentPoint  GetTextExtentPointA
#endif // !UNICODE

WINGDIAPI
BOOL
APIENTRY
GetTextExtentPoint32A(
    __in HDC hdc,
    __in_ecount(c) LPCSTR lpString,
    __in int c,
    __out LPSIZE psizl
    );
WINGDIAPI
BOOL
APIENTRY
GetTextExtentPoint32W(
    __in HDC hdc,
    __in_ecount(c) LPCWSTR lpString,
    __in int c,
    __out LPSIZE psizl
    );
#ifdef UNICODE
#define GetTextExtentPoint32  GetTextExtentPoint32W
#else
#define GetTextExtentPoint32  GetTextExtentPoint32A
#endif // !UNICODE

WINGDIAPI
BOOL
APIENTRY
GetTextExtentExPointA(
    __in HDC hdc,
    __in_ecount(cchString) LPCSTR lpszString,
    __in int cchString,
    __in int nMaxExtent,
    __out_opt LPINT lpnFit,
    __out_ecount_part_opt (cchString, *lpnFit) LPINT lpnDx,
    __out LPSIZE lpSize
    );
WINGDIAPI
BOOL
APIENTRY
GetTextExtentExPointW(
    __in HDC hdc,
    __in_ecount(cchString) LPCWSTR lpszString,
    __in int cchString,
    __in int nMaxExtent,
    __out_opt LPINT lpnFit,
    __out_ecount_part_opt (cchString, *lpnFit) LPINT lpnDx,
    __out LPSIZE lpSize
    );
#ifdef UNICODE
#define GetTextExtentExPoint  GetTextExtentExPointW
#else
#define GetTextExtentExPoint  GetTextExtentExPointA
#endif // !UNICODE

#if(WINVER >= 0x0400)
WINGDIAPI int WINAPI GetTextCharset( __in HDC hdc);
WINGDIAPI int WINAPI GetTextCharsetInfo( __in HDC hdc, __out_opt LPFONTSIGNATURE lpSig, __in DWORD dwFlags);
WINGDIAPI BOOL WINAPI TranslateCharsetInfo( __inout DWORD FAR *lpSrc,  __out LPCHARSETINFO lpCs, __in DWORD dwFlags);
WINGDIAPI DWORD WINAPI GetFontLanguageInfo( __in HDC hdc);
WINGDIAPI DWORD WINAPI GetCharacterPlacementA(  __in HDC hdc, __in_ecount(nCount) LPCSTR lpString, __in int nCount, __in int nMexExtent, __inout LPGCP_RESULTSA lpResults, __in DWORD dwFlags);
WINGDIAPI DWORD WINAPI GetCharacterPlacementW(  __in HDC hdc, __in_ecount(nCount) LPCWSTR lpString, __in int nCount, __in int nMexExtent, __inout LPGCP_RESULTSW lpResults, __in DWORD dwFlags);
#ifdef UNICODE
#define GetCharacterPlacement  GetCharacterPlacementW
#else
#define GetCharacterPlacement  GetCharacterPlacementA
#endif // !UNICODE
#endif /* WINVER >= 0x0400 */

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)

typedef struct tagWCRANGE
{
    WCHAR  wcLow;
    USHORT cGlyphs;
} WCRANGE, *PWCRANGE,FAR *LPWCRANGE;


typedef struct tagGLYPHSET
{
    DWORD    cbThis;
    DWORD    flAccel;
    DWORD    cGlyphsSupported;
    DWORD    cRanges;
    WCRANGE  ranges[1];
} GLYPHSET, *PGLYPHSET, FAR *LPGLYPHSET;

/* flAccel flags for the GLYPHSET structure above */

#define GS_8BIT_INDICES     0x00000001

/* flags for GetGlyphIndices */

#define GGI_MARK_NONEXISTING_GLYPHS  0X0001

WINGDIAPI DWORD WINAPI GetFontUnicodeRanges( __in HDC hdc, __out_opt LPGLYPHSET lpgs);
WINGDIAPI DWORD WINAPI GetGlyphIndicesA( __in HDC hdc, __in_ecount(c) LPCSTR lpstr, __in int c, __out_ecount(c) LPWORD pgi, __in DWORD fl);
WINGDIAPI DWORD WINAPI GetGlyphIndicesW( __in HDC hdc, __in_ecount(c) LPCWSTR lpstr, __in int c, __out_ecount(c) LPWORD pgi, __in DWORD fl);
#ifdef UNICODE
#define GetGlyphIndices  GetGlyphIndicesW
#else
#define GetGlyphIndices  GetGlyphIndicesA
#endif // !UNICODE
WINGDIAPI BOOL  WINAPI GetTextExtentPointI(__in HDC hdc, __in_ecount(cgi) LPWORD pgiIn, __in int cgi, __out LPSIZE psize);
WINGDIAPI BOOL  WINAPI GetTextExtentExPointI (  __in HDC hdc,
                                                __in_ecount(cwchString) LPWORD lpwszString,
                                                __in int cwchString,
                                                __in int nMaxExtent,
                                                __out_opt LPINT lpnFit,
                                                __out_ecount_part_opt(cwchString, *lpnFit) LPINT lpnDx,
                                                __out LPSIZE lpSize
                                                );

WINGDIAPI BOOL  WINAPI GetCharWidthI(   __in HDC hdc,
                                        __in UINT giFirst,
                                        __in UINT cgi,
                                        __in_ecount_opt(cgi) LPWORD pgi,
                                        __out_ecount(cgi) LPINT piWidths
                                        );

WINGDIAPI BOOL  WINAPI GetCharABCWidthsI(   __in HDC    hdc,
                                            __in UINT   giFirst,
                                            __in UINT   cgi,
                                            __in_ecount_opt(cgi) LPWORD pgi,
                                            __out_ecount(cgi) LPABC  pabc
                                        );


#define STAMP_DESIGNVECTOR  (0x8000000 + 'd' + ('v' << 8))
#define STAMP_AXESLIST      (0x8000000 + 'a' + ('l' << 8)) #define MM_MAX_NUMAXES 16 typedef struct tagDESIGNVECTOR { DWORD dvReserved; DWORD dvNumAxes; LONG dvValues[MM_MAX_NUMAXES]; } DESIGNVECTOR, *PDESIGNVECTOR, FAR *LPDESIGNVECTOR; WINGDIAPI int WINAPI AddFontResourceExA( __in LPCSTR name, __in DWORD fl, __reserved PVOID res); WINGDIAPI int WINAPI AddFontResourceExW( __in LPCWSTR name, __in DWORD fl, __reserved PVOID res); #ifdef UNICODE #define AddFontResourceEx AddFontResourceExW #else #define AddFontResourceEx AddFontResourceExA #endif // !UNICODE WINGDIAPI BOOL WINAPI RemoveFontResourceExA( __in LPCSTR name, __in DWORD fl, __reserved PVOID pdv); WINGDIAPI BOOL WINAPI RemoveFontResourceExW( __in LPCWSTR name, __in DWORD fl, __reserved PVOID pdv); #ifdef UNICODE #define RemoveFontResourceEx RemoveFontResourceExW #else #define RemoveFontResourceEx RemoveFontResourceExA #endif // !UNICODE WINGDIAPI HANDLE WINAPI AddFontMemResourceEx( __in_bcount(cjSize) PVOID pFileView, __in DWORD cjSize, __reserved PVOID pvResrved, __in DWORD* pNumFonts); WINGDIAPI BOOL WINAPI RemoveFontMemResourceEx( __in HANDLE h); #define FR_PRIVATE 0x10 #define FR_NOT_ENUM 0x20 // The actual size of the DESIGNVECTOR and ENUMLOGFONTEXDV structures // is determined by dvNumAxes, // MM_MAX_NUMAXES only detemines the maximal size allowed #define MM_MAX_AXES_NAMELEN 16 typedef struct tagAXISINFOA { LONG axMinValue; LONG axMaxValue; BYTE axAxisName[MM_MAX_AXES_NAMELEN]; } AXISINFOA, *PAXISINFOA, FAR *LPAXISINFOA; typedef struct tagAXISINFOW { LONG axMinValue; LONG axMaxValue; WCHAR axAxisName[MM_MAX_AXES_NAMELEN]; } AXISINFOW, *PAXISINFOW, FAR *LPAXISINFOW; #ifdef UNICODE typedef AXISINFOW AXISINFO; typedef PAXISINFOW PAXISINFO; typedef LPAXISINFOW LPAXISINFO; #else typedef AXISINFOA AXISINFO; typedef PAXISINFOA PAXISINFO; typedef LPAXISINFOA LPAXISINFO; #endif // UNICODE typedef struct tagAXESLISTA { DWORD axlReserved; DWORD axlNumAxes; AXISINFOA axlAxisInfo[MM_MAX_NUMAXES]; } AXESLISTA, *PAXESLISTA, FAR *LPAXESLISTA; typedef struct tagAXESLISTW { DWORD axlReserved; DWORD axlNumAxes; AXISINFOW axlAxisInfo[MM_MAX_NUMAXES]; } AXESLISTW, *PAXESLISTW, FAR *LPAXESLISTW; #ifdef UNICODE typedef AXESLISTW AXESLIST; typedef PAXESLISTW PAXESLIST; typedef LPAXESLISTW LPAXESLIST; #else typedef AXESLISTA AXESLIST; typedef PAXESLISTA PAXESLIST; typedef LPAXESLISTA LPAXESLIST; #endif // UNICODE // The actual size of the AXESLIST and ENUMTEXTMETRIC structure is // determined by axlNumAxes, // MM_MAX_NUMAXES only detemines the maximal size allowed typedef struct tagENUMLOGFONTEXDVA { ENUMLOGFONTEXA elfEnumLogfontEx; DESIGNVECTOR elfDesignVector; } ENUMLOGFONTEXDVA, *PENUMLOGFONTEXDVA, FAR *LPENUMLOGFONTEXDVA; typedef struct tagENUMLOGFONTEXDVW { ENUMLOGFONTEXW elfEnumLogfontEx; DESIGNVECTOR elfDesignVector; } ENUMLOGFONTEXDVW, *PENUMLOGFONTEXDVW, FAR *LPENUMLOGFONTEXDVW; #ifdef UNICODE typedef ENUMLOGFONTEXDVW ENUMLOGFONTEXDV; typedef PENUMLOGFONTEXDVW PENUMLOGFONTEXDV; typedef LPENUMLOGFONTEXDVW LPENUMLOGFONTEXDV; #else typedef ENUMLOGFONTEXDVA ENUMLOGFONTEXDV; typedef PENUMLOGFONTEXDVA PENUMLOGFONTEXDV; typedef LPENUMLOGFONTEXDVA LPENUMLOGFONTEXDV; #endif // UNICODE WINGDIAPI HFONT WINAPI CreateFontIndirectExA( __in CONST ENUMLOGFONTEXDVA *); WINGDIAPI HFONT WINAPI CreateFontIndirectExW( __in CONST ENUMLOGFONTEXDVW *); #ifdef UNICODE #define CreateFontIndirectEx CreateFontIndirectExW #else #define CreateFontIndirectEx CreateFontIndirectExA #endif // !UNICODE #ifndef NOTEXTMETRIC typedef struct tagENUMTEXTMETRICA { NEWTEXTMETRICEXA etmNewTextMetricEx; AXESLISTA etmAxesList; } ENUMTEXTMETRICA, *PENUMTEXTMETRICA, FAR *LPENUMTEXTMETRICA; typedef struct tagENUMTEXTMETRICW { NEWTEXTMETRICEXW etmNewTextMetricEx; AXESLISTW etmAxesList; } ENUMTEXTMETRICW, *PENUMTEXTMETRICW, FAR *LPENUMTEXTMETRICW; #ifdef UNICODE typedef ENUMTEXTMETRICW ENUMTEXTMETRIC; typedef PENUMTEXTMETRICW PENUMTEXTMETRIC; typedef LPENUMTEXTMETRICW LPENUMTEXTMETRIC; #else typedef ENUMTEXTMETRICA ENUMTEXTMETRIC; typedef PENUMTEXTMETRICA PENUMTEXTMETRIC; typedef LPENUMTEXTMETRICA LPENUMTEXTMETRIC; #endif // UNICODE #endif /* NOTEXTMETRIC */ #endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)

WINGDIAPI BOOL  WINAPI GetViewportExtEx( __in HDC hdc, __out LPSIZE lpsize);
WINGDIAPI BOOL  WINAPI GetViewportOrgEx( __in HDC hdc, __out LPPOINT lppoint);
WINGDIAPI BOOL  WINAPI GetWindowExtEx( __in HDC hdc, __out LPSIZE lpsize);
WINGDIAPI BOOL  WINAPI GetWindowOrgEx( __in HDC hdc, __out LPPOINT lppoint);

__gdi_entry WINGDIAPI int  WINAPI IntersectClipRect( __in HDC hdc, __in int left, __in int top, __in int right, __in int bottom);
__gdi_entry WINGDIAPI BOOL WINAPI InvertRgn( __in HDC hdc, __in HRGN hrgn);
WINGDIAPI BOOL WINAPI LineDDA( __in int xStart, __in int yStart, __in int xEnd, __in int yEnd, __in LINEDDAPROC lpProc, __in_opt LPARAM data);
__gdi_entry WINGDIAPI BOOL WINAPI LineTo( __in HDC hdc, __in int x, __in int y);
WINGDIAPI BOOL WINAPI MaskBlt( __in HDC hdcDest, __in int xDest, __in int yDest, __in int width, __in int height,
              __in HDC hdcSrc, __in int xSrc, __in int ySrc, __in HBITMAP hbmMask, __in int xMask, __in int yMask, __in DWORD rop);
WINGDIAPI BOOL WINAPI PlgBlt( __in HDC hdcDest, __in_ecount(3) CONST POINT * lpPoint, __in HDC hdcSrc, __in int xSrc, __in int ySrc, __in int width,
                     __in int height, __in_opt HBITMAP hbmMask, __in int xMask, __in int yMask);

__gdi_entry WINGDIAPI int  WINAPI OffsetClipRgn(__in HDC hdc, __in int x, __in int y);
WINGDIAPI int  WINAPI OffsetRgn(__in HRGN hrgn, __in int x, __in int y);
__gdi_entry WINGDIAPI BOOL WINAPI PatBlt(__in HDC hdc, __in int x, __in int y, __in int w, __in int h, __in DWORD rop);
__gdi_entry WINGDIAPI BOOL WINAPI Pie(__in HDC hdc, __in int left, __in int top, __in int right, __in int bottom, __in int xr1, __in int yr1, __in int xr2, __in int yr2);
WINGDIAPI BOOL WINAPI PlayMetaFile(__in HDC hdc, __in HMETAFILE hmf);
__gdi_entry WINGDIAPI BOOL WINAPI PaintRgn(__in HDC hdc, __in HRGN hrgn);
__gdi_entry WINGDIAPI BOOL WINAPI PolyPolygon(__in HDC hdc,  __in CONST POINT *apt,  __in_ecount(csz) CONST INT *asz,  __in int csz);
WINGDIAPI BOOL WINAPI PtInRegion(__in HRGN hrgn, __in int x, __in int y);
WINGDIAPI BOOL WINAPI PtVisible(__in HDC hdc, __in int x, __in int y);
WINGDIAPI BOOL WINAPI RectInRegion(__in HRGN hrgn, __in CONST RECT * lprect);
WINGDIAPI BOOL WINAPI RectVisible(__in HDC hdc, __in CONST RECT * lprect);
__gdi_entry WINGDIAPI BOOL WINAPI Rectangle(__in HDC hdc, __in int left, __in int top, __in int right, __in int bottom);
__gdi_entry WINGDIAPI BOOL WINAPI RestoreDC(__in HDC hdc, __in int nSavedDC);
__gdi_entry WINGDIAPI HDC  WINAPI ResetDCA(__in HDC hdc, __in CONST DEVMODEA * lpdm);
__gdi_entry WINGDIAPI HDC  WINAPI ResetDCW(__in HDC hdc, __in CONST DEVMODEW * lpdm);
#ifdef UNICODE
#define ResetDC  ResetDCW
#else
#define ResetDC  ResetDCA
#endif // !UNICODE
__gdi_entry WINGDIAPI UINT WINAPI RealizePalette(__in HDC hdc);
WINGDIAPI BOOL WINAPI RemoveFontResourceA(__in LPCSTR lpFileName);
WINGDIAPI BOOL WINAPI RemoveFontResourceW(__in LPCWSTR lpFileName);
#ifdef UNICODE
#define RemoveFontResource  RemoveFontResourceW
#else
#define RemoveFontResource  RemoveFontResourceA
#endif // !UNICODE
__gdi_entry WINGDIAPI BOOL  WINAPI RoundRect(__in HDC hdc, __in int left, __in int top, __in int right, __in int bottom, __in int width, __in int height);
__gdi_entry WINGDIAPI BOOL WINAPI ResizePalette(__in HPALETTE hpal, __in UINT n);

__gdi_entry WINGDIAPI int  WINAPI SaveDC(__in HDC hdc);
__gdi_entry WINGDIAPI int  WINAPI SelectClipRgn(__in HDC hdc, __in_opt HRGN hrgn);
WINGDIAPI int  WINAPI ExtSelectClipRgn(__in HDC hdc, __in_opt HRGN hrgn, __in int mode);
WINGDIAPI int  WINAPI SetMetaRgn(__in HDC hdc);
__gdi_entry WINGDIAPI HGDIOBJ WINAPI SelectObject(__in HDC hdc, __in HGDIOBJ h);
__gdi_entry WINGDIAPI HPALETTE WINAPI SelectPalette(__in HDC hdc, __in HPALETTE hPal, __in BOOL bForceBkgd);
__gdi_entry WINGDIAPI COLORREF WINAPI SetBkColor(__in HDC hdc, __in COLORREF color);

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
WINGDIAPI COLORREF WINAPI SetDCBrushColor(__in HDC hdc, __in COLORREF color);
WINGDIAPI COLORREF WINAPI SetDCPenColor(__in HDC hdc, __in COLORREF color);
#endif

__gdi_entry WINGDIAPI int   WINAPI SetBkMode(__in HDC hdc, __in int mode);

WINGDIAPI
LONG WINAPI
SetBitmapBits(
    __in HBITMAP hbm,
    __in DWORD cb,
    __in_bcount(cb) CONST VOID *pvBits);

WINGDIAPI UINT  WINAPI SetBoundsRect(__in HDC hdc, __in_opt CONST RECT * lprect, __in UINT flags);
WINGDIAPI int   WINAPI SetDIBits(__in_opt HDC hdc, __in HBITMAP hbm, __in UINT start, __in UINT cLines, __in CONST VOID *lpBits, __in CONST BITMAPINFO * lpbmi, __in UINT ColorUse);
__gdi_entry WINGDIAPI int   WINAPI SetDIBitsToDevice(__in HDC hdc, __in int xDest, __in int yDest, __in DWORD w, __in DWORD h, __in int xSrc,
        __in int ySrc, __in UINT StartScan, __in UINT cLines, __in CONST VOID * lpvBits, __in CONST BITMAPINFO * lpbmi, __in UINT ColorUse);
__gdi_entry WINGDIAPI DWORD WINAPI SetMapperFlags(__in HDC hdc, __in DWORD flags);
WINGDIAPI int   WINAPI SetGraphicsMode(__in HDC hdc, __in int iMode);
__gdi_entry WINGDIAPI int   WINAPI SetMapMode(__in HDC hdc, __in int iMode);

#if(WINVER >= 0x0500)
__gdi_entry WINGDIAPI DWORD WINAPI SetLayout(__in HDC hdc, __in DWORD l);
WINGDIAPI DWORD WINAPI GetLayout(__in HDC hdc);
#endif /* WINVER >= 0x0500 */

WINGDIAPI HMETAFILE   WINAPI SetMetaFileBitsEx(__in UINT cbBuffer, __in_bcount(cbBuffer) CONST BYTE *lpData);
__gdi_entry WINGDIAPI UINT  WINAPI SetPaletteEntries(   __in HPALETTE hpal,
                                            __in UINT iStart,
                                            __in UINT cEntries,
                                            __in_ecount(cEntries) CONST PALETTEENTRY *pPalEntries);
__gdi_entry WINGDIAPI COLORREF WINAPI SetPixel(__in HDC hdc, __in int x, __in int y, __in COLORREF color);
WINGDIAPI BOOL   WINAPI SetPixelV(__in HDC hdc, __in int x, __in int y, __in COLORREF color);
WINGDIAPI BOOL  WINAPI SetPixelFormat(__in HDC hdc, __in int format, __in CONST PIXELFORMATDESCRIPTOR * ppfd);
__gdi_entry WINGDIAPI int   WINAPI SetPolyFillMode(__in HDC hdc, __in int mode);
__gdi_entry WINGDIAPI BOOL  WINAPI StretchBlt(__in HDC hdcDest, __in int xDest, __in int yDest, __in int wDest, __in int hDest, __in_opt HDC hdcSrc, __in int xSrc, __in int ySrc, __in int wSrc, __in int hSrc, __in DWORD rop);
WINGDIAPI BOOL   WINAPI SetRectRgn(__in HRGN hrgn, __in int left, __in int top, __in int right, __in int bottom);
__gdi_entry WINGDIAPI int   WINAPI StretchDIBits(__in HDC hdc, __in int xDest, __in int yDest, __in int DestWidth, __in int DestHeight, __in int xSrc, __in int ySrc, __in int SrcWidth, __in int SrcHeight,
        __in_opt CONST VOID * lpBits, __in CONST BITMAPINFO * lpbmi, __in UINT iUsage, __in DWORD rop);
__gdi_entry WINGDIAPI int   WINAPI SetROP2(__in HDC hdc, __in int rop2);
__gdi_entry WINGDIAPI int   WINAPI SetStretchBltMode(__in HDC hdc, __in int mode);
WINGDIAPI UINT  WINAPI SetSystemPaletteUse(__in HDC hdc, __in UINT use);
__gdi_entry WINGDIAPI int   WINAPI SetTextCharacterExtra(__in HDC hdc, __in int extra);
__gdi_entry WINGDIAPI COLORREF WINAPI SetTextColor(__in HDC hdc, __in COLORREF color);
__gdi_entry WINGDIAPI UINT  WINAPI SetTextAlign(__in HDC hdc, __in UINT align);
__gdi_entry WINGDIAPI BOOL  WINAPI SetTextJustification(__in HDC hdc, __in int extra, __in int count);
WINGDIAPI BOOL  WINAPI UpdateColors(__in HDC hdc);

#ifdef  COMBOX_SANDBOX

#if (_WIN32_WINNT >= 0x0600)

typedef PVOID   (WINAPI *GDIMARSHALLOC)(DWORD dwSize, __in LPVOID pGdiRef);

typedef HRESULT (WINAPI *DDRAWMARSHCALLBACKMARSHAL)(__in HGDIOBJ hGdiObj, __in LPVOID pGdiRef, __out LPVOID *ppDDrawRef);
typedef HRESULT (WINAPI *DDRAWMARSHCALLBACKUNMARSHAL)(__in LPVOID pData, __out HDC *phdc, __out LPVOID *ppDDrawRef);
typedef HRESULT (WINAPI *DDRAWMARSHCALLBACKRELEASE)(__in LPVOID pDDrawRef);

#define GDIREGISTERDDRAWPACKETVERSION   0x1

typedef struct {
    DWORD                       dwSize;
    DWORD                       dwVersion;
    DDRAWMARSHCALLBACKMARSHAL   pfnDdMarshal;
    DDRAWMARSHCALLBACKUNMARSHAL pfnDdUnmarshal;
    DDRAWMARSHCALLBACKRELEASE   pfnDdRelease;
} GDIREGISTERDDRAWPACKET, *PGDIREGISTERDDRAWPACKET;

WINGDIAPI BOOL    WINAPI   GdiRegisterDdraw(__in PGDIREGISTERDDRAWPACKET pPacket, __out GDIMARSHALLOC *ppfnGdiAlloc);

WINGDIAPI ULONG   WINAPI   GdiMarshalSize(VOID);
WINGDIAPI VOID    WINAPI   GdiMarshal(DWORD dwProcessIdTo, __in HGDIOBJ hGdiObj, __inout PVOID pData, ULONG ulFlags);
WINGDIAPI HGDIOBJ WINAPI   GdiUnmarshal(__in PVOID pData, ULONG ulFlags);

#endif // (_WIN32_WINNT >= 0x0600)

#endif  // COMBOX_SANDBOX

#if (WINVER >= 0x0400)

//
// image blt
//

typedef USHORT COLOR16;

typedef struct _TRIVERTEX
{
    LONG    x;
    LONG    y;
    COLOR16 Red;
    COLOR16 Green;
    COLOR16 Blue;
    COLOR16 Alpha;
}TRIVERTEX,*PTRIVERTEX,*LPTRIVERTEX;

typedef struct _GRADIENT_TRIANGLE
{
    ULONG Vertex1;
    ULONG Vertex2;
    ULONG Vertex3;
} GRADIENT_TRIANGLE,*PGRADIENT_TRIANGLE,*LPGRADIENT_TRIANGLE;

typedef struct _GRADIENT_RECT
{
    ULONG UpperLeft;
    ULONG LowerRight;
}GRADIENT_RECT,*PGRADIENT_RECT,*LPGRADIENT_RECT;

typedef struct _BLENDFUNCTION
{
    BYTE   BlendOp;
    BYTE   BlendFlags;
    BYTE   SourceConstantAlpha;
    BYTE   AlphaFormat;
}BLENDFUNCTION,*PBLENDFUNCTION;


//
// currentlly defined blend function
//

#define AC_SRC_OVER                 0x00

//
// alpha format flags
//

#define AC_SRC_ALPHA                0x01

WINGDIAPI BOOL WINAPI AlphaBlend(
    __in HDC hdcDest,
    __in int xoriginDest,
    __in int yoriginDest,
    __in int wDest,
    __in int hDest,
    __in HDC hdcSrc,
    __in int xoriginSrc,
    __in int yoriginSrc,
    __in int wSrc,
    __in int hSrc,
    __in BLENDFUNCTION ftn);

WINGDIAPI BOOL WINAPI TransparentBlt(
    __in HDC hdcDest,
    __in int xoriginDest,
    __in int yoriginDest,
    __in int wDest,
    __in int hDest,
    __in HDC hdcSrc,
    __in int xoriginSrc,
    __in int yoriginSrc,
    __in int wSrc,
    __in int hSrc,
    __in UINT crTransparent);


//
// gradient drawing modes
//

#define GRADIENT_FILL_RECT_H    0x00000000
#define GRADIENT_FILL_RECT_V    0x00000001
#define GRADIENT_FILL_TRIANGLE  0x00000002
#define GRADIENT_FILL_OP_FLAG   0x000000ff

WINGDIAPI
BOOL
WINAPI
GradientFill(
    __in HDC hdc,
    __in_ecount(nVertex) PTRIVERTEX pVertex,
    __in ULONG nVertex,
    __in PVOID pMesh,
    __in ULONG nMesh,
    __in ULONG ulMode
    );

#endif

#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)


WINGDIAPI BOOL  WINAPI GdiAlphaBlend(__in HDC hdcDest, __in int xoriginDest, __in int yoriginDest, __in int wDest, __in int hDest, __in HDC hdcSrc, __in int xoriginSrc, __in int yoriginSrc, __in int wSrc, __in int hSrc, __in BLENDFUNCTION ftn);

WINGDIAPI BOOL  WINAPI GdiTransparentBlt(__in HDC hdcDest,__in int xoriginDest, __in int yoriginDest, __in int wDest, __in int hDest, __in HDC hdcSrc,
                                           __in int xoriginSrc, __in int yoriginSrc, __in int wSrc, __in int hSrc, __in UINT crTransparent);

WINGDIAPI BOOL  WINAPI GdiGradientFill( __in HDC hdc,
                                        __in_ecount(nVertex) PTRIVERTEX pVertex,
                                        __in ULONG nVertex,
                                        __in PVOID pMesh,
                                        __in ULONG nCount,
                                        __in ULONG ulMode);

#endif



#ifndef NOMETAFILE

WINGDIAPI BOOL  WINAPI PlayMetaFileRecord(  __in HDC hdc,
                                            __in_ecount(noObjs) LPHANDLETABLE lpHandleTable,
                                            __in LPMETARECORD lpMR,
                                            __in UINT noObjs);

typedef int (CALLBACK* MFENUMPROC)( __in HDC hdc, __in_ecount(nObj) HANDLETABLE FAR* lpht, __in METARECORD FAR* lpMR, __in int nObj, __in_opt LPARAM param);
WINGDIAPI BOOL  WINAPI EnumMetaFile( __in HDC hdc, __in HMETAFILE hmf, __in MFENUMPROC proc, __in_opt LPARAM param);

typedef int (CALLBACK* ENHMFENUMPROC)(__in HDC hdc, __in_ecount(nHandles) HANDLETABLE FAR* lpht, __in CONST ENHMETARECORD * lpmr, __in int nHandles, __in_opt LPARAM data);

// Enhanced Metafile Function Declarations

WINGDIAPI HENHMETAFILE WINAPI CloseEnhMetaFile( __in HDC hdc);
WINGDIAPI HENHMETAFILE WINAPI CopyEnhMetaFileA( __in HENHMETAFILE hEnh, __in_opt LPCSTR lpFileName);
WINGDIAPI HENHMETAFILE WINAPI CopyEnhMetaFileW( __in HENHMETAFILE hEnh, __in_opt LPCWSTR lpFileName);
#ifdef UNICODE
#define CopyEnhMetaFile  CopyEnhMetaFileW
#else
#define CopyEnhMetaFile  CopyEnhMetaFileA
#endif // !UNICODE
WINGDIAPI HDC   WINAPI CreateEnhMetaFileA( __in_opt HDC hdc, __in_opt LPCSTR lpFilename, __in_opt CONST RECT *lprc, __in_opt LPCSTR lpDesc);
WINGDIAPI HDC   WINAPI CreateEnhMetaFileW( __in_opt HDC hdc, __in_opt LPCWSTR lpFilename, __in_opt CONST RECT *lprc, __in_opt LPCWSTR lpDesc);
#ifdef UNICODE
#define CreateEnhMetaFile  CreateEnhMetaFileW
#else
#define CreateEnhMetaFile  CreateEnhMetaFileA
#endif // !UNICODE
WINGDIAPI BOOL  WINAPI DeleteEnhMetaFile( __in_opt HENHMETAFILE hmf);
WINGDIAPI BOOL  WINAPI EnumEnhMetaFile( __in_opt HDC hdc, __in HENHMETAFILE hmf, __in ENHMFENUMPROC proc,
                                        __in_opt LPVOID param, __in_opt CONST RECT * lpRect);
WINGDIAPI HENHMETAFILE  WINAPI GetEnhMetaFileA( __in LPCSTR lpName);
WINGDIAPI HENHMETAFILE  WINAPI GetEnhMetaFileW( __in LPCWSTR lpName);
#ifdef UNICODE
#define GetEnhMetaFile  GetEnhMetaFileW
#else
#define GetEnhMetaFile  GetEnhMetaFileA
#endif // !UNICODE
WINGDIAPI UINT  WINAPI GetEnhMetaFileBits(  __in HENHMETAFILE hEMF,
                                            __in UINT nSize,
                                            __out_bcount_opt(nSize) LPBYTE lpData);
WINGDIAPI UINT  WINAPI GetEnhMetaFileDescriptionA(  __in HENHMETAFILE hemf,
                                                    __in UINT cchBuffer,
                                                    __out_ecount_opt(cchBuffer) LPSTR lpDescription);
WINGDIAPI UINT  WINAPI GetEnhMetaFileDescriptionW(  __in HENHMETAFILE hemf,
                                                    __in UINT cchBuffer,
                                                    __out_ecount_opt(cchBuffer) LPWSTR lpDescription);
#ifdef UNICODE
#define GetEnhMetaFileDescription  GetEnhMetaFileDescriptionW
#else
#define GetEnhMetaFileDescription  GetEnhMetaFileDescriptionA
#endif // !UNICODE
WINGDIAPI UINT  WINAPI GetEnhMetaFileHeader(    __in HENHMETAFILE hemf,
                                                __in UINT nSize,
                                                __out_bcount_opt(nSize) LPENHMETAHEADER lpEnhMetaHeader);
WINGDIAPI UINT  WINAPI GetEnhMetaFilePaletteEntries(__in HENHMETAFILE hemf,
                                                    __in UINT nNumEntries,
                                                    __out_ecount_opt(nNumEntries) LPPALETTEENTRY lpPaletteEntries);

WINGDIAPI UINT  WINAPI GetEnhMetaFilePixelFormat(   __in HENHMETAFILE hemf,
                                                    __in UINT cbBuffer,
                                                    __out_bcount_opt(cbBuffer) PIXELFORMATDESCRIPTOR *ppfd);
WINGDIAPI UINT  WINAPI GetWinMetaFileBits(  __in HENHMETAFILE hemf,
                                            __in UINT cbData16,
                                            __out_bcount_opt(cbData16) LPBYTE pData16,
                                            __in INT iMapMode,
                                            __in HDC hdcRef);
WINGDIAPI BOOL  WINAPI PlayEnhMetaFile( __in HDC hdc, __in HENHMETAFILE hmf, __in CONST RECT * lprect);
WINGDIAPI BOOL  WINAPI PlayEnhMetaFileRecord(   __in HDC hdc,
                                                __in_ecount(cht) LPHANDLETABLE pht,
                                                __in CONST ENHMETARECORD *pmr,
                                                __in UINT cht);

WINGDIAPI HENHMETAFILE  WINAPI SetEnhMetaFileBits(  __in UINT nSize,
                                                    __in_bcount(nSize) CONST BYTE * pb);

WINGDIAPI HENHMETAFILE  WINAPI SetWinMetaFileBits(  __in UINT nSize,
                                                    __in_bcount(nSize) CONST BYTE *lpMeta16Data,
                                                    __in_opt HDC hdcRef,
                                                    __in_opt CONST METAFILEPICT *lpMFP);
WINGDIAPI BOOL  WINAPI GdiComment(__in HDC hdc, __in UINT nSize, __in_bcount(nSize) CONST BYTE *lpData);

#endif  /* NOMETAFILE */

#ifndef NOTEXTMETRIC

WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
#ifdef UNICODE
#define GetTextMetrics  GetTextMetricsW
#else
#define GetTextMetrics  GetTextMetricsA
#endif // !UNICODE

#if defined(_M_CEE)
#undef GetTextMetrics
__inline
BOOL
GetTextMetrics(
    HDC hdc,
    LPTEXTMETRIC lptm
    )
{
#ifdef UNICODE
    return GetTextMetricsW(
#else
    return GetTextMetricsA(
#endif
        hdc,
        lptm
        );
}
#endif  /* _M_CEE */

#endif

/* new GDI */

typedef struct tagDIBSECTION {
    BITMAP       dsBm;
    BITMAPINFOHEADER    dsBmih;
    DWORD               dsBitfields[3];
    HANDLE              dshSection;
    DWORD               dsOffset;
} DIBSECTION, FAR *LPDIBSECTION, *PDIBSECTION;


WINGDIAPI BOOL WINAPI AngleArc( __in HDC hdc, __in int x, __in int y, __in DWORD r, __in FLOAT StartAngle, __in FLOAT SweepAngle);
WINGDIAPI BOOL WINAPI PolyPolyline(__in HDC hdc, __in CONST POINT *apt, __in_ecount(csz) CONST DWORD *asz, __in DWORD csz);
WINGDIAPI BOOL WINAPI GetWorldTransform( __in HDC hdc, __out LPXFORM lpxf);
WINGDIAPI BOOL WINAPI SetWorldTransform( __in HDC hdc, __in CONST XFORM * lpxf);
WINGDIAPI BOOL WINAPI ModifyWorldTransform( __in HDC hdc, __in_opt CONST XFORM * lpxf, __in DWORD mode);
WINGDIAPI BOOL WINAPI CombineTransform( __out LPXFORM lpxfOut, __in CONST XFORM *lpxf1, __in CONST XFORM *lpxf2);
WINGDIAPI HBITMAP WINAPI CreateDIBSection(__in_opt HDC hdc, __in CONST BITMAPINFO *lpbmi, __in UINT usage, __deref_opt_out VOID **ppvBits, __in_opt HANDLE hSection, __in DWORD offset);
__range(0,cEntries)
WINGDIAPI UINT WINAPI GetDIBColorTable( __in HDC  hdc,
                                        __in UINT iStart,
                                        __in UINT cEntries,
                                        __out_ecount_part(cEntries,return) RGBQUAD *prgbq);
WINGDIAPI UINT WINAPI SetDIBColorTable( __in HDC  hdc,
                                        __in UINT iStart,
                                        __in UINT cEntries,
                                        __in_ecount(cEntries) CONST RGBQUAD *prgbq);

/* Flags value for COLORADJUSTMENT */
#define CA_NEGATIVE                 0x0001
#define CA_LOG_FILTER               0x0002

/* IlluminantIndex values */
#define ILLUMINANT_DEVICE_DEFAULT   0
#define ILLUMINANT_A                1
#define ILLUMINANT_B                2
#define ILLUMINANT_C                3
#define ILLUMINANT_D50              4
#define ILLUMINANT_D55              5
#define ILLUMINANT_D65              6
#define ILLUMINANT_D75              7
#define ILLUMINANT_F2               8
#define ILLUMINANT_MAX_INDEX        ILLUMINANT_F2

#define ILLUMINANT_TUNGSTEN         ILLUMINANT_A
#define ILLUMINANT_DAYLIGHT         ILLUMINANT_C
#define ILLUMINANT_FLUORESCENT      ILLUMINANT_F2
#define ILLUMINANT_NTSC             ILLUMINANT_C

/* Min and max for RedGamma, GreenGamma, BlueGamma */
#define RGB_GAMMA_MIN               (WORD)02500
#define RGB_GAMMA_MAX               (WORD)65000

/* Min and max for ReferenceBlack and ReferenceWhite */
#define REFERENCE_WHITE_MIN         (WORD)6000
#define REFERENCE_WHITE_MAX         (WORD)10000
#define REFERENCE_BLACK_MIN         (WORD)0
#define REFERENCE_BLACK_MAX         (WORD)4000

/* Min and max for Contrast, Brightness, Colorfulness, RedGreenTint */
#define COLOR_ADJ_MIN               (SHORT)-100
#define COLOR_ADJ_MAX               (SHORT)100

typedef struct  tagCOLORADJUSTMENT {
    WORD   caSize;
    WORD   caFlags;
    WORD   caIlluminantIndex;
    WORD   caRedGamma;
    WORD   caGreenGamma;
    WORD   caBlueGamma;
    WORD   caReferenceBlack;
    WORD   caReferenceWhite;
    SHORT  caContrast;
    SHORT  caBrightness;
    SHORT  caColorfulness;
    SHORT  caRedGreenTint;
} COLORADJUSTMENT, *PCOLORADJUSTMENT, FAR *LPCOLORADJUSTMENT;

WINGDIAPI BOOL WINAPI SetColorAdjustment( __in HDC hdc, __in CONST COLORADJUSTMENT *lpca);
WINGDIAPI BOOL WINAPI GetColorAdjustment( __in HDC hdc, __out LPCOLORADJUSTMENT lpca);
WINGDIAPI HPALETTE WINAPI CreateHalftonePalette( __in_opt HDC hdc);

#ifdef STRICT
typedef BOOL (CALLBACK* ABORTPROC)( __in HDC, __in int);
#else
typedef FARPROC ABORTPROC;
#endif

typedef struct _DOCINFOA {
    int     cbSize;
    LPCSTR   lpszDocName;
    LPCSTR   lpszOutput;
#if (WINVER >= 0x0400)
    LPCSTR   lpszDatatype;
    DWORD    fwType;
#endif /* WINVER */
} DOCINFOA, *LPDOCINFOA;
typedef struct _DOCINFOW {
    int     cbSize;
    LPCWSTR  lpszDocName;
    LPCWSTR  lpszOutput;
#if (WINVER >= 0x0400)
    LPCWSTR  lpszDatatype;
    DWORD    fwType;
#endif /* WINVER */
} DOCINFOW, *LPDOCINFOW;
#ifdef UNICODE
typedef DOCINFOW DOCINFO;
typedef LPDOCINFOW LPDOCINFO;
#else
typedef DOCINFOA DOCINFO;
typedef LPDOCINFOA LPDOCINFO;
#endif // UNICODE

#if(WINVER >= 0x0400)
#define DI_APPBANDING               0x00000001
#define DI_ROPS_READ_DESTINATION    0x00000002
#endif /* WINVER >= 0x0400 */

__gdi_entry WINGDIAPI int WINAPI StartDocA(__in HDC hdc, __in CONST DOCINFOA *lpdi);
__gdi_entry WINGDIAPI int WINAPI StartDocW(__in HDC hdc, __in CONST DOCINFOW *lpdi);
#ifdef UNICODE
#define StartDoc  StartDocW
#else
#define StartDoc  StartDocA
#endif // !UNICODE
__gdi_entry WINGDIAPI int WINAPI EndDoc(__in HDC hdc);
__gdi_entry WINGDIAPI int WINAPI StartPage(__in HDC hdc);
__gdi_entry WINGDIAPI int WINAPI EndPage(__in HDC hdc);
__gdi_entry WINGDIAPI int WINAPI AbortDoc(__in HDC hdc);
WINGDIAPI int WINAPI SetAbortProc(__in HDC hdc, __in ABORTPROC proc);

WINGDIAPI BOOL WINAPI AbortPath(__in HDC hdc);
WINGDIAPI BOOL WINAPI ArcTo(__in HDC hdc, __in int left, __in int top, __in int right, __in int bottom, __in int xr1, __in int yr1, __in int xr2, __in int yr2);
WINGDIAPI BOOL WINAPI BeginPath(__in HDC hdc);
WINGDIAPI BOOL WINAPI CloseFigure(__in HDC hdc);
WINGDIAPI BOOL WINAPI EndPath(__in HDC hdc);
WINGDIAPI BOOL WINAPI FillPath(__in HDC hdc);
WINGDIAPI BOOL WINAPI FlattenPath(__in HDC hdc);
WINGDIAPI int  WINAPI GetPath(__in HDC hdc, __out_ecount_opt(cpt) LPPOINT apt, __out_ecount_opt(cpt) LPBYTE aj, int cpt);
WINGDIAPI HRGN WINAPI PathToRegion(__in HDC hdc);
WINGDIAPI BOOL WINAPI PolyDraw(__in HDC hdc, __in_ecount(cpt) CONST POINT * apt, __in_ecount(cpt) CONST BYTE * aj, __in int cpt);
WINGDIAPI BOOL WINAPI SelectClipPath(__in HDC hdc, __in int mode);
WINGDIAPI int  WINAPI SetArcDirection(__in HDC hdc, __in int dir);
WINGDIAPI BOOL WINAPI SetMiterLimit(__in HDC hdc, __in FLOAT limit, __out_opt PFLOAT old);
WINGDIAPI BOOL WINAPI StrokeAndFillPath(__in HDC hdc);
WINGDIAPI BOOL WINAPI StrokePath(__in HDC hdc);
WINGDIAPI BOOL WINAPI WidenPath(__in HDC hdc);
WINGDIAPI HPEN WINAPI ExtCreatePen( __in DWORD iPenStyle,
                                    __in DWORD cWidth,
                                    __in CONST LOGBRUSH *plbrush,
                                    __in DWORD cStyle,
                                    __in_ecount_opt(cStyle) CONST DWORD *pstyle);
WINGDIAPI BOOL WINAPI GetMiterLimit(__in HDC hdc, __out PFLOAT plimit);
WINGDIAPI int  WINAPI GetArcDirection(__in HDC hdc);

WINGDIAPI int   WINAPI GetObjectA(__in HANDLE h, __in int c, __out_bcount_opt(c) LPVOID pv);
WINGDIAPI int   WINAPI GetObjectW(__in HANDLE h, __in int c, __out_bcount_opt(c) LPVOID pv);
#ifdef UNICODE
#define GetObject  GetObjectW
#else
#define GetObject  GetObjectA
#endif // !UNICODE
#if defined(_M_CEE)
#undef GetObject
__inline
int
GetObject(
    HANDLE h,
    int c,
    LPVOID pv
    )
{
#ifdef UNICODE
    return GetObjectW(
#else
    return GetObjectA(
#endif
        h,
        c,
        pv
        );
}
#endif  /* _M_CEE */


__gdi_entry WINGDIAPI BOOL  WINAPI MoveToEx( __in HDC hdc, __in int x, __in int y, __out_opt LPPOINT lppt);
__gdi_entry WINGDIAPI BOOL  WINAPI TextOutA( __in HDC hdc, __in int x, __in int y, __in_ecount(c) LPCSTR lpString, __in int c);
__gdi_entry WINGDIAPI BOOL  WINAPI TextOutW( __in HDC hdc, __in int x, __in int y, __in_ecount(c) LPCWSTR lpString, __in int c);
#ifdef UNICODE
#define TextOut  TextOutW
#else
#define TextOut  TextOutA
#endif // !UNICODE
__gdi_entry WINGDIAPI BOOL  WINAPI ExtTextOutA( __in HDC hdc, __in int x, __in int y, __in UINT options, __in_opt CONST RECT * lprect, __in_ecount_opt(c) LPCSTR lpString, __in UINT c, __in_ecount_opt(c) CONST INT * lpDx);
__gdi_entry WINGDIAPI BOOL  WINAPI ExtTextOutW( __in HDC hdc, __in int x, __in int y, __in UINT options, __in_opt CONST RECT * lprect, __in_ecount_opt(c) LPCWSTR lpString, __in UINT c, __in_ecount_opt(c) CONST INT * lpDx);
#ifdef UNICODE
#define ExtTextOut  ExtTextOutW
#else
#define ExtTextOut  ExtTextOutA
#endif // !UNICODE
WINGDIAPI BOOL  WINAPI PolyTextOutA(__in HDC hdc, __in_ecount(nstrings) CONST POLYTEXTA * ppt, __in int nstrings);
WINGDIAPI BOOL  WINAPI PolyTextOutW(__in HDC hdc, __in_ecount(nstrings) CONST POLYTEXTW * ppt, __in int nstrings);
#ifdef UNICODE
#define PolyTextOut  PolyTextOutW
#else
#define PolyTextOut  PolyTextOutA
#endif // !UNICODE

WINGDIAPI HRGN  WINAPI CreatePolygonRgn(    __in_ecount(cPoint) CONST POINT *pptl,
                                            __in int cPoint,
                                            __in int iMode);
WINGDIAPI BOOL  WINAPI DPtoLP( __in HDC hdc, __inout_ecount(c) LPPOINT lppt, __in int c);
WINGDIAPI BOOL  WINAPI LPtoDP( __in HDC hdc, __inout_ecount(c) LPPOINT lppt, __in int c);
__gdi_entry WINGDIAPI BOOL  WINAPI Polygon(__in HDC hdc, __in_ecount(cpt) CONST POINT *apt, __in int cpt);
__gdi_entry WINGDIAPI BOOL  WINAPI Polyline(__in HDC hdc, __in_ecount(cpt) CONST POINT *apt, __in int cpt);

WINGDIAPI BOOL  WINAPI PolyBezier(__in HDC hdc, __in_ecount(cpt) CONST POINT * apt, __in DWORD cpt);
WINGDIAPI BOOL  WINAPI PolyBezierTo(__in HDC hdc, __in_ecount(cpt) CONST POINT * apt, __in DWORD cpt);
WINGDIAPI BOOL  WINAPI PolylineTo(__in HDC hdc, __in_ecount(cpt) CONST POINT * apt, __in DWORD cpt);

__gdi_entry WINGDIAPI BOOL  WINAPI SetViewportExtEx( __in HDC hdc, __in int x, __in int y, __out_opt LPSIZE lpsz);
__gdi_entry WINGDIAPI BOOL  WINAPI SetViewportOrgEx( __in HDC hdc, __in int x, __in int y, __out_opt LPPOINT lppt);
__gdi_entry WINGDIAPI BOOL  WINAPI SetWindowExtEx( __in HDC hdc, __in int x, __in int y, __out_opt LPSIZE lpsz);
__gdi_entry WINGDIAPI BOOL  WINAPI SetWindowOrgEx( __in HDC hdc, __in int x, __in int y, __out_opt LPPOINT lppt);

__gdi_entry WINGDIAPI BOOL  WINAPI OffsetViewportOrgEx( __in HDC hdc, __in int x, __in int y, __out_opt LPPOINT lppt);
__gdi_entry WINGDIAPI BOOL  WINAPI OffsetWindowOrgEx( __in HDC hdc, __in int x, __in int y, __out_opt LPPOINT lppt);
__gdi_entry WINGDIAPI BOOL  WINAPI ScaleViewportExtEx( __in HDC hdc, __in int xn, __in int dx, __in int yn, __in int yd, __out_opt LPSIZE lpsz);
__gdi_entry WINGDIAPI BOOL  WINAPI ScaleWindowExtEx( __in HDC hdc, __in int xn, __in int xd, __in int yn, __in int yd, __out_opt LPSIZE lpsz);
WINGDIAPI BOOL  WINAPI SetBitmapDimensionEx( __in HBITMAP hbm, __in int w, __in int h, __out_opt LPSIZE lpsz);
WINGDIAPI BOOL  WINAPI SetBrushOrgEx( __in HDC hdc, __in int x, __in int y, __out_opt LPPOINT lppt);

WINGDIAPI int   WINAPI GetTextFaceA( __in HDC hdc, __in int c, __out_ecount_part_opt(c, return)  LPSTR lpName);
WINGDIAPI int   WINAPI GetTextFaceW( __in HDC hdc, __in int c, __out_ecount_part_opt(c, return)  LPWSTR lpName);
#ifdef UNICODE
#define GetTextFace  GetTextFaceW
#else
#define GetTextFace  GetTextFaceA
#endif // !UNICODE

#define FONTMAPPER_MAX 10

typedef struct tagKERNINGPAIR {
   WORD wFirst;
   WORD wSecond;
   int  iKernAmount;
} KERNINGPAIR, *LPKERNINGPAIR;

WINGDIAPI DWORD WINAPI GetKerningPairsA(    __in HDC hdc,
                                            __in DWORD nPairs,
                                            __out_ecount_part_opt(nPairs, return) LPKERNINGPAIR   lpKernPair);
WINGDIAPI DWORD WINAPI GetKerningPairsW(    __in HDC hdc,
                                            __in DWORD nPairs,
                                            __out_ecount_part_opt(nPairs, return) LPKERNINGPAIR   lpKernPair);
#ifdef UNICODE
#define GetKerningPairs  GetKerningPairsW
#else
#define GetKerningPairs  GetKerningPairsA
#endif // !UNICODE


WINGDIAPI BOOL  WINAPI GetDCOrgEx( __in HDC hdc, __out LPPOINT lppt);
WINGDIAPI BOOL  WINAPI FixBrushOrgEx( __in HDC hdc, __in int x, __in int y,  __in_opt LPPOINT ptl);
WINGDIAPI BOOL  WINAPI UnrealizeObject( __in HGDIOBJ h);

WINGDIAPI BOOL  WINAPI GdiFlush(void);
WINGDIAPI DWORD WINAPI GdiSetBatchLimit( __in DWORD dw);
WINGDIAPI DWORD WINAPI GdiGetBatchLimit(void);

#if(WINVER >= 0x0400)

#define ICM_OFF               1
#define ICM_ON                2
#define ICM_QUERY             3
#define ICM_DONE_OUTSIDEDC    4

typedef int (CALLBACK* ICMENUMPROCA)(LPSTR, LPARAM);
typedef int (CALLBACK* ICMENUMPROCW)(LPWSTR, LPARAM);
#ifdef UNICODE
#define ICMENUMPROC  ICMENUMPROCW
#else
#define ICMENUMPROC  ICMENUMPROCA
#endif // !UNICODE

WINGDIAPI int         WINAPI SetICMMode( __in HDC hdc, __in int mode);
WINGDIAPI BOOL        WINAPI CheckColorsInGamut(    __in HDC hdc,
                                                    __in_ecount(nCount) LPRGBTRIPLE lpRGBTriple,
                                                    __out_bcount(nCount) LPVOID dlpBuffer,
                                                    __in DWORD nCount);

WINGDIAPI HCOLORSPACE WINAPI GetColorSpace( __in HDC hdc);
WINGDIAPI BOOL        WINAPI GetLogColorSpaceA( __in HCOLORSPACE hColorSpace,
                                                __out_bcount(nSize) LPLOGCOLORSPACEA lpBuffer,
                                                __in DWORD nSize);
WINGDIAPI BOOL        WINAPI GetLogColorSpaceW( __in HCOLORSPACE hColorSpace,
                                                __out_bcount(nSize) LPLOGCOLORSPACEW lpBuffer,
                                                __in DWORD nSize);
#ifdef UNICODE
#define GetLogColorSpace  GetLogColorSpaceW
#else
#define GetLogColorSpace  GetLogColorSpaceA
#endif // !UNICODE

WINGDIAPI HCOLORSPACE WINAPI CreateColorSpaceA( __in LPLOGCOLORSPACEA lplcs);
WINGDIAPI HCOLORSPACE WINAPI CreateColorSpaceW( __in LPLOGCOLORSPACEW lplcs);
#ifdef UNICODE
#define CreateColorSpace  CreateColorSpaceW
#else
#define CreateColorSpace  CreateColorSpaceA
#endif // !UNICODE
WINGDIAPI HCOLORSPACE WINAPI SetColorSpace( __in HDC hdc, __in HCOLORSPACE hcs);
WINGDIAPI BOOL        WINAPI DeleteColorSpace( __in HCOLORSPACE hcs);
WINGDIAPI BOOL        WINAPI GetICMProfileA(    __in HDC hdc,
                                                __inout LPDWORD pBufSize,
                                                __out_ecount_opt(*pBufSize) LPSTR pszFilename);
WINGDIAPI BOOL        WINAPI GetICMProfileW(    __in HDC hdc,
                                                __inout LPDWORD pBufSize,
                                                __out_ecount_opt(*pBufSize) LPWSTR pszFilename);
#ifdef UNICODE
#define GetICMProfile  GetICMProfileW
#else
#define GetICMProfile  GetICMProfileA
#endif // !UNICODE

WINGDIAPI BOOL        WINAPI SetICMProfileA( __in HDC hdc, __in LPSTR lpFileName);
WINGDIAPI BOOL        WINAPI SetICMProfileW( __in HDC hdc, __in LPWSTR lpFileName);
#ifdef UNICODE
#define SetICMProfile  SetICMProfileW
#else
#define SetICMProfile  SetICMProfileA
#endif // !UNICODE
WINGDIAPI BOOL        WINAPI GetDeviceGammaRamp( __in HDC hdc, __out_bcount(3*256*2) LPVOID lpRamp);
WINGDIAPI BOOL        WINAPI SetDeviceGammaRamp( __in HDC hdc, __in_bcount(3*256*2)  LPVOID lpRamp);
WINGDIAPI BOOL        WINAPI ColorMatchToTarget( __in HDC hdc, __in HDC hdcTarget, __in DWORD action);
WINGDIAPI int         WINAPI EnumICMProfilesA( __in HDC hdc, __in ICMENUMPROCA proc, __in_opt LPARAM param);
WINGDIAPI int         WINAPI EnumICMProfilesW( __in HDC hdc, __in ICMENUMPROCW proc, __in_opt LPARAM param);
#ifdef UNICODE
#define EnumICMProfiles  EnumICMProfilesW
#else
#define EnumICMProfiles  EnumICMProfilesA
#endif // !UNICODE
// The Win95 update API UpdateICMRegKeyA is deprecated to set last error to ERROR_NOT_SUPPORTED and return FALSE
WINGDIAPI BOOL        WINAPI UpdateICMRegKeyA( __reserved DWORD reserved, __in LPSTR lpszCMID, __in LPSTR lpszFileName, __in UINT command);
// The Win95 update API UpdateICMRegKeyW is deprecated to set last error to ERROR_NOT_SUPPORTED and return FALSE
WINGDIAPI BOOL        WINAPI UpdateICMRegKeyW( __reserved DWORD reserved, __in LPWSTR lpszCMID, __in LPWSTR lpszFileName, __in UINT command);
#ifdef UNICODE
#define UpdateICMRegKey  UpdateICMRegKeyW
#else
#define UpdateICMRegKey  UpdateICMRegKeyA
#endif // !UNICODE
#pragma deprecated (UpdateICMRegKeyW)
#pragma deprecated (UpdateICMRegKeyA)

#endif /* WINVER >= 0x0400 */

#if (WINVER >= 0x0500)
WINGDIAPI BOOL        WINAPI ColorCorrectPalette( __in HDC hdc, __in HPALETTE hPal, __in DWORD deFirst, __in DWORD num);
#endif

#ifndef NOMETAFILE

// Enhanced metafile constants.

#ifndef _MAC
#define ENHMETA_SIGNATURE       0x464D4520
#else
#define ENHMETA_SIGNATURE       0x20454D46
#endif

// Stock object flag used in the object handle index in the enhanced
// metafile records.
// E.g. The object handle index (META_STOCK_OBJECT | BLACK_BRUSH)
// represents the stock object BLACK_BRUSH.

#define ENHMETA_STOCK_OBJECT    0x80000000

// Enhanced metafile record types.

#define EMR_HEADER                      1
#define EMR_POLYBEZIER                  2
#define EMR_POLYGON                     3
#define EMR_POLYLINE                    4
#define EMR_POLYBEZIERTO                5
#define EMR_POLYLINETO                  6
#define EMR_POLYPOLYLINE                7
#define EMR_POLYPOLYGON                 8
#define EMR_SETWINDOWEXTEX              9
#define EMR_SETWINDOWORGEX              10
#define EMR_SETVIEWPORTEXTEX            11
#define EMR_SETVIEWPORTORGEX            12
#define EMR_SETBRUSHORGEX               13
#define EMR_EOF                         14
#define EMR_SETPIXELV                   15
#define EMR_SETMAPPERFLAGS              16
#define EMR_SETMAPMODE                  17
#define EMR_SETBKMODE                   18
#define EMR_SETPOLYFILLMODE             19
#define EMR_SETROP2                     20
#define EMR_SETSTRETCHBLTMODE           21
#define EMR_SETTEXTALIGN                22
#define EMR_SETCOLORADJUSTMENT          23
#define EMR_SETTEXTCOLOR                24
#define EMR_SETBKCOLOR                  25
#define EMR_OFFSETCLIPRGN               26
#define EMR_MOVETOEX                    27
#define EMR_SETMETARGN                  28
#define EMR_EXCLUDECLIPRECT             29
#define EMR_INTERSECTCLIPRECT           30
#define EMR_SCALEVIEWPORTEXTEX          31
#define EMR_SCALEWINDOWEXTEX            32
#define EMR_SAVEDC                      33
#define EMR_RESTOREDC                   34
#define EMR_SETWORLDTRANSFORM           35
#define EMR_MODIFYWORLDTRANSFORM        36
#define EMR_SELECTOBJECT                37
#define EMR_CREATEPEN                   38
#define EMR_CREATEBRUSHINDIRECT         39
#define EMR_DELETEOBJECT                40
#define EMR_ANGLEARC                    41
#define EMR_ELLIPSE                     42
#define EMR_RECTANGLE                   43
#define EMR_ROUNDRECT                   44
#define EMR_ARC                         45
#define EMR_CHORD                       46
#define EMR_PIE                         47
#define EMR_SELECTPALETTE               48
#define EMR_CREATEPALETTE               49
#define EMR_SETPALETTEENTRIES           50
#define EMR_RESIZEPALETTE               51
#define EMR_REALIZEPALETTE              52
#define EMR_EXTFLOODFILL                53
#define EMR_LINETO                      54
#define EMR_ARCTO                       55
#define EMR_POLYDRAW                    56
#define EMR_SETARCDIRECTION             57
#define EMR_SETMITERLIMIT               58
#define EMR_BEGINPATH                   59
#define EMR_ENDPATH                     60
#define EMR_CLOSEFIGURE                 61
#define EMR_FILLPATH                    62
#define EMR_STROKEANDFILLPATH           63
#define EMR_STROKEPATH                  64
#define EMR_FLATTENPATH                 65
#define EMR_WIDENPATH                   66
#define EMR_SELECTCLIPPATH              67
#define EMR_ABORTPATH                   68

#define EMR_GDICOMMENT                  70
#define EMR_FILLRGN                     71
#define EMR_FRAMERGN                    72
#define EMR_INVERTRGN                   73
#define EMR_PAINTRGN                    74
#define EMR_EXTSELECTCLIPRGN            75
#define EMR_BITBLT                      76
#define EMR_STRETCHBLT                  77
#define EMR_MASKBLT                     78
#define EMR_PLGBLT                      79
#define EMR_SETDIBITSTODEVICE           80
#define EMR_STRETCHDIBITS               81
#define EMR_EXTCREATEFONTINDIRECTW      82
#define EMR_EXTTEXTOUTA                 83
#define EMR_EXTTEXTOUTW                 84
#define EMR_POLYBEZIER16                85
#define EMR_POLYGON16                   86
#define EMR_POLYLINE16                  87
#define EMR_POLYBEZIERTO16              88
#define EMR_POLYLINETO16                89
#define EMR_POLYPOLYLINE16              90
#define EMR_POLYPOLYGON16               91
#define EMR_POLYDRAW16                  92
#define EMR_CREATEMONOBRUSH             93
#define EMR_CREATEDIBPATTERNBRUSHPT     94
#define EMR_EXTCREATEPEN                95
#define EMR_POLYTEXTOUTA                96
#define EMR_POLYTEXTOUTW                97

#if(WINVER >= 0x0400)
#define EMR_SETICMMODE                  98
#define EMR_CREATECOLORSPACE            99
#define EMR_SETCOLORSPACE              100
#define EMR_DELETECOLORSPACE           101
#define EMR_GLSRECORD                  102
#define EMR_GLSBOUNDEDRECORD           103
#define EMR_PIXELFORMAT                104
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0500)
#define EMR_RESERVED_105               105
#define EMR_RESERVED_106               106
#define EMR_RESERVED_107               107
#define EMR_RESERVED_108               108
#define EMR_RESERVED_109               109
#define EMR_RESERVED_110               110
#define EMR_COLORCORRECTPALETTE        111
#define EMR_SETICMPROFILEA             112
#define EMR_SETICMPROFILEW             113
#define EMR_ALPHABLEND                 114
#define EMR_SETLAYOUT                  115
#define EMR_TRANSPARENTBLT             116
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define EMR_RESERVED_117               117
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define EMR_GRADIENTFILL               118
#define EMR_RESERVED_119               119
#define EMR_RESERVED_120               120
#define EMR_COLORMATCHTOTARGETW        121
#define EMR_CREATECOLORSPACEW          122
#endif /* WINVER >= 0x0500 */

#define EMR_MIN                          1

#if (WINVER >= 0x0500)
#define EMR_MAX                        122
#elif (WINVER >= 0x0400)
#define EMR_MAX                        104
#else
#define EMR_MAX                         97
#endif

// Base record type for the enhanced metafile.

typedef struct tagEMR
{
    DWORD   iType;              // Enhanced metafile record type
    DWORD   nSize;              // Length of the record in bytes.
                                // This must be a multiple of 4.
} EMR, *PEMR;

// Base text record type for the enhanced metafile.

typedef struct tagEMRTEXT
{
    POINTL  ptlReference;
    DWORD   nChars;
    DWORD   offString;          // Offset to the string
    DWORD   fOptions;
    RECTL   rcl;
    DWORD   offDx;              // Offset to the inter-character spacing array.
                                // This is always given.
} EMRTEXT, *PEMRTEXT;

// Record structures for the enhanced metafile.

typedef struct tagABORTPATH
{
    EMR     emr;
} EMRABORTPATH,      *PEMRABORTPATH,
  EMRBEGINPATH,      *PEMRBEGINPATH,
  EMRENDPATH,        *PEMRENDPATH,
  EMRCLOSEFIGURE,    *PEMRCLOSEFIGURE,
  EMRFLATTENPATH,    *PEMRFLATTENPATH,
  EMRWIDENPATH,      *PEMRWIDENPATH,
  EMRSETMETARGN,     *PEMRSETMETARGN,
  EMRSAVEDC,         *PEMRSAVEDC,
  EMRREALIZEPALETTE, *PEMRREALIZEPALETTE;

typedef struct tagEMRSELECTCLIPPATH
{
    EMR     emr;
    DWORD   iMode;
} EMRSELECTCLIPPATH,    *PEMRSELECTCLIPPATH,
  EMRSETBKMODE,         *PEMRSETBKMODE,
  EMRSETMAPMODE,        *PEMRSETMAPMODE,
#if(WINVER >= 0x0500)
  EMRSETLAYOUT,         *PEMRSETLAYOUT,
#endif /* WINVER >= 0x0500 */
  EMRSETPOLYFILLMODE,   *PEMRSETPOLYFILLMODE,
  EMRSETROP2,           *PEMRSETROP2,
  EMRSETSTRETCHBLTMODE, *PEMRSETSTRETCHBLTMODE,
  EMRSETICMMODE,        *PEMRSETICMMODE,
  EMRSETTEXTALIGN,      *PEMRSETTEXTALIGN;

typedef struct tagEMRSETMITERLIMIT
{
    EMR     emr;
    FLOAT   eMiterLimit;
} EMRSETMITERLIMIT, *PEMRSETMITERLIMIT;

typedef struct tagEMRRESTOREDC
{
    EMR     emr;
    LONG    iRelative;          // Specifies a relative instance
} EMRRESTOREDC, *PEMRRESTOREDC;

typedef struct tagEMRSETARCDIRECTION
{
    EMR     emr;
    DWORD   iArcDirection;      // Specifies the arc direction in the
                                // advanced graphics mode.
} EMRSETARCDIRECTION, *PEMRSETARCDIRECTION;

typedef struct tagEMRSETMAPPERFLAGS
{
    EMR     emr;
    DWORD   dwFlags;
} EMRSETMAPPERFLAGS, *PEMRSETMAPPERFLAGS;

typedef struct tagEMRSETTEXTCOLOR
{
    EMR     emr;
    COLORREF crColor;
} EMRSETBKCOLOR,   *PEMRSETBKCOLOR,
  EMRSETTEXTCOLOR, *PEMRSETTEXTCOLOR;

typedef struct tagEMRSELECTOBJECT
{
    EMR     emr;
    DWORD   ihObject;           // Object handle index
} EMRSELECTOBJECT, *PEMRSELECTOBJECT,
  EMRDELETEOBJECT, *PEMRDELETEOBJECT;

typedef struct tagEMRSELECTPALETTE
{
    EMR     emr;
    DWORD   ihPal;              // Palette handle index, background mode only
} EMRSELECTPALETTE, *PEMRSELECTPALETTE;

typedef struct tagEMRRESIZEPALETTE
{
    EMR     emr;
    DWORD   ihPal;              // Palette handle index
    DWORD   cEntries;
} EMRRESIZEPALETTE, *PEMRRESIZEPALETTE;

typedef struct tagEMRSETPALETTEENTRIES
{
    EMR     emr;
    DWORD   ihPal;              // Palette handle index
    DWORD   iStart;
    DWORD   cEntries;
    PALETTEENTRY aPalEntries[1];// The peFlags fields do not contain any flags
} EMRSETPALETTEENTRIES, *PEMRSETPALETTEENTRIES;

typedef struct tagEMRSETCOLORADJUSTMENT
{
    EMR     emr;
    COLORADJUSTMENT ColorAdjustment;
} EMRSETCOLORADJUSTMENT, *PEMRSETCOLORADJUSTMENT;

typedef struct tagEMRGDICOMMENT
{
    EMR     emr;
    DWORD   cbData;             // Size of data in bytes
    BYTE    Data[1];
} EMRGDICOMMENT, *PEMRGDICOMMENT;

typedef struct tagEMREOF
{
    EMR     emr;
    DWORD   nPalEntries;        // Number of palette entries
    DWORD   offPalEntries;      // Offset to the palette entries
    DWORD   nSizeLast;          // Same as nSize and must be the last DWORD
                                // of the record.  The palette entries,
                                // if exist, precede this field.
} EMREOF, *PEMREOF;

typedef struct tagEMRLINETO
{
    EMR     emr;
    POINTL  ptl;
} EMRLINETO,   *PEMRLINETO,
  EMRMOVETOEX, *PEMRMOVETOEX;

typedef struct tagEMROFFSETCLIPRGN
{
    EMR     emr;
    POINTL  ptlOffset;
} EMROFFSETCLIPRGN, *PEMROFFSETCLIPRGN;

typedef struct tagEMRFILLPATH
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
} EMRFILLPATH,          *PEMRFILLPATH,
  EMRSTROKEANDFILLPATH, *PEMRSTROKEANDFILLPATH,
  EMRSTROKEPATH,        *PEMRSTROKEPATH;

typedef struct tagEMREXCLUDECLIPRECT
{
    EMR     emr;
    RECTL   rclClip;
} EMREXCLUDECLIPRECT,   *PEMREXCLUDECLIPRECT,
  EMRINTERSECTCLIPRECT, *PEMRINTERSECTCLIPRECT;

typedef struct tagEMRSETVIEWPORTORGEX
{
    EMR     emr;
    POINTL  ptlOrigin;
} EMRSETVIEWPORTORGEX, *PEMRSETVIEWPORTORGEX,
  EMRSETWINDOWORGEX,   *PEMRSETWINDOWORGEX,
  EMRSETBRUSHORGEX,    *PEMRSETBRUSHORGEX;

typedef struct tagEMRSETVIEWPORTEXTEX
{
    EMR     emr;
    SIZEL   szlExtent;
} EMRSETVIEWPORTEXTEX, *PEMRSETVIEWPORTEXTEX,
  EMRSETWINDOWEXTEX,   *PEMRSETWINDOWEXTEX;

typedef struct tagEMRSCALEVIEWPORTEXTEX
{
    EMR     emr;
    LONG    xNum;
    LONG    xDenom;
    LONG    yNum;
    LONG    yDenom;
} EMRSCALEVIEWPORTEXTEX, *PEMRSCALEVIEWPORTEXTEX,
  EMRSCALEWINDOWEXTEX,   *PEMRSCALEWINDOWEXTEX;

typedef struct tagEMRSETWORLDTRANSFORM
{
    EMR     emr;
    XFORM   xform;
} EMRSETWORLDTRANSFORM, *PEMRSETWORLDTRANSFORM;

typedef struct tagEMRMODIFYWORLDTRANSFORM
{
    EMR     emr;
    XFORM   xform;
    DWORD   iMode;
} EMRMODIFYWORLDTRANSFORM, *PEMRMODIFYWORLDTRANSFORM;

typedef struct tagEMRSETPIXELV
{
    EMR     emr;
    POINTL  ptlPixel;
    COLORREF crColor;
} EMRSETPIXELV, *PEMRSETPIXELV;

typedef struct tagEMREXTFLOODFILL
{
    EMR     emr;
    POINTL  ptlStart;
    COLORREF crColor;
    DWORD   iMode;
} EMREXTFLOODFILL, *PEMREXTFLOODFILL;

typedef struct tagEMRELLIPSE
{
    EMR     emr;
    RECTL   rclBox;             // Inclusive-inclusive bounding rectangle
} EMRELLIPSE,  *PEMRELLIPSE,
  EMRRECTANGLE, *PEMRRECTANGLE;


typedef struct tagEMRROUNDRECT
{
    EMR     emr;
    RECTL   rclBox;             // Inclusive-inclusive bounding rectangle
    SIZEL   szlCorner;
} EMRROUNDRECT, *PEMRROUNDRECT;

typedef struct tagEMRARC
{
    EMR     emr;
    RECTL   rclBox;             // Inclusive-inclusive bounding rectangle
    POINTL  ptlStart;
    POINTL  ptlEnd;
} EMRARC,   *PEMRARC,
  EMRARCTO, *PEMRARCTO,
  EMRCHORD, *PEMRCHORD,
  EMRPIE,   *PEMRPIE;

typedef struct tagEMRANGLEARC
{
    EMR     emr;
    POINTL  ptlCenter;
    DWORD   nRadius;
    FLOAT   eStartAngle;
    FLOAT   eSweepAngle;
} EMRANGLEARC, *PEMRANGLEARC;

typedef struct tagEMRPOLYLINE
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD   cptl;
    POINTL  aptl[1];
} EMRPOLYLINE,     *PEMRPOLYLINE,
  EMRPOLYBEZIER,   *PEMRPOLYBEZIER,
  EMRPOLYGON,      *PEMRPOLYGON,
  EMRPOLYBEZIERTO, *PEMRPOLYBEZIERTO,
  EMRPOLYLINETO,   *PEMRPOLYLINETO;

typedef struct tagEMRPOLYLINE16
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD   cpts;
    POINTS  apts[1];
} EMRPOLYLINE16,     *PEMRPOLYLINE16,
  EMRPOLYBEZIER16,   *PEMRPOLYBEZIER16,
  EMRPOLYGON16,      *PEMRPOLYGON16,
  EMRPOLYBEZIERTO16, *PEMRPOLYBEZIERTO16,
  EMRPOLYLINETO16,   *PEMRPOLYLINETO16;

typedef struct tagEMRPOLYDRAW
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD   cptl;               // Number of points
    POINTL  aptl[1];            // Array of points
    BYTE    abTypes[1];         // Array of point types
} EMRPOLYDRAW, *PEMRPOLYDRAW;

typedef struct tagEMRPOLYDRAW16
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD   cpts;               // Number of points
    POINTS  apts[1];            // Array of points
    BYTE    abTypes[1];         // Array of point types
} EMRPOLYDRAW16, *PEMRPOLYDRAW16;

typedef struct tagEMRPOLYPOLYLINE
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD   nPolys;             // Number of polys
    DWORD   cptl;               // Total number of points in all polys
    DWORD   aPolyCounts[1];     // Array of point counts for each poly
    POINTL  aptl[1];            // Array of points
} EMRPOLYPOLYLINE, *PEMRPOLYPOLYLINE,
  EMRPOLYPOLYGON,  *PEMRPOLYPOLYGON;

typedef struct tagEMRPOLYPOLYLINE16
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD   nPolys;             // Number of polys
    DWORD   cpts;               // Total number of points in all polys
    DWORD   aPolyCounts[1];     // Array of point counts for each poly
    POINTS  apts[1];            // Array of points
} EMRPOLYPOLYLINE16, *PEMRPOLYPOLYLINE16,
  EMRPOLYPOLYGON16,  *PEMRPOLYPOLYGON16;

typedef struct tagEMRINVERTRGN
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD   cbRgnData;          // Size of region data in bytes
    BYTE    RgnData[1];
} EMRINVERTRGN, *PEMRINVERTRGN,
  EMRPAINTRGN,  *PEMRPAINTRGN;

typedef struct tagEMRFILLRGN
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD   cbRgnData;          // Size of region data in bytes
    DWORD   ihBrush;            // Brush handle index
    BYTE    RgnData[1];
} EMRFILLRGN, *PEMRFILLRGN;

typedef struct tagEMRFRAMERGN
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD   cbRgnData;          // Size of region data in bytes
    DWORD   ihBrush;            // Brush handle index
    SIZEL   szlStroke;
    BYTE    RgnData[1];
} EMRFRAMERGN, *PEMRFRAMERGN;

typedef struct tagEMREXTSELECTCLIPRGN
{
    EMR     emr;
    DWORD   cbRgnData;          // Size of region data in bytes
    DWORD   iMode;
    BYTE    RgnData[1];
} EMREXTSELECTCLIPRGN, *PEMREXTSELECTCLIPRGN;

typedef struct tagEMREXTTEXTOUTA
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD   iGraphicsMode;      // Current graphics mode
    FLOAT   exScale;            // X and Y scales from Page units to .01mm units
    FLOAT   eyScale;            //   if graphics mode is GM_COMPATIBLE.
    EMRTEXT emrtext;            // This is followed by the string and spacing
                                // array
} EMREXTTEXTOUTA, *PEMREXTTEXTOUTA,
  EMREXTTEXTOUTW, *PEMREXTTEXTOUTW;

typedef struct tagEMRPOLYTEXTOUTA
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD   iGraphicsMode;      // Current graphics mode
    FLOAT   exScale;            // X and Y scales from Page units to .01mm units
    FLOAT   eyScale;            //   if graphics mode is GM_COMPATIBLE.
    LONG    cStrings;
    EMRTEXT aemrtext[1];        // Array of EMRTEXT structures.  This is
                                // followed by the strings and spacing arrays.
} EMRPOLYTEXTOUTA, *PEMRPOLYTEXTOUTA,
  EMRPOLYTEXTOUTW, *PEMRPOLYTEXTOUTW;

typedef struct tagEMRBITBLT
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    LONG    xDest;
    LONG    yDest;
    LONG    cxDest;
    LONG    cyDest;
    DWORD   dwRop;
    LONG    xSrc;
    LONG    ySrc;
    XFORM   xformSrc;           // Source DC transform
    COLORREF crBkColorSrc;      // Source DC BkColor in RGB
    DWORD   iUsageSrc;          // Source bitmap info color table usage
                                // (DIB_RGB_COLORS)
    DWORD   offBmiSrc;          // Offset to the source BITMAPINFO structure
    DWORD   cbBmiSrc;           // Size of the source BITMAPINFO structure
    DWORD   offBitsSrc;         // Offset to the source bitmap bits
    DWORD   cbBitsSrc;          // Size of the source bitmap bits
} EMRBITBLT, *PEMRBITBLT;

typedef struct tagEMRSTRETCHBLT
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    LONG    xDest;
    LONG    yDest;
    LONG    cxDest;
    LONG    cyDest;
    DWORD   dwRop;
    LONG    xSrc;
    LONG    ySrc;
    XFORM   xformSrc;           // Source DC transform
    COLORREF crBkColorSrc;      // Source DC BkColor in RGB
    DWORD   iUsageSrc;          // Source bitmap info color table usage
                                // (DIB_RGB_COLORS)
    DWORD   offBmiSrc;          // Offset to the source BITMAPINFO structure
    DWORD   cbBmiSrc;           // Size of the source BITMAPINFO structure
    DWORD   offBitsSrc;         // Offset to the source bitmap bits
    DWORD   cbBitsSrc;          // Size of the source bitmap bits
    LONG    cxSrc;
    LONG    cySrc;
} EMRSTRETCHBLT, *PEMRSTRETCHBLT;

typedef struct tagEMRMASKBLT
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    LONG    xDest;
    LONG    yDest;
    LONG    cxDest;
    LONG    cyDest;
    DWORD   dwRop;
    LONG    xSrc;
    LONG    ySrc;
    XFORM   xformSrc;           // Source DC transform
    COLORREF crBkColorSrc;      // Source DC BkColor in RGB
    DWORD   iUsageSrc;          // Source bitmap info color table usage
                                // (DIB_RGB_COLORS)
    DWORD   offBmiSrc;          // Offset to the source BITMAPINFO structure
    DWORD   cbBmiSrc;           // Size of the source BITMAPINFO structure
    DWORD   offBitsSrc;         // Offset to the source bitmap bits
    DWORD   cbBitsSrc;          // Size of the source bitmap bits
    LONG    xMask;
    LONG    yMask;
    DWORD   iUsageMask;         // Mask bitmap info color table usage
    DWORD   offBmiMask;         // Offset to the mask BITMAPINFO structure if any
    DWORD   cbBmiMask;          // Size of the mask BITMAPINFO structure if any
    DWORD   offBitsMask;        // Offset to the mask bitmap bits if any
    DWORD   cbBitsMask;         // Size of the mask bitmap bits if any
} EMRMASKBLT, *PEMRMASKBLT;

typedef struct tagEMRPLGBLT
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    POINTL  aptlDest[3];
    LONG    xSrc;
    LONG    ySrc;
    LONG    cxSrc;
    LONG    cySrc;
    XFORM   xformSrc;           // Source DC transform
    COLORREF crBkColorSrc;      // Source DC BkColor in RGB
    DWORD   iUsageSrc;          // Source bitmap info color table usage
                                // (DIB_RGB_COLORS)
    DWORD   offBmiSrc;          // Offset to the source BITMAPINFO structure
    DWORD   cbBmiSrc;           // Size of the source BITMAPINFO structure
    DWORD   offBitsSrc;         // Offset to the source bitmap bits
    DWORD   cbBitsSrc;          // Size of the source bitmap bits
    LONG    xMask;
    LONG    yMask;
    DWORD   iUsageMask;         // Mask bitmap info color table usage
    DWORD   offBmiMask;         // Offset to the mask BITMAPINFO structure if any
    DWORD   cbBmiMask;          // Size of the mask BITMAPINFO structure if any
    DWORD   offBitsMask;        // Offset to the mask bitmap bits if any
    DWORD   cbBitsMask;         // Size of the mask bitmap bits if any
} EMRPLGBLT, *PEMRPLGBLT;

typedef struct tagEMRSETDIBITSTODEVICE
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    LONG    xDest;
    LONG    yDest;
    LONG    xSrc;
    LONG    ySrc;
    LONG    cxSrc;
    LONG    cySrc;
    DWORD   offBmiSrc;          // Offset to the source BITMAPINFO structure
    DWORD   cbBmiSrc;           // Size of the source BITMAPINFO structure
    DWORD   offBitsSrc;         // Offset to the source bitmap bits
    DWORD   cbBitsSrc;          // Size of the source bitmap bits
    DWORD   iUsageSrc;          // Source bitmap info color table usage
    DWORD   iStartScan;
    DWORD   cScans;
} EMRSETDIBITSTODEVICE, *PEMRSETDIBITSTODEVICE;

typedef struct tagEMRSTRETCHDIBITS
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    LONG    xDest;
    LONG    yDest;
    LONG    xSrc;
    LONG    ySrc;
    LONG    cxSrc;
    LONG    cySrc;
    DWORD   offBmiSrc;          // Offset to the source BITMAPINFO structure
    DWORD   cbBmiSrc;           // Size of the source BITMAPINFO structure
    DWORD   offBitsSrc;         // Offset to the source bitmap bits
    DWORD   cbBitsSrc;          // Size of the source bitmap bits
    DWORD   iUsageSrc;          // Source bitmap info color table usage
    DWORD   dwRop;
    LONG    cxDest;
    LONG    cyDest;
} EMRSTRETCHDIBITS, *PEMRSTRETCHDIBITS;

typedef struct tagEMREXTCREATEFONTINDIRECTW
{
    EMR     emr;
    DWORD   ihFont;             // Font handle index
    EXTLOGFONTW elfw;
} EMREXTCREATEFONTINDIRECTW, *PEMREXTCREATEFONTINDIRECTW;

typedef struct tagEMRCREATEPALETTE
{
    EMR     emr;
    DWORD   ihPal;              // Palette handle index
    LOGPALETTE lgpl;            // The peFlags fields in the palette entries
                                // do not contain any flags
} EMRCREATEPALETTE, *PEMRCREATEPALETTE;

typedef struct tagEMRCREATEPEN
{
    EMR     emr;
    DWORD   ihPen;              // Pen handle index
    LOGPEN  lopn;
} EMRCREATEPEN, *PEMRCREATEPEN;

typedef struct tagEMREXTCREATEPEN
{
    EMR     emr;
    DWORD   ihPen;              // Pen handle index
    DWORD   offBmi;             // Offset to the BITMAPINFO structure if any
    DWORD   cbBmi;              // Size of the BITMAPINFO structure if any
                                // The bitmap info is followed by the bitmap
                                // bits to form a packed DIB.
    DWORD   offBits;            // Offset to the brush bitmap bits if any
    DWORD   cbBits;             // Size of the brush bitmap bits if any
    EXTLOGPEN32 elp;            // The extended pen with the style array.
} EMREXTCREATEPEN, *PEMREXTCREATEPEN;

typedef struct tagEMRCREATEBRUSHINDIRECT
{
    EMR        emr;
    DWORD      ihBrush;          // Brush handle index
    LOGBRUSH32 lb;               // The style must be BS_SOLID, BS_HOLLOW,
                                 // BS_NULL or BS_HATCHED.
} EMRCREATEBRUSHINDIRECT, *PEMRCREATEBRUSHINDIRECT;

typedef struct tagEMRCREATEMONOBRUSH
{
    EMR     emr;
    DWORD   ihBrush;            // Brush handle index
    DWORD   iUsage;             // Bitmap info color table usage
    DWORD   offBmi;             // Offset to the BITMAPINFO structure
    DWORD   cbBmi;              // Size of the BITMAPINFO structure
    DWORD   offBits;            // Offset to the bitmap bits
    DWORD   cbBits;             // Size of the bitmap bits
} EMRCREATEMONOBRUSH, *PEMRCREATEMONOBRUSH;

typedef struct tagEMRCREATEDIBPATTERNBRUSHPT
{
    EMR     emr;
    DWORD   ihBrush;            // Brush handle index
    DWORD   iUsage;             // Bitmap info color table usage
    DWORD   offBmi;             // Offset to the BITMAPINFO structure
    DWORD   cbBmi;              // Size of the BITMAPINFO structure
                                // The bitmap info is followed by the bitmap
                                // bits to form a packed DIB.
    DWORD   offBits;            // Offset to the bitmap bits
    DWORD   cbBits;             // Size of the bitmap bits
} EMRCREATEDIBPATTERNBRUSHPT, *PEMRCREATEDIBPATTERNBRUSHPT;

typedef struct tagEMRFORMAT
{
    DWORD   dSignature;         // Format signature, e.g. ENHMETA_SIGNATURE.
    DWORD   nVersion;           // Format version number.
    DWORD   cbData;             // Size of data in bytes.
    DWORD   offData;            // Offset to data from GDICOMMENT_IDENTIFIER.
                                // It must begin at a DWORD offset.
} EMRFORMAT, *PEMRFORMAT;

#if(WINVER >= 0x0400)

typedef struct tagEMRGLSRECORD
{
    EMR     emr;
    DWORD   cbData;             // Size of data in bytes
    BYTE    Data[1];
} EMRGLSRECORD, *PEMRGLSRECORD;

typedef struct tagEMRGLSBOUNDEDRECORD
{
    EMR     emr;
    RECTL   rclBounds;          // Bounds in recording coordinates
    DWORD   cbData;             // Size of data in bytes
    BYTE    Data[1];
} EMRGLSBOUNDEDRECORD, *PEMRGLSBOUNDEDRECORD;

typedef struct tagEMRPIXELFORMAT
{
    EMR     emr;
    PIXELFORMATDESCRIPTOR pfd;
} EMRPIXELFORMAT, *PEMRPIXELFORMAT;

typedef struct tagEMRCREATECOLORSPACE
{
    EMR             emr;
    DWORD           ihCS;       // ColorSpace handle index
    LOGCOLORSPACEA  lcs;        // Ansi version of LOGCOLORSPACE
} EMRCREATECOLORSPACE, *PEMRCREATECOLORSPACE;

typedef struct tagEMRSETCOLORSPACE
{
    EMR     emr;
    DWORD   ihCS;               // ColorSpace handle index
} EMRSETCOLORSPACE,    *PEMRSETCOLORSPACE,
  EMRSELECTCOLORSPACE, *PEMRSELECTCOLORSPACE,
  EMRDELETECOLORSPACE, *PEMRDELETECOLORSPACE;

#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0500)

typedef struct tagEMREXTESCAPE
{
    EMR     emr;
    INT     iEscape;            // Escape code
    INT     cbEscData;          // Size of escape data
    BYTE    EscData[1];         // Escape data
} EMREXTESCAPE,  *PEMREXTESCAPE,
  EMRDRAWESCAPE, *PEMRDRAWESCAPE;

typedef struct tagEMRNAMEDESCAPE
{
    EMR     emr;
    INT     iEscape;            // Escape code
    INT     cbDriver;           // Size of driver name
    INT     cbEscData;          // Size of escape data
    BYTE    EscData[1];         // Driver name and Escape data
} EMRNAMEDESCAPE, *PEMRNAMEDESCAPE;

#define SETICMPROFILE_EMBEDED           0x00000001

typedef struct tagEMRSETICMPROFILE
{
    EMR     emr;
    DWORD   dwFlags;            // flags
    DWORD   cbName;             // Size of desired profile name
    DWORD   cbData;             // Size of raw profile data if attached
    BYTE    Data[1];            // Array size is cbName + cbData
} EMRSETICMPROFILE,  *PEMRSETICMPROFILE,
  EMRSETICMPROFILEA, *PEMRSETICMPROFILEA,
  EMRSETICMPROFILEW, *PEMRSETICMPROFILEW;

#define CREATECOLORSPACE_EMBEDED        0x00000001

typedef struct tagEMRCREATECOLORSPACEW
{
    EMR             emr;
    DWORD           ihCS;       // ColorSpace handle index
    LOGCOLORSPACEW  lcs;        // Unicode version of logical color space structure
    DWORD           dwFlags;    // flags
    DWORD           cbData;     // size of raw source profile data if attached
    BYTE            Data[1];    // Array size is cbData
} EMRCREATECOLORSPACEW, *PEMRCREATECOLORSPACEW;

#define COLORMATCHTOTARGET_EMBEDED      0x00000001

typedef struct tagCOLORMATCHTOTARGET
{
    EMR     emr;
    DWORD   dwAction;           // CS_ENABLE, CS_DISABLE or CS_DELETE_TRANSFORM
    DWORD   dwFlags;            // flags
    DWORD   cbName;             // Size of desired target profile name
    DWORD   cbData;             // Size of raw target profile data if attached
    BYTE    Data[1];            // Array size is cbName + cbData
} EMRCOLORMATCHTOTARGET, *PEMRCOLORMATCHTOTARGET;

typedef struct tagCOLORCORRECTPALETTE
{
    EMR     emr;
    DWORD   ihPalette;          // Palette handle index
    DWORD   nFirstEntry;        // Index of first entry to correct
    DWORD   nPalEntries;        // Number of palette entries to correct
    DWORD   nReserved;          // Reserved
} EMRCOLORCORRECTPALETTE, *PEMRCOLORCORRECTPALETTE;

typedef struct tagEMRALPHABLEND
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    LONG    xDest;
    LONG    yDest;
    LONG    cxDest;
    LONG    cyDest;
    DWORD   dwRop;
    LONG    xSrc;
    LONG    ySrc;
    XFORM   xformSrc;           // Source DC transform
    COLORREF crBkColorSrc;      // Source DC BkColor in RGB
    DWORD   iUsageSrc;          // Source bitmap info color table usage
                                // (DIB_RGB_COLORS)
    DWORD   offBmiSrc;          // Offset to the source BITMAPINFO structure
    DWORD   cbBmiSrc;           // Size of the source BITMAPINFO structure
    DWORD   offBitsSrc;         // Offset to the source bitmap bits
    DWORD   cbBitsSrc;          // Size of the source bitmap bits
    LONG    cxSrc;
    LONG    cySrc;
} EMRALPHABLEND, *PEMRALPHABLEND;

typedef struct tagEMRGRADIENTFILL
{
    EMR       emr;
    RECTL     rclBounds;          // Inclusive-inclusive bounds in device units
    DWORD     nVer;
    DWORD     nTri;
    ULONG     ulMode;
    TRIVERTEX Ver[1];
}EMRGRADIENTFILL,*PEMRGRADIENTFILL;

typedef struct tagEMRTRANSPARENTBLT
{
    EMR     emr;
    RECTL   rclBounds;          // Inclusive-inclusive bounds in device units
    LONG    xDest;
    LONG    yDest;
    LONG    cxDest;
    LONG    cyDest;
    DWORD   dwRop;
    LONG    xSrc;
    LONG    ySrc;
    XFORM   xformSrc;           // Source DC transform
    COLORREF crBkColorSrc;      // Source DC BkColor in RGB
    DWORD   iUsageSrc;          // Source bitmap info color table usage
                                // (DIB_RGB_COLORS)
    DWORD   offBmiSrc;          // Offset to the source BITMAPINFO structure
    DWORD   cbBmiSrc;           // Size of the source BITMAPINFO structure
    DWORD   offBitsSrc;         // Offset to the source bitmap bits
    DWORD   cbBitsSrc;          // Size of the source bitmap bits
    LONG    cxSrc;
    LONG    cySrc;
} EMRTRANSPARENTBLT, *PEMRTRANSPARENTBLT;


#endif /* WINVER >= 0x0500 */

#define GDICOMMENT_IDENTIFIER           0x43494447
#define GDICOMMENT_WINDOWS_METAFILE     0x80000001
#define GDICOMMENT_BEGINGROUP           0x00000002
#define GDICOMMENT_ENDGROUP             0x00000003
#define GDICOMMENT_MULTIFORMATS         0x40000004
#define EPS_SIGNATURE                   0x46535045
#define GDICOMMENT_UNICODE_STRING       0x00000040
#define GDICOMMENT_UNICODE_END          0x00000080

#endif  /* NOMETAFILE */


// OpenGL wgl prototypes

WINGDIAPI BOOL  WINAPI wglCopyContext(HGLRC, HGLRC, UINT);
WINGDIAPI HGLRC WINAPI wglCreateContext(HDC);
WINGDIAPI HGLRC WINAPI wglCreateLayerContext(HDC, int);
WINGDIAPI BOOL  WINAPI wglDeleteContext(HGLRC);
WINGDIAPI HGLRC WINAPI wglGetCurrentContext(VOID);
WINGDIAPI HDC   WINAPI wglGetCurrentDC(VOID);
WINGDIAPI PROC  WINAPI wglGetProcAddress(LPCSTR);
WINGDIAPI BOOL  WINAPI wglMakeCurrent(HDC, HGLRC);
WINGDIAPI BOOL  WINAPI wglShareLists(HGLRC, HGLRC);
WINGDIAPI BOOL  WINAPI wglUseFontBitmapsA(HDC, DWORD, DWORD, DWORD);
WINGDIAPI BOOL  WINAPI wglUseFontBitmapsW(HDC, DWORD, DWORD, DWORD);
#ifdef UNICODE
#define wglUseFontBitmaps  wglUseFontBitmapsW
#else
#define wglUseFontBitmaps  wglUseFontBitmapsA
#endif // !UNICODE
WINGDIAPI BOOL  WINAPI SwapBuffers(HDC);

typedef struct _POINTFLOAT {
    FLOAT   x;
    FLOAT   y;
} POINTFLOAT, *PPOINTFLOAT;

typedef struct _GLYPHMETRICSFLOAT {
    FLOAT       gmfBlackBoxX;
    FLOAT       gmfBlackBoxY;
    POINTFLOAT  gmfptGlyphOrigin;
    FLOAT       gmfCellIncX;
    FLOAT       gmfCellIncY;
} GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT, FAR *LPGLYPHMETRICSFLOAT;

#define WGL_FONT_LINES      0
#define WGL_FONT_POLYGONS   1
WINGDIAPI BOOL  WINAPI wglUseFontOutlinesA(HDC, DWORD, DWORD, DWORD, FLOAT,
                                           FLOAT, int, LPGLYPHMETRICSFLOAT);
WINGDIAPI BOOL  WINAPI wglUseFontOutlinesW(HDC, DWORD, DWORD, DWORD, FLOAT,
                                           FLOAT, int, LPGLYPHMETRICSFLOAT);
#ifdef UNICODE
#define wglUseFontOutlines  wglUseFontOutlinesW
#else
#define wglUseFontOutlines  wglUseFontOutlinesA
#endif // !UNICODE

/* Layer plane descriptor */
typedef struct tagLAYERPLANEDESCRIPTOR { // lpd
    WORD  nSize;
    WORD  nVersion;
    DWORD dwFlags;
    BYTE  iPixelType;
    BYTE  cColorBits;
    BYTE  cRedBits;
    BYTE  cRedShift;
    BYTE  cGreenBits;
    BYTE  cGreenShift;
    BYTE  cBlueBits;
    BYTE  cBlueShift;
    BYTE  cAlphaBits;
    BYTE  cAlphaShift;
    BYTE  cAccumBits;
    BYTE  cAccumRedBits;
    BYTE  cAccumGreenBits;
    BYTE  cAccumBlueBits;
    BYTE  cAccumAlphaBits;
    BYTE  cDepthBits;
    BYTE  cStencilBits;
    BYTE  cAuxBuffers;
    BYTE  iLayerPlane;
    BYTE  bReserved;
    COLORREF crTransparent;
} LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR, FAR *LPLAYERPLANEDESCRIPTOR;

/* LAYERPLANEDESCRIPTOR flags */
#define LPD_DOUBLEBUFFER        0x00000001
#define LPD_STEREO              0x00000002
#define LPD_SUPPORT_GDI         0x00000010
#define LPD_SUPPORT_OPENGL      0x00000020
#define LPD_SHARE_DEPTH         0x00000040
#define LPD_SHARE_STENCIL       0x00000080
#define LPD_SHARE_ACCUM         0x00000100
#define LPD_SWAP_EXCHANGE       0x00000200
#define LPD_SWAP_COPY           0x00000400
#define LPD_TRANSPARENT         0x00001000

#define LPD_TYPE_RGBA        0
#define LPD_TYPE_COLORINDEX  1

/* wglSwapLayerBuffers flags */
#define WGL_SWAP_MAIN_PLANE     0x00000001
#define WGL_SWAP_OVERLAY1       0x00000002
#define WGL_SWAP_OVERLAY2       0x00000004
#define WGL_SWAP_OVERLAY3       0x00000008
#define WGL_SWAP_OVERLAY4       0x00000010
#define WGL_SWAP_OVERLAY5       0x00000020
#define WGL_SWAP_OVERLAY6       0x00000040
#define WGL_SWAP_OVERLAY7       0x00000080
#define WGL_SWAP_OVERLAY8       0x00000100
#define WGL_SWAP_OVERLAY9       0x00000200
#define WGL_SWAP_OVERLAY10      0x00000400
#define WGL_SWAP_OVERLAY11      0x00000800
#define WGL_SWAP_OVERLAY12      0x00001000
#define WGL_SWAP_OVERLAY13      0x00002000
#define WGL_SWAP_OVERLAY14      0x00004000
#define WGL_SWAP_OVERLAY15      0x00008000
#define WGL_SWAP_UNDERLAY1      0x00010000
#define WGL_SWAP_UNDERLAY2      0x00020000
#define WGL_SWAP_UNDERLAY3      0x00040000
#define WGL_SWAP_UNDERLAY4      0x00080000
#define WGL_SWAP_UNDERLAY5      0x00100000
#define WGL_SWAP_UNDERLAY6      0x00200000
#define WGL_SWAP_UNDERLAY7      0x00400000
#define WGL_SWAP_UNDERLAY8      0x00800000
#define WGL_SWAP_UNDERLAY9      0x01000000
#define WGL_SWAP_UNDERLAY10     0x02000000
#define WGL_SWAP_UNDERLAY11     0x04000000
#define WGL_SWAP_UNDERLAY12     0x08000000
#define WGL_SWAP_UNDERLAY13     0x10000000
#define WGL_SWAP_UNDERLAY14     0x20000000
#define WGL_SWAP_UNDERLAY15     0x40000000

WINGDIAPI BOOL  WINAPI wglDescribeLayerPlane(HDC, int, int, UINT,
                                             LPLAYERPLANEDESCRIPTOR);
WINGDIAPI int   WINAPI wglSetLayerPaletteEntries(HDC, int, int, int,
                                                 CONST COLORREF *);
WINGDIAPI int   WINAPI wglGetLayerPaletteEntries(HDC, int, int, int,
                                                 COLORREF *);
WINGDIAPI BOOL  WINAPI wglRealizeLayerPalette(HDC, int, BOOL);
WINGDIAPI BOOL  WINAPI wglSwapLayerBuffers(HDC, UINT);

#if (WINVER >= 0x0500)

typedef struct _WGLSWAP
{
    HDC hdc;
    UINT uiFlags;
} WGLSWAP, *PWGLSWAP, FAR *LPWGLSWAP;

#define WGL_SWAPMULTIPLE_MAX 16

WINGDIAPI DWORD WINAPI wglSwapMultipleBuffers(UINT, CONST WGLSWAP *);

#endif // (WINVER >= 0x0500)

#endif /* NOGDI */

#ifdef __cplusplus
}
#endif


#if _MSC_VER >= 1200
#pragma warning(pop)
#endif

#endif /* _WINGDI_ */


// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLSquare.CPP
// 
// Description: Contains the drawing code for a basic square
// ----------------------------------------------------------------------------
#include "ACME.H"

GLvoid GLSquare::Draw()
{
	beginDraw();
	glBegin(GL_QUADS);
		glNormal3f( 0.0f, 0.0f, 0.0f);
		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  -1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  -1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  -1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  -1.0f);
	glEnd();
	endDraw();
}

// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLSphere.CPP
// 
// Description: Contains the drawing code for a basic sphere
// ----------------------------------------------------------------------------
#include "ACME.H"

GLvoid GLSphere::Draw()
{
	beginDraw();
	{
		// Draw A Sphere With A Radius Of 1 And 32 Longitude And 32 Latitude Segments
		gluSphere(myQuadratic,1.3f,32,32);
	}
	endDraw();
}

// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLDisk.CPP
// 
// Description: Contains the drawing code for a disk
//
// ----------------------------------------------------------------------------
#include "ACME.H"

GLvoid GLSegmentedDisk::Draw()
{
	beginDraw();
		part1+=p1;
		part2+=p2;

		if(part1>359)									// 360 Degrees
		{
			p1=0;
			part1=0;
			p2=1;
			part2=0;
		}
		if(part2>359)									// 360 Degrees
		{
			p1=1;
			p2=0;
		}
		gluPartialDisk(myQuadratic,0.5f,1.5f,32,32,part1,part2-part1);	// A Disk Like The One Before
	endDraw();
}

// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLSaturn.CPP
// 
// Description: Contains the drawing code for drawing SATURN!!!
// ----------------------------------------------------------------------------
#include "ACME.H"

GLvoid GLSaturn::Draw()
{
	beginDraw();
	if( mySkin != NULL )
	{
		glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, mySkin->myTexture);
	}
	// Draw A Sphere With A Radius Of 1 And 32 Longitude And 32 Latitude Segments
	gluSphere(myQuadratic,0.6,32,32);

	glBindTexture(GL_TEXTURE_2D, myRings->myTexture);
	gluDisk(myQuadratic,1.1f,1.5f,32,32);

	endDraw();
}
// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLPyramid.CPP
// 
// Description: Contains the drawing code for a basic pyramid
// ----------------------------------------------------------------------------
#include "ACME.H"

GLvoid GLPyramid::Draw()
{
	beginDraw();
	// Center The Pyramid
	glTranslatef(0.0f,0.0f,0.0f);

	glBegin(GL_TRIANGLES);								// Start Drawing A Triangle
		glTexCoord3f(1.0f,0.0f,0.0f);					
		glVertex3f( 0.0f, 1.0f, 0.0f);					// Top Of Triangle (Front)
		glTexCoord3f(0.0f,1.0f,0.0f);					
		glVertex3f(-1.0f,-1.0f, 1.0f);					// Left Of Triangle (Front)
		glTexCoord3f(0.0f,0.0f,1.0f);					
		glVertex3f( 1.0f,-1.0f, 1.0f);					// Right Of Triangle (Front)
		glTexCoord3f(1.0f,0.0f,0.0f);					
		glVertex3f( 0.0f, 1.0f, 0.0f);					// Top Of Triangle (Right)
		glTexCoord3f(0.0f,0.0f,1.0f);					
		glVertex3f( 1.0f,-1.0f, 1.0f);					// Left Of Triangle (Right)
		glTexCoord3f(0.0f,1.0f,0.0f);					
		glVertex3f( 1.0f,-1.0f, -1.0f);					// Right Of Triangle (Right)
		glTexCoord3f(1.0f,0.0f,0.0f);					
		glVertex3f( 0.0f, 1.0f, 0.0f);					// Top Of Triangle (Back)
		glTexCoord3f(0.0f,1.0f,0.0f);					
		glVertex3f( 1.0f,-1.0f, -1.0f);					// Left Of Triangle (Back)
		glTexCoord3f(0.0f,0.0f,1.0f);					
		glVertex3f(-1.0f,-1.0f, -1.0f);					// Right Of Triangle (Back)
		glTexCoord3f(1.0f,0.0f,0.0f);					
		glVertex3f( 0.0f, 1.0f, 0.0f);					// Top Of Triangle (Left)
		glTexCoord3f(0.0f,0.0f,1.0f);					
		glVertex3f(-1.0f,-1.0f,-1.0f);					// Left Of Triangle (Left)
		glTexCoord3f(0.0f,1.0f,0.0f);					
		glVertex3f(-1.0f,-1.0f, 1.0f);					// Right Of Triangle (Left)
	glEnd();											// Done Drawing The Pyramid
	glBegin(GL_QUADS);								// Start Drawing A Triangle
		glVertex3f(-1.0f,-1.0f, 1.0f);					// Left Of Triangle (Front)
		glTexCoord3f(0.0f,0.0f,1.0f);					
		glVertex3f( 1.0f,-1.0f, 1.0f);					// Right Of Triangle (Front)
		glTexCoord3f(1.0f,0.0f,0.0f);					
		glVertex3f( 1.0f,-1.0f, -1.0f);					// Left Of Triangle (Back)
		glTexCoord3f(0.0f,0.0f,1.0f);					
		glVertex3f(-1.0f,-1.0f, -1.0f);					// Right Of Triangle (Back)
		glTexCoord3f(1.0f,0.0f,0.0f);					
	glEnd();											// Done Drawing The Pyramid
	endDraw();
}
// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLPrimitive.CPP
// 
// Description: Contains the drawing code for a gl primtive base object
// ----------------------------------------------------------------------------
#include "ACME.H"

GLPrimitive::GLPrimitive()
{
	mySkin = NULL; 
	return;
}

GLPrimitive::~GLPrimitive()
{
	if( mySkin != NULL ) 
		delete mySkin;

	return;
}

void GLPrimitive::beginDraw()
{
	myQuadratic = gluNewQuadric();
	gluQuadricNormals(myQuadratic, GLU_SMOOTH);
	gluQuadricTexture(myQuadratic, GL_TRUE);
	gluQuadricOrientation(myQuadratic, GLU_INSIDE);

	glTranslatef(myPosition.x,myPosition.y,myPosition.z);
	glRotatef(myRotation.x,1.0f,0.0f,0.0f);
	glRotatef(myRotation.y,0.0f,1.0f,0.0f);
	
	// TODO: Implement alternative coloring
	glColor3d( 1.0, 1.0, 1.0 ); 
	
	if( mySkin != NULL )
	{
		glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, mySkin->myTexture);
	}
}

void GLPrimitive::endDraw()
{
	glDisable(GL_TEXTURE_2D);
	gluDeleteQuadric( myQuadratic );
	return;
}


void GLPrimitive::setSkin(char skinFile[250] )
{
	mySkin = new GLSkin( skinFile );
	return;
}	

void GLPrimitive::setSkin(GLSkin *skin)
{
	mySkin = skin;
	return;
}	

void GLPrimitive::setPreferredBGSkin(GLSkin *skin)
{
	preferredBGSkin = skin;
	return;
}

GLSkin *GLPrimitive::getPreferredBGSkin()
{
	return preferredBGSkin; 
}

void GLPrimitive::setPosition( GLPosition3D pos )
{
	myPosition.x = pos.x;
	myPosition.y = pos.y;
	myPosition.z = pos.z;
	return;
} 

void GLPrimitive::setRotation( GLRotation3D rot )
{
	myRotation.x = rot.x;
	myRotation.y = rot.y;
	myRotation.z = rot.z;
	return;
}

void GLPrimitive::stopRotation()
{
	myRotation.x = 0.0;
	myRotation.y = 0.0;
	myRotation.z = 0.0;
	return;
}

// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLDisk.CPP
// 
// Description: Contains the drawing code for a disk
// ----------------------------------------------------------------------------
#include "ACME.H"

GLvoid GLDisk::Draw()
{
	GLUquadricObj *qObj = gluNewQuadric();
	gluQuadricNormals(qObj, GLU_SMOOTH);
	gluQuadricTexture(qObj, GL_TRUE);
	beginDraw();
	
	// Draw A Disc (CD Shape) With An Inner Radius Of 0.5, 
	// And An Outer Radius Of 2.  Plus A Lot Of Segments 😉
	gluDisk(qObj,0.2f,1.5f,32,32);

	endDraw();
	gluDeleteQuadric( qObj );
}

// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLCylinder.CPP
// 
// Description: Contains the drawing code for a basic cylinder
// ----------------------------------------------------------------------------
#include "ACME.H"

GLCylinder::GLCylinder(	GLfloat bottomRadius, GLfloat topRadius, GLfloat height )
{
	setDimensions( bottomRadius, topRadius, height );
	return;
;
}

GLvoid GLCylinder::Draw()
{
	beginDraw();
	gluCylinder( myQuadratic, myBottomRadius, myTopRadius, myHeight,RESOLUTION,RESOLUTION);
	endDraw();
	return;
}

GLvoid GLCylinder::setDimensions( GLfloat bottomRadius, GLfloat topRadius, GLfloat height )
{
	myBottomRadius = bottomRadius;
	myTopRadius = topRadius;
	myHeight = height;
	return;
}
// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLCube.CPP
// 
// Description: Contains the drawing code for a basic cube
//
// ----------------------------------------------------------------------------
#include "ACME.H"

GLvoid GLCube::Draw()
{
	beginDraw();
		glBegin(GL_QUADS);
			// Front Face
			glNormal3f( 0.0f, 0.0f, 1.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
			// Back Face
			glNormal3f( 0.0f, 0.0f,-1.0f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
			// Top Face
			glNormal3f( 0.0f, 1.0f, 0.0f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
			// Bottom Face
			glNormal3f( 0.0f,-1.0f, 0.0f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
			// Right Face
			glNormal3f( 1.0f, 0.0f, 0.0f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
			// Left Face
			glNormal3f(-1.0f, 0.0f, 0.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
		glEnd();
	endDraw();
}
// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLCone.CPP
// 
// Description: Contains the drawing code for a basic cone
// ----------------------------------------------------------------------------
#include "ACME.H"

GLvoid GLCone::Draw()
{
	beginDraw();
	{
		// Center The Cone
		glTranslatef(0.0f,0.0f,-1.5f);					
		gluCylinder(myQuadratic,1.0f,0.0f,3.0f,32,32);
	}
	endDraw();
}
// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLCircle.CPP
// 
// Description: Contains the drawing code for a basic circle
// ----------------------------------------------------------------------------
#include "ACME.H"

GLvoid GLCircle::Draw()
{
	beginDraw();
	{
		// Draw A Sphere With A Radius Of 1 And 32 Longitude And 32 Latitude Segments
		gluDisk(myQuadratic,0.0f,1.3f,32,32);
	}
	endDraw();
}
// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLText2D.CPP
// 
// Description: Contains the drawing code for drawing fonts
// ----------------------------------------------------------------------------
#include "ACME.H"

GLText2D::GLText2D()
{
	// Initialize to red color.
	myColor.r = 1.0F; myColor.g = 0.0F; myColor.b = 0.0F;

	BuildFont();
};

GLText2D::~GLText2D()
{
	KillFont();
};

GLvoid GLText2D::BuildFont(GLvoid)								// Build Our Bitmap Font
{
	HFONT	font;										// Windows Font ID
	HFONT	oldfont;									// Used For Good House Keeping

	base = glGenLists(96);								// Storage For 96 Characters

	font = CreateFont(	-24,							// Height Of Font
						0,								// Width Of Font
						0,								// Angle Of Escapement
						0,								// Orientation Angle
						FW_BOLD,						// Font Weight
						FALSE,							// Italic
						FALSE,							// Underline
						FALSE,							// Strikeout
						ANSI_CHARSET,					// Character Set Identifier
						OUT_TT_PRECIS,					// Output Precision
						CLIP_DEFAULT_PRECIS,			// Clipping Precision
						ANTIALIASED_QUALITY,			// Output Quality
						FF_DONTCARE|DEFAULT_PITCH,		// Family And Pitch
						"Courier New");					// Font Name

	oldfont = (HFONT)SelectObject(hDC, font);           // Selects The Font We Want
	wglUseFontBitmaps(hDC, 32, 96, base);				// Builds 96 Characters Starting At Character 32
	SelectObject(hDC, oldfont);							// Selects The Font We Want
	DeleteObject(font);									// Delete The Font
};

GLvoid GLText2D::KillFont(GLvoid)									// Delete The Font List
{
	glDeleteLists(base, 96);							// Delete All 96 Characters
};

GLvoid GLText2D::Write(GLfloat x, GLfloat y, const char *fmt, ...)					// Custom GL "Print" Routine
{
	va_list		ap;										// Pointer To List Of Arguments
	char		text[256];								// Holds Our String
	
	glColor3f(myColor.r,myColor.g, myColor.b);
	
	glTranslatef( 0,0, -5 );

	// Position The Text On The Screen
	glRasterPos2f( x, y );

	if (fmt == NULL)									// If There's No Text
		return;											// Do Nothing

	va_start(ap, fmt);									// Parses The String For Variables
	    vsprintf(text, fmt, ap);						// And Converts Symbols To Actual Numbers
	va_end(ap);											// Results Are Stored In Text

	glPushAttrib(GL_LIST_BIT);							// Pushes The Display List Bits
	glListBase(base - 32);								// Sets The Base Character to 32
	glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);	// Draws The Display List Text
	glPopAttrib();	
	return;
};

// Default will be red 
void GLText2D::setColor( GLfloat red, GLfloat blue, GLfloat green, GLfloat opacity )
{
	myColor.r = red;
	myColor.g = green;
	myColor.b = blue;
};

// ----------------------------------------------------------------------------
// Author:		Q
// FileName:	GLAtom.CPP
// 
// Description: Contains the drawing code for drawing an atom
// ----------------------------------------------------------------------------
#include "ACME.H"

GLvoid GLAtom::Draw()
{
	if( mySkin != NULL )
	{
		glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, mySkin->myTexture );
	}

	// Draw A Sphere With A Radius Of 1 And 32 Longitude And 32 Latitude Segments
	gluSphere(myQuadratic,0.6,32,32);

	endDraw();
}


 

Enter your email address to follow this blog and receive notifications of new posts by email.