[mapserver-commits] r10732 - sandbox/mapserver6

svn at osgeo.org svn at osgeo.org
Wed Nov 17 06:04:23 EST 2010


Author: toby
Date: 2010-11-17 03:04:23 -0800 (Wed, 17 Nov 2010)
New Revision: 10732

Modified:
   sandbox/mapserver6/mapogl.cpp
   sandbox/mapserver6/mapoglcontext.cpp
   sandbox/mapserver6/mapoglrenderer.cpp
   sandbox/mapserver6/mapoglrenderer.h
Log:
Updating OpenGl renderer to match the new rendering API.

RFC-50

Modified: sandbox/mapserver6/mapogl.cpp
===================================================================
--- sandbox/mapserver6/mapogl.cpp	2010-11-15 18:49:36 UTC (rev 10731)
+++ sandbox/mapserver6/mapogl.cpp	2010-11-17 11:04:23 UTC (rev 10732)
@@ -8,135 +8,121 @@
 #include "mapserver.h"
 
 #ifdef USE_OGL
+#include <stdio.h>
 #include <assert.h>
 #include "mapoglrenderer.h"
 #include "mapoglcontext.h"
 
+
+imageObj* createImageObjOgl(OglRenderer* renderer)
+{	
+	imageObj* pNewImage = (imageObj*)calloc(1, sizeof(imageObj));
+	if (!pNewImage)
+		return pNewImage;	
+	pNewImage->img.plugin = (void *) renderer;	
+	return pNewImage;
+}
+
 OglRenderer* getOglRenderer(imageObj* img)
 {
 	return (OglRenderer*) img->img.plugin;
 }
 
-void msDrawLineOgl(imageObj *img, shapeObj *p, colorObj *c, double width,
-		int patternlength, double* pattern)
+int msSaveImageOgl(imageObj *img, FILE *fp, outputFormatObj *format)
 {
-	OglRenderer* renderer = getOglRenderer(img);
-	renderer->renderPolyline(p, c, width, patternlength, pattern);
+	rasterBufferObj data;
+	OglRenderer* renderer = getOglRenderer(img);
+    renderer->readRasterBuffer(&data);        
+    return msSaveRasterBuffer(&data,fp,img->format );
 }
 
-void msDrawPolygonOgl(imageObj *img, shapeObj *p, colorObj *c, colorObj *oc,
-		double outlineWidth)
+int msDrawLineOgl(imageObj *img, shapeObj *p, strokeStyleObj *style)
 {
 	OglRenderer* renderer = getOglRenderer(img);
-	renderer->renderPolygon(p, c, oc, outlineWidth);
+	renderer->renderPolyline(p, style->color, style->width, style->patternlength, style->pattern);
+	return MS_SUCCESS;
 }
 
-void msFreeTileOgl(void *tile)
+int msDrawPolygonOgl(imageObj *img, shapeObj *p, colorObj *color)
 {
-	delete (OglCache*)tile;
+	OglRenderer* renderer = getOglRenderer(img);
+	renderer->renderPolygon(p, color, NULL, 0);
+	return MS_SUCCESS;
 }
 
-void msDrawLineTiledOgl(imageObj *img, shapeObj *p, void* tile)
-{
-	OglRenderer* renderer = getOglRenderer(img);
-	renderer->renderPolylineTile(p, (OglCache*)tile);}
+//void msFreeTileOgl(imageObj *tile)
+//{
+//	delete (OglCache*)tile;
+//}
 
-void msDrawPolygonTiledOgl(imageObj *img, shapeObj *p, colorObj *oc, double outlineWidth, void *tile)
+int msDrawLineTiledOgl(imageObj *img, shapeObj *p, imageObj *tile)
 {
 	OglRenderer* renderer = getOglRenderer(img);
-	renderer->renderPolygon(p, NULL, oc, outlineWidth, (OglCache*)tile);
+	renderer->renderPolylineTile(p, getOglRenderer(tile)->getTexture());
+	return MS_SUCCESS;
 }
 
-void msRenderPixmapOgl(imageObj *img, double x, double y, symbolObj *symbol,
-		double scale, double angle)
+int msDrawPolygonTiledOgl(imageObj *img, shapeObj *p, imageObj *tile)
 {
 	OglRenderer* renderer = getOglRenderer(img);
-	renderer->renderPixmap(symbol, x, y, angle, scale);
+	renderer->renderPolygon(p, NULL, NULL, 0.0, getOglRenderer(tile)->getTexture());
+	return MS_SUCCESS;
 }
 
-void msRenderVectorSymbolOgl(imageObj *img, double x, double y,
-		symbolObj *symbol, double scale, double angle, colorObj *c,
-		colorObj *oc, double ow)
+int msRenderPixmapOgl(imageObj *img, double x, double y,
+        	symbolObj *symbol, symbolStyleObj *style)
 {
 	OglRenderer* renderer = getOglRenderer(img);
-	renderer->renderVectorSymbol(x, y, symbol, scale, angle, c, oc, ow);
+	renderer->renderPixmap(symbol, x, y, style->rotation, style->scale);	
+	return MS_SUCCESS;
 }
 
