blob: 727efeb3958f8d8f85b474c4ea2918659fd84391 [file] [edit]
/*
* Copyright 2026 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkTypes.h"
#if defined(SK_CODEC_DECODES_JPEGXL)
#include "include/codec/SkCodec.h"
#include "include/codec/SkEncodedImageFormat.h"
#include "include/codec/SkJpegxlDecoder.h"
#include "include/core/SkBitmap.h"
#include "include/core/SkColorSpace.h"
#include "include/core/SkData.h"
#include "include/core/SkImageInfo.h"
#include "tests/Test.h"
#include "tools/Resources.h"
DEF_TEST(Jpegxl_DecodeP3, r) {
const char* path = "images/Webkit-logo-P3.jxl";
auto data = GetResourceAsData(path);
if (!data) {
ERRORF(r, "Failed to find %s", path);
return;
}
REPORTER_ASSERT(r, SkJpegxlDecoder::IsJpegxl(data->data(), data->size()));
SkCodec::Result result;
auto codec = SkJpegxlDecoder::Decode(data, &result);
if (!codec) {
ERRORF(r, "Could not create codec from %s - error %s", path, SkCodec::ResultToString(result));
return;
}
REPORTER_ASSERT(r, result == SkCodec::kSuccess);
REPORTER_ASSERT(r, codec->getEncodedFormat() == SkEncodedImageFormat::kJPEGXL);
REPORTER_ASSERT(r, codec->dimensions().width() == 1000);
REPORTER_ASSERT(r, codec->dimensions().height() == 1000);
// Verify the image resolves to the Display P3 color space.
SkColorSpace* cs = codec->getInfo().colorSpace();
REPORTER_ASSERT(r, cs);
if (cs) {
sk_sp<SkColorSpace> p3 =
SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDisplayP3);
REPORTER_ASSERT(r, SkColorSpace::Equals(cs, p3.get()));
}
// Verify decoding pixels succeeds.
SkImageInfo decodeInfo =
codec->getInfo().makeColorType(kRGBA_8888_SkColorType).makeAlphaType(kPremul_SkAlphaType);
SkBitmap bm;
bm.allocPixels(decodeInfo);
result = codec->getPixels(decodeInfo, bm.getPixels(), bm.rowBytes());
REPORTER_ASSERT(r, result == SkCodec::kSuccess);
// Spot-check the two shades of red in the image:
// 1. Background red (R=255, G=0, B=0, A=255)
// 2. WebKit logo red (R=241, G=0, B=0, A=255)
constexpr SkColor kBgRed = SkColorSetARGB(0xFF, 0xFF, 0x00, 0x00);
constexpr SkColor kLogoRed = SkColorSetARGB(0xFF, 0xF1, 0x00, 0x00);
REPORTER_ASSERT(r, bm.getColor(0, 0) == kBgRed);
REPORTER_ASSERT(r, bm.getColor(100, 100) == kBgRed);
REPORTER_ASSERT(r, bm.getColor(900, 900) == kBgRed);
REPORTER_ASSERT(r, bm.getColor(500, 200) == kBgRed);
REPORTER_ASSERT(r, bm.getColor(500, 800) == kBgRed);
REPORTER_ASSERT(r, bm.getColor(500, 500) == kLogoRed);
REPORTER_ASSERT(r, bm.getColor(500, 400) == kLogoRed);
REPORTER_ASSERT(r, bm.getColor(500, 600) == kLogoRed);
}
#endif // defined(SK_CODEC_DECODES_JPEGXL)