#include "src/gpu/ganesh/ops/RegionOp.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPoint.h"
#include "include/core/SkRect.h"
#include "include/core/SkRegion.h"
#include "include/core/SkString.h"
#include "include/gpu/ganesh/GrRecordingContext.h"
#include "include/private/SkColorData.h"
#include "include/private/base/SkDebug.h"
#include "include/private/base/SkTArray.h"
#include "include/private/gpu/ganesh/GrTypesPriv.h"
#include "src/base/SkSafeMath.h"
#include "src/gpu/BufferWriter.h"
#include "src/gpu/ganesh/GrAppliedClip.h"
#include "src/gpu/ganesh/GrDefaultGeoProcFactory.h"
#include "src/gpu/ganesh/GrGeometryProcessor.h"
#include "src/gpu/ganesh/GrOpFlushState.h"
#include "src/gpu/ganesh/GrPaint.h"
#include "src/gpu/ganesh/GrProcessorAnalysis.h"
#include "src/gpu/ganesh/GrProcessorSet.h"
#include "src/gpu/ganesh/GrProgramInfo.h"
#include "src/gpu/ganesh/ops/GrMeshDrawOp.h"
#include "src/gpu/ganesh/ops/GrSimpleMeshDrawOpHelperWithStencil.h"
#if defined(GPU_TEST_UTILS)
#include "src/base/SkRandom.h"
#include "src/gpu/ganesh/GrDrawOpTest.h"
#include "src/gpu/ganesh/GrTestUtils.h"
#endif
#include <utility>
class GrCaps;
class GrDstProxyView;
class GrMeshDrawTarget;
class GrSurfaceProxyView;
class SkArenaAlloc;
enum class GrXferBarrierFlags;
struct GrSimpleMesh;
namespace skgpu::ganesh {
class SurfaceDrawContext;
}
usingnamespaceskia_private;
namespace skgpu::ganesh::RegionOp {
namespace {
GrGeometryProcessor* make_gp(SkArenaAlloc* arena,
const SkMatrix& viewMatrix,
bool wideColor) { … }
class RegionOpImpl final : public GrMeshDrawOp { … };
}
GrOp::Owner Make(GrRecordingContext* context,
GrPaint&& paint,
const SkMatrix& viewMatrix,
const SkRegion& region,
GrAAType aaType,
const GrUserStencilSettings* stencilSettings) { … }
}
#if defined(GPU_TEST_UTILS)
GR_DRAW_OP_TEST_DEFINE(RegionOp) {
SkRegion region;
int n = random->nextULessThan(200);
for (int i = 0; i < n; ++i) {
SkIPoint center;
center.fX = random->nextULessThan(1000);
center.fY = random->nextULessThan(1000);
int w = random->nextRangeU(10, 1000);
int h = random->nextRangeU(10, 1000);
SkIRect rect = {center.fX - w / 2, center.fY - h / 2, center.fX + w / 2, center.fY + h / 2};
SkRegion::Op op;
if (i == 0) {
op = SkRegion::kReplace_Op;
} else {
static_assert(SkRegion::kLastOp == SkRegion::kReplace_Op);
op = (SkRegion::Op)random->nextULessThan(SkRegion::kLastOp);
}
region.op(rect, op);
}
SkMatrix viewMatrix = GrTest::TestMatrix(random);
GrAAType aaType = GrAAType::kNone;
if (numSamples > 1 && random->nextBool()) {
aaType = GrAAType::kMSAA;
}
return skgpu::ganesh::RegionOp::RegionOpImpl::Make(context,
std::move(paint),
viewMatrix,
region,
aaType,
GrGetRandomStencil(random, context));
}
#endif