-void* msCreateTilePixmapOgl(symbolObj *symbol, double scale, double angle, colorObj *bc)
+int msRenderVectorSymbolOgl
+	(imageObj *img, double x, double y,
+    		symbolObj *symbol, symbolStyleObj *style)
 {
-	double canvasWidth = symbol->sizex*scale;
-	double canvasHeight = symbol->sizey*scale;
-	OglTexture* renderer = new OglTexture(canvasWidth, canvasHeight, bc);
-	renderer->renderPixmap(symbol, 0, 0, angle, scale);
-	OglCache* tile = renderer->renderToTile();
-	delete renderer;
-	return tile;
+	OglRenderer* renderer = getOglRenderer(img);
+	renderer->renderVectorSymbol(x, y, symbol, style->scale, style->rotation, style->color, style->outlinecolor, style->outlinewidth);		
+	return MS_SUCCESS;
 }
 
-void *msCreateTileEllipseOgl(double width, double height, double angle,
-		colorObj *c, colorObj *bc, colorObj *oc, double ow)
+int msRenderTruetypeSymbolOgl(imageObj *img, double x, double y,
+        symbolObj *symbol, symbolStyleObj * style)
 {
-	double canvasWidth = angle == 0.0 ? width : MS_MAX(height, width);
-	double canvasHeight = angle == 0.0 ? height : MS_MAX(height, width);
-	OglTexture* renderer = new OglTexture(canvasWidth, canvasHeight, bc);
-	renderer->renderEllipse(ceil(canvasWidth/2), ceil(canvasHeight/2), angle, width, height, c, NULL, ow);
-	OglCache* tile = renderer->renderToTile();
-	delete renderer;
-	return tile;
+	OglRenderer* renderer = getOglRenderer(img);
+	double size = style->scale*72.0;	
+	renderer->renderGlyphs(0, 0, style->color, style->outlinecolor, size, symbol->font, symbol->character, style->rotation, NULL, 0, 0);	
+	return MS_SUCCESS;
 }
 
-void* msCreateTileVectorOgl(symbolObj *symbol, double scale, double angle,
-		colorObj *c, colorObj *bc, colorObj *oc, double ow)
+int msRenderTileOgl(imageObj *img, imageObj *tile, double x, double y)
 {
-	OglTexture* renderer = new OglTexture(symbol->sizex*scale, symbol->sizey*scale, bc);
-	renderer->renderVectorSymbol(0,0, symbol, scale, angle, c, bc, ow);
-	OglCache* tile = renderer->renderToTile();
-	delete renderer;
-	return tile;
+	OglRenderer* renderer = getOglRenderer(img);	
+	renderer->renderTile(getOglRenderer(tile)->getTexture(), x, y, 0.0);
+	return MS_SUCCESS;
 }
 
-void* msCreateTileTruetypeOgl(imageObj *img, char *text, char *font,
-		double size, double angle, colorObj *c, colorObj *bc, colorObj *oc,
-		double ow)
-{
-	OglTexture* renderer = new OglTexture(size, size, bc);
-	renderer->renderGlyphs(0, 0, c, oc, size, font, text, angle, NULL, 0, 0);
-	OglCache* tile = renderer->renderToTile();
-	delete renderer;
-	return tile;
+int msGetTruetypeTextBBoxOgl(rendererVTableObj *renderer, char *font, double size, char *string, rectObj *rect, double **advances)
+{	
+	OglRenderer::getStringBBox(font, size, string, rect, advances);
+	return MS_SUCCESS;
 }
 
-void msRenderTileOgl(imageObj *img, void *tile, double x, double y, double angle)
+int msRenderGlyphsOgl(imageObj *img, double x, double y,
+            labelStyleObj *style, char *text)		
 {
 	OglRenderer* renderer = getOglRenderer(img);
-	renderer->renderTile((OglCache*)tile, x, y, angle);
+	renderer->renderGlyphs(x, y, style->color, style->outlinecolor, style->size, style->font, text, style->rotation, NULL, 0.0, 0.0);
+	return MS_SUCCESS;
 }
 
-int msGetTruetypeTextBBoxOgl(imageObj *img, char *font, double size, char *string, rectObj *rect, double **advances)
+int msMergeRasterBufferOgl(imageObj *dest, rasterBufferObj *overlay, double opacity, int srcX, int srcY, int dstX, int dstY, int width, int height)
 {
-	OglRenderer* renderer = getOglRenderer(img);
-	renderer->getStringBBox(font, size, string, rect, advances);
-	return 0;
+	OglRenderer* renderer = getOglRenderer(dest);
+	renderer->drawRasterBuffer(overlay, opacity, srcX, srcY, dstX, dstY, width, height);
+	return MS_SUCCESS;
 }
 
-void msRenderGlyphsOgl(imageObj *img, double x, double y, colorObj *c,
-		colorObj *outlinecolor, double size, char *font, char *thechars,
-		double angle, colorObj *shadowcolor, double shdx, double shdy,
-		int outlinewidth)
-{
-	OglRenderer* renderer = getOglRenderer(img);
-	renderer->renderGlyphs(x, y, c, outlinecolor, size, font, thechars, angle, shadowcolor, shdx, shdy);
-}
-
-void msMergeImagesOgl(imageObj *dest, imageObj *overlay, int opacity, int dstX,
-		int dstY)
-{
-	//	cairo_renderer *rd = getCairoRenderer(dest);
-	//	cairo_renderer *ro = getCairoRenderer(overlay);
-	//	cairo_set_source_surface (rd->cr,ro->surface,dstX,dstY);
-	//	cairo_paint_with_alpha(rd->cr,opacity*0.01);
-}
-
 imageObj* msImageCreateOgl(int width, int height, outputFormatObj *format, colorObj* bg)
 {
 	imageObj *pNewImage = NULL;
@@ -149,100 +135,104 @@
 				"msImageCreateOGL()");
 		return NULL;
 	}
