<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Stretch blit  bug?</title>
		<link>http://www.allegro.cc/forums/view/560156</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 18 Jan 2006 20:08:04 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The stretch blit in cstretch.c behaves differently compared with the one in istretch.c.</p><p>You can see the difference in the files I have attached.</p><p>Basically what I want to to is to enlarge a bitmap 10 times. In the istretch.c version each pixel becomes a 10x10 area, but using cstretch.c the pixels around the borders are not expanded as much as those in the middle.</p><p>If I could I would use istretch.c, but I am not developing for x86, so I can not.</p><p>My questions:</p><p>Is this a known bug?<br />Will there be/is there a solution?</p><p>Best regards<br />Torbjörn Olsson</p><p>UPDATE:</p><p>Ok, it seems to me that cstretch.c is different by design. I changed this code to make it work like I want it to:</p><p>(Note the code with the HACK-WARNING comment)</p><p>/*<br /> * Stretch blit work-horse.<br /> */<br />static void _al_stretch_blit(BITMAP *src, BITMAP *dst,<br />			     int sx, int sy, int sw, int sh,<br />			     int dx, int dy, int dw, int dh,<br />			     int masked)<br />{<br />   int x, y, fixup;<br />   int i1, i2, dd;<br />   int xinc, yinc;<br />   int dxbeg, dxend;<br />   int dybeg, dyend;<br />   int sxofs, dxofs;<br />   void (*stretch_line)(unsigned long dptr, unsigned char *sptr);</p><p>   ASSERT(src);<br />   ASSERT(dst);</p><p>   if ((sw &lt;= 0) || (sh &lt;= 0) || (dw &lt;= 0) || (dh &lt;= 0))<br />      return;</p><p>   if (dst-&gt;clip) {<br />      dybeg = ((dy &gt; dst-&gt;ct) ? dy : dst-&gt;ct);<br />      dyend = (((dy + dh) &lt; dst-&gt;cb) ? (dy + dh) : dst-&gt;cb);<br />      if (dybeg &gt;= dyend)<br />	 return;</p><p>      dxbeg = ((dx &gt; dst-&gt;cl) ? dx : dst-&gt;cl);<br />      dxend = (((dx + dw) &lt; dst-&gt;cr) ? (dx + dw) : dst-&gt;cr);<br />      if (dxbeg &gt;= dxend)<br />	 return;<br />   }<br />   else {<br />      dxbeg = dx;<br />      dxend = dx + dw;<br />      dybeg = dy;<br />      dyend = dy + dh;<br />   }</p><p>   /* Bresenham algorithm uses difference between points, not number of points.  */<br />   sw--;<br />   sh--;<br />   dw--;<br />   dh--;</p><p>   /* How much to add to src-coordinates, when moving to the next dst-coordinate.  */<br />   if (dw == 0)<br />      xinc = 0;<br />   else {<br />      xinc = sw / dw;<br />      sw %= dw;<br />   }</p><p>   if (dh == 0)<br />      yinc = 0;<br />   else {<br />      yinc = sh / dh;<br />      sh %= dh;<br />   }</p><p>   /* Walk in x direction until dxbeg and save Bresenham state there.  */<br />   i2 = (dd = (i1 = 2 * sw) - dw) - dw;<br />   <br />   	if(1)//HACK-WARNING<br />   	{<br />   		i1 = 2 * sw + 2;<br />		dd = 2 * sw - 2 * dw;<br />		i2 = dd;<br />	}<br />   <br />   for (x = dx, y = sx; x &lt; dxbeg; x++, y += xinc) {<br />      if (dd &gt;= 0)<br />	 y++, dd += i2;<br />      else<br />	 dd += i1;<br />   }</p><p>   /* Save Bresenham algorithm state with offset fixups.  */<br />   switch (bitmap_color_depth(dst)) {<br />      case 15:<br />      case 16:<br />	 fixup = sizeof(short);<br />	 break;<br />      case 24:<br />	 fixup = 3;<br />	 break;<br />      case 32:<br />	 fixup = sizeof(long);<br />	 break;<br />      default:<br />	 fixup = 1;<br />	 break;<br />   }<br />   sxofs = y * fixup;<br />   dxofs = x * fixup;<br />   _al_stretch.i1 = i1;<br />   _al_stretch.i2 = i2;<br />   _al_stretch.dd = dd;<br />   _al_stretch.dw = (dxend - dxbeg) * fixup;<br />   _al_stretch.sinc = xinc * fixup;</p><p>   /* Find out which stretcher should be used.  */<br />   if (masked) {<br />      switch (bitmap_color_depth(dst)) {<br />#ifdef ALLEGRO_COLOR8<br />	 case 8:<br />	    if (is_linear_bitmap(dst))<br />	       stretch_line = stretch_masked_line8;<br />	    else {<br />#ifdef GFX_MODEX<br />	       stretch_line = stretch_masked_linex;<br />#else<br />	       return;<br />#endif<br />	    }<br />	    break;<br />#endif<br />#ifdef ALLEGRO_COLOR16<br />	 case 15:<br />	    stretch_line = stretch_masked_line15;<br />	    break;<br />	 case 16:<br />	    stretch_line = stretch_masked_line16;<br />	    break;<br />#endif<br />#ifdef ALLEGRO_COLOR24<br />	 case 24:<br />	    stretch_line = stretch_masked_line24;<br />	    break;<br />#endif<br />#ifdef ALLEGRO_COLOR32<br />	 case 32:<br />	    stretch_line = stretch_masked_line32;<br />	    break;<br />#endif<br />	 default:<br />	    return;<br />      }<br />   }<br />   else {<br />      switch (bitmap_color_depth(dst)) {<br />#ifdef ALLEGRO_COLOR8<br />	 case 8:<br />	    if (is_linear_bitmap(dst))<br />	       stretch_line = stretch_line8;<br />	    else {<br />#ifdef GFX_MODEX<br />	       stretch_line = stretch_linex;<br />#else<br />	       return;<br />#endif<br />	    }<br />	    break;<br />#endif<br />#ifdef ALLEGRO_COLOR16<br />	 case 15:<br />	    stretch_line = stretch_line15;<br />	    break;<br />	 case 16:<br />	    stretch_line = stretch_line16;<br />	    break;<br />#endif<br />#ifdef ALLEGRO_COLOR24<br />	 case 24:<br />	    stretch_line = stretch_line24;<br />	    break;<br />#endif<br />#ifdef ALLEGRO_COLOR32<br />	 case 32:<br />	    stretch_line = stretch_line32;<br />	    break;<br />#endif<br />	 default:<br />	    return;<br />      }<br />   }</p><p>   ASSERT(stretch_line);</p><p>   /* Walk in y direction until we reach first non-clipped line.  */<br />   i2 = (dd = (i1 = 2 * sh) - dh) - dh;</p><p>	if(1)//HACK-WARNING<br />   	{<br />   		i1 = 2 * sh + 2;<br />		dd = 2 * sh - 2 * dh;<br />		i2 = dd;<br />	}</p><p>   for (x = dy, y = sy; x &lt; dybeg; x++, y += yinc) {<br />      if (dd &gt;= 0)<br />	 y++, dd += i2;<br />      else<br />	 dd += i1;<br />   }</p><p>   /* Stretch all non-clipped lines.  */<br />   bmp_select(dst);<br />   for (; x &lt; dyend; x++, y += yinc) {<br />      (*stretch_line)(bmp_write_line(dst, x) + dxofs, src-&gt;line[y] + sxofs);<br />      if (dd &gt;= 0)<br />	 y++, dd += i2;<br />      else<br />	 dd += i1;<br />   }<br />   bmp_unwrite_line(dst);<br />}</p><p>Now it seems to work like I want it to, but can you see any problems with my changes?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Torbjörn Olsson)</author>
		<pubDate>Tue, 17 Jan 2006 17:39:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>which looks better ?<br />does cstrech make a nicer looking image?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (A J)</author>
		<pubDate>Tue, 17 Jan 2006 20:55:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m not experienced with the Allegro internals code and therefore won&#39;t comment on the code itself, but if you post code, you should use the [ code] and [ /code] tags. See <a>Mockup information</a>.</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">/*</span></td></tr><tr><td class="number">2</td><td><span class="c">* Stretch blit work-horse.</span></td></tr><tr><td class="number">3</td><td><span class="c">*/</span></td></tr><tr><td class="number">4</td><td><span class="k1">static</span> <span class="k1">void</span> _al_stretch_blit<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>src, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>dst,</td></tr><tr><td class="number">5</td><td><span class="k1">int</span> sx, <span class="k1">int</span> sy, <span class="k1">int</span> sw, <span class="k1">int</span> sh,</td></tr><tr><td class="number">6</td><td><span class="k1">int</span> dx, <span class="k1">int</span> dy, <span class="k1">int</span> dw, <span class="k1">int</span> dh,</td></tr><tr><td class="number">7</td><td><span class="k1">int</span> masked<span class="k2">)</span></td></tr><tr><td class="number">8</td><td><span class="k2">{</span></td></tr><tr><td class="number">9</td><td><span class="k1">int</span> x, y, fixup<span class="k2">;</span></td></tr><tr><td class="number">10</td><td><span class="k1">int</span> i1, i2, dd<span class="k2">;</span></td></tr><tr><td class="number">11</td><td><span class="k1">int</span> xinc, yinc<span class="k2">;</span></td></tr><tr><td class="number">12</td><td><span class="k1">int</span> dxbeg, dxend<span class="k2">;</span></td></tr><tr><td class="number">13</td><td><span class="k1">int</span> dybeg, dyend<span class="k2">;</span></td></tr><tr><td class="number">14</td><td><span class="k1">int</span> sxofs, dxofs<span class="k2">;</span></td></tr><tr><td class="number">15</td><td><span class="k1">void</span> <span class="k2">(</span><span class="k3">*</span>stretch_line<span class="k2">)</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span> dptr, <span class="k1">unsigned</span> <span class="k1">char</span> <span class="k3">*</span>sptr<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td><a href="http://www.allegro.cc/manual/ASSERT" target="_blank"><span class="a">ASSERT</span></a><span class="k2">(</span>src<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td><a href="http://www.allegro.cc/manual/ASSERT" target="_blank"><span class="a">ASSERT</span></a><span class="k2">(</span>dst<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td><span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>sw <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>sh <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>dw <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>dh <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">21</td><td><span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td><span class="k1">if</span> <span class="k2">(</span>dst-&gt;clip<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">24</td><td>dybeg <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span>dy <span class="k3">&gt;</span> dst-&gt;ct<span class="k2">)</span> ? dy <span class="k2">:</span> dst-&gt;ct<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>dyend <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k2">(</span>dy <span class="k3">+</span> dh<span class="k2">)</span> <span class="k3">&lt;</span> dst-&gt;cb<span class="k2">)</span> ? <span class="k2">(</span>dy <span class="k3">+</span> dh<span class="k2">)</span> <span class="k2">:</span> dst-&gt;cb<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td><span class="k1">if</span> <span class="k2">(</span>dybeg <span class="k3">&gt;</span><span class="k3">=</span> dyend<span class="k2">)</span></td></tr><tr><td class="number">27</td><td><span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>&#160;</td></tr><tr><td class="number">29</td><td>dxbeg <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span>dx <span class="k3">&gt;</span> dst-&gt;cl<span class="k2">)</span> ? dx <span class="k2">:</span> dst-&gt;cl<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>dxend <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k2">(</span>dx <span class="k3">+</span> dw<span class="k2">)</span> <span class="k3">&lt;</span> dst-&gt;cr<span class="k2">)</span> ? <span class="k2">(</span>dx <span class="k3">+</span> dw<span class="k2">)</span> <span class="k2">:</span> dst-&gt;cr<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td><span class="k1">if</span> <span class="k2">(</span>dxbeg <span class="k3">&gt;</span><span class="k3">=</span> dxend<span class="k2">)</span></td></tr><tr><td class="number">32</td><td><span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td><span class="k2">}</span></td></tr><tr><td class="number">34</td><td><span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">35</td><td>dxbeg <span class="k3">=</span> dx<span class="k2">;</span></td></tr><tr><td class="number">36</td><td>dxend <span class="k3">=</span> dx <span class="k3">+</span> dw<span class="k2">;</span></td></tr><tr><td class="number">37</td><td>dybeg <span class="k3">=</span> dy<span class="k2">;</span></td></tr><tr><td class="number">38</td><td>dyend <span class="k3">=</span> dy <span class="k3">+</span> dh<span class="k2">;</span></td></tr><tr><td class="number">39</td><td><span class="k2">}</span></td></tr><tr><td class="number">40</td><td>&#160;</td></tr><tr><td class="number">41</td><td><span class="c">/* Bresenham algorithm uses difference between points, not number of points. */</span></td></tr><tr><td class="number">42</td><td>sw--<span class="k2">;</span></td></tr><tr><td class="number">43</td><td>sh--<span class="k2">;</span></td></tr><tr><td class="number">44</td><td>dw--<span class="k2">;</span></td></tr><tr><td class="number">45</td><td>dh--<span class="k2">;</span></td></tr><tr><td class="number">46</td><td>&#160;</td></tr><tr><td class="number">47</td><td><span class="c">/* How much to add to src-coordinates, when moving to the next dst-coordinate. */</span></td></tr><tr><td class="number">48</td><td><span class="k1">if</span> <span class="k2">(</span>dw <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">49</td><td>xinc <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td><span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">51</td><td>xinc <span class="k3">=</span> sw <span class="k3">/</span> dw<span class="k2">;</span></td></tr><tr><td class="number">52</td><td>sw %<span class="k3">=</span> dw<span class="k2">;</span></td></tr><tr><td class="number">53</td><td><span class="k2">}</span></td></tr><tr><td class="number">54</td><td>&#160;</td></tr><tr><td class="number">55</td><td><span class="k1">if</span> <span class="k2">(</span>dh <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">56</td><td>yinc <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td><span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">58</td><td>yinc <span class="k3">=</span> sh <span class="k3">/</span> dh<span class="k2">;</span></td></tr><tr><td class="number">59</td><td>sh %<span class="k3">=</span> dh<span class="k2">;</span></td></tr><tr><td class="number">60</td><td><span class="k2">}</span></td></tr><tr><td class="number">61</td><td>&#160;</td></tr><tr><td class="number">62</td><td><span class="c">/* Walk in x direction until dxbeg and save Bresenham state there. */</span></td></tr><tr><td class="number">63</td><td>i2 <span class="k3">=</span> <span class="k2">(</span>dd <span class="k3">=</span> <span class="k2">(</span>i1 <span class="k3">=</span> <span class="n">2</span> <span class="k3">*</span> sw<span class="k2">)</span> <span class="k3">-</span> dw<span class="k2">)</span> <span class="k3">-</span> dw<span class="k2">;</span></td></tr><tr><td class="number">64</td><td>&#160;</td></tr><tr><td class="number">65</td><td><span class="k1">if</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="c">//HACK-WARNING</span></td></tr><tr><td class="number">66</td><td><span class="k2">{</span></td></tr><tr><td class="number">67</td><td>i1 <span class="k3">=</span> <span class="n">2</span> <span class="k3">*</span> sw <span class="k3">+</span> <span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">68</td><td>dd <span class="k3">=</span> <span class="n">2</span> <span class="k3">*</span> sw <span class="k3">-</span> <span class="n">2</span> <span class="k3">*</span> dw<span class="k2">;</span></td></tr><tr><td class="number">69</td><td>i2 <span class="k3">=</span> dd<span class="k2">;</span></td></tr><tr><td class="number">70</td><td><span class="k2">}</span></td></tr><tr><td class="number">71</td><td>&#160;</td></tr><tr><td class="number">72</td><td><span class="k1">for</span> <span class="k2">(</span>x <span class="k3">=</span> dx, y <span class="k3">=</span> sx<span class="k2">;</span> x <span class="k3">&lt;</span> dxbeg<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span>, y <span class="k3">+</span><span class="k3">=</span> xinc<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">73</td><td><span class="k1">if</span> <span class="k2">(</span>dd <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">74</td><td>y<span class="k3">+</span><span class="k3">+</span>, dd <span class="k3">+</span><span class="k3">=</span> i2<span class="k2">;</span></td></tr><tr><td class="number">75</td><td><span class="k1">else</span></td></tr><tr><td class="number">76</td><td>dd <span class="k3">+</span><span class="k3">=</span> i1<span class="k2">;</span></td></tr><tr><td class="number">77</td><td><span class="k2">}</span></td></tr><tr><td class="number">78</td><td>&#160;</td></tr><tr><td class="number">79</td><td><span class="c">/* Save Bresenham algorithm state with offset fixups. */</span></td></tr><tr><td class="number">80</td><td><span class="k1">switch</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/bitmap_color_depth" target="_blank"><span class="a">bitmap_color_depth</span></a><span class="k2">(</span>dst<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">81</td><td><span class="k1">case</span> <span class="n">15</span><span class="k2">:</span></td></tr><tr><td class="number">82</td><td><span class="k1">case</span> <span class="n">16</span><span class="k2">:</span></td></tr><tr><td class="number">83</td><td>fixup <span class="k3">=</span> <span class="k1">sizeof</span><span class="k2">(</span><span class="k1">short</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">84</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">85</td><td><span class="k1">case</span> <span class="n">24</span><span class="k2">:</span></td></tr><tr><td class="number">86</td><td>fixup <span class="k3">=</span> <span class="n">3</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td><span class="k1">case</span> <span class="n">32</span><span class="k2">:</span></td></tr><tr><td class="number">89</td><td>fixup <span class="k3">=</span> <span class="k1">sizeof</span><span class="k2">(</span><span class="k1">long</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">90</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">91</td><td>default:</td></tr><tr><td class="number">92</td><td>fixup <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">93</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">94</td><td><span class="k2">}</span></td></tr><tr><td class="number">95</td><td>sxofs <span class="k3">=</span> y <span class="k3">*</span> fixup<span class="k2">;</span></td></tr><tr><td class="number">96</td><td>dxofs <span class="k3">=</span> x <span class="k3">*</span> fixup<span class="k2">;</span></td></tr><tr><td class="number">97</td><td>_al_stretch.i1 <span class="k3">=</span> i1<span class="k2">;</span></td></tr><tr><td class="number">98</td><td>_al_stretch.i2 <span class="k3">=</span> i2<span class="k2">;</span></td></tr><tr><td class="number">99</td><td>_al_stretch.dd <span class="k3">=</span> dd<span class="k2">;</span></td></tr><tr><td class="number">100</td><td>_al_stretch.dw <span class="k3">=</span> <span class="k2">(</span>dxend <span class="k3">-</span> dxbeg<span class="k2">)</span> <span class="k3">*</span> fixup<span class="k2">;</span></td></tr><tr><td class="number">101</td><td>_al_stretch.sinc <span class="k3">=</span> xinc <span class="k3">*</span> fixup<span class="k2">;</span></td></tr><tr><td class="number">102</td><td>&#160;</td></tr><tr><td class="number">103</td><td><span class="c">/* Find out which stretcher should be used. */</span></td></tr><tr><td class="number">104</td><td><span class="k1">if</span> <span class="k2">(</span>masked<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">105</td><td><span class="k1">switch</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/bitmap_color_depth" target="_blank"><span class="a">bitmap_color_depth</span></a><span class="k2">(</span>dst<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">106</td><td><span class="p">#ifdef ALLEGRO_COLOR8</span></td></tr><tr><td class="number">107</td><td><span class="k1">case</span> <span class="n">8</span><span class="k2">:</span></td></tr><tr><td class="number">108</td><td><span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/is_linear_bitmap" target="_blank"><span class="a">is_linear_bitmap</span></a><span class="k2">(</span>dst<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">109</td><td>stretch_line <span class="k3">=</span> stretch_masked_line8<span class="k2">;</span></td></tr><tr><td class="number">110</td><td><span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">111</td><td><span class="p">#ifdef GFX_MODEX</span></td></tr><tr><td class="number">112</td><td>stretch_line <span class="k3">=</span> stretch_masked_linex<span class="k2">;</span></td></tr><tr><td class="number">113</td><td><span class="p">#else</span></td></tr><tr><td class="number">114</td><td><span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">115</td><td><span class="p">#endif</span></td></tr><tr><td class="number">116</td><td><span class="k2">}</span></td></tr><tr><td class="number">117</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">118</td><td><span class="p">#endif</span></td></tr><tr><td class="number">119</td><td><span class="p">#ifdef ALLEGRO_COLOR16</span></td></tr><tr><td class="number">120</td><td><span class="k1">case</span> <span class="n">15</span><span class="k2">:</span></td></tr><tr><td class="number">121</td><td>stretch_line <span class="k3">=</span> stretch_masked_line15<span class="k2">;</span></td></tr><tr><td class="number">122</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">123</td><td><span class="k1">case</span> <span class="n">16</span><span class="k2">:</span></td></tr><tr><td class="number">124</td><td>stretch_line <span class="k3">=</span> stretch_masked_line16<span class="k2">;</span></td></tr><tr><td class="number">125</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">126</td><td><span class="p">#endif</span></td></tr><tr><td class="number">127</td><td><span class="p">#ifdef ALLEGRO_COLOR24</span></td></tr><tr><td class="number">128</td><td><span class="k1">case</span> <span class="n">24</span><span class="k2">:</span></td></tr><tr><td class="number">129</td><td>stretch_line <span class="k3">=</span> stretch_masked_line24<span class="k2">;</span></td></tr><tr><td class="number">130</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">131</td><td><span class="p">#endif</span></td></tr><tr><td class="number">132</td><td><span class="p">#ifdef ALLEGRO_COLOR32</span></td></tr><tr><td class="number">133</td><td><span class="k1">case</span> <span class="n">32</span><span class="k2">:</span></td></tr><tr><td class="number">134</td><td>stretch_line <span class="k3">=</span> stretch_masked_line32<span class="k2">;</span></td></tr><tr><td class="number">135</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">136</td><td><span class="p">#endif</span></td></tr><tr><td class="number">137</td><td>default:</td></tr><tr><td class="number">138</td><td><span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">139</td><td><span class="k2">}</span></td></tr><tr><td class="number">140</td><td><span class="k2">}</span></td></tr><tr><td class="number">141</td><td><span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">142</td><td><span class="k1">switch</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/bitmap_color_depth" target="_blank"><span class="a">bitmap_color_depth</span></a><span class="k2">(</span>dst<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">143</td><td><span class="p">#ifdef ALLEGRO_COLOR8</span></td></tr><tr><td class="number">144</td><td><span class="k1">case</span> <span class="n">8</span><span class="k2">:</span></td></tr><tr><td class="number">145</td><td><span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/is_linear_bitmap" target="_blank"><span class="a">is_linear_bitmap</span></a><span class="k2">(</span>dst<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">146</td><td>stretch_line <span class="k3">=</span> stretch_line8<span class="k2">;</span></td></tr><tr><td class="number">147</td><td><span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">148</td><td><span class="p">#ifdef GFX_MODEX</span></td></tr><tr><td class="number">149</td><td>stretch_line <span class="k3">=</span> stretch_linex<span class="k2">;</span></td></tr><tr><td class="number">150</td><td><span class="p">#else</span></td></tr><tr><td class="number">151</td><td><span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">152</td><td><span class="p">#endif</span></td></tr><tr><td class="number">153</td><td><span class="k2">}</span></td></tr><tr><td class="number">154</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">155</td><td><span class="p">#endif</span></td></tr><tr><td class="number">156</td><td><span class="p">#ifdef ALLEGRO_COLOR16</span></td></tr><tr><td class="number">157</td><td><span class="k1">case</span> <span class="n">15</span><span class="k2">:</span></td></tr><tr><td class="number">158</td><td>stretch_line <span class="k3">=</span> stretch_line15<span class="k2">;</span></td></tr><tr><td class="number">159</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">160</td><td><span class="k1">case</span> <span class="n">16</span><span class="k2">:</span></td></tr><tr><td class="number">161</td><td>stretch_line <span class="k3">=</span> stretch_line16<span class="k2">;</span></td></tr><tr><td class="number">162</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">163</td><td><span class="p">#endif</span></td></tr><tr><td class="number">164</td><td><span class="p">#ifdef ALLEGRO_COLOR24</span></td></tr><tr><td class="number">165</td><td><span class="k1">case</span> <span class="n">24</span><span class="k2">:</span></td></tr><tr><td class="number">166</td><td>stretch_line <span class="k3">=</span> stretch_line24<span class="k2">;</span></td></tr><tr><td class="number">167</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">168</td><td><span class="p">#endif</span></td></tr><tr><td class="number">169</td><td><span class="p">#ifdef ALLEGRO_COLOR32</span></td></tr><tr><td class="number">170</td><td><span class="k1">case</span> <span class="n">32</span><span class="k2">:</span></td></tr><tr><td class="number">171</td><td>stretch_line <span class="k3">=</span> stretch_line32<span class="k2">;</span></td></tr><tr><td class="number">172</td><td><span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">173</td><td><span class="p">#endif</span></td></tr><tr><td class="number">174</td><td>default:</td></tr><tr><td class="number">175</td><td><span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">176</td><td><span class="k2">}</span></td></tr><tr><td class="number">177</td><td><span class="k2">}</span></td></tr><tr><td class="number">178</td><td>&#160;</td></tr><tr><td class="number">179</td><td><a href="http://www.allegro.cc/manual/ASSERT" target="_blank"><span class="a">ASSERT</span></a><span class="k2">(</span>stretch_line<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">180</td><td>&#160;</td></tr><tr><td class="number">181</td><td><span class="c">/* Walk in y direction until we reach first non-clipped line. */</span></td></tr><tr><td class="number">182</td><td>i2 <span class="k3">=</span> <span class="k2">(</span>dd <span class="k3">=</span> <span class="k2">(</span>i1 <span class="k3">=</span> <span class="n">2</span> <span class="k3">*</span> sh<span class="k2">)</span> <span class="k3">-</span> dh<span class="k2">)</span> <span class="k3">-</span> dh<span class="k2">;</span></td></tr><tr><td class="number">183</td><td>&#160;</td></tr><tr><td class="number">184</td><td><span class="k1">if</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="c">//HACK-WARNING</span></td></tr><tr><td class="number">185</td><td><span class="k2">{</span></td></tr><tr><td class="number">186</td><td>i1 <span class="k3">=</span> <span class="n">2</span> <span class="k3">*</span> sh <span class="k3">+</span> <span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">187</td><td>dd <span class="k3">=</span> <span class="n">2</span> <span class="k3">*</span> sh <span class="k3">-</span> <span class="n">2</span> <span class="k3">*</span> dh<span class="k2">;</span></td></tr><tr><td class="number">188</td><td>i2 <span class="k3">=</span> dd<span class="k2">;</span></td></tr><tr><td class="number">189</td><td><span class="k2">}</span></td></tr><tr><td class="number">190</td><td>&#160;</td></tr><tr><td class="number">191</td><td><span class="k1">for</span> <span class="k2">(</span>x <span class="k3">=</span> dy, y <span class="k3">=</span> sy<span class="k2">;</span> x <span class="k3">&lt;</span> dybeg<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span>, y <span class="k3">+</span><span class="k3">=</span> yinc<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">192</td><td><span class="k1">if</span> <span class="k2">(</span>dd <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">193</td><td>y<span class="k3">+</span><span class="k3">+</span>, dd <span class="k3">+</span><span class="k3">=</span> i2<span class="k2">;</span></td></tr><tr><td class="number">194</td><td><span class="k1">else</span></td></tr><tr><td class="number">195</td><td>dd <span class="k3">+</span><span class="k3">=</span> i1<span class="k2">;</span></td></tr><tr><td class="number">196</td><td><span class="k2">}</span></td></tr><tr><td class="number">197</td><td>&#160;</td></tr><tr><td class="number">198</td><td><span class="c">/* Stretch all non-clipped lines. */</span></td></tr><tr><td class="number">199</td><td>bmp_select<span class="k2">(</span>dst<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">200</td><td><span class="k1">for</span> <span class="k2">(</span><span class="k2">;</span> x <span class="k3">&lt;</span> dyend<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span>, y <span class="k3">+</span><span class="k3">=</span> yinc<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">201</td><td><span class="k2">(</span><span class="k3">*</span>stretch_line<span class="k2">)</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/bmp_write_line" target="_blank"><span class="a">bmp_write_line</span></a><span class="k2">(</span>dst, x<span class="k2">)</span> <span class="k3">+</span> dxofs, src-&gt;line<span class="k2">[</span>y<span class="k2">]</span> <span class="k3">+</span> sxofs<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">202</td><td><span class="k1">if</span> <span class="k2">(</span>dd <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">203</td><td>y<span class="k3">+</span><span class="k3">+</span>, dd <span class="k3">+</span><span class="k3">=</span> i2<span class="k2">;</span></td></tr><tr><td class="number">204</td><td><span class="k1">else</span></td></tr><tr><td class="number">205</td><td>dd <span class="k3">+</span><span class="k3">=</span> i1<span class="k2">;</span></td></tr><tr><td class="number">206</td><td><span class="k2">}</span></td></tr><tr><td class="number">207</td><td><a href="http://www.allegro.cc/manual/bmp_unwrite_line" target="_blank"><span class="a">bmp_unwrite_line</span></a><span class="k2">(</span>dst<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">208</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Faerber)</author>
		<pubDate>Tue, 17 Jan 2006 20:57:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You used code tags now, but still killed the indentation <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>Anyway, it seems to be a bug. Looking at the changelogs, the functional part of the code in cstretch.c hasn&#39;t been touched since 6 years (that&#39;s how far SVN logs go back..), so the problem must be the initial implementation of the bresenham scaler.</p><p>[Edit: <a href="http://websvn.bafserv.com/wsvn/allegro/allegro/branches/4.2/src/c/cstretch.c?op=blame&amp;rev=0&amp;sc=0">http://websvn.bafserv.com/wsvn/allegro/allegro/branches/4.2/src/c/cstretch.c?op=blame&amp;rev=0&amp;sc=0</a>]</p><p>Anyone up to fixing it?</p><p>I can&#39;t notice any difference when adding your if(1) {} part.. probably I missed something there.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Tue, 17 Jan 2006 21:42:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Anyone up to fixing it?
