summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/input/SpriteController.cpp6
-rw-r--r--libs/input/SpriteController.h5
-rw-r--r--services/core/jni/com_android_server_input_InputManagerService.cpp7
3 files changed, 15 insertions, 3 deletions
diff --git a/libs/input/SpriteController.cpp b/libs/input/SpriteController.cpp
index 8613a3b07bb5..ed31b1202863 100644
--- a/libs/input/SpriteController.cpp
+++ b/libs/input/SpriteController.cpp
@@ -405,7 +405,11 @@ void SpriteController::SpriteImpl::setIcon(const SpriteIcon& icon) {
uint32_t dirty;
if (icon.isValid()) {
- icon.bitmap.copyTo(&mLocked.state.icon.bitmap, kN32_SkColorType);
+ SkBitmap* bitmapCopy = &mLocked.state.icon.bitmap;
+ if (bitmapCopy->tryAllocPixels(icon.bitmap.info().makeColorType(kN32_SkColorType))) {
+ icon.bitmap.readPixels(bitmapCopy->info(), bitmapCopy->getPixels(),
+ bitmapCopy->rowBytes(), 0, 0);
+ }
if (!mLocked.state.icon.isValid()
|| mLocked.state.icon.hotSpotX != icon.hotSpotX
diff --git a/libs/input/SpriteController.h b/libs/input/SpriteController.h
index 7fc8d6fd5197..31e43e9b99e5 100644
--- a/libs/input/SpriteController.h
+++ b/libs/input/SpriteController.h
@@ -65,7 +65,10 @@ struct SpriteIcon {
inline SpriteIcon copy() const {
SkBitmap bitmapCopy;
- bitmap.copyTo(&bitmapCopy, kN32_SkColorType);
+ if (bitmapCopy.tryAllocPixels(bitmap.info().makeColorType(kN32_SkColorType))) {
+ bitmap.readPixels(bitmapCopy.info(), bitmapCopy.getPixels(), bitmapCopy.rowBytes(),
+ 0, 0);
+ }
return SpriteIcon(bitmapCopy, hotSpotX, hotSpotY);
}
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 8baa96bf9bae..1b0d2087e223 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -157,7 +157,12 @@ static void loadSystemIconAsSpriteWithPointerIcon(JNIEnv* env, jobject contextOb
status_t status = android_view_PointerIcon_loadSystemIcon(env,
contextObj, style, outPointerIcon);
if (!status) {
- outPointerIcon->bitmap.copyTo(&outSpriteIcon->bitmap, kN32_SkColorType);
+ SkBitmap* bitmapCopy = &outSpriteIcon->bitmap;
+ SkImageInfo bitmapCopyInfo = outPointerIcon->bitmap.info().makeColorType(kN32_SkColorType);
+ if (bitmapCopy->tryAllocPixels(bitmapCopyInfo)) {
+ outPointerIcon->bitmap.readPixels(bitmapCopy->info(), bitmapCopy->getPixels(),
+ bitmapCopy->rowBytes(), 0, 0);
+ }
outSpriteIcon->hotSpotX = outPointerIcon->hotSpotX;
outSpriteIcon->hotSpotY = outPointerIcon->hotSpotY;
}