-
-	pNewImage = (imageObj*)calloc(1, sizeof(imageObj));
-	if (!pNewImage)
-		return pNewImage;
-
-	OglRenderer *ren = new OglRenderer(width, height, bg);
-	pNewImage->img.plugin = (void *) ren;
-	return pNewImage;
+	return createImageObjOgl(new OglRenderer(width, height, bg));
 }
 
-int msSaveImageOgl(imageObj *img, char *filename, outputFormatObj *format)
+int msRenderEllipseOgl(imageObj *image, double x, double y, 
+    		symbolObj *symbol, symbolStyleObj *style)		
 {
-        imageObj* gdImg = msImageCreateGD(img->width, img->height, format, filename, NULL, 72, 72);
-
-	OglRenderer* ogl = getOglRenderer(img);
-	ogl->attach(gdImg);
-	char *pFormatBuffer;
-	char cGDFormat[128];
-	int iReturn = 0;
-
-	pFormatBuffer = format->driver;
-
-	strcpy(cGDFormat, "gd/");
-	strcat(cGDFormat, &(format->driver[4]));
-
-	format->driver = &cGDFormat[0];
-
-	iReturn = msSaveImageGD(gdImg, filename, format);
-
-	format->driver = pFormatBuffer;
-
-	return 1;
+	
+	OglRenderer* renderer = getOglRenderer(image);
+	renderer->renderEllipse(x, y, style->rotation, symbol->sizex, symbol->sizey, style->color, style->outlinecolor, style->outlinewidth);
+	return MS_SUCCESS;
 }
 
-void msRenderEllipseOgl(imageObj *img, double x, double y, double width,
-		double height, double angle, colorObj *color, colorObj *outlinecolor,
-		double outlinewidth)
+int msFreeImageOgl(imageObj *img)
 {
 	OglRenderer* renderer = getOglRenderer(img);
-	renderer->renderEllipse(x, y, angle, width, height, color, outlinecolor, outlinewidth);
-}
-
-void msFreeImageOgl(imageObj *img)
-{
-	OglRenderer* renderer = getOglRenderer(img);
 	if (renderer)
 	{
 		delete renderer;
 	}
 	img->img.plugin=NULL;
+	return MS_SUCCESS;
 }
 
-void msStartNewLayerOgl(imageObj *img, double opacity)
+int msStartLayerOgl(imageObj *img, mapObj *map, layerObj *layer)
 {
-	getOglRenderer(img)->setTransparency(opacity/100);
+	getOglRenderer(img)->setTransparency((double)layer->opacity/100);
+	return MS_SUCCESS;
 }
 
-void msCloseNewLayerOgl(imageObj *img, double opacity)
+int msEndLayerOgl(imageObj *img, mapObj *map, layerObj *layer)
 {
 	getOglRenderer(img)->setTransparency(1.0);
+	return MS_SUCCESS;
 }
 
-void msFreeSymbolOgl(symbolObj *s)
+int msFreeSymbolOgl(symbolObj *s)
 {
-	
+	return MS_SUCCESS;
 }
