//! Reads from a memory "lump" that contains a Jpeg2000 stream. ILboolean ilLoadJp2L(const void *Lump, ILuint Size) { return ilLoadJp2LInternal(Lump, Size, NULL); }
ILboolean iIcnsReadData(ILimage* image, ILboolean *BaseCreated, ILboolean IsAlpha, ILint Width, ICNSDATA *Entry, ILimage **Image) { ILint Position = 0, RLEPos = 0, Channel, i; ILubyte RLERead, *Data = NULL; ILimage *TempImage = NULL; ILboolean ImageAlreadyExists = IL_FALSE; // The .icns format stores the alpha and RGB as two separate images, so this // checks to see if one exists for that particular size. Unfortunately, // there is no guarantee that they are in any particular order. if (*BaseCreated && image != NULL) { TempImage = image; while (TempImage != NULL) { if ((ILuint)Width == TempImage->Width) { ImageAlreadyExists = IL_TRUE; break; } TempImage = TempImage->Next; } } Data = (ILubyte*) ialloc(Entry->Size - 8); if (Data == NULL) return IL_FALSE; if (!ImageAlreadyExists) { if (!*BaseCreated) // Create base image { il2TexImage(image, Width, Width, 1, 4, IL_RGBA, IL_UNSIGNED_BYTE, NULL); image->Origin = IL_ORIGIN_UPPER_LEFT; *Image = image; *BaseCreated = IL_TRUE; } else // Create next image in list { (*Image)->Next = il2NewImage(Width, Width, 1, 4, 1); *Image = (*Image)->Next; (*Image)->Format = IL_RGBA; (*Image)->Origin = IL_ORIGIN_UPPER_LEFT; } TempImage = *Image; } if (IsAlpha) // Alpha is never compressed. { image->io.read(&image->io, Data, Entry->Size - 8, 1); // Size includes the header if (Entry->Size - 8 != Width * Width) { ifree(Data); return IL_FALSE; } for (i = 0; i < Width * Width; i++) { TempImage->Data[(i * 4) + 3] = Data[i]; } } else if (Width == 256 || Width == 512) // JPEG2000 encoded - uses JasPer { #ifndef IL_NO_JP2 image->io.read(&image->io, Data, Entry->Size - 8, 1); // Size includes the header if (ilLoadJp2LInternal(TempImage, Data, Entry->Size - 8) == IL_FALSE) { ifree(Data); il2SetError(IL_LIB_JP2_ERROR); return IL_TRUE; } #else // Cannot io this size. il2SetError(IL_LIB_JP2_ERROR); //@TODO: io this better...just skip the data. return IL_FALSE; #endif//IL_NO_JP2 } else // RGB data { image->io.read(&image->io, Data, Entry->Size - 8, 1); // Size includes the header if (Width == 128) RLEPos += 4; // There are an extra 4 bytes here of zeros. //@TODO: Should we check to make sure they are all 0? if (Entry->Size - 8 == Width * Width * 4) // Uncompressed { //memcpy(TempImage->Data, Data, Entry->Size); for (i = 0; i < Width * Width; i++, Position += 4) { TempImage->Data[i * 4 + 0] = Data[Position+1]; TempImage->Data[i * 4 + 1] = Data[Position+2]; TempImage->Data[i * 4 + 2] = Data[Position+3]; } } else // RLE decoding { for (Channel = 0; Channel < 3; Channel++) { Position = 0; while (Position < Width * Width) { RLERead = Data[RLEPos]; RLEPos++; if (RLERead >= 128) { for (i = 0; i < RLERead - 125 && (Position + i) < Width * Width; i++) { TempImage->Data[Channel + (Position + i) * 4] = Data[RLEPos]; } RLEPos++; Position += RLERead - 125; } else { for (i = 0; i < RLERead + 1 && (Position + i) < Width * Width; i++) { TempImage->Data[Channel + (Position + i) * 4] = Data[RLEPos + i]; } RLEPos += RLERead + 1; Position += RLERead + 1; } } } } } ifree(Data); return IL_TRUE; }