mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-27 06:08:21 +01:00
Merge "Remove the argb* files."
This commit is contained in:
commit
28914528e1
@ -51,9 +51,6 @@ dsp_dec_srcs := \
|
|||||||
src/dsp/alpha_processing_neon.$(NEON) \
|
src/dsp/alpha_processing_neon.$(NEON) \
|
||||||
src/dsp/alpha_processing_sse2.c \
|
src/dsp/alpha_processing_sse2.c \
|
||||||
src/dsp/alpha_processing_sse41.c \
|
src/dsp/alpha_processing_sse41.c \
|
||||||
src/dsp/argb.c \
|
|
||||||
src/dsp/argb_mips_dsp_r2.c \
|
|
||||||
src/dsp/argb_sse2.c \
|
|
||||||
src/dsp/cpu.c \
|
src/dsp/cpu.c \
|
||||||
src/dsp/dec.c \
|
src/dsp/dec.c \
|
||||||
src/dsp/dec_clip_tables.c \
|
src/dsp/dec_clip_tables.c \
|
||||||
|
@ -233,9 +233,6 @@ DSP_DEC_OBJS = \
|
|||||||
$(DIROBJ)\dsp\yuv_sse2.obj \
|
$(DIROBJ)\dsp\yuv_sse2.obj \
|
||||||
|
|
||||||
DSP_ENC_OBJS = \
|
DSP_ENC_OBJS = \
|
||||||
$(DIROBJ)\dsp\argb.obj \
|
|
||||||
$(DIROBJ)\dsp\argb_mips_dsp_r2.obj \
|
|
||||||
$(DIROBJ)\dsp\argb_sse2.obj \
|
|
||||||
$(DIROBJ)\dsp\cost.obj \
|
$(DIROBJ)\dsp\cost.obj \
|
||||||
$(DIROBJ)\dsp\cost_mips32.obj \
|
$(DIROBJ)\dsp\cost_mips32.obj \
|
||||||
$(DIROBJ)\dsp\cost_mips_dsp_r2.obj \
|
$(DIROBJ)\dsp\cost_mips_dsp_r2.obj \
|
||||||
|
@ -119,9 +119,6 @@ model {
|
|||||||
include "alpha_processing_neon.$NEON"
|
include "alpha_processing_neon.$NEON"
|
||||||
include "alpha_processing_sse2.c"
|
include "alpha_processing_sse2.c"
|
||||||
include "alpha_processing_sse41.c"
|
include "alpha_processing_sse41.c"
|
||||||
include "argb.c"
|
|
||||||
include "argb_mips_dsp_r2.c"
|
|
||||||
include "argb_sse2.c"
|
|
||||||
include "cpu.c"
|
include "cpu.c"
|
||||||
include "dec.c"
|
include "dec.c"
|
||||||
include "dec_clip_tables.c"
|
include "dec_clip_tables.c"
|
||||||
|
@ -173,9 +173,6 @@ DSP_DEC_OBJS = \
|
|||||||
src/dsp/yuv_sse2.o \
|
src/dsp/yuv_sse2.o \
|
||||||
|
|
||||||
DSP_ENC_OBJS = \
|
DSP_ENC_OBJS = \
|
||||||
src/dsp/argb.o \
|
|
||||||
src/dsp/argb_mips_dsp_r2.o \
|
|
||||||
src/dsp/argb_sse2.o \
|
|
||||||
src/dsp/cost.o \
|
src/dsp/cost.o \
|
||||||
src/dsp/cost_mips32.o \
|
src/dsp/cost_mips32.o \
|
||||||
src/dsp/cost_mips_dsp_r2.o \
|
src/dsp/cost_mips_dsp_r2.o \
|
||||||
|
@ -39,8 +39,6 @@ COMMON_SOURCES += yuv_mips32.c
|
|||||||
COMMON_SOURCES += yuv_mips_dsp_r2.c
|
COMMON_SOURCES += yuv_mips_dsp_r2.c
|
||||||
|
|
||||||
ENC_SOURCES =
|
ENC_SOURCES =
|
||||||
ENC_SOURCES += argb.c
|
|
||||||
ENC_SOURCES += argb_mips_dsp_r2.c
|
|
||||||
ENC_SOURCES += cost.c
|
ENC_SOURCES += cost.c
|
||||||
ENC_SOURCES += cost_mips32.c
|
ENC_SOURCES += cost_mips32.c
|
||||||
ENC_SOURCES += cost_mips_dsp_r2.c
|
ENC_SOURCES += cost_mips_dsp_r2.c
|
||||||
@ -97,7 +95,6 @@ libwebpdspdecode_msa_la_CPPFLAGS = $(libwebpdsp_msa_la_CPPFLAGS)
|
|||||||
libwebpdspdecode_msa_la_CFLAGS = $(libwebpdsp_msa_la_CFLAGS)
|
libwebpdspdecode_msa_la_CFLAGS = $(libwebpdsp_msa_la_CFLAGS)
|
||||||
|
|
||||||
libwebpdsp_sse2_la_SOURCES =
|
libwebpdsp_sse2_la_SOURCES =
|
||||||
libwebpdsp_sse2_la_SOURCES += argb_sse2.c
|
|
||||||
libwebpdsp_sse2_la_SOURCES += cost_sse2.c
|
libwebpdsp_sse2_la_SOURCES += cost_sse2.c
|
||||||
libwebpdsp_sse2_la_SOURCES += enc_sse2.c
|
libwebpdsp_sse2_la_SOURCES += enc_sse2.c
|
||||||
libwebpdsp_sse2_la_SOURCES += lossless_enc_sse2.c
|
libwebpdsp_sse2_la_SOURCES += lossless_enc_sse2.c
|
||||||
|
@ -339,12 +339,30 @@ static void ExtractGreen_C(const uint32_t* argb, uint8_t* alpha, int size) {
|
|||||||
for (i = 0; i < size; ++i) alpha[i] = argb[i] >> 8;
|
for (i = 0; i < size; ++i) alpha[i] = argb[i] >> 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Simple channel manipulations.
|
||||||
|
|
||||||
|
static WEBP_INLINE uint32_t MakeARGB32(int a, int r, int g, int b) {
|
||||||
|
return (((uint32_t)a << 24) | (r << 16) | (g << 8) | b);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PackRGB_C(const uint8_t* r, const uint8_t* g, const uint8_t* b,
|
||||||
|
int len, int step, uint32_t* out) {
|
||||||
|
int i, offset = 0;
|
||||||
|
for (i = 0; i < len; ++i) {
|
||||||
|
out[i] = MakeARGB32(0xff, r[offset], g[offset], b[offset]);
|
||||||
|
offset += step;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void (*WebPApplyAlphaMultiply)(uint8_t*, int, int, int, int);
|
void (*WebPApplyAlphaMultiply)(uint8_t*, int, int, int, int);
|
||||||
void (*WebPApplyAlphaMultiply4444)(uint8_t*, int, int, int);
|
void (*WebPApplyAlphaMultiply4444)(uint8_t*, int, int, int);
|
||||||
int (*WebPDispatchAlpha)(const uint8_t*, int, int, int, uint8_t*, int);
|
int (*WebPDispatchAlpha)(const uint8_t*, int, int, int, uint8_t*, int);
|
||||||
void (*WebPDispatchAlphaToGreen)(const uint8_t*, int, int, int, uint32_t*, int);
|
void (*WebPDispatchAlphaToGreen)(const uint8_t*, int, int, int, uint32_t*, int);
|
||||||
int (*WebPExtractAlpha)(const uint8_t*, int, int, int, uint8_t*, int);
|
int (*WebPExtractAlpha)(const uint8_t*, int, int, int, uint8_t*, int);
|
||||||
void (*WebPExtractGreen)(const uint32_t* argb, uint8_t* alpha, int size);
|
void (*WebPExtractGreen)(const uint32_t* argb, uint8_t* alpha, int size);
|
||||||
|
void (*WebPPackRGB)(const uint8_t* r, const uint8_t* g, const uint8_t* b,
|
||||||
|
int len, int step, uint32_t* out);
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Init function
|
// Init function
|
||||||
@ -370,6 +388,8 @@ WEBP_TSAN_IGNORE_FUNCTION void WebPInitAlphaProcessing(void) {
|
|||||||
WebPExtractAlpha = ExtractAlpha_C;
|
WebPExtractAlpha = ExtractAlpha_C;
|
||||||
WebPExtractGreen = ExtractGreen_C;
|
WebPExtractGreen = ExtractGreen_C;
|
||||||
|
|
||||||
|
WebPPackRGB = PackRGB_C;
|
||||||
|
|
||||||
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
|
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
|
||||||
if (VP8GetCPUInfo != NULL) {
|
if (VP8GetCPUInfo != NULL) {
|
||||||
#if defined(WEBP_USE_SSE2)
|
#if defined(WEBP_USE_SSE2)
|
||||||
|
@ -124,6 +124,45 @@ static void MultARGBRow(uint32_t* const ptr, int width, int inverse) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void PackRGB_MIPSdspR2(const uint8_t* r, const uint8_t* g,
|
||||||
|
const uint8_t* b, int len, int step,
|
||||||
|
uint32_t* out) {
|
||||||
|
int temp0, temp1, temp2, offset;
|
||||||
|
const int rest = len & 1;
|
||||||
|
const int a = 0xff;
|
||||||
|
const uint32_t* const loop_end = out + len - rest;
|
||||||
|
__asm__ volatile (
|
||||||
|
"xor %[offset], %[offset], %[offset] \n\t"
|
||||||
|
"beq %[loop_end], %[out], 0f \n\t"
|
||||||
|
"2: \n\t"
|
||||||
|
"lbux %[temp0], %[offset](%[r]) \n\t"
|
||||||
|
"lbux %[temp1], %[offset](%[g]) \n\t"
|
||||||
|
"lbux %[temp2], %[offset](%[b]) \n\t"
|
||||||
|
"ins %[temp0], %[a], 16, 16 \n\t"
|
||||||
|
"ins %[temp2], %[temp1], 16, 16 \n\t"
|
||||||
|
"addiu %[out], %[out], 4 \n\t"
|
||||||
|
"precr.qb.ph %[temp0], %[temp0], %[temp2] \n\t"
|
||||||
|
"sw %[temp0], -4(%[out]) \n\t"
|
||||||
|
"addu %[offset], %[offset], %[step] \n\t"
|
||||||
|
"bne %[loop_end], %[out], 2b \n\t"
|
||||||
|
"0: \n\t"
|
||||||
|
"beq %[rest], $zero, 1f \n\t"
|
||||||
|
"lbux %[temp0], %[offset](%[r]) \n\t"
|
||||||
|
"lbux %[temp1], %[offset](%[g]) \n\t"
|
||||||
|
"lbux %[temp2], %[offset](%[b]) \n\t"
|
||||||
|
"ins %[temp0], %[a], 16, 16 \n\t"
|
||||||
|
"ins %[temp2], %[temp1], 16, 16 \n\t"
|
||||||
|
"precr.qb.ph %[temp0], %[temp0], %[temp2] \n\t"
|
||||||
|
"sw %[temp0], 0(%[out]) \n\t"
|
||||||
|
"1: \n\t"
|
||||||
|
: [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2),
|
||||||
|
[offset]"=&r"(offset), [out]"+&r"(out)
|
||||||
|
: [a]"r"(a), [r]"r"(r), [g]"r"(g), [b]"r"(b), [step]"r"(step),
|
||||||
|
[loop_end]"r"(loop_end), [rest]"r"(rest)
|
||||||
|
: "memory"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Entry point
|
// Entry point
|
||||||
|
|
||||||
@ -132,6 +171,7 @@ extern void WebPInitAlphaProcessingMIPSdspR2(void);
|
|||||||
WEBP_TSAN_IGNORE_FUNCTION void WebPInitAlphaProcessingMIPSdspR2(void) {
|
WEBP_TSAN_IGNORE_FUNCTION void WebPInitAlphaProcessingMIPSdspR2(void) {
|
||||||
WebPDispatchAlpha = DispatchAlpha;
|
WebPDispatchAlpha = DispatchAlpha;
|
||||||
WebPMultARGBRow = MultARGBRow;
|
WebPMultARGBRow = MultARGBRow;
|
||||||
|
WebPPackRGB = PackRGB_MIPSdspR2;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // !WEBP_USE_MIPS_DSP_R2
|
#else // !WEBP_USE_MIPS_DSP_R2
|
||||||
|
@ -1,68 +0,0 @@
|
|||||||
// Copyright 2014 Google Inc. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style license
|
|
||||||
// that can be found in the COPYING file in the root of the source
|
|
||||||
// tree. An additional intellectual property rights grant can be found
|
|
||||||
// in the file PATENTS. All contributing project authors may
|
|
||||||
// be found in the AUTHORS file in the root of the source tree.
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// ARGB making functions.
|
|
||||||
//
|
|
||||||
// Author: Djordje Pesut (djordje.pesut@imgtec.com)
|
|
||||||
|
|
||||||
#include "./dsp.h"
|
|
||||||
|
|
||||||
static WEBP_INLINE uint32_t MakeARGB32(int a, int r, int g, int b) {
|
|
||||||
return (((uint32_t)a << 24) | (r << 16) | (g << 8) | b);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void PackARGB(const uint8_t* a, const uint8_t* r, const uint8_t* g,
|
|
||||||
const uint8_t* b, int len, uint32_t* out) {
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
out[i] = MakeARGB32(a[4 * i], r[4 * i], g[4 * i], b[4 * i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void PackRGB(const uint8_t* r, const uint8_t* g, const uint8_t* b,
|
|
||||||
int len, int step, uint32_t* out) {
|
|
||||||
int i, offset = 0;
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
out[i] = MakeARGB32(0xff, r[offset], g[offset], b[offset]);
|
|
||||||
offset += step;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void (*VP8PackARGB)(const uint8_t*, const uint8_t*, const uint8_t*,
|
|
||||||
const uint8_t*, int, uint32_t*);
|
|
||||||
void (*VP8PackRGB)(const uint8_t*, const uint8_t*, const uint8_t*,
|
|
||||||
int, int, uint32_t*);
|
|
||||||
|
|
||||||
extern void VP8EncDspARGBInitMIPSdspR2(void);
|
|
||||||
extern void VP8EncDspARGBInitSSE2(void);
|
|
||||||
|
|
||||||
static volatile VP8CPUInfo argb_last_cpuinfo_used =
|
|
||||||
(VP8CPUInfo)&argb_last_cpuinfo_used;
|
|
||||||
|
|
||||||
WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspARGBInit(void) {
|
|
||||||
if (argb_last_cpuinfo_used == VP8GetCPUInfo) return;
|
|
||||||
|
|
||||||
VP8PackARGB = PackARGB;
|
|
||||||
VP8PackRGB = PackRGB;
|
|
||||||
|
|
||||||
// If defined, use CPUInfo() to overwrite some pointers with faster versions.
|
|
||||||
if (VP8GetCPUInfo != NULL) {
|
|
||||||
#if defined(WEBP_USE_SSE2)
|
|
||||||
if (VP8GetCPUInfo(kSSE2)) {
|
|
||||||
VP8EncDspARGBInitSSE2();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(WEBP_USE_MIPS_DSP_R2)
|
|
||||||
if (VP8GetCPUInfo(kMIPSdspR2)) {
|
|
||||||
VP8EncDspARGBInitMIPSdspR2();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
argb_last_cpuinfo_used = VP8GetCPUInfo;
|
|
||||||
}
|
|
@ -1,110 +0,0 @@
|
|||||||
// Copyright 2014 Google Inc. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style license
|
|
||||||
// that can be found in the COPYING file in the root of the source
|
|
||||||
// tree. An additional intellectual property rights grant can be found
|
|
||||||
// in the file PATENTS. All contributing project authors may
|
|
||||||
// be found in the AUTHORS file in the root of the source tree.
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// ARGB making functions (mips version).
|
|
||||||
//
|
|
||||||
// Author: Djordje Pesut (djordje.pesut@imgtec.com)
|
|
||||||
|
|
||||||
#include "./dsp.h"
|
|
||||||
|
|
||||||
#if defined(WEBP_USE_MIPS_DSP_R2)
|
|
||||||
|
|
||||||
static void PackARGB(const uint8_t* a, const uint8_t* r, const uint8_t* g,
|
|
||||||
const uint8_t* b, int len, uint32_t* out) {
|
|
||||||
int temp0, temp1, temp2, temp3, offset;
|
|
||||||
const int rest = len & 1;
|
|
||||||
const uint32_t* const loop_end = out + len - rest;
|
|
||||||
const int step = 4;
|
|
||||||
__asm__ volatile (
|
|
||||||
"xor %[offset], %[offset], %[offset] \n\t"
|
|
||||||
"beq %[loop_end], %[out], 0f \n\t"
|
|
||||||
"2: \n\t"
|
|
||||||
"lbux %[temp0], %[offset](%[a]) \n\t"
|
|
||||||
"lbux %[temp1], %[offset](%[r]) \n\t"
|
|
||||||
"lbux %[temp2], %[offset](%[g]) \n\t"
|
|
||||||
"lbux %[temp3], %[offset](%[b]) \n\t"
|
|
||||||
"ins %[temp1], %[temp0], 16, 16 \n\t"
|
|
||||||
"ins %[temp3], %[temp2], 16, 16 \n\t"
|
|
||||||
"addiu %[out], %[out], 4 \n\t"
|
|
||||||
"precr.qb.ph %[temp0], %[temp1], %[temp3] \n\t"
|
|
||||||
"sw %[temp0], -4(%[out]) \n\t"
|
|
||||||
"addu %[offset], %[offset], %[step] \n\t"
|
|
||||||
"bne %[loop_end], %[out], 2b \n\t"
|
|
||||||
"0: \n\t"
|
|
||||||
"beq %[rest], $zero, 1f \n\t"
|
|
||||||
"lbux %[temp0], %[offset](%[a]) \n\t"
|
|
||||||
"lbux %[temp1], %[offset](%[r]) \n\t"
|
|
||||||
"lbux %[temp2], %[offset](%[g]) \n\t"
|
|
||||||
"lbux %[temp3], %[offset](%[b]) \n\t"
|
|
||||||
"ins %[temp1], %[temp0], 16, 16 \n\t"
|
|
||||||
"ins %[temp3], %[temp2], 16, 16 \n\t"
|
|
||||||
"precr.qb.ph %[temp0], %[temp1], %[temp3] \n\t"
|
|
||||||
"sw %[temp0], 0(%[out]) \n\t"
|
|
||||||
"1: \n\t"
|
|
||||||
: [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2),
|
|
||||||
[temp3]"=&r"(temp3), [offset]"=&r"(offset), [out]"+&r"(out)
|
|
||||||
: [a]"r"(a), [r]"r"(r), [g]"r"(g), [b]"r"(b), [step]"r"(step),
|
|
||||||
[loop_end]"r"(loop_end), [rest]"r"(rest)
|
|
||||||
: "memory"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void PackRGB(const uint8_t* r, const uint8_t* g, const uint8_t* b,
|
|
||||||
int len, int step, uint32_t* out) {
|
|
||||||
int temp0, temp1, temp2, offset;
|
|
||||||
const int rest = len & 1;
|
|
||||||
const int a = 0xff;
|
|
||||||
const uint32_t* const loop_end = out + len - rest;
|
|
||||||
__asm__ volatile (
|
|
||||||
"xor %[offset], %[offset], %[offset] \n\t"
|
|
||||||
"beq %[loop_end], %[out], 0f \n\t"
|
|
||||||
"2: \n\t"
|
|
||||||
"lbux %[temp0], %[offset](%[r]) \n\t"
|
|
||||||
"lbux %[temp1], %[offset](%[g]) \n\t"
|
|
||||||
"lbux %[temp2], %[offset](%[b]) \n\t"
|
|
||||||
"ins %[temp0], %[a], 16, 16 \n\t"
|
|
||||||
"ins %[temp2], %[temp1], 16, 16 \n\t"
|
|
||||||
"addiu %[out], %[out], 4 \n\t"
|
|
||||||
"precr.qb.ph %[temp0], %[temp0], %[temp2] \n\t"
|
|
||||||
"sw %[temp0], -4(%[out]) \n\t"
|
|
||||||
"addu %[offset], %[offset], %[step] \n\t"
|
|
||||||
"bne %[loop_end], %[out], 2b \n\t"
|
|
||||||
"0: \n\t"
|
|
||||||
"beq %[rest], $zero, 1f \n\t"
|
|
||||||
"lbux %[temp0], %[offset](%[r]) \n\t"
|
|
||||||
"lbux %[temp1], %[offset](%[g]) \n\t"
|
|
||||||
"lbux %[temp2], %[offset](%[b]) \n\t"
|
|
||||||
"ins %[temp0], %[a], 16, 16 \n\t"
|
|
||||||
"ins %[temp2], %[temp1], 16, 16 \n\t"
|
|
||||||
"precr.qb.ph %[temp0], %[temp0], %[temp2] \n\t"
|
|
||||||
"sw %[temp0], 0(%[out]) \n\t"
|
|
||||||
"1: \n\t"
|
|
||||||
: [temp0]"=&r"(temp0), [temp1]"=&r"(temp1), [temp2]"=&r"(temp2),
|
|
||||||
[offset]"=&r"(offset), [out]"+&r"(out)
|
|
||||||
: [a]"r"(a), [r]"r"(r), [g]"r"(g), [b]"r"(b), [step]"r"(step),
|
|
||||||
[loop_end]"r"(loop_end), [rest]"r"(rest)
|
|
||||||
: "memory"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// Entry point
|
|
||||||
|
|
||||||
extern void VP8EncDspARGBInitMIPSdspR2(void);
|
|
||||||
|
|
||||||
WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspARGBInitMIPSdspR2(void) {
|
|
||||||
VP8PackARGB = PackARGB;
|
|
||||||
VP8PackRGB = PackRGB;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else // !WEBP_USE_MIPS_DSP_R2
|
|
||||||
|
|
||||||
WEBP_DSP_INIT_STUB(VP8EncDspARGBInitMIPSdspR2)
|
|
||||||
|
|
||||||
#endif // WEBP_USE_MIPS_DSP_R2
|
|
@ -1,53 +0,0 @@
|
|||||||
// Copyright 2014 Google Inc. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style license
|
|
||||||
// that can be found in the COPYING file in the root of the source
|
|
||||||
// tree. An additional intellectual property rights grant can be found
|
|
||||||
// in the file PATENTS. All contributing project authors may
|
|
||||||
// be found in the AUTHORS file in the root of the source tree.
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// ARGB making functions (SSE2 version).
|
|
||||||
//
|
|
||||||
// Author: Skal (pascal.massimino@gmail.com)
|
|
||||||
|
|
||||||
#include "./dsp.h"
|
|
||||||
#include "./lossless.h"
|
|
||||||
|
|
||||||
#if defined(WEBP_USE_SSE2)
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <emmintrin.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
static void PackARGB(const uint8_t* a, const uint8_t* r, const uint8_t* g,
|
|
||||||
const uint8_t* b, int len, uint32_t* out) {
|
|
||||||
(void)a;
|
|
||||||
if (g == r + 1) { // RGBA input order. Need to swap R and B.
|
|
||||||
assert(b == r + 2);
|
|
||||||
assert(a == r + 3);
|
|
||||||
VP8LConvertBGRAToRGBA((const uint32_t*)r, len, (uint8_t*)out);
|
|
||||||
} else {
|
|
||||||
assert(g == b + 1);
|
|
||||||
assert(r == b + 2);
|
|
||||||
assert(a == b + 3);
|
|
||||||
memcpy(out, b, len * 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// Entry point
|
|
||||||
|
|
||||||
extern void VP8EncDspARGBInitSSE2(void);
|
|
||||||
extern void VP8LDspInitSSE2(void);
|
|
||||||
|
|
||||||
WEBP_TSAN_IGNORE_FUNCTION void VP8EncDspARGBInitSSE2(void) {
|
|
||||||
VP8LDspInitSSE2();
|
|
||||||
VP8PackARGB = PackARGB;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else // !WEBP_USE_SSE2
|
|
||||||
|
|
||||||
WEBP_DSP_INIT_STUB(VP8EncDspARGBInitSSE2)
|
|
||||||
|
|
||||||
#endif // WEBP_USE_SSE2
|
|
@ -542,20 +542,12 @@ void WebPMultRowC(uint8_t* const ptr, const uint8_t* const alpha,
|
|||||||
int width, int inverse);
|
int width, int inverse);
|
||||||
void WebPMultARGBRowC(uint32_t* const ptr, int width, int inverse);
|
void WebPMultARGBRowC(uint32_t* const ptr, int width, int inverse);
|
||||||
|
|
||||||
// To be called first before using the above.
|
|
||||||
void WebPInitAlphaProcessing(void);
|
|
||||||
|
|
||||||
// ARGB packing function: a/r/g/b input is rgba or bgra order.
|
|
||||||
extern void (*VP8PackARGB)(const uint8_t* a, const uint8_t* r,
|
|
||||||
const uint8_t* g, const uint8_t* b, int len,
|
|
||||||
uint32_t* out);
|
|
||||||
|
|
||||||
// RGB packing function. 'step' can be 3 or 4. r/g/b input is rgb or bgr order.
|
// RGB packing function. 'step' can be 3 or 4. r/g/b input is rgb or bgr order.
|
||||||
extern void (*VP8PackRGB)(const uint8_t* r, const uint8_t* g, const uint8_t* b,
|
extern void (*WebPPackRGB)(const uint8_t* r, const uint8_t* g, const uint8_t* b,
|
||||||
int len, int step, uint32_t* out);
|
int len, int step, uint32_t* out);
|
||||||
|
|
||||||
// To be called first before using the above.
|
// To be called first before using the above.
|
||||||
void VP8EncDspARGBInit(void);
|
void WebPInitAlphaProcessing(void);
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Filter functions
|
// Filter functions
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
#include "./vp8i_enc.h"
|
#include "./vp8i_enc.h"
|
||||||
#include "../utils/random_utils.h"
|
#include "../utils/random_utils.h"
|
||||||
#include "../utils/utils.h"
|
#include "../utils/utils.h"
|
||||||
|
#include "../dsp/dsp.h"
|
||||||
|
#include "../dsp/lossless.h"
|
||||||
#include "../dsp/yuv.h"
|
#include "../dsp/yuv.h"
|
||||||
|
|
||||||
// Uncomment to disable gamma-compression during RGB->U/V averaging
|
// Uncomment to disable gamma-compression during RGB->U/V averaging
|
||||||
@ -1085,45 +1087,45 @@ int WebPPictureYUVAToARGB(WebPPicture* picture) {
|
|||||||
// automatic import / conversion
|
// automatic import / conversion
|
||||||
|
|
||||||
static int Import(WebPPicture* const picture,
|
static int Import(WebPPicture* const picture,
|
||||||
const uint8_t* const rgb, int rgb_stride,
|
const uint8_t* rgb, int rgb_stride,
|
||||||
int step, int swap_rb, int import_alpha) {
|
int step, int swap_rb, int import_alpha) {
|
||||||
int y;
|
int y;
|
||||||
const uint8_t* r_ptr = rgb + (swap_rb ? 2 : 0);
|
const uint8_t* r_ptr = rgb + (swap_rb ? 2 : 0);
|
||||||
const uint8_t* g_ptr = rgb + 1;
|
const uint8_t* g_ptr = rgb + 1;
|
||||||
const uint8_t* b_ptr = rgb + (swap_rb ? 0 : 2);
|
const uint8_t* b_ptr = rgb + (swap_rb ? 0 : 2);
|
||||||
const uint8_t* a_ptr = import_alpha ? rgb + 3 : NULL;
|
|
||||||
const int width = picture->width;
|
const int width = picture->width;
|
||||||
const int height = picture->height;
|
const int height = picture->height;
|
||||||
|
|
||||||
if (!picture->use_argb) {
|
if (!picture->use_argb) {
|
||||||
|
const uint8_t* a_ptr = import_alpha ? rgb + 3 : NULL;
|
||||||
return ImportYUVAFromRGBA(r_ptr, g_ptr, b_ptr, a_ptr, step, rgb_stride,
|
return ImportYUVAFromRGBA(r_ptr, g_ptr, b_ptr, a_ptr, step, rgb_stride,
|
||||||
0.f /* no dithering */, 0, picture);
|
0.f /* no dithering */, 0, picture);
|
||||||
}
|
}
|
||||||
if (!WebPPictureAlloc(picture)) return 0;
|
if (!WebPPictureAlloc(picture)) return 0;
|
||||||
|
|
||||||
VP8EncDspARGBInit();
|
VP8LDspInit();
|
||||||
|
WebPInitAlphaProcessing();
|
||||||
|
|
||||||
if (import_alpha) {
|
if (import_alpha) {
|
||||||
uint32_t* dst = picture->argb;
|
uint32_t* dst = picture->argb;
|
||||||
const int do_copy = !swap_rb && !ALPHA_IS_LAST;
|
const int do_copy =
|
||||||
|
(!swap_rb && !ALPHA_IS_LAST) || (swap_rb && ALPHA_IS_LAST);
|
||||||
assert(step == 4);
|
assert(step == 4);
|
||||||
for (y = 0; y < height; ++y) {
|
for (y = 0; y < height; ++y) {
|
||||||
if (do_copy) {
|
if (do_copy) {
|
||||||
memcpy(dst, r_ptr, width * sizeof(*dst));
|
memcpy(dst, rgb, width * 4);
|
||||||
} else {
|
} else {
|
||||||
VP8PackARGB(a_ptr, r_ptr, g_ptr, b_ptr, width, dst);
|
// RGBA input order. Need to swap R and B.
|
||||||
|
VP8LConvertBGRAToRGBA((const uint32_t*)rgb, width, (uint8_t*)dst);
|
||||||
}
|
}
|
||||||
a_ptr += rgb_stride;
|
rgb += rgb_stride;
|
||||||
r_ptr += rgb_stride;
|
|
||||||
g_ptr += rgb_stride;
|
|
||||||
b_ptr += rgb_stride;
|
|
||||||
dst += picture->argb_stride;
|
dst += picture->argb_stride;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uint32_t* dst = picture->argb;
|
uint32_t* dst = picture->argb;
|
||||||
assert(step >= 3);
|
assert(step >= 3);
|
||||||
for (y = 0; y < height; ++y) {
|
for (y = 0; y < height; ++y) {
|
||||||
VP8PackRGB(r_ptr, g_ptr, b_ptr, width, step, dst);
|
WebPPackRGB(r_ptr, g_ptr, b_ptr, width, step, dst);
|
||||||
r_ptr += rgb_stride;
|
r_ptr += rgb_stride;
|
||||||
g_ptr += rgb_stride;
|
g_ptr += rgb_stride;
|
||||||
b_ptr += rgb_stride;
|
b_ptr += rgb_stride;
|
||||||
|
Loading…
Reference in New Issue
Block a user