Hal Canary | 8751512 | 2019-03-15 14:22:51 -0400 | [diff] [blame] | 1 | // Copyright 2019 Google LLC. |
| 2 | // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. |
Mike Klein | c0bd9f9 | 2019-04-23 12:05:21 -0500 | [diff] [blame] | 3 | #include "tools/fiddle/examples.h" |
Hal Canary | 8751512 | 2019-03-15 14:22:51 -0400 | [diff] [blame] | 4 | // HASH=dd81527bbdf5eaae7dd21ac04ab84f9e |
Hal Canary | a7181e7c | 2019-03-18 16:06:34 -0400 | [diff] [blame] | 5 | REG_FIDDLE(Color_Type_RGBA_F16, 256, 96, false, 0) { |
Hal Canary | 8751512 | 2019-03-15 14:22:51 -0400 | [diff] [blame] | 6 | union FloatUIntUnion { |
| 7 | uint32_t fUInt; |
| 8 | float fFloat; |
| 9 | }; |
| 10 | uint16_t FloatToHalf(float f) { |
| 11 | static const FloatUIntUnion magic = { 15 << 23 }; |
| 12 | static const uint32_t round_mask = ~0xfffu; |
| 13 | FloatUIntUnion floatUnion; |
| 14 | floatUnion.fFloat = f; |
| 15 | uint32_t sign = floatUnion.fUInt & 0x80000000u; |
| 16 | floatUnion.fUInt ^= sign; |
| 17 | floatUnion.fUInt &= round_mask; |
| 18 | floatUnion.fFloat *= magic.fFloat; |
| 19 | floatUnion.fUInt -= round_mask; |
| 20 | return (floatUnion.fUInt >> 13) | (sign >> 16); |
| 21 | } |
| 22 | |
| 23 | void draw(SkCanvas* canvas) { |
| 24 | canvas->scale(16, 16); |
| 25 | SkBitmap bitmap; |
| 26 | SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_F16_SkColorType, kPremul_SkAlphaType); |
| 27 | bitmap.allocPixels(imageInfo); |
| 28 | SkCanvas offscreen(bitmap); |
| 29 | offscreen.clear(SK_ColorGREEN); |
Mike Reed | e1f72f9 | 2021-01-27 17:09:40 -0500 | [diff] [blame] | 30 | canvas->drawImage(bitmap.asImage(), 0, 0); |
Hal Canary | 8751512 | 2019-03-15 14:22:51 -0400 | [diff] [blame] | 31 | auto H = [](float c) -> uint16_t { |
| 32 | return FloatToHalf(c); |
| 33 | }; |
| 34 | // R G B A |
| 35 | uint16_t red_f16[][4] = { { H(1.0), H(0.0), H(0.0), H(1.0) }, |
| 36 | { H(.75), H(0.0), H(0.0), H(1.0) }, |
| 37 | { H(.50), H(0.0), H(0.0), H(1.0) }, |
| 38 | { H(.25), H(0.0), H(0.0), H(1.0) } }; |
| 39 | uint16_t blue_f16[][4] = { { H(0.0), H(0.0), H(1.0), H(1.0) }, |
| 40 | { H(0.0), H(0.0), H(.75), H(1.0) }, |
| 41 | { H(0.0), H(0.0), H(.50), H(1.0) }, |
| 42 | { H(0.0), H(0.0), H(.25), H(1.0) } }; |
| 43 | SkPixmap redPixmap(imageInfo, red_f16, imageInfo.minRowBytes()); |
| 44 | if (bitmap.writePixels(redPixmap, 0, 0)) { |
Mike Reed | e1f72f9 | 2021-01-27 17:09:40 -0500 | [diff] [blame] | 45 | canvas->drawImage(bitmap.asImage(), 2, 2); |
Hal Canary | 8751512 | 2019-03-15 14:22:51 -0400 | [diff] [blame] | 46 | } |
| 47 | SkPixmap bluePixmap(imageInfo, blue_f16, imageInfo.minRowBytes()); |
| 48 | if (bitmap.writePixels(bluePixmap, 0, 0)) { |
Mike Reed | e1f72f9 | 2021-01-27 17:09:40 -0500 | [diff] [blame] | 49 | canvas->drawImage(bitmap.asImage(), 4, 4); |
Hal Canary | 8751512 | 2019-03-15 14:22:51 -0400 | [diff] [blame] | 50 | } |
| 51 | } |
| 52 | } // END FIDDLE |