180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkMovie.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h"
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPaint.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// We should never see this in normal operation since our time values are
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// 0-based. So we use it as a sentinal.
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define UNINITIALIZED_MSEC ((SkMSec)-1)
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkMovie::SkMovie()
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fInfo.fDuration = UNINITIALIZED_MSEC;  // uninitialized
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fCurrTime = UNINITIALIZED_MSEC; // uninitialized
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fNeedBitmap = true;
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkMovie::ensureInfo()
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fInfo.fDuration == UNINITIALIZED_MSEC && !this->onGetInfo(&fInfo))
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        memset(&fInfo, 0, sizeof(fInfo));   // failure
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkMSec SkMovie::duration()
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->ensureInfo();
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fInfo.fDuration;
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkMovie::width()
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->ensureInfo();
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fInfo.fWidth;
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkMovie::height()
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->ensureInfo();
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fInfo.fHeight;
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkMovie::isOpaque()
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->ensureInfo();
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fInfo.fIsOpaque;
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkMovie::setTime(SkMSec time)
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMSec dur = this->duration();
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (time > dur)
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        time = dur;
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool changed = false;
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (time != fCurrTime)
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fCurrTime = time;
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        changed = this->onSetTime(time);
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fNeedBitmap |= changed;
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return changed;
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkBitmap& SkMovie::bitmap()
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fCurrTime == UNINITIALIZED_MSEC)    // uninitialized
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->setTime(0);
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fNeedBitmap)
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    {
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (!this->onGetBitmap(&fBitmap))   // failure
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            fBitmap.reset();
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fNeedBitmap = false;
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fBitmap;
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkStream.h"
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkMovie* SkMovie::DecodeMemory(const void* data, size_t length) {
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMemoryStream stream(data, length, false);
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return SkMovie::DecodeStream(&stream);
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
92096defe64d408e54474fe19f418c95bf1a554fc7Derek SollenbergerSkMovie* SkMovie::DecodeFile(const char path[]) {
930a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    SkAutoTUnref<SkStreamRewindable> stream(SkStream::NewFromFile(path));
94096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    return stream.get() ? SkMovie::DecodeStream(stream) : NULL;
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
96