Flutter Engine
The Flutter Engine
Classes | Functions | Variables
SerializationTest.cpp File Reference
#include "include/core/SkAnnotation.h"
#include "include/core/SkBitmap.h"
#include "include/core/SkBlendMode.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkColor.h"
#include "include/core/SkColorFilter.h"
#include "include/core/SkData.h"
#include "include/core/SkDataTable.h"
#include "include/core/SkFont.h"
#include "include/core/SkFontArguments.h"
#include "include/core/SkFontMetrics.h"
#include "include/core/SkFontMgr.h"
#include "include/core/SkFontStyle.h"
#include "include/core/SkImage.h"
#include "include/core/SkImageFilter.h"
#include "include/core/SkImageInfo.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"
#include "include/core/SkPathEffect.h"
#include "include/core/SkPicture.h"
#include "include/core/SkPictureRecorder.h"
#include "include/core/SkPoint.h"
#include "include/core/SkPoint3.h"
#include "include/core/SkRRect.h"
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkRegion.h"
#include "include/core/SkSamplingOptions.h"
#include "include/core/SkScalar.h"
#include "include/core/SkSerialProcs.h"
#include "include/core/SkStream.h"
#include "include/core/SkString.h"
#include "include/core/SkSurface.h"
#include "include/core/SkTextBlob.h"
#include "include/core/SkTypeface.h"
#include "include/core/SkTypes.h"
#include "include/effects/SkDashPathEffect.h"
#include "include/effects/SkImageFilters.h"
#include "include/encode/SkPngEncoder.h"
#include "include/private/base/SkAlign.h"
#include "include/private/base/SkMalloc.h"
#include "include/private/base/SkTemplates.h"
#include "src/base/SkAutoMalloc.h"
#include "src/core/SkAnnotationKeys.h"
#include "src/core/SkImageFilter_Base.h"
#include "src/core/SkPicturePriv.h"
#include "src/core/SkReadBuffer.h"
#include "src/core/SkWriteBuffer.h"
#include "src/effects/colorfilters/SkColorFilterBase.h"
#include "tests/Test.h"
#include "tools/Resources.h"
#include "tools/ToolUtils.h"
#include "tools/fonts/FontToolUtils.h"
#include <algorithm>
#include <array>
#include <cstdint>
#include <cstring>
#include <memory>
#include <utility>

Go to the source code of this file.

Classes

class  SerializationTest
 
struct  SerializationUtils< T >
 
struct  SerializationUtils< SkMatrix >
 
struct  SerializationUtils< SkPath >
 
struct  SerializationUtils< SkRegion >
 
struct  SerializationUtils< SkString >
 
struct  SerializationUtils< unsigned char >
 
struct  SerializationUtils< SkColor >
 
struct  SerializationUtils< SkColor4f >
 
struct  SerializationUtils< int32_t >
 
struct  SerializationUtils< SkPoint >
 
struct  SerializationUtils< SkPoint3 >
 
struct  SerializationUtils< SkScalar >
 
struct  SerializationTestUtils< T, testInvalid >
 
struct  SerializationTestUtils< SkString, true >
 
struct  AnnotationRec
 
class  TestAnnotationCanvas
 

Functions

template<typename T , bool testInvalid>
static void TestObjectSerializationNoAlign (T *testObj, skiatest::Reporter *reporter)
 
template<typename T >
static void TestObjectSerialization (T *testObj, skiatest::Reporter *reporter)
 
template<typename T >
static TTestFlattenableSerialization (T *testObj, bool shouldSucceed, skiatest::Reporter *reporter)
 
template<typename T >
static void TestArraySerialization (T *data, skiatest::Reporter *reporter)
 
static void TestBitmapSerialization (const SkBitmap &validBitmap, const SkBitmap &invalidBitmap, bool shouldSucceed, skiatest::Reporter *reporter)
 
static void TestColorFilterSerialization (skiatest::Reporter *reporter)
 
static SkBitmap draw_picture (SkPicture &picture)
 
static void compare_bitmaps (skiatest::Reporter *reporter, const SkBitmap &b1, const SkBitmap &b2)
 
static sk_sp< SkDataserialize_typeface_proc (SkTypeface *typeface, void *ctx)
 
static sk_sp< SkTypefacedeserialize_typeface_proc (const void *data, size_t length, void *ctx)
 
static void serialize_and_compare_typeface (sk_sp< SkTypeface > typeface, const char *text, const SkSerialProcs *serial_procs, const SkDeserialProcs *deserial_procs, skiatest::Reporter *reporter)
 
static sk_sp< SkTypefacemakeDistortableWithNonDefaultAxes (skiatest::Reporter *reporter)
 
static sk_sp< SkTypefacemakeColrWithNonDefaultPalette (skiatest::Reporter *reporter)
 
static void TestPictureTypefaceSerialization (const SkSerialProcs *serial_procs, const SkDeserialProcs *deserial_procs, skiatest::Reporter *reporter)
 
SkString DumpTypeface (const SkTypeface &typeface)
 
SkString DumpFontMetrics (const SkFontMetrics &metrics)
 
static void TestTypefaceSerialization (skiatest::Reporter *reporter, const sk_sp< SkTypeface > &typeface)
 
 DEF_TEST (Serialization_Typeface, reporter)
 
static void setup_bitmap_for_canvas (SkBitmap *bitmap)
 
static sk_sp< SkImagemake_checkerboard_image ()
 
static void draw_something (SkCanvas *canvas)
 
static sk_sp< SkImagerender (const SkPicture &p)
 
 DEF_TEST (Serialization, reporter)
 
static sk_sp< SkPicturecopy_picture_via_serialization (SkPicture *src)
 
 DEF_TEST (Annotations, reporter)
 
 DEF_TEST (WriteBuffer_storage, reporter)
 
 DEF_TEST (WriteBuffer_external_memory_textblob, reporter)
 
 DEF_TEST (WriteBuffer_external_memory_flattenable, reporter)
 
 DEF_TEST (ReadBuffer_empty, reporter)
 

Variables

static const uint32_t kArraySize = 64
 
static const int kBitmapSize = 256
 

Function Documentation

◆ compare_bitmaps()

static void compare_bitmaps ( skiatest::Reporter reporter,
const SkBitmap b1,
const SkBitmap b2 
)
static

Definition at line 361 of file SerializationTest.cpp.

362 {
363 REPORTER_ASSERT(reporter, b1.width() == b2.width());
364 REPORTER_ASSERT(reporter, b1.height() == b2.height());
365
366 if ((b1.width() != b2.width()) ||
367 (b1.height() != b2.height())) {
368 return;
369 }
370
371 int pixelErrors = 0;
372 for (int y = 0; y < b2.height(); ++y) {
373 for (int x = 0; x < b2.width(); ++x) {
374 if (b1.getColor(x, y) != b2.getColor(x, y))
375 ++pixelErrors;
376 }
377 }
378 REPORTER_ASSERT(reporter, 0 == pixelErrors);
379}
reporter
Definition: FontMgrTest.cpp:39
#define REPORTER_ASSERT(r, cond,...)
Definition: Test.h:286
SkColor getColor(int x, int y) const
Definition: SkBitmap.h:874
int width() const
Definition: SkBitmap.h:149
int height() const
Definition: SkBitmap.h:158
double y
double x

