fix(app-glasses): би-нокулярный рендер RayNeo — letterbox + scale=false (полный кадр в каждый глаз)

Живой тест на RayNeo X2: каждый глаз = 640x480 (пол-экрана 1280x480), видео 896x480 (16:9) растягивалось на весь глаз → «квадратное» (сплющено по горизонтали).
- letterboxRect(videoW,videoH,viewW,viewH): FIT-вьюпорт с полями (страховка для произвольных поверхностей)
- Binocular(scale=true→false): два полных кадра 640x343 в двух половинах экрана (вместо scaleX 0.5 половинки кадра)
- onVideoSizeChanged → videoWidth/Height для letterbox
- Тесты 32/0 (LetterboxRectTest 5)
- Пользователь: «на глаз размер поменялся, будто бы норм»
This commit is contained in:
Hermes Agent
2026-08-19 21:03:55 +03:00
parent 25b85ea191
commit b4420f446c
4 changed files with 138 additions and 2 deletions
@@ -0,0 +1,49 @@
package pw.binom.viewmate.glasses
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNull
import pw.binom.viewmate.glasses.ui.Rect
import pw.binom.viewmate.glasses.ui.letterboxRect
class LetterboxRectTest {
@Test
fun wideVideoIntoPortraitSurfaceLetterboxesTopBottom() {
// Видео 16:9 (896×480) в поверхность 4:3 (640×480): поля сверху/снизу.
val rect = letterboxRect(videoW = 896, videoH = 480, viewW = 640, viewH = 480)
val expected = Rect(x0 = 0, y0 = 68, w = 640, h = 343)
assertEquals(expected, rect)
}
@Test
fun squareVideoIntoSideSurfaceLetterboxesSides() {
// Видео 4:3 (640×480) в поверхность 16:9 (896×480): поля сбоку.
val rect = letterboxRect(videoW = 640, videoH = 480, viewW = 896, viewH = 480)
val expected = Rect(x0 = 128, y0 = 0, w = 640, h = 480)
assertEquals(expected, rect)
}
@Test
fun sameAspectFillsSurface() {
// Видео 16:9 (896×480) в поверхность 16:9 (896×480): полный вьюпорт.
val rect = letterboxRect(videoW = 896, videoH = 480, viewW = 896, viewH = 480)
val expected = Rect(x0 = 0, y0 = 0, w = 896, h = 480)
assertEquals(expected, rect)
}
@Test
fun sameAspectFourThreeFillsSurface() {
// Видео 4:3 (640×480) в поверхность 4:3 (640×480): полный вьюпорт.
val rect = letterboxRect(videoW = 640, videoH = 480, viewW = 640, viewH = 480)
val expected = Rect(x0 = 0, y0 = 0, w = 640, h = 480)
assertEquals(expected, rect)
}
@Test
fun zeroSizesReturnNull() {
assertNull(letterboxRect(0, 0, 640, 480), "видео неизвестно — полный вьюпорт")
assertNull(letterboxRect(896, 480, 0, 0), "поверхность не готова — полный вьюпорт")
assertNull(letterboxRect(896, 0, 640, 480), "высота видео неизвестна — полный вьюпорт")
}
}