+
+int msGetRasterBufferCopyOgl(imageObj *img, rasterBufferObj *rb) {
+	getOglRenderer(img)->readRasterBuffer(rb);
+	return MS_SUCCESS;
+}
+
+int msGetRasterBufferHandleOgl(imageObj *img, rasterBufferObj * rb)
+{
+	getOglRenderer(img)->readRasterBuffer(rb);
+	return MS_SUCCESS;
+}
+
+int msInitializeRasterBufferOgl(rasterBufferObj *rb, int width, int height, int mode) 
+{
+	OglRenderer::initializeRasterBuffer(rb, width, height, mode==MS_IMAGEMODE_RGBA);
+	return MS_SUCCESS;
+}
+
 #endif /* USE_OGL */
 
 int msPopulateRendererVTableOGL(rendererVTableObj *renderer) {
 #ifdef USE_OGL
-    	renderer->supports_transparent_layers = 1;
-    	renderer->startNewLayer = msStartNewLayerOgl;
-    	renderer->closeNewLayer = msCloseNewLayerOgl;
-        renderer->renderLine=&msDrawLineOgl;
-        renderer->createImage=&msImageCreateOgl;
+		renderer->supports_transparent_layers = 1;
+		renderer->supports_pixel_buffer = 0;
+		renderer->supports_clipping = 0;
+		renderer->use_imagecache = 0;
+		renderer->supports_bitmap_fonts = 0;
+
+    	renderer->startLayer = msStartLayerOgl;
+    	renderer->endLayer = msEndLayerOgl;        
+        
+		renderer->createImage=&msImageCreateOgl;
         renderer->saveImage=&msSaveImageOgl;
-        renderer->transformShape=&msTransformShapeAGG;
-        renderer->renderPolygon=&msDrawPolygonOgl;
+        
+        
+		renderer->renderLine=&msDrawLineOgl;
+		renderer->renderPolygon=&msDrawPolygonOgl;
         renderer->renderGlyphs=&msRenderGlyphsOgl;
         renderer->renderEllipseSymbol = &msRenderEllipseOgl;
         renderer->renderVectorSymbol = &msRenderVectorSymbolOgl;
-        renderer->renderPixmapSymbol = &msRenderPixmapOgl;
-        renderer->mergeRasterBuffer = &msMergeImagesOgl;
-        renderer->getTruetypeTextBBox = &msGetTruetypeTextBBoxOgl;
-        renderer->createPixmapSymbolTile = &msCreateTilePixmapOgl;
-        renderer->createVectorSymbolTile = &msCreateTileVectorOgl;
-        renderer->createEllipseSymbolTile = &msCreateTileEllipseOgl;
-        renderer->createTruetypeSymbolTile = &msCreateTileTruetypeOgl;
-        renderer->renderTile = &msRenderTileOgl;
+        renderer->renderPixmapSymbol = &msRenderPixmapOgl;        
+		renderer->renderTruetypeSymbol = &msRenderTruetypeSymbolOgl;
+
+		renderer->renderTile = &msRenderTileOgl;
         renderer->renderPolygonTiled = &msDrawPolygonTiledOgl;
         renderer->renderLineTiled = &msDrawLineTiledOgl;
-        renderer->freeTile = &msFreeTileOgl;
+        
+		renderer->transformShape=&msTransformShapeToPixel;
+		renderer->getTruetypeTextBBox = &msGetTruetypeTextBBoxOgl;
+        
+		//renderer->getRasterBufferHandle = msGetRasterBufferHandleOgl;
+		renderer->getRasterBufferCopy = msGetRasterBufferCopyOgl;
+		renderer->initializeRasterBuffer = msInitializeRasterBufferOgl;
+		renderer->mergeRasterBuffer = msMergeRasterBufferOgl;		
+		renderer->loadImageFromFile = msLoadMSRasterBufferFromFile;							
+
         renderer->freeSymbol = &msFreeSymbolOgl;
         renderer->freeImage=&msFreeImageOgl;
+
         return MS_SUCCESS;
     #else
         msSetError(MS_MISCERR,"OGL driver requested but it is not compiled in this release",

Modified: sandbox/mapserver6/mapoglcontext.cpp
===================================================================
--- sandbox/mapserver6/mapoglcontext.cpp	2010-11-15 18:49:36 UTC (rev 10731)
+++ sandbox/mapserver6/mapoglcontext.cpp	2010-11-17 11:04:23 UTC (rev 10732)
@@ -20,6 +20,7 @@
 OglContext* OglContext::current = NULL;
 
 OglContext::OglContext(ms_uint32 width, ms_uint32 height)
+	: width(width), height(height)
 {
 	if (!window) initWindow();
 	if (!sharingContext) initSharingContext();
@@ -225,12 +226,14 @@
 			WGL_DEPTH_BITS_ARB,16,
 			WGL_STENCIL_BITS_ARB,0,
 			WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,
-			WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
+			WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,			
 			0,0
 		};
 
 		valid = wglChoosePixelFormatARB(window,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
-	}
+		if (!valid) samples -= 2;
+	}	
+
 	if(numFormats == 0)
 	{
 		msSetError(MS_OGLERR, "P-buffer Error: Unable to find an acceptable pixel format.", "OglContext::createPBuffer()");
@@ -414,7 +417,7 @@
 	return true;
 }
 
-#endif /* WIN32 */
+#endif /* UNIX */
 
 #if defined(_WIN32) && !defined(__CYGWIN__)
 

Modified: sandbox/mapserver6/mapoglrenderer.cpp
===================================================================
--- sandbox/mapserver6/mapoglrenderer.cpp	2010-11-15 18:49:36 UTC (rev 10731)
+++ sandbox/mapserver6/mapoglrenderer.cpp	2010-11-17 11:04:23 UTC (rev 10732)
@@ -1,6 +1,7 @@
 #ifdef USE_OGL
 
 #include <algorithm>
+#include <fstream>
 
 #include "mapserver.h"
 #include "maperror.h"
@@ -8,7 +9,6 @@
 
 using namespace std;
 
-
 double OglRenderer::SIZE_RES = 100.0 / 72.0;
 ms_uint32 OglRenderer::OUTLINE_WIDTH = 2;
 ms_uint32 OglRenderer::FONT_SIZE = 20;
@@ -17,8 +17,6 @@
 ms_uint32 OglRenderer::SHAPE_CIRCLE_RES = 10;
 double OglRenderer::SHAPE_CIRCLE_RADIUS = 10.0;
 
-ms_uint32 OglTexture::TEXTURE_BORDER = 4;
-
 OglRenderer::fontCache_t OglRenderer::fontCache = OglRenderer::fontCache_t();
 OglRenderer::dashCache_t OglRenderer::dashCache = OglRenderer::dashCache_t();
 std::vector<GLuint> OglRenderer::shapes = std::vector<GLuint>();
@@ -29,78 +27,10 @@
 GLvoid CALLBACK combineDataCallback(GLdouble coords[3], GLdouble* vertex_data[4], GLfloat weight[4], void** dataOut, void* polygon_data);
 GLvoid CALLBACK vertexCallback(GLdouble *vertex);
 
-OglTexture::OglTexture(ms_uint32 width, ms_uint32 height, colorObj* color)
-	: OglRenderer(getTextureSize(GL_TEXTURE_WIDTH, width)+TEXTURE_BORDER,
-				  getTextureSize(GL_TEXTURE_HEIGHT, height)+TEXTURE_BORDER)
-
-{
-	this->pow2width = getWidth()-TEXTURE_BORDER;
-	this->pow2height = getHeight()-TEXTURE_BORDER;
-	this->textureWidth = width;
-	this->textureHeight = height;
-
-	glPushMatrix();
-
-	glRasterPos2d(TEXTURE_BORDER/2, TEXTURE_BORDER/2);
-	glPixelZoom((float)pow2width/width, (float)pow2height/height);
-	glTranslated(TEXTURE_BORDER/2, TEXTURE_BORDER/2, 0);
-	glScaled((double)pow2width/width, (double)pow2height/height, 1.0);
-}
-
-OglTexture::~OglTexture()
-{
-	makeCurrent();
-	glPopMatrix();
-	glPixelZoom(1.0f, 1.0f);
-	glRasterPos2d(0, 0);
-}
-
-OglCache* OglTexture::renderToTile()
-{
-	makeCurrent();
-	OglCache* tile = new OglCache();
-	tile->texture = createTexture(TEXTURE_BORDER/2, TEXTURE_BORDER/2);
-	tile->width = this->textureWidth;
-	tile->height = this->textureHeight;
-	return tile;
-}
-
-GLuint OglTexture::createTexture(ms_uint32 offsetX, ms_uint32 offsetY)
-{
-	GLuint texture;
-	glGenTextures(1, &texture);
-	glBindTexture(GL_TEXTURE_2D, texture);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-	glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
-	if (OglContext::MAX_ANISOTROPY != 0)
-	{
-		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, OglContext::MAX_ANISOTROPY);
-	}
-	glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, offsetX, offsetY, pow2width, pow2height, 0);
-	glBindTexture(GL_TEXTURE_2D,0);
-	return texture;
-}
-
-ms_uint32 OglTexture::getTextureSize(GLuint dimension, ms_uint32 value)
-{
-	glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA,  value, value, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-    GLint check;
-    glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, dimension, &check);
-    if (check == 0)
-    {
-    	return MS_MAX(MS_MIN(NextPowerOf2(value), OglContext::MAX_TEXTURE_SIZE), OglContext::MIN_TEXTURE_SIZE);
-    }
-    else
-    {
-    	return value;
-    }
-}
-
 OglRenderer::OglRenderer(ms_uint32 width, ms_uint32 height, colorObj* color)
-{
+{	
+	this->texture = NULL;
+
 	int viewPort[4];
 	glGetIntegerv(GL_VIEWPORT ,viewPort);
 	viewportX = viewPort[0];
@@ -112,7 +42,7 @@
 
 	this->width = width;
 	this->height = height;
-	context = new OglContext(width, height);
+	context = new OglContext(getTextureSize(GL_TEXTURE_WIDTH, width), getTextureSize(GL_TEXTURE_HEIGHT, height));
 	context->makeCurrent();
 	transparency = 1.0;
 
@@ -173,62 +103,118 @@
 	delete context;
 }
 
-void OglRenderer::getStringBBox(char *font, double size, char *string, rectObj *rect, double** advances)
+OglCachePtr OglRenderer::getTexture()
 {
+	if (!texture)
+	{
+		makeCurrent();
+		texture = new OglCache();
+		texture->texture = createTexture(0,0);//TEXTURE_BORDER/2, TEXTURE_BORDER/2);
+		texture->width = this->width;
+		texture->height = this->height;
+	}
+	return texture;
+}
+
+GLuint OglRenderer::createTexture(ms_uint32 offsetX, ms_uint32 offsetY)
+{
+	GLuint texture = 0;
+	glGenTextures(1, &texture);
+	glBindTexture(GL_TEXTURE_2D, texture);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+	glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+	if (OglContext::MAX_ANISOTROPY != 0)
+	{
+		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, OglContext::MAX_ANISOTROPY);
+	}
+	glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, offsetX, offsetY, context->getWidth(), context->getHeight(), 0);
+	glBindTexture(GL_TEXTURE_2D,0);
+	return texture;
+}
+
+ms_uint32 OglRenderer::getTextureSize(GLuint dimension, ms_uint32 value)
+{
+	glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA,  value, value, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+    GLint check;
+    glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, dimension, &check);
+    if (check == 0)
+    {
+    	return MS_MAX(MS_MIN(NextPowerOf2(value), OglContext::MAX_TEXTURE_SIZE), OglContext::MIN_TEXTURE_SIZE);
+    }
+    else
+    {
+    	return value;
+    }
+}
+
+void OglRenderer::getStringBBox(char *font, double size, char *string, rectObj *rect, double** advances)
+{	
 	FTFont* face = getFTFont(font, size);
+	if (!face) return;
+	
 	float llx =0.0f, lly=0.0f, llz=0.0f, urx=0.0f, ury=0.0f, urz=0.0f;
 	glPushAttrib( GL_ALL_ATTRIB_BITS );
-	face->BBox(string, llx, lly, llz, urx, ury, urz);
+	FTBBox boundingBox = face->BBox(string);
 	glPopAttrib();
 
-	rect->minx = llx;
-	rect->maxx = urx;
-	rect->miny = -ury;
-	rect->maxy = -lly;
-
+	rect->minx = boundingBox.Lower().X();
+	rect->maxx = boundingBox.Upper().X();
+	rect->miny = -boundingBox.Upper().Y();
+	rect->maxy = -boundingBox.Lower().Y();
+		
 	if (advances)
 	{
 		int length = strlen(string);
-		*advances = new double[length];
+		*advances = new double[length];		
 		for (int i = 0; i < length; ++i)
 		{
-			(*advances)[i] = face->Advance(string);
+			(*advances)[i] = face->Advance(&string[i], 1);
 		}
 	}
 }
 
-void OglRenderer::attach(imageObj* img)
-{
-	context->makeCurrent();
-	int* buffer = new int[4 * width * height];
+void OglRenderer::initializeRasterBuffer(rasterBufferObj * rb, int width, int height, bool useAlpha) 
+{   
+	unsigned char* buffer = new unsigned char[4 * width * height];
+	rb->data.rgba.pixels = buffer;
+	rb->data.rgba.r = &buffer[2];
+	rb->data.rgba.g = &buffer[1];
+	rb->data.rgba.b = &buffer[0];
+	if (useAlpha) rb->data.rgba.a = &buffer[3];   
+		
+	rb->type =MS_BUFFER_BYTE_RGBA;	
+	rb->data.rgba.row_step = 4*width;
+	rb->data.rgba.pixel_step = 4;
+	rb->width = width;
+	rb->height = height;
+}
 
-	for (int i = 0; i < img->img.gd->sy; i++)
-	{
-		//gdFree( gd->tpixels[i] ); // 100ms
-		img->img.gd->tpixels[i] = &buffer[i * img->width];
-	}
-	glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
+void OglRenderer::readRasterBuffer(rasterBufferObj * rb) 
+{   
+	makeCurrent();
+	unsigned char* buffer = new unsigned char[4 * width * height];
+	glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
+	
+	rb->type =MS_BUFFER_BYTE_RGBA;
+	rb->data.rgba.pixels = buffer;
+	rb->data.rgba.row_step = 4*width;
+	rb->data.rgba.pixel_step = 4;
+	rb->width = width;
+	rb->height = height;
+	rb->data.rgba.r = &buffer[2];
+	rb->data.rgba.g = &buffer[1];
+	rb->data.rgba.b = &buffer[0];
+	rb->data.rgba.a = NULL;
 }
 
-GLubyte* OglRenderer::gd2ogl(gdImagePtr img)
+void OglRenderer::drawRasterBuffer(rasterBufferObj *overlay, double opacity, int srcX, int srcY, int dstX, int dstY, int width, int height)
 {
-	int sx = gdImageSX(img);
-	int sy = gdImageSY(img);
-	GLubyte* imgPixels = new GLubyte[sx*sy*4];
-	GLubyte* rowptr = imgPixels;
-	for (int i = 0; i < sy; ++i)
-	{
-		for (int j = 0; j < sx; ++j)
-		{
-			ms_uint32 pixel = gdImageGetTrueColorPixel(img, j, i);
-			rowptr[j * 4 + 0] = gdTrueColorGetRed(pixel);
-			rowptr[j * 4 + 1] = gdTrueColorGetGreen(pixel);
-			rowptr[j * 4 + 2] = gdTrueColorGetBlue(pixel);
-			rowptr[j * 4 + 3] = (127 - gdTrueColorGetAlpha(pixel)) * 2;
-		}
-		rowptr += 4 * sx;
-	}
-	return imgPixels;
+	// todo to support all alpha and srcx/y this needs to be done by creating a texture
+	makeCurrent();
+	glDrawPixels(width, height, GL_BGRA, GL_UNSIGNED_BYTE, overlay->data.rgba.pixels);
 }
 
 void OglRenderer::setTransparency(double transparency)
@@ -250,8 +236,7 @@
 
 void OglRenderer::drawVectorLineStrip(symbolObj *symbol, double width)
 {
-	glPushMatrix();
-	glScaled(0.1, 0.1, 0);
+	glPushMatrix();	
 	glLineWidth(width);
 	glBegin(GL_LINE_STRIP);
     for (int i = 0; i < symbol->numpoints; i++)
@@ -263,7 +248,7 @@
 		}
 		else
 		{
-			glVertex2d(symbol->points[i].x*10, symbol->points[i].y*10);
+			glVertex2d(symbol->points[i].x, symbol->points[i].y);
 		}
 	}
     glEnd();
@@ -331,7 +316,7 @@
 	return dist;
 }
 
-void OglRenderer::renderTile(OglCache* tile, double x, double y, double angle)
+void OglRenderer::renderTile(const OglCachePtr& tile, double x, double y, double angle)
 {
 	makeCurrent();
 	glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
@@ -355,7 +340,7 @@
 	glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);
 }
 
