static void TestPDFDict(skiatest::Reporter* reporter) { SkAutoTUnref<SkPDFDict> dict(new SkPDFDict); ASSERT_EMIT_EQ(reporter, *dict, "<<>>"); dict->insertInt("n1", SkToSizeT(42)); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 42>>"); dict.reset(new SkPDFDict); ASSERT_EMIT_EQ(reporter, *dict, "<<>>"); dict->insertInt("n1", 42); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 42>>"); dict->insertScalar("n2", SK_ScalarHalf); SkString n3("n3"); SkAutoTUnref<SkPDFArray> innerArray(new SkPDFArray); innerArray->appendInt(-100); dict->insertObject(n3, innerArray.detach()); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 42\n/n2 0.5\n/n3 [-100]>>"); dict.reset(new SkPDFDict); ASSERT_EMIT_EQ(reporter, *dict, "<<>>"); dict->insertInt("n1", 24); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 24>>"); dict->insertInt("n2", SkToSizeT(99)); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 24\n/n2 99>>"); dict->insertScalar("n3", SK_ScalarHalf); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 24\n/n2 99\n/n3 0.5>>"); dict->insertName("n4", "AName"); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 24\n/n2 99\n/n3 0.5\n/n4 /AName>>"); dict->insertName("n5", SkString("AnotherName")); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 24\n/n2 99\n/n3 0.5\n/n4 /AName\n" "/n5 /AnotherName>>"); dict->insertString("n6", "A String"); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 24\n/n2 99\n/n3 0.5\n/n4 /AName\n" "/n5 /AnotherName\n/n6 (A String)>>"); dict->insertString("n7", SkString("Another String")); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 24\n/n2 99\n/n3 0.5\n/n4 /AName\n" "/n5 /AnotherName\n/n6 (A String)\n/n7 (Another String)>>"); dict.reset(new SkPDFDict("DType")); ASSERT_EMIT_EQ(reporter, *dict, "<</Type /DType>>"); SkAutoTUnref<SkPDFArray> referencedArray(new SkPDFArray); Catalog catalog; catalog.numbers.addObject(referencedArray.get()); REPORTER_ASSERT(reporter, catalog.numbers.getObjectNumber( referencedArray.get()) == 1); dict->insertObjRef("n1", referencedArray.detach()); SkString result = emit_to_string(*dict, &catalog); ASSERT_EQ(reporter, result, "<</Type /DType\n/n1 1 0 R>>"); }
static void TestPDFDict(skiatest::Reporter* reporter) { std::unique_ptr<SkPDFDict> dict(new SkPDFDict); assert_emit_eq(reporter, *dict, "<<>>"); dict->insertInt("n1", SkToSizeT(42)); assert_emit_eq(reporter, *dict, "<</n1 42>>"); dict.reset(new SkPDFDict); assert_emit_eq(reporter, *dict, "<<>>"); dict->insertInt("n1", 42); assert_emit_eq(reporter, *dict, "<</n1 42>>"); dict->insertScalar("n2", SK_ScalarHalf); SkString n3("n3"); std::unique_ptr<SkPDFArray> innerArray(new SkPDFArray); innerArray->appendInt(-100); dict->insertObject(n3, std::move(innerArray)); assert_emit_eq(reporter, *dict, "<</n1 42\n/n2 .5\n/n3 [-100]>>"); dict.reset(new SkPDFDict); assert_emit_eq(reporter, *dict, "<<>>"); dict->insertInt("n1", 24); assert_emit_eq(reporter, *dict, "<</n1 24>>"); dict->insertInt("n2", SkToSizeT(99)); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99>>"); dict->insertScalar("n3", SK_ScalarHalf); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5>>"); dict->insertName("n4", "AName"); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName>>"); dict->insertName("n5", SkString("AnotherName")); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName\n" "/n5 /AnotherName>>"); dict->insertString("n6", "A String"); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName\n" "/n5 /AnotherName\n/n6 (A String)>>"); dict->insertString("n7", SkString("Another String")); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName\n" "/n5 /AnotherName\n/n6 (A String)\n/n7 (Another String)>>"); dict.reset(new SkPDFDict("DType")); assert_emit_eq(reporter, *dict, "<</Type /DType>>"); }
size_t JavaInputStream::read(void* voidBuffer, size_t size) { size_t totalRead = 0; char* buffer = static_cast<char*>(voidBuffer); // may be NULL; while (size) { // make sure the cache has at least one byte or is done. if (fStartIndex == fEndIndex) { jint count = fEnv->CallIntMethod(fInputStream, fReadMethodID, fJavaBuffer); if (fEnv->ExceptionCheck()) { fEnv->ExceptionDescribe(); fEnv->ExceptionClear(); SkDebugf("---- java.io.InputStream::read() threw an exception\n"); return 0; } fStartIndex = 0; fEndIndex = count; if (this->isAtEnd()) { return totalRead; // No more to read. } } SkASSERT(fEndIndex > fStartIndex); size_t length = SkTMin(SkToSizeT(fEndIndex - fStartIndex), size); if (buffer && length) { jbyte* bufferElements = fEnv->GetByteArrayElements(fJavaBuffer, NULL); memcpy(buffer, &bufferElements[fStartIndex], length); buffer += length; fEnv->ReleaseByteArrayElements(fJavaBuffer, bufferElements, 0); } totalRead += length; size -= length; fStartIndex += length; } return totalRead; }
bool SkIsJFIF(const SkData* skdata, SkJFIFInfo* info) { static const uint16_t kSOI = 0xFFD8; static const uint16_t kAPP0 = 0xFFE0; JpegSegment segment(skdata); if (!segment.read() || segment.marker() != kSOI) { return false; // not a JPEG } if (!segment.read() || segment.marker() != kAPP0) { return false; // not an APP0 segment } static const char kJfif[] = {'J', 'F', 'I', 'F', '\0'}; SkASSERT(segment.data()); if (SkToSizeT(segment.length()) < sizeof(kJfif) || 0 != memcmp(segment.data(), kJfif, sizeof(kJfif))) { return false; // Not JFIF JPEG } do { if (!segment.read()) { return false; // malformed JPEG } } while (!segment.isSOF()); if (segment.length() < 6) { return false; // SOF segment is short } if (8 != segment.data()[0]) { return false; // Only support 8-bit precision } int numberOfComponents = segment.data()[5]; if (numberOfComponents != 1 && numberOfComponents != 3) { return false; // Invalid JFIF } if (info) { info->fSize.set(JpegSegment::GetBigendianUint16(&segment.data()[3]), JpegSegment::GetBigendianUint16(&segment.data()[1])); if (numberOfComponents == 3) { info->fType = SkJFIFInfo::kYCbCr; } else { info->fType = SkJFIFInfo::kGrayscale; } } return true; }
DEF_TEST(color_half_float, reporter) { const int w = 100; const int h = 100; SkImageInfo info = SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType); SkAutoPixmapStorage pm; pm.alloc(info); REPORTER_ASSERT(reporter, pm.getSafeSize() == SkToSizeT(w * h * sizeof(uint64_t))); SkColor4f c4 { 1, 0.5f, 0.25f, 0.5f }; pm.erase(c4); SkPM4f origpm4 = c4.premul(); for (int y = 0; y < pm.height(); ++y) { for (int x = 0; x < pm.width(); ++x) { SkPM4f pm4 = SkPM4f::FromF16(pm.addrF16(x, y)); REPORTER_ASSERT(reporter, eq_within_half_float(origpm4, pm4)); } } }
static size_t pixel_count(const SkBitmap& bm) { return SkToSizeT(bm.width()) * SkToSizeT(bm.height()); }