blob: 8c4add9b9fc45ebf2608353c892ae18f6845c6bc [file] [log] [blame]
// Copyright 2019 Google LLC.
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#include "tools/fiddle/examples.h"
// HASH=dd81527bbdf5eaae7dd21ac04ab84f9e
REG_FIDDLE(Color_Type_RGBA_F16, 256, 96, false, 0) {
union FloatUIntUnion {
uint32_t fUInt;
float fFloat;
};
uint16_t FloatToHalf(float f) {
static const FloatUIntUnion magic = { 15 << 23 };
static const uint32_t round_mask = ~0xfffu;
FloatUIntUnion floatUnion;
floatUnion.fFloat = f;
uint32_t sign = floatUnion.fUInt & 0x80000000u;
floatUnion.fUInt ^= sign;
floatUnion.fUInt &= round_mask;
floatUnion.fFloat *= magic.fFloat;
floatUnion.fUInt -= round_mask;
return (floatUnion.fUInt >> 13) | (sign >> 16);
}
void draw(SkCanvas* canvas) {
canvas->scale(16, 16);
SkBitmap bitmap;
SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_F16_SkColorType, kPremul_SkAlphaType);
bitmap.allocPixels(imageInfo);
SkCanvas offscreen(bitmap);
offscreen.clear(SK_ColorGREEN);
canvas->drawImage(bitmap.asImage(), 0, 0);
auto H = [](float c) -> uint16_t {
return FloatToHalf(c);
};
// R G B A
uint16_t red_f16[][4] = { { H(1.0), H(0.0), H(0.0), H(1.0) },
{ H(.75), H(0.0), H(0.0), H(1.0) },
{ H(.50), H(0.0), H(0.0), H(1.0) },
{ H(.25), H(0.0), H(0.0), H(1.0) } };
uint16_t blue_f16[][4] = { { H(0.0), H(0.0), H(1.0), H(1.0) },
{ H(0.0), H(0.0), H(.75), H(1.0) },
{ H(0.0), H(0.0), H(.50), H(1.0) },
{ H(0.0), H(0.0), H(.25), H(1.0) } };
SkPixmap redPixmap(imageInfo, red_f16, imageInfo.minRowBytes());
if (bitmap.writePixels(redPixmap, 0, 0)) {
canvas->drawImage(bitmap.asImage(), 2, 2);
}
SkPixmap bluePixmap(imageInfo, blue_f16, imageInfo.minRowBytes());
if (bitmap.writePixels(bluePixmap, 0, 0)) {
canvas->drawImage(bitmap.asImage(), 4, 4);
}
}
} // END FIDDLE