windows-nt/Source/XPSP1/NT/multimedia/opengl/gls/lib/immed.c
2020-09-26 16:20:57 +08:00

1155 lines
35 KiB
C

/*
** Copyright 1995-2095, Silicon Graphics, Inc.
** All Rights Reserved.
**
** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
** the contents of this file may not be disclosed to third parties, copied or
** duplicated in any form, in whole or in part, without the prior written
** permission of Silicon Graphics, Inc.
**
** RESTRICTED RIGHTS LEGEND:
** Use, duplication or disclosure by the Government is subject to restrictions
** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
** rights reserved under the Copyright Laws of the United States.
*/
#include "glslib.h"
#include <stdlib.h>
#include <string.h>
static GLboolean __glsRequireContext(void) {
if (__GLS_CONTEXT) {
return GL_TRUE;
} else {
__GLS_RAISE_ERROR(GLS_INVALID_OPERATION);
return GL_FALSE;
}
}
#ifndef __GLS_PLATFORM_WIN32
// DrewB
void glsAbortCall(GLSenum inMode) {
if (!__glsRequireContext()) return;
switch (inMode) {
case GLS_NONE:
case GLS_LAST:
case GLS_ALL:
__GLS_CONTEXT->abortMode = inMode;
__glsContext_updateDispatchDecode_bin(__GLS_CONTEXT);
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
break;
}
}
#else
void __glsInternalAbortCall(__GLScontext *ctx, GLSenum inMode) {
switch (inMode) {
case GLS_NONE:
case GLS_LAST:
case GLS_ALL:
ctx->abortMode = inMode;
__glsContext_updateDispatchDecode_bin(ctx);
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
break;
}
}
void glsAbortCall(GLSenum inMode) {
if (!__glsRequireContext()) return;
__glsInternalAbortCall(__GLS_CONTEXT, inMode);
}
#endif
GLboolean glsBeginCapture(
const GLubyte *inStreamName,
GLSenum inCaptureStreamType,
GLbitfield inWriteFlags
) {
__GLScontext *const ctx = __GLS_CONTEXT;
__GLSwriter *writer;
if (!__glsRequireContext()) return GL_FALSE;
if (ctx->captureNesting >= __GLS_MAX_CAPTURE_NESTING) {
__GLS_RAISE_ERROR(GLS_INVALID_OPERATION);
return GL_FALSE;
}
if (!__glsValidateString(inStreamName)) return GL_FALSE;
switch (inCaptureStreamType) {
case GLS_CONTEXT:
case GLS_BINARY_LSB_FIRST:
case GLS_BINARY_MSB_FIRST:
case GLS_TEXT:
if (
writer = __glsWriter_create(
inStreamName, inCaptureStreamType, inWriteFlags
)
) {
if (!ctx->captureNesting++) {
__glsContext_updateDispatchTables(ctx);
}
ctx->writer = ctx->writers[ctx->captureNesting - 1] = writer;
return GL_TRUE;
} else {
return GL_FALSE;
}
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return GL_FALSE;
}
}
#ifndef __GLS_PLATFORM_WIN32
// DrewB
static void __glsCallArray_bin(size_t inCount, const GLubyte *inArray) {
__GLScontext *ctx = __GLS_CONTEXT;
#else
static void __glsCallArray_bin(__GLScontext *ctx,
size_t inCount, const GLubyte *inArray) {
#endif
const GLubyte *const arrayTail = inArray + inCount;
size_t cmdBytes, headBytes;
const __GLSbinCommandHead_large *head;
GLSopcode op;
for (;;) {
headBytes = sizeof(__GLSbinCommandHead_small);
if (inArray + headBytes > arrayTail) return;
head = (const __GLSbinCommandHead_large *)inArray;
if (head->countSmall) {
op = head->opSmall;
cmdBytes = head->countSmall << 2;
} else {
if (ctx->abortMode) return;
headBytes = sizeof(__GLSbinCommandHead_large);
if (inArray + headBytes > arrayTail) return;
op = head->opLarge;
cmdBytes = head->countLarge << 2;
}
if (inArray + cmdBytes > arrayTail) return;
op = __glsMapOpcode(op);
if (!__glsOpcodeString[op]) op = GLS_OP_glsUnsupportedCommand;
#ifndef __GLS_PLATFORM_WIN32
// DrewB
ctx->dispatchDecode_bin[op]((GLubyte *)inArray + headBytes);
#else
ctx->dispatchDecode_bin[op](ctx, (GLubyte *)inArray + headBytes);
#endif
inArray += cmdBytes;
}
}
#ifndef __GLS_PLATFORM_WIN32
// DrewB
static void __glsCallArray_bin_swap(size_t inCount, const GLubyte *inArray) {
__GLScontext *ctx = __GLS_CONTEXT;
#else
static void __glsCallArray_bin_swap(__GLScontext *ctx,
size_t inCount, const GLubyte *inArray) {
#endif
const GLubyte *const arrayTail = inArray + inCount;
GLubyte *buf = GLS_NONE;
size_t bufSize = 0, cmdBytes, headBytes;
const __GLSbinCommandHead_large *head;
GLSopcode mappedOp, op;
for (;;) {
if (ctx->abortMode) goto done;
headBytes = sizeof(__GLSbinCommandHead_small);
if (inArray + headBytes > arrayTail) goto done;
head = (const __GLSbinCommandHead_large *)inArray;
if (head->countSmall) {
op = __glsSwaps((GLshort)head->opSmall);
cmdBytes = __glsSwaps((GLshort)head->countSmall) << 2;
} else {
headBytes = sizeof(__GLSbinCommandHead_large);
if (inArray + headBytes > arrayTail) goto done;
op = __glsSwapi((GLint)head->opLarge);
cmdBytes = __glsSwapi((GLint)head->countLarge) << 2;
}
if (inArray + cmdBytes > arrayTail) goto done;
if (__glsOpcodeString[mappedOp = __glsMapOpcode(op)]) {
GLScommandAlignment align;
glsGetCommandAlignment(op, __GLS_BINARY_SWAP1, &align);
if (bufSize < cmdBytes + align.value) {
GLubyte *const newBuf = (GLubyte *)realloc(
buf, bufSize = cmdBytes + align.value
);
if (!newBuf) {
free(buf);
bufSize = 0;
}
buf = newBuf;
}
if (buf) {
memcpy(buf + align.value, inArray, cmdBytes);
#ifndef __GLS_PLATFORM_WIN32
// DrewB
__glsDispatchDecode_bin_swap[mappedOp](
buf + align.value + headBytes
);
#else
__glsDispatchDecode_bin_swap[mappedOp](
ctx, buf + align.value + headBytes
);
#endif
} else {
__GLS_CALL_ERROR(ctx, op, GLS_OUT_OF_MEMORY);
}
} else {
__GLS_CALL_UNSUPPORTED_COMMAND(ctx);
}
inArray += cmdBytes;
}
done:
free(buf);
}
#ifndef __GLS_PLATFORM_WIN32
// DrewB
static void __glsCallArray_text(size_t inCount, const GLubyte *inArray) {
__GLScontext *ctx = __GLS_CONTEXT;
#else
static void __glsCallArray_text(__GLScontext *ctx,
size_t inCount, const GLubyte *inArray) {
#endif
__GLSstring cmd;
GLSopcode op;
__GLSreader reader;
if (!__glsParser) {
__glsBeginCriticalSection();
if (!__glsParser) __glsParser = __glsParser_create();
__glsEndCriticalSection();
if (!__glsParser) {
__GLS_RAISE_ERROR(GLS_OUT_OF_MEMORY);
return;
}
}
__glsString_init(&cmd);
__glsReader_init_array(&reader, inArray, inCount);
for (;;) {
if (ctx->abortMode || !__glsReader_beginCommand_text(&reader, &cmd)) {
break;
}
if (__glsParser_findCommand(__glsParser, cmd.head, &op)) {
#ifndef __GLS_PLATFORM_WIN32
// DrewB
__glsDispatchDecode_text[__glsMapOpcode(op)](&reader);
#else
__glsDispatchDecode_text[__glsMapOpcode(op)](ctx, &reader);
#endif
__glsReader_endCommand_text(&reader);
if (reader.error) {
__GLS_CALL_ERROR(ctx, op, reader.error);
__glsReader_abortCommand_text(&reader);
}
} else {
__glsReader_abortCommand_text(&reader);
}
}
__glsString_final(&cmd);
__glsReader_final(&reader);
}
#ifndef __GLS_PLATFORM_WIN32
// DrewB
void glsCallArray(
GLSenum inExternStreamType, size_t inCount, const GLubyte *inArray
) {
GLboolean callSave;
__GLScontext *const ctx = __GLS_CONTEXT;
if (!__glsRequireContext()) return;
if (ctx->abortMode) return;
if (ctx->callNesting >= __GLS_MAX_CALL_NESTING) {
__GLS_RAISE_ERROR(GLS_CALL_OVERFLOW);
glsAbortCall(GLS_ALL);
return;
}
++ctx->callNesting;
callSave = ctx->contextCall;
ctx->contextCall = GL_TRUE;
switch (inExternStreamType) {
case __GLS_BINARY_SWAP0:
__glsCallArray_bin(inCount, inArray);
break;
case __GLS_BINARY_SWAP1:
__glsCallArray_bin_swap(inCount, inArray);
break;
case GLS_TEXT:
__glsCallArray_text(inCount, inArray);
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
break;
}
ctx->contextCall = callSave;
--ctx->callNesting;
switch (ctx->abortMode) {
case GLS_ALL:
if (!ctx->callNesting) glsAbortCall(GLS_NONE);
break;
case GLS_LAST:
glsAbortCall(GLS_NONE);
break;
}
}
#else
void glsCallArrayInContext(
GLuint inCtx,
GLSenum inExternStreamType, size_t inCount, const GLubyte *inArray
) {
GLboolean callSave;
__GLScontext *ctx;
__glsBeginCriticalSection();
ctx = (__GLScontext *)__glsInt2PtrDict_find(
__glsContextDict, (GLint)inCtx
);
__glsEndCriticalSection();
if (ctx == NULL) return;
if (ctx->abortMode) return;
if (ctx->callNesting >= __GLS_MAX_CALL_NESTING) {
__GLS_RAISE_ERROR(GLS_CALL_OVERFLOW);
__glsInternalAbortCall(ctx, GLS_ALL);
return;
}
++ctx->callNesting;
callSave = ctx->contextCall;
ctx->contextCall = GL_TRUE;
switch (inExternStreamType) {
case __GLS_BINARY_SWAP0:
__glsCallArray_bin(ctx, inCount, inArray);
break;
case __GLS_BINARY_SWAP1:
__glsCallArray_bin_swap(ctx, inCount, inArray);
break;
case GLS_TEXT:
__glsCallArray_text(ctx, inCount, inArray);
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
break;
}
ctx->contextCall = callSave;
--ctx->callNesting;
switch (ctx->abortMode) {
case GLS_ALL:
if (!ctx->callNesting) __glsInternalAbortCall(ctx, GLS_NONE);
break;
case GLS_LAST:
__glsInternalAbortCall(ctx, GLS_NONE);
break;
}
}
void glsCallArray(
GLSenum inExternStreamType, size_t inCount, const GLubyte *inArray
) {
glsCallArrayInContext(__GLS_CONTEXT->name, inExternStreamType, inCount,
inArray);
}
#endif
void glsCaptureFlags(GLSopcode inOpcode, GLbitfield inFlags) {
if (!__glsRequireContext()) return;
if (!__glsValidateOpcode(inOpcode)) return;
switch (inOpcode) {
case GLS_OP_glsBeginGLS:
case GLS_OP_glsEndGLS:
case GLS_OP_glsPad:
return;
}
inOpcode = __glsMapOpcode(inOpcode);
__GLS_CONTEXT->captureFlags[inOpcode] = (GLubyte)inFlags;
}
void glsCaptureFunc(GLSenum inTarget, GLScaptureFunc inFunc) {
if (!__glsRequireContext()) return;
switch (inTarget) {
case GLS_CAPTURE_ENTRY_FUNC:
__GLS_CONTEXT->captureEntryFunc = inFunc;
break;
case GLS_CAPTURE_EXIT_FUNC:
__GLS_CONTEXT->captureExitFunc = inFunc;
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
break;
}
}
void glsChannel(GLSenum inTarget, FILE *inChannel) {
if (!__glsRequireContext()) return;
switch (inTarget) {
case GLS_DEFAULT_READ_CHANNEL:
__GLS_CONTEXT->defaultReadChannel = inChannel;
break;
case GLS_DEFAULT_WRITE_CHANNEL:
__GLS_CONTEXT->defaultWriteChannel = inChannel;
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
}
}
void glsCommandFunc(GLSopcode inOpcode, GLSfunc inFunc) {
__GLScontext *const ctx = __GLS_CONTEXT;
if (!__glsRequireContext()) return;
if (!__glsValidateOpcode(inOpcode)) return;
inOpcode = __glsMapOpcode(inOpcode);
ctx->commandFuncs[inOpcode] = inFunc;
ctx->dispatchCall[inOpcode] = inFunc ? inFunc : ctx->dispatchAPI[inOpcode];
if (!ctx->abortMode && !__glsDispatchDecode_bin_default[inOpcode]) {
ctx->dispatchDecode_bin[inOpcode] = (
(__GLSdecodeBinFunc)ctx->dispatchCall[inOpcode]
);
}
}
GLSenum glsCopyStream(
const GLubyte *inSource,
const GLubyte *inDest,
GLSenum inDestType,
GLbitfield inWriteFlags
) {
__GLScontext *const ctx = __GLS_CONTEXT;
__GLScontextStream *contextStream;
__GLSreadStream *readStream;
GLSenum outType = GLS_NONE;
__GLSversion versionSave;
if (!__glsRequireContext()) return outType;
if (!__glsValidateString(inSource)) return outType;
if (!__glsValidateString(inDest)) return outType;
switch (inDestType) {
case GLS_NONE:
case GLS_CONTEXT:
case GLS_BINARY_LSB_FIRST:
case GLS_BINARY_MSB_FIRST:
case GLS_TEXT:
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return outType;
}
if (ctx->abortMode) return outType;
if (ctx->callNesting >= __GLS_MAX_CALL_NESTING) {
__GLS_RAISE_ERROR(GLS_CALL_OVERFLOW);
glsAbortCall(GLS_ALL);
return outType;
}
++ctx->callNesting;
versionSave = ctx->streamVersion;
ctx->streamVersion.major = ctx->streamVersion.minor = 0;
if (
contextStream = __glsStr2PtrDict_find(ctx->contextStreamDict, inSource)
) {
GLint i;
if (inDestType == GLS_NONE) inDestType = GLS_CONTEXT;
for (i = 0 ; i < ctx->captureNesting ; ++i) {
if (ctx->writers[i]->contextStream == contextStream) {
__GLS_RAISE_ERROR(GLS_INVALID_OPERATION);
inDestType = GLS_NONE;
break;
}
}
if (
inDestType == GLS_CONTEXT &&
!strcmp(
(const char *)inDest, (const char *)contextStream->name.head
)
) {
__GLS_RAISE_ERROR(GLS_INVALID_OPERATION);
inDestType = GLS_NONE;
}
if (inDestType) {
if (glsBeginCapture(inDest, inDestType, inWriteFlags)) {
outType = GLS_CONTEXT;
__glsContextStream_call(contextStream);
glsEndCapture();
}
}
} else if (readStream = __glsReadStream_create(inSource)) {
__GLSreader reader;
if (__glsReader_init_stream(
&reader, readStream, __GLS_READER_BUF_BYTES
)) {
if (inDestType == GLS_NONE) inDestType = reader.type;
if (glsBeginCapture(inDest, inDestType, inWriteFlags)) {
outType = reader.type;
__glsReader_call(&reader);
glsEndCapture();
}
__glsReader_final(&reader);
} else {
__GLS_RAISE_ERROR(GLS_INVALID_STREAM);
}
__glsReadStream_destroy(readStream);
} else {
__GLS_RAISE_ERROR(GLS_NOT_FOUND);
}
--ctx->callNesting;
switch (ctx->abortMode) {
case GLS_ALL:
if (!ctx->callNesting) glsAbortCall(GLS_NONE);
break;
case GLS_LAST:
glsAbortCall(GLS_NONE);
break;
}
ctx->streamVersion = versionSave;
return outType;
}
void glsDataPointer(GLvoid *inPointer) {
if (!__glsRequireContext()) return;
__GLS_CONTEXT->dataPointer = inPointer;
}
void glsDeleteReadPrefix(GLuint inIndex) {
__GLScontext *const ctx = __GLS_CONTEXT;
if (!__glsRequireContext()) return;
if (inIndex >= ctx->readPrefixList.count) {
__GLS_RAISE_ERROR(GLS_INVALID_VALUE);
return;
}
__GLS_ITERLIST_SEEK(&ctx->readPrefixList, inIndex);
__GLS_ITERLIST_REMOVE_DESTROY(
&ctx->readPrefixList,
ctx->readPrefixList.iterElem,
__glsListString_destroy
);
}
void glsDeleteStream(const GLubyte *inName) {
__GLScontext *const ctx = __GLS_CONTEXT;
__GLScontextStream *contextStream;
__GLSreadStream *readStream;
if (!__glsRequireContext()) return;
if (!__glsValidateString(inName)) return;
if (
contextStream = __glsStr2PtrDict_find(ctx->contextStreamDict, inName)
) {
__glsStrDict_remove(ctx->contextStreamDict, contextStream->name.head);
__GLS_ITERLIST_REMOVE(&ctx->contextStreamList, contextStream);
if (contextStream->callCount) {
contextStream->deleted = GL_TRUE;
} else {
__glsContextStream_destroy(contextStream);
}
} else if (readStream = __glsReadStream_create(inName)) {
if (remove((const char *)readStream->name.head)) {
__GLS_RAISE_ERROR(GLS_STREAM_DELETE_ERROR);
}
__glsReadStream_destroy(readStream);
} else {
__GLS_RAISE_ERROR(GLS_NOT_FOUND);
}
}
void glsEndCapture(void) {
__GLScontext *const ctx = __GLS_CONTEXT;
if (!__glsRequireContext()) return;
if (ctx->captureNesting > 0) {
const GLint n = --ctx->captureNesting;
__glsWriter_destroy(ctx->writer);
ctx->writer = n ? ctx->writers[n - 1] : GLS_NONE;
if (!n) __glsContext_updateDispatchTables(ctx);
} else {
__GLS_RAISE_ERROR(GLS_INVALID_OPERATION);
}
}
void glsFlush(GLSenum inFlushType) {
__GLScontext *const ctx = __GLS_CONTEXT;
GLint i;
if (!__glsRequireContext()) return;
switch (inFlushType) {
case GLS_ALL:
for (i = 0 ; i < ctx->captureNesting ; ++i) {
__glsWriter_flush(ctx->writers[i]);
}
break;
case GLS_LAST:
if (ctx->writer) __glsWriter_flush(ctx->writer);
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
break;
}
}
GLbitfield glsGetCaptureFlags(GLSopcode inOpcode) {
if (!__glsRequireContext()) return GLS_NONE;
if (!__glsValidateOpcode(inOpcode)) return GLS_NONE;
return __GLS_CONTEXT->captureFlags[__glsMapOpcode(inOpcode)];
}
GLSfunc glsGetCommandFunc(GLSopcode inOpcode) {
if (!__glsRequireContext()) return GLS_NONE;
if (!__glsValidateOpcode(inOpcode)) return GLS_NONE;
return __GLS_CONTEXT->commandFuncs[__glsMapOpcode(inOpcode)];
}
GLSfunc glsGetContextFunc(GLSenum inAttrib) {
__GLScontext *const ctx = __GLS_CONTEXT;
if (!__glsRequireContext()) return GLS_NONE;
switch (inAttrib) {
case GLS_CAPTURE_ENTRY_FUNC:
return (GLSfunc)ctx->captureEntryFunc;
case GLS_CAPTURE_EXIT_FUNC:
return (GLSfunc)ctx->captureExitFunc;
case GLS_READ_FUNC:
return (GLSfunc)ctx->readFunc;
case GLS_UNREAD_FUNC:
return (GLSfunc)ctx->unreadFunc;
case GLS_WRITE_FUNC:
return (GLSfunc)ctx->writeFunc;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return GLS_NONE;
}
}
GLlong glsGetContextListl(GLSenum inAttrib, GLuint inIndex) {
__GLScontext *const ctx = __GLS_CONTEXT;
if (!__glsRequireContext()) return __glsSizeToLong(0);
switch (inAttrib) {
case GLS_OUT_ARG_LIST:
if (inIndex >= (GLuint)ctx->outArgs.count) {
__GLS_RAISE_ERROR(GLS_INVALID_VALUE);
return __glsSizeToLong(0);
}
return *(GLlong *)(ctx->outArgs.vals + inIndex);
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return __glsSizeToLong(0);
}
}
const GLubyte* glsGetContextListubz(GLSenum inAttrib, GLuint inIndex) {
__GLScontext *const ctx = __GLS_CONTEXT;
GLubyte *outStr;
if (!__glsRequireContext()) return GLS_NONE;
switch (inAttrib) {
case GLS_CONTEXT_STREAM_LIST:
if (inIndex >= ctx->contextStreamList.count) {
__GLS_RAISE_ERROR(GLS_INVALID_VALUE);
return 0;
}
__GLS_ITERLIST_SEEK(&ctx->contextStreamList, inIndex);
outStr = ctx->contextStreamList.iterElem->name.head;
break;
case GLS_READ_PREFIX_LIST:
if (inIndex >= ctx->readPrefixList.count) {
__GLS_RAISE_ERROR(GLS_INVALID_VALUE);
return 0;
}
__GLS_ITERLIST_SEEK(&ctx->readPrefixList, inIndex);
outStr = ctx->readPrefixList.iterElem->val.head;
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return GLS_NONE;
}
return (
__glsString_assign(&ctx->returnString, outStr) ?
ctx->returnString.head :
GLS_NONE
);
}
GLvoid* glsGetContextPointer(GLSenum inAttrib) {
__GLScontext *const ctx = __GLS_CONTEXT;
if (!__glsRequireContext()) return GLS_NONE;
switch (inAttrib) {
case GLS_DEFAULT_READ_CHANNEL:
return ctx->defaultReadChannel;
case GLS_DEFAULT_WRITE_CHANNEL:
return ctx->defaultWriteChannel;
case GLS_DATA_POINTER:
return ctx->dataPointer;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return GLS_NONE;
}
}
GLint glsGetContexti(GLSenum inAttrib) {
__GLScontext *const ctx = __GLS_CONTEXT;
if (!__glsRequireContext()) return 0;
switch (inAttrib) {
case GLS_ABORT_MODE:
return (GLint)ctx->abortMode;
case GLS_BLOCK_TYPE:
return (GLint)ctx->blockType;
case GLS_CALL_NESTING:
return ctx->callNesting;
case GLS_CAPTURE_NESTING:
return ctx->captureNesting;
case GLS_CONTEXT_STREAM_COUNT:
return (GLint)ctx->contextStreamList.count;
case GLS_CURRENT_GLRC:
return (GLint)ctx->currentGLRC;
case GLS_OUT_ARG_COUNT:
return ctx->outArgs.count;
case GLS_PIXEL_SETUP_GEN:
return ctx->pixelSetupGen;
case GLS_READ_PREFIX_COUNT:
return (GLint)ctx->readPrefixList.count;
case GLS_STREAM_VERSION_MAJOR:
return ctx->streamVersion.major;
case GLS_STREAM_VERSION_MINOR:
return ctx->streamVersion.minor;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return 0;
}
}
const GLubyte* glsGetContextubz(GLSenum inAttrib) {
__GLScontext *const ctx = __GLS_CONTEXT;
GLubyte *outStr;
if (!__glsRequireContext()) return GLS_NONE;
switch (inAttrib) {
case GLS_WRITE_PREFIX:
outStr = ctx->writePrefix->val.head;
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return GLS_NONE;
}
return (
__glsString_assign(&ctx->returnString, outStr) ?
ctx->returnString.head :
GLS_NONE
);
}
GLint glsGetGLRCi(GLuint inGLRC, GLSenum inAttrib) {
__GLScontext *const ctx = __GLS_CONTEXT;
__GLSglrc *glrc;
if (!__glsRequireContext()) return 0;
if (!inGLRC || inGLRC > (GLuint)ctx->header.glrcCount) {
__GLS_RAISE_ERROR(GLS_INVALID_VALUE);
return 0;
}
glrc = ctx->header.glrcs + inGLRC - 1;
switch (inAttrib) {
case GLS_LAYER:
return (GLint)glrc->layer;
case GLS_READ_LAYER:
return (GLint)glrc->readLayer;
case GLS_SHARE_GLRC:
return (GLint)glrc->shareGLRC;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return 0;
}
}
GLfloat glsGetHeaderf(GLSenum inAttrib) {
__GLScontext *const ctx = __GLS_CONTEXT;
if (!__glsRequireContext()) return (GLfloat)0;
switch (inAttrib) {
case GLS_ASPECT:
return ctx->header.aspect;
case GLS_BORDER_WIDTH:
return ctx->header.borderWidth;
case GLS_CONTRAST_RATIO:
return ctx->header.contrastRatio;
case GLS_HEIGHT_MM:
return ctx->header.heightMM;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return (GLfloat)0;
}
}
GLfloat* glsGetHeaderfv(GLSenum inAttrib, GLfloat *outVec) {
__GLScontext *const ctx = __GLS_CONTEXT;
GLint i;
if (!__glsRequireContext()) return GLS_NONE;
switch (inAttrib) {
case GLS_BORDER_COLOR:
for (i = 0 ; i < 4 ; ++i) outVec[i] = ctx->header.borderColor[i];
return outVec;
case GLS_GAMMA:
for (i = 0 ; i < 4 ; ++i) outVec[i] = ctx->header.gamma[i];
return outVec;
case GLS_ORIGIN:
for (i = 0 ; i < 2 ; ++i) outVec[i] = ctx->header.origin[i];
return outVec;
case GLS_PAGE_COLOR:
for (i = 0 ; i < 4 ; ++i) outVec[i] = ctx->header.pageColor[i];
return outVec;
case GLS_PAGE_SIZE:
for (i = 0 ; i < 2 ; ++i) outVec[i] = ctx->header.pageSize[i];
return outVec;
case GLS_RED_POINT:
for (i = 0 ; i < 2 ; ++i) outVec[i] = ctx->header.redPoint[i];
return outVec;
case GLS_GREEN_POINT:
for (i = 0 ; i < 2 ; ++i) outVec[i] = ctx->header.greenPoint[i];
return outVec;
case GLS_BLUE_POINT:
for (i = 0 ; i < 2 ; ++i) outVec[i] = ctx->header.bluePoint[i];
return outVec;
case GLS_WHITE_POINT:
for (i = 0 ; i < 2 ; ++i) outVec[i] = ctx->header.whitePoint[i];
return outVec;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return GLS_NONE;
}
}
GLint glsGetHeaderi(GLSenum inAttrib) {
__GLScontext *const ctx = __GLS_CONTEXT;
if (!__glsRequireContext()) return 0;
switch (inAttrib) {
case GLS_FRAME_COUNT:
return ctx->header.frameCount;
case GLS_GLRC_COUNT:
return ctx->header.glrcCount;
case GLS_HEIGHT_PIXELS:
return ctx->header.heightPixels;
case GLS_LAYER_COUNT:
return ctx->header.layerCount;
case GLS_TILEABLE:
return ctx->header.tileable;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return 0;
}
}
GLint* glsGetHeaderiv(GLSenum inAttrib, GLint *outVec) {
__GLScontext *const ctx = __GLS_CONTEXT;
GLint i;
if (!__glsRequireContext()) return GLS_NONE;
switch (inAttrib) {
case GLS_CREATE_TIME:
for (i = 0 ; i < 6 ; ++i) outVec[i] = ctx->header.createTime[i];
return outVec;
case GLS_MODIFY_TIME:
for (i = 0 ; i < 6 ; ++i) outVec[i] = ctx->header.modifyTime[i];
return outVec;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return GLS_NONE;
}
}
const GLubyte* glsGetHeaderubz(GLSenum inAttrib) {
__GLScontext *const ctx = __GLS_CONTEXT;
GLubyte *outStr;
if (!__glsRequireContext()) return GLS_NONE;
switch (inAttrib) {
case GLS_EXTENSIONS:
outStr = ctx->header.extensions.head;
break;
case GLS_AUTHOR:
outStr = ctx->header.author.head;
break;
case GLS_DESCRIPTION:
outStr = ctx->header.description.head;
break;
case GLS_NOTES:
outStr = ctx->header.notes.head;
break;
case GLS_TITLE:
outStr = ctx->header.title.head;
break;
case GLS_TOOLS:
outStr = ctx->header.tools.head;
break;
case GLS_VERSION:
outStr = ctx->header.version.head;
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return GLS_NONE;
}
return (
__glsString_assign(&ctx->returnString, outStr) ?
ctx->returnString.head :
GLS_NONE
);
}
GLfloat glsGetLayerf(GLuint inLayer, GLSenum inAttrib) {
__GLScontext *const ctx = __GLS_CONTEXT;
__GLSlayer *layer;
if (!__glsRequireContext()) return (GLfloat)0;
if (!inLayer || inLayer > (GLuint)ctx->header.layerCount) {
__GLS_RAISE_ERROR(GLS_INVALID_VALUE);
return (GLfloat)0;
}
layer = ctx->header.layers + inLayer - 1;
switch (inAttrib) {
case GLS_INVISIBLE_ASPECT:
return layer->invisibleAspect;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return (GLfloat)0;
}
}
GLint glsGetLayeri(GLuint inLayer, GLSenum inAttrib) {
__GLScontext *const ctx = __GLS_CONTEXT;
__GLSlayer *layer;
if (!__glsRequireContext()) return 0;
if (!inLayer || inLayer > (GLuint)ctx->header.layerCount) {
__GLS_RAISE_ERROR(GLS_INVALID_VALUE);
return 0;
}
layer = ctx->header.layers + inLayer - 1;
switch (inAttrib) {
case GLS_DISPLAY_FORMAT:
return (GLint)layer->displayFormat;
case GLS_DOUBLEBUFFER:
return layer->doubleBuffer;
case GLS_INVISIBLE:
return layer->invisible;
case GLS_INVISIBLE_HEIGHT_PIXELS:
return layer->invisibleHeightPixels;
case GLS_LEVEL:
return layer->level;
case GLS_STEREO:
return layer->stereo;
case GLS_TRANSPARENT:
return layer->transparent;
case GLS_INDEX_BITS:
return layer->indexBits;
case GLS_RED_BITS:
return layer->redBits;
case GLS_GREEN_BITS:
return layer->greenBits;
case GLS_BLUE_BITS:
return layer->blueBits;
case GLS_ALPHA_BITS:
return layer->alphaBits;
case GLS_DEPTH_BITS:
return layer->depthBits;
case GLS_STENCIL_BITS:
return layer->stencilBits;
case GLS_ACCUM_RED_BITS:
return layer->accumRedBits;
case GLS_ACCUM_GREEN_BITS:
return layer->accumGreenBits;
case GLS_ACCUM_BLUE_BITS:
return layer->accumBlueBits;
case GLS_ACCUM_ALPHA_BITS:
return layer->accumAlphaBits;
case GLS_AUX_BUFFERS:
return layer->auxBuffers;
#if __GL_SGIS_multisample
case GLS_SAMPLE_BUFFERS_SGIS:
return layer->sampleBuffers;
case GLS_SAMPLES_SGIS:
return layer->samples;
#endif /* __GL_SGIS_multisample */
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
return 0;
}
}
GLbitfield glsGetStreamAttrib(const GLubyte *inName) {
if (!__glsRequireContext()) return GL_FALSE;
if (!__glsValidateString(inName)) return GL_FALSE;
if (__glsStr2PtrDict_find(__GLS_CONTEXT->contextStreamDict, inName)) {
return (
GLS_STREAM_CONTEXT_BIT |
GLS_STREAM_NAMED_BIT |
GLS_STREAM_READABLE_BIT |
GLS_STREAM_WRITABLE_BIT |
GLS_STREAM_SEEKABLE_BIT
);
} else {
GLbitfield outVal = GLS_NONE;
__GLSreadStream *const readStream = __glsReadStream_create(inName);
if (readStream) {
outVal = __glsReadStream_getAttrib(readStream);
__glsReadStream_destroy(readStream);
}
return outVal;
}
}
GLuint glsGetStreamCRC32(const GLubyte *inName) {
__GLScontextStream *contextStream;
__GLSreadStream *readStream;
if (!__glsRequireContext()) return 0;
if (!__glsValidateString(inName)) return 0;
glsFlush(GLS_ALL);
if (
contextStream =
__glsStr2PtrDict_find(__GLS_CONTEXT->contextStreamDict, inName)
) {
return __glsContextStream_getCRC32(contextStream);
} else if (readStream = __glsReadStream_create(inName)) {
const GLuint outVal = __glsReadStream_getCRC32(readStream);
__glsReadStream_destroy(readStream);
return outVal;
} else {
__GLS_RAISE_ERROR(GLS_NOT_FOUND);
return 0;
}
}
const GLubyte* glsGetStreamReadName(const GLubyte *inName) {
__GLScontext *const ctx = __GLS_CONTEXT;
__GLScontextStream *contextStream;
__GLSreadStream *readStream;
GLboolean ok;
if (!__glsRequireContext()) return GLS_NONE;
if (!__glsValidateString(inName)) return GLS_NONE;
if (
contextStream =
__glsStr2PtrDict_find(ctx->contextStreamDict, inName)
) {
ok = __glsString_assign(&ctx->returnString, contextStream->name.head);
} else if (readStream = __glsReadStream_create(inName)) {
ok = __glsString_assign(&ctx->returnString, readStream->name.head);
__glsReadStream_destroy(readStream);
} else {
__GLS_RAISE_ERROR(GLS_NOT_FOUND);
return GLS_NONE;
}
return ok ? ctx->returnString.head : GLS_NONE;
}
size_t glsGetStreamSize(const GLubyte *inName) {
__GLScontextStream *contextStream;
__GLSreadStream *readStream;
if (!__glsRequireContext()) return 0;
if (!__glsValidateString(inName)) return 0;
glsFlush(GLS_ALL);
if (
contextStream =
__glsStr2PtrDict_find(__GLS_CONTEXT->contextStreamDict, inName)
) {
return __glsContextStream_getByteCount(contextStream);
} else if (readStream = __glsReadStream_create(inName)) {
const size_t outVal = __glsReadStream_getByteCount(readStream);
__glsReadStream_destroy(readStream);
return outVal;
} else {
__GLS_RAISE_ERROR(GLS_NOT_FOUND);
return 0;
}
}
GLSenum glsGetStreamType(const GLubyte *inName) {
__GLSreadStream *readStream;
if (!__glsRequireContext()) return GLS_NONE;
if (!__glsValidateString(inName)) return GLS_NONE;
if (__glsStr2PtrDict_find(__GLS_CONTEXT->contextStreamDict, inName)) {
return GLS_CONTEXT;
} else if (readStream = __glsReadStream_create(inName)) {
const GLSenum outVal = __glsReadStream_getType(readStream);
__glsReadStream_destroy(readStream);
return outVal;
} else {
__GLS_RAISE_ERROR(GLS_NOT_FOUND);
return GLS_NONE;
}
}
GLboolean glsIsContextStream(const GLubyte *inName) {
if (!__glsRequireContext()) return GL_FALSE;
if (!__glsValidateString(inName)) return GL_FALSE;
return (GLboolean)(
__glsStr2PtrDict_find(__GLS_CONTEXT->contextStreamDict, inName) !=
GLS_NONE
);
}
void glsPixelSetupGen(GLboolean inEnabled) {
__GLS_CONTEXT->pixelSetupGen = (GLboolean)(inEnabled ? GL_TRUE : GL_FALSE);
}
void glsReadFunc(GLSreadFunc inFunc) {
if (!__glsRequireContext()) return;
__GLS_CONTEXT->readFunc = inFunc;
}
void glsReadPrefix(GLSenum inListOp, const GLubyte *inPrefix) {
__GLScontext *const ctx = __GLS_CONTEXT;
__GLSlistString *prefix;
if (!__glsRequireContext()) return;
if (!__glsValidateString(inPrefix)) return;
switch (inListOp) {
case GLS_APPEND:
if (prefix = __glsListString_create(inPrefix)) {
__GLS_ITERLIST_APPEND(&ctx->readPrefixList, prefix);
}
break;
case GLS_PREPEND:
if (prefix = __glsListString_create(inPrefix)) {
__GLS_ITERLIST_PREPEND(&ctx->readPrefixList, prefix);
}
break;
default:
__GLS_RAISE_ERROR(GLS_INVALID_ENUM);
break;
}
}
void glsUnreadFunc(GLSwriteFunc inFunc) {
if (!__glsRequireContext()) return;
__GLS_CONTEXT->unreadFunc = inFunc;
}
void glsWriteFunc(GLSwriteFunc inFunc) {
if (!__glsRequireContext()) return;
__GLS_CONTEXT->writeFunc = inFunc;
}
void glsWritePrefix(const GLubyte *inPrefix) {
if (!__glsRequireContext()) return;
if (!__glsValidateString(inPrefix)) return;
__glsString_assign(&__GLS_CONTEXT->writePrefix->val, inPrefix);
}