View Issue Details

IDProjectCategoryView StatusLast Update
0003255The Dark ModGraphicspublic28.04.2014 20:08
Reportergrayman Assigned Totaaaki  
PrioritynormalSeveritynormalReproducibilityalways
Status resolvedResolutionfixed 
Product VersionTDM 1.08 
Summary0003255: Savegame images are written wrong at high resolutions
DescriptionAt 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
TagsNo tags attached.

Relationships

has duplicate 0003460 resolvedtaaaki Savegame thumbnails are skewed 

Activities

Zbyl

Zbyl

17.08.2013 15:15

reporter   ~0006034

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.
Zbyl

Zbyl

18.08.2013 15:40

reporter  

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 );
3255.patch (1,702 bytes)   
Zbyl

Zbyl

18.08.2013 15:49

reporter  

3255.png (136,153 bytes)   
3255.png (136,153 bytes)   
Zbyl

Zbyl

18.08.2013 15:50

reporter   ~0006046

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.
grayman

grayman

18.08.2013 16:38

viewer   ~0006049

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.
taaaki

taaaki

01.12.2013 17:05

administrator   ~0006303

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 :)
taaaki

taaaki

28.04.2014 20:08

administrator   ~0006571

Going to assume that this has been resolved for everyone.

Issue History

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