os/ossrv/genericopenlibs/liboil/src/c/composite_c.c
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
 * Copyright (c) 2005
sl@0
     3
 *	Eric Anholt.  All rights reserved.
sl@0
     4
 *
sl@0
     5
 * Redistribution and use in source and binary forms, with or without
sl@0
     6
 * modification, are permitted provided that the following conditions
sl@0
     7
 * are met:
sl@0
     8
 * 1. Redistributions of source code must retain the above copyright
sl@0
     9
 *    notice, this list of conditions and the following disclaimer.
sl@0
    10
 * 2. Redistributions in binary form must reproduce the above copyright
sl@0
    11
 *    notice, this list of conditions and the following disclaimer in the
sl@0
    12
 *    documentation and/or other materials provided with the distribution.
sl@0
    13
 *
sl@0
    14
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
sl@0
    15
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
sl@0
    16
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
sl@0
    17
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
sl@0
    18
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
sl@0
    19
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
sl@0
    20
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
sl@0
    21
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
sl@0
    22
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
sl@0
    23
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
sl@0
    24
 * SUCH DAMAGE.
sl@0
    25
 */
sl@0
    26
//Portions Copyright (c)  2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
sl@0
    27
sl@0
    28
#ifdef HAVE_CONFIG_H
sl@0
    29
#include "config.h"
sl@0
    30
#endif
sl@0
    31
#include <liboil/liboilclasses.h>
sl@0
    32
#include <liboil/liboilfunction.h>
sl@0
    33
#include "liboil/liboilcolorspace.h"
sl@0
    34
sl@0
    35
#define COMPOSITE_ADD(d,s) oil_clamp_255((d) + (s))
sl@0
    36
#define COMPOSITE_OVER(d,s,m) ((d) + (s) - oil_muldiv_255((d),(m)))
sl@0
    37
sl@0
    38
static void
sl@0
    39
composite_in_argb_fast (uint32_t *dest, const uint32_t *src,
sl@0
    40
    const uint8_t *mask, int n)
sl@0
    41
{
sl@0
    42
  for (; n > 0; n--) {
sl@0
    43
    uint32_t src1, src2;
sl@0
    44
    uint8_t m = *mask++;
sl@0
    45
sl@0
    46
    /* Split the pixel into two sets of two channels, and multiply by the
sl@0
    47
     * mask.
sl@0
    48
     */
sl@0
    49
    src1 = *src & 0x00ff00ff;
sl@0
    50
    src1 *= m;
sl@0
    51
    src1 += 0x00800080;
sl@0
    52
    src1 += (src1 >> 8) & 0x00ff00ff;
sl@0
    53
    src1 >>= 8;
sl@0
    54
    src1 &= 0x00ff00ff;
sl@0
    55
sl@0
    56
    src2 = (*src >> 8) & 0x00ff00ff;
sl@0
    57
    src2 *= m;
sl@0
    58
    src2 += 0x00800080;
sl@0
    59
    src2 += (src2 >> 8) & 0x00ff00ff;
sl@0
    60
    src2 &= 0xff00ff00;
sl@0
    61
sl@0
    62
    *dest++ = src1 | src2;
sl@0
    63
    src++;
sl@0
    64
  }
sl@0
    65
}
sl@0
    66
OIL_DEFINE_IMPL (composite_in_argb_fast, composite_in_argb);
sl@0
    67
sl@0
    68
static void
sl@0
    69
composite_in_argb_const_src_fast (uint32_t *dest, const uint32_t *src,
sl@0
    70
    const uint8_t *mask, int n)
sl@0
    71
{
sl@0
    72
  uint32_t src1, src2;
sl@0
    73
sl@0
    74
  src1 = *src & 0x00ff00ff;
sl@0
    75
  src2 = (*src >> 8) & 0x00ff00ff;
sl@0
    76
sl@0
    77
  for (; n > 0; n--) {
sl@0
    78
    uint32_t temp1, temp2;
sl@0
    79
    uint8_t m = *mask++;
sl@0
    80
sl@0
    81
    /* Split the pixel into two sets of two channels, and multiply by the
sl@0
    82
     * mask.
sl@0
    83
     */
sl@0
    84
    temp1 = src1 * m;
sl@0
    85
    temp1 += 0x00800080;
sl@0
    86
    temp1 += (temp1 >> 8) & 0x00ff00ff;
sl@0
    87
    temp1 >>= 8;
sl@0
    88
    temp1 &= 0x00ff00ff;
sl@0
    89
sl@0
    90
    temp2 = src2 * m;
sl@0
    91
    temp2 += 0x00800080;
sl@0
    92
    temp2 += (temp2 >> 8) & 0x00ff00ff;
sl@0
    93
    temp2 &= 0xff00ff00;
sl@0
    94
sl@0
    95
    *dest++ = temp1 | temp2;
sl@0
    96
  }
sl@0
    97
}
sl@0
    98
