mirror of
https://github.com/Facepunch/sbox-public.git
synced 2026-08-04 09:43:37 -04:00
* don't normalize remote uris * re-use existing url checks + data uri case insensitivity --------- Co-authored-by: Noztik <26806727+Noztik@users.noreply.github.com>
50 lines
1.3 KiB
C#
50 lines
1.3 KiB
C#
using System;
|
|
using System.IO;
|
|
|
|
namespace Sandbox.TextureLoader;
|
|
|
|
internal static class ImageDataUri
|
|
{
|
|
private const string InlinePrefixPng = "data:image/png;base64,";
|
|
private const string InlinePrefixJpeg = "data:image/jpeg;base64,";
|
|
|
|
internal static bool IsAppropriate( string uri )
|
|
{
|
|
return uri.StartsWith( InlinePrefixPng, StringComparison.OrdinalIgnoreCase ) || uri.StartsWith( InlinePrefixJpeg, StringComparison.OrdinalIgnoreCase );
|
|
}
|
|
|
|
internal static Texture Load( string uri, bool warnOnMissing )
|
|
{
|
|
try
|
|
{
|
|
if ( TryParseDataImage( InlinePrefixPng, uri, out var data ) ||
|
|
TryParseDataImage( InlinePrefixJpeg, uri, out data ) )
|
|
{
|
|
using var ms = new MemoryStream( data );
|
|
return Image.Load( ms, uri );
|
|
}
|
|
|
|
Log.Warning( $"{nameof( ImageDataUri )} does not support loading: {uri}" );
|
|
return null;
|
|
}
|
|
catch ( System.Exception e )
|
|
{
|
|
Log.Warning( $"Couldn't Load from data URI: {uri} ({e.Message})" );
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private static bool TryParseDataImage( string prefix, string image, out byte[] data )
|
|
{
|
|
if ( !image.StartsWith( prefix, StringComparison.OrdinalIgnoreCase ) )
|
|
{
|
|
data = null;
|
|
return false;
|
|
}
|
|
|
|
var dataStr = image.Substring( prefix.Length );
|
|
data = Convert.FromBase64String( dataStr );
|
|
return true;
|
|
}
|
|
}
|