◆ copy_picture_via_serialization()

static sk_sp< SkPicture > copy_picture_via_serialization ( SkPicture src)
static

Definition at line 879 of file SerializationTest.cpp.

879 {
881 src->serialize(&wstream, nullptr); // default is fine, no SkImages to encode
882 std::unique_ptr<SkStreamAsset> rstream(wstream.detachAsStream());
883 return SkPicture::MakeFromStream(rstream.get());
884}
std::unique_ptr< SkStreamAsset > detachAsStream()
Definition: SkStream.cpp:876
static sk_sp< SkPicture > MakeFromStream(SkStream *stream, const SkDeserialProcs *procs=nullptr)
Definition: SkPicture.cpp:147

◆ DEF_TEST() [1/7]

DEF_TEST ( Annotations  ,
reporter   
)

Definition at line 925 of file SerializationTest.cpp.

925 {
926 SkPictureRecorder recorder;
927 SkCanvas* recordingCanvas = recorder.beginRecording(SkRect::MakeWH(100, 100));
928
929 const char* str0 = "rect-with-url";
930 const SkRect r0 = SkRect::MakeWH(10, 10);
932 SkAnnotateRectWithURL(recordingCanvas, r0, d0.get());
933
934 const char* str1 = "named-destination";
935 const SkRect r1 = SkRect::MakeXYWH(5, 5, 0, 0); // collapsed to a point
937 SkAnnotateNamedDestination(recordingCanvas, {r1.x(), r1.y()}, d1.get());
938
939 const char* str2 = "link-to-destination";
940 const SkRect r2 = SkRect::MakeXYWH(20, 20, 5, 6);
942 SkAnnotateLinkToDestination(recordingCanvas, r2, d2.get());
943
944 const AnnotationRec recs[] = {
945 { r0, SkAnnotationKeys::URL_Key(), std::move(d0) },
946 { r1, SkAnnotationKeys::Define_Named_Dest_Key(), std::move(d1) },
947 { r2, SkAnnotationKeys::Link_Named_Dest_Key(), std::move(d2) },
948 };
949
952
953 TestAnnotationCanvas canvas(reporter, recs, std::size(recs));
954 canvas.drawPicture(pict1);
955}
static sk_sp< SkPicture > copy_picture_via_serialization(SkPicture *src)
SK_API void SkAnnotateRectWithURL(SkCanvas *, const SkRect &, SkData *)
SK_API void SkAnnotateNamedDestination(SkCanvas *, const SkPoint &, SkData *)
SK_API void SkAnnotateLinkToDestination(SkCanvas *, const SkRect &, SkData *)
static const char * Define_Named_Dest_Key()
static const char * Link_Named_Dest_Key()
static const char * URL_Key()
static sk_sp< SkData > MakeWithCString(const char cstr[])
Definition: SkData.cpp:195
SkCanvas * beginRecording(const SkRect &bounds, sk_sp< SkBBoxHierarchy > bbh)
sk_sp< SkPicture > finishRecordingAsPicture()
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
Definition: switches.h:259
constexpr float x() const
Definition: SkRect.h:720
constexpr float y() const
Definition: SkRect.h:727
static constexpr SkRect MakeXYWH(float x, float y, float w, float h)
Definition: SkRect.h:659
static constexpr SkRect MakeWH(float w, float h)
Definition: SkRect.h:609

◆ DEF_TEST() [2/7]

DEF_TEST ( ReadBuffer_empty  ,
reporter   
)

Definition at line 1026 of file SerializationTest.cpp.

1026 {
1027 SkBinaryWriteBuffer writer({});
1028 writer.writeInt(123);
1029 writer.writeDataAsByteArray(SkData::MakeEmpty().get());
1030 writer.writeInt(321);
1031
1032 size_t size = writer.bytesWritten();
1033 SkAutoMalloc storage(size);
1034 writer.writeToMemory(storage.get());
1035
1036 SkReadBuffer reader(storage.get(), size);
1037 REPORTER_ASSERT(reporter, reader.readInt() == 123);
1038 auto data = reader.readByteArrayAsData();
1039 REPORTER_ASSERT(reporter, data->size() == 0);
1040 REPORTER_ASSERT(reporter, reader.readInt() == 321);
1041}
void writeInt(int32_t value) override
static sk_sp< SkData > MakeEmpty()
Definition: SkData.cpp:94
const myers::Point & get(const myers::Segment &)
std::shared_ptr< const fml::Mapping > data
Definition: texture_gles.cc:63

◆ DEF_TEST() [3/7]

DEF_TEST ( Serialization  ,
reporter   
)

Definition at line 676 of file SerializationTest.cpp.

