/* * This method traverses the clip stack to see if the GrSoftwarePathRenderer * will be used on any element. If so, it returns true to indicate that the * entire clip should be rendered in SW and then uploaded en masse to the gpu. */ bool GrClipMaskManager::useSWOnlyPath(const SkClipStack& clipIn) { // TODO: generalize this function so that when // a clip gets complex enough it can just be done in SW regardless // of whether it would invoke the GrSoftwarePathRenderer. bool useSW = false; SkClipStack::Iter iter(clipIn, SkClipStack::Iter::kBottom_IterStart); const SkClipStack::Iter::Clip* clip = NULL; for (clip = iter.skipToTopmost(SkRegion::kReplace_Op); NULL != clip; clip = iter.nextCombined()) { // rects can always be drawn directly w/o using the software path // so only paths need to be checked if (NULL != clip->fPath && path_needs_SW_renderer(this->getContext(), fGpu, *clip->fPath, get_path_fill(*clip->fPath), clip->fDoAA)) { useSW = true; } } return useSW; }
/* * This method traverses the clip stack to see if the GrSoftwarePathRenderer * will be used on any element. If so, it returns true to indicate that the * entire clip should be rendered in SW and then uploaded en masse to the gpu. */ bool GrClipMaskManager::useSWOnlyPath(const GrPipelineBuilder& pipelineBuilder, const SkVector& clipToMaskOffset, const GrReducedClip::ElementList& elements) { // TODO: generalize this function so that when // a clip gets complex enough it can just be done in SW regardless // of whether it would invoke the GrSoftwarePathRenderer. GrStrokeInfo stroke(SkStrokeRec::kFill_InitStyle); // Set the matrix so that rendered clip elements are transformed to mask space from clip // space. SkMatrix translate; translate.setTranslate(clipToMaskOffset); for (GrReducedClip::ElementList::Iter iter(elements.headIter()); iter.get(); iter.next()) { const Element* element = iter.get(); // rects can always be drawn directly w/o using the software path // Skip rrects once we're drawing them directly. if (Element::kRect_Type != element->getType()) { SkPath path; element->asPath(&path); if (path_needs_SW_renderer(this->getContext(), fDrawTarget, pipelineBuilder, translate, path, stroke, element->isAA())) { return true; } } } return false; }