/platform/unix/scaffold/view.d

http://github.com/wilkie/djehuty · D · 207 lines · 122 code · 61 blank · 24 comment · 2 complexity · 62753e0150e0eeca6384ef93724ca248 MD5 · raw file

  1. /*
  2. * view.d
  3. *
  4. * This Scaffold holds the View implementations for the Linux platform
  5. *
  6. * Author: Dave Wilkinson
  7. *
  8. */
  9. module scaffold.view;
  10. import platform.vars.view;
  11. import platform.vars.window;
  12. import platform.unix.common;
  13. import platform.unix.main;
  14. import graphics.view;
  15. import graphics.bitmap;
  16. import graphics.graphics;
  17. import core.string;
  18. import core.main;
  19. import core.definitions;
  20. import io.file;
  21. import gui.window;
  22. //import console.main;
  23. // views
  24. void ViewCreate(ref View view, ViewPlatformVars*viewVars)
  25. {
  26. // code to create a view
  27. viewVars.surface = Cairo.cairo_image_surface_create(Cairo.cairo_format_t.CAIRO_FORMAT_ARGB32, view.width(), view.height());
  28. viewVars.cr = Cairo.cairo_create(viewVars.surface);
  29. viewVars.attr_list_opaque = Pango.pango_attr_list_new();
  30. viewVars.attr_list_transparent = Pango.pango_attr_list_new();
  31. viewVars.attr_bg = Pango.pango_attr_background_new(0xFFFF, 0xFFFF, 0xFFFF);
  32. viewVars.attr_bg.start_index = 0;
  33. viewVars.attr_bg.end_index = -1;
  34. Pango.pango_attr_list_insert(viewVars.attr_list_opaque, viewVars.attr_bg);
  35. }
  36. void ViewDestroy(ref View view, ViewPlatformVars*viewVars)
  37. {
  38. // code to destroy a view
  39. Cairo.cairo_destroy(viewVars.cr);
  40. X.XFreePixmap(_pfvars.display, viewVars.pixmap);
  41. if (viewVars.gc !is null)
  42. {
  43. X.XFreeGC(_pfvars.display, viewVars.gc);
  44. viewVars.gc = null;
  45. }
  46. }
  47. void ViewCreateDIB(ref Bitmap view, ViewPlatformVars*viewVars)
  48. {
  49. // code to create a DIB view
  50. viewVars.surface = Cairo.cairo_image_surface_create(Cairo.cairo_format_t.CAIRO_FORMAT_ARGB32, view.width(), view.height());
  51. viewVars.cr = Cairo.cairo_create(viewVars.surface);
  52. viewVars.attr_list_opaque = Pango.pango_attr_list_new();
  53. viewVars.attr_list_transparent = Pango.pango_attr_list_new();
  54. viewVars.attr_bg = Pango.pango_attr_background_new(0xFFFF, 0xFFFF, 0xFFFF);
  55. viewVars.attr_bg.start_index = 0;
  56. viewVars.attr_bg.end_index = -1;
  57. viewVars.bits_length = view.width() * view.height() * 4;
  58. }
  59. void ViewCreateForWindow(ref WindowView view, ViewPlatformVars*viewVars, ref Window window, WindowPlatformVars* windowVars)
  60. {
  61. // code to create a view for a window
  62. int screen, depth;
  63. windowVars.destroy_called = false;
  64. screen = X.DefaultScreen(_pfvars.display);
  65. depth = X.DefaultDepth(_pfvars.display, screen);
  66. int _width = window.width;
  67. int _height = window.height;
  68. //create the back buffer
  69. viewVars.pixmap = X.XCreatePixmap(
  70. _pfvars.display, windowVars.window,
  71. _width, _height, depth);
  72. X.XSetWindowBackgroundPixmap(_pfvars.display, windowVars.window, X.None);
  73. viewVars.gc = X.XCreateGC(_pfvars.display, viewVars.pixmap, 0, null);
  74. //Set the buffer's window back reference
  75. viewVars.cur_window = windowVars.window;
  76. viewVars.surface = CairoX.cairo_xlib_surface_create(
  77. _pfvars.display, viewVars.pixmap,
  78. _pfvars.visual, _width, _height);
  79. viewVars.cr = Cairo.cairo_create(viewVars.surface);
  80. viewVars.layout = Pango.pango_cairo_create_layout(viewVars.cr);
  81. viewVars.attr_list_opaque = Pango.pango_attr_list_new();
  82. viewVars.attr_list_transparent = Pango.pango_attr_list_new();
  83. viewVars.attr_bg = Pango.pango_attr_background_new(0xFFFF, 0, 0xFFFF);
  84. viewVars.attr_bg.start_index = 0;
  85. viewVars.attr_bg.end_index = -1;
  86. Pango.pango_attr_list_insert(viewVars.attr_list_opaque, viewVars.attr_bg);
  87. //Pango.pango_attribute_destroy(viewVars.attr_bg);
  88. }
  89. void ViewResizeForWindow(ref WindowView view, ViewPlatformVars*viewVars, ref Window window, WindowPlatformVars* windowHelper)
  90. {
  91. }
  92. void ViewResize(ref View view, ViewPlatformVars*viewVars)
  93. {
  94. // code to Size a view, no concern needs to be taken
  95. // to preserve the view's contents and the image within the view
  96. // this is because of performance concerns, you don't necessarily care
  97. // about such things...it is also similar to resizing anything dynamic
  98. int _width = view.width();
  99. int _height = view.height();
  100. //make the buffer
  101. X.XFreePixmap(_pfvars.display, viewVars.pixmap);
  102. //create the Pixmap
  103. viewVars.pixmap = X.XCreatePixmap(
  104. _pfvars.display, viewVars.cur_window,
  105. _width,
  106. _height, X.DefaultDepth(_pfvars.display, X.DefaultScreen(_pfvars.display)));
  107. //attach to cairo and pango
  108. Pango.g_object_unref(viewVars.layout);
  109. Cairo.cairo_surface_destroy(viewVars.surface);
  110. Cairo.cairo_destroy(viewVars.cr);
  111. viewVars.surface = CairoX.cairo_xlib_surface_create(
  112. _pfvars.display, viewVars.pixmap,
  113. _pfvars.visual, _width, _height);
  114. viewVars.cr = Cairo.cairo_create(viewVars.surface);
  115. viewVars.layout = Pango.pango_cairo_create_layout(viewVars.cr);
  116. X.XFreeGC(_pfvars.display, viewVars.gc);
  117. viewVars.gc = X.XCreateGC(_pfvars.display,
  118. viewVars.pixmap, 0, null);
  119. }
  120. void* ViewGetBytes(ViewPlatformVars*viewVars, ref ulong length)
  121. {
  122. length = viewVars.bits_length;
  123. return Cairo.cairo_image_surface_get_data(viewVars.surface);
  124. }
  125. void* ViewGetBytes(ViewPlatformVars*viewVars)
  126. {
  127. return Cairo.cairo_image_surface_get_data(viewVars.surface);
  128. }
  129. void ViewUnlockBytes(ViewPlatformVars* viewVars) {
  130. }
  131. uint ViewRGBAToInt32(ref bool _forcenopremultiply, ViewPlatformVars*_pfvars, ref uint r, ref uint g, ref uint b, ref uint a)
  132. {
  133. if (!_forcenopremultiply)
  134. {
  135. float anew = a;
  136. anew /= cast(float)0xFF;
  137. r = cast(ubyte)(anew * cast(float)r);
  138. g = cast(ubyte)(anew * cast(float)g);
  139. b = cast(ubyte)(anew * cast(float)b);
  140. }
  141. return (r << 16) | (g << 8) | (b) | (a << 24);
  142. }
  143. uint ViewRGBAToInt32(ViewPlatformVars*_pfvars, ref uint r, ref uint g, ref uint b)
  144. {
  145. return (r << 16) | (g << 8) | (b) | 0xFF000000;
  146. }