f7eb0544a8
Updated every switch that yelled at me, and added support to dm and fm, and then founds some more switches that shouldn't have defaults... The tricky spots outside those were mips and dither, since they aren't simply exhaustive switches. _Now_ no diffs between RGB/BGR 1010102 and 101010x. No GPU support. Bug: skia:9893 Change-Id: I73ab3fd22bdef0519296dfe4cb84031e23ca0be3 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/270114 Commit-Queue: Mike Klein <mtklein@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
197 lines
7.9 KiB
C
197 lines
7.9 KiB
C
/*
|
|
* Copyright 2012 The Android Open Source Project
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#ifndef SkImageEncoderFns_DEFINED
|
|
#define SkImageEncoderFns_DEFINED
|
|
|
|
#include "include/core/SkColor.h"
|
|
#include "include/core/SkICC.h"
|
|
#include "include/core/SkTypes.h"
|
|
#include "include/private/SkColorData.h"
|
|
#include "include/third_party/skcms/skcms.h"
|
|
|
|
typedef void (*transform_scanline_proc)(char* dst, const char* src, int width, int bpp);
|
|
|
|
static inline void transform_scanline_memcpy(char* dst, const char* src, int width, int bpp) {
|
|
memcpy(dst, src, width * bpp);
|
|
}
|
|
|
|
static inline void transform_scanline_A8_to_GrayAlpha(char* dst, const char* src, int width, int) {
|
|
for (int i = 0; i < width; i++) {
|
|
*dst++ = 0;
|
|
*dst++ = *src++;
|
|
}
|
|
}
|
|
|
|
|
|
static void skcms(char* dst, const char* src, int n,
|
|
skcms_PixelFormat srcFmt, skcms_AlphaFormat srcAlpha,
|
|
skcms_PixelFormat dstFmt, skcms_AlphaFormat dstAlpha) {
|
|
SkAssertResult(skcms_Transform(src, srcFmt, srcAlpha, nullptr,
|
|
dst, dstFmt, dstAlpha, nullptr, n));
|
|
}
|
|
|
|
static inline void transform_scanline_gray(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_G_8, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGB_888, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_565(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_BGR_565, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGB_888, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_RGBX(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGB_888 , skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_BGRX(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_BGRA_8888, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGB_888 , skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_444(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_ABGR_4444, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGB_888 , skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_rgbA(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_PremulAsEncoded,
|
|
skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_bgrA(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_BGRA_8888, skcms_AlphaFormat_PremulAsEncoded,
|
|
skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_to_premul_legacy(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_PremulAsEncoded);
|
|
}
|
|
|
|
static inline void transform_scanline_BGRA(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_BGRA_8888, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_4444(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_ABGR_4444, skcms_AlphaFormat_PremulAsEncoded,
|
|
skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_101010x(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_1010102, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGB_161616BE, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_1010102(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_1010102, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGBA_16161616BE, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_1010102_premul(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_1010102, skcms_AlphaFormat_PremulAsEncoded,
|
|
skcms_PixelFormat_RGBA_16161616BE, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_bgr_101010x(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_BGRA_1010102, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGB_161616BE, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_bgra_1010102(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_BGRA_1010102, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGBA_16161616BE, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_bgra_1010102_premul(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_BGRA_1010102, skcms_AlphaFormat_PremulAsEncoded,
|
|
skcms_PixelFormat_RGBA_16161616BE, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_F16(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_hhhh, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGBA_16161616BE, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_F16_premul(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_hhhh, skcms_AlphaFormat_PremulAsEncoded,
|
|
skcms_PixelFormat_RGBA_16161616BE, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_F16_to_8888(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_hhhh, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_F16_premul_to_8888(char* dst,
|
|
const char* src,
|
|
int width,
|
|
int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_hhhh, skcms_AlphaFormat_PremulAsEncoded,
|
|
skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_F16_to_premul_8888(char* dst,
|
|
const char* src,
|
|
int width,
|
|
int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_hhhh, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGBA_8888, skcms_AlphaFormat_PremulAsEncoded);
|
|
}
|
|
|
|
static inline void transform_scanline_F32(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_ffff, skcms_AlphaFormat_Unpremul,
|
|
skcms_PixelFormat_RGBA_16161616BE, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline void transform_scanline_F32_premul(char* dst, const char* src, int width, int) {
|
|
skcms(dst, src, width,
|
|
skcms_PixelFormat_RGBA_ffff, skcms_AlphaFormat_PremulAsEncoded,
|
|
skcms_PixelFormat_RGBA_16161616BE, skcms_AlphaFormat_Unpremul);
|
|
}
|
|
|
|
static inline sk_sp<SkData> icc_from_color_space(const SkImageInfo& info) {
|
|
SkColorSpace* cs = info.colorSpace();
|
|
if (!cs) {
|
|
return nullptr;
|
|
}
|
|
|
|
skcms_TransferFunction fn;
|
|
skcms_Matrix3x3 toXYZD50;
|
|
if (cs->isNumericalTransferFn(&fn) && cs->toXYZD50(&toXYZD50)) {
|
|
return SkWriteICCProfile(fn, toXYZD50);
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
#endif // SkImageEncoderFns_DEFINED
|