// 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); }
void MCUIDC::boundrect(MCRectangle &x_rect, Boolean p_title, Window_mode p_mode) { MCRectangle t_rect; t_rect = MCGRectangleGetIntegerInterior(MCResUserToDeviceRect(x_rect)); MCscreen->device_boundrect(t_rect, p_title, p_mode); x_rect = MCGRectangleGetIntegerBounds(MCResDeviceToUserRect(t_rect)); }
// IM-2014-02-13: [[ StackScale ]] Update to work with MCGRectangles MCGRectangle MCStack::view_constrainstackviewport(const MCGRectangle &p_rect) { // IM-2014-01-16: [[ StackScale ]] stack rect now constrained to min/max size elsewhere MCGRectangle t_stackrect; t_stackrect = p_rect; // MW-2012-10-04: [[ Bug 10436 ]] Make sure we constrain stack size to screen size // if in fullscreen mode. MCGRectangle t_new_rect; if (view_getfullscreen()) { const MCDisplay *t_display; t_display = MCscreen -> getnearestdisplay(MCGRectangleGetIntegerInterior(t_stackrect)); switch (m_view_fullscreenmode) { case kMCStackFullscreenResize: // resize stack to fullscreen rect t_new_rect = MCRectangleToMCGRectangle(MCscreen->fullscreenrect(t_display)); break; case kMCStackFullscreenNoScale: // center rect on screen t_new_rect = MCGRectangleCenterOnRect(t_stackrect, MCRectangleToMCGRectangle(MCscreen->fullscreenrect(t_display))); break; case kMCStackFullscreenExactFit: case kMCStackFullscreenLetterbox: case kMCStackFullscreenNoBorder: case kMCStackFullscreenShowAll: // scaling modes should return the requested stack rect t_new_rect = t_stackrect; break; default: MCAssert(false); } } else { // IM-2014-02-28: [[ Bug 11844 ]] Don't constrain stack rect here unless fullscreen t_new_rect = t_stackrect; } return t_new_rect; }
void MCStack::composite(void) { if (m_window_shape == nil || m_window_shape -> is_sharp || m_window_shape -> handle == nil) return; POINT t_offset; POINT t_location; SIZE t_size; HDC t_dst_dc; t_dst_dc = ((MCScreenDC *)MCscreen) -> getdsthdc(); HGDIOBJ t_old_dst; HBITMAP t_bitmap; t_bitmap = (HBITMAP)m_window_shape -> handle; t_old_dst = SelectObject(t_dst_dc, t_bitmap); MCRectangle t_device_stack_rect; t_device_stack_rect = MCGRectangleGetIntegerInterior(MCResUserToDeviceRect(rect)); MCRectangle t_device_shape_rect; t_device_shape_rect = MCGRectangleGetIntegerBounds(MCResUserToDeviceRect(MCRectangleMake(0, 0, m_window_shape->width, m_window_shape->height))); t_offset . x = 0; t_offset . y = 0; t_location . x = t_device_stack_rect . x; t_location . y = t_device_stack_rect . y; t_size . cx = t_device_shape_rect . width;; t_size . cy = t_device_shape_rect . height; BLENDFUNCTION t_blend; t_blend . BlendOp = AC_SRC_OVER; t_blend . BlendFlags = 0; t_blend . SourceConstantAlpha = blendlevel * 255 / 100; t_blend . AlphaFormat = AC_SRC_ALPHA; UpdateLayeredWindow((HWND)window -> handle . window, t_dst_dc, &t_location, &t_size, t_dst_dc, &t_offset, 0, &t_blend, ULW_ALPHA); SelectObject(t_dst_dc, t_old_dst); }