ctr_Repair/trunk/SkipFirstLaunch/ImageDb/include/imgdb/ImageIO/JpegMpSaver.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

605 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: JpegMpSaver.h
生画像データを受け取ると、JPEG/MPにエンコードし、SDカードへ保存します。
保存された画像はニンテンドー3DSカメラで管理されます。
---------------------------------------------------------------------------*/
#ifndef JPEG_MP_SAVER_H_
#define JPEG_MP_SAVER_H_
#include <nn/types.h>
#include <nn/util.h>
#include <nn/jpeg.h>
#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カメラのブラウズで表示され
るとき、横幅を基準に焦点調整ができる範囲が表示されます(平面画像でも表示
範囲は同一)。<BR>
ただし画像サイズが 400x2401024x768 の場合のみ設定できます。<BR>
このフラグが立っていない画像は、画像の全体が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を保存するには最低限以下の関数を呼び出す必要があります。<BR>
SetRaw()<BR>
SetTitleUniqueId()<BR>
Save()
*---------------------------------------------------------------------------*/
class JpegSaver : public JpegMpBaseSaver, private nn::util::NonCopyable<JpegSaver>
{
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に変換して保存します。<BR>
呼び出し前に各種設定を行っておいてください。<BR>
設定が不正だった場合はResultErrorInvalidParamが返ってきます。<BR>
本関数を呼び出すと内部で一時的に 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を保存するには最低限以下の関数を呼び出す必要があります。<BR>
SetRaw()<BR>
SetTitleUniqueId()<BR>
Save()
*---------------------------------------------------------------------------*/
class MpSaver : public JpegMpBaseSaver, private nn::util::NonCopyable<MpSaver>
{
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に変換して保存します。<BR>
呼び出し前に各種設定を行っておいてください。<BR>
設定が不正だった場合はResultErrorInvalidParamが返ってきます。<BR>
本関数を呼び出すと内部で一時的に 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_