/src/gosu/jruby/FontProxy.java

http://jgosu.googlecode.com/ · Java · 179 lines · 144 code · 35 blank · 0 comment · 10 complexity · b77c0e7cb40b9596d893a3e99762f106 MD5 · raw file

  1. import gosu.Font;
  2. import gosu.Color;
  3. import gosu.Image;
  4. import org.jruby.*;
  5. import org.jruby.runtime.*;
  6. import org.jruby.runtime.builtin.IRubyObject;
  7. import org.jruby.javasupport.JavaUtil;
  8. import org.jruby.anno.JRubyMethod;
  9. import static org.jruby.RubyNumeric.*;
  10. public class FontProxy extends RubyObject {
  11. private static ObjectAllocator ALLOCATOR = new ObjectAllocator() {
  12. public IRubyObject allocate(Ruby runtime, RubyClass klass) {
  13. return new FontProxy(runtime, klass);
  14. }
  15. };
  16. private Font _font;
  17. private Ruby _runtime;
  18. public static void createFontClass(Ruby runtime) {
  19. RubyModule mGosu = runtime.getModule("Gosu");
  20. RubyClass cFont = mGosu.defineClassUnder("Font", runtime.getObject(), ALLOCATOR);
  21. cFont.defineAnnotatedMethods(FontProxy.class);
  22. }
  23. public FontProxy(Ruby runtime, RubyClass type) {
  24. super(runtime, type);
  25. _runtime = runtime;
  26. }
  27. public Font getFont() { return _font; }
  28. @JRubyMethod(name = "initialize",
  29. required = 3,
  30. frame = true,
  31. visibility = Visibility.PRIVATE)
  32. public IRubyObject initialize(IRubyObject window, IRubyObject fontName, IRubyObject height) {
  33. try {
  34. _font = new Font(((WindowProxy) window).getWindow(), ((RubyString) fontName).toString(), fix2int(height));
  35. } catch (RuntimeException e) {
  36. throw _runtime.newRuntimeError(e.getMessage());
  37. }
  38. return this;
  39. }
  40. @JRubyMethod(name = "draw",
  41. required = 4,
  42. optional = 4)
  43. public IRubyObject draw(IRubyObject[] args) {
  44. String text = args[0].asString().getUnicodeValue();
  45. double x = num2dbl(args[1]);
  46. double y = num2dbl(args[2]);
  47. double z = num2dbl(args[3]);
  48. switch (args.length) {
  49. case 4:
  50. _font.draw(text, x, y, z);
  51. break;
  52. case 5:
  53. _font.draw(text, x, y, z, num2dbl(args[4]), 1.0);
  54. break;
  55. case 6:
  56. _font.draw(text, x, y, z, num2dbl(args[4]), num2dbl(args[5]));
  57. break;
  58. default: { // 7 or 8
  59. Color c = WindowProxy.getColorFrom(args[6]);
  60. int mode = Image.DEFAULT;
  61. if (args.length == 8) {
  62. mode = WindowProxy.getAlphaModeFrom(_runtime, args[7]);
  63. }
  64. _font.draw(text, x, y, z, num2dbl(args[4]), num2dbl(args[5]), c, mode);
  65. }
  66. }
  67. return _runtime.getNil();
  68. }
  69. @JRubyMethod(name = "draw_rot",
  70. required = 5,
  71. optional = 4)
  72. public IRubyObject drawRot(IRubyObject[] args) {
  73. String text = args[0].asString().getUnicodeValue();
  74. double x = num2dbl(args[1]);
  75. double y = num2dbl(args[2]);
  76. double z = num2dbl(args[3]);
  77. double angle = num2dbl(args[4]);
  78. switch (args.length) {
  79. case 5:
  80. _font.drawRot(text, x, y, z, angle);
  81. break;
  82. case 6:
  83. _font.drawRot(text, x, y, z, angle, num2dbl(args[5]), 1.0);
  84. break;
  85. case 7:
  86. _font.drawRot(text, x, y, z, angle, num2dbl(args[5]), num2dbl(args[6]));
  87. break;
  88. default: { // 8 or 9
  89. Color c = WindowProxy.getColorFrom(args[7]);
  90. int mode = Image.DEFAULT;
  91. if (args.length == 9) {
  92. mode = WindowProxy.getAlphaModeFrom(_runtime, args[8]);
  93. }
  94. _font.drawRot(text, x, y, z, angle, num2dbl(args[5]), num2dbl(args[6]), c, mode);
  95. }
  96. }
  97. return _runtime.getNil();
  98. }
  99. @JRubyMethod(name = "draw_rel",
  100. required = 6,
  101. optional = 4)
  102. public IRubyObject drawRel(IRubyObject[] args) {
  103. String text = args[0].asString().getUnicodeValue();
  104. double x = num2dbl(args[1]);
  105. double y = num2dbl(args[2]);
  106. double z = num2dbl(args[3]);
  107. double relX = num2dbl(args[4]);
  108. double relY = num2dbl(args[5]);
  109. switch (args.length) {
  110. case 6:
  111. _font.drawRel(text, x, y, z, relX, relY);
  112. break;
  113. case 7:
  114. _font.drawRel(text, x, y, z, relX, relY, num2dbl(args[6]), 1.0);
  115. break;
  116. case 8:
  117. _font.drawRel(text, x, y, z, relX, relY, num2dbl(args[6]), num2dbl(args[7]));
  118. break;
  119. default: { // 9 or 10
  120. Color c = WindowProxy.getColorFrom(args[8]);
  121. int mode = Image.DEFAULT;
  122. if (args.length == 10) {
  123. mode = WindowProxy.getAlphaModeFrom(_runtime, args[9]);
  124. }
  125. _font.drawRel(text, x, y, z, relX, relY, num2dbl(args[6]), num2dbl(args[7]), c, mode);
  126. }
  127. }
  128. return _runtime.getNil();
  129. }
  130. @JRubyMethod(name = "text_width",
  131. required = 1,
  132. optional = 1)
  133. public IRubyObject textWidth(IRubyObject[] args) {
  134. double width = _font.textWidth(args[0].toString());
  135. if (args.length > 1) {
  136. return _runtime.newFloat(width * num2dbl(args[1]));
  137. }
  138. return _runtime.newFloat(width);
  139. }
  140. @JRubyMethod(name = "height")
  141. public IRubyObject height() {
  142. return _runtime.newFixnum(_font.getHeight());
  143. }
  144. }