]> bicyclesonthemoon.info Git - ott/enhance/blobdiff - core.c
Fully working online interface; for now bluenh only.
[ott/enhance] / core.c
diff --git a/core.c b/core.c
index f79c6ad140e82f6c8a2892497c4daf1c28b73091..0a3d1c41da19d3670bb4bd1a238113063a1f8384 100644 (file)
--- a/core.c
+++ b/core.c
@@ -1,7 +1,7 @@
 /*
 core.c
 The tool with multiple enhancements and manipulations of pictures
-26.11.2022
+03.12.2022
 
 Copyright (C) 2014, 2015, 2022  Balthasar SzczepaƄski
 
@@ -89,7 +89,7 @@ int get_data (uint_fast16_t id, void **data, ILuint frame)
        return 0;
 }
 
-int get_palette (uint_fast16_t id, void **palette, ILuint frame)
+int get_palette (uint_fast16_t id, void *palette, ILuint frame)
 {
        if (id >= n_pictures)
                return EINVAL;
@@ -101,7 +101,7 @@ int get_palette (uint_fast16_t id, void **palette, ILuint frame)
        ilActiveImage(frame);
        if (ilGetInteger(IL_IMAGE_FORMAT) != IL_COLOUR_INDEX)
                return EINVAL;
-       *palette = ilGetPalette();
+       *((void **)palette) = ilGetPalette();
        return 0;
 }
 
@@ -201,7 +201,7 @@ int reserve_pictures (uint_fast16_t n)
 
 void get_flags (struct IL_full_info *info, FLAG_TYPE *flags)
 {
-       *flags &= ~(HAS_ALPHA | IS_GRAY | IS_INDEXED | IS_MULTIPLE | IS_OVER_8BIT);
+       *flags &= ~(HAS_ALPHA | IS_GRAY | IS_INDEXED | IS_MULTIPLE | IS_OVER_8BIT | EFF_ALPHA | EFF_GRAY | EFF_INDEXED);
        
        if (info->num_images > 0)
                *flags |= IS_MULTIPLE;
@@ -212,7 +212,7 @@ void get_flags (struct IL_full_info *info, FLAG_TYPE *flags)
        switch (info->image_format)
        {
        case IL_COLOUR_INDEX:
-               *flags |= IS_INDEXED;
+               *flags |= IS_INDEXED | EFF_INDEXED;
                switch (info->palette_type)
                {
                case IL_PAL_BGR32:
@@ -221,7 +221,7 @@ void get_flags (struct IL_full_info *info, FLAG_TYPE *flags)
                        break;
                case IL_PAL_BGRA32:
                case IL_PAL_RGBA32:
-                       *flags |= HAS_ALPHA;
+                       *flags |= HAS_ALPHA | EFF_ALPHA;
                        break;
                case IL_PAL_RGB24:
                case IL_PAL_BGR24:
@@ -230,13 +230,13 @@ void get_flags (struct IL_full_info *info, FLAG_TYPE *flags)
                }
                break;
        case IL_LUMINANCE_ALPHA:
-               *flags |= HAS_ALPHA;
+               *flags |= HAS_ALPHA | EFF_ALPHA;
        case IL_LUMINANCE:
-               *flags |= IS_GRAY;
+               *flags |= IS_GRAY | EFF_GRAY;
                break;
        case IL_RGBA:
        case IL_BGRA:
-               *flags |= HAS_ALPHA;
+               *flags |= HAS_ALPHA | EFF_ALPHA;
        case IL_RGB:
        case IL_BGR:
        default:
@@ -514,6 +514,21 @@ int load_picture (uint_fast16_t id, char *path, struct IL_full_info *info, FLAG_
        return convert_picture(id, info, flags);
 }
 
+int load_picture_mem (uint_fast16_t id, const void *address, ILuint size, struct IL_full_info *info, FLAG_TYPE *flags)
+{
+       if (id >= n_pictures)
+               return EINVAL;
+       
+       // if(!(picture[id].open))
+               create_picture(id);
+       
+       ilBindImage(picture[id].handle);
+       if (!ilLoadL(IL_TYPE_UNKNOWN, address, size))
+               return EIO;
+       
+       return convert_picture(id, info, flags);
+}
+
 int build_picture (uint_fast16_t id, ILint width, ILint height, ILint frames, struct IL_full_info *info, FLAG_TYPE *flags)
 {
        struct IL_full_info reference_info;
@@ -702,6 +717,24 @@ int perform_action_1picture (
        );
 }
 
+int perform_action_1picture_1pixel (
+       uint_fast16_t id,
+       ILint x, ILint y, ILint f,
+       ACTION_F *function,
+       FLAG_TYPE flags,
+       void *data
+)
+{
+       return perform_action_1picture (
+               id,
+               x, y, f,
+               1, 1, 1,
+               function,
+               flags | IN_WINDOW,
+               data
+       );
+}
+
 int perform_action (
        uint_fast16_t n,
        uint_fast16_t *id,
@@ -817,7 +850,7 @@ int perform_action (
                        if (r!=0)
                                break;
                        
-                       p[i].flags &= ~(IS_GRAY|IS_INDEXED|IS_OVER_8BIT|IS_PALETTE_ONLY);
+                       p[i].flags &= ~(HAS_ALPHA|IS_GRAY|IS_INDEXED|IS_OVER_8BIT|IS_PALETTE_ONLY|EFF_ALPHA|EFF_GRAY|EFF_INDEXED);
                        if (palette_only)
                                p[i].flags |= IS_PALETTE_ONLY;
                        
@@ -837,7 +870,7 @@ int perform_action (
                        switch (p[i].info.image_format)
                        {
                        case IL_COLOUR_INDEX:
-                               p[i].flags |= IS_INDEXED;
+                               p[i].flags |= IS_INDEXED | EFF_INDEXED;
                                r = get_palette(p[i].id, &(p[i].palette),  p[i].f_pict);
                                if (r!=0)
                                        break;
@@ -848,7 +881,7 @@ int perform_action (
                                        p[i].flags |= IS_OVER_8BIT;
                                        break;
                                case IL_PAL_BGRA32:
-                                       p[i].flags |= HAS_ALPHA;
+                                       p[i].flags |= HAS_ALPHA | EFF_ALPHA;
                                        p[i].alpha_offset = 3;
                                case IL_PAL_BGR24:
                                        p[i].red_offset = 2;
@@ -856,7 +889,7 @@ int perform_action (
                                        p[i].blue_offset = 0;
                                        break;
                                case IL_PAL_RGBA32:
-                                       p[i].flags |= HAS_ALPHA;
+                                       p[i].flags |= HAS_ALPHA | EFF_ALPHA;
                                        p[i].alpha_offset = 3;
                                case IL_PAL_RGB24:
                                default:
@@ -867,14 +900,14 @@ int perform_action (
                                }
                                break;
                        case IL_LUMINANCE_ALPHA:
-                               p[i].flags |= HAS_ALPHA;
+                               p[i].flags |= HAS_ALPHA | EFF_ALPHA;
                                p[i].alpha_offset = 1 * p[i].info.image_bpc;
                        case IL_LUMINANCE:
-                               p[i].flags |= IS_GRAY;
+                               p[i].flags |= IS_GRAY | EFF_GRAY;
                                p[i].value_offset = 0 * p[i].info.image_bpc;
                                break;
                        case IL_BGRA:
-                               p[i].flags |= HAS_ALPHA;
+                               p[i].flags |= HAS_ALPHA | EFF_ALPHA;
                                p[i].alpha_offset = 3 * p[i].info.image_bpc;
                        case IL_BGR:
                                p[i].red_offset   = 2 * p[i].info.image_bpc;
@@ -882,7 +915,7 @@ int perform_action (
                                p[i].blue_offset  = 0 * p[i].info.image_bpc;
                                break;
                        case IL_RGBA:
-                               p[i].flags |= HAS_ALPHA;
+                               p[i].flags |= HAS_ALPHA | EFF_ALPHA;
                                p[i].alpha_offset = 3 * p[i].info.image_bpc;
                        case IL_RGB:
                        default:
@@ -893,6 +926,17 @@ int perform_action (
                        }
                        if (p[i].info.image_bpc > 1)
                                p[i].flags |= IS_OVER_8BIT;
+                       
+                       if ((p[i].flags & IS_INDEXED) && (p[i].flags & CANNOT_BE_INDEXED))
+                               p[i].flags &= ~EFF_INDEXED;
+                       if ((p[i].flags & IS_GRAY) && (p[i].flags & CANNOT_BE_GRAY))
+                               p[i].flags &= ~EFF_GRAY;
+                       else if (!(p[i].flags & IS_GRAY) && (p[i].flags & MUST_BE_GRAY))
+                               p[i].flags |= EFF_GRAY;
+                       if ((!(p[i].flags & HAS_ALPHA)) && (p[i].flags & MUST_HAVE_ALPHA))
+                               p[i].flags |= EFF_ALPHA;
+                       else if ((p[i].flags & HAS_ALPHA) && (p[i].flags & CANNOT_HAVE_ALPHA))
+                               p[i].flags &= ~EFF_ALPHA;
                }
                if (!skip_frame)
                {
@@ -1303,10 +1347,8 @@ int perform_action_palette_mix (
                        {
                        case IL_PAL_BGR32:
                        case IL_PAL_RGB32:
-                               p[i].flags |= IS_OVER_8BIT;
                                break;
                        case IL_PAL_BGRA32:
-                               p[i].flags |= HAS_ALPHA;
                                p[i].alpha_offset = 3;
                        case IL_PAL_BGR24:
                                p[i].red_offset = 2;
@@ -1314,7 +1356,6 @@ int perform_action_palette_mix (
                                p[i].blue_offset = 0;
                                break;
                        case IL_PAL_RGBA32:
-                               p[i].flags |= HAS_ALPHA;
                                p[i].alpha_offset = 3;
                        case IL_PAL_RGB24:
                        default:
@@ -1323,6 +1364,15 @@ int perform_action_palette_mix (
                                p[i].blue_offset = 2;
                                break;
                        }
+                       
+                       if ((p[i].flags & IS_GRAY) && (p[i].flags & CANNOT_BE_GRAY))
+                               p[i].flags &= ~EFF_GRAY;
+                       else if (!(p[i].flags & IS_GRAY) && (p[i].flags & MUST_BE_GRAY))
+                               p[i].flags |= EFF_GRAY;
+                       if ((!(p[i].flags & HAS_ALPHA)) && (p[i].flags & MUST_HAVE_ALPHA))
+                               p[i].flags |= EFF_ALPHA;
+                       else if ((p[i].flags & HAS_ALPHA) && (p[i].flags & CANNOT_HAVE_ALPHA))
+                               p[i].flags &= ~EFF_ALPHA;
                }
                if (!skip_frame)
                {
@@ -1415,6 +1465,165 @@ ILubyte downscale_value (ILuint x, ILint bytes)
        return (ILubyte)(x >> (8 * (bytes-1)));
 }
 
+int copy_pixels (ILuint n, struct PixelInfo *p, void *data)
+{
+       ILuint max = *((ILuint *)data);
+       
+       if (n < 2)
+               return EINVAL;
+       
+       if (p[0].flags & EFF_INDEXED)
+       {
+               if (!(p[1].flags & EFF_INDEXED))
+                       return EINVAL;
+               p[1].index = p[0].index;
+       }
+       else if (p[0].flags & EFF_ALPHA)
+       {
+               if (p[0].flags & EFF_GRAY)
+               {
+                       if (!(p[1].flags & EFF_GRAY))
+                               return EINVAL;
+                       p[1].value = copy_1p_alpha(p[0].value, p[1].value, p[0].alpha, max);
+               }
+               else
+               {
+                       if (p[1].flags & EFF_GRAY)
+                               return EINVAL;
+                       p[1].red   = copy_1p_alpha(p[0].red,   p[1].red,   p[0].alpha, max);
+                       p[1].green = copy_1p_alpha(p[0].green, p[1].green, p[0].alpha, max);
+                       p[1].blue  = copy_1p_alpha(p[0].blue,  p[1].blue,  p[0].alpha, max);
+               }
+               if (p[1].flags & EFF_ALPHA)
+                       p[1].alpha = copy_1p_alpha(max, p[1].alpha, p[0].alpha, max);
+       }
+       else
+       {
+               if (p[0].flags & EFF_GRAY)
+               {
+                       if (!(p[1].flags & EFF_GRAY))
+                               return EINVAL;
+                       p[1].value = p[0].value;
+               }
+               else
+               {
+                       if (p[1].flags & EFF_GRAY)
+                               return EINVAL;
+                       p[1].red   = p[0].red;
+                       p[1].green = p[0].green;
+                       p[1].blue  = p[0].blue;
+               }
+               if (p[1].flags & EFF_ALPHA)
+                       p[1].alpha = max;
+       }
+       
+       return 0;
+}
+
+int fill_color (ILuint n, struct PixelInfo *p, void *data)
+{
+       struct ColorInfo *d = data;
+       
+       if (p->flags & EFF_INDEXED)
+       {
+               p->index = d->index;
+       }
+       else 
+       {
+               if (p->flags & EFF_ALPHA)
+                       p->alpha = d->alpha;
+               if (p->flags & EFF_GRAY)
+                       p->value = d->value;
+               else
+               {
+                       p->red   = d->red;
+                       p->green = d->green;
+                       p->blue  = d->blue;
+               }
+       }
+       
+       return 0;
+}
+
+ILuint copy_1p_alpha (ILint64 src, ILint64 dst, ILint64 alpha, ILint64 max)
+{
+       ILint64 v = (src * alpha + dst * (max - alpha)) / max;
+       return (ILuint)v;
+}
+
+int palette_mix_index (ILuint n, struct PixelInfo *p, void *data)
+{
+       if (n < 3)
+               return EIO;
+       
+       p[2].index = p[0].index * p[1].info.palette_num_cols + p[1].index;
+       
+       return 0;
+}
+
+ILuint tsqrt(ILuint s)
+{
+       switch(s)
+       {
+       case 256:
+               return 16;
+       case 225:
+               return 15;
+       case 196:
+               return 14;
+       case 169:
+               return 13;
+       case 144:
+               return 12;
+       case 121:
+               return 11;
+       case 100:
+               return 10;
+       case 81:
+               return 9;
+       case 64:
+               return 8;
+       case 49:
+               return 7;
+       case 36:
+               return 6;
+       case 25:
+               return 5;
+       case 16:
+               return 4;
+       case 9:
+               return 3;
+       case 4:
+               return 2;
+       case 1:
+               return 1;
+       default: // not a square - please fail
+               return 0;
+       }
+}
+
+//unsigned short isqrt(unsigned s)
+//{
+//      unsigned short r;
+//      unsigned short b=0x0040;
+//      
+//      while(b>s)
+//           b>>=2;
+//      while(b)
+//      {
+//           if(s>=r+b)
+//           {
+//                   s-=r+b;
+//                   r=(r>>1)+b;
+//           }
+//           else
+//                   r>>1;
+//           b>>2;
+//      }
+//      return r;
+//}
+
+
 // int action(
        // ILuint n, struct PixelInfo *info, void *data
 // )