+static size_t bytesOfSequence(GLsizei count, GLenum type, const GLvoid *sequence)
+{
+ GLsizei bytes_per_element;
+ switch (type) {
+ case GL_BYTE:
+ bytes_per_element = sizeof(GLbyte);
+ break;
+ case GL_UNSIGNED_BYTE:
+ bytes_per_element = sizeof(GLubyte);
+ break;
+ case GL_SHORT:
+ bytes_per_element = sizeof(GLshort);
+ break;
+ case GL_UNSIGNED_SHORT:
+ bytes_per_element = sizeof(GLushort);
+ break;
+ case GL_INT:
+ bytes_per_element = sizeof(GLint);
+ break;
+ case GL_UNSIGNED_INT:
+ bytes_per_element = sizeof(GLuint);
+ break;
+ case GL_FLOAT:
+ bytes_per_element = sizeof(GLfloat);
+ break;
+ case GL_2_BYTES:
+ bytes_per_element = 2*sizeof(GLubyte);
+ break;
+ case GL_3_BYTES:
+ bytes_per_element = 3*sizeof(GLubyte);
+ break;
+ case GL_4_BYTES:
+ bytes_per_element = 4*sizeof(GLubyte);
+ break;
+ case GL_UTF8_NV:
+ {
+ const void *utf_string = sequence;
+ for (GLsizei i=0; i<count; i++) {
+ GLuint code_point; // ignored
+ bool ok = __glPathGetCodePointUTF8(utf_string, code_point);
+ if (!ok) {
+ break;
+ }
+ }
+ const char *start = reinterpret_cast<const char*>(sequence);
+ const char *end = reinterpret_cast<const char*>(utf_string);
+ return end - start;
+ }
+ case GL_UTF16_NV:
+ {
+ const void *utf_string = sequence;
+ for (GLsizei i=0; i<count; i++) {
+ GLuint code_point; // ignored
+ bool ok = __glPathGetCodePointUTF16(utf_string, code_point);
+ if (!ok) {
+ break;
+ }
+ }
+ const char *start = reinterpret_cast<const char*>(sequence);
+ const char *end = reinterpret_cast<const char*>(utf_string);
+ return end - start;
+ }
+ default: // generate INVALID_ENUM
+ return 0;
+ }
+ if (count > 0) {
+ return count * bytes_per_element;
+ } else {
+ return 0;
+ }
+}
+
+static inline size_t
+_gl_Paths_size(GLsizei numPaths, GLenum pathNameType, const GLvoid *paths)
+{
+ return bytesOfSequence(numPaths, pathNameType, paths);
+}
+
+static inline size_t
+_gl_PathColorGen_size(GLenum genMode, GLenum colorFormat)
+{
+ GLsizei coeffsPerComponent;
+ switch (genMode) {
+ case GL_NONE:
+ coeffsPerComponent = 0;
+ break;
+ case GL_OBJECT_LINEAR:
+ case GL_PATH_OBJECT_BOUNDING_BOX_NV:
+ coeffsPerComponent = 3;
+ break;
+ case GL_EYE_LINEAR:
+ coeffsPerComponent = 4;
+ break;
+ default:
+ return 0;
+ }
+
+ GLsizei components;
+ switch (colorFormat) {
+ case GL_LUMINANCE:
+ case GL_ALPHA:
+ case GL_INTENSITY:
+ components = 1;
+ break;
+ case GL_LUMINANCE_ALPHA:
+ components = 2;
+ break;
+ case GL_RGB:
+ components = 3;
+ break;
+ case GL_RGBA:
+ components = 4;
+ break;
+ default:
+ return 0;
+ }
+
+ GLsizei numCoeffs = components * coeffsPerComponent;
+ return numCoeffs*sizeof(GLfloat);
+}
+
+static inline size_t
+_gl_PathTexGen_size(GLenum genMode, GLsizei components)
+{
+ GLsizei coeffsPerComponent;
+ switch (genMode) {
+ case GL_NONE:
+ return 0;
+ case GL_OBJECT_LINEAR:
+ case GL_PATH_OBJECT_BOUNDING_BOX_NV:
+ coeffsPerComponent = 3;
+ break;
+ case GL_EYE_LINEAR:
+ coeffsPerComponent = 4;
+ break;
+ default:
+ return 0;
+ }
+
+ if (components < 1 || components > 4) {
+ return 0;
+ }
+
+ GLsizei numCoeffs = components * coeffsPerComponent;
+ return numCoeffs*sizeof(GLfloat);
+}
+
+static size_t valuesPerGetPathParameter(GLenum pname)
+{
+ switch (pname) {
+ case GL_PATH_FILL_MODE_NV:
+ case GL_PATH_FILL_MASK_NV:
+ case GL_PATH_FILL_COVER_MODE_NV:
+ case GL_PATH_STROKE_WIDTH_NV:
+ case GL_PATH_INITIAL_END_CAP_NV:
+ case GL_PATH_TERMINAL_END_CAP_NV:
+ case GL_PATH_JOIN_STYLE_NV:
+ case GL_PATH_MITER_LIMIT_NV:
+ case GL_PATH_INITIAL_DASH_CAP_NV:
+ case GL_PATH_TERMINAL_DASH_CAP_NV:
+ case GL_PATH_DASH_OFFSET_NV:
+ case GL_PATH_DASH_OFFSET_RESET_NV:
+ case GL_PATH_CLIENT_LENGTH_NV:
+ case GL_PATH_STROKE_COVER_MODE_NV:
+ case GL_PATH_STROKE_MASK_NV:
+ case GL_PATH_STROKE_OVERSAMPLE_COUNT_NV:
+ case GL_PATH_SAMPLE_QUALITY_NV:
+ return 1;
+ default:
+ return 0;
+ }