Exemple #1
0
        internal static byte[] GetPixelData(Bitmap img, int format, bool rectangle = true)
        {
            int w = img.Width;
            int h = img.Height;

            bool perfect = w == h && (w != 0) && ((w & (w - 1)) == 0);

            if (!perfect)               // Check if square power of two, else resize
            {
                // Square Format Checks
                if (rectangle && Math.Min(img.Width, img.Height) < 32)
                {
                    w = Bclim.Nlpo2(img.Width);
                    h = Bclim.Nlpo2(img.Height);
                }
                else
                {
                    w = h = Math.Max(Bclim.Nlpo2(w), Bclim.Nlpo2(h));                           // else resize
                }
            }

            using (MemoryStream mz = new MemoryStream())
                using (BinaryWriter bz = new BinaryWriter(mz))
                {
                    int p = Bclim.Gcm(w, 8) / 8;
                    if (p == 0)
                    {
                        p = 1;
                    }
                    for (uint i = 0; i < w * h; i++)
                    {
                        Bclim.D2Xy(i % 64, out uint x, out uint y);

                        // Get Shift Tile
                        uint tile = i / 64;

                        // Shift Tile Coordinate into Tilemap
                        x += (uint)(tile % p) * 8;
                        y += (uint)(tile / p) * 8;

                        // Don't write data
                        Color c;
                        if (x >= img.Width || y >= img.Height)
                        {
                            c = Color.FromArgb(0, 0, 0, 0);
                        }
                        else
                        {
                            c = img.GetPixel((int)x, (int)y);
                            if (c.A == 0)
                            {
                                c = Color.FromArgb(0, 86, 86, 86);
                            }
                        }

                        switch (format)
                        {
                        case 0:
                            bz.Write(Bclim.GetL8(c));
                            break;                             // L8

                        case 1:
                            bz.Write(Bclim.GetA8(c));
                            break;                             // A8

                        case 2:
                            bz.Write(Bclim.GetLA4(c));
                            break;                             // LA4(4)

                        case 3:
                            bz.Write(Bclim.GetLA8(c));
                            break;                             // LA8(8)

                        case 4:
                            bz.Write(Bclim.GetHilo8(c));
                            break;                             // HILO8

                        case 5:
                            bz.Write(Bclim.GetRgb565(c));
                            break;                             // RGB565

                        case 6:
                        {
                            bz.Write(c.B);
                            bz.Write(c.G);
                            bz.Write(c.R);
                            break;
                        }

                        case 7:
                            bz.Write(Bclim.GetRgba5551(c));
                            break;                             // RGBA5551

                        case 8:
                            bz.Write(Bclim.GetRgba4444(c));
                            break;                             // RGBA4444

                        case 9:
                            bz.Write(Bclim.GetRgba8888(c));
                            break;                             // RGBA8

                        case 10: throw new Exception("ETC1 not supported.");

                        case 11: throw new Exception("ETC1A4 not supported.");

                        case 12:
                        {
                            byte val = (byte)(Bclim.GetL8(c) / 0x11);                                  // First Pix    // L4
                            {
                                c = img.GetPixel((int)x, (int)y);
                                if (c.A == 0)
                                {
                                    c = Color.FromArgb(0, 0, 0, 0);
                                }
                            }
                            val |= (byte)((Bclim.GetL8(c) / 0x11) << 4);
                            i++;
                            bz.Write(val);
                            break;
                        }

                        case 13:
                        {
                            byte val = (byte)(Bclim.GetA8(c) / 0x11);                                  // First Pix    // L4
                            {
                                c = img.GetPixel((int)x, (int)y);
                            }
                            val |= (byte)((Bclim.GetA8(c) / 0x11) << 4);
                            i++;
                            bz.Write(val);
                            break;
                        }
                        }
                    }
                    if (!perfect)
                    {
                        while (mz.Length < Bclim.Nlpo2((int)mz.Length))                      // pad
                        {
                            bz.Write((byte)0);
                        }
                    }
                    return(mz.ToArray());
                }
        }