// MW-2011-09-13: [[ Masks ]] Updated to store data in an MCWindowMask struct. MCWindowShape *MCImage::makewindowshape(void) { bool t_success = true; MCWindowShape *t_mask = nil; CGImageRef t_mask_image = nil; MCImageBitmap *t_bitmap = nil; uint8_t *t_alpha = nil; uindex_t t_alpha_stride = 0; uindex_t t_width, t_height; t_success = lockbitmap(t_bitmap, true); if (t_success) t_success = MCImageBitmapHasTransparency(t_bitmap); if (t_success) { t_width = t_bitmap->width; t_height = t_bitmap->height; t_alpha_stride = (t_width + 3) & ~3; t_success = MCMemoryAllocate(t_alpha_stride * t_height, t_alpha); } if (t_success) { surface_extract_alpha(t_bitmap->data, t_bitmap->stride, t_alpha, t_alpha_stride, t_width, t_height); t_success = MCAlphaToCGImage(t_width, t_height, t_alpha, t_alpha_stride, t_mask_image); } if (t_success) t_success = MCMemoryNew(t_mask); unlockbitmap(t_bitmap); if (!t_success) { CGImageRelease(t_mask_image); MCMemoryDeallocate(t_mask); MCMemoryDeallocate(t_alpha); return nil; } t_mask->width = t_width; t_mask->height = t_height; t_mask->is_sharp = false; t_mask->data = (char*)t_alpha; t_mask->stride = t_alpha_stride; t_mask->handle = t_mask_image; return t_mask; }
CGImageRef MCImage::converttodragimage(void) { CGImageRef t_image = NULL; MCImageBitmap *t_bitmap = nil; if (lockbitmap(t_bitmap, false)) /* UNCHECKED */ MCImageBitmapToCGImage(t_bitmap, true, false, t_image); unlockbitmap(t_bitmap); return t_image; }
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; }