DEF_TEST(HashSetCopyCounter, r) { SkTHashSet<CopyCounter, hash_copy_counter> set; uint32_t globalCounter = 0; CopyCounter copyCounter1(1, &globalCounter); CopyCounter copyCounter2(2, &globalCounter); REPORTER_ASSERT(r, globalCounter == 0); set.add(copyCounter1); REPORTER_ASSERT(r, globalCounter == 1); REPORTER_ASSERT(r, set.contains(copyCounter1)); REPORTER_ASSERT(r, globalCounter == 1); set.add(copyCounter1); // We allow copies for same-value adds for now. REPORTER_ASSERT(r, globalCounter == 2); set.add(copyCounter2); REPORTER_ASSERT(r, globalCounter == 3); REPORTER_ASSERT(r, set.contains(copyCounter1)); REPORTER_ASSERT(r, set.contains(copyCounter2)); REPORTER_ASSERT(r, globalCounter == 3); set.add(copyCounter1); set.add(copyCounter2); // We allow copies for same-value adds for now. REPORTER_ASSERT(r, globalCounter == 5); }
int main(int argc, char**argv) { #if 0 // TODO: use Mac main loop Display* display = XOpenDisplay(nullptr); Application* app = Application::Create(argc, argv, (void*)display); // Get the file descriptor for the X display int x11_fd = ConnectionNumber(display); fd_set in_fds; SkTHashSet<sk_app::Window_mac*> pendingWindows; bool done = false; while (!done) { // Create a file description set containing x11_fd FD_ZERO(&in_fds); FD_SET(x11_fd, &in_fds); // Set a sleep timer struct timeval tv; tv.tv_usec = 100; tv.tv_sec = 0; // Wait for an event on the file descriptor or for timer expiration (void) select(1, &in_fds, NULL, NULL, &tv); // Handle XEvents (if any) and flush the input XEvent event; while (XPending(display) && !done) { XNextEvent(display, &event); sk_app::Window_mac* win = sk_app::Window_mac::gWindowMap.find(event.xany.window); // paint and resize events get collapsed switch (event.type) { case Expose: win->markPendingPaint(); pendingWindows.add(win); break; case ConfigureNotify: win->markPendingResize(event.xconfigurerequest.width, event.xconfigurerequest.height); pendingWindows.add(win); break; default: if (win->handleEvent(event)) { done = true; } break; } } } delete app; XCloseDisplay(display); #endif return 0; }
void SkSVGDevice::AutoElement::addTextAttributes(const SkPaint& paint) { this->addAttribute("font-size", paint.getTextSize()); if (const char* textAlign = svg_text_align(paint.getTextAlign())) { this->addAttribute("text-anchor", textAlign); } SkString familyName; SkTHashSet<SkString> familySet; SkAutoTUnref<const SkTypeface> tface(paint.getTypeface() ? SkRef(paint.getTypeface()) : SkTypeface::RefDefault()); SkASSERT(tface); SkTypeface::Style style = tface->style(); if (style & SkTypeface::kItalic) { this->addAttribute("font-style", "italic"); } if (style & SkTypeface::kBold) { this->addAttribute("font-weight", "bold"); } SkAutoTUnref<SkTypeface::LocalizedStrings> familyNameIter(tface->createFamilyNameIterator()); SkTypeface::LocalizedString familyString; while (familyNameIter->next(&familyString)) { if (familySet.contains(familyString.fString)) { continue; } familySet.add(familyString.fString); familyName.appendf((familyName.isEmpty() ? "%s" : ", %s"), familyString.fString.c_str()); } if (!familyName.isEmpty()) { this->addAttribute("font-family", familyName); } }
void sniff(const void* ptr, size_t len) { SkMD5 md5; md5.write(ptr, len); SkMD5::Digest digest; md5.finish(digest); if (gSeen.contains(digest)) { return; } gSeen.add(digest); SkAutoTUnref<SkData> data(SkData::NewWithoutCopy(ptr, len)); SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data)); if (!codec) { // FIXME: This code is currently unreachable because we create an empty generator when // we fail to create a codec. SkDebugf("Codec could not be created for %s\n", skpName.c_str()); gSkpToUnknownCount[skpName]++; return; } SkString ext; switch (codec->getEncodedFormat()) { case SkEncodedFormat::kBMP_SkEncodedFormat: ext = "bmp"; break; case SkEncodedFormat::kGIF_SkEncodedFormat: ext = "gif"; break; case SkEncodedFormat::kICO_SkEncodedFormat: ext = "ico"; break; case SkEncodedFormat::kJPEG_SkEncodedFormat: ext = "jpg"; break; case SkEncodedFormat::kPNG_SkEncodedFormat: ext = "png"; break; case SkEncodedFormat::kDNG_SkEncodedFormat: ext = "dng"; break; case SkEncodedFormat::kWBMP_SkEncodedFormat: ext = "wbmp"; break; case SkEncodedFormat::kWEBP_SkEncodedFormat: ext = "webp"; break; default: // This should be unreachable because we cannot create a codec if we do not know // the image type. SkASSERT(false); } if (FLAGS_testDecode) { SkBitmap bitmap; SkImageInfo info = codec->getInfo().makeColorType(kN32_SkColorType); bitmap.allocPixels(info); if (SkCodec::kSuccess != codec->getPixels(info, bitmap.getPixels(), bitmap.rowBytes())) { SkDebugf("Decoding failed for %s\n", skpName.c_str()); gSkpToUnknownCount[skpName]++; return; } } if (FLAGS_writeImages) { SkString path; path.appendf("%s/%d.%s", gOutputDir, gKnown, ext.c_str()); SkFILEWStream file(path.c_str()); file.write(ptr, len); SkDebugf("%s\n", path.c_str()); } gKnown++; }
static void gather_uninteresting_hashes() { if (!FLAGS_uninterestingHashesFile.isEmpty()) { SkAutoTUnref<SkData> data(SkData::NewFromFileName(FLAGS_uninterestingHashesFile[0])); SkTArray<SkString> hashes; SkStrSplit((const char*)data->data(), "\n", &hashes); for (const SkString& hash : hashes) { gUninterestingHashes.add(hash); } } }
static void gather_uninteresting_hashes() { if (!FLAGS_uninterestingHashesFile.isEmpty()) { SkAutoTUnref<SkData> data(SkData::NewFromFileName(FLAGS_uninterestingHashesFile[0])); if (!data) { SkDebugf("WARNING: unable to read uninteresting hashes from %s\n", FLAGS_uninterestingHashesFile[0]); return; } SkTArray<SkString> hashes; SkStrSplit((const char*)data->data(), "\n", &hashes); for (const SkString& hash : hashes) { gUninterestingHashes.add(hash); } } }
static void gather_uninteresting_hashes() { if (!FLAGS_uninterestingHashesFile.isEmpty()) { SkAutoTUnref<SkData> data(SkData::NewFromFileName(FLAGS_uninterestingHashesFile[0])); if (!data) { info("WARNING: unable to read uninteresting hashes from %s\n", FLAGS_uninterestingHashesFile[0]); return; } SkTArray<SkString> hashes; SkStrSplit((const char*)data->data(), kNewline, &hashes); for (const SkString& hash : hashes) { gUninterestingHashes.add(hash); } info("FYI: loaded %d distinct uninteresting hashes from %d lines\n", gUninterestingHashes.count(), hashes.count()); } }
DEF_TEST(HashSet, r) { SkTHashSet<SkString> set; set.add(SkString("Hello")); set.add(SkString("World")); REPORTER_ASSERT(r, set.count() == 2); REPORTER_ASSERT(r, set.contains(SkString("Hello"))); REPORTER_ASSERT(r, set.contains(SkString("World"))); REPORTER_ASSERT(r, !set.contains(SkString("Goodbye"))); REPORTER_ASSERT(r, set.find(SkString("Hello"))); REPORTER_ASSERT(r, *set.find(SkString("Hello")) == SkString("Hello")); set.remove(SkString("Hello")); REPORTER_ASSERT(r, !set.contains(SkString("Hello"))); REPORTER_ASSERT(r, set.count() == 1); set.reset(); REPORTER_ASSERT(r, set.count() == 0); }
void sniff(const void* ptr, size_t len) { SkMD5 md5; md5.write(ptr, len); SkMD5::Digest digest; md5.finish(digest); if (gSeen.contains(digest)) { return; } gSeen.add(digest); SkAutoTUnref<SkData> data(SkData::NewWithoutCopy(ptr, len)); SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data)); if (!codec) { gUnknown++; return; } SkString ext; switch (codec->getEncodedFormat()) { case SkEncodedFormat::kBMP_SkEncodedFormat: ext = "bmp"; break; case SkEncodedFormat::kGIF_SkEncodedFormat: ext = "gif"; break; case SkEncodedFormat::kICO_SkEncodedFormat: ext = "ico"; break; case SkEncodedFormat::kJPEG_SkEncodedFormat: ext = "jpg"; break; case SkEncodedFormat::kPNG_SkEncodedFormat: ext = "png"; break; case SkEncodedFormat::kRAW_SkEncodedFormat: ext = "dng"; break; case SkEncodedFormat::kWBMP_SkEncodedFormat: ext = "wbmp"; break; case SkEncodedFormat::kWEBP_SkEncodedFormat: ext = "webp"; break; default: gUnknown++; return; } SkString path; path.appendf("%s/%d.%s", gOutputDir, gKnown++, ext.c_str()); SkFILEWStream file(path.c_str()); file.write(ptr, len); SkDebugf("%s\n", path.c_str()); }
static void add_gold(JsonWriter::BitmapResult r) { gGold.add(Gold(r.config, r.sourceType, r.sourceOptions, r.name, r.md5)); }
int main(int argc, char**argv) { Display* display = XOpenDisplay(nullptr); Application* app = Application::Create(argc, argv, (void*)display); // Get the file descriptor for the X display int x11_fd = ConnectionNumber(display); int count = x11_fd + 1; SkTHashSet<sk_app::Window_unix*> pendingWindows; bool done = false; while (!done) { // Create a file description set containing x11_fd fd_set in_fds; FD_ZERO(&in_fds); FD_SET(x11_fd, &in_fds); // Set a sleep timer struct timeval tv; tv.tv_usec = 100; tv.tv_sec = 0; while (!XPending(display)) { // Wait for an event on the file descriptor or for timer expiration (void) select(count, &in_fds, NULL, NULL, &tv); } // Handle XEvents (if any) and flush the input int count = XPending(display); while (count-- && !done) { XEvent event; XNextEvent(display, &event); sk_app::Window_unix* win = sk_app::Window_unix::gWindowMap.find(event.xany.window); // paint and resize events get collapsed switch (event.type) { case Expose: win->markPendingPaint(); pendingWindows.add(win); break; case ConfigureNotify: win->markPendingResize(event.xconfigurerequest.width, event.xconfigurerequest.height); pendingWindows.add(win); break; default: if (win->handleEvent(event)) { done = true; } break; } } pendingWindows.foreach(finishWindow); if (pendingWindows.count() > 0) { app->onIdle(); } pendingWindows.reset(); XFlush(display); } delete app; XCloseDisplay(display); return 0; }