+#define MAX_RESOLUTION 500
+#define TILE_WIDTH 1024
+#define TILE_HEIGHT 512
+
+static void _load_tile(GisTile *tile, gpointer _self)
+{
+ GisPluginBmng *self = _self;
+ g_debug("GisPluginBmng: _load_tile start");
+
+ char *path = gis_wms_make_local(self->wms, tile);
+ GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(path, NULL);
+ g_free(path);
+
+ guchar *pixels = gdk_pixbuf_get_pixels(pixbuf);
+ gboolean alpha = gdk_pixbuf_get_has_alpha(pixbuf);
+ gint width = gdk_pixbuf_get_width(pixbuf);
+ gint height = gdk_pixbuf_get_height(pixbuf);
+
+ guint *tex = g_new0(guint, 1);
+ gis_opengl_begin(self->opengl);
+ glGenTextures(1, tex);
+ glBindTexture(GL_TEXTURE_2D, *tex);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glPixelStorei(GL_PACK_ALIGNMENT, 1);
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0,
+ (alpha ? GL_RGBA : GL_RGB), GL_UNSIGNED_BYTE, pixels);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
+ glFlush();
+ gis_opengl_end(self->opengl);
+
+ tile->data = tex;
+ gis_opengl_redraw(self->opengl);
+ g_object_unref(pixbuf);
+}
+
+static void _free_tile(GisTile *tile, gpointer _self)
+{
+ GisPluginBmng *self = _self;
+ g_debug("GisPluginBmng: _free_tile: %p=%d", tile->data, *(guint*)tile->data);
+ guint *data = tile->data;
+ glDeleteTextures(1, data);
+ g_free(data);
+}
+
+static gpointer _update_tiles(gpointer _self)