Add SkTileGridPicture SampleApp playback support.
SampleApp already supports switching to a bbox hierarchy playback mode ('b' shortcut). This CL adds an SkTileGridPicture bbox mode. R=reed@google.com, robertphillips@google.com, fmalita@google.com Author: fmalita@chromium.org Review URL: https://codereview.chromium.org/108513006 git-svn-id: http://skia.googlecode.com/svn/trunk@12613 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
edd370f949
commit
bbe43a9ce0
@ -671,7 +671,7 @@ struct TilingInfo {
|
|||||||
SkScalar w, h;
|
SkScalar w, h;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct TilingInfo gTilingInfo[] = {
|
static const struct TilingInfo gTilingInfo[] = {
|
||||||
{ "No tiling", SK_Scalar1 , SK_Scalar1 }, // kNo_Tiling
|
{ "No tiling", SK_Scalar1 , SK_Scalar1 }, // kNo_Tiling
|
||||||
{ "128x128" , SkIntToScalar(128), SkIntToScalar(128) }, // kAbs_128x128_Tiling
|
{ "128x128" , SkIntToScalar(128), SkIntToScalar(128) }, // kAbs_128x128_Tiling
|
||||||
{ "256x256" , SkIntToScalar(256), SkIntToScalar(256) }, // kAbs_256x256_Tiling
|
{ "256x256" , SkIntToScalar(256), SkIntToScalar(256) }, // kAbs_256x256_Tiling
|
||||||
@ -682,6 +682,12 @@ static struct TilingInfo gTilingInfo[] = {
|
|||||||
SK_COMPILE_ASSERT((SK_ARRAY_COUNT(gTilingInfo) == kLast_TilingMode_Enum),
|
SK_COMPILE_ASSERT((SK_ARRAY_COUNT(gTilingInfo) == kLast_TilingMode_Enum),
|
||||||
Incomplete_tiling_labels);
|
Incomplete_tiling_labels);
|
||||||
|
|
||||||
|
SkSize SampleWindow::tileSize() const {
|
||||||
|
SkASSERT((TilingMode)fTilingMode < kLast_TilingMode_Enum);
|
||||||
|
const struct TilingInfo* info = gTilingInfo + fTilingMode;
|
||||||
|
return SkSize::Make(info->w > SK_Scalar1 ? info->w : this->width() * info->w,
|
||||||
|
info->h > SK_Scalar1 ? info->h : this->height() * info->h);
|
||||||
|
}
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
static SkView* curr_view(SkWindow* wind) {
|
static SkView* curr_view(SkWindow* wind) {
|
||||||
@ -1222,11 +1228,7 @@ void SampleWindow::draw(SkCanvas* canvas) {
|
|||||||
if (bitmap_diff(canvas, orig, &diff)) {
|
if (bitmap_diff(canvas, orig, &diff)) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SkSize tile;
|
SkSize tile = this->tileSize();
|
||||||
SkASSERT((TilingMode)fTilingMode < kLast_TilingMode_Enum);
|
|
||||||
struct TilingInfo* info = gTilingInfo + fTilingMode;
|
|
||||||
tile.set(info->w > SK_Scalar1 ? info->w : width() * info->w,
|
|
||||||
info->h > SK_Scalar1 ? info->h : height() * info->h);
|
|
||||||
|
|
||||||
for (SkScalar y = 0; y < height(); y += tile.height()) {
|
for (SkScalar y = 0; y < height(); y += tile.height()) {
|
||||||
for (SkScalar x = 0; x < width(); x += tile.width()) {
|
for (SkScalar x = 0; x < width(); x += tile.width()) {
|
||||||
@ -1760,8 +1762,15 @@ bool SampleWindow::onEvent(const SkEvent& evt) {
|
|||||||
SkOSMenu::FindSwitchState(evt, "Zoomer", &fShowZoomer) ||
|
SkOSMenu::FindSwitchState(evt, "Zoomer", &fShowZoomer) ||
|
||||||
SkOSMenu::FindSwitchState(evt, "Magnify", &fMagnify) ||
|
SkOSMenu::FindSwitchState(evt, "Magnify", &fMagnify) ||
|
||||||
SkOSMenu::FindListIndex(evt, "Transition-Next", &fTransitionNext) ||
|
SkOSMenu::FindListIndex(evt, "Transition-Next", &fTransitionNext) ||
|
||||||
SkOSMenu::FindListIndex(evt, "Transition-Prev", &fTransitionPrev) ||
|
SkOSMenu::FindListIndex(evt, "Transition-Prev", &fTransitionPrev)) {
|
||||||
SkOSMenu::FindListIndex(evt, "Tiling", &fTilingMode)) {
|
this->inval(NULL);
|
||||||
|
this->updateTitle();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (SkOSMenu::FindListIndex(evt, "Tiling", &fTilingMode)) {
|
||||||
|
if (SampleView::IsSampleView(curr_view(this))) {
|
||||||
|
((SampleView*)curr_view(this))->onTileSizeChanged(this->tileSize());
|
||||||
|
}
|
||||||
this->inval(NULL);
|
this->inval(NULL);
|
||||||
this->updateTitle();
|
this->updateTitle();
|
||||||
return true;
|
return true;
|
||||||
@ -2121,8 +2130,11 @@ void SampleWindow::loadView(SkView* view) {
|
|||||||
fSlideMenu->reset();
|
fSlideMenu->reset();
|
||||||
|
|
||||||
(void)SampleView::SetUsePipe(view, fPipeState);
|
(void)SampleView::SetUsePipe(view, fPipeState);
|
||||||
if (SampleView::IsSampleView(view))
|
if (SampleView::IsSampleView(view)) {
|
||||||
((SampleView*)view)->requestMenu(fSlideMenu);
|
SampleView* sampleView = (SampleView*)view;
|
||||||
|
sampleView->requestMenu(fSlideMenu);
|
||||||
|
sampleView->onTileSizeChanged(this->tileSize());
|
||||||
|
}
|
||||||
this->onUpdateMenu(fSlideMenu);
|
this->onUpdateMenu(fSlideMenu);
|
||||||
this->updateTitle();
|
this->updateTitle();
|
||||||
}
|
}
|
||||||
@ -2275,6 +2287,10 @@ void SampleWindow::onSizeChange() {
|
|||||||
#endif
|
#endif
|
||||||
this->updateTitle(); // to refresh our config
|
this->updateTitle(); // to refresh our config
|
||||||
fDevManager->windowSizeChanged(this);
|
fDevManager->windowSizeChanged(this);
|
||||||
|
|
||||||
|
if (fTilingMode != kNo_Tiling && SampleView::IsSampleView(view)) {
|
||||||
|
((SampleView*)view)->onTileSizeChanged(this->tileSize());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -243,6 +243,7 @@ private:
|
|||||||
void installDrawFilter(SkCanvas*);
|
void installDrawFilter(SkCanvas*);
|
||||||
int findByTitle(const char*);
|
int findByTitle(const char*);
|
||||||
void listTitles();
|
void listTitles();
|
||||||
|
SkSize tileSize() const;
|
||||||
|
|
||||||
typedef SkOSWindow INHERITED;
|
typedef SkOSWindow INHERITED;
|
||||||
};
|
};
|
||||||
|
@ -129,6 +129,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual void requestMenu(SkOSMenu* menu) {}
|
virtual void requestMenu(SkOSMenu* menu) {}
|
||||||
|
|
||||||
|
virtual void onTileSizeChanged(const SkSize& tileSize) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void onDrawBackground(SkCanvas*);
|
virtual void onDrawBackground(SkCanvas*);
|
||||||
virtual void onDrawContent(SkCanvas*) = 0;
|
virtual void onDrawContent(SkCanvas*) = 0;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include "SkRandom.h"
|
#include "SkRandom.h"
|
||||||
#include "SkRegion.h"
|
#include "SkRegion.h"
|
||||||
#include "SkShader.h"
|
#include "SkShader.h"
|
||||||
|
#include "SkTileGridPicture.h"
|
||||||
#include "SkUtils.h"
|
#include "SkUtils.h"
|
||||||
#include "SkColorPriv.h"
|
#include "SkColorPriv.h"
|
||||||
#include "SkColorFilter.h"
|
#include "SkColorFilter.h"
|
||||||
@ -31,12 +32,81 @@
|
|||||||
#include "SkXMLParser.h"
|
#include "SkXMLParser.h"
|
||||||
|
|
||||||
class PictFileView : public SampleView {
|
class PictFileView : public SampleView {
|
||||||
SkString fFilename;
|
public:
|
||||||
SkPicture* fPicture;
|
PictFileView(const char name[] = NULL)
|
||||||
SkPicture* fBBoxPicture;
|
: fFilename(name)
|
||||||
bool fUseBBox;
|
, fBBox(kNo_BBoxType)
|
||||||
|
, fTileSize(SkSize::Make(0, 0)) {
|
||||||
|
for (unsigned i = 0; i < kBBoxTypeCount; ++i) {
|
||||||
|
fPictures[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static SkPicture* LoadPicture(const char path[], bool useBBox) {
|
virtual ~PictFileView() {
|
||||||
|
for (unsigned i = 0; i < kBBoxTypeCount; ++i) {
|
||||||
|
SkSafeUnref(fPictures[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void onTileSizeChanged(const SkSize &tileSize) SK_OVERRIDE {
|
||||||
|
if (tileSize != fTileSize) {
|
||||||
|
fTileSize = tileSize;
|
||||||
|
SkSafeSetNull(fPictures[kTileGrid_BBoxType]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// overrides from SkEventSink
|
||||||
|
virtual bool onQuery(SkEvent* evt) SK_OVERRIDE {
|
||||||
|
if (SampleCode::TitleQ(*evt)) {
|
||||||
|
SkString name("P:");
|
||||||
|
const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
|
||||||
|
name.append(basename ? basename+1: fFilename.c_str());
|
||||||
|
if (fBBox != kNo_BBoxType) {
|
||||||
|
name.append(fBBox == kRTree_BBoxType ? " <bbox: R>" : " <bbox: T>");
|
||||||
|
}
|
||||||
|
SampleCode::TitleR(evt, name.c_str());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return this->INHERITED::onQuery(evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool onEvent(const SkEvent& evt) SK_OVERRIDE {
|
||||||
|
if (evt.isType("PictFileView::toggleBBox")) {
|
||||||
|
fBBox = (BBoxType)((fBBox + 1) % kBBoxTypeCount);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return this->INHERITED::onEvent(evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void onDrawContent(SkCanvas* canvas) SK_OVERRIDE {
|
||||||
|
SkASSERT(fBBox < kBBoxTypeCount);
|
||||||
|
SkPicture** picture = fPictures + fBBox;
|
||||||
|
|
||||||
|
if (!*picture) {
|
||||||
|
*picture = LoadPicture(fFilename.c_str(), fBBox);
|
||||||
|
}
|
||||||
|
if (*picture) {
|
||||||
|
canvas->drawPicture(**picture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum BBoxType {
|
||||||
|
kNo_BBoxType,
|
||||||
|
kRTree_BBoxType,
|
||||||
|
kTileGrid_BBoxType,
|
||||||
|
|
||||||
|
kLast_BBoxType = kTileGrid_BBoxType
|
||||||
|
};
|
||||||
|
static const unsigned kBBoxTypeCount = kLast_BBoxType + 1;
|
||||||
|
|
||||||
|
SkString fFilename;
|
||||||
|
SkPicture* fPictures[kBBoxTypeCount];
|
||||||
|
BBoxType fBBox;
|
||||||
|
SkSize fTileSize;
|
||||||
|
|
||||||
|
SkPicture* LoadPicture(const char path[], BBoxType bbox) {
|
||||||
SkPicture* pic = NULL;
|
SkPicture* pic = NULL;
|
||||||
|
|
||||||
SkBitmap bm;
|
SkBitmap bm;
|
||||||
@ -71,67 +141,41 @@ class PictFileView : public SampleView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useBBox) {
|
if (!pic) {
|
||||||
SkPicture* bboxPicture = SkNEW(SkPicture);
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SkPicture* bboxPicture = NULL;
|
||||||
|
switch (bbox) {
|
||||||
|
case kNo_BBoxType:
|
||||||
|
// no bbox playback necessary
|
||||||
|
break;
|
||||||
|
case kRTree_BBoxType:
|
||||||
|
bboxPicture = SkNEW(SkPicture);
|
||||||
|
break;
|
||||||
|
case kTileGrid_BBoxType: {
|
||||||
|
SkASSERT(!fTileSize.isEmpty());
|
||||||
|
SkTileGridPicture::TileGridInfo gridInfo;
|
||||||
|
gridInfo.fMargin = SkISize::Make(0, 0);
|
||||||
|
gridInfo.fOffset = SkIPoint::Make(0, 0);
|
||||||
|
gridInfo.fTileInterval = fTileSize.toRound();
|
||||||
|
bboxPicture = SkNEW_ARGS(SkTileGridPicture, (pic->width(), pic->height(), gridInfo));
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
SkASSERT(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bboxPicture) {
|
||||||
pic->draw(bboxPicture->beginRecording(pic->width(), pic->height(),
|
pic->draw(bboxPicture->beginRecording(pic->width(), pic->height(),
|
||||||
SkPicture::kOptimizeForClippedPlayback_RecordingFlag));
|
SkPicture::kOptimizeForClippedPlayback_RecordingFlag));
|
||||||
bboxPicture->endRecording();
|
bboxPicture->endRecording();
|
||||||
SkDELETE(pic);
|
SkDELETE(pic);
|
||||||
return bboxPicture;
|
return bboxPicture;
|
||||||
|
|
||||||
} else {
|
|
||||||
return pic;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return pic;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
|
||||||
PictFileView(const char name[] = NULL) : fFilename(name) {
|
|
||||||
fPicture = NULL;
|
|
||||||
fBBoxPicture = NULL;
|
|
||||||
fUseBBox = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~PictFileView() {
|
|
||||||
SkSafeUnref(fPicture);
|
|
||||||
SkSafeUnref(fBBoxPicture);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// overrides from SkEventSink
|
|
||||||
virtual bool onQuery(SkEvent* evt) {
|
|
||||||
if (SampleCode::TitleQ(*evt)) {
|
|
||||||
SkString name("P:");
|
|
||||||
const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
|
|
||||||
name.append(basename ? basename+1: fFilename.c_str());
|
|
||||||
if (fUseBBox) {
|
|
||||||
name.append(" <bbox>");
|
|
||||||
}
|
|
||||||
SampleCode::TitleR(evt, name.c_str());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return this->INHERITED::onQuery(evt);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool onEvent(const SkEvent& evt) {
|
|
||||||
if (evt.isType("PictFileView::toggleBBox")) {
|
|
||||||
fUseBBox = !fUseBBox;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return this->INHERITED::onEvent(evt);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void onDrawContent(SkCanvas* canvas) {
|
|
||||||
SkPicture** picture = fUseBBox ? &fBBoxPicture : &fPicture;
|
|
||||||
|
|
||||||
if (!*picture) {
|
|
||||||
*picture = LoadPicture(fFilename.c_str(), fUseBBox);
|
|
||||||
}
|
|
||||||
if (*picture) {
|
|
||||||
canvas->drawPicture(**picture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
typedef SampleView INHERITED;
|
typedef SampleView INHERITED;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user