676 {
677 // Test matrix serialization
678 {
681 }
682
683 // Test point3 serialization
684 {
685 SkPoint3 point;
686 TestObjectSerializationNoAlign<SkPoint3, false>(&point, reporter);
687 }
688
689 // Test path serialization
690 {
691 SkPath path;
693 }
694
695 // Test region serialization
696 {
699 }
700
701 // Test color filter serialization
702 {
704 }
705
706 // Test string serialization
707 {
708 SkString string("string");
709 TestObjectSerializationNoAlign<SkString, false>(&string, reporter);
710 TestObjectSerializationNoAlign<SkString, true>(&string, reporter);
711 }
712
713 // Test rrect serialization
714 {
715 // SkRRect does not initialize anything.
716 // An uninitialized SkRRect can be serialized,
717 // but will branch on uninitialized data when deserialized.
719 SkRect rect = SkRect::MakeXYWH(1, 2, 20, 30);
720 SkVector corners[4] = { {1, 2}, {2, 3}, {3,4}, {4,5} };
721 rrect.setRectRadii(rect, corners);
723 }
724
725 // Test readByteArray
726 {
727 unsigned char data[kArraySize] = { 1, 2, 3 };
729 }
730
731 // Test readColorArray
732 {
735 }
736
737 // Test readColor4fArray
738 {
740 SkColor4f::FromColor(SK_ColorBLACK),
741 SkColor4f::FromColor(SK_ColorWHITE),
742 SkColor4f::FromColor(SK_ColorRED),
743 { 1.f, 2.f, 4.f, 8.f }
744 };
746 }
747
748 // Test readIntArray
749 {
750 int32_t data[kArraySize] = { 1, 2, 4, 8 };
752 }
753
754 // Test readPointArray
755 {
756 SkPoint data[kArraySize] = { {6, 7}, {42, 128} };
758 }
759
760 // Test readScalarArray
761 {
764 }
765
766 // Test skipByteArray
767 {
768 // Valid case with non-empty array:
769 {
770 unsigned char data[kArraySize] = { 1, 2, 3 };
771 SkBinaryWriteBuffer writer({});
773 SkAutoMalloc buf(writer.bytesWritten());
774 writer.writeToMemory(buf.get());
775
776 SkReadBuffer reader(buf.get(), writer.bytesWritten());
777 size_t len = ~0;
778 const void* arr = reader.skipByteArray(&len);
781 REPORTER_ASSERT(reporter, memcmp(arr, data, len) == 0);
782 }
783
784 // Writing a zero length array (can be detected as valid by non-nullptr return):
785 {
786 SkBinaryWriteBuffer writer({});
787 writer.writeByteArray(nullptr, 0);
788 SkAutoMalloc buf(writer.bytesWritten());
789 writer.writeToMemory(buf.get());
790
791 SkReadBuffer reader(buf.get(), writer.bytesWritten());
792 size_t len = ~0;
793 const void* arr = reader.skipByteArray(&len);
796 }
797
798 // If the array can't be safely read, should return nullptr:
799 {
800 SkBinaryWriteBuffer writer({});
801 writer.writeUInt(kArraySize);
802 SkAutoMalloc buf(writer.bytesWritten());
803 writer.writeToMemory(buf.get());
804
805 SkReadBuffer reader(buf.get(), writer.bytesWritten());
806 size_t len = ~0;
807 const void* arr = reader.skipByteArray(&len);
810 }
811 }
812
813 // Test invalid deserializations
814 {
816
817 SkBitmap validBitmap;
818 validBitmap.setInfo(info);
819
820 // Create a bitmap with a really large height
821 SkBitmap invalidBitmap;
822 invalidBitmap.setInfo(info.makeWH(info.width(), 1000000000));
823
824 // The deserialization should succeed, and the rendering shouldn't crash,
825 // even when the device fails to initialize, due to its size
826 TestBitmapSerialization(validBitmap, invalidBitmap, true, reporter);
827 }
828
829 // Test simple SkPicture serialization
830 {
831 skiatest::ReporterContext subtest(reporter, "simple SkPicture");
832 SkPictureRecorder recorder;
836
837 // Serialize picture. The default typeface proc should result in a non-empty
838 // typeface when deserializing.
839 SkSerialProcs sProcs;
840 sProcs.fImageProc = [](SkImage* img, void*) -> sk_sp<SkData> {
841 return SkPngEncoder::Encode(nullptr, img, SkPngEncoder::Options{});
842 };
843 sk_sp<SkData> data = pict->serialize(&sProcs);
845
846 // Deserialize picture using the default procs.
847 // TODO(kjlubick) Specify a proc for decoding image data.
849 REPORTER_ASSERT(reporter, readPict);
850 sk_sp<SkImage> img0 = render(*pict);
851 sk_sp<SkImage> img1 = render(*readPict);
852 if (img0 && img1) {
853 bool ok = ToolUtils::equal_pixels(img0.get(), img1.get());
854 REPORTER_ASSERT(reporter, ok, "before and after image did not match");
855 if (!ok) {
856 auto left = SkFILEWStream("before_serialize.png");
857 sk_sp<SkData> d = SkPngEncoder::Encode(nullptr, img0.get(), {});
858 left.write(d->data(), d->size());
859 left.fsync();
860 auto right = SkFILEWStream("after_serialize.png");
861 d = SkPngEncoder::Encode(nullptr, img1.get(), {});
862 right.write(d->data(), d->size());
863 right.fsync();
864 }
865 }
866 }
867
869
870 SkSerialProcs serial_procs;
872 SkDeserialProcs deserial_procs;
874 TestPictureTypefaceSerialization(&serial_procs, &deserial_procs, reporter);
875}
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition: DM.cpp:213
static void TestPictureTypefaceSerialization(const SkSerialProcs *serial_procs, const SkDeserialProcs *deserial_procs, skiatest::Reporter *reporter)
static void TestArraySerialization(T *data, skiatest::Reporter *reporter)
static const int kBitmapSize
static void TestObjectSerialization(T *testObj, skiatest::Reporter *reporter)
static const uint32_t kArraySize
static void TestBitmapSerialization(const SkBitmap &validBitmap, const SkBitmap &invalidBitmap, bool shouldSucceed, skiatest::Reporter *reporter)
static sk_sp< SkTypeface > deserialize_typeface_proc(const void *data, size_t length, void *ctx)
static sk_sp< SkImage > render(const SkPicture &p)
static void TestColorFilterSerialization(skiatest::Reporter *reporter)
static sk_sp< SkData > serialize_typeface_proc(SkTypeface *typeface, void *ctx)
static void draw_something(SkCanvas *canvas)
uint32_t SkColor
Definition: SkColor.h:37
constexpr SkColor SK_ColorRED
Definition: SkColor.h:126
constexpr SkColor SK_ColorBLACK
Definition: SkColor.h:103
constexpr SkColor SK_ColorWHITE
Definition: SkColor.h:122
static bool ok(int result)
static bool left(const SkPoint &p0, const SkPoint &p1)
static bool right(const SkPoint &p0, const SkPoint &p1)
#define SK_ScalarMax
Definition: SkScalar.h:24
#define SK_Scalar1
Definition: SkScalar.h:18
#define SK_ScalarHalf
Definition: SkScalar.h:19
#define SkIntToScalar(x)
Definition: SkScalar.h:57
static void TestAlignment(T *testObj, skiatest::Reporter *reporter)
void writeByteArray(const void *data, size_t size) override
void writeUInt(uint32_t value) override
bool setInfo(const SkImageInfo &imageInfo, size_t rowBytes=0)
Definition: SkBitmap.cpp:114
static const SkMatrix & I()
Definition: SkMatrix.cpp:1544
Definition: SkPath.h:59
static sk_sp< SkPicture > MakeFromData(const SkData *data, const SkDeserialProcs *procs=nullptr)
Definition: SkPicture.cpp:160
void setRectRadii(const SkRect &rect, const SkVector radii[4])
Definition: SkRRect.cpp:189
T * get() const
Definition: SkRefCnt.h:303
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE auto & d
Definition: main.cc:19
float SkScalar
Definition: extension.cpp:12
SK_API bool Encode(SkWStream *dst, const SkPixmap &src, const Options &options)
unsigned useCenter Optional< SkMatrix > matrix
Definition: SkRecords.h:258
ClipOpAndAA opAA SkRegion region
Definition: SkRecords.h:238
SkRRect rrect
Definition: SkRecords.h:232
sk_sp< SkBlender > blender SkRect rect
Definition: SkRecords.h:350
bool equal_pixels(const SkPixmap &a, const SkPixmap &b)
Definition: ToolUtils.cpp:456
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition: switches.h:57
SkDeserialTypefaceProc fTypefaceProc
static SkImageInfo MakeN32Premul(int width, int height)
SkSerialImageProc fImageProc
Definition: SkSerialProcs.h:90
SkSerialTypefaceProc fTypefaceProc
Definition: SkSerialProcs.h:93

