diff options
-rw-r--r-- | include/core/SkColorSpaceXform.h | 9 | ||||
-rw-r--r-- | infra/bots/assets/skimage/VERSION | 2 | ||||
-rw-r--r-- | infra/bots/tasks.json | 356 | ||||
-rw-r--r-- | src/codec/SkPngCodec.cpp | 24 | ||||
-rw-r--r-- | src/codec/SkPngCodec.h | 2 | ||||
-rw-r--r-- | src/codec/SkSwizzler.cpp | 14 | ||||
-rw-r--r-- | src/core/SkColorSpaceXform.cpp | 241 | ||||
-rw-r--r-- | src/core/SkColorSpaceXform_A2B.cpp | 5 | ||||
-rw-r--r-- | src/core/SkColorSpaceXform_Base.h | 24 | ||||
-rw-r--r-- | src/core/SkRasterPipeline.h | 3 | ||||
-rw-r--r-- | src/opts/SkNx_neon.h | 4 | ||||
-rw-r--r-- | src/opts/SkNx_sse.h | 15 | ||||
-rw-r--r-- | src/opts/SkRasterPipeline_opts.h | 32 |
13 files changed, 379 insertions, 352 deletions
diff --git a/include/core/SkColorSpaceXform.h b/include/core/SkColorSpaceXform.h index b750c099f2..299fe26a3a 100644 --- a/include/core/SkColorSpaceXform.h +++ b/include/core/SkColorSpaceXform.h @@ -27,8 +27,12 @@ public: enum ColorFormat { kRGBA_8888_ColorFormat, kBGRA_8888_ColorFormat, - kRGBA_F16_ColorFormat, - kRGBA_F32_ColorFormat, + + // Unsigned, big-endian, 16-bit integer + kRGBA_U16_BE_ColorFormat, // Src only + + kRGBA_F16_ColorFormat, // Dst only + kRGBA_F32_ColorFormat, // Dst only }; /** @@ -42,7 +46,6 @@ public: * @param len Number of pixels in the buffers * @param dstColorFormat Describes color format of |dst| * @param srcColorFormat Describes color format of |src| - * Must be kRGBA_8888 or kBGRA_8888 * @param alphaType Describes alpha properties of the |dst| (and |src|) * kUnpremul preserves input alpha values * kPremul performs a premultiplication and also preserves alpha values diff --git a/infra/bots/assets/skimage/VERSION b/infra/bots/assets/skimage/VERSION index 8e2afd3427..25bf17fc5a 100644 --- a/infra/bots/assets/skimage/VERSION +++ b/infra/bots/assets/skimage/VERSION @@ -1 +1 @@ -17
\ No newline at end of file +18
\ No newline at end of file diff --git a/infra/bots/tasks.json b/infra/bots/tasks.json index 18813bd60f..b2af6498d6 100644 --- a/infra/bots/tasks.json +++ b/infra/bots/tasks.json @@ -3443,7 +3443,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -3492,7 +3492,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -3541,7 +3541,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -3590,7 +3590,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -3639,7 +3639,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -3688,7 +3688,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -3737,7 +3737,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -3786,7 +3786,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -3835,7 +3835,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -3884,7 +3884,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -3933,7 +3933,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -3982,7 +3982,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4031,7 +4031,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4080,7 +4080,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4129,7 +4129,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4178,7 +4178,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4227,7 +4227,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4276,7 +4276,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4325,7 +4325,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4374,7 +4374,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4423,7 +4423,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4472,7 +4472,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4521,7 +4521,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4570,7 +4570,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4619,7 +4619,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4668,7 +4668,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4717,7 +4717,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4766,7 +4766,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4815,7 +4815,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4864,7 +4864,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -4913,7 +4913,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5040,7 +5040,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5088,7 +5088,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5136,7 +5136,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5185,7 +5185,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5234,7 +5234,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5282,7 +5282,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5330,7 +5330,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5378,7 +5378,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5427,7 +5427,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5481,7 +5481,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5535,7 +5535,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5584,7 +5584,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5633,7 +5633,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5686,7 +5686,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5735,7 +5735,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5784,7 +5784,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5833,7 +5833,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5932,7 +5932,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -5980,7 +5980,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6028,7 +6028,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6076,7 +6076,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6124,7 +6124,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6172,7 +6172,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6220,7 +6220,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6268,7 +6268,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6316,7 +6316,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6364,7 +6364,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6412,7 +6412,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6460,7 +6460,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6508,7 +6508,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6556,7 +6556,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6604,7 +6604,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6652,7 +6652,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6700,7 +6700,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6748,7 +6748,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6796,7 +6796,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6844,7 +6844,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6892,7 +6892,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6940,7 +6940,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -6988,7 +6988,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7036,7 +7036,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7084,7 +7084,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7132,7 +7132,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7180,7 +7180,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7228,7 +7228,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7276,7 +7276,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7324,7 +7324,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7372,7 +7372,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7420,7 +7420,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7468,7 +7468,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7517,7 +7517,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7566,7 +7566,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7615,7 +7615,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7664,7 +7664,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7712,7 +7712,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7760,7 +7760,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7809,7 +7809,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7858,7 +7858,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7907,7 +7907,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -7956,7 +7956,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8005,7 +8005,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8054,7 +8054,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8103,7 +8103,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8152,7 +8152,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8201,7 +8201,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8250,7 +8250,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8299,7 +8299,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8348,7 +8348,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8397,7 +8397,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8446,7 +8446,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8495,7 +8495,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8544,7 +8544,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8593,7 +8593,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8642,7 +8642,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8691,7 +8691,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8740,7 +8740,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8789,7 +8789,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8838,7 +8838,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8887,7 +8887,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8936,7 +8936,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -8985,7 +8985,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9034,7 +9034,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9083,7 +9083,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9132,7 +9132,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9181,7 +9181,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9230,7 +9230,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9279,7 +9279,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9328,7 +9328,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9377,7 +9377,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9425,7 +9425,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9473,7 +9473,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9522,7 +9522,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9571,7 +9571,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9619,7 +9619,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9667,7 +9667,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9715,7 +9715,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9764,7 +9764,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9818,7 +9818,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9872,7 +9872,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9921,7 +9921,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -9970,7 +9970,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10024,7 +10024,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10077,7 +10077,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10130,7 +10130,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10179,7 +10179,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10303,7 +10303,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10352,7 +10352,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10401,7 +10401,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10450,7 +10450,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10498,7 +10498,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10546,7 +10546,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10594,7 +10594,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10642,7 +10642,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10690,7 +10690,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10738,7 +10738,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10786,7 +10786,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10834,7 +10834,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10882,7 +10882,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10930,7 +10930,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -10978,7 +10978,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11026,7 +11026,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11074,7 +11074,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11122,7 +11122,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11170,7 +11170,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11218,7 +11218,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11266,7 +11266,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11314,7 +11314,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11362,7 +11362,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11410,7 +11410,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11458,7 +11458,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11506,7 +11506,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11554,7 +11554,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11602,7 +11602,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11650,7 +11650,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11698,7 +11698,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11746,7 +11746,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11794,7 +11794,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11842,7 +11842,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11890,7 +11890,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11938,7 +11938,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -11987,7 +11987,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -12036,7 +12036,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -12085,7 +12085,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -12134,7 +12134,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -12183,7 +12183,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -12232,7 +12232,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", @@ -12280,7 +12280,7 @@ { "name": "skia/bots/skimage", "path": "skimage", - "version": "version:17" + "version": "version:18" }, { "name": "skia/bots/skp", diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp index ebd0b741b4..87904e5fee 100644 --- a/src/codec/SkPngCodec.cpp +++ b/src/codec/SkPngCodec.cpp @@ -427,8 +427,19 @@ void SkPngCodec::allocateStorage(const SkImageInfo& dstInfo) { } } +static SkColorSpaceXform::ColorFormat png_select_xform_format(const SkEncodedInfo& info) { + // We always use kRGBA because color PNGs are always RGB or RGBA. + // TODO (msarett): Support kRGB_U16 inputs as well. + if (16 == info.bitsPerComponent() && SkEncodedInfo::kRGBA_Color == info.color()) { + return SkColorSpaceXform::kRGBA_U16_BE_ColorFormat; + } + + return SkColorSpaceXform::kRGBA_8888_ColorFormat; +} + void SkPngCodec::applyXformRow(void* dst, const void* src) { - const SkColorSpaceXform::ColorFormat srcColorFormat = select_xform_format(kXformSrcColorType); + const SkColorSpaceXform::ColorFormat srcColorFormat = + png_select_xform_format(this->getEncodedInfo()); switch (fXformMode) { case kSwizzleOnly_XformMode: fSwizzler->swizzle(dst, (const uint8_t*) src); @@ -1075,7 +1086,7 @@ bool SkPngCodec::initializeXforms(const SkImageInfo& dstInfo, const Options& opt // If the image is 32-bit RGBA and we have a color xform, we can skip the swizzler. if (this->colorXform() && SkEncodedInfo::kRGBA_Color == this->getEncodedInfo().color() && - 8 == this->getEncodedInfo().bitsPerComponent() && !options.fSubset) + !options.fSubset) { fXformMode = kColorOnly_XformMode; return true; @@ -1090,7 +1101,7 @@ bool SkPngCodec::initializeXforms(const SkImageInfo& dstInfo, const Options& opt // Copy the color table to the client if they request kIndex8 mode. copy_color_table(dstInfo, fColorTable.get(), ctable, ctableCount); - this->initializeSwizzler(dstInfo, options); + this->initializeSwizzler(dstInfo, options, false); return true; } @@ -1113,7 +1124,8 @@ void SkPngCodec::initializeXformParams() { } } -void SkPngCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& options) { +void SkPngCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& options, + bool skipFormatConversion) { SkImageInfo swizzlerInfo = dstInfo; Options swizzlerOptions = options; fXformMode = kSwizzleOnly_XformMode; @@ -1135,7 +1147,7 @@ void SkPngCodec::initializeSwizzler(const SkImageInfo& dstInfo, const Options& o const SkPMColor* colors = get_color_ptr(fColorTable.get()); fSwizzler.reset(SkSwizzler::CreateSwizzler(this->getEncodedInfo(), colors, swizzlerInfo, - swizzlerOptions)); + swizzlerOptions, nullptr, skipFormatConversion)); SkASSERT(fSwizzler); } @@ -1144,7 +1156,7 @@ SkSampler* SkPngCodec::getSampler(bool createIfNecessary) { return fSwizzler.get(); } - this->initializeSwizzler(this->dstInfo(), this->options()); + this->initializeSwizzler(this->dstInfo(), this->options(), true); return fSwizzler.get(); } diff --git a/src/codec/SkPngCodec.h b/src/codec/SkPngCodec.h index c246887cfc..7d7547c266 100644 --- a/src/codec/SkPngCodec.h +++ b/src/codec/SkPngCodec.h @@ -119,7 +119,7 @@ private: // Helper to set up swizzler, color xforms, and color table. Also calls png_read_update_info. bool initializeXforms(const SkImageInfo& dstInfo, const Options&, SkPMColor* colorPtr, int* colorCount); - void initializeSwizzler(const SkImageInfo& dstInfo, const Options&); + void initializeSwizzler(const SkImageInfo& dstInfo, const Options&, bool skipFormatConversion); void allocateStorage(const SkImageInfo& dstInfo); void destroyReadStruct(); diff --git a/src/codec/SkSwizzler.cpp b/src/codec/SkSwizzler.cpp index 415f0f1ddc..9a339d4405 100644 --- a/src/codec/SkSwizzler.cpp +++ b/src/codec/SkSwizzler.cpp @@ -51,6 +51,16 @@ static void sample4(void* dst, const uint8_t* src, int width, int bpp, int delta } } +static void sample8(void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int offset, + const SkPMColor ctable[]) { + src += offset; + uint64_t* dst64 = (uint64_t*) dst; + for (int x = 0; x < width; x++) { + dst64[x] = *((const uint64_t*) src); + src += deltaSrc; + } +} + // kBit // These routines exclusively choose between white and black @@ -808,7 +818,9 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, break; case kRGBA_8888_SkColorType: case kBGRA_8888_SkColorType: - proc = &sample4; + SkASSERT(16 == encodedInfo.bitsPerComponent() || + 8 == encodedInfo.bitsPerComponent()); + proc = (8 == encodedInfo.bitsPerComponent()) ? &sample4 : &sample8; fastProc = © break; default: diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp index b73a3cf198..bdb3784681 100644 --- a/src/core/SkColorSpaceXform.cpp +++ b/src/core/SkColorSpaceXform.cpp @@ -327,110 +327,14 @@ std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(SkColorSpace* srcSpace switch (csm) { case kNone_ColorSpaceMatch: - switch (dstSpaceXYZ->gammaNamed()) { - case kSRGB_SkGammaNamed: - if (srcSpaceXYZ->gammaIsLinear()) { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kLinear_SrcGamma, kSRGB_DstGamma, kNone_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } else { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, kSRGB_DstGamma, kNone_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } - case k2Dot2Curve_SkGammaNamed: - if (srcSpaceXYZ->gammaIsLinear()) { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kLinear_SrcGamma, k2Dot2_DstGamma, kNone_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } else { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, k2Dot2_DstGamma, kNone_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } - case kLinear_SkGammaNamed: - if (srcSpaceXYZ->gammaIsLinear()) { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kLinear_SrcGamma, kLinear_DstGamma, kNone_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } else { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, kLinear_DstGamma, kNone_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } - default: - if (srcSpaceXYZ->gammaIsLinear()) { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kLinear_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } else { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } - } + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kNone_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ)); case kGamut_ColorSpaceMatch: - switch (dstSpaceXYZ->gammaNamed()) { - case kSRGB_SkGammaNamed: - if (srcSpaceXYZ->gammaIsLinear()) { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kLinear_SrcGamma, kSRGB_DstGamma, kGamut_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } else { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, kSRGB_DstGamma, kGamut_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } - case k2Dot2Curve_SkGammaNamed: - if (srcSpaceXYZ->gammaIsLinear()) { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kLinear_SrcGamma, k2Dot2_DstGamma, kGamut_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } else { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, k2Dot2_DstGamma, kGamut_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } - case kLinear_SkGammaNamed: - if (srcSpaceXYZ->gammaIsLinear()) { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kLinear_SrcGamma, kLinear_DstGamma, kGamut_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } else { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, kLinear_DstGamma, kGamut_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } - default: - if (srcSpaceXYZ->gammaIsLinear()) { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kLinear_SrcGamma, kTable_DstGamma, kGamut_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } else { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, kTable_DstGamma, kGamut_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } - } + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kGamut_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ)); case kFull_ColorSpaceMatch: - switch (dstSpaceXYZ->gammaNamed()) { - case kSRGB_SkGammaNamed: - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, kSRGB_DstGamma, kFull_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - case k2Dot2Curve_SkGammaNamed: - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, k2Dot2_DstGamma, kFull_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - case kLinear_SkGammaNamed: - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kLinear_SrcGamma, kLinear_DstGamma, kFull_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - default: - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, kTable_DstGamma, kFull_ColorSpaceMatch> - (srcSpaceXYZ, srcToDst, dstSpaceXYZ)); - } + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ + <kFull_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ)); default: SkASSERT(false); return nullptr; @@ -1065,8 +969,8 @@ static AI int num_tables(SkColorSpace_XYZ* space) { } } -template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> -SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> +template <ColorSpaceMatch kCSM> +SkColorSpaceXform_XYZ<kCSM> ::SkColorSpaceXform_XYZ(SkColorSpace_XYZ* srcSpace, const SkMatrix44& srcToDst, SkColorSpace_XYZ* dstSpace) { @@ -1093,6 +997,29 @@ SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> const int numDstTables = num_tables(dstSpace); dstSpace->toDstGammaTables(fDstGammaTables, &fDstStorage, numDstTables); + + if (srcSpace->gammaIsLinear()) { + fSrcGamma = kLinear_SrcGamma; + } else if (kSRGB_SkGammaNamed == srcSpace->gammaNamed()) { + fSrcGamma = kSRGB_SrcGamma; + } else { + fSrcGamma = kTable_SrcGamma; + } + + switch (dstSpace->gammaNamed()) { + case kSRGB_SkGammaNamed: + fDstGamma = kSRGB_DstGamma; + break; + case k2Dot2Curve_SkGammaNamed: + fDstGamma = k2Dot2_DstGamma; + break; + case kLinear_SkGammaNamed: + fDstGamma = kLinear_DstGamma; + break; + default: + fDstGamma = kTable_DstGamma; + break; + } } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1119,27 +1046,28 @@ static AI bool apply_set_alpha(void* dst, const void* src, int len, SkAlphaType } } -template <SrcGamma kSrc, DstFormat kDst, ColorSpaceMatch kCSM> +template <DstFormat kDst, ColorSpaceMatch kCSM> static AI bool apply_set_src(void* dst, const void* src, int len, SkAlphaType alphaType, const float* const srcTables[3], const float matrix[13], const uint8_t* const dstTables[3], - SkColorSpaceXform::ColorFormat srcColorFormat) { + SkColorSpaceXform::ColorFormat srcColorFormat, + SrcGamma srcGamma) { switch (srcColorFormat) { case SkColorSpaceXform::kRGBA_8888_ColorFormat: - switch (kSrc) { + switch (srcGamma) { case kLinear_SrcGamma: return apply_set_alpha<kRGBA_8888_Linear_SrcFormat, kDst, kCSM> (dst, src, len, alphaType, nullptr, matrix, dstTables); - case kTable_SrcGamma: + default: return apply_set_alpha<kRGBA_8888_Table_SrcFormat, kDst, kCSM> (dst, src, len, alphaType, srcTables, matrix, dstTables); } case SkColorSpaceXform::kBGRA_8888_ColorFormat: - switch (kSrc) { + switch (srcGamma) { case kLinear_SrcGamma: return apply_set_alpha<kBGRA_8888_Linear_SrcFormat, kDst, kCSM> (dst, src, len, alphaType, nullptr, matrix, dstTables); - case kTable_SrcGamma: + default: return apply_set_alpha<kBGRA_8888_Table_SrcFormat, kDst, kCSM> (dst, src, len, alphaType, srcTables, matrix, dstTables); } @@ -1150,8 +1078,8 @@ static AI bool apply_set_src(void* dst, const void* src, int len, SkAlphaType al #undef AI -template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> -bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> +template <ColorSpaceMatch kCSM> +bool SkColorSpaceXform_XYZ<kCSM> ::onApply(ColorFormat dstColorFormat, void* dst, ColorFormat srcColorFormat, const void* src, int len, SkAlphaType alphaType) const { @@ -1176,55 +1104,55 @@ bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> } } - if (kRGBA_F32_ColorFormat == dstColorFormat) { + if (kRGBA_F32_ColorFormat == dstColorFormat || kRGBA_U16_BE_ColorFormat == srcColorFormat) { return this->applyPipeline(dstColorFormat, dst, srcColorFormat, src, len, alphaType); } switch (dstColorFormat) { case kRGBA_8888_ColorFormat: - switch (kDst) { + switch (fDstGamma) { case kLinear_DstGamma: - return apply_set_src<kSrc, kRGBA_8888_Linear_DstFormat, kCSM> + return apply_set_src<kRGBA_8888_Linear_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat); + srcColorFormat, fSrcGamma); case kSRGB_DstGamma: - return apply_set_src<kSrc, kRGBA_8888_SRGB_DstFormat, kCSM> + return apply_set_src<kRGBA_8888_SRGB_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat); + srcColorFormat, fSrcGamma); case k2Dot2_DstGamma: - return apply_set_src<kSrc, kRGBA_8888_2Dot2_DstFormat, kCSM> + return apply_set_src<kRGBA_8888_2Dot2_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat); + srcColorFormat, fSrcGamma); case kTable_DstGamma: - return apply_set_src<kSrc, kRGBA_8888_Table_DstFormat, kCSM> + return apply_set_src<kRGBA_8888_Table_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, fDstGammaTables, - srcColorFormat); + srcColorFormat, fSrcGamma); } case kBGRA_8888_ColorFormat: - switch (kDst) { + switch (fDstGamma) { case kLinear_DstGamma: - return apply_set_src<kSrc, kBGRA_8888_Linear_DstFormat, kCSM> + return apply_set_src<kBGRA_8888_Linear_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat); + srcColorFormat, fSrcGamma); case kSRGB_DstGamma: - return apply_set_src<kSrc, kBGRA_8888_SRGB_DstFormat, kCSM> + return apply_set_src<kBGRA_8888_SRGB_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat); + srcColorFormat, fSrcGamma); case k2Dot2_DstGamma: - return apply_set_src<kSrc, kBGRA_8888_2Dot2_DstFormat, kCSM> + return apply_set_src<kBGRA_8888_2Dot2_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat); + srcColorFormat, fSrcGamma); case kTable_DstGamma: - return apply_set_src<kSrc, kBGRA_8888_Table_DstFormat, kCSM> + return apply_set_src<kBGRA_8888_Table_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, fDstGammaTables, - srcColorFormat); + srcColorFormat, fSrcGamma); } case kRGBA_F16_ColorFormat: - switch (kDst) { + switch (fDstGamma) { case kLinear_DstGamma: - return apply_set_src<kSrc, kF16_Linear_DstFormat, kCSM> + return apply_set_src<kF16_Linear_DstFormat, kCSM> (dst, src, len, alphaType, fSrcGammaTables, fSrcToDst, nullptr, - srcColorFormat); + srcColorFormat, fSrcGamma); default: return false; } @@ -1242,8 +1170,8 @@ bool SkColorSpaceXform::apply(ColorFormat dstColorFormat, void* dst, ColorFormat /////////////////////////////////////////////////////////////////////////////////////////////////// -template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> -bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> +template <ColorSpaceMatch kCSM> +bool SkColorSpaceXform_XYZ<kCSM> ::applyPipeline(ColorFormat dstColorFormat, void* dst, ColorFormat srcColorFormat, const void* src, int len, SkAlphaType alphaType) const { SkRasterPipeline pipeline; @@ -1251,10 +1179,10 @@ bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> LoadTablesContext loadTables; switch (srcColorFormat) { case kRGBA_8888_ColorFormat: - if (kLinear_SrcGamma == kSrc) { + if (kLinear_SrcGamma == fSrcGamma) { pipeline.append(SkRasterPipeline::load_8888, &src); } else { - loadTables.fSrc = (const uint32_t*) src; + loadTables.fSrc = src; loadTables.fR = fSrcGammaTables[0]; loadTables.fG = fSrcGammaTables[1]; loadTables.fB = fSrcGammaTables[2]; @@ -1263,10 +1191,10 @@ bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> break; case kBGRA_8888_ColorFormat: - if (kLinear_SrcGamma == kSrc) { + if (kLinear_SrcGamma == fSrcGamma) { pipeline.append(SkRasterPipeline::load_8888, &src); } else { - loadTables.fSrc = (const uint32_t*) src; + loadTables.fSrc = src; loadTables.fR = fSrcGammaTables[2]; loadTables.fG = fSrcGammaTables[1]; loadTables.fB = fSrcGammaTables[0]; @@ -1275,6 +1203,24 @@ bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> pipeline.append(SkRasterPipeline::swap_rb); break; + case kRGBA_U16_BE_ColorFormat: + switch (fSrcGamma) { + case kLinear_SrcGamma: + pipeline.append(SkRasterPipeline::load_u16_be, &src); + break; + case kSRGB_SrcGamma: + pipeline.append(SkRasterPipeline::load_u16_be, &src); + pipeline.append_from_srgb(kUnpremul_SkAlphaType); + break; + case kTable_SrcGamma: + loadTables.fSrc = src; + loadTables.fR = fSrcGammaTables[0]; + loadTables.fG = fSrcGammaTables[1]; + loadTables.fB = fSrcGammaTables[2]; + pipeline.append(SkRasterPipeline::load_tables_u16_be, &loadTables); + break; + } + break; default: return false; } @@ -1296,7 +1242,7 @@ bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> } StoreTablesContext storeTables; - switch (kDst) { + switch (fDstGamma) { case kSRGB_DstGamma: pipeline.append(SkRasterPipeline::to_srgb); break; @@ -1309,7 +1255,7 @@ bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> switch (dstColorFormat) { case kRGBA_8888_ColorFormat: - if (kTable_DstGamma == kDst) { + if (kTable_DstGamma == fDstGamma) { storeTables.fDst = (uint32_t*) dst; storeTables.fR = fDstGammaTables[0]; storeTables.fG = fDstGammaTables[1]; @@ -1321,7 +1267,7 @@ bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> } break; case kBGRA_8888_ColorFormat: - if (kTable_DstGamma == kDst) { + if (kTable_DstGamma == fDstGamma) { storeTables.fDst = (uint32_t*) dst; storeTables.fR = fDstGammaTables[2]; storeTables.fG = fDstGammaTables[1]; @@ -1335,17 +1281,19 @@ bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> } break; case kRGBA_F16_ColorFormat: - if (kLinear_DstGamma != kDst) { + if (kLinear_DstGamma != fDstGamma) { return false; } pipeline.append(SkRasterPipeline::store_f16, &dst); break; case kRGBA_F32_ColorFormat: - if (kLinear_DstGamma != kDst) { + if (kLinear_DstGamma != fDstGamma) { return false; } pipeline.append(SkRasterPipeline::store_f32, &dst); break; + default: + return false; } pipeline.run(0, 0, len); @@ -1356,6 +1304,5 @@ bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(SkColorSpace_XYZ* space) { return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kTable_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> - (space, SkMatrix::I(), space)); + <kNone_ColorSpaceMatch>(space, SkMatrix::I(), space)); } diff --git a/src/core/SkColorSpaceXform_A2B.cpp b/src/core/SkColorSpaceXform_A2B.cpp index f65df4c409..0f284e4a60 100644 --- a/src/core/SkColorSpaceXform_A2B.cpp +++ b/src/core/SkColorSpaceXform_A2B.cpp @@ -32,6 +32,9 @@ bool SkColorSpaceXform_A2B::onApply(ColorFormat dstFormat, void* dst, ColorForma case kRGBA_8888_ColorFormat: pipeline.append(SkRasterPipeline::load_8888, &src); break; + case kRGBA_U16_BE_ColorFormat: + pipeline.append(SkRasterPipeline::load_u16_be, &src); + break; default: SkCSXformPrintf("F16/F32 source color format not supported\n"); return false; @@ -63,6 +66,8 @@ bool SkColorSpaceXform_A2B::onApply(ColorFormat dstFormat, void* dst, ColorForma } pipeline.append(SkRasterPipeline::store_f32, &dst); break; + default: + return false; } pipeline.run(0,0, count); diff --git a/src/core/SkColorSpaceXform_Base.h b/src/core/SkColorSpaceXform_Base.h index e20857324d..48035c506b 100644 --- a/src/core/SkColorSpaceXform_Base.h +++ b/src/core/SkColorSpaceXform_Base.h @@ -34,6 +34,7 @@ private: enum SrcGamma { kLinear_SrcGamma, kTable_SrcGamma, + kSRGB_SrcGamma, }; enum DstGamma { @@ -49,7 +50,7 @@ enum ColorSpaceMatch { kFull_ColorSpaceMatch, }; -template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> +template <ColorSpaceMatch kCSM> class SkColorSpaceXform_XYZ : public SkColorSpaceXform_Base { protected: bool onApply(ColorFormat dstFormat, void* dst, ColorFormat srcFormat, const void* src, @@ -63,23 +64,26 @@ private: SkColorSpace_XYZ* dstSpace); // Contain pointers into storage or pointers into precomputed tables. - const float* fSrcGammaTables[3]; - SkAutoTMalloc<float> fSrcStorage; - const uint8_t* fDstGammaTables[3]; - sk_sp<SkData> fDstStorage; + const float* fSrcGammaTables[3]; + SkAutoTMalloc<float> fSrcStorage; + const uint8_t* fDstGammaTables[3]; + sk_sp<SkData> fDstStorage; // Holds a 3x4 matrix. Padding is useful for vector loading. - float fSrcToDst[13]; + float fSrcToDst[13]; + + SrcGamma fSrcGamma; + DstGamma fDstGamma; friend class SkColorSpaceXform; friend std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(SkColorSpace_XYZ* space); }; struct LoadTablesContext { - const uint32_t* fSrc; - const float* fR; - const float* fG; - const float* fB; + const void* fSrc; + const float* fR; + const float* fG; + const float* fB; }; struct StoreTablesContext { diff --git a/src/core/SkRasterPipeline.h b/src/core/SkRasterPipeline.h index d235b43bd7..887e535e79 100644 --- a/src/core/SkRasterPipeline.h +++ b/src/core/SkRasterPipeline.h @@ -68,7 +68,8 @@ M(load_565) M(store_565) \ M(load_f16) M(store_f16) \ M(load_8888) M(store_8888) \ - M(load_tables) M(store_tables) \ + M(load_u16_be) \ + M(load_tables) M(load_tables_u16_be) M(store_tables) \ M(scale_u8) M(scale_1_float) \ M(lerp_u8) M(lerp_565) M(lerp_1_float) \ M(dstatop) M(dstin) M(dstout) M(dstover) \ diff --git a/src/opts/SkNx_neon.h b/src/opts/SkNx_neon.h index 6836a527e7..f39ef118b1 100644 --- a/src/opts/SkNx_neon.h +++ b/src/opts/SkNx_neon.h @@ -255,6 +255,8 @@ public: AI SkNx operator + (const SkNx& o) const { return vadd_u16(fVec, o.fVec); } AI SkNx operator - (const SkNx& o) const { return vsub_u16(fVec, o.fVec); } AI SkNx operator * (const SkNx& o) const { return vmul_u16(fVec, o.fVec); } + AI SkNx operator & (const SkNx& o) const { return vand_u16(fVec, o.fVec); } + AI SkNx operator | (const SkNx& o) const { return vorr_u16(fVec, o.fVec); } AI SkNx operator << (int bits) const { return fVec << SkNx(bits).fVec; } AI SkNx operator >> (int bits) const { return fVec >> SkNx(bits).fVec; } @@ -293,6 +295,8 @@ public: AI SkNx operator + (const SkNx& o) const { return vaddq_u16(fVec, o.fVec); } AI SkNx operator - (const SkNx& o) const { return vsubq_u16(fVec, o.fVec); } AI SkNx operator * (const SkNx& o) const { return vmulq_u16(fVec, o.fVec); } + AI SkNx operator & (const SkNx& o) const { return vandq_u16(fVec, o.fVec); } + AI SkNx operator | (const SkNx& o) const { return vorrq_u16(fVec, o.fVec); } AI SkNx operator << (int bits) const { return fVec << SkNx(bits).fVec; } AI SkNx operator >> (int bits) const { return fVec >> SkNx(bits).fVec; } diff --git a/src/opts/SkNx_sse.h b/src/opts/SkNx_sse.h index 3dc60f746f..1ff72d1dfc 100644 --- a/src/opts/SkNx_sse.h +++ b/src/opts/SkNx_sse.h @@ -283,6 +283,8 @@ public: AI SkNx operator + (const SkNx& o) const { return _mm_add_epi16(fVec, o.fVec); } AI SkNx operator - (const SkNx& o) const { return _mm_sub_epi16(fVec, o.fVec); } AI SkNx operator * (const SkNx& o) const { return _mm_mullo_epi16(fVec, o.fVec); } + AI SkNx operator & (const SkNx& o) const { return _mm_and_si128(fVec, o.fVec); } + AI SkNx operator | (const SkNx& o) const { return _mm_or_si128(fVec, o.fVec); } AI SkNx operator << (int bits) const { return _mm_slli_epi16(fVec, bits); } AI SkNx operator >> (int bits) const { return _mm_srli_epi16(fVec, bits); } @@ -348,6 +350,8 @@ public: AI SkNx operator + (const SkNx& o) const { return _mm_add_epi16(fVec, o.fVec); } AI SkNx operator - (const SkNx& o) const { return _mm_sub_epi16(fVec, o.fVec); } AI SkNx operator * (const SkNx& o) const { return _mm_mullo_epi16(fVec, o.fVec); } + AI SkNx operator & (const SkNx& o) const { return _mm_and_si128(fVec, o.fVec); } + AI SkNx operator | (const SkNx& o) const { return _mm_or_si128(fVec, o.fVec); } AI SkNx operator << (int bits) const { return _mm_slli_epi16(fVec, bits); } AI SkNx operator >> (int bits) const { return _mm_srli_epi16(fVec, bits); } @@ -634,6 +638,14 @@ public: return _mm256_cvtepi32_ps(SkNx_cast<int>(src).fVec); } + template<> AI /*static*/ Sk8i SkNx_cast<int>(const Sk8h& src) { + return _mm256_cvtepu16_epi32(src.fVec); + } + + template<> AI /*static*/ Sk8f SkNx_cast<float>(const Sk8h& src) { + return _mm256_cvtepi32_ps(SkNx_cast<int>(src).fVec); + } + template<> AI /*static*/ Sk8f SkNx_cast<float>(const Sk8i& src) { return _mm256_cvtepi32_ps(src.fVec); } @@ -642,9 +654,6 @@ public: return _mm256_cvttps_epi32(src.fVec); } - template<> AI /*static*/ Sk8i SkNx_cast<int>(const Sk8h& src) { - return _mm256_cvtepu16_epi32(src.fVec); - } template<> AI /*static*/ Sk8h SkNx_cast<uint16_t>(const Sk8i& src) { __m128i lo = _mm256_extractf128_si256(src.fVec, 0), hi = _mm256_extractf128_si256(src.fVec, 1); diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h index 143a9ece79..0d42b1f02c 100644 --- a/src/opts/SkRasterPipeline_opts.h +++ b/src/opts/SkRasterPipeline_opts.h @@ -564,8 +564,25 @@ STAGE_CTX(store_8888, uint32_t**) { store(tail, byte(r,0)|byte(g,1)|byte(b,2)|byte(a,3), (int*)ptr); } +STAGE_CTX(load_u16_be, const uint64_t**) { + auto ptr = *ctx + x; + const void* src = ptr; + SkNx<N, uint64_t> px; + if (tail) { + px = load(tail, ptr); + src = &px; + } + + SkNh rh, gh, bh, ah; + SkNh::Load4(src, &rh, &gh, &bh, &ah); + r = (1.0f / 65535.0f) * SkNx_cast<float>((rh << 8) | (rh >> 8)); + g = (1.0f / 65535.0f) * SkNx_cast<float>((gh << 8) | (gh >> 8)); + b = (1.0f / 65535.0f) * SkNx_cast<float>((bh << 8) | (bh >> 8)); + a = (1.0f / 65535.0f) * SkNx_cast<float>((ah << 8) | (ah >> 8)); +} + STAGE_CTX(load_tables, const LoadTablesContext*) { - auto ptr = ctx->fSrc + x; + auto ptr = (const uint32_t*)ctx->fSrc + x; SkNu rgba = load(tail, ptr); auto to_int = [](const SkNu& v) { return SkNi::Load(&v); }; @@ -575,6 +592,19 @@ STAGE_CTX(load_tables, const LoadTablesContext*) { a = SkNf_from_byte(rgba >> 24); } +STAGE_CTX(load_tables_u16_be, const LoadTablesContext*) { + auto ptr = (const uint64_t*)ctx->fSrc + x; + + SkNh rh, gh, bh, ah; + SkNh::Load4(ptr, &rh, &gh, &bh, &ah); + + // ctx->fSrc is big-endian, so "& 0xff" grabs the 8 most significant bits of each component. + r = gather(tail, ctx->fR, SkNx_cast<int>(rh & 0xff)); + g = gather(tail, ctx->fG, SkNx_cast<int>(gh & 0xff)); + b = gather(tail, ctx->fB, SkNx_cast<int>(bh & 0xff)); + a = (1.0f / 65535.0f) * SkNx_cast<float>((ah << 8) | (ah >> 8)); +} + STAGE_CTX(store_tables, const StoreTablesContext*) { auto ptr = ctx->fDst + x; |