///*---------------------------------------------------------------------------* // Project: Horizon // File: draw.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: 14479 $ // *---------------------------------------------------------------------------*/ // #include #include #include #include #include "demo.h" #include "sdAccessor.h" #include "draw.h" /* ExpHeap for app. */ extern nn::fnd::ExpHeap s_AppHeap; uptr s_HeapForGx; const u32 s_GxHeapSize = 0x800000; u16 xErrorPos = 130; u16 yErrorPos = 5; demo::RenderSystemExt s_RenderSystem; void InitializeGraphics() { s_HeapForGx = reinterpret_cast (s_AppHeap.Allocate(s_GxHeapSize)); /* Initialize display */ s_RenderSystem.Initialize(s_HeapForGx, s_GxHeapSize); s_RenderSystem.SetClearColor(NN_GX_DISPLAY0, 0.f, 0.f, 0.f, 1.0f); s_RenderSystem.SetClearColor(NN_GX_DISPLAY1, 0.f, 0.f, 0.f, 1.0f); s_RenderSystem.SetFontSize(8.0f); s_RenderSystem.SetColor(1.f, 1.f, 1.f); // WHITE } u16 Min(u16 a, u16 b) { return (a > b) ? b : a; } //選択ウィンドウによって色変化 void ChangeColorMode(Window& window) { if(window.isSelectedWindow) { s_RenderSystem.SetColor(1.0f, 1.0f, 1.0f); } else { s_RenderSystem.SetColor(0.5f, 0.5f, 0.5f); } } void DrawDefaultTop(void) { s_RenderSystem.DrawText(0, 0, "BinaryFile"); s_RenderSystem.DrawText(X_SCALE + xErrorPos, 0, " ErrorCode"); s_RenderSystem.SetLineWidth(1.f); s_RenderSystem.DrawLine(0,(fileStartPos - 0.5 ) * Y_SCALE,200,( fileStartPos -0.5) * Y_SCALE); s_RenderSystem.DrawLine(X_SCALE + xErrorPos - 1,0, X_SCALE + xErrorPos - 1,240); } void DrawDefaultBottom(void) { s_RenderSystem.DrawText(0, 0, "Directory"); s_RenderSystem.SetLineWidth(1.f); s_RenderSystem.DrawLine(0,(fileStartPos - 0.5 ) * Y_SCALE,100,( fileStartPos -0.5) * Y_SCALE); } void DrawCursor(Window& window) { s_RenderSystem.DrawText(X_SCALE, Y_SCALE * (fileStartPos + window.GetSelectPos()), ">"); } void DrawBinaryFile(Window& window, SdAccessor::BinaryInfo* binary) { for (u16 i = 0; i < Min(screenHeight,binary->size); i++) { if(window.isSelectedWindow) { switch (binary->binaryType[i+ window.GetOriginIndex()].state) { case SdAccessor::IMPORTED_NOT: s_RenderSystem.SetColor(1.f, 1.f, 1.f); break; case SdAccessor::IMPORTED_CLEAR: s_RenderSystem.SetColor(0.f, 0.f, 1.f); break; case SdAccessor::IMPORTED_ERROR: s_RenderSystem.SetColor(1.f, 0.f, 0.f); break; } } else { s_RenderSystem.SetColor(0.5f, 0.5f, 0.5f); } s_RenderSystem.DrawText(X_SCALE, Y_SCALE* (i + fileStartPos), " %ls ", binary->binaryType[ i + window.GetOriginIndex()].directoryEntry.entryName); s_RenderSystem.SetColor(1.f, 1.f, 1.f); } } void DrawDirectory(Window& window, SdAccessor::DirectoryInfo* directory) { for (u16 i = 0; i < Min(manualStartPos - 2,directory->size) ; i++) { if(!window.isSelectedWindow) { s_RenderSystem.SetColor(0.5f, 0.5f, 0.5f); } else if (window.GetIndex() == i + window.GetOriginIndex()) { s_RenderSystem.SetColor(1.f, 1.f, 0.f); // YELLOW } s_RenderSystem.DrawText(X_SCALE * 2 , Y_SCALE * (i + fileStartPos), "%ls", directory->directoryEntry[i + window.GetOriginIndex()].entryName); s_RenderSystem.SetColor(1.f, 1.f, 1.f); // WHITE } } //エラーリスト表示 void DrawErrorList(Window& top,SdAccessor::BinaryInfo* binary) { u16 index = top.GetIndex(); //インポートされていなければ非表示 if(binary->binaryType[index].state != SdAccessor::IMPORTED_NOT) { nn::Result result = binary->binaryType[index].result; u16 y = fileStartPos; ChangeColorMode(top); s_RenderSystem.DrawText( X_SCALE + xErrorPos, Y_SCALE * y," Level\n"); y += 2; s_RenderSystem.DrawText( X_SCALE + xErrorPos, Y_SCALE * y," %s (%d)\n" , nn::dbg::GetLevelString(result), result.GetLevel()); y += 3; s_RenderSystem.DrawText( X_SCALE + xErrorPos, Y_SCALE * y," Summary\n"); y += 2; s_RenderSystem.DrawText( X_SCALE + xErrorPos, Y_SCALE * y," %s (%d)\n" , nn::dbg::GetSummaryString(result), result.GetSummary()); y += 3; s_RenderSystem.DrawText( X_SCALE + xErrorPos, Y_SCALE * y," Module\n"); y += 2; s_RenderSystem.DrawText( X_SCALE + xErrorPos, Y_SCALE * y," %s (%d)\n" , nn::dbg::GetModuleString(result), result.GetModule()); y += 3; s_RenderSystem.DrawText( X_SCALE + xErrorPos, Y_SCALE * y," Description\n"); y += 2; s_RenderSystem.DrawText( X_SCALE + xErrorPos, Y_SCALE * y," %s\n" , nn::dbg::GetDescriptionString(result)); y += 2; s_RenderSystem.DrawText( X_SCALE + xErrorPos, Y_SCALE * y," (%d)\n", result.GetDescription()); y += 4; s_RenderSystem.DrawText( X_SCALE + xErrorPos, Y_SCALE * y," ErrorCode : %x \n",result.GetPrintableBits()); s_RenderSystem.SetColor(1.f, 1.f, 1.f); } } //上画面左描画 void DrawLeft(Window& window, SdAccessor::BinaryInfo* binary) { if(binary->size != 0) { ChangeColorMode(window); DrawDefaultTop(); s_RenderSystem.SetColor(1.f, 1.f, 1.f); // WHITE if(window.isSelectedWindow) { DrawCursor(window); } DrawBinaryFile(window,binary); } else { s_RenderSystem.DrawText(X_SCALE, Y_SCALE,"No Binary File in this directory.."); } } //上画面右描画 void DrawRight(Window& window, SdAccessor::BinaryInfo* binary) { DrawErrorList(window,binary); } //操作説明 void DrawManual(Window& top,Window& bottom, SdAccessor& sd) { f32 x = 1; f32 y = manualStartPos; s_RenderSystem.SetLineWidth(1.2f); s_RenderSystem.DrawLine(0,(manualStartPos - 0.5) * Y_SCALE,320,( manualStartPos - 0.5) * Y_SCALE); s_RenderSystem.SetLineWidth(1.f); s_RenderSystem.DrawLine(0,(manualStartPos + 1.5 ) * Y_SCALE,100,( manualStartPos + 1.5) * Y_SCALE); s_RenderSystem.DrawText(0, Y_SCALE*y++, "Manual"); y ++; //上画面選択時 if(top.isSelectedWindow) { SdAccessor::BinaryInfo* binary = sd.GetBinary(); if(sd.GetImportCount() == 0) { s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, "Current File :"); } else { s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, "Importing File :"); } s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, "%ls", binary->binaryType[top.GetIndex()].directoryEntry.entryName); y ++; s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, " A : Import %ls", binary->binaryType[top.GetIndex()].directoryEntry.entryName); s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, " X : Import all files"); s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, " Y : Export result"); s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, " to 'Result%d.csv' ",sd.GetExportCount()); y++; s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, " Start: to directory screen"); } //下画面選択時 else { s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, "Current directory :" ); wchar_t path[128]; SdAccessor::DirectoryInfo* directory = sd.GetDirectory(); //ディレクトリ名の行分け std::wcscpy( path,sd.GetFileName() ); u16 width = 240/Y_SCALE -1; u16 height = 4; wchar_t fileList[height][width]; for(u16 row = 0; row < height ; row++) { for(u16 col = 0; col < width;col++) { fileList[row][col] = path[row * width + col]; } } for(u16 i = 0; i < height; i++) { s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, "%ls",fileList[i]); } y++; s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, " A : Select %ls", directory->directoryEntry[bottom.GetIndex()].entryName); y++; s_RenderSystem.DrawText(X_SCALE*x, Y_SCALE*y++, " Start : to file screen"); } } //上画面描画 void DrawDisplay0(Window& topWindow,SdAccessor& sd) { SdAccessor::BinaryInfo* binary = sd.GetBinary(); s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0); s_RenderSystem.Clear(); DrawLeft(topWindow,binary); DrawRight(topWindow,binary); s_RenderSystem.Transfer(); s_RenderSystem.SwapBuffers(); } //下画面描画 void DrawDisplay1(Window& topWindow,Window& bottomWindow, SdAccessor& sd) { SdAccessor::DirectoryInfo* directory = sd.GetDirectory(); s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY1); s_RenderSystem.Clear(); ChangeColorMode(bottomWindow); DrawDefaultBottom(); s_RenderSystem.SetColor(1.f, 1.f, 1.f); // WHITE if(bottomWindow.isSelectedWindow) { DrawCursor(bottomWindow); } DrawDirectory(bottomWindow,directory); DrawManual(topWindow,bottomWindow,sd); s_RenderSystem.Transfer(); s_RenderSystem.SwapBuffers(); } void DrawNoSd(void) { s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0); s_RenderSystem.Clear(); s_RenderSystem.Transfer(); s_RenderSystem.SwapBuffers(); s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY1); s_RenderSystem.Clear(); s_RenderSystem.DrawText(X_SCALE, Y_SCALE, "No Sd Card Inserted"); s_RenderSystem.Transfer(); s_RenderSystem.SwapBuffers(); } void Draw(Window& topWindow, Window& bottomWindow,SdAccessor& sd) { if(sd.IsSdMount()) { DrawDisplay0(topWindow, sd ); DrawDisplay1(topWindow,bottomWindow, sd); } else { DrawNoSd(); } }