// IM-2014-01-16: [[ StackScale ]] Utility method to calculate new rects and view transform void MCStack::view_calculate_viewports(const MCRectangle &p_stack_rect, MCRectangle &r_adjusted_stack_rect, MCRectangle &r_view_rect, MCGAffineTransform &r_transform) { MCRectangle t_view_rect; MCGAffineTransform t_transform; t_transform = MCGAffineTransformMakeScale(m_view_content_scale, m_view_content_scale); MCRectangle t_stack_rect; // IM-2014-01-16: [[ StackScale ]] Constrain stack size within the min/max size t_stack_rect = constrainstackrect(p_stack_rect); // IM-2014-01-16: [[ StackScale ]] transform stack rect using scale factor // IM-2014-02-13: [[ StackScale ]] Use MCGRectangle to avoid resizing due to rounding errors MCGRectangle t_scaled_rect; t_scaled_rect = MCGRectangleApplyAffineTransform(MCRectangleToMCGRectangle(t_stack_rect), t_transform); t_scaled_rect = view_constrainstackviewport(t_scaled_rect); MCStackFullscreenMode t_mode; if (view_getfullscreen()) { t_mode = m_view_fullscreenmode; const MCDisplay *t_display; t_display = MCscreen -> getnearestdisplay(MCGRectangleGetIntegerInterior(t_scaled_rect)); t_view_rect = MCscreen->fullscreenrect(t_display); // IM-2013-12-19: [[ Bug 11590 ]] Removed adjustment of screen rect to 0,0 origin } else { t_mode = kMCStackFullscreenModeNone; t_view_rect = MCGRectangleGetIntegerInterior(t_scaled_rect); } // IM-2014-01-16: [[ StackScale ]] store adjusted rect in stack coords MCGRectangle t_adjusted; t_adjusted = MCGRectangleApplyAffineTransform(t_scaled_rect, MCGAffineTransformInvert(t_transform)); r_adjusted_stack_rect = MCGRectangleGetIntegerRect(t_adjusted); r_view_rect = t_view_rect; // IM-2014-01-16: [[ StackScale ]] append scale transform to fullscreenmode transform r_transform = MCGAffineTransformConcat(view_get_stack_transform(t_mode, MCGRectangleGetIntegerBounds(t_scaled_rect), t_view_rect), t_transform); }
MCGRectangle MCNativeControlUserRectFromDeviceRect(const MCGRectangle &p_device_rect) { MCGAffineTransform t_transform; t_transform = MCNativeControlUserFromDeviceTransform(); return MCGRectangleApplyAffineTransform(p_device_rect, t_transform); }