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

Commit 674625e7 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Isolate SpriteIcon into its own file." into rvc-dev-plus-aosp

parents 94390715 19a44bc5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ cc_library_shared {
    srcs: [
        "PointerController.cpp",
        "SpriteController.cpp",
        "SpriteIcon.cpp",
    ],

    shared_libs: [
+7 −39
Original line number Diff line number Diff line
@@ -23,11 +23,6 @@
#include <utils/String8.h>
#include <gui/Surface.h>

#include <android/graphics/bitmap.h>
#include <android/graphics/canvas.h>
#include <android/graphics/paint.h>
#include <android/native_window.h>

namespace android {

// --- SpriteController ---
@@ -130,8 +125,8 @@ void SpriteController::doUpdateSprites() {
        SpriteUpdate& update = updates.editItemAt(i);

        if (update.state.surfaceControl == NULL && update.state.wantSurfaceVisible()) {
            update.state.surfaceWidth = update.state.icon.bitmap.getInfo().width;
            update.state.surfaceHeight = update.state.icon.bitmap.getInfo().height;
            update.state.surfaceWidth = update.state.icon.width();
            update.state.surfaceHeight = update.state.icon.height();
            update.state.surfaceDrawn = false;
            update.state.surfaceVisible = false;
            update.state.surfaceControl = obtainSurface(
@@ -152,8 +147,8 @@ void SpriteController::doUpdateSprites() {
        }

        if (update.state.wantSurfaceVisible()) {
            int32_t desiredWidth = update.state.icon.bitmap.getInfo().width;
            int32_t desiredHeight = update.state.icon.bitmap.getInfo().height;
            int32_t desiredWidth = update.state.icon.width();
            int32_t desiredHeight = update.state.icon.height();
            if (update.state.surfaceWidth < desiredWidth
                    || update.state.surfaceHeight < desiredHeight) {
                needApplyTransaction = true;
@@ -194,39 +189,12 @@ void SpriteController::doUpdateSprites() {
        if (update.state.surfaceControl != NULL && !update.state.surfaceDrawn
                && update.state.wantSurfaceVisible()) {
            sp<Surface> surface = update.state.surfaceControl->getSurface();
            ANativeWindow_Buffer outBuffer;
            status_t status = surface->lock(&outBuffer, NULL);
            if (status) {
                ALOGE("Error %d locking sprite surface before drawing.", status);
            } else {
                graphics::Paint paint;
                paint.setBlendMode(ABLEND_MODE_SRC);

                graphics::Canvas canvas(outBuffer, (int32_t) surface->getBuffersDataSpace());
                canvas.drawBitmap(update.state.icon.bitmap, 0, 0, &paint);

                const int iconWidth = update.state.icon.bitmap.getInfo().width;
                const int iconHeight = update.state.icon.bitmap.getInfo().height;

                if (outBuffer.width > iconWidth) {
                    paint.setBlendMode(ABLEND_MODE_CLEAR); // clear to transparent
                    canvas.drawRect({iconWidth, 0, outBuffer.width, iconHeight}, paint);
                }
                if (outBuffer.height > iconHeight) {
                    paint.setBlendMode(ABLEND_MODE_CLEAR); // clear to transparent
                    canvas.drawRect({0, iconHeight, outBuffer.width, outBuffer.height}, paint);
                }

                status = surface->unlockAndPost();
                if (status) {
                    ALOGE("Error %d unlocking and posting sprite surface after drawing.", status);
                } else {
            if (update.state.icon.draw(surface)) {
                update.state.surfaceDrawn = true;
                update.surfaceChanged = surfaceChanged = true;
            }
        }
    }
    }

    needApplyTransaction = false;
    for (size_t i = 0; i < numSprites; i++) {
+2 −30
Original line number Diff line number Diff line
@@ -20,9 +20,10 @@
#include <utils/RefBase.h>
#include <utils/Looper.h>

#include <android/graphics/bitmap.h>
#include <gui/SurfaceComposerClient.h>

#include "SpriteIcon.h"

namespace android {

/*
@@ -50,35 +51,6 @@ struct SpriteTransformationMatrix {
    }
};

/*
 * Icon that a sprite displays, including its hotspot.
 */
struct SpriteIcon {
    inline SpriteIcon() : style(0), hotSpotX(0), hotSpotY(0) { }
    inline SpriteIcon(const graphics::Bitmap& bitmap, int32_t style, float hotSpotX, float hotSpotY) :
            bitmap(bitmap), style(style), hotSpotX(hotSpotX), hotSpotY(hotSpotY) { }

    graphics::Bitmap bitmap;
    int32_t style;
    float hotSpotX;
    float hotSpotY;

    inline SpriteIcon copy() const {
        return SpriteIcon(bitmap.copy(ANDROID_BITMAP_FORMAT_RGBA_8888), style, hotSpotX, hotSpotY);
    }

    inline void reset() {
        bitmap.reset();
        style = 0;
        hotSpotX = 0;
        hotSpotY = 0;
    }

    inline bool isValid() const {
        return bitmap.isValid() && !bitmap.isEmpty();
    }
};

/*
 * A sprite is a simple graphical object that is displayed on-screen above other layers.
 * The basic sprite class is an interface.
+60 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.
 */

#include "SpriteIcon.h"

#include <android/graphics/bitmap.h>
#include <android/graphics/canvas.h>
#include <android/graphics/paint.h>
#include <android/native_window.h>
#include <log/log.h>

namespace android {

bool SpriteIcon::draw(sp<Surface> surface) const {
    ANativeWindow_Buffer outBuffer;
    status_t status = surface->lock(&outBuffer, NULL);
    if (status) {
        ALOGE("Error %d locking sprite surface before drawing.", status);
        return false;
    }

    graphics::Paint paint;
    paint.setBlendMode(ABLEND_MODE_SRC);

    graphics::Canvas canvas(outBuffer, (int32_t)surface->getBuffersDataSpace());
    canvas.drawBitmap(bitmap, 0, 0, &paint);

    const int iconWidth = width();
    const int iconHeight = height();

    if (outBuffer.width > iconWidth) {
        paint.setBlendMode(ABLEND_MODE_CLEAR); // clear to transparent
        canvas.drawRect({iconWidth, 0, outBuffer.width, iconHeight}, paint);
    }
    if (outBuffer.height > iconHeight) {
        paint.setBlendMode(ABLEND_MODE_CLEAR); // clear to transparent
        canvas.drawRect({0, iconHeight, outBuffer.width, outBuffer.height}, paint);
    }

    status = surface->unlockAndPost();
    if (status) {
        ALOGE("Error %d unlocking and posting sprite surface after drawing.", status);
    }
    return !status;
}

} // namespace android
+61 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.
 */

#ifndef _UI_SPRITE_ICON_H
#define _UI_SPRITE_ICON_H

#include <android/graphics/bitmap.h>
#include <gui/Surface.h>

namespace android {

/*
 * Icon that a sprite displays, including its hotspot.
 */
struct SpriteIcon {
    inline SpriteIcon() : style(0), hotSpotX(0), hotSpotY(0) {}
    inline SpriteIcon(const graphics::Bitmap& bitmap, int32_t style, float hotSpotX, float hotSpotY)
          : bitmap(bitmap), style(style), hotSpotX(hotSpotX), hotSpotY(hotSpotY) {}

    graphics::Bitmap bitmap;
    int32_t style;
    float hotSpotX;
    float hotSpotY;

    inline SpriteIcon copy() const {
        return SpriteIcon(bitmap.copy(ANDROID_BITMAP_FORMAT_RGBA_8888), style, hotSpotX, hotSpotY);
    }

    inline void reset() {
        bitmap.reset();
        style = 0;
        hotSpotX = 0;
        hotSpotY = 0;
    }

    inline bool isValid() const { return bitmap.isValid() && !bitmap.isEmpty(); }

    inline int32_t width() const { return bitmap.getInfo().width; }
    inline int32_t height() const { return bitmap.getInfo().height; }

    // Draw the bitmap onto the given surface. Returns true if it's successful, or false otherwise.
    // Note it doesn't set any metadata to the surface.
    bool draw(const sp<Surface> surface) const;
};

} // namespace android

#endif // _UI_SPRITE_ICON_H