◆ DEF_TEST() [4/7]

DEF_TEST ( Serialization_Typeface  ,
reporter   
)

Definition at line 613 of file SerializationTest.cpp.

613 {
616}
static void TestTypefaceSerialization(skiatest::Reporter *reporter, const sk_sp< SkTypeface > &typeface)
sk_sp< SkTypeface > SampleUserTypeface()
sk_sp< SkTypeface > DefaultTypeface()

◆ DEF_TEST() [5/7]

DEF_TEST ( WriteBuffer_external_memory_flattenable  ,
reporter   
)

Definition at line 1010 of file SerializationTest.cpp.

1010 {
1011 SkScalar intervals[] = {1.f, 1.f};
1012 auto path_effect = SkDashPathEffect::Make(intervals, 2, 0);
1013 size_t path_size = SkAlign4(path_effect->serialize()->size());
1014 REPORTER_ASSERT(reporter, path_size > 4u);
1015 AutoTMalloc<uint8_t> storage;
1016
1017 size_t storage_size = path_size - 4;
1018 storage.realloc(storage_size);
1019 REPORTER_ASSERT(reporter, path_effect->serialize(storage.get(), storage_size) == 0u);
1020
1021 storage_size = path_size;
1022 storage.realloc(storage_size);
1023 REPORTER_ASSERT(reporter, path_effect->serialize(storage.get(), storage_size) != 0u);
1024}
static constexpr T SkAlign4(T x)
Definition: SkAlign.h:16
static sk_sp< SkPathEffect > Make(const SkScalar intervals[], int count, SkScalar phase)
void realloc(size_t count)
Definition: SkTemplates.h:291

◆ DEF_TEST() [6/7]

DEF_TEST ( WriteBuffer_external_memory_textblob  ,
reporter   
)

Definition at line 986 of file SerializationTest.cpp.

986 {
988
990 int glyph_count = 5;
991 const auto& run = builder.allocRun(font, glyph_count, 1.2f, 2.3f);
992 // allocRun() allocates only the glyph buffer.
993 std::fill(run.glyphs, run.glyphs + glyph_count, 0);
994 auto blob = builder.make();
995 SkSerialProcs procs;
996 AutoTMalloc<uint8_t> storage;
997 size_t blob_size = 0u;
998 size_t storage_size = 0u;
999
1000 blob_size = SkAlign4(blob->serialize(procs)->size());
1001 REPORTER_ASSERT(reporter, blob_size > 4u);
1002 storage_size = blob_size - 4;
1003 storage.realloc(storage_size);
1004 REPORTER_ASSERT(reporter, blob->serialize(procs, storage.get(), storage_size) == 0u);
1005 storage_size = blob_size;
1006 storage.realloc(storage_size);
1007 REPORTER_ASSERT(reporter, blob->serialize(procs, storage.get(), storage_size) != 0u);
1008}
Definition: SkFont.h:35
SkFont DefaultFont()
font
Font Metadata and Metrics.
Definition: run.py:1

◆ DEF_TEST() [7/7]

DEF_TEST ( WriteBuffer_storage  ,
reporter   
)

Definition at line 957 of file SerializationTest.cpp.

957 {
958 enum {
959 kSize = 32
960 };
961 int32_t storage[kSize/4];
962 char src[kSize];
964
965 SkBinaryWriteBuffer writer(storage, kSize, {});
966 REPORTER_ASSERT(reporter, writer.usingInitialStorage());
967 REPORTER_ASSERT(reporter, writer.bytesWritten() == 0);
968 writer.write(src, kSize - 4);
969 REPORTER_ASSERT(reporter, writer.usingInitialStorage());
970 REPORTER_ASSERT(reporter, writer.bytesWritten() == kSize - 4);
971 writer.writeInt(0);
972 REPORTER_ASSERT(reporter, writer.usingInitialStorage());
973 REPORTER_ASSERT(reporter, writer.bytesWritten() == kSize);
974
975 writer.reset(storage, kSize-4);
976 REPORTER_ASSERT(reporter, writer.usingInitialStorage());
977 REPORTER_ASSERT(reporter, writer.bytesWritten() == 0);
978 writer.write(src, kSize - 4);
979 REPORTER_ASSERT(reporter, writer.usingInitialStorage());
980 REPORTER_ASSERT(reporter, writer.bytesWritten() == kSize - 4);
981 writer.writeInt(0);
982 REPORTER_ASSERT(reporter, !writer.usingInitialStorage()); // this is the change
983 REPORTER_ASSERT(reporter, writer.bytesWritten() == kSize);
984}
sk_bzero(glyphs, sizeof(glyphs))
constexpr int kSize

◆ deserialize_typeface_proc()

static sk_sp< SkTypeface > deserialize_typeface_proc ( const void *  data,
size_t  length,
void *  ctx 
)
static

Definition at line 391 of file SerializationTest.cpp.

391 {
393 if (length < sizeof(stream)) {
394 return nullptr;
395 }
396 memcpy(&stream, data, sizeof(stream));
397
399 if (!stream->read(&id, sizeof(id))) {
400 return nullptr;
401 }
402
404 return typeface;
405}
uint32_t SkTypefaceID
Definition: SkTypeface.h:38
static sk_sp< SkTypeface > MakeDeserialize(SkStream *, sk_sp< SkFontMgr > lastResortMgr)
Definition: SkTypeface.cpp:241
size_t length
sk_sp< SkFontMgr > TestFontMgr()
const uintptr_t id

◆ draw_picture()

static SkBitmap draw_picture ( SkPicture picture)
static

Definition at line 352 of file SerializationTest.cpp.

352 {
354 bitmap.allocN32Pixels(SkScalarCeilToInt(picture.cullRect().width()),
355 SkScalarCeilToInt(picture.cullRect().height()));
356 SkCanvas canvas(bitmap);
357 picture.playback(&canvas);
358 return bitmap;
359}
#define SkScalarCeilToInt(x)
Definition: SkScalar.h:36
sk_sp< const SkPicture > picture
Definition: SkRecords.h:299
Definition: bitmap.py:1

◆ draw_something()

static void draw_something ( SkCanvas canvas)
static

Definition at line 648 of file SerializationTest.cpp.

