• 大小: 378KB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2021-05-24
  • 语言: 其他
  • 标签: SOIL.h  SOIL.c  libSOIL.a  

资源简介

libSOIL.a SOIL.h SOIL.c SOIL是简易OpenGL图像库(Simple OpenGL Image Library)的缩写,它支持大多数流行的图像格式,并且使用简单。

资源截图

代码片段和文件信息

/*
Jonathan Dummer
2007-07-31-10.32

simple DXT compression / decompression code

public domain
*/

#include “image_DXT.h“
#include 
#include 
#include 
#include 

/* set this =1 if you want to use the covarince matrix method...
which is better than my method of using standard deviations
overall except on the infintesimal chance that the power
method fails for finding the largest eigenvector */
#define USE_COV_MAT 1

/********* Function Prototypes *********/
/*
Takes a 4x4 block of pixels and compresses it into 8 bytes
in DXT1 format (color only no alpha).  Speed is valued
over prettyness at least for now.
*/
void compress_DDS_color_block(
int channels
const unsigned char *const uncompressed
unsigned char compressed[8] );
/*
Takes a 4x4 block of pixels and compresses the alpha
component it into 8 bytes for use in DXT5 DDS files.
Speed is valued over prettyness at least for now.
*/
void compress_DDS_alpha_block(
const unsigned char *const uncompressed
unsigned char compressed[8] );

/********* Actual Exposed Functions *********/
int
save_image_as_DDS

const char *filename
int width int height int channels
const unsigned char *const data

{
/* variables */
FILE *fout;
unsigned char *DDS_data;
DDS_header header;
int DDS_size;
/* error check */
if( (NULL == filename) ||
(width < 1) || (height < 1) ||
(channels < 1) || (channels > 4) ||
(data == NULL ) )
{
return 0;
}
/* Convert the image */
if( (channels & 1) == 1 )
{
/* no alpha just use DXT1 */
DDS_data = convert_image_to_DXT1( data width height channels &DDS_size );
} else
{
/* has alpha so use DXT5 */
DDS_data = convert_image_to_DXT5( data width height channels &DDS_size );
}
/* save it */
memset( &header 0 sizeof( DDS_header ) );
header.dwMagic = (‘D‘ << 0) | (‘D‘ << 8) | (‘S‘ << 16) | (‘ ‘ << 24);
header.dwSize = 124;
header.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_LINEARSIZE;
header.dwWidth = width;
header.dwHeight = height;
header.dwPitchOrLinearSize = DDS_size;
header.sPixelFormat.dwSize = 32;
header.sPixelFormat.dwFlags = DDPF_FOURCC;
if( (channels & 1) == 1 )
{
header.sPixelFormat.dwFourCC = (‘D‘ << 0) | (‘X‘ << 8) | (‘T‘ << 16) | (‘1‘ << 24);
} else
{
header.sPixelFormat.dwFourCC = (‘D‘ << 0) | (‘X‘ << 8) | (‘T‘ << 16) | (‘5‘ << 24);
}
header.sCaps.dwCaps1 = DDSCAPS_TEXTURE;
/* write it out */
fout = fopen( filename “wb“);
fwrite( &header sizeof( DDS_header ) 1 fout );
fwrite( DDS_data 1 DDS_size fout );
fclose( fout );
/* done */
free( DDS_data );
return 1;
}

unsigned char* convert_image_to_DXT1(
const unsigned char *const uncompressed
int width int height int channels
int *out_size )
{
unsigned char *compressed;
int i j x y;
unsigned char ublock[16*3];
unsigned cha

评论

共有 条评论

相关资源