/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkUnPreMultiply.h"
#include "include/core/SkColorPriv.h"
SkColor SkUnPreMultiply::PMColorToColor(SkPMColor c) {
const unsigned a = SkGetPackedA32(c);
const Scale scale = GetScale(a);
return SkColorSetARGB(a,
ApplyScale(scale, SkGetPackedR32(c)),
ApplyScale(scale, SkGetPackedG32(c)),
ApplyScale(scale, SkGetPackedB32(c)));
}
const uint32_t SkUnPreMultiply::gTable[] = {
0 x00000000, 0 xFF000000, 0 x7F800000, 0 x55000000, 0 x3FC00000, 0 x33000000, 0 x2A800000, 0 x246DB6DB,
0 x1FE00000, 0 x1C555555, 0 x19800000, 0 x172E8BA3, 0 x15400000, 0 x139D89D9, 0 x1236DB6E, 0 x11000000,
0 x0FF00000, 0 x0F000000, 0 x0E2AAAAB, 0 x0D6BCA1B, 0 x0CC00000, 0 x0C249249, 0 x0B9745D1, 0 x0B1642C8,
0 x0AA00000, 0 x0A333333, 0 x09CEC4EC, 0 x0971C71C, 0 x091B6DB7, 0 x08CB08D4, 0 x08800000, 0 x0839CE74,
0 x07F80000, 0 x07BA2E8C, 0 x07800000, 0 x07492492, 0 x07155555, 0 x06E45307, 0 x06B5E50D, 0 x0689D89E,
0 x06600000, 0 x063831F4, 0 x06124925, 0 x05EE23B9, 0 x05CBA2E9, 0 x05AAAAAB, 0 x058B2164, 0 x056CEFA9,
0 x05500000, 0 x05343EB2, 0 x0519999A, 0 x05000000, 0 x04E76276, 0 x04CFB2B8, 0 x04B8E38E, 0 x04A2E8BA,
0 x048DB6DB, 0 x0479435E, 0 x0465846A, 0 x045270D0, 0 x04400000, 0 x042E29F8, 0 x041CE73A, 0 x040C30C3,
0 x03FC0000, 0 x03EC4EC5, 0 x03DD1746, 0 x03CE540F, 0 x03C00000, 0 x03B21643, 0 x03A49249, 0 x03976FC6,
0 x038AAAAB, 0 x037E3F20, 0 x03722983, 0 x03666666, 0 x035AF287, 0 x034FCACE, 0 x0344EC4F, 0 x033A5441,
0 x03300000, 0 x0325ED09, 0 x031C18FA, 0 x0312818B, 0 x03092492, 0 x03000000, 0 x02F711DC, 0 x02EE5847,
0 x02E5D174, 0 x02DD7BAF, 0 x02D55555, 0 x02CD5CD6, 0 x02C590B2, 0 x02BDEF7C, 0 x02B677D4, 0 x02AF286C,
0 x02A80000, 0 x02A0FD5C, 0 x029A1F59, 0 x029364D9, 0 x028CCCCD, 0 x0286562E, 0 x02800000, 0 x0279C952,
0 x0273B13B, 0 x026DB6DB, 0 x0267D95C, 0 x026217ED, 0 x025C71C7, 0 x0256E62A, 0 x0251745D, 0 x024C1BAD,
0 x0246DB6E, 0 x0241B2F9, 0 x023CA1AF, 0 x0237A6F5, 0 x0232C235, 0 x022DF2DF, 0 x02293868, 0 x02249249,
0 x02200000, 0 x021B810F, 0 x021714FC, 0 x0212BB51, 0 x020E739D, 0 x020A3D71, 0 x02061862, 0 x02020408,
0 x01FE0000, 0 x01FA0BE8, 0 x01F62762, 0 x01F25214, 0 x01EE8BA3, 0 x01EAD3BB, 0 x01E72A08, 0 x01E38E39,
0 x01E00000, 0 x01DC7F11, 0 x01D90B21, 0 x01D5A3EA, 0 x01D24925, 0 x01CEFA8E, 0 x01CBB7E3, 0 x01C880E5,
0 x01C55555, 0 x01C234F7, 0 x01BF1F90, 0 x01BC14E6, 0 x01B914C2, 0 x01B61EED, 0 x01B33333, 0 x01B05161,
0 x01AD7943, 0 x01AAAAAB, 0 x01A7E567, 0 x01A5294A, 0 x01A27627, 0 x019FCBD2, 0 x019D2A20, 0 x019A90E8,
0 x01980000, 0 x01957741, 0 x0192F685, 0 x01907DA5, 0 x018E0C7D, 0 x018BA2E9, 0 x018940C5, 0 x0186E5F1,
0 x01849249, 0 x018245AE, 0 x01800000, 0 x017DC11F, 0 x017B88EE, 0 x0179574E, 0 x01772C23, 0 x01750750,
0 x0172E8BA, 0 x0170D045, 0 x016EBDD8, 0 x016CB157, 0 x016AAAAB, 0 x0168A9B9, 0 x0166AE6B, 0 x0164B8A8,
0 x0162C859, 0 x0160DD68, 0 x015EF7BE, 0 x015D1746, 0 x015B3BEA, 0 x01596596, 0 x01579436, 0 x0155C7B5,
0 x01540000, 0 x01523D04, 0 x01507EAE, 0 x014EC4EC, 0 x014D0FAC, 0 x014B5EDD, 0 x0149B26D, 0 x01480A4B,
0 x01466666, 0 x0144C6B0, 0 x01432B17, 0 x0141938C, 0 x01400000, 0 x013E7064, 0 x013CE4A9, 0 x013B5CC1,
0 x0139D89E, 0 x01385831, 0 x0136DB6E, 0 x01356246, 0 x0133ECAE, 0 x01327A97, 0 x01310BF6, 0 x012FA0BF,
0 x012E38E4, 0 x012CD45A, 0 x012B7315, 0 x012A150B, 0 x0128BA2F, 0 x01276276, 0 x01260DD6, 0 x0124BC45,
0 x01236DB7, 0 x01222222, 0 x0120D97D, 0 x011F93BC, 0 x011E50D8, 0 x011D10C5, 0 x011BD37A, 0 x011A98EF,
0 x0119611A, 0 x01182BF3, 0 x0116F970, 0 x0115C988, 0 x01149C34, 0 x0113716B, 0 x01124925, 0 x01112359,
0 x01100000, 0 x010EDF12, 0 x010DC087, 0 x010CA458, 0 x010B8A7E, 0 x010A72F0, 0 x01095DA9, 0 x01084AA0,
0 x010739CE, 0 x01062B2E, 0 x01051EB8, 0 x01041466, 0 x01030C31, 0 x01020612, 0 x01010204, 0 x01000000
};
#ifdef BUILD_DIVIDE_TABLE
void SkUnPreMultiply_BuildTable() {
for (unsigned i = 0 ; i <= 255 ; i++) {
uint32_t scale;
if (0 == i) {
scale = 0 ;
} else {
scale = ((255 << 24 ) + (i >> 1 )) / i;
}
SkDebugf(" 0x%08X," , scale);
if ((i & 7 ) == 7 ) {
SkDebugf("\n" );
}
// test the result
for (int j = 1 ; j <= i; j++) {
uint32_t test = (j * scale + (1 << 23 )) >> 24 ;
uint32_t div = roundf(j * 255 .0 f / i);
int diff = SkAbs32(test - div);
SkASSERT(diff <= 1 && test <= 255 );
}
}
}
#endif
Messung V0.5 in Prozent C=91 H=98 G=94
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-06)
¤
*© Formatika GbR, Deutschland