xref: /aosp_15_r20/frameworks/base/libs/hwui/jni/MovieImpl.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright 2011 Google Inc.
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*d57664e9SAndroid Build Coastguard Worker  * found in the LICENSE file.
6*d57664e9SAndroid Build Coastguard Worker  */
7*d57664e9SAndroid Build Coastguard Worker #include "Movie.h"
8*d57664e9SAndroid Build Coastguard Worker #include "SkBitmap.h"
9*d57664e9SAndroid Build Coastguard Worker #include "SkStream.h"
10*d57664e9SAndroid Build Coastguard Worker #include "SkTypes.h"
11*d57664e9SAndroid Build Coastguard Worker 
12*d57664e9SAndroid Build Coastguard Worker // We should never see this in normal operation since our time values are
13*d57664e9SAndroid Build Coastguard Worker // 0-based. So we use it as a sentinel.
14*d57664e9SAndroid Build Coastguard Worker #define UNINITIALIZED_MSEC ((Movie::MSec)-1)
15*d57664e9SAndroid Build Coastguard Worker 
Movie()16*d57664e9SAndroid Build Coastguard Worker Movie::Movie()
17*d57664e9SAndroid Build Coastguard Worker {
18*d57664e9SAndroid Build Coastguard Worker     fInfo.fDuration = UNINITIALIZED_MSEC;  // uninitialized
19*d57664e9SAndroid Build Coastguard Worker     fCurrTime = UNINITIALIZED_MSEC; // uninitialized
20*d57664e9SAndroid Build Coastguard Worker     fNeedBitmap = true;
21*d57664e9SAndroid Build Coastguard Worker }
22*d57664e9SAndroid Build Coastguard Worker 
ensureInfo()23*d57664e9SAndroid Build Coastguard Worker void Movie::ensureInfo()
24*d57664e9SAndroid Build Coastguard Worker {
25*d57664e9SAndroid Build Coastguard Worker     if (fInfo.fDuration == UNINITIALIZED_MSEC && !this->onGetInfo(&fInfo))
26*d57664e9SAndroid Build Coastguard Worker         memset(&fInfo, 0, sizeof(fInfo));   // failure
27*d57664e9SAndroid Build Coastguard Worker }
28*d57664e9SAndroid Build Coastguard Worker 
duration()29*d57664e9SAndroid Build Coastguard Worker Movie::MSec Movie::duration()
30*d57664e9SAndroid Build Coastguard Worker {
31*d57664e9SAndroid Build Coastguard Worker     this->ensureInfo();
32*d57664e9SAndroid Build Coastguard Worker     return fInfo.fDuration;
33*d57664e9SAndroid Build Coastguard Worker }
34*d57664e9SAndroid Build Coastguard Worker 
width()35*d57664e9SAndroid Build Coastguard Worker int Movie::width()
36*d57664e9SAndroid Build Coastguard Worker {
37*d57664e9SAndroid Build Coastguard Worker     this->ensureInfo();
38*d57664e9SAndroid Build Coastguard Worker     return fInfo.fWidth;
39*d57664e9SAndroid Build Coastguard Worker }
40*d57664e9SAndroid Build Coastguard Worker 
height()41*d57664e9SAndroid Build Coastguard Worker int Movie::height()
42*d57664e9SAndroid Build Coastguard Worker {
43*d57664e9SAndroid Build Coastguard Worker     this->ensureInfo();
44*d57664e9SAndroid Build Coastguard Worker     return fInfo.fHeight;
45*d57664e9SAndroid Build Coastguard Worker }
46*d57664e9SAndroid Build Coastguard Worker 
isOpaque()47*d57664e9SAndroid Build Coastguard Worker int Movie::isOpaque()
48*d57664e9SAndroid Build Coastguard Worker {
49*d57664e9SAndroid Build Coastguard Worker     this->ensureInfo();
50*d57664e9SAndroid Build Coastguard Worker     return fInfo.fIsOpaque;
51*d57664e9SAndroid Build Coastguard Worker }
52*d57664e9SAndroid Build Coastguard Worker 
setTime(Movie::MSec time)53*d57664e9SAndroid Build Coastguard Worker bool Movie::setTime(Movie::MSec time)
54*d57664e9SAndroid Build Coastguard Worker {
55*d57664e9SAndroid Build Coastguard Worker     Movie::MSec dur = this->duration();
56*d57664e9SAndroid Build Coastguard Worker     if (time > dur)
57*d57664e9SAndroid Build Coastguard Worker         time = dur;
58*d57664e9SAndroid Build Coastguard Worker 
59*d57664e9SAndroid Build Coastguard Worker     bool changed = false;
60*d57664e9SAndroid Build Coastguard Worker     if (time != fCurrTime)
61*d57664e9SAndroid Build Coastguard Worker     {
62*d57664e9SAndroid Build Coastguard Worker         fCurrTime = time;
63*d57664e9SAndroid Build Coastguard Worker         changed = this->onSetTime(time);
64*d57664e9SAndroid Build Coastguard Worker         fNeedBitmap |= changed;
65*d57664e9SAndroid Build Coastguard Worker     }
66*d57664e9SAndroid Build Coastguard Worker     return changed;
67*d57664e9SAndroid Build Coastguard Worker }
68*d57664e9SAndroid Build Coastguard Worker 
bitmap()69*d57664e9SAndroid Build Coastguard Worker const SkBitmap& Movie::bitmap()
70*d57664e9SAndroid Build Coastguard Worker {
71*d57664e9SAndroid Build Coastguard Worker     if (fCurrTime == UNINITIALIZED_MSEC)    // uninitialized
72*d57664e9SAndroid Build Coastguard Worker         this->setTime(0);
73*d57664e9SAndroid Build Coastguard Worker 
74*d57664e9SAndroid Build Coastguard Worker     if (fNeedBitmap)
75*d57664e9SAndroid Build Coastguard Worker     {
76*d57664e9SAndroid Build Coastguard Worker         if (!this->onGetBitmap(&fBitmap))   // failure
77*d57664e9SAndroid Build Coastguard Worker             fBitmap.reset();
78*d57664e9SAndroid Build Coastguard Worker         fNeedBitmap = false;
79*d57664e9SAndroid Build Coastguard Worker     }
80*d57664e9SAndroid Build Coastguard Worker     return fBitmap;
81*d57664e9SAndroid Build Coastguard Worker }
82*d57664e9SAndroid Build Coastguard Worker 
83*d57664e9SAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////
84*d57664e9SAndroid Build Coastguard Worker 
DecodeMemory(const void * data,size_t length)85*d57664e9SAndroid Build Coastguard Worker Movie* Movie::DecodeMemory(const void* data, size_t length) {
86*d57664e9SAndroid Build Coastguard Worker     SkMemoryStream stream(data, length, false);
87*d57664e9SAndroid Build Coastguard Worker     return Movie::DecodeStream(&stream);
88*d57664e9SAndroid Build Coastguard Worker }
89*d57664e9SAndroid Build Coastguard Worker 
DecodeFile(const char path[])90*d57664e9SAndroid Build Coastguard Worker Movie* Movie::DecodeFile(const char path[]) {
91*d57664e9SAndroid Build Coastguard Worker     std::unique_ptr<SkStreamRewindable> stream = SkStream::MakeFromFile(path);
92*d57664e9SAndroid Build Coastguard Worker     return stream ? Movie::DecodeStream(stream.get()) : nullptr;
93*d57664e9SAndroid Build Coastguard Worker }
94