//! Writes a Mng to an already-opened file ILuint ilSaveMngF(ILHANDLE File) { ILuint Pos = itellw(); iSetOutputFile(File); if (iSaveMngInternal() == IL_FALSE) return 0; // Error occurred return itellw() - Pos; // Return the number of bytes written. }
ILboolean iSaveRleSgi(ILubyte *Data) { ILuint c, i, y, j; ILubyte *ScanLine = NULL, *CompLine = NULL; ILuint *StartTable = NULL, *LenTable = NULL; ILuint TableOff, DataOff = 0; ScanLine = (ILubyte*)ialloc(iCurImage->Width); CompLine = (ILubyte*)ialloc(iCurImage->Width * 2); // Absolute worst case. StartTable = (ILuint*)ialloc(iCurImage->Height * iCurImage->Bpp * sizeof(ILuint)); LenTable = (ILuint*)ialloc(iCurImage->Height * iCurImage->Bpp * sizeof(ILuint)); if (!ScanLine || !StartTable || !LenTable) { ifree(ScanLine); ifree(CompLine); ifree(StartTable); ifree(LenTable); return IL_FALSE; } // These just contain dummy values at this point. TableOff = itellw(); iwrite(StartTable, sizeof(ILuint), iCurImage->Height * iCurImage->Bpp); iwrite(LenTable, sizeof(ILuint), iCurImage->Height * iCurImage->Bpp); DataOff = itellw(); for (c = 0; c < iCurImage->Bpp; c++) { for (y = 0; y < iCurImage->Height; y++) { i = y * iCurImage->Bps + c; for (j = 0; j < iCurImage->Width; j++, i += iCurImage->Bpp) { ScanLine[j] = Data[i]; } ilRleCompressLine(ScanLine, iCurImage->Width, 1, CompLine, LenTable + iCurImage->Height * c + y, IL_SGICOMP); iwrite(CompLine, 1, *(LenTable + iCurImage->Height * c + y)); } } iseek(TableOff, IL_SEEK_SET); j = iCurImage->Height * iCurImage->Bpp; for (y = 0; y < j; y++) { StartTable[y] = DataOff; StartTable[y] = SwapInt(StartTable[y]); DataOff += LenTable[y]; LenTable[y] = SwapInt(LenTable[y]); } iwrite(StartTable, sizeof(ILuint), iCurImage->Height * iCurImage->Bpp); iwrite(LenTable, sizeof(ILuint), iCurImage->Height * iCurImage->Bpp); ifree(ScanLine); ifree(CompLine); ifree(StartTable); ifree(LenTable); return IL_TRUE; }
//! Writes a Jpeg to a memory "lump" ILuint ilSaveL_JPEG(void *Lump, ILuint Size) { ILuint Pos; iSetOutputLump(Lump, Size); Pos = itellw(); if (iSaveJpegInternal() == IL_FALSE) return 0; // Error occurred return itellw() - Pos; // Return the number of bytes written. }
ILuint ILAPIENTRY ilSaveL(ILenum Type, ILvoid *Lump, ILuint Size) { ILboolean Ret; if (Lump == NULL) { ilSetError(IL_INVALID_PARAM); return 0; } switch (Type) { #ifndef IL_NO_BMP case IL_BMP: Ret = ilSaveBmpL(Lump, Size); break; #endif #ifndef IL_NO_JPG case IL_JPG: Ret = ilSaveJpegL(Lump, Size); break; #endif #ifndef IL_NO_PNG case IL_PNG: Ret = ilSavePngL(Lump, Size); break; #endif #ifndef IL_NO_PNM case IL_PNM: Ret = ilSavePnmL(Lump, Size); break; #endif #ifndef IL_NO_PSD case IL_PSD: Ret = ilSavePsdL(Lump, Size); break; #endif #ifndef IL_NO_RAW case IL_RAW: Ret = ilSaveRawL(Lump, Size); break; #endif #ifndef IL_NO_SGI case IL_SGI: Ret = ilSaveSgiL(Lump, Size); break; #endif #ifndef IL_NO_TGA case IL_TGA: Ret = ilSaveTargaL(Lump, Size); break; #endif /*#ifndef IL_NO_TIF case IL_TIF: Ret = ilSaveTiffL(Lump, Size); break; #endif*/ default: ilSetError(IL_INVALID_ENUM); return 0; } if (Ret == IL_FALSE) return 0; return itellw(); }
ILboolean iSaveRleSgi(ILubyte *Data, ILuint w, ILuint h, ILuint numChannels, ILuint bps) { //works only for sgi files with only 1 bpc ILuint c, i, y, j; ILubyte *ScanLine = NULL, *CompLine = NULL; ILuint *StartTable = NULL, *LenTable = NULL; ILuint TableOff, DataOff = 0; ScanLine = (ILubyte*)ialloc(w); CompLine = (ILubyte*)ialloc(w * 2 + 1); // Absolute worst case. StartTable = (ILuint*)ialloc(h * numChannels * sizeof(ILuint)); LenTable = (ILuint*)icalloc(h * numChannels, sizeof(ILuint)); if (!ScanLine || !CompLine || !StartTable || !LenTable) { ifree(ScanLine); ifree(CompLine); ifree(StartTable); ifree(LenTable); return IL_FALSE; } // These just contain dummy values at this point. TableOff = itellw(); iwrite(StartTable, sizeof(ILuint), h * numChannels); iwrite(LenTable, sizeof(ILuint), h * numChannels); DataOff = itellw(); for (c = 0; c < numChannels; c++) { for (y = 0; y < h; y++) { i = y * bps + c; for (j = 0; j < w; j++, i += numChannels) { ScanLine[j] = Data[i]; } ilRleCompressLine(ScanLine, w, 1, CompLine, LenTable + h * c + y, IL_SGICOMP); iwrite(CompLine, 1, *(LenTable + h * c + y)); } } iseekw(TableOff, IL_SEEK_SET); j = h * numChannels; for (y = 0; y < j; y++) { StartTable[y] = DataOff; DataOff += LenTable[y]; #ifdef __LITTLE_ENDIAN__ iSwapUInt(&StartTable[y]); iSwapUInt(&LenTable[y]); #endif } iwrite(StartTable, sizeof(ILuint), h * numChannels); iwrite(LenTable, sizeof(ILuint), h * numChannels); ifree(ScanLine); ifree(CompLine); ifree(StartTable); ifree(LenTable); return IL_TRUE; }