diff --git a/VBA.vcproj b/VBA.vcproj index ef1ffa89..27f43c0a 100644 --- a/VBA.vcproj +++ b/VBA.vcproj @@ -1113,6 +1113,34 @@ RelativePath=".\src\win32\GDIDisplay.cpp" > + + + + + + + + + + + diff --git a/src/hq3x32.cpp b/src/hq3x32.cpp index 492225b1..bb2f0380 100644 --- a/src/hq3x32.cpp +++ b/src/hq3x32.cpp @@ -66,6 +66,7 @@ int InitLUTs(void) } int hq3xinited=0; +extern int realsystemRedShift, realsystemBlueShift; void hq3x32(unsigned char * pIn, unsigned int srcPitch, unsigned char *, @@ -80,6 +81,23 @@ void hq3x32(unsigned char * pIn, unsigned int srcPitch, hq3xinited=1; } hq3x_32( pIn, pOut, Xres, Yres, dstPitch, srcPitch - (Xres *2) ); + if (realsystemRedShift == 3) + { // damn you opengl... + int offset = (dstPitch - (Xres *12)) / 4; + unsigned int *p = (unsigned int *)pOut; + Yres *= 3; + while(Yres--) + { + for(int i=0;i> 16 | + (*p & 0x0000FF) << 16 | + (*p & 0x00FF00); + p++; + } + p += offset; + } + } } void hq3x16(unsigned char * pIn, unsigned int srcPitch, @@ -122,4 +140,21 @@ void hq4x32(unsigned char * pIn, unsigned int srcPitch, hq3xinited=1; } hq4x_32( pIn, pOut, Xres, Yres, dstPitch, srcPitch - (Xres *2)); + if (realsystemRedShift == 3) + { // damn you opengl... + int offset = (dstPitch - (Xres *16)) / 4; + unsigned int *p = (unsigned int *)pOut; + Yres *= 4; + while(Yres--) + { + for(int i=0;i> 16 | + (*p & 0x0000FF) << 16 | + (*p & 0x00FF00); + p++; + } + p += offset; + } + } } diff --git a/src/simpleFilter.cpp b/src/simpleFilter.cpp index 15e0e78c..7c8b68e2 100644 --- a/src/simpleFilter.cpp +++ b/src/simpleFilter.cpp @@ -1,110 +1,110 @@ -// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. -// Copyright (C) 1999-2003 Forgotten -// Copyright (C) 2005 Forgotten and the VBA development team - -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2, or(at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software Foundation, -// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -#include "System.h" - -void Simple2x16(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, - u8 *dstPtr, u32 dstPitch, int width, int height) -{ - u8 *nextLine, *finish; - - nextLine = dstPtr + dstPitch; - - do { - u32 *bP = (u32 *) srcPtr; - u32 *dP = (u32 *) dstPtr; - u32 *nL = (u32 *) nextLine; - u32 currentPixel; - - finish = (u8 *) bP + ((width+2) << 1); - currentPixel = *bP++; - - do { -#ifdef WORDS_BIGENDIAN - u32 color = currentPixel >> 16; -#else - u32 color = currentPixel & 0xffff; -#endif - - color = color | (color << 16); - - *(dP) = color; - *(nL) = color; - -#ifdef WORDS_BIGENDIAN - color = currentPixel & 0xffff; -#else - color = currentPixel >> 16; -#endif - color = color| (color << 16); - *(dP + 1) = color; - *(nL + 1) = color; - - currentPixel = *bP++; - - dP += 2; - nL += 2; - } while ((u8 *) bP < finish); - - srcPtr += srcPitch; - dstPtr += dstPitch << 1; - nextLine += dstPitch << 1; - } - while (--height); -} - -void Simple2x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, - u8 *dstPtr, u32 dstPitch, int width, int height) -{ - u8 *nextLine, *finish; - - nextLine = dstPtr + dstPitch; - - do { - u32 *bP = (u32 *) srcPtr; - u32 *dP = (u32 *) dstPtr; - u32 *nL = (u32 *) nextLine; - u32 currentPixel; - - finish = (u8 *) bP + ((width+1) << 2); - currentPixel = *bP++; - - do { - u32 color = currentPixel; - - *(dP) = color; - *(dP+1) = color; - *(nL) = color; - *(nL + 1) = color; - - currentPixel = *bP++; - - dP += 2; - nL += 2; - } while ((u8 *) bP < finish); - - srcPtr += srcPitch; - dstPtr += dstPitch << 1; - nextLine += dstPitch << 1; - } - while (--height); -} - +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "System.h" + +void Simple2x16(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, + u8 *dstPtr, u32 dstPitch, int width, int height) +{ + u8 *nextLine, *finish; + + nextLine = dstPtr + dstPitch; + + do { + u32 *bP = (u32 *) srcPtr; + u32 *dP = (u32 *) dstPtr; + u32 *nL = (u32 *) nextLine; + u32 currentPixel; + + finish = (u8 *) bP + ((width+2) << 1); + currentPixel = *bP++; + + do { +#ifdef WORDS_BIGENDIAN + u32 color = currentPixel >> 16; +#else + u32 color = currentPixel & 0xffff; +#endif + + color = color | (color << 16); + + *(dP) = color; + *(nL) = color; + +#ifdef WORDS_BIGENDIAN + color = currentPixel & 0xffff; +#else + color = currentPixel >> 16; +#endif + color = color| (color << 16); + *(dP + 1) = color; + *(nL + 1) = color; + + currentPixel = *bP++; + + dP += 2; + nL += 2; + } while ((u8 *) bP < finish); + + srcPtr += srcPitch; + dstPtr += dstPitch << 1; + nextLine += dstPitch << 1; + } + while (--height); +} + +void Simple2x32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, + u8 *dstPtr, u32 dstPitch, int width, int height) +{ + u8 *nextLine, *finish; + + nextLine = dstPtr + dstPitch; + + do { + u32 *bP = (u32 *) srcPtr; + u32 *dP = (u32 *) dstPtr; + u32 *nL = (u32 *) nextLine; + u32 currentPixel; + + finish = (u8 *) bP + ((width+1) << 2); + currentPixel = *bP++; + + do { + u32 color = currentPixel; + + *(dP) = color; + *(dP+1) = color; + *(nL) = color; + *(nL + 1) = color; + + currentPixel = *bP++; + + dP += 2; + nL += 2; + } while ((u8 *) bP < finish); + + srcPtr += srcPitch; + dstPtr += dstPitch << 1; + nextLine += dstPitch << 1; + } + while (--height); +} + void Simple3x16(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, int width, int height) diff --git a/src/win32/OpenGL.cpp b/src/win32/OpenGL.cpp index 70058095..33d8a65d 100644 --- a/src/win32/OpenGL.cpp +++ b/src/win32/OpenGL.cpp @@ -27,8 +27,10 @@ #include "../Text.h" #include "../Util.h" #include "../gb/gbGlobals.h" +#include "..\memgzio.h" #include +#include "glFont.h" // OpenGL #include // main include file @@ -57,7 +59,7 @@ extern bool detectMMX(); class OpenGLDisplay : public IDisplay { private: HDC hDC; - HGLRC hglrc; + HGLRC hRC; GLuint texture; int width; int height; @@ -65,18 +67,22 @@ private: u8 *filterData; RECT destRect; bool failed; + GLFONT font; void initializeMatrices( int w, int h ); bool initializeTexture( int w, int h ); void updateFiltering( int value ); void setVSync( int interval = 1 ); void calculateDestRect( int w, int h ); + void initializeFont(); public: OpenGLDisplay(); virtual ~OpenGLDisplay(); virtual DISPLAY_TYPE getType() { return OPENGL; }; + virtual void EnableOpenGL(); + virtual void DisableOpenGL(); virtual bool initialize(); virtual void cleanup(); virtual void render(); @@ -88,17 +94,51 @@ public: virtual int selectFullScreenMode( GUID ** ); }; +#include "gzglfont.h" + +void OpenGLDisplay::initializeFont() +{ + int ret; + z_stream strm; + char *buf = (char *)malloc(GZGLFONT_SIZE); + + /* allocate inflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, 16+MAX_WBITS); + if (ret != Z_OK) + return; + + strm.avail_in = sizeof(gzglfont); + strm.next_in = gzglfont; + strm.avail_out = GZGLFONT_SIZE; + strm.next_out = (Bytef *)buf; + ret = inflate(&strm, Z_NO_FLUSH); + if (ret==Z_STREAM_END) + { + glGenTextures( 1, &texture ); + glFontCreate(&font, (char *)buf, texture); + texture=0; + } + free(buf); + (void)inflateEnd(&strm); +} + + OpenGLDisplay::OpenGLDisplay() { hDC = NULL; - hglrc = NULL; + hRC = NULL; texture = 0; width = 0; height = 0; size = 0.0f; - filterData = (u8 *)malloc(4*4*256*240); failed = false; + filterData = NULL; } @@ -108,29 +148,49 @@ OpenGLDisplay::~OpenGLDisplay() } +void OpenGLDisplay::EnableOpenGL() +{ + PIXELFORMATDESCRIPTOR pfd; + int format; + + // get the device context (DC) + hDC = GetDC( theApp.m_pMainWnd->GetSafeHwnd() ); + + // set the pixel format for the DC + ZeroMemory( &pfd, sizeof( pfd ) ); + pfd.nSize = sizeof( pfd ); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 24; + pfd.cDepthBits = 16; + pfd.iLayerType = PFD_MAIN_PLANE; + format = ChoosePixelFormat( hDC, &pfd ); + SetPixelFormat( hDC, format, &pfd ); + + // create and enable the render context (RC) + hRC = wglCreateContext( hDC ); + wglMakeCurrent( hDC, hRC ); +} + +void OpenGLDisplay::DisableOpenGL() +{ + wglMakeCurrent( NULL, NULL ); + wglDeleteContext( hRC ); + ReleaseDC( theApp.m_pMainWnd->GetSafeHwnd(), hDC ); +} + void OpenGLDisplay::cleanup() { if(texture != 0) { glDeleteTextures(1, &texture); texture = 0; } - - if(hglrc != NULL) { - wglDeleteContext(hglrc); - wglMakeCurrent(NULL, NULL); - hglrc = NULL; - } - - if(hDC != NULL) { - ReleaseDC(*theApp.m_pMainWnd, hDC); - hDC = NULL; - } - + DisableOpenGL(); if(filterData) { free(filterData); filterData = NULL; } - width = 0; height = 0; size = 0.0f; @@ -209,7 +269,7 @@ bool OpenGLDisplay::initialize() theApp.dest.right = theApp.surfaceSizeX; theApp.dest.bottom = theApp.surfaceSizeY; - DWORD style = WS_POPUP | WS_VISIBLE; + DWORD style = WS_POPUPWINDOW | WS_VISIBLE; DWORD styleEx = 0; if( theApp.videoOption <= VIDEO_4X ) @@ -253,77 +313,22 @@ bool OpenGLDisplay::initialize() } theApp.updateMenuBar(); - theApp.adjustDestRect(); - theApp.mode320Available = FALSE; theApp.mode640Available = FALSE; theApp.mode800Available = FALSE; + theApp.mode1024Available = FALSE; + theApp.mode1280Available = FALSE; - CDC *dc = pWnd->GetDC(); - HDC hDC = dc->GetSafeHdc(); - - PIXELFORMATDESCRIPTOR pfd = { - sizeof(PIXELFORMATDESCRIPTOR), - 1, // version number - PFD_DRAW_TO_WINDOW | // support window - PFD_SUPPORT_OPENGL | // support OpenGL - PFD_DOUBLEBUFFER, // double buffered - PFD_TYPE_RGBA, // RGBA type - 24, // 24-bit color depth - 0, 0, 0, 0, 0, 0, // color bits ignored - 0, // no alpha buffer - 0, // shift bit ignored - 0, // no accumulation buffer - 0, 0, 0, 0, // accum bits ignored - 32, // 32-bit z-buffer - 0, // no stencil buffer - 0, // no auxiliary buffer - PFD_MAIN_PLANE, // main layer - 0, // reserved - 0, 0, 0 // layer masks ignored - }; - - int iPixelFormat; - if( !(iPixelFormat = ChoosePixelFormat( hDC, &pfd )) ) { - winlog( "Failed ChoosePixelFormat\n" ); - return false; - } - - // obtain detailed information about - // the device context's first pixel format - if( !( DescribePixelFormat( - hDC, - iPixelFormat, - sizeof(PIXELFORMATDESCRIPTOR), - &pfd ) ) ) - { - winlog( "Failed DescribePixelFormat\n" ); - return false; - } - - if( !SetPixelFormat( hDC, iPixelFormat, &pfd ) ) { - winlog( "Failed SetPixelFormat\n" ); - return false; - } - - if( !( hglrc = wglCreateContext( hDC ) ) ) { - winlog( "Failed wglCreateContext\n" ); - return false; - } - - if( !wglMakeCurrent(hDC, hglrc) ) { - winlog( "Failed wglMakeCurrent\n" ); - return false; - } - - pWnd->ReleaseDC( dc ); - - // setup 2D gl environment + EnableOpenGL(); + initializeFont(); glPushAttrib( GL_ENABLE_BIT ); glDisable( GL_DEPTH_TEST ); glDisable( GL_CULL_FACE ); glEnable( GL_TEXTURE_2D ); + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + initializeMatrices( theApp.surfaceSizeX, theApp.surfaceSizeY ); @@ -359,6 +364,7 @@ bool OpenGLDisplay::initialize() void OpenGLDisplay::clear() { + glClearColor(0.0,0.0,0.0,1.0); glClear( GL_COLOR_BUFFER_BIT ); } @@ -375,7 +381,8 @@ void OpenGLDisplay::render() { clear(); - int pitch = theApp.filterWidth * 4 + 4; + + int pitch = theApp.filterWidth * (systemColorDepth>>3) + 4; u8 *data = pix + ( theApp.sizeX + 1 ) * 4; // apply pixel filter @@ -386,46 +393,46 @@ void OpenGLDisplay::render() pitch, (u8*)theApp.delta, (u8*)filterData, - theApp.filterWidth * 4 * 2, + width * 4 , theApp.filterWidth, theApp.filterHeight); } // Texturemap complete texture to surface // so we have free scaling and antialiasing - int mult; + if( theApp.filterFunction ) { - glPixelStorei( GL_UNPACK_ROW_LENGTH, theApp.sizeX << 1 ); - mult = 2; + glPixelStorei( GL_UNPACK_ROW_LENGTH, width); } else { glPixelStorei( GL_UNPACK_ROW_LENGTH, theApp.sizeX + 1 ); - mult = 1; } - - glTexSubImage2D( + + glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, - mult * theApp.sizeX, - mult * theApp.sizeY, + width, + height, GL_RGBA, GL_UNSIGNED_BYTE, data ); + + if( theApp.glType == 0 ) { glBegin( GL_TRIANGLE_STRIP ); glTexCoord2f( 0.0f, 0.0f ); glVertex3i( 0, 0, 0 ); - glTexCoord2f( (float)(mult * theApp.sizeX) / size, 0.0f ); + glTexCoord2f( (float)(width) / size, 0.0f ); glVertex3i( theApp.surfaceSizeX, 0, 0 ); - glTexCoord2f( 0.0f, (float)(mult * theApp.sizeY) / size ); + glTexCoord2f( 0.0f, (float)(height) / size ); glVertex3i( 0, theApp.surfaceSizeY, 0 ); - glTexCoord2f( (float)(mult * theApp.sizeX) / size, (float)(mult * theApp.sizeY) / size ); + glTexCoord2f( (float)(width) / size, (float)(height) / size ); glVertex3i( theApp.surfaceSizeX, theApp.surfaceSizeY, 0 ); glEnd(); @@ -435,46 +442,62 @@ void OpenGLDisplay::render() glTexCoord2f( 0.0f, 0.0f ); glVertex3i( 0, 0, 0 ); - glTexCoord2f( (float)(mult * theApp.sizeX) / size, 0.0f ); + glTexCoord2f( (float)(width) / size, 0.0f ); glVertex3i( theApp.surfaceSizeX, 0, 0 ); - glTexCoord2f( (float)(mult * theApp.sizeX) / size, (float)(mult * theApp.sizeY) / size ); + glTexCoord2f( (float)(width) / size, (float)(height) / size ); glVertex3i( theApp.surfaceSizeX, theApp.surfaceSizeY, 0 ); - glTexCoord2f( 0.0f, (float)(mult * theApp.sizeY) / size ); + glTexCoord2f( 0.0f, (float)(height) / size ); glVertex3i( 0, theApp.surfaceSizeY, 0 ); glEnd(); + } - - CDC *dc = theApp.m_pMainWnd->GetDC(); - - SwapBuffers( dc->GetSafeHdc() ); - // since OpenGL draws on the back buffer, - // we have to swap it to the front buffer to see it - // draw informations with GDI on the front buffer - dc->SetBkMode( theApp.showSpeedTransparent ? TRANSPARENT : OPAQUE ); - if( theApp.showSpeed && ( theApp.videoOption > VIDEO_4X ) ) { + if( theApp.showSpeed ) { // && ( theApp.videoOption > VIDEO_4X ) ) { char buffer[30]; if( theApp.showSpeed == 1 ) { sprintf( buffer, "%3d%%", systemSpeed ); } else { sprintf( buffer, "%3d%%(%d, %d fps)", systemSpeed, systemFrameSkip, theApp.showRenderedFrames ); } - dc->SetTextColor( RGB(0x00, 0x00, 0xFF) ); - dc->TextOut( 10, 20, buffer ); + glFontBegin(&font); + glPushMatrix(); + float fontscale = (float)theApp.surfaceSizeX / 100.0; + glScalef(fontscale, fontscale, fontscale); + glColor4f(1.0f, 0.25f, 0.25f, 1.0f); + glFontTextOut(buffer, (theApp.surfaceSizeX-(strlen(buffer)*11))/(fontscale*2), (theApp.surfaceSizeY-20)/fontscale, 0); + glPopMatrix(); + glFontEnd(); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glBindTexture( GL_TEXTURE_2D, texture ); } if( theApp.screenMessage ) { if( ( ( GetTickCount() - theApp.screenMessageTime ) < 3000 ) && !theApp.disableStatusMessage ) { - dc->SetTextColor( RGB(0xFF, 0x00, 0x00) ); - dc->TextOut( 10, theApp.surfaceSizeY - 20, theApp.screenMessageBuffer ); + glFontBegin(&font); + glPushMatrix(); + + float fontscale = (float)theApp.surfaceSizeX / 100.0; + glScalef(fontscale, fontscale, fontscale); + glColor4f(1.0f, 0.25f, 0.25f, 1.0f); + glFontTextOut((char *)((const char *)theApp.screenMessageBuffer), (theApp.surfaceSizeX-(theApp.screenMessageBuffer.GetLength()*11))/(fontscale*2), (theApp.surfaceSizeY-40)/fontscale, 0); + glPopMatrix(); + glFontEnd(); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glBindTexture( GL_TEXTURE_2D, texture ); } else { theApp.screenMessage = false; } } - theApp.m_pMainWnd->ReleaseDC( dc ); + + glFlush(); + SwapBuffers( hDC ); + // since OpenGL draws on the back buffer, + // we have to swap it to the front buffer to see it + + // draw informations with GDI on the front buffer } @@ -602,6 +625,10 @@ bool OpenGLDisplay::changeRenderSize( int w, int h ) failed = true; return false; } + if (filterData) + free(filterData); + filterData = (u8 *)malloc(4*w*h); + } return true; diff --git a/src/win32/VBA.cpp b/src/win32/VBA.cpp index 82d852e3..372fdb35 100644 --- a/src/win32/VBA.cpp +++ b/src/win32/VBA.cpp @@ -145,6 +145,10 @@ int systemRedShift = 0; int systemBlueShift = 0; int systemGreenShift = 0; int systemColorDepth = 16; +int realsystemRedShift = 0; +int realsystemBlueShift = 0; +int realsystemGreenShift = 0; +int realsystemColorDepth = 16; int systemVerbose = 0; int systemDebug = 0; int systemSaveUpdateCounter = SYSTEM_SAVE_NOT_UPDATED; @@ -675,10 +679,10 @@ void VBA::updateFilter() if ( b16to32Video ) { b16to32Video = false; - systemColorDepth = 32; - systemRedShift = 19; - systemGreenShift = 11; - systemBlueShift = 3; + systemColorDepth = realsystemColorDepth; + systemRedShift = realsystemRedShift; + systemGreenShift = realsystemGreenShift; + systemBlueShift = realsystemBlueShift; utilUpdateSystemColorMaps(); } // END hacky ugly code @@ -859,11 +863,15 @@ void VBA::updateFilter() if( display ) display->changeRenderSize(rect.right, rect.bottom); - if (b16to32Video) - { + if (b16to32Video && systemColorDepth!=16) + { + realsystemColorDepth = systemColorDepth; systemColorDepth = 16; + realsystemRedShift = systemRedShift; systemRedShift = 11; + realsystemGreenShift = systemGreenShift; systemGreenShift = 6; + realsystemBlueShift = systemBlueShift; systemBlueShift = 0; utilUpdateSystemColorMaps(); } diff --git a/src/win32/glfont.c b/src/win32/glfont.c new file mode 100644 index 00000000..3220ec41 --- /dev/null +++ b/src/win32/glfont.c @@ -0,0 +1,154 @@ +//********************************************************* +//GLFONT.CPP -- glFont routines +//Copyright (c) 1998 Brad Fish +//See glFont.txt for terms of use +//November 10, 1998 +//********************************************************* + +#include +#include +#include +#include +#include +#include "glfont.h" + +//********************************************************* +//Variables +//********************************************************* + +//Current font +GLFONT *glFont; + +//********************************************************* +//Functions +//********************************************************* +int glFontCreate (GLFONT *Font, char *Buffer, int Tex) +{ + char *TexBytes; + int Num; + + //Read glFont structure + memcpy(Font, Buffer, sizeof(GLFONT)); + Buffer+=sizeof(GLFONT); + + //Save texture number + Font->Tex = Tex; + + //Get number of characters + Num = Font->IntEnd - Font->IntStart + 1; + + //Allocate memory for characters + if ((Font->Char = (GLFONTCHAR *)malloc( + sizeof(GLFONTCHAR) * Num)) == NULL) + return FALSE; + + //Read glFont characters + memcpy(Font->Char, Buffer, sizeof(GLFONTCHAR)*Num); + Buffer+=sizeof(GLFONTCHAR)*Num; + + //Get texture size + Num = Font->TexWidth * Font->TexHeight * 2; + + //Allocate memory for texture data + if ((TexBytes = (char *)malloc(Num)) == NULL) + return FALSE; + + //Read texture data + memcpy(TexBytes, Buffer, sizeof(char)*Num); + Buffer+=sizeof(char)*Num; + + //Set texture attributes + glBindTexture(GL_TEXTURE_2D, Font->Tex); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, + GL_CLAMP); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, + GL_CLAMP); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, + GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_LINEAR); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, + GL_MODULATE); + + //Create texture + glTexImage2D(GL_TEXTURE_2D, 0, 2, Font->TexWidth, + Font->TexHeight, 0, GL_LUMINANCE_ALPHA, + GL_UNSIGNED_BYTE, (void *)TexBytes); + + //Clean up + free(TexBytes); + + //Return pointer to new font + return TRUE; +} +//********************************************************* +void glFontDestroy (GLFONT *Font) +{ + //Free character memory + free(Font->Char); +} +//********************************************************* +void glFontBegin (GLFONT *Font) +{ + //Save pointer to font structure + if (Font->Char != NULL) + glFont = Font; + else + glFont = NULL; + + //Bind to font texture + glBindTexture(GL_TEXTURE_2D, Font->Tex); +} +//********************************************************* +void glFontEnd (void) +{ + //Font no longer current + glFont = NULL; +} +//********************************************************* +void glFontTextOut (char *String, float x, float y, + float z) +{ + int Length, i; + GLFONTCHAR *Char; + + //Return if we don't have a valid glFont + if (glFont == NULL) + return; + + //Get length of string + Length = strlen(String); + + //Begin rendering quads + glBegin(GL_QUADS); + + //Loop through characters + for (i = 0; i < Length; i++) + { + //Get pointer to glFont character + Char = &glFont->Char[(int)String[i] - + glFont->IntStart]; + + //Specify vertices and texture coordinates + glTexCoord2f(Char->tx1, Char->ty1); + glVertex3f(x, y - Char->dy, z); + glTexCoord2f(Char->tx1, Char->ty2); + glVertex3f(x, y, z); + glTexCoord2f(Char->tx2, Char->ty2); + glVertex3f(x + Char->dx, y, z); + glTexCoord2f(Char->tx2, Char->ty1); + glVertex3f(x + Char->dx, y - Char->dy, z); + + //Move to next character + x += Char->dx; + } + + //Stop rendering quads + glEnd(); +} +//********************************************************* + +//End of file + + + diff --git a/src/win32/glfont.h b/src/win32/glfont.h new file mode 100644 index 00000000..21df1f30 --- /dev/null +++ b/src/win32/glfont.h @@ -0,0 +1,63 @@ +//********************************************************* +//GLFONT.H -- Header for GLFONT.CPP +//Copyright (c) 1998 Brad Fish +//See glFont.txt for terms of use +//November 10, 1998 +//********************************************************* + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +//********************************************************* +//Structures +//********************************************************* + +//glFont character structure +typedef struct +{ + float dx, dy; + float tx1, ty1; + float tx2, ty2; +} GLFONTCHAR; + +//glFont structure +typedef struct +{ + int Tex; + int TexWidth, TexHeight; + int IntStart, IntEnd; + GLFONTCHAR *Char; +} GLFONT; + +//********************************************************* +//Function Declarations +//********************************************************* +#ifdef __cplusplus +extern "C" { +#endif +//Creates a glFont +int glFontCreate(GLFONT *Font, char *Buffer, int Tex); + +//Deletes a glFont +void glFontDestroy (GLFONT *Font); + +//Needs to be called before text output +void glFontBegin (GLFONT *Font); + +//Needs to be called after text output +void glFontEnd (void); + +//Draws text with a glFont +void glFontTextOut (char *String, float x, float y, + float z); +//********************************************************* +#ifdef __cplusplus +} +#endif +//End of file + diff --git a/src/win32/gzglfont.h b/src/win32/gzglfont.h new file mode 100644 index 00000000..618065f6 --- /dev/null +++ b/src/win32/gzglfont.h @@ -0,0 +1,257 @@ +#define GZGLFONT_SIZE 35096 + + +unsigned char gzglfont[]= + { + '\x1F', '\x8B', '\x08', '\x08', '\x72', '\x0F', '\x39', '\x47', + '\x00', '\x0B', '\x76', '\x65', '\x72', '\x64', '\x61', '\x6E', + '\x61', '\x00', '\xED', '\x97', '\xBF', '\x6B', '\x5C', '\x47', + '\x10', '\xC7', '\x2F', '\x21', '\x04', '\x27', '\x90', '\x20', + '\x82', '\x08', '\x21', '\x08', '\x21', '\x82', '\x62', '\x5C', + '\x19', '\x21', '\x8C', '\xAB', '\xDC', '\x7B', '\x42', '\x11', + '\x21', '\x0E', '\xC6', '\x1C', '\xAA', '\x0E', '\x05', '\x82', + '\x30', '\x42', '\xA8', '\x88', '\x85', '\x50', '\x11', '\x4C', + '\x9A', '\xB8', '\x70', '\x91', '\xC2', '\x85', '\x50', '\x95', + '\xC2', '\x85', '\x0A', '\x15', '\x29', '\x55', '\x08', '\xBB', + '\x49', '\xE1', '\x22', '\x4D', '\x7A', '\x17', '\x02', '\xBB', + '\x50', '\xE1', '\x22', '\x85', '\x0A', '\xFD', '\x01', '\x81', + '\xCB', '\xED', '\x7B', '\x73', '\x7E', '\xBB', '\xB3', '\x33', + '\xB3', '\xF3', '\x7E', '\xDC', '\xE9', '\x7C', '\xB7', '\x03', + '\xB2', '\xDF', '\x7D', '\x6E', '\xDE', '\xCE', '\x7C', '\x67', + '\x67', '\x7F', '\x5C', '\xAB', '\xD5', '\x6A', '\x3D', '\x82', + '\xBF', '\x85', '\xFE', '\xDF', '\x6F', '\xFD', '\xBF', '\x87', + '\x9F', '\x7C', '\xFB', '\xDE', '\xD7', '\x77', '\x3E', '\x4B', + '\xFB', '\x8F', '\x2B', '\xAD', '\xC2', '\xDA', '\xAD', '\xD6', + '\x79', '\x7B', '\xF7', '\xD5', '\x6D', '\xE0', '\x0B', '\xED', + '\x1C', '\x1F', '\x65', '\xBC', '\x3F', '\x02', '\xF0', '\x13', + '\xE0', '\x33', '\x49', '\xEE', '\xFF', '\x0C', '\xF8', '\x17', + '\x49', '\xCE', '\x77', '\x32', '\x7E', '\xE7', '\xF0', '\x18', + '\xF8', '\x1E', '\xF0', '\xA7', '\x19', '\x3F', '\x5C', '\xFC', + '\x68', '\xA5', '\xD7', '\xEB', '\xF5', '\xBF', '\x3B', '\x02', + '\xFE', '\x1A', '\x8D', '\x73', '\x0E', '\xFC', '\x83', '\xD4', + '\xF0', '\x22', '\xCF', '\x0F', '\xD3', '\x9C', '\x7F', '\x9A', + '\xBA', '\xF9', '\xCC', '\x00', '\x9F', '\x47', '\x7C', '\x01', + '\xF8', '\xCD', '\xD4', '\xCD', '\x67', '\x09', '\xF8', '\x6A', + '\xEA', '\xC6', '\x5D', '\x03', '\xDE', '\x45', '\x71', '\x37', + '\x80', '\xDF', '\xCF', '\xF8', '\xF3', '\x07', '\x3F', '\x02', + '\xDF', '\x02', '\xBE', '\x87', '\xFC', '\xF7', '\x81', '\xFF', + '\x0A', '\xFC', '\xD0', '\xAA', '\xF3', '\xA5', '\xC9', '\xAF', + '\x6D', '\x6A', '\x54', '\xE4', '\x73', '\xD0', '\xCE', '\xB9', + '\xA9', '\xA7', '\xCD', '\x4D', '\x3D', '\x0D', '\xDF', '\x44', + '\x7C', '\x07', '\xF8', '\x1F', '\x88', '\x3F', '\x05', '\xFE', + '\x02', '\xF1', '\xBF', '\x81', '\xFF', '\x8B', '\xF8', '\x05', + '\xF0', '\x6B', '\xA9', '\xCB', '\x3F', '\x4E', '\x73', '\x3E', + '\x87', '\xF8', '\x3C', '\xF0', '\x25', '\xC4', '\x97', '\x81', + '\xAF', '\x21', '\xFE', '\x1D', '\xF0', '\x6E', '\xC6', '\x8B', + '\xBE', '\xDA', '\x00', '\xBE', '\x85', '\xF8', '\x36', '\xF0', + '\x3D', '\xE0', '\xCF', '\xAC', '\xBA', '\x99', '\x1E', '\x32', + '\x7D', '\x78', '\x62', '\x71', '\xD3', '\x87', '\x86', '\xDF', + '\x48', '\x5C', '\xBE', '\x94', '\xE4', '\xFC', '\x51', '\xC6', + '\x8B', '\x7E', '\x78', '\x0C', '\xFC', '\x28', '\xE3', '\xCF', + '\x1F', '\xBC', '\x02', '\x7E', '\x0C', '\xFC', '\x65', '\xC6', + '\x8B', '\xFC', '\xCF', '\x80', '\xFF', '\x87', '\x78', '\x2B', + '\xCD', '\xB9', '\x99', '\x6F', '\x9B', '\xCF', '\x02', '\xBF', + '\x9E', '\xBA', '\xF9', '\xDC', '\x00', '\xFE', '\x4D', '\xC6', + '\x8B', '\x7E', '\x48', '\x80', '\xDF', '\x43', '\xBC', '\x03', + '\x7C', '\x13', '\x8D', '\x73', '\x1F', '\xF8', '\x2F', '\x88', + '\x1B', '\x3B', '\x85', '\xFA', '\x5C', '\x24', '\x45', '\x7F', + '\x9A', '\xFA', '\x18', '\x7E', '\x2D', '\xC9', '\xE7', '\xFA', + '\xED', '\x7A', '\x49', '\x72', '\xFE', '\x7D', '\xC6', '\x8B', + '\xFC', '\x3B', '\xC0', '\x9F', '\x64', '\xBC', '\xC8', '\xE7', + '\x00', '\xF8', '\x49', '\xC6', '\x0F', '\x17', '\xFF', '\x01', + '\x7E', '\x0A', '\xFC', '\x3C', '\xE3', '\x45', '\x3E', '\x6F', + '\x80', '\x9B', '\xF5', '\x6A', '\xFB', '\x9B', '\x3E', '\x33', + '\x7C', '\x3E', '\x75', '\xE3', '\x2E', '\x00', '\x5F', '\x46', + '\xFE', '\xB7', '\x80', '\xFF', '\x80', '\xFC', '\xEF', '\x02', + '\xFF', '\x09', '\xF1', '\x4D', '\xE0', '\xFB', '\xA9', '\x9B', + '\x7F', '\xB6', '\xEE', '\x92', '\x7C', '\xDD', '\xCD', '\xA6', + '\x45', '\x9E', '\xD9', '\xBA', '\x4B', '\xF2', '\x75', '\x36', + '\x9B', '\x5A', '\xF9', '\x24', '\x39', '\xDF', '\x49', '\xF2', + '\x39', '\xCD', '\xC6', '\x58', '\xC9', '\x6B', '\x7F', '\x09', + '\x75', '\xB0', '\xFD', '\x4F', '\x81', '\x9F', '\x25', '\xEE', + '\xF8', '\xAF', '\x81', '\xBF', '\x9F', '\x1A', '\x5E', '\xE4', + '\x63', '\xF6', '\xB5', '\x4B', '\x18', '\x7B', '\x36', '\x2D', + '\xE6', '\xEB', '\x73', '\xE0', '\x5F', '\x21', '\xFF', '\x45', + '\xE0', '\xB7', '\x90', '\xFF', '\x6D', '\xE0', '\xAB', '\xA9', + '\x1B', '\x77', '\x0D', '\x78', '\x37', '\x75', '\xF3', '\xDC', + '\x00', '\xFE', '\x33', '\xE2', '\xC6', '\x4C', '\x6C', '\x53', + '\x8F', '\x65', '\x2B', '\xAE', '\xE9', '\x27', '\xC3', '\x67', + '\x12', '\x97', '\x9B', '\x7A', '\x19', '\xDE', '\x85', '\x39', + '\x1B', '\xF4', '\xD5', '\x26', '\xF0', '\x27', '\xC8', '\xFF', + '\x00', '\xF8', '\x09', '\xE2', '\xA7', '\xC0', '\x5F', '\x66', + '\xBC', '\xD8', '\x07', '\xCE', '\x80', '\x5F', '\x20', '\xFF', + '\x4B', '\xE0', '\xA6', '\x8F', '\x6C', '\x6E', '\xF6', '\x2B', + '\xC3', '\xBF', '\x04', '\x3E', '\xD8', '\x87', '\xE7', '\x80', + '\x2F', '\xA6', '\xEE', '\xF8', '\xD7', '\x81', '\x2F', '\xA1', + '\x71', '\x96', '\x81', '\xAF', '\xA2', '\x71', '\xD6', '\x80', + '\xDF', '\xCD', '\x78', '\xB1', '\x6F', '\xDC', '\x03', '\xBE', + '\x8D', '\xC6', '\xD9', '\x01', '\xFE', '\x10', '\x71', '\x63', + '\x66', '\x0E', '\x4D', '\x1F', '\x76', '\xEC', '\xFA', '\xB4', + '\x73', '\x6E', '\xD6', '\xA9', '\xCD', '\x67', '\x60', '\xCE', + '\x3B', '\x19', '\x2F', '\xE6', '\xBD', '\x0B', '\xFC', '\x71', + '\x92', '\xEF', '\x15', '\x83', '\xFA', '\xFF', '\x0E', '\xFC', + '\x38', '\xE3', '\x85', '\xDE', '\x3F', '\x81', '\xFF', '\x85', + '\xC6', '\x7F', '\x01', '\xFC', '\x1C', '\xF1', '\x37', '\xC0', + '\x4D', '\xDF', '\x76', '\x2C', '\xBD', '\xA6', '\x6F', '\x0D', + '\x9F', '\x4B', '\x5D', '\xFF', '\x79', '\xE0', '\x37', '\x11', + '\x5F', '\x02', '\xBE', '\x92', '\xBA', '\x79', '\xAE', '\x02', + '\xEF', '\x64', '\x7F', '\x45', '\x1F', '\xAE', '\x03', '\xDF', + '\x4A', '\x5D', '\xBD', '\xDB', '\xC0', '\xF7', '\x91', '\xBF', + '\xB1', '\x75', '\xE8', '\xDB', '\x5D', '\xAB', '\xFF', '\x4D', + '\xDF', '\x1A', '\x6E', '\xD6', '\xF1', '\xAE', '\x95', '\xBF', + '\x39', '\x27', '\xD6', '\xA1', '\x6E', '\xBB', '\x69', '\x2B', + '\x5A', '\x34', '\xC2', '\xFA', '\x77', '\xD3', '\xDE', '\xE0', + '\xDF', '\xB0', '\x6F', '\x53', '\xF1', '\x34', '\x9F', '\x9A', + '\x8B', '\x29', '\xE5', '\x40', '\xEB', '\xCF', '\x3F', '\xE1', + '\xD8', '\xFE', '\x67', '\x77', '\x24', '\x2A', '\x0E', '\xF5', + '\x0E', '\xF5', '\x4C', '\x91', '\x3C', '\xB3', '\xE6', '\x6B', + '\x50', '\x45', '\x7F', '\xEF', '\xAD', '\x71', '\x6F', '\xD2', + '\x5A', '\xFC', '\x91', '\xF5', '\xFA', '\xE9', '\x0A', '\xD6', + '\xAF', '\x87', '\xDC', '\xED', '\x3D', '\xC7', '\xEC', '\x37', + '\xDC', '\xAA', '\xB8', '\xFA', '\xE8', '\xD9', '\x97', '\x62', + '\xD1', '\xDF', '\xF8', '\x2B', '\x62', '\xDC', '\xF4', '\xBB', + '\xA3', '\xD8', '\xFA', '\xE5', '\xFE', '\xD0', '\x65', '\x81', + '\x57', '\x14', '\xD5', '\xFF', '\xC3', '\xD5', '\x2F', '\x77', + '\x3F', '\xAD', '\xCF', '\x7E', '\x72', '\x3D', '\x06', '\x63', + '\x71', '\xFD', '\x11', '\xA2', '\xD4', '\x7A', '\xC0', '\x99', + '\xF8', '\xDF', '\x4B', '\xEA', '\x64', '\xFD', '\x5C', '\x04', + '\xAE', '\x02', '\xF6', '\xBA', '\xC0', '\xFB', '\x81', '\x5B', + '\x1F', '\x5D', '\x16', '\xE1', '\xEC', '\x87', '\x73', '\x26', + '\xD8', '\xF1', '\xB9', '\x0A', '\x73', '\xFD', '\x2C', '\xE9', + '\xE7', '\x15', '\x5D', '\x9D', '\x7E', '\x39', '\x06', '\xB5', + '\x9F', '\xB9', '\x6B', '\x9C', '\xCE', '\x86', '\xD3', '\x5F', + '\x4E', '\x69', '\x15', '\xFD', '\xE5', '\x2A', '\x5C', '\x45', + '\x3F', '\x75', '\xFE', '\xF9', '\xD9', '\x70', '\x6B', '\x46', + '\xAF', '\x55', '\xA3', '\x5E', '\x33', '\x4E', '\x9D', '\xD1', + '\xA4', '\x38', '\x4D', '\x8E', '\x36', '\x7C', '\xFD', '\x4D', + '\x5B', '\xF3', '\x51', '\xFC', '\x7E', '\xA9', '\x36', '\x4A', + '\x53', '\xF9', '\x44', '\x8B', '\x36', '\xE9', '\x36', '\xAA', + '\xDD', '\x62', '\x5C', '\xCD', '\xBF', '\xC1', '\x85', '\xF7', + '\x61', '\xCA', '\x4F', '\x3A', '\x11', '\x43', '\x37', '\x47', + '\xFF', '\xA6', '\xDA', '\xEB', '\x51', '\x7E', '\xE5', '\xE2', + '\x6A', '\x0C', '\x8F', '\x4E', '\x53', '\x6E', '\x5F', '\x96', + '\x9F', '\xEC', '\xF7', '\xE9', '\x88', '\x12', '\x2B', '\x1B', + '\xAD', '\xFE', '\x59', '\x29', '\x6B', '\x08', '\xBD', '\x4D', + '\x33', '\xFF', '\xB6', '\x13', '\xEE', '\xAE', '\x32', '\xF9', + '\x85', '\x2A', '\x11', '\xAA', '\xCA', '\xD5', '\xE8', '\xE7', + '\x7B', '\xBD', '\x6C', '\x7E', '\xF5', '\xF4', '\x87', '\xFB', + '\x5A', '\x1A', '\x85', '\xEE', '\x74', '\xAC', '\x3E', '\xFC', + '\xB6', '\x3E', '\x2E', '\x5D', '\x3B', '\x29', '\x47', '\xD9', + '\xEA', '\xE8', '\x0F', '\xF7', '\x84', '\xF6', '\xF7', '\x8E', + '\x36', '\x2E', '\x3F', '\xC3', '\x5C', '\xF7', '\xC8', '\xC6', + '\x47', '\x0B', '\xEB', '\xE7', '\xA3', '\xB9', '\xA3', '\x68', + '\x3A', '\x9B', '\x8B', '\xAB', '\xCF', '\x4F', '\xCE', '\x88', + '\xB3', '\xEA', '\xFA', '\xA5', '\x7A', '\xC8', '\xB5', '\x92', + '\x55', '\x57', '\xD7', '\x4F', '\xC7', '\xD0', '\xEF', '\xAD', + '\x05', '\xC1', '\xB3', '\xE5', '\xCF', '\x21', '\x3D', '\xAF', + '\x9A', '\x99', '\x0E', '\xC7', '\x90', '\xB2', '\x93', '\xDF', + '\xA5', '\xDF', '\xE4', '\xF5', '\x97', '\xEF', '\x97', '\x77', + '\xD1', '\xA2', '\xFE', '\xAB', '\xCE', '\x20', '\x5A', '\xB4', + '\x68', '\x93', '\x69', '\xD4', '\x79', '\x27', '\x9D', '\x82', + '\xA1', '\x33', '\x8F', '\x7A', '\x9F', '\x3A', '\x6B', '\x43', + '\xA7', '\x72', '\x38', '\x0A', '\x8E', '\x19', '\xD2', '\xC9', + '\x53', '\xEE', '\xB4', '\xC5', '\x31', '\xB9', '\x53', '\x9A', + '\x3B', '\xBB', '\xCB', '\xFE', '\xAE', '\xE1', '\x6A', '\x2E', + '\x6B', '\xD0', '\x9E', '\x83', '\xBA', '\x73', '\x74', '\xF0', + '\x6B', '\x2F', '\x67', '\xBE', '\x2E', '\x4A', '\x41', '\xE8', + '\xB6', '\x42', '\x7F', '\xAF', '\xD1', '\x1F', '\x56', '\xC6', + '\x77', '\x1F', '\xD7', '\x99', '\x72', '\x76', '\x58', '\x27', + '\xCE', '\x7C', '\x9C', '\xF4', '\xEB', '\xE6', '\x5D', '\x7E', + '\x0B', '\x7F', '\x2A', '\xAB', '\x1F', '\xD7', '\xB9', '\x9C', + '\x7E', '\xF7', '\x6D', '\x9A', '\x68', '\x95', '\x68', '\xAD', + '\x59', '\xFD', '\xFC', '\x13', '\x1D', '\xA3', '\xDA', '\xFC', + '\xD3', '\xDD', '\xCC', '\xBF', '\xE3', '\xCF', '\x0B', '\x9F', + '\x9D', '\xFB', '\x3D', '\xA7', '\x9F', '\x1A', '\x75', '\x74', + '\xFA', '\xE5', '\xDC', '\x75', '\x7D', '\xA0', '\xAB', '\x9F', + '\xBD', '\xFF', '\xE9', '\xE7', '\x9A', '\xF3', '\xD4', '\xF9', + '\x49', '\x19', '\xEA', '\xD7', '\x02', '\xFF', '\x9D', '\xF4', + '\xBD', '\xAF', '\x9F', '\x3B', '\x29', '\x69', '\x35', '\x54', + '\x9F', '\x51', '\xB5', '\xF3', '\xFD', '\xA4', '\x7E', '\xA2', + '\x46', '\xD3', '\xCD', '\x72', '\x13', '\x36', '\xDA', '\x68', + '\xD1', '\xA2', '\x45', '\x8B', '\x16', '\xAD', '\xAC', '\xF1', + '\xE7', '\x33', '\x75', '\x46', '\x51', '\x7E', '\xFE', '\x38', + '\x14', '\xE1', '\x3C', '\xE9', '\xD3', '\x8C', '\x62', '\xF4', + '\xF9', '\x18', '\xF6', '\x95', '\x4F', '\x3E', '\x5A', '\xBF', + '\xAC', '\x67', '\xF0', '\x14', '\xF6', '\x77', '\x2B', '\xE8', + '\x3F', '\xFB', '\x77', '\x63', '\x7E', '\xDC', '\x6A', '\x94', + '\x8E', '\xD5', '\x84', '\x7E', '\x6E', '\x7E', '\xC3', '\xFA', + '\xE5', '\xFB', '\x5D', '\x58', '\x49', '\x75', '\x5F', '\xDF', + '\xAA', '\xEA', '\xA7', '\xFA', '\x11', '\xFB', '\x17', '\x95', + '\xC2', '\x8A', '\x47', '\xAB', '\x5F', '\xBE', '\xF3', '\xBA', + '\xA6', '\xD7', '\xCF', '\x7D', '\xAB', '\xD1', '\x6F', '\xAF', + '\xA1', '\x66', '\xF5', '\xFB', '\x73', '\x43', '\x31', '\x3A', + '\xEF', '\xE6', '\xE7', '\x9F', '\xDA', '\x2B', '\xF0', '\x2A', + '\x2A', '\xAF', '\x49', '\xAE', '\x15', '\xAD', '\x94', '\xAB', + '\x40', '\x55', '\xFD', '\x9A', '\xF5', '\xDF', '\x94', '\x7E', + '\x29', '\xE7', '\xD0', '\xBE', '\x2C', '\x65', '\x88', '\x69', + '\x39', '\xFD', '\x61', '\x7F', '\xEE', '\x6D', '\x9B', '\xE9', + '\xF7', '\x74', '\x39', '\x17', '\x8E', '\xEA', '\x47', '\xE2', + '\x3A', '\x5C', '\xEA', '\x3F', '\xBA', '\x4F', '\xDD', '\x95', + '\xCD', '\x67', '\x44', '\xCD', '\x24', '\xEE', '\x53', '\x3A', + '\xEB', '\xB0', '\x2F', '\x95', '\x19', '\x35', '\xCE', '\xBB', + '\x6C', '\x93', '\xA8', '\xA9', '\x9C', '\x4D', '\xEA', '\xCC', + '\x46', '\x8B', '\x36', '\xCD', '\xE6', '\xAE', '\x6B', '\xFA', + '\x2C', '\x6E', '\x62', '\xDD', '\xF7', '\x90', '\xE1', '\x68', + '\xDC', '\x49', '\x57', '\xFF', '\x49', '\xBE', '\xE3', '\x69', + '\xCE', '\x40', '\x4C', '\xAB', '\xD7', '\x43', '\x7B', '\x8A', + '\x36', '\xF9', '\x24', '\xE7', '\xAF', '\xD1', '\xE6', '\x67', + '\x5D', '\xB5', '\x02', '\xC3', '\xD1', '\x2F', '\xDF', '\x93', + '\xE9', '\x9E', '\xA6', '\x33', '\x0A', '\xEB', '\xE7', '\x47', + '\xD5', '\x98', '\x46', '\xBF', '\x4E', '\x0D', '\x95', '\xB7', + '\x6E', '\xED', '\xCA', '\x1D', '\x2F', '\xEB', '\x97', '\x2A', + '\xA7', '\xB1', '\xBA', '\xFA', '\x0B', '\x45', '\x1A', '\xFD', + '\xE5', '\x7E', '\xD3', '\x94', '\x21', '\x55', '\xAD', '\xBE', + '\xFE', '\xFC', '\xB9', '\xBA', '\xFE', '\xF0', '\x7C', '\x5F', + '\xBD', '\x7E', '\xA9', '\x9B', '\xE9', '\x6F', '\xE9', '\x9E', + '\xA8', '\xA6', '\xBF', '\xC9', '\xFD', '\x5E', '\x1E', '\xB9', + '\xBC', '\xFE', '\xD0', '\x38', '\xA1', '\xCC', '\x75', '\x73', + '\x3B', '\x2A', '\xFD', '\xD4', '\x79', '\x6C', '\x73', '\xFE', + '\xDD', '\x3A', '\xFA', '\xDD', '\x78', '\xA3', '\xD5', '\x3F', + '\x7E', '\x46', '\x6B', '\xE3', '\xFB', '\x74', '\xD2', '\x8C', + '\xEA', '\x3E', '\xEA', '\xC6', '\x18', '\x1E', '\x81', '\xEE', + '\xE4', '\x68', '\xD1', '\xA2', '\xE5', '\xA6', '\x59', '\x1B', + '\xFA', '\xF5', '\xA3', '\x59', '\x95', '\xDA', '\x37', '\xE9', + '\xB3', '\x45', '\x77', '\x5A', '\x96', '\xB1', '\xF0', '\xFB', + '\xCD', '\xE8', '\x0F', '\xD7', '\x86', '\x27', '\xC3', '\xD4', + '\x1F', '\xB6', '\xAB', '\xD1', '\xAF', '\xF5', '\x6B', '\x5E', + '\x3F', '\x3E', '\x33', '\xA8', '\x53', '\x24', '\xEC', '\xE3', + '\xDF', '\x69', '\xCA', '\x7C', '\xF6', '\xCF', '\x3B', '\x97', + '\x52', '\x1D', '\x91', '\x3F', '\xF9', '\x1E', '\xB4', '\x02', + '\x4D', '\x15', '\x34', '\x31', '\x65', '\x0F', '\xBA', '\x73', + '\xAB', '\xFA', '\x53', '\xBF', '\x2A', '\xFC', '\x3A', '\xD9', + '\xFF', '\x73', '\xA3', '\x87', '\x94', '\x6B', '\x6B', '\x5E', + '\x4F', '\x4F', '\x35', '\xFD', '\x6E', '\x74', '\x7E', '\x8C', + '\x6A', '\xFA', '\xCB', '\xE6', '\xC6', '\x7B', '\xD0', '\x55', + '\x9C', '\x1E', '\xFD', '\xF4', '\xB8', '\xF5', '\xF5', '\x87', + '\xCE', '\x86', '\x51', '\xEA', '\x0F', '\x45', '\x1C', '\x78', + '\x34', '\xAB', '\x5F', '\xDA', '\xFF', '\xEA', '\xEA', '\xD7', + '\xEC', '\xCD', '\x7E', '\x1F', '\xFA', '\x3E', '\xD4', '\x67', + '\x39', '\x46', '\x19', '\xFD', '\x1A', '\x95', '\x55', '\xF5', + '\x8F', '\xCE', '\xB4', '\xF9', '\x8C', '\x5B', '\xDE', '\xF5', + '\xCD', '\xEF', '\x28', '\xD9', '\x73', '\xF8', '\x19', '\x45', + '\x8B', '\x16', '\x6D', '\x32', '\x8C', '\x3A', '\xAD', '\x46', + '\x19', '\x7B', '\x54', '\xB1', '\xB4', '\x19', '\x44', '\xFD', + '\x5C', '\x4E', '\xE1', '\x7B', '\x0C', '\x77', '\x57', '\xF1', + '\xEF', '\x47', '\xBE', '\xAF', '\xE6', '\x26', '\x52', '\xC7', + '\x97', '\xCF', '\x57', '\xA7', '\xBF', '\x89', '\x98', '\x78', + '\x6C', '\x5C', '\xCD', '\xE1', '\xEA', '\xA7', '\xF4', '\x8D', + '\x42', '\x3F', '\x3F', '\x76', '\x73', '\xFA', '\xF9', '\x3B', + '\x34', '\x9F', '\x01', '\xEE', '\x85', '\xE1', '\xEB', '\xC7', + '\x31', '\x43', '\xF9', '\xD2', '\x9A', '\x06', '\x7E', '\x9A', + '\xEA', '\xFA', '\x1E', '\x52', '\x37', '\x0C', '\x5F', '\x3F', + '\xFF', '\xAD', '\x46', '\xBF', '\xAD', '\x80', '\xFE', '\x26', + '\x4C', '\x42', '\x6A', '\xC7', '\x5F', '\xBF', '\xF4', '\x1C', + '\xEE', '\x9E', '\xAA', '\xFA', '\xEB', '\xEC', '\xFF', '\xB2', + '\x9E', '\x32', '\xFB', '\x73', '\x19', '\xFD', '\x5C', '\xF4', + '\x6A', '\xFB', '\x9F', '\x6F', '\x72', '\xA5', '\x74', '\x63', + '\x0C', '\xD7', '\xC2', '\x79', '\x4C', '\xB2', '\x7E', '\x5D', + '\x16', '\xE1', '\x8E', '\x88', '\x16', '\x2D', '\x1A', '\x77', + '\x5F', '\x9A', '\x2E', '\x9B', '\xF6', '\x0A', '\x44', '\xFD', + '\x51', '\x3F', '\xF7', '\x79', '\x3A', '\x2A', '\xE3', '\xDE', + '\x58', '\x8B', '\x7F', '\xA7', '\x43', '\x3F', '\xBE', '\x2B', + '\xD9', '\xFF', '\x4F', '\xAF', '\xFE', '\xE9', '\xD9', '\x17', + '\xA6', '\x45', '\x27', '\x67', '\x51', '\xFF', '\xF4', '\xEA', + '\x8F', '\xF7', '\xDF', '\x68', '\xD1', '\xA2', '\x45', '\x8B', + '\x16', '\x2D', '\x5A', '\xB4', '\xE9', '\xB1', '\xFF', '\x01', + '\xF1', '\xAA', '\xBA', '\x4E', '\x18', '\x89', '\x00', '\x00' + }; \ No newline at end of file