Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | List of all members
ColorCubeColorFilterRT Class Reference
Inheritance diagram for ColorCubeColorFilterRT:
RuntimeShaderGM skiagm::GM

Public Member Functions

 ColorCubeColorFilterRT ()
 
void onOnceBeforeDraw () override
 
void onDraw (SkCanvas *canvas) override
 
- Public Member Functions inherited from RuntimeShaderGM
 RuntimeShaderGM (const char *name, SkISize size, const char *sksl, uint32_t flags=0)
 
void onOnceBeforeDraw () override
 
bool runAsBench () const override
 
SkString getName () const override
 
SkISize getISize () override
 
bool onAnimate (double nanos) override
 
- Public Member Functions inherited from skiagm::GM
 GM (SkColor backgroundColor=SK_ColorWHITE)
 
virtual ~GM ()
 
void setMode (Mode mode)
 
Mode getMode () const
 
DrawResult gpuSetup (SkCanvas *, SkString *errorMsg, GraphiteTestContext *=nullptr)
 
void gpuTeardown ()
 
void onceBeforeDraw ()
 
DrawResult draw (SkCanvas *canvas)
 
DrawResult draw (SkCanvas *, SkString *errorMsg)
 
void drawBackground (SkCanvas *)
 
DrawResult drawContent (SkCanvas *canvas)
 
DrawResult drawContent (SkCanvas *, SkString *errorMsg)
 
SkScalar width ()
 
SkScalar height ()
 
SkColor getBGColor () const
 
void setBGColor (SkColor)
 
void drawSizeBounds (SkCanvas *, SkColor)
 
bool animate (double)
 
virtual bool onChar (SkUnichar)
 
bool getControls (SkMetaData *controls)
 
void setControls (const SkMetaData &controls)
 
virtual void modifyGrContextOptions (GrContextOptions *)
 
virtual void modifyGraphiteContextOptions (skgpu::graphite::ContextOptions *) const
 
virtual bool isBazelOnly () const
 
virtual std::map< std::string, std::string > getGoldKeys () const
 

Public Attributes

sk_sp< SkImagefMandrill
 
sk_sp< SkImagefMandrillSepia
 
sk_sp< SkImagefIdentityCube
 
sk_sp< SkImagefSepiaCube
 

Additional Inherited Members

- Public Types inherited from skiagm::GM
enum  Mode { kGM_Mode , kSample_Mode , kBench_Mode }
 
using DrawResult = skiagm::DrawResult
 
using GraphiteTestContext = skiatest::graphite::GraphiteTestContext
 
- Static Public Attributes inherited from skiagm::GM
static constexpr char kErrorMsg_DrawSkippedGpuOnly []
 
- Protected Member Functions inherited from skiagm::GM
virtual DrawResult onGpuSetup (SkCanvas *, SkString *, GraphiteTestContext *)
 
virtual void onGpuTeardown ()
 
virtual DrawResult onDraw (SkCanvas *, SkString *errorMsg)
 
virtual bool onGetControls (SkMetaData *)
 
virtual void onSetControls (const SkMetaData &)
 
GraphiteTestContextgraphiteTestContext () const
 
- Protected Attributes inherited from RuntimeShaderGM
SkString fName
 
SkISize fSize
 
uint32_t fFlags
 
float fSecs = 0.0f
 
SkString fSkSL
 
sk_sp< SkRuntimeEffectfEffect
 

Detailed Description

Definition at line 354 of file runtimeshader.cpp.

Constructor & Destructor Documentation

◆ ColorCubeColorFilterRT()

ColorCubeColorFilterRT::ColorCubeColorFilterRT ( )
inline

Definition at line 356 of file runtimeshader.cpp.

356 : RuntimeShaderGM("color_cube_cf_rt", {512, 512}, R"(
357 uniform shader color_cube;
358
359 uniform float rg_scale;
360 uniform float rg_bias;
361 uniform float b_scale;
362 uniform float inv_size;
363
364 half4 main(half4 inColor) {
365 float4 c = unpremul(inColor);
366
367 // Map to cube coords:
368 float3 cubeCoords = float3(c.rg * rg_scale + rg_bias, c.b * b_scale);
369
370 // Compute slice coordinate
371 float2 coords1 = float2((floor(cubeCoords.b) + cubeCoords.r) * inv_size, cubeCoords.g);
372 float2 coords2 = float2(( ceil(cubeCoords.b) + cubeCoords.r) * inv_size, cubeCoords.g);
373
374 // Two bilinear fetches, plus a manual lerp for the third axis:
375 half4 color = mix(color_cube.eval(coords1), color_cube.eval(coords2),
376 fract(cubeCoords.b));
377
378 // Premul again
379 color.rgb *= color.a;
380
381 return color;
382 }
383 )", kColorFilter_RTFlag) {}
@ kColorFilter_RTFlag