-void OglRenderer::renderPolylineTile(shapeObj *shape, OglCache* tile){
+void OglRenderer::renderPolylineTile(shapeObj *shape, const OglCachePtr& tile){
 	makeCurrent();
 	glBindTexture(GL_TEXTURE_2D, tile->texture); // Select Our Texture
 	glBegin(GL_TRIANGLE_STRIP);
@@ -383,14 +368,19 @@
 	glRotated(angle, 0, 0, 1);
 	glScaled(scale, scale, 0);
 
+	glTranslated(-symbol->sizex/2, -symbol->sizey/2, 0.0);
+
 	if (oc != NULL && MS_VALID_COLOR(*oc) && ow > 0)
 	{
 		setColor(oc);
 		drawVectorLineStrip(symbol, ow);
 	}
 
-	setColor(c);
-    drawVectorLineStrip(symbol, ow);
+	if (c != NULL && MS_VALID_COLOR(*c) && ow > 0)
+	{
+		setColor(c);
+		drawVectorLineStrip(symbol, ow);
+	}
 
     glPopMatrix();
 }
@@ -507,7 +497,7 @@
 
 }
 
-void OglRenderer::renderPolygon(shapeObj *p, colorObj *color, colorObj *outlinecolor, double outlinewidth, OglCache* tile, int lineCap, int joinStyle)
+void OglRenderer::renderPolygon(shapeObj *p, colorObj *color, colorObj *outlinecolor, double outlinewidth, const OglCachePtr& tile, int lineCap, int joinStyle)
 {
 	/*
 	 OpenGL cannot draw complex polygons so we need to use a Tessallator to draw the polygon using a GL_TRIANGLE_FAN
@@ -568,15 +558,17 @@
 		colorObj *outlinecolor, double size, char* font, char *thechars, double angle,
 		colorObj *shadowcolor, double shdx, double shdy)
 {
-	makeCurrent();
-	glPushAttrib(GL_ALL_ATTRIB_BITS);
+	makeCurrent();	
 	FTFont* face = getFTFont(font, size);
+	if (!face) return;
 
+	glPushAttrib(GL_ALL_ATTRIB_BITS);
 	glPushMatrix();
-	glTranslated(floor(x), floor(y), 0);
 
+	glTranslated(floor(x), floor(y), 0);	
 	glScaled(1.0, -1.0, 1);
 	glRotated(angle * (180 / OGL_PI), 0, 0, 1);
+	
 	if (outlinecolor && MS_VALID_COLOR(*outlinecolor))
 	{
 		setColor(outlinecolor);
@@ -599,6 +591,7 @@
 		setColor(color);
 		face->Render(thechars);
 	}
+
 	glPopMatrix();
 	glPopAttrib();
 }
@@ -612,12 +605,12 @@
 	glGetFloatv(GL_ZOOM_X, &zoomX);
 	glGetFloatv(GL_ZOOM_Y, &zoomY);
 
-	GLubyte* imgdata = gd2ogl(symbol->img);
+	
+	GLubyte* imgdata = symbol->pixmap_buffer->data.rgba.pixels;
 	glPixelZoom(zoomX*scale, zoomY*scale);
-	glRasterPos2d(x, y);
-	glDrawPixels(symbol->img->sx, symbol->img->sy, GL_RGBA, GL_UNSIGNED_BYTE, imgdata);
-	glPixelZoom(zoomX, zoomY);
-	delete imgdata;
+	glRasterPos2d(x-symbol->pixmap_buffer->width/2, y-symbol->pixmap_buffer->height/2);	
+	glDrawPixels(symbol->pixmap_buffer->width, symbol->pixmap_buffer->height, GL_BGRA, GL_UNSIGNED_BYTE, imgdata);
+	glPixelZoom(zoomX, zoomY);	
 }
 
 void OglRenderer::renderEllipse(double x, double y, double angle, double width, double height,
@@ -716,15 +709,16 @@
 FTFont* OglRenderer::getFTFont(char* font, double size)
 {
 	FTFont** face = &fontCache[font][size];
-	if (*face == NULL)
+	if (*face == NULL && ifstream(font))
 	{
 		*face = new FTGLTextureFont( font );
-		(*face)->FaceSize(size*SIZE_RES);
-	}
+		(*face)->UseDisplayList(true);
+		(*face)->FaceSize(size*SIZE_RES);		
+	}	
 	return *face;
 }
 
-GLuint OglTexture::NextPowerOf2(GLuint in)
+GLuint OglRenderer::NextPowerOf2(GLuint in)
 {
 	in -= 1;
 

Modified: sandbox/mapserver6/mapoglrenderer.h
===================================================================
--- sandbox/mapserver6/mapoglrenderer.h	2010-11-15 18:49:36 UTC (rev 10731)
+++ sandbox/mapserver6/mapoglrenderer.h	2010-11-17 11:04:23 UTC (rev 10732)
@@ -3,22 +3,16 @@
 
 #ifdef USE_OGL
 
+#include "mapoglcontext.h"
+#include "mapserver.h"
 
 #include <vector>
 #include <map>
+#include <memory>
 
-#ifdef USE_FTGL_2_1_2
-#include <FTGL/FTGL.h>
- 
-#else
 #include <FTGL/ftgl.h>
- 
-#endif
 #include <FTGL/FTGLTextureFont.h>
 
-#include "mapoglcontext.h"
-#include "mapserver.h"
-
 class OglCache
 {
 public:
@@ -32,29 +26,36 @@
 	ms_uint32 patternDistance;
 };
 
+typedef OglCache* OglCachePtr;
+
 class OglRenderer {
 public:
 	OglRenderer(ms_uint32 width, ms_uint32 height, colorObj* color = NULL);
 	virtual ~OglRenderer();
-    GLubyte* gd2ogl(gdImagePtr img);
 
-	void renderPolyline(shapeObj *p,colorObj *c, double width, int patternlength, double* pattern, int lineCap = MS_CJC_ROUND, int joinStyle = MS_CJC_ROUND, colorObj *outlinecolor = NULL, double outlinewidth = 0);
-	void renderPolygon(shapeObj*, colorObj *color, colorObj *outlinecolor, double outlinewidth, OglCache* tile = NULL, int lineCap=MS_CJC_ROUND, int joinStyle=MS_CJC_ROUND);
+	void renderPolyline(shapeObj *p, colorObj *c, double width, int patternlength, double* pattern, int lineCap = MS_CJC_ROUND, int joinStyle = MS_CJC_ROUND, colorObj *outlinecolor = NULL, double outlinewidth = 0);
+	void renderPolygon(shapeObj*, colorObj *color, colorObj *outlinecolor, double outlinewidth, const OglCachePtr& tile = OglCachePtr(), int lineCap=MS_CJC_ROUND, int joinStyle=MS_CJC_ROUND);
 	void renderGlyphs(double x, double y, colorObj *color, colorObj *outlinecolor, double size, char* font, char *thechars, double angle, colorObj *shadowcolor, double shdx, double shdy);
     void renderPixmap(symbolObj *symbol, double x, double y, double angle, double scale);
     void renderEllipse(double x, double y, double angle, double w, double h, colorObj *color, colorObj *outlinecolor, double outlinewidth);
     void renderVectorSymbol(double x, double y, symbolObj *symbol, double scale, double angle, colorObj *c, colorObj *oc, double ow);
-    void renderTile(OglCache* tile, double x, double y, double angle);
-    void renderPolylineTile(shapeObj *p, OglCache* tile);
+    void renderTile(const OglCachePtr& tile, double x, double y, double angle);
+    void renderPolylineTile(shapeObj *p, const OglCachePtr& tile);
 
-    void getStringBBox(char *font, double size, char *string, rectObj *rect, double** advances);
-    void setTransparency(double transparency);
-    void attach(imageObj* img);
+    static void getStringBBox(char *font, double size, char *string, rectObj *rect, double** advances);    
+	void setTransparency(double transparency);    
+	
+	void readRasterBuffer(rasterBufferObj * rb);
+	void drawRasterBuffer(rasterBufferObj *overlay, double opacity, int srcX, int srcY, int dstX, int dstY, int width, int height);
+	static void initializeRasterBuffer(rasterBufferObj * rb, int width, int height, bool useAlpha);	
 
+	OglCachePtr getTexture();
     int getWidth() { return width; }
     int getHeight() { return height; }
 protected:
-    ms_uint32 width;
+    OglCachePtr texture;
+	
+	ms_uint32 width;
     ms_uint32 height;
 	double transparency;
 
@@ -66,13 +67,18 @@
 	typedef std::map<char*,std::map<double,FTFont*> > fontCache_t;
     typedef std::map<symbolObj*,std::map<double,GLuint> > dashCache_t;
 
-    FTFont* getFTFont(char* font, double size);
+    static FTFont* getFTFont(char* font, double size);
     bool loadLine(shapeObj* shape, double width, int patternlength, double *pattern);
     double drawQuad(pointObj *p1, pointObj *p2, double width, double tilelength = 0.0, double textureStart = 0.0);
     double drawTriangles(pointObj *p1, pointObj *p2, double width, double tilelength = 0.0, double textureStart = 0.0);
     void drawVectorLineStrip(symbolObj *symbol, double width);
     void drawFan(pointObj* center, pointObj* from, pointObj* to, int resolution);
     void createShapes();
+	
+	// texture functions	
+	ms_uint32 getTextureSize(GLuint dimension, ms_uint32 value);
+	GLuint NextPowerOf2(GLuint in);
+	GLuint createTexture(ms_uint32 x, ms_uint32 y);
 
 	void makeCurrent();
     void setColor(colorObj *color);
@@ -95,25 +101,6 @@
 	static double SIZE_RES;
 };
 
-class OglTexture : public OglRenderer
-{
-public:
-	OglTexture(ms_uint32 width, ms_uint32 height, colorObj* color = NULL);
-	~OglTexture();
-	OglCache* renderToTile();
-private:
-	ms_uint32 textureWidth;
-	ms_uint32 textureHeight;
-	ms_uint32 pow2width;
-	ms_uint32 pow2height;
-	double scaleWidth;
-	double scaleHeight;
-	ms_uint32 getTextureSize(GLuint dimension, ms_uint32 value);
-	GLuint NextPowerOf2(GLuint in);
-	GLuint createTexture(ms_uint32 x, ms_uint32 y);
-	static ms_uint32 TEXTURE_BORDER;
-};
-
 #endif /* USE_OGL */
 #endif
 



More information about the mapserver-commits mailing list