summaryrefslogtreecommitdiffstats
path: root/libass/ass_bitmap.c
diff options
context:
space:
mode:
authorDr.Smile <vabnick@gmail.com>2014-11-06 02:57:03 +0300
committerDr.Smile <vabnick@gmail.com>2014-11-06 02:57:03 +0300
commit26ccc19c66298ee7783f45e6534d4ddee90cca15 (patch)
tree8fc206a7432910ae2c317f6ce2dc1240c41596a2 /libass/ass_bitmap.c
parentde756cf85b851c423a397ff7f8e4d98dbb0f5abb (diff)
downloadlibass-26ccc19c66298ee7783f45e6534d4ddee90cca15.tar.bz2
libass-26ccc19c66298ee7783f45e6534d4ddee90cca15.tar.xz
Fix subpixel shadow shift
Diffstat (limited to 'libass/ass_bitmap.c')
-rw-r--r--libass/ass_bitmap.c46
1 files changed, 12 insertions, 34 deletions
diff --git a/libass/ass_bitmap.c b/libass/ass_bitmap.c
index 1f719f8..9a98f5a 100644
--- a/libass/ass_bitmap.c
+++ b/libass/ass_bitmap.c
@@ -327,45 +327,23 @@ void shift_bitmap(Bitmap *bm, int shift_x, int shift_y)
int s = bm->stride;
unsigned char *buf = bm->buffer;
+ assert((shift_x & ~63) == 0 && (shift_y & ~63) == 0);
+
// Shift in x direction
- if (shift_x > 0) {
- shift_x &= 0x3F;
- for (y = 0; y < h; y++) {
- for (x = w - 1; x > 0; x--) {
- b = (buf[x + y * s - 1] * shift_x) >> 6;
- buf[x + y * s - 1] -= b;
- buf[x + y * s] += b;
- }
- }
- } else if (shift_x < 0) {
- shift_x = -shift_x & 0x3F;
- for (y = 0; y < h; y++) {
- for (x = 0; x < w - 1; x++) {
- b = (buf[x + y * s + 1] * shift_x) >> 6;
- buf[x + y * s + 1] -= b;
- buf[x + y * s] += b;
- }
+ for (y = 0; y < h; y++) {
+ for (x = w - 1; x > 0; x--) {
+ b = (buf[x + y * s - 1] * shift_x) >> 6;
+ buf[x + y * s - 1] -= b;
+ buf[x + y * s] += b;
}
}
// Shift in y direction
- if (shift_y > 0) {
- shift_y &= 0x3F;
- for (x = 0; x < w; x++) {
- for (y = h - 1; y > 0; y--) {
- b = (buf[x + (y - 1) * s] * shift_y) >> 6;
- buf[x + (y - 1) * s] -= b;
- buf[x + y * s] += b;
- }
- }
- } else if (shift_y < 0) {
- shift_y = -shift_y & 0x3F;
- for (x = 0; x < w; x++) {
- for (y = 0; y < h - 1; y++) {
- b = (buf[x + (y + 1) * s] * shift_y) >> 6;
- buf[x + (y + 1) * s] -= b;
- buf[x + y * s] += b;
- }
+ for (x = 0; x < w; x++) {
+ for (y = h - 1; y > 0; y--) {
+ b = (buf[x + (y - 1) * s] * shift_y) >> 6;
+ buf[x + (y - 1) * s] -= b;
+ buf[x + y * s] += b;
}
}
}