diff --git a/simutrans/trunk/display/simgraph16.cc b/simutrans/trunk/display/simgraph16.cc index 8ee1145..f3f5e36 100644 --- a/simutrans/trunk/display/simgraph16.cc +++ b/simutrans/trunk/display/simgraph16.cc @@ -1599,17 +1599,20 @@ static void rezoom_img(const image_id n) sint16 xreal2 = ((x * zoom_den[zoom_factor] + 1 - x_rem) / zoom_num[zoom_factor]) * 4; SumSubpixel( p1 + xreal1 ); SumSubpixel( p1 + xreal2 ); + uint8 sum = valid; // valid pixels in top row SumSubpixel( p2 + xreal1 ); SumSubpixel( p2 + xreal2 ); - if( valid == 0 ) { - *dest++ = 0x73FE; - } - else if( valid == 255 ) { + sum += valid; // = 2*(pixels in top row) + (pixels in bottom row) + if( valid == 255 ) { // special color *dest++ = (0x8000 | r) + (((uint16)g)<<5) + (((uint16)b)<<10); } - else { + else if (sum >=3) { // maximal possible sum / 2 - 1, determined by hand + // two pixels in top row or at least one pixel in each row *dest++ = (r/valid) + (((uint16)(g/valid))<<5) + (((uint16)(b/valid))<<10); } + else { + *dest++ = 0x73FE; + } } } break; @@ -1627,21 +1630,24 @@ static void rezoom_img(const image_id n) SumSubpixel( p1 + xreal1 ); SumSubpixel( p1 + xreal2 ); SumSubpixel( p1 + xreal3 ); + uint8 sum = valid; SumSubpixel( p2 + xreal1 ); SumSubpixel( p2 + xreal2 ); SumSubpixel( p2 + xreal3 ); + sum += valid; SumSubpixel( p3 + xreal1 ); SumSubpixel( p3 + xreal2 ); SumSubpixel( p3 + xreal3 ); - if( valid == 0 ) { - *dest++ = 0x73FE; - } - else if( valid == 255 ) { + sum += valid; // = 3*(pixels in top row) + 2*(pixels in mid row) + (pixels in bottom row) + if( valid == 255 ) { *dest++ = (0x8000 | r) + (((uint16)g)<<5) + (((uint16)b)<<10); } - else { + else if (sum >= 8) { // maximal possible sum / 2 - 1, determined by hand *dest++ = (r/valid) | (((uint16)(g/valid))<<5) | (((uint16)(b/valid))<<10); } + else { + *dest++ = 0x73FE; + } } } break; @@ -1662,27 +1668,31 @@ static void rezoom_img(const image_id n) SumSubpixel( p1 + xreal2 ); SumSubpixel( p1 + xreal3 ); SumSubpixel( p1 + xreal4 ); + uint8 sum = valid; SumSubpixel( p2 + xreal1 ); SumSubpixel( p2 + xreal2 ); SumSubpixel( p2 + xreal3 ); SumSubpixel( p2 + xreal4 ); + sum += valid; SumSubpixel( p3 + xreal1 ); SumSubpixel( p3 + xreal2 ); SumSubpixel( p3 + xreal3 ); SumSubpixel( p3 + xreal4 ); + sum += valid; SumSubpixel( p4 + xreal1 ); SumSubpixel( p4 + xreal2 ); SumSubpixel( p4 + xreal3 ); SumSubpixel( p4 + xreal4 ); - if( valid == 0 ) { - *dest++ = 0x73FE; - } - else if( valid == 255 ) { + sum += valid; + if( valid == 255 ) { *dest++ = (0x8000 | r) + (((uint16)g)<<5) + (((uint16)b)<<10); } - else { + else if (sum >= 19) { // maximal possible sum / 2 - 1, worked by chance *dest++ = (r/valid) | (((uint16)(g/valid))<<5) | (((uint16)(b/valid))<<10); } + else { + *dest++ = 0x73FE; + } } } break; @@ -1715,6 +1725,7 @@ static void rezoom_img(const image_id n) SumSubpixel( p1 + xreal6 ); SumSubpixel( p1 + xreal7 ); SumSubpixel( p1 + xreal8 ); + uint16 sum = valid; SumSubpixel( p2 + xreal1 ); SumSubpixel( p2 + xreal2 ); SumSubpixel( p2 + xreal3 ); @@ -1723,6 +1734,7 @@ static void rezoom_img(const image_id n) SumSubpixel( p2 + xreal6 ); SumSubpixel( p2 + xreal7 ); SumSubpixel( p2 + xreal8 ); + sum += valid; SumSubpixel( p3 + xreal1 ); SumSubpixel( p3 + xreal2 ); SumSubpixel( p3 + xreal3 ); @@ -1731,6 +1743,7 @@ static void rezoom_img(const image_id n) SumSubpixel( p3 + xreal6 ); SumSubpixel( p3 + xreal7 ); SumSubpixel( p3 + xreal8 ); + sum += valid; SumSubpixel( p4 + xreal1 ); SumSubpixel( p4 + xreal2 ); SumSubpixel( p4 + xreal3 ); @@ -1739,6 +1752,7 @@ static void rezoom_img(const image_id n) SumSubpixel( p4 + xreal6 ); SumSubpixel( p4 + xreal7 ); SumSubpixel( p4 + xreal8 ); + sum += valid; SumSubpixel( p5 + xreal1 ); SumSubpixel( p5 + xreal2 ); SumSubpixel( p5 + xreal3 ); @@ -1747,6 +1761,7 @@ static void rezoom_img(const image_id n) SumSubpixel( p5 + xreal6 ); SumSubpixel( p5 + xreal7 ); SumSubpixel( p5 + xreal8 ); + sum += valid; SumSubpixel( p6 + xreal1 ); SumSubpixel( p6 + xreal2 ); SumSubpixel( p6 + xreal3 ); @@ -1755,6 +1770,7 @@ static void rezoom_img(const image_id n) SumSubpixel( p6 + xreal6 ); SumSubpixel( p6 + xreal7 ); SumSubpixel( p6 + xreal8 ); + sum += valid; SumSubpixel( p7 + xreal1 ); SumSubpixel( p7 + xreal2 ); SumSubpixel( p7 + xreal3 ); @@ -1763,6 +1779,7 @@ static void rezoom_img(const image_id n) SumSubpixel( p7 + xreal6 ); SumSubpixel( p7 + xreal7 ); SumSubpixel( p7 + xreal8 ); + sum += valid; SumSubpixel( p8 + xreal1 ); SumSubpixel( p8 + xreal2 ); SumSubpixel( p8 + xreal3 ); @@ -1771,15 +1788,18 @@ static void rezoom_img(const image_id n) SumSubpixel( p8 + xreal6 ); SumSubpixel( p8 + xreal7 ); SumSubpixel( p8 + xreal8 ); - if( valid == 0 ) { - *dest++ = 0x73FE; - } - else if( valid == 255 ) { + sum += valid; + if( valid == 255 ) { *dest++ = (0x8000 | r) + (((uint16)g)<<5) + (((uint16)b)<<10); } - else { + else if (sum >= 143 + 5) { + // maximal possible sum / 2 - 1 + extra 5 + // determined by experimenting with pak192.comic *dest++ = (r/valid) | (((uint16)(g/valid))<<5) | (((uint16)(b/valid))<<10); } + else { + *dest++ = 0x73FE; + } } } break;