using System;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEngine.UI
{
///
/// Utility class that is used to help with Text update.
///
///
/// When Unity rebuilds a font atlas a callback is sent to the font. Using this class you can register your text as needing to be rebuilt if the font atlas is updated.
///
public static class FontUpdateTracker
{
static Dictionary> m_Tracked = new Dictionary>();
///
/// Register a Text element for receiving texture atlas rebuild calls.
///
/// The Text object to track
public static void TrackText(Text t)
{
if (t.font == null)
return;
HashSet exists;
m_Tracked.TryGetValue(t.font, out exists);
if (exists == null)
{
// The textureRebuilt event is global for all fonts, so we add our delegate the first time we register *any* Text
if (m_Tracked.Count == 0)
Font.textureRebuilt += RebuildForFont;
exists = new HashSet();
m_Tracked.Add(t.font, exists);
}
exists.Add(t);
}
private static void RebuildForFont(Font f)
{
HashSet texts;
m_Tracked.TryGetValue(f, out texts);
if (texts == null)
return;
foreach (var text in texts)
text.FontTextureChanged();
}
///
/// Deregister a Text element from receiving texture atlas rebuild calls.
///
/// The Text object to no longer track
public static void UntrackText(Text t)
{
if (t.font == null)
return;
HashSet texts;
m_Tracked.TryGetValue(t.font, out texts);
if (texts == null)
return;
texts.Remove(t);
if (texts.Count == 0)
{
m_Tracked.Remove(t.font);
// There is a global textureRebuilt event for all fonts, so once the last Text reference goes away, remove our delegate
if (m_Tracked.Count == 0)
Font.textureRebuilt -= RebuildForFont;
}
}
}
}