Mercurial > mplayer.hg
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 |