public static void Encode(Texture2D src, Texture2D dst, bool gpu = false,
                           YCgACoFormat format = YCgACoFormat.CgACoY_DontChange,
                           int quality = 100)
 {
     var pixels = src.GetPixels();
     Resize(src, dst, format);
     var resized = src.width != dst.width || src.height != dst.height;
     if (gpu)
     {
         // TODO: Force mipmap and trilinear when resized.
         var shader = Shader.Find("Hidden/RGBA to CgACoY");
         var mat = new Material(shader);
         var temp = RenderTexture.GetTemporary(dst.width, dst.height);
         Graphics.Blit(src, temp, mat);
         dst.ReadPixels(new Rect(0, 0, dst.width, dst.height), 0, 0);
         RenderTexture.ReleaseTemporary(temp);
         Object.DestroyImmediate(mat);
     }
     else
     {
         if (resized)
         {
             var srcPixels = pixels;
             pixels = dst.GetPixels();
             Shrink(srcPixels, pixels, src.width, dst.width);
         }
         RGBAToCgACoY(pixels, pixels);
         dst.SetPixels(pixels);
     }
     Compress(dst, format, quality);
 }
    public static void Encode(Texture2D src, Texture2D dst, bool gpu = false,
                              YCgACoFormat format = YCgACoFormat.CgACoY_DontChange,
                              int quality         = 100)
    {
        var pixels = src.GetPixels();

        Resize(src, dst, format);
        var resized = src.width != dst.width || src.height != dst.height;

        if (gpu)
        {
            // TODO: Force mipmap and trilinear when resized.
            var shader = Shader.Find("Hidden/RGBA to CgACoY");
            var mat    = new Material(shader);
            var temp   = RenderTexture.GetTemporary(dst.width, dst.height);
            Graphics.Blit(src, temp, mat);
            dst.ReadPixels(new Rect(0, 0, dst.width, dst.height), 0, 0);
            RenderTexture.ReleaseTemporary(temp);
            Object.DestroyImmediate(mat);
        }
        else
        {
            if (resized)
            {
                var srcPixels = pixels;
                pixels = dst.GetPixels();
                Shrink(srcPixels, pixels, src.width, dst.width);
            }
            RGBAToCgACoY(pixels, pixels);
            dst.SetPixels(pixels);
        }
        Compress(dst, format, quality);
    }
    static void Resize(Texture src, Texture2D dst, YCgACoFormat format)
    {
        var width  = src.width;
        var height = src.height;

        switch (format)
        {
        case YCgACoFormat.CgACo_RGB24_Half_6bpp:
        case YCgACoFormat.CgACo_RGB565_Half_4bpp:
            width  /= 2;
            height /= 2;
            break;
        }
        if (dst.width != width || dst.height != height)
        {
            dst.Resize(width, height);
        }
    }
    static void Compress(Texture2D dst, YCgACoFormat format, int quality)
    {
        var texFormat = dst.format;

        switch (format)
        {
        case YCgACoFormat.Y_Alpha8_8bpp:
            texFormat = TextureFormat.Alpha8;
            break;

        case YCgACoFormat.CgACo_PVRTC_4bpp:
            texFormat = TextureFormat.PVRTC_RGB4;
            break;

        case YCgACoFormat.CgACo_PVRTC_2bpp:
            texFormat = TextureFormat.PVRTC_RGBA2;
            break;

        case YCgACoFormat.CgACo_ETC_4bpp:
            texFormat = TextureFormat.ETC_RGB4;
            break;

        case YCgACoFormat.CgACo_DXT_4bpp:
            texFormat = TextureFormat.DXT1;
            break;

        case YCgACoFormat.CgACo_RGB24_Half_6bpp:
            texFormat = TextureFormat.RGB24;
            break;

        case YCgACoFormat.CgACo_RGB565_Half_4bpp:
        case YCgACoFormat.CgACo_RGB565_16bpp:
            texFormat = TextureFormat.RGB565;
            break;

        case YCgACoFormat.CgACoY_DontChange:
            return;
        }
        EditorUtility.CompressTexture(dst, texFormat, quality);
    }
 static void Resize(Texture src, Texture2D dst, YCgACoFormat format)
 {
     var width = src.width;
     var height = src.height;
     switch (format)
     {
         case YCgACoFormat.CgACo_RGB24_Half_6bpp:
         case YCgACoFormat.CgACo_RGB565_Half_4bpp:
             width /= 2;
             height /= 2;
             break;
     }
     if (dst.width != width || dst.height != height)
         dst.Resize(width, height);
 }
 static void Compress(Texture2D dst, YCgACoFormat format, int quality)
 {
     var texFormat = dst.format;
     switch (format)
     {
         case YCgACoFormat.Y_Alpha8_8bpp:
             texFormat = TextureFormat.Alpha8;
             break;
         case YCgACoFormat.CgACo_PVRTC_4bpp:
             texFormat = TextureFormat.PVRTC_RGB4;
             break;
         case YCgACoFormat.CgACo_PVRTC_2bpp:
             texFormat = TextureFormat.PVRTC_RGBA2;
             break;
         case YCgACoFormat.CgACo_ETC_4bpp:
             texFormat = TextureFormat.ETC_RGB4;
             break;
         case YCgACoFormat.CgACo_DXT_4bpp:
             texFormat = TextureFormat.DXT1;
             break;
         case YCgACoFormat.CgACo_RGB24_Half_6bpp:
             texFormat = TextureFormat.RGB24;
             break;
         case YCgACoFormat.CgACo_RGB565_Half_4bpp:
         case YCgACoFormat.CgACo_RGB565_16bpp:
             texFormat = TextureFormat.RGB565;
             break;
         case YCgACoFormat.CgACoY_DontChange:
             return;
     }
     EditorUtility.CompressTexture(dst, texFormat, quality);
 }