1 /*
2  * Copyright 2019 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 
17 #pragma once
18 
19 #include <unordered_map>
20 
21 #include <math/vec4.h>
22 #include <ui/Rect.h>
23 #include <ui/Size.h>
24 #include <utils/StrongPointer.h>
25 
26 #include "Scheduler/RefreshRateConfigs.h"
27 
28 namespace android {
29 
30 class Client;
31 class GraphicBuffer;
32 class IBinder;
33 class IGraphicBufferProducer;
34 class Layer;
35 class SurfaceFlinger;
36 
37 using RefreshRate = scheduler::RefreshRateConfigs::RefreshRate;
38 
39 class RefreshRateOverlay {
40 public:
41     explicit RefreshRateOverlay(SurfaceFlinger&);
42 
43     void setViewport(ui::Size);
44     void changeRefreshRate(const RefreshRate&);
45 
46 private:
47     class SevenSegmentDrawer {
48     public:
49         static sp<GraphicBuffer> drawNumber(int number, const half4& color);
getHeight()50         static uint32_t getHeight() { return BUFFER_HEIGHT; }
getWidth()51         static uint32_t getWidth() { return BUFFER_WIDTH; }
52 
53     private:
54         enum class Segment { Upper, UpperLeft, UpperRight, Middle, LowerLeft, LowerRight, Buttom };
55 
56         static void drawRect(const Rect& r, const half4& color, const sp<GraphicBuffer>& buffer,
57                              uint8_t* pixels);
58         static void drawSegment(Segment segment, int left, const half4& color,
59                                 const sp<GraphicBuffer>& buffer, uint8_t* pixels);
60         static void drawDigit(int digit, int left, const half4& color,
61                               const sp<GraphicBuffer>& buffer, uint8_t* pixels);
62 
63         static constexpr uint32_t DIGIT_HEIGHT = 100;
64         static constexpr uint32_t DIGIT_WIDTH = 64;
65         static constexpr uint32_t DIGIT_SPACE = 16;
66         static constexpr uint32_t BUFFER_HEIGHT = DIGIT_HEIGHT;
67         static constexpr uint32_t BUFFER_WIDTH =
68                 3 * DIGIT_WIDTH + 2 * DIGIT_SPACE; // Digit|Space|Digit|Space|Digit
69     };
70 
71     bool createLayer();
72     void primeCache();
73 
74     SurfaceFlinger& mFlinger;
75     const sp<Client> mClient;
76     sp<Layer> mLayer;
77     sp<IBinder> mIBinder;
78     sp<IGraphicBufferProducer> mGbp;
79 
80     std::unordered_map<int, sp<GraphicBuffer>> mBufferCache;
81 
82     static constexpr float ALPHA = 0.8f;
83     const half3 LOW_FPS_COLOR = half3(1.0f, 0.0f, 0.0f);
84     const half3 HIGH_FPS_COLOR = half3(0.0f, 1.0f, 0.0f);
85 };
86 
87 } // namespace android
88