diff options
-rw-r--r-- | samplecode/DecodeFile.h | 11 | ||||
-rw-r--r-- | samplecode/SamplePictFile.cpp | 26 |
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); |