Пример #1
0
        public void GenerateMipMaps(int minMipWidth = 1, int minMipHeight = 1)
        {
            int mipCount = DdsHeader.CountMipMaps(Width, Height);

            int mipWidth  = Width;
            int mipHeight = Height;

            MipMaps = new List <DdsMipMap> {
                new DdsMipMap(Width, Height, largestMipMap)
            };

            for (int mipLoop = 1; mipLoop < mipCount; mipLoop++)
            {
                if (mipWidth > minMipWidth)
                {
                    mipWidth /= 2;
                }
                if (mipHeight > minMipHeight)
                {
                    mipHeight /= 2;
                }

                DdsMipMap writeSize = new DdsMipMap(mipWidth, mipHeight);

                WriteableBitmap mipMap = new WriteableBitmap(BitmapSource);

                writeSize.MipMap = mipMap.ResizeHighQuality(writeSize.Width, writeSize.Height).ConvertToRgba();

                MipMaps.Add(writeSize);
            }
        }
Пример #2
0
    public void GenerateMipMaps(int minMipWidth = 1, int minMipHeight = 1) {
      int mipCount = DdsHeader.CountMipMaps(Width, Height);

      int mipWidth  = Width;
      int mipHeight = Height;

      MipMaps = new List<DdsMipMap> { new DdsMipMap(Width, Height, largestMipMap) };

      for(int mipLoop = 1; mipLoop < mipCount; mipLoop++) {
        if (mipWidth  > minMipWidth)  mipWidth  /= 2;
        if (mipHeight > minMipHeight) mipHeight /= 2;

        DdsMipMap writeSize = new DdsMipMap(mipWidth, mipHeight);

        WriteableBitmap mipMap = new WriteableBitmap(BitmapSource);

        writeSize.MipMap = mipMap.ResizeHighQuality(writeSize.Width, writeSize.Height).ConvertToRgba();

        MipMaps.Add(writeSize);
      }
    }
Пример #3
0
        public byte[] WriteMipMap(DdsMipMap mipMap, DdsSaveConfig saveConfig)
        {
            byte[] outputData;

            if (saveConfig.FileFormat >= FileFormat.DXT1 && saveConfig.FileFormat <= FileFormat.DXT5)
            {
                outputData = DdsSquish.CompressImage(mipMap.MipMap, mipMap.Width, mipMap.Height, saveConfig.GetSquishFlags(), null);
            }
            else
            {
                int pixelWidth = (int)header.PitchOrLinearSize / Width;

                int mipPitch = pixelWidth * mipMap.Width;

                outputData = new byte[mipPitch * mipMap.Height];

                outputData.Initialize();

                for (int i = 0; i < mipMap.MipMap.Length; i += 4)
                {
                    uint pixelData = 0;

                    byte R = mipMap.MipMap[i + 0];
                    byte G = mipMap.MipMap[i + 1];
                    byte B = mipMap.MipMap[i + 2];
                    byte A = mipMap.MipMap[i + 3];

                    switch (saveConfig.FileFormat)
                    {
                    case FileFormat.A8R8G8B8: {
                        pixelData = ((uint)A << 24) |
                                    ((uint)R << 16) |
                                    ((uint)G << 8) |
                                    ((uint)B << 0);
                        break;
                    }

                    case FileFormat.X8R8G8B8: {
                        pixelData = ((uint)R << 16) |
                                    ((uint)G << 8) |
                                    ((uint)B << 0);
                        break;
                    }

                    case FileFormat.A8B8G8R8: {
                        pixelData = ((uint)A << 24) |
                                    ((uint)B << 16) |
                                    ((uint)G << 8) |
                                    ((uint)R << 0);
                        break;
                    }

                    case FileFormat.X8B8G8R8: {
                        pixelData = ((uint)B << 16) |
                                    ((uint)G << 8) |
                                    ((uint)R << 0);
                        break;
                    }

                    case FileFormat.A1R5G5B5: {
                        pixelData = ((uint)(A != 0 ? 1 : 0) << 15) |
                                    ((uint)(R >> 3) << 10) |
                                    ((uint)(G >> 3) << 5) |
                                    ((uint)(B >> 3) << 0);
                        break;
                    }

                    case FileFormat.A4R4G4B4: {
                        pixelData = ((uint)(A >> 4) << 12) |
                                    ((uint)(R >> 4) << 8) |
                                    ((uint)(G >> 4) << 4) |
                                    ((uint)(B >> 4) << 0);
                        break;
                    }

                    case FileFormat.R8G8B8: {
                        pixelData = ((uint)R << 16) |
                                    ((uint)G << 8) |
                                    ((uint)B << 0);
                        break;
                    }

                    case FileFormat.R5G6B5: {
                        pixelData = ((uint)(R >> 3) << 11) |
                                    ((uint)(G >> 2) << 5) |
                                    ((uint)(B >> 3) << 0);
                        break;
                    }

                    case FileFormat.G8: {
                        pixelData = (uint)((R + G + B) / 3.0 + 0.5);

                        break;
                    }
                    }

                    int pixelOffset = i / 4 * pixelWidth;

                    for (int j = 0; j < pixelWidth; j++)
                    {
                        outputData[pixelOffset + j] = (byte)((pixelData >> (8 * j)) & 0xff);
                    }
                }
            }

            return(outputData);
        }