648 {
649 canvas->save();
650 canvas->scale(0.5f, 0.5f);
651 canvas->drawImage(make_checkerboard_image(), 0, 0);
652 canvas->restore();
653
655 paint.setAntiAlias(true);
656 paint.setColor(SK_ColorRED);
658 paint.setColor(SK_ColorBLACK);
659
661 font.setSize(kBitmapSize/3);
663}
static sk_sp< SkImage > make_checkerboard_image()
void restore()
Definition: SkCanvas.cpp:461
int save()
Definition: SkCanvas.cpp:447
void scale(SkScalar sx, SkScalar sy)
Definition: SkCanvas.cpp:1289
void drawString(const char str[], SkScalar x, SkScalar y, const SkFont &font, const SkPaint &paint)
Definition: SkCanvas.h:1803
void drawImage(const SkImage *image, SkScalar left, SkScalar top)
Definition: SkCanvas.h:1528
void drawCircle(SkScalar cx, SkScalar cy, SkScalar radius, const SkPaint &paint)
Definition: SkCanvas.cpp:2707
const Paint & paint
Definition: color_source.cc:38

◆ DumpFontMetrics()

SkString DumpFontMetrics ( const SkFontMetrics metrics)

Definition at line 539 of file SerializationTest.cpp.

539 {
540 SkString m("Flags:\n");
541
542 if (metrics.fFlags == 0) {
543 m += " No flags\n";
544 } else {
546 m += " UnderlineThicknessIsValid\n";
547 }
549 m += " kUnderlinePositionIsValid\n";
550 }
552 m += " kStrikeoutThicknessIsValid\n";
553 }
555 m += " kStrikeoutPositionIsValid\n";
556 }
558 m += " kBoundsInvalid\n";
559 }
560 }
561
562 m.appendf("Top: %f\n", metrics.fTop);
563 m.appendf("Ascent: %f\n", metrics.fAscent);
564 m.appendf("Descent: %f\n", metrics.fDescent);
565 m.appendf("Bottom: %f\n", metrics.fBottom);
566 m.appendf("Leading: %f\n", metrics.fLeading);
567 m.appendf("AvgCharWidth: %f\n", metrics.fAvgCharWidth);
568 m.appendf("MaxCharWidth: %f\n", metrics.fMaxCharWidth);
569 m.appendf("XMin: %f\n", metrics.fXMin);
570 m.appendf("XMax: %f\n", metrics.fXMax);
571 m.appendf("XHeight: %f\n", metrics.fXHeight);
572 m.appendf("CapHeight: %f\n", metrics.fCapHeight);
573 m.appendf("UnderlineThickness: %f\n", metrics.fUnderlineThickness);
574 m.appendf("UnderlinePosition: %f\n", metrics.fUnderlinePosition);
575 m.appendf("StrikeoutThickness: %f\n", metrics.fStrikeoutThickness);
576 m.appendf("StrikeoutPosition: %f\n", metrics.fStrikeoutPosition);
577 return m;
578}
SkScalar fTop
greatest extent above origin of any glyph bounding box, typically negative; deprecated with variable ...
Definition: SkFontMetrics.h:53
SkScalar fLeading
distance to add between lines, typically positive or zero
Definition: SkFontMetrics.h:57
SkScalar fAvgCharWidth
average character width, zero if unknown
Definition: SkFontMetrics.h:58
SkScalar fStrikeoutPosition
distance from baseline to bottom of stroke, typically negative
Definition: SkFontMetrics.h:67
SkScalar fStrikeoutThickness
strikeout thickness
Definition: SkFontMetrics.h:66
SkScalar fMaxCharWidth
maximum character width, zero if unknown
Definition: SkFontMetrics.h:59
SkScalar fBottom
greatest extent below origin of any glyph bounding box, typically positive; deprecated with variable ...
Definition: SkFontMetrics.h:56
uint32_t fFlags
FontMetricsFlags indicating which metrics are valid.
Definition: SkFontMetrics.h:52
SkScalar fAscent
distance to reserve above baseline, typically negative
Definition: SkFontMetrics.h:54
SkScalar fXHeight
height of lower-case 'x', zero if unknown, typically negative
Definition: SkFontMetrics.h:62
SkScalar fUnderlineThickness
underline thickness
Definition: SkFontMetrics.h:64
@ kStrikeoutPositionIsValid_Flag
set if fStrikeoutPosition is valid
Definition: SkFontMetrics.h:48
@ kStrikeoutThicknessIsValid_Flag
set if fStrikeoutThickness is valid
Definition: SkFontMetrics.h:47
@ kUnderlinePositionIsValid_Flag
set if fUnderlinePosition is valid
Definition: SkFontMetrics.h:46
@ kUnderlineThicknessIsValid_Flag
set if fUnderlineThickness is valid
Definition: SkFontMetrics.h:45
@ kBoundsInvalid_Flag
set if fTop, fBottom, fXMin, fXMax invalid
Definition: SkFontMetrics.h:49
SkScalar fDescent
distance to reserve below baseline, typically positive
Definition: SkFontMetrics.h:55
SkScalar fCapHeight
height of an upper-case letter, zero if unknown, typically negative
Definition: SkFontMetrics.h:63
SkScalar fXMin
greatest extent to left of origin of any glyph bounding box, typically negative; deprecated with vari...
Definition: SkFontMetrics.h:60
SkScalar fUnderlinePosition
distance from baseline to top of stroke, typically positive
Definition: SkFontMetrics.h:65
SkScalar fXMax
greatest extent to right of origin of any glyph bounding box, typically positive; deprecated with var...
Definition: SkFontMetrics.h:61

◆ DumpTypeface()

SkString DumpTypeface ( const SkTypeface typeface)

Definition at line 526 of file SerializationTest.cpp.

526 {
527 int index;
528 std::unique_ptr<SkStreamAsset> typefaceStream = typeface.openStream(&index);
529 if (!typefaceStream) {
530 return SkString("No Stream");
531 }
532 size_t length = typefaceStream->getLength();
533
534 SkString s;
535 s.appendf("Index: %d\n", index);
536 s.appendf("Length: %zu\n", length);
537 return s;
538}
std::unique_ptr< SkStreamAsset > openStream(int *ttcIndex) const
Definition: SkTypeface.cpp:332
struct MyStruct s

◆ make_checkerboard_image()

static sk_sp< SkImage > make_checkerboard_image ( )
static

Definition at line 622 of file SerializationTest.cpp.

622 {
625
626 SkCanvas canvas(bitmap);
627 canvas.clear(0x00000000);
628 SkPaint darkPaint;
629 darkPaint.setColor(0xFF804020);
630 SkPaint lightPaint;
631 lightPaint.setColor(0xFF244484);
632 const int i = kBitmapSize / 8;
633 const SkScalar f = SkIntToScalar(i);
634 for (int y = 0; y < kBitmapSize; y += i) {
635 for (int x = 0; x < kBitmapSize; x += i) {
636 canvas.save();
637 canvas.translate(SkIntToScalar(x), SkIntToScalar(y));
638 canvas.drawRect(SkRect::MakeXYWH(0, 0, f, f), darkPaint);
639 canvas.drawRect(SkRect::MakeXYWH(f, 0, f, f), lightPaint);
640 canvas.drawRect(SkRect::MakeXYWH(0, f, f, f), lightPaint);
641 canvas.drawRect(SkRect::MakeXYWH(f, f, f, f), darkPaint);
642 canvas.restore();
643 }
644 }
645 return bitmap.asImage();
646}
static void setup_bitmap_for_canvas(SkBitmap *bitmap)
void setColor(SkColor color)
Definition: SkPaint.cpp:119

