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; }
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; }