View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0003255 | The Dark Mod | Graphics | public | 19.10.2012 10:34 | 28.04.2014 20:08 |
Reporter | grayman | Assigned To | taaaki | ||
Priority | normal | Severity | normal | Reproducibility | always |
Status | resolved | Resolution | fixed | ||
Product Version | TDM 1.08 | ||||
Summary | 0003255: Savegame images are written wrong at high resolutions | ||||
Description | At high screen resolutions, the savegame images are skewed to the right. See this thread: http://forums.thedarkmod.com/topic/14198-108-savegame-pics-skewed/page__view__findpost__p__298023 | ||||
Tags | No tags attached. | ||||
Attached Files | 3255.patch (1,702 bytes)
Index: renderer/RenderSystem.cpp =================================================================== --- renderer/RenderSystem.cpp (revision 5859) +++ renderer/RenderSystem.cpp (working copy) @@ -965,19 +965,30 @@ void idRenderSystemLocal::CaptureRenderToFile( const char *fileName, bool fixAlp qglReadBuffer( GL_BACK ); - // include extra space for OpenGL padding to word boundaries - int c = ( rc->width + 3 ) * rc->height; - byte *data = (byte *)R_StaticAlloc( c * 3 ); + // calculate pitch of buffer that will be returned by qglReadPixels() + int alignment; + glGetIntegerv(GL_PACK_ALIGNMENT, &alignment); + + int pitch = rc->width * 4 + alignment - 1; + pitch = pitch - pitch % alignment; + + byte *data = (byte *)R_StaticAlloc( pitch * rc->height ); - qglReadPixels( rc->x, rc->y, rc->width, rc->height, GL_RGB, GL_UNSIGNED_BYTE, data ); + // GL_RGBA/GL_UNSIGNED_BYTE seems to be the safest option + qglReadPixels( rc->x, rc->y, rc->width, rc->height, GL_RGBA, GL_UNSIGNED_BYTE, data ); - byte *data2 = (byte *)R_StaticAlloc( c * 4 ); + byte *data2 = (byte *)R_StaticAlloc( rc->width * rc->height * 4 ); - for ( int i = 0 ; i < c ; i++ ) { - data2[ i * 4 ] = data[ i * 3 ]; - data2[ i * 4 + 1 ] = data[ i * 3 + 1 ]; - data2[ i * 4 + 2 ] = data[ i * 3 + 2 ]; - data2[ i * 4 + 3 ] = 0xff; + for ( int y = 0 ; y < rc->height ; y++ ) { + for ( int x = 0 ; x < rc->width ; x++ ) { + int idx = y * pitch + x * 4; + int idx2 = (y * rc->width + x) * 4; + + data2[ idx2 + 0 ] = data[ idx + 0 ]; + data2[ idx2 + 1 ] = data[ idx + 1 ]; + data2[ idx2 + 2 ] = data[ idx + 2 ]; + data2[ idx2 + 3 ] = 0xff; + } } R_WriteTGA( fileName, data2, rc->width, rc->height, true ); | ||||
This is a trivial bug in idRenderSystemLocal::CaptureRenderToFile(). This function does not properly handle pitch of buffer returned from glReadPixels(). I'll try and prepare a patch for it. |
|
I've prepared a patch. Unfortunately calculating proper pitch was not enough. On my graphics card (ATI Radeon HD 5700, Catalyst 12.10) artifacts appeared (white line on 3255.png). Changing pixel format from GL_RGB to GL_RGBA fixed the problem. GL_RGBA should work universally. |
|
Since this issue isn't in the list of things targeted for a fix in 2.00, I posted a question on the 2.00 test thread about whether to add it or have it wait for 2.01. Awaiting comments. Thanks for looking at this. |
|
Zbyl's patch applied in src revision 5912. Tested on both Windows and Linux and it appears to work for 16:9 setups. Thanks Zbyl :) |
|
Going to assume that this has been resolved for everyone. | |
Date Modified | Username | Field | Change |
---|---|---|---|
19.10.2012 10:34 | grayman | New Issue | |
23.07.2013 20:30 | grayman | Relationship added | has duplicate 0003460 |
17.08.2013 15:15 | Zbyl | Note Added: 0006034 | |
18.08.2013 15:40 | Zbyl | File Added: 3255.patch | |
18.08.2013 15:49 | Zbyl | File Added: 3255.png | |
18.08.2013 15:50 | Zbyl | Note Added: 0006046 | |
18.08.2013 16:38 | grayman | Note Added: 0006049 | |
01.12.2013 17:05 | taaaki | Note Added: 0006303 | |
01.12.2013 17:05 | taaaki | Assigned To | => taaaki |
01.12.2013 17:05 | taaaki | Status | new => feedback |
28.04.2014 20:08 | taaaki | Note Added: 0006571 | |
28.04.2014 20:08 | taaaki | Status | feedback => resolved |
28.04.2014 20:08 | taaaki | Resolution | open => fixed |