00001 #if defined(_WIN32)
00002 #include <windows.h>
00003 #endif
00004 #include <stdlib.h>
00005 #include <stdio.h>
00006 #include <math.h>
00007 #include <assert.h>
00008 #include <GL/glut.h>
00009 #include "glutint.h"
00010 #include "wacom.h"
00011
00012
00013 int __glutWacomButton = GLUT_WACOM_NO_BUTTON;
00014 int __glutWacomState = GLUT_WACOM_UP;
00015
00016
00017 float __glutWacomX = 0.0, __glutWacomY = 0.0;
00018 float __glutWacomPressure = 0.0;
00019 float __glutWacomXTilt = 0.0, __glutWacomYTilt = 0.0;
00020
00021
00022 int __glutWacomXCoordRange = 0, __glutWacomYCoordRange = 0;
00023 int __glutWacomPressureMin = 0, __glutWacomPressureRange = 0;
00024 int __glutWacomXTiltHalfRange = 0, __glutWacomYTiltHalfRange = 0;
00025 int __glutWacomScreenWidth = 0, __glutWacomScreenHeight = 0;
00026
00027
00028 float __glutWacomXScale = 0.0, __glutWacomYScale = 0.0;
00029 float __glutWacomXOffset = 0.0, __glutWacomYOffset = 0.0;
00030
00031 void
00032 __glutWacomSetOffset(int x, int y) {
00033 __glutWacomXOffset = - (float) x;
00034 __glutWacomYOffset = - (float) y;
00035 #if DEBUG
00036
00037
00038 #endif
00039 }
00040
00041 void
00042 __glutWacomSetButton(int device, int button) {
00043 switch (device) {
00044 case GLUT_WACOM_STYLUS:
00045 switch (button) {
00046 case WACOM_BUTTONS_UP:
00047 if (__glutWacomState == GLUT_WACOM_DOWN) {
00048 __glutWacomState = GLUT_WACOM_UP;
00049 } else {
00050 __glutWacomButton = GLUT_WACOM_NO_BUTTON;
00051 }
00052 break;
00053 case WACOM_BOTTOM_BUTTON_DOWN:
00054 __glutWacomButton = GLUT_WACOM_BOTTOM_BUTTON;
00055 __glutWacomState = GLUT_WACOM_DOWN;
00056 break;
00057 case WACOM_TOP_BUTTON_DOWN:
00058 __glutWacomButton = GLUT_WACOM_TOP_BUTTON;
00059 __glutWacomState = GLUT_WACOM_DOWN;
00060 break;
00061 default:
00062 fprintf(stderr, "Error: Unsupported button type!\n");
00063 assert(button == WACOM_BUTTONS_UP ||
00064 button == WACOM_BOTTOM_BUTTON_DOWN ||
00065 button == WACOM_TOP_BUTTON_DOWN);
00066 break;
00067 }
00068 break;
00069 case GLUT_WACOM_ERASER:
00070 switch (button) {
00071 default:
00072
00073 __glutWacomButton = GLUT_WACOM_NO_BUTTON;
00074 __glutWacomState = GLUT_WACOM_UP;
00075 break;
00076 }
00077 break;
00078 case GLUT_WACOM_CURSOR:
00079 switch (button) {
00080 case WACOM_BUTTONS_UP:
00081 if (__glutWacomState == GLUT_WACOM_DOWN) {
00082 __glutWacomState = GLUT_WACOM_UP;
00083 } else {
00084 __glutWacomButton = GLUT_WACOM_NO_BUTTON;
00085 }
00086 break;
00087 case WACOM_TOP_LEFT_BUTTON_DOWN:
00088 __glutWacomButton = GLUT_WACOM_TOP_LEFT_BUTTON;
00089 __glutWacomState = GLUT_WACOM_DOWN;
00090 break;
00091 case WACOM_TOP_MIDDLE_BUTTON_DOWN:
00092 __glutWacomButton = GLUT_WACOM_TOP_MIDDLE_BUTTON;
00093 __glutWacomState = GLUT_WACOM_DOWN;
00094 break;
00095 case WACOM_TOP_RIGHT_BUTTON_DOWN:
00096 __glutWacomButton = GLUT_WACOM_TOP_RIGHT_BUTTON;
00097 __glutWacomState = GLUT_WACOM_DOWN;
00098 break;
00099 case WACOM_BOTTOM_RIGHT_BUTTON_DOWN:
00100 __glutWacomButton = GLUT_WACOM_BOTTOM_RIGHT_BUTTON;
00101 __glutWacomState = GLUT_WACOM_DOWN;
00102 break;
00103 case WACOM_BOTTOM_LEFT_BUTTON_DOWN:
00104 __glutWacomButton = GLUT_WACOM_BOTTOM_LEFT_BUTTON;
00105 __glutWacomState = GLUT_WACOM_DOWN;
00106 break;
00107 default:
00108 fprintf(stderr, "Error: Unsupported button type!\n");
00109 assert(button == WACOM_BUTTONS_UP ||
00110 button == WACOM_TOP_LEFT_BUTTON_DOWN ||
00111 button == WACOM_TOP_MIDDLE_BUTTON_DOWN ||
00112 button == WACOM_TOP_RIGHT_BUTTON_DOWN ||
00113 button == WACOM_BOTTOM_RIGHT_BUTTON_DOWN ||
00114 button == WACOM_BOTTOM_LEFT_BUTTON_DOWN);
00115 break;
00116 }
00117 break;
00118 default:
00119 fprintf(stderr, "Error: Unsupported device type!\n");
00120 assert(device == GLUT_WACOM_STYLUS ||
00121 device == GLUT_WACOM_ERASER ||
00122 device == GLUT_WACOM_CURSOR);
00123 break;
00124 }
00125 }
00126
00127 void
00128 __glutWacomUpdate(int x, int y, int pressure, int xtilt, int ytilt) {
00129
00130 __glutWacomX = __glutWacomXOffset + __glutWacomXScale * (float) x;
00131 __glutWacomY = __glutWacomYOffset + __glutWacomYScale * (float) y;
00132
00133
00134 __glutWacomPressure = (float) (pressure - __glutWacomPressureMin) /
00135 (float) __glutWacomPressureRange;
00136
00137
00138 __glutWacomXTilt = (float) xtilt / (float) __glutWacomXTiltHalfRange;
00139 __glutWacomYTilt = (float) ytilt / (float) __glutWacomYTiltHalfRange;
00140 }
00141
00142 void
00143 __glutWacomCalibrate(void) {
00144 int xtilt_range = 0, ytilt_range = 0;
00145
00146 __glutWacomScreenWidth = glutGet(GLUT_SCREEN_WIDTH);
00147 __glutWacomScreenHeight = glutGet(GLUT_SCREEN_HEIGHT);
00148 #if defined(__sgi)
00149 __glutWacomXCoordRange = glutDeviceGet(GLUT_WACOM_TABLET_XCOORD_RANGE);
00150 __glutWacomYCoordRange = glutDeviceGet(GLUT_WACOM_TABLET_YCOORD_RANGE);
00151 __glutWacomPressureMin = glutDeviceGet(GLUT_WACOM_TABLET_PRESSURE_MIN);
00152 __glutWacomPressureRange = glutDeviceGet(GLUT_WACOM_TABLET_PRESSURE_RANGE);
00153 xtilt_range = glutDeviceGet(GLUT_WACOM_TABLET_XTILT_RANGE);
00154 ytilt_range = glutDeviceGet(GLUT_WACOM_TABLET_YTILT_RANGE);
00155 __glutWacomXTiltHalfRange = (int) ceil(xtilt_range / 2.0);
00156 __glutWacomYTiltHalfRange = (int) ceil(ytilt_range / 2.0);
00157 __glutWacomXScale
00158 = (double) __glutWacomScreenWidth / (double) __glutWacomXCoordRange;
00159 __glutWacomYScale
00160 = (double) __glutWacomScreenHeight / (double) __glutWacomXCoordRange;
00161
00162 #elif defined(__linux__)
00163 __glutWacomXCoordRange = glutDeviceGet(GLUT_WACOM_STYLUS_XCOORD_RANGE);
00164 __glutWacomYCoordRange = glutDeviceGet(GLUT_WACOM_STYLUS_YCOORD_RANGE);
00165 __glutWacomPressureMin = glutDeviceGet(GLUT_WACOM_STYLUS_PRESSURE_MIN);
00166 __glutWacomPressureRange = glutDeviceGet(GLUT_WACOM_STYLUS_PRESSURE_RANGE);
00167 xtilt_range = glutDeviceGet(GLUT_WACOM_STYLUS_XTILT_RANGE);
00168 ytilt_range = glutDeviceGet(GLUT_WACOM_STYLUS_YTILT_RANGE);
00169 __glutWacomXTiltHalfRange = (int) ceil(xtilt_range / 2.0);
00170 __glutWacomYTiltHalfRange = (int) ceil(ytilt_range / 2.0);
00171 __glutWacomXScale
00172 = (double) __glutWacomScreenWidth / (double) __glutWacomXCoordRange;
00173 __glutWacomYScale
00174 = (double) __glutWacomScreenHeight / (double) __glutWacomYCoordRange;
00175 #endif
00176
00177 #if DEBUG
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 #endif
00189 }