SkString onShortName() override { return SkString("alphagradients"); }
SkPDFName::SkPDFName(const char name[]) : fValue(FormatName(SkString(name))) {}
virtual SkString onShortName() { return SkString("arithmode"); }
SkString onShortName() override { return SkString("ovals"); }
static GM* MyFactory(void*) { return new ShaderBoundsGM(MakeLinear, SkString("shaderbounds_linear")); }
SkString onShortName() override { return SkString("emboss"); }
SkString onShortName() { return SkString("dashing--71"); }
SkString onShortName() override { return SkString("aaclip"); }
virtual SkString onShortName() { return SkString("path-reverse"); }
SkString PipePictureRenderer::getConfigNameInternal() { return SkString("pipe"); }
SkString SimplePictureRenderer::getConfigNameInternal() { return SkString("simple"); }
SkString RecordPictureRenderer::getConfigNameInternal() { return SkString("record"); }
void GrGLDisplacementMapEffect::emitCode(EmitArgs& args) { const GrTextureDomain& domain = args.fFp.cast<GrDisplacementMapEffect>().domain(); fScaleUni = args.fUniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility, kVec2f_GrSLType, kDefault_GrSLPrecision, "Scale"); const char* scaleUni = args.fUniformHandler->getUniformCStr(fScaleUni); const char* dColor = "dColor"; const char* cCoords = "cCoords"; const char* nearZero = "1e-6"; // Since 6.10352e−5 is the smallest half float, use // a number smaller than that to approximate 0, but // leave room for 32-bit float GPU rounding errors. GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; fragBuilder->codeAppendf("\t\tvec4 %s = ", dColor); fragBuilder->appendTextureLookup(args.fSamplers[0], args.fCoords[0].c_str(), args.fCoords[0].getType()); fragBuilder->codeAppend(";\n"); // Unpremultiply the displacement fragBuilder->codeAppendf( "\t\t%s.rgb = (%s.a < %s) ? vec3(0.0) : clamp(%s.rgb / %s.a, 0.0, 1.0);", dColor, dColor, nearZero, dColor, dColor); SkString coords2D = fragBuilder->ensureFSCoords2D(args.fCoords, 1); fragBuilder->codeAppendf("\t\tvec2 %s = %s + %s*(%s.", cCoords, coords2D.c_str(), scaleUni, dColor); switch (fXChannelSelector) { case SkDisplacementMapEffect::kR_ChannelSelectorType: fragBuilder->codeAppend("r"); break; case SkDisplacementMapEffect::kG_ChannelSelectorType: fragBuilder->codeAppend("g"); break; case SkDisplacementMapEffect::kB_ChannelSelectorType: fragBuilder->codeAppend("b"); break; case SkDisplacementMapEffect::kA_ChannelSelectorType: fragBuilder->codeAppend("a"); break; case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: default: SkDEBUGFAIL("Unknown X channel selector"); } switch (fYChannelSelector) { case SkDisplacementMapEffect::kR_ChannelSelectorType: fragBuilder->codeAppend("r"); break; case SkDisplacementMapEffect::kG_ChannelSelectorType: fragBuilder->codeAppend("g"); break; case SkDisplacementMapEffect::kB_ChannelSelectorType: fragBuilder->codeAppend("b"); break; case SkDisplacementMapEffect::kA_ChannelSelectorType: fragBuilder->codeAppend("a"); break; case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: default: SkDEBUGFAIL("Unknown Y channel selector"); } fragBuilder->codeAppend("-vec2(0.5));\t\t"); fGLDomain.sampleTexture(fragBuilder, args.fUniformHandler, args.fGLSLCaps, domain, args.fOutputColor, SkString(cCoords), args.fSamplers[1]); fragBuilder->codeAppend(";\n"); }
virtual SkString onShortName() { return SkString("matrixconvolution"); }
virtual SkString onShortName() { return SkString("imagefiltersgraph"); }
SkString onShortName() override { return SkString("avoidxfermode3"); }
void AnimationBuilder::parseFonts(const skjson::ObjectValue* jfonts, const skjson::ArrayValue* jchars) { // Optional array of font entries, referenced (by name) from text layer document nodes. E.g. // "fonts": { // "list": [ // { // "ascent": 75, // "fClass": "", // "fFamily": "Roboto", // "fName": "Roboto-Regular", // "fPath": "https://fonts.googleapis.com/css?family=Roboto", // "fPath": "", // "fStyle": "Regular", // "fWeight": "", // "origin": 1 // } // ] // }, if (jfonts) { if (const skjson::ArrayValue* jlist = (*jfonts)["list"]) { for (const skjson::ObjectValue* jfont : *jlist) { if (!jfont) { continue; } const skjson::StringValue* jname = (*jfont)["fName"]; const skjson::StringValue* jfamily = (*jfont)["fFamily"]; const skjson::StringValue* jstyle = (*jfont)["fStyle"]; const skjson::StringValue* jpath = (*jfont)["fPath"]; if (!jname || !jname->size() || !jfamily || !jfamily->size() || !jstyle || !jstyle->size()) { this->log(Logger::Level::kError, jfont, "Invalid font."); continue; } const auto& fmgr = fLazyFontMgr.get(); // Typeface fallback order: // 1) externally-loaded font (provided by the embedder) // 2) system font (family/style) // 3) system default sk_sp<SkTypeface> tf = fmgr->makeFromData(fResourceProvider->loadFont(jname->begin(), jpath ? jpath->begin() : nullptr)); if (!tf) { tf.reset(fmgr->matchFamilyStyle(jfamily->begin(), FontStyle(this, jstyle->begin()))); } if (!tf) { this->log(Logger::Level::kError, nullptr, "Could not create typeface for %s|%s.", jfamily->begin(), jstyle->begin()); // Last resort. tf = fmgr->legacyMakeTypeface(nullptr, FontStyle(this, jstyle->begin())); if (!tf) { continue; } } fFonts.set(SkString(jname->begin(), jname->size()), { SkString(jfamily->begin(), jfamily->size()), SkString(jstyle->begin(), jstyle->size()), ParseDefault((*jfont)["ascent"] , 0.0f), std::move(tf) }); } } } // Optional array of glyphs, to be associated with one of the declared fonts. E.g. // "chars": [ // { // "ch": "t", // "data": { // "shapes": [...] // }, // "fFamily": "Roboto", // "size": 50, // "style": "Regular", // "w": 32.67 // } // ] if (jchars) { FontInfo* current_font = nullptr; for (const skjson::ObjectValue* jchar : *jchars) { if (!jchar) { continue; } const skjson::StringValue* jch = (*jchar)["ch"]; if (!jch) { continue; } const skjson::StringValue* jfamily = (*jchar)["fFamily"]; const skjson::StringValue* jstyle = (*jchar)["style"]; // "style", not "fStyle"... const auto* ch_ptr = jch->begin(); const auto ch_len = jch->size(); if (!jfamily || !jstyle || (SkUTF::CountUTF8(ch_ptr, ch_len) != 1)) { this->log(Logger::Level::kError, jchar, "Invalid glyph."); continue; } const auto uni = SkUTF::NextUTF8(&ch_ptr, ch_ptr + ch_len); SkASSERT(uni != -1); const auto* family = jfamily->begin(); const auto* style = jstyle->begin(); // Locate (and cache) the font info. Unlike text nodes, glyphs reference the font by // (family, style) -- not by name :( For now this performs a linear search over *all* // fonts: generally there are few of them, and glyph definitions are font-clustered. // If problematic, we can refactor as a two-level hashmap. if (!current_font || !current_font->matches(family, style)) { current_font = nullptr; fFonts.foreach([&](const SkString& name, FontInfo* finfo) { if (finfo->matches(family, style)) { current_font = finfo; // TODO: would be nice to break early here... } }); if (!current_font) { this->log(Logger::Level::kError, nullptr, "Font not found for codepoint (%d, %s, %s).", uni, family, style); continue; } } // TODO: parse glyphs } } }
SkString onShortName() override { return SkString("textbloblooper"); }
SkString onShortName() { return SkString("dashing2--72"); }
SkString onShortName() { return SkString(fDither ? "gradients" : "gradients_nodither"); }
SkString onShortName() override { return SkString("pathinterior"); }
static SkString make_png_name(const char* filename) { SkString pngName = SkString(filename); pngName.remove(pngName.size() - 3, 3); pngName.append("png"); return pngName; }
virtual SkString onShortName() { return SkString("bitmapfilters"); }
SkString onShortName() { return SkString("tinybitmap"); }
SkString onShortName() { return SkString("gradients"); }
SkString onShortName() override { return SkString("imagefilterscropped"); }
SkString onShortName() { return SkString("linepath"); }
virtual SkString onShortName() { return SkString("bitmapcopy"); }
SkString onShortName() { return SkString("verttext2"); }
SkString onShortName() override { return SkString("testgradient"); }