Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2006-01-09 03:40:35 +0300
committerTon Roosendaal <ton@blender.org>2006-01-09 03:40:35 +0300
commit014aa7261e29810b35b3d65c759f9d255bf8a277 (patch)
tree360325f8db9431bdd187c0f0e7f7c40dcaa3a073 /source/blender/imbuf/intern/filter.c
parent104ab9b103ab30ca87ccb9e739a58863fc29d3bf (diff)
Orange branch: OpenEXR finally in Blender!
Credits go to Gernot Ziegler, who originally coded EXR support, and to Austin Benesh for bringing it further. Kent Mein provided a lot of code for integrating float buffers in Blender imbuf and ImBuf API cleanup, and provided Make and Scons and static linking. At this moment; the EXR libraries are a *dependency*, so you cannot get the Orange branch compiled without having OpenEXR installed. Get the (precompiled or sources) stuff from www.openexr.com. Current default is that the headers and lib resides in /user/local/ Several changes/additions/fixes were added: - EXR code only supported 'half' format (16 bits per channel). I've added float writing, but for reading it I need tomorrow. :) - Quite some clumsy copying of data happened in EXR code. - cleaned up the api calls already a bit, preparing for more advanced support - Zbuffers were saved 16 bits, now 32 bits - automatic adding of .exr extensions went wrong Imbuf: - added proper imbuf->flags and imbuf->mall support for float buffers, it was created for *each* imbuf. :) - found bugs for float buffers in scaling and flipping. Code there will need more checks still - imbuf also needs to be verified to behave properly when no 32 bits rect exists (for saving for example) TODO: - support internal float images for textures, backbuf, AO probes, and display in Image window Hope this commit won't screwup syncing with bf-blender... :/
Diffstat (limited to 'source/blender/imbuf/intern/filter.c')
-rw-r--r--source/blender/imbuf/intern/filter.c74
1 files changed, 72 insertions, 2 deletions
diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c
index 8aea42c7008..e51f85ab2d6 100644
--- a/source/blender/imbuf/intern/filter.c
+++ b/source/blender/imbuf/intern/filter.c
@@ -65,6 +65,26 @@ static void filtrow(unsigned char *point, int x)
}
}
+static void filtrowf(float *point, int x)
+{
+ float c1,c2,c3,error;
+
+ if (x>1){
+ c1 = c2 = *point;
+ error = 2;
+ for(x--;x>0;x--){
+ c3 = point[4];
+ c1 += (c2 * 2) + c3 + error;
+ *point = c1 / 4.0;
+ point += 4;
+ c1=c2;
+ c2=c3;
+ }
+ *point = (c1 + (c2 * 2) + c2 + error) / 4.0;
+ }
+}
+
+
static void filtcolum(unsigned char *point, int y, int skip)
{
@@ -89,13 +109,38 @@ static void filtcolum(unsigned char *point, int y, int skip)
}
}
+static void filtcolumf(float *point, int y, int skip)
+{
+ float c1,c2,c3,error, *point2;
+
+ if (y>1){
+ c1 = c2 = *point;
+ point2 = point;
+ error = 2;
+ for(y--;y>0;y--){
+ point2 += skip;
+ c3 = *point2;
+ c1 += (c2 * 2) + c3 +error;
+ *point = c1 / 4;
+ point=point2;
+ c1=c2;
+ c2=c3;
+ }
+ *point = (c1 + (c2 * 2) + c2 + error) / 4;
+ }
+}
void IMB_filtery(struct ImBuf *ibuf)
{
unsigned char *point;
- int x, y, skip;
+ float *pointf;
+ int x, y, skip, do_float = 0;
point = (unsigned char *)ibuf->rect;
+ pointf = ibuf->rect_float;
+
+ if (ibuf->rect_float != NULL) do_float = 1;
+
x = ibuf->x;
y = ibuf->y;
skip = x<<2;
@@ -109,6 +154,16 @@ void IMB_filtery(struct ImBuf *ibuf)
point++;
filtcolum(point,y,skip);
point++;
+ if (do_float) {
+ if (ibuf->depth > 24) filtcolumf(pointf,y,skip);
+ pointf++;
+ filtcolumf(pointf,y,skip);
+ pointf++;
+ filtcolumf(pointf,y,skip);
+ pointf++;
+ filtcolumf(pointf,y,skip);
+ point++;
+ }
}
}
@@ -116,9 +171,14 @@ void IMB_filtery(struct ImBuf *ibuf)
void imb_filterx(struct ImBuf *ibuf)
{
unsigned char *point;
- int x, y, skip;
+ float *pointf;
+ int x, y, skip, do_float =0;
point = (unsigned char *)ibuf->rect;
+ pointf = ibuf->rect_float;
+
+ if (ibuf->rect_float != NULL) do_float = 1;
+
x = ibuf->x;
y = ibuf->y;
skip = (x<<2) - 3;
@@ -132,6 +192,16 @@ void imb_filterx(struct ImBuf *ibuf)
point++;
filtrow(point,x);
point+=skip;
+ if (do_float) {
+ if (ibuf->depth > 24) filtrowf(pointf,x);
+ pointf++;
+ filtrowf(pointf,x);
+ pointf++;
+ filtrowf(pointf,x);
+ pointf++;
+ filtrowf(pointf,x);
+ pointf+=skip;
+ }
}
}