</p></div></div><p>
Any chance of just completely replacing _al_stretch_blit? Besides being hard to follow - and Allegro&#39;s doesn&#39;t even seem to be the common form - Bresenham trades divides outside the inner loop for conditionals within it. So on modern CPUs it isn&#39;t a smart move, especially since average BITMAP sizes are increasing over time.</p><p>I&#39;ll have a quick hack at a more conventional _al_stretch_blit, if everyone else is busy...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Wed, 18 Jan 2006 03:17:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sure. As I understand it, the asm code will be dropped more sooner than later anyway, so no need to try to match the cstrech.c version with the istretch.c one.</p><p>But maybe you shold wait for Peter, he apparently fixed something in istretch.c a while back:</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
r3020 | tjaden | 2003-02-15 02:29:39 +0100 (Sat, 15 Feb 2003) | 4 lines</p><p>Compensate for a problem in stretch_bitmap where the first column or row can<br />get an extra pixel than it should do for little -&gt; big scaling.  Fixed by me<br />and Eric.  Bug reported by David Gowers and AJ.
</p></div></div><p>

The change is marked as 3020 here: <a href="http://websvn.bafserv.com/wsvn/allegro/allegro/branches/4.2/src/i386/istretch.c?op=blame&amp;rev=0&amp;sc=0">http://websvn.bafserv.com/wsvn/allegro/allegro/branches/4.2/src/i386/istretch.c?op=blame&amp;rev=0&amp;sc=0</a></p><p>And I assume, they use sort of the same algorithm, just implemented a bit differently, so someone understanding the code might be able to fix it easily..
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Wed, 18 Jan 2006 03:46:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for your replies.</p><p>AJ: The istretch version is preferable from my point of view.</p><p>Michael Faerber: Thanks for the tip.</p><p>Elias (first post): Did you look at the scaling around the borders of the bitmap?</p><p>Thomas Harte: Great, please let me know how it goes.</p><p>Elias (second post): Do you mean istretch will be dropped? Then I guess its time to fix cstretch soon.</p><p>Best regards<br />Torbjörn Olsson
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Torbjörn Olsson)</author>
		<pubDate>Wed, 18 Jan 2006 15:19:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>From a code maintenance point of view, having both a C version of the code and an ASM version is a bad idea - especially if we want to rewrite things anyway.</p><p>As for bugs in the C version of the code, I&#39;ve never really noticed any but then again, I hardly use scaling anyway.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Wed, 18 Jan 2006 15:22:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Elias (first post): Did you look at the scaling around the borders of the bitmap?
