<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Crash getting text width when maximizing with D3D Driver</title>
		<link>http://www.allegro.cc/forums/view/612544</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 07 May 2013 04:34:26 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I am not sure how I can reproduce this in a minimum example, but, my code ran fine in 5.1.5 but with 5.1.6, it crashes when I maximize while getting the text width with a null pointer exception.  </p><p>It is during the caching of a glyph.</p><p><span class="remote-thumbnail"><span class="json">{"name":"607536","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/1\/1\/119a0d74e0b5bc6b8a85b1d9d6cc174d.png","w":1040,"h":602,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/1\/1\/119a0d74e0b5bc6b8a85b1d9d6cc174d"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/1/1/119a0d74e0b5bc6b8a85b1d9d6cc174d-240.jpg" alt="607536" width="240" height="138" /></span></p><p>This happens here:
</p><div class="source-code snippet"><div class="inner"><pre>    glyph_data <span class="k3">=</span> alloc_glyph_region<span class="k2">(</span>font_data, ft_index,
       w <span class="k3">+</span> <span class="n">2</span>, h <span class="k3">+</span> <span class="n">2</span>, <span class="k1">false</span>, glyph, lock_more<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Then here:
</p><div class="source-code snippet"><div class="inner"><pre>      cache_glyph<span class="k2">(</span>data, face, ft_index, glyph, <span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Then here:
</p><div class="source-code snippet"><div class="inner"><pre>   <span class="k1">return</span> f-&gt;vtable-&gt;text_length<span class="k2">(</span>f, ustr<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Then here:
</p><div class="source-code snippet"><div class="inner"><pre>
  <span class="k1">int</span> Allegro5Font::getTextWidth<span class="k2">(</span> <span class="k1">const</span> std::string <span class="k3">&amp;</span>text <span class="k2">)</span> <span class="k1">const</span>
  <span class="k2">{</span>
    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a><span class="k2">)</span>
    <span class="k2">{</span>
      <span class="k1">return</span> <a href="http://www.allegro.cc/manual/al_get_text_width"><span class="a">al_get_text_width</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>,text.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k2">}</span>

    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
    
  <span class="k2">}</span>
</pre></div></div><p>

Then here:
</p><div class="source-code snippet"><div class="inner"><pre>  <span class="k1">void</span> Label::resizeToContents<span class="k2">(</span><span class="k2">)</span>
  <span class="k2">{</span>
    <span class="k1">double</span> computedWidth <span class="k3">=</span> getFont<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getTextWidth<span class="k2">(</span>getText<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">+</span> getMargin<span class="k2">(</span>SIDE_LEFT<span class="k2">)</span> <span class="k3">+</span> getMargin<span class="k2">(</span>SIDE_RIGHT<span class="k2">)</span><span class="k2">;</span>
    <span class="k1">if</span> <span class="k2">(</span>this-&gt;getMaxSize<span class="k2">(</span><span class="k2">)</span>.getWidth<span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span> computedWidth<span class="k2">)</span>
      computedWidth <span class="k3">=</span> this-&gt;getMaxSize<span class="k2">(</span><span class="k2">)</span>.getWidth<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    _setSizeInternal<span class="k2">(</span>Dimension<span class="k2">(</span><span class="k1">int</span><span class="k2">(</span>computedWidth<span class="k2">)</span>, getFont<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getLineHeight<span class="k2">(</span><span class="k2">)</span> <span class="k3">*</span> getNumTextLines<span class="k2">(</span><span class="k2">)</span> <span class="k3">+</span> getMargin<span class="k2">(</span>SIDE_TOP<span class="k2">)</span> <span class="k3">+</span> getMargin<span class="k2">(</span>SIDE_BOTTOM<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k2">}</span>
</pre></div></div><p>

Then here:
</p><div class="source-code snippet"><div class="inner"><pre>  <span class="k1">void</span> Label::setFont<span class="k2">(</span> <span class="k1">const</span> Font <span class="k3">*</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k2">)</span>
  <span class="k2">{</span>
    Widget::setFont<span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a><span class="k2">)</span><span class="k2">;</span>
    <span class="k1">if</span><span class="k2">(</span>isAutosizing<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
    <span class="k2">{</span>
      resizeToContents<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k2">}</span>
    updateLabel<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k2">}</span>
</pre></div></div><p>

Then here:
</p><div class="source-code snippet"><div class="inner"><pre>  <span class="k1">void</span> GameInformation::resize<span class="k2">(</span> <span class="k1">int</span> w, <span class="k1">int</span> h <span class="k2">)</span>
  <span class="k2">{</span>
    <span class="k1">float</span> ctrl <span class="k3">=</span> <span class="n">0</span>.<span class="n">75f</span><span class="k2">;</span>
    <span class="k1">float</span> scale <span class="k3">=</span> getProportions<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getScale<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k1">if</span><span class="k2">(</span>scale <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">75f</span><span class="k2">)</span>
    <span class="k2">{</span>
      scale <span class="k3">=</span> <span class="n">0</span>.<span class="n">75f</span><span class="k2">;</span>
    <span class="k2">}</span>

    m_tableLabel-&gt;setFont<span class="k2">(</span>m_font-&gt;getFont<span class="k2">(</span>scale <span class="k3">*</span> <span class="n">2</span>.<span class="n">4f</span> <span class="k3">*</span> ctrl<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
    m_tableLabel-&gt;resizeToContents<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
...
</pre></div></div><p>

Then here:
</p><div class="source-code snippet"><div class="inner"><pre>
  <span class="k1">void</span> GameScene::resizeEvent<span class="k2">(</span> <span class="k1">int</span> width, <span class="k1">int</span> height <span class="k2">)</span>
  <span class="k2">{</span>
    m_proportions.resize<span class="k2">(</span>width,height<span class="k2">)</span><span class="k2">;</span>

    <span class="c">//resize the elements</span>
    <span class="k1">for</span><span class="k2">(</span><span class="k1">size_t</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> m_dynamicElements.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span>
    <span class="k2">{</span>
      m_dynamicElements<span class="k2">[</span>i<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>resize<span class="k2">(</span>width,height<span class="k2">)</span><span class="k2">;</span>
    <span class="k2">}</span>
  <span class="k2">}</span>
</pre></div></div><p>

Then here:
</p><div class="source-code snippet"><div class="inner"><pre>  <span class="k1">void</span> SceneManager::sendResizeMessage<span class="k2">(</span> <span class="k1">int</span> w, <span class="k1">int</span> h <span class="k2">)</span>
  <span class="k2">{</span>
    <a href="http://www.allegro.cc/manual/al_acknowledge_resize"><span class="a">al_acknowledge_resize</span></a><span class="k2">(</span>m_devices-&gt;getDisplay<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getContext<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
    m_g.resizeBuffer<span class="k2">(</span>w,h<span class="k2">)</span><span class="k2">;</span>
    m_currentScene-&gt;processGuiResizeEvent<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    m_currentScene-&gt;resizeEvent<span class="k2">(</span>
      w,h<span class="k2">)</span><span class="k2">;</span>
    Log::write<span class="k2">(</span><span class="s">"Scene Manager"</span>,<span class="s">"Resize Event: Width:"</span> <span class="k3">+</span>  StringUtil::toString<span class="k2">(</span>w<span class="k2">)</span> <span class="k3">+</span> 
      <span class="s">" Height:"</span> <span class="k3">+</span> StringUtil::toString<span class="k2">(</span>h<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k2">}</span>
</pre></div></div><p>

Then here:
</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="k1">void</span> SceneManager::defaultBeginEventHandler<span class="k2">(</span> <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a><span class="k3">*</span>evt <span class="k2">)</span>
<span class="number">  2</span>  <span class="k2">{</span>
<span class="number">  3</span>
<span class="number">  4</span>    m_currentScene-&gt;processGuiInputEvent<span class="k2">(</span>evt<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</span>    <span class="k1">if</span><span class="k2">(</span>evt-&gt;type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER <span class="k3">&amp;</span><span class="k3">&amp;</span> evt-&gt;timer.source <span class="k3">=</span><span class="k3">=</span> m_gameTimer<span class="k2">)</span>
<span class="number">  7</span>    <span class="k2">{</span>
<span class="number">  8</span>      m_needsRedraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  9</span>      m_currentScene-&gt;processGuiLogic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>      m_devices-&gt;getNetClient<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>tick<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    <span class="k2">}</span>
<span class="number"> 12</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>evt-&gt;type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_RESIZE<span class="k2">)</span>
<span class="number"> 13</span>    <span class="k2">{</span>
<span class="number"> 14</span>      sendResizeMessage<span class="k2">(</span>evt-&gt;display.width,evt-&gt;display.height<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>    <span class="k2">}</span>
<span class="number"> 16</span>  <span class="k2">}</span>
</div></div><p>

Then here:
</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="k1">void</span> SceneManager::run<span class="k2">(</span><span class="k2">)</span>
<span class="number">  2</span>  <span class="k2">{</span>  
<span class="number">  3</span>    m_devices-&gt;setSceneMessenger<span class="k2">(</span><span class="k1">this</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>    <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>m_gameTimer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>    <span class="c">//is the event handled?</span>
<span class="number">  8</span>    <span class="k1">bool</span> handled <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  9</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> next<span class="k2">;</span>
<span class="number"> 10</span>    <span class="k1">int</span> numTicks <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>    <span class="c">//main loop</span>
<span class="number"> 13</span>    <span class="k1">while</span><span class="k2">(</span>m_gameIsRunning<span class="k2">)</span>
<span class="number"> 14</span>    <span class="k2">{</span>
<span class="number"> 15</span>    
<span class="number"> 16</span>      handled <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 17</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>queue,<span class="k3">&amp;</span>evt<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>
<span class="number"> 19</span>      <span class="k1">bool</span> hasNext <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_peek_next_event"><span class="a">al_peek_next_event</span></a><span class="k2">(</span>queue,<span class="k3">&amp;</span>next<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>      <span class="k1">if</span><span class="k2">(</span>hasNext <span class="k3">&amp;</span><span class="k3">&amp;</span> next.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span>
<span class="number"> 21</span>      <span class="k2">{</span>
<span class="number"> 22</span>        <a href="http://www.allegro.cc/manual/al_drop_next_event"><span class="a">al_drop_next_event</span></a><span class="k2">(</span>queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>      <span class="k2">}</span>
<span class="number"> 24</span>      <span class="c">//render the scene</span>
<span class="number"> 25</span>      <span class="k1">if</span><span class="k2">(</span>m_needsRedraw <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>queue<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 26</span>      <span class="k2">{</span>
<span class="number"> 27</span>        m_g.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>        m_currentScene-&gt;render<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>        m_g.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>      
<span class="number"> 31</span>        m_needsRedraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 32</span>      <span class="k2">}</span>
<span class="number"> 33</span>
<span class="number"> 34</span>      defaultBeginEventHandler<span class="k2">(</span><span class="k3">&amp;</span>evt<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span>      m_currentScene-&gt;processEvent<span class="k2">(</span><span class="k3">&amp;</span>evt,handled<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>
<span class="number"> 37</span>      <span class="c">//do default behavior if event was not handled by the scene</span>
<span class="number"> 38</span>      <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>handled<span class="k2">)</span>
<span class="number"> 39</span>      <span class="k2">{</span>
<span class="number"> 40</span>        defaultEndEventHandler<span class="k2">(</span><span class="k3">&amp;</span>evt<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>      <span class="k2">}</span>
<span class="number"> 42</span>
<span class="number"> 43</span>      processMessages<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 44</span>    <span class="k2">}</span>
<span class="number"> 45</span>  <span class="k2">}</span>
</div></div><p>
Then problem seems to be that:<br /> ptr = data-&gt;page_lr-&gt;data;</p><p>page_lr is NULL.</p><p>Probably the lock fails:
</p><div class="source-code snippet"><div class="inner"><pre>      data-&gt;page_lr <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_lock_bitmap_region"><span class="a">al_lock_bitmap_region</span></a><span class="k2">(</span>page,
         data-&gt;lock_rect.x, data-&gt;lock_rect.y,
         data-&gt;lock_rect.w, data-&gt;lock_rect.h,
         ALLEGRO_PIXEL_FORMAT_ABGR_8888_LE, ALLEGRO_LOCK_WRITEONLY<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

I do not know why, but the logs have this to say:</p><div class="source-code snippet"><div class="inner"><pre>d3d      D          d3d_bmp.cpp:492  _al_d3d_sync_bitmap              <span class="k2">[</span>  <span class="n">10</span>.<span class="n">12205</span><span class="k2">]</span> _al_d3d_sync_bitmap <span class="k2">(</span>video<span class="k2">)</span> ref count <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span>
d3d      W         d3d_disp.cpp:1094 _al_d3d_reset_device             <span class="k2">[</span>  <span class="n">11</span>.<span class="n">84075</span><span class="k2">]</span> Reset failed
d3d      E         d3d_disp.cpp:2460 d3d_set_target_bitmap            <span class="k2">[</span>  <span class="n">11</span>.<span class="n">84119</span><span class="k2">]</span> d3d_set_target_bitmap: Unable to set render target to texture surface.
d3d      E         d3d_disp.cpp:2460 d3d_set_target_bitmap            <span class="k2">[</span>  <span class="n">11</span>.<span class="n">84122</span><span class="k2">]</span> d3d_set_target_bitmap: Unable to set render target to texture surface.
<a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>     D                ttf.c:216  alloc_glyph_region               <span class="k2">[</span>  <span class="n">11</span>.<span class="n">85194</span><span class="k2">]</span> Glyph <span class="n">55</span><span class="k2">:</span> <span class="n">15x16</span> <span class="k2">(</span><span class="n">16x16</span><span class="k2">)</span>
d3d      E          d3d_bmp.cpp:453  _al_d3d_sync_bitmap              <span class="k2">[</span>  <span class="n">11</span>.<span class="n">85197</span><span class="k2">]</span> A texture is null.
</pre></div></div><p>

I am starting to wonder if I just should switch to OpenGL exclusively. I  love the idea of D3D, but when it loses the device, it has created so many bugs for me over time.</p><p>If I have time I will try to make a minimum example.</p><p>Thanks
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Tue, 07 May 2013 04:34:26 +0000</pubDate>
	</item>
</rss>
