ILuint ILAPIENTRY ilprintf(SIO* io, const char *Line, ...) { char Buffer[2048]; // Hope this is large enough va_list VaLine; ILuint i; va_start(VaLine, Line); vsprintf(Buffer, Line, VaLine); va_end(VaLine); i = ilCharStrLen(Buffer); io->write(Buffer, 1, i, io); return i; }
ILuint ILAPIENTRY ilprintf(const char *Line, ...) { char Buffer[2048]; // Hope this is large enough va_list VaLine; ILuint i; va_start(VaLine, Line); vsprintf(Buffer, Line, VaLine); va_end(VaLine); i = ilCharStrLen(Buffer); iCurImage->io.write(Buffer, 1, i, iCurImage->io.handle); return i; }
// Clips a string to a certain length and returns a new string. char *iClipString(char *String, ILuint MaxLen) { char *Clipped; ILuint Length; if (String == NULL) return NULL; Length = ilCharStrLen(String); //ilStrLen(String); Clipped = (char*)ialloc((MaxLen + 1) * sizeof(char) /*sizeof(ILchar)*/); // Terminating NULL makes it +1. if (Clipped == NULL) { return NULL; } memcpy(Clipped, String, MaxLen * sizeof(char) /*sizeof(ILchar)*/); Clipped[Length] = 0; return Clipped; }
ILboolean XpmPredefCol(char *Buff, XpmPixel *Colour) { ILint len; ILint val = 128; if (!_stricmp(Buff, "none")) { (*Colour)[0] = 0; (*Colour)[1] = 0; (*Colour)[2] = 0; (*Colour)[3] = 0; return IL_TRUE; } (*Colour)[3] = 255; if (!_stricmp(Buff, "black")) { (*Colour)[0] = 0; (*Colour)[1] = 0; (*Colour)[2] = 0; return IL_TRUE; } if (!_stricmp(Buff, "white")) { (*Colour)[0] = 255; (*Colour)[1] = 255; (*Colour)[2] = 255; return IL_TRUE; } if (!_stricmp(Buff, "red")) { (*Colour)[0] = 255; (*Colour)[1] = 0; (*Colour)[2] = 0; return IL_TRUE; } if (!_stricmp(Buff, "green")) { (*Colour)[0] = 0; (*Colour)[1] = 255; (*Colour)[2] = 0; return IL_TRUE; } if (!_stricmp(Buff, "blue")) { (*Colour)[0] = 0; (*Colour)[1] = 0; (*Colour)[2] = 255; return IL_TRUE; } if (!_stricmp(Buff, "yellow")) { (*Colour)[0] = 255; (*Colour)[1] = 255; (*Colour)[2] = 0; return IL_TRUE; } if (!_stricmp(Buff, "cyan")) { (*Colour)[0] = 0; (*Colour)[1] = 255; (*Colour)[2] = 255; return IL_TRUE; } if (!_stricmp(Buff, "gray")) { (*Colour)[0] = 128; (*Colour)[1] = 128; (*Colour)[2] = 128; return IL_TRUE; } //check for grayXXX codes (added 20040218) len = ilCharStrLen(Buff); if (len >= 4) { if (Buff[0] == 'g' || Buff[0] == 'G' || Buff[1] == 'r' || Buff[1] == 'R' || Buff[2] == 'a' || Buff[2] == 'A' || Buff[3] == 'y' || Buff[3] == 'Y') { if (isdigit(Buff[4])) { // isdigit returns false on '\0' val = Buff[4] - '0'; if (isdigit(Buff[5])) { val = val*10 + Buff[5] - '0'; if (isdigit(Buff[6])) val = val*10 + Buff[6] - '0'; } val = (255*val)/100; } (*Colour)[0] = (ILubyte)val; (*Colour)[1] = (ILubyte)val; (*Colour)[2] = (ILubyte)val; return IL_TRUE; } } // Unknown colour string, so use black // (changed 20040218) (*Colour)[0] = 0; (*Colour)[1] = 0; (*Colour)[2] = 0; return IL_FALSE; }
//! Generates a C-style header file for the current image. ILboolean ilSaveCHeader(ILconst_string FileName, char *InternalName) { FILE *HeadFile; ILuint i = 0, j; ILimage *TempImage; const char *Name; if (iCurImage == NULL) { ilSetError(IL_ILLEGAL_OPERATION); return IL_FALSE; } Name = iGetString(IL_CHEAD_HEADER_STRING); if (Name == NULL) Name = InternalName; if (FileName == NULL || Name == NULL || ilStrLen(FileName) < 1 || ilCharStrLen(Name) < 1) { ilSetError(IL_INVALID_VALUE); return IL_FALSE; } if (!iCheckExtension(FileName, IL_TEXT("h"))) { ilSetError(IL_INVALID_EXTENSION); return IL_FALSE; } if (ilGetBoolean(IL_FILE_MODE) == IL_FALSE) { if (iFileExists(FileName)) { ilSetError(IL_FILE_ALREADY_EXISTS); return IL_FALSE; } } if (iCurImage->Bpc > 1) { TempImage = iConvertImage(iCurImage, iCurImage->Format, IL_UNSIGNED_BYTE); if (TempImage == NULL) return IL_FALSE; } else { TempImage = iCurImage; } #ifndef _UNICODE HeadFile = fopen(FileName, "wb"); #else HeadFile = _wfopen(FileName, L"rb"); #endif//_UNICODE if (HeadFile == NULL) { ilSetError(IL_COULD_NOT_OPEN_FILE); return IL_FALSE; } fprintf(HeadFile, "//#include <il/il.h>\n"); fprintf(HeadFile, "// C Image Header:\n\n\n"); fprintf(HeadFile, "// IMAGE_BPP is in bytes per pixel, *not* bits\n"); fprintf(HeadFile, "#define IMAGE_BPP %d\n",iCurImage->Bpp); fprintf(HeadFile, "#define IMAGE_WIDTH %d\n", iCurImage->Width); fprintf(HeadFile, "#define IMAGE_HEIGHT %d\n", iCurImage->Height); fprintf(HeadFile, "#define IMAGE_DEPTH %d\n\n\n", iCurImage->Depth); fprintf(HeadFile, "#define IMAGE_TYPE 0x%X\n", iCurImage->Type); fprintf(HeadFile, "#define IMAGE_FORMAT 0x%X\n\n\n", iCurImage->Format); fprintf(HeadFile, "ILubyte %s[] = {\n", Name); for (; i < TempImage->SizeOfData; i += MAX_LINE_WIDTH) { fprintf(HeadFile, "\t"); for (j = 0; j < MAX_LINE_WIDTH; j++) { if (i + j >= TempImage->SizeOfData - 1) { fprintf(HeadFile, "%4d", TempImage->Data[i+j]); break; } else fprintf(HeadFile, "%4d,", TempImage->Data[i+j]); } fprintf(HeadFile, "\n"); } if (TempImage != iCurImage) ilCloseImage(TempImage); fprintf(HeadFile, "};\n"); if (iCurImage->Pal.Palette && iCurImage->Pal.PalSize && iCurImage->Pal.PalType != IL_PAL_NONE) { fprintf(HeadFile, "\n\n"); fprintf(HeadFile, "#define IMAGE_PALSIZE %u\n\n", iCurImage->Pal.PalSize); fprintf(HeadFile, "#define IMAGE_PALTYPE 0x%X\n\n", iCurImage->Pal.PalType); fprintf(HeadFile, "ILubyte %sPal[] = {\n", Name); for (i = 0; i < iCurImage->Pal.PalSize; i += MAX_LINE_WIDTH) { fprintf(HeadFile, "\t"); for (j = 0; j < MAX_LINE_WIDTH; j++) { if (i + j >= iCurImage->Pal.PalSize - 1) { fprintf(HeadFile, " %4d", iCurImage->Pal.Palette[i+j]); break; } else fprintf(HeadFile, " %4d,", iCurImage->Pal.Palette[i+j]); } fprintf(HeadFile, "\n"); } fprintf(HeadFile, "};\n"); } fclose(HeadFile); return IL_TRUE; }
// 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; }