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