[Bf-blender-cvs] [bc5fa16] cycles-ptex-49: Add basic Ptex reading via OIIO to ImBuf
Nicholas Bishop
noreply at git.blender.org
Fri Feb 6 17:34:56 CET 2015
Commit: bc5fa16ddbfb82e281b297e3589d215fca491a64
Author: Nicholas Bishop
Date: Mon Jan 19 20:03:26 2015 +0100
Branches: cycles-ptex-49
https://developer.blender.org/rBbc5fa16ddbfb82e281b297e3589d215fca491a64
Add basic Ptex reading via OIIO to ImBuf
===================================================================
M source/blender/imbuf/CMakeLists.txt
M source/blender/imbuf/IMB_imbuf.h
M source/blender/imbuf/IMB_imbuf_types.h
M source/blender/imbuf/SConscript
M source/blender/imbuf/intern/IMB_filetype.h
M source/blender/imbuf/intern/allocimbuf.c
M source/blender/imbuf/intern/filetype.c
A source/blender/imbuf/intern/imb_ptex.c
M source/blender/imbuf/intern/util.c
===================================================================
diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt
index e897791..187c711 100644
--- a/source/blender/imbuf/CMakeLists.txt
+++ b/source/blender/imbuf/CMakeLists.txt
@@ -30,6 +30,7 @@ set(INC
../blenloader
../makesdna
../makesrna
+ ../../../extern/ptex
../../../intern/guardedalloc
../../../intern/memutil
)
@@ -50,6 +51,7 @@ set(SRC
intern/filetype.c
intern/filter.c
intern/imageprocess.c
+ intern/imb_ptex.c
intern/indexer.c
intern/indexer_dv.c
intern/iris.c
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 17bb873..5dce318 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -549,5 +549,24 @@ void IMB_processor_apply_threaded(int buffer_lines, int handle_size, void *init_
void IMB_ffmpeg_init(void);
const char *IMB_ffmpeg_last_error(void);
+/* ptex */
+
+struct BPXImageBuf;
+struct PtexPackedLayout;
+
+/* Create a new BPXImageBuf that wraps an ImBuf
+ *
+ * The BPXImageBuf will have access to the original ImBuf memory
+ * rather than allocating a copy.
+ *
+ * Return NULL on failure.
+ *
+ * The result should be freed with BPX_image_buf_free() when no longer
+ * needed. */
+struct BPXImageBuf *IMB_imbuf_as_bpx_image_buf(struct ImBuf *ibuf);
+
+/* Create an ImBuf from a finalized PtexPackedLayout */
+struct ImBuf *IMB_alloc_from_ptex_layout(const struct PtexPackedLayout *layout);
+
#endif
diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h
index 867c4a8..80d79ac 100644
--- a/source/blender/imbuf/IMB_imbuf_types.h
+++ b/source/blender/imbuf/IMB_imbuf_types.h
@@ -57,6 +57,14 @@ typedef struct DDSData {
unsigned int size; /* The size of the compressed data */
} DDSData;
+// TODO
+typedef struct {
+ int x;
+ int y;
+ int width;
+ int height;
+} ImPtexRegion;
+
/**
* \ingroup imbuf
* This is the abstraction of an image. ImBuf is the basic type used for all
@@ -136,6 +144,10 @@ typedef struct ImBuf {
/* information for compressed textures */
struct DDSData dds_data;
+
+ /* TODO */
+ ImPtexRegion *ptex_regions; /* array */
+ int num_ptex_regions;
} ImBuf;
/* Moved from BKE_bmfont_types.h because it is a userflag bit mask. */
@@ -183,6 +195,11 @@ typedef struct ImBuf {
#define PSD (1 << 31)
#endif
+/* TODO(nicholasbishop): this is a really confusing list of defines */
+//#ifdef WITH_PTEX
+#define IMB_PTEX (1 << 29)
+//#endif
+
#define PNG (1 << 30)
#define TGA (1 << 28)
#define JPG (1 << 27)
diff --git a/source/blender/imbuf/SConscript b/source/blender/imbuf/SConscript
index ccee3eb..1fb22c4 100644
--- a/source/blender/imbuf/SConscript
+++ b/source/blender/imbuf/SConscript
@@ -36,6 +36,7 @@ incs = [
'#/intern/ffmpeg',
'#/intern/guardedalloc',
'#/intern/memutil',
+ '#/extern/ptex',
'../avi',
'../blenkernel',
'../blenlib',
diff --git a/source/blender/imbuf/intern/IMB_filetype.h b/source/blender/imbuf/intern/IMB_filetype.h
index 9327c15..ba8bda0 100644
--- a/source/blender/imbuf/intern/IMB_filetype.h
+++ b/source/blender/imbuf/intern/IMB_filetype.h
@@ -121,5 +121,13 @@ void imb_loadtiletiff(struct ImBuf *ibuf, unsigned char *mem, size_t size,
int tx, int ty, unsigned int *rect);
int imb_savetiff(struct ImBuf *ibuf, const char *name, int flags);
+/* ptex */
+void imb_init_ptex(void);
+void imb_exit_ptex(void);
+int imb_is_a_ptex(unsigned char *buf);
+int imb_is_a_ptex_filepath(const char *name);
+struct ImBuf *imb_load_ptex_filepath(const char *name, int flags,
+ char colorspace[IM_MAX_SPACE]);
+
#endif /* __IMB_FILETYPE_H__ */
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index 556c4be..9703966 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -190,6 +190,9 @@ void IMB_freeImBuf(ImBuf *ibuf)
if (ibuf->dds_data.data != NULL) {
free(ibuf->dds_data.data); /* dds_data.data is allocated by DirectDrawSurface::readData(), so don't use MEM_freeN! */
}
+ if (ibuf->ptex_regions) {
+ MEM_freeN(ibuf->ptex_regions);
+ }
MEM_freeN(ibuf);
}
}
@@ -469,6 +472,10 @@ ImBuf *IMB_dupImBuf(ImBuf *ibuf1)
tbuf.mipmap[a] = NULL;
tbuf.dds_data.data = NULL;
+ if (ibuf1->ptex_regions) {
+ tbuf.ptex_regions = MEM_dupallocN(ibuf1->ptex_regions);
+ }
+
/* set malloc flag */
tbuf.mall = ibuf2->mall;
tbuf.c_handle = NULL;
diff --git a/source/blender/imbuf/intern/filetype.c b/source/blender/imbuf/intern/filetype.c
index c6e358d..52fd512 100644
--- a/source/blender/imbuf/intern/filetype.c
+++ b/source/blender/imbuf/intern/filetype.c
@@ -89,6 +89,13 @@ ImFileType IMB_FILE_TYPES[] = {
#ifdef WITH_OPENIMAGEIO
{NULL, NULL, NULL, imb_is_a_photoshop, imb_ftype_default, NULL, imb_load_photoshop, NULL, NULL, IM_FTYPE_FLOAT, PSD, COLOR_ROLE_DEFAULT_FLOAT},
#endif
+ /* TODO */
+ //#ifdef WITH_PTEX
+ {imb_init_ptex, imb_exit_ptex, imb_is_a_ptex, imb_is_a_ptex_filepath,
+ imb_ftype_default, NULL /* load */, imb_load_ptex_filepath,
+ NULL /* save */, NULL /* load_tile */, IM_FTYPE_FLOAT, IMB_PTEX,
+ COLOR_ROLE_DEFAULT_BYTE},
+ //#endif
{NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0}
};
diff --git a/source/blender/imbuf/intern/imb_ptex.c b/source/blender/imbuf/intern/imb_ptex.c
new file mode 100644
index 0000000..caca591
--- /dev/null
+++ b/source/blender/imbuf/intern/imb_ptex.c
@@ -0,0 +1,114 @@
+#include "BLI_utildefines.h"
+
+#include "imbuf.h"
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+#include "IMB_filetype.h"
+
+#include "BLI_string.h"
+#include "MEM_guardedalloc.h"
+
+#include "BPX_pack.h"
+
+/* TODO(nicholasbishop): color space stuff */
+
+void imb_init_ptex(void)
+{
+ // TODO
+}
+
+void imb_exit_ptex(void)
+{
+ // TODO
+}
+
+int imb_is_a_ptex(unsigned char *buf)
+{
+ unsigned char magic[4] = "Ptex";
+ return memcmp(buf, magic, sizeof(magic)) == 0;
+}
+
+int imb_is_a_ptex_filepath(const char *name)
+{
+ return BLI_str_endswith(name, ".ptx");
+}
+
+ImBuf *IMB_alloc_from_ptex_layout(const struct PtexPackedLayout *layout)
+{
+ ImBuf *ibuf = IMB_allocImBuf(ptex_packed_layout_width(layout),
+ ptex_packed_layout_height(layout),
+ /* TODO? */
+ 32,
+ /* TODO */
+ IB_rect);
+ if (ibuf) {
+ int i;
+
+ /* Copy layout items into ImBuf.ptex_regions */
+ ibuf->num_ptex_regions = BPX_packed_layout_num_regions(layout);
+ ibuf->ptex_regions = MEM_mallocN(sizeof(*ibuf->ptex_regions) *
+ ibuf->num_ptex_regions,
+ "ImBuf ptex_regions");
+
+ for (i = 0; i < ibuf->num_ptex_regions; i++) {
+ ImPtexRegion *dst_region = &ibuf->ptex_regions[i];
+ if (!ptex_packed_layout_item(layout, i, &dst_region->x,
+ &dst_region->y, &dst_region->width,
+ &dst_region->height))
+ {
+ /* Error */
+ IMB_freeImBuf(ibuf);
+ return NULL;
+ }
+ }
+ }
+
+ return ibuf;
+}
+
+static BPXImageBuf *imb_alloc_from_ptex_layout_cb(const struct PtexPackedLayout *layout,
+ void *vcontext)
+{
+ ImBuf **ibuf = vcontext;
+ (*ibuf) = IMB_alloc_from_ptex_layout(layout);
+ return IMB_imbuf_as_bpx_image_buf(*ibuf);
+}
+
+BPXImageBuf *IMB_imbuf_as_bpx_image_buf(ImBuf *ibuf)
+{
+ /* TODO: channels and data type */
+ const int num_channels = 4;
+ return BPX_image_buf_wrap(ibuf->x, ibuf->y, num_channels,
+ BPX_TYPE_DESC_UINT8, ibuf->rect);
+}
+
+struct ImBuf *imb_load_ptex_filepath(const char *path,
+ const int UNUSED(flags),
+ char colorspace[IM_MAX_SPACE])
+{
+ ImBuf *ibuf = NULL;
+
+ if (imb_is_a_ptex_filepath(path)) {
+ BPXImageInput *bpx_src = BPX_image_input_from_filepath(path);
+
+ if (bpx_src) {
+ BPXImageBuf *dst;
+ dst = BPX_image_buf_ptex_pack(bpx_src,
+ imb_alloc_from_ptex_layout_cb,
+ &ibuf);
+ if (!dst) {
+ if (ibuf) {
+ IMB_freeImBuf(ibuf);
+ }
+ return NULL;
+ }
+
+ BPX_image_buf_free(dst);
+
+ // TODO
+ IMB_rectfill_alpha(ibuf, 1);
+ }
+ }
+
+ return ibuf;
+}
diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c
index 32100aa..848d572 100644
--- a/source/blender/imbuf/intern/util.c
+++ b/source/blender/imbuf/intern/util.c
@@ -104,6 +104,8 @@ const char *imb_ext_image_filepath_only[] = {
#ifdef WITH_OPENIMAGEIO
".psd", ".pdd", ".psb",
#endif
+ // TODO
+ ".ptx",
NULL
};
More information about the Bf-blender-cvs
mailing list