// Internal function used to save the Sgi. ILboolean iSaveSgiInternal() { ILuint i, c; ILboolean Compress; ILimage *Temp = iCurImage; ILubyte *TempData; if (iCurImage == NULL) { ilSetError(IL_ILLEGAL_OPERATION); return IL_FALSE; } if (iCurImage->Format != IL_LUMINANCE //while the sgi spec doesn't directly forbid rgb files with 2 //channels, they are quite uncommon and most apps don't support //them. so convert lum_a images to rgba before writing. //&& iCurImage->Format != IL_LUMINANCE_ALPHA && iCurImage->Format != IL_RGB && iCurImage->Format != IL_RGBA) { if (iCurImage->Format == IL_BGRA || iCurImage->Format == IL_LUMINANCE_ALPHA) Temp = iConvertImage(iCurImage, IL_RGBA, DetermineSgiType(iCurImage->Type)); else Temp = iConvertImage(iCurImage, IL_RGB, DetermineSgiType(iCurImage->Type)); } else if (iCurImage->Type > IL_UNSIGNED_SHORT) { Temp = iConvertImage(iCurImage, iCurImage->Format, DetermineSgiType(iCurImage->Type)); } //compression of images with 2 bytes per channel doesn't work yet Compress = iGetInt(IL_SGI_RLE) && Temp->Bpc == 1; if (Temp == NULL) return IL_FALSE; SaveBigUShort(SGI_MAGICNUM); // 'Magic' number if (Compress) iputc(1); else iputc(0); if (Temp->Type == IL_UNSIGNED_BYTE) iputc(1); else if (Temp->Type == IL_UNSIGNED_SHORT) iputc(2); // Need to error here if not one of the two... if (Temp->Format == IL_LUMINANCE || Temp->Format == IL_COLOUR_INDEX) SaveBigUShort(2); else SaveBigUShort(3); SaveBigUShort((ILushort)Temp->Width); SaveBigUShort((ILushort)Temp->Height); SaveBigUShort((ILushort)Temp->Bpp); switch (Temp->Type) { case IL_BYTE: SaveBigInt(SCHAR_MIN); // Minimum pixel value SaveBigInt(SCHAR_MAX); // Maximum pixel value break; case IL_UNSIGNED_BYTE: SaveBigInt(0); // Minimum pixel value SaveBigInt(UCHAR_MAX); // Maximum pixel value break; case IL_SHORT: SaveBigInt(SHRT_MIN); // Minimum pixel value SaveBigInt(SHRT_MAX); // Maximum pixel value break; case IL_UNSIGNED_SHORT: SaveBigInt(0); // Minimum pixel value SaveBigInt(USHRT_MAX); // Maximum pixel value break; } SaveBigInt(0); // Dummy value if (FName) { c = ilCharStrLen(FName); c = c < 79 ? 79 : c; iwrite(FName, 1, c); c = 80 - c; for (i = 0; i < c; i++) { iputc(0); } } else { for (i = 0; i < 80; i++) { iputc(0); } } SaveBigUInt(0); // Colormap // Padding for (i = 0; i < 101; i++) { SaveLittleInt(0); } if (iCurImage->Origin == IL_ORIGIN_UPPER_LEFT) { TempData = iGetFlipped(Temp); if (TempData == NULL) { if (Temp!= iCurImage) ilCloseImage(Temp); return IL_FALSE; } } else { TempData = Temp->Data; } if (!Compress) { for (c = 0; c < Temp->Bpp; c++) { for (i = c; i < Temp->SizeOfData; i += Temp->Bpp) { iputc(TempData[i]); // Have to save each colour plane separately. } } } else { iSaveRleSgi(TempData, Temp->Width, Temp->Height, Temp->Bpp, Temp->Bps); } if (TempData != Temp->Data) ifree(TempData); if (Temp != iCurImage) ilCloseImage(Temp); return IL_TRUE; }
// Internal function used to save the Sgi. ILboolean iSaveSgiInternal() { ILuint i, c; ILboolean Compress; ILimage *Temp = iCurImage; ILubyte *TempData; Compress = iGetInt(IL_SGI_RLE); if (iCurImage == NULL) { ilSetError(IL_ILLEGAL_OPERATION); return IL_FALSE; } if (iCurImage->Format != IL_RGB && iCurImage->Format != IL_RGBA) { if (iCurImage->Format == IL_BGRA) Temp = iConvertImage(iCurImage, IL_RGBA, DetermineSgiType(iCurImage->Type)); else Temp = iConvertImage(iCurImage, IL_RGB, DetermineSgiType(iCurImage->Type)); } else if (iCurImage->Type > IL_UNSIGNED_SHORT) { Temp = iConvertImage(iCurImage, iCurImage->Format, DetermineSgiType(iCurImage->Type)); } if (Temp == NULL) return IL_FALSE; SaveBigUShort(SGI_MAGICNUM); // 'Magic' number if (Compress) iputc(1); else iputc(0); if (Temp->Type == IL_UNSIGNED_BYTE) iputc(1); else if (Temp->Type == IL_UNSIGNED_SHORT) iputc(2); // Need to error here if not one of the two... if (Temp->Format == IL_LUMINANCE || Temp->Format == IL_COLOUR_INDEX) SaveBigUShort(2); else SaveBigUShort(3); SaveBigUShort((ILushort)Temp->Width); SaveBigUShort((ILushort)Temp->Height); SaveBigUShort((ILushort)Temp->Bpp); switch (Temp->Type) { case IL_BYTE: SaveBigInt(SCHAR_MIN); // Minimum pixel value SaveBigInt(SCHAR_MAX); // Maximum pixel value break; case IL_UNSIGNED_BYTE: SaveBigInt(0); // Minimum pixel value SaveBigInt(UCHAR_MAX); // Maximum pixel value break; case IL_SHORT: SaveBigInt(SHRT_MIN); // Minimum pixel value SaveBigInt(SHRT_MAX); // Maximum pixel value break; case IL_UNSIGNED_SHORT: SaveBigInt(0); // Minimum pixel value SaveBigInt(USHRT_MAX); // Maximum pixel value break; } SaveBigInt(0); // Dummy value if (FName) { c = strlen(FName); c = c < 79 ? 79 : c; iwrite(FName, 1, c); c = 80 - c; for (i = 0; i < c; i++) { iputc(0); } } else { for (i = 0; i < 80; i++) { iputc(0); } } SaveBigUInt(0); // Colormap // Padding for (i = 0; i < 101; i++) { SaveLittleInt(0); } if (iCurImage->Origin == IL_ORIGIN_UPPER_LEFT) { TempData = iGetFlipped(Temp); if (TempData == NULL) { if (Temp!= iCurImage) ilCloseImage(Temp); return IL_FALSE; } } else { TempData = Temp->Data; } if (!Compress) { for (c = 0; c < Temp->Bpp; c++) { for (i = c; i < Temp->SizeOfData; i += Temp->Bpp) { iputc(TempData[i]); // Have to save each colour plane separately. } } } else { iSaveRleSgi(TempData); } if (TempData != Temp->Data) ifree(TempData); if (Temp != iCurImage) ilCloseImage(Temp); return IL_TRUE; }