mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@83 385bec56-5757-e545-9c3a-d8741f4650f1
90 lines
2.6 KiB
C++
90 lines
2.6 KiB
C++
/*---------------------------------------------------------------------------*
|
|
Project: Horizon
|
|
File: scrollBuffer.cpp
|
|
|
|
Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
|
|
|
|
These coded instructions, statements, and computer programs contain
|
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
|
Company Ltd., and are protected by Federal copyright law. They may
|
|
not be disclosed to third parties or copied or duplicated in any form,
|
|
in whole or in part, without the prior written consent of Nintendo.
|
|
|
|
$Rev$
|
|
*---------------------------------------------------------------------------*/
|
|
|
|
#include <cstdio>
|
|
#include "scrollBuffer.h"
|
|
|
|
using namespace std;
|
|
|
|
char ScrollBuffer::s_buffers[MAX_BUFFER_LINE][MAX_BUFFER_CHARS];
|
|
|
|
char *ScrollBuffer::GetFormattedString(const char *fmt, va_list arg)
|
|
{
|
|
static char formattedBuffer[MAX_BUFFER_CHARS];
|
|
vsnprintf(formattedBuffer, MAX_BUFFER_CHARS, fmt, arg);
|
|
return formattedBuffer;
|
|
}
|
|
|
|
ScrollBuffer *ScrollBuffer::Update()
|
|
{
|
|
return this;
|
|
}
|
|
|
|
ScrollBuffer *ScrollBuffer::AppendText(const char *fmt, ...)
|
|
{
|
|
va_list vlist;
|
|
va_start(vlist, fmt);
|
|
|
|
int nextPosition=(m_tail+1)%MAX_BUFFER_LINE;
|
|
if(nextPosition==m_head){
|
|
// ヘッドとビューの移動
|
|
if(m_head==m_currentView){
|
|
m_currentView=(m_head+1)%MAX_BUFFER_LINE;
|
|
}
|
|
m_head=(m_head+1)%MAX_BUFFER_LINE;
|
|
|
|
}
|
|
strlcpy(s_buffers[m_tail], GetFormattedString(fmt, vlist), MAX_BUFFER_CHARS);
|
|
m_tail=nextPosition;
|
|
NN_LOG("cup: %s\n", GetFormattedString(fmt, vlist));
|
|
|
|
// ビューの移動
|
|
if((m_currentView+MAX_DISPLAY_LINES)%MAX_BUFFER_LINE==m_tail){
|
|
m_currentView=(m_currentView+1)%MAX_BUFFER_LINE;
|
|
}
|
|
|
|
return this;
|
|
}
|
|
ScrollBuffer *ScrollBuffer::ReplaceText(const char *fmt, ...)
|
|
{
|
|
va_list vlist;
|
|
va_start(vlist, fmt);
|
|
|
|
NN_ASSERT(m_tail!=m_head);
|
|
strlcpy(s_buffers[(m_tail-1)%MAX_BUFFER_LINE], GetFormattedString(fmt, vlist), MAX_BUFFER_CHARS);
|
|
|
|
return this;
|
|
}
|
|
|
|
void ScrollBuffer::Render()
|
|
{
|
|
// 描画前処理
|
|
m_render->SetRenderTarget(NN_GX_DISPLAY1);
|
|
m_render->Clear();
|
|
m_render->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
|
|
|
// リングバッファなので、終端条件を調整
|
|
int tail=(m_tail<m_head) ? m_tail+ScrollBuffer::MAX_BUFFER_LINE : m_tail;
|
|
|
|
for(int i=m_currentView; i<tail; i++){
|
|
if(i<m_currentView+MAX_DISPLAY_LINES-1){
|
|
m_render->DrawText(0, (i-m_currentView)*FONT_SIZE, s_buffers[i%MAX_BUFFER_LINE]);
|
|
}
|
|
}
|
|
|
|
// 描画転送
|
|
m_render->SwapBuffers();
|
|
}
|