Skip to content

Commit

Permalink
CodeSmell対応(残り)
Browse files Browse the repository at this point in the history
  • Loading branch information
suconbu committed Jan 28, 2021
1 parent b808323 commit dc18ceb
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 43 deletions.
2 changes: 1 addition & 1 deletion sakura_core/cmd/CViewCommander_Settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ void CViewCommander::Command_SETFONTSIZE( int fontSize, int shift, int mode )
0.01, 0.011, 0.0125, 0.015, 0.0175, 0.02, 0.0225, 0.025, 0.0275, 0.03, 0.035, 0.04, 0.045, 0.05, 0.06, 0.07, 0.08, 0.09,
0.1, 0.11, 0.125, 0.15, 0.175, 0.2, 0.225, 0.25, 0.275, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9,
1.0, 1.1, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 9.0,
10.0, 11.0, 12.5, 15.0, 17.5, 20.0, 22.5, 25.0, 27.5, 30.0, 35.0, 40.0, 45.0, 50.0, 60.0, 70.0, 80.0, 90
10.0, 11.0, 12.5, 15.0, 17.5, 20.0, 22.5, 25.0, 27.5, 30.0, 35.0, 40.0, 45.0, 50.0, 60.0, 70.0, 80.0, 90.0
};
// 設定できるフォントサイズの下限/上限/最小単位(いずれも1/10ポイント単位)
constexpr int nPointSizeMin = 10;
Expand Down
103 changes: 64 additions & 39 deletions sakura_core/util/zoom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,15 +77,55 @@ bool ZoomSetting::IsValid() const
return (0.0 < nUnit) ? std::floor( nValue / nUnit ) * nUnit : nValue;
}

/*!
@brief 指定されたインデックスに該当するズーム倍率を適用した値を取得
@param[in] zoomSetting ズーム設定
@param[in] nBaseValue 基準値
@param[in] nCurrentValue 変更前の値
@param[in] nTableIndex ズーム倍率テーブルのインデックス
@param[out] pnValueOut 変更後のズーム倍率を適用した値
@param[out] pnZoomOut 変更後のズーム倍率
@return テーブルインデックスおよび値が共に範囲内かどうか
@note 戻り値が false の場合においても pnValueOut, pnZoomOut にはそれぞれ範囲内に丸めた値が設定されます。
*/
static bool GetZoomedValueInIndex( const ZoomSetting& zoomSetting, double nBaseValue, double nValueMin, double nValueMax, int nTableIndex, double* pnValueOut, double* pnZoomOut )
{
const int nClampedIndex = std::clamp( nTableIndex, 0, ((int)zoomSetting.m_vZoomFactors.size() - 1) );
double nNextZoom = zoomSetting.m_vZoomFactors[nClampedIndex];
double nNextValue = GetQuantizedValue( nBaseValue * nNextZoom, zoomSetting.m_nValueUnit );
bool bWithinRange = true;

if( nNextValue < nValueMin || nValueMax < nNextValue ){
// 値の上下限を超過していたら上下限に丸めて終わる
// 倍率は丸めた後のサイズで再計算
nNextValue = std::clamp( nNextValue, nValueMin, nValueMax );
if( nBaseValue != 0.0 ){
nNextZoom = nNextValue / nBaseValue;
}
bWithinRange = false;
}else if( nClampedIndex != nTableIndex ){
// 倍率テーブルの端まで到達していたら終わり
bWithinRange = false;
}else{
// インデックス/値ともに範囲内
}

*pnValueOut = nNextValue;
*pnZoomOut = nNextZoom;

return bWithinRange;
}

