Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ファイル読み込み高速化(行レイアウト幅算出を1回だけにする) #1992

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions sakura_core/CLoadAgent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -257,12 +257,21 @@ ELoadResult CLoadAgent::OnLoad(const SLoadInfo& sLoadInfo)
if( ref.m_nTextWrapMethod != WRAP_SETTING_WIDTH )
nMaxLineKetas = CKetaXInt(MAXLINEKETAS);

// テキストの折り返し方法
// CLayoutMgr::CreateLayoutで参照されるのでここで設定
pcDoc->m_nTextWrapMethodCur = pcDoc->m_cDocType.GetDocumentAttribute().m_nTextWrapMethod;

// ファイルを読んだらタブ位置を再計算
// この後のSetLayoutInfoの中でもCTsvModeInfo::CalcTabLengthを呼ぶ所があるが
// TsvModeの変化がない場合にはそこでは呼ばれないので必要な場合はここでやっておく
if (ref.m_nTsvMode != TSV_MODE_NONE) {
pcDoc->m_cLayoutMgr.m_tsvInfo.CalcTabLength(pcDoc->m_cLayoutMgr.m_pcDocLineMgr);
pcDoc->m_cLayoutMgr.m_tsvInfo.m_nTsvMode = ref.m_nTsvMode;
}

CProgressSubject* pOld = CEditApp::getInstance()->m_pcVisualProgress->CProgressListener::Listen(&pcDoc->m_cLayoutMgr);
pcDoc->m_cLayoutMgr.SetLayoutInfo( true, true, ref, ref.m_nTabSpace, ref.m_nTsvMode, nMaxLineKetas, CLayoutXInt(-1), &GetEditWnd().GetLogfont() );
GetEditWnd().ClearViewCaretPosInfo();
if (pcDoc->m_cLayoutMgr.m_tsvInfo.m_nTsvMode != TSV_MODE_NONE) {
pcDoc->m_cLayoutMgr.m_tsvInfo.CalcTabLength(pcDoc->m_cLayoutMgr.m_pcDocLineMgr);
}

CEditApp::getInstance()->m_pcVisualProgress->CProgressListener::Listen(pOld);

Expand All @@ -287,7 +296,8 @@ void CLoadAgent::OnAfterLoad(const SLoadInfo& sLoadInfo)

