/*--------------------------------------------------------------------------- Project: ImageDb File: JpegMpLoader.h SDカードにあるJPEG/MPファイルを読み込み、デコードした結果を返します。 ---------------------------------------------------------------------------*/ #ifndef JPEG_MP_LOADER_H_ #define JPEG_MP_LOADER_H_ #include #include #include #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を読み込むには最低限以下の関数を呼び出す必要があります。
SetFilePath()
SetBuffer()
SetFormat()
Load() *---------------------------------------------------------------------------*/ class JpegLoader : public JpegMpBaseLoader, private nn::util::NonCopyable { 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画像を読み込んで展開します。
呼び出し前に各種設定を行っておいてください。
設定が不正だった場合はResultErrorInvalidParamが返ってきます。
本関数を呼び出すと内部で一時的に最大で 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を読み込むには最低限以下の関数を呼び出す必要があります。
SetFilePath()
SetBuffer()
SetFormat()
Load()
立体画像として表示する際、通常は GetOffsetH() の値に応じて画像を左右にずら して表示してください。 *---------------------------------------------------------------------------*/ class MpLoader : public JpegMpBaseLoader, private nn::util::NonCopyable { 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画像を読み込んで展開します。
呼び出し前に各種設定を行っておいてください。
設定が不正だった場合はResultErrorInvalidParamが返ってきます。
本関数を呼び出すと内部で一時的に最大で 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バイトにアライメントされている必要があります。
pBufRにヌルを指定することで、左側の画像だけを取得することが出来ます。
サムネイル画像は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 の時は左と右の画像を同じ位置に表示します。
値が 1.0f の時は 左画像を左に(縮小デコードの影響を受けない実画像の幅に 対して)1ピクセル、右画像を右に1ピクセル移動して表示します。
画面上の表示位置は表示する大きさに合わせたスケールがかかるようにしてく ださい。
この値は 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_