mirror of
https://github.com/webmproject/libwebp.git
synced 2025-07-18 23:09:52 +02:00
Add WebPReplaceTransparentPixels() in dsp
with SSE2 implementation. (Extracted from side experiment) Change-Id: I62d457fb6643645291cffd6d2d205d4a5ffa4517
This commit is contained in:
@ -83,6 +83,19 @@ static int SmoothenBlock(const uint8_t* a_ptr, int a_stride, uint8_t* y_ptr,
|
||||
return (count == 0);
|
||||
}
|
||||
|
||||
void WebPReplaceTransparentPixels(WebPPicture* pic, uint32_t color) {
|
||||
if (pic != NULL && pic->use_argb) {
|
||||
int y = pic->height;
|
||||
uint32_t* argb = pic->argb;
|
||||
color &= 0xffffffu; // force alpha=0
|
||||
WebPInitAlphaProcessing();
|
||||
while (y-- > 0) {
|
||||
WebPAlphaReplace(argb, pic->width, color);
|
||||
argb += pic->argb_stride;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WebPCleanupTransparentArea(WebPPicture* pic) {
|
||||
int x, y, w, h;
|
||||
if (pic == NULL) return;
|
||||
@ -165,24 +178,6 @@ void WebPCleanupTransparentArea(WebPPicture* pic) {
|
||||
#undef SIZE
|
||||
#undef SIZE2
|
||||
|
||||
void WebPCleanupTransparentAreaLossless(WebPPicture* const pic) {
|
||||
int x, y, w, h;
|
||||
uint32_t* argb;
|
||||
assert(pic != NULL && pic->use_argb);
|
||||
w = pic->width;
|
||||
h = pic->height;
|
||||
argb = pic->argb;
|
||||
|
||||
for (y = 0; y < h; ++y) {
|
||||
for (x = 0; x < w; ++x) {
|
||||
if ((argb[x] & 0xff000000) == 0) {
|
||||
argb[x] = 0x00000000;
|
||||
}
|
||||
}
|
||||
argb += pic->argb_stride;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Blend color and remove transparency info
|
||||
|
||||
|
@ -505,9 +505,9 @@ int WebPPictureAllocARGB(WebPPicture* const picture, int width, int height);
|
||||
// Returns false in case of error (invalid param, out-of-memory).
|
||||
int WebPPictureAllocYUVA(WebPPicture* const picture, int width, int height);
|
||||
|
||||
// Clean-up the RGB samples under fully transparent area, to help lossless
|
||||
// compressibility (no guarantee, though). Assumes that pic->use_argb is true.
|
||||
void WebPCleanupTransparentAreaLossless(WebPPicture* const pic);
|
||||
// Replace samples that are fully transparent by 'color' to help compressibility
|
||||
// (no guarantee, though). Assumes pic->use_argb is true.
|
||||
void WebPReplaceTransparentPixels(WebPPicture* const pic, uint32_t color);
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
@ -400,7 +400,7 @@ int WebPEncode(const WebPConfig* config, WebPPicture* pic) {
|
||||
}
|
||||
|
||||
if (!config->exact) {
|
||||
WebPCleanupTransparentAreaLossless(pic);
|
||||
WebPReplaceTransparentPixels(pic, 0x000000);
|
||||
}
|
||||
|
||||
ok = VP8LEncodeImage(config, pic); // Sets pic->error in case of problem.
|
||||
|
Reference in New Issue
Block a user