~ubuntu-branches/ubuntu/jaunty/mapserver/jaunty-updates

« back to all changes in this revision

Viewing changes to mapscale.c

  • Committer: Bazaar Package Importer
  • Author(s): Fabio Tranchitella
  • Date: 2006-11-02 11:44:17 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20061102114417-pnutjb20kqzl23ua
Tags: 4.10.0-3
debian/control: build-depends on libpq-dev. (Closes: #396565)

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
 ******************************************************************************
28
28
 *
29
29
 * $Log: mapscale.c,v $
30
 
 * Revision 1.49.2.1  2006/03/27 05:50:52  sdlime
 
30
 * Revision 1.52  2006/08/26 22:04:13  novak
 
31
 * Enable support for TrueType fonts (bug 1882)
 
32
 *
 
33
 * Revision 1.51  2006/03/27 05:48:03  sdlime
31
34
 * Fixed symbol initialization error with embedded scalebars and legends. (bug 1725)
32
35
 *
 
36
 * Revision 1.50  2006/02/18 20:59:13  sdlime
 
37
 * Initial code for curved labels. (bug 1620)
 
38
 *
33
39
 * Revision 1.49  2005/09/27 15:27:18  sean
34
40
 * Fixed typo to prevent extra scalebar layer creation (bug 1480)
35
41
 *
52
58
 
53
59
#include "map.h"
54
60
 
55
 
MS_CVSID("$Id: mapscale.c,v 1.49.2.1 2006/03/27 05:50:52 sdlime Exp $")
 
61
MS_CVSID("$Id: mapscale.c,v 1.52 2006/08/26 22:04:13 novak Exp $")
56
62
 
57
63
#define VMARGIN 3 /* buffer around the scalebar */
58
64
#define HMARGIN 3
176
182
  int j;
177
183
  int isx, sx, sy, ox, oy, state, dsx;
178
184
  pointObj p;
179
 
  gdFontPtr fontPtr;
 
185
  gdFontPtr fontPtr = NULL;
180
186
  imageObj      *image = NULL;
181
187
  outputFormatObj *format = NULL;
 
188
  int iFreeGDFont = 0;
182
189
 
183
190
  if(map->units == -1) {
184
191
    msSetError(MS_MISCERR, "Map units not set.", "msDrawScalebar()");
185
192
    return(NULL);
186
193
  }
187
 
 
188
 
  fontPtr = msGetBitmapFont(map->scalebar.label.size);
 
194
/*
 
195
 *  Allow scalebars to use TrueType fonts for labels (jnovak@novacell.com)
 
196
 *
 
197
 *  A string containing the ten decimal digits is rendered to compute an average cell size 
 
198
 *  for each number, which is used later to place labels on the scalebar.
 
199
 */
 
200
  if( map->scalebar.label.type == MS_TRUETYPE )
 
201
  {
 
202
#ifdef USE_GD_FT
 
203
        int bbox[8];
 
204
    char *error = NULL;
 
205
    char *font  = NULL;
 
206
    char szTestString[] = "0123456789";
 
207
 
 
208
    fontPtr = (gdFontPtr) malloc( sizeof( gdFont ) );
 
209
 
 
210
        if(!fontPtr) {
 
211
      msSetError(MS_TTFERR, "fontPtr allocation failed.", "msDrawScalebar()");
 
212
      return(NULL);
 
213
    };
 
214
 
 
215
    if(! map->fontset.filename ) {
 
216
      msSetError(MS_TTFERR, "No fontset defined.", "msDrawScalebar()");
 
217
          free( fontPtr );
 
218
      return(NULL);
 
219
    }
 
220
 
 
221
    if(! map->scalebar.label.font) {
 
222
      msSetError(MS_TTFERR, "No TrueType font defined.", "msDrawScalebar()");
 
223
          free( fontPtr );
 
224
      return(NULL);
 
225
    }
 
226
 
 
227
    font = msLookupHashTable(&(map->fontset.fonts), map->scalebar.label.font);
 
228
    if(!font) {
 
229
      msSetError(MS_TTFERR, "Requested font (%s) not found.", "msDrawScalebar()", map->scalebar.label.font);
 
230
          free( fontPtr );
 
231
      return(NULL);
 
232
    }
 
233
 
 
234
    error = gdImageStringFT( NULL, bbox, map->scalebar.label.outlinecolor.pen, font, map->scalebar.label.size, 0, 0, 0, szTestString );
 
235
 
 
236
    if(error) {
 
237
      msSetError(MS_TTFERR, "gdImageStringFT returned error %d.", "msDrawScalebar()", error );
 
238
          free( fontPtr );
 
239
      return(NULL);
 
240
    }
 
241
 
 
242
        iFreeGDFont = 1;
 
243
        fontPtr->w      = (bbox[2] - bbox[0]) / strlen( szTestString );
 
244
        fontPtr->h  = (bbox[3] - bbox[5]);
 
245
#else
 
246
    msSetError(MS_TTFERR, "TrueType font support required.", "msDrawScalebar()");
 
247
    return(NULL);
 
248
#endif
 
249
  }
 
250
  else
 
251
    fontPtr = msGetBitmapFont(map->scalebar.label.size);
 
252
 
189
253
  if(!fontPtr) return(NULL);
190
254
 
191
255
  map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height);
192
256
  status = msCalculateScale(map->extent, map->units, map->width, map->height, map->resolution, &map->scale);
193
 
  if(status != MS_SUCCESS) return(NULL);
194
 
  
 
257
  if(status != MS_SUCCESS)
 
258
  {     
 
259
    if( iFreeGDFont ) free( fontPtr );
 
260
        return(NULL);
 
261
  }
195
262
  dsx = map->scalebar.width - 2*HMARGIN;
196
263
  do {
197
264
    msx = (map->cellsize * dsx)/(msInchesPerUnit(map->scalebar.units,0)/msInchesPerUnit(map->units,0));
226
293
    img = image->img.gd;
227
294
  else {
228
295
    msSetError(MS_GDERR, "Unable to initialize image.", "msDrawScalebar()");
 
296
        
 
297
    if( iFreeGDFont ) free( fontPtr );
 
298
 
229
299
    return(NULL);
230
300
  }
231
301
 
306
376
  default:
307
377
    msSetError(MS_MISCERR, "Unsupported scalebar style.", "msDrawScalebar()");
308
378
    return(NULL);
 
379
 
 
380
    if( iFreeGDFont ) free( fontPtr );
309
381
    break;
310
382
  }
311
383
 
312
384
  msClearScalebarPenValues( &(map->scalebar));
 
385
 
 
386
  if( iFreeGDFont ) free( fontPtr );
 
387
 
313
388
  return(image);
314
389
 
315
390
}
404
479
    msDrawMarkerSymbolGD(&map->symbolset, img, &point, &(map->layers[l].class[0].styles[0]), 1.0);
405
480
  }
406
481
  else
407
 
    msAddLabel(map, l, 0, -1, -1, &point, " ", 1.0, NULL);
 
482
    msAddLabel(map, l, 0, -1, -1, &point, NULL, " ", 1.0, NULL);
408
483
 
409
484
  /* Mark layer as deleted so that it doesn't interfere with html legends or */
410
485
  /* with saving maps */