OIL_DEFINE_IMPL (composite_in_argb_const_src_fast, composite_in_argb_const_src);
sl@0
    99
sl@0
   100
static void
sl@0
   101
composite_in_argb_const_mask_fast (uint32_t *dest, const uint32_t *src,
sl@0
   102
    const uint8_t *mask, int n)
sl@0
   103
{
sl@0
   104
  uint8_t m = *mask;
sl@0
   105
sl@0
   106
  for (; n > 0; n--) {
sl@0
   107
    uint32_t src1, src2;
sl@0
   108
sl@0
   109
    /* Split the pixel into two sets of two channels, and multiply by the
sl@0
   110
     * mask.
sl@0
   111
     */
sl@0
   112
    src1 = *src & 0x00ff00ff;
sl@0
   113
    src1 *= m;
sl@0
   114
    src1 += 0x00800080;
sl@0
   115
    src1 += (src1 >> 8) & 0x00ff00ff;
sl@0
   116
    src1 >>= 8;
sl@0
   117
    src1 &= 0x00ff00ff;
sl@0
   118
sl@0
   119
    src2 = (*src >> 8) & 0x00ff00ff;
sl@0
   120
    src2 *= m;
sl@0
   121
    src2 += 0x00800080;
sl@0
   122
    src2 += (src2 >> 8) & 0x00ff00ff;
sl@0
   123
    src2 &= 0xff00ff00;
sl@0
   124
sl@0
   125
    *dest++ = src1 | src2;
sl@0
   126
    src++;
sl@0
   127
  }
sl@0
   128
}
sl@0
   129
OIL_DEFINE_IMPL (composite_in_argb_const_mask_fast,
sl@0
   130
    composite_in_argb_const_mask);
sl@0
   131
sl@0
   132
static void
sl@0
   133
composite_over_argb_fast (uint32_t *dest, const uint32_t *src, int n)
sl@0
   134
{
sl@0
   135
  for (; n > 0; n--) {
sl@0
   136
    uint32_t d = *dest, s = *src, sa;
sl@0
   137
    uint32_t s1, s2, d1, d2;
sl@0
   138
sl@0
   139
    sa = ~s >> 24;
sl@0
   140
sl@0
   141
    s1 = s & 0x00ff00ff;
sl@0
   142
    d1 = d & 0x00ff00ff;
sl@0
   143
    d1 *= sa;
sl@0
   144
    d1 += 0x00800080;
sl@0
   145
    d1 += (d1 >> 8) & 0x00ff00ff;
sl@0
   146
    d1 >>= 8;
sl@0
   147
    d1 &= 0x00ff00ff;
sl@0
   148
    d1 += s1;
sl@0
   149
    d1 |= 0x01000100 - ((d1 >> 8) & 0x00ff00ff);
sl@0
   150
    d1 &= 0x00ff00ff;
sl@0
   151
sl@0
   152
    s2 = (s >> 8) & 0x00ff00ff;
sl@0
   153
    d2 = (d >> 8) & 0x00ff00ff;
sl@0
   154
    d2 *= sa;
sl@0
   155
    d2 += 0x00800080;
sl@0
   156
    d2 += (d2 >> 8) & 0x00ff00ff;
sl@0
   157
    d2 >>= 8;
sl@0
   158
    d2 &= 0x00ff00ff;
sl@0
   159
    d2 += s2;
sl@0
   160
    d2 |= 0x01000100 - ((d2 >> 8) & 0x00ff00ff);
sl@0
   161
    d2 &= 0x00ff00ff;
sl@0
   162
sl@0
   163
    *dest++ = d1 | (d2 << 8);
sl@0
   164
    src++;
sl@0
   165
  }
sl@0
   166
}
sl@0
   167
