mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Adding ImageShader support for CanvasKit (flutter/engine#18369)
* Adding ImageShader support for CanvasKit and fixing indices parameter for vertices. * Removing trailing spaces. * Using longer variable names.
This commit is contained in:
parent
a419b39732
commit
7cb7d51222
@ -119,10 +119,10 @@ class SkPaint extends SkiaObject implements ui.Paint {
|
||||
bool _invertColors = false;
|
||||
|
||||
@override
|
||||
ui.Shader get shader => _shader;
|
||||
ui.Shader get shader => _shader as ui.Shader;
|
||||
@override
|
||||
set shader(ui.Shader value) {
|
||||
_shader = value;
|
||||
_shader = value as EngineShader;
|
||||
_syncShader(skiaObject);
|
||||
}
|
||||
void _syncShader(js.JsObject object) {
|
||||
@ -132,7 +132,7 @@ class SkPaint extends SkiaObject implements ui.Paint {
|
||||
}
|
||||
object.callMethod('setShader', <js.JsObject>[skShader]);
|
||||
}
|
||||
EngineGradient _shader;
|
||||
EngineShader _shader;
|
||||
|
||||
@override
|
||||
ui.MaskFilter get maskFilter => _maskFilter;
|
||||
|
||||
@ -105,8 +105,6 @@ class SkVertices implements ui.Vertices {
|
||||
_encodePoints(positions),
|
||||
_encodePoints(textureCoordinates),
|
||||
colors,
|
||||
null,
|
||||
null,
|
||||
indices,
|
||||
]);
|
||||
|
||||
|
||||
@ -18,7 +18,12 @@ bool _matrix4IsValid(Float32List matrix4) {
|
||||
return true;
|
||||
}
|
||||
|
||||
abstract class EngineGradient implements ui.Gradient {
|
||||
abstract class EngineShader {
|
||||
/// Create a shader for use in the Skia backend.
|
||||
js.JsObject createSkiaShader();
|
||||
}
|
||||
|
||||
abstract class EngineGradient implements ui.Gradient, EngineShader {
|
||||
/// Hidden constructor to prevent subclassing.
|
||||
EngineGradient._();
|
||||
|
||||
@ -28,9 +33,6 @@ abstract class EngineGradient implements ui.Gradient {
|
||||
List<dynamic> webOnlySerializeToCssPaint() {
|
||||
throw UnsupportedError('CSS paint not implemented for this shader type');
|
||||
}
|
||||
|
||||
/// Create a shader for use in the Skia backend.
|
||||
js.JsObject createSkiaShader();
|
||||
}
|
||||
|
||||
class GradientSweep extends EngineGradient {
|
||||
@ -301,3 +303,29 @@ class EngineImageFilter implements ui.ImageFilter {
|
||||
return 'ImageFilter.blur($sigmaX, $sigmaY)';
|
||||
}
|
||||
}
|
||||
|
||||
js.JsObject _skTileMode(ui.TileMode tileMode) {
|
||||
switch(tileMode) {
|
||||
case ui.TileMode.clamp:
|
||||
return canvasKit['TileMode']['Clamp'];
|
||||
case ui.TileMode.repeated:
|
||||
return canvasKit['TileMode']['Repeat'];
|
||||
case ui.TileMode.mirror:
|
||||
default:
|
||||
return canvasKit['TileMode']['Mirror'];
|
||||
}
|
||||
}
|
||||
|
||||
/// Backend implementation of [ui.ImageShader].
|
||||
class EngineImageShader implements ui.ImageShader, EngineShader {
|
||||
EngineImageShader(ui.Image image, this.tileModeX, this.tileModeY,
|
||||
this.matrix4) : _skImage = image as SkImage;
|
||||
|
||||
final ui.TileMode tileModeX;
|
||||
final ui.TileMode tileModeY;
|
||||
final Float64List matrix4;
|
||||
final SkImage _skImage;
|
||||
|
||||
js.JsObject createSkiaShader() => _skImage.skImage.callMethod('makeShader',
|
||||
<dynamic>[_skTileMode(tileModeX), _skTileMode(tileModeY)]);
|
||||
}
|
||||
|
||||
@ -1812,3 +1812,24 @@ class Shadow {
|
||||
@override
|
||||
String toString() => 'TextShadow($color, $offset, $blurRadius)';
|
||||
}
|
||||
|
||||
|
||||
/// A shader (as used by [Paint.shader]) that tiles an image.
|
||||
class ImageShader extends Shader {
|
||||
/// Creates an image-tiling shader. The first argument specifies the image to
|
||||
/// tile. The second and third arguments specify the [TileMode] for the x
|
||||
/// direction and y direction respectively. The fourth argument gives the
|
||||
/// matrix to apply to the effect. All the arguments are required and must not
|
||||
/// be null.
|
||||
factory ImageShader(
|
||||
Image image,
|
||||
TileMode tmx,
|
||||
TileMode tmy,
|
||||
Float64List matrix4) {
|
||||
if (engine.experimentalUseSkia) {
|
||||
return engine.EngineImageShader(image, tmx, tmy, matrix4);
|
||||
}
|
||||
throw UnsupportedError(
|
||||
'ImageShader not implemented for web platform.');
|
||||
}
|
||||
}
|
||||
|
||||
@ -1086,11 +1086,6 @@ class PluginUtilities {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(flutter_web): see https://github.com/flutter/flutter/issues/33616.
|
||||
class ImageShader implements Shader {
|
||||
ImageShader(Image image, TileMode tmx, TileMode tmy, Float64List matrix4);
|
||||
}
|
||||
|
||||
// TODO(flutter_web): probably dont implement this one.
|
||||
class IsolateNameServer {
|
||||
// This class is only a namespace, and should not be instantiated or
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user