static void TestPictureTypefaceSerialization(skiatest::Reporter* reporter) { { // Load typeface from file to test CreateFromFile with index. auto data = GetResourceAsData("fonts/test.ttc"); auto typeface = SkTypeface::MakeFromStream(new SkMemoryStream(std::move(data)), 1); if (!typeface) { INFOF(reporter, "Could not run fontstream test because test.ttc not found."); } else { serialize_and_compare_typeface(std::move(typeface), "A!", reporter); } } { // Load typeface as stream to create with axis settings. std::unique_ptr<SkStreamAsset> distortable(GetResourceAsStream("fonts/Distortable.ttf")); if (!distortable) { INFOF(reporter, "Could not run fontstream test because Distortable.ttf not found."); } else { SkFixed axis = SK_FixedSqrt2; sk_sp<SkTypeface> typeface(SkTypeface::MakeFromFontData( skstd::make_unique<SkFontData>(std::move(distortable), 0, &axis, 1))); if (!typeface) { INFOF(reporter, "Could not run fontstream test because Distortable.ttf not created."); } else { serialize_and_compare_typeface(std::move(typeface), "abc", reporter); } } } }
DEF_TEST(BadImage, reporter) { const char* const badImages [] = { "sigabort_favicon.ico", "sigsegv_favicon.ico", "sigsegv_favicon_2.ico", "ico_leak01.ico", "ico_fuzz0.ico", "ico_fuzz1.ico", "skbug3442.webp", "skbug3429.webp", }; const char* badImagesFolder = "invalid_images"; for (size_t i = 0; i < SK_ARRAY_COUNT(badImages); ++i) { SkString resourcePath = SkOSPath::Join(badImagesFolder, badImages[i]); SkAutoTDelete<SkStream> stream(GetResourceAsStream(resourcePath.c_str())); SkAutoTDelete<SkCodec> codec(SkCodec::NewFromStream(stream.release())); // These images are corrupt. It's not important whether we succeed/fail in codec // creation or decoding. We just want to make sure that we don't crash. if (codec) { SkBitmap bm; bm.allocPixels(codec->getInfo()); codec->getPixels(codec->getInfo(), bm.getPixels(), bm.rowBytes()); } } }
static void TestPictureTypefaceSerialization(skiatest::Reporter* reporter) { { // Load typeface from file to test CreateFromFile with index. SkString filename = GetResourcePath("/fonts/test.ttc"); sk_sp<SkTypeface> typeface(SkTypeface::MakeFromFile(filename.c_str(), 1)); if (!typeface) { INFOF(reporter, "Could not run fontstream test because test.ttc not found."); } else { serialize_and_compare_typeface(std::move(typeface), "A!", reporter); } } { // Load typeface as stream to create with axis settings. SkAutoTDelete<SkStreamAsset> distortable(GetResourceAsStream("/fonts/Distortable.ttf")); if (!distortable) { INFOF(reporter, "Could not run fontstream test because Distortable.ttf not found."); } else { SkFixed axis = SK_FixedSqrt2; sk_sp<SkTypeface> typeface(SkTypeface::MakeFromFontData( new SkFontData(distortable.release(), 0, &axis, 1))); if (!typeface) { INFOF(reporter, "Could not run fontstream test because Distortable.ttf not created."); } else { serialize_and_compare_typeface(std::move(typeface), "abc", reporter); } } } }
SkTypeface* GetResourceAsTypeface(const char* resource) { SkAutoTDelete<SkStreamAsset> stream(GetResourceAsStream(resource)); if (!stream) { return NULL; } SkAutoTUnref<SkTypeface> typeface(SkTypeface::CreateFromStream(stream.detach())); if (!typeface) { SkDebugf("Resource %s not a valid font.\n", resource); } return typeface.detach(); }
void onOnceBeforeDraw() override { if (auto stream = GetResourceAsStream("skottie/skottie_sample_2.json")) { fAnim = skottie::Animation::Make(stream.get()); } int index = 0; for (float x = 0; x <= 1; ++x) { for (float y = 0; y <= 1; ++y) { for (float z = 0; z <= 1; ++z) { fP3[index++] = { x, y, z }; } } } }
static sk_sp<SkImage> make_raster_image(SkColorType colorType) { std::unique_ptr<SkStream> stream(GetResourceAsStream("images/google_chrome.ico")); std::unique_ptr<SkCodec> codec = SkCodec::MakeFromStream(std::move(stream)); SkBitmap bitmap; SkImageInfo info = codec->getInfo().makeWH(kWidth, kHeight) .makeColorType(colorType) .makeAlphaType(kPremul_SkAlphaType) .makeColorSpace(fix_for_colortype(codec->getInfo().colorSpace(), colorType)); bitmap.allocPixels(info); codec->getPixels(info, bitmap.getPixels(), bitmap.rowBytes()); bitmap.setImmutable(); return SkImage::MakeFromBitmap(bitmap); }
DEF_TEST(TypefaceStyle, reporter) { std::unique_ptr<SkStreamAsset> stream(GetResourceAsStream("/fonts/Em.ttf")); if (!stream) { REPORT_FAILURE(reporter, "/fonts/Em.ttf", SkString("Cannot load resource")); return; } sk_sp<SkData> data(SkData::MakeFromStream(stream.get(), stream->getLength())); using SkFS = SkFontStyle; for (int weight = SkFS::kInvisible_Weight; weight <= SkFS::kExtraBlack_Weight; ++weight) { TypefaceStyle_test(reporter, weight, 5, data.get()); } for (int width = SkFS::kUltraCondensed_Width; width <= SkFS::kUltaExpanded_Width; ++width) { TypefaceStyle_test(reporter, 400, width, data.get()); } }
void onDraw(SkCanvas* canvas) override { SkPaint paint; paint.setAntiAlias(true); paint.setLCDRenderText(true); SkAutoTUnref<SkFontMgr> fontMgr(SkFontMgr::RefDefault()); SkAutoTDelete<SkStreamAsset> distortable(GetResourceAsStream("/fonts/Distortable.ttf")); if (!distortable) { return; } const char* text = "abc"; const size_t textLen = strlen(text); for (int j = 0; j < 2; ++j) { for (int i = 0; i < 5; ++i) { SkScalar x = SkIntToScalar(10); SkScalar y = SkIntToScalar(20); SkFourByteTag tag = SkSetFourByteTag('w','g','h','t'); SkScalar styleValue = SkDoubleToScalar(0.5 + (5*j + i) * ((2.0 - 0.5) / (2 * 5))); SkFontMgr::FontParameters::Axis axes[] = { { tag, styleValue } }; paint.setTypeface(sk_sp<SkTypeface>(fontMgr->createFromStream( distortable->duplicate(), SkFontMgr::FontParameters().setAxes(axes, 1)))); SkAutoCanvasRestore acr(canvas, true); canvas->translate(SkIntToScalar(30 + i * 100), SkIntToScalar(20)); rotate_about(canvas, SkIntToScalar(i * 5), x, y * 10); { SkPaint p; p.setAntiAlias(true); SkRect r; r.set(x - SkIntToScalar(3), SkIntToScalar(15), x - SkIntToScalar(1), SkIntToScalar(280)); canvas->drawRect(r, p); } for (int ps = 6; ps <= 22; ps++) { paint.setTextSize(SkIntToScalar(ps)); canvas->drawText(text, textLen, x, y, paint); y += paint.getFontMetrics(nullptr); } } canvas->translate(0, SkIntToScalar(360)); paint.setSubpixelText(true); } }
void onDraw(SkCanvas* canvas) override { SkPaint paint; paint.setAntiAlias(true); paint.setLCDRenderText(true); SkAutoTDelete<SkStreamAsset> distortable(GetResourceAsStream("/fonts/Distortable.ttf")); if (!distortable) { return; } const char* text = "abc"; const size_t textLen = strlen(text); for (int j = 0; j < 2; ++j) { for (int i = 0; i < 5; ++i) { SkScalar x = SkIntToScalar(10); SkScalar y = SkIntToScalar(20); SkFixed axis = SkDoubleToFixed(0.5 + (5*j + i) * ((2.0 - 0.5) / (2 * 5))); SkAutoTUnref<SkTypeface> typeface(SkTypeface::CreateFromFontData( new SkFontData(distortable->duplicate(), 0, &axis, 1))); paint.setTypeface(typeface); SkAutoCanvasRestore acr(canvas, true); canvas->translate(SkIntToScalar(30 + i * 100), SkIntToScalar(20)); rotate_about(canvas, SkIntToScalar(i * 5), x, y * 10); { SkPaint p; p.setAntiAlias(true); SkRect r; r.set(x - SkIntToScalar(3), SkIntToScalar(15), x - SkIntToScalar(1), SkIntToScalar(280)); canvas->drawRect(r, p); } for (int ps = 6; ps <= 22; ps++) { paint.setTextSize(SkIntToScalar(ps)); canvas->drawText(text, textLen, x, y, paint); y += paint.getFontMetrics(nullptr); } } canvas->translate(0, SkIntToScalar(360)); paint.setSubpixelText(true); } }
static void test_path(skiatest::Reporter* r, const char* path, const float red[], const float green[], const float blue[], bool expectSRGB = false) { std::unique_ptr<SkStream> stream(GetResourceAsStream(path)); REPORTER_ASSERT(r, nullptr != stream); if (!stream) { return; } std::unique_ptr<SkCodec> codec(SkCodec::MakeFromStream(std::move(stream))); REPORTER_ASSERT(r, nullptr != codec); if (!codec) { return; } auto colorSpace = codec->getInfo().refColorSpace(); test_space(r, colorSpace.get(), red, green, blue, expectSRGB); }