/*--------------------------------------------------------------------------- Project: ImageDb File: JpegMpSaver.h 生画像データを受け取ると、JPEG/MPにエンコードし、SDカードへ保存します。 保存された画像はニンテンドー3DSカメラで管理されます。 ---------------------------------------------------------------------------*/ #ifndef JPEG_MP_SAVER_H_ #define JPEG_MP_SAVER_H_ #include #include #include #include "ImageIOTypes.h" #include "../Core/ImageDbResult.h" namespace imgdb { /*!--------------------------------------------------------------------------* @brief JPEG/MPベース保存クラス *---------------------------------------------------------------------------*/ class JpegMpBaseSaver { public: //! スクリーンショットフラグのデフォルト値 static const bool c_bDefaultScreenshotFlag = false; //! 配布許可フラグのデフォルト値 static const bool c_bDefaultPermitDistributeFlag = true; //! 焦点調整範囲表示フラグのデフォルト値 static const bool c_bDefaultAdjustablePictureFlag = false; //! 無効な本体ID static const u32 c_nInvalidId = 0; //! 撮影した本体IDの有効状態のデフォルト値 static const bool c_bDefaultValidShotId = true; //! 送信した本体IDの有効状態のデフォルト値 static const bool c_bDefaultValidSendId = false; //! 受信した本体IDの有効状態のデフォルト値 static const bool c_bDefaultValidReceiveId = false; //! 最後に編集した本体IDの有効状態のデフォルト値 static const bool c_bDefaultValidEditorId = false; public: /*!---------------------------------------------------------------------- @brief コンストラクタ -----------------------------------------------------------------------*/ JpegMpBaseSaver(); /*!---------------------------------------------------------------------- @brief デストラクタ -----------------------------------------------------------------------*/ virtual ~JpegMpBaseSaver(); /*======================================================================= Save()を呼び出す前に設定しておく情報 =======================================================================*/ /*----------------------------------------------------------------------- アプリケーション用のメーカーノート -----------------------------------------------------------------------*/ /*!---------------------------------------------------------------------- @brief アプリケーション用のメーカーノートのデータを取得する @return データ @details 設定されていない場合はヌルを返します。 -----------------------------------------------------------------------*/ const void* GetUserMakerNoteData() const; /*!---------------------------------------------------------------------- @brief アプリケーション用のメーカーノートのデータサイズを取得する @return データサイズ(バイト単位) @details 設定されていない場合はゼロを返します。 -----------------------------------------------------------------------*/ std::size_t GetUserMakerNoteDataSize() const; /*!---------------------------------------------------------------------- @brief アプリケーション用のメーカーノートを設定する @param[in] pData データ @param[in] nSize データサイズ(バイト単位) @details pDataにヌル、またはnSizeにゼロを指定すると未設定の状態になります。 -----------------------------------------------------------------------*/ void SetUserMakerNote(const void* pData, std::size_t nSize); /*----------------------------------------------------------------------- システムメーカーノート -----------------------------------------------------------------------*/ /*!---------------------------------------------------------------------- @brief システムメーカーノートのデータサイズを取得する @return データサイズ(バイト単位) -----------------------------------------------------------------------*/ static std::size_t GetSysMakerNoteDataSize(); /*!---------------------------------------------------------------------- @brief システムメーカーノートを取得する @return システムメーカーノート -----------------------------------------------------------------------*/ const void* GetSysMakerNoteData() const; /*!---------------------------------------------------------------------- @brief システムメーカーノートを設定する @param[in] pNote システムメーカーノート @param[in] nSize システムメーカーノートのデータサイズ @return 設定に成功した場合はtrue @details タイトルユニークIDや各種フラグなど、設定された情報はすべて指定された システムメーカーノートの値に上書きされます。 -----------------------------------------------------------------------*/ bool SetSysMakerNoteData(const void* pNote, std::size_t nSize); /*----------------------------------------------------------------------- タイトルユニークID -----------------------------------------------------------------------*/ /*!---------------------------------------------------------------------- @brief タイトルユニークIDを取得する @return タイトルユニークID @details タイトルユニークIDとはアプリケーションが持つ20bitのユニークIDです。 -----------------------------------------------------------------------*/ u32 GetTitleUniqueId() const; /*!---------------------------------------------------------------------- @brief タイトルユニークIDを設定する @param[in] nUId タイトルユニークID @return 設定に成功した場合はtrue @details タイトルユニークIDとはアプリケーションが持つ20bitのユニークIDです。 -----------------------------------------------------------------------*/ void SetTitleUniqueId(u32 nUId); /*----------------------------------------------------------------------- 属性 -----------------------------------------------------------------------*/ /*!---------------------------------------------------------------------- @brief スクリーンショットフラグを取得する @retval true スクリーンショットのデータ @retval false スクリーンショット以外のデータ -----------------------------------------------------------------------*/ bool GetScreenshotFlag() const; /*!---------------------------------------------------------------------- @brief スクリーンショットフラグを設定する @param[in] bFlag スクリーンショットフラグ @details スクリーンショットのためのフラグです。 -----------------------------------------------------------------------*/ void SetScreenshotFlag(bool bFlag); /*!---------------------------------------------------------------------- @brief 配布許可フラグを取得する @retval true 配布を許可する @retval false 配布を禁止する -----------------------------------------------------------------------*/ bool GetPermitDistributeFlag() const; /*!---------------------------------------------------------------------- @brief 配布許可フラグを設定する @param[in] bFlag 配布許可フラグ -----------------------------------------------------------------------*/ void SetPermitDistributeFlag(bool bFlag); /*!---------------------------------------------------------------------- @brief 焦点調整範囲表示フラグを取得する @return 焦点調整範囲表示フラグ -----------------------------------------------------------------------*/ bool GetAdjustablePictureFlag() const; /*!---------------------------------------------------------------------- @brief 焦点調整範囲表示フラグを設定する @param[in] bFlag 焦点調整範囲表示フラグ @details このフラグが立っている画像は、ニンテンドー3DSカメラのブラウズで表示され るとき、横幅を基準に焦点調整ができる範囲が表示されます(平面画像でも表示 範囲は同一)。
ただし画像サイズが 400x240〜1024x768 の場合のみ設定できます。
このフラグが立っていない画像は、画像の全体がULCD画面の中に収まるように 表示され、焦点調整はできません。 -----------------------------------------------------------------------*/ void SetAdjustablePictureFlag(bool bFlag); /*----------------------------------------------------------------------- 本体ID -----------------------------------------------------------------------*/ /*!---------------------------------------------------------------------- @brief 撮影した本体IDが有効かチェックする @return 有効な場合はtrue -----------------------------------------------------------------------*/ bool IsValidShotBodyId() const; /*!---------------------------------------------------------------------- @brief 撮影した本体IDを取得する @return 撮影した本体ID @details 無効な場合の戻り値は不定です。 デフォルトでこのCTRの本体IDが設定されています。 -----------------------------------------------------------------------*/ u32 GetShotBodyId() const; /*!---------------------------------------------------------------------- @brief 撮影した本体IDを設定する @param[in] nBodyId 本体ID @details 既存の画像の場合は、その画像に含まれる撮影した本体IDを指定してください。 -----------------------------------------------------------------------*/ void SetShotBodyId(u32 nBodyId); /*!---------------------------------------------------------------------- @brief 撮影した本体IDを自分の本体IDに設定する @details 既存の画像の場合は、その画像に含まれる撮影した本体IDを、SetShotBodyId()で 指定してください。 -----------------------------------------------------------------------*/ void SetShotBodyIdByOwn(); /*!---------------------------------------------------------------------- @brief 撮影した本体IDを無効状態にリセットする -----------------------------------------------------------------------*/ void ResetShotBodyId(); /*!---------------------------------------------------------------------- @brief 送信した本体IDが有効かチェックする @return 有効な場合はtrue -----------------------------------------------------------------------*/ bool IsValidSendBodyId() const; /*!---------------------------------------------------------------------- @brief 送信した本体IDを取得する @return 送信した本体ID @details 無効な場合の戻り値は不定です。 -----------------------------------------------------------------------*/ u32 GetSendBodyId() const; /*!---------------------------------------------------------------------- @brief 送信した本体IDを設定する @param[in] nBodyId 本体ID @details アプリ内で送受信した画像の場合は、適切なIDを指定してください。 そのほかの場合は初期値か、既存の画像のIDを指定してください。 -----------------------------------------------------------------------*/ void SetSendBodyId(u32 nBodyId); /*!---------------------------------------------------------------------- @brief 送信した本体IDを自分の本体IDに設定する @details アプリ内で送受信した画像の場合は、適切なIDを指定してください。 そのほかの場合は初期値か、既存の画像のIDを指定してください。 -----------------------------------------------------------------------*/ void SetSendBodyIdByOwn(); /*!---------------------------------------------------------------------- @brief 送信した本体IDを無効状態にリセットする -----------------------------------------------------------------------*/ void ResetSendBodyId(); /*!---------------------------------------------------------------------- @brief 受信した本体IDが有効かチェックする @return 有効な場合はtrue -----------------------------------------------------------------------*/ bool IsValidReceiveBodyId() const; /*!---------------------------------------------------------------------- @brief 受信した本体IDを取得する @return 受信した本体ID @details 無効な場合の戻り値は不定です。 -----------------------------------------------------------------------*/ u32 GetReceiveBodyId() const; /*!---------------------------------------------------------------------- @brief 受信した本体IDを設定する @param[in] nBodyId 本体ID @details アプリ内で送受信した画像の場合は、適切なIDを指定してください。 そのほかの場合は初期値か、既存の画像のIDを指定してください。 -----------------------------------------------------------------------*/ void SetReceiveBodyId(u32 nBodyId); /*!---------------------------------------------------------------------- @brief 受信した本体IDを自分の本体IDに設定する @details アプリ内で送受信した画像の場合は、適切なIDを指定してください。 そのほかの場合は初期値か、既存の画像のIDを指定してください。 -----------------------------------------------------------------------*/ void SetReceiveBodyIdByOwn(); /*!---------------------------------------------------------------------- @brief 受信した本体IDを無効状態にリセットする -----------------------------------------------------------------------*/ void ResetReceiveBodyId(); /*!---------------------------------------------------------------------- @brief 最後に編集した本体IDが有効かチェックする @return 有効な場合はtrue -----------------------------------------------------------------------*/ bool IsValidEditorBodyId() const; /*!---------------------------------------------------------------------- @brief 最後に編集した本体IDを取得する @return 最後に編集した本体ID @details 無効な場合の戻り値は不定です。 -----------------------------------------------------------------------*/ u32 GetEditorBodyId() const; /*!---------------------------------------------------------------------- @brief 最後に編集した本体IDを設定する @param[in] nBodyId 本体ID @details 既存の画像を加工などを行って保存する場合は、このCTRの本体IDを指定するか、 SetEditorBodyIdByOwn()で設定を行ってください。 そのほかの場合は初期値か、既存の画像のIDを指定してください。 -----------------------------------------------------------------------*/ void SetEditorBodyId(u32 nBodyId); /*!---------------------------------------------------------------------- @brief 最後に編集した本体IDを自分の本体IDに設定する @details 既存の画像の場合は、その画像に含まれる最後に編集した本体IDを、 SetEditorBodyId()で指定してください。 -----------------------------------------------------------------------*/ void SetEditorBodyIdByOwn(); /*!---------------------------------------------------------------------- @brief 最後に編集した本体IDを無効状態にリセットする -----------------------------------------------------------------------*/ void ResetEditorBodyId(); /* 削除予定 */ void SetPermitUploadFlag(bool ) { } void SetPermitEditDistributeFlag(bool ) { } void SetPermitSecondDistributeFlag(bool ) { } protected: bool IsValidTitleUniqueId() const; 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); protected: const void* m_pUserMakerNoteData; std::size_t m_nUserMakerNoteDataSize; void* m_pSysMakerNoteData; bool m_bValidTitleUniqueId; NN_PADDING3; }; /*!--------------------------------------------------------------------------* @brief JPEG保存クラス @details JPEGを保存するには最低限以下の関数を呼び出す必要があります。
SetRaw()
SetTitleUniqueId()
Save() *---------------------------------------------------------------------------*/ class JpegSaver : public JpegMpBaseSaver, private nn::util::NonCopyable { public: //! JPEGの品質のデフォルト値 static const int c_nDefaultJpegQuality = 80; //! JPEGのサンプリングフォーマットのデフォルト値 static const nn::jpeg::CTR::PixelSampling c_eDefaultJpegFormat = nn::jpeg::CTR::PIXEL_SAMPLING_YUV422; public: /*!---------------------------------------------------------------------- @brief コンストラクタ -----------------------------------------------------------------------*/ JpegSaver(); /*!---------------------------------------------------------------------- @brief デストラクタ -----------------------------------------------------------------------*/ virtual ~JpegSaver(); /*!---------------------------------------------------------------------- @brief JPEGファイルとして保存する @return 結果 @details 現在の設定されている内容で画像をJPEGに変換して保存します。
呼び出し前に各種設定を行っておいてください。
設定が不正だった場合はResultErrorInvalidParamが返ってきます。
本関数を呼び出すと内部で一時的に 200KB 程のメモリが消費されます。 -----------------------------------------------------------------------*/ Result Save(); /*======================================================================= Save()を呼び出す前に設定しておく情報 =======================================================================*/ /*!---------------------------------------------------------------------- @brief JPEGの品質を取得する @return 品質 [1, 100] -----------------------------------------------------------------------*/ int GetJpegQuality() const; /*!---------------------------------------------------------------------- @brief JPEGの品質を設定する @param[in] nQuality 品質 [1, 100] -----------------------------------------------------------------------*/ void SetJpegQuality(int nQuality); /*!---------------------------------------------------------------------- @brief JPEGのサンプリングフォーマットを取得する @return サンプリングフォーマット -----------------------------------------------------------------------*/ nn::jpeg::CTR::PixelSampling GetJpegFormat() const; /*!---------------------------------------------------------------------- @brief JPEGのサンプリングフォーマットを設定する @param[in] eFormat サンプリングフォーマット -----------------------------------------------------------------------*/ void SetJpegFormat(nn::jpeg::CTR::PixelSampling eFormat); /*!---------------------------------------------------------------------- @brief 保存する画像データを取得する @return 画像データ -----------------------------------------------------------------------*/ const void* GetRawData() const; /*!---------------------------------------------------------------------- @brief 保存する画像の幅を取得する @return 幅(ピクセル単位) -----------------------------------------------------------------------*/ int GetRawWidth() const; /*!---------------------------------------------------------------------- @brief 保存する画像の高さを取得する @return 高さ(ピクセル単位) -----------------------------------------------------------------------*/ int GetRawHeight() const; /*!---------------------------------------------------------------------- @brief 保存する画像のピクセルフォーマットを取得する @return ピクセルフォーマット -----------------------------------------------------------------------*/ nn::jpeg::CTR::PixelFormat GetRawFormat() const; /*!---------------------------------------------------------------------- @brief 保存する画像を設定する @param[in] pData 画像データ @param[in] nWidth 画像の幅(ピクセル単位) @param[in] nHeight 画像の高さ(ピクセル単位) @param[in] eFormat 画像のピクセルフォーマット -----------------------------------------------------------------------*/ void SetRaw( const void* pData, int nWidth, int nHeight, nn::jpeg::CTR::PixelFormat eFormat); /*======================================================================= Save()呼び出し成功後に取得できる情報 =======================================================================*/ /*!---------------------------------------------------------------------- @brief 保存したJPEGのファイルパスを取得する @return ファイルパス @details 保存していない、出来なかった場合などは空文字列を返します。 -----------------------------------------------------------------------*/ const wchar_t* GetSavedFilePath() const; private: Result ValidateParam() const; void SetFilePathToVirtual(const wchar_t* pPath); private: int m_nJpegQuality; nn::jpeg::CTR::PixelSampling m_eJpegFormat; NN_PADDING3; const void* m_pRawData; int m_nRawWidth; int m_nRawHeight; nn::jpeg::CTR::PixelFormat m_eRawFormat; NN_PADDING3; wchar_t* m_pFilePath; }; /*!--------------------------------------------------------------------------* @brief MP保存クラス @details MPを保存するには最低限以下の関数を呼び出す必要があります。
SetRaw()
SetTitleUniqueId()
Save() *---------------------------------------------------------------------------*/ class MpSaver : public JpegMpBaseSaver, private nn::util::NonCopyable { public: //! JPEGの品質のデフォルト値 static const int c_nDefaultJpegQuality = 80; //! JPEGのサンプリングフォーマットのデフォルト値 static const nn::jpeg::CTR::PixelSampling c_eDefaultJpegFormat = nn::jpeg::CTR::PIXEL_SAMPLING_YUV422; public: /*!---------------------------------------------------------------------- @brief コンストラクタ -----------------------------------------------------------------------*/ MpSaver(); /*!---------------------------------------------------------------------- @brief デストラクタ -----------------------------------------------------------------------*/ virtual ~MpSaver(); /*!---------------------------------------------------------------------- @brief MPファイルとして保存する @return 結果 @details 現在の設定されている内容で画像をMPに変換して保存します。
呼び出し前に各種設定を行っておいてください。
設定が不正だった場合はResultErrorInvalidParamが返ってきます。
本関数を呼び出すと内部で一時的に 400KB 程のメモリが消費されます。 -----------------------------------------------------------------------*/ Result Save(); /*======================================================================= Save()を呼び出す前に設定しておく情報 =======================================================================*/ /*!---------------------------------------------------------------------- @brief JPEGの品質を取得する @return 品質 [1, 100] -----------------------------------------------------------------------*/ int GetJpegQuality() const; /*!---------------------------------------------------------------------- @brief JPEGの品質を設定する @param[in] nQuality 品質 [1, 100] -----------------------------------------------------------------------*/ void SetJpegQuality(int nQuality); /*!---------------------------------------------------------------------- @brief JPEGのサンプリングフォーマットを取得する @return サンプリングフォーマット -----------------------------------------------------------------------*/ nn::jpeg::CTR::PixelSampling GetJpegFormat() const; /*!---------------------------------------------------------------------- @brief JPEGのサンプリングフォーマットを設定する @param[in] eFormat サンプリングフォーマット -----------------------------------------------------------------------*/ void SetJpegFormat(nn::jpeg::CTR::PixelSampling eFormat); /*!---------------------------------------------------------------------- @brief 保存する左側の画像データを取得する @return 画像データ -----------------------------------------------------------------------*/ const void* GetRawDataL() const; /*!---------------------------------------------------------------------- @brief 保存する右側の画像データを取得する @return 画像データ -----------------------------------------------------------------------*/ const void* GetRawDataR() const; /*!---------------------------------------------------------------------- @brief 保存する画像の幅を取得する @return 幅(ピクセル単位) -----------------------------------------------------------------------*/ int GetRawWidth() const; /*!---------------------------------------------------------------------- @brief 保存する画像の高さを取得する @return 高さ(ピクセル単位) -----------------------------------------------------------------------*/ int GetRawHeight() const; /*!---------------------------------------------------------------------- @brief 保存する画像のピクセルフォーマットを取得する @return ピクセルフォーマット -----------------------------------------------------------------------*/ nn::jpeg::CTR::PixelFormat GetRawFormat() const; /*!---------------------------------------------------------------------- @brief 保存する画像を設定する @param[in] pDataL 左側の画像データ @param[in] pDataR 右側の画像データ @param[in] nWidth 画像の幅(ピクセル単位) @param[in] nHeight 画像の高さ(ピクセル単位) @param[in] eFormat 画像のピクセルフォーマット -----------------------------------------------------------------------*/ void SetRaw( const void* pDataL, const void* pDataR, int nWidth, int nHeight, nn::jpeg::CTR::PixelFormat eFormat); /*!---------------------------------------------------------------------- @brief 水平オフセット値を取得する @return 水平オフセット値(ピクセル単位) -----------------------------------------------------------------------*/ f32 GetOffsetH() const; /*!---------------------------------------------------------------------- @brief 水平オフセット値を設定する @param[in] fOfstH 水平オフセット値(ピクセル単位) -----------------------------------------------------------------------*/ void SetOffsetH(f32 fOfstH); /*======================================================================= Save()呼び出し成功後に取得できる情報 =======================================================================*/ /*!---------------------------------------------------------------------- @brief 保存したMPのファイルパスを取得する @return ファイルパス @details 保存していない、出来なかった場合などは空文字列を返します。 -----------------------------------------------------------------------*/ const wchar_t* GetSavedFilePath() const; private: Result ValidateParam() const; void SetFilePathToVirtual(const wchar_t* pPath); private: int m_nJpegQuality; nn::jpeg::CTR::PixelSampling m_eJpegFormat; NN_PADDING3; const void* m_pRawDataL; const void* m_pRawDataR; int m_nRawWidth; int m_nRawHeight; nn::jpeg::CTR::PixelFormat m_eRawFormat; NN_PADDING3; f32 m_fOfstH; wchar_t* m_pFilePath; }; } // end of namespace imgdb #endif // JPEG_MP_SAVER_H_