</p></div></div><p>

Yes, it looked wrong both with and without that if(1) block for me. (Couldn&#39;t notice any difference at all.. but I didn&#39;t check for possible compilation problems, so maybe I looked twice at the same version?)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Wed, 18 Jan 2006 15:33:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Evert: I agree 100%</p><p>Elias: There are two if(1)-blocks (one for vertical and one for horisontal), did you use both of them?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Torbjörn Olsson)</author>
		<pubDate>Wed, 18 Jan 2006 15:43:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ah, yes, I had only seen one, and put at the wrong place <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /> From the example it looks like it fixes the problem.</p><p>So - since you commented it as &quot;HACK&quot; - is this a proper fix or not? If yes, maybe you could rewrite it without the if(1) and make a patch.</p><p>Thomas: In that case, it wouldn&#39;t be necessary to rewrite it - but if you create an improved and better understandable bitmap scaler, we would of course use that.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Wed, 18 Jan 2006 18:35:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Since I don&#39;t completely understand the code, I can not be sure that it works in all cases.</p><p>I have tested it a bit, but only for very simple test cases.</p><p>But even if my solution does work, it is probably not the best possible, so if someone with more experience with the code could take a look at it, and maybe even be able to optimize it a bit, that would be great.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Torbjörn Olsson)</author>
		<pubDate>Wed, 18 Jan 2006 20:08:04 +0000</pubDate>
	</item>
</rss>
