sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2015 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | #pragma once |
| 17 | |
| 18 | #include <SkBitmap.h> |
Romain Guy | 8242656 | 2017-04-04 19:38:50 -0700 | [diff] [blame] | 19 | #include <SkColorSpace.h> |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 20 | #include <SkColorTable.h> |
| 21 | #include <SkImageInfo.h> |
| 22 | #include <SkPixelRef.h> |
| 23 | #include <cutils/compiler.h> |
sergeyv | 694d499 | 2016-10-27 10:23:13 -0700 | [diff] [blame] | 24 | #include <ui/GraphicBuffer.h> |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 25 | |
| 26 | namespace android { |
| 27 | |
| 28 | enum class PixelStorageType { |
| 29 | External, |
| 30 | Heap, |
| 31 | Ashmem, |
sergeyv | 694d499 | 2016-10-27 10:23:13 -0700 | [diff] [blame] | 32 | Hardware, |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 33 | }; |
| 34 | |
sergeyv | 694d499 | 2016-10-27 10:23:13 -0700 | [diff] [blame] | 35 | namespace uirenderer { |
| 36 | namespace renderthread { |
| 37 | class RenderThread; |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | class PixelStorage; |
| 42 | |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 43 | typedef void (*FreeFunc)(void* addr, void* context); |
| 44 | |
sergeyv | c1c5406 | 2016-10-19 18:47:26 -0700 | [diff] [blame] | 45 | class ANDROID_API Bitmap : public SkPixelRef { |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 46 | public: |
sergeyv | c1c5406 | 2016-10-19 18:47:26 -0700 | [diff] [blame] | 47 | static sk_sp<Bitmap> allocateHeapBitmap(SkBitmap* bitmap, SkColorTable* ctable); |
sergeyv | fc999950 | 2016-10-17 13:07:38 -0700 | [diff] [blame] | 48 | static sk_sp<Bitmap> allocateHeapBitmap(const SkImageInfo& info); |
sergeyv | c36bd6c | 2016-10-11 15:49:16 -0700 | [diff] [blame] | 49 | |
sergeyv | 694d499 | 2016-10-27 10:23:13 -0700 | [diff] [blame] | 50 | static sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& bitmap); |
| 51 | |
sergeyv | c1c5406 | 2016-10-19 18:47:26 -0700 | [diff] [blame] | 52 | static sk_sp<Bitmap> allocateAshmemBitmap(SkBitmap* bitmap, SkColorTable* ctable); |
| 53 | static sk_sp<Bitmap> allocateAshmemBitmap(size_t allocSize, const SkImageInfo& info, |
sergeyv | c36bd6c | 2016-10-11 15:49:16 -0700 | [diff] [blame] | 54 | size_t rowBytes, SkColorTable* ctable); |
| 55 | |
sergeyv | 9a02987 | 2016-11-29 10:13:28 -0800 | [diff] [blame] | 56 | static sk_sp<Bitmap> createFrom(sp<GraphicBuffer> graphicBuffer); |
| 57 | |
sergeyv | aed7f58 | 2016-10-14 16:30:21 -0700 | [diff] [blame] | 58 | static sk_sp<Bitmap> createFrom(const SkImageInfo&, SkPixelRef&); |
sergeyv | 694d499 | 2016-10-27 10:23:13 -0700 | [diff] [blame] | 59 | |
| 60 | static sk_sp<Bitmap> allocateHardwareBitmap(uirenderer::renderthread::RenderThread&, |
| 61 | SkBitmap& bitmap); |
| 62 | |
sergeyv | c1c5406 | 2016-10-19 18:47:26 -0700 | [diff] [blame] | 63 | Bitmap(void* address, size_t allocSize, const SkImageInfo& info, size_t rowBytes, |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 64 | SkColorTable* ctable); |
sergeyv | c1c5406 | 2016-10-19 18:47:26 -0700 | [diff] [blame] | 65 | Bitmap(void* address, void* context, FreeFunc freeFunc, |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 66 | const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable); |
sergeyv | c1c5406 | 2016-10-19 18:47:26 -0700 | [diff] [blame] | 67 | Bitmap(void* address, int fd, size_t mappedSize, const SkImageInfo& info, |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 68 | size_t rowBytes, SkColorTable* ctable); |
| 69 | |
| 70 | int width() const { return info().width(); } |
| 71 | int height() const { return info().height(); } |
| 72 | |
| 73 | // Can't mark as override since SkPixelRef::rowBytes isn't virtual |
| 74 | // but that's OK since we just want Bitmap to be able to rely |
| 75 | // on calling rowBytes() on an unlocked pixelref, which it will be |
sergeyv | c1c5406 | 2016-10-19 18:47:26 -0700 | [diff] [blame] | 76 | // doing on a Bitmap type, not a SkPixelRef, so static |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 77 | // dispatching will do what we want. |
| 78 | size_t rowBytes() const { return mRowBytes; } |
sergeyv | 98fa4f9 | 2016-10-24 15:35:21 -0700 | [diff] [blame] | 79 | |
| 80 | int rowBytesAsPixels() const { |
| 81 | return mRowBytes >> info().shiftPerPixel(); |
| 82 | } |
| 83 | |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 84 | void reconfigure(const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable); |
| 85 | void reconfigure(const SkImageInfo& info); |
Romain Guy | 8242656 | 2017-04-04 19:38:50 -0700 | [diff] [blame] | 86 | void setColorSpace(sk_sp<SkColorSpace> colorSpace); |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 87 | void setAlphaType(SkAlphaType alphaType); |
| 88 | |
| 89 | void getSkBitmap(SkBitmap* outBitmap); |
| 90 | |
sergeyv | 554ffeb | 2016-11-15 18:01:21 -0800 | [diff] [blame] | 91 | // Ugly hack: in case of hardware bitmaps, it sets nullptr as pixels pointer |
| 92 | // so it would crash if anyone tries to render this bitmap. |
| 93 | void getSkBitmapForShaders(SkBitmap* outBitmap); |
| 94 | |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 95 | int getAshmemFd() const; |
| 96 | size_t getAllocationByteCount() const; |
| 97 | |
sergeyv | c1c5406 | 2016-10-19 18:47:26 -0700 | [diff] [blame] | 98 | void setHasHardwareMipMap(bool hasMipMap); |
| 99 | bool hasHardwareMipMap() const; |
| 100 | |
sergeyv | ec4a4b1 | 2016-10-20 18:39:04 -0700 | [diff] [blame] | 101 | bool isOpaque() const {return info().isOpaque(); } |
| 102 | SkColorType colorType() const { return info().colorType(); } |
| 103 | void getBounds(SkRect* bounds) const; |
| 104 | |
sergeyv | 98fa4f9 | 2016-10-24 15:35:21 -0700 | [diff] [blame] | 105 | bool readyToDraw() const { |
| 106 | return this->colorType() != kIndex_8_SkColorType || mColorTable; |
| 107 | } |
sergeyv | 694d499 | 2016-10-27 10:23:13 -0700 | [diff] [blame] | 108 | |
| 109 | bool isHardware() const { |
| 110 | return mPixelStorageType == PixelStorageType::Hardware; |
| 111 | } |
| 112 | |
| 113 | GraphicBuffer* graphicBuffer(); |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 114 | protected: |
| 115 | virtual bool onNewLockPixels(LockRec* rec) override; |
| 116 | virtual void onUnlockPixels() override { }; |
| 117 | virtual size_t getAllocatedSizeInBytes() const override; |
| 118 | private: |
sergeyv | 9a02987 | 2016-11-29 10:13:28 -0800 | [diff] [blame] | 119 | Bitmap(GraphicBuffer* buffer, const SkImageInfo& info); |
sergeyv | c1c5406 | 2016-10-19 18:47:26 -0700 | [diff] [blame] | 120 | virtual ~Bitmap(); |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 121 | void* getStorage() const; |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 122 | |
Mike Reed | 63df65d | 2017-04-10 13:31:28 -0400 | [diff] [blame^] | 123 | const PixelStorageType mPixelStorageType; |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 124 | |
| 125 | size_t mRowBytes = 0; |
| 126 | sk_sp<SkColorTable> mColorTable; |
| 127 | bool mHasHardwareMipMap = false; |
| 128 | |
| 129 | union { |
| 130 | struct { |
| 131 | void* address; |
| 132 | void* context; |
| 133 | FreeFunc freeFunc; |
| 134 | } external; |
| 135 | struct { |
| 136 | void* address; |
| 137 | int fd; |
| 138 | size_t size; |
| 139 | } ashmem; |
| 140 | struct { |
| 141 | void* address; |
| 142 | size_t size; |
| 143 | } heap; |
sergeyv | 694d499 | 2016-10-27 10:23:13 -0700 | [diff] [blame] | 144 | struct { |
| 145 | GraphicBuffer* buffer; |
| 146 | } hardware; |
sergeyv | 163f881 | 2016-10-07 16:57:29 -0700 | [diff] [blame] | 147 | } mPixelStorage; |
| 148 | }; |
| 149 | |
| 150 | } //namespace android |