ILimage *MakeD3D8Compliant(IDirect3DDevice8 *Device, D3DFORMAT *DestFormat) { ILimage *Converted, *Scaled, *CurImage; *DestFormat = D3DFMT_A8R8G8B8; // Images must be in BGRA format. if (ilutCurImage->Format != IL_BGRA) { Converted = iConvertImage(ilutCurImage, IL_BGRA, IL_UNSIGNED_BYTE); if (Converted == NULL) return NULL; } else { Converted = ilutCurImage; } // Images must have their origin in the upper left. if (Converted->Origin != IL_ORIGIN_UPPER_LEFT) { CurImage = ilutCurImage; ilSetCurImage(Converted); iluFlipImage(); ilSetCurImage(CurImage); } // Images must have powers-of-2 dimensions. if (ilNextPower2(ilutCurImage->Width) != ilutCurImage->Width || ilNextPower2(ilutCurImage->Height) != ilutCurImage->Height || ilNextPower2(ilutCurImage->Depth) != ilutCurImage->Depth) { Scaled = iluScale_(Converted, ilNextPower2(ilutCurImage->Width), ilNextPower2(ilutCurImage->Height), ilNextPower2(ilutCurImage->Depth)); if (Converted != ilutCurImage) { ilCloseImage(Converted); } if (Scaled == NULL) { return NULL; } Converted = Scaled; } return Converted; }
ILboolean iBuildMipmaps(ILimage *Parent, ILuint Width, ILuint Height, ILuint Depth) { ILuint x1 = 0, x2 = 0, y1 = 0, y2 = 0; if (Parent->Width == 1 && Parent->Height == 1 && Parent->Depth == 1) { // Already at the last mipmap return IL_TRUE; } if (Width == 0) Width = 1; if (Height == 0) Height = 1; if (Depth == 0) Depth = 1; Parent->Mipmaps = iluScale_(Parent, Width, Height, Depth); if (Parent->Mipmaps == NULL) return IL_FALSE; iBuildMipmaps(Parent->Mipmaps, Parent->Mipmaps->Width >> 1, Parent->Mipmaps->Height >> 1, Parent->Mipmaps->Depth >> 1); return IL_TRUE; }
ILboolean ILAPIENTRY iluScale(ILuint Width, ILuint Height, ILuint Depth) { ILimage *Temp; ILboolean UsePal; ILenum PalType; ILenum Origin; iluCurImage = ilGetCurImage(); if (iluCurImage == NULL) { ilSetError(ILU_ILLEGAL_OPERATION); return IL_FALSE; } if (iluCurImage->Width == Width && iluCurImage->Height == Height && iluCurImage->Depth == Depth) return IL_TRUE; if( (iluCurImage->Width<Width) || (iluCurImage->Height<Height) ) // only do special scale if there is some zoom? { switch (iluFilter) { case ILU_SCALE_BOX: case ILU_SCALE_TRIANGLE: case ILU_SCALE_BELL: case ILU_SCALE_BSPLINE: case ILU_SCALE_LANCZOS3: case ILU_SCALE_MITCHELL: iluCurImage = ilGetCurImage(); if (iluCurImage == NULL) { ilSetError(ILU_ILLEGAL_OPERATION); return IL_FALSE; } // Not supported yet. if (iluCurImage->Type != IL_UNSIGNED_BYTE || iluCurImage->Format == IL_COLOUR_INDEX || iluCurImage->Depth > 1) { ilSetError(ILU_ILLEGAL_OPERATION); return IL_FALSE; } if(iluCurImage->Width>Width) // shrink width first { Origin = iluCurImage->Origin; Temp = iluScale_(iluCurImage, Width, iluCurImage->Height, iluCurImage->Depth); if (Temp != NULL) { if( !ilTexImage(Temp->Width, Temp->Height, Temp->Depth, Temp->Bpp, Temp->Format, Temp->Type, Temp->Data ) ) { ilCloseImage(Temp); return IL_FALSE; } iluCurImage->Origin = Origin; ilCloseImage(Temp); } } else if(iluCurImage->Height>Height) // shrink height first { Origin = iluCurImage->Origin; Temp = iluScale_(iluCurImage, iluCurImage->Width, Height, iluCurImage->Depth); if (Temp != NULL) { if( !ilTexImage(Temp->Width, Temp->Height, Temp->Depth, Temp->Bpp, Temp->Format, Temp->Type, Temp->Data) ) { ilCloseImage(Temp); return IL_FALSE; } iluCurImage->Origin = Origin; ilCloseImage(Temp); } } return (ILboolean)iluScaleAdvanced(Width, Height, iluFilter); } } Origin = iluCurImage->Origin; UsePal = (iluCurImage->Format == IL_COLOUR_INDEX); PalType = iluCurImage->Pal.PalType; Temp = iluScale_(iluCurImage, Width, Height, Depth); if (Temp != NULL) { if( !ilTexImage(Temp->Width, Temp->Height, Temp->Depth, Temp->Bpp, Temp->Format, Temp->Type, Temp->Data) ) { ilCloseImage(Temp); return IL_FALSE; } iluCurImage->Origin = Origin; ilCloseImage(Temp); if (UsePal) { if (!ilConvertImage(IL_COLOUR_INDEX, IL_UNSIGNED_BYTE)) return IL_FALSE; ilConvertPal(PalType); } return IL_TRUE; } return IL_FALSE; }
ILimage *MakeD3D10Compliant(ID3D10Device *Device, DXGI_FORMAT *DestFormat) { ILimage *Converted, *Scaled, *CurImage; ILuint nConversionType, ilutFormat; ILboolean bForceIntegerFormat = ilutGetBoolean(ILUT_FORCE_INTEGER_FORMAT); Device; ilutFormat = ilutCurImage->Format; nConversionType = ilutCurImage->Type; if (!ilutCurImage) return NULL; switch (ilutCurImage->Type) { case IL_UNSIGNED_BYTE: case IL_BYTE: case IL_SHORT: case IL_UNSIGNED_SHORT: case IL_INT: case IL_UNSIGNED_INT: *DestFormat = DXGI_FORMAT_R8G8B8A8_UINT; nConversionType = IL_UNSIGNED_BYTE; ilutFormat = IL_RGBA; break; case IL_FLOAT: case IL_DOUBLE: case IL_HALF: if (bForceIntegerFormat || (!FormatsDX10supported[6])) { *DestFormat = DXGI_FORMAT_R8G8B8A8_UINT; nConversionType = IL_UNSIGNED_BYTE; ilutFormat = IL_RGBA; } else { *DestFormat = DXGI_FORMAT_R32G32B32A32_FLOAT; nConversionType = IL_HALF; ilutFormat = IL_RGBA; } break; } // Images must be in BGRA format. if (((ilutCurImage->Format != ilutFormat)) || (ilutCurImage->Type != nConversionType)) { Converted = iConvertImage(ilutCurImage, ilutFormat, nConversionType); if (Converted == NULL) return NULL; } else { Converted = ilutCurImage; } // Images must have their origin in the upper left. if (Converted->Origin != IL_ORIGIN_UPPER_LEFT) { CurImage = ilutCurImage; ilSetCurImage(Converted); iluFlipImage(); ilSetCurImage(CurImage); } // Images must have powers-of-2 dimensions. if (ilNextPower2(ilutCurImage->Width) != ilutCurImage->Width || ilNextPower2(ilutCurImage->Height) != ilutCurImage->Height || ilNextPower2(ilutCurImage->Depth) != ilutCurImage->Depth) { Scaled = iluScale_(Converted, ilNextPower2(ilutCurImage->Width), ilNextPower2(ilutCurImage->Height), 1); //@TODO: 1 should be ilNextPower2(ilutCurImage->Depth) if (Converted != ilutCurImage) { ilCloseImage(Converted); } if (Scaled == NULL) { return NULL; } Converted = Scaled; } return Converted; }
ILimage *MakeD3D9Compliant(IDirect3DDevice9 *Device, D3DFORMAT *DestFormat) { ILuint color; ILimage *Converted, *Scaled, *CurImage; *DestFormat = D3DFMT_A8R8G8B8; // Images must be in BGRA format. if (ilutCurImage->Format != IL_BGRA) { Converted = iConvertImage(ilutCurImage, IL_BGRA, IL_UNSIGNED_BYTE); if (Converted == NULL) return NULL; } else { Converted = ilutCurImage; } // perform alpha key on images if requested color=ilutGetInteger(ILUT_D3D_ALPHA_KEY_COLOR); if(color>=0) { ILubyte *data; ILubyte *maxdata; ILuint t; data=(Converted->Data); maxdata=(Converted->Data+Converted->SizeOfData); while(data<maxdata) { t= (data[2]<<16) + (data[1]<<8) + (data[0]) ; if((t&0x00ffffff)==(color&0x00ffffff)) { data[0]=0; data[1]=0; data[2]=0; data[3]=0; } data+=4; } } // Images must have their origin in the upper left. if (Converted->Origin != IL_ORIGIN_UPPER_LEFT) { CurImage = ilutCurImage; ilSetCurImage(Converted); iluFlipImage(); ilSetCurImage(CurImage); } // Images must have powers-of-2 dimensions. if (ilNextPower2(ilutCurImage->Width) != ilutCurImage->Width || ilNextPower2(ilutCurImage->Height) != ilutCurImage->Height || ilNextPower2(ilutCurImage->Depth) != ilutCurImage->Depth) { Scaled = iluScale_(Converted, ilNextPower2(ilutCurImage->Width), ilNextPower2(ilutCurImage->Height), ilNextPower2(ilutCurImage->Depth)); if (Converted != ilutCurImage) { ilCloseImage(Converted); } if (Scaled == NULL) { return NULL; } Converted = Scaled; } return Converted; }