diff options
| author | 2020-05-28 14:31:29 -0700 | |
|---|---|---|
| committer | 2020-06-01 18:36:03 +0000 | |
| commit | 19a44bc5bc1b243d9f2e2cf7c769b10626157a94 (patch) | |
| tree | 9b9912f1ff26a796cf490e3b6aedea46c8be86c3 /libs/input/SpriteIcon.cpp | |
| parent | 5a407967e842909bd855e982ff7a08089e40da2f (diff) | |
Isolate SpriteIcon into its own file.
This is to isolate differences between internal master and AOSP so that
the open source intern can work on a relatively new project.
It also isolates a divergent piece of code into SpriteIcon.cpp.
Bug: None
Test: Pointer icons in ApiDemos still work.
Change-Id: I1bf8f23411ad7170de2497d6fee0f70b015e9b5f
Merged-In: I1bf8f23411ad7170de2497d6fee0f70b015e9b5f
(cherry picked from commit 7e3457e593f417eb7a5a55d301b3d5f5dd1debdf)
Diffstat (limited to 'libs/input/SpriteIcon.cpp')
| -rw-r--r-- | libs/input/SpriteIcon.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/libs/input/SpriteIcon.cpp b/libs/input/SpriteIcon.cpp new file mode 100644 index 000000000000..b7e51e22a214 --- /dev/null +++ b/libs/input/SpriteIcon.cpp @@ -0,0 +1,60 @@ +/* + * 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 |