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

Commit 2f213f58 authored by John Reck's avatar John Reck Committed by Android (Google) Code Review
Browse files

Merge "New DisplayList v2"

parents af6e72f0 8f45d4af
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