Skip to content

Commit

Permalink
Merge pull request #15787 from tschaub/palette
Browse files Browse the repository at this point in the history
Delete palette texture before creating a new context
  • Loading branch information
tschaub committed May 1, 2024
2 parents d709c05 + 431914b commit d95726b
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 0 deletions.
23 changes: 23 additions & 0 deletions src/ol/renderer/webgl/TileLayer.js
Expand Up @@ -129,10 +129,17 @@ class WebGLTileLayerRenderer extends WebGLBaseTileLayerRenderer {
*/
reset(options) {
super.reset(options);
if (this.helper) {
const gl = this.helper.getGL();
for (const paletteTexture of this.paletteTextures_) {
paletteTexture.delete(gl);
}
}

this.vertexShader_ = options.vertexShader;
this.fragmentShader_ = options.fragmentShader;
this.paletteTextures_ = options.paletteTextures || [];

if (this.helper) {
this.program_ = this.helper.getProgram(
this.fragmentShader_,
Expand All @@ -149,6 +156,17 @@ class WebGLTileLayerRenderer extends WebGLBaseTileLayerRenderer {
this.helper.flushBufferData(this.indices_);
}

removeHelper() {
if (this.helper) {
const gl = this.helper.getGL();
for (const paletteTexture of this.paletteTextures_) {
paletteTexture.delete(gl);
}
}

super.removeHelper();
}

createTileRepresentation(options) {
return new TileTexture(options);
}
Expand Down Expand Up @@ -358,6 +376,11 @@ class WebGLTileLayerRenderer extends WebGLBaseTileLayerRenderer {
const helper = this.helper;
if (helper) {
const gl = helper.getGL();
for (const paletteTexture of this.paletteTextures_) {
paletteTexture.delete(gl);
}
this.paletteTextures_.length = 0;

gl.deleteProgram(this.program_);
delete this.program_;
helper.deleteBuffer(this.indices_);
Expand Down
10 changes: 10 additions & 0 deletions src/ol/webgl/PaletteTexture.js
Expand Up @@ -45,6 +45,16 @@ class PaletteTexture {
}
return this.texture_;
}

/**
* @param {WebGLRenderingContext} gl Rendering context.
*/
delete(gl) {
if (this.texture_) {
gl.deleteTexture(this.texture_);
}
this.texture_ = null;
}
}

export default PaletteTexture;
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
49 changes: 49 additions & 0 deletions test/rendering/cases/cog-palette-add-remove/main.js
@@ -0,0 +1,49 @@
import GeoTIFF from '../../../../src/ol/source/GeoTIFF.js';
import Map from '../../../../src/ol/Map.js';
import TileLayer from '../../../../src/ol/layer/WebGLTile.js';

const source = new GeoTIFF({
sources: [
{
url: '/data/raster/sentinel-b04.tif',
min: 0,
max: 10000,
},
{
url: '/data/raster/sentinel-b08.tif',
min: 0,
max: 10000,
},
],
transition: 100,
});

const nir = ['band', 2];
const red = ['band', 1];
const ndvi = ['/', ['-', nir, red], ['+', nir, red]];

const layer = new TileLayer({
source: source,
style: {
color: [
'palette',
['interpolate', ['linear'], ndvi, -0.2, 0, 0.65, 4],
['#440154', '#3b528b', '#21918c', '#5ec962', '#fde725'],
],
},
});

const map = new Map({
layers: [layer],
target: 'map',
view: source.getView(),
});

// regression test for https://github.com/openlayers/openlayers/issues/15786
map.once('rendercomplete', () => {
map.removeLayer(layer);
map.addLayer(layer);
render({
message: 'palette still works after adding and removing layer',
});
});

0 comments on commit d95726b

Please sign in to comment.