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 );