summaryrefslogtreecommitdiff
path: root/libs/hwui/CanvasTransform.cpp
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2018-08-15 10:17:12 -0700
committerJohn Reck <jreck@google.com>2018-08-29 13:53:36 -0700
commit8f45d4afd95e73fab931722038fb411ab3f1603d (patch)
treef4bfbe131830757a25a56952c04ff9838c8053af /libs/hwui/CanvasTransform.cpp
parent0ce807abd5216010a085db207ef7799d3e7f549c (diff)
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
Diffstat (limited to 'libs/hwui/CanvasTransform.cpp')
-rw-r--r--libs/hwui/CanvasTransform.cpp75
1 files changed, 36 insertions, 39 deletions
diff --git a/libs/hwui/CanvasTransform.cpp b/libs/hwui/CanvasTransform.cpp
index 1b15dbd526cc..adcdc18ab418 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 @@ static void applyColorTransform(ColorTransform transform, SkPaint& paint) {
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 @@ static void applyColorTransform(ColorTransform transform, SkPaint& paint) {
}
}
-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