1// SkPaints only have an SkPaintOptionsAndroid if SK_BUILD_FOR_ANDROID is true.
2#ifdef SK_BUILD_FOR_ANDROID
3
4#include "SkReadBuffer.h"
5#include "SkWriteBuffer.h"
6#include "SkPaint.h"
7#include "SkPaintOptionsAndroid.h"
8#include "Test.h"
9
10static size_t Reconstruct(const SkPaint& src, SkPaint* dst) {
11    SkWriteBuffer writer;
12    src.flatten(writer);
13
14    const size_t size = writer.bytesWritten();
15    SkAutoMalloc bytes(size);
16    writer.writeToMemory(bytes.get());
17
18    SkReadBuffer reader(bytes.get(), size);
19    dst->unflatten(reader);
20
21    return size;
22}
23
24DEF_TEST(AndroidOptionsSerialization, reporter) {
25    // We want to make sure that Android's paint options survive a flatten/unflatten round trip.
26    // These are all non-default options.
27    SkPaintOptionsAndroid options;
28    options.setLanguage("ja-JP");
29    options.setFontVariant(SkPaintOptionsAndroid::kElegant_Variant);
30    options.setUseFontFallbacks(true);
31
32    SkPaint paint;
33    paint.setPaintOptionsAndroid(options);
34
35    SkPaint reconstructed;
36    Reconstruct(paint, &reconstructed);
37
38    REPORTER_ASSERT(reporter, options == reconstructed.getPaintOptionsAndroid());
39}
40
41DEF_TEST(AndroidOptionsSerializationReverse, reporter) {
42    // Opposite test of above: make sure the serialized default values of a paint overwrite
43    // non-default values on the paint we're unflattening into.
44    const SkPaint defaultOptions;
45
46    SkPaintOptionsAndroid options;
47    options.setLanguage("ja-JP");
48    options.setFontVariant(SkPaintOptionsAndroid::kElegant_Variant);
49    options.setUseFontFallbacks(true);
50    SkPaint nonDefaultOptions;
51    nonDefaultOptions.setPaintOptionsAndroid(options);
52
53    Reconstruct(defaultOptions, &nonDefaultOptions);
54
55    REPORTER_ASSERT(reporter,
56            defaultOptions.getPaintOptionsAndroid() ==
57            nonDefaultOptions.getPaintOptionsAndroid());
58}
59
60DEF_TEST(AndroidOptionsSize, reporter) {
61    // A paint with default android options should serialize to something smaller than
62    // a paint with non-default android options.
63
64    SkPaint defaultOptions;
65
66    SkPaintOptionsAndroid options;
67    options.setUseFontFallbacks(true);
68    SkPaint nonDefaultOptions;
69    nonDefaultOptions.setPaintOptionsAndroid(options);
70
71    SkPaint dummy;
72
73    REPORTER_ASSERT(reporter,
74                    Reconstruct(defaultOptions, &dummy) < Reconstruct(nonDefaultOptions, &dummy));
75}
76
77#endif  // SK_BUILD_FOR_ANDROID
78