aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-08-22 07:41:46 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-22 07:41:46 -0700
commitccebcec4aca71fd17626b45f27fbe613bfa18b64 (patch)
tree74593bae0dde80a1b4c9cab8336e82b69ae6ac30
parent35bb74b444bc4a9ed2f437d97c6a943012990fe3 (diff)
'F' will toggle filtering for the --picture sample
-rw-r--r--samplecode/DecodeFile.h11
-rw-r--r--samplecode/SamplePictFile.cpp26
2 files changed, 28 insertions, 9 deletions
diff --git a/samplecode/DecodeFile.h b/samplecode/DecodeFile.h
index 3995238bd0..801d67ce97 100644
--- a/samplecode/DecodeFile.h
+++ b/samplecode/DecodeFile.h
@@ -8,9 +8,11 @@
#include "SkBitmap.h"
#include "SkCodec.h"
#include "SkData.h"
+#include "SkImage.h"
-inline bool decode_file(const char* filename, SkBitmap* bitmap,
- SkColorType colorType = kN32_SkColorType, bool requireUnpremul = false) {
+static inline bool decode_file(const char* filename, SkBitmap* bitmap,
+ SkColorType colorType = kN32_SkColorType,
+ bool requireUnpremul = false) {
SkASSERT(kIndex_8_SkColorType != colorType);
sk_sp<SkData> data(SkData::MakeFromFileName(filename));
SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data.get()));
@@ -29,3 +31,8 @@ inline bool decode_file(const char* filename, SkBitmap* bitmap,
return SkCodec::kSuccess == codec->getPixels(info, bitmap->getPixels(), bitmap->rowBytes());
}
+
+static inline sk_sp<SkImage> decode_file(const char filename[]) {
+ sk_sp<SkData> data(SkData::MakeFromFileName(filename));
+ return data ? SkImage::MakeFromEncoded(data) : nullptr;
+}
diff --git a/samplecode/SamplePictFile.cpp b/samplecode/SamplePictFile.cpp
index c1958c8973..85483288c7 100644
--- a/samplecode/SamplePictFile.cpp
+++ b/samplecode/SamplePictFile.cpp
@@ -55,9 +55,14 @@ public:
fCount = 0;
}
- virtual ~PictFileView() {
+ ~PictFileView() override {
+ this->freePictures();
+ }
+
+ void freePictures() {
for (int i = 0; i < kBBoxTypeCount; ++i) {
SkSafeUnref(fPictures[i]);
+ fPictures[i] = nullptr;
}
}
@@ -94,6 +99,12 @@ protected:
case 'n': fCount += 1; this->inval(nullptr); return true;
case 'p': fCount -= 1; this->inval(nullptr); return true;
case 's': fCount = 0; this->inval(nullptr); return true;
+ case 'F':
+ fFilterQuality = (kNone_SkFilterQuality == fFilterQuality) ?
+ kHigh_SkFilterQuality : kNone_SkFilterQuality;
+ this->freePictures();
+ this->inval(nullptr);
+ return true;
default: break;
}
}
@@ -148,18 +159,19 @@ private:
BBoxType fBBox;
SkSize fTileSize;
int fCount;
+ SkFilterQuality fFilterQuality = kNone_SkFilterQuality;
sk_sp<SkPicture> LoadPicture(const char path[], BBoxType bbox) {
sk_sp<SkPicture> pic;
- SkBitmap bm;
- if (decode_file(path, &bm)) {
- bm.setImmutable();
+ if (sk_sp<SkImage> img = decode_file(path)) {
SkPictureRecorder recorder;
- SkCanvas* can = recorder.beginRecording(SkIntToScalar(bm.width()),
- SkIntToScalar(bm.height()),
+ SkCanvas* can = recorder.beginRecording(SkIntToScalar(img->width()),
+ SkIntToScalar(img->height()),
nullptr, 0);
- can->drawBitmap(bm, 0, 0, nullptr);
+ SkPaint paint;
+ paint.setFilterQuality(fFilterQuality);
+ can->drawImage(img, 0, 0, &paint);
pic = recorder.finishRecordingAsPicture();
} else {
SkFILEStream stream(path);