csplugincommon/opengl/glcommon2d.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 1998 by Jorrit Tyberghein 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public 00015 License along with this library; if not, write to the Free 00016 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00017 */ 00018 00019 #ifndef __CS_GLCOMMON2D_H__ 00020 #define __CS_GLCOMMON2D_H__ 00021 00026 #if defined(CS_OPENGL_PATH) 00027 #include CS_HEADER_GLOBAL(CS_OPENGL_PATH,gl.h) 00028 #else 00029 #include <GL/gl.h> 00030 #endif 00031 00032 #include "csextern_gl.h" 00033 #include "csutil/scf.h" 00034 #include "csplugincommon/canvas/graph2d.h" 00035 #include "csplugincommon/iopengl/driverdb.h" 00036 #include "glfontcache.h" 00037 #include "iutil/event.h" 00038 #include "glstates.h" 00039 #include "glextmanager.h" 00040 #include "glss.h" 00041 #include "driverdb.h" 00042 00043 class OpenGLTextureCache; 00044 class GLFontCache; 00045 00059 class CS_CSPLUGINCOMMON_GL_EXPORT csGraphics2DGLCommon : 00060 public scfImplementationExt2<csGraphics2DGLCommon, 00061 csGraphics2D, 00062 iEventPlug, 00063 iOpenGLDriverDatabase> 00064 { 00065 public: 00066 enum GLPixelFormatValue 00067 { 00068 glpfvColorBits = 0, 00069 glpfvAlphaBits, 00070 glpfvDepthBits, 00071 glpfvStencilBits, 00072 glpfvAccumColorBits, 00073 glpfvAccumAlphaBits, 00074 glpfvMultiSamples, 00075 00076 glpfvValueCount 00077 }; 00078 typedef int GLPixelFormat[glpfvValueCount]; 00079 protected: 00080 friend class csGLScreenShot; 00081 friend class csGLFontCache; 00082 00083 class CS_CSPLUGINCOMMON_GL_EXPORT csGLPixelFormatPicker 00084 { 00085 csGraphics2DGLCommon* parent; 00086 00087 /* 00088 size_t nextValueIndices[glpfvValueCount]; 00089 csArray<int> values[glpfvValueCount]; 00090 00091 00092 char* order; 00093 size_t orderPos; 00094 size_t orderNum;*/ 00095 00096 // Hold properties for a single pixelformat property 00097 struct PixelFormatPropertySet 00098 { 00099 GLPixelFormatValue valueType; 00100 size_t nextIndex; 00101 size_t firstIndex; 00102 csArray<int> possibleValues; 00103 }; 00104 00105 /* Pixel format properties, however this is _not_ indexed by 00106 GLPixelFormatValue but sorted by order */ 00107 PixelFormatPropertySet pixelFormats[glpfvValueCount]; 00108 00109 // Remapping table from real GLPixelFormatValue to index in table above 00110 size_t pixelFormatIndexTable[glpfvValueCount]; 00111 00112 GLPixelFormat currentValues; 00113 bool currentValid; 00114 00115 void ReadStartValues (); 00116 void ReadPickerValues (); 00117 void ReadPickerValue (const char* valuesStr, csArray<int>& values); 00118 void SetInitialIndices (); 00119 void SetupIndexTable (const char* orderStr); 00120 bool PickNextFormat (); 00121 public: 00122 csGLPixelFormatPicker (csGraphics2DGLCommon* parent); 00123 ~csGLPixelFormatPicker (); 00124 00125 void Reset(); 00126 bool GetNextFormat (GLPixelFormat& format); 00127 }; 00128 friend class csGLPixelFormatPicker; 00129 00131 csGLStateCache* statecache; 00132 csGLStateCacheContext *statecontext; 00133 00134 bool hasRenderTarget; 00135 00137 void DecomposeColor (int iColor, GLubyte &oR, GLubyte &oG, GLubyte &oB, GLubyte &oA); 00139 void DecomposeColor (int iColor, float &oR, float &oG, float &oB, float &oA); 00141 void setGLColorfromint (int color); 00142 00143 uint8 *screen_shot; 00144 00145 csGLScreenShot* ssPool; 00146 00147 csGLScreenShot* GetScreenShot (); 00148 void RecycleScreenShot (csGLScreenShot* shot); 00149 00151 csGLExtensionManager ext; 00153 //int multiSamples; 00155 bool multiFavorQuality; 00157 //int depthBits; 00158 GLPixelFormat currentFormat; 00160 csGLDriverDatabase driverdb; 00161 bool useCombineTE; 00162 00163 void GetPixelFormatString (const GLPixelFormat& format, csString& str); 00164 00166 void OpenDriverDB (const char* phase = 0); 00167 00168 void Report (int severity, const char* msg, ...); 00169 public: 00170 virtual const char* GetRendererString (const char* str); 00171 virtual const char* GetVersionString (const char* ver); 00172 00174 csRef<iEventOutlet> EventOutlet; 00175 00180 csGraphics2DGLCommon (iBase *iParent); 00181 00183 virtual ~csGraphics2DGLCommon (); 00184 00185 /* 00186 * You must supply all the functions not supplied here, such as 00187 * SetMouseCursor etc. Note also that even though Initialize, Open, 00188 * and Close are supplied here, you must still override these functions 00189 * for your own subclass to make system-specific calls for creating and 00190 * showing windows, etc. 00191 */ 00192 00194 virtual bool Initialize (iObjectRegistry *object_reg); 00195 00201 virtual bool Open (); 00202 00203 virtual void Close (); 00204 00205 virtual void SetClipRect (int xmin, int ymin, int xmax, int ymax); 00206 00211 virtual bool BeginDraw (); 00213 virtual void FinishDraw (); 00214 00216 virtual bool Resize (int width, int height); 00217 00218 00219 /* 00220 * the remaining functions here do not need to be overridden when 00221 * inheriting from this class 00222 */ 00223 00225 virtual void Clear (int color); 00226 00228 virtual void SetRGB (int i, int r, int g, int b); 00229 virtual int FindRGB (int r, int g, int b, int a = 255) 00230 { 00231 if (r < 0) r = 0; else if (r > 255) r = 255; 00232 if (g < 0) g = 0; else if (g > 255) g = 255; 00233 if (b < 0) b = 0; else if (b > 255) b = 255; 00234 if (a < 0) a = 0; else if (a > 255) a = 255; 00235 return ((255 - a) << 24) | (r << 16) | (g << 8) | b; 00236 /* Alpha is "inverted" so '-1' can be decomposed to a 00237 transparent color. (But alpha not be inverted, '-1' 00238 would be "opaque white". However, -1 is the color 00239 index for "transparent text background". */ 00240 } 00241 virtual void GetRGB (int color, int& r, int& g, int& b) 00242 { 00243 r = (color >> 16) & 0xff; 00244 g = (color >> 8) & 0xff; 00245 b = color & 0xff; 00246 } 00247 virtual void GetRGB (int color, int& r, int& g, int& b, int& a) 00248 { 00249 a = 255 - (color >> 24); 00250 GetRGB (color, r, g, b); 00251 } 00252 00254 virtual void DrawLine (float x1, float y1, float x2, float y2, int color); 00256 virtual void DrawBox (int x, int y, int w, int h, int color); 00258 virtual void DrawPixel (int x, int y, int color); 00260 virtual void DrawPixels (csPixelCoord const* pixels, int num_pixels, 00261 int color); 00263 virtual void Blit (int x, int y, int w, int h, unsigned char const* data); 00264 00270 virtual unsigned char *GetPixelAt (int x, int y); 00271 00273 virtual csPtr<iImage> ScreenShot (); 00274 00280 virtual csImageArea *SaveArea (int x, int y, int w, int h); 00282 virtual void RestoreArea (csImageArea *Area, bool Free = true); 00283 00285 virtual bool GetDoubleBufferState () 00286 { return false; } 00288 virtual bool DoubleBuffer (bool Enable) 00289 { return !Enable; } 00290 00292 virtual bool PerformExtensionV (char const* command, va_list); 00293 00295 virtual bool DebugCommand (const char* cmd); 00296 00299 virtual unsigned GetPotentiallyConflictingEvents () 00300 { return CSEVTYPE_Keyboard | CSEVTYPE_Mouse; } 00301 virtual unsigned QueryEventPriority (unsigned /*iType*/) 00302 { return 150; } 00307 void ReadDatabase (iDocumentNode* dbRoot, 00308 int configPriority = iConfigManager::ConfigPriorityPlugin + 20, 00309 const char* phase = 0) 00310 { 00311 driverdb.Open (this, dbRoot, phase, configPriority); 00312 } 00314 }; 00315 00318 #endif // __CS_GLCOMMON2D_H__
Generated for Crystal Space by doxygen 1.4.7