BioGTK  6.5.0
A .NET library & program for annotating, editing various microscopy imaging formats using Bioformats supported images. Including whole slide, pyramidal, and series.
Loading...
Searching...
No Matches
BioGTK.SlideRenderer Class Reference

Public Member Functions

 SlideRenderer (SlideGLArea glArea)
 
void SetSource (OpenSlideBase source)
 
void SetSource (SlideBase source)
 
void ClearCache ()
 
async Task UpdateViewAsync (PointD pyramidalOrigin, int viewportWidth, int viewportHeight, double resolution, ZCT coordinate)
 

Properties

int CurrentLevel [get]
 
int CachedTextureCount [get]
 

Detailed Description

Definition at line 11 of file SlideRenderer.cs.

Constructor & Destructor Documentation

◆ SlideRenderer()

BioGTK.SlideRenderer.SlideRenderer ( SlideGLArea glArea)

Definition at line 22 of file SlideRenderer.cs.

23 {
24 _glArea = glArea;
25 }

Member Function Documentation

◆ ClearCache()

void BioGTK.SlideRenderer.ClearCache ( )

Definition at line 45 of file SlideRenderer.cs.

46 {
47 _glArea.ClearTextureCache();
48 _uploadedTiles.Clear();
49 _currentLevel = -1;
50 }
void ClearTextureCache()
Clear all cached textures.

◆ SetSource() [1/2]

void BioGTK.SlideRenderer.SetSource ( OpenSlideBase source)

Definition at line 27 of file SlideRenderer.cs.

28 {
29 _openSlideBase = source;
30 _slideBase = null;
31 _useOpenSlide = true;
32 _openTileCache = new OpenSlideGTK.TileCache(source, 200);
33 ClearCache();
34 }

◆ SetSource() [2/2]

void BioGTK.SlideRenderer.SetSource ( SlideBase source)

Definition at line 36 of file SlideRenderer.cs.

37 {
38 _slideBase = source;
39 _openSlideBase = null;
40 _useOpenSlide = false;
41 _tileCache = new BioLib.TileCache(source, 200);
42 ClearCache();
43 }

◆ UpdateViewAsync()

async Task BioGTK.SlideRenderer.UpdateViewAsync ( PointD pyramidalOrigin,
int viewportWidth,
int viewportHeight,
double resolution,
ZCT coordinate )

Definition at line 52 of file SlideRenderer.cs.

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 {
71 _glArea.ReleaseLevelTextures(_currentLevel);
72 _currentLevel = level;
73 }
74
75 // Calculate world extent for the viewport
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 // Get tiles that intersect the viewport
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 {
99 if (!_glArea.HasTileTexture(tileInfo.Index))
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 // Fix: Calculate actual tile dimensions from extent, do not hardcode 256.
109 // This handles edge tiles that might be smaller.
110 int tW = (int)Math.Round(tileInfo.Extent.Width / levelUnitsPerPixel);
111 int tH = (int)Math.Round(tileInfo.Extent.Height / levelUnitsPerPixel);
112
113 _glArea.UploadTileTexture(tileInfo.Index, tileData, tW, tH);
114 _uploadedTiles.Add(tileInfo.Index);
115 }
116 }
117
118 if (_glArea.HasTileTexture(tileInfo.Index))
119 {
120 var renderInfo = CalculateScreenPosition(
121 tileInfo,
122 pyramidalOrigin,
123 resolution,
124 level,
125 schema);
126 renderInfos.Add(renderInfo);
127 }
128 }
129
130 _glArea.SetTilesToRender(renderInfos);
131 _glArea.RequestRedraw();
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().

Property Documentation

◆ CachedTextureCount

int BioGTK.SlideRenderer.CachedTextureCount
get

Definition at line 190 of file SlideRenderer.cs.

◆ CurrentLevel

int BioGTK.SlideRenderer.CurrentLevel
get

Definition at line 189 of file SlideRenderer.cs.


The documentation for this class was generated from the following file: