60 {
61 if (_openSlideBase == null && _slideBase == null)
62 return;
63 if (viewportWidth <= 1 && viewportHeight <= 1)
64 return;
65 var schema = _useOpenSlide ? _openSlideBase.Schema : _slideBase.Schema;
66
67 int level = TileUtil.GetLevel(schema.Resolutions, resolution);
68 var levelRes = schema.Resolutions[level];
69 double levelUnitsPerPixel = levelRes.UnitsPerPixel;
70
71 if (level != _currentLevel)
72 {
74 _currentLevel = level;
75 }
76
77
78 double minX = pyramidalOrigin.X * resolution;
79 double minY = -pyramidalOrigin.Y * resolution;
80 double width = viewportWidth * resolution;
81 double height = viewportHeight * resolution;
82 var worldExtent = new Extent(minX, minY - height, minX + width, minY);
83
84
85 var tileInfos = schema.GetTileInfos(worldExtent, level).ToList();
86
87 if (tileInfos.Count == 0)
88 {
89 var pixelExtent = OpenSlideGTK.ExtentEx.WorldToPixelInvertedY(worldExtent, resolution);
90 tileInfos = schema.GetTileInfos(pixelExtent, level).ToList();
91 }
92
93 if (_openSlideBase != null)
94 await _openSlideBase.FetchTilesAsync(tileInfos.ToList(), level, coordinate);
95 else
96 await _slideBase.FetchTilesAsync(tileInfos.ToList(), level, coordinate, pyramidalOrigin, new AForge.Size(viewportWidth, viewportHeight));
97
98 var renderInfos = new List<TileRenderInfo>();
99 foreach (var tileInfo in tileInfos)
100 {
102 {
103 byte[] tileData;
104 if (_useOpenSlide)
105 tileData = await _openSlideBase.GetTileAsync(tileInfo);
106 else
107 tileData = await _slideBase.GetTileAsync(tileInfo, coordinate);
108 if (tileData != null)
109 {
110
111
112 int tW = (int)Math.Round(tileInfo.Extent.Width / levelUnitsPerPixel);
113 int tH = (int)Math.Round(tileInfo.Extent.Height / levelUnitsPerPixel);
114
116 _uploadedTiles.Add(tileInfo.Index);
117 }
118 }
119
121 {
122 var renderInfo = CalculateScreenPosition(
123 tileInfo,
124 pyramidalOrigin,
125 resolution,
126 level,
127 schema);
128 renderInfos.Add(renderInfo);
129 }
130 }
131
134 }
void ReleaseLevelTextures(int level)
Release all textures for a specific pyramid level.
void SetTilesToRender(IEnumerable< TileRenderInfo > tiles)
Prepare tiles for rendering. Call before RequestRedraw().
bool UploadTileTexture(TileIndex index, byte[] pixelData, int tileWidth, int tileHeight)
Upload a tile texture to the GPU. Call from the main thread. Returns true if upload succeeded.
void RequestRedraw()
Request a redraw of the GLArea.
bool HasTileTexture(TileIndex index)
Check if a tile texture is already in the GPU cache.