comparison libass/ass_render.c @ 20295:49865cf70233

Support separate rotation angle for each glyph.
author eugeni
date Wed, 18 Oct 2006 21:11:29 +0000
parents 4d7c8478e523
children 041a388f2182
comparison
equal deleted inserted replaced
20294:4d7c8478e523 20295:49865cf70233
88 int effect_skip_timing; // delay after the end of last karaoke word 88 int effect_skip_timing; // delay after the end of last karaoke word
89 int asc, desc; // font max ascender and descender 89 int asc, desc; // font max ascender and descender
90 // int height; 90 // int height;
91 int be; // blur edges 91 int be; // blur edges
92 int shadow; 92 int shadow;
93 double frz; // z-axis rotation
93 94
94 glyph_hash_key_t hash_key; 95 glyph_hash_key_t hash_key;
95 } glyph_info_t; 96 } glyph_info_t;
96 97
97 typedef struct line_info_s { 98 typedef struct line_info_s {
1712 text_info.glyphs[text_info.length].effect_skip_timing = render_context.effect_skip_timing; 1713 text_info.glyphs[text_info.length].effect_skip_timing = render_context.effect_skip_timing;
1713 text_info.glyphs[text_info.length].asc = get_face_ascender(render_context.face); 1714 text_info.glyphs[text_info.length].asc = get_face_ascender(render_context.face);
1714 text_info.glyphs[text_info.length].desc = get_face_descender(render_context.face); 1715 text_info.glyphs[text_info.length].desc = get_face_descender(render_context.face);
1715 text_info.glyphs[text_info.length].be = render_context.be; 1716 text_info.glyphs[text_info.length].be = render_context.be;
1716 text_info.glyphs[text_info.length].shadow = render_context.shadow; 1717 text_info.glyphs[text_info.length].shadow = render_context.shadow;
1718 text_info.glyphs[text_info.length].frz = render_context.rotation;
1717 1719
1718 text_info.length++; 1720 text_info.length++;
1719 1721
1720 render_context.effect_type = EF_NONE; 1722 render_context.effect_type = EF_NONE;
1721 render_context.effect_timing = 0; 1723 render_context.effect_timing = 0;
1852 render_context.clip_y0 = y2scr(render_context.clip_y0); 1854 render_context.clip_y0 = y2scr(render_context.clip_y0);
1853 render_context.clip_y1 = y2scr(render_context.clip_y1); 1855 render_context.clip_y1 = y2scr(render_context.clip_y1);
1854 } 1856 }
1855 1857
1856 // rotate glyphs if needed 1858 // rotate glyphs if needed
1857 if (render_context.rotation != 0.) { 1859 {
1858 double angle = render_context.rotation; 1860 double angle = 0.;
1859 FT_Vector center; 1861 FT_Vector center;
1860 FT_Matrix matrix_rotate; 1862 FT_Matrix matrix_rotate;
1861
1862 matrix_rotate.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
1863 matrix_rotate.xy = (FT_Fixed)( -sin( angle ) * 0x10000L );
1864 matrix_rotate.yx = (FT_Fixed)( sin( angle ) * 0x10000L );
1865 matrix_rotate.yy = (FT_Fixed)( cos( angle ) * 0x10000L );
1866 1863
1867 if (((render_context.org_x != 0) || (render_context.org_y != 0)) && (render_context.evt_type == EVENT_POSITIONED)) { 1864 if (((render_context.org_x != 0) || (render_context.org_y != 0)) && (render_context.evt_type == EVENT_POSITIONED)) {
1868 center.x = render_context.org_x; 1865 center.x = render_context.org_x;
1869 center.y = render_context.org_y; 1866 center.y = render_context.org_y;
1870 } else { 1867 } else {
1877 center.x += (str_bbox.xMax - str_bbox.xMin) / 2; 1874 center.x += (str_bbox.xMax - str_bbox.xMin) / 2;
1878 center.y += (str_bbox.yMax - str_bbox.yMin) / 2; 1875 center.y += (str_bbox.yMax - str_bbox.yMin) / 2;
1879 } 1876 }
1880 1877
1881 for (i = 0; i < text_info.length; ++i) { 1878 for (i = 0; i < text_info.length; ++i) {
1879 FT_Vector start;
1880 FT_Vector start_old;
1882 glyph_info_t* info = text_info.glyphs + i; 1881 glyph_info_t* info = text_info.glyphs + i;
1882
1883 if (info->frz < 0.00001 && info->frz > -0.00001)
1884 continue;
1885
1886 if (info->frz != angle) {
1887 angle = info->frz;
1888 matrix_rotate.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
1889 matrix_rotate.xy = (FT_Fixed)( -sin( angle ) * 0x10000L );
1890 matrix_rotate.yx = (FT_Fixed)( sin( angle ) * 0x10000L );
1891 matrix_rotate.yy = (FT_Fixed)( cos( angle ) * 0x10000L );
1892 }
1883 1893
1884 // calculating shift vector 1894 // calculating shift vector
1885 // shift = (position - center)*M - (position - center) 1895 // shift = (position - center)*M - (position - center)
1886 FT_Vector start;
1887 FT_Vector start_old;
1888
1889 start.x = (info->pos.x + device_x - center.x) << 6; 1896 start.x = (info->pos.x + device_x - center.x) << 6;
1890 start.y = - (info->pos.y + device_y - center.y) << 6; 1897 start.y = - (info->pos.y + device_y - center.y) << 6;
1891 start_old.x = start.x; 1898 start_old.x = start.x;
1892 start_old.y = start.y; 1899 start_old.y = start.y;
1893 1900