[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