bool MCResampledImageRep::LoadImageFrames(MCBitmapFrame *&r_frames, uindex_t &r_frame_count, bool &r_frames_premultiplied)
{
	uindex_t t_src_width, t_src_height;
	if (!m_source->GetGeometry(t_src_width, t_src_height))
		return false;
	
	bool t_success = true;
	
	MCBitmapFrame *t_frames = nil;
	uindex_t t_frame_count = 0;
	
	t_frame_count = m_source->GetFrameCount();
	
	// IM-2013-07-03: [[ Bug 11018 ]] fail here if the source has no frames
	t_success = t_frame_count != 0;

	if (t_success)
		t_success = MCMemoryNewArray(t_frame_count, t_frames);
	
	MCGFloat t_scale;
	t_scale = MCMax(m_target_width / (float)t_src_width, m_target_height / (float)t_src_height);
	
	for (uindex_t i = 0; t_success && i < t_frame_count; i++)
	{
		MCBitmapFrame *t_src_frame = nil;
		
		t_success = m_source->LockBitmapFrame(i, t_scale, t_src_frame);
		if (t_success)
		{
			t_frames[i].duration = t_src_frame->duration;
			
			t_success = MCImageScaleBitmap(t_src_frame->image, m_target_width, m_target_height, INTERPOLATION_BICUBIC, t_frames[i].image);
			if (t_success)
				MCImageFlipBitmapInPlace(t_frames[i].image, m_h_flip, m_v_flip);
		}
		m_source->UnlockBitmapFrame(i, t_src_frame);
	}
	
	if (t_success)
	{
		r_frames = t_frames;
		r_frame_count = t_frame_count;
		r_frames_premultiplied = false;
	}
	else
		MCImageFreeFrames(t_frames, t_frame_count);
	
	return t_success;
}
Beispiel #2
0
CGImageRef MCImage::makeicon(uint4 p_width, uint4 p_height)
{
	CGImageRef t_icon = NULL;

	MCImageBitmap *t_bitmap = nil;
	
	if (lockbitmap(t_bitmap, false))
	{
		MCImageBitmap *t_scaled = nil;
		if (p_width != t_bitmap->width || p_height != t_bitmap->height)
			/* UNCHECKED */ MCImageScaleBitmap(t_bitmap, p_width, p_height, resizequality, t_scaled);
		/* UNCHECKED */ MCImageBitmapToCGImage(t_scaled != nil ? t_scaled : t_bitmap, true, false, t_icon);
		MCImageFreeBitmap(t_scaled);
		unlockbitmap(t_bitmap);
	}
	
	return t_icon;
}
bool MCTransformedImageRep::LoadImageFrames(MCImageFrame *&r_frames, uindex_t &r_frame_count)
{
	uindex_t t_target_width, t_target_height;
	if (!GetGeometry(t_target_width, t_target_height))
		return false;
	
	bool t_success = true;
	
	MCImageFrame *t_frames = nil;
	uindex_t t_frame_count = 0;
	
	t_frame_count = m_source->GetFrameCount();
	
	t_success = MCMemoryNewArray(t_frame_count, t_frames);
	
	for (uindex_t i = 0; t_success && i < t_frame_count; i++)
	{
		MCImageFrame *t_src_frame = nil;
		
		t_success = m_source->LockImageFrame(i, t_src_frame);
		if (t_success)
		{
			t_frames[i].duration = t_src_frame->duration;
			if (m_angle != 0)
			{
				// rotate
				MCImageBitmap *t_bitmap = nil;
				MCImageBitmap *t_rotated = nil;
				t_success = MCImageCopyBitmap(t_src_frame->image, t_bitmap);
				if (t_success)
				{
					MCImageBitmapPremultiply(t_bitmap);
					t_success = MCImageRotateBitmap(t_bitmap, m_angle, m_quality, 0x0, t_rotated);
				}
				
				MCImageFreeBitmap(t_bitmap);
				
				bool t_scaled = false;
				
				if (t_success && (t_rotated->width != t_target_width || t_rotated->height != t_target_height))
				{
					MCImageBitmap *t_sbitmap = nil;
					t_success = MCImageScaleBitmap(t_rotated, t_target_width, t_target_height, m_quality, t_sbitmap);
					MCImageFreeBitmap(t_rotated);
					t_rotated = t_sbitmap;
					t_scaled = true;
				}
				
				if (t_success)
				{
					if (t_scaled && (m_quality == INTERPOLATION_BICUBIC))
						MCImageBitmapUnpremultiplyChecking(t_rotated);
					else
						MCImageBitmapUnpremultiply(t_rotated);
					
					t_frames[i].image = t_rotated;
				}
				else
					MCImageFreeBitmap(t_rotated);
				
			}
			else
			{
				// resize
				if (t_src_frame->image->width == t_target_width && t_src_frame->image->height == t_target_height)
					t_success = MCImageCopyBitmap(t_src_frame->image, t_frames[i].image);
				else
					t_success = MCImageScaleBitmap(t_src_frame->image, t_target_width, t_target_height, m_quality, t_frames[i].image);
			}
		}
		m_source->UnlockImageFrame(i, t_src_frame);
	}
	
	if (t_success)
	{
		r_frames = t_frames;
		r_frame_count = t_frame_count;
	}
	else
		MCImageFreeFrames(t_frames, t_frame_count);
	
	return t_success;
}