void SkOpBuilder::add(const SkPath& path, SkPathOp op) { if (0 == fOps.count() && op != kUnion_SkPathOp) { fPathRefs.push_back() = SkPath(); *fOps.append() = kUnion_SkPathOp; } fPathRefs.push_back() = path; *fOps.append() = op; }
SkPath PlatformContextSkia::currentPathInLocalCoordinates() const { SkPath localPath = m_path; const SkMatrix& matrix = m_canvas->getTotalMatrix(); SkMatrix inverseMatrix; if (!matrix.invert(&inverseMatrix)) return SkPath(); localPath.transform(inverseMatrix); return localPath; }
static void test_drawPathEmpty(skiatest::Reporter*, SkCanvas* canvas) { // Filling an empty path should not crash. SkPaint paint; canvas->drawRect(SkRect(), paint); canvas->drawPath(SkPath(), paint); canvas->drawOval(SkRect(), paint); canvas->drawRect(SkRect(), paint); canvas->drawRRect(SkRRect(), paint); // Stroking an empty path should not crash. paint.setAntiAlias(true); paint.setStyle(SkPaint::kStroke_Style); paint.setColor(SK_ColorGRAY); paint.setStrokeWidth(SkIntToScalar(20)); paint.setStrokeJoin(SkPaint::kRound_Join); canvas->drawRect(SkRect(), paint); canvas->drawPath(SkPath(), paint); canvas->drawOval(SkRect(), paint); canvas->drawRect(SkRect(), paint); canvas->drawRRect(SkRRect(), paint); }
GrPathRange* GrGLPathRendering::createGlyphs(const SkTypeface* typeface, const SkDescriptor* desc, const SkStrokeRec& stroke) { if (NULL != desc || !caps().glyphLoadingSupport) { return GrPathRendering::createGlyphs(typeface, desc, stroke); } if (NULL == typeface) { typeface = SkTypeface::GetDefaultTypeface(); SkASSERT(NULL != typeface); } int faceIndex; SkAutoTDelete<SkStream> fontStream(typeface->openStream(&faceIndex)); const size_t fontDataLength = fontStream->getLength(); if (0 == fontDataLength) { return GrPathRendering::createGlyphs(typeface, NULL, stroke); } SkTArray<uint8_t> fontTempBuffer; const void* fontData = fontStream->getMemoryBase(); if (NULL == fontData) { // TODO: Find a more efficient way to pass the font data (e.g. open file descriptor). fontTempBuffer.reset(SkToInt(fontDataLength)); fontStream->read(&fontTempBuffer.front(), fontDataLength); fontData = &fontTempBuffer.front(); } const int numPaths = typeface->countGlyphs(); const GrGLuint basePathID = this->genPaths(numPaths); SkAutoTUnref<GrGLPath> templatePath(SkNEW_ARGS(GrGLPath, (fGpu, SkPath(), stroke))); GrGLenum status; GL_CALL_RET(status, PathMemoryGlyphIndexArray(basePathID, GR_GL_STANDARD_FONT_FORMAT, fontDataLength, fontData, faceIndex, 0, numPaths, templatePath->pathID(), SkPaint::kCanonicalTextSizeForPaths)); if (GR_GL_FONT_GLYPHS_AVAILABLE != status) { this->deletePaths(basePathID, numPaths); return GrPathRendering::createGlyphs(typeface, NULL, stroke); } // This is a crude approximation. We may want to consider giving this class // a pseudo PathGenerator whose sole purpose is to track the approximate gpu // memory size. const size_t gpuMemorySize = fontDataLength / 4; return SkNEW_ARGS(GrGLPathRange, (fGpu, basePathID, numPaths, gpuMemorySize, stroke)); }
Path& Path::operator=(const Path& other) { m_path = SkPath(other.m_path); return *this; }
Path::Path(const Path& other) { m_path = SkPath(other.m_path); }
SkPath Text::onAsPath() const { // TODO return SkPath(); }