<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Redrawing smoothly while display is being resized</title>
		<link>http://www.allegro.cc/forums/view/616732</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 08 Feb 2017 03:31:20 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><i>This is a continuation of the problem that was being explored in this thread: <a href="https://www.allegro.cc/forums/thread/616674">https://www.allegro.cc/forums/thread/616674</a></i></p><p>I would like for the contents of the display to be smoothly redrawn as it&#39;s being resized. Prior to using a callback and capturing the WM_SIZING event to resize the display immediately, there was a delay before the content inside of the display matched the window size. Now that delay is gone (even though this feels like a really messy way of accomplishing that), and the next task was to fix this problem (reality vs desired): <a href="https://my.mixtape.moe/rdxqwg.webm">https://my.mixtape.moe/rdxqwg.webm</a></p><p>Setting the background brush of the window gets rid of the stuff that appears on the edges during the resize. The only downside at this point is that the display is filled with the color of the background brush every time the window changes size*, causing it to flicker. I don&#39;t know enough about how Allegro is implemented to know how to fix this.</p><ul><li><p>I might be wrong about this. No matter what color I set the background brush to, it fills the new parts of the window with black... Along with everything else. So the display cuts to black every time the size is changed.</p></li></ul><p>As per the suggestions in the previous thread I&#39;ve implemented everything using an event queue, and used a user event to trigger the immediate resize:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;allegro5/allegro_image.h&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;allegro5/allegro_windows.h&gt;</span>
