BioImager  4.9.0
A .NET microscopy imaging application based on Bio library. Supports various microscopes by using imported libraries & GUI automation. Supports XInput game controllers to move stage, take images, run ImageJ macros on images or Bio C# scripts.
Loading...
Searching...
No Matches
BioImager.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 13 of file SlideRenderer.cs.

Constructor & Destructor Documentation

◆ SlideRenderer()

BioImager.SlideRenderer.SlideRenderer ( SlideGLArea glArea)

Definition at line 24 of file SlideRenderer.cs.

25 {
26 _glArea = glArea;
27 }

Member Function Documentation

◆ ClearCache()

void BioImager.SlideRenderer.ClearCache ( )

Definition at line 47 of file SlideRenderer.cs.

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

◆ SetSource() [1/2]

void BioImager.SlideRenderer.SetSource ( OpenSlideBase source)

Definition at line 29 of file SlideRenderer.cs.

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

◆ SetSource() [2/2]

void BioImager.SlideRenderer.SetSource ( SlideBase source)

Definition at line 38 of file SlideRenderer.cs.

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

◆ UpdateViewAsync()

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

Definition at line 54 of file SlideRenderer.cs.

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

Property Documentation

◆ CachedTextureCount

int BioImager.SlideRenderer.CachedTextureCount
get

Definition at line 192 of file SlideRenderer.cs.

◆ CurrentLevel

int BioImager.SlideRenderer.CurrentLevel
get

Definition at line 191 of file SlideRenderer.cs.


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