New DisplayList v2
First step of many
* Pulls SkLiteDL and SkLiteRecorder into HWUI
* forceDark shifted to be a sync-time transformation
instead of record time. No meaningful behavior change,
but much more flexible heuristics are possible this
way.
Test: build, poked around with forceDark on
Change-Id: I7b7cec5b7fd7c2b18823b4d92d821cf5898f9b88
diff --git a/libs/hwui/CanvasTransform.cpp b/libs/hwui/CanvasTransform.cpp
index 1b15dbd..adcdc18 100644
--- a/libs/hwui/CanvasTransform.cpp
+++ b/libs/hwui/CanvasTransform.cpp
@@ -15,16 +15,20 @@
*/
#include "CanvasTransform.h"
-#include "utils/Color.h"
#include "Properties.h"
+#include "utils/Color.h"
-#include <ui/ColorSpace.h>
#include <SkColorFilter.h>
+#include <SkGradientShader.h>
#include <SkPaint.h>
+#include <SkShader.h>
+#include <ui/ColorSpace.h>
#include <algorithm>
#include <cmath>
+#include <log/log.h>
+
namespace android::uirenderer {
static SkColor makeLight(SkColor color) {
@@ -66,6 +70,32 @@
SkColor newColor = transformColor(transform, paint.getColor());
paint.setColor(newColor);
+ if (paint.getShader()) {
+ SkShader::GradientInfo info;
+ std::array<SkColor, 10> _colorStorage;
+ std::array<SkScalar, _colorStorage.size()> _offsetStorage;
+ info.fColorCount = _colorStorage.size();
+ info.fColors = _colorStorage.data();
+ info.fColorOffsets = _offsetStorage.data();
+ SkShader::GradientType type = paint.getShader()->asAGradient(&info);
+ ALOGW_IF(type, "Found gradient of type = %d", type);
+
+ if (info.fColorCount <= 10) {
+ switch (type) {
+ case SkShader::kLinear_GradientType:
+ for (int i = 0; i < info.fColorCount; i++) {
+ info.fColors[i] = transformColor(transform, info.fColors[i]);
+ }
+ paint.setShader(SkGradientShader::MakeLinear(info.fPoint, info.fColors,
+ info.fColorOffsets, info.fColorCount,
+ info.fTileMode, info.fGradientFlags, nullptr));
+ break;
+ default:break;
+ }
+
+ }
+ }
+
if (paint.getColorFilter()) {
SkBlendMode mode;
SkColor color;
@@ -77,43 +107,10 @@
}
}
-class ColorFilterCanvas : public SkPaintFilterCanvas {
-public:
- ColorFilterCanvas(ColorTransform transform, SkCanvas* canvas)
- : SkPaintFilterCanvas(canvas), mTransform(transform) {}
-
- bool onFilter(SkTCopyOnFirstWrite<SkPaint>* paint, Type type) const override {
- if (*paint) {
- applyColorTransform(mTransform, *(paint->writable()));
- }
- return true;
- }
-
-private:
- ColorTransform mTransform;
-};
-
-std::unique_ptr<SkCanvas> makeTransformCanvas(SkCanvas* inCanvas, ColorTransform transform) {
- switch (transform) {
- case ColorTransform::Light:
- return std::make_unique<ColorFilterCanvas>(ColorTransform::Light, inCanvas);
- case ColorTransform::Dark:
- return std::make_unique<ColorFilterCanvas>(ColorTransform::Dark, inCanvas);
- default:
- return nullptr;
- }
-}
-
-std::unique_ptr<SkCanvas> makeTransformCanvas(SkCanvas* inCanvas, UsageHint usageHint) {
- if (Properties::forceDarkMode) {
- switch (usageHint) {
- case UsageHint::Unknown:
- return makeTransformCanvas(inCanvas, ColorTransform::Light);
- case UsageHint::Background:
- return makeTransformCanvas(inCanvas, ColorTransform::Dark);
- }
- }
- return nullptr;
+bool transformPaint(ColorTransform transform, SkPaint* paint) {
+ // TODO
+ applyColorTransform(transform, *paint);
+ return true;
}
}; // namespace android::uirenderer
\ No newline at end of file