106 rader
1.9 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net>
  5. // 2013 Jean-Yves Lamoureux <jylam@lnxscene.org>
  6. // This program is free software; you can redistribute it and/or
  7. // modify it under the terms of the Do What The Fuck You Want To
  8. // Public License, Version 2, as published by Sam Hocevar. See
  9. // http://www.wtfpl.net/ for more details.
  10. //
  11. #if defined HAVE_CONFIG_H
  12. # include "config.h"
  13. #endif
  14. #include <cstring>
  15. #include <cstdio>
  16. #include "core.h"
  17. using namespace std;
  18. namespace lol
  19. {
  20. /*
  21. * Font implementation class
  22. */
  23. class FontData
  24. {
  25. friend class Font;
  26. private:
  27. String m_name;
  28. TileSet *tileset;
  29. ivec2 size;
  30. };
  31. /*
  32. * Public Font class
  33. */
  34. Font::Font(char const *path)
  35. : data(new FontData())
  36. {
  37. data->m_name = String("<font> ") + path;
  38. data->tileset = Tiler::Register(path, ivec2::zero, ivec2(16));
  39. data->size = data->tileset->GetTileSize(0);
  40. m_drawgroup = DRAWGROUP_BEFORE;
  41. }
  42. Font::~Font()
  43. {
  44. Tiler::Deregister(data->tileset);
  45. delete data;
  46. }
  47. void Font::TickDraw(float seconds, Scene &scene)
  48. {
  49. Entity::TickDraw(seconds, scene);
  50. }
  51. char const *Font::GetName()
  52. {
  53. return data->m_name.C();
  54. }
  55. void Font::Print(vec3 pos, char const *str, vec2 scale)
  56. {
  57. float origin_x = pos.x;
  58. while (*str)
  59. {
  60. uint32_t ch = (uint8_t)*str++;
  61. switch (ch)
  62. {
  63. case '\r': /* carriage return */
  64. pos.x = origin_x;
  65. break;
  66. case '\b': /* backspace */
  67. pos.x -= data->size.x * scale.x;
  68. break;
  69. case '\n': /* new line */
  70. pos.x = origin_x;
  71. pos.y -= data->size.y * scale.y;
  72. break;
  73. default:
  74. if (ch != ' ')
  75. g_scene->AddTile(data->tileset, ch & 255, pos, 0, scale, 0.0f);
  76. pos.x += data->size.x * scale.x;
  77. break;
  78. }
  79. }
  80. }
  81. ivec2 Font::GetSize() const
  82. {
  83. return data->size;
  84. }
  85. } /* namespace lol */