◆ makeColrWithNonDefaultPalette()

static sk_sp< SkTypeface > makeColrWithNonDefaultPalette ( skiatest::Reporter reporter)
static

Definition at line 466 of file SerializationTest.cpp.

466 {
467 std::unique_ptr<SkStreamAsset> colr(GetResourceAsStream("fonts/colr.ttf"));
468 if (!colr) {
469 REPORT_FAILURE(reporter, "colr", SkString());
470 return nullptr;
471 }
472
473 const SkFontArguments::Palette::Override paletteOverride[] = {
474 { 1, SK_ColorGRAY },
475 };
477 params.setPalette({0, paletteOverride, std::size(paletteOverride)});
478
480
481 sk_sp<SkTypeface> typeface = fm->makeFromStream(std::move(colr), params);
482 if (!typeface) {
483 return nullptr; // Not all SkFontMgr can makeFromStream().
484 }
485
486 return typeface;
487}
std::unique_ptr< SkStreamAsset > GetResourceAsStream(const char *resource, bool useFileStream)
Definition: Resources.cpp:31
constexpr SkColor SK_ColorGRAY
Definition: SkColor.h:113
#define REPORT_FAILURE(reporter, cond, message)
Definition: Test.h:90
sk_sp< SkTypeface > makeFromStream(std::unique_ptr< SkStreamAsset >, int ttcIndex=0) const
Definition: SkFontMgr.cpp:127
const EmbeddedViewParams * params

◆ makeDistortableWithNonDefaultAxes()

static sk_sp< SkTypeface > makeDistortableWithNonDefaultAxes ( skiatest::Reporter reporter)
static

Definition at line 438 of file SerializationTest.cpp.

438 {
439 std::unique_ptr<SkStreamAsset> distortable(GetResourceAsStream("fonts/Distortable.ttf"));
440 if (!distortable) {
441 REPORT_FAILURE(reporter, "distortable", SkString());
442 return nullptr;
443 }
444
446 { SkSetFourByteTag('w','g','h','t'), SK_ScalarSqrt2 },
447 };
449 params.setVariationDesignPosition({position, std::size(position)});
450
452
453 sk_sp<SkTypeface> typeface = fm->makeFromStream(std::move(distortable), params);
454 if (!typeface) {
455 return nullptr; // Not all SkFontMgr can makeFromStream().
456 }
457
458 int count = typeface->getVariationDesignPosition(nullptr, 0);
459 if (count == -1) {
460 return nullptr; // The number of axes is unknown.
461 }
462
463 return typeface;
464}
int count
Definition: FontMgrTest.cpp:50
#define SK_ScalarSqrt2
Definition: SkScalar.h:20
static constexpr SkFourByteTag SkSetFourByteTag(char a, char b, char c, char d)
Definition: SkTypes.h:167
int getVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], int coordinateCount) const
Definition: SkTypeface.cpp:289

◆ render()

static sk_sp< SkImage > render ( const SkPicture p)
static

Definition at line 665 of file SerializationTest.cpp.

665 {
667 SkScalarRoundToInt(p.cullRect().width()), SkScalarRoundToInt(p.cullRect().height())));
668 if (!surf) {
669 return nullptr; // bounds are empty?
670 }
671 surf->getCanvas()->clear(SK_ColorWHITE);
672 p.playback(surf->getCanvas());
673 return surf->makeImageSnapshot();
674}
#define SkScalarRoundToInt(x)
Definition: SkScalar.h:37
SK_API sk_sp< SkSurface > Raster(const SkImageInfo &imageInfo, size_t rowBytes, const SkSurfaceProps *surfaceProps)

◆ serialize_and_compare_typeface()

static void serialize_and_compare_typeface ( sk_sp< SkTypeface typeface,
const char *  text,
const SkSerialProcs serial_procs,
const SkDeserialProcs deserial_procs,
skiatest::Reporter reporter 
)
static

Definition at line 407 of file SerializationTest.cpp.

411 {
412 // Create a font with the typeface.
414 paint.setColor(SK_ColorGRAY);
415 SkFont font(std::move(typeface), 30);
416
417 // Paint some text.
418 SkPictureRecorder recorder;
420 SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(canvasRect.width()),
421 SkIntToScalar(canvasRect.height()));
422 canvas->drawColor(SK_ColorWHITE);
423 canvas->drawString(text, 24, 32, font, paint);
425
426 // Serlialize picture and create its clone from stream.
428 picture->serialize(&stream, serial_procs);
429 std::unique_ptr<SkStream> inputStream(stream.detachAsStream());
430 sk_sp<SkPicture> loadedPicture(SkPicture::MakeFromStream(inputStream.get(), deserial_procs));
431
432 // Draw both original and clone picture and compare bitmaps -- they should be identical.
433 SkBitmap origBitmap = draw_picture(*picture);
434 SkBitmap destBitmap = draw_picture(*loadedPicture);
435 compare_bitmaps(reporter, origBitmap, destBitmap);
436}
static void compare_bitmaps(skiatest::Reporter *reporter, const SkBitmap &b1, const SkBitmap &b2)
static SkBitmap draw_picture(SkPicture &picture)
void drawColor(SkColor color, SkBlendMode mode=SkBlendMode::kSrcOver)
Definition: SkCanvas.h:1182
sk_sp< SkData > serialize(const SkSerialProcs *procs=nullptr) const
Definition: SkPicture.cpp:249
std::u16string text
Definition: SkRect.h:32
constexpr int32_t height() const
Definition: SkRect.h:165
constexpr int32_t width() const
Definition: SkRect.h:158
static constexpr SkIRect MakeWH(int32_t w, int32_t h)
Definition: SkRect.h:56

◆ serialize_typeface_proc()

static sk_sp< SkData > serialize_typeface_proc ( SkTypeface typeface,
void *  ctx 
)
static

Definition at line 381 of file SerializationTest.cpp.

381 {
382 // Write out typeface ID followed by entire typeface.
385 uint32_t typeface_id = typeface->uniqueID();
386 stream.write(&typeface_id, sizeof(typeface_id));
387 stream.write(data->data(), data->size());
388 return stream.detachAsData();
389}
SkTypefaceID uniqueID() const
Definition: SkTypeface.h:101
void serialize(SkWStream *, SerializeBehavior=SerializeBehavior::kIncludeDataIfLocal) const
Definition: SkTypeface.cpp:202

◆ setup_bitmap_for_canvas()

