summaryrefslogtreecommitdiff
path: root/Xprint
diff options
context:
space:
mode:
authorRoland Mainz <roland.mainz@nrubsig.org>2005-04-13 00:05:37 +0000
committerRoland Mainz <roland.mainz@nrubsig.org>2005-04-13 00:05:37 +0000
commitddfa6f00da7c80b246b57c592361baa4bc5a8e9d (patch)
tree49728ff8a554f8887c39c3df6013c3a02dc80ed4 /Xprint
parentf45208a7e9c39345ac431c2e7da8777d6c466dcc (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>.
Diffstat (limited to 'Xprint')
-rw-r--r--Xprint/ps/psout.c73
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;
+ }
}
}