Added IMB_gamwarp and IMB_interlace (and the interlace and gamwarp wrappers
authorKent Mein <mein@cs.umn.edu>
Wed, 30 Apr 2003 18:38:50 +0000 (18:38 +0000)
committerKent Mein <mein@cs.umn.edu>
Wed, 30 Apr 2003 18:38:50 +0000 (18:38 +0000)
for the plugins)

Kent

source/blender/blenpluginapi/intern/pluginapi.c
source/blender/imbuf/IMB_imbuf.h
source/blender/imbuf/intern/divers.c

index 889c50fe0dc7fda423c17c094899866b3c7293b4..c9cbc72ca6048f1dc4a8f7a893bb07c33f915b4a 100644 (file)
@@ -234,6 +234,16 @@ struct ImBuf *scalefastfieldImBuf(struct ImBuf *ib,
        /* Extra ones that some NaN (read Ton) plugins use,
         * even though they aren't in the header
         */
+
+void interlace(struct ImBuf *ibuf)
+{
+       IMB_interlace(ibuf);
+}
+
+void gamwarp(struct ImBuf *ibuf, double gamma)
+{
+       IMB_gamwarp(ibuf,gamma);
+}
         
 void de_interlace(struct ImBuf *ib)
 {
@@ -341,5 +351,7 @@ int pluginapi_force_ref(void)
                (int) turbulence +
                (int) turbulence1 +
                (int) de_interlace +
+               (int) interlace +
+               (int) gamwarp +
                (int) rectop;
 }
index 8c97e9b212027c0aeba16ecf602e419336aa3f8a..461f68423c5b7984f4e6b7e1c7ae0c9c3d4b6336 100644 (file)
@@ -344,6 +344,8 @@ int imb_get_anim_type(char * name);
  * @attention Defined in divers.c
  */
 void IMB_de_interlace(struct ImBuf *ibuf);
+void IMB_interlace(struct ImBuf *ibuf);
+void IMB_gamwarp(struct ImBuf *ibuf, double gamma);
 
 /**
  * Change the ordering of the colour bytes pointed to by rect from
index 3b2ae27577cd540afb595ae70d17d97971a37c99..70958b08c213d26a0ba8a6c356874ee9ea85a3a2 100644 (file)
@@ -88,7 +88,6 @@ void imb_checkncols(struct ImBuf *ibuf)
 void IMB_de_interlace(struct ImBuf *ibuf)
 {
        struct ImBuf * tbuf1, * tbuf2;
-/*     extern rectcpy(); */
        
        if (ibuf == 0) return;
        if (ibuf->flags & IB_fields) return;
@@ -100,15 +99,10 @@ void IMB_de_interlace(struct ImBuf *ibuf)
                tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
                
                ibuf->x *= 2;   
-/* Functions need more args :( */
-/*             rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, rectcpy); */
-/*             rectop(tbuf2, ibuf, 0, 0, tbuf2->x, 0, 32767, 32767, rectcpy); */
                IMB_rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0);
                IMB_rectop(tbuf2, ibuf, 0, 0, tbuf2->x, 0, 32767, 32767, IMB_rectcpy, 0);
        
                ibuf->x /= 2;
-/*             rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, rectcpy); */
-/*             rectop(ibuf, tbuf2, 0, tbuf2->y, 0, 0, 32767, 32767, rectcpy); */
                IMB_rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 0);
                IMB_rectop(ibuf, tbuf2, 0, tbuf2->y, 0, 0, 32767, 32767, IMB_rectcpy, 0);
                
@@ -118,3 +112,57 @@ void IMB_de_interlace(struct ImBuf *ibuf)
        ibuf->y /= 2;
 }
 
+void IMB_interlace(struct ImBuf *ibuf)
+{
+        struct ImBuf * tbuf1, * tbuf2;
+
+        if (ibuf == 0) return;
+        ibuf->flags &= ~IB_fields;
+
+        ibuf->y *= 2;
+
+        if (ibuf->rect) {
+                /* make copies */
+                tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
+                tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
+
+                IMB_rectop(tbuf1, ibuf, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy, 
+                       0);
+                IMB_rectop(tbuf2, ibuf, 0, 0, 0, tbuf2->y, 32767, 32767,
+                       IMB_rectcpy,0);
+
+                ibuf->x *= 2;
+                IMB_rectop(ibuf, tbuf1, 0, 0, 0, 0, 32767, 32767, IMB_rectcpy,
+                       0);
+                IMB_rectop(ibuf, tbuf2, tbuf2->x, 0, 0, 0, 32767, 32767,
+                       IMB_rectcpy,0);
+                ibuf->x /= 2;
+
+                IMB_freeImBuf(tbuf1);
+                IMB_freeImBuf(tbuf2);
+        }
+}
+
+
+void IMB_gamwarp(struct ImBuf *ibuf, double gamma)
+{
+        uchar gam[256];
+        int i;
+        uchar *rect;
+
+        if (ibuf == 0) return;
+        if (ibuf->rect == 0) return;
+        if (gamma == 1.0) return;
+
+        gamma = 1.0 / gamma;
+        for (i = 255 ; i >= 0 ; i--) gam[i] = (255.0 * pow(i / 255.0 ,
+        gamma))  + 0.5;
+
+        rect = (uchar *) ibuf->rect;
+        for (i = ibuf->x * ibuf->y ; i>0 ; i--){
+                rect ++;
+                *rect ++ = gam[*rect];
+                *rect ++ = gam[*rect];
+                *rect ++ = gam[*rect];
+        }
+}