win32_util.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:4k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Nate Robins, 1997. */
  2. /* portions Copyright (c) Mark Kilgard, 1997, 1998. */
  3. /* This program is freely distributable without licensing fees 
  4.    and is provided without guarantee or warrantee expressed or 
  5.    implied. This program is -not- in the public domain. */
  6. #include "glutint.h"
  7. #include "glutstroke.h"
  8. #include "glutbitmap.h"
  9. #if defined(__CYGWIN32__)
  10. typedef MINMAXINFO* LPMINMAXINFO;
  11. #else
  12. #include <sys/timeb.h>
  13. #endif
  14. /* The following added by Paul Garceau <pgarceau@teleport.com> */
  15. #if defined(__MINGW32__)
  16. #include <time.h>
  17. #include <windows.h>
  18. struct timeval;
  19. #endif
  20. extern StrokeFontRec glutStrokeRoman, glutStrokeMonoRoman;
  21. extern BitmapFontRec glutBitmap8By13, glutBitmap9By15, glutBitmapTimesRoman10, glutBitmapTimesRoman24, glutBitmapHelvetica10, glutBitmapHelvetica12, glutBitmapHelvetica18;
  22. int
  23. gettimeofday(struct timeval* tp, void* tzp)
  24. {
  25.   LARGE_INTEGER t;
  26.   if(QueryPerformanceCounter(&t)) {
  27.       /* hardware supports a performance counter */
  28.       LARGE_INTEGER f;
  29.       QueryPerformanceFrequency(&f);
  30.       tp->tv_sec = t.QuadPart/f.QuadPart;
  31.       tp->tv_usec = ((float)t.QuadPart/f.QuadPart*1000*1000) - (tp->tv_sec*1000*1000);
  32.   } else {
  33.       /* hardware doesn't support a performance counter,
  34.          so get the time in a more traditional way. */
  35.       DWORD t;
  36.       t = timeGetTime();
  37.       tp->tv_sec = t / 1000;
  38.       tp->tv_usec = t % 1000;
  39.   }
  40.   /* 0 indicates that the call succeeded. */
  41.   return 0;
  42. }
  43. /* To get around the fact that Microsoft DLLs only allow functions
  44.    to be exported and now data addresses (as Unix DSOs support), the
  45.    GLUT API constants such as GLUT_STROKE_ROMAN have to get passed
  46.    through a case statement to get mapped to the actual data structure
  47.    address. */
  48. void*
  49. __glutFont(void *font)
  50. {
  51.   switch((int)font) {
  52.   case (int)GLUT_STROKE_ROMAN:
  53.     return &glutStrokeRoman;
  54.   case (int)GLUT_STROKE_MONO_ROMAN:
  55.     return &glutStrokeMonoRoman;
  56.   case (int)GLUT_BITMAP_9_BY_15:
  57.     return &glutBitmap9By15;
  58.   case (int)GLUT_BITMAP_8_BY_13:
  59.     return &glutBitmap8By13;
  60.   case (int)GLUT_BITMAP_TIMES_ROMAN_10:
  61.     return &glutBitmapTimesRoman10;
  62.   case (int)GLUT_BITMAP_TIMES_ROMAN_24:
  63.     return &glutBitmapTimesRoman24;
  64.   case (int)GLUT_BITMAP_HELVETICA_10:
  65.     return &glutBitmapHelvetica10;
  66.   case (int)GLUT_BITMAP_HELVETICA_12:
  67.     return &glutBitmapHelvetica12;
  68.   case (int)GLUT_BITMAP_HELVETICA_18:
  69.     return &glutBitmapHelvetica18;
  70.   }
  71.   __glutFatalError("out of memory.");
  72.   /* NOTREACHED */
  73.   return NULL; /* keep MSVC compiler happy */
  74. }
  75. int
  76. __glutGetTransparentPixel(Display * dpy, XVisualInfo * vinfo)
  77. {
  78.   /* the transparent pixel on Win32 is always index number 0.  So if
  79.      we put this routine in this file, we can avoid compiling the
  80.      whole of layerutil.c which is where this routine normally comes
  81.      from. */
  82.   return 0;
  83. }
  84. void
  85. __glutAdjustCoords(Window parent, int* x, int* y, int* width, int* height)
  86. {
  87.   RECT rect;
  88.   /* adjust the window rectangle because Win32 thinks that the x, y,
  89.      width & height are the WHOLE window (including decorations),
  90.      whereas GLUT treats the x, y, width & height as only the CLIENT
  91.      area of the window. */
  92.   rect.left = *x; rect.top = *y;
  93.   rect.right = *x + *width; rect.bottom = *y + *height;
  94.   /* must adjust the coordinates according to the correct style
  95.      because depending on the style, there may or may not be
  96.      borders. */
  97.   AdjustWindowRect(&rect, WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
  98.    (parent ? WS_CHILD : WS_OVERLAPPEDWINDOW),
  99.    FALSE);
  100.   /* FALSE in the third parameter = window has no menu bar */
  101.   /* readjust if the x and y are offscreen */
  102.   if(rect.left < 0) {
  103.     *x = 0;
  104.   } else {
  105.     *x = rect.left;
  106.   }
  107.   
  108.   if(rect.top < 0) {
  109.     *y = 0;
  110.   } else {
  111.     *y = rect.top;
  112.   }
  113.   *width = rect.right - rect.left; /* adjusted width */
  114.   *height = rect.bottom - rect.top; /* adjusted height */
  115. }