alpha_processing.c revision 8b720228d581a84fd173b6dcb2fa295b59db489a
18b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Copyright 2013 Google Inc. All Rights Reserved. 28b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// 38b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Use of this source code is governed by a BSD-style license 48b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// that can be found in the COPYING file in the root of the source 58b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// tree. An additional intellectual property rights grant can be found 68b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// in the file PATENTS. All contributing project authors may 78b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// be found in the AUTHORS file in the root of the source tree. 88b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// ----------------------------------------------------------------------------- 98b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// 108b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Utilities for processing transparent channel. 118b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// 128b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Author: Skal (pascal.massimino@gmail.com) 138b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 148b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#include <assert.h> 158b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#include "./alpha_processing.h" 168b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 178b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Tables can be faster on some platform but incur some extra binary size (~2k). 188b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// #define USE_TABLES_FOR_ALPHA_MULT 198b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 208b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// ----------------------------------------------------------------------------- 218b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 228b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#define MFIX 24 // 24bit fixed-point arithmetic 238b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#define HALF ((1u << MFIX) >> 1) 248b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#define KINV_255 ((1u << MFIX) / 255u) 258b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 268b720228d581a84fd173b6dcb2fa295b59db489aVikas Arorastatic uint32_t Mult(uint8_t x, uint32_t mult) { 278b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora const uint32_t v = (x * mult + HALF) >> MFIX; 288b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora assert(v <= 255); // <- 24bit precision is enough to ensure that. 298b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora return v; 308b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora} 318b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 328b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#ifdef USE_TABLES_FOR_ALPHA_MULT 338b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 348b720228d581a84fd173b6dcb2fa295b59db489aVikas Arorastatic const uint32_t kMultTables[2][256] = { 358b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora { // (255u << MFIX) / alpha 368b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00000000, 0xff000000, 0x7f800000, 0x55000000, 0x3fc00000, 0x33000000, 378b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x2a800000, 0x246db6db, 0x1fe00000, 0x1c555555, 0x19800000, 0x172e8ba2, 388b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x15400000, 0x139d89d8, 0x1236db6d, 0x11000000, 0x0ff00000, 0x0f000000, 398b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x0e2aaaaa, 0x0d6bca1a, 0x0cc00000, 0x0c249249, 0x0b9745d1, 0x0b1642c8, 408b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x0aa00000, 0x0a333333, 0x09cec4ec, 0x0971c71c, 0x091b6db6, 0x08cb08d3, 418b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x08800000, 0x0839ce73, 0x07f80000, 0x07ba2e8b, 0x07800000, 0x07492492, 428b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x07155555, 0x06e45306, 0x06b5e50d, 0x0689d89d, 0x06600000, 0x063831f3, 438b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x06124924, 0x05ee23b8, 0x05cba2e8, 0x05aaaaaa, 0x058b2164, 0x056cefa8, 448b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x05500000, 0x05343eb1, 0x05199999, 0x05000000, 0x04e76276, 0x04cfb2b7, 458b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x04b8e38e, 0x04a2e8ba, 0x048db6db, 0x0479435e, 0x04658469, 0x045270d0, 468b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x04400000, 0x042e29f7, 0x041ce739, 0x040c30c3, 0x03fc0000, 0x03ec4ec4, 478b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x03dd1745, 0x03ce540f, 0x03c00000, 0x03b21642, 0x03a49249, 0x03976fc6, 488b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x038aaaaa, 0x037e3f1f, 0x03722983, 0x03666666, 0x035af286, 0x034fcace, 498b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x0344ec4e, 0x033a5440, 0x03300000, 0x0325ed09, 0x031c18f9, 0x0312818a, 508b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x03092492, 0x03000000, 0x02f711dc, 0x02ee5846, 0x02e5d174, 0x02dd7baf, 518b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x02d55555, 0x02cd5cd5, 0x02c590b2, 0x02bdef7b, 0x02b677d4, 0x02af286b, 528b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x02a80000, 0x02a0fd5c, 0x029a1f58, 0x029364d9, 0x028ccccc, 0x0286562d, 538b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x02800000, 0x0279c952, 0x0273b13b, 0x026db6db, 0x0267d95b, 0x026217ec, 548b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x025c71c7, 0x0256e62a, 0x0251745d, 0x024c1bac, 0x0246db6d, 0x0241b2f9, 558b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x023ca1af, 0x0237a6f4, 0x0232c234, 0x022df2df, 0x02293868, 0x02249249, 568b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x02200000, 0x021b810e, 0x021714fb, 0x0212bb51, 0x020e739c, 0x020a3d70, 578b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x02061861, 0x02020408, 0x01fe0000, 0x01fa0be8, 0x01f62762, 0x01f25213, 588b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01ee8ba2, 0x01ead3ba, 0x01e72a07, 0x01e38e38, 0x01e00000, 0x01dc7f10, 598b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01d90b21, 0x01d5a3e9, 0x01d24924, 0x01cefa8d, 0x01cbb7e3, 0x01c880e5, 608b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01c55555, 0x01c234f7, 0x01bf1f8f, 0x01bc14e5, 0x01b914c1, 0x01b61eed, 618b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01b33333, 0x01b05160, 0x01ad7943, 0x01aaaaaa, 0x01a7e567, 0x01a5294a, 628b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01a27627, 0x019fcbd2, 0x019d2a20, 0x019a90e7, 0x01980000, 0x01957741, 638b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x0192f684, 0x01907da4, 0x018e0c7c, 0x018ba2e8, 0x018940c5, 0x0186e5f0, 648b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01849249, 0x018245ae, 0x01800000, 0x017dc11f, 0x017b88ee, 0x0179574e, 658b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01772c23, 0x01750750, 0x0172e8ba, 0x0170d045, 0x016ebdd7, 0x016cb157, 668b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x016aaaaa, 0x0168a9b9, 0x0166ae6a, 0x0164b8a7, 0x0162c859, 0x0160dd67, 678b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x015ef7bd, 0x015d1745, 0x015b3bea, 0x01596596, 0x01579435, 0x0155c7b4, 688b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01540000, 0x01523d03, 0x01507eae, 0x014ec4ec, 0x014d0fac, 0x014b5edc, 698b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x0149b26c, 0x01480a4a, 0x01466666, 0x0144c6af, 0x01432b16, 0x0141938b, 708b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01400000, 0x013e7063, 0x013ce4a9, 0x013b5cc0, 0x0139d89d, 0x01385830, 718b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x0136db6d, 0x01356246, 0x0133ecad, 0x01327a97, 0x01310bf6, 0x012fa0be, 728b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x012e38e3, 0x012cd459, 0x012b7315, 0x012a150a, 0x0128ba2e, 0x01276276, 738b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01260dd6, 0x0124bc44, 0x01236db6, 0x01222222, 0x0120d97c, 0x011f93bc, 748b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x011e50d7, 0x011d10c4, 0x011bd37a, 0x011a98ef, 0x0119611a, 0x01182bf2, 758b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x0116f96f, 0x0115c988, 0x01149c34, 0x0113716a, 0x01124924, 0x01112358, 768b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01100000, 0x010edf12, 0x010dc087, 0x010ca458, 0x010b8a7d, 0x010a72f0, 778b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01095da8, 0x01084a9f, 0x010739ce, 0x01062b2e, 0x01051eb8, 0x01041465, 788b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x01030c30, 0x01020612, 0x01010204, 0x01000000 }, 798b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora { // alpha * KINV_255 808b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00000000, 0x00010101, 0x00020202, 0x00030303, 0x00040404, 0x00050505, 818b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00060606, 0x00070707, 0x00080808, 0x00090909, 0x000a0a0a, 0x000b0b0b, 828b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x000c0c0c, 0x000d0d0d, 0x000e0e0e, 0x000f0f0f, 0x00101010, 0x00111111, 838b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00121212, 0x00131313, 0x00141414, 0x00151515, 0x00161616, 0x00171717, 848b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00181818, 0x00191919, 0x001a1a1a, 0x001b1b1b, 0x001c1c1c, 0x001d1d1d, 858b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x001e1e1e, 0x001f1f1f, 0x00202020, 0x00212121, 0x00222222, 0x00232323, 868b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00242424, 0x00252525, 0x00262626, 0x00272727, 0x00282828, 0x00292929, 878b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x002a2a2a, 0x002b2b2b, 0x002c2c2c, 0x002d2d2d, 0x002e2e2e, 0x002f2f2f, 888b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00303030, 0x00313131, 0x00323232, 0x00333333, 0x00343434, 0x00353535, 898b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00363636, 0x00373737, 0x00383838, 0x00393939, 0x003a3a3a, 0x003b3b3b, 908b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x003c3c3c, 0x003d3d3d, 0x003e3e3e, 0x003f3f3f, 0x00404040, 0x00414141, 918b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00424242, 0x00434343, 0x00444444, 0x00454545, 0x00464646, 0x00474747, 928b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00484848, 0x00494949, 0x004a4a4a, 0x004b4b4b, 0x004c4c4c, 0x004d4d4d, 938b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x004e4e4e, 0x004f4f4f, 0x00505050, 0x00515151, 0x00525252, 0x00535353, 948b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00545454, 0x00555555, 0x00565656, 0x00575757, 0x00585858, 0x00595959, 958b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x005a5a5a, 0x005b5b5b, 0x005c5c5c, 0x005d5d5d, 0x005e5e5e, 0x005f5f5f, 968b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00606060, 0x00616161, 0x00626262, 0x00636363, 0x00646464, 0x00656565, 978b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00666666, 0x00676767, 0x00686868, 0x00696969, 0x006a6a6a, 0x006b6b6b, 988b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x006c6c6c, 0x006d6d6d, 0x006e6e6e, 0x006f6f6f, 0x00707070, 0x00717171, 998b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00727272, 0x00737373, 0x00747474, 0x00757575, 0x00767676, 0x00777777, 1008b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00787878, 0x00797979, 0x007a7a7a, 0x007b7b7b, 0x007c7c7c, 0x007d7d7d, 1018b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x007e7e7e, 0x007f7f7f, 0x00808080, 0x00818181, 0x00828282, 0x00838383, 1028b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00848484, 0x00858585, 0x00868686, 0x00878787, 0x00888888, 0x00898989, 1038b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x008a8a8a, 0x008b8b8b, 0x008c8c8c, 0x008d8d8d, 0x008e8e8e, 0x008f8f8f, 1048b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00909090, 0x00919191, 0x00929292, 0x00939393, 0x00949494, 0x00959595, 1058b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00969696, 0x00979797, 0x00989898, 0x00999999, 0x009a9a9a, 0x009b9b9b, 1068b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x009c9c9c, 0x009d9d9d, 0x009e9e9e, 0x009f9f9f, 0x00a0a0a0, 0x00a1a1a1, 1078b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00a2a2a2, 0x00a3a3a3, 0x00a4a4a4, 0x00a5a5a5, 0x00a6a6a6, 0x00a7a7a7, 1088b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00a8a8a8, 0x00a9a9a9, 0x00aaaaaa, 0x00ababab, 0x00acacac, 0x00adadad, 1098b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00aeaeae, 0x00afafaf, 0x00b0b0b0, 0x00b1b1b1, 0x00b2b2b2, 0x00b3b3b3, 1108b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00b4b4b4, 0x00b5b5b5, 0x00b6b6b6, 0x00b7b7b7, 0x00b8b8b8, 0x00b9b9b9, 1118b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00bababa, 0x00bbbbbb, 0x00bcbcbc, 0x00bdbdbd, 0x00bebebe, 0x00bfbfbf, 1128b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00c0c0c0, 0x00c1c1c1, 0x00c2c2c2, 0x00c3c3c3, 0x00c4c4c4, 0x00c5c5c5, 1138b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00c6c6c6, 0x00c7c7c7, 0x00c8c8c8, 0x00c9c9c9, 0x00cacaca, 0x00cbcbcb, 1148b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00cccccc, 0x00cdcdcd, 0x00cecece, 0x00cfcfcf, 0x00d0d0d0, 0x00d1d1d1, 1158b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00d2d2d2, 0x00d3d3d3, 0x00d4d4d4, 0x00d5d5d5, 0x00d6d6d6, 0x00d7d7d7, 1168b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00d8d8d8, 0x00d9d9d9, 0x00dadada, 0x00dbdbdb, 0x00dcdcdc, 0x00dddddd, 1178b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00dedede, 0x00dfdfdf, 0x00e0e0e0, 0x00e1e1e1, 0x00e2e2e2, 0x00e3e3e3, 1188b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00e4e4e4, 0x00e5e5e5, 0x00e6e6e6, 0x00e7e7e7, 0x00e8e8e8, 0x00e9e9e9, 1198b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00eaeaea, 0x00ebebeb, 0x00ececec, 0x00ededed, 0x00eeeeee, 0x00efefef, 1208b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00f0f0f0, 0x00f1f1f1, 0x00f2f2f2, 0x00f3f3f3, 0x00f4f4f4, 0x00f5f5f5, 1218b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00f6f6f6, 0x00f7f7f7, 0x00f8f8f8, 0x00f9f9f9, 0x00fafafa, 0x00fbfbfb, 1228b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 0x00fcfcfc, 0x00fdfdfd, 0x00fefefe, 0x00ffffff } 1238b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora}; 1248b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 1258b720228d581a84fd173b6dcb2fa295b59db489aVikas Arorastatic WEBP_INLINE uint32_t GetScale(uint32_t a, int inverse) { 1268b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora return kMultTables[!inverse][a]; 1278b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora} 1288b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 1298b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#else 1308b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 1318b720228d581a84fd173b6dcb2fa295b59db489aVikas Arorastatic WEBP_INLINE uint32_t GetScale(uint32_t a, int inverse) { 1328b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora return inverse ? (255u << MFIX) / a : a * KINV_255; 1338b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora} 1348b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 1358b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#endif // USE_TABLES_FOR_ALPHA_MULT 1368b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 1378b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroravoid WebPMultARGBRow(uint32_t* const ptr, int width, int inverse) { 1388b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora int x; 1398b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora for (x = 0; x < width; ++x) { 1408b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora const uint32_t argb = ptr[x]; 1418b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora if (argb < 0xff000000u) { // alpha < 255 1428b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora if (argb <= 0x00ffffffu) { // alpha == 0 1438b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora ptr[x] = 0; 1448b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora } else { 1458b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora const uint32_t alpha = (argb >> 24) & 0xff; 1468b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora const uint32_t scale = GetScale(alpha, inverse); 1478b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora uint32_t out = argb & 0xff000000u; 1488b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora out |= Mult(argb >> 0, scale) << 0; 1498b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora out |= Mult(argb >> 8, scale) << 8; 1508b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora out |= Mult(argb >> 16, scale) << 16; 1518b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora ptr[x] = out; 1528b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora } 1538b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora } 1548b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora } 1558b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora} 1568b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 1578b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroravoid WebPMultARGBRows(uint8_t* ptr, int stride, int width, int num_rows, 1588b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora int inverse) { 1598b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora int n; 1608b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora for (n = 0; n < num_rows; ++n) { 1618b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora WebPMultARGBRow((uint32_t*)ptr, width, inverse); 1628b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora ptr += stride; 1638b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora } 1648b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora} 1658b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 1668b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroravoid WebPMultRow(uint8_t* const ptr, const uint8_t* const alpha, 1678b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora int width, int inverse) { 1688b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora int x; 1698b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora for (x = 0; x < width; ++x) { 1708b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora const uint32_t a = alpha[x]; 1718b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora if (a != 255) { 1728b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora if (a == 0) { 1738b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora ptr[x] = 0; 1748b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora } else { 1758b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora const uint32_t scale = GetScale(a, inverse); 1768b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora ptr[x] = Mult(ptr[x], scale); 1778b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora } 1788b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora } 1798b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora } 1808b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora} 1818b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 1828b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroravoid WebPMultRows(uint8_t* ptr, int stride, 1838b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora const uint8_t* alpha, int alpha_stride, 1848b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora int width, int num_rows, int inverse) { 1858b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora int n; 1868b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora for (n = 0; n < num_rows; ++n) { 1878b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora WebPMultRow(ptr, alpha, width, inverse); 1888b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora ptr += stride; 1898b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora alpha += alpha_stride; 1908b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora } 1918b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora} 1928b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 1938b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#undef KINV_255 1948b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#undef HALF 1958b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#undef MFIX 1968b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora 197