// Convert from a GrSurface-based dependency to a GrDrawTarget one void GrDrawTarget::addDependency(GrSurface* dependedOn) { if (dependedOn->asRenderTarget() && dependedOn->asRenderTarget()->getLastDrawTarget()) { // If it is still receiving dependencies, this DT shouldn't be closed SkASSERT(!this->isClosed()); GrDrawTarget* dt = dependedOn->asRenderTarget()->getLastDrawTarget(); if (dt == this) { // self-read - presumably for dst reads } else { this->addDependency(dt); // Can't make it closed in the self-read case dt->makeClosed(); } } }
// Returns whether or not the gpu can fast path the dash line effect. static bool can_fast_path_dash(const SkPoint pts[2], const GrStrokeInfo& strokeInfo, const GrDrawTarget& target, const SkMatrix& viewMatrix) { if (target.getDrawState().getRenderTarget()->isMultisampled()) { return false; } // Pts must be either horizontal or vertical in src space if (pts[0].fX != pts[1].fX && pts[0].fY != pts[1].fY) { return false; } // May be able to relax this to include skew. As of now cannot do perspective // because of the non uniform scaling of bloating a rect if (!viewMatrix.preservesRightAngles()) { return false; } if (!strokeInfo.isDashed() || 2 != strokeInfo.dashCount()) { return false; } const SkPathEffect::DashInfo& info = strokeInfo.getDashInfo(); if (0 == info.fIntervals[0] && 0 == info.fIntervals[1]) { return false; } SkPaint::Cap cap = strokeInfo.getStrokeRec().getCap(); // Current we do don't handle Round or Square cap dashes if (SkPaint::kRound_Cap == cap && info.fIntervals[0] != 0.f) { return false; } return true; }
static inline bool single_pass_path(const GrDrawTarget& target, const GrPath& path, GrPathFill fill) { #if STENCIL_OFF return true; #else if (kEvenOdd_PathFill == fill) { GrConvexHint hint = getConvexHint(path); return hint == kConvex_ConvexHint || hint == kNonOverlappingConvexPieces_ConvexHint; } else if (kWinding_PathFill == fill) { GrConvexHint hint = getConvexHint(path); return hint == kConvex_ConvexHint || hint == kNonOverlappingConvexPieces_ConvexHint || (hint == kSameWindingConvexPieces_ConvexHint && !target.drawWillReadDst() && !target.isDitherState()); } return false; #endif }
void GrInOrderDrawBuffer::initializeDrawStateAndClip(const GrDrawTarget& target) { this->copyDrawState(target); this->setClip(target.getClip()); }