Member Function Documentation

◆ onDraw()

void ColorCubeColorFilterRT::onDraw ( SkCanvas canvas)
inlineoverridevirtual

Reimplemented from skiagm::GM.

Definition at line 396 of file runtimeshader.cpp.

396 {
398
399 // First we draw the unmodified image, and a copy that was sepia-toned in Photoshop:
400 canvas->drawImage(fMandrill, 0, 0);
401 canvas->drawImage(fMandrillSepia, 0, 256);
402
403 // LUT dimensions should be (kSize^2, kSize)
404 constexpr float kSize = 16.0f;
405
407
408 builder.uniform("rg_scale") = (kSize - 1) / kSize;
409 builder.uniform("rg_bias") = 0.5f / kSize;
410 builder.uniform("b_scale") = kSize - 1;
411 builder.uniform("inv_size") = 1.0f / kSize;
412
414
415 // TODO: Should we add SkImage::makeNormalizedShader() to handle this automatically?
416 SkMatrix normalize = SkMatrix::Scale(1.0f / (kSize * kSize), 1.0f / kSize);
417
418 // Now draw the image with an identity color cube - it should look like the original
419 builder.child("color_cube") = fIdentityCube->makeShader(sampling, normalize);
420
421 paint.setColorFilter(builder.makeColorFilter());
422 canvas->drawImage(fMandrill, 256, 0, sampling, &paint);
423
424 // ... and with a sepia-tone color cube. This should match the sepia-toned image.
425 builder.child("color_cube") = fSepiaCube->makeShader(sampling, normalize);
426
427 paint.setColorFilter(builder.makeColorFilter());
428 canvas->drawImage(fMandrill, 256, 256, sampling, &paint);
429 }
static void normalize(int n, double *gauss)
sk_sp< SkImage > fIdentityCube
sk_sp< SkImage > fMandrillSepia
sk_sp< SkImage > fSepiaCube
sk_sp< SkImage > fMandrill
sk_sp< SkRuntimeEffect > fEffect
void drawImage(const SkImage *image, SkScalar left, SkScalar top)
Definition SkCanvas.h:1528
sk_sp< SkShader > makeShader(SkTileMode tmx, SkTileMode tmy, const SkSamplingOptions &, const SkMatrix *localMatrix=nullptr) const
Definition SkImage.cpp:179
static SkMatrix Scale(SkScalar sx, SkScalar sy)
Definition SkMatrix.h:75
static constexpr int kSize
const Paint & paint
SkSamplingOptions sampling
Definition SkRecords.h:337

◆ onOnceBeforeDraw()

void ColorCubeColorFilterRT::onOnceBeforeDraw ( )
inlineoverridevirtual

Reimplemented from skiagm::GM.

Definition at line 387 of file runtimeshader.cpp.

387 {
388 fMandrill = ToolUtils::GetResourceAsImage("images/mandrill_256.png");
389 fMandrillSepia = ToolUtils::GetResourceAsImage("images/mandrill_sepia.png");
390 fIdentityCube = ToolUtils::GetResourceAsImage("images/lut_identity.png");
391 fSepiaCube = ToolUtils::GetResourceAsImage("images/lut_sepia.png");
392
394 }
void onOnceBeforeDraw() override
sk_sp< SkImage > GetResourceAsImage(const char *resource)
Definition DecodeUtils.h:25

Member Data Documentation

◆ fIdentityCube

sk_sp<SkImage> ColorCubeColorFilterRT::fIdentityCube

Definition at line 385 of file runtimeshader.cpp.

◆ fMandrill

sk_sp<SkImage> ColorCubeColorFilterRT::fMandrill

Definition at line 385 of file runtimeshader.cpp.

◆ fMandrillSepia

sk_sp<SkImage> ColorCubeColorFilterRT::fMandrillSepia

Definition at line 385 of file runtimeshader.cpp.

◆ fSepiaCube

sk_sp<SkImage> ColorCubeColorFilterRT::fSepiaCube

Definition at line 385 of file runtimeshader.cpp.


The documentation for this class was generated from the following file: