blob: e8bbd2d19ea31ae7a02d54bce6807194f01f2947 [file] [log] [blame]
Matt Mowere04eee72016-12-31 00:38:57 -06001/*
2 Copyright 2017 TeamWin
3 This file is part of TWRP/TeamWin Recovery Project.
4
5 TWRP is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 TWRP is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with TWRP. If not, see <http://www.gnu.org/licenses/>.
17*/
18
Dees_Troy51a0e822012-09-05 15:24:24 -040019// animation.cpp - GUIAnimation object
20
21#include <stdarg.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <fcntl.h>
26#include <sys/reboot.h>
27#include <sys/stat.h>
28#include <sys/time.h>
29#include <sys/mman.h>
30#include <sys/types.h>
31#include <sys/ioctl.h>
32#include <time.h>
33#include <unistd.h>
34#include <stdlib.h>
35
36#include <string>
37
38extern "C" {
Dees_Troy2673cec2013-04-02 20:22:16 +000039#include "../twcommon.h"
Dees_Troy51a0e822012-09-05 15:24:24 -040040}
bigbiffd81833a2021-01-17 11:06:57 -050041#include "minuitwrp/minui.h"
Dees_Troy51a0e822012-09-05 15:24:24 -040042
43#include "rapidxml.hpp"
44#include "objects.hpp"
45
46
Vojtech Bocekede51c52014-02-07 23:58:09 +010047GUIAnimation::GUIAnimation(xml_node<>* node) : GUIObject(node)
Dees_Troy51a0e822012-09-05 15:24:24 -040048{
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020049 xml_node<>* child;
Dees_Troy51a0e822012-09-05 15:24:24 -040050
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020051 mAnimation = NULL;
52 mFrame = 1;
53 mFPS = 1;
54 mLoop = -1;
55 mRender = 1;
56 mUpdateCount = 0;
Dees_Troy51a0e822012-09-05 15:24:24 -040057
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020058 if (!node) return;
Dees_Troy51a0e822012-09-05 15:24:24 -040059
Ethan Yonker21ff02a2015-02-18 14:35:00 -060060 mAnimation = LoadAttrAnimation(FindNode(node, "resource"), "name");
Dees_Troy51a0e822012-09-05 15:24:24 -040061
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020062 // Load the placement
Ethan Yonker21ff02a2015-02-18 14:35:00 -060063 LoadPlacement(FindNode(node, "placement"), &mRenderX, &mRenderY, NULL, NULL, &mPlacement);
Dees_Troy51a0e822012-09-05 15:24:24 -040064
Ethan Yonker21ff02a2015-02-18 14:35:00 -060065 child = FindNode(node, "speed");
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020066 if (child)
67 {
Ethan Yonker21ff02a2015-02-18 14:35:00 -060068 mFPS = LoadAttrInt(child, "fps", mFPS);
69 mRender = LoadAttrInt(child, "render", mRender);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020070 }
71 if (mFPS > 30) mFPS = 30;
Dees_Troy51a0e822012-09-05 15:24:24 -040072
Ethan Yonker21ff02a2015-02-18 14:35:00 -060073 child = FindNode(node, "loop");
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020074 if (child)
75 {
Ethan Yonker21ff02a2015-02-18 14:35:00 -060076 xml_attribute<>* attr = child->first_attribute("frame");
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020077 if (attr)
78 mLoop = atoi(attr->value()) - 1;
Ethan Yonker21ff02a2015-02-18 14:35:00 -060079 mFrame = LoadAttrInt(child, "start", mFrame);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020080 }
Dees_Troy51a0e822012-09-05 15:24:24 -040081
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020082 // Fetch the render sizes
83 if (mAnimation && mAnimation->GetResource())
84 {
thatf6ed8fc2015-02-14 20:23:16 +010085 mRenderW = mAnimation->GetWidth();
86 mRenderH = mAnimation->GetHeight();
Dees_Troy51a0e822012-09-05 15:24:24 -040087
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020088 // Adjust for placement
89 if (mPlacement != TOP_LEFT && mPlacement != BOTTOM_LEFT)
90 {
91 if (mPlacement == CENTER)
92 mRenderX -= (mRenderW / 2);
93 else
94 mRenderX -= mRenderW;
95 }
96 if (mPlacement != TOP_LEFT && mPlacement != TOP_RIGHT)
97 {
98 if (mPlacement == CENTER)
99 mRenderY -= (mRenderH / 2);
100 else
101 mRenderY -= mRenderH;
102 }
103 SetPlacement(TOP_LEFT);
104 }
Dees_Troy51a0e822012-09-05 15:24:24 -0400105}
106
107int GUIAnimation::Render(void)
108{
Matt Mowera8a89d12016-12-30 18:10:37 -0600109 if (!isConditionTrue())
Vojtech Bocekede51c52014-02-07 23:58:09 +0100110 return 0;
111
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200112 if (!mAnimation || !mAnimation->GetResource(mFrame)) return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400113
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200114 gr_blit(mAnimation->GetResource(mFrame), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
115 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400116}
117
118int GUIAnimation::Update(void)
119{
Matt Mowera8a89d12016-12-30 18:10:37 -0600120 if (!isConditionTrue())
Vojtech Bocekede51c52014-02-07 23:58:09 +0100121 return 0;
122
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200123 if (!mAnimation) return -1;
Dees_Troy51a0e822012-09-05 15:24:24 -0400124
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200125 // Handle the "end-of-animation" state
126 if (mLoop == -2) return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400127
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200128 // Determine if we need the next frame yet...
Alexander Winkowski5d3e4882022-06-25 18:56:33 +0000129 if (++mUpdateCount > TW_FRAMERATE / mFPS)
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200130 {
131 mUpdateCount = 0;
132 if (++mFrame >= mAnimation->GetResourceCount())
133 {
134 if (mLoop < 0)
135 {
136 mFrame = mAnimation->GetResourceCount() - 1;
137 mLoop = -2;
138 }
139 else
140 mFrame = mLoop;
141 }
142 if (mRender == 2) return 2;
143 return (Render() == 0 ? 1 : -1);
144 }
145 return 0;
Dees_Troy51a0e822012-09-05 15:24:24 -0400146}
147