Commit 593d2989 authored by Mark Steele's avatar Mark Steele
Browse files

b=517717; fix up webgl impl array args, accept Canvas*Arrays as valid params; r=vlad

parent 56b5a74b
Loading
Loading
Loading
Loading
+132 −73
Original line number Diff line number Diff line
@@ -2407,13 +2407,11 @@ WebGLContext::name(GLint idx, nsIWebGLArray *v) \
    NativeJSContext js;                                                           \
    if (NS_FAILED(js.error))                                                      \
        return js.error;                                                          \
    jsuint index;                                                       \
    JSObject *arrayObj;                                                           \
    jsuint arrayLen;                                                              \
    if (js.argc != 2 ||                                                 \
        !::JS_ValueToECMAUint32(js.ctx, js.argv[0], &index) ||          \
        !NativeJSContext::JSValToJSArrayAndLength(js.ctx, js.argv[1], &arrayObj, &arrayLen)) \
    if (js.argc != 2)                                                             \
        return NS_ERROR_INVALID_ARG;                                              \
    if (NativeJSContext::JSValToJSArrayAndLength(js.ctx, js.argv[1], &arrayObj, &arrayLen)) { \
        if (arrayLen % c != 0) {                                                  \
            return ErrorMessage(#name ": array length not divisible by " #c);     \
        }                                                                         \
@@ -2421,7 +2419,32 @@ WebGLContext::name(GLint idx, nsIWebGLArray *v) \
        if (!sbuffer.Valid())                                                     \
            return NS_ERROR_FAILURE;                                              \
        MakeContextCurrent();                                                     \
    gl->f##glname(index, arrayLen / c, ( ptrType *)sbuffer.data);       \
        gl->f##glname(idx, arrayLen / c, ( ptrType *)sbuffer.data);               \
    } else {                                                                      \
        if (glTypeConst == LOCAL_GL_INT) {                                        \
            if (v->NativeType() != LOCAL_GL_INT) {                                \
                return ErrorMessage(#name ": arg not an array");                  \
            }                                                                     \
            WebGLIntArray *wga = static_cast<WebGLIntArray*>(v);                  \
            if (wga->NativeCount() % c != 0) {                                    \
                return ErrorMessage(#name ": array length not divisible by " #c); \
            }                                                                     \
            MakeContextCurrent();                                                 \
            gl->f##glname(idx, wga->NativeCount() / c, ( ptrType *)wga->NativePointer()); \
        } else if (glTypeConst == LOCAL_GL_FLOAT) {                               \
            if (v->NativeType() != LOCAL_GL_FLOAT) {                              \
                return ErrorMessage(#name ": arg not an array");                  \
            }                                                                     \
            WebGLFloatArray *wga = static_cast<WebGLFloatArray*>(v);              \
            if (wga->NativeCount() % c != 0) {                                    \
                return ErrorMessage(#name ": array length not divisible by " #c); \
            }                                                                     \
            MakeContextCurrent();                                                 \
            gl->f##glname(idx, wga->NativeCount() / c, ( ptrType *)wga->NativePointer()); \
        } else {                                                                  \
            return ErrorMessage("Unhandled glTypeConst"); /* need compiler fail */\
        }                                                                         \
    }                                                                             \
    return NS_OK;                                                                 \
}

@@ -2432,21 +2455,44 @@ WebGLContext::name(GLuint idx, nsIWebGLArray *v) \
    NativeJSContext js;                                                           \
    if (NS_FAILED(js.error))                                                      \
        return js.error;                                                          \
    jsuint index;                                                       \
    JSObject *arrayObj;                                                           \
    jsuint arrayLen;                                                              \
    if (js.argc != 2 ||                                                 \
        !::JS_ValueToECMAUint32(js.ctx, js.argv[0], &index) ||          \
        !NativeJSContext::JSValToJSArrayAndLength(js.ctx, js.argv[1], &arrayObj, &arrayLen)) \
    if (js.argc != 2)                                                             \
        return NS_ERROR_INVALID_ARG;                                              \
    if (arrayLen != c) {                                                \
    if (NativeJSContext::JSValToJSArrayAndLength(js.ctx, js.argv[1], &arrayObj, &arrayLen)) { \
        if (arrayLen % c != 0) {                                                  \
            return ErrorMessage(#name ": array wrong size, expected " #c);        \
        }                                                                         \
        SimpleBuffer sbuffer(glTypeConst, c, js.ctx, arrayObj, arrayLen);         \
        if (!sbuffer.Valid())                                                     \
            return NS_ERROR_FAILURE;                                              \
        MakeContextCurrent();                                                     \
    gl->f##glname(index, ( ptrType *)sbuffer.data);                     \
        gl->f##glname(idx, ( ptrType *)sbuffer.data);                             \
    } else {                                                                      \
        if (glTypeConst == LOCAL_GL_INT) {                                        \
            if (v->NativeType() != LOCAL_GL_INT) {                                \
                return ErrorMessage(#name ": arg not an array");                  \
            }                                                                     \
            WebGLIntArray *wga = static_cast<WebGLIntArray*>(v);                  \
            if (wga->NativeCount() % c != 0) {                                    \
                return ErrorMessage(#name ": array wrong size %d, expected " #c, wga->NativeCount()); \
            }                                                                     \
            MakeContextCurrent();                                                 \
            gl->f##glname(idx, ( ptrType *)wga->NativePointer());                 \
        } else if (glTypeConst == LOCAL_GL_FLOAT) {                               \
            if (v->NativeType() != LOCAL_GL_FLOAT) {                              \
                return ErrorMessage(#name ": arg not an array");                  \
            }                                                                     \
            WebGLFloatArray *wga = static_cast<WebGLFloatArray*>(v);              \
            if (wga->NativeCount() % c != 0) {                                    \
                return ErrorMessage(#name ": array wrong size %d, expected " #c, wga->NativeCount()); \
            }                                                                     \
            MakeContextCurrent();                                                 \
            gl->f##glname(idx, ( ptrType *)wga->NativePointer());                 \
        } else {                                                                  \
            return ErrorMessage("Unhandled glTypeConst"); /* need compiler fail */\
        }                                                                         \
    }                                                                             \
    return NS_OK;                                                                 \
}

@@ -2457,21 +2503,34 @@ WebGLContext::name(GLint location, GLboolean transpose, nsIWebGLArray *value)
    NativeJSContext js;                                                           \
    if (NS_FAILED(js.error))                                                      \
        return js.error;                                                          \
    jsuint index;                                                       \
    JSObject *arrayObj;                                                           \
    jsuint arrayLen;                                                              \
    if (js.argc != 3 ||                                                 \
        !::JS_ValueToECMAUint32(js.ctx, js.argv[0], &index) ||          \
        !NativeJSContext::JSValToJSArrayAndLength(js.ctx, js.argv[2], &arrayObj, &arrayLen)) \
    if (js.argc != 3)                                                             \
        return NS_ERROR_INVALID_ARG;                                              \
    if (arrayLen != c) {                                                \
    if (NativeJSContext::JSValToJSArrayAndLength(js.ctx, js.argv[2], &arrayObj, &arrayLen)) { \
        if (arrayLen % c != 0) {                                                  \
            return ErrorMessage(#name ": array wrong size, expected " #c);        \
        }                                                                         \
        SimpleBuffer sbuffer(glTypeConst, c, js.ctx, arrayObj, arrayLen);         \
        if (!sbuffer.Valid())                                                     \
            return NS_ERROR_FAILURE;                                              \
        MakeContextCurrent();                                                     \
    gl->f##glname(index, arrayLen / c, transpose, ( ptrType *)sbuffer.data); \
        gl->f##glname(location, arrayLen / c, transpose, ( ptrType *)sbuffer.data); \
    } else {                                                                      \
        if (glTypeConst == LOCAL_GL_FLOAT) {                                      \
            if (value->NativeType() != LOCAL_GL_FLOAT) {                          \
                return ErrorMessage(#name ": arg not an array");                  \
            }                                                                     \
            WebGLFloatArray *wga = static_cast<WebGLFloatArray*>(value);          \
            if (wga->NativeCount() % c != 0) {                                    \
                return ErrorMessage(#name ": array wrong size %d, expected " #c, wga->NativeCount());     \
            }                                                                     \
            MakeContextCurrent();                                                 \
            gl->f##glname(location, wga->NativeCount() / c, transpose, ( ptrType *)wga->NativePointer()); \
        } else {                                                                  \
            return ErrorMessage("Unhandled glTypeConst"); /* need compiler fail */\
        }                                                                         \
    }                                                                             \
    return NS_OK;                                                                 \
}