blob: 73cd70e07cedc3d9f0bf3ad03281b02050c00bf9 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
final LiveTestWidgetsFlutterBinding binding = LiveTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('localToGlobal and globalToLocal calculate correct results', (WidgetTester tester) async {
tester.view.physicalSize = const Size(2400, 1800);
tester.view.devicePixelRatio = 3.0;
final RenderView renderView = RenderView(
view: tester.view,
configuration: TestViewConfiguration.fromView(
view: tester.view,
size: const Size(400, 200),
)
);
// The configuration above defines a view with a resolution of 2400x1800
// physical pixels. With a device pixel ratio of 3x, this yields a
// resolution of 800x600 logical pixels. In this view, a RenderView sized
// 400x200 (in logical pixels) is fitted using the BoxFit.contain
// algorithm (as documented on TestViewConfiguration. To fit 400x200 into
// 800x600 the RenderView is scaled up by 2 to fill the full width and then
// vertically positioned in the middle. The origin of the RenderView is
// located at (0, 100) in the logical coordinate space of the view:
//
// View: 800 logical pixels wide (or 2400 physical pixels)
// +---------------------------------------+
// | |
// | 100px |
// | |
// +---------------------------------------+
// | |
// | RenderView (400x200px) |
// | 400px scaled to 800x400px | View: 600 logical pixels high (or 1800 physical pixels)
// | |
// | |
// +---------------------------------------+
// | |
// | 200px |
// | |
// +---------------------------------------+
//
// All values in logical pixels until otherwise noted.
//
// A point can be translated from the local coordinate space of the
// RenderView (in logical pixels) to the global coordinate space of the View
// (in logical pixels) by multiplying each coordinate by 2 and adding 100 to
// the y coordinate. This is what the localToGlobal/globalToLocal methods
// do:
expect(binding.localToGlobal(const Offset(0, -50), renderView), Offset.zero);
expect(binding.localToGlobal(Offset.zero, renderView), const Offset(0, 100));
expect(binding.localToGlobal(const Offset(200, 100), renderView), const Offset(400, 300));
expect(binding.localToGlobal(const Offset(150, 75), renderView), const Offset(300, 250));
expect(binding.localToGlobal(const Offset(400, 200), renderView), const Offset(800, 500));
expect(binding.localToGlobal(const Offset(400, 400), renderView), const Offset(800, 900));
expect(binding.globalToLocal(Offset.zero, renderView), const Offset(0, -50));
expect(binding.globalToLocal(const Offset(0, 100), renderView), Offset.zero);
expect(binding.globalToLocal(const Offset(400, 300), renderView), const Offset(200, 100));
expect(binding.globalToLocal(const Offset(300, 250), renderView), const Offset(150, 75));
expect(binding.globalToLocal(const Offset(800, 500), renderView), const Offset(400, 200));
expect(binding.globalToLocal(const Offset(800, 900), renderView), const Offset(400, 400));
});
}