OIL_DEFINE_IMPL (composite_over_argb_fast, composite_over_argb);
sl@0
   168
sl@0
   169
static void
sl@0
   170
composite_over_argb_const_src_fast (uint32_t *dest, const uint32_t *src, int n)
sl@0
   171
{
sl@0
   172
  uint32_t s = *src;
sl@0
   173
  uint32_t sa, s1, s2;
sl@0
   174
  sa = ~s >> 24;
sl@0
   175
sl@0
   176
  s1 = s & 0x00ff00ff;
sl@0
   177
  s2 = (s >> 8) & 0x00ff00ff;
sl@0
   178
sl@0
   179
  for (; n > 0; n--) {
sl@0
   180
    uint32_t d = *dest;
sl@0
   181
    uint32_t d1, d2;
sl@0
   182
sl@0
   183
    d1 = d & 0x00ff00ff;
sl@0
   184
    d1 *= sa;
sl@0
   185
    d1 += 0x00800080;
sl@0
   186
    d1 += (d1 >> 8) & 0x00ff00ff;
sl@0
   187
    d1 >>= 8;
sl@0
   188
    d1 &= 0x00ff00ff;
sl@0
   189
    d1 += s1;
sl@0
   190
    d1 |= 0x01000100 - ((d1 >> 8) & 0x00ff00ff);
sl@0
   191
    d1 &= 0x00ff00ff;
sl@0
   192
sl@0
   193
    d2 = (d >> 8) & 0x00ff00ff;
sl@0
   194
    d2 *= sa;
sl@0
   195
    d2 += 0x00800080;
sl@0
   196
    d2 += (d2 >> 8) & 0x00ff00ff;
sl@0
   197
    d2 >>= 8;
sl@0
   198
    d2 &= 0x00ff00ff;
sl@0
   199
    d2 += s2;
sl@0
   200
    d2 |= 0x01000100 - ((d2 >> 8) & 0x00ff00ff);
sl@0
   201
    d2 &= 0x00ff00ff;
sl@0
   202
sl@0
   203
    *dest++ = d1 | (d2 << 8);
sl@0
   204
    src++;
sl@0
   205
  }
sl@0
   206
}
sl@0
   207
OIL_DEFINE_IMPL (composite_over_argb_const_src_fast,
sl@0
   208
    composite_over_argb_const_src);
sl@0
   209
sl@0
   210
static void
sl@0
   211
composite_add_argb_fast (uint32_t *dest, const uint32_t *src, int n)
sl@0
   212
{
sl@0
   213
  for (; n > 0; n--) {
sl@0
   214
    uint32_t s = *src++, d = *dest;
sl@0
   215
    uint32_t s1, s2, d1, d2;
sl@0
   216
sl@0
   217
    s1 = s & 0x00ff00ff;
sl@0
   218
    s2 = (s >> 8) & 0x00ff00ff;
sl@0
   219
    d1 = d & 0x00ff00ff;
sl@0
   220
    d2 = (d >> 8) & 0x00ff00ff;
sl@0
   221
sl@0
   222
    d1 += s1;
sl@0
   223
    d1 |= 0x01000100 - ((d1 >> 8) & 0x00ff00ff);
sl@0
   224
    d1 &= 0x00ff00ff;
sl@0
   225
sl@0
   226
    d2 += s2;
sl@0
   227
    d2 |= 0x01000100 - ((d2 >> 8) & 0x00ff00ff);
sl@0
   228
    d2 &= 0x00ff00ff;
sl@0
   229
sl@0
   230
    *dest++ = d1 | (d2 << 8);
sl@0
   231
  }
sl@0
   232
}
sl@0
   233
OIL_DEFINE_IMPL (composite_add_argb_fast, composite_add_argb);
sl@0
   234
sl@0
   235
static void
sl@0
   236
