Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f45d4af authored by John Reck's avatar John Reck
Browse files

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
parent 0ce807ab
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -223,6 +223,7 @@ cc_defaults {
        "Properties.cpp",
        "PropertyValuesAnimatorSet.cpp",
        "PropertyValuesHolder.cpp",
        "RecordingCanvas.cpp",
        "RenderNode.cpp",
        "RenderProperties.cpp",
        "ResourceCache.cpp",
+36 −39
Original line number Diff line number Diff line
@@ -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()));
        }
bool transformPaint(ColorTransform transform, SkPaint* paint) {
    // TODO
    applyColorTransform(transform, *paint);
    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;
}

};  // namespace android::uirenderer
 No newline at end of file
+2 −2
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ enum class ColorTransform {
    Dark,
};

std::unique_ptr<SkCanvas> makeTransformCanvas(SkCanvas* inCanvas, ColorTransform transform);
std::unique_ptr<SkCanvas> makeTransformCanvas(SkCanvas* inCanvas, UsageHint usageHint);
// True if the paint was modified, false otherwise
bool transformPaint(ColorTransform transform, SkPaint* paint);

}  // namespace android::uirenderer;
 No newline at end of file
+52 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

X(Flush) 
X(Save) 
X(Restore) 
X(SaveLayer)
X(Concat) 
X(SetMatrix) 
X(Translate)
X(ClipPath) 
X(ClipRect) 
X(ClipRRect) 
X(ClipRegion)
X(DrawPaint) 
X(DrawPath) 
X(DrawRect) 
X(DrawRegion) 
X(DrawOval) 
X(DrawArc)
X(DrawRRect) 
X(DrawDRRect) 
X(DrawAnnotation) 
X(DrawDrawable) 
X(DrawPicture)
X(DrawImage) 
X(DrawImageNine) 
X(DrawImageRect) 
X(DrawImageLattice)
X(DrawText) 
X(DrawPosText) 
X(DrawPosTextH)
X(DrawTextRSXform) 
X(DrawTextBlob)
X(DrawPatch) 
X(DrawPoints) 
X(DrawVertices) 
X(DrawAtlas) 
X(DrawShadowRec)
 No newline at end of file
+934 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading