ctr_Repair/trunk/SkipFirstLaunch/ImageDb/include/imgdb/ImageIO/JpegMpLoader.h
N2614 e4fddb3dda MSET用のImageDBを追加
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@690 385bec56-5757-e545-9c3a-d8741f4650f1
2012-04-25 00:56:48 +00:00

638 lines
29 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*---------------------------------------------------------------------------
Project: ImageDb
File: JpegMpLoader.h
SDカードにあるJPEG/MPファイルを読み込み、デコードした結果を返します。
---------------------------------------------------------------------------*/
#ifndef JPEG_MP_LOADER_H_
#define JPEG_MP_LOADER_H_
#include <nn/types.h>
#include <nn/util.h>
#include <nn/jpeg.h>
#include "../Core/ImageDbResult.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief JPEG/MPベース読み込みクラス
*---------------------------------------------------------------------------*/
#pragma pack(push, 4)
class JpegMpBaseLoader
{
public:
/*!----------------------------------------------------------------------
@brief コンストラクタ
-----------------------------------------------------------------------*/
JpegMpBaseLoader();
/*!----------------------------------------------------------------------
@brief デストラクタ
-----------------------------------------------------------------------*/
virtual ~JpegMpBaseLoader();
/*=======================================================================
Load()を呼び出す前に設定しておく情報
=======================================================================*/
/*!----------------------------------------------------------------------
@brief 展開したユーザーメーカーノートを格納するバッファを取得する
@return バッファ
-----------------------------------------------------------------------*/
void* GetUserMakerNoteBuffer() const;
/*!----------------------------------------------------------------------
@brief 展開したユーザーメーカーノートを格納するバッファのサイズを取得する
@return バッファサイズ(バイト単位)
-----------------------------------------------------------------------*/
std::size_t GetUserMakerNoteBufferSize() const;
/*!----------------------------------------------------------------------
@brief 展開したユーザーメーカーノートを格納するバッファを設定する
@param[in] pBuf バッファ
@param[in] nSize バッファサイズ(バイト単位)
@details
バッファのアドレスは4バイトにアライメントされている必要があります。
-----------------------------------------------------------------------*/
void SetUserMakerNoteBuffer(void* pBuf, std::size_t nSize);
/*=======================================================================
Load()呼び出し成功後に取得できる情報
=======================================================================*/
/*!----------------------------------------------------------------------
@brief デコードした撮影日時情報を取得する
@param[out] rDateTime 撮影日時
@return デコードに成功していない場合はfalse
-----------------------------------------------------------------------*/
bool GetDateTime(nn::fnd::DateTime& rDateTime) const;
/*-----------------------------------------------------------------------
アプリケーション用のメーカーノート
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief アプリケーション用のメーカーノートのデータサイズを取得する
@return データサイズ(バイト単位)
@details
デコードにより取り出したメーカーノートの実際のデータサイズです。
データ自体はSetUserMakerNoteBuffer()で指定したバッファに書き込まれています。
バッファが設定されていない、設定されていたがバッファサイズが不足して
取り出されなかった場合はゼロを返します。
-----------------------------------------------------------------------*/
std::size_t GetUserMakerNoteDataSize() const;
/*-----------------------------------------------------------------------
システムメーカーノート
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief システムメーカーノートが存在するかチェックする
@return 存在する場合はtrue
-----------------------------------------------------------------------*/
bool IsExistSysMakerNote() const;
/*!----------------------------------------------------------------------
@brief システムメーカーノートのデータサイズを取得する
@return データサイズ(バイト単位)
-----------------------------------------------------------------------*/
static std::size_t GetSysMakerNoteDataSize();
/*!----------------------------------------------------------------------
@brief システムメーカーノートを取得する
@return システムメーカーノート
-----------------------------------------------------------------------*/
const void* GetSysMakerNoteData() const;
/*-----------------------------------------------------------------------
タイトルユニークID
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief タイトルユニークIDを取得する
@return タイトルユニークID
@details
タイトルユニークIDとはアプリケーションが持つ20bitのユニークIDです。
-----------------------------------------------------------------------*/
u32 GetTitleUniqueId() const;
/*-----------------------------------------------------------------------
属性
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief スクリーンショットフラグを取得する
@retval true スクリーンショットのデータ
@retval false スクリーンショット以外のデータ
-----------------------------------------------------------------------*/
bool GetScreenshotFlag() const;
/*!----------------------------------------------------------------------
@brief 焦点調整範囲表示フラグを取得する
@return 焦点調整範囲表示フラグ
-----------------------------------------------------------------------*/
bool GetAdjustablePictureFlag() const;
/*!----------------------------------------------------------------------
@brief 顔が含まれている写真かチェックする
@return 顔が含まれているならtrue
-----------------------------------------------------------------------*/
bool IsExistFace() const;
/*-----------------------------------------------------------------------
本体ID
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief 撮影した本体IDが有効かチェックする
@return 有効な場合はtrue
-----------------------------------------------------------------------*/
bool IsValidShotBodyId() const;
/*!----------------------------------------------------------------------
@brief 撮影した本体IDを取得する
@return 撮影した本体ID
@details
無効な場合の戻り値は不定です。
-----------------------------------------------------------------------*/
u32 GetShotBodyId() const;
/*!----------------------------------------------------------------------
@brief 送信した本体IDが有効かチェックする
@return 有効な場合はtrue
-----------------------------------------------------------------------*/
bool IsValidSendBodyId() const;
/*!----------------------------------------------------------------------
@brief 送信した本体IDを取得する
@return 送信した本体ID
@details
無効な場合の戻り値は不定です。
-----------------------------------------------------------------------*/
u32 GetSendBodyId() const;
/*!----------------------------------------------------------------------
@brief 受信した本体IDが有効かチェックする
@return 有効な場合はtrue
-----------------------------------------------------------------------*/
bool IsValidReceiveBodyId() const;
/*!----------------------------------------------------------------------
@brief 受信した本体IDを取得する
@return 受信した本体ID
@details
無効な場合の戻り値は不定です。
-----------------------------------------------------------------------*/
u32 GetReceiveBodyId() const;
/*!----------------------------------------------------------------------
@brief 最後に編集した本体IDが有効かチェックする
@return 有効な場合はtrue
-----------------------------------------------------------------------*/
bool IsValidEditorBodyId() const;
/*!----------------------------------------------------------------------
@brief 最後に編集した本体IDを取得する
@return 最後に編集した本体ID
@details
無効な場合の戻り値は不定です。
-----------------------------------------------------------------------*/
u32 GetEditorBodyId() const;
/*=======================================================================
その他
=======================================================================*/
/*!----------------------------------------------------------------------
@brief 画像のサイズを求める
@param[in] nWidth 画像の幅(ピクセル単位)
@param[in] nHeight 画像の高さ(ピクセル単位)
@param[in] eFormat 画像のピクセルフォーマット
@return 画像サイズ(バイト単位)
-----------------------------------------------------------------------*/
static std::size_t ComputeImageSize(
int nWidth, int nHeight, nn::jpeg::CTR::PixelFormat eFormat);
protected:
void SetDateTime(const nn::fnd::DateTime& rDateTime);
void ResetDateTime();
bool SetSysMakerNoteData(const void* pNote, std::size_t nSize);
void SetUserMakerNoteDataSize(std::size_t nSize);
void SetScreenshotFlag(bool bFlag);
void SetAdjustablePictureFlag(bool bFlag);
void SetShotBodyId(u32 nBodyId);
void ResetShotBodyId();
void SetSendBodyId(u32 nBodyId);
void ResetSendBodyId();
void SetReceiveBodyId(u32 nBodyId);
void ResetReceiveBodyId();
void SetEditorBodyId(u32 nBodyId);
void ResetEditorBodyId();
private:
bool GetHandleFlag(int nHandleType) const;
void SetHandleFlag(int nHandleType, bool bFlag);
bool IsValidBodyId(int nIdType) const;
u32 GetBodyId(int nIdType) const;
void SetBodyId(int nIdType, u32 nBodyId);
void ResetBodyId(int nIdType);
private:
void* m_pUserMakerNoteBuf;
std::size_t m_pUserMakerNoteBufSize;
nn::fnd::DateTime m_nDateTime;
bool m_bValidDateTime;
NN_PADDING3;
std::size_t m_nUserMakerNoteDataSize;
void* m_pSysMakerNoteData;
};
#pragma pack(pop)
/*!--------------------------------------------------------------------------*
@brief JPEG読み込みクラス
@details
JPEGを読み込むには最低限以下の関数を呼び出す必要があります。<BR>
SetFilePath()<BR>
SetBuffer()<BR>
SetFormat()<BR>
Load()
*---------------------------------------------------------------------------*/
class JpegLoader : public JpegMpBaseLoader, private nn::util::NonCopyable<JpegLoader>
{
public:
//! 展開画像のピクセルフォーマットのデフォルト値
static const nn::jpeg::CTR::PixelFormat c_eDefaultRawFormat = nn::jpeg::CTR::PIXEL_FORMAT_CTR_RGB565;
//! サムネイル読み込みモードのデフォルト値
static const bool c_nDefaultThumbnailMode = false;
//! 展開した画像を格納するバッファの幅のデフォルト値
static const int c_nDefaultOutputWidth = 0;
public:
/*!----------------------------------------------------------------------
@brief コンストラクタ
-----------------------------------------------------------------------*/
JpegLoader();
/*!----------------------------------------------------------------------
@brief デストラクタ
-----------------------------------------------------------------------*/
virtual ~JpegLoader();
/*!----------------------------------------------------------------------
@brief JPEGファイルを読み込む
@return 結果
@details
現在の設定されている内容でJPEG画像を読み込んで展開します。<BR>
呼び出し前に各種設定を行っておいてください。<BR>
設定が不正だった場合はResultErrorInvalidParamが返ってきます。<BR>
本関数を呼び出すと内部で一時的に最大で 400KB 程のメモリが消費されます。
-----------------------------------------------------------------------*/
Result Load();
/*=======================================================================
Load()を呼び出す前に設定しておく情報
=======================================================================*/
/*!----------------------------------------------------------------------
@brief 読み込むJPEGファイルのパスを取得する
@return ファイルパス
-----------------------------------------------------------------------*/
const wchar_t* GetFilePath() const;
/*!----------------------------------------------------------------------
@brief 読み込むJPEGファイルのパスを設定する
@param[in] pPath ファイルパス
-----------------------------------------------------------------------*/
void SetFilePath(const wchar_t* pPath);
/*!----------------------------------------------------------------------
@brief 展開画像のピクセルフォーマットを取得する
@return ピクセルフォーマット
-----------------------------------------------------------------------*/
nn::jpeg::CTR::PixelFormat GetFormat() const;
/*!----------------------------------------------------------------------
@brief 展開画像のピクセルフォーマットを設定する
@param[in] eFormat ピクセルフォーマット
-----------------------------------------------------------------------*/
void SetFormat(nn::jpeg::CTR::PixelFormat eFormat);
/*!----------------------------------------------------------------------
@brief 展開した画像を格納するバッファの幅を取得する
@return 幅(ピクセル単位)
-----------------------------------------------------------------------*/
int GetOutputWidth();
/*!----------------------------------------------------------------------
@brief 展開した画像を格納するバッファの幅を設定する
@param[in] nWidth 幅(ピクセル単位)
@details
この幅はデコードのバッファの横幅を指定するもので、この値を指定すること
で、例えば64×64の画像を256×256のバッファの左上に展開するといったこと
が可能になります。この値が画像の幅よりも小さい場合は、ビッチリと詰まっ
た状態で画像がデコードされます。
-----------------------------------------------------------------------*/
void SetOutputWidth(int nWidth);
/*!----------------------------------------------------------------------
@brief サムネイル読み込みモードか調べる
@retval true サムネイル読み込みモード
@retval false 画像読み込みモード
-----------------------------------------------------------------------*/
bool IsThumbnailMode() const;
/*!----------------------------------------------------------------------
@brief サムネイル読み込みモードを設定する
@param[in] bThumbMode サムネイル読み込みモード
@details
bThumbModeにtrueを指定すると、Load()時にサムネイル画像が読み込まれます。
-----------------------------------------------------------------------*/
void SetThumbnailMode(bool bThumbMode);
/*!----------------------------------------------------------------------
@brief 展開した画像を格納するバッファを取得する
@return バッファ
-----------------------------------------------------------------------*/
void* GetBuffer() const;
/*!----------------------------------------------------------------------
@brief 展開した画像を格納するバッファのサイズを取得する
@return バッファサイズ(バイト単位)
-----------------------------------------------------------------------*/
std::size_t GetBufferSize() const;
/*!----------------------------------------------------------------------
@brief 展開した画像を格納するバッファを設定する
@param[in] pBuf バッファ
@param[in] nSize バッファサイズ(バイト単位)
@details
バッファのアドレスは4バイトにアライメントされている必要があります。
-----------------------------------------------------------------------*/
void SetBuffer(void* pBuf, std::size_t nSize);
/*=======================================================================
Load()を呼び出す成功後に取得できる情報
=======================================================================*/
/*!----------------------------------------------------------------------
@brief 読み込んだ画像の幅を取得する
@return 幅(ピクセル単位)
@details
縮小デコードが働く場合は縮小後の幅となります。
-----------------------------------------------------------------------*/
int GetRawWidth() const;
/*!----------------------------------------------------------------------
@brief 読み込んだ画像の高さを取得する
@return 高さ(ピクセル単位)
@details
縮小デコードが働く場合は縮小後の高さとなります。
-----------------------------------------------------------------------*/
int GetRawHeight() const;
/*!----------------------------------------------------------------------
@brief 読み込んだ画像のデータサイズを取得する
@return データサイズ(バイト単位)
-----------------------------------------------------------------------*/
std::size_t GetRawDataSize() const;
/*!----------------------------------------------------------------------
@brief 縮小デコードの影響を受けない実画像の幅を取得する
@return 幅(ピクセル単位)
-----------------------------------------------------------------------*/
int GetRealWidth() const;
/*!----------------------------------------------------------------------
@brief 縮小デコードの影響を受けない実画像の高さを取得する
@return 高さ(ピクセル単位)
-----------------------------------------------------------------------*/
int GetRealHeight() const;
private:
void ResetLoaded();
bool IsLoaded() const;
Result ValidateParam() const;
private:
const wchar_t* m_pFilePath;
int m_nOutputWidth;
nn::jpeg::CTR::PixelFormat m_eFormat;
bool m_bThumbMode;
NN_PADDING2;
void* m_pBuf;
std::size_t m_nBufSize;
int m_nRawWidth;
int m_nRawHeight;
std::size_t m_nRawDataSize;
int m_nRealWidth;
int m_nRealHeight;
};
/*!--------------------------------------------------------------------------*
@brief MP読み込みクラス
@details
MPを読み込むには最低限以下の関数を呼び出す必要があります。<BR>
SetFilePath()<BR>
SetBuffer()<BR>
SetFormat()<BR>
Load()<BR>
立体画像として表示する際、通常は GetOffsetH() の値に応じて画像を左右にずら
して表示してください。
*---------------------------------------------------------------------------*/
class MpLoader : public JpegMpBaseLoader, private nn::util::NonCopyable<MpLoader>
{
public:
//! 展開画像のピクセルフォーマットのデフォルト値
static const nn::jpeg::CTR::PixelFormat c_eDefaultRawFormat = nn::jpeg::CTR::PIXEL_FORMAT_CTR_RGB565;
//! サムネイル読み込みモードのデフォルト値
static const bool c_nDefaultThumbnailMode = false;
//! 展開した画像を格納するバッファの幅のデフォルト値
static const int c_nDefaultOutputWidth = 0;
public:
/*!----------------------------------------------------------------------
@brief コンストラクタ
-----------------------------------------------------------------------*/
MpLoader();
/*!----------------------------------------------------------------------
@brief デストラクタ
-----------------------------------------------------------------------*/
virtual ~MpLoader();
/*!----------------------------------------------------------------------
@brief MPファイルを読み込む
@return 結果
@details
現在の設定されている内容でMP画像を読み込んで展開します。<BR>
呼び出し前に各種設定を行っておいてください。<BR>
設定が不正だった場合はResultErrorInvalidParamが返ってきます。<BR>
本関数を呼び出すと内部で一時的に最大で 400KB 程のメモリが消費されます。
-----------------------------------------------------------------------*/
Result Load();
/*=======================================================================
Load()を呼び出す前に設定しておく情報
=======================================================================*/
/*!----------------------------------------------------------------------
@brief 読み込むMPファイルのパスを取得する
@return ファイルパス
-----------------------------------------------------------------------*/
const wchar_t* GetFilePath() const;
/*!----------------------------------------------------------------------
@brief 読み込むMPファイルのパスを設定する
@param[in] pPath ファイルパス
-----------------------------------------------------------------------*/
void SetFilePath(const wchar_t* pPath);
/*!----------------------------------------------------------------------
@brief 展開画像のピクセルフォーマットを取得する
@return ピクセルフォーマット
-----------------------------------------------------------------------*/
nn::jpeg::CTR::PixelFormat GetFormat() const;
/*!----------------------------------------------------------------------
@brief 展開画像のピクセルフォーマットを設定する
@param[in] eFormat ピクセルフォーマット
-----------------------------------------------------------------------*/
void SetFormat(nn::jpeg::CTR::PixelFormat eFormat);
/*!----------------------------------------------------------------------
@brief 展開した画像を格納するバッファの幅を取得する
@return 幅(ピクセル単位)
-----------------------------------------------------------------------*/
int GetOutputWidth();
/*!----------------------------------------------------------------------
@brief 展開した画像を格納するバッファの幅を設定する
@param[in] nWidth 幅(ピクセル単位)
@details
この幅はデコードのバッファの横幅を指定するもので、この値を指定すること
で、例えば64×64の画像を256×256のバッファの左上に展開するといったこと
が可能になります。この値が画像の幅よりも小さい場合は、ビッチリと詰まっ
た状態で画像がデコードされます。
-----------------------------------------------------------------------*/
void SetOutputWidth(int nWidth);
/*!----------------------------------------------------------------------
@brief サムネイル読み込みモードか調べる
@retval true サムネイル読み込みモード
@retval false 画像読み込みモード
-----------------------------------------------------------------------*/
bool IsThumbnailMode() const;
/*!----------------------------------------------------------------------
@brief サムネイル読み込みモードを設定する
@param[in] bThumbMode サムネイル読み込みモード
@details
bThumbModeにtrueを指定すると、Load()時にサムネイル画像が読み込まれます。
-----------------------------------------------------------------------*/
void SetThumbnailMode(bool bThumbMode);
/*!----------------------------------------------------------------------
@brief 展開した左側の画像を格納するバッファを取得する
@return バッファ
-----------------------------------------------------------------------*/
void* GetBufferL();
/*!----------------------------------------------------------------------
@brief 展開した右側の画像を格納するバッファを取得する
@return バッファ
-----------------------------------------------------------------------*/
void* GetBufferR();
/*!----------------------------------------------------------------------
@brief 展開した画像を格納するバッファのサイズを取得する
@return バッファサイズ(バイト単位)
-----------------------------------------------------------------------*/
std::size_t GetBufferSize() const;
/*!----------------------------------------------------------------------
@brief 展開した画像を格納するバッファを設定する
@param[in] pBufL 左側のバッファ(ヌル不可)
@param[in] pBufR 右側のバッファ(ヌル可)
@param[in] nSize バッファサイズ(バイト単位)
@details
バッファのアドレスは4バイトにアライメントされている必要があります。<BR>
pBufRにヌルを指定することで、左側の画像だけを取得することが出来ます。<BR>
サムネイル画像はpBufRにも左側の画像が格納されます。
-----------------------------------------------------------------------*/
void SetBuffer(void* pBufL, void* pBufR, std::size_t nSize);
/*=======================================================================
Load()呼び出し成功後に取得できる情報
=======================================================================*/
/*!----------------------------------------------------------------------
@brief 読み込んだ画像の幅を取得する
@return 幅(ピクセル単位)
@details
縮小デコードが働く場合は縮小後の幅となります。
-----------------------------------------------------------------------*/
int GetRawWidth() const;
/*!----------------------------------------------------------------------
@brief 読み込んだ画像の高さを取得する
@return 高さ(ピクセル単位)
@details
縮小デコードが働く場合は縮小後の高さとなります。
-----------------------------------------------------------------------*/
int GetRawHeight() const;
/*!----------------------------------------------------------------------
@brief 読み込んだ画像のデータサイズを取得する
@return データサイズ(バイト単位)
-----------------------------------------------------------------------*/
std::size_t GetRawDataSize() const;
/*!----------------------------------------------------------------------
@brief 縮小デコードの影響を受けない実画像の幅を取得する
@return 幅(ピクセル単位)
-----------------------------------------------------------------------*/
int GetRealWidth() const;
/*!----------------------------------------------------------------------
@brief 縮小デコードの影響を受けない実画像の高さを取得する
@return 高さ(ピクセル単位)
-----------------------------------------------------------------------*/
int GetRealHeight() const;
/*!----------------------------------------------------------------------
@brief 水平オフセット値を取得する
@return 水平オフセット値(ピクセル単位)
@details
値が 0.0f の時は左と右の画像を同じ位置に表示します。<BR>
値が 1.0f の時は 左画像を左に(縮小デコードの影響を受けない実画像の幅に
対して1ピクセル、右画像を右に1ピクセル移動して表示します。<BR>
画面上の表示位置は表示する大きさに合わせたスケールがかかるようにしてく
ださい。<BR>
この値は GetAdjustablePictureFlag() が true を返すときのみ使用し、false
のときは 0.0f として扱ってください。
-----------------------------------------------------------------------*/
f32 GetOffsetH() const;
private:
void ResetLoaded();
bool IsLoaded() const;
Result ValidateParam() const;
private:
const wchar_t* m_pFilePath;
int m_nOutputWidth;
nn::jpeg::CTR::PixelFormat m_eFormat;
bool m_bThumbMode;
NN_PADDING2;
void* m_pBufL;
void* m_pBufR;
std::size_t m_nBufSize;
int m_nRawWidth;
int m_nRawHeight;
std::size_t m_nRawDataSize;
int m_nRealWidth;
int m_nRealHeight;
f32 m_fOfstH;
};
} // end of namespace imgdb
#endif // JPEG_MP_LOADER_H_