composite_add_argb_const_src_fast (uint32_t *dest, const uint32_t *src, int n)
sl@0
   237
{
sl@0
   238
  uint32_t s1, s2;
sl@0
   239
sl@0
   240
  s1 = *src & 0x00ff00ff;
sl@0
   241
  s2 = (*src >> 8) & 0x00ff00ff;
sl@0
   242
  for (; n > 0; n--) {
sl@0
   243
    uint32_t d = *dest;
sl@0
   244
    uint32_t d1, d2;
sl@0
   245
sl@0
   246
    d1 = d & 0x00ff00ff;
sl@0
   247
    d2 = (d >> 8) & 0x00ff00ff;
sl@0
   248
sl@0
   249
    d1 += s1;
sl@0
   250
    d1 |= 0x01000100 - ((d1 >> 8) & 0x00ff00ff);
sl@0
   251
    d1 &= 0x00ff00ff;
sl@0
   252
sl@0
   253
    d2 += s2;
sl@0
   254
    d2 |= 0x01000100 - ((d2 >> 8) & 0x00ff00ff);
sl@0
   255
    d2 &= 0x00ff00ff;
sl@0
   256
sl@0
   257
    *dest++ = d1 | (d2 << 8);
sl@0
   258
  }
sl@0
   259
}
sl@0
   260
OIL_DEFINE_IMPL (composite_add_argb_const_src_fast,
sl@0
   261
    composite_add_argb_const_src);
sl@0
   262
sl@0
   263
static void
sl@0
   264
composite_in_over_argb_fast (uint32_t *dest, const uint32_t *src,
sl@0
   265
    const uint8_t *mask, int n)
sl@0
   266
{
sl@0
   267
  for (; n > 0; n--) {
sl@0
   268
    uint32_t d = *dest, s = *src++;
sl@0
   269
    uint32_t s1, s2, d1, d2, sa;
sl@0
   270
    uint8_t m = *mask++;
sl@0
   271
sl@0
   272
    s1 = s & 0x00ff00ff;
sl@0
   273
    s2 = (s >> 8) & 0x00ff00ff;
sl@0
   274
sl@0
   275
    /* in */
sl@0
   276
    s1 *= m;
sl@0
   277
    s1 += 0x00800080;
sl@0
   278
    s1 += (s1 >> 8) & 0x00ff00ff;
sl@0
   279
    s1 >>= 8;
sl@0
   280
    s1 &= 0x00ff00ff;
sl@0
   281
sl@0
   282
    s2 *= m;
sl@0
   283
    s2 += 0x00800080;
sl@0
   284
    s2 += (s2 >> 8) & 0x00ff00ff;
sl@0
   285
    s2 >>= 8;
sl@0
   286
    s2 &= 0x00ff00ff;
sl@0
   287
sl@0
   288
    /* over */
sl@0
   289
    sa = (~s2 >> 16) & 0xff;
sl@0
   290
sl@0
   291
    d1 = d & 0x00ff00ff;
sl@0
   292
    d1 *= sa;
sl@0
   293
    d1 += 0x00800080;
sl@0
   294
    d1 += (d1 >> 8) & 0x00ff00ff;
sl@0
   295
    d1 >>= 8;
sl@0
   296
    d1 &= 0x00ff00ff;
sl@0
   297
    d1 += s1;
sl@0
   298
    d1 |= 0x01000100 - ((d1 >> 8) & 0x00ff00ff);
sl@0
   299
    d1 &= 0x00ff00ff;
sl@0
   300
sl@0
   301
    d2 = (d >> 8) & 0x00ff00ff;
sl@0
   302
    d2 *= sa;
sl@0
   303
    d2 += 0x00800080;
sl@0
   304
    d2 += (d2 >> 8) & 0x00ff00ff;
sl@0
   305
    d2 >>= 8;
sl@0
   306
    d2 &= 0x00ff00ff;
sl@0
   307
    d2 += s2;
sl@0
   308
    d2 |= 0x01000100 - ((d2 >> 8) & 0x00ff00ff);
sl@0
   309
    d2 &= 0x00ff00ff;
sl@0
   310
sl@0
   311
    *dest++ = d1 | (d2 << 8);
sl@0
   312
  }
sl@0
   313
}
sl@0
   314
OIL_DEFINE_IMPL (composite_in_over_argb_fast, composite_in_over_argb);
sl@0
   315
sl@0
   316
static void
sl@0
   317
composite_in_over_argb_const_src_fast (uint32_t *dest, const uint32_t *src,
sl@0
   318
    const uint8_t *mask, int n)
