Beispiel #1
0
// 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);
}
Beispiel #2
0
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));
}
Beispiel #3
0
// 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;
}
Beispiel #4
0
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);
}