Mercurial > mplayer.hg
comparison libass/ass_render.c @ 28787:facfee07c704
Support for subpixel accuracy of 3 bits for \pos and \move.
Also, restrict advance subpixel accuracy to 3 bits to reduce cache
bloat.
author | greg |
---|---|
date | Thu, 05 Mar 2009 20:36:56 +0000 |
parents | 0366ab2c1cb9 |
children | 09348bd171e9 |
comparison
equal
deleted
inserted
replaced
28786:9359f0ac6dd6 | 28787:facfee07c704 |
---|---|
472 */ | 472 */ |
473 static int x2scr(double x) { | 473 static int x2scr(double x) { |
474 return x*frame_context.orig_width_nocrop / frame_context.track->PlayResX + | 474 return x*frame_context.orig_width_nocrop / frame_context.track->PlayResX + |
475 FFMAX(global_settings->left_margin, 0); | 475 FFMAX(global_settings->left_margin, 0); |
476 } | 476 } |
477 static int x2scr_pos(double x) { | 477 static double x2scr_pos(double x) { |
478 return x*frame_context.orig_width / frame_context.track->PlayResX + | 478 return x*frame_context.orig_width / frame_context.track->PlayResX + |
479 global_settings->left_margin; | 479 global_settings->left_margin; |
480 } | 480 } |
481 /** | 481 /** |
482 * \brief Mapping between script and screen coordinates | 482 * \brief Mapping between script and screen coordinates |
483 */ | 483 */ |
484 static int y2scr(double y) { | 484 static double y2scr(double y) { |
485 return y * frame_context.orig_height_nocrop / frame_context.track->PlayResY + | 485 return y * frame_context.orig_height_nocrop / frame_context.track->PlayResY + |
486 FFMAX(global_settings->top_margin, 0); | 486 FFMAX(global_settings->top_margin, 0); |
487 } | 487 } |
488 // the same for toptitles | 488 // the same for toptitles |
489 static int y2scr_top(double y) { | 489 static int y2scr_top(double y) { |
785 val = render_context.border * ( 1 - pwr ) + val * pwr; | 785 val = render_context.border * ( 1 - pwr ) + val * pwr; |
786 else | 786 else |
787 val = -1.; // reset to default | 787 val = -1.; // reset to default |
788 change_border(val); | 788 change_border(val); |
789 } else if (mystrcmp(&p, "move")) { | 789 } else if (mystrcmp(&p, "move")) { |
790 int x1, x2, y1, y2; | 790 double x1, x2, y1, y2; |
791 long long t1, t2, delta_t, t; | 791 long long t1, t2, delta_t, t; |
792 double x, y; | 792 double x, y; |
793 double k; | 793 double k; |
794 skip('('); | 794 skip('('); |
795 mystrtoi(&p, &x1); | 795 mystrtod(&p, &x1); |
796 skip(','); | 796 skip(','); |
797 mystrtoi(&p, &y1); | 797 mystrtod(&p, &y1); |
798 skip(','); | 798 skip(','); |
799 mystrtoi(&p, &x2); | 799 mystrtod(&p, &x2); |
800 skip(','); | 800 skip(','); |
801 mystrtoi(&p, &y2); | 801 mystrtod(&p, &y2); |
802 if (*p == ',') { | 802 if (*p == ',') { |
803 skip(','); | 803 skip(','); |
804 mystrtoll(&p, &t1); | 804 mystrtoll(&p, &t1); |
805 skip(','); | 805 skip(','); |
806 mystrtoll(&p, &t2); | 806 mystrtoll(&p, &t2); |
807 mp_msg(MSGT_ASS, MSGL_DBG2, "movement6: (%d, %d) -> (%d, %d), (%" PRId64 " .. %" PRId64 ")\n", | 807 mp_msg(MSGT_ASS, MSGL_DBG2, "movement6: (%f, %f) -> (%f, %f), (%" PRId64 " .. %" PRId64 ")\n", |
808 x1, y1, x2, y2, (int64_t)t1, (int64_t)t2); | 808 x1, y1, x2, y2, (int64_t)t1, (int64_t)t2); |
809 } else { | 809 } else { |
810 t1 = 0; | 810 t1 = 0; |
811 t2 = render_context.event->Duration; | 811 t2 = render_context.event->Duration; |
812 mp_msg(MSGT_ASS, MSGL_DBG2, "movement: (%d, %d) -> (%d, %d)\n", x1, y1, x2, y2); | 812 mp_msg(MSGT_ASS, MSGL_DBG2, "movement: (%f, %f) -> (%f, %f)\n", x1, y1, x2, y2); |
813 } | 813 } |
814 skip(')'); | 814 skip(')'); |
815 delta_t = t2 - t1; | 815 delta_t = t2 - t1; |
816 t = frame_context.time - render_context.event->Start; | 816 t = frame_context.time - render_context.event->Start; |
817 if (t < t1) | 817 if (t < t1) |
893 if (mystrtoi(&p, &val) && val) | 893 if (mystrtoi(&p, &val) && val) |
894 render_context.alignment = val; | 894 render_context.alignment = val; |
895 else | 895 else |
896 render_context.alignment = render_context.style->Alignment; | 896 render_context.alignment = render_context.style->Alignment; |
897 } else if (mystrcmp(&p, "pos")) { | 897 } else if (mystrcmp(&p, "pos")) { |
898 int v1, v2; | 898 double v1, v2; |
899 skip('('); | 899 skip('('); |
900 mystrtoi(&p, &v1); | 900 mystrtod(&p, &v1); |
901 skip(','); | 901 skip(','); |
902 mystrtoi(&p, &v2); | 902 mystrtod(&p, &v2); |
903 skip(')'); | 903 skip(')'); |
904 mp_msg(MSGT_ASS, MSGL_DBG2, "pos(%d, %d)\n", v1, v2); | 904 mp_msg(MSGT_ASS, MSGL_DBG2, "pos(%f, %f)\n", v1, v2); |
905 if (render_context.evt_type != EVENT_POSITIONED) { | 905 if (render_context.evt_type != EVENT_POSITIONED) { |
906 render_context.evt_type = EVENT_POSITIONED; | 906 render_context.evt_type = EVENT_POSITIONED; |
907 render_context.detect_collisions = 0; | 907 render_context.detect_collisions = 0; |
908 render_context.pos_x = v1; | 908 render_context.pos_x = v1; |
909 render_context.pos_y = v2; | 909 render_context.pos_y = v2; |
1857 delta = ass_font_get_kerning(render_context.font, previous, code); | 1857 delta = ass_font_get_kerning(render_context.font, previous, code); |
1858 pen.x += delta.x * render_context.scale_x; | 1858 pen.x += delta.x * render_context.scale_x; |
1859 pen.y += delta.y * render_context.scale_y; | 1859 pen.y += delta.y * render_context.scale_y; |
1860 } | 1860 } |
1861 | 1861 |
1862 shift.x = pen.x & 63; | 1862 shift.x = pen.x & 56; |
1863 shift.y = pen.y & 63; | 1863 shift.y = pen.y & 56; |
1864 | |
1865 if (render_context.evt_type == EVENT_POSITIONED) { | |
1866 shift.x += double_to_d6(x2scr_pos(render_context.pos_x)) & 56; | |
1867 shift.y -= double_to_d6(y2scr(render_context.pos_y)) & 56; | |
1868 } | |
1864 | 1869 |
1865 ass_font_set_transform(render_context.font, | 1870 ass_font_set_transform(render_context.font, |
1866 render_context.scale_x * frame_context.font_scale_x, | 1871 render_context.scale_x * frame_context.font_scale_x, |
1867 render_context.scale_y, | 1872 render_context.scale_y, |
1868 &shift ); | 1873 &shift ); |