sl@0
   319
{
sl@0
   320
  uint32_t s = *src;
sl@0
   321
  uint32_t s1, s2;
sl@0
   322
sl@0
   323
  s1 = s & 0x00ff00ff;
sl@0
   324
  s2 = (s >> 8) & 0x00ff00ff;
sl@0
   325
sl@0
   326
  for (; n > 0; n--) {
sl@0
   327
    uint32_t d = *dest;
sl@0
   328
    uint32_t temp1, temp2, d1, d2, sa;
sl@0
   329
    uint8_t m = *mask++;
sl@0
   330
sl@0
   331
    /* in */
sl@0
   332
    temp1 = s1 * m;
sl@0
   333
    temp1 += 0x00800080;
sl@0
   334
    temp1 += (temp1 >> 8) & 0x00ff00ff;
sl@0
   335
    temp1 >>= 8;
sl@0
   336
    temp1 &= 0x00ff00ff;
sl@0
   337
sl@0
   338
    temp2 = s2 * m;
sl@0
   339
    temp2 += 0x00800080;
sl@0
   340
    temp2 += (temp2 >> 8) & 0x00ff00ff;
sl@0
   341
    temp2 >>= 8;
sl@0
   342
    temp2 &= 0x00ff00ff;
sl@0
   343
sl@0
   344
    /* over */
sl@0
   345
    sa = (~temp2 >> 16) & 0xff;
sl@0
   346
sl@0
   347
    d1 = d & 0x00ff00ff;
sl@0
   348
    d1 *= sa;
sl@0
   349
    d1 += 0x00800080;
sl@0
   350
    d1 += (d1 >> 8) & 0x00ff00ff;
sl@0
   351
    d1 >>= 8;
sl@0
   352
    d1 &= 0x00ff00ff;
sl@0
   353
    d1 += temp1;
sl@0
   354
    d1 |= 0x01000100 - ((d1 >> 8) & 0x00ff00ff);
sl@0
   355
    d1 &= 0x00ff00ff;
sl@0
   356
sl@0
   357
    d2 = (d >> 8) & 0x00ff00ff;
sl@0
   358
    d2 *= sa;
sl@0
   359
    d2 += 0x00800080;
sl@0
   360
    d2 += (d2 >> 8) & 0x00ff00ff;
sl@0
   361
    d2 >>= 8;
sl@0
   362
    d2 &= 0x00ff00ff;
sl@0
   363
    d2 += temp2;
sl@0
   364
    d2 |= 0x01000100 - ((d2 >> 8) & 0x00ff00ff);
sl@0
   365
    d2 &= 0x00ff00ff;
sl@0
   366
sl@0
   367
    *dest++ = d1 | (d2 << 8);
sl@0
   368
  }
sl@0
   369
}
sl@0
   370
OIL_DEFINE_IMPL (composite_in_over_argb_const_src_fast,
sl@0
   371
    composite_in_over_argb_const_src);
sl@0
   372
sl@0
   373
static void
sl@0
   374
composite_in_over_argb_const_mask_fast (uint32_t *dest, const uint32_t *src,
sl@0
   375
    const uint8_t *mask, int n)
sl@0
   376
{
sl@0
   377
  uint8_t m = *mask;
sl@0
   378
  for (; n > 0; n--) {
sl@0
   379
    uint32_t d = *dest, s = *src++;
sl@0
   380
    uint32_t s1, s2, d1, d2, sa;
sl@0
   381
sl@0
   382
    s1 = s & 0x00ff00ff;
sl@0
   383
    s2 = (s >> 8) & 0x00ff00ff;
sl@0
   384
sl@0
   385
    /* in */
sl@0
   386
    s1 *= m;
sl@0
   387
    s1 += 0x00800080;
sl@0
   388
    s1 += (s1 >> 8) & 0x00ff00ff;
sl@0
   389
    s1 >>= 8;
sl@0
   390
    s1 &= 0x00ff00ff;
sl@0
   391
sl@0
   392
    s2 *= m;
sl@0
   393
    s2 += 0x00800080;
sl@0
   394
    s2 += (s2 >> 8) & 0x00ff00ff;
sl@0
   395
    s2 >>= 8;
sl@0
   396
    s2 &= 0x00ff00ff;
sl@0
   397
sl@0
   398
    /* over */
sl@0
   399
    sa = (~s2 >> 16) & 0xff;
sl@0
   400
sl@0
   401
    d1 = d & 0x00ff00ff;
sl@0
   402
    d1 *= sa;
sl@0
   403
    d1 += 0x00800080;
sl@0
   404
    d1 += (d1 >> 8) & 0x00ff00ff;
sl@0
   405
    d1 >>= 8;
sl@0
   406
    d1 &= 0x00ff00ff;
sl@0
   407
    d1 += s1;
sl@0
   408
    d1 |= 0x01000100 - ((d1 >> 8) & 0x00ff00ff);
sl@0
   409
    d1 &= 0x00ff00ff;
sl@0
   410
sl@0
   411
    d2 = (d >> 8) & 0x00ff00ff;
sl@0
   412
    d2 *= sa;
sl@0
   413
    d2 += 0x00800080;
sl@0
   414
    d2 += (d2 >> 8) & 0x00ff00ff;
sl@0
   415
    d2 >>= 8;
sl@0
   416
    d2 &= 0x00ff00ff;
sl@0
   417
    d2 += s2;
sl@0
   418
    d2 |= 0x01000100 - ((d2 >> 8) & 0x00ff00ff);
sl@0
   419
    d2 &= 0x00ff00ff;
sl@0
   420
sl@0
   421
    *dest++ = d1 | (d2 << 8);
sl@0
   422
  }
sl@0
   423
}
sl@0
   424