<span class="number">   5</span><span class="p">#include &lt;algorithm&gt;</span>
<span class="number">   6</span><span class="p">#include &lt;Windows.h&gt;</span>
<span class="number">   7</span><span class="p">#define USER_EVENT_TYPE 999</span>
<span class="number">   8</span>
<span class="number">   9</span><span class="k1">static</span> <span class="k1">int</span> neww, newh<span class="k2">;</span>
<span class="number">  10</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_SOURCE"><span class="a">ALLEGRO_EVENT_SOURCE</span></a> user_event_source<span class="k2">;</span>
<span class="number">  11</span>
<span class="number">  12</span><span class="k1">bool</span> WinProcCallback<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span> d, UINT msg, WPARAM wparam, LPARAM lparam, LRESULT<span class="k3">*</span> result, <span class="k1">void</span><span class="k3">*</span> userdata<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  13</span>
<span class="number">  14</span>  <span class="k1">if</span> <span class="k2">(</span>msg <span class="k3">=</span><span class="k3">=</span> WM_SIZING<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  15</span>
<span class="number">  16</span>    <span class="k1">int</span> oldh <span class="k3">=</span> neww<span class="k2">;</span>
<span class="number">  17</span>    <span class="k1">int</span> oldw <span class="k3">=</span> newh<span class="k2">;</span>
<span class="number">  18</span>
<span class="number">  19</span>    RECT r <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span>RECT<span class="k3">*</span><span class="k2">)</span>lparam<span class="k2">;</span>
<span class="number">  20</span>    <span class="k1">int</span> rw <span class="k3">=</span> <span class="k2">(</span>r.right <span class="k3">-</span> r.left<span class="k2">)</span> <span class="k3">-</span> <span class="n">21</span><span class="k2">;</span>
<span class="number">  21</span>    <span class="k1">int</span> rh <span class="k3">=</span> <span class="k2">(</span>r.bottom <span class="k3">-</span> r.top<span class="k2">)</span> <span class="k3">-</span> <span class="n">42</span><span class="k2">;</span>
<span class="number">  22</span>
<span class="number">  23</span>    <span class="k1">if</span> <span class="k2">(</span>oldh <span class="k3">!</span><span class="k3">=</span> rh <span class="k3">|</span><span class="k3">|</span> oldw <span class="k3">!</span><span class="k3">=</span> rw<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  24</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number">  25</span>      ev.user.data1 <span class="k3">=</span> rw<span class="k2">;</span>
<span class="number">  26</span>      ev.user.data2 <span class="k3">=</span> rh<span class="k2">;</span>
<span class="number">  27</span>      ev.type <span class="k3">=</span> USER_EVENT_TYPE<span class="k2">;</span>
<span class="number">  28</span>      neww <span class="k3">=</span> rw<span class="k2">;</span>
<span class="number">  29</span>      newh <span class="k3">=</span> rh<span class="k2">;</span>
<span class="number">  30</span>      <a href="http://www.allegro.cc/manual/al_emit_user_event"><span class="a">al_emit_user_event</span></a><span class="k2">(</span><span class="k3">&amp;</span>user_event_source, <span class="k3">&amp;</span>ev, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  31</span>    <span class="k2">}</span>
<span class="number">  32</span>
<span class="number">  33</span>    <span class="c">// Return true, so Allegro knows it doesn't need to do anything for this event.</span>
<span class="number">  34</span>    <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  35</span>
<span class="number">  36</span>  <span class="k2">}</span>
<span class="number">  37</span>
<span class="number">  38</span>  <span class="c">// Return false, so Allegro will handle the event on its own.</span>
<span class="number">  39</span>  <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  40</span>
<span class="number">  41</span><span class="k2">}</span>
<span class="number">  42</span>
<span class="number">  43</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  44</span>
<span class="number">  45</span>  <span class="c">// Initialize Allegro and required add-ons.</span>
<span class="number">  46</span>  <a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  47</span>  <a href="http://www.allegro.cc/manual/al_init_primitives_addon"><span class="a">al_init_primitives_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  48</span>
<span class="number">  49</span>  <span class="c">// Set display flags and create the display.</span>
<span class="number">  50</span>  <a href="http://www.allegro.cc/manual/al_set_new_display_flags"><span class="a">al_set_new_display_flags</span></a><span class="k2">(</span>ALLEGRO_OPENGL <span class="k3">|</span> ALLEGRO_RESIZABLE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  51</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span> display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">640</span>, <span class="n">480</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  52</span>
<span class="number">  53</span>  <span class="c">// Create event queue and register event sources.</span>
<span class="number">  54</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a><span class="k3">*</span> event_queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  55</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  56</span>
<span class="number">  57</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span> timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0f</span> <span class="k3">/</span> <span class="n">60</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  58</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span>  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  60</span>
<span class="number">  61</span>  <a href="http://www.allegro.cc/manual/al_init_user_event_source"><span class="a">al_init_user_event_source</span></a><span class="k2">(</span><span class="k3">&amp;</span>user_event_source<span class="k2">)</span><span class="k2">;</span>
<span class="number">  62</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <span class="k3">&amp;</span>user_event_source<span class="k2">)</span><span class="k2">;</span>
<span class="number">  63</span>
<span class="number">  64</span>  <span class="c">// Set the background brush of the window.</span>
<span class="number">  65</span>  HWND hwnd <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_win_window_handle"><span class="a">al_get_win_window_handle</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>  HBRUSH brush <span class="k3">=</span> CreateSolidBrush<span class="k2">(</span><a href="http://www.allegro.cc/manual/RGB"><span class="a">RGB</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  67</span>  SetClassLongPtr<span class="k2">(</span>hwnd, GCLP_HBRBACKGROUND, <span class="k2">(</span>LONG<span class="k2">)</span>brush<span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>  DeleteObject<span class="k2">(</span>brush<span class="k2">)</span><span class="k2">;</span>
<span class="number">  69</span>
<span class="number">  70</span>  <span class="c">// Add callback function.</span>
<span class="number">  71</span>  al_win_add_window_callback<span class="k2">(</span>display, WinProcCallback, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  72</span>
<span class="number">  73</span>  <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  74</span>  <span class="k1">while</span> <span class="k2">(</span><span class="k1">true</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  75</span>
<span class="number">  76</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number">  77</span>    <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number">  78</span>
<span class="number">  79</span>    <span class="k1">switch</span> <span class="k2">(</span>ev.type<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  80</span>
<span class="number">  81</span>    <span class="k1">case</span> USER_EVENT_TYPE:
<span class="number">  82</span>      <a href="http://www.allegro.cc/manual/al_resize_display"><span class="a">al_resize_display</span></a><span class="k2">(</span>display, ev.user.data1, ev.user.data2<span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>
<span class="number">  84</span>    <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_RESIZE:
<span class="number">  85</span>      <a href="http://www.allegro.cc/manual/al_acknowledge_resize"><span class="a">al_acknowledge_resize</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  86</span>      redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  87</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number">  88</span>
<span class="number">  89</span>    <span class="k1">case</span> ALLEGRO_EVENT_TIMER:
<span class="number">  90</span>      redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  91</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number">  92</span>
<span class="number">  93</span>    <span class="k2">}</span>
<span class="number">  94</span>
<span class="number">  95</span>    <span class="c">// Redraw the display contents.</span>
<span class="number">  96</span>    <span class="k1">if</span> <span class="k2">(</span>redraw <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  97</span>
<span class="number">  98</span>      <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  99</span>      <span class="k1">float</span> w <span class="k3">=</span> <span class="k2">(</span>std::min<span class="k2">)</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span>display<span class="k2">)</span>, <a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 100</span>      <span class="k1">float</span> x <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span>display<span class="k2">)</span> <span class="k3">/</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">-</span> w <span class="k3">/</span> <span class="n">2</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 101</span>      <span class="k1">float</span> y <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span>display<span class="k2">)</span> <span class="k3">/</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">-</span> w <span class="k3">/</span> <span class="n">2</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 102</span>      <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span>x, y, x <span class="k3">+</span> w, y <span class="k3">+</span> w, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">192</span>, <span class="n">192</span>, <span class="n">192</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 103</span>      <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 104</span>
<span class="number"> 105</span>    <span class="k2">}</span>
<span class="number"> 106</span>
<span class="number"> 107</span>  <span class="k2">}</span>
<span class="number"> 108</span>
<span class="number"> 109</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 110</span>
<span class="number"> 111</span><span class="k2">}</span>
</div></div><p>

Does anyone know what I can do about the flickering?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (xsquid)</author>
		<pubDate>Wed, 08 Feb 2017 03:31:20 +0000</pubDate>
	</item>
</rss>
