Esempio n. 1
0
icns_type_t	icns_get_type_from_mask(icns_image_t iconImage)
{
	icns_icon_info_t		iconInfo;
	
	iconInfo.iconWidth = iconImage.imageWidth;
	iconInfo.iconHeight = iconImage.imageHeight;
	iconInfo.iconChannels = iconImage.imageChannels;
	iconInfo.iconPixelDepth = iconImage.imagePixelDepth;
	iconInfo.iconBitDepth = iconInfo.iconPixelDepth * iconInfo.iconChannels;
	iconInfo.iconRawDataSize = iconImage.imageDataSize;
	
	if(iconInfo.iconBitDepth == 1)
	{
		int	flatSize = ((iconInfo.iconWidth * iconInfo.iconHeight) / 8);
		if(iconInfo.iconRawDataSize == (flatSize * 2) )
		{
		iconInfo.isImage = 1;
		iconInfo.isMask = 1;
		}
		else
		{
		iconInfo.isImage = 0;
		iconInfo.isMask = 1;
		}
	}
	else
	{
		iconInfo.isImage = 0;
		iconInfo.isMask = 1;
	}
	
	return icns_get_type_from_image_info(iconInfo);
}
Esempio n. 2
0
ICNSSaver::ICNSSaver(BPositionIO *stream, uint32 rowBytes, icns_type_t type)
{
	fCreated = false;	

	icns_icon_info_t imageTypeInfo = icns_get_image_info_for_type(type);	
	int iconWidth = imageTypeInfo.iconWidth;
	int iconHeight = imageTypeInfo.iconWidth;
	int bpp = 32;

	uint8 *bits = new uint8[iconWidth * iconHeight * sizeof(uint32)];
	
	uint8 *rowPtr = bits;
	for (int i = 0; i < iconHeight; i++) {
		stream->Read(rowPtr, rowBytes);
		uint8 *bytePtr = rowPtr;
		for (int j=0; j < iconWidth; j++) {
			uint8 temp = bytePtr[0];
			bytePtr[0] = bytePtr[2];
			bytePtr[2] = temp;
			bytePtr += sizeof(uint32);
		}
		rowPtr += iconWidth * sizeof(uint32);
	}
	
	icns_create_family(&fIconFamily);
	
	icns_image_t icnsImage;	
	icnsImage.imageWidth = iconWidth;
	icnsImage.imageHeight = iconHeight;
	icnsImage.imageChannels = 4;
	icnsImage.imagePixelDepth = 8;
	icnsImage.imageDataSize = iconWidth * iconHeight * 4;
	icnsImage.imageData = bits;		

	icns_icon_info_t iconInfo;
	iconInfo.isImage = 1;
	iconInfo.iconWidth = icnsImage.imageWidth;
	iconInfo.iconHeight = icnsImage.imageHeight;
	iconInfo.iconBitDepth = bpp;
	iconInfo.iconChannels = (bpp == 32 ? 4 : 1);
	iconInfo.iconPixelDepth = bpp / iconInfo.iconChannels;

	icns_type_t iconType = icns_get_type_from_image_info(iconInfo);
	
	if (iconType == ICNS_NULL_TYPE) {
		delete bits;
		free(fIconFamily);
		fIconFamily = NULL;
		return;
	}

	icns_element_t *iconElement = NULL;
	int icnsErr = icns_new_element_from_image(&icnsImage, iconType,
		&iconElement);
		
	if (iconElement != NULL) {
		if (icnsErr == ICNS_STATUS_OK) {
			icns_set_element_in_family(&fIconFamily, iconElement);
			fCreated = true;
		}
		free(iconElement);
	}
	
	if (iconType != ICNS_1024x1024_32BIT_ARGB_DATA
		&& iconType != ICNS_512x512_32BIT_ARGB_DATA
		&& iconType != ICNS_256x256_32BIT_ARGB_DATA)
	{
		icns_type_t maskType = icns_get_mask_type_for_icon_type(iconType);
		
		icns_image_t icnsMask;
		icns_init_image_for_type(maskType, &icnsMask);

		uint32 iconDataOffset = 0;
		uint32 maskDataOffset = 0;
	
		while (iconDataOffset < icnsImage.imageDataSize 
			&& maskDataOffset < icnsMask.imageDataSize)	{
			icnsMask.imageData[maskDataOffset] =
				icnsImage.imageData[iconDataOffset + 3];
			iconDataOffset += 4;
			maskDataOffset += 1;
		}
		
		icns_element_t *maskElement = NULL;
		icnsErr = icns_new_element_from_mask(&icnsMask, maskType,
			&maskElement);

		if (maskElement != NULL) {
			if (icnsErr == ICNS_STATUS_OK)
				icns_set_element_in_family(&fIconFamily, maskElement);
			else
				fCreated = false;
			free(maskElement);
		}		
		icns_free_image(&icnsMask);
	}	
		
	if (!fCreated) {
		free(fIconFamily);
		fIconFamily = NULL;
	}
	
	delete bits;
}