X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=retrace%2Fglstate_images.cpp;h=e5e14517dc299e78d65fe69e98899961bc18cec2;hb=db82d4062fd73362be2ceb66068720cab2814a74;hp=9bae85bba4861d73de6ef4ec9e723c3508ecb5d8;hpb=f2fc2ecd062473ff03e25e61866001c2d777d156;p=apitrace diff --git a/retrace/glstate_images.cpp b/retrace/glstate_images.cpp index 9bae85b..e5e1451 100644 --- a/retrace/glstate_images.cpp +++ b/retrace/glstate_images.cpp @@ -88,6 +88,31 @@ struct ImageDesc }; +/** + * Sames as enumToString, but with special provision to handle formatsLUMINANCE_ALPHA. + * + * OpenGL 2.1 specification states that "internalFormat may (for backwards + * compatibility with the 1.0 version of the GL) also take on the integer + * values 1, 2, 3, and 4, which are equivalent to symbolic constants LUMINANCE, + * LUMINANCE ALPHA, RGB, and RGBA respectively". + */ +const char * +formatToString(GLenum internalFormat) { + switch (internalFormat) { + case 1: + return "GL_LUMINANCE"; + case 2: + return "GL_LUMINANCE_ALPHA"; + case 3: + return "GL_RGB"; + case 4: + return "GL_RGBA"; + default: + return enumToString(internalFormat); + } +} + + /** * OpenGL ES does not support glGetTexLevelParameteriv, but it is possible to * probe whether a texture has a given size by crafting a dummy glTexSubImage() @@ -384,17 +409,17 @@ dumpActiveTextureLevel(JSONWriter &json, Context &context, GLenum target, GLint // Tell the GUI this is no ordinary object, but an image json.writeStringMember("__class__", "image"); - json.writeNumberMember("__width__", desc.width); - json.writeNumberMember("__height__", desc.height); - json.writeNumberMember("__depth__", desc.depth); + json.writeIntMember("__width__", desc.width); + json.writeIntMember("__height__", desc.height); + json.writeIntMember("__depth__", desc.depth); - json.writeStringMember("__format__", enumToString(desc.internalFormat)); + json.writeStringMember("__format__", formatToString(desc.internalFormat)); // Hardcoded for now, but we could chose types more adequate to the // texture internal format json.writeStringMember("__type__", "uint8"); json.writeBoolMember("__normalized__", true); - json.writeNumberMember("__channels__", channels); + json.writeIntMember("__channels__", channels); GLubyte *pixels = new GLubyte[desc.depth*desc.width*desc.height*channels]; @@ -411,7 +436,7 @@ dumpActiveTextureLevel(JSONWriter &json, Context &context, GLenum target, GLint json.beginMember("__data__"); char *pngBuffer; int pngBufferSize; - image::writePixelsToBuffer(pixels, desc.width, desc.height, channels, true, &pngBuffer, &pngBufferSize); + image::writePixelsToBuffer(pixels, desc.width, desc.depth * desc.height, channels, true, &pngBuffer, &pngBufferSize); json.writeBase64(pngBuffer, pngBufferSize); free(pngBuffer); json.endMember(); // __data__ @@ -834,17 +859,17 @@ dumpReadBufferImage(JSONWriter &json, GLint width, GLint height, GLenum format, // Tell the GUI this is no ordinary object, but an image json.writeStringMember("__class__", "image"); - json.writeNumberMember("__width__", width); - json.writeNumberMember("__height__", height); - json.writeNumberMember("__depth__", 1); + json.writeIntMember("__width__", width); + json.writeIntMember("__height__", height); + json.writeIntMember("__depth__", 1); - json.writeStringMember("__format__", enumToString(internalFormat)); + json.writeStringMember("__format__", formatToString(internalFormat)); // Hardcoded for now, but we could chose types more adequate to the // texture internal format json.writeStringMember("__type__", "uint8"); json.writeBoolMember("__normalized__", true); - json.writeNumberMember("__channels__", channels); + json.writeIntMember("__channels__", channels); GLenum type = GL_UNSIGNED_BYTE;