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