Index: tests/SerializationTest.cpp |
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp |
index 9917119e2927d84b983f822962773be579d04fa1..3a443f3b9c376bc09e02dad7ea92482758bab133 100644 |
--- a/tests/SerializationTest.cpp |
+++ b/tests/SerializationTest.cpp |
@@ -5,11 +5,14 @@ |
* found in the LICENSE file. |
*/ |
+#include "Resources.h" |
#include "SkBitmapSource.h" |
#include "SkCanvas.h" |
#include "SkMallocPixelRef.h" |
+#include "SkOSFile.h" |
#include "SkPictureRecorder.h" |
#include "SkTemplates.h" |
+#include "SkTypeface.h" |
#include "SkWriteBuffer.h" |
#include "SkValidatingReadBuffer.h" |
#include "SkXfermodeImageFilter.h" |
@@ -258,6 +261,77 @@ static void TestBitmapSerialization(const SkBitmap& validBitmap, |
} |
} |
+static SkBitmap draw_picture(SkPicture& picture) { |
+ SkBitmap bitmap; |
+ bitmap.allocN32Pixels(picture.width(), picture.height()); |
+ SkCanvas canvas(bitmap); |
+ picture.draw(&canvas); |
+ return bitmap; |
+} |
+ |
+static void compare_bitmaps(skiatest::Reporter* reporter, |
+ const SkBitmap& b1, const SkBitmap& b2) { |
+ REPORTER_ASSERT(reporter, b1.width() == b2.width()); |
+ REPORTER_ASSERT(reporter, b1.height() == b2.height()); |
+ SkAutoLockPixels autoLockPixels1(b1); |
+ SkAutoLockPixels autoLockPixels2(b2); |
+ |
+ if ((b1.width() != b2.width()) || |
+ (b1.height() != b2.height())) { |
+ return; |
+ } |
+ |
+ int pixelErrors = 0; |
+ for (int y = 0; y < b2.height(); ++y) { |
+ for (int x = 0; x < b2.width(); ++x) { |
+ if (b1.getColor(x, y) != b2.getColor(x, y)) |
+ ++pixelErrors; |
+ } |
+ } |
+ REPORTER_ASSERT(reporter, 0 == pixelErrors); |
+} |
+ |
+static void TestPictureTypefaceSerialization(skiatest::Reporter* reporter) { |
+ // Load typeface form file. |
+ // This test cannot run if there is no resource path. |
+ SkString resourcePath = GetResourcePath(); |
+ if (resourcePath.isEmpty()) { |
+ SkDebugf("Could not run fontstream test because resourcePath not specified."); |
+ return; |
+ } |
+ SkString filename = SkOSPath::SkPathJoin(resourcePath.c_str(), "test.ttc"); |
+ SkTypeface* typeface = SkTypeface::CreateFromFile(filename.c_str()); |
+ if (!typeface) { |
+ SkDebugf("Could not run fontstream test because test.ttc not found."); |
+ return; |
+ } |
+ |
+ // Create a paint with the typeface we loaded. |
+ SkPaint paint; |
+ paint.setColor(SK_ColorGRAY); |
+ paint.setTextSize(SkIntToScalar(30)); |
+ SkSafeUnref(paint.setTypeface(typeface)); |
+ |
+ // Paint some text. |
+ SkPictureRecorder recorder; |
+ SkIRect canvasRect = SkIRect::MakeWH(kBitmapSize, kBitmapSize); |
+ SkCanvas* canvas = recorder.beginRecording(canvasRect.width(), canvasRect.height(), NULL, 0); |
+ canvas->drawColor(SK_ColorWHITE); |
+ canvas->drawText("A", 1, 24, 32, paint); |
+ SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
+ |
+ // Serlialize picture and create its clone from stream. |
+ SkDynamicMemoryWStream stream; |
+ picture->serialize(&stream); |
+ SkAutoTUnref<SkStream> inputStream(stream.detachAsStream()); |
+ SkAutoTUnref<SkPicture> loadedPicture(SkPicture::CreateFromStream(inputStream.get())); |
+ |
+ // Draw both original and clone picture and compare bitmaps -- they should be identical. |
+ SkBitmap origBitmap = draw_picture(*picture); |
+ SkBitmap destBitmap = draw_picture(*loadedPicture); |
+ compare_bitmaps(reporter, origBitmap, destBitmap); |
+} |
+ |
static bool setup_bitmap_for_canvas(SkBitmap* bitmap) { |
SkImageInfo info = SkImageInfo::Make( |
kBitmapSize, kBitmapSize, kN32_SkColorType, kPremul_SkAlphaType); |
@@ -321,7 +395,7 @@ DEF_TEST(Serialization, reporter) { |
{ |
SkMatrix matrix = SkMatrix::I(); |
TestObjectSerialization(&matrix, reporter); |
- } |
+ } |
// Test path serialization |
{ |
@@ -421,4 +495,6 @@ DEF_TEST(Serialization, reporter) { |
SkPicture::CreateFromBuffer(reader)); |
REPORTER_ASSERT(reporter, NULL != readPict.get()); |
} |
+ |
+ TestPictureTypefaceSerialization(reporter); |
} |