void debug_dump_float_rgba_bmp(const char *filename, unsigned width, unsigned height, float *rgba, unsigned stride) { #ifndef PIPE_SUBSYSTEM_WINDOWS_MINIPORT struct os_stream *stream; struct bmp_file_header bmfh; struct bmp_info_header bmih; unsigned x, y; if(!rgba) goto error1; bmfh.bfType = 0x4d42; bmfh.bfSize = 14 + 40 + height*width*4; bmfh.bfReserved1 = 0; bmfh.bfReserved2 = 0; bmfh.bfOffBits = 14 + 40; bmih.biSize = 40; bmih.biWidth = width; bmih.biHeight = height; bmih.biPlanes = 1; bmih.biBitCount = 32; bmih.biCompression = 0; bmih.biSizeImage = height*width*4; bmih.biXPelsPerMeter = 0; bmih.biYPelsPerMeter = 0; bmih.biClrUsed = 0; bmih.biClrImportant = 0; stream = os_file_stream_create(filename); if(!stream) goto error1; os_stream_write(stream, &bmfh, 14); os_stream_write(stream, &bmih, 40); y = height; while(y--) { float *ptr = rgba + (stride * y * 4); for(x = 0; x < width; ++x) { struct bmp_rgb_quad pixel; pixel.rgbRed = float_to_ubyte(ptr[x*4 + 0]); pixel.rgbGreen = float_to_ubyte(ptr[x*4 + 1]); pixel.rgbBlue = float_to_ubyte(ptr[x*4 + 2]); pixel.rgbAlpha = 255; os_stream_write(stream, &pixel, 4); } } os_stream_close(stream); error1: ; #endif }
static void trace_dump_trace_close(void) { if(stream) { trace_dump_writes("</trace>\n"); os_stream_close(stream); stream = NULL; refcount = 0; call_no = 0; } }