From 41c4957f0728c1dfe7369e01842204751f00328c Mon Sep 17 00:00:00 2001 From: andreas Date: Mon, 12 Feb 2024 18:05:47 +0100 Subject: [PATCH] get rid of symbol area errors --- .vscode/launch.json | 2 ++ provider/include/Coordinates.h | 11 +++++++++++ provider/include/requestHandler/ChartRequestHandler.h | 2 +- provider/src/DrawingContext.cpp | 6 +++--- provider/src/RenderHelper.cpp | 10 ++++++---- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index cbde5c0..b1abe2b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,6 +12,8 @@ "-k", "-d", "2", + "-c", + "0", "-g", "${workspaceFolder}/gui/build/debug", "-t", diff --git a/provider/include/Coordinates.h b/provider/include/Coordinates.h index d97c0c9..0d583a6 100644 --- a/provider/include/Coordinates.h +++ b/provider/include/Coordinates.h @@ -246,11 +246,22 @@ namespace Coord return rt; } + //be careful when using this: + //as the world coordinates are shifted the returned pixel are shifted too + //so normally it only make sense to call this for relative coordinates (e.g. relative to a tile) static inline Pixel worldToPixel(World c, uint32_t zoom){ if (zoom > COORD_ZOOM_LEVEL) return c; return bitshift(c,-((COORD_ZOOM_LEVEL-zoom)+SUB_PIXEL_BITS)); } + //convert to 0 based Pixel coordinates + static inline Pixel worldToAbsPixel(World c, uint32_t zoom){ + while (c > worldLimits.max()) c=worldLimits.shift(c,-worldLimits.worldShift()); + while (c < worldLimits.min()) c=worldLimits.shift(c,worldLimits.worldShift()); + c=worldLimits.clip(c); + return worldToPixel(worldLimits.shift(c,-worldLimits.halfshift()),zoom); + } + typedef Point PixelXy; static inline PixelXy worldToPixel(const WorldXy &c, uint32_t zoom){ return PixelXy(worldToPixel(c.x,zoom),worldToPixel(c.y,zoom)); diff --git a/provider/include/requestHandler/ChartRequestHandler.h b/provider/include/requestHandler/ChartRequestHandler.h index 1ed2fdc..ebcfd6b 100644 --- a/provider/include/requestHandler/ChartRequestHandler.h +++ b/provider/include/requestHandler/ChartRequestHandler.h @@ -381,7 +381,7 @@ class ChartRequestHandler : public RequestHandler { chartUrl=res.url; } else{ - return new HTTPErrorResponse(400,"unencryped url "+url); + ;//return new HTTPErrorResponse(400,"unencryped url "+url); } } TileInfo tile(chartUrl, chartSetKey); diff --git a/provider/src/DrawingContext.cpp b/provider/src/DrawingContext.cpp index 042f18c..db181f8 100644 --- a/provider/src/DrawingContext.cpp +++ b/provider/src/DrawingContext.cpp @@ -1043,12 +1043,12 @@ void DrawingContext::drawTriangle(const Coord::PixelXy &p00, const Coord::PixelX if (pyRaster > 0 && pxRaster > 0) { Coord::Pixel patterny = (y + pattern->yoffset) % pyRaster; - if (patterny < pattern->height) + if (patterny < pattern->height && patterny >= 0) { Coord::Pixel pxOffset = 0; if (pattern->stagger) { - if (((y + pattern->yoffset) / pyRaster) & 1) + if (((y + pattern->yoffset) / pyRaster) & 1) //shift pattern in every second row { pxOffset=pxRaster/2; } @@ -1057,7 +1057,7 @@ void DrawingContext::drawTriangle(const Coord::PixelXy &p00, const Coord::PixelX ColorAndAlpha *ptr = buffer.get() + y * linelen; for (Coord::Pixel x=xmin;x <= xmax; x++){ Coord::Pixel patternx= (x+pattern->xoffset+pxOffset)%pxRaster; - if (patternx < pattern->width){ + if (patternx < pattern->width && patternx >= 0){ ColorAndAlpha *target = ptr + x; ColorAndAlpha src= *(psrc+patternx); hasDrawn=true; diff --git a/provider/src/RenderHelper.cpp b/provider/src/RenderHelper.cpp index 44f8360..242e9af 100644 --- a/provider/src/RenderHelper.cpp +++ b/provider/src/RenderHelper.cpp @@ -249,10 +249,12 @@ DrawingContext::PatternSpec *RenderHelper::createPatternSpec(s52::SymbolPtr symb symbol->height); pattern->distance = symbol->minDist; pattern->stagger = symbol->stagger; - Coord::World xraster = pattern->width + pattern->distance; - Coord::World yraster = pattern->height + pattern->distance; - Coord::World xoffset = Coord::worldToPixel(tile.xmin,tile.zoom) % xraster; - Coord::World yoffset = Coord::worldToPixel(tile.ymin,tile.zoom) % yraster; + Coord::Pixel xraster = pattern->width + pattern->distance; + Coord::Pixel yraster = pattern->height + pattern->distance; + //we need some absolute pixel values for the % + //as our world coordinates are shifted we have to shift back + Coord::Pixel xoffset = Coord::worldToAbsPixel(tile.xmin,tile.zoom) % xraster; + Coord::Pixel yoffset = Coord::worldToAbsPixel(tile.ymin,tile.zoom) % yraster; pattern->xoffset = xoffset; pattern->yoffset = yoffset; return pattern;