Introduce SkRGBA4f, templated on SkAlphaType
Most functionality is shared, but this lets us get type safety.
SkColor4f = SkRGBA4f<kUnpremul>
SkPMColor4f = SkRGBA4f<kPremul>
Change-Id: I27408565dc92e722f42a185cecbf7af15d1dde3f
Reviewed-on: https://skia-review.googlesource.com/156243
Commit-Queue: Brian Osman <brianosman@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Auto-Submit: Mike Klein <mtklein@google.com>
diff --git a/src/core/SkBlendMode.cpp b/src/core/SkBlendMode.cpp
index ad7e535..56f57f4 100644
--- a/src/core/SkBlendMode.cpp
+++ b/src/core/SkBlendMode.cpp
@@ -121,7 +121,7 @@
p->append(stage);
}
-SkColor4f SkBlendMode_Apply(SkBlendMode mode, const SkColor4f& src, const SkColor4f& dst) {
+SkPMColor4f SkBlendMode_Apply(SkBlendMode mode, const SkPMColor4f& src, const SkPMColor4f& dst) {
// special-case simple/common modes...
switch (mode) {
case SkBlendMode::kClear: return { 0, 0, 0, 0 };
@@ -136,7 +136,7 @@
}
SkRasterPipeline_<256> p;
- SkColor4f src_storage = src,
+ SkPMColor4f src_storage = src,
dst_storage = dst,
res_storage;
SkJumper_MemoryCtx src_ctx = { &src_storage, 0 },
diff --git a/src/core/SkBlendModePriv.h b/src/core/SkBlendModePriv.h
index 7b7b300..3b5652d 100644
--- a/src/core/SkBlendModePriv.h
+++ b/src/core/SkBlendModePriv.h
@@ -9,9 +9,10 @@
#define SkBlendModePriv_DEFINED
#include "SkBlendMode.h"
+#include "SkColor.h"
+#include "SkPM4f.h"
class SkRasterPipeline;
-struct SkColor4f;
bool SkBlendMode_SupportsCoverageAsAlpha(SkBlendMode);
@@ -39,7 +40,7 @@
bool SkBlendMode_AsCoeff(SkBlendMode mode, SkBlendModeCoeff* src, SkBlendModeCoeff* dst);
-SkColor4f SkBlendMode_Apply(SkBlendMode, const SkColor4f& src, const SkColor4f& dst);
+SkPMColor4f SkBlendMode_Apply(SkBlendMode, const SkPMColor4f& src, const SkPMColor4f& dst);
#if SK_SUPPORT_GPU
#include "GrXferProcessor.h"
diff --git a/src/core/SkColor.cpp b/src/core/SkColor.cpp
index 19dd2c1..45982fb 100644
--- a/src/core/SkColor.cpp
+++ b/src/core/SkColor.cpp
@@ -135,23 +135,27 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
-SkColor4f SkColor4f::FromColor(SkColor bgra) {
+template <>
+SK_API SkColor4f SkColor4f::FromColor(SkColor bgra) {
SkColor4f rgba;
swizzle_rb(Sk4f_fromL32(bgra)).store(rgba.vec());
return rgba;
}
-SkColor SkColor4f::toSkColor() const {
+template <>
+SK_API SkColor SkColor4f::toSkColor() const {
return Sk4f_toL32(swizzle_rb(Sk4f::Load(this->vec())));
}
-SkColor4f SkColor4f::Pin(float r, float g, float b, float a) {
+template <>
+SK_API SkColor4f SkColor4f::Pin(float r, float g, float b, float a) {
SkColor4f c4;
Sk4f::Min(Sk4f::Max(Sk4f(r, g, b, a), Sk4f(0)), Sk4f(1)).store(c4.vec());
return c4;
}
-SkPM4f SkColor4f::toPM4f() const {
+template <>
+SK_API SkPM4f SkColor4f::toPM4f() const {
auto rgba = Sk4f::Load(this->vec());
return SkPM4f::From4f(rgba * Sk4f(rgba[3], rgba[3], rgba[3], 1));
}
diff --git a/src/core/SkColorFilter.cpp b/src/core/SkColorFilter.cpp
index 3e8c6e9..2356c4d 100644
--- a/src/core/SkColorFilter.cpp
+++ b/src/core/SkColorFilter.cpp
@@ -9,6 +9,7 @@
#include "SkColorFilter.h"
#include "SkColorSpaceXformer.h"
#include "SkNx.h"
+#include "SkPM4f.h"
#include "SkRasterPipeline.h"
#include "SkReadBuffer.h"
#include "SkRefCnt.h"
@@ -64,12 +65,12 @@
#include "SkRasterPipeline.h"
SkColor4f SkColorFilter::filterColor4f(const SkColor4f& c, SkColorSpace* colorSpace) const {
- SkColor4f dst, src = c.premul();
+ SkPMColor4f dst, src = c.premul();
SkSTArenaAlloc<128> alloc;
SkRasterPipeline pipeline(&alloc);
- pipeline.append_constant_color(&alloc, src);
+ pipeline.append_constant_color(&alloc, src.vec());
this->onAppendStages(&pipeline, colorSpace, &alloc, c.fA == 1);
SkJumper_MemoryCtx dstPtr = { &dst, 0 };
pipeline.append(SkRasterPipeline::store_f32, &dstPtr);
diff --git a/src/core/SkDraw_vertices.cpp b/src/core/SkDraw_vertices.cpp
index 939d616..b9bc2e6 100644
--- a/src/core/SkDraw_vertices.cpp
+++ b/src/core/SkDraw_vertices.cpp
@@ -10,6 +10,7 @@
#include "SkComposeShader.h"
#include "SkDraw.h"
#include "SkNx.h"
+#include "SkPM4f.h"
#include "SkRasterClip.h"
#include "SkScan.h"
#include "SkShaderBase.h"
@@ -97,7 +98,7 @@
};
static bool SK_WARN_UNUSED_RESULT
-update_tricolor_matrix(const SkMatrix& ctmInv, const SkPoint pts[], const SkColor4f colors[],
+update_tricolor_matrix(const SkMatrix& ctmInv, const SkPoint pts[], const SkPMColor4f colors[],
int index0, int index1, int index2, Matrix43* result) {
SkMatrix m, im;
m.reset();
@@ -135,9 +136,9 @@
// - convert colors into dst colorspace before interpolation (matches gradients)
// - apply per-color alpha before interpolation (matches old version of vertices)
//
-static SkColor4f* convert_colors(const SkColor src[], int count, SkColorSpace* deviceCS,
+static SkPMColor4f* convert_colors(const SkColor src[], int count, SkColorSpace* deviceCS,
SkArenaAlloc* alloc) {
- SkColor4f* dst = alloc->makeArray<SkColor4f>(count);
+ SkPMColor4f* dst = alloc->makeArray<SkPMColor4f>(count);
if (!deviceCS) {
for (int i = 0; i < count; ++i) {
dst[i] = SkColor4f::FromColor(src[i]).premul();
@@ -268,7 +269,7 @@
VertState::Proc vertProc = state.chooseProc(vmode);
if (colors || textures) {
- SkColor4f* dstColors = nullptr;
+ SkPMColor4f* dstColors = nullptr;
Matrix43* matrix43 = nullptr;
if (colors) {
diff --git a/src/core/SkGlyphRunPainter.cpp b/src/core/SkGlyphRunPainter.cpp
index 698f345..5bbcf2b 100644
--- a/src/core/SkGlyphRunPainter.cpp
+++ b/src/core/SkGlyphRunPainter.cpp
@@ -288,9 +288,8 @@
GrColor generate_filtered_color(const SkPaint& paint, const GrColorSpaceInfo& colorSpaceInfo) {
GrColor4f filteredColor = SkColor4fToUnpremulGrColor4f(paint.getColor4f(), colorSpaceInfo);
if (paint.getColorFilter() != nullptr) {
- filteredColor = GrColor4f::FromSkColor4f(
- paint.getColorFilter()->filterColor4f(filteredColor.toSkColor4f(),
- colorSpaceInfo.colorSpace()));
+ filteredColor = GrColor4f::FromRGBA4f(paint.getColorFilter()->filterColor4f(
+ filteredColor.asRGBA4f<kUnpremul_SkAlphaType>(),colorSpaceInfo.colorSpace()));
}
return filteredColor.premul().toGrColor();
}
diff --git a/src/core/SkPM4f.h b/src/core/SkPM4f.h
index f2720a0..ff6741e 100644
--- a/src/core/SkPM4f.h
+++ b/src/core/SkPM4f.h
@@ -74,4 +74,6 @@
SkColor4f unpremul() const;
};
+using SkPMColor4f = SkRGBA4f<kPremul_SkAlphaType>;
+
#endif
diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp
index 44792fb..4ac6f09 100644
--- a/src/core/SkPixmap.cpp
+++ b/src/core/SkPixmap.cpp
@@ -18,6 +18,7 @@
#include "SkMask.h"
#include "SkNx.h"
#include "SkPixmapPriv.h"
+#include "SkPM4f.h"
#include "SkReadPixelsRec.h"
#include "SkSurface.h"
#include "SkTemplates.h"
@@ -314,7 +315,7 @@
}
if (pm.colorType() == kRGBA_F32_SkColorType) {
- const SkColor4f rgba = color.premul();
+ const SkPMColor4f rgba = color.premul();
for (int y = 0; y < pm.height(); ++y) {
auto row = (float*)pm.writable_addr(0, y);
for (int x = 0; x < pm.width(); ++x) {