diff options
-rw-r--r-- | libs/input/SpriteController.cpp | 6 | ||||
-rw-r--r-- | libs/input/SpriteController.h | 5 | ||||
-rw-r--r-- | services/core/jni/com_android_server_input_InputManagerService.cpp | 7 |
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; } |