From f78ef93ceb8ae4632b187a406f8ce78dc1164efe Mon Sep 17 00:00:00 2001 From: MrCheeze Date: Sat, 15 Jul 2023 14:44:56 -0400 Subject: [PATCH 1/2] core: Make underlines the same color as their text --- core/src/html/layout.rs | 45 +++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/core/src/html/layout.rs b/core/src/html/layout.rs index 3bb4265b3df0..a5b7f5046a70 100644 --- a/core/src/html/layout.rs +++ b/core/src/html/layout.rs @@ -16,13 +16,23 @@ use swf::{Point, Twips}; /// Draw an underline on a particular drawing. /// /// This will not draw underlines shorter than a pixel in width. -fn draw_underline(drawing: &mut Drawing, starting_pos: Position, width: Twips) { +fn draw_underline( + drawing: &mut Drawing, + starting_pos: Position, + width: Twips, + color: swf::Color, +) { if width < Twips::from_pixels(1.0) { return; } let ending_pos = starting_pos + Position::from((width, Twips::ZERO)); + drawing.set_line_style(Some( + swf::LineStyle::new() + .with_width(Twips::new(1)) + .with_color(color), + )); drawing.draw_command(DrawCommand::MoveTo(Point::new( starting_pos.x(), starting_pos.y(), @@ -142,29 +152,27 @@ impl<'a, 'gc> LayoutContext<'a, 'gc> { fn append_underlines(&mut self) { let mut starting_pos: Option> = None; let mut current_width: Option = None; + let mut underline_color: Option = None; let mut line_drawing = Drawing::new(); let mut has_underline: bool = false; - line_drawing.set_line_style(Some( - swf::LineStyle::new() - .with_width(Twips::new(1)) - .with_color(swf::Color::BLACK), - )); - if let Some(linelist) = self.boxes.get(self.current_line..) { for linebox in linelist { if linebox.is_text_box() { - if let Some((_t, tf, font, params, _color)) = + if let Some((_t, tf, font, params, color)) = linebox.as_renderable_text(self.text) { let underline_baseline = font.get_baseline_for_height(params.height()) + Twips::from_pixels(2.0); let mut line_extended = false; - if let Some(starting_pos) = starting_pos { + if let (Some(starting_pos), Some(underline_color)) = + (starting_pos, underline_color) + { if tf.underline.unwrap_or(false) && underline_baseline + linebox.bounds().origin().y() == starting_pos.y() + && underline_color == color { //Underline is at the same baseline, extend it current_width = @@ -178,11 +186,14 @@ impl<'a, 'gc> LayoutContext<'a, 'gc> { //For whatever reason, we cannot extend the current underline. //This can happen if we don't have an underline to extend, the //underlines don't match, or this span doesn't call for one. - if let (Some(pos), Some(width)) = (starting_pos, current_width) { - draw_underline(&mut line_drawing, pos, width); + if let (Some(pos), Some(width), Some(color)) = + (starting_pos, current_width, underline_color) + { + draw_underline(&mut line_drawing, pos, width, color); has_underline = true; starting_pos = None; current_width = None; + underline_color = None; } if tf.underline.unwrap_or(false) { @@ -191,6 +202,7 @@ impl<'a, 'gc> LayoutContext<'a, 'gc> { + Position::from((Twips::ZERO, underline_baseline)), ); current_width = Some(linebox.bounds().width()); + underline_color = Some(color); } } } @@ -198,8 +210,15 @@ impl<'a, 'gc> LayoutContext<'a, 'gc> { } } - if let (Some(starting_pos), Some(current_width)) = (starting_pos, current_width) { - draw_underline(&mut line_drawing, starting_pos, current_width); + if let (Some(starting_pos), Some(current_width), Some(underline_color)) = + (starting_pos, current_width, underline_color) + { + draw_underline( + &mut line_drawing, + starting_pos, + current_width, + underline_color, + ); has_underline = true; } From 9ac0e297187d05143e92580a144fe08b4d3135eb Mon Sep 17 00:00:00 2001 From: MrCheeze Date: Sat, 15 Jul 2023 15:29:11 -0400 Subject: [PATCH 2/2] tests: Add visual test for colored underlines. Note that the underline's vertical position is wrong, meaning that the expected.png will have to be updated whenever this is fixed. --- .../visual/text/underline_color/expected.png | Bin 0 -> 2606 bytes .../swfs/visual/text/underline_color/output.txt | 0 .../swfs/visual/text/underline_color/test.fla | Bin 0 -> 6524 bytes .../swfs/visual/text/underline_color/test.swf | Bin 0 -> 900 bytes .../swfs/visual/text/underline_color/test.toml | 8 ++++++++ 5 files changed, 8 insertions(+) create mode 100644 tests/tests/swfs/visual/text/underline_color/expected.png create mode 100644 tests/tests/swfs/visual/text/underline_color/output.txt create mode 100644 tests/tests/swfs/visual/text/underline_color/test.fla create mode 100644 tests/tests/swfs/visual/text/underline_color/test.swf create mode 100644 tests/tests/swfs/visual/text/underline_color/test.toml diff --git a/tests/tests/swfs/visual/text/underline_color/expected.png b/tests/tests/swfs/visual/text/underline_color/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..776371165cffe01518b8327c70eb231d2e2cdbbd GIT binary patch literal 2606 zcmdUw`BT%^8phKrx2Uaf)k4Z5-ctBdWNT116X8-}Bqam{1PK%*f;4OvsDemfs#TT% zsU%1wAcA3ukZ{F7*aEdN#t;Is8Ce2@ki-CjLLd-Azc;pZrvJh{Gv_?d`<`>2`TTHZ zPJRIT)V{sOdm#|WKBSLVAO!Lc00Q~wm)*Ox9Y#XdHQ)m zAP@93XYGDYYzedpmiVw0s_D`xGe>x z3Q+N(0fOe{T#yR^A?8|V4(jOWAP@*0P{$ZFHUte3AVMOM7#kaFH$d%bXea?CA1nw; zB;(+?L;`ZTT1=){F$_fAzKW+HSlBDT+?GyTaXzvJyH+oP#?&#(L{P3LVuh< zJ(l;pBl=)vY8PM6rK3zdh%>Mbj zeP|*kGGi-GFy|37lau=TR?B~j1v{oC6~$IFw+9mrz_wh;;tz5^ zq3fAR`}p$xq{t>%z9?z(1$xCDC!Ewr&!0optjZWr)o;Sfal&`P@WV>IMnk%L-4SBI zWa3T2vci=$z^Ku0%R@34X9(`Z$W|M^ckk~P##>zFQ9-uYKmyw%i}UhD-cw= z;JzGjfz`JhB(*bAxFaHm`XE2XYo}TPg;C~E1FV?1z{d5&$BBkXn-jF}Pm;08N7s>6 z*3{D{*i9I}h4$_&C+q>-vs!XVo^XUrAd@P}F%R>QsMW`m3jD1ZJhmEXolmsdf4!}3 z{?H1kob-8hs4d?(+Q%rPY;PBgZg=-o0J@ySp^Q#YG@o5_hRy|#k^xu}!#}B{j}Wc5 zPYkawfMw}>I(2S1xBBlajopuZbam?j0*4hnt8Hsw1%2r=(nnh2(L4&`zx^h&bDo%8 z(N#wwe_?L5NXa_W6O~{+P83`ps;N4DqmsfhYId4K6N3wZt!W}akC;rHl$BrNji#Fc zh1?`-IZeNH;d6{gw(5u4;cDy>Gh1jGEbrQ0wesZ>pO(FU(##_1w^I-KHD=;quS!+Lr4gU`sx<_>#?xyaToNSsh|Ef5*27Da$l9pdT~t=UMy~(BqP?inP$7td8tM&&_>d)XDRJ5A-N zq=h*6ST5DeJK-$4RU0kFVi3weI}pQRM>H4(>nVVn9l1?>NUaS!r)9t{zLY zpJBzJwoy0KZ}2|EYS0GQsdc?47=$`?cx`y;DUI_YMEAU-|Bft! z>FNSF=`~VDIg3+DnyhPPCP=@3F_`2_4WriguyIxQ)9jgWhnp+B7*i(tXN~<-?!?`T zPE?`G+L7VamSW_#UQV};fsoE|1s2)U9ghvLfxcGRy+$&)Sg1uCV|~R~-khp03#X>t zw3!I~;>sqEKGed=Pj|DtzbMmPaDwt((V0*-*QqMzXM(roy6C8 zFMr+IblG91kbcq4sB7GW4dw5A(rz!k2RdFbAstgWK~-yfGBqN_3$@yu5O0h@eS5^* zy%xAlx=n&xiF~J~S05N1Jr-#%c5(Jkj30H`#Q+vkd9heWdkkDPTQ8=VXFj=e3~Y3d zg$eA`sU>J)!%|dFc}QMJ;h_3kO=gNl{Z8h;4?7*Y(oUchjzp3BDjH9xB%}Jmlhu`x zTh|y*Eq0uxPLd zxpoqdr^5tpg7uY5KXq#qLug>N*3c8%ChiX&DM(=&`Zm7&v|nBj0RtIl?brj`+#9?U z)BZV&EiZcccHynehx(_B)R%+{xGRgIOt-x|_zctDqQU7l!Az5ZR4BGue-tkdm%hqS zlh||$qS>LnTBKPEc_5!IDxcQ;Xf4QTTuWOo(V#5kG_NR@n{y@ z8U(ZJe!o+eFWd@Ms8>2|BkDnNH5e|wY2)_pyzbw={{JuQI#^@^?($E`SsI%S$GvAq MdZWFV-<-SlKaueQ9{>OV literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/visual/text/underline_color/output.txt b/tests/tests/swfs/visual/text/underline_color/output.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/tests/swfs/visual/text/underline_color/test.fla b/tests/tests/swfs/visual/text/underline_color/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..caa62c70ce0d512b61603ddc34bc435f1ae2f110 GIT binary patch literal 6524 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 J6FCO}{2wt(AvXX3 literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/visual/text/underline_color/test.swf b/tests/tests/swfs/visual/text/underline_color/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..4a3c8a936a9e764d84f43942fb4fd4925b8308e9 GIT binary patch literal 900 zcmV-~1AF{KS5ps02LJ$goTXGvZyQAz9>+6|}NWG!S?$}v%cV;y+uAN@OffL+wLm++zm)_vWfdjvww~8Yl2V`c~ANgqdLA#Qr znRlM&@%udQXeMCoO8~C^0Km;0@HRI90LRxi)&QvSVBqw;Hk`x}6^`1~wL>Wr2chwJ zTo@M%j1Q4ntyYm?A8SV@@qjrhJ0hag-d0RK_lx%K0 zrK)a}mgIBTIh_UJ;OLder$|^s7m|FnYy*E8Z8G9fHm|@(BqA}PQmA;%EZ)F(28_p8 zx;ROq(8sADn&{$?`47hUA<+kE)HQSpeBG9mvu^jr1CL|0KnvL;gBPPk|0p4-M+6&j zpD6g&{K9m*PKOGKsZTnds|tlM44g{QZnV5oxm2=>t(IvvOSaK!Hm!=;C^uSmGt2%w zb)n`lf0X7nR}21!+8OFX?Jf_8p}Mk{sM-yq;x&rfUeoY0Rnx9i%8lJ}+qT=yQhT9# ziNvy3!o!CoXmb{4Q%EouBu%QWEuuOJcHKX6za2LM?b5L(fnbYV1v7daeXq z4(2qc%da$=KY}gdsrt-;)!aLKOftBSsYqY;Yx%5v=lIHZYOw;2|NZ)p@Be)Fx38XP>h)hy zwJDf=pC}&*#8Eh;buA(TskyU%A7Ecyqot|_MfgY+tg3ddG1WVah?IoyC)f|^u&x<} z#lZu@X;v~dx3kyjcN(9=e(QdJ=^}BJh4)n(d1YavAI3z$Ju-$p7Gt_Jl246TYOxB2 zPj`NKdgI;`E&p;GnfjGa)#;kb;_>=bwfZ=x()i%k+dt1H`px?Kic!08MQsd91_5T1_a4`=dWWBWj literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/visual/text/underline_color/test.toml b/tests/tests/swfs/visual/text/underline_color/test.toml new file mode 100644 index 000000000000..857f10c4c762 --- /dev/null +++ b/tests/tests/swfs/visual/text/underline_color/test.toml @@ -0,0 +1,8 @@ +num_frames = 1 + +[image_comparison] +tolerance = 0 +max_outliers = 12 + +[player_options] +with_renderer = { optional = false, sample_count = 1 }