OSSCA Chromium

기여 목록 / 8409487

Use base::DegToRad and base::RadToDeg in blink

기타기타Merged

Blink에서 각도를 변환하던 blink::Deg2rad()와 blink::Rad2deg()를 공용 base::DegToRad()와 base::RadToDeg()로 통일했습니다.

문제 설명

https://crbug.com/40256226의 C++20 <numbers> 전환 작업에는 각도 변환 함수의 통일도 포함됐습니다.

이를 위해 blink에서 사용하는 math_extras.h에서 각도 변환 함수를 지우고 base의 각도 변환 함수로 통일 해야합니다.

CL 5109440에서는 ui/gfx/geometry/angle_conversions.h를 삭제하고 각도 변환 함수들을 base로 옮겼습니다. 이 CL을 blink에 동일하게 수행하는 것입니다.

해결 내용

  • Blink 여러 파일에서 blink::Deg2rad()와 blink::Rad2deg()를 각각 base::DegToRad()와 base::RadToDeg()로 바꿨습니다. 중복된 두 함수 정의도 third_party/blink/renderer/platform/wtf/math_extras.h에서 제거했습니다.
  • 기존 식 A * (B / C)가 A * B / C으로 바뀌었습니다.
  • dry run을 돌리니 부동소수점 반올림 차이가 Blink 단위 테스트와 웹 테스트에서 드러났습니다.
테스트 스위트 (Test Suite) 실패한 테스트 (Failed Tests)
blink_unittests • PointerEventFactoryPageTest.PointerTargets
• PointerEventFactoryTest.CoalescedEvents
• PointerEventFactoryTest.LastPointerPosition
• PointerEventFactoryTest.MouseAndTouchAndPen
• PointerEventFactoryTest.MousePointer
• PointerEventFactoryTest.MousePointerKeyStates
• PointerEventFactoryTest.NonHoveringPointers
• PointerEventFactoryTest.OutOfRange
• PointerEventFactoryTest.PenAsTouchAndMouseEvent
• PointerEventFactoryTest.PredictedEvents
• PointerEventFactoryTest.TouchAndDrag
• PointerEventFactoryTest.TouchPointerPrimaryRemovedWhileAnotherIsThere
• PointerEventFactoryTest.TouchPointerReleasedAndPressedAgain
blink_web_tests • fast/backgrounds/size/contain-and-cover-zoomed.html
• fast/gradients/unprefixed-linear-angle-gradients.html
high_dpi_blink_web_tests • svg/text/textpath-pattern.svg
not_site_per_process_blink_web_tests • fast/backgrounds/size/contain-and-cover-zoomed.html
• fast/gradients/unprefixed-linear-angle-gradients.html
pixel_browser_tests • ContextualTasksGhostLoaderPixelTest.InvokeUi_default/Regular
• ContextualTasksGhostLoaderPixelTest.InvokeUi_default/Wide
• ContextualTasksGhostLoaderPixelTest.InvokeUi_default/Wide_DarkTheme
pixel_skia_gold_passthrough_test • Pixel_Video_HEVC
  • web test는 expected image를 직접 커밋하고 unittest는 테스트 코드를 수정하면 됐습니다.

  • 하지만 skia gold test는 googler에게 문의를 해야했습니다. svg 테스트의 경우에는 서로 다른 로직의 svg 렌더링을 픽셀 단위로 비교하는데 이 픽셀 불일치가 늘어나는건 테스트 코드나 expected image를 고쳐서 해결할 수 없는 문제였습니다.

  • 이 때, 각도 변환 함수는 base, skia, blink에 각각 있는데 base에 있는 각도 변환 함수만 다른 부분이 이상하다고 생각을 했습니다.

  • 최적화가 이유임을 깨닫고 https://crrev.com/c/8429503에서 base 각도 변환 함수의 연산 순서를 조정하였습니다.

  • 이후 dry run을 통과하고 머지가 되었습니다.

배운 점

  • 부동소수점 연산의 오차로 인한 달라지면 결과가 달라질 수 있습니다. 이 작은 차이가 각종 web test, svg 렌더링 테스트, skia gold 테스트, unit test 등에서 한꺼번에 터질 수 있습니다.
  • 연산식의 간단한 괄호에도 런타임에 연산을 줄이기 위한 constant folding과 같은 최적화가 숨어있습니다.