1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "gm/gm.h" 9 10 #include "include/core/SkBitmap.h" 11 #include "include/core/SkCanvas.h" 12 #include "include/core/SkData.h" 13 #include "include/core/SkFont.h" 14 #include "include/core/SkImage.h" 15 #include "include/core/SkPaint.h" 16 #include "include/core/SkRefCnt.h" 17 #include "include/core/SkSize.h" 18 #include "include/core/SkStream.h" 19 #include "include/core/SkString.h" 20 #include "include/encode/SkJpegEncoder.h" 21 #include "include/encode/SkPngEncoder.h" 22 #include "tools/DecodeUtils.h" 23 #include "tools/Resources.h" 24 #include "tools/fonts/FontToolUtils.h" 25 26 namespace skiagm { 27 28 class EncodeGM : public GM { 29 public: EncodeGM()30 EncodeGM() {} 31 32 protected: getName() const33 SkString getName() const override { return SkString("encode"); } 34 getISize()35 SkISize getISize() override { return SkISize::Make(1024, 600); } 36 onDraw(SkCanvas * canvas)37 void onDraw(SkCanvas* canvas) override { 38 SkBitmap orig; 39 ToolUtils::GetResourceAsBitmap("images/mandrill_512_q075.jpg", &orig); 40 SkDynamicMemoryWStream stream; 41 SkASSERT_RELEASE(SkPngEncoder::Encode(&stream, orig.pixmap(), {})); 42 sk_sp<SkData> pngData = stream.detachAsData(); 43 stream.reset(); 44 45 SkASSERT_RELEASE(SkJpegEncoder::Encode(&stream, orig.pixmap(), {})); 46 sk_sp<SkData> jpgData = stream.detachAsData(); 47 48 sk_sp<SkImage> pngImage = SkImages::DeferredFromEncodedData(pngData); 49 sk_sp<SkImage> jpgImage = SkImages::DeferredFromEncodedData(jpgData); 50 canvas->drawImage(pngImage.get(), 0.0f, 0.0f); 51 canvas->drawImage(jpgImage.get(), 512.0f, 0.0f); 52 53 SkFont font = ToolUtils::DefaultPortableFont(); 54 font.setEdging(SkFont::Edging::kAlias); 55 canvas->drawString("Images should look identical.", 450.0f, 550.0f, font, SkPaint()); 56 } 57 58 private: 59 using INHERITED = GM; 60 }; 61 62 DEF_GM( return new EncodeGM; ) 63 } // namespace skiagm 64 65 /////////// 66 67 #if 0 68 DEF_SIMPLE_GM(jpeg_orientation, canvas, 1000, 1000) { 69 static sk_sp<SkImage> imgs[8]; 70 if (!imgs[0]) { 71 for (int i = 0; i < 8; ++i) { 72 SkString path; 73 path.printf("/skia/orientation/Landscape_%d.jpg", i + 1); 74 auto stream = SkStream::MakeFromFile(path.c_str()); 75 auto data = SkData::MakeFromStream(stream.get(), stream->getLength()); 76 imgs[i] = SkImages::DeferredFromEncodedData(data, nullptr); 77 } 78 } 79 canvas->scale(0.25, 0.25); 80 for (int i = 0; i < 8; ++i) { 81 SkImage* img = imgs[i].get(); 82 canvas->drawImage(img, 0, 0, nullptr); 83 canvas->translate(0, img->height()); 84 if (i == 3) { 85 canvas->translate(img->width(), -4*img->height()); 86 } 87 } 88 } 89 #endif 90