Opened 12 years ago

Closed 12 years ago

#155 closed defect (fixed)

ps.map: the "M" highlight problem

Reported by: perk Owned by: hamish
Priority: minor Milestone: 6.4.0
Component: Default Version: svn-trunk
Keywords: ps.map highlight text labels Cc: grass-dev@…
CPU: Unspecified Platform: Unspecified

Description

Using any highlight on text and labels produces some very bad looking results. I call this the "M" problem, because I first noticed it in labels with a capital M, but other letters are affected too. I've attached a sample that pretty clearly shows the problem.

I see two pretty easy ways to fix this: temporarily change (1) the miter length or (2) the line join style when the highlight path gets stroked. I've chosen the latter, because I think it looks better. I've attached a patch for ps/ps.map/prolog.ps. It is marked as a binary file for some reason, so I was not able to do "svn diff". I've also attached the same ps.map output sample made after the fix.

Attachments (3)

the-M-problem-original.png (3.8 KB) - added by perk 12 years ago.
A sample ps.map output showing the highlight problem.
the-M-problem-fixed.png (3.7 KB) - added by perk 12 years ago.
Sample ps.map output after fix.
the-M-problem.diff (617 bytes) - added by perk 12 years ago.
The patch to ps/ps.map/prolog.ps

Download all attachments as: .zip

Change History (10)

Changed 12 years ago by perk

Attachment: the-M-problem-original.png added

A sample ps.map output showing the highlight problem.

Changed 12 years ago by perk

Attachment: the-M-problem-fixed.png added

Sample ps.map output after fix.

comment:1 Changed 12 years ago by perk

Keywords: text labels added

comment:2 Changed 12 years ago by hamish

Cc: grass-dev@… added
Owner: changed from grass-dev@… to hamish
Status: newassigned

nice to finally see a solution for this, thanks.

before applying the patch I would like to ask about possible side effects -- does the "currentlinejoin 1 setlinejoin stroke setlinejoin" part need to be swiched off after drawing the labels, or will it be self contained?

could a similar technique be used to connect .eps pattern tiles? eg broken lines: http://grass.osgeo.org/wiki/Psmap_flooding_example

you might also see that d.labels does not do very well with larger values for the highlight width. In that case I guess the solution is to also smear the color using the "knight's move" or similar, not just the 8 cardinal+ordinal directions.

I've attached a patch for ps/ps.map/prolog.ps. It is marked as a binary file for some reason, so I was not able to do "svn diff".

$ svn proplist prolog.ps 
Properties on 'prolog.ps':
  svn:mime-type
$ svn propget svn:mime-type prolog.ps 
application/postscript
$ svn diff prolog.ps 
Index: prolog.ps
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/postscript

svn bug? (PostScript? is ASCII)

fwiw, trac does nice markup when you click on the .diff file.

Hamish

comment:3 Changed 12 years ago by hamish

spearfish example:

v.label map=fields labels=lfields column=label fontsize=12 hcolor=aqua hwidth=10

g.region n=4928430 s=4923300 w=602400 e=610740 res=30

ps.map out=test.ps << EOF
labels lfields
  end
end
EOF

comment:4 in reply to:  2 ; Changed 12 years ago by perk

Hamish,

Replying to hamish:

nice to finally see a solution for this, thanks.

Glad I could help.

before applying the patch I would like to ask about possible side effects -- does the "currentlinejoin 1 setlinejoin stroke setlinejoin" part need to be swiched off after drawing the labels, or will it be self contained?

This should be self-contained. "currentlinejoin" puts the current line join style on the Postcript stack, "1 setlinejoin" sets the join style to rounded, "stroke" draws the current path (does not affect the stack), and the final "setlinejoin" uses the value put on the stack earlier to return the join style to the previous value.

could a similar technique be used to connect .eps pattern tiles? eg broken lines: http://grass.osgeo.org/wiki/Psmap_flooding_example

I'll look into this.

you might also see that d.labels does not do very well with larger values for the highlight width. In that case I guess the solution is to also smear the color using the "knight's move" or similar, not just the 8 cardinal+ordinal directions.

I've attached a patch for ps/ps.map/prolog.ps. It is marked as a binary file for some reason, so I was not able to do "svn diff".

$ svn proplist prolog.ps 
Properties on 'prolog.ps':
  svn:mime-type
$ svn propget svn:mime-type prolog.ps 
application/postscript
$ svn diff prolog.ps 
Index: prolog.ps
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/postscript

svn bug? (PostScript? is ASCII)

Is SVN like CVS in that you have to mark a file as binary? In CVS, you use the command "cvs admin -kb" to mark a file as binary, so that it won't mess with the contents by changing line end characters or do keyword substitution.

fwiw, trac does nice markup when you click on the .diff file.

Yea, it's pretty cool.

Bill

comment:5 in reply to:  4 ; Changed 12 years ago by glynn

Replying to perk:

before applying the patch I would like to ask about possible side effects -- does the "currentlinejoin 1 setlinejoin stroke setlinejoin" part need to be swiched off after drawing the labels, or will it be self contained?

This should be self-contained. "currentlinejoin" puts the current line join style on the Postcript stack, "1 setlinejoin" sets the join style to rounded, "stroke" draws the current path (does not affect the stack), and the final "setlinejoin" uses the value put on the stack earlier to return the join style to the previous value.

The normal way to make temporary changes to the rendering state is with gsave/grestore, e.g.:

gsave 1 setlinejoin stroke grestore

Changed 12 years ago by perk

Attachment: the-M-problem.diff added

The patch to ps/ps.map/prolog.ps

comment:6 in reply to:  5 Changed 12 years ago by perk

Replying to glynn:

Replying to perk:

before applying the patch I would like to ask about possible side effects -- does the "currentlinejoin 1 setlinejoin stroke setlinejoin" part need to be swiched off after drawing the labels, or will it be self contained?

This should be self-contained. "currentlinejoin" puts the current line join style on the Postcript stack, "1 setlinejoin" sets the join style to rounded, "stroke" draws the current path (does not affect the stack), and the final "setlinejoin" uses the value put on the stack earlier to return the join style to the previous value.

The normal way to make temporary changes to the rendering state is with gsave/grestore, e.g.:

gsave 1 setlinejoin stroke grestore

Works for me. The patch is updated.

Bill

comment:7 Changed 12 years ago by hamish

Resolution: fixed
Status: assignedclosed

Hi,

thanks, applied in SVN relbr6 + trunk.

In SVN you do not have to mark a binary file as binary to avoid unwanted newline translation. But you do set file properties, be they an executable bit or a mime-type. In this case the mime type is set for a postscript file, but SVN is misconfigured to think that those are binary files when they are not.

more on svn propset:

http://trac.osgeo.org/grass/wiki/HowToSVN#Fileproperties

thanks again, Hamish

Note: See TracTickets for help on using tickets.