// 2009.08.28 nasukoji 「折り返さない」ならテキスト最大幅を算出、それ以外は変数をクリア
if( pcDoc->m_nTextWrapMethodCur == WRAP_NO_TEXT_WRAP )
pcDoc->m_cLayoutMgr.CalculateTextWidth(); // テキスト最大幅を算出する
// CLayoutMgr::_DoLayoutにて長さ算出済みなのでbCalLineLen=FALSE指定
pcDoc->m_cLayoutMgr.CalculateTextWidth(FALSE); // テキスト最大幅を算出する
else
pcDoc->m_cLayoutMgr.ClearLayoutLineWidth(); // 各行のレイアウト行長の記憶をクリアする
}
Expand Down
6 changes: 4 additions & 2 deletions sakura_core/cmd/CViewCommander_Edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,8 @@ void CViewCommander::Command_UNDO( void )
GetDocument()->m_cLayoutMgr._DoLayout(false);
GetEditWindow()->ClearViewCaretPosInfo();
if( GetDocument()->m_nTextWrapMethodCur == WRAP_NO_TEXT_WRAP ){
GetDocument()->m_cLayoutMgr.CalculateTextWidth();
// CLayoutMgr::_DoLayoutにて長さ算出済みなのでbCalLineLen=FALSE指定
GetDocument()->m_cLayoutMgr.CalculateTextWidth(FALSE);
}
GetDocument()->m_cLayoutMgr.LogicToLayout(
pcOpe->m_ptCaretPos_PHY_Before,
Expand Down Expand Up @@ -705,7 +706,8 @@ void CViewCommander::Command_REDO( void )
GetDocument()->m_cLayoutMgr._DoLayout(false);
GetEditWindow()->ClearViewCaretPosInfo();
if( GetDocument()->m_nTextWrapMethodCur == WRAP_NO_TEXT_WRAP ){
GetDocument()->m_cLayoutMgr.CalculateTextWidth();
// CLayoutMgr::_DoLayoutにて長さ算出済みなのでbCalLineLen=FALSE指定
GetDocument()->m_cLayoutMgr.CalculateTextWidth(FALSE);
}
GetDocument()->m_cLayoutMgr.LogicToLayout(
pcOpe->m_ptCaretPos_PHY_After, &ptCaretPos_After );
Expand Down
4 changes: 3 additions & 1 deletion sakura_core/cmd/CViewCommander_Settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,9 @@ void CViewCommander::Command_TEXTWRAPMETHOD( int nWrapMethod )

// 2009.08.28 nasukoji 「折り返さない」ならテキスト最大幅を算出、それ以外は変数をクリア
if( pcDoc->m_nTextWrapMethodCur == WRAP_NO_TEXT_WRAP ){
pcDoc->m_cLayoutMgr.CalculateTextWidth(); // テキスト最大幅を算出する
// CEditWnd::ChangeLayoutParam->CLayoutMgr::ChangeLayoutParam->
// CLayoutMgr::_DoLayoutにて長さ算出済みなのでbCalLineLen=FALSE指定
pcDoc->m_cLayoutMgr.CalculateTextWidth(FALSE); // テキスト最大幅を算出する
GetEditWindow()->RedrawAllViews( NULL ); // スクロールバーの更新が必要なので再表示を実行する
}else{
pcDoc->m_cLayoutMgr.ClearLayoutLineWidth(); // 各行のレイアウト行長の記憶をクリアする
Expand Down
3 changes: 2 additions & 1 deletion sakura_core/doc/CDocVisitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ void CDocVisitor::SetAllEol(CEol cEol)
m_pcDocRef->m_cLayoutMgr._DoLayout(false);
GetEditWnd().ClearViewCaretPosInfo();
if( m_pcDocRef->m_nTextWrapMethodCur == WRAP_NO_TEXT_WRAP ){
m_pcDocRef->m_cLayoutMgr.CalculateTextWidth();
// CLayoutMgr::_DoLayoutにて長さ算出済みなのでbCalLineLen=FALSE指定
m_pcDocRef->m_cLayoutMgr.CalculateTextWidth(FALSE);
}else{
m_pcDocRef->m_cLayoutMgr.ClearLayoutLineWidth();
}
Expand Down
4 changes: 3 additions & 1 deletion sakura_core/doc/CEditDoc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -817,7 +817,9 @@ void CEditDoc::OnChangeSetting(

// 2009.08.28 nasukoji 「折り返さない」ならテキスト最大幅を算出、それ以外は変数をクリア
if( m_nTextWrapMethodCur == WRAP_NO_TEXT_WRAP )
m_cLayoutMgr.CalculateTextWidth(); // テキスト最大幅を算出する
// レイアウト情報再生成時(bDoLayout=true)はCLayoutMgr::SetLayoutInfo->
// CLayoutMgr::_DoLayoutにて長さ算出済みなのでbCalLineLen=FALSE指定
m_cLayoutMgr.CalculateTextWidth(!bDoLayout); // テキスト最大幅を算出する
else
m_cLayoutMgr.ClearLayoutLineWidth(); // 各行のレイアウト行長の記憶をクリアする

Expand Down
47 changes: 14 additions & 33 deletions sakura_core/doc/layout/CLayoutMgr_DoLayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,20 +244,6 @@ void CLayoutMgr::_DoGyomatsuKinsoku(SLayoutWork* pWork, PF_OnLine pfOnLine)
}
}

//折り返す場合はtrueを返す
bool CLayoutMgr::_DoTab(SLayoutWork* pWork, PF_OnLine pfOnLine)
{
// Sep. 23, 2002 genta せっかく作ったので関数を使う
CLayoutInt nCharKetas = GetActualTabSpace( pWork->nPosX );
if( pWork->nPosX + nCharKetas > GetMaxLineLayout() ){
(this->*pfOnLine)(pWork);
return true;
}
pWork->nPosX += nCharKetas;
pWork->nPos += CNativeW::GetSizeOfChar( pWork->cLineStr, pWork->nPos );
return false;
}

// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
// 準処理 //
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
Expand Down Expand Up @@ -305,31 +291,26 @@ void CLayoutMgr::_MakeOneLine(SLayoutWork* pWork, PF_OnLine pfOnLine)
//@@@ 2002.09.22 YAZAKI
color.CheckColorMODE( &pWork->pcColorStrategy, pWork->nPos, pWork->cLineStr );

if( pWork->cLineStr[pWork->nPos] == WCODE::TAB ){
if(_DoTab(pWork, pfOnLine)){
continue;
}
const auto& ch = pWork->cLineStr[pWork->nPos];
CLayoutInt nCharKetas {0};
if( ch == WCODE::TAB || (ch == L',' && m_tsvInfo.m_nTsvMode == TSV_MODE_CSV) ){
nCharKetas = GetActualTsvSpace( pWork->nPosX, ch );
}else{
nCharKetas = GetLayoutXOfChar( pWork->cLineStr, pWork->nPos );
}
else{
if( pWork->nPos >= pWork->cLineStr.GetLength() ){
break;
}
// 2007.09.07 kobake ロジック幅とレイアウト幅を区別
CLayoutInt nCharKetas = GetLayoutXOfChar( pWork->cLineStr, pWork->nPos );

if( pWork->nPosX + nCharKetas > GetMaxLineLayout() ){
if( pWork->eKinsokuType != KINSOKU_TYPE_KINSOKU_KUTO )
if( pWork->nPosX + nCharKetas > GetMaxLineLayout() ){
if( pWork->eKinsokuType != KINSOKU_TYPE_KINSOKU_KUTO )
{
if( ! (m_pTypeConfig->m_bKinsokuRet && (pWork->nPos == pWork->cLineStr.GetLength() - nEol) && nEol) ) //改行文字をぶら下げる //@@@ 2002.04.14 MIK
{
if( ! (m_pTypeConfig->m_bKinsokuRet && (pWork->nPos == pWork->cLineStr.GetLength() - nEol) && nEol) ) //改行文字をぶら下げる //@@@ 2002.04.14 MIK
{
(this->*pfOnLine)(pWork);
continue;
}
(this->*pfOnLine)(pWork);
continue;
}
}
pWork->nPos += CNativeW::GetSizeOfChar( pWork->cLineStr, pWork->nPos );
pWork->nPosX += nCharKetas;
}
pWork->nPos += CNativeW::GetSizeOfChar( pWork->cLineStr, pWork->nPos );
pWork->nPosX += nCharKetas;
}
}

Expand Down
5 changes: 3 additions & 2 deletions sakura_core/macro/CMacro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1590,8 +1590,9 @@ bool CMacro::HandleFunction(CEditView *View, EFunctionCode ID, VARIANT *Argument

// 2009.08.28 nasukoji 「折り返さない」選択時にTAB幅が変更されたらテキスト最大幅の再算出が必要
if( View->m_pcEditDoc->m_nTextWrapMethodCur == WRAP_NO_TEXT_WRAP ){
// 最大幅の再算出時に各行のレイアウト長の計算も行う
View->m_pcEditDoc->m_cLayoutMgr.CalculateTextWidth();
// CEditWnd::ChangeLayoutParam->CLayoutMgr::ChangeLayoutParam->
// CLayoutMgr::_DoLayoutにて長さ算出済みなのでbCalLineLen=FALSE指定
View->m_pcEditDoc->m_cLayoutMgr.CalculateTextWidth(FALSE);
}
GetEditWnd().RedrawAllViews( NULL ); // TAB幅が変わったので再描画が必要
}
Expand Down