// DrawCharPos.cpp: CDrawCharPos クラスのインプリメンテーション
//
//////////////////////////////////////////////////////////////////////

#include "DrawCharPos.h"

//////////////////////////////////////////////////////////////////////
// 構築/消滅
//////////////////////////////////////////////////////////////////////

CDrawCharPos::CDrawCharPos() :
	RXPos( 0 ), IsEnable( false )
{

}

CDrawCharPos::~CDrawCharPos()
{

}

//////////////////////////////////////////////////////////////////////
// メソッド
//////////////////////////////////////////////////////////////////////

// 通称：初期化
void CDrawCharPos::Clear()
{
	assert( NULL != this );
	RXPos = 0;
	vXPos.Clear();
}

// 通称：記録されている文字数を取得
int CDrawCharPos::GetCharCnt() const
{
	assert( NULL != this );
	return vXPos.GetUsedLen();
}

// 通称：右端のX座標を取得
unsigned int CDrawCharPos::GetRightXPos() const
{
	assert( NULL != this );
	return RXPos;
}

// 通称：各文字ごとの描画位置を取得
unsigned int CDrawCharPos::GetCharPos( int x ) const
{
	assert( NULL != this );
	assert( !( x < 0 || GetCharCnt() <= x ) );
	return vXPos[ x ];
}

// 有効か否かを取得
bool CDrawCharPos::GetIsEnable() const
{
	assert( NULL != this );
	return IsEnable;
}

// 通称：一文字増やす
void CDrawCharPos::AddChar( unsigned int argXPos )
{
	assert( NULL != this );
	vXPos.PushBack( argXPos );
}

// 通称：右端のX座標を設定
void CDrawCharPos::SetRightXPos( unsigned int argRXPos )
{
	assert( NULL != this );
	RXPos = argRXPos;
}

// 通称：各文字の描画位置を設定
void CDrawCharPos::SetXPos( int x, unsigned int argXPos )
{
	assert( NULL != this );
	assert( !( x < 0 || GetCharCnt() <= x ) );
	vXPos[ x ] = argXPos;
}

// 有効か否かを設定する
void CDrawCharPos::SetIsEnable( bool f )
{
	assert( NULL != this );
	IsEnable = f;
}

// 通称：横方向の位置から列を算出
// 機能：（行頭を0とした）X座標から指定した行の左からの文字数を算出する。
int CDrawCharPos::FindPosToRowNum( unsigned int XPos, enumCHARSELTYPE CharSelType ) const
{
	long l;
	long h;
	long m;
	long w;

	assert( NULL != this );

	if ( XPos == 0 ) return 0;	// 特例的に0の時は強制的に0とする

	// 指定された位置が、描画されている文字の右端より右側にある場合
	if ( GetRightXPos() <= XPos )
		return GetCharCnt();

	l = 0;
	h = GetCharCnt() - 1;
	m = ( l + h ) / 2;
	while ( l <= h ){
		w = GetCharPos( m );
		if ( w > XPos )
			h = m - 1;
		else
			l = m + 1;
		m = ( l + h ) / 2;
	}
	l--;
	if ( l < 0 ) return 0;

	// 設定による調整
	switch ( CharSelType ) {
	case CST_LEFT:
		return l;
	case CST_RIGHT:
		return l + 1;
	default:
		if ( GetCharPos( l ) + ( GetCharWidth( l ) / 2 ) < XPos )
			l++;
		return l;
	}
}

// （保持しているキャッシュから）各文字の描画されている幅を算出する
unsigned int CDrawCharPos::GetCharWidth( unsigned int idx ) const
{
	assert( NULL != this );
	assert( idx < GetCharCnt() );

	if ( idx == GetCharCnt() - 1 )
		return GetRightXPos() - GetCharPos( idx );	// 右端の文字の場合
	else
		return GetCharPos( idx + 1 ) - GetCharPos( idx );
}