/*!
@brief 基準値に対してズーム倍率を適用した値を取得
@param[in] zoomSetting ズーム設定
@param[in] nBaseValue 基準値
@param[in] nCurrentZoom 現在のズーム倍率
@param[in] nCurrentZoom 変更前のズーム倍率
@param[in] nSteps ズーム段階の変更量
@param[in] pnValueOut 変更後のズーム倍率を適用した値
@param[in] pnZoomOut 変更後のズーム倍率
@return 丸められた値
@param[out] pnValueOut 変更後のズーム倍率を適用した値
@param[out] pnZoomOut 変更後のズーム倍率
@return ズームできたかどうか
@note 戻り値が false の場合には pnValueOut, pnZoomOut は設定されません。
*/
bool GetZoomedValue( const ZoomSetting& zoomSetting, double nBaseValue, double nCurrentZoom, int nSteps, double* pnValueOut, double* pnZoomOut )
{
Expand All @@ -108,6 +148,7 @@ bool GetZoomedValue( const ZoomSetting& zoomSetting, double nBaseValue, double n
const double nCurrentValue = GetQuantizedValue( nBaseValue * nCurrentZoom, zoomSetting.m_nValueUnit );
const double nValueMin = std::min( {zoomSetting.m_nValueMin, nBaseValue, nCurrentValue} );
const double nValueMax = std::max( {zoomSetting.m_nValueMax, nBaseValue, nCurrentValue} );
const int nIndexAddition = bZoomUp ? 1 : -1;
double nNextValue = nCurrentValue;
double nNextZoom = nCurrentZoom;
double nLastValue = nCurrentValue;
Expand All @@ -118,50 +159,34 @@ bool GetZoomedValue( const ZoomSetting& zoomSetting, double nBaseValue, double n
// 変わる位置までインデックスを動かしていく
nTableIndex += nSteps;
// 本当は無限ループで良いが万一の暴走回避のため有限回
for( const double _ : zoomSetting.m_vZoomFactors ){
int clampedIndex = std::clamp( nTableIndex, nTableIndexMin, nTableIndexMax );
nNextZoom = zoomSetting.m_vZoomFactors[clampedIndex];
nNextValue = GetQuantizedValue( nBaseValue * nNextZoom, zoomSetting.m_nValueUnit );

for( [[maybe_unused]] const double _ : zoomSetting.m_vZoomFactors ){
const bool bWithinRange = GetZoomedValueInIndex( zoomSetting, nBaseValue, nValueMin, nValueMax, nTableIndex, &nNextValue, &nNextZoom );
const bool bValueChanged = (nNextValue != nCurrentValue);
bool bBreak = false;
if( bFindingOneMoreChange ){
if( nNextValue != nLastValue || clampedIndex != nTableIndex ){
if( nNextValue != nLastValue || !bWithinRange ){
nNextValue = nLastValue;
nNextZoom = nLastZoom;
break;
bBreak = true;
}
}else if( !bWithinRange ){
// インデックスまたは値が範囲外になったので終わる
bBreak = true;
}else if( bValueChanged && bZoomUp ){
// 拡大方向は値が変わったらそこで確定
bBreak = true;
}else if( bValueChanged && !bZoomUp ){
// 縮小方向は一度値が変わった後もう一度値が変わる位置までインデックスを進めてから終わる
bFindingOneMoreChange = true;
}else{
// 値の上下限を超過したら上下限に丸めて終わる
// 倍率は丸めた後のサイズで再計算
if( nNextValue < nValueMin || nValueMax < nNextValue ){
nNextValue = std::clamp( nNextValue, nValueMin, nValueMax );
if( nBaseValue != 0.0 ){
nNextZoom = nNextValue / nBaseValue;
}
break;
}

// 倍率テーブルの端まで到達していたら終わり
if( clampedIndex != nTableIndex ){
break;
}

bool bSizeChanged = (nNextValue != nCurrentValue);
if( bZoomUp ){
// 拡大側は値が変わったらすぐ終わる
if( bSizeChanged ){
break;
}
}else{
// 縮小側は一度値が変わった後もう一度値が変わる位置までインデックスを進めてから終わる
if( bSizeChanged ){
bFindingOneMoreChange = true;
}
}
// 値が変化しなかったので次の段階へ
}

if( bBreak ){ break; }

nLastValue = nNextValue;
nLastZoom = nNextZoom;
nTableIndex += bZoomUp ? 1 : -1;
nTableIndex += nIndexAddition;
}

if( nCurrentValue == nNextValue ){
Expand Down
6 changes: 3 additions & 3 deletions sakura_core/util/zoom.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,12 @@ struct ZoomSetting
{
/*!
@brief コンストラクタ
@param[in] iterZoomFactorsFirst ズームテーブルの開始イテレータ
@param[in] iterZoomFactorsLast ズームテーブルの終了イテレータ
@param[in] iterZoomFactorsFirst ズーム倍率テーブルの開始イテレータ
@param[in] iterZoomFactorsLast ズーム倍率テーブルの終了イテレータ
@param[in] nValueMin 下限値(上限値以下であること)
@param[in] nValueMax 上限値(下限値以上であること)
@param[in] nValueUnit 値の最小単位(0以上であること)
@note ズームテーブルは昇順であること
@note ズーム倍率テーブルは昇順であること
*/
template<class InputIter>
ZoomSetting( InputIter iterZoomFactorsFirst, InputIter iterZoomFactorsLast, double nValueMin, double nValueMax, double nValueUnit ) :
Expand Down

0 comments on commit dc18ceb

Please sign in to comment.