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