From e4d0264d9528bbe24b947ea20dc846cceac52fb9 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Thu, 11 Dec 2014 14:17:24 +0100 Subject: [PATCH] made value_blur nicer to use and took care of edges --- app/src/main/rs/blur_generated.rsh | 1132 +++++++++++++++++++++++++++- app/src/main/rs/decoder.rs | 28 +- utils/blur.c | 25 +- 3 files changed, 1154 insertions(+), 31 deletions(-) diff --git a/app/src/main/rs/blur_generated.rsh b/app/src/main/rs/blur_generated.rsh index 240402a..31cb9a3 100644 --- a/app/src/main/rs/blur_generated.rsh +++ b/app/src/main/rs/blur_generated.rsh @@ -1,16 +1,61 @@ /* code generated by 'utils/blur.c' */ -static uchar value_blur(int i) +static uchar value_blur(int pixel, int begin, int end) { + int i = (pixel * (end - begin) + (end - begin) / 2) / bitmap_width + begin; + int weight_sum = 0; + int value_sum = 0; switch (blur_power) { case 0: - if (i < 1 || (buffer_length - 1) <= i) - return 0; + if ((i-1) < begin || end <= (i+1)) { + if (begin <= (i-1)) { + weight_sum += 217; + value_sum += 217 * value_buffer[i-1]; + } + if ((i+0) < end) { + weight_sum += 19608; + value_sum += 19608 * value_buffer[i+0]; + } + if ((i+1) < end) { + weight_sum += 217; + value_sum += 217 * value_buffer[i+1]; + } + return value_sum / weight_sum; + } return (178 * value_buffer[i-1] + 16027 * value_buffer[i+0] + 178 * value_buffer[i+1]) >> 14; case 1: - if (i < 3 || (buffer_length - 3) <= i) - return 0; + if ((i-3) < begin || end <= (i+3)) { + if (begin <= (i-3)) { + weight_sum += 72; + value_sum += 72 * value_buffer[i-3]; + } + if (begin <= (i-2)) { + weight_sum += 884; + value_sum += 884 * value_buffer[i-2]; + } + if (begin <= (i-1)) { + weight_sum += 3964; + value_sum += 3964 * value_buffer[i-1]; + } + if ((i+0) < end) { + weight_sum += 6536; + value_sum += 6536 * value_buffer[i+0]; + } + if ((i+1) < end) { + weight_sum += 3964; + value_sum += 3964 * value_buffer[i+1]; + } + if ((i+2) < end) { + weight_sum += 884; + value_sum += 884 * value_buffer[i+2]; + } + if ((i+3) < end) { + weight_sum += 72; + value_sum += 72 * value_buffer[i+3]; + } + return value_sum / weight_sum; + } return (72 * value_buffer[i-3] + 884 * value_buffer[i-2] + 3966 * value_buffer[i-1] + @@ -19,8 +64,53 @@ static uchar value_blur(int i) 884 * value_buffer[i+2] + 72 * value_buffer[i+3]) >> 14; case 2: - if (i < 5 || (buffer_length - 5) <= i) - return 0; + if ((i-5) < begin || end <= (i+5)) { + if (begin <= (i-5)) { + weight_sum += 43; + value_sum += 43 * value_buffer[i-5]; + } + if (begin <= (i-4)) { + weight_sum += 220; + value_sum += 220 * value_buffer[i-4]; + } + if (begin <= (i-3)) { + weight_sum += 776; + value_sum += 776 * value_buffer[i-3]; + } + if (begin <= (i-2)) { + weight_sum += 1908; + value_sum += 1908 * value_buffer[i-2]; + } + if (begin <= (i-1)) { + weight_sum += 3275; + value_sum += 3275 * value_buffer[i-1]; + } + if ((i+0) < end) { + weight_sum += 3921; + value_sum += 3921 * value_buffer[i+0]; + } + if ((i+1) < end) { + weight_sum += 3275; + value_sum += 3275 * value_buffer[i+1]; + } + if ((i+2) < end) { + weight_sum += 1908; + value_sum += 1908 * value_buffer[i+2]; + } + if ((i+3) < end) { + weight_sum += 776; + value_sum += 776 * value_buffer[i+3]; + } + if ((i+4) < end) { + weight_sum += 220; + value_sum += 220 * value_buffer[i+4]; + } + if ((i+5) < end) { + weight_sum += 43; + value_sum += 43 * value_buffer[i+5]; + } + return value_sum / weight_sum; + } return (43 * value_buffer[i-5] + 220 * value_buffer[i-4] + 776 * value_buffer[i-3] + @@ -33,8 +123,85 @@ static uchar value_blur(int i) 220 * value_buffer[i+4] + 43 * value_buffer[i+5]) >> 14; case 3: - if (i < 9 || (buffer_length - 9) <= i) - return 0; + if ((i-9) < begin || end <= (i+9)) { + if (begin <= (i-9)) { + weight_sum += 24; + value_sum += 24 * value_buffer[i-9]; + } + if (begin <= (i-8)) { + weight_sum += 62; + value_sum += 62 * value_buffer[i-8]; + } + if (begin <= (i-7)) { + weight_sum += 143; + value_sum += 143 * value_buffer[i-7]; + } + if (begin <= (i-6)) { + weight_sum += 294; + value_sum += 294 * value_buffer[i-6]; + } + if (begin <= (i-5)) { + weight_sum += 543; + value_sum += 543 * value_buffer[i-5]; + } + if (begin <= (i-4)) { + weight_sum += 895; + value_sum += 895 * value_buffer[i-4]; + } + if (begin <= (i-3)) { + weight_sum += 1321; + value_sum += 1321 * value_buffer[i-3]; + } + if (begin <= (i-2)) { + weight_sum += 1744; + value_sum += 1744 * value_buffer[i-2]; + } + if (begin <= (i-1)) { + weight_sum += 2061; + value_sum += 2061 * value_buffer[i-1]; + } + if ((i+0) < end) { + weight_sum += 2178; + value_sum += 2178 * value_buffer[i+0]; + } + if ((i+1) < end) { + weight_sum += 2061; + value_sum += 2061 * value_buffer[i+1]; + } + if ((i+2) < end) { + weight_sum += 1744; + value_sum += 1744 * value_buffer[i+2]; + } + if ((i+3) < end) { + weight_sum += 1321; + value_sum += 1321 * value_buffer[i+3]; + } + if ((i+4) < end) { + weight_sum += 895; + value_sum += 895 * value_buffer[i+4]; + } + if ((i+5) < end) { + weight_sum += 543; + value_sum += 543 * value_buffer[i+5]; + } + if ((i+6) < end) { + weight_sum += 294; + value_sum += 294 * value_buffer[i+6]; + } + if ((i+7) < end) { + weight_sum += 143; + value_sum += 143 * value_buffer[i+7]; + } + if ((i+8) < end) { + weight_sum += 62; + value_sum += 62 * value_buffer[i+8]; + } + if ((i+9) < end) { + weight_sum += 24; + value_sum += 24 * value_buffer[i+9]; + } + return value_sum / weight_sum; + } return (24 * value_buffer[i-9] + 62 * value_buffer[i-8] + 143 * value_buffer[i-7] + @@ -55,8 +222,149 @@ static uchar value_blur(int i) 62 * value_buffer[i+8] + 24 * value_buffer[i+9]) >> 14; case 4: - if (i < 17 || (buffer_length - 17) <= i) - return 0; + if ((i-17) < begin || end <= (i+17)) { + if (begin <= (i-17)) { + weight_sum += 12; + value_sum += 12 * value_buffer[i-17]; + } + if (begin <= (i-16)) { + weight_sum += 21; + value_sum += 21 * value_buffer[i-16]; + } + if (begin <= (i-15)) { + weight_sum += 34; + value_sum += 34 * value_buffer[i-15]; + } + if (begin <= (i-14)) { + weight_sum += 54; + value_sum += 54 * value_buffer[i-14]; + } + if (begin <= (i-13)) { + weight_sum += 83; + value_sum += 83 * value_buffer[i-13]; + } + if (begin <= (i-12)) { + weight_sum += 122; + value_sum += 122 * value_buffer[i-12]; + } + if (begin <= (i-11)) { + weight_sum += 175; + value_sum += 175 * value_buffer[i-11]; + } + if (begin <= (i-10)) { + weight_sum += 243; + value_sum += 243 * value_buffer[i-10]; + } + if (begin <= (i-9)) { + weight_sum += 326; + value_sum += 326 * value_buffer[i-9]; + } + if (begin <= (i-8)) { + weight_sum += 425; + value_sum += 425 * value_buffer[i-8]; + } + if (begin <= (i-7)) { + weight_sum += 537; + value_sum += 537 * value_buffer[i-7]; + } + if (begin <= (i-6)) { + weight_sum += 658; + value_sum += 658 * value_buffer[i-6]; + } + if (begin <= (i-5)) { + weight_sum += 781; + value_sum += 781 * value_buffer[i-5]; + } + if (begin <= (i-4)) { + weight_sum += 899; + value_sum += 899 * value_buffer[i-4]; + } + if (begin <= (i-3)) { + weight_sum += 1002; + value_sum += 1002 * value_buffer[i-3]; + } + if (begin <= (i-2)) { + weight_sum += 1083; + value_sum += 1083 * value_buffer[i-2]; + } + if (begin <= (i-1)) { + weight_sum += 1135; + value_sum += 1135 * value_buffer[i-1]; + } + if ((i+0) < end) { + weight_sum += 1153; + value_sum += 1153 * value_buffer[i+0]; + } + if ((i+1) < end) { + weight_sum += 1135; + value_sum += 1135 * value_buffer[i+1]; + } + if ((i+2) < end) { + weight_sum += 1083; + value_sum += 1083 * value_buffer[i+2]; + } + if ((i+3) < end) { + weight_sum += 1002; + value_sum += 1002 * value_buffer[i+3]; + } + if ((i+4) < end) { + weight_sum += 899; + value_sum += 899 * value_buffer[i+4]; + } + if ((i+5) < end) { + weight_sum += 781; + value_sum += 781 * value_buffer[i+5]; + } + if ((i+6) < end) { + weight_sum += 658; + value_sum += 658 * value_buffer[i+6]; + } + if ((i+7) < end) { + weight_sum += 537; + value_sum += 537 * value_buffer[i+7]; + } + if ((i+8) < end) { + weight_sum += 425; + value_sum += 425 * value_buffer[i+8]; + } + if ((i+9) < end) { + weight_sum += 326; + value_sum += 326 * value_buffer[i+9]; + } + if ((i+10) < end) { + weight_sum += 243; + value_sum += 243 * value_buffer[i+10]; + } + if ((i+11) < end) { + weight_sum += 175; + value_sum += 175 * value_buffer[i+11]; + } + if ((i+12) < end) { + weight_sum += 122; + value_sum += 122 * value_buffer[i+12]; + } + if ((i+13) < end) { + weight_sum += 83; + value_sum += 83 * value_buffer[i+13]; + } + if ((i+14) < end) { + weight_sum += 54; + value_sum += 54 * value_buffer[i+14]; + } + if ((i+15) < end) { + weight_sum += 34; + value_sum += 34 * value_buffer[i+15]; + } + if ((i+16) < end) { + weight_sum += 21; + value_sum += 21 * value_buffer[i+16]; + } + if ((i+17) < end) { + weight_sum += 12; + value_sum += 12 * value_buffer[i+17]; + } + return value_sum / weight_sum; + } return (12 * value_buffer[i-17] + 21 * value_buffer[i-16] + 34 * value_buffer[i-15] + @@ -93,8 +401,277 @@ static uchar value_blur(int i) 21 * value_buffer[i+16] + 12 * value_buffer[i+17]) >> 14; case 5: - if (i < 33 || (buffer_length - 33) <= i) - return 0; + if ((i-33) < begin || end <= (i+33)) { + if (begin <= (i-33)) { + weight_sum += 6; + value_sum += 6 * value_buffer[i-33]; + } + if (begin <= (i-32)) { + weight_sum += 8; + value_sum += 8 * value_buffer[i-32]; + } + if (begin <= (i-31)) { + weight_sum += 11; + value_sum += 11 * value_buffer[i-31]; + } + if (begin <= (i-30)) { + weight_sum += 14; + value_sum += 14 * value_buffer[i-30]; + } + if (begin <= (i-29)) { + weight_sum += 18; + value_sum += 18 * value_buffer[i-29]; + } + if (begin <= (i-28)) { + weight_sum += 23; + value_sum += 23 * value_buffer[i-28]; + } + if (begin <= (i-27)) { + weight_sum += 29; + value_sum += 29 * value_buffer[i-27]; + } + if (begin <= (i-26)) { + weight_sum += 36; + value_sum += 36 * value_buffer[i-26]; + } + if (begin <= (i-25)) { + weight_sum += 44; + value_sum += 44 * value_buffer[i-25]; + } + if (begin <= (i-24)) { + weight_sum += 54; + value_sum += 54 * value_buffer[i-24]; + } + if (begin <= (i-23)) { + weight_sum += 66; + value_sum += 66 * value_buffer[i-23]; + } + if (begin <= (i-22)) { + weight_sum += 80; + value_sum += 80 * value_buffer[i-22]; + } + if (begin <= (i-21)) { + weight_sum += 96; + value_sum += 96 * value_buffer[i-21]; + } + if (begin <= (i-20)) { + weight_sum += 113; + value_sum += 113 * value_buffer[i-20]; + } + if (begin <= (i-19)) { + weight_sum += 133; + value_sum += 133 * value_buffer[i-19]; + } + if (begin <= (i-18)) { + weight_sum += 155; + value_sum += 155 * value_buffer[i-18]; + } + if (begin <= (i-17)) { + weight_sum += 180; + value_sum += 180 * value_buffer[i-17]; + } + if (begin <= (i-16)) { + weight_sum += 206; + value_sum += 206 * value_buffer[i-16]; + } + if (begin <= (i-15)) { + weight_sum += 234; + value_sum += 234 * value_buffer[i-15]; + } + if (begin <= (i-14)) { + weight_sum += 264; + value_sum += 264 * value_buffer[i-14]; + } + if (begin <= (i-13)) { + weight_sum += 295; + value_sum += 295 * value_buffer[i-13]; + } + if (begin <= (i-12)) { + weight_sum += 327; + value_sum += 327 * value_buffer[i-12]; + } + if (begin <= (i-11)) { + weight_sum += 360; + value_sum += 360 * value_buffer[i-11]; + } + if (begin <= (i-10)) { + weight_sum += 393; + value_sum += 393 * value_buffer[i-10]; + } + if (begin <= (i-9)) { + weight_sum += 425; + value_sum += 425 * value_buffer[i-9]; + } + if (begin <= (i-8)) { + weight_sum += 456; + value_sum += 456 * value_buffer[i-8]; + } + if (begin <= (i-7)) { + weight_sum += 485; + value_sum += 485 * value_buffer[i-7]; + } + if (begin <= (i-6)) { + weight_sum += 512; + value_sum += 512 * value_buffer[i-6]; + } + if (begin <= (i-5)) { + weight_sum += 535; + value_sum += 535 * value_buffer[i-5]; + } + if (begin <= (i-4)) { + weight_sum += 556; + value_sum += 556 * value_buffer[i-4]; + } + if (begin <= (i-3)) { + weight_sum += 572; + value_sum += 572 * value_buffer[i-3]; + } + if (begin <= (i-2)) { + weight_sum += 584; + value_sum += 584 * value_buffer[i-2]; + } + if (begin <= (i-1)) { + weight_sum += 591; + value_sum += 591 * value_buffer[i-1]; + } + if ((i+0) < end) { + weight_sum += 594; + value_sum += 594 * value_buffer[i+0]; + } + if ((i+1) < end) { + weight_sum += 591; + value_sum += 591 * value_buffer[i+1]; + } + if ((i+2) < end) { + weight_sum += 584; + value_sum += 584 * value_buffer[i+2]; + } + if ((i+3) < end) { + weight_sum += 572; + value_sum += 572 * value_buffer[i+3]; + } + if ((i+4) < end) { + weight_sum += 556; + value_sum += 556 * value_buffer[i+4]; + } + if ((i+5) < end) { + weight_sum += 535; + value_sum += 535 * value_buffer[i+5]; + } + if ((i+6) < end) { + weight_sum += 512; + value_sum += 512 * value_buffer[i+6]; + } + if ((i+7) < end) { + weight_sum += 485; + value_sum += 485 * value_buffer[i+7]; + } + if ((i+8) < end) { + weight_sum += 456; + value_sum += 456 * value_buffer[i+8]; + } + if ((i+9) < end) { + weight_sum += 425; + value_sum += 425 * value_buffer[i+9]; + } + if ((i+10) < end) { + weight_sum += 393; + value_sum += 393 * value_buffer[i+10]; + } + if ((i+11) < end) { + weight_sum += 360; + value_sum += 360 * value_buffer[i+11]; + } + if ((i+12) < end) { + weight_sum += 327; + value_sum += 327 * value_buffer[i+12]; + } + if ((i+13) < end) { + weight_sum += 295; + value_sum += 295 * value_buffer[i+13]; + } + if ((i+14) < end) { + weight_sum += 264; + value_sum += 264 * value_buffer[i+14]; + } + if ((i+15) < end) { + weight_sum += 234; + value_sum += 234 * value_buffer[i+15]; + } + if ((i+16) < end) { + weight_sum += 206; + value_sum += 206 * value_buffer[i+16]; + } + if ((i+17) < end) { + weight_sum += 180; + value_sum += 180 * value_buffer[i+17]; + } + if ((i+18) < end) { + weight_sum += 155; + value_sum += 155 * value_buffer[i+18]; + } + if ((i+19) < end) { + weight_sum += 133; + value_sum += 133 * value_buffer[i+19]; + } + if ((i+20) < end) { + weight_sum += 113; + value_sum += 113 * value_buffer[i+20]; + } + if ((i+21) < end) { + weight_sum += 96; + value_sum += 96 * value_buffer[i+21]; + } + if ((i+22) < end) { + weight_sum += 80; + value_sum += 80 * value_buffer[i+22]; + } + if ((i+23) < end) { + weight_sum += 66; + value_sum += 66 * value_buffer[i+23]; + } + if ((i+24) < end) { + weight_sum += 54; + value_sum += 54 * value_buffer[i+24]; + } + if ((i+25) < end) { + weight_sum += 44; + value_sum += 44 * value_buffer[i+25]; + } + if ((i+26) < end) { + weight_sum += 36; + value_sum += 36 * value_buffer[i+26]; + } + if ((i+27) < end) { + weight_sum += 29; + value_sum += 29 * value_buffer[i+27]; + } + if ((i+28) < end) { + weight_sum += 23; + value_sum += 23 * value_buffer[i+28]; + } + if ((i+29) < end) { + weight_sum += 18; + value_sum += 18 * value_buffer[i+29]; + } + if ((i+30) < end) { + weight_sum += 14; + value_sum += 14 * value_buffer[i+30]; + } + if ((i+31) < end) { + weight_sum += 11; + value_sum += 11 * value_buffer[i+31]; + } + if ((i+32) < end) { + weight_sum += 8; + value_sum += 8 * value_buffer[i+32]; + } + if ((i+33) < end) { + weight_sum += 6; + value_sum += 6 * value_buffer[i+33]; + } + return value_sum / weight_sum; + } return (6 * value_buffer[i-33] + 8 * value_buffer[i-32] + 11 * value_buffer[i-31] + @@ -163,8 +740,533 @@ static uchar value_blur(int i) 8 * value_buffer[i+32] + 6 * value_buffer[i+33]) >> 14; case 6: - if (i < 65 || (buffer_length - 65) <= i) - return 0; + if ((i-65) < begin || end <= (i+65)) { + if (begin <= (i-65)) { + weight_sum += 3; + value_sum += 3 * value_buffer[i-65]; + } + if (begin <= (i-64)) { + weight_sum += 3; + value_sum += 3 * value_buffer[i-64]; + } + if (begin <= (i-63)) { + weight_sum += 4; + value_sum += 4 * value_buffer[i-63]; + } + if (begin <= (i-62)) { + weight_sum += 5; + value_sum += 5 * value_buffer[i-62]; + } + if (begin <= (i-61)) { + weight_sum += 5; + value_sum += 5 * value_buffer[i-61]; + } + if (begin <= (i-60)) { + weight_sum += 6; + value_sum += 6 * value_buffer[i-60]; + } + if (begin <= (i-59)) { + weight_sum += 7; + value_sum += 7 * value_buffer[i-59]; + } + if (begin <= (i-58)) { + weight_sum += 8; + value_sum += 8 * value_buffer[i-58]; + } + if (begin <= (i-57)) { + weight_sum += 9; + value_sum += 9 * value_buffer[i-57]; + } + if (begin <= (i-56)) { + weight_sum += 10; + value_sum += 10 * value_buffer[i-56]; + } + if (begin <= (i-55)) { + weight_sum += 12; + value_sum += 12 * value_buffer[i-55]; + } + if (begin <= (i-54)) { + weight_sum += 13; + value_sum += 13 * value_buffer[i-54]; + } + if (begin <= (i-53)) { + weight_sum += 15; + value_sum += 15 * value_buffer[i-53]; + } + if (begin <= (i-52)) { + weight_sum += 16; + value_sum += 16 * value_buffer[i-52]; + } + if (begin <= (i-51)) { + weight_sum += 18; + value_sum += 18 * value_buffer[i-51]; + } + if (begin <= (i-50)) { + weight_sum += 21; + value_sum += 21 * value_buffer[i-50]; + } + if (begin <= (i-49)) { + weight_sum += 23; + value_sum += 23 * value_buffer[i-49]; + } + if (begin <= (i-48)) { + weight_sum += 25; + value_sum += 25 * value_buffer[i-48]; + } + if (begin <= (i-47)) { + weight_sum += 28; + value_sum += 28 * value_buffer[i-47]; + } + if (begin <= (i-46)) { + weight_sum += 31; + value_sum += 31 * value_buffer[i-46]; + } + if (begin <= (i-45)) { + weight_sum += 34; + value_sum += 34 * value_buffer[i-45]; + } + if (begin <= (i-44)) { + weight_sum += 38; + value_sum += 38 * value_buffer[i-44]; + } + if (begin <= (i-43)) { + weight_sum += 42; + value_sum += 42 * value_buffer[i-43]; + } + if (begin <= (i-42)) { + weight_sum += 46; + value_sum += 46 * value_buffer[i-42]; + } + if (begin <= (i-41)) { + weight_sum += 50; + value_sum += 50 * value_buffer[i-41]; + } + if (begin <= (i-40)) { + weight_sum += 54; + value_sum += 54 * value_buffer[i-40]; + } + if (begin <= (i-39)) { + weight_sum += 59; + value_sum += 59 * value_buffer[i-39]; + } + if (begin <= (i-38)) { + weight_sum += 64; + value_sum += 64 * value_buffer[i-38]; + } + if (begin <= (i-37)) { + weight_sum += 70; + value_sum += 70 * value_buffer[i-37]; + } + if (begin <= (i-36)) { + weight_sum += 75; + value_sum += 75 * value_buffer[i-36]; + } + if (begin <= (i-35)) { + weight_sum += 81; + value_sum += 81 * value_buffer[i-35]; + } + if (begin <= (i-34)) { + weight_sum += 88; + value_sum += 88 * value_buffer[i-34]; + } + if (begin <= (i-33)) { + weight_sum += 94; + value_sum += 94 * value_buffer[i-33]; + } + if (begin <= (i-32)) { + weight_sum += 101; + value_sum += 101 * value_buffer[i-32]; + } + if (begin <= (i-31)) { + weight_sum += 108; + value_sum += 108 * value_buffer[i-31]; + } + if (begin <= (i-30)) { + weight_sum += 115; + value_sum += 115 * value_buffer[i-30]; + } + if (begin <= (i-29)) { + weight_sum += 123; + value_sum += 123 * value_buffer[i-29]; + } + if (begin <= (i-28)) { + weight_sum += 130; + value_sum += 130 * value_buffer[i-28]; + } + if (begin <= (i-27)) { + weight_sum += 138; + value_sum += 138 * value_buffer[i-27]; + } + if (begin <= (i-26)) { + weight_sum += 146; + value_sum += 146 * value_buffer[i-26]; + } + if (begin <= (i-25)) { + weight_sum += 155; + value_sum += 155 * value_buffer[i-25]; + } + if (begin <= (i-24)) { + weight_sum += 163; + value_sum += 163 * value_buffer[i-24]; + } + if (begin <= (i-23)) { + weight_sum += 171; + value_sum += 171 * value_buffer[i-23]; + } + if (begin <= (i-22)) { + weight_sum += 180; + value_sum += 180 * value_buffer[i-22]; + } + if (begin <= (i-21)) { + weight_sum += 188; + value_sum += 188 * value_buffer[i-21]; + } + if (begin <= (i-20)) { + weight_sum += 197; + value_sum += 197 * value_buffer[i-20]; + } + if (begin <= (i-19)) { + weight_sum += 205; + value_sum += 205 * value_buffer[i-19]; + } + if (begin <= (i-18)) { + weight_sum += 213; + value_sum += 213 * value_buffer[i-18]; + } + if (begin <= (i-17)) { + weight_sum += 221; + value_sum += 221 * value_buffer[i-17]; + } + if (begin <= (i-16)) { + weight_sum += 229; + value_sum += 229 * value_buffer[i-16]; + } + if (begin <= (i-15)) { + weight_sum += 237; + value_sum += 237 * value_buffer[i-15]; + } + if (begin <= (i-14)) { + weight_sum += 244; + value_sum += 244 * value_buffer[i-14]; + } + if (begin <= (i-13)) { + weight_sum += 251; + value_sum += 251 * value_buffer[i-13]; + } + if (begin <= (i-12)) { + weight_sum += 258; + value_sum += 258 * value_buffer[i-12]; + } + if (begin <= (i-11)) { + weight_sum += 265; + value_sum += 265 * value_buffer[i-11]; + } + if (begin <= (i-10)) { + weight_sum += 271; + value_sum += 271 * value_buffer[i-10]; + } + if (begin <= (i-9)) { + weight_sum += 276; + value_sum += 276 * value_buffer[i-9]; + } + if (begin <= (i-8)) { + weight_sum += 281; + value_sum += 281 * value_buffer[i-8]; + } + if (begin <= (i-7)) { + weight_sum += 286; + value_sum += 286 * value_buffer[i-7]; + } + if (begin <= (i-6)) { + weight_sum += 290; + value_sum += 290 * value_buffer[i-6]; + } + if (begin <= (i-5)) { + weight_sum += 293; + value_sum += 293 * value_buffer[i-5]; + } + if (begin <= (i-4)) { + weight_sum += 296; + value_sum += 296 * value_buffer[i-4]; + } + if (begin <= (i-3)) { + weight_sum += 298; + value_sum += 298 * value_buffer[i-3]; + } + if (begin <= (i-2)) { + weight_sum += 300; + value_sum += 300 * value_buffer[i-2]; + } + if (begin <= (i-1)) { + weight_sum += 301; + value_sum += 301 * value_buffer[i-1]; + } + if ((i+0) < end) { + weight_sum += 301; + value_sum += 301 * value_buffer[i+0]; + } + if ((i+1) < end) { + weight_sum += 301; + value_sum += 301 * value_buffer[i+1]; + } + if ((i+2) < end) { + weight_sum += 300; + value_sum += 300 * value_buffer[i+2]; + } + if ((i+3) < end) { + weight_sum += 298; + value_sum += 298 * value_buffer[i+3]; + } + if ((i+4) < end) { + weight_sum += 296; + value_sum += 296 * value_buffer[i+4]; + } + if ((i+5) < end) { + weight_sum += 293; + value_sum += 293 * value_buffer[i+5]; + } + if ((i+6) < end) { + weight_sum += 290; + value_sum += 290 * value_buffer[i+6]; + } + if ((i+7) < end) { + weight_sum += 286; + value_sum += 286 * value_buffer[i+7]; + } + if ((i+8) < end) { + weight_sum += 281; + value_sum += 281 * value_buffer[i+8]; + } + if ((i+9) < end) { + weight_sum += 276; + value_sum += 276 * value_buffer[i+9]; + } + if ((i+10) < end) { + weight_sum += 271; + value_sum += 271 * value_buffer[i+10]; + } + if ((i+11) < end) { + weight_sum += 265; + value_sum += 265 * value_buffer[i+11]; + } + if ((i+12) < end) { + weight_sum += 258; + value_sum += 258 * value_buffer[i+12]; + } + if ((i+13) < end) { + weight_sum += 251; + value_sum += 251 * value_buffer[i+13]; + } + if ((i+14) < end) { + weight_sum += 244; + value_sum += 244 * value_buffer[i+14]; + } + if ((i+15) < end) { + weight_sum += 237; + value_sum += 237 * value_buffer[i+15]; + } + if ((i+16) < end) { + weight_sum += 229; + value_sum += 229 * value_buffer[i+16]; + } + if ((i+17) < end) { + weight_sum += 221; + value_sum += 221 * value_buffer[i+17]; + } + if ((i+18) < end) { + weight_sum += 213; + value_sum += 213 * value_buffer[i+18]; + } + if ((i+19) < end) { + weight_sum += 205; + value_sum += 205 * value_buffer[i+19]; + } + if ((i+20) < end) { + weight_sum += 197; + value_sum += 197 * value_buffer[i+20]; + } + if ((i+21) < end) { + weight_sum += 188; + value_sum += 188 * value_buffer[i+21]; + } + if ((i+22) < end) { + weight_sum += 180; + value_sum += 180 * value_buffer[i+22]; + } + if ((i+23) < end) { + weight_sum += 171; + value_sum += 171 * value_buffer[i+23]; + } + if ((i+24) < end) { + weight_sum += 163; + value_sum += 163 * value_buffer[i+24]; + } + if ((i+25) < end) { + weight_sum += 155; + value_sum += 155 * value_buffer[i+25]; + } + if ((i+26) < end) { + weight_sum += 146; + value_sum += 146 * value_buffer[i+26]; + } + if ((i+27) < end) { + weight_sum += 138; + value_sum += 138 * value_buffer[i+27]; + } + if ((i+28) < end) { + weight_sum += 130; + value_sum += 130 * value_buffer[i+28]; + } + if ((i+29) < end) { + weight_sum += 123; + value_sum += 123 * value_buffer[i+29]; + } + if ((i+30) < end) { + weight_sum += 115; + value_sum += 115 * value_buffer[i+30]; + } + if ((i+31) < end) { + weight_sum += 108; + value_sum += 108 * value_buffer[i+31]; + } + if ((i+32) < end) { + weight_sum += 101; + value_sum += 101 * value_buffer[i+32]; + } + if ((i+33) < end) { + weight_sum += 94; + value_sum += 94 * value_buffer[i+33]; + } + if ((i+34) < end) { + weight_sum += 88; + value_sum += 88 * value_buffer[i+34]; + } + if ((i+35) < end) { + weight_sum += 81; + value_sum += 81 * value_buffer[i+35]; + } + if ((i+36) < end) { + weight_sum += 75; + value_sum += 75 * value_buffer[i+36]; + } + if ((i+37) < end) { + weight_sum += 70; + value_sum += 70 * value_buffer[i+37]; + } + if ((i+38) < end) { + weight_sum += 64; + value_sum += 64 * value_buffer[i+38]; + } + if ((i+39) < end) { + weight_sum += 59; + value_sum += 59 * value_buffer[i+39]; + } + if ((i+40) < end) { + weight_sum += 54; + value_sum += 54 * value_buffer[i+40]; + } + if ((i+41) < end) { + weight_sum += 50; + value_sum += 50 * value_buffer[i+41]; + } + if ((i+42) < end) { + weight_sum += 46; + value_sum += 46 * value_buffer[i+42]; + } + if ((i+43) < end) { + weight_sum += 42; + value_sum += 42 * value_buffer[i+43]; + } + if ((i+44) < end) { + weight_sum += 38; + value_sum += 38 * value_buffer[i+44]; + } + if ((i+45) < end) { + weight_sum += 34; + value_sum += 34 * value_buffer[i+45]; + } + if ((i+46) < end) { + weight_sum += 31; + value_sum += 31 * value_buffer[i+46]; + } + if ((i+47) < end) { + weight_sum += 28; + value_sum += 28 * value_buffer[i+47]; + } + if ((i+48) < end) { + weight_sum += 25; + value_sum += 25 * value_buffer[i+48]; + } + if ((i+49) < end) { + weight_sum += 23; + value_sum += 23 * value_buffer[i+49]; + } + if ((i+50) < end) { + weight_sum += 21; + value_sum += 21 * value_buffer[i+50]; + } + if ((i+51) < end) { + weight_sum += 18; + value_sum += 18 * value_buffer[i+51]; + } + if ((i+52) < end) { + weight_sum += 16; + value_sum += 16 * value_buffer[i+52]; + } + if ((i+53) < end) { + weight_sum += 15; + value_sum += 15 * value_buffer[i+53]; + } + if ((i+54) < end) { + weight_sum += 13; + value_sum += 13 * value_buffer[i+54]; + } + if ((i+55) < end) { + weight_sum += 12; + value_sum += 12 * value_buffer[i+55]; + } + if ((i+56) < end) { + weight_sum += 10; + value_sum += 10 * value_buffer[i+56]; + } + if ((i+57) < end) { + weight_sum += 9; + value_sum += 9 * value_buffer[i+57]; + } + if ((i+58) < end) { + weight_sum += 8; + value_sum += 8 * value_buffer[i+58]; + } + if ((i+59) < end) { + weight_sum += 7; + value_sum += 7 * value_buffer[i+59]; + } + if ((i+60) < end) { + weight_sum += 6; + value_sum += 6 * value_buffer[i+60]; + } + if ((i+61) < end) { + weight_sum += 5; + value_sum += 5 * value_buffer[i+61]; + } + if ((i+62) < end) { + weight_sum += 5; + value_sum += 5 * value_buffer[i+62]; + } + if ((i+63) < end) { + weight_sum += 4; + value_sum += 4 * value_buffer[i+63]; + } + if ((i+64) < end) { + weight_sum += 3; + value_sum += 3 * value_buffer[i+64]; + } + if ((i+65) < end) { + weight_sum += 3; + value_sum += 3 * value_buffer[i+65]; + } + return value_sum / weight_sum; + } return (3 * value_buffer[i-65] + 3 * value_buffer[i-64] + 4 * value_buffer[i-63] + diff --git a/app/src/main/rs/decoder.rs b/app/src/main/rs/decoder.rs index 396ab48..011a593 100644 --- a/app/src/main/rs/decoder.rs +++ b/app/src/main/rs/decoder.rs @@ -68,10 +68,10 @@ static void robot36_decoder() prev_timeout = hpos >= maximum_length; if (vpos & 1) { for (int i = 0; i < bitmap_width; ++i) { - uchar even_y = value_blur(i * (y_end-y_begin) / bitmap_width + y_begin); - uchar v = value_blur(i * (v_end-v_begin) / bitmap_width + v_begin); - uchar odd_y = value_blur(i * (y_end-y_begin) / bitmap_width + prev_hpos + y_begin); - uchar u = value_blur(i * (u_end-u_begin) / bitmap_width + prev_hpos + u_begin); + uchar even_y = value_blur(i, y_begin, y_end); + uchar v = value_blur(i, v_begin, v_end); + uchar odd_y = value_blur(i, prev_hpos + y_begin, prev_hpos + y_end); + uchar u = value_blur(i, prev_hpos + u_begin, prev_hpos + u_end); pixel_buffer[bitmap_width * (vpos-1) + i] = yuv(even_y, u, v); pixel_buffer[bitmap_width * vpos + i] = yuv(odd_y, u, v); } @@ -94,9 +94,9 @@ static void robot36_decoder() static void yuv_decoder() { for (int i = 0; i < bitmap_width; ++i) { - uchar y = value_blur(i * (y_end-y_begin) / bitmap_width + y_begin); - uchar u = value_blur(i * (u_end-u_begin) / bitmap_width + u_begin); - uchar v = value_blur(i * (v_end-v_begin) / bitmap_width + v_begin); + uchar y = value_blur(i, y_begin, y_end); + uchar u = value_blur(i, u_begin, u_end); + uchar v = value_blur(i, v_begin, v_end); pixel_buffer[bitmap_width * vpos + i] = yuv(y, u, v); } if (hpos >= maximum_length) @@ -109,9 +109,9 @@ static void yuv_decoder() static void rgb_decoder() { for (int i = 0; i < bitmap_width; ++i) { - uchar r = value_blur(i * (r_end-r_begin) / bitmap_width + r_begin); - uchar g = value_blur(i * (g_end-g_begin) / bitmap_width + g_begin); - uchar b = value_blur(i * (b_end-b_begin) / bitmap_width + b_begin); + uchar r = value_blur(i, r_begin, r_end); + uchar g = value_blur(i, g_begin, g_end); + uchar b = value_blur(i, b_begin, b_end); pixel_buffer[bitmap_width * vpos + i] = rgb(r, g, b); } if (hpos >= maximum_length) @@ -124,7 +124,7 @@ static void rgb_decoder() static void raw_decoder() { for (int i = 0; i < bitmap_width; ++i) { - uchar value = value_blur(i * hpos / bitmap_width); + uchar value = value_blur(i, 0, hpos); pixel_buffer[bitmap_width * vpos + i] = rgb(value, value, value); } prev_hpos = hpos = 0; @@ -145,9 +145,9 @@ static void scottie_decoder() return; } for (int i = 0; i < bitmap_width; ++i) { - uchar r = value_blur(i * (r_end-r_begin) / bitmap_width + prev_hpos + r_begin); - uchar g = value_blur(i * (g_end-g_begin) / bitmap_width + g_begin); - uchar b = value_blur(i * (b_end-b_begin) / bitmap_width + b_begin); + uchar r = value_blur(i, prev_hpos + r_begin, prev_hpos + r_end); + uchar g = value_blur(i, g_begin, g_end); + uchar b = value_blur(i, b_begin, b_end); pixel_buffer[bitmap_width * vpos + i] = rgb(r, g, b); } for (int i = 0; i < scanline_length; ++i) diff --git a/utils/blur.c b/utils/blur.c index aeaa0b6..3b57a44 100644 --- a/utils/blur.c +++ b/utils/blur.c @@ -24,7 +24,24 @@ double gauss(double x, double radius) } void emit(int radius) { - printf("\t\tif (i < %d || (buffer_length - %d) <= i)\n\t\t\treturn 0;\n", radius, radius); + printf("\t\tif ((i-%d) < begin || end <= (i+%d)) {\n", radius, radius); + for (int i = -radius; i < 0; ++i) { + printf("\t\t\tif (begin <= (i%d)) {\n", i); + printf("\t\t\t\tweight_sum += %d;\n", + (int)(16384 * gauss(i, radius))); + printf("\t\t\t\tvalue_sum += %d * value_buffer[i%d];\n", + (int)(16384 * gauss(i, radius)), i); + printf("\t\t\t}\n"); + } + for (int i = 0; i <= radius; ++i) { + printf("\t\t\tif ((i+%d) < end) {\n", i); + printf("\t\t\t\tweight_sum += %d;\n", + (int)(16384 * gauss(i, radius))); + printf("\t\t\t\tvalue_sum += %d * value_buffer[i+%d];\n", + (int)(16384 * gauss(i, radius)), i); + printf("\t\t\t}\n"); + } + printf("\t\t\treturn value_sum / weight_sum;\n\t\t}\n"); int sum = 0; for (int i = -radius; i <= radius; ++i) sum += 16384 * gauss(i, radius); @@ -41,7 +58,11 @@ void emit(int radius) int main() { printf("/* code generated by 'utils/blur.c' */\n"); - printf("static uchar value_blur(int i)\n{\n\tswitch (blur_power) {\n"); + printf("static uchar value_blur(int pixel, int begin, int end)\n{\n"); + printf("\tint i = (pixel * (end - begin) + (end - begin) / 2) / bitmap_width + begin;\n"); + printf("\tint weight_sum = 0;\n"); + printf("\tint value_sum = 0;\n"); + printf("\tswitch (blur_power) {\n"); for (int i = 0; i < 7; ++i) { printf("\tcase %d:\n", i); emit((1 << i) | 1);