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:
@@ -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), "высота видео неизвестна — полный вьюпорт")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user