OIL_DEFINE_IMPL (composite_in_over_argb_const_mask_fast,
sl@0
   425
    composite_in_over_argb_const_mask);
sl@0
   426
sl@0
   427
#ifdef HAVE_UNALIGNED_ACCESS
sl@0
   428
static void
sl@0
   429
composite_add_u8_fast (uint8_t *dest, const uint8_t *src, int n)
sl@0
   430
{
sl@0
   431
  for (; n > 3; n-= 4) {
sl@0
   432
    uint32_t s = *(uint32_t *)src, d = *(uint32_t *)dest;
sl@0
   433
    uint32_t s1, s2, d1, d2;
sl@0
   434
sl@0
   435
    s1 = s & 0x00ff00ff;
sl@0
   436
    s2 = (s >> 8) & 0x00ff00ff;
sl@0
   437
    d1 = d & 0x00ff00ff;
sl@0
   438
    d2 = (d >> 8) & 0x00ff00ff;
sl@0
   439
sl@0
   440
    d1 += s1;
sl@0
   441
    d1 |= 0x01000100 - ((d1 >> 8) & 0x00ff00ff);
sl@0
   442
    d1 &= 0x00ff00ff;
sl@0
   443
sl@0
   444
    d2 += s2;
sl@0
   445
    d2 |= 0x01000100 - ((d2 >> 8) & 0x00ff00ff);
sl@0
   446
    d2 &= 0x00ff00ff;
sl@0
   447
sl@0
   448
    *(uint32_t *)dest = d1 | (d2 << 8);
sl@0
   449
    src += 4;
sl@0
   450
    dest += 4;
sl@0
   451
  }
sl@0
   452
  for (; n > 0; n--) {
sl@0
   453
    *dest = COMPOSITE_ADD(*dest, *src);
sl@0
   454
    src++;
sl@0
   455
    dest++;
sl@0
   456
  }
sl@0
   457
}
sl@0
   458
OIL_DEFINE_IMPL (composite_add_u8_fast, composite_add_u8);
sl@0
   459
#endif
sl@0
   460
sl@0
   461
#ifdef HAVE_UNALIGNED_ACCESS
sl@0
   462
static void
sl@0
   463
composite_add_u8_const_src_fast (uint8_t *dest, const uint8_t *src, int n)
sl@0
   464
{
sl@0
   465
  uint32_t s;
sl@0
   466
sl@0
   467
  s = *src | (*src << 16);
sl@0
   468
  for (; n > 3; n-= 4) {
sl@0
   469
    uint32_t d = *(uint32_t *)dest;
sl@0
   470
    uint32_t d1, d2;
sl@0
   471
sl@0
   472
    d1 = d & 0x00ff00ff;
sl@0
   473
    d2 = (d >> 8) & 0x00ff00ff;
sl@0
   474
sl@0
   475
    d1 += s;
sl@0
   476
    d1 |= 0x01000100 - ((d1 >> 8) & 0x00ff00ff);
sl@0
   477
    d1 &= 0x00ff00ff;
sl@0
   478
sl@0
   479
    d2 += s;
sl@0
   480
    d2 |= 0x01000100 - ((d2 >> 8) & 0x00ff00ff);
sl@0
   481
    d2 &= 0x00ff00ff;
sl@0
   482
sl@0
   483
    *(uint32_t *)dest = d1 | (d2 << 8);
sl@0
   484
    dest += 4;
sl@0
   485
  }
sl@0
   486
  for (; n > 0; n--) {
sl@0
   487
    *dest = COMPOSITE_ADD(*dest, *src);
sl@0
   488
    dest++;
sl@0
   489
  }
sl@0
   490
}
sl@0
   491
