| 341 | } |
| 342 | |
| 343 | static void SetViewportPosition(Window *w, int x, int y) |
| 344 | { |
| 345 | Viewport &vp = *w->viewport; |
| 346 | int old_left = vp.virtual_left; |
| 347 | int old_top = vp.virtual_top; |
| 348 | int i; |
| 349 | int left, top, width, height; |
| 350 | |
| 351 | vp.virtual_left = x; |
| 352 | vp.virtual_top = y; |
| 353 | |
| 354 | /* Viewport is bound to its left top corner, so it must be rounded down (UnScaleByZoomLower) |
| 355 | * else glitch described in FS#1412 will happen (offset by 1 pixel with zoom level > NORMAL) |
| 356 | */ |
| 357 | old_left = UnScaleByZoomLower(old_left, vp.zoom); |
| 358 | old_top = UnScaleByZoomLower(old_top, vp.zoom); |
| 359 | x = UnScaleByZoomLower(x, vp.zoom); |
| 360 | y = UnScaleByZoomLower(y, vp.zoom); |
| 361 | |
| 362 | old_left -= x; |
| 363 | old_top -= y; |
| 364 | |
| 365 | if (old_top == 0 && old_left == 0) return; |
| 366 | |
| 367 | _vp_move_offs.x = old_left; |
| 368 | _vp_move_offs.y = old_top; |
| 369 | |
| 370 | left = vp.left; |
| 371 | top = vp.top; |
| 372 | width = vp.width; |
| 373 | height = vp.height; |
| 374 | |
| 375 | if (left < 0) { |
| 376 | width += left; |
| 377 | left = 0; |
| 378 | } |
| 379 | |
| 380 | i = left + width - _screen.width; |
| 381 | if (i >= 0) width -= i; |
| 382 | |
| 383 | if (width > 0) { |
| 384 | if (top < 0) { |
| 385 | height += top; |
| 386 | top = 0; |
| 387 | } |
| 388 | |
| 389 | i = top + height - _screen.height; |
| 390 | if (i >= 0) height -= i; |
| 391 | |
| 392 | if (height > 0) { |
| 393 | Window::IteratorToFront it(w); |
| 394 | ++it; |
| 395 | DoSetViewportPosition(it, left, top, width, height); |
| 396 | } |
| 397 | } |
| 398 | } |
| 399 | |
| 400 | /** |
no test coverage detected