1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMovie.h"
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPaint.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// We should never see this in normal operation since our time values are
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// 0-based. So we use it as a sentinal.
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define UNINITIALIZED_MSEC ((SkMSec)-1)
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkMovie::SkMovie()
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fInfo.fDuration = UNINITIALIZED_MSEC;  // uninitialized
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fCurrTime = UNINITIALIZED_MSEC; // uninitialized
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fNeedBitmap = true;
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkMovie::ensureInfo()
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fInfo.fDuration == UNINITIALIZED_MSEC && !this->onGetInfo(&fInfo))
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        memset(&fInfo, 0, sizeof(fInfo));   // failure
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkMSec SkMovie::duration()
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->ensureInfo();
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return fInfo.fDuration;
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkMovie::width()
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->ensureInfo();
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return fInfo.fWidth;
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkMovie::height()
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->ensureInfo();
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return fInfo.fHeight;
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comint SkMovie::isOpaque()
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->ensureInfo();
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return fInfo.fIsOpaque;
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkMovie::setTime(SkMSec time)
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMSec dur = this->duration();
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (time > dur)
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        time = dur;
58d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bool changed = false;
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (time != fCurrTime)
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fCurrTime = time;
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        changed = this->onSetTime(time);
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fNeedBitmap |= changed;
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return changed;
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkBitmap& SkMovie::bitmap()
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fCurrTime == UNINITIALIZED_MSEC)    // uninitialized
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->setTime(0);
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fNeedBitmap)
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (!this->onGetBitmap(&fBitmap))   // failure
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fBitmap.reset();
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fNeedBitmap = false;
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return fBitmap;
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkStream.h"
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkMovie* SkMovie::DecodeMemory(const void* data, size_t length) {
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkMemoryStream stream(data, length, false);
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return SkMovie::DecodeStream(&stream);
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
92f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.orgSkMovie* SkMovie::DecodeFile(const char path[]) {
93b5571b3324cf18629a255ec85e189447069c9b14scroggo@google.com    SkAutoTUnref<SkStreamRewindable> stream(SkStream::NewFromFile(path));
94f381162e5616daacdbcc06d693aca5111aeeebe8mike@reedtribe.org    return stream.get() ? SkMovie::DecodeStream(stream) : NULL;
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
96