OIL_DEFINE_IMPL (composite_add_u8_const_src_fast, composite_add_u8_const_src);
sl@0
   492
#endif
sl@0
   493
sl@0
   494
#ifdef HAVE_UNALIGNED_ACCESS
sl@0
   495
static void
sl@0
   496
composite_over_u8_fast (uint8_t *dest, const uint8_t *src, int n)
sl@0
   497
{
sl@0
   498
  for (; n > 3; n-= 4) {
sl@0
   499
    uint32_t d = *(uint32_t *)dest, s = *(uint32_t *)src;
sl@0
   500
    uint32_t d1, d2, s1, s2;
sl@0
   501
sl@0
   502
    d1 = d & 0x00ff00ff;
sl@0
   503
    d2 = (d >> 8) & 0x00ff00ff;
sl@0
   504
    s1 = s & 0x00ff00ff;
sl@0
   505
    s2 = (s >> 8) & 0x00ff00ff;
sl@0
   506
sl@0
   507
    d1 = ((d1 & 0xff) * (~s1 & 0xff)) |
sl@0
   508
	((d1 & 0x00ff0000) * (~s1 >> 16 & 0xff));
sl@0
   509
    d1 += 0x00800080;
sl@0
   510
    d1 += (d1 >> 8) & 0x00ff00ff;
sl@0
   511
    d1 >>= 8;
sl@0
   512
    d1 &= 0x00ff00ff;
sl@0
   513
    d1 += s1;
sl@0
   514
    d1 |= 0x01000100 - ((d1 >> 8) & 0x00ff00ff);
sl@0
   515
    d1 &= 0x00ff00ff;
sl@0
   516
sl@0
   517
    d2 = ((d2 & 0xff) * (~s2 & 0xff)) |
sl@0
   518
	((d2 & 0x00ff0000) * (~s2 >> 16 & 0xff));
sl@0
   519
    d2 += 0x00800080;
sl@0
   520
    d2 += (d2 >> 8) & 0x00ff00ff;
sl@0
   521
    d2 >>= 8;
sl@0
   522
    d2 &= 0x00ff00ff;
sl@0
   523
    d2 += s2;
sl@0
   524
    d2 |= 0x01000100 - ((d2 >> 8) & 0x00ff00ff);
sl@0
   525
    d2 &= 0x00ff00ff;
sl@0
   526
sl@0
   527
    *(uint32_t *)dest = d1 | (d2 << 8);
sl@0
   528
    dest += 4;
sl@0
   529
    src += 4;
sl@0
   530
  }
sl@0
   531
  for (; n > 0; n--) {
sl@0
   532
    *dest = COMPOSITE_OVER(*dest, *src, *src);
sl@0
   533
    dest++;
sl@0
   534
    src++;
sl@0
   535
  }
sl@0
   536
}
sl@0
   537
OIL_DEFINE_IMPL (composite_over_u8_fast, composite_over_u8);
sl@0
   538
#endif
sl@0
   539
sl@0
   540
sl@0
   541
#ifdef	__SYMBIAN32__
sl@0
   542
 
sl@0
   543
OilFunctionImpl* __oil_function_impl_composite_in_argb_fast() {
sl@0
   544
		return &_oil_function_impl_composite_in_argb_fast;
sl@0
   545
}
sl@0
   546
#endif
sl@0
   547
sl@0
   548
#ifdef	__SYMBIAN32__
sl@0
   549
 
sl@0
   550
OilFunctionImpl* __oil_function_impl_composite_in_argb_const_src_fast() {
sl@0
   551
		return &_oil_function_impl_composite_in_argb_const_src_fast;
sl@0
   552
}
sl@0
   553