Пример #4
0
    public byte[] WriteMipMap(DdsMipMap mipMap , DdsSaveConfig saveConfig) {
      byte[] outputData;

      if (saveConfig.FileFormat >= FileFormat.DXT1 && saveConfig.FileFormat <= FileFormat.DXT5) {
        outputData = DdsSquish.CompressImage(mipMap.MipMap, mipMap.Width, mipMap.Height, saveConfig.GetSquishFlags(), null);
      }
      else {
        int pixelWidth = (int)header.PitchOrLinearSize / Width;

        int mipPitch = pixelWidth * mipMap.Width;

        outputData = new byte[mipPitch * mipMap.Height];

        outputData.Initialize();

        for(int i = 0; i < mipMap.MipMap.Length; i += 4) {
          uint pixelData = 0;

          byte R = mipMap.MipMap[i + 0];
          byte G = mipMap.MipMap[i + 1];
          byte B = mipMap.MipMap[i + 2];
          byte A = mipMap.MipMap[i + 3];

          switch(saveConfig.FileFormat) {
            case FileFormat.A8R8G8B8: {
              pixelData = ((uint)A << 24) |
                          ((uint)R << 16) |
                          ((uint)G <<  8) |
                          ((uint)B <<  0);
              break;
            }
            case FileFormat.X8R8G8B8: {
              pixelData = ((uint)R << 16) |
                          ((uint)G <<  8) |
                          ((uint)B <<  0);
              break;
            }
            case FileFormat.A8B8G8R8: {
              pixelData = ((uint)A << 24) |
                          ((uint)B << 16) |
                          ((uint)G <<  8) |
                          ((uint)R <<  0);
              break;
            }
            case FileFormat.X8B8G8R8: {
              pixelData = ((uint)B << 16) |
                          ((uint)G <<  8) |
                          ((uint)R <<  0);
              break;
            }
            case FileFormat.A1R5G5B5: {
              pixelData = ((uint)(A != 0 ? 1 : 0) << 15) |
                          ((uint)(R >> 3) << 10) |
                          ((uint)(G >> 3) <<  5) |
                          ((uint)(B >> 3) <<  0);
              break;
            }
            case FileFormat.A4R4G4B4: {
              pixelData = ((uint)(A >> 4) << 12) |
                          ((uint)(R >> 4) <<  8) |
                          ((uint)(G >> 4) <<  4) |
                          ((uint)(B >> 4) <<  0);
              break;
            }
            case FileFormat.R8G8B8: {
              pixelData = ((uint)R << 16) |
                          ((uint)G <<  8) |
                          ((uint)B <<  0);
              break;
            }
            case FileFormat.R5G6B5: {
              pixelData = ((uint)(R >> 3) << 11) |
                          ((uint)(G >> 2) <<  5) |
                          ((uint)(B >> 3) <<  0);
              break;
            }
            case FileFormat.G8: {
              pixelData = (uint)((R + G + B) / 3.0 + 0.5);

              break;
            }
          }

          int pixelOffset = i / 4 * pixelWidth;

          for(int j = 0; j < pixelWidth; j++) outputData[pixelOffset + j] = (byte)((pixelData >> (8 * j)) & 0xff);
        }
      }

      return outputData;
    }