void MCStack::view_update_transform(void) { MCRectangle t_view_rect; MCGAffineTransform t_transform; // IM-2014-01-16: [[ StackScale ]] Use utility method to calculate new values view_calculate_viewports(m_view_requested_stack_rect, m_view_adjusted_stack_rect, t_view_rect, t_transform); // IM-2013-12-20: [[ ShowAll ]] Calculate new stack visible rect MCRectangle t_stack_visible_rect; t_stack_visible_rect = MCRectangleGetTransformedBounds(MCRectangleMake(0, 0, t_view_rect.width, t_view_rect.height), MCGAffineTransformInvert(t_transform)); if (m_view_fullscreenmode == kMCStackFullscreenLetterbox || m_view_fullscreenmode == kMCStackFullscreenNoScale) t_stack_visible_rect = MCU_intersect_rect(t_stack_visible_rect, MCRectangleMake(0, 0, m_view_adjusted_stack_rect.width, m_view_adjusted_stack_rect.height)); // IM-2013-10-03: [[ FullscreenMode ]] if the transform has changed, redraw everything // IM-2013-12-20: [[ ShowAll ]] if the stack viewport has changed, redraw everything if (!MCU_equal_rect(t_stack_visible_rect, m_view_stack_visible_rect) || !MCGAffineTransformIsEqual(t_transform, m_view_transform)) { m_view_transform = t_transform; m_view_stack_visible_rect = t_stack_visible_rect; view_dirty_all(); } // IM-2014-01-16: [[ StackScale ]] Update view rect if needed view_setrect(t_view_rect); }
void MCStack::view_update_transform(bool p_ensure_onscreen) { MCRectangle t_view_rect; MCGAffineTransform t_transform; #if defined(_MOBILE) MCOrientation t_orientation; MCSystemGetOrientation(t_orientation); MCOrientationGetRectForOrientation(t_orientation ,m_view_requested_stack_rect); #endif // IM-2014-01-16: [[ StackScale ]] Use utility method to calculate new values view_calculate_viewports(m_view_requested_stack_rect, m_view_adjusted_stack_rect, t_view_rect, t_transform); // IM-2013-12-20: [[ ShowAll ]] Calculate new stack visible rect MCRectangle t_stack_visible_rect; t_stack_visible_rect = MCRectangleGetTransformedBounds(MCRectangleMake(0, 0, t_view_rect.width, t_view_rect.height), MCGAffineTransformInvert(t_transform)); if (m_view_fullscreenmode == kMCStackFullscreenLetterbox || m_view_fullscreenmode == kMCStackFullscreenNoScale) t_stack_visible_rect = MCU_intersect_rect(t_stack_visible_rect, MCRectangleMake(0, 0, m_view_adjusted_stack_rect.width, m_view_adjusted_stack_rect.height)); // IM-2013-10-03: [[ FullscreenMode ]] if the transform has changed, redraw everything // IM-2013-12-20: [[ ShowAll ]] if the stack viewport has changed, redraw everything bool t_rect_changed, t_transform_changed; t_rect_changed = !MCU_equal_rect(t_stack_visible_rect, m_view_stack_visible_rect); t_transform_changed = !MCGAffineTransformIsEqual(t_transform, m_view_transform); if (t_rect_changed || t_transform_changed) { m_view_transform = t_transform; m_view_stack_visible_rect = t_stack_visible_rect; dirtyall(); if (t_transform_changed) this->OnViewTransformChanged(); } // PM-2015-07-17: [[ Bug 13754 ]] Make sure stack does not disappear off screen when changing the scalefactor MCRectangle t_bounded_rect; if (p_ensure_onscreen) { // AL-2015-10-01: [[ Bug 16017 ]] Remember location of stacks on a second monitor const MCDisplay* t_nearest_display; t_nearest_display = MCscreen -> getnearestdisplay(t_view_rect); if (t_nearest_display != nil) { MCRectangle t_screen_rect; t_screen_rect = t_nearest_display -> viewport; t_bounded_rect = MCU_bound_rect(t_view_rect, t_screen_rect . x, t_screen_rect . y, t_screen_rect . width, t_screen_rect . height); } else { // In noUI mode, we don't have a nearest display. t_bounded_rect = MCU_bound_rect(t_view_rect, 0, 0, MCscreen -> getwidth(), MCscreen -> getheight()); } } else { t_bounded_rect = t_view_rect; } // IM-2014-01-16: [[ StackScale ]] Update view rect if needed view_setrect(t_bounded_rect); }