#endif
sl@0
   554
sl@0
   555
#ifdef	__SYMBIAN32__
sl@0
   556
 
sl@0
   557
OilFunctionImpl* __oil_function_impl_composite_in_argb_const_mask_fast() {
sl@0
   558
		return &_oil_function_impl_composite_in_argb_const_mask_fast;
sl@0
   559
}
sl@0
   560
#endif
sl@0
   561
sl@0
   562
#ifdef	__SYMBIAN32__
sl@0
   563
 
sl@0
   564
OilFunctionImpl* __oil_function_impl_composite_over_argb_fast() {
sl@0
   565
		return &_oil_function_impl_composite_over_argb_fast;
sl@0
   566
}
sl@0
   567
#endif
sl@0
   568
sl@0
   569
#ifdef	__SYMBIAN32__
sl@0
   570
 
sl@0
   571
OilFunctionImpl* __oil_function_impl_composite_over_argb_const_src_fast() {
sl@0
   572
		return &_oil_function_impl_composite_over_argb_const_src_fast;
sl@0
   573
}
sl@0
   574
#endif
sl@0
   575
sl@0
   576
#ifdef	__SYMBIAN32__
sl@0
   577
 
sl@0
   578
OilFunctionImpl* __oil_function_impl_composite_add_argb_fast() {
sl@0
   579
		return &_oil_function_impl_composite_add_argb_fast;
sl@0
   580
}
sl@0
   581
#endif
sl@0
   582
sl@0
   583
#ifdef	__SYMBIAN32__
sl@0
   584
 
sl@0
   585
OilFunctionImpl* __oil_function_impl_composite_add_argb_const_src_fast() {
sl@0
   586
		return &_oil_function_impl_composite_add_argb_const_src_fast;
sl@0
   587
}
sl@0
   588
#endif
sl@0
   589
sl@0
   590
#ifdef	__SYMBIAN32__
sl@0
   591
 
sl@0
   592
OilFunctionImpl* __oil_function_impl_composite_in_over_argb_fast() {
sl@0
   593
		return &_oil_function_impl_composite_in_over_argb_fast;
sl@0
   594
}
sl@0
   595
#endif
sl@0
   596
sl@0
   597
#ifdef	__SYMBIAN32__
sl@0
   598
 
sl@0
   599
OilFunctionImpl* __oil_function_impl_composite_in_over_argb_const_src_fast() {
sl@0
   600
		return &_oil_function_impl_composite_in_over_argb_const_src_fast;
sl@0
   601
}
sl@0
   602
#endif
sl@0
   603
sl@0
   604
#ifdef	__SYMBIAN32__
sl@0
   605
 
sl@0
   606
OilFunctionImpl* __oil_function_impl_composite_in_over_argb_const_mask_fast() {
sl@0
   607
		return &_oil_function_impl_composite_in_over_argb_const_mask_fast;
sl@0
   608
}
sl@0
   609
#endif
sl@0
   610
sl@0
   611
#ifdef HAVE_UNALIGNED_ACCESS
sl@0
   612
#ifdef	__SYMBIAN32__
sl@0
   613
 
sl@0
   614
OilFunctionImpl* __oil_function_impl_composite_add_u8_fast() {
sl@0
   615
		return &_oil_function_impl_composite_add_u8_fast;
sl@0
   616
}
sl@0
   617
#endif
sl@0
   618
#endif
sl@0
   619
sl@0
   620
#ifdef HAVE_UNALIGNED_ACCESS
sl@0
   621
#ifdef	__SYMBIAN32__
sl@0
   622
 
sl@0
   623
OilFunctionImpl* __oil_function_impl_composite_add_u8_const_src_fast() {
sl@0
   624
		return &_oil_function_impl_composite_add_u8_const_src_fast;
sl@0
   625
}
sl@0
   626
#endif
sl@0
   627
#endif
sl@0
   628
sl@0
   629
#ifdef HAVE_UNALIGNED_ACCESS
sl@0
   630
#ifdef	__SYMBIAN32__
sl@0
   631
 
sl@0
   632
OilFunctionImpl* __oil_function_impl_composite_over_u8_fast() {
sl@0
   633
		return &_oil_function_impl_composite_over_u8_fast;
sl@0
   634
}
sl@0
   635
#endif
sl@0
   636
#endif