Loading libs/input/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ cc_library_shared { srcs: [ "PointerController.cpp", "SpriteController.cpp", "SpriteIcon.cpp", ], shared_libs: [ Loading libs/input/SpriteController.cpp +7 −39 Original line number Diff line number Diff line Loading @@ -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 --- Loading Loading @@ -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( Loading @@ -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; Loading Loading @@ -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++) { Loading libs/input/SpriteController.h +2 −30 Original line number Diff line number Diff line Loading @@ -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 { /* Loading Loading @@ -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. Loading libs/input/SpriteIcon.cpp 0 → 100644 +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 libs/input/SpriteIcon.h 0 → 100644 +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 Loading
libs/input/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ cc_library_shared { srcs: [ "PointerController.cpp", "SpriteController.cpp", "SpriteIcon.cpp", ], shared_libs: [ Loading
libs/input/SpriteController.cpp +7 −39 Original line number Diff line number Diff line Loading @@ -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 --- Loading Loading @@ -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( Loading @@ -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; Loading Loading @@ -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++) { Loading
libs/input/SpriteController.h +2 −30 Original line number Diff line number Diff line Loading @@ -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 { /* Loading Loading @@ -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. Loading
libs/input/SpriteIcon.cpp 0 → 100644 +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
libs/input/SpriteIcon.h 0 → 100644 +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