[Mapserver-dev] Labels that follow streets with bends

woodbri at swoodbridge.com woodbri at swoodbridge.com
Mon Feb 10 22:26:28 EST 2003

On 10 Feb 2003 at 16:50, Steve Lime wrote:

> So MapServer actually takes metrics from unrotated labels and then
> rotates them internally so that bounding polygons are tight to the
> label. 

How do you do that? Store x,y,h,w,ang instead of the *brect

> Your function is
> going to have to produce more detailed information it gives back. Even
> bounding rects for each rotated character would be workable (i.e. turn
> int *brect into int **brect).  

OK, this is no problem. Do we want to assume there are strlen(string) 
entries in **brect, alternatively the array *brect could be 
terminated with a null pointer which would make freeing it 
independent of remembering strlen(string). I am prefer the later, but 
what makes the most sense for mapserver?

> You first have to produce a placement
> without drawing and then evaluate that placement against the cache.

Yup, this was my plan, you pass in NULL for the image pointer and I 
don't do the drawing only return **brect

On memory allocation, I assume I should alloc the memory and return a 
pointer to in brect.

> That will be more expensive in this case.

Yup, that is why I'm thinking about a phase two redesign, but figure 
it is best to get it working before trying to optimize it.

> Does this help/make sense?

Yes. See questions above.

-Steve W.

> Steve
> >>> <woodbri at swoodbridge.com> 02/09/03 10:56AM >>>
> Hi all,
> There has been some some discussion of have street labels follow bends
> in the streets in the past. I have decided to take a pass at
> implementing a routine to do this.
> Here are my initial thoughts on this. I am looking for comments and
> feedback.
> My plan is to implement a function like this:
> bchar *TextPath(
>     gdImagePtr im,
>     int *brect,
>     int fg,
>     char *fontname,
>     double ptsize,
>     int npts,
>     int *X,
>     int *Y,
>     char *string,
>     int flags);
> most of these args are identical to the gdImageStingFT() call and this
> function would work similarly to it if you pass it NULL for im. The
> polyline would be passed in using the npts, X, Y args; and flags I
> envision would be used to control the behavior of the function with
> respect to NO_PARTIAL  - fail is polyline is too short to render the
> whole string TRUNCATE  - trucate the string if it is too long EXTEND -
> virtually extend the last segment to write the whole string REVERSE -
> the direction of the polyline AUTO - figure out the best placement of
> the text so it is most readable ABOVE|BELOW|CENTER the text on the
> polyline
> My first pass at this will be straight forward if not brute force. I
> will take each char in the string and see if I have enough room to
> place it on the segment, if not place it on the next segment until I
> run out of chars or segments. I will also probably ignore most of the
> flags and implement it as flags = EXTEND|AUTO; I plan to write the
> function to just call gdImageStringFTEx() to do the work, a later
> optimization might be to clone the gdImageStringFTEx() source so I can
> make some optimization.
> This implementation has the advantage for me that I can dev and test
> in a simplified GD only environment. On the down side real performance
> will not be as easily tested until it is integrated into mapserver.
> If I implement as described above will it be easy to integrate into
> mapserver? Issues? concerns?
> -Steve W.
> _______________________________________________
> Mapserver-dev mailing list
> Mapserver-dev at lists.gis.umn.edu 
> http://lists.gis.umn.edu/mailman/listinfo/mapserver-dev
> _______________________________________________
> Mapserver-dev mailing list
> Mapserver-dev at lists.gis.umn.edu
> http://lists.gis.umn.edu/mailman/listinfo/mapserver-dev

More information about the mapserver-dev mailing list