void SkDiffContext::diffPatterns(const char baselinePattern[], const char testPattern[]) { // Get the files in the baseline and test patterns. Because they are in sorted order, it's easy // to find corresponding images by matching entry indices. SkTArray<SkString> baselineEntries; if (!glob_files(baselinePattern, &baselineEntries)) { SkDebugf("Unable to get pattern \"%s\"\n", baselinePattern); return; } SkTArray<SkString> testEntries; if (!glob_files(testPattern, &testEntries)) { SkDebugf("Unable to get pattern \"%s\"\n", testPattern); return; } if (baselineEntries.count() != testEntries.count()) { SkDebugf("Baseline and test patterns do not yield corresponding number of files\n"); return; } for (int entryIndex = 0; entryIndex < baselineEntries.count(); entryIndex++) { const char* baselineFilename = baselineEntries[entryIndex].c_str(); const char* testFilename = testEntries [entryIndex].c_str(); this->addDiff(baselineFilename, testFilename); } }
int handle(Request* request, MHD_Connection* connection, const char* url, const char* method, const char* upload_data, size_t* upload_data_size) override { SkTArray<SkString> commands; SkStrSplit(url, "/", &commands); if (!request->fPicture.get() || commands.count() > 3) { return MHD_NO; } // /cmd or /cmd/N or /cmd/N/[0|1] if (commands.count() == 1 && 0 == strcmp(method, MHD_HTTP_METHOD_GET)) { int n = request->fDebugCanvas->getSize() - 1; return SendJSON(connection, request->fDebugCanvas, n); } // /cmd/N, for now only delete supported if (commands.count() == 2 && 0 == strcmp(method, MHD_HTTP_METHOD_DELETE)) { int n; sscanf(commands[1].c_str(), "%d", &n); request->fDebugCanvas->deleteDrawCommandAt(n); return MHD_YES; } // /cmd/N/[0|1] if (commands.count() == 3 && 0 == strcmp(method, MHD_HTTP_METHOD_POST)) { int n, toggle; sscanf(commands[1].c_str(), "%d", &n); sscanf(commands[2].c_str(), "%d", &toggle); request->fDebugCanvas->toggleCommand(n, toggle); return MHD_YES; } return MHD_NO; }
void GrVkPipelineState::writeSamplers(GrVkGpu* gpu, const SkTArray<const GrTextureAccess*>& textureBindings, bool allowSRGBInputs) { SkASSERT(fNumSamplers == textureBindings.count()); for (int i = 0; i < textureBindings.count(); ++i) { const GrTextureParams& params = textureBindings[i]->getParams(); GrVkTexture* texture = static_cast<GrVkTexture*>(textureBindings[i]->getTexture()); if (GrTextureParams::kMipMap_FilterMode == params.filterMode()) { if (texture->texturePriv().mipMapsAreDirty()) { gpu->generateMipmap(texture); texture->texturePriv().dirtyMipMaps(false); } } fSamplers.push(gpu->resourceProvider().findOrCreateCompatibleSampler(params, texture->texturePriv().maxMipMapLevel())); const GrVkResource* textureResource = texture->resource(); textureResource->ref(); fTextures.push(textureResource); const GrVkImageView* textureView = texture->textureView(allowSRGBInputs); textureView->ref(); fTextureViews.push(textureView); // Change texture layout so it can be read in shader texture->setImageLayout(gpu, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_SHADER_READ_BIT, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, false); VkDescriptorImageInfo imageInfo; memset(&imageInfo, 0, sizeof(VkDescriptorImageInfo)); imageInfo.sampler = fSamplers[i]->sampler(); imageInfo.imageView = textureView->imageView(); imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; VkWriteDescriptorSet writeInfo; memset(&writeInfo, 0, sizeof(VkWriteDescriptorSet)); writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; writeInfo.pNext = nullptr; writeInfo.dstSet = fDescriptorSets[GrVkUniformHandler::kSamplerDescSet]; writeInfo.dstBinding = i; writeInfo.dstArrayElement = 0; writeInfo.descriptorCount = 1; writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; writeInfo.pImageInfo = &imageInfo; writeInfo.pBufferInfo = nullptr; writeInfo.pTexelBufferView = nullptr; GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(), 1, &writeInfo, 0, nullptr)); } }
void CubicToQuads(const SkDCubic& cubic, double precision, SkTArray<SkDQuad, true>& quads) { SkTArray<double, true> ts; toQuadraticTs(&cubic, precision, &ts); if (ts.count() <= 0) { SkDQuad quad = cubic.toQuad(); quads.push_back(quad); return; } double tStart = 0; for (int i1 = 0; i1 <= ts.count(); ++i1) { const double tEnd = i1 < ts.count() ? ts[i1] : 1; SkDRect bounds; bounds.setBounds(cubic); SkDCubic part = cubic.subDivide(tStart, tEnd); SkDQuad quad = part.toQuad(); if (quad[1].fX < bounds.fLeft) { quad[1].fX = bounds.fLeft; } else if (quad[1].fX > bounds.fRight) { quad[1].fX = bounds.fRight; } if (quad[1].fY < bounds.fTop) { quad[1].fY = bounds.fTop; } else if (quad[1].fY > bounds.fBottom) { quad[1].fY = bounds.fBottom; } quads.push_back(quad); tStart = tEnd; } }
int tool_main(int argc, char** argv) { SetupCrashHandler(); SkAutoGraphics ag; SkCommandLineFlags::Parse(argc, argv); if (FLAGS_dryRun) { FLAGS_verbose = true; } #if SK_ENABLE_INST_COUNT gPrintInstCount = FLAGS_leaks; #endif SkTArray<SkString> configs; for (int i = 0; i < FLAGS_config.count(); i++) { SkStrSplit(FLAGS_config[i], ", ", &configs); } SkTDArray<GMRegistry::Factory> gms; SkAutoTDelete<DM::Expectations> expectations(SkNEW(DM::NoExpectations)); if (FLAGS_gms) { append_matching_factories<GM>(GMRegistry::Head(), &gms); if (FLAGS_expectations.count() > 0) { const char* path = FLAGS_expectations[0]; if (sk_isdir(path)) { expectations.reset(SkNEW_ARGS(DM::WriteTask::Expectations, (path))); } else { expectations.reset(SkNEW_ARGS(DM::JsonExpectations, (path))); } } } SkTDArray<BenchRegistry::Factory> benches; if (FLAGS_benches) { append_matching_factories<Benchmark>(BenchRegistry::Head(), &benches); } SkTDArray<TestRegistry::Factory> tests; if (FLAGS_tests) { append_matching_factories<Test>(TestRegistry::Head(), &tests); } SkDebugf("(%d GMs, %d benches) x %d configs, %d tests\n", gms.count(), benches.count(), configs.count(), tests.count()); DM::Reporter reporter; DM::TaskRunner tasks(FLAGS_threads, FLAGS_gpuThreads); kick_off_gms(gms, configs, *expectations, &reporter, &tasks); kick_off_benches(benches, configs, &reporter, &tasks); kick_off_tests(tests, &reporter, &tasks); kick_off_skps(&reporter, &tasks); tasks.wait(); SkDebugf("\n"); SkTArray<SkString> failures; reporter.getFailures(&failures); report_failures(failures); return failures.count() > 0; }
void JsonWriter::DumpJson() { if (FLAGS_writePath.isEmpty()) { return; } Json::Value root; for (int i = 1; i < FLAGS_properties.count(); i += 2) { root[FLAGS_properties[i-1]] = FLAGS_properties[i]; } for (int i = 1; i < FLAGS_key.count(); i += 2) { root["key"][FLAGS_key[i-1]] = FLAGS_key[i]; } { SkAutoMutexAcquire lock(&gBitmapResultLock); for (int i = 0; i < gBitmapResults.count(); i++) { Json::Value result; result["key"]["name"] = gBitmapResults[i].name.c_str(); result["key"]["config"] = gBitmapResults[i].config.c_str(); result["key"]["source_type"] = gBitmapResults[i].sourceType.c_str(); result["options"]["ext"] = gBitmapResults[i].ext.c_str(); result["options"]["gamma_correct"] = gBitmapResults[i].gammaCorrect ? "yes" : "no"; result["md5"] = gBitmapResults[i].md5.c_str(); // Source options only need to be part of the key if they exist. // Source type by source type, we either always set options or never set options. if (!gBitmapResults[i].sourceOptions.isEmpty()) { result["key"]["source_options"] = gBitmapResults[i].sourceOptions.c_str(); } root["results"].append(result); } } { SkAutoMutexAcquire lock(gFailureLock); for (int i = 0; i < gFailures.count(); i++) { Json::Value result; result["file_name"] = gFailures[i].fileName; result["line_no"] = gFailures[i].lineNo; result["condition"] = gFailures[i].condition; result["message"] = gFailures[i].message.c_str(); root["test_results"]["failures"].append(result); } } int maxResidentSetSizeMB = sk_tools::getMaxResidentSetSizeMB(); if (maxResidentSetSizeMB != -1) { root["max_rss_MB"] = sk_tools::getMaxResidentSetSizeMB(); } SkString path = SkOSPath::Join(FLAGS_writePath[0], "dm.json"); sk_mkdir(FLAGS_writePath[0]); SkFILEWStream stream(path.c_str()); stream.writeText(Json::StyledWriter().write(root).c_str()); stream.flush(); }
// return root node. static sk_sp<SkPDFDict> generate_page_tree(SkTArray<sk_sp<SkPDFDict>>* pages) { // PDF wants a tree describing all the pages in the document. We arbitrary // choose 8 (kNodeSize) as the number of allowed children. The internal // nodes have type "Pages" with an array of children, a parent pointer, and // the number of leaves below the node as "Count." The leaves are passed // into the method, have type "Page" and need a parent pointer. This method // builds the tree bottom up, skipping internal nodes that would have only // one child. static const int kNodeSize = 8; // curNodes takes a reference to its items, which it passes to pageTree. int totalPageCount = pages->count(); SkTArray<sk_sp<SkPDFDict>> curNodes; curNodes.swap(pages); // nextRoundNodes passes its references to nodes on to curNodes. int treeCapacity = kNodeSize; do { SkTArray<sk_sp<SkPDFDict>> nextRoundNodes; for (int i = 0; i < curNodes.count(); ) { if (i > 0 && i + 1 == curNodes.count()) { SkASSERT(curNodes[i]); nextRoundNodes.emplace_back(std::move(curNodes[i])); break; } auto newNode = sk_make_sp<SkPDFDict>("Pages"); auto kids = sk_make_sp<SkPDFArray>(); kids->reserve(kNodeSize); int count = 0; for (; i < curNodes.count() && count < kNodeSize; i++, count++) { SkASSERT(curNodes[i]); curNodes[i]->insertObjRef("Parent", newNode); kids->appendObjRef(std::move(curNodes[i])); } // treeCapacity is the number of leaf nodes possible for the // current set of subtrees being generated. (i.e. 8, 64, 512, ...). // It is hard to count the number of leaf nodes in the current // subtree. However, by construction, we know that unless it's the // last subtree for the current depth, the leaf count will be // treeCapacity, otherwise it's what ever is left over after // consuming treeCapacity chunks. int pageCount = treeCapacity; if (i == curNodes.count()) { pageCount = ((totalPageCount - 1) % treeCapacity) + 1; } newNode->insertInt("Count", pageCount); newNode->insertObject("Kids", std::move(kids)); nextRoundNodes.emplace_back(std::move(newNode)); } SkDEBUGCODE( for (const auto& n : curNodes) { SkASSERT(!n); } ); curNodes.swap(&nextRoundNodes); nextRoundNodes.reset(); treeCapacity *= kNodeSize; } while (curNodes.count() > 1);
void GrVkProgram::writeSamplers(const GrVkGpu* gpu, const SkTArray<const GrTextureAccess*>& textureBindings) { SkASSERT(fNumSamplers == textureBindings.count()); for (int i = 0; i < textureBindings.count(); ++i) { fSamplers.push(GrVkSampler::Create(gpu, *textureBindings[i])); GrVkTexture* texture = static_cast<GrVkTexture*>(textureBindings[i]->getTexture()); const GrVkImage::Resource* textureResource = texture->resource(); textureResource->ref(); fTextures.push(textureResource); const GrVkImageView* textureView = texture->textureView(); textureView->ref(); fTextureViews.push(textureView); // Change texture layout so it can be read in shader VkImageLayout layout = texture->currentLayout(); VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(layout); VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT; VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout); VkAccessFlags dstAccessMask = VK_ACCESS_SHADER_READ_BIT; texture->setImageLayout(gpu, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, srcAccessMask, dstAccessMask, srcStageMask, dstStageMask, false); VkDescriptorImageInfo imageInfo; memset(&imageInfo, 0, sizeof(VkDescriptorImageInfo)); imageInfo.sampler = fSamplers[i]->sampler(); imageInfo.imageView = texture->textureView()->imageView(); imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; VkWriteDescriptorSet writeInfo; memset(&writeInfo, 0, sizeof(VkWriteDescriptorSet)); writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; writeInfo.pNext = nullptr; writeInfo.dstSet = fDescriptorSets[GrVkUniformHandler::kSamplerDescSet]; writeInfo.dstBinding = i; writeInfo.dstArrayElement = 0; writeInfo.descriptorCount = 1; writeInfo.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; writeInfo.pImageInfo = &imageInfo; writeInfo.pBufferInfo = nullptr; writeInfo.pTexelBufferView = nullptr; GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(), 1, &writeInfo, 0, nullptr)); } }
void onDraw(SkCanvas* canvas) override { // This GM exists to test a specific feature of the GPU backend. It does not work with the // sw rasterizer, tile modes, etc. if (nullptr == canvas->getGrContext()) { skiagm::GM::DrawGpuOnlyMessage(canvas); return; } SkPaint paint; SkTArray<SkMatrix> devMats; devMats.push_back().reset(); devMats.push_back().setRotate(45, 500, 500); devMats.push_back().setRotate(-30, 200, 200); devMats.back().setPerspX(-SK_Scalar1 / 2000); devMats.back().setPerspY(SK_Scalar1 / 1000); SkTArray<SkMatrix> viewMats; viewMats.push_back().setScale(0.75f, 0.75f); viewMats.push_back().setRotate(45, 50, 50); viewMats.back().postScale(0.5f, 1.1f); canvas->translate(10, 20); canvas->save(); SkScalar tx = 0, maxTy = 0; static const SkScalar kW = 900; for (int aa = 0; aa < 2; ++aa) { for (int i = 0; i < fPrims.count(); ++i) { for (int j = 0; j < devMats.count(); ++j) { for (int k = 0; k < viewMats.count(); ++k) { paint.setShader(new DCShader(devMats[j]))->unref(); paint.setAntiAlias(SkToBool(aa)); canvas->save(); canvas->concat(viewMats[k]); SkRect bounds = fPrims[i]->draw(canvas, paint); canvas->restore(); viewMats[k].mapRect(&bounds); // add margins bounds.fRight += 20; bounds.fBottom += 20; canvas->translate(bounds.fRight, 0); tx += bounds.fRight; maxTy = SkTMax(bounds.fBottom, maxTy); if (tx > kW) { tx = 0; canvas->restore(); canvas->translate(0, maxTy); canvas->save(); maxTy = 0; } } } } } canvas->restore(); }
int dm_main() { SetupCrashHandler(); SkAutoGraphics ag; SkTaskGroup::Enabler enabled(FLAGS_threads); if (FLAGS_dryRun || FLAGS_veryVerbose) { FLAGS_verbose = true; } #if SK_ENABLE_INST_COUNT gPrintInstCount = FLAGS_leaks; #endif SkTArray<SkString> configs; for (int i = 0; i < FLAGS_config.count(); i++) { SkStrSplit(FLAGS_config[i], ", ", &configs); } GrGLStandard gpuAPI = get_gl_standard(); SkTDArray<GMRegistry::Factory> gms; if (FLAGS_gms) { append_matching_factories<GM>(GMRegistry::Head(), &gms); } SkTDArray<TestRegistry::Factory> tests; if (FLAGS_tests) { append_matching_factories<Test>(TestRegistry::Head(), &tests); } SkTArray<SkString> skps; find_skps(&skps); SkDebugf("%d GMs x %d configs, %d tests, %d pictures\n", gms.count(), configs.count(), tests.count(), skps.count()); DM::Reporter reporter; DM::TaskRunner tasks; kick_off_tests(tests, &reporter, &tasks); kick_off_gms(gms, configs, gpuAPI, &reporter, &tasks); kick_off_skps(skps, &reporter, &tasks); tasks.wait(); DM::JsonWriter::DumpJson(); SkDebugf("\n"); #ifdef SK_DEBUG if (FLAGS_portableFonts && FLAGS_reportUsedChars) { sk_tool_utils::report_used_chars(); } #endif SkTArray<SkString> failures; reporter.getFailures(&failures); report_failures(failures); return failures.count() > 0; }
SkCommandLineConfigGpu* parse_command_line_config_gpu(const SkString& tag, const SkTArray<SkString>& vias, const SkString& options) { // Defaults for GPU backend. bool seenAPI = false; SkCommandLineConfigGpu::ContextType contextType = GrContextFactory::kNativeGL_ContextType; bool seenUseNVPR = false; bool useNVPR = false; bool seenUseInstanced = false; bool useInstanced = false; bool seenUseDIText =false; bool useDIText = false; bool seenSamples = false; int samples = 0; bool seenColor = false; SkColorType colorType = kN32_SkColorType; sk_sp<SkColorSpace> colorSpace = nullptr; SkTArray<SkString> optionParts; SkStrSplit(options.c_str(), ",", kStrict_SkStrSplitMode, &optionParts); for (int i = 0; i < optionParts.count(); ++i) { SkTArray<SkString> keyValueParts; SkStrSplit(optionParts[i].c_str(), "=", kStrict_SkStrSplitMode, &keyValueParts); if (keyValueParts.count() != 2) { return nullptr; } const SkString& key = keyValueParts[0]; const SkString& value = keyValueParts[1]; bool valueOk = false; if (key.equals("api") && !seenAPI) { valueOk = parse_option_gpu_api(value, &contextType); seenAPI = true; } else if (key.equals("nvpr") && !seenUseNVPR) { valueOk = parse_option_bool(value, &useNVPR); seenUseNVPR = true; } else if (key.equals("inst") && !seenUseInstanced) { valueOk = parse_option_bool(value, &useInstanced); seenUseInstanced = true; } else if (key.equals("dit") && !seenUseDIText) { valueOk = parse_option_bool(value, &useDIText); seenUseDIText = true; } else if (key.equals("samples") && !seenSamples) { valueOk = parse_option_int(value, &samples); seenSamples = true; } else if (key.equals("color") && !seenColor) { valueOk = parse_option_gpu_color(value, &colorType, &colorSpace); seenColor = true; } if (!valueOk) { return nullptr; } } return new SkCommandLineConfigGpu(tag, vias, contextType, useNVPR, useInstanced, useDIText, samples, colorType, colorSpace); }
static int find_or_append(SkTArray<sk_sp<T>>& array, T* obj) { for (int i = 0; i < array.count(); i++) { if (equals(array[i].get(), obj)) { return i; } } array.push_back(sk_ref_sp(obj)); return array.count() - 1; }
static void report_failures(const SkTArray<SkString>& failures) { if (failures.count() == 0) { return; } SkDebugf("Failures:\n"); for (int i = 0; i < failures.count(); i++) { SkDebugf(" %s\n", failures[i].c_str()); } SkDebugf("%d failures.\n", failures.count()); }
static void test_self_assignment(skiatest::Reporter* reporter) { SkTArray<int> a; a.push_back(1); REPORTER_ASSERT(reporter, !a.empty()); REPORTER_ASSERT(reporter, a.count() == 1); REPORTER_ASSERT(reporter, a[0] == 1); a = static_cast<decltype(a)&>(a); REPORTER_ASSERT(reporter, !a.empty()); REPORTER_ASSERT(reporter, a.count() == 1); REPORTER_ASSERT(reporter, a[0] == 1); }
static void print_status() { int curr = sk_tools::getCurrResidentSetSizeMB(), peak = sk_tools::getMaxResidentSetSizeMB(); SkString elapsed = HumanizeMs(SkTime::GetMSecs() - kStartMs); SkAutoMutexAcquire lock(gMutex); info("\n%s elapsed, %d active, %d queued, %dMB RAM, %dMB peak\n", elapsed.c_str(), gRunning.count(), gPending - gRunning.count(), curr, peak); for (auto& task : gRunning) { info("\t%s\n", task.c_str()); } }
static void report_failures(const DM::Reporter& reporter) { SkTArray<SkString> failures; reporter.getFailures(&failures); if (failures.count() == 0) { return; } SkDebugf("Failures:\n"); for (int i = 0; i < failures.count(); i++) { SkDebugf(" %s\n", failures[i].c_str()); } }
void SkOpContour::debugShowWindingValues(const SkTArray<SkOpContour*, true>& contourList) { // int ofInterest = 1 << 1 | 1 << 5 | 1 << 9 | 1 << 13; // int ofInterest = 1 << 4 | 1 << 8 | 1 << 12 | 1 << 16; int ofInterest = 1 << 5 | 1 << 8; int total = 0; int index; for (index = 0; index < contourList.count(); ++index) { total += contourList[index]->segments().count(); } int sum = 0; for (index = 0; index < contourList.count(); ++index) { sum += contourList[index]->debugShowWindingValues(total, ofInterest); } // SkDebugf("%s total=%d\n", __FUNCTION__, sum); }
DEF_TEST(GrGLSLPrettyPrint, r) { SkTArray<const char*> testStr; SkTArray<int> lengths; testStr.push_back(input1.c_str()); lengths.push_back((int)input1.size()); testStr.push_back(input2.c_str()); lengths.push_back((int)input2.size()); testStr.push_back(input3.c_str()); lengths.push_back((int)input3.size()); testStr.push_back(input4.c_str()); lengths.push_back((int)input4.size()); testStr.push_back(input5.c_str()); lengths.push_back((int)input5.size()); testStr.push_back(input6.c_str()); lengths.push_back((int)input6.size()); SkString test = GrGLSLPrettyPrint::PrettyPrintGLSL(testStr.begin(), lengths.begin(), testStr.count(), true); ASSERT(output1 == test); testStr.reset(); lengths.reset(); testStr.push_back(neg1.c_str()); lengths.push_back((int)neg1.size()); testStr.push_back(neg2.c_str()); lengths.push_back((int)neg2.size()); testStr.push_back(neg3.c_str()); lengths.push_back((int)neg3.size()); // Just test we don't crash with garbage input ASSERT(GrGLSLPrettyPrint::PrettyPrintGLSL(testStr.begin(), lengths.begin(), 1, true).c_str() != NULL); }
static sk_sp<SkTypeface_AndroidSystem> find_family_style_character( const SkTArray<NameToFamily, true>& fallbackNameToFamilyMap, const SkFontStyle& style, bool elegant, const SkString& langTag, SkUnichar character) { for (int i = 0; i < fallbackNameToFamilyMap.count(); ++i) { SkFontStyleSet_Android* family = fallbackNameToFamilyMap[i].styleSet; sk_sp<SkTypeface_AndroidSystem> face(family->matchStyle(style)); if (!langTag.isEmpty() && !face->fLang.getTag().startsWith(langTag.c_str())) { continue; } if (SkToBool(face->fVariantStyle & kElegant_FontVariant) != elegant) { continue; } SkPaint paint; paint.setTypeface(face); paint.setTextEncoding(SkPaint::kUTF32_TextEncoding); uint16_t glyphID; paint.textToGlyphs(&character, sizeof(character), &glyphID); if (glyphID != 0) { return face; } } return nullptr; }
static bool gather_sinks() { SkCommandLineConfigArray configs; ParseConfigs(FLAGS_config, &configs); for (int i = 0; i < configs.count(); i++) { const SkCommandLineConfig& config = *configs[i]; Sink* sink = create_sink(&config); if (sink == nullptr) { info("Skipping config %s: Don't understand '%s'.\n", config.getTag().c_str(), config.getTag().c_str()); continue; } const SkTArray<SkString>& parts = config.getViaParts(); for (int j = parts.count(); j-- > 0;) { const SkString& part = parts[j]; Sink* next = create_via(part, sink); if (next == nullptr) { info("Skipping config %s: Don't understand '%s'.\n", config.getTag().c_str(), part.c_str()); delete sink; sink = nullptr; break; } sink = next; } if (sink) { push_sink(config, sink); } } // If no configs were requested (just running tests, perhaps?), then we're okay. // Otherwise, make sure that at least one sink was constructed correctly. This catches // the case of bots without a GPU being assigned GPU configs. return (configs.count() == 0) || (gSinks.count() > 0); }
DEF_TEST(GrAllocator, reporter) { // Test combinations of allocators with and without stack storage and with different block // sizes. SkTArray<GrTAllocator<C>*> allocators; GrTAllocator<C> a1(1); allocators.push_back(&a1); GrTAllocator<C> a2(2); allocators.push_back(&a2); GrTAllocator<C> a5(5); allocators.push_back(&a5); GrSTAllocator<1, C> sa1; allocators.push_back(&a1); GrSTAllocator<3, C> sa3; allocators.push_back(&sa3); GrSTAllocator<4, C> sa4; allocators.push_back(&sa4); for (int i = 0; i < allocators.count(); ++i) { check_allocator(allocators[i], 0, 0, reporter); check_allocator(allocators[i], 1, 1, reporter); check_allocator(allocators[i], 2, 2, reporter); check_allocator(allocators[i], 10, 1, reporter); check_allocator(allocators[i], 10, 5, reporter); check_allocator(allocators[i], 10, 10, reporter); check_allocator(allocators[i], 100, 10, reporter); } }
static void kick_off_benches(const SkTDArray<BenchRegistry::Factory>& benches, const SkTArray<SkString>& configs, DM::Reporter* reporter, DM::TaskRunner* tasks) { #define START(name, type, ...) \ if (lowercase(configs[j]).equals(name)) { \ tasks->add(SkNEW_ARGS(DM::type, (name, reporter, tasks, benches[i], ## __VA_ARGS__))); \ } for (int i = 0; i < benches.count(); i++) { for (int j = 0; j < configs.count(); j++) { START("nonrendering", NonRenderingBenchTask); START("565", CpuBenchTask, kRGB_565_SkColorType); START("8888", CpuBenchTask, kN32_SkColorType); START("gpu", GpuBenchTask, native, 0); START("msaa4", GpuBenchTask, native, 4); START("msaa16", GpuBenchTask, native, 16); START("nvprmsaa4", GpuBenchTask, nvpr, 4); START("nvprmsaa16", GpuBenchTask, nvpr, 16); START("gpunull", GpuBenchTask, null, 0); START("gpudebug", GpuBenchTask, debug, 0); START("angle", GpuBenchTask, angle, 0); START("mesa", GpuBenchTask, mesa, 0); } } #undef START }
static void handle_cmd(struct android_app* app, int32_t cmd) { struct VisualBenchState* state = (struct VisualBenchState*)app->userData; switch (cmd) { case APP_CMD_INIT_WINDOW: // The window is being shown, get it ready. if (state->fApp->window != nullptr && kInit_State == state->fState) { // drain any events that occurred before |window| was assigned. while (SkEvent::ProcessEvent()); // Start normal Skia sequence application_init(); SkTArray<const char*> args; args.push_back("VisualBench"); for (int i = 0; i < state->fFlags.count(); i++) { SkDebugf(state->fFlags[i].c_str()); args.push_back(state->fFlags[i].c_str()); } state->fWindow = create_sk_window((void*)state->fApp->window, args.count(), const_cast<char**>(args.begin())); state->fWindow->forceInvalAll(); state->fState = kAnimate_State; } break; case APP_CMD_TERM_WINDOW: state->fState = kDestroyRequested_State; break; } }
void SkResourceCache::checkMessages() { SkTArray<PurgeSharedIDMessage> msgs; fPurgeSharedIDInbox.poll(&msgs); for (int i = 0; i < msgs.count(); ++i) { this->purgeSharedID(msgs[i].fSharedID); } }
void SkInternalAtlasTextTarget::flush() { for (int i = 0; i < fOps.count(); ++i) { fOps[i]->executeForTextTarget(this); } this->context()->internal().flush(); this->deleteOps(); }
static void kick_off_gms(const SkTDArray<GMRegistry::Factory>& gms, const SkTArray<SkString>& configs, GrGLStandard gpuAPI, const DM::Expectations& expectations, DM::Reporter* reporter, DM::TaskRunner* tasks) { #define START(name, type, ...) \ if (lowercase(configs[j]).equals(name)) { \ tasks->add(SkNEW_ARGS(DM::type, (name, reporter, tasks, gms[i], ## __VA_ARGS__))); \ } for (int i = 0; i < gms.count(); i++) { for (int j = 0; j < configs.count(); j++) { START("565", CpuGMTask, expectations, kRGB_565_SkColorType); START("8888", CpuGMTask, expectations, kN32_SkColorType); START("gpu", GpuGMTask, expectations, native, gpuAPI, 0); START("msaa4", GpuGMTask, expectations, native, gpuAPI, 4); START("msaa16", GpuGMTask, expectations, native, gpuAPI, 16); START("nvprmsaa4", GpuGMTask, expectations, nvpr, gpuAPI, 4); START("nvprmsaa16", GpuGMTask, expectations, nvpr, gpuAPI, 16); START("gpunull", GpuGMTask, expectations, null, gpuAPI, 0); START("gpudebug", GpuGMTask, expectations, debug, gpuAPI, 0); START("angle", GpuGMTask, expectations, angle, gpuAPI, 0); START("mesa", GpuGMTask, expectations, mesa, gpuAPI, 0); START("pdf", PDFTask, RASTERIZE_PDF_PROC); } } #undef START }
void WriteTask::DumpJson() { if (FLAGS_writePath.isEmpty()) { return; } Json::Value root; for (int i = 1; i < FLAGS_properties.count(); i += 2) { root[FLAGS_properties[i-1]] = FLAGS_properties[i]; } for (int i = 1; i < FLAGS_key.count(); i += 2) { root["key"][FLAGS_key[i-1]] = FLAGS_key[i]; } { SkAutoMutexAcquire lock(&gJsonDataLock); for (int i = 0; i < gJsonData.count(); i++) { Json::Value result; result["key"]["name"] = gJsonData[i].name.c_str(); result["key"]["config"] = gJsonData[i].config.c_str(); result["key"]["mode"] = gJsonData[i].mode.c_str(); result["options"]["source_type"] = gJsonData[i].sourceType.c_str(); result["md5"] = gJsonData[i].md5.c_str(); root["results"].append(result); } } SkString path = SkOSPath::Join(FLAGS_writePath[0], "dm.json"); SkFILEWStream stream(path.c_str()); stream.writeText(Json::StyledWriter().write(root).c_str()); stream.flush(); }
int FindOrAdd(IDWriteFontFileLoader* fontFileLoader, const void* refKey, UINT32 refKeySize) const { SkTScopedComPtr<IUnknown> fontFileLoaderId; HR_GENERAL(fontFileLoader->QueryInterface(&fontFileLoaderId), "Failed to re-convert to IDWriteFontFileLoader.", SkFontIdentity::kInvalidDataId); SkAutoMutexAcquire ama(fDataIdCacheMutex); int count = fDataIdCache.count(); int i; for (i = 0; i < count; ++i) { const DataId& current = fDataIdCache[i]; if (fontFileLoaderId.get() == current.fLoader && refKeySize == current.fKeySize && 0 == memcmp(refKey, current.fKey, refKeySize)) { return i; } } DataId& added = fDataIdCache.push_back(); added.fLoader = fontFileLoaderId.release(); // Ref is passed. added.fKey = sk_malloc_throw(refKeySize); memcpy(added.fKey, refKey, refKeySize); added.fKeySize = refKeySize; return i; }
void CubicToQuads(const SkDCubic& cubic, double precision, SkTArray<SkDQuad, true>& quads) { SkTArray<double, true> ts; toQuadraticTs(&cubic, precision, &ts); if (ts.count() <= 0) { SkDQuad quad = cubic.toQuad(); quads.push_back(quad); return; } double tStart = 0; for (int i1 = 0; i1 <= ts.count(); ++i1) { const double tEnd = i1 < ts.count() ? ts[i1] : 1; SkDCubic part = cubic.subDivide(tStart, tEnd); SkDQuad quad = part.toQuad(); quads.push_back(quad); tStart = tEnd; } }
void SkInternalAtlasTextTarget::deleteOps() { for (int i = 0; i < fOps.count(); ++i) { if (fOps[i]) { fOpMemoryPool->release(std::move(fOps[i])); } } fOps.reset(); }