Dynamically load/unload Unihex font data
This commit is contained in:
parent
ac8d93d5b9
commit
9edce9ad91
|
|
@ -0,0 +1,20 @@
|
|||
package org.embeddedt.modernfix.common.mixin.perf.compress_unihex_font;
|
||||
|
||||
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import net.minecraft.client.gui.font.providers.GlyphProviderDefinition;
|
||||
import net.minecraft.client.gui.font.providers.GlyphProviderType;
|
||||
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||
import org.embeddedt.modernfix.render.font.LazyGlyphProvider;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
|
||||
@Mixin(GlyphProviderType.class)
|
||||
@ClientOnlyMixin
|
||||
public class GlyphProviderTypeMixin {
|
||||
@ModifyExpressionValue(method = "<clinit>", at = @At(value = "FIELD", opcode = Opcodes.GETSTATIC, target = "Lnet/minecraft/client/gui/font/providers/UnihexProvider$Definition;CODEC:Lcom/mojang/serialization/MapCodec;"))
|
||||
private static MapCodec<? extends GlyphProviderDefinition> lazyUnihex(MapCodec<? extends GlyphProviderDefinition> codec) {
|
||||
return LazyGlyphProvider.wrap(codec);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
package org.embeddedt.modernfix.render.font;
|
||||
|
||||
import com.mojang.blaze3d.font.GlyphInfo;
|
||||
import com.mojang.blaze3d.font.GlyphProvider;
|
||||
import com.mojang.datafixers.util.Either;
|
||||
import com.mojang.serialization.MapCodec;
|
||||
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
|
||||
import it.unimi.dsi.fastutil.ints.IntSet;
|
||||
import net.minecraft.client.gui.font.providers.GlyphProviderDefinition;
|
||||
import net.minecraft.client.gui.font.providers.GlyphProviderType;
|
||||
import net.minecraft.server.packs.resources.ResourceManager;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class LazyGlyphProvider implements GlyphProvider {
|
||||
private final GlyphProviderDefinition.Loader loader;
|
||||
private final ResourceManager manager;
|
||||
|
||||
private SoftReference<GlyphProvider> innerProvider = new SoftReference<>(null);
|
||||
|
||||
private IntSet supportedGlyphs;
|
||||
|
||||
LazyGlyphProvider(GlyphProviderDefinition.Loader loader, ResourceManager manager) {
|
||||
this.loader = loader;
|
||||
this.manager = manager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
// best effort
|
||||
var prov = innerProvider.get();
|
||||
if (prov != null) {
|
||||
prov.close();
|
||||
}
|
||||
}
|
||||
|
||||
private @Nullable GlyphProvider getGlyphProvider() {
|
||||
GlyphProvider prov = innerProvider.get();
|
||||
if (prov == null) {
|
||||
try {
|
||||
prov = this.loader.load(this.manager);
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
innerProvider = new SoftReference<>(prov);
|
||||
}
|
||||
return prov;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable GlyphInfo getGlyph(int character) {
|
||||
var prov = getGlyphProvider();
|
||||
if (prov != null) {
|
||||
return prov.getGlyph(character);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public IntSet getSupportedGlyphs() {
|
||||
if (supportedGlyphs == null) {
|
||||
var prov = getGlyphProvider();
|
||||
if (prov != null) {
|
||||
supportedGlyphs = new IntOpenHashSet(prov.getSupportedGlyphs());
|
||||
} else {
|
||||
supportedGlyphs = IntSet.of();
|
||||
}
|
||||
}
|
||||
return supportedGlyphs;
|
||||
}
|
||||
|
||||
private static class Definition implements GlyphProviderDefinition {
|
||||
private final GlyphProviderDefinition delegate;
|
||||
|
||||
public Definition(GlyphProviderDefinition delegate) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GlyphProviderType type() {
|
||||
return this.delegate.type();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Either<Loader, Reference> unpack() {
|
||||
return this.delegate.unpack().mapBoth(
|
||||
loader -> resourceManager -> new LazyGlyphProvider(loader, resourceManager),
|
||||
Function.identity()
|
||||
);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends GlyphProviderDefinition> T delegate() {
|
||||
return (T)this.delegate;
|
||||
}
|
||||
}
|
||||
|
||||
public static MapCodec<? extends GlyphProviderDefinition> wrap(MapCodec<? extends GlyphProviderDefinition> codec) {
|
||||
return codec.xmap(Definition::new, Definition::delegate);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user