| Index: src/views/animated/SkImageView.cpp
|
| diff --git a/src/views/animated/SkImageView.cpp b/src/views/animated/SkImageView.cpp
|
| deleted file mode 100644
|
| index 04b82586518d20f7b8f1ebb6325c4b11aeccd2d0..0000000000000000000000000000000000000000
|
| --- a/src/views/animated/SkImageView.cpp
|
| +++ /dev/null
|
| @@ -1,302 +0,0 @@
|
| -
|
| -/*
|
| - * Copyright 2011 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -#include "SkImageView.h"
|
| -#include "SkAnimator.h"
|
| -#include "SkBitmap.h"
|
| -#include "SkCanvas.h"
|
| -#include "SkImageDecoder.h"
|
| -#include "SkMatrix.h"
|
| -#include "SkSystemEventTypes.h"
|
| -#include "SkTime.h"
|
| -
|
| -SkImageView::SkImageView()
|
| -{
|
| - fMatrix = nullptr;
|
| - fScaleType = kMatrix_ScaleType;
|
| -
|
| - fData.fAnim = nullptr; // handles initializing the other union values
|
| - fDataIsAnim = true;
|
| -
|
| - fUriIsValid = false; // an empty string is not valid
|
| -}
|
| -
|
| -SkImageView::~SkImageView()
|
| -{
|
| - if (fMatrix)
|
| - sk_free(fMatrix);
|
| -
|
| - this->freeData();
|
| -}
|
| -
|
| -void SkImageView::getUri(SkString* uri) const
|
| -{
|
| - if (uri)
|
| - *uri = fUri;
|
| -}
|
| -
|
| -void SkImageView::setUri(const char uri[])
|
| -{
|
| - if (!fUri.equals(uri))
|
| - {
|
| - fUri.set(uri);
|
| - this->onUriChange();
|
| - }
|
| -}
|
| -
|
| -void SkImageView::setUri(const SkString& uri)
|
| -{
|
| - if (fUri != uri)
|
| - {
|
| - fUri = uri;
|
| - this->onUriChange();
|
| - }
|
| -}
|
| -
|
| -void SkImageView::setScaleType(ScaleType st)
|
| -{
|
| - SkASSERT((unsigned)st <= kFitEnd_ScaleType);
|
| -
|
| - if ((ScaleType)fScaleType != st)
|
| - {
|
| - fScaleType = SkToU8(st);
|
| - if (fUriIsValid)
|
| - this->inval(nullptr);
|
| - }
|
| -}
|
| -
|
| -bool SkImageView::getImageMatrix(SkMatrix* matrix) const
|
| -{
|
| - if (fMatrix)
|
| - {
|
| - SkASSERT(!fMatrix->isIdentity());
|
| - if (matrix)
|
| - *matrix = *fMatrix;
|
| - return true;
|
| - }
|
| - else
|
| - {
|
| - if (matrix)
|
| - matrix->reset();
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -void SkImageView::setImageMatrix(const SkMatrix* matrix)
|
| -{
|
| - bool changed = false;
|
| -
|
| - if (matrix && !matrix->isIdentity())
|
| - {
|
| - if (fMatrix == nullptr)
|
| - fMatrix = (SkMatrix*)sk_malloc_throw(sizeof(SkMatrix));
|
| - *fMatrix = *matrix;
|
| - changed = true;
|
| - }
|
| - else // set us to identity
|
| - {
|
| - if (fMatrix)
|
| - {
|
| - SkASSERT(!fMatrix->isIdentity());
|
| - sk_free(fMatrix);
|
| - fMatrix = nullptr;
|
| - changed = true;
|
| - }
|
| - }
|
| -
|
| - // only redraw if we changed our matrix and we're not in scaleToFit mode
|
| - if (changed && this->getScaleType() == kMatrix_ScaleType && fUriIsValid)
|
| - this->inval(nullptr);
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -bool SkImageView::onEvent(const SkEvent& evt)
|
| -{
|
| - if (evt.isType(SK_EventType_Inval))
|
| - {
|
| - if (fUriIsValid)
|
| - this->inval(nullptr);
|
| - return true;
|
| - }
|
| - return this->INHERITED::onEvent(evt);
|
| -}
|
| -
|
| -static inline SkMatrix::ScaleToFit scaleTypeToScaleToFit(SkImageView::ScaleType st)
|
| -{
|
| - SkASSERT(st != SkImageView::kMatrix_ScaleType);
|
| - SkASSERT((unsigned)st <= SkImageView::kFitEnd_ScaleType);
|
| -
|
| - SkASSERT(SkImageView::kFitXY_ScaleType - 1 == SkMatrix::kFill_ScaleToFit);
|
| - SkASSERT(SkImageView::kFitStart_ScaleType - 1 == SkMatrix::kStart_ScaleToFit);
|
| - SkASSERT(SkImageView::kFitCenter_ScaleType - 1 == SkMatrix::kCenter_ScaleToFit);
|
| - SkASSERT(SkImageView::kFitEnd_ScaleType - 1 == SkMatrix::kEnd_ScaleToFit);
|
| -
|
| - return (SkMatrix::ScaleToFit)(st - 1);
|
| -}
|
| -
|
| -void SkImageView::onDraw(SkCanvas* canvas)
|
| -{
|
| - SkRect src;
|
| - if (!this->getDataBounds(&src))
|
| - {
|
| - SkDEBUGCODE(canvas->drawColor(SK_ColorRED);)
|
| - return; // nothing to draw
|
| - }
|
| -
|
| - SkAutoCanvasRestore restore(canvas, true);
|
| - SkMatrix matrix;
|
| -
|
| - if (this->getScaleType() == kMatrix_ScaleType)
|
| - (void)this->getImageMatrix(&matrix);
|
| - else
|
| - {
|
| - SkRect dst;
|
| - dst.set(0, 0, this->width(), this->height());
|
| - matrix.setRectToRect(src, dst, scaleTypeToScaleToFit(this->getScaleType()));
|
| - }
|
| - canvas->concat(matrix);
|
| -
|
| - SkPaint paint;
|
| -
|
| - paint.setAntiAlias(true);
|
| -
|
| - if (fDataIsAnim)
|
| - {
|
| - SkMSec now = SkTime::GetMSecs();
|
| -
|
| - SkAnimator::DifferenceType diff = fData.fAnim->draw(canvas, &paint, now);
|
| -
|
| -SkDEBUGF(("SkImageView : now = %X[%12.3f], diff = %d\n", now, now/1000., diff));
|
| -
|
| - if (diff == SkAnimator::kDifferent)
|
| - this->inval(nullptr);
|
| - else if (diff == SkAnimator::kPartiallyDifferent)
|
| - {
|
| - SkRect bounds;
|
| - fData.fAnim->getInvalBounds(&bounds);
|
| - matrix.mapRect(&bounds); // get the bounds into view coordinates
|
| - this->inval(&bounds);
|
| - }
|
| - }
|
| - else
|
| - canvas->drawBitmap(*fData.fBitmap, 0, 0, &paint);
|
| -}
|
| -
|
| -void SkImageView::onInflate(const SkDOM& dom, const SkDOMNode* node)
|
| -{
|
| - this->INHERITED::onInflate(dom, node);
|
| -
|
| - const char* src = dom.findAttr(node, "src");
|
| - if (src)
|
| - this->setUri(src);
|
| -
|
| - int index = dom.findList(node, "scaleType", "matrix,fitXY,fitStart,fitCenter,fitEnd");
|
| - if (index >= 0)
|
| - this->setScaleType((ScaleType)index);
|
| -
|
| - // need inflate syntax/reader for matrix
|
| -}
|
| -
|
| -/////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -void SkImageView::onUriChange()
|
| -{
|
| - if (this->freeData())
|
| - this->inval(nullptr);
|
| - fUriIsValid = true; // give ensureUriIsLoaded() a shot at the new uri
|
| -}
|
| -
|
| -bool SkImageView::freeData()
|
| -{
|
| - if (fData.fAnim) // test is valid for all union values
|
| - {
|
| - if (fDataIsAnim)
|
| - delete fData.fAnim;
|
| - else
|
| - delete fData.fBitmap;
|
| -
|
| - fData.fAnim = nullptr; // valid for all union values
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool SkImageView::getDataBounds(SkRect* bounds)
|
| -{
|
| - SkASSERT(bounds);
|
| -
|
| - if (this->ensureUriIsLoaded())
|
| - {
|
| - SkScalar width, height;
|
| -
|
| - if (fDataIsAnim)
|
| - {
|
| - if (SkScalarIsNaN(width = fData.fAnim->getScalar("dimensions", "x")) ||
|
| - SkScalarIsNaN(height = fData.fAnim->getScalar("dimensions", "y")))
|
| - {
|
| - // cons up fake bounds
|
| - width = this->width();
|
| - height = this->height();
|
| - }
|
| - }
|
| - else
|
| - {
|
| - width = SkIntToScalar(fData.fBitmap->width());
|
| - height = SkIntToScalar(fData.fBitmap->height());
|
| - }
|
| - bounds->set(0, 0, width, height);
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool SkImageView::ensureUriIsLoaded()
|
| -{
|
| - if (fData.fAnim) // test is valid for all union values
|
| - {
|
| - SkASSERT(fUriIsValid);
|
| - return true;
|
| - }
|
| - if (!fUriIsValid)
|
| - return false;
|
| -
|
| - // try to load the url
|
| - if (fUri.endsWith(".xml")) // assume it is screenplay
|
| - {
|
| - SkAnimator* anim = new SkAnimator;
|
| -
|
| - if (!anim->decodeURI(fUri.c_str()))
|
| - {
|
| - delete anim;
|
| - fUriIsValid = false;
|
| - return false;
|
| - }
|
| - anim->setHostEventSink(this);
|
| -
|
| - fData.fAnim = anim;
|
| - fDataIsAnim = true;
|
| - }
|
| - else // assume it is an image format
|
| - {
|
| - #if 0
|
| - SkBitmap* bitmap = new SkBitmap;
|
| -
|
| - if (!SkImageDecoder::DecodeURL(fUri.c_str(), bitmap))
|
| - {
|
| - delete bitmap;
|
| - fUriIsValid = false;
|
| - return false;
|
| - }
|
| - fData.fBitmap = bitmap;
|
| - fDataIsAnim = false;
|
| - #else
|
| - return false;
|
| - #endif
|
| - }
|
| - return true;
|
| -}
|
|
|