text: typedef struct
  {
  	DWORD R;
  	DWORD G;
  	DWORD B;
  	DWORD A;
  }RGBA;
  
  std::string string_To_UTF8(const std::string& str){
  	int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
  	wchar_t* pwBuf = new wchar_t[nwLen + 1];
  	ZeroMemory(pwBuf, nwLen * 2 + 2);
  	::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);
  	int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
  	char* pBuf = new char[nLen + 1];
  	ZeroMemory(pBuf, nLen + 1);
  	::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
  	std::string retStr(pBuf);
  	delete[]pwBuf;
  	delete[]pBuf;
  	pwBuf = NULL;
  	pBuf = NULL;
  	return retStr;
  }
  
  void DrawStrokeText(int x, int y, RGBA* color, const char* str){
  	ImFont a;
  	std::string utf_8_1 = std::string(str);
  	std::string utf_8_2 = string_To_UTF8(utf_8_1);
  	ImGui::GetOverlayDrawList()->AddText(ImVec2(x, y - 1), ImGui::ColorConvertFloat4ToU32(ImVec4(1 / 255.0, 1 / 255.0, 1 / 255.0, 255 / 255.0)), utf_8_2.c_str());
  	ImGui::GetOverlayDrawList()->AddText(ImVec2(x, y + 1), ImGui::ColorConvertFloat4ToU32(ImVec4(1 / 255.0, 1 / 255.0, 1 / 255.0, 255 / 255.0)), utf_8_2.c_str());
  	ImGui::GetOverlayDrawList()->AddText(ImVec2(x - 1, y), ImGui::ColorConvertFloat4ToU32(ImVec4(1 / 255.0, 1 / 255.0, 1 / 255.0, 255 / 255.0)), utf_8_2.c_str());
  	ImGui::GetOverlayDrawList()->AddText(ImVec2(x + 1, y), ImGui::ColorConvertFloat4ToU32(ImVec4(1 / 255.0, 1 / 255.0, 1 / 255.0, 255 / 255.0)), utf_8_2.c_str());
  	ImGui::GetOverlayDrawList()->AddText(ImVec2(x, y), ImGui::ColorConvertFloat4ToU32(ImVec4(color->R / 255.0, color->G / 255.0, color->B / 255.0, color->A / 255.0)), utf_8_2.c_str());
  }
  
  void DrawNewText(int x, int y, RGBA* color, const char* str){
  	ImFont a;
  	std::string utf_8_1 = std::string(str);
  	std::string utf_8_2 = string_To_UTF8(utf_8_1);
  	ImGui::GetOverlayDrawList()->AddText(ImVec2(x, y), ImGui::ColorConvertFloat4ToU32(ImVec4(color->R / 255.0, color->G / 255.0, color->B / 255.0, color->A / 255.0)), utf_8_2.c_str());
  }
  
  void DrawRect(int x, int y, int w, int h, RGBA* color, int thickness){
  	ImGui::GetOverlayDrawList()->AddRect(ImVec2(x, y), ImVec2(x + w, y + h), ImGui::ColorConvertFloat4ToU32(ImVec4(color->R / 255.0, color->G / 255.0, color->B / 255.0, color->A / 255.0)), 0, 0, thickness);
  }
  
  void DrawFilledRect(int x, int y, int w, int h, RGBA* color){
  	ImGui::GetOverlayDrawList()->AddRectFilled(ImVec2(x, y), ImVec2(x + w, y + h), ImGui::ColorConvertFloat4ToU32(ImVec4(color->R / 255.0, color->G / 255.0, color->B / 255.0, color->A / 255.0)), 0, 0);
  }
  
  void DrawCircleFilled(int x, int y, int radius, RGBA* color){
  	ImGui::GetOverlayDrawList()->AddCircleFilled(ImVec2(x, y), radius, ImGui::ColorConvertFloat4ToU32(ImVec4(color->R / 255.0, color->G / 255.0, color->B / 255.0, color->A / 255.0)));
  }
  
  void DrawCircle(int x, int y, int radius, RGBA* color, int segments){
  	ImGui::GetOverlayDrawList()->AddCircle(ImVec2(x, y), radius, ImGui::ColorConvertFloat4ToU32(ImVec4(color->R / 255.0, color->G / 255.0, color->B / 255.0, color->A / 255.0)), segments);
  }
  
  void DrawTriangle(int x1, int y1, int x2, int y2, int x3, int y3, RGBA* color, float thickne){
  	ImGui::GetOverlayDrawList()->AddTriangle(ImVec2(x1, y1), ImVec2(x2, y2), ImVec2(x3, y3), ImGui::ColorConvertFloat4ToU32(ImVec4(color->R / 255.0, color->G / 255.0, color->B / 255.0, color->A / 255.0)), thickne);
  }
  
  void DrawTriangleFilled(int x1, int y1, int x2, int y2, int x3, int y3, RGBA* color){
  	ImGui::GetOverlayDrawList()->AddTriangleFilled(ImVec2(x1, y1), ImVec2(x2, y2), ImVec2(x3, y3), ImGui::ColorConvertFloat4ToU32(ImVec4(color->R / 255.0, color->G / 255.0, color->B / 255.0, color->A / 255.0)));
  }
  
  void DrawLine(int x1, int y1, int x2, int y2, RGBA* color, int thickness){
  	ImGui::GetOverlayDrawList()->AddLine(ImVec2(x1, y1), ImVec2(x2, y2), ImGui::ColorConvertFloat4ToU32(ImVec4(color->R / 255.0, color->G / 255.0, color->B / 255.0, color->A / 255.0)), thickness);
  }
  
  void DrawCornerBox(int x, int y, int w, int h, int borderPx, RGBA* color){
  	DrawFilledRect(x + borderPx, y, w / 3, borderPx, color);
  	DrawFilledRect(x + w - w / 3 + borderPx, y, w / 3, borderPx, color);
  	DrawFilledRect(x, y, borderPx, h / 3, color);
  	DrawFilledRect(x, y + h - h / 3 + borderPx * 2, borderPx, h / 3, color); 
  	DrawFilledRect(x + borderPx, y + h + borderPx, w / 3, borderPx, color); 
  	DrawFilledRect(x + w - w / 3 + borderPx, y + h + borderPx, w / 3, borderPx, color);
  	DrawFilledRect(x + w + borderPx, y, borderPx, h / 3, color);
  	DrawFilledRect(x + w + borderPx, y + h - h / 3 + borderPx * 2, borderPx, h / 3, color);
  }