using UnityEngine;
using UnityEditor;
using System.Collections;
using System;
using System.Runtime.InteropServices;


namespace TMPro.EditorUtilities 
{   
    public class TMPro_FontPlugin
    {
        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        private delegate void DebugLog(string log);
        private static readonly DebugLog debugLog = DebugWrapper;
        private static readonly IntPtr functionPointer = Marshal.GetFunctionPointerForDelegate(debugLog);

        private static void DebugWrapper(string log)
        {
            Debug.Log(log);
        }

        public static void LinkDebugLog()
        {
            LinkDebug(functionPointer);
        }

        [DllImport("TMPro_Plugin")]
        private static extern void LinkDebug([MarshalAs(UnmanagedType.FunctionPtr)]IntPtr debugCall);

        [DllImport("TMPro_Plugin")]
        public static extern
            int Initialize_FontEngine();

        [DllImport("TMPro_Plugin")]
        public static extern
            int Destroy_FontEngine();

        [DllImport("TMPro_Plugin")]
        public static extern
            int Load_TrueType_Font(string fontPath);

        [DllImport("TMPro_Plugin")]
        public static extern
            int FT_Size_Font(int fontSize);

        [DllImport("TMPro_Plugin")]
        public static extern
            int Render_Character(byte[] buffer_fill, byte[] buffer_edge, int buffer_width, int buffer_height, int offset, int asc, FaceStyles style, float thickness, RenderModes rasterMode, ref FT_GlyphInfo glyphInfo);

        [DllImport("TMPro_Plugin")]
        public static extern
            int Render_Characters(byte[] buffer, int buffer_width, int buffer_height, int character_padding, int[] asc_set, int char_count, FaceStyles style, float style_mod, bool autoSize, RenderModes renderMode, int method, ref FT_FaceInfo fontData, FT_GlyphInfo[] Output);

        [DllImport("TMPro_Plugin")]
        public static extern
            int FT_GetKerningPairs(string fontPath, int[] characterSet, int setCount, FT_KerningPair[] kerningPairs);

        [DllImport("TMPro_Plugin")]
        public static extern
            float Check_RenderProgress();

        [DllImport("TMPro_Plugin")]
        internal static extern
            void SendCancellationRequest(CancellationRequestType request);
    }

        public enum FaceStyles { Normal, Bold, Italic, Bold_Italic, Outline, Bold_Sim };
        public enum RenderModes { HintedSmooth = 0, Smooth = 1, RasterHinted = 2, Raster = 3, DistanceField16 = 6, DistanceField32 = 7 };  // SignedDistanceField64 = 8

        internal enum CancellationRequestType : byte { None = 0x0, CancelInProgess = 0x1, WindowClosed = 0x2 };

        [StructLayout(LayoutKind.Sequential)]
        public struct FT_KerningPair
        {
            public int ascII_Left;
            public int ascII_Right;
            public float xAdvanceOffset;
        }
    
    
        [StructLayout(LayoutKind.Sequential)]
        public struct FT_GlyphInfo
        {
            public int id;
            public float x;
            public float y;
            public float width;
            public float height;
            public float xOffset;
            public float yOffset;
            public float xAdvance;
        }


        [StructLayout(LayoutKind.Sequential)] 
        public struct FT_FaceInfo
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
            public string name;
            public int pointSize;
            public int padding;
            public float lineHeight;
            public float baseline;
            public float ascender;
            public float descender;
            public float centerLine;
            public float underline;
            public float underlineThickness;
            public int characterCount;
            public int atlasWidth;
            public int atlasHeight;
        }
     
}
