Just noticed that the plugin I quickly wrote to open TIM files does not show a thumbnail preview in Windows Explorer, in the following screenshot both PNG and TIM are associated to be opened by the software, PNG shows a preview thumbnail but TIM doesn't:
Is there something I'm missing in order to get thumbnail previews in Explorer ?
This is the current code:
using System.IO;
using System.Text;
using PaintDotNet;
using PaintDotNet.PropertySystem;
namespace TimFileType;
#pragma warning disable CA1416 // Validate platform compatibility
public sealed class TimFileTypeFactory : IFileTypeFactory2
{
public FileType[] GetFileTypeInstances(IFileTypeHost host)
{
return new FileType[] { new TimFileTypeClass(host.Services) };
}
}
[PluginSupportInfo(typeof(PluginSupportInfo))]
public class TimFileTypeClass : PropertyBasedFileType
{
public TimFileTypeClass(IServiceProvider serviceProvider)
: base("TIM: Screen Image Data", new FileTypeOptions { LoadExtensions = new[] { ".tim" } })
{
ServiceProvider = serviceProvider;
}
private IServiceProvider ServiceProvider { get; }
protected override unsafe Document OnLoad(Stream input)
{
using var reader = new BinaryReader(input, Encoding.Default, true);
reader.ReadByte();
reader.ReadByte();
reader.ReadInt16();
var flags = reader.ReadInt32();
var format = flags & 0b111;
var palette = (flags & 0b1000) != 0;
if (palette)
{
var length = reader.ReadInt32();
reader.BaseStream.Position += length - 4;
}
// 24-bit only for now
var pixelDataSize = reader.ReadInt32();
var frameBufferX = reader.ReadInt16();
var frameBufferY = reader.ReadInt16();
var pixelWidth = reader.ReadInt16();
var pixelHeight = reader.ReadInt16();
var pixelData = reader.ReadBytes(pixelDataSize - 12);
pixelWidth = (short)(pixelWidth * 2 / 3);
var layer = Layer.CreateBackgroundLayer(pixelWidth, pixelHeight);
var pointer = layer.Surface.GetRowPointer(0);
for (var i = 0; i < pixelWidth * pixelHeight; i ++)
{
pointer->R = pixelData[i*3 + 0];
pointer->G = pixelData[i*3 + 1];
pointer->B = pixelData[i*3 + 2];
pointer->A = byte.MaxValue;
pointer++;
}
var document = new Document(pixelWidth, pixelHeight);
document.Layers.Add(layer);
return document;
}
protected override void OnSaveT(Document input, Stream output, PropertyBasedSaveConfigToken token, Surface scratchSurface, ProgressEventHandler progressCallback)
{
throw new NotImplementedException();
}
public override PropertyCollection OnCreateSavePropertyCollection()
{
throw new NotImplementedException();
}
}
Any suggestions are welcome! π