18c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com/*
28c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com * Copyright 2012 Google Inc.
38c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com *
48c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com * Use of this source code is governed by a BSD-style license that can be
58c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com * found in the LICENSE file.
68c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com */
78c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com
8452eecb4436f27e057d4d2df26e3a70020a817b6tfarina@chromium.org#include "SkImageEncoder.h"
98c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com
108c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com#include "SkBitmap.h"
118c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com#include "SkCanvas.h"
128c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com#include "SkStream.h"
13452eecb4436f27e057d4d2df26e3a70020a817b6tfarina@chromium.org#include "Test.h"
148c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com
156c22573edb234ad14df947278cfed010669a39a7reedstatic SkColorType gColorTypes[] = {
166c22573edb234ad14df947278cfed010669a39a7reed    kRGB_565_SkColorType,
176c22573edb234ad14df947278cfed010669a39a7reed    kN32_SkColorType,
188c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com};
198c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com
20452eecb4436f27e057d4d2df26e3a70020a817b6tfarina@chromium.orgDEF_TEST(ARGBImageEncoder, reporter) {
218c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com    // Bytes we expect to get:
228c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com    const int kWidth = 3;
238c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com    const int kHeight = 5;
248c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com    const unsigned char comparisonBuffer[] = {
258c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        // kHeight rows, each with kWidth pixels, premultiplied ARGB for each pixel
268c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        0xff,0xff,0x00,0x00, 0xff,0xff,0x00,0x00, 0xff,0xff,0x00,0x00, // red
278c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        0xff,0x00,0xff,0x00, 0xff,0x00,0xff,0x00, 0xff,0x00,0xff,0x00, // green
288c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, // blue
298c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, // blue
308c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, 0xff,0x00,0x00,0xff, // blue
318c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com    };
328c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com
338c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com    SkAutoTDelete<SkImageEncoder> enc(CreateARGBImageEncoder());
346c22573edb234ad14df947278cfed010669a39a7reed    for (size_t ctIndex = 0; ctIndex < SK_ARRAY_COUNT(gColorTypes); ++ctIndex) {
358c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        // A bitmap that should generate the above bytes:
368c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        SkBitmap bitmap;
378c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        {
386c22573edb234ad14df947278cfed010669a39a7reed            bool success = bitmap.allocPixels(SkImageInfo::Make(kWidth, kHeight,
396c22573edb234ad14df947278cfed010669a39a7reed                                                        gColorTypes[ctIndex], kOpaque_SkAlphaType));
406c22573edb234ad14df947278cfed010669a39a7reed            REPORTER_ASSERT(reporter, success);
418c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com            bitmap.eraseColor(SK_ColorBLUE);
428c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com            // Change rows [0,1] from blue to [red,green].
438c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com            SkCanvas canvas(bitmap);
448c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com            SkPaint paint;
458c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com            paint.setColor(SK_ColorRED);
468c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com            canvas.drawIRect(SkIRect::MakeLTRB(0, 0, kWidth, 1), paint);
478c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com            paint.setColor(SK_ColorGREEN);
488c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com            canvas.drawIRect(SkIRect::MakeLTRB(0, 1, kWidth, 2), paint);
498c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        }
508c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com
518c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        // Transform the bitmap.
528c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        int bufferSize = bitmap.width() * bitmap.height() * 4;
538c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        SkAutoMalloc pixelBufferManager(bufferSize);
548c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        char *pixelBuffer = static_cast<char *>(pixelBufferManager.get());
558c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        SkMemoryWStream out(pixelBuffer, bufferSize);
568c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        REPORTER_ASSERT(reporter, enc->encodeStream(&out, bitmap, SkImageEncoder::kDefaultQuality));
578c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com
588c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        // Confirm we got the expected results.
598c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        REPORTER_ASSERT(reporter, bufferSize == sizeof(comparisonBuffer));
608c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com        REPORTER_ASSERT(reporter, memcmp(pixelBuffer, comparisonBuffer, bufferSize) == 0);
618c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com    }
628c6a4f24d331503b3eb9a5c918d5876772b9a5eebungeman@google.com}
63