1 /*
   2  * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 
  27 
  28 
  29 /*
  30  * FUNCTIONS
  31  *      mlib_ImageChannelInsert   - Copy the source image into the selected
  32  *                                                        channels of the destination image
  33  *
  34  * SYNOPSIS
  35  *      mlib_status mlib_ImageChannelInsert(mlib_image *dst,
  36  *                                                                        mlib_image *src,
  37  *                                                                      mlib_s32   cmask);
  38  *
  39  * ARGUMENT
  40  *  dst     Pointer to destination image.
  41  *  src     Pointer to source image.
  42  *  cmask   Destination channel selection mask.
  43  *              The least significant bit (LSB) is corresponding to the
  44  *              last channel in the destination image data.
  45  *              The bits with value 1 stand for the channels selected.
  46  *              If more than N channels are selected, the leftmost N
  47  *              channels are inserted, where N is the number of channels
  48  *              in the source image.
  49  *
  50  * RESTRICTION
  51  *              The src and dst must have the same width, height and data type.
  52  *              The src and dst can have 1, 2, 3 or 4 channels.
  53  *              The src and dst can be either MLIB_BYTE, MLIB_SHORT, MLIB_INT,
  54  *          MLIB_FLOAT or MLIB_DOUBLE.
  55  *
  56  * DESCRIPTION
  57  *          Copy the source image into the selected channels of the destination
  58  *              image
  59  */
  60 
  61 #include <stdlib.h>
  62 #include "mlib_image.h"
  63 #include "mlib_ImageCheck.h"
  64 
  65 /***************************************************************/
  66 /* functions defined in mlib_v_ImageChannelInsert_1.c */
  67 
  68 void
  69 mlib_v_ImageChannelInsert_U8(mlib_u8  *src,  mlib_s32 slb,
  70                              mlib_u8  *dst,  mlib_s32 dlb,
  71                              mlib_s32 channels,
  72                              mlib_s32 channeld,
  73                              mlib_s32 width,  mlib_s32 height,
  74                              mlib_s32 cmask);
  75 void
  76 mlib_v_ImageChannelInsert_D64(mlib_d64  *src,  mlib_s32 slb,
  77                               mlib_d64  *dst,  mlib_s32 dlb,
  78                               mlib_s32 channels,
  79                               mlib_s32 channeld,
  80                               mlib_s32 width,  mlib_s32 height,
  81                               mlib_s32 cmask);
  82 void
  83 mlib_v_ImageChannelInsert_S16(mlib_s16 *src,  mlib_s32 slb,
  84                               mlib_s16 *dst,  mlib_s32 dlb,
  85                               mlib_s32 channels,
  86                               mlib_s32 channeld,
  87                               mlib_s32 width,  mlib_s32 height,
  88                               mlib_s32 cmask);
  89 void
  90 mlib_v_ImageChannelInsert_S32(mlib_s32 *src,  mlib_s32 slb,
  91                               mlib_s32 *dst,  mlib_s32 dlb,
  92                               mlib_s32 channels,
  93                               mlib_s32 channeld,
  94                               mlib_s32 width,  mlib_s32 height,
  95                               mlib_s32 cmask);
  96 void
  97 mlib_v_ImageChannelInsert_U8_12_A8D1X8(mlib_u8  *src,
  98                                                                mlib_u8  *dst,
  99                                                          mlib_s32 dsize,
 100                                                          mlib_s32 cmask);
 101 void
 102 mlib_v_ImageChannelInsert_U8_12_A8D2X8(mlib_u8  *src,  mlib_s32 slb,
 103                                                                mlib_u8  *dst,  mlib_s32 dlb,
 104                                                        mlib_s32 xsize, mlib_s32 ysize,
 105                                                                mlib_s32 cmask);
 106 void
 107 mlib_v_ImageChannelInsert_U8_12_D1(mlib_u8  *src,
 108                                                            mlib_u8  *dst,
 109                                                    mlib_s32 dsize,
 110                                                            mlib_s32 cmask);
 111 void
 112 mlib_v_ImageChannelInsert_U8_12(mlib_u8  *src,  mlib_s32 slb,
 113                                                         mlib_u8  *dst,  mlib_s32 dlb,
 114                                                 mlib_s32 xsize, mlib_s32 ysize,
 115                                                         mlib_s32 cmask);
 116 void
 117 mlib_v_ImageChannelInsert_U8_13_A8D1X8(mlib_u8  *src,
 118                                                                mlib_u8  *dst,
 119                                                        mlib_s32 dsize,
 120                                                                mlib_s32 cmask);
 121 void
 122 mlib_v_ImageChannelInsert_U8_13_A8D2X8(mlib_u8  *src,  mlib_s32 slb,
 123                                                                mlib_u8  *dst,  mlib_s32 dlb,
 124                                                          mlib_s32 xsize, mlib_s32 ysize,
 125                                                                mlib_s32 cmask);
 126 void
 127 mlib_v_ImageChannelInsert_U8_13_D1(mlib_u8  *src,
 128                                                            mlib_u8  *dst,
 129                                                      mlib_s32 dsize,
 130                                                            mlib_s32 cmask);
 131 void
 132 mlib_v_ImageChannelInsert_U8_13(mlib_u8  *src,  mlib_s32 slb,
 133                                                         mlib_u8  *dst,  mlib_s32 dlb,
 134                                                   mlib_s32 xsize, mlib_s32 ysize,
 135                                                         mlib_s32 cmask);
 136 void
 137 mlib_v_ImageChannelInsert_U8_14_A8D1X8(mlib_u8  *src,
 138                                                                mlib_u8  *dst,
 139                                                        mlib_s32 dsize,
 140                                                                mlib_s32 cmask);
 141 void
 142 mlib_v_ImageChannelInsert_U8_14_A8D2X8(mlib_u8  *src,  mlib_s32 slb,
 143                                                                mlib_u8  *dst,  mlib_s32 dlb,
 144                                                        mlib_s32 xsize, mlib_s32 ysize,
 145                                                                mlib_s32 cmask);
 146 void
 147 mlib_v_ImageChannelInsert_U8_14_D1(mlib_u8  *src,
 148                                                            mlib_u8  *dst,
 149                                                    mlib_s32 dsize,
 150                                                            mlib_s32 cmask);
 151 void
 152 mlib_v_ImageChannelInsert_U8_14(mlib_u8  *src,  mlib_s32 slb,
 153                                                         mlib_u8  *dst,  mlib_s32 dlb,
 154                                                 mlib_s32 xsize, mlib_s32 ysize,
 155                                                         mlib_s32 cmask);
 156 void
 157 mlib_v_ImageChannelInsert_S16_12_A8D1X4(mlib_s16 *src,
 158                                                                       mlib_s16 *dst,
 159                                                         mlib_s32 dsize,
 160                                                                 mlib_s32 cmask);
 161 void
 162 mlib_v_ImageChannelInsert_S16_12_A8D2X4(mlib_s16 *src,  mlib_s32 slb,
 163                                                                       mlib_s16 *dst,  mlib_s32 dlb,
 164                                                         mlib_s32 xsize, mlib_s32 ysize,
 165                                                                 mlib_s32 cmask);
 166 void
 167 mlib_v_ImageChannelInsert_S16_12_D1(mlib_s16 *src,
 168                                                             mlib_s16 *dst,
 169                                                     mlib_s32 dsize,
 170                                                             mlib_s32 cmask);
 171 void
 172 mlib_v_ImageChannelInsert_S16_12(mlib_s16 *src,  mlib_s32 slb,
 173                                                         mlib_s16 *dst,  mlib_s32 dlb,
 174                                                   mlib_s32 xsize, mlib_s32 ysize,
 175                                                   mlib_s32 cmask);
 176 void
 177 mlib_v_ImageChannelInsert_S16_13_A8D1X4(mlib_s16 *src,
 178                                                                       mlib_s16 *dst,
 179                                                         mlib_s32 dsize,
 180                                                                 mlib_s32 cmask);
 181 void
 182 mlib_v_ImageChannelInsert_S16_13_A8D2X4(mlib_s16 *src,  mlib_s32 slb,
 183                                                                       mlib_s16 *dst,  mlib_s32 dlb,
 184                                                         mlib_s32 xsize, mlib_s32 ysize,
 185                                                                 mlib_s32 cmask);
 186 void
 187 mlib_v_ImageChannelInsert_S16_13_D1(mlib_s16 *src,
 188                                                             mlib_s16 *dst,
 189                                                     mlib_s32 dsize,
 190                                                             mlib_s32 cmask);
 191 void
 192 mlib_v_ImageChannelInsert_S16_13(mlib_s16 *src,  mlib_s32 slb,
 193                                                          mlib_s16 *dst,  mlib_s32 dlb,
 194                                                  mlib_s32 xsize, mlib_s32 ysize,
 195                                                          mlib_s32 cmask);
 196 void
 197 mlib_v_ImageChannelInsert_S16_14_A8D1X4(mlib_s16 *src,
 198                                                                       mlib_s16 *dst,
 199                                                           mlib_s32 dsize,
 200                                                                       mlib_s32 cmask);
 201 void
 202 mlib_v_ImageChannelInsert_S16_14_A8D2X4(mlib_s16 *src,  mlib_s32 slb,
 203                                                                       mlib_s16 *dst,  mlib_s32 dlb,
 204                                                           mlib_s32 xsize, mlib_s32 ysize,
 205                                                                       mlib_s32 cmask);
 206 void
 207 mlib_v_ImageChannelInsert_S16_14_D1(mlib_s16 *src,
 208                                                             mlib_s16 *dst,
 209                                                     mlib_s32 dsize,
 210                                                             mlib_s32 cmask);
 211 void
 212 mlib_v_ImageChannelInsert_S16_14(mlib_s16 *src,  mlib_s32 slb,
 213                                                          mlib_s16 *dst,  mlib_s32 dlb,
 214                                                  mlib_s32 xsize, mlib_s32 ysize,
 215                                                          mlib_s32 cmask);
 216 
 217 /***************************************************************/
 218 /* functions defined in mlib_v_ImageChannelInsert_34.c */
 219 
 220 void
 221 mlib_v_ImageChannelInsert_U8_34R_A8D1X8(mlib_u8  *src,
 222                                                                 mlib_u8  *dst,
 223                                                                 mlib_s32 dsize);
 224 void
 225 mlib_v_ImageChannelInsert_U8_34R_A8D2X8(mlib_u8  *src,  mlib_s32 slb,
 226                                                                 mlib_u8  *dst,  mlib_s32 dlb,
 227                                                                 mlib_s32 xsize, mlib_s32 ysize);
 228 void
 229 mlib_v_ImageChannelInsert_U8_34R_D1(mlib_u8  *src,
 230                                                             mlib_u8  *dst,
 231                                                             mlib_s32 dsize);
 232 void
 233 mlib_v_ImageChannelInsert_U8_34R(mlib_u8  *src,  mlib_s32 slb,
 234                                                  mlib_u8  *dst,  mlib_s32 dlb,
 235                                                          mlib_s32 xsize, mlib_s32 ysize);
 236 void
 237 mlib_v_ImageChannelInsert_S16_34R_A8D1X4(mlib_s16 *src,
 238                                                                  mlib_s16 *dst,
 239                                                                  mlib_s32 dsize);
 240 void
 241 mlib_v_ImageChannelInsert_S16_34R_A8D2X4(mlib_s16 *src,  mlib_s32 slb,
 242                                                                  mlib_s16 *dst,  mlib_s32 dlb,
 243                                                                  mlib_s32 xsize, mlib_s32 ysize);
 244 void
 245 mlib_v_ImageChannelInsert_S16_34R_D1(mlib_s16 *src,
 246                                                              mlib_s16 *dst,
 247                                                              mlib_s32 dsize);
 248 void
 249 mlib_v_ImageChannelInsert_S16_34R(mlib_s16 *src,  mlib_s32 slb,
 250                                                           mlib_s16 *dst,  mlib_s32 dlb,
 251                                                           mlib_s32 xsize, mlib_s32 ysize);
 252 void
 253 mlib_v_ImageChannelInsert_U8_34L_A8D1X8(mlib_u8  *src,
 254                                                                 mlib_u8  *dst,
 255                                                                 mlib_s32 dsize);
 256 void
 257 mlib_v_ImageChannelInsert_U8_34L_A8D2X8(mlib_u8  *src,  mlib_s32 slb,
 258                                                                 mlib_u8  *dst,  mlib_s32 dlb,
 259                                                         mlib_s32 xsize, mlib_s32 ysize);
 260 void
 261 mlib_v_ImageChannelInsert_U8_34L_D1(mlib_u8  *src,
 262                                                             mlib_u8  *dst,
 263                                                             mlib_s32 dsize);
 264 void
 265 mlib_v_ImageChannelInsert_U8_34L(mlib_u8  *src,  mlib_s32 slb,
 266                                                          mlib_u8  *dst,  mlib_s32 dlb,
 267                                                          mlib_s32 xsize, mlib_s32 ysize);
 268 void
 269 mlib_v_ImageChannelInsert_S16_34L_A8D1X4(mlib_s16 *src,
 270                                                                  mlib_s16 *dst,
 271                                                                  mlib_s32 dsize);
 272 void
 273 mlib_v_ImageChannelInsert_S16_34L_A8D2X4(mlib_s16 *src,  mlib_s32 slb,
 274                                                                  mlib_s16 *dst,  mlib_s32 dlb,
 275                                                                  mlib_s32 xsize, mlib_s32 ysize);
 276 void
 277 mlib_v_ImageChannelInsert_S16_34L_D1(mlib_s16 *src,
 278                                                              mlib_s16 *dst,
 279                                                              mlib_s32 dsize);
 280 void
 281 mlib_v_ImageChannelInsert_S16_34L(mlib_s16 *src,  mlib_s32 slb,
 282                                                           mlib_s16 *dst,  mlib_s32 dlb,
 283                                                           mlib_s32 xsize, mlib_s32 ysize);
 284 
 285 
 286 /***************************************************************/
 287 
 288 #ifdef MLIB_TEST
 289 mlib_status
 290 mlib_v_ImageChannelInsert(mlib_image *dst,
 291                                             mlib_image *src,
 292                                           mlib_s32   cmask)
 293 #else
 294 mlib_status
 295 mlib_ImageChannelInsert(mlib_image *dst,
 296                                         mlib_image *src,
 297                                         mlib_s32   cmask)
 298 #endif
 299 {
 300   const mlib_s32  X8 = 0x7;
 301   const mlib_s32  X4 = 0x3;
 302   const mlib_s32  X2 = 0x1;
 303   const mlib_s32  A8D1   = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_ONEDVECTOR;
 304   const mlib_s32  A8D2X8 = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_STRIDE8X | MLIB_IMAGE_WIDTH8X;
 305   const mlib_s32  A8D2X4 = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_STRIDE8X | MLIB_IMAGE_WIDTH4X;
 306   const mlib_s32  A8D2X2 = MLIB_IMAGE_ALIGNED8 | MLIB_IMAGE_STRIDE8X | MLIB_IMAGE_WIDTH2X;
 307 
 308   void      *sp;                      /* pointer for pixel in src */
 309   void      *dp;                      /* pointer for pixel in dst */
 310   mlib_s32  ncmask = 0;         /* normalized channel mask */
 311   mlib_s32  channels;             /* number of channels for src */
 312   mlib_s32  channeld;             /* number of channels for dst */
 313   mlib_s32  width, height;/* for src and dst */
 314   mlib_s32  strides;              /* strides in bytes for src */
 315   mlib_s32  strided;            /* strides in bytes for dst */
 316   mlib_s32  flags;
 317   mlib_s32  flagd;
 318   mlib_s32  dsize;
 319   int         i, bit1count = 0;
 320 
 321   MLIB_IMAGE_CHECK(src);
 322   MLIB_IMAGE_CHECK(dst);
 323   MLIB_IMAGE_TYPE_EQUAL(src,dst);
 324   MLIB_IMAGE_SIZE_EQUAL(src,dst);
 325 
 326   channels = mlib_ImageGetChannels(src);
 327   channeld = mlib_ImageGetChannels(dst);
 328   width    = mlib_ImageGetWidth(src);
 329   height   = mlib_ImageGetHeight(src);
 330   strides  = mlib_ImageGetStride(src);
 331   strided  = mlib_ImageGetStride(dst);
 332   sp       = mlib_ImageGetData(src);
 333   dp       = mlib_ImageGetData(dst);
 334   flags    = mlib_ImageGetFlags(src);
 335   flagd    = mlib_ImageGetFlags(dst);
 336   dsize    = width * height;
 337 
 338   /* normalize the cmask, and count the number of bit with value 1 */
 339   for (i = (channeld - 1); i >= 0; i--) {
 340     if (((cmask & (1 << i)) != 0) && (bit1count < channels)) {
 341       ncmask += (1 << i);
 342       bit1count++;
 343     }
 344   }
 345 
 346   /* do not support the cases in which the number of selected channels is
 347    * less than the nubmber of channels in the source image */
 348   if (bit1count < channels) {
 349     return MLIB_FAILURE;
 350   }
 351 
 352   if (((channels == 1) && (channeld == 1)) ||
 353       ((channels == 2) && (channeld == 2)) ||
 354       ((channels == 3) && (channeld == 3)) ||
 355       ((channels == 4) && (channeld == 4))) {
 356       return mlib_ImageCopy(dst, src);
 357   }
 358 
 359   switch (mlib_ImageGetType(src)) {
 360     case MLIB_BYTE:
 361       if (channels == 1) {
 362         switch (channeld) {
 363           case 2:
 364             if (((flags & A8D1) == 0) &&
 365                 ((flagd & A8D1) == 0) &&
 366                 ((dsize & X8)   == 0)) {
 367                 mlib_v_ImageChannelInsert_U8_12_A8D1X8((mlib_u8 *)sp,
 368                                                                              (mlib_u8 *)dp,
 369                                                                              dsize,
 370                                                                                      ncmask);
 371             }
 372             else if (((flags & A8D2X8) == 0) &&
 373               ((flagd & A8D2X8) == 0)) {
 374               mlib_v_ImageChannelInsert_U8_12_A8D2X8((mlib_u8 *)sp, strides,
 375                                                                              (mlib_u8 *)dp, strided,
 376                                                                              width, height,
 377                                                                                      ncmask);
 378             }
 379             else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) &&
 380                ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) {
 381                 mlib_v_ImageChannelInsert_U8_12_D1((mlib_u8 *)sp,
 382                                                                                  (mlib_u8 *)dp,
 383                                                                                  dsize,
 384                                                                                  ncmask);
 385             }
 386             else {
 387                 mlib_v_ImageChannelInsert_U8_12((mlib_u8 *)sp, strides,
 388                                                                       (mlib_u8 *)dp, strided,
 389                                                                       width, height,
 390                                                                               ncmask);
 391             }
 392             break;
 393 
 394           case 3:
 395             if (((flags & A8D1) == 0) &&
 396                 ((flagd & A8D1) == 0) &&
 397                 ((dsize & X8)   == 0)) {
 398                 mlib_v_ImageChannelInsert_U8_13_A8D1X8((mlib_u8 *)sp,
 399                                                                                  (mlib_u8 *)dp,
 400                                                                                dsize,
 401                                                                                            ncmask);
 402             }
 403             else if (((flags & A8D2X8) == 0) &&
 404               ((flagd & A8D2X8) == 0)) {
 405                 mlib_v_ImageChannelInsert_U8_13_A8D2X8((mlib_u8 *)sp, strides,
 406                                                                                      (mlib_u8 *)dp, strided,
 407                                                                              width, height,
 408                                                                                      ncmask);
 409             }
 410             else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) &&
 411                ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) {
 412                 mlib_v_ImageChannelInsert_U8_13_D1((mlib_u8 *)sp,
 413                                                                                  (mlib_u8 *)dp,
 414                                                                                  dsize,
 415                                                                                  ncmask);
 416             }
 417             else {
 418               mlib_v_ImageChannelInsert_U8_13((mlib_u8 *)sp, strides,
 419                                                                       (mlib_u8 *)dp, strided,
 420                                                                       width, height,
 421                                                                       ncmask);
 422             }
 423             break;
 424 
 425           case 4:
 426             if (((flags & A8D1) == 0) &&
 427                 ((flagd & A8D1) == 0) &&
 428                 ((dsize & X8)   == 0)) {
 429                   mlib_v_ImageChannelInsert_U8_14_A8D1X8((mlib_u8 *)sp,
 430                                                                                    (mlib_u8 *)dp,
 431                                                                                  dsize,
 432                                                                                              ncmask);
 433             }
 434             else if (((flags & A8D2X8) == 0) &&
 435                ((flagd & A8D2X8) == 0)) {
 436                mlib_v_ImageChannelInsert_U8_14_A8D2X8((mlib_u8 *)sp, strides,
 437                                                                       (mlib_u8 *)dp, strided,
 438                                                                               width, height,
 439                                                                                           ncmask);
 440             }
 441             else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) &&
 442               ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) {
 443                 mlib_v_ImageChannelInsert_U8_14_D1((mlib_u8 *)sp,
 444                                                                                  (mlib_u8 *)dp,
 445                                                                                  dsize,
 446                                                                                  ncmask);
 447             }
 448             else {
 449               mlib_v_ImageChannelInsert_U8_14((mlib_u8 *)sp, strides,
 450                                                                       (mlib_u8 *)dp, strided,
 451                                                                       width, height,
 452                                                                       ncmask);
 453             }
 454             break;
 455 
 456           default:
 457             return MLIB_FAILURE;
 458         }
 459       }
 460       else {
 461         if ((channels == 3) && (channeld == 4) && (ncmask == 7)) {
 462           if (((flags & A8D1) == 0) &&
 463             ((flagd & A8D1) == 0) &&
 464             ((dsize & X8)   == 0)) {
 465             mlib_v_ImageChannelInsert_U8_34R_A8D1X8((mlib_u8 *)sp,
 466                                                                           (mlib_u8 *)dp,
 467                                                                           dsize);
 468           }
 469         else if (((flags & A8D2X8) == 0) &&
 470                ((flagd & A8D2X8) == 0)) {
 471               mlib_v_ImageChannelInsert_U8_34R_A8D2X8((mlib_u8 *)sp, strides,
 472                                                                                     (mlib_u8 *)dp, strided,
 473                                                                               width, height);
 474         }
 475         else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) &&
 476                ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) {
 477               mlib_v_ImageChannelInsert_U8_34R_D1((mlib_u8 *)sp,
 478                                                                           (mlib_u8 *)dp,
 479                                                                           dsize);
 480         }
 481         else {
 482               mlib_v_ImageChannelInsert_U8_34R((mlib_u8 *)sp, strides,
 483                                                                       (mlib_u8 *)dp, strided,
 484                                                                       width, height);
 485         }
 486       }
 487       else if ((channels == 3) && (channeld == 4) && (ncmask == 14)) {
 488         if (((flags & A8D1) == 0) &&
 489             ((flagd & A8D1) == 0) &&
 490             ((dsize & X8)   == 0)) {
 491             mlib_v_ImageChannelInsert_U8_34L_A8D1X8((mlib_u8 *)sp,
 492                                                                             (mlib_u8 *)dp,
 493                                                                           dsize);
 494               }
 495         else if (((flags & A8D2X8) == 0) &&
 496                  ((flagd & A8D2X8) == 0)) {
 497                  mlib_v_ImageChannelInsert_U8_34L_A8D2X8((mlib_u8 *)sp, strides,
 498                                                                                   (mlib_u8 *)dp, strided,
 499                                                                           width, height);
 500         }
 501         else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) &&
 502                  ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) {
 503                  mlib_v_ImageChannelInsert_U8_34L_D1((mlib_u8 *)sp,
 504                                                                       (mlib_u8 *)dp,
 505                                                                       dsize);
 506         }
 507         else mlib_v_ImageChannelInsert_U8_34L((mlib_u8 *)sp, strides,
 508                                                                    (mlib_u8 *)dp, strided,
 509                                                                    width, height);
 510         }
 511       else {
 512 
 513       mlib_v_ImageChannelInsert_U8((mlib_u8 *)sp, strides,
 514                                                      (mlib_u8 *)dp, strided,
 515                                                      channels, channeld,
 516                                                      width, height,
 517                                                      ncmask);
 518       }
 519   }
 520   break;
 521 
 522     case MLIB_SHORT:
 523       if (channels == 1) {
 524         switch (channeld) {
 525           case 2:
 526             if (((flags & A8D1) == 0) &&
 527                 ((flagd & A8D1) == 0) &&
 528                 ((dsize & X4)   == 0)) {
 529               mlib_v_ImageChannelInsert_S16_12_A8D1X4((mlib_s16 *)sp,
 530                                                                                     (mlib_s16 *)dp,
 531                                                                                       dsize,
 532                                                                                       ncmask);
 533             }
 534             else if (((flags & A8D2X4) == 0) &&
 535                ((flagd & A8D2X4) == 0)) {
 536               mlib_v_ImageChannelInsert_S16_12_A8D2X4((mlib_s16 *)sp, strides,
 537                                                                               (mlib_s16 *)dp, strided,
 538                                                                               width, height,
 539                                                                                       ncmask);
 540             }
 541             else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) &&
 542                ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) {
 543              mlib_v_ImageChannelInsert_S16_12_D1((mlib_s16 *)sp,
 544                                                                            (mlib_s16 *)dp,
 545                                                                           dsize,
 546                                                                                   ncmask);
 547             }
 548             else {
 549               mlib_v_ImageChannelInsert_S16_12((mlib_s16 *)sp, strides,
 550                                                                        (mlib_s16 *)dp, strided,
 551                                                                        width, height,
 552                                                                        ncmask);
 553             }
 554             break;
 555 
 556           case 3:
 557             if (((flags & A8D1) == 0) &&
 558                 ((flagd & A8D1) == 0) &&
 559                 ((dsize & X4)   == 0)) {
 560               mlib_v_ImageChannelInsert_S16_13_A8D1X4((mlib_s16 *)sp,
 561                                                                               (mlib_s16 *)dp,
 562                                                                                       dsize,
 563                                                                                       ncmask);
 564             }
 565             else if (((flags & A8D2X4) == 0) &&
 566                ((flagd & A8D2X4) == 0)) {
 567               mlib_v_ImageChannelInsert_S16_13_A8D2X4((mlib_s16 *)sp, strides,
 568                                                                               (mlib_s16 *)dp, strided,
 569                                                                               width, height,
 570                                                                                       ncmask);
 571             }
 572             else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) &&
 573                ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) {
 574                 mlib_v_ImageChannelInsert_S16_13_D1((mlib_s16 *)sp,
 575                                                                                   (mlib_s16 *)dp,
 576                                                                                   dsize,
 577                                                                                   ncmask);
 578             }
 579             else {
 580               mlib_v_ImageChannelInsert_S16_13((mlib_s16 *)sp, strides,
 581                                                                        (mlib_s16 *)dp, strided,
 582                                                                        width, height,
 583                                                                        ncmask);
 584             }
 585             break;
 586 
 587           case 4:
 588             if (((flags & A8D1) == 0) &&
 589                 ((flagd & A8D1) == 0) &&
 590                 ((dsize & X4)   == 0)) {
 591               mlib_v_ImageChannelInsert_S16_14_A8D1X4((mlib_s16 *)sp,
 592                                                                                     (mlib_s16 *)dp,
 593                                                       dsize,
 594                                                       ncmask);
 595             }
 596             else if (((flags & A8D2X4) == 0) &&
 597                ((flagd & A8D2X4) == 0)) {
 598               mlib_v_ImageChannelInsert_S16_14_A8D2X4((mlib_s16 *)sp, strides,
 599                                                                               (mlib_s16 *)dp, strided,
 600                                                                               width, height,
 601                                                                                       ncmask);
 602             }
 603             else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) &&
 604                ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) {
 605               mlib_v_ImageChannelInsert_S16_14_D1((mlib_s16 *)sp,
 606                                                                           (mlib_s16 *)dp,
 607                                                                           dsize,
 608                                                                                   ncmask);
 609             }
 610             else {
 611               mlib_v_ImageChannelInsert_S16_14((mlib_s16 *)sp, strides,
 612                                                                        (mlib_s16 *)dp, strided,
 613                                                                        width, height,
 614                                                                        ncmask);
 615             }
 616             break;
 617           default:
 618             return MLIB_FAILURE;
 619         }
 620       }
 621       else if ((channels == 3) && (channeld == 4) && (ncmask == 7)) {
 622         if (((flags & A8D1) == 0) &&
 623             ((flagd & A8D1) == 0) &&
 624             ((dsize & X4)   == 0)) {
 625           mlib_v_ImageChannelInsert_S16_34R_A8D1X4((mlib_s16 *)sp,
 626                                                                            (mlib_s16 *)dp,
 627                                                                            dsize);
 628         }
 629         else if (((flags & A8D2X4) == 0) &&
 630            ((flagd & A8D2X4) == 0)) {
 631           mlib_v_ImageChannelInsert_S16_34R_A8D2X4((mlib_s16 *)sp, strides,
 632                                                                            (mlib_s16 *)dp, strided,
 633                                                                            width, height);
 634         }
 635         else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) &&
 636            ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) {
 637           mlib_v_ImageChannelInsert_S16_34R_D1((mlib_s16 *)sp,
 638                                                                        (mlib_s16 *)dp,
 639                                                                        dsize);
 640         }
 641         else {
 642           mlib_v_ImageChannelInsert_S16_34R((mlib_s16 *)sp, strides,
 643                                                                     (mlib_s16 *)dp, strided,
 644                                                                      width, height);
 645         }
 646       }
 647       else if ((channels == 3) && (channeld == 4) && (ncmask == 14)) {
 648         if (((flags & A8D1) == 0) &&
 649             ((flagd & A8D1) == 0) &&
 650             ((dsize & X4)   == 0)) {
 651           mlib_v_ImageChannelInsert_S16_34L_A8D1X4((mlib_s16 *)sp,
 652                                                                            (mlib_s16 *)dp,
 653                                                                            dsize);
 654         }
 655         else if (((flags & A8D2X4) == 0) &&
 656            ((flagd & A8D2X4) == 0)) {
 657           mlib_v_ImageChannelInsert_S16_34L_A8D2X4((mlib_s16 *)sp, strides,
 658                                                                            (mlib_s16 *)dp, strided,
 659                                                                            width, height);
 660         }
 661         else if (((flags & MLIB_IMAGE_ONEDVECTOR) == 0) &&
 662            ((flagd & MLIB_IMAGE_ONEDVECTOR) == 0)) {
 663           mlib_v_ImageChannelInsert_S16_34L_D1((mlib_s16 *)sp,
 664                                                                        (mlib_s16 *)dp,
 665                                                                        dsize);
 666         }
 667         else {
 668           mlib_v_ImageChannelInsert_S16_34L((mlib_s16 *)sp, strides,
 669                                                                     (mlib_s16 *)dp, strided,
 670                                                                     width, height);
 671         }
 672       }
 673       else {
 674         mlib_v_ImageChannelInsert_S16((mlib_s16 *)sp, strides,
 675                                                               (mlib_s16 *)dp, strided,
 676                                                               channels,  channeld,
 677                                                               width, height,
 678                                                               ncmask);
 679       }
 680       break;
 681 
 682     case MLIB_INT:
 683         mlib_v_ImageChannelInsert_S32((mlib_s32 *)sp, strides,
 684                                       (mlib_s32 *)dp, strided,
 685                                       channels, channeld,
 686                                       width, height,
 687                                       ncmask);
 688         break;
 689 
 690     case MLIB_FLOAT:
 691         mlib_v_ImageChannelInsert_S32((mlib_s32 *)sp, strides,
 692                                       (mlib_s32 *)dp, strided,
 693                                       channels, channeld,
 694                                       width, height,
 695                                       ncmask);
 696         break;
 697 
 698 
 699     case MLIB_DOUBLE:
 700         mlib_v_ImageChannelInsert_D64((mlib_d64 *)sp, strides,
 701                                       (mlib_d64 *)dp, strided,
 702                                       channels, channeld,
 703                                       width, height,
 704                                       ncmask);
 705         break;
 706 
 707 
 708     case MLIB_BIT:
 709     default:
 710         return MLIB_FAILURE;    /* MLIB_BIT is not supported here */
 711   }
 712 
 713   return MLIB_SUCCESS;
 714 }
 715 /***************************************************************/