Flutter Engine
The Flutter Engine
Device.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
8
20#include "include/core/SkM44.h"
22#include "include/core/SkMesh.h"
24#include "include/core/SkPath.h"
30#include "include/core/SkRect.h"
34#include "include/core/SkSize.h"
35#include "include/core/SkSpan.h"
46#include "include/gpu/GrTypes.h"
54#include "include/private/chromium/Slug.h" // IWYU pragma: keep
56#include "src/base/SkTLazy.h"
57#include "src/core/SkDevice.h"
58#include "src/core/SkDrawBase.h"
59#include "src/core/SkImageFilterTypes.h" // IWYU pragma: keep
62#include "src/core/SkMeshPriv.h"
69#include "src/gpu/Swizzle.h"
93#include "src/gpu/ganesh/SkGr.h"
103#include "src/text/GlyphRun.h"
106
107#include <atomic>
108#include <cstddef>
109#include <cstdint>
110#include <functional>
111#include <memory>
112#include <tuple>
113#include <utility>
114
116struct GrShaderCaps;
117struct SkDrawShadowRec;
118
119using namespace skia_private;
120
121#define ASSERT_SINGLE_OWNER SKGPU_ASSERT_SINGLE_OWNER(fContext->priv().singleOwner())
122
123#if defined(GR_TEST_UTILS)
124// GrContextOptions::fMaxTextureSizeOverride exists but doesn't allow for changing the
125// maxTextureSize on the fly.
126int gOverrideMaxTextureSizeGanesh = 0;
127// Allows tests to check how many tiles were drawn on the most recent call to
128// Device::drawAsTiledImageRect. This is an atomic because we can write to it from
129// multiple threads during "normal" operations. However, the tests that actually
130// read from it are done single-threaded.
131std::atomic<int> gNumTilesDrawnGanesh{0};
132#endif
133
134///////////////////////////////////////////////////////////////////////////////
135
136namespace {
137
138bool force_aa_clip(const skgpu::ganesh::SurfaceDrawContext* sdc) {
139 return sdc->numSamples() > 1 || sdc->alwaysAntialias();
140}
141
142inline GrPrimitiveType point_mode_to_primitive_type(SkCanvas::PointMode mode) {
143 switch (mode) {
150 }
151 SK_ABORT("Unexpected mode");
152}
153
154std::unique_ptr<GrFragmentProcessor> make_inverse_rrect_fp(const SkMatrix& viewMatrix,
155 const SkRRect& rrect, GrAA aa,
156 const GrShaderCaps& shaderCaps) {
158 if (viewMatrix.isIdentity() || rrect.transform(viewMatrix, devRRect.writable())) {
159 auto edgeType = (aa == GrAA::kYes) ? GrClipEdgeType::kInverseFillAA
161 auto [success, fp] = GrRRectEffect::Make(/*inputFP=*/nullptr, edgeType, *devRRect,
162 shaderCaps);
163 return (success) ? std::move(fp) : nullptr;
164 }
165 return nullptr;
166}
167
168bool init_vertices_paint(GrRecordingContext* rContext,
169 const GrColorInfo& colorInfo,
170 const SkPaint& skPaint,
171 const SkMatrix& ctm,
172 SkBlender* blender,
173 bool hasColors,
174 const SkSurfaceProps& props,
175 GrPaint* grPaint) {
176 if (hasColors) {
177 return SkPaintToGrPaintWithBlend(rContext,
178 colorInfo,
179 skPaint,
180 ctm,
181 blender,
182 props,
183 grPaint);
184 } else {
185 return SkPaintToGrPaint(rContext, colorInfo, skPaint, ctm, props, grPaint);
186 }
187}
188
189bool init_mesh_child_effects(GrRecordingContext* rContext,
190 const GrColorInfo& colorInfo,
191 const SkSurfaceProps& surfaceProps,
192 const SkMesh& mesh,
193 TArray<std::unique_ptr<GrFragmentProcessor>>* meshChildFPs) {
194 // We use `Scope::kRuntimeEffect` here to ensure that mesh shaders get the same "raw" sampling
195 // behavior from alpha-only image shaders as a Runtime Effect would, rather than the unexpected
196 // tinting-by-input-color.
197 GrFPArgs fpArgs(rContext, &colorInfo, surfaceProps, GrFPArgs::Scope::kRuntimeEffect);
198
199 for (const SkRuntimeEffect::ChildPtr& child : mesh.children()) {
200 auto [success, childFP] = GrFragmentProcessors::MakeChildFP(child, fpArgs);
201 if (!success) {
202 return false;
203 }
204 meshChildFPs->push_back(std::move(childFP));
205 }
206 return true;
207}
208
209} // anonymous namespace
210
211namespace skgpu::ganesh {
212
216 sk_sp<SkColorSpace> colorSpace,
217 GrSurfaceOrigin origin,
218 const SkSurfaceProps& surfaceProps,
220 auto sdc = SurfaceDrawContext::Make(rContext,
221 colorType,
222 std::move(proxy),
223 std::move(colorSpace),
224 origin,
226
227 return Device::Make(std::move(sdc), kPremul_SkAlphaType, init);
228}
229
230SkImageInfo Device::MakeInfo(SurfaceContext* sc, DeviceFlags flags) {
232 return SkImageInfo::Make(sc->width(), sc->height(), colorType,
233 flags & DeviceFlags::kIsOpaque ? kOpaque_SkAlphaType
235 sc->colorInfo().refColorSpace());
236}
237
238
239/** Checks that the alpha type is legal and gets constructor flags. Returns false if device creation
240 should fail. */
241bool Device::CheckAlphaTypeAndGetFlags(SkAlphaType alphaType,
242 InitContents init,
243 DeviceFlags* flags) {
244 *flags = DeviceFlags::kNone;
245 switch (alphaType) {
247 break;
249 *flags |= DeviceFlags::kIsOpaque;
250 break;
251 default: // If it is unpremul or unknown don't try to render
252 return false;
253 }
254 if (InitContents::kClear == init) {
255 *flags |= DeviceFlags::kNeedClear;
256 }
257 return true;
258}
259
260sk_sp<Device> Device::Make(std::unique_ptr<SurfaceDrawContext> sdc,
261 SkAlphaType alphaType,
262 InitContents init) {
263 if (!sdc) {
264 return nullptr;
265 }
266
267 GrRecordingContext* rContext = sdc->recordingContext();
268 if (rContext->abandoned()) {
269 return nullptr;
270 }
271
272 SkColorType ct = GrColorTypeToSkColorType(sdc->colorInfo().colorType());
273
274 DeviceFlags flags;
275 if (!rContext->colorTypeSupportedAsSurface(ct) ||
276 !CheckAlphaTypeAndGetFlags(alphaType, init, &flags)) {
277 return nullptr;
278 }
279 return sk_sp<Device>(new Device(std::move(sdc), flags));
280}
281
283 skgpu::Budgeted budgeted,
284 const SkImageInfo& ii,
285 SkBackingFit fit,
286 int sampleCount,
287 skgpu::Mipmapped mipmapped,
288 GrProtected isProtected,
289 GrSurfaceOrigin origin,
290 const SkSurfaceProps& props,
292 if (!rContext) {
293 return nullptr;
294 }
295
296 auto sdc = SurfaceDrawContext::Make(rContext,
298 ii.refColorSpace(),
299 fit,
300 ii.dimensions(),
301 props,
302 /*label=*/"MakeDevice",
303 sampleCount,
304 mipmapped,
305 isProtected,
306 origin,
307 budgeted);
308
309 return Device::Make(std::move(sdc), ii.alphaType(), init);
310}
311
312Device::Device(std::unique_ptr<SurfaceDrawContext> sdc, DeviceFlags flags)
313 : SkDevice(MakeInfo(sdc.get(), flags), sdc->surfaceProps())
314 , fContext(sk_ref_sp(sdc->recordingContext()))
315 , fSDFTControl(sdc->recordingContext()->priv().getSDFTControl(
316 sdc->surfaceProps().isUseDeviceIndependentFonts()))
317 , fSurfaceDrawContext(std::move(sdc))
318 , fClip(SkIRect::MakeSize(fSurfaceDrawContext->dimensions()),
319 &this->localToDevice(),
320 force_aa_clip(fSurfaceDrawContext.get())) {
321 if (flags & DeviceFlags::kNeedClear) {
322 this->clearAll();
323 }
324}
325
326Device::~Device() = default;
327
328///////////////////////////////////////////////////////////////////////////////
329
330bool Device::onReadPixels(const SkPixmap& pm, int x, int y) {
332
333 // Context TODO: Elevate direct context requirement to public API
334 auto dContext = fContext->asDirectContext();
335 if (!dContext || !SkImageInfoValidConversion(pm.info(), this->imageInfo())) {
336 return false;
337 }
338
339 return fSurfaceDrawContext->readPixels(dContext, pm, {x, y});
340}
341
342bool Device::onWritePixels(const SkPixmap& pm, int x, int y) {
344
345 // Context TODO: Elevate direct context requirement to public API
346 auto dContext = fContext->asDirectContext();
347 if (!dContext || !SkImageInfoValidConversion(this->imageInfo(), pm.info())) {
348 return false;
349 }
350
351 return fSurfaceDrawContext->writePixels(dContext, pm, {x, y});
352}
353
354bool Device::onAccessPixels(SkPixmap* pmap) {
356 return false;
357}
358
361 return fSurfaceDrawContext.get();
362}
363
366 return fSurfaceDrawContext.get();
367}
368
371 return fSurfaceDrawContext.get();
372}
373
376 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "clearAll", fContext.get());
377
378 SkIRect rect = SkIRect::MakeWH(this->width(), this->height());
379 fSurfaceDrawContext->clearAtLeast(rect, SK_PMColor4fTRANSPARENT);
380}
381
382///////////////////////////////////////////////////////////////////////////////
383
384void Device::clipPath(const SkPath& path, SkClipOp op, bool aa) {
385#if defined(GR_TEST_UTILS)
386 if (fContext->priv().options().fAllPathsVolatile && !path.isVolatile()) {
387 this->clipPath(SkPath(path).setIsVolatile(true), op, aa);
388 return;
389 }
390#endif
392 fClip.clipPath(this->localToDevice(), path, GrAA(aa), op);
393}
394
395void Device::clipRegion(const SkRegion& globalRgn, SkClipOp op) {
397
398 // Regions don't actually need AA, but in DMSAA mode every clip element is antialiased.
399 GrAA aa = GrAA(fSurfaceDrawContext->alwaysAntialias());
400
401 if (globalRgn.isEmpty()) {
402 fClip.clipRect(SkMatrix::I(), SkRect::MakeEmpty(), aa, op);
403 } else if (globalRgn.isRect()) {
404 fClip.clipRect(this->globalToDevice().asM33(), SkRect::Make(globalRgn.getBounds()), aa, op);
405 } else {
406 SkPath path;
407 globalRgn.getBoundaryPath(&path);
408 fClip.clipPath(this->globalToDevice().asM33(), path, aa, op);
409 }
410}
411
414 // Assume wide open and then perform intersect/difference operations reducing the region
416 const SkRegion deviceBounds(bounds);
417 for (const ClipStack::Element& e : fClip) {
418 SkRegion tmp;
419 if (e.fShape.isRect() && e.fLocalToDevice.isIdentity()) {
420 tmp.setRect(e.fShape.rect().roundOut());
421 } else {
422 SkPath tmpPath;
423 e.fShape.asPath(&tmpPath);
424 tmpPath.transform(e.fLocalToDevice);
425 tmp.setPath(tmpPath, deviceBounds);
426 }
427
428 region->op(tmp, (SkRegion::Op) e.fOp);
429 }
430}
431
433 for (const ClipStack::Element& e : fClip) {
434 if (e.fAA == GrAA::kYes) {
435 return true;
436 }
437 SkASSERT(!fSurfaceDrawContext->alwaysAntialias());
438 }
439 return false;
440}
441
442///////////////////////////////////////////////////////////////////////////////
443
446 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawPaint", fContext.get());
447
448 GrPaint grPaint;
450 fSurfaceDrawContext->colorInfo(),
451 paint,
452 this->localToDevice(),
453 fSurfaceDrawContext->surfaceProps(),
454 &grPaint)) {
455 return;
456 }
457
458 fSurfaceDrawContext->drawPaint(this->clip(), std::move(grPaint), this->localToDevice());
459}
460
462 size_t count,
463 const SkPoint pts[],
464 const SkPaint& paint) {
466 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawPoints", fContext.get());
467 SkScalar width = paint.getStrokeWidth();
468 if (width < 0) {
469 return;
470 }
471
472 GrAA aa = fSurfaceDrawContext->chooseAA(paint);
473
474 if (count == 2 && mode == SkCanvas::kLines_PointMode) {
475 if (paint.getPathEffect()) {
476 // Probably a dashed line. Draw as a path.
477 GrPaint grPaint;
479 fSurfaceDrawContext->colorInfo(),
480 paint,
481 this->localToDevice(),
482 fSurfaceDrawContext->surfaceProps(),
483 &grPaint)) {
484 SkPath path;
485 path.setIsVolatile(true);
486 path.moveTo(pts[0]);
487 path.lineTo(pts[1]);
488 fSurfaceDrawContext->drawPath(this->clip(),
489 std::move(grPaint),
490 aa,
491 this->localToDevice(),
492 path,
494 }
495 return;
496 }
497 if (!paint.getMaskFilter() &&
498 paint.getStrokeWidth() > 0 && // drawStrokedLine doesn't support hairlines.
499 paint.getStrokeCap() != SkPaint::kRound_Cap) { // drawStrokedLine doesn't do round caps.
500 // Simple stroked line. Bypass path rendering.
501 GrPaint grPaint;
503 fSurfaceDrawContext->colorInfo(),
504 paint,
505 this->localToDevice(),
506 fSurfaceDrawContext->surfaceProps(),
507 &grPaint)) {
508 fSurfaceDrawContext->drawStrokedLine(this->clip(),
509 std::move(grPaint),
510 aa,
511 this->localToDevice(),
512 pts,
514 }
515 return;
516 }
517 }
518
519 const GrCaps* caps = fContext->priv().caps();
520 SkScalar scales[2];
521 bool isHairline =
522 ((0 == width) ||
523 (1 == width && this->localToDevice().getMinMaxScales(scales) &&
524 SkScalarNearlyEqual(scales[0], 1.f) && SkScalarNearlyEqual(scales[1], 1.f))) &&
525
526 // Don't do this as a hairline draw, which will emit line primitives, if
527 // lines are not permitted by caps.
529 caps->avoidLineDraws());
530
531 // we only handle non-coverage-aa hairlines and paints without path effects or mask filters,
532 // else we let the SkDraw call our drawPath()
533 if (!isHairline ||
534 paint.getPathEffect() ||
535 paint.getMaskFilter() ||
536 fSurfaceDrawContext->chooseAAType(aa) == GrAAType::kCoverage) {
539 // don't need to set fBlitterChoose, as it should never get used
540 draw.fDst = SkPixmap(SkImageInfo::MakeUnknown(this->width(), this->height()), nullptr, 0);
541 draw.fCTM = &this->localToDevice();
542 draw.fRC = &rc;
543 draw.drawDevicePoints(mode, count, pts, paint, this);
544 return;
545 }
546
547 GrPaint grPaint;
549 fSurfaceDrawContext->colorInfo(),
550 paint,
551 this->localToDevice(),
552 fSurfaceDrawContext->surfaceProps(),
553 &grPaint)) {
554 return;
555 }
556
557 static constexpr SkVertices::VertexMode kIgnoredMode = SkVertices::kTriangles_VertexMode;
558 sk_sp<SkVertices> vertices = SkVertices::MakeCopy(kIgnoredMode, SkToS32(count), pts, nullptr,
559 nullptr);
560
561 GrPrimitiveType primitiveType = point_mode_to_primitive_type(mode);
562 fSurfaceDrawContext->drawVertices(this->clip(), std::move(grPaint), this->localToDevice(),
563 std::move(vertices), &primitiveType);
564}
565
566///////////////////////////////////////////////////////////////////////////////
567
570 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawRect", fContext.get());
571
572 GrStyle style(paint);
573
574 // A couple reasons we might need to call drawPath.
575 if (paint.getMaskFilter() || paint.getPathEffect()) {
576 GrStyledShape shape(rect, style);
577
578 GrBlurUtils::DrawShapeWithMaskFilter(fContext.get(), fSurfaceDrawContext.get(),
579 this->clip(), paint, this->localToDevice(), shape);
580 return;
581 }
582
583 GrPaint grPaint;
585 fSurfaceDrawContext->colorInfo(),
586 paint,
587 this->localToDevice(),
588 fSurfaceDrawContext->surfaceProps(),
589 &grPaint)) {
590 return;
591 }
592
593 fSurfaceDrawContext->drawRect(this->clip(), std::move(grPaint),
594 fSurfaceDrawContext->chooseAA(paint), this->localToDevice(), rect,
595 &style);
596}
597
599 const SkPoint clip[4],
600 SkCanvas::QuadAAFlags aaFlags,
601 const SkColor4f& color,
604 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawEdgeAAQuad", fContext.get());
605
606 SkPMColor4f dstColor = SkColor4fPrepForDst(color, fSurfaceDrawContext->colorInfo()).premul();
607
608 GrPaint grPaint;
609 grPaint.setColor4f(dstColor);
612 }
613
614 if (clip) {
615 // Use fillQuadWithEdgeAA
616 fSurfaceDrawContext->fillQuadWithEdgeAA(this->clip(),
617 std::move(grPaint),
618 SkToGrQuadAAFlags(aaFlags),
619 this->localToDevice(),
620 clip,
621 nullptr);
622 } else {
623 // Use fillRectWithEdgeAA to preserve mathematical properties of dst being rectangular
624 fSurfaceDrawContext->fillRectWithEdgeAA(this->clip(),
625 std::move(grPaint),
626 SkToGrQuadAAFlags(aaFlags),
627 this->localToDevice(),
628 rect);
629 }
630}
631
632///////////////////////////////////////////////////////////////////////////////
633
636 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawRRect", fContext.get());
637
638 auto mf = paint.getMaskFilter();
639 if (mf) {
641 mf = nullptr; // already handled in SkPaintToGrPaint
642 }
643 }
644
645 GrStyle style(paint);
646
647 if (mf || style.pathEffect()) {
648 // A path effect will presumably transform this rrect into something else.
649 GrStyledShape shape(rrect, style);
650
651 GrBlurUtils::DrawShapeWithMaskFilter(fContext.get(), fSurfaceDrawContext.get(),
652 this->clip(), paint, this->localToDevice(), shape);
653 return;
654 }
655
656 SkASSERT(!style.pathEffect());
657
658 GrPaint grPaint;
660 fSurfaceDrawContext->colorInfo(),
661 paint,
662 this->localToDevice(),
663 fSurfaceDrawContext->surfaceProps(),
664 &grPaint)) {
665 return;
666 }
667
668 fSurfaceDrawContext->drawRRect(this->clip(), std::move(grPaint),
669 fSurfaceDrawContext->chooseAA(paint), this->localToDevice(),
670 rrect, style);
671}
672
673void Device::drawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
675 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawDRRect", fContext.get());
676 if (outer.isEmpty()) {
677 return;
678 }
679
680 if (inner.isEmpty()) {
681 return this->drawRRect(outer, paint);
682 }
683
685
686 if (stroke.isFillStyle() && !paint.getMaskFilter() && !paint.getPathEffect()) {
687 // For axis-aligned filled DRRects, just draw a regular rrect with inner clipped out using a
688 // coverage FP instead of using path rendering.
689 if (auto fp = make_inverse_rrect_fp(this->localToDevice(), inner,
690 fSurfaceDrawContext->chooseAA(paint),
691 *fSurfaceDrawContext->caps()->shaderCaps())) {
692 GrPaint grPaint;
694 fSurfaceDrawContext->colorInfo(),
695 paint,
696 this->localToDevice(),
697 fSurfaceDrawContext->surfaceProps(),
698 &grPaint)) {
699 return;
700 }
702 grPaint.setCoverageFragmentProcessor(std::move(fp));
703 fSurfaceDrawContext->drawRRect(this->clip(), std::move(grPaint),
704 fSurfaceDrawContext->chooseAA(paint),
705 this->localToDevice(), outer, GrStyle());
706 return;
707 }
708 }
709
710 SkPath path;
711 path.setIsVolatile(true);
712 path.addRRect(outer);
713 path.addRRect(inner);
714 path.setFillType(SkPathFillType::kEvenOdd);
715
716 // TODO: We are losing the possible mutability of the path here but this should probably be
717 // fixed by upgrading GrStyledShape to handle DRRects.
718 GrStyledShape shape(path, paint);
719
720 GrBlurUtils::DrawShapeWithMaskFilter(fContext.get(), fSurfaceDrawContext.get(), this->clip(),
721 paint, this->localToDevice(), shape);
722}
723
724/////////////////////////////////////////////////////////////////////////////
725
728
729 if (paint.getMaskFilter()) {
730 SkPath path;
732 path.setIsVolatile(true);
733 return this->drawPath(path, paint, true);
734 }
735
736 GrPaint grPaint;
738 fSurfaceDrawContext->colorInfo(),
739 paint,
740 this->localToDevice(),
741 fSurfaceDrawContext->surfaceProps(),
742 &grPaint)) {
743 return;
744 }
745
746 fSurfaceDrawContext->drawRegion(this->clip(), std::move(grPaint),
747 fSurfaceDrawContext->chooseAA(paint), this->localToDevice(),
749}
750
753 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawOval", fContext.get());
754
755 if (paint.getMaskFilter()) {
756 // The RRect path can handle special case blurring
758 return this->drawRRect(rr, paint);
759 }
760
761 GrPaint grPaint;
763 fSurfaceDrawContext->colorInfo(),
764 paint,
765 this->localToDevice(),
766 fSurfaceDrawContext->surfaceProps(),
767 &grPaint)) {
768 return;
769 }
770
771 fSurfaceDrawContext->drawOval(this->clip(), std::move(grPaint),
772 fSurfaceDrawContext->chooseAA(paint), this->localToDevice(), oval,
773 GrStyle(paint));
774}
775
776void Device::drawArc(const SkArc& arc, const SkPaint& paint) {
778 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawArc", fContext.get());
779 if (paint.getMaskFilter()) {
780 this->SkDevice::drawArc(arc, paint);
781 return;
782 }
783 GrPaint grPaint;
785 fSurfaceDrawContext->colorInfo(),
786 paint,
787 this->localToDevice(),
788 fSurfaceDrawContext->surfaceProps(),
789 &grPaint)) {
790 return;
791 }
792
793 fSurfaceDrawContext->drawArc(this->clip(),
794 std::move(grPaint),
795 fSurfaceDrawContext->chooseAA(paint),
796 this->localToDevice(),
797 arc,
798 GrStyle(paint));
799}
800
801///////////////////////////////////////////////////////////////////////////////
802
803void Device::drawPath(const SkPath& origSrcPath, const SkPaint& paint, bool pathIsMutable) {
804#if defined(GR_TEST_UTILS)
805 if (fContext->priv().options().fAllPathsVolatile && !origSrcPath.isVolatile()) {
806 this->drawPath(SkPath(origSrcPath).setIsVolatile(true), paint, true);
807 return;
808 }
809#endif
811 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawPath", fContext.get());
812 if (!paint.getMaskFilter()) {
813 GrPaint grPaint;
815 fSurfaceDrawContext->colorInfo(),
816 paint,
817 this->localToDevice(),
818 fSurfaceDrawContext->surfaceProps(),
819 &grPaint)) {
820 return;
821 }
822 fSurfaceDrawContext->drawPath(this->clip(), std::move(grPaint),
823 fSurfaceDrawContext->chooseAA(paint), this->localToDevice(),
824 origSrcPath, GrStyle(paint));
825 return;
826 }
827
828 // TODO: losing possible mutability of 'origSrcPath' here
829 GrStyledShape shape(origSrcPath, paint);
830
831 GrBlurUtils::DrawShapeWithMaskFilter(fContext.get(), fSurfaceDrawContext.get(), this->clip(),
832 paint, this->localToDevice(), shape);
833}
834
835sk_sp<skif::Backend> Device::createImageFilteringBackend(const SkSurfaceProps& surfaceProps,
836 SkColorType colorType) const {
838 fContext, fSurfaceDrawContext->origin(), surfaceProps, colorType);
839}
840
843
844 // TODO: this makes a tight copy of 'bitmap' but it doesn't have to be (given SkSpecialImage's
845 // semantics). Since this is cached we would have to bake the fit into the cache key though.
846 auto view = std::get<0>(
847 GrMakeCachedBitmapProxyView(fContext.get(), bitmap, /*label=*/"Device_MakeSpecial"));
848 if (!view) {
849 return nullptr;
850 }
851
852 const SkIRect rect = SkIRect::MakeSize(view.proxy()->dimensions());
853
854 // GrMakeCachedBitmapProxyView creates a tight copy of 'bitmap' so we don't have to subset
855 // the special image
857 rect,
858 bitmap.getGenerationID(),
859 std::move(view),
860 {SkColorTypeToGrColorType(bitmap.colorType()),
861 kPremul_SkAlphaType,
862 bitmap.refColorSpace()},
863 this->surfaceProps());
864}
865
868
869 SkPixmap pm;
870 if (image->isTextureBacked()) {
871 auto [view, ct] =
873 SkASSERT(view);
874
876 fContext.get(),
878 image->uniqueID(),
879 std::move(view),
880 {ct, kPremul_SkAlphaType, image->refColorSpace()},
881 this->surfaceProps());
882 } else if (image->peekPixels(&pm)) {
883 SkBitmap bm;
884
885 bm.installPixels(pm);
886 return this->makeSpecial(bm);
887 } else {
888 return nullptr;
889 }
890}
891
892sk_sp<SkSpecialImage> Device::snapSpecial(const SkIRect& subset, bool forceCopy) {
894
895 auto sdc = fSurfaceDrawContext.get();
896
897 // If we are wrapping a vulkan secondary command buffer, then we can't snap off a special image
898 // since it would require us to make a copy of the underlying VkImage which we don't have access
899 // to. Additionaly we can't stop and start the render pass that is used with the secondary
900 // command buffer.
901 if (sdc->wrapsVkSecondaryCB()) {
902 return nullptr;
903 }
904
905 SkASSERT(sdc->asSurfaceProxy());
906
907 SkIRect finalSubset = subset;
908 GrSurfaceProxyView view = sdc->readSurfaceView();
909 if (forceCopy || !view.asTextureProxy()) {
910 // When the device doesn't have a texture, or a copy is requested, we create a temporary
911 // texture that matches the device contents
912 view = GrSurfaceProxyView::Copy(fContext.get(),
913 std::move(view),
914 skgpu::Mipmapped::kNo, // Don't auto generate mips
915 subset,
918 /*label=*/"Device_SnapSpecial"); // Always budgeted
919 if (!view) {
920 return nullptr;
921 }
922 // Since this copied only the requested subset, the special image wrapping the proxy no
923 // longer needs the original subset.
924 finalSubset = SkIRect::MakeSize(view.dimensions());
925 }
926
928 finalSubset,
930 std::move(view),
931 GrColorInfo(this->imageInfo().colorInfo()),
932 this->surfaceProps());
933}
934
937
938 auto sdc = fSurfaceDrawContext.get();
939
940 // If we are wrapping a vulkan secondary command buffer, then we can't snap off a special image
941 // since it would require us to make a copy of the underlying VkImage which we don't have access
942 // to. Additionaly we can't stop and start the render pass that is used with the secondary
943 // command buffer.
944 if (sdc->wrapsVkSecondaryCB()) {
945 return nullptr;
946 }
947
948 SkASSERT(sdc->asSurfaceProxy());
949
950 auto scaledContext = sdc->rescale(sdc->imageInfo().makeDimensions(dstDims),
951 sdc->origin(),
952 subset,
955 if (!scaledContext) {
956 return nullptr;
957 }
958
960 SkIRect::MakeSize(dstDims),
962 scaledContext->readSurfaceView(),
963 GrColorInfo(this->imageInfo().colorInfo()),
964 this->surfaceProps());
965}
966
969 const SkPaint& paint) {
971 // clear of the source device must occur before CHECK_SHOULD_DRAW
972 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawDevice", fContext.get());
973 this->SkDevice::drawDevice(device, sampling, paint);
974}
975
977 const SkRect* src,
978 const SkRect& dst,
980 const SkPaint& paint,
981 SkCanvas::SrcRectConstraint constraint) {
983
984 GrAA aa = fSurfaceDrawContext->chooseAA(paint);
987
988 this->drawImageQuadDirect(image,
989 src ? *src
991 dst,
992 /* dstClip= */ nullptr,
993 aaFlags,
994 /* preViewMatrix= */ nullptr,
995 sampling,
996 paint,
997 constraint);
998}
999
1001 const SkImage* image,
1002 const SkRect* src,
1003 const SkRect& dst,
1005 const SkPaint& paint,
1006 SkCanvas::SrcRectConstraint constraint) {
1007 GrRecordingContext* rCtx = canvas->recordingContext();
1008 if (!rCtx) {
1009 return false;
1010 }
1012
1013 GrAA aa = fSurfaceDrawContext->chooseAA(paint);
1016
1017 // NOTE: if the context is not a direct context, it doesn't have access to the resource
1018 // cache, and theoretically, the resource cache's limits could be being changed on
1019 // another thread, so even having access to just the limit wouldn't be a reliable
1020 // test during recording here.
1021 size_t cacheSize = 0;
1022 if (auto dCtx = GrAsDirectContext(rCtx)) {
1023 cacheSize = dCtx->getResourceCacheLimit();
1024 }
1025 size_t maxTextureSize = rCtx->maxTextureSize();
1026#if defined(GR_TEST_UTILS)
1027 if (gOverrideMaxTextureSizeGanesh) {
1028 maxTextureSize = gOverrideMaxTextureSizeGanesh;
1029 }
1030 gNumTilesDrawnGanesh.store(0, std::memory_order_relaxed);
1031#endif
1032
1033 [[maybe_unused]] auto [wasTiled, numTiles] = TiledTextureUtils::DrawAsTiledImageRect(
1034 canvas,
1035 image,
1037 dst,
1038 aaFlags,
1039 sampling,
1040 &paint,
1041 constraint,
1042 cacheSize,
1043 maxTextureSize);
1044#if defined(GR_TEST_UTILS)
1045 gNumTilesDrawnGanesh.store(numTiles, std::memory_order_relaxed);
1046#endif
1047 return wasTiled;
1048}
1049
1050void Device::drawViewLattice(GrSurfaceProxyView view,
1051 const GrColorInfo& info,
1052 std::unique_ptr<SkLatticeIter> iter,
1053 const SkRect& dst,
1054 SkFilterMode filter,
1055 const SkPaint& origPaint) {
1056 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawViewLattice", fContext.get());
1057 SkASSERT(view);
1058
1060
1061 if (!info.isAlphaOnly() && (paint->getColor() & 0x00FFFFFF) != 0x00FFFFFF) {
1062 paint.writable()->setColor(SkColorSetARGB(origPaint.getAlpha(), 0xFF, 0xFF, 0xFF));
1063 }
1064 GrPaint grPaint;
1065 // Passing null as shaderFP indicates that the GP will provide the shader.
1067 fSurfaceDrawContext->colorInfo(),
1068 *paint,
1069 this->localToDevice(),
1070 /*shaderFP=*/nullptr,
1071 fSurfaceDrawContext->surfaceProps(),
1072 &grPaint)) {
1073 return;
1074 }
1075
1076 if (info.isAlphaOnly()) {
1077 // If we were doing this with an FP graph we'd use a kDstIn blend between the texture
1078 // and the paint color.
1079 view.concatSwizzle(skgpu::Swizzle("aaaa"));
1080 }
1081 auto csxf = GrColorSpaceXform::Make(info, fSurfaceDrawContext->colorInfo());
1082
1083 fSurfaceDrawContext->drawImageLattice(this->clip(),
1084 std::move(grPaint),
1085 this->localToDevice(),
1086 std::move(view),
1087 info.alphaType(),
1088 std::move(csxf),
1089 filter,
1090 std::move(iter),
1091 dst);
1092}
1093
1095 const SkCanvas::Lattice& lattice,
1096 const SkRect& dst,
1097 SkFilterMode filter,
1098 const SkPaint& paint) {
1100 auto iter = std::make_unique<SkLatticeIter>(lattice, dst);
1101
1102 auto [view, ct] = skgpu::ganesh::AsView(this->recordingContext(), image, skgpu::Mipmapped::kNo);
1103 if (view) {
1104 GrColorInfo colorInfo(ct, image->alphaType(), image->refColorSpace());
1105 this->drawViewLattice(
1106 std::move(view), std::move(colorInfo), std::move(iter), dst, filter, paint);
1107 }
1108}
1109
1111 sk_sp<SkBlender> blender,
1112 const SkPaint& paint,
1113 bool skipColorXform) {
1115 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawVertices", fContext.get());
1116 SkASSERT(vertices);
1117
1118#ifdef SK_LEGACY_IGNORE_DRAW_VERTICES_BLEND_WITH_NO_SHADER
1119 if (!paint.getShader()) {
1121 }
1122#endif
1123
1124 SkVerticesPriv info(vertices->priv());
1125
1126 GrPaint grPaint;
1127 if (!init_vertices_paint(fContext.get(),
1128 fSurfaceDrawContext->colorInfo(),
1129 paint,
1130 this->localToDevice(),
1131 blender.get(),
1132 info.hasColors(),
1133 fSurfaceDrawContext->surfaceProps(),
1134 &grPaint)) {
1135 return;
1136 }
1137 fSurfaceDrawContext->drawVertices(this->clip(),
1138 std::move(grPaint),
1139 this->localToDevice(),
1140 sk_ref_sp(const_cast<SkVertices*>(vertices)),
1141 nullptr,
1142 skipColorXform);
1143}
1144
1147 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawMesh", fContext.get());
1148 if (!mesh.isValid()) {
1149 return;
1150 }
1151
1152 GrPaint grPaint;
1153 if (!init_vertices_paint(fContext.get(),
1154 fSurfaceDrawContext->colorInfo(),
1155 paint,
1156 this->localToDevice(),
1157 blender.get(),
1159 fSurfaceDrawContext->surfaceProps(),
1160 &grPaint)) {
1161 return;
1162 }
1163
1165 if (!init_mesh_child_effects(fContext.get(),
1166 fSurfaceDrawContext->colorInfo(),
1167 fSurfaceDrawContext->surfaceProps(),
1168 mesh,
1169 &meshChildFPs)) {
1170 return;
1171 }
1172 fSurfaceDrawContext->drawMesh(this->clip(), std::move(grPaint), this->localToDevice(), mesh,
1173 std::move(meshChildFPs));
1174}
1175
1176///////////////////////////////////////////////////////////////////////////////
1177
1178#if !defined(SK_ENABLE_OPTIMIZE_SIZE)
1180#if defined(GR_TEST_UTILS)
1181 if (fContext->priv().options().fAllPathsVolatile && !path.isVolatile()) {
1182 this->drawShadow(SkPath(path).setIsVolatile(true), rec);
1183 return;
1184 }
1185#endif
1187 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawShadow", fContext.get());
1188
1189 if (!fSurfaceDrawContext->drawFastShadow(this->clip(), this->localToDevice(), path, rec)) {
1190 // failed to find an accelerated case
1191 this->SkDevice::drawShadow(path, rec);
1192 }
1193}
1194#endif // SK_ENABLE_OPTIMIZE_SIZE
1195
1196///////////////////////////////////////////////////////////////////////////////
1197
1198void Device::drawAtlas(const SkRSXform xform[],
1199 const SkRect texRect[],
1200 const SkColor colors[],
1201 int count,
1202 sk_sp<SkBlender> blender,
1203 const SkPaint& paint) {
1205 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawAtlas", fContext.get());
1206
1207 GrPaint grPaint;
1208 if (colors) {
1210 fSurfaceDrawContext->colorInfo(),
1211 paint,
1212 this->localToDevice(),
1213 blender.get(),
1214 fSurfaceDrawContext->surfaceProps(),
1215 &grPaint)) {
1216 return;
1217 }
1218 } else {
1220 fSurfaceDrawContext->colorInfo(),
1221 paint,
1222 this->localToDevice(),
1223 fSurfaceDrawContext->surfaceProps(),
1224 &grPaint)) {
1225 return;
1226 }
1227 }
1228
1229 fSurfaceDrawContext->drawAtlas(this->clip(), std::move(grPaint), this->localToDevice(), count,
1230 xform, texRect, colors);
1231}
1232
1233///////////////////////////////////////////////////////////////////////////////
1234
1235void Device::onDrawGlyphRunList(SkCanvas* canvas,
1236 const sktext::GlyphRunList& glyphRunList,
1237 const SkPaint& paint) {
1239 GR_CREATE_TRACE_MARKER_CONTEXT("skgpu::ganesh::Device", "drawGlyphRunList", fContext.get());
1240 SkASSERT(!glyphRunList.hasRSXForm());
1241
1242 if (glyphRunList.blob() == nullptr) {
1243 // If the glyphRunList does not have an associated text blob, then it was created by one of
1244 // the direct draw APIs (drawGlyphs, etc.). Use a Slug to draw the glyphs.
1245 auto slug = this->convertGlyphRunListToSlug(glyphRunList, paint);
1246 if (slug != nullptr) {
1247 this->drawSlug(canvas, slug.get(), paint);
1248 }
1249 } else {
1250 fSurfaceDrawContext->drawGlyphRunList(canvas,
1251 this->clip(),
1252 this->localToDevice(),
1253 glyphRunList,
1254 this->strikeDeviceInfo(),
1255 paint);
1256 }
1257}
1258
1259///////////////////////////////////////////////////////////////////////////////
1260
1261void Device::drawDrawable(SkCanvas* canvas, SkDrawable* drawable, const SkMatrix* matrix) {
1263
1264 GrBackendApi api = this->recordingContext()->backend();
1265 if (GrBackendApi::kVulkan == api) {
1266 const SkMatrix& ctm = this->localToDevice();
1267 const SkMatrix& combinedMatrix = matrix ? SkMatrix::Concat(ctm, *matrix) : ctm;
1268 std::unique_ptr<SkDrawable::GpuDrawHandler> gpuDraw =
1269 drawable->snapGpuDrawHandler(api, combinedMatrix, this->devClipBounds(),
1270 this->imageInfo());
1271 if (gpuDraw) {
1272 fSurfaceDrawContext->drawDrawable(
1273 std::move(gpuDraw), combinedMatrix.mapRect(drawable->getBounds()));
1274 return;
1275 }
1276 }
1277 this->SkDevice::drawDrawable(canvas, drawable, matrix);
1278}
1279
1280
1281///////////////////////////////////////////////////////////////////////////////
1282
1284 return this->surfaceFillContext()->readSurfaceView();
1285}
1286
1288 return this->readSurfaceView().asRenderTargetProxy();
1289}
1290
1291bool Device::wait(int numSemaphores,
1292 const GrBackendSemaphore* waitSemaphores,
1293 bool deleteSemaphoresAfterWait) {
1295
1296 return fSurfaceDrawContext->waitOnSemaphores(numSemaphores, waitSemaphores,
1297 deleteSemaphoresAfterWait);
1298}
1299
1301 fSurfaceDrawContext->discard();
1302}
1303
1305 fSurfaceDrawContext->resolveMSAA();
1306}
1307
1310 GrColorType grColorType,
1311 sk_sp<SkColorSpace> colorSpace,
1312 GrSurfaceOrigin origin,
1313 const SkSurfaceProps& props) {
1314 auto sdc = SurfaceDrawContext::Make(fContext.get(), grColorType, std::move(newRTP),
1315 std::move(colorSpace), origin, props);
1316 if (!sdc) {
1317 return false;
1318 }
1319
1320 SkASSERT(sdc->dimensions() == fSurfaceDrawContext->dimensions());
1321 SkASSERT(sdc->numSamples() == fSurfaceDrawContext->numSamples());
1322 SkASSERT(sdc->asSurfaceProxy()->priv().isExact());
1324 if (fContext->abandoned()) {
1325 return false;
1326 }
1327
1328 SkASSERT(fSurfaceDrawContext->asTextureProxy());
1329 SkAssertResult(sdc->blitTexture(fSurfaceDrawContext->readSurfaceView(),
1330 SkIRect::MakeWH(this->width(), this->height()),
1331 SkIPoint::Make(0, 0)));
1332 }
1333
1334 fSurfaceDrawContext = std::move(sdc);
1335 return true;
1336}
1337
1340
1341 const SkImageInfo& ii = this->imageInfo();
1342 GrRenderTargetProxy* oldRTP = this->targetProxy();
1343 GrSurfaceProxyView oldView = this->readSurfaceView();
1344
1345 auto grColorType = SkColorTypeToGrColorType(ii.colorType());
1346 auto format = fContext->priv().caps()->getDefaultBackendFormat(grColorType, GrRenderable::kYes);
1347 if (!format.isValid()) {
1348 return false;
1349 }
1350
1351 GrProxyProvider* proxyProvider = fContext->priv().proxyProvider();
1352 // This entry point is used by SkSurface_Ganesh::onCopyOnWrite so it must create a
1353 // kExact-backed render target proxy
1354 sk_sp<GrTextureProxy> proxy =
1355 proxyProvider->createProxy(format,
1356 ii.dimensions(),
1358 oldRTP->numSamples(),
1359 oldView.mipmapped(),
1361 oldRTP->isBudgeted(),
1363 /*label=*/"BaseDevice_ReplaceBackingProxy");
1364 if (!proxy) {
1365 return false;
1366 }
1367
1368 return this->replaceBackingProxy(mode, sk_ref_sp(proxy->asRenderTargetProxy()),
1369 grColorType, ii.refColorSpace(), oldView.origin(),
1370 this->surfaceProps());
1371}
1372
1374 const SkIRect& srcRect,
1375 RescaleGamma rescaleGamma,
1376 RescaleMode rescaleMode,
1378 ReadPixelsContext context) {
1379 auto* sdc = fSurfaceDrawContext.get();
1380 // Context TODO: Elevate direct context requirement to public API.
1381 auto dContext = sdc->recordingContext()->asDirectContext();
1382 if (!dContext) {
1383 return;
1384 }
1385 sdc->asyncRescaleAndReadPixels(dContext, info, srcRect, rescaleGamma, rescaleMode, callback,
1386 context);
1387}
1388
1390 bool readAlpha,
1391 sk_sp<SkColorSpace> dstColorSpace,
1392 const SkIRect& srcRect,
1393 SkISize dstSize,
1394 RescaleGamma rescaleGamma,
1395 RescaleMode rescaleMode,
1397 ReadPixelsContext context) {
1398 auto* sdc = fSurfaceDrawContext.get();
1399 // Context TODO: Elevate direct context requirement to public API.
1400 auto dContext = sdc->recordingContext()->asDirectContext();
1401 if (!dContext) {
1402 return;
1403 }
1404 sdc->asyncRescaleAndReadPixelsYUV420(dContext,
1405 yuvColorSpace,
1406 readAlpha,
1407 std::move(dstColorSpace),
1408 srcRect,
1409 dstSize,
1410 rescaleGamma,
1411 rescaleMode,
1412 callback,
1413 context);
1414}
1415
1416///////////////////////////////////////////////////////////////////////////////
1417
1420
1421 SkSurfaceProps props =
1423
1425
1427 fContext.get(),
1429 cinfo.fInfo.refColorSpace(),
1431 cinfo.fInfo.dimensions(),
1432 props,
1433 fSurfaceDrawContext->numSamples(),
1435 fSurfaceDrawContext->asSurfaceProxy()->isProtected(),
1436 fSurfaceDrawContext->origin(),
1438 if (!sdc) {
1439 return nullptr;
1440 }
1441
1442 // Skia's convention is to only clear a device if it is non-opaque.
1444
1445 return Device::Make(std::move(sdc), cinfo.fInfo.alphaType(), init);
1446}
1447
1450 // TODO: Change the signature of newSurface to take a budgeted parameter.
1452 bool isProtected = this->targetProxy()->isProtected() == GrProtected::kYes;
1453 return SkSurfaces::RenderTarget(fContext.get(),
1454 kBudgeted,
1455 info,
1456 fSurfaceDrawContext->numSamples(),
1457 fSurfaceDrawContext->origin(),
1458 &props,
1459 /* shouldCreateWithMips= */ false,
1460 isProtected);
1461}
1462
1463////////////////////////////////////////////////////////////////////////////////////
1464
1467 this->android_utils_clipAsRgn(&clipRegion);
1468 if (clipRegion.isEmpty()) {
1469 return false;
1470 }
1471 auto sdc = fSurfaceDrawContext.get();
1472 SkASSERT(sdc);
1473 GrPaint grPaint;
1475 static constexpr GrUserStencilSettings kDrawToStencil(
1477 0x1,
1479 0x1,
1482 0x1>()
1483 );
1484 // Regions don't actually need AA, but in DMSAA mode everything is antialiased.
1485 GrAA aa = GrAA(fSurfaceDrawContext->alwaysAntialias());
1486 sdc->drawRegion(nullptr, std::move(grPaint), aa, SkMatrix::I(), clipRegion,
1487 GrStyle::SimpleFill(), &kDrawToStencil);
1488 return true;
1489}
1490
1492 return {this->surfaceProps(), this->scalerContextFlags(), &fSDFTControl};
1493}
1494
1496 const SkPaint& paint) {
1498 glyphRunList,
1499 paint,
1500 this->strikeDeviceInfo(),
1502}
1503
1504void Device::drawSlug(SkCanvas* canvas, const sktext::gpu::Slug* slug, const SkPaint& paint) {
1505 SkASSERT(canvas);
1506 SkASSERT(slug);
1507 const sktext::gpu::SlugImpl* slugImpl = static_cast<const sktext::gpu::SlugImpl*>(slug);
1508#if defined(SK_DEBUG)
1509 if (!fContext->priv().options().fSupportBilerpFromGlyphAtlas) {
1510 // We can draw a slug if the atlas has padding or if the creation matrix and the
1511 // drawing matrix are the same. If they are the same, then the Slug will use the direct
1512 // drawing code and not use bi-lerp.
1513 SkMatrix slugMatrix = slugImpl->initialPositionMatrix();
1514 SkMatrix positionMatrix = this->localToDevice();
1515 positionMatrix.preTranslate(slugImpl->origin().x(), slugImpl->origin().y());
1516 SkASSERT(slugMatrix == positionMatrix);
1517 }
1518#endif
1519 auto atlasDelegate = [&](const sktext::gpu::AtlasSubRun* subRun,
1520 SkPoint drawOrigin,
1521 const SkPaint& paint,
1522 sk_sp<SkRefCnt> subRunStorage,
1524 auto[drawingClip, op] = subRun->makeAtlasTextOp(
1525 this->clip(), this->localToDevice(), drawOrigin, paint,
1526 std::move(subRunStorage), fSurfaceDrawContext.get());
1527 if (op != nullptr) {
1528 fSurfaceDrawContext->addDrawOp(drawingClip, std::move(op));
1529 }
1530 };
1531
1532 slugImpl->subRuns()->draw(canvas, slugImpl->origin(), paint, slugImpl, atlasDelegate);
1533}
1534
1535} // namespace skgpu::ganesh
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
Definition: DM.cpp:213
SkAssertResult(font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs, std::size(glyphs))==count)
int count
Definition: FontMgrTest.cpp:50
static GrDirectContext * GrAsDirectContext(GrContext_Base *base)
#define GR_CREATE_TRACE_MARKER_CONTEXT(classname, op, context)
Definition: GrTracing.h:18
static GrQuadAAFlags SkToGrQuadAAFlags(unsigned flags)
Definition: GrTypesPriv.h:259
GrPrimitiveType
Definition: GrTypesPriv.h:43
static constexpr SkColorType GrColorTypeToSkColorType(GrColorType ct)
Definition: GrTypesPriv.h:589
GrAA
Definition: GrTypesPriv.h:173
GrColorType
Definition: GrTypesPriv.h:540
static constexpr GrColorType SkColorTypeToGrColorType(SkColorType ct)
Definition: GrTypesPriv.h:629
GrSurfaceOrigin
Definition: GrTypes.h:147
GrBackendApi
Definition: GrTypes.h:95
SkAlphaType
Definition: SkAlphaType.h:26
@ kOpaque_SkAlphaType
pixel is opaque
Definition: SkAlphaType.h:28
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
Definition: SkAlphaType.h:29
#define SK_ABORT(message,...)
Definition: SkAssert.h:70
#define SkASSERT(cond)
Definition: SkAssert.h:116
SkBackingFit
Definition: SkBackingFit.h:16
SkBlendMode
Definition: SkBlendMode.h:38
@ kSrcOver
r = s + (1-sa)*d
SkClipOp
Definition: SkClipOp.h:13
constexpr SkPMColor4f SK_PMColor4fTRANSPARENT
Definition: SkColorData.h:378
SkColorType
Definition: SkColorType.h:19
@ kRGBA_1010102_SkColorType
10 bits for red, green, blue; 2 bits for alpha; in 32-bit word
Definition: SkColorType.h:27
uint32_t SkColor
Definition: SkColor.h:37
static constexpr SkColor SkColorSetARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b)
Definition: SkColor.h:49
bool SkPaintToGrPaintReplaceShader(GrRecordingContext *context, const GrColorInfo &dstColorInfo, const SkPaint &skPaint, const SkMatrix &ctm, std::unique_ptr< GrFragmentProcessor > shaderFP, const SkSurfaceProps &surfaceProps, GrPaint *grPaint)
Definition: SkGr.cpp:570
SkColor4f SkColor4fPrepForDst(SkColor4f color, const GrColorInfo &colorInfo)
Definition: SkGr.cpp:283
bool SkPaintToGrPaintWithBlend(GrRecordingContext *context, const GrColorInfo &dstColorInfo, const SkPaint &skPaint, const SkMatrix &ctm, SkBlender *primColorBlender, const SkSurfaceProps &surfaceProps, GrPaint *grPaint)
Definition: SkGr.cpp:589
bool SkPaintToGrPaint(GrRecordingContext *context, const GrColorInfo &dstColorInfo, const SkPaint &skPaint, const SkMatrix &ctm, const SkSurfaceProps &surfaceProps, GrPaint *grPaint)
Definition: SkGr.cpp:553
std::tuple< GrSurfaceProxyView, GrColorType > GrMakeCachedBitmapProxyView(GrRecordingContext *rContext, const SkBitmap &bitmap, std::string_view label, skgpu::Mipmapped mipmapped)
Definition: SkGr.cpp:188
static SkColorType colorType(AImageDecoder *decoder, const AImageDecoderHeaderInfo *headerInfo)
static bool SkImageInfoValidConversion(const SkImageInfo &dst, const SkImageInfo &src)
SkYUVColorSpace
Definition: SkImageInfo.h:68
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
Definition: SkPath.cpp:3892
sk_sp< T > sk_ref_sp(T *obj)
Definition: SkRefCnt.h:381
const Context & fContext
SkFilterMode
static bool SkScalarNearlyEqual(SkScalar x, SkScalar y, SkScalar tolerance=SK_ScalarNearlyZero)
Definition: SkScalar.h:107
@ kNeedNewImageUniqueID_SpecialImage
constexpr int32_t SkToS32(S x)
Definition: SkTo.h:25
static void draw(SkCanvas *canvas, SkRect &target, int x, int y)
Definition: aaclip.cpp:27
const GrContextOptions & options() const
const GrCaps * caps() const
Definition: GrCaps.h:57
bool avoidLineDraws() const
Definition: GrCaps.h:555
GrBackendFormat getDefaultBackendFormat(GrColorType, GrRenderable) const
Definition: GrCaps.cpp:400
sk_sp< SkColorSpace > refColorSpace() const
Definition: GrColorInfo.cpp:49
GrColorType colorType() const
Definition: GrColorInfo.h:43
static sk_sp< GrColorSpaceXform > Make(SkColorSpace *src, SkAlphaType srcAT, SkColorSpace *dst, SkAlphaType dstAT)
virtual GrDirectContext * asDirectContext()
SK_API GrBackendApi backend() const
static const GrDisableColorXPFactory * Get()
void setXPFactory(const GrXPFactory *xpFactory)
Definition: GrPaint.h:53
int hasCoverageFragmentProcessor() const
Definition: GrPaint.h:83
void setColor4f(const SkPMColor4f &color)
Definition: GrPaint.h:50
void setCoverageFragmentProcessor(std::unique_ptr< GrFragmentProcessor > fp)
Definition: GrPaint.h:75
sk_sp< GrTextureProxy > createProxy(const GrBackendFormat &, SkISize dimensions, GrRenderable, int renderTargetSampleCnt, skgpu::Mipmapped, SkBackingFit, skgpu::Budgeted, GrProtected, std::string_view label, GrInternalSurfaceFlags=GrInternalSurfaceFlags::kNone, UseAllocator useAllocator=UseAllocator::kYes)
GrProxyProvider * proxyProvider()
GrRecordingContextPriv priv()
bool abandoned() override
SK_API bool colorTypeSupportedAsSurface(SkColorType colorType) const
SK_API int maxTextureSize() const
SkPathEffect * pathEffect() const
Definition: GrStyle.h:119
static const GrStyle & SimpleFill()
Definition: GrStyle.h:30
skgpu::Mipmapped mipmapped() const
void concatSwizzle(skgpu::Swizzle swizzle)
GrTextureProxy * asTextureProxy() const
SkISize dimensions() const
GrSurfaceOrigin origin() const
GrRenderTargetProxy * asRenderTargetProxy() const
static GrSurfaceProxyView Copy(GrRecordingContext *context, GrSurfaceProxyView src, skgpu::Mipmapped mipmapped, SkIRect srcRect, SkBackingFit fit, skgpu::Budgeted budgeted, std::string_view label)
GrProtected isProtected() const
virtual GrRenderTargetProxy * asRenderTargetProxy()
skgpu::Budgeted isBudgeted() const
static const GrXPFactory * FromBlendMode(SkBlendMode)
bool installPixels(const SkImageInfo &info, void *pixels, size_t rowBytes, void(*releaseProc)(void *addr, void *context), void *context)
Definition: SkBitmap.cpp:323
static sk_sp< SkBlender > Mode(SkBlendMode mode)
virtual GrRecordingContext * recordingContext() const
Definition: SkCanvas.cpp:1637
SrcRectConstraint
Definition: SkCanvas.h:1541
@ kLines_PointMode
draw each pair of points as a line segment
Definition: SkCanvas.h:1242
@ kPolygon_PointMode
draw the array of points as a open polygon
Definition: SkCanvas.h:1243
@ kPoints_PointMode
draw each point separately
Definition: SkCanvas.h:1241
@ kNone_QuadAAFlags
Definition: SkCanvas.h:1664
@ kAll_QuadAAFlags
Definition: SkCanvas.h:1665
const SkImageInfo & imageInfo() const
Definition: SkDevice.h:117
SkScalerContextFlags scalerContextFlags() const
Definition: SkDevice.cpp:498
int height() const
Definition: SkDevice.h:120
virtual void drawShadow(const SkPath &, const SkDrawShadowRec &)
const SkM44 & globalToDevice() const
Definition: SkDevice.h:191
sk_sp< SkSpecialImage > snapSpecial()
Definition: SkDevice.cpp:320
const SkMatrix & localToDevice() const
Definition: SkDevice.h:179
virtual void drawDevice(SkDevice *, const SkSamplingOptions &, const SkPaint &)
Definition: SkDevice.cpp:329
const SkSurfaceProps & surfaceProps() const
Definition: SkDevice.h:131
virtual void drawDrawable(SkCanvas *, SkDrawable *, const SkMatrix *)
Definition: SkDevice.cpp:298
int width() const
Definition: SkDevice.h:119
SkIRect bounds() const
Definition: SkDevice.h:125
virtual void drawArc(const SkArc &arc, const SkPaint &paint)
Definition: SkDevice.cpp:134
const SkRasterClip * fRC
Definition: SkDrawBase.h:156
const SkMatrix * fCTM
Definition: SkDrawBase.h:155
SkRect getBounds()
Definition: SkDrawable.cpp:71
std::unique_ptr< GpuDrawHandler > snapGpuDrawHandler(GrBackendApi backendApi, const SkMatrix &matrix, const SkIRect &clipBounds, const SkImageInfo &bufferInfo)
Definition: SkDrawable.h:89
uint32_t uniqueID() const
Definition: SkImage.h:311
SkAlphaType alphaType() const
Definition: SkImage.cpp:154
RescaleMode
Definition: SkImage.h:587
bool peekPixels(SkPixmap *pixmap) const
Definition: SkImage.cpp:34
int width() const
Definition: SkImage.h:285
RescaleGamma
Definition: SkImage.h:585
virtual bool isTextureBacked() const =0
int height() const
Definition: SkImage.h:291
sk_sp< SkColorSpace > refColorSpace() const
Definition: SkImage.cpp:158
bool getMinMaxScales(SkScalar scaleFactors[2]) const
Definition: SkMatrix.cpp:1540
static SkMatrix Concat(const SkMatrix &a, const SkMatrix &b)
Definition: SkMatrix.h:1775
static const SkMatrix & I()
Definition: SkMatrix.cpp:1544
SkMatrix & preTranslate(SkScalar dx, SkScalar dy)
Definition: SkMatrix.cpp:263
bool mapRect(SkRect *dst, const SkRect &src, SkApplyPerspectiveClip pc=SkApplyPerspectiveClip::kYes) const
Definition: SkMatrix.cpp:1141
bool isIdentity() const
Definition: SkMatrix.h:223
Definition: SkMesh.h:263
SkSpan< const ChildPtr > children() const
Definition: SkMesh.h:367
bool isValid() const
Definition: SkMesh.cpp:753
SkMeshSpecification * spec() const
Definition: SkMesh.h:348
@ kRound_Cap
adds circle
Definition: SkPaint.h:335
@ kStroke_Style
set to stroke geometry
Definition: SkPaint.h:194
uint8_t getAlpha() const
Definition: SkPaint.h:264
Definition: SkPath.h:59
bool isVolatile() const
Definition: SkPath.h:350
void transform(const SkMatrix &matrix, SkPath *dst, SkApplyPerspectiveClip pc=SkApplyPerspectiveClip::kYes) const
Definition: SkPath.cpp:1711
const SkImageInfo & info() const
Definition: SkPixmap.h:135
static SkRRect MakeOval(const SkRect &oval)
Definition: SkRRect.h:162
bool transform(const SkMatrix &matrix, SkRRect *dst) const
Definition: SkRRect.cpp:436
bool isEmpty() const
Definition: SkRRect.h:83
bool getBoundaryPath(SkPath *path) const
bool isRect() const
Definition: SkRegion.h:152
const SkIRect & getBounds() const
Definition: SkRegion.h:165
bool op(const SkIRect &rect, Op op)
Definition: SkRegion.h:384
bool setRect(const SkIRect &rect)
Definition: SkRegion.cpp:192
bool isEmpty() const
Definition: SkRegion.h:146
bool setPath(const SkPath &path, const SkRegion &clip)
static SkStrikeCache * GlobalStrikeCache()
SkSurfaceProps cloneWithPixelGeometry(SkPixelGeometry newPixelGeometry) const
ContentChangeMode
Definition: SkSurface.h:203
@ kRetain_ContentChangeMode
preserves surface on change
Definition: SkSurface.h:205
static sk_sp< SkVertices > MakeCopy(VertexMode mode, int vertexCount, const SkPoint positions[], const SkPoint texs[], const SkColor colors[], int indexCount, const uint16_t indices[])
Definition: SkVertices.cpp:200
@ kTriangles_VertexMode
Definition: SkVertices.h:31
SkVerticesPriv priv()
T * get() const
Definition: SkRefCnt.h:303
static std::tuple< bool, size_t > DrawAsTiledImageRect(SkCanvas *, const SkImage *, const SkRect &srcRect, const SkRect &dstRect, SkCanvas::QuadAAFlags, const SkSamplingOptions &, const SkPaint *, SkCanvas::SrcRectConstraint, size_t cacheSize, size_t maxTextureSize)
void clipPath(const SkMatrix &ctm, const SkPath &path, GrAA aa, SkClipOp op)
Definition: ClipStack.h:80
void clipRect(const SkMatrix &ctm, const SkRect &rect, GrAA aa, SkClipOp op)
Definition: ClipStack.h:74
SkIRect getConservativeBounds() const override
Definition: ClipStack.cpp:1195
void drawShadow(const SkPath &, const SkDrawShadowRec &) override
Definition: Device.cpp:1179
void drawOval(const SkRect &oval, const SkPaint &paint) override
Definition: Device.cpp:751
void android_utils_clipAsRgn(SkRegion *) const override
Definition: Device.cpp:412
void drawDRRect(const SkRRect &outer, const SkRRect &inner, const SkPaint &paint) override
Definition: Device.cpp:673
void drawPath(const SkPath &path, const SkPaint &paint, bool pathIsMutable) override
Definition: Device.cpp:803
SkImage::ReadPixelsContext ReadPixelsContext
Definition: Device.h:121
void drawPaint(const SkPaint &paint) override
Definition: Device.cpp:444
SkStrikeDeviceInfo strikeDeviceInfo() const override
Definition: Device.cpp:1491
GrSurfaceProxyView readSurfaceView()
Definition: Device.cpp:1283
void drawRect(const SkRect &r, const SkPaint &paint) override
Definition: Device.cpp:568
void drawVertices(const SkVertices *, sk_sp< SkBlender >, const SkPaint &, bool) override
Definition: Device.cpp:1110
void drawEdgeAAQuad(const SkRect &rect, const SkPoint clip[4], SkCanvas::QuadAAFlags aaFlags, const SkColor4f &color, SkBlendMode mode) override
Definition: Device.cpp:598
bool android_utils_clipWithStencil() override
Definition: Device.cpp:1465
void drawDrawable(SkCanvas *, SkDrawable *, const SkMatrix *) override
Definition: Device.cpp:1261
sk_sp< sktext::gpu::Slug > convertGlyphRunListToSlug(const sktext::GlyphRunList &glyphRunList, const SkPaint &paint) override
Definition: Device.cpp:1495
bool drawAsTiledImageRect(SkCanvas *, const SkImage *, const SkRect *src, const SkRect &dst, const SkSamplingOptions &, const SkPaint &, SkCanvas::SrcRectConstraint) override
Definition: Device.cpp:1000
bool isClipAntiAliased() const override
Definition: Device.cpp:432
void drawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint[], const SkPaint &paint) override
Definition: Device.cpp:461
sk_sp< SkSpecialImage > snapSpecialScaled(const SkIRect &subset, const SkISize &dstDims) override
Definition: Device.cpp:935
sk_sp< SkSurface > makeSurface(const SkImageInfo &, const SkSurfaceProps &) override
Definition: Device.cpp:1448
GrRenderTargetProxy * targetProxy()
Definition: Device.cpp:1287
bool wait(int numSemaphores, const GrBackendSemaphore *waitSemaphores, bool deleteSemaphoresAfterWait)
Definition: Device.cpp:1291
void drawAtlas(const SkRSXform[], const SkRect[], const SkColor[], int count, sk_sp< SkBlender >, const SkPaint &) override
Definition: Device.cpp:1198
SurfaceFillContext * surfaceFillContext()
Definition: Device.cpp:369
void drawMesh(const SkMesh &, sk_sp< SkBlender >, const SkPaint &) override
Definition: Device.cpp:1145
void asyncRescaleAndReadPixelsYUV420(SkYUVColorSpace yuvColorSpace, bool readAlpha, sk_sp< SkColorSpace > dstColorSpace, const SkIRect &srcRect, SkISize dstSize, RescaleGamma rescaleGamma, RescaleMode, ReadPixelsCallback callback, ReadPixelsContext context)
Definition: Device.cpp:1389
void asyncRescaleAndReadPixels(const SkImageInfo &info, const SkIRect &srcRect, RescaleGamma rescaleGamma, RescaleMode rescaleMode, ReadPixelsCallback callback, ReadPixelsContext context)
Definition: Device.cpp:1373
SkImage::ReadPixelsCallback ReadPixelsCallback
Definition: Device.h:120
void drawImageRect(const SkImage *, const SkRect *src, const SkRect &dst, const SkSamplingOptions &, const SkPaint &, SkCanvas::SrcRectConstraint) override
Definition: Device.cpp:976
void drawDevice(SkDevice *, const SkSamplingOptions &, const SkPaint &) override
Definition: Device.cpp:967
void clipRegion(const SkRegion &globalRgn, SkClipOp op) override
Definition: Device.cpp:395
SkIRect devClipBounds() const override
Definition: Device.h:260
void drawRRect(const SkRRect &r, const SkPaint &paint) override
Definition: Device.cpp:634
SurfaceDrawContext * surfaceDrawContext()
Definition: Device.cpp:359
bool replaceBackingProxy(SkSurface::ContentChangeMode, sk_sp< GrRenderTargetProxy >, GrColorType, sk_sp< SkColorSpace >, GrSurfaceOrigin, const SkSurfaceProps &)
Definition: Device.cpp:1308
void clipPath(const SkPath &path, SkClipOp op, bool aa) override
Definition: Device.cpp:384
static sk_sp< Device > Make(GrRecordingContext *, GrColorType, sk_sp< GrSurfaceProxy >, sk_sp< SkColorSpace >, GrSurfaceOrigin, const SkSurfaceProps &, InitContents)
Definition: Device.cpp:213
void drawArc(const SkArc &arc, const SkPaint &paint) override
Definition: Device.cpp:776
GrRecordingContext * recordingContext() const override
Definition: Device.h:101
void drawRegion(const SkRegion &r, const SkPaint &paint) override
Definition: Device.cpp:726
void drawSlug(SkCanvas *, const sktext::gpu::Slug *slug, const SkPaint &paint) override
Definition: Device.cpp:1504
sk_sp< SkDevice > createDevice(const CreateInfo &, const SkPaint *) override
Definition: Device.cpp:1418
void drawImageLattice(const SkImage *, const SkCanvas::Lattice &, const SkRect &dst, SkFilterMode, const SkPaint &) override
Definition: Device.cpp:1094
sk_sp< SkSpecialImage > makeSpecial(const SkBitmap &) override
Definition: Device.cpp:841
const GrColorInfo & colorInfo() const
GrSurfaceProxyView readSurfaceView()
static std::unique_ptr< SurfaceDrawContext > Make(GrRecordingContext *, GrColorType, sk_sp< GrSurfaceProxy >, sk_sp< SkColorSpace >, GrSurfaceOrigin, const SkSurfaceProps &)
static std::unique_ptr< SurfaceDrawContext > MakeWithFallback(GrRecordingContext *, GrColorType, sk_sp< SkColorSpace >, SkBackingFit, SkISize dimensions, const SkSurfaceProps &, int sampleCnt, skgpu::Mipmapped, skgpu::Protected, GrSurfaceOrigin=kBottomLeft_GrSurfaceOrigin, skgpu::Budgeted=skgpu::Budgeted::kYes)
const SkTextBlob * blob() const
Definition: GlyphRun.h:117
bool hasRSXForm() const
Definition: GlyphRun.h:105
const gpu::SubRunContainerOwner & subRuns() const
Definition: SlugImpl.h:57
const SkMatrix & initialPositionMatrix() const
Definition: SlugImpl.h:54
SkPoint origin() const
Definition: SlugImpl.h:55
static sk_sp< SlugImpl > Make(const SkMatrix &viewMatrix, const sktext::GlyphRunList &glyphRunList, const SkPaint &paint, SkStrikeDeviceInfo strikeDeviceInfo, sktext::StrikeForGPUCacheInterface *strikeCache)
Definition: SlugImpl.cpp:74
const Paint & paint
Definition: color_source.cc:38
DlColor color
VkDevice device
Definition: main.cc:53
float SkScalar
Definition: extension.cpp:12
FlutterSemanticsFlag flags
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
FlPixelBufferTexturePrivate * priv
uint32_t uint32_t * format
#define ASSERT_SINGLE_OWNER
Definition: Device.cpp:121
double y
double x
void DrawShapeWithMaskFilter(GrRecordingContext *rContext, skgpu::ganesh::SurfaceDrawContext *sdc, const GrClip *clip, const GrStyledShape &shape, GrPaint &&paint, const SkMatrix &viewMatrix, const SkMaskFilter *mf)
GrFPResult MakeChildFP(const SkRuntimeEffect::ChildPtr &child, const GrFPArgs &childArgs)
bool IsSupported(const SkMaskFilter *maskfilter)
GrFPResult Make(std::unique_ptr< GrFragmentProcessor >, GrClipEdgeType, const SkRRect &, const GrShaderCaps &)
static bool init()
unsigned useCenter Optional< SkMatrix > matrix
Definition: SkRecords.h:258
sk_sp< const SkImage > image
Definition: SkRecords.h:269
ClipOpAndAA opAA SkRegion region
Definition: SkRecords.h:238
SkRRect rrect
Definition: SkRecords.h:232
SkRect oval
Definition: SkRecords.h:249
sk_sp< SkBlender > blender SkRect rect
Definition: SkRecords.h:350
SkMesh mesh
Definition: SkRecords.h:345
PODArray< SkColor > colors
Definition: SkRecords.h:276
SkSamplingOptions sampling
Definition: SkRecords.h:337
sk_sp< SkSpecialImage > MakeDeferredFromGpu(GrRecordingContext *context, const SkIRect &subset, uint32_t uniqueID, GrSurfaceProxyView view, const GrColorInfo &colorInfo, const SkSurfaceProps &props)
SK_API sk_sp< SkSurface > RenderTarget(GrRecordingContext *context, skgpu::Budgeted budgeted, const SkImageInfo &imageInfo, int sampleCount, GrSurfaceOrigin surfaceOrigin, const SkSurfaceProps *surfaceProps, bool shouldCreateWithMips=false, bool isProtected=false)
Definition: bitmap.py:1
const uint32_t fp
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition: switches.h:57
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive mode
Definition: switches.h:228
dst
Definition: cp.py:12
const myers::Point & get< 0 >(const myers::Segment &s)
Definition: Myers.h:80
const myers::Point & get(const myers::Segment &)
std::tuple< GrSurfaceProxyView, GrColorType > AsView(GrRecordingContext *rContext, const SkImage *img, skgpu::Mipmapped mipmapped, GrImageTexGenPolicy policy)
Budgeted
Definition: GpuTypes.h:35
Mipmapped
Definition: GpuTypes.h:53
Protected
Definition: GpuTypes.h:61
sk_sp< Backend > MakeGaneshBackend(sk_sp< GrRecordingContext > context, GrSurfaceOrigin origin, const SkSurfaceProps &surfaceProps, SkColorType colorType)
Definition: ref_ptr.h:256
static constexpr Init< Ref, Test, TestMask, PassOp, FailOp, WriteMask > StaticInit()
Definition: SkArc.h:15
const SkPixelGeometry fPixelGeometry
Definition: SkDevice.h:307
const SkImageInfo fInfo
Definition: SkDevice.h:306
static constexpr SkIPoint Make(int32_t x, int32_t y)
Definition: SkPoint_impl.h:38
Definition: SkRect.h:32
static constexpr SkIRect MakeSize(const SkISize &size)
Definition: SkRect.h:66
static constexpr SkIRect MakeWH(int32_t w, int32_t h)
Definition: SkRect.h:56
Definition: SkSize.h:16
bool isOpaque() const
Definition: SkImageInfo.h:415
sk_sp< SkColorSpace > refColorSpace() const
SkISize dimensions() const
Definition: SkImageInfo.h:421
static SkImageInfo MakeUnknown()
Definition: SkImageInfo.h:357
static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at)
SkAlphaType alphaType() const
Definition: SkImageInfo.h:375
SkColorType colorType() const
Definition: SkImageInfo.h:373
static bool HasColors(const SkMeshSpecification &spec)
Definition: SkMeshPriv.h:30
constexpr float y() const
Definition: SkPoint_impl.h:187
constexpr float x() const
Definition: SkPoint_impl.h:181
static SkRect Make(const SkISize &size)
Definition: SkRect.h:669
static constexpr SkRect MakeEmpty()
Definition: SkRect.h:595
static SkRect MakeIWH(int w, int h)
Definition: SkRect.h:623