static void setup_bitmap_for_canvas ( SkBitmap bitmap)
static

Definition at line 618 of file SerializationTest.cpp.

618 {
619 bitmap->allocN32Pixels(kBitmapSize, kBitmapSize);
620}

◆ TestArraySerialization()

template<typename T >
static void TestArraySerialization ( T data,
skiatest::Reporter reporter 
)
static

Definition at line 285 of file SerializationTest.cpp.

285 {
286 SkBinaryWriteBuffer writer({});
288 size_t bytesWritten = writer.bytesWritten();
289 // This should write the length (in 4 bytes) and the array
290 REPORTER_ASSERT(reporter, (4 + kArraySize * sizeof(T)) == bytesWritten);
291
292 unsigned char dataWritten[2048];
293 writer.writeToMemory(dataWritten);
294
295 // Make sure this fails when it should
296 SkReadBuffer buffer(dataWritten, bytesWritten);
297 T dataRead[kArraySize];
298 bool success = SerializationUtils<T>::Read(buffer, dataRead, kArraySize / 2);
299 // This should have failed, since the provided size was too small
300 REPORTER_ASSERT(reporter, !success);
301
302 // Make sure this succeeds when it should
303 SkReadBuffer buffer2(dataWritten, bytesWritten);
304 success = SerializationUtils<T>::Read(buffer2, dataRead, kArraySize);
305 // This should have succeeded, since there are enough bytes to read this
306 REPORTER_ASSERT(reporter, success);
307}
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified vm service A custom Dart VM Service port The default is to pick a randomly available open port disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode disable vm service Disable mDNS Dart VM Service publication Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set endless trace buffer
Definition: switches.h:126
#define T
Definition: precompiler.cc:65
static void Read(SkReadBuffer &reader, T **flattenable)
static void Write(SkWriteBuffer &writer, const T *flattenable)

◆ TestBitmapSerialization()

static void TestBitmapSerialization ( const SkBitmap validBitmap,
const SkBitmap invalidBitmap,
bool  shouldSucceed,
skiatest::Reporter reporter 
)
static

Definition at line 309 of file SerializationTest.cpp.

