// File: crn_texture_conversion.h
// See Copyright Notice and license at the end of inc/crnlib.h
#pragma once
#include "crn_dxt_image.h"
#include "crn_mipmapped_texture.h"
#include "crn_rect.h"
#include "crn_lzma_codec.h"

namespace crnlib
{
   namespace texture_conversion
   {
      class convert_stats
      {
      public:
         convert_stats();

         bool init(
            const char* pSrc_filename,
            const char* pDst_filename,
            mipmapped_texture& src_tex,
            texture_file_types::format dst_file_type,
            bool lzma_stats);

         bool print(bool psnr_metrics, bool mip_stats, bool grayscale_sampling, const char *pCSVStatsFile = NULL) const;

         void clear();

         dynamic_string             m_src_filename;
         dynamic_string             m_dst_filename;
         texture_file_types::format m_dst_file_type;

         mipmapped_texture*               m_pInput_tex;
         mipmapped_texture                m_output_tex;

         uint64                     m_input_file_size;
         uint                       m_total_input_pixels;

         uint64                     m_output_file_size;
         uint                       m_total_output_pixels;

         uint64                     m_output_comp_file_size;
      };

      class convert_params
      {
      public:
         convert_params() :
            m_pInput_texture(NULL),
            m_texture_type(cTextureTypeUnknown),
            m_dst_file_type(texture_file_types::cFormatInvalid),
            m_dst_format(PIXEL_FMT_INVALID),
            m_pProgress_func(NULL),
            m_pProgress_user_data(NULL),
            m_pIntermediate_texture(NULL),
            m_y_flip(false),
            m_unflip(false),
            m_always_use_source_pixel_format(false),
            m_write_mipmaps_to_multiple_files(false),
            m_quick(false),
            m_debugging(false),
            m_param_debugging(false),
            m_no_stats(false),
            m_lzma_stats(false),
            m_status(false),
            m_canceled(false)
         {
         }

         ~convert_params()
         {
            crnlib_delete(m_pIntermediate_texture);
         }

         void print();

         // Input parameters
         mipmapped_texture*                  m_pInput_texture;

         texture_type                  m_texture_type;

         dynamic_string                m_dst_filename;
         texture_file_types::format    m_dst_file_type;
         pixel_format                  m_dst_format;

         crn_comp_params               m_comp_params;
         crn_mipmap_params             m_mipmap_params;

         typedef bool (*progress_callback_func_ptr)(uint percentage_complete, void* pUser_data_ptr);
         progress_callback_func_ptr    m_pProgress_func;
         void*                         m_pProgress_user_data;

         // Return parameters
         mipmapped_texture*                  m_pIntermediate_texture;
         mutable dynamic_string        m_error_message;

         bool                          m_y_flip;
         bool                          m_unflip;
         bool                          m_always_use_source_pixel_format;
         bool                          m_write_mipmaps_to_multiple_files;
         bool                          m_quick;
         bool                          m_debugging;
         bool                          m_param_debugging;
         bool                          m_no_stats;

         bool                          m_lzma_stats;
         mutable bool                  m_status;
         mutable bool                  m_canceled;
      };

      bool process(convert_params& params, convert_stats& stats);

   } // namespace texture_conversion

} // namespace crnlib