GetSquishFlags() private method

private GetSquishFlags ( ) : SquishFlags
return SquishFlags
コード例 #1
0
ファイル: DdsFile.cs プロジェクト: yanhan-dev/UPKManager
        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);
        }
コード例 #2
0
ファイル: DdsFile.cs プロジェクト: stricq/UPKManager
    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;
    }