diff options
author | John Reck <jreck@google.com> | 2018-08-15 10:17:12 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2018-08-29 13:53:36 -0700 |
commit | 8f45d4afd95e73fab931722038fb411ab3f1603d (patch) | |
tree | f4bfbe131830757a25a56952c04ff9838c8053af /libs/hwui/CanvasTransform.cpp | |
parent | 0ce807abd5216010a085db207ef7799d3e7f549c (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.cpp | 75 |
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 |