312 {
313 sk_sp<SkImage> validImage(validBitmap.asImage());
314 sk_sp<SkImageFilter> validBitmapSource(SkImageFilters::Image(std::move(validImage),
316 sk_sp<SkImage> invalidImage(invalidBitmap.asImage());
317 sk_sp<SkImageFilter> invalidBitmapSource(SkImageFilters::Image(std::move(invalidImage),
319 sk_sp<SkImageFilter> xfermodeImageFilter(
321 std::move(invalidBitmapSource),
322 std::move(validBitmapSource), nullptr));
323
324 sk_sp<SkImageFilter> deserializedFilter(
325 TestFlattenableSerialization<SkImageFilter_Base>(
326 (SkImageFilter_Base*)xfermodeImageFilter.get(), shouldSucceed, reporter));
327
328 // Try to render a small bitmap using the invalid deserialized filter
329 // to make sure we don't crash while trying to render it
330 if (shouldSucceed) {
332 bitmap.allocN32Pixels(24, 24);
333 SkCanvas canvas(bitmap);
334 canvas.clear(0x00000000);
336 paint.setImageFilter(deserializedFilter);
337 canvas.clipRect(SkRect::MakeXYWH(0, 0, SkIntToScalar(24), SkIntToScalar(24)));
338 canvas.drawImage(bitmap.asImage(), 0, 0, SkSamplingOptions(), &paint);
339 }
340}
@ kSrcOver
r = s + (1-sa)*d
sk_sp< SkImage > asImage() const
Definition: SkBitmap.cpp:645
static sk_sp< SkImageFilter > Image(sk_sp< SkImage > image, const SkRect &srcRect, const SkRect &dstRect, const SkSamplingOptions &sampling)
static sk_sp< SkImageFilter > Blend(SkBlendMode mode, sk_sp< SkImageFilter > background, sk_sp< SkImageFilter > foreground=nullptr, const CropRect &cropRect={})

◆ TestColorFilterSerialization()

static void TestColorFilterSerialization ( skiatest::Reporter reporter)
static

Definition at line 342 of file SerializationTest.cpp.

342 {
343 uint8_t table[256];
344 for (int i = 0; i < 256; ++i) {
345 table[i] = (i * 41) % 256;
346 }
347 auto filter = SkColorFilters::Table(table);
349 TestFlattenableSerialization(as_CFB(filter.get()), true, reporter));
350}
static T * TestFlattenableSerialization(T *testObj, bool shouldSucceed, skiatest::Reporter *reporter)
static SkColorFilterBase * as_CFB(SkColorFilter *filter)
static void copy(void *dst, const uint8_t *src, int width, int bpp, int deltaSrc, int offset, const SkPMColor ctable[])
Definition: SkSwizzler.cpp:31
SI F table(const skcms_Curve *curve, F v)
static sk_sp< SkColorFilter > Table(const uint8_t table[256])

◆ TestFlattenableSerialization()

template<typename T >
static T * TestFlattenableSerialization ( T testObj,
bool  shouldSucceed,
skiatest::Reporter reporter 
)
static

Definition at line 246 of file SerializationTest.cpp.

247 {
248 SkBinaryWriteBuffer writer({});
249 SerializationUtils<T>::Write(writer, testObj);
250 size_t bytesWritten = writer.bytesWritten();
251 REPORTER_ASSERT(reporter, SkAlign4(bytesWritten) == bytesWritten);
252
253 SkASSERT(bytesWritten <= 4096);
254 unsigned char dataWritten[4096];
255 writer.writeToMemory(dataWritten);
256
257 // Make sure this fails when it should (test with smaller size, but still multiple of 4)
258 SkReadBuffer buffer(dataWritten, bytesWritten - 4);
259 T* obj = nullptr;
261 REPORTER_ASSERT(reporter, !buffer.isValid());
262 REPORTER_ASSERT(reporter, nullptr == obj);
263
264 // Make sure this succeeds when it should
265 SkReadBuffer buffer2(dataWritten, bytesWritten);
266 const unsigned char* peekBefore = static_cast<const unsigned char*>(buffer2.skip(0));
267 T* obj2 = nullptr;
268 SerializationUtils<T>::Read(buffer2, &obj2);
269 const unsigned char* peekAfter = static_cast<const unsigned char*>(buffer2.skip(0));
270 if (shouldSucceed) {
271 // This should have succeeded, since there are enough bytes to read this
272 REPORTER_ASSERT(reporter, buffer2.isValid());
273 REPORTER_ASSERT(reporter, static_cast<size_t>(peekAfter - peekBefore) == bytesWritten);
275 } else {
276 // If the deserialization was supposed to fail, make sure it did
277 REPORTER_ASSERT(reporter, !buffer.isValid());
278 REPORTER_ASSERT(reporter, nullptr == obj2);
279 }
280
281 return obj2; // Return object to perform further validity tests on it
282}
#define SkASSERT(cond)
Definition: SkAssert.h:116

◆ TestObjectSerialization()

template<typename T >
static void TestObjectSerialization ( T testObj,
skiatest::Reporter reporter 
)
static

Definition at line 240 of file SerializationTest.cpp.

240 {
241 TestObjectSerializationNoAlign<T, false>(testObj, reporter);
243}

◆ TestObjectSerializationNoAlign()

template<typename T , bool testInvalid>
static void TestObjectSerializationNoAlign ( T testObj,
skiatest::Reporter reporter 
)
static

Definition at line 209 of file SerializationTest.cpp.

209 {
210 SkBinaryWriteBuffer writer({});
211 SerializationUtils<T>::Write(writer, testObj);
212 size_t bytesWritten = writer.bytesWritten();
213 REPORTER_ASSERT(reporter, SkAlign4(bytesWritten) == bytesWritten);
214
215 unsigned char dataWritten[1024];
216 writer.writeToMemory(dataWritten);
217
219
220 // Make sure this fails when it should (test with smaller size, but still multiple of 4)
221 SkReadBuffer buffer(dataWritten, bytesWritten - 4);
222 T obj;
224 REPORTER_ASSERT(reporter, !buffer.isValid());
225
226 // Make sure this succeeds when it should
227 SkReadBuffer buffer2(dataWritten, bytesWritten);
228 size_t offsetBefore = buffer2.offset();
229 T obj2;
230 SerializationUtils<T>::Read(buffer2, &obj2);
231 size_t offsetAfter = buffer2.offset();
232 // This should have succeeded, since there are enough bytes to read this
233 REPORTER_ASSERT(reporter, buffer2.isValid() == !testInvalid);
234 // Note: This following test should always succeed, regardless of whether the buffer is valid,
235 // since if it is invalid, it will simply skip to the end, as if it had read the whole buffer.
236 REPORTER_ASSERT(reporter, offsetAfter - offsetBefore == bytesWritten);
237}
static void InvalidateData(unsigned char *data)

◆ TestPictureTypefaceSerialization()

static void TestPictureTypefaceSerialization ( const SkSerialProcs serial_procs,
const SkDeserialProcs deserial_procs,
skiatest::Reporter reporter 
)
static

Definition at line 489 of file SerializationTest.cpp.

491 {
492 {
493 // Load typeface from file to test CreateFromFile with index.
494 auto typeface = ToolUtils::CreateTypefaceFromResource("fonts/test.ttc", 1);
495 if (!typeface) {
496 INFOF(reporter, "Could not run test because test.ttc not found.");
497 } else {
498 serialize_and_compare_typeface(std::move(typeface), "A!", serial_procs, deserial_procs,
499 reporter);
500 }
501 }
502
503 {
504 // Load typeface as stream to create with axis settings.
506 if (!typeface) {
507 INFOF(reporter, "Could not run test because Distortable.ttf not created.");
508 } else {
509 serialize_and_compare_typeface(std::move(typeface), "ab", serial_procs,
510 deserial_procs, reporter);
511 }
512 }
513
514 {
515 // Load typeface as stream to create with palette settings.
517 if (!typeface) {
518 INFOF(reporter, "Could not run test because colr.ttf not created.");
519 } else {
520 serialize_and_compare_typeface(std::move(typeface), "😀♢", serial_procs,
521 deserial_procs, reporter);
522 }
523 }
524}
static sk_sp< SkTypeface > makeDistortableWithNonDefaultAxes(skiatest::Reporter *reporter)
static void serialize_and_compare_typeface(sk_sp< SkTypeface > typeface, const char *text, const SkSerialProcs *serial_procs, const SkDeserialProcs *deserial_procs, skiatest::Reporter *reporter)
static sk_sp< SkTypeface > makeColrWithNonDefaultPalette(skiatest::Reporter *reporter)
#define INFOF(REPORTER,...)
Definition: Test.h:298
sk_sp< SkTypeface > CreateTypefaceFromResource(const char *resource, int ttcIndex)

◆ TestTypefaceSerialization()

static void TestTypefaceSerialization ( skiatest::Reporter reporter,
const sk_sp< SkTypeface > &  typeface 
)
static

Definition at line 579 of file SerializationTest.cpp.

580 {
581 SkDynamicMemoryWStream typefaceWStream;
582 typeface->serialize(&typefaceWStream);
583
584 std::unique_ptr<SkStream> typefaceStream = typefaceWStream.detachAsStream();
585 sk_sp<SkTypeface> cloneTypeface =
587 SkASSERT(cloneTypeface);
588
589 SkString name, cloneName;
590 typeface->getFamilyName(&name);
591 cloneTypeface->getFamilyName(&cloneName);
592
593 REPORTER_ASSERT(reporter, typeface->countGlyphs() == cloneTypeface->countGlyphs(),
594 "Typeface: \"%s\" CloneTypeface: \"%s\"", name.c_str(), cloneName.c_str());
595 REPORTER_ASSERT(reporter, typeface->fontStyle() == cloneTypeface->fontStyle(),
596 "Typeface: \"%s\" CloneTypeface: \"%s\"", name.c_str(), cloneName.c_str());
597
598 SkFont font(typeface, 12);
599 SkFont clone(cloneTypeface, 12);
600 SkFontMetrics fontMetrics, cloneMetrics;
601 font.getMetrics(&fontMetrics);
602 clone.getMetrics(&cloneMetrics);
603 REPORTER_ASSERT(reporter, fontMetrics == cloneMetrics,
604 "Typeface: \"%s\"\n-Metrics---\n%s-Data---\n%s\n\n"
605 "CloneTypeface: \"%s\"\n-Metrics---\n%s-Data---\n%s",
606 name.c_str(),
607 DumpFontMetrics(fontMetrics).c_str(),
608 DumpTypeface(*typeface).c_str(),
609 cloneName.c_str(),
610 DumpFontMetrics(cloneMetrics).c_str(),
611 DumpTypeface(*cloneTypeface).c_str());
612}
SkString DumpFontMetrics(const SkFontMetrics &metrics)
SkString DumpTypeface(const SkTypeface &typeface)
const char * c_str() const
Definition: SkString.h:133
int countGlyphs() const
Definition: SkTypeface.cpp:432
void getFamilyName(SkString *name) const
Definition: SkTypeface.cpp:459
SkFontStyle fontStyle() const
Definition: SkTypeface.h:55
DEF_SWITCHES_START aot vmservice shared library name
Definition: switches.h:32

Variable Documentation

◆ kArraySize

const uint32_t kArraySize = 64
static

Definition at line 72 of file SerializationTest.cpp.

◆ kBitmapSize

const int kBitmapSize = 256
static

Definition at line 73 of file SerializationTest.cpp.