Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
itdan3344
stb
提交
8b1d835e
S
stb
项目概览
itdan3344
/
stb
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
stb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8b1d835e
编写于
4月 08, 2015
作者:
T
Tim Kelsey
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Adding memory and assert defines to stb_image_write
上级
bdef693b
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
57 addition
and
30 deletion
+57
-30
stb_image_write.h
stb_image_write.h
+57
-30
未找到文件。
stb_image_write.h
浏览文件 @
8b1d835e
/* stb_image_write - v0.9
7
- public domain - http://nothings.org/stb/stb_image_write.h
/* stb_image_write - v0.9
8
- public domain - http://nothings.org/stb/stb_image_write.h
writes out PNG/BMP/TGA images to C stdio - Sean Barrett 2010
no warranty implied; use at your own risk
...
...
@@ -9,6 +9,10 @@
in the file that you want to have the implementation.
You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.
And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free
You can optionally define STBI_MEMMOVE and STBI_MEMCPY if the default semantics of
memmove and memcpy would be incompatible with your choice of malloc et al.
Will probably not work correctly with strict-aliasing optimizations.
...
...
@@ -67,6 +71,8 @@ CREDITS:
Jean-Sebastien Guay
Bugfixes:
Chribba@github
STBI_MALLOC etc:
callidus@github
*/
#ifndef INCLUDE_STB_IMAGE_WRITE_H
...
...
@@ -93,9 +99,29 @@ extern int stbi_write_hdr(char const *filename, int w, int h, int comp, const fl
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC)
// ok
#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC)
// ok
#else
#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC."
#endif
#ifndef STBI_MALLOC
#define STBI_MALLOC(sz) malloc(sz)
#define STBI_REALLOC(p,sz) realloc(p,sz)
#define STBI_FREE(p) free(p)
#define STBI_MEMMOVE(a,b,sz) memmove(a,b,sz)
#define STBI_MEMCPY(a,b,sz) memcpy(a,b,sz)
#endif
#ifndef STBI_ASSERT
#include <assert.h>
#define STBI_ASSERT(x) assert(x)
#endif
typedef
unsigned
int
stbiw_uint32
;
typedef
int
stb_image_write_test
[
sizeof
(
stbiw_uint32
)
==
4
?
1
:
-
1
];
...
...
@@ -113,7 +139,7 @@ static void writefv(FILE *f, const char *fmt, va_list v)
b
[
2
]
=
(
unsigned
char
)(
x
>>
16
);
b
[
3
]
=
(
unsigned
char
)(
x
>>
24
);
fwrite
(
b
,
4
,
1
,
f
);
break
;
}
default:
assert
(
0
);
STBI_ASSERT
(
0
);
return
;
}
}
...
...
@@ -232,7 +258,7 @@ void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)
void
stbiw__write_run_data
(
FILE
*
f
,
int
length
,
unsigned
char
databyte
)
{
unsigned
char
lengthbyte
=
(
unsigned
char
)
(
length
+
128
);
assert
(
length
+
128
<=
255
);
STBI_ASSERT
(
length
+
128
<=
255
);
fwrite
(
&
lengthbyte
,
1
,
1
,
f
);
fwrite
(
&
databyte
,
1
,
1
,
f
);
}
...
...
@@ -240,7 +266,7 @@ void stbiw__write_run_data(FILE *f, int length, unsigned char databyte)
void
stbiw__write_dump_data
(
FILE
*
f
,
int
length
,
unsigned
char
*
data
)
{
unsigned
char
lengthbyte
=
(
unsigned
char
)(
length
&
0xff
);
assert
(
length
<=
128
);
// inconsistent with spec but consistent with official code
STBI_ASSERT
(
length
<=
128
);
// inconsistent with spec but consistent with official code
fwrite
(
&
lengthbyte
,
1
,
1
,
f
);
fwrite
(
data
,
length
,
1
,
f
);
}
...
...
@@ -343,12 +369,12 @@ int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *da
f
=
fopen
(
filename
,
"wb"
);
if
(
f
)
{
/* Each component is stored separately. Allocate scratch space for full output scanline. */
unsigned
char
*
scratch
=
(
unsigned
char
*
)
malloc
(
x
*
4
);
unsigned
char
*
scratch
=
(
unsigned
char
*
)
STBI_MALLOC
(
x
*
4
);
fprintf
(
f
,
"#?RADIANCE
\n
# Written by stb_image_write.h
\n
FORMAT=32-bit_rle_rgbe
\n
"
);
fprintf
(
f
,
"EXPOSURE= 1.0000000000000
\n\n
-Y %d +X %d
\n
"
,
y
,
x
);
for
(
i
=
0
;
i
<
y
;
i
++
)
stbiw__write_hdr_scanline
(
f
,
x
,
comp
,
scratch
,
data
+
comp
*
i
*
x
);
free
(
scratch
);
STBI_FREE
(
scratch
);
fclose
(
f
);
}
return
f
!=
NULL
;
...
...
@@ -368,13 +394,13 @@ int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *da
#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v))
#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0)
#define stbiw__sbfree(a) ((a) ?
free
(stbiw__sbraw(a)),0 : 0)
#define stbiw__sbfree(a) ((a) ?
STBI_FREE
(stbiw__sbraw(a)),0 : 0)
static
void
*
stbiw__sbgrowf
(
void
**
arr
,
int
increment
,
int
itemsize
)
{
int
m
=
*
arr
?
2
*
stbiw__sbm
(
*
arr
)
+
increment
:
increment
+
1
;
void
*
p
=
realloc
(
*
arr
?
stbiw__sbraw
(
*
arr
)
:
0
,
itemsize
*
m
+
sizeof
(
int
)
*
2
);
assert
(
p
);
void
*
p
=
STBI_REALLOC
(
*
arr
?
stbiw__sbraw
(
*
arr
)
:
0
,
itemsize
*
m
+
sizeof
(
int
)
*
2
);
STBI_ASSERT
(
p
);
if
(
p
)
{
if
(
!*
arr
)
((
int
*
)
p
)[
1
]
=
0
;
*
arr
=
(
void
*
)
((
int
*
)
p
+
2
);
...
...
@@ -472,7 +498,7 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l
}
// when hash table entry is too long, delete half the entries
if
(
hash_table
[
h
]
&&
stbiw__sbn
(
hash_table
[
h
])
==
2
*
quality
)
{
memcpy
(
hash_table
[
h
],
hash_table
[
h
]
+
quality
,
sizeof
(
hash_table
[
h
][
0
])
*
quality
);
STBI_MEMCPY
(
hash_table
[
h
],
hash_table
[
h
]
+
quality
,
sizeof
(
hash_table
[
h
][
0
])
*
quality
);
stbiw__sbn
(
hash_table
[
h
])
=
quality
;
}
stbiw__sbpush
(
hash_table
[
h
],
data
+
i
);
...
...
@@ -495,7 +521,7 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l
if
(
bestloc
)
{
int
d
=
(
int
)
(
data
+
i
-
bestloc
);
// distance back
assert
(
d
<=
32767
&&
best
<=
258
);
STBI_ASSERT
(
d
<=
32767
&&
best
<=
258
);
for
(
j
=
0
;
best
>
lengthc
[
j
+
1
]
-
1
;
++
j
);
stbiw__zlib_huff
(
j
+
257
);
if
(
lengtheb
[
j
])
stbiw__zlib_add
(
best
-
lengthc
[
j
],
lengtheb
[
j
]);
...
...
@@ -536,7 +562,7 @@ unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_l
}
*
out_len
=
stbiw__sbn
(
out
);
// make returned pointer freeable
memmove
(
stbiw__sbraw
(
out
),
out
,
*
out_len
);
STBI_MEMMOVE
(
stbiw__sbraw
(
out
),
out
,
*
out_len
);
return
(
unsigned
char
*
)
stbiw__sbraw
(
out
);
}
...
...
@@ -583,8 +609,8 @@ unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, in
if
(
stride_bytes
==
0
)
stride_bytes
=
x
*
n
;
filt
=
(
unsigned
char
*
)
malloc
((
x
*
n
+
1
)
*
y
);
if
(
!
filt
)
return
0
;
line_buffer
=
(
signed
char
*
)
malloc
(
x
*
n
);
if
(
!
line_buffer
)
{
free
(
filt
);
return
0
;
}
filt
=
(
unsigned
char
*
)
STBI_MALLOC
((
x
*
n
+
1
)
*
y
);
if
(
!
filt
)
return
0
;
line_buffer
=
(
signed
char
*
)
STBI_MALLOC
(
x
*
n
);
if
(
!
line_buffer
)
{
STBI_FREE
(
filt
);
return
0
;
}
for
(
j
=
0
;
j
<
y
;
++
j
)
{
static
int
mapping
[]
=
{
0
,
1
,
2
,
3
,
4
};
static
int
firstmap
[]
=
{
0
,
1
,
0
,
5
,
6
};
...
...
@@ -623,20 +649,20 @@ unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, in
}
// when we get here, best contains the filter type, and line_buffer contains the data
filt
[
j
*
(
x
*
n
+
1
)]
=
(
unsigned
char
)
best
;
memcpy
(
filt
+
j
*
(
x
*
n
+
1
)
+
1
,
line_buffer
,
x
*
n
);
STBI_MEMCPY
(
filt
+
j
*
(
x
*
n
+
1
)
+
1
,
line_buffer
,
x
*
n
);
}
free
(
line_buffer
);
STBI_FREE
(
line_buffer
);
zlib
=
stbi_zlib_compress
(
filt
,
y
*
(
x
*
n
+
1
),
&
zlen
,
8
);
// increase 8 to get smaller but use more memory
free
(
filt
);
STBI_FREE
(
filt
);
if
(
!
zlib
)
return
0
;
// each tag requires 12 bytes of overhead
out
=
(
unsigned
char
*
)
malloc
(
8
+
12
+
13
+
12
+
zlen
+
12
);
out
=
(
unsigned
char
*
)
STBI_MALLOC
(
8
+
12
+
13
+
12
+
zlen
+
12
);
if
(
!
out
)
return
0
;
*
out_len
=
8
+
12
+
13
+
12
+
zlen
+
12
;
o
=
out
;
memcpy
(
o
,
sig
,
8
);
o
+=
8
;
STBI_MEMCPY
(
o
,
sig
,
8
);
o
+=
8
;
stbiw__wp32
(
o
,
13
);
// header length
stbiw__wptag
(
o
,
"IHDR"
);
stbiw__wp32
(
o
,
x
);
...
...
@@ -650,14 +676,14 @@ unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, in
stbiw__wp32
(
o
,
zlen
);
stbiw__wptag
(
o
,
"IDAT"
);
memcpy
(
o
,
zlib
,
zlen
);
o
+=
zlen
;
free
(
zlib
);
STBI_MEMCPY
(
o
,
zlib
,
zlen
);
o
+=
zlen
;
STBI_FREE
(
zlib
);
stbiw__wpcrc
(
&
o
,
zlen
);
stbiw__wp32
(
o
,
0
);
stbiw__wptag
(
o
,
"IEND"
);
stbiw__wpcrc
(
&
o
,
0
);
assert
(
o
==
out
+
*
out_len
);
STBI_ASSERT
(
o
==
out
+
*
out_len
);
return
out
;
}
...
...
@@ -669,16 +695,17 @@ int stbi_write_png(char const *filename, int x, int y, int comp, const void *dat
unsigned
char
*
png
=
stbi_write_png_to_mem
((
unsigned
char
*
)
data
,
stride_bytes
,
x
,
y
,
comp
,
&
len
);
if
(
!
png
)
return
0
;
f
=
fopen
(
filename
,
"wb"
);
if
(
!
f
)
{
free
(
png
);
return
0
;
}
if
(
!
f
)
{
STBI_FREE
(
png
);
return
0
;
}
fwrite
(
png
,
1
,
len
,
f
);
fclose
(
f
);
free
(
png
);
STBI_FREE
(
png
);
return
1
;
}
#endif // STB_IMAGE_WRITE_IMPLEMENTATION
/* Revision history
0.98 (2015-04-08)
added STBI_MALLOC, STBI_ASSERT etc
0.97 (2015-01-18)
fixed HDR asserts, rewrote HDR rle logic
0.96 (2015-01-17)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录