1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPixmap.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "tools/DecodeUtils.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h" 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker namespace { 23*c8dee2aaSAndroid Build Coastguard Worker /** 24*c8dee2aaSAndroid Build Coastguard Worker * Test copying an image from 8888 to 4444. 25*c8dee2aaSAndroid Build Coastguard Worker */ 26*c8dee2aaSAndroid Build Coastguard Worker class CopyTo4444GM : public skiagm::GM { getName() const27*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("copyTo4444"); } 28*c8dee2aaSAndroid Build Coastguard Worker getISize()29*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return {360, 180}; } 30*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas,SkString * errorMsg)31*c8dee2aaSAndroid Build Coastguard Worker DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override { 32*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm, bm4444; 33*c8dee2aaSAndroid Build Coastguard Worker if (!ToolUtils::GetResourceAsBitmap("images/dog.jpg", &bm)) { 34*c8dee2aaSAndroid Build Coastguard Worker *errorMsg = "Could not decode the file. Did you forget to set the resourcePath?"; 35*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kFail; 36*c8dee2aaSAndroid Build Coastguard Worker } 37*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(bm.asImage(), 0, 0); 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker // This should dither or we will see artifacts in the background of the image. 40*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(ToolUtils::copy_to(&bm4444, kARGB_4444_SkColorType, bm)); 41*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(bm4444.asImage(), SkIntToScalar(bm.width()), 0); 42*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kOk; 43*c8dee2aaSAndroid Build Coastguard Worker } 44*c8dee2aaSAndroid Build Coastguard Worker }; 45*c8dee2aaSAndroid Build Coastguard Worker } // namespace 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new CopyTo4444GM; ) 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(format4444, canvas, 64, 64) { 52*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(16, 16); 53*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bitmap; 54*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo imageInfo = SkImageInfo::Make(1, 1, kARGB_4444_SkColorType, kPremul_SkAlphaType); 55*c8dee2aaSAndroid Build Coastguard Worker bitmap.allocPixels(imageInfo); 56*c8dee2aaSAndroid Build Coastguard Worker SkCanvas offscreen(bitmap); 57*c8dee2aaSAndroid Build Coastguard Worker offscreen.clear(SK_ColorRED); 58*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(bitmap.asImage(), 0, 0); 59*c8dee2aaSAndroid Build Coastguard Worker offscreen.clear(SK_ColorBLUE); 60*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(bitmap.asImage(), 1, 1); __anon8392701e0202(unsigned a, unsigned r, unsigned g, unsigned b) 61*c8dee2aaSAndroid Build Coastguard Worker auto pack4444 = [](unsigned a, unsigned r, unsigned g, unsigned b) -> uint16_t { 62*c8dee2aaSAndroid Build Coastguard Worker return (a << 0) | (b << 4) | (g << 8) | (r << 12); 63*c8dee2aaSAndroid Build Coastguard Worker }; 64*c8dee2aaSAndroid Build Coastguard Worker uint16_t red4444 = pack4444(0xF, 0xF, 0x0, 0x0); 65*c8dee2aaSAndroid Build Coastguard Worker uint16_t blue4444 = pack4444(0xF, 0x0, 0x0, 0x0F); 66*c8dee2aaSAndroid Build Coastguard Worker SkPixmap redPixmap(imageInfo, &red4444, 2); 67*c8dee2aaSAndroid Build Coastguard Worker if (bitmap.writePixels(redPixmap, 0, 0)) { 68*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(bitmap.asImage(), 2, 2); 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker SkPixmap bluePixmap(imageInfo, &blue4444, 2); 71*c8dee2aaSAndroid Build Coastguard Worker if (bitmap.writePixels(bluePixmap, 0, 0)) { 72*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(bitmap.asImage(), 3, 3); 73*c8dee2aaSAndroid Build Coastguard Worker } 74*c8dee2aaSAndroid Build Coastguard Worker } 75