int renderBitmapGlyphsGD(imageObj *img, double x, double y, labelStyleObj *style, char *text) { int size = MS_NINT(style->size); gdFontPtr fontPtr; gdImagePtr ip; int numlines=0,t; char **lines; if(!(ip = MS_IMAGE_GET_GDIMAGEPTR(img))) return MS_FAILURE; if(size<0 || size>4 || (fontPtr = msGetBitmapFont(size))==NULL) { msSetError(MS_RENDERERERR,"invalid bitmap font size", "renderBitmapGlyphsGD()"); return MS_FAILURE; } SETPEN(ip, style->color); SETPEN(ip, style->outlinecolor); if(msCountChars(text,'\n')) { if((lines = msStringSplit((const char*)text, '\n', &(numlines))) == NULL) return(-1); } else { lines = &text; numlines = 1; } y -= fontPtr->h; for(t=0; t<numlines; t++) { if(style->outlinewidth > 0) { gdImageString(ip, fontPtr, x, y-1, (unsigned char *) lines[t], style->outlinecolor->pen); gdImageString(ip, fontPtr, x, y+1, (unsigned char *) lines[t], style->outlinecolor->pen); gdImageString(ip, fontPtr, x+1, y, (unsigned char *) lines[t], style->outlinecolor->pen); gdImageString(ip, fontPtr, x-1, y, (unsigned char *) lines[t], style->outlinecolor->pen); gdImageString(ip, fontPtr, x+1, y-1, (unsigned char *) lines[t], style->outlinecolor->pen); gdImageString(ip, fontPtr, x+1, y+1, (unsigned char *) lines[t], style->outlinecolor->pen); gdImageString(ip, fontPtr, x-1, y-1, (unsigned char *) lines[t], style->outlinecolor->pen); gdImageString(ip, fontPtr, x-1, y+1, (unsigned char *) lines[t], style->outlinecolor->pen); } if(style->color->pen != -1) { gdImageString(ip, fontPtr, x, y, (unsigned char *) lines[t], style->color->pen); } y += fontPtr->h; /* shift down */ } if(lines != &text) msFreeCharArray(lines, numlines); return MS_SUCCESS; }
int msPopulateRendererVTableGD( rendererVTableObj *renderer ) { #ifdef USE_GD int i; renderer->use_imagecache=0; renderer->supports_pixel_buffer=1; renderer->supports_transparent_layers = 0; renderer->supports_bitmap_fonts = 1; renderer->default_transform_mode = MS_TRANSFORM_ROUND; for(i=0;i<5;i++) { gdFontPtr f = msGetBitmapFont(i); bitmapFontMetricsGD[i].charWidth = f->w; bitmapFontMetricsGD[i].charHeight = f->h; renderer->bitmapFontMetrics[i] = &bitmapFontMetricsGD[i]; } renderer->startLayer = startNewLayerGD; renderer->endLayer = closeNewLayerGD; renderer->renderLineTiled = NULL; renderer->renderLine = &renderLineGD; renderer->createImage = &createImageGD; renderer->saveImage = &saveImageGD; renderer->getRasterBufferHandle = &getRasterBufferHandleGD; renderer->getRasterBufferCopy = &getRasterBufferCopyGD; renderer->initializeRasterBuffer = initializeRasterBufferGD; renderer->loadImageFromFile = msLoadGDRasterBufferFromFile; renderer->renderPolygon = &renderPolygonGD; renderer->renderGlyphs = &renderGlyphsGD; renderer->renderBitmapGlyphs = &renderBitmapGlyphsGD; renderer->freeImage = &freeImageGD; renderer->renderEllipseSymbol = &renderEllipseSymbolGD; renderer->renderVectorSymbol = &renderVectorSymbolGD; renderer->renderTruetypeSymbol = &renderTruetypeSymbolGD; renderer->renderPixmapSymbol = &renderPixmapSymbolGD; renderer->mergeRasterBuffer = &mergeRasterBufferGD; renderer->getTruetypeTextBBox = &getTruetypeTextBBoxGD; renderer->renderTile = &renderTileGD; renderer->renderPolygonTiled = &renderPolygonTiledGD; renderer->freeSymbol = &freeSymbolGD; return MS_SUCCESS; #else msSetError(MS_MISCERR,"GD renderer requested but it is not configured in this build","msPopulateRendererVtableGD()"); return MS_FAILURE; #endif }