diff options
author | Roland Mainz <roland.mainz@nrubsig.org> | 2005-04-13 00:05:37 +0000 |
---|---|---|
committer | Roland Mainz <roland.mainz@nrubsig.org> | 2005-04-13 00:05:37 +0000 |
commit | ddfa6f00da7c80b246b57c592361baa4bc5a8e9d (patch) | |
tree | 49728ff8a554f8887c39c3df6013c3a02dc80ed4 | |
parent | f45208a7e9c39345ac431c2e7da8777d6c466dcc (diff) |
//bugs.freedesktop.org/show_bug.cgi?id=3001) attachment #2404
(https://bugs.freedesktop.org/attachment.cgi?id=2404) Improve rendering
performance when glXSwapBuffers()| or |XPutImage()| are called for the
PostScript DDX via optimizing the codepath around
|PsOut_OutImageBytes()|. Patch by Simon Toedt <simon.toedt@gmail.com>
and Roland Mainz <roland.mainz@nrubsig.org>.
-rw-r--r-- | Xprint/ps/psout.c | 73 |
1 files changed, 55 insertions, 18 deletions
diff --git a/Xprint/ps/psout.c b/Xprint/ps/psout.c index 0f5ed2e02..11d497571 100644 --- a/Xprint/ps/psout.c +++ b/Xprint/ps/psout.c @@ -309,16 +309,23 @@ static char *S_SetupDefs = "\ void S_Flush(PsOutPtr self) { - if( self->Buf[0] ) + int len; + + if( self->Buf[0] == '\0' ) + return; + + len = strlen(self->Buf); + + /* Append a newline char ('\n') if there isn't one there already */ + if( self->Buf[len-1] != '\n' ) { - if( self->Buf[strlen(self->Buf)-1]!='\n' ) strcat(self->Buf, "\n"); + self->Buf[len++] = '\n'; + self->Buf[len] = '\0'; + } - if (!ferror(self->Fp)) { - (void) fputs(self->Buf, self->Fp); - } + (void)fwrite(self->Buf, len, 1, self->Fp); - self->Buf[0] = '\0'; - } + self->Buf[0] = '\0'; } static void @@ -356,12 +363,23 @@ S_OutNum(PsOutPtr self, float num) { int i; char buf[64]; + int len; + sprintf(buf, "%.3f", num); + + /* Remove any zeros at the end */ for( i=strlen(buf)-1 ; buf[i]=='0' ; i-- ); buf[i+1] = '\0'; - if( buf[strlen(buf)-1]=='.' ) buf[strlen(buf)-1] = '\0'; - if( self->Buf[0] ) strcat(self->Buf, " "); - strcat(self->Buf, buf); - if( strlen(self->Buf)>70 ) S_Flush(self); + /* Remove '.' if it is the last character */ + i = strlen(buf)-1; if( buf[i]=='.' ) buf[i] = '\0'; + + len = strlen(self->Buf); + if( len > 0 ) + { + self->Buf[len++] = ' '; + self->Buf[len] = '\0'; + } + strcpy(&self->Buf[len], buf); + if( (len+i)>70 ) S_Flush(self); } static void @@ -416,8 +434,13 @@ S_OutStr16(PsOutPtr self, unsigned short *txt, int txtl) void S_OutTok(PsOutPtr self, char *tok, int cr) { - if( self->Buf[0] ) strcat(self->Buf, " "); - strcat(self->Buf, tok); + int len = strlen(self->Buf); + if( len > 0 ) + { + self->Buf[len++] = ' '; + self->Buf[len] = '\0'; + } + strcpy(&self->Buf[len], tok); if( cr ) S_Flush(self); } @@ -1475,15 +1498,29 @@ void PsOut_OutImageBytes(PsOutPtr self, int nBytes, char *bytes) { int i; - char buf[5]; + int b; + int len; + const char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; if( (!self->ImageFormat) || self->ImgSkip ) return; + + len = strlen(self->Buf); + for( i=0 ; i<nBytes ; i++ ) { - if( self->RevImage ) sprintf(buf, "%02x", (int)(bytes[i]^0xFF)&0xFF); - else sprintf(buf, "%02x", (int)bytes[i]&0xFF); - strcat(self->Buf, buf); - if( strlen(self->Buf)>70 ) S_Flush(self); + if( self->RevImage ) b = (int)((bytes[i]^0xFF)&0xFF); + else b = (int)(bytes[i]&0xFF); + + self->Buf[len++] = hex[(b&0xF0) >> 4]; + self->Buf[len++] = hex[(b&0x0F)]; + self->Buf[len] = '\0'; + + if( len>70 ) + { + S_Flush(self); + len = 0; + } } } |