skia2/gn/gm.gni

418 lines
11 KiB
Plaintext
Raw Normal View History

# Copyright 2016 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Things are easiest for everyone if these source paths are absolute.
_gm = get_path_info("../gm", "abspath")
gm_sources = [
"$_gm/3d.cpp",
"$_gm/aaa.cpp",
"$_gm/aaclip.cpp",
"$_gm/aarecteffect.cpp",
"$_gm/aarectmodes.cpp",
"$_gm/aaxfermodes.cpp",
"$_gm/addarc.cpp",
"$_gm/all_bitmap_configs.cpp",
"$_gm/alpha_image.cpp",
"$_gm/alphagradients.cpp",
Reland "Reland "Implement an explicit binary search-based analytic gradient colorizer"" This is a reland of f065907ccc0ae5e9258443b5a1bbabeef181e965 3rd time's the charm: The new analytic gradient shader was sporadically triggering violations of the coverage as alpha compatibility optimization. Unfortunately, even when using the same device and random seed for the test, the bots did not always reproduce the error. However, we identified the likely cause of the violation. The test requires that all output channels are less than the input alpha, which it uses to validate whether or not the shader is modulating its values by the input alpha. This test does not pass if the RGB values are greater than 1. The original version of the analytic gradient shader used half4s for its scale and bias values. Given the threshold limit for hardstops of 0.00024 (SkNearlyZero), a very small interval that is not treated as a hardstop can create a scale or bias of over 4000. This moves into the very imprecise region of 16-bit floats, making it plausible that the gradient outputs colors greater than 1, due to rounding. The kicker is that the random test generation for stop locations does not use a uniform distribution, but is instead biased towards the remaining interval, which increases the likelihood of generating a small interval that is not treated as a hard stop. We are keeping this behavior since ill-conditioned gradients are useful in testing. Original change's description: > Reland "Implement an explicit binary search-based analytic gradient colorizer" > > This reverts commit 9461dcf1306a9a9517e1545cf6d16bde05261280. > > Reason for revert: Fixes for ANGLE's incorrect shader behavior > > Original change's description: > > Revert "Implement an explicit binary search-based analytic gradient colorizer" > > > > This reverts commit dcc85fc61008f61daef4313846bdd62877fd596d. > > > > Reason for revert: ANGLE is frequently corrupted, particularly radial_gradient4 and mixershader > > > > Original change's description: > > > Implement an explicit binary search-based analytic gradient colorizer > > > > > > Provides a reasonably flexible fragment processor that defines another > > > colorizer implementation for gradients. It can support up to 8 > > > interpolation intervals (which is 16 colors if every stop is a hard stop > > > or 9 colors if every stop is a smooth transition). It > > > supports mixtures of hard and smooth stops. It is conditionally compiled > > > into versions specific to the interval count (so it can produce up to > > > 8 shader variants). > > > > > > The GrGradientShader controller does not remove the single and dual > > > interval colorizers, which are useful specializations of this explicit > > > binary search colorizer. Similarly, since it can only handle up to 8 > > > intervals, the texture colorizer is still used as a fallback. > > > > > > Currently it does not employ capabilities detection to determine if the > > > hardware can support the number of required uniforms, which can become > > > substantial for the larger gradient configurations. > > > > > > Bug: chromium:796479, chromium:729727, chromium:696603, chromium:543625, chromium:414254 > > > Change-Id: Ia1f735a5019766ae4796cc22964b2913db34b95b > > > Reviewed-on: https://skia-review.googlesource.com/155080 > > > Commit-Queue: Michael Ludwig <michaelludwig@google.com> > > > Reviewed-by: Brian Osman <brianosman@google.com> > > > > TBR=bsalomon@google.com,brianosman@google.com,michaelludwig@google.com > > > > Change-Id: I351a387f0528e4c2db2d47ab2e5d6b336991fb98 > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Bug: chromium:796479, chromium:729727, chromium:696603, chromium:543625, chromium:414254 > > Reviewed-on: https://skia-review.googlesource.com/156541 > > Reviewed-by: Michael Ludwig <michaelludwig@google.com> > > Commit-Queue: Michael Ludwig <michaelludwig@google.com> > > TBR=bsalomon@google.com,brianosman@google.com,michaelludwig@google.com > > Change-Id: I2aca36307d88c26905d860ec29417ec68c6037cc > Bug: chromium:796479, chromium:729727, chromium:696603, chromium:543625, chromium:414254 > Reviewed-on: https://skia-review.googlesource.com/156542 > Reviewed-by: Michael Ludwig <michaelludwig@google.com> > Commit-Queue: Michael Ludwig <michaelludwig@google.com> Bug: chromium:796479, chromium:729727, chromium:696603, chromium:543625, chromium:414254 Change-Id: I2d050624781c77cdd160291cadbadac602b48bde Reviewed-on: https://skia-review.googlesource.com/c/157569 Commit-Queue: Michael Ludwig <michaelludwig@google.com> Reviewed-by: Brian Osman <brianosman@google.com>
2018-09-28 15:53:32 +00:00
"$_gm/analytic_gradients.cpp",
"$_gm/androidblendmodes.cpp",
"$_gm/animated_gif.cpp",
Handle EXIF orientation in SkAnimatedImage Bug: skia:10914 Bug: b/163595585 In a WebP image, it is possible to combine animation with an EXIF orientation. While SkAndroidCodec attempts to handle orientation itself by decoding into temporary memory and then drawing through a matrix, this doesn't work directly when compositing a P-frame into a prior frame. SkAnimatedImage already uses an SkMatrix to handle cropping and scaling, so update that matrix to include the orientation. Make SkAnimatedImage a friend of SkAndroidCodec. This allows the former to have the same ExifOrientationBehavior specified by the latter, and to recreate the latter so it does not try to handle the orientation itself. Clip SkAnimatedImage to its bounds. Android's AnimatedImageDrawable performs its own clip, but this makes a crop rect work for other clients. Update getCurrentFrame to take cropping, scaling, and orientation into account. This method is used by CanvasKit, which does not use cropping or scaling, but will now properly orient an animation with an EXIF orientation. Add a GM that exercises the various combinations of ways SkAnimatedImage can be used: - via newPictureSnapshot (as in Android) versus getCurrentFrame - scaling down to a dimension that can be output from the SkAndroidCodec, versus up, which SkAnimatedImage scales - with a crop rect - with a post processor Change-Id: If1854e9aea23fc4afddf75d39132b38e3fbc6071 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/333223 Commit-Queue: Leon Scroggins <scroggo@google.com> Reviewed-by: Derek Sollenberger <djsollen@google.com>
2020-11-06 22:05:36 +00:00
"$_gm/animated_image_orientation.cpp",
"$_gm/animatedimageblurs.cpp",
"$_gm/anisotropic.cpp",
"$_gm/annotated_text.cpp",
"$_gm/arcofzorro.cpp",
"$_gm/arcto.cpp",
"$_gm/arithmode.cpp",
"$_gm/asyncrescaleandread.cpp",
"$_gm/b_119394958.cpp",
"$_gm/backdrop.cpp",
"$_gm/backdrop_imagefilter_croprect.cpp",
"$_gm/badpaint.cpp",
"$_gm/bc1_transparency.cpp",
"$_gm/beziereffects.cpp",
"$_gm/beziers.cpp",
"$_gm/bicubic.cpp",
"$_gm/bigblurs.cpp",
"$_gm/bigmatrix.cpp",
"$_gm/bigrect.cpp",
"$_gm/bigrrectaaeffect.cpp",
"$_gm/bigtext.cpp",
"$_gm/bigtileimagefilter.cpp",
"$_gm/bitmapcopy.cpp",
"$_gm/bitmapfilters.cpp",
"$_gm/bitmapimage.cpp",
"$_gm/bitmappremul.cpp",
"$_gm/bitmaprect.cpp",
"$_gm/bitmaprecttest.cpp",
"$_gm/bitmapshader.cpp",
"$_gm/bitmaptiled.cpp",
"$_gm/bleed.cpp",
"$_gm/blend.cpp",
"$_gm/blurcircles.cpp",
"$_gm/blurcircles2.cpp",
"$_gm/blurignorexform.cpp",
"$_gm/blurimagevmask.cpp",
"$_gm/blurpositioning.cpp",
"$_gm/blurquickreject.cpp",
"$_gm/blurrect.cpp",
"$_gm/blurredclippedcircle.cpp",
"$_gm/blurroundrect.cpp",
"$_gm/blurs.cpp",
"$_gm/blurtextsmallradii.cpp",
"$_gm/bmpfilterqualityrepeat.cpp",
"$_gm/bug5252.cpp",
"$_gm/bug530095.cpp",
"$_gm/bug615686.cpp",
"$_gm/bug6643.cpp",
"$_gm/bug6783.cpp",
"$_gm/bug9331.cpp",
"$_gm/cgm.c",
"$_gm/cgms.cpp",
"$_gm/circle_sizes.cpp",
"$_gm/circulararcs.cpp",
"$_gm/circularclips.cpp",
"$_gm/clear_swizzle.cpp",
"$_gm/clip_error.cpp",
"$_gm/clip_sierpinski_region.cpp",
"$_gm/clip_strokerect.cpp",
"$_gm/clipdrawdraw.cpp",
"$_gm/clippedbitmapshaders.cpp",
"$_gm/clockwise.cpp",
GrTessellator: improved straight skeleton implementation. This patch improves the straight skeleton implementation used by GrTessellator to collapse overlap regions in the alpha gradient border. The resulting quality improvement can be seen in the "thinconcavepaths" GM, for example, where the coverage values of the "thin right angle", "thin rect and triangle" and "skinny snake" are now lower and match the raster backend more closely. It also improves correctness, such as on the linked Chromium bugs below. Previously, the straight skeleton was performed using the same Vertex and Edge classes used for tessellation, but this led to fragility in maintaining the connectivity and ordering required by those classes. Instead, that functionality has been moved to new SSEdge and SSVertex classes. Their construction results in alternating SSVertex and SSEdges around the boundary of the each overlap region, shrunk by one SSEdge as the boundary collapses. Applying events may now also create further events (chained events), as intersections between newly-adjacent bisectors change the structure of the skeleton. This is always calculated from the bisectors of original boundary, not the shrunk boundary of the straight skeleton, which is why each SSEdge points at its originating Edge. If the edges are parallel or near-parallel, the bisector may be infinite. This is handled by a new flavour of create_event(), which does a Line/Line intersection (rather than an Edge/Edge intersection) to find the intersection between the infinite bisector and an adjacent bisector. Several ancillary bugs were fixed: the priority queue used to represent edge events was sorting the inner edges incorrectly. These need to be sorted in descending not ascending order of coverage. Its implementation was moved from Skia's TDPQueue to std::priority_queue(), which is more flexible in specifying a comparator. check_for_intersection()'s partner synthesis code was moved into a new function, compute_bisector(), also used by the chained skeleton events code. Degenerate edges are now removed during the simplify_boundary() pass. They were previously detected but ignored, causing incorrect inner and outer tangents to be computed in stroke_boundary(). An fSynthetic flag was added to Vertex, in order to detect vertices which cannot be moved by an edge collapse event (e.g., intersections with non-boundary edges, merged vertices, straight skeleton vertices). More raw implementation notes: Connect straight skeleton vertices as we find them, so we don't have to use partnering (ss_connect()). Only disconnect edges which are still alive after event application. Add a check for near-parallel lines in compute_bisector(). Don't use edge type to determine direction to offset for bisectors. The winding should already include this information. Move Event ownership to SSEdge. If we're down to the last two edges in a skeleton, don't check for events. Add concave_arc_and_circle GM. Add a collapsepaths GM. Bug: 941429, 913349, 929915, 945853 Change-Id: Ib89e231d0e8611f8735fd3592db6391da096369d Reviewed-on: https://skia-review.googlesource.com/c/skia/+/215094 Commit-Queue: Stephen White <senorblanco@chromium.org> Reviewed-by: Robert Phillips <robertphillips@google.com>
2019-05-22 14:50:14 +00:00
"$_gm/collapsepaths.cpp",
"$_gm/color4f.cpp",
"$_gm/coloremoji.cpp",
"$_gm/coloremoji_blendmodes.cpp",
"$_gm/colorfilteralpha8.cpp",
"$_gm/colorfilterimagefilter.cpp",
"$_gm/colorfilters.cpp",
"$_gm/colormatrix.cpp",
"$_gm/colorspace.cpp",
"$_gm/colorwheel.cpp",
Support COLRv1 color fonts Implement support for COLRv1 color gradient vector forms. COLR v1 is an extension to the OpenType COLR tables that introduces support for gradients, transforms and compositing. [1] COLRv1 fonts contain an OpenType COLR table with format v1. In a COLR v1 table, glyphs are defined by a directed, acyclic graph of Paint operations. The task for the Skia implementation is to extract the COLR v1 information from the font using FreeType's COLRv1 API, then traverse the glyph graph and translate information from the font into Skia operations on SkCanvas. Care needs to be taken for transformations to work correctly. FreeType sends a top level transform that includes the scaling from font units to actual glyph size, as well as optional transforms configured on FreeType using FT_Set_Transform. This is set up as the starting transform at the beginning of drawing a COLRv1 glyph. At the stage of setting a clip for a PaintGlyph operation, the glyph outline is retrieved from FreeType unscaled and untransformed. Since the starting transformation is applied to the SkCanvas, the unscaled glyph is properly scaled and positioned. Similarly, computing the initial bounding box for the COLRv1 glyph needs to consider transformations. COLRv1 glyphs have a base glyph entry in the glyf table which can use a minimum of two points for defining a bounding box. This bounding box is an imaged rectangle enclosing those two points at the identity transform. We need to compute the bounding box scaled, but at identity transform, then make a rectangle from it, that we then transform so that we get a large enough area to paint in. If those two points from the glyf table would be transformed first, then we would compute the bounding box, the resulting bounding box ends up too small. As a test font, add a version of the samples-glyf_colr_1.ttf from [2] with one glyph added for testing PaintColrGlyph functionality and compositions. Add a basic GM test that produces color glyphs untransformed, with skew and with rotation and combinations of those. [1] https://github.com/googlefonts/colr-gradients-spec/ [2] https://github.com/googlefonts/color-fonts Bug: skia:11264 Change-Id: I8357cd0c7ac0039bb2eac18f21fa343bf61871eb Reviewed-on: https://skia-review.googlesource.com/c/skia/+/300558 Commit-Queue: Dominik Röttsches <drott@chromium.org> Commit-Queue: Ben Wagner <bungeman@google.com> Auto-Submit: Dominik Röttsches <drott@chromium.org> Reviewed-by: Ben Wagner <bungeman@google.com>
2021-02-11 19:08:44 +00:00
"$_gm/colrv1.cpp",
"$_gm/complexclip.cpp",
"$_gm/complexclip2.cpp",
"$_gm/complexclip3.cpp",
"$_gm/complexclip4.cpp",
"$_gm/complexclip_blur_tiled.cpp",
"$_gm/composeshader.cpp",
"$_gm/compositor_quads.cpp",
"$_gm/compressed_textures.cpp",
"$_gm/concavepaths.cpp",
"$_gm/conicpaths.cpp",
"$_gm/constcolorprocessor.cpp",
"$_gm/convex_all_line_paths.cpp",
"$_gm/convexpaths.cpp",
"$_gm/convexpolyclip.cpp",
"$_gm/convexpolyeffect.cpp",
"$_gm/copy_to_4444.cpp",
"$_gm/crbug_1041204.cpp",
"$_gm/crbug_1073670.cpp",
"$_gm/crbug_1086705.cpp",
"$_gm/crbug_1113794.cpp",
"$_gm/crbug_1139750.cpp",
"$_gm/crbug_1156804.cpp",
"$_gm/crbug_1162942.cpp",
"$_gm/crbug_1167277.cpp",
"$_gm/crbug_1174186.cpp",
"$_gm/crbug_1174354.cpp",
"$_gm/crbug_1177833.cpp",
"$_gm/crbug_224618.cpp",
"$_gm/crbug_691386.cpp",
"$_gm/crbug_788500.cpp",
"$_gm/crbug_847759.cpp",
"$_gm/crbug_884166.cpp",
"$_gm/crbug_887103.cpp",
"$_gm/crbug_892988.cpp",
"$_gm/crbug_899512.cpp",
"$_gm/crbug_905548.cpp",
"$_gm/crbug_908646.cpp",
GrTessellator: improved straight skeleton implementation. This patch improves the straight skeleton implementation used by GrTessellator to collapse overlap regions in the alpha gradient border. The resulting quality improvement can be seen in the "thinconcavepaths" GM, for example, where the coverage values of the "thin right angle", "thin rect and triangle" and "skinny snake" are now lower and match the raster backend more closely. It also improves correctness, such as on the linked Chromium bugs below. Previously, the straight skeleton was performed using the same Vertex and Edge classes used for tessellation, but this led to fragility in maintaining the connectivity and ordering required by those classes. Instead, that functionality has been moved to new SSEdge and SSVertex classes. Their construction results in alternating SSVertex and SSEdges around the boundary of the each overlap region, shrunk by one SSEdge as the boundary collapses. Applying events may now also create further events (chained events), as intersections between newly-adjacent bisectors change the structure of the skeleton. This is always calculated from the bisectors of original boundary, not the shrunk boundary of the straight skeleton, which is why each SSEdge points at its originating Edge. If the edges are parallel or near-parallel, the bisector may be infinite. This is handled by a new flavour of create_event(), which does a Line/Line intersection (rather than an Edge/Edge intersection) to find the intersection between the infinite bisector and an adjacent bisector. Several ancillary bugs were fixed: the priority queue used to represent edge events was sorting the inner edges incorrectly. These need to be sorted in descending not ascending order of coverage. Its implementation was moved from Skia's TDPQueue to std::priority_queue(), which is more flexible in specifying a comparator. check_for_intersection()'s partner synthesis code was moved into a new function, compute_bisector(), also used by the chained skeleton events code. Degenerate edges are now removed during the simplify_boundary() pass. They were previously detected but ignored, causing incorrect inner and outer tangents to be computed in stroke_boundary(). An fSynthetic flag was added to Vertex, in order to detect vertices which cannot be moved by an edge collapse event (e.g., intersections with non-boundary edges, merged vertices, straight skeleton vertices). More raw implementation notes: Connect straight skeleton vertices as we find them, so we don't have to use partnering (ss_connect()). Only disconnect edges which are still alive after event application. Add a check for near-parallel lines in compute_bisector(). Don't use edge type to determine direction to offset for bisectors. The winding should already include this information. Move Event ownership to SSEdge. If we're down to the last two edges in a skeleton, don't check for events. Add concave_arc_and_circle GM. Add a collapsepaths GM. Bug: 941429, 913349, 929915, 945853 Change-Id: Ib89e231d0e8611f8735fd3592db6391da096369d Reviewed-on: https://skia-review.googlesource.com/c/skia/+/215094 Commit-Queue: Stephen White <senorblanco@chromium.org> Reviewed-by: Robert Phillips <robertphillips@google.com>
2019-05-22 14:50:14 +00:00
"$_gm/crbug_913349.cpp",
"$_gm/crbug_918512.cpp",
"$_gm/crbug_938592.cpp",
"$_gm/crbug_946965.cpp",
"$_gm/crbug_947055.cpp",
"$_gm/crbug_996140.cpp",
"$_gm/croppedrects.cpp",
"$_gm/crosscontextimage.cpp",
"$_gm/cubicpaths.cpp",
"$_gm/daa.cpp",
"$_gm/dashcircle.cpp",
"$_gm/dashcubics.cpp",
"$_gm/dashing.cpp",
"$_gm/degeneratesegments.cpp",
"$_gm/dftext.cpp",
"$_gm/dftext_blob_persp.cpp",
"$_gm/discard.cpp",
"$_gm/displacement.cpp",
"$_gm/distantclip.cpp",
"$_gm/draw_bitmap_rect_skbug4374.cpp",
"$_gm/drawable.cpp",
"$_gm/drawatlas.cpp",
"$_gm/drawatlascolor.cpp",
"$_gm/drawbitmaprect.cpp",
"$_gm/drawimageset.cpp",
"$_gm/drawminibitmaprect.cpp",
"$_gm/drawquadset.cpp",
"$_gm/drawregion.cpp",
"$_gm/drawregionmodes.cpp",
"$_gm/dropshadowimagefilter.cpp",
"$_gm/drrect.cpp",
"$_gm/drrect_small_inner.cpp",
"$_gm/dsl_processor_test.cpp",
"$_gm/dstreadshuffle.cpp",
"$_gm/ducky_yuv_blend.cpp",
"$_gm/emboss.cpp",
"$_gm/emptypath.cpp",
"$_gm/encode.cpp",
"$_gm/encode_alpha_jpeg.cpp",
"$_gm/encode_color_types.cpp",
"$_gm/encode_platform.cpp",
"$_gm/encode_srgb.cpp",
"$_gm/exoticformats.cpp",
"$_gm/fadefilter.cpp",
"$_gm/fatpathfill.cpp",
"$_gm/filltypes.cpp",
"$_gm/filltypespersp.cpp",
"$_gm/filterbug.cpp",
"$_gm/filterfastbounds.cpp",
"$_gm/filterindiabox.cpp",
"$_gm/flippity.cpp",
"$_gm/fontcache.cpp",
"$_gm/fontmgr.cpp",
"$_gm/fontregen.cpp",
"$_gm/fontscaler.cpp",
"$_gm/fontscalerdistortable.cpp",
Update how sample(matrix) calls are invoked in SkSL This removes the kMixed type of SkSL::SampleMatrix. All analysis of FP sampling due to parent-child relationships is tracked in flags on GrFragmentProcessor now. The sample strategy is tracked as follows: - An FP marks itself as using the local coordinate builtin directly (automatically done for .fp code based on reference to sk_TransformedCoords2D[0]). - This state propagates up the parent towards the root, marking FPs as using coordinates indirectly. We stop the propagation when we hit a parent FP that explicitly samples the child because it becomes the source of the child's coordinates. - If that parent references its local coordinates directly, that kicks off its own upwards propagation. - Being sampled explicitly propagates down to all children, and effectively disables vertex-shader evaluation of transforms. - A variable matrix automatically marks this flag as well, since it's essentially a shortcut to (matrix expression) * coords. - The matrix type also propagates down, but right now that's only for whether or not there's perspective. - This doesn't affect FS coord evaluation since each FP applies its action independently. - But for VS-promoted transforms, the child's varying may inherit perspective (or other more general matrix types) from the parent and switch from a float2 to a float3. - A SampleMatrix no longer tracks a base or owner, GrFragmentProcessor exposes its parent FP. An FP's sample matrix is always owned by its immediate parent. - This means that you can have a hierarchy from root to leaf like: [uniform, none, none, uses local coords], and that leaf will have a SampleMatrix of kNone type. However, because of parent tracking, the coordinate generation can walk up to the root and detect the proper transform expression it needs to produce, and automatically de-duplicate across children. Currently, all FP's that are explicitly sampled have a signature of (color, float2 coord). FP's that don't use local coords, or whose coords are promoted to a varying have a signature of (color). - In this case, the shader builder either updates args.fLocalCoords to point to the varying directly, or adds a float2 local to the function body that includes the perspective divide. GrFragmentProcessor automatically pretends it has an identity coord transform if the FP is marked as referencing the local coord builtin. This allows these FPs to still be processed as part of GrGLSLGeometryProcessor::collectTransforms, but removes the need for FP implementations to declare an identity GrCoordTransform. - To test this theory, GrTextureEffect and GrSkSLFP no longer have coord transforms explicitly. - Later CLs can trivially remove them from a lot of the other effects. - The coord generation should not change because it detects in both cases that the coord transform matrices were identity. GrGLSLGeometryProcessor's collectTransforms and emitTransformCode has been completely overhauled to recurse up an FP's parent pointers and collect the expressions that affect the result. It de-duplicates expressions between siblings, and is able to produce a single varying for the base local coord (either when there are no intervening transforms, or the root FP needs an explicit coordinate to start off with). This also adds the fp_sample_chaining GM from Brian, with a few more configurations to fill out the cells. Bug: skia:10396 Change-Id: I86acc0c34c9f29d6371b34370bee9a18c2acf1c1 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/297868 Commit-Queue: Michael Ludwig <michaelludwig@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com> Reviewed-by: Brian Osman <brianosman@google.com>
2020-06-24 13:04:56 +00:00
"$_gm/fp_sample_chaining.cpp",
"$_gm/fpcoordinateoverride.cpp",
"$_gm/fwidth_squircle.cpp",
"$_gm/gammatext.cpp",
"$_gm/getpostextpath.cpp",
"$_gm/giantbitmap.cpp",
"$_gm/glyph_pos.cpp",
"$_gm/gm.cpp",
"$_gm/gm.h",
"$_gm/gpu_blur_utils.cpp",
"$_gm/gradient_dirty_laundry.cpp",
"$_gm/gradient_matrix.cpp",
"$_gm/gradients.cpp",
"$_gm/gradients_2pt_conical.cpp",
"$_gm/gradients_degenerate.cpp",
"$_gm/gradients_no_texture.cpp",
"$_gm/gradtext.cpp",
"$_gm/grayscalejpg.cpp",
"$_gm/hairlines.cpp",
"$_gm/hairmodes.cpp",
"$_gm/hardstop_gradients.cpp",
"$_gm/highcontrastfilter.cpp",
"$_gm/hittestpath.cpp",
"$_gm/hsl.cpp",
"$_gm/hugepath.cpp",
"$_gm/image.cpp",
"$_gm/image_pict.cpp",
"$_gm/image_shader.cpp",
"$_gm/imagealphathreshold.cpp",
"$_gm/imageblur.cpp",
"$_gm/imageblur2.cpp",
"$_gm/imageblurclampmode.cpp",
"$_gm/imageblurrepeatmode.cpp",
"$_gm/imageblurtiled.cpp",
"$_gm/imagefilters.cpp",
"$_gm/imagefiltersbase.cpp",
"$_gm/imagefiltersclipped.cpp",
"$_gm/imagefilterscropexpand.cpp",
"$_gm/imagefilterscropped.cpp",
"$_gm/imagefiltersgraph.cpp",
"$_gm/imagefiltersscaled.cpp",
"$_gm/imagefiltersstroked.cpp",
"$_gm/imagefilterstransformed.cpp",
"$_gm/imagefromyuvtextures.cpp",
"$_gm/imagemagnifier.cpp",
"$_gm/imagemakewithfilter.cpp",
"$_gm/imagemasksubset.cpp",
"$_gm/imageresizetiled.cpp",
"$_gm/imagescalealigned.cpp",
"$_gm/imagesource.cpp",
"$_gm/imagesource2.cpp",
"$_gm/internal_links.cpp",
"$_gm/inverseclip.cpp",
"$_gm/inversepaths.cpp",
"$_gm/jpg_color_cube.cpp",
"$_gm/labyrinth.cpp",
"$_gm/largeclippedpath.cpp",
"$_gm/largeglyphblur.cpp",
"$_gm/lattice.cpp",
"$_gm/lazytiling.cpp",
"$_gm/lcdblendmodes.cpp",
"$_gm/lcdoverlap.cpp",
"$_gm/lcdtext.cpp",
"$_gm/lighting.cpp",
"$_gm/linepaths.cpp",
"$_gm/localmatriximagefilter.cpp",
"$_gm/localmatriximageshader.cpp",
"$_gm/localmatrixshader.cpp",
"$_gm/lumafilter.cpp",
"$_gm/mac_aa_explorer.cpp",
"$_gm/make_raster_image.cpp",
"$_gm/makecolorspace.cpp",
"$_gm/mandoline.cpp",
"$_gm/manypaths.cpp",
"$_gm/matrixconvolution.cpp",
"$_gm/matriximagefilter.cpp",
"$_gm/mipmap.cpp",
"$_gm/mixedtextblobs.cpp",
"$_gm/mixercolorfilter.cpp",
"$_gm/modecolorfilters.cpp",
"$_gm/morphology.cpp",
"$_gm/nested.cpp",
"$_gm/ninepatchstretch.cpp",
"$_gm/nonclosedpaths.cpp",
"$_gm/offsetimagefilter.cpp",
"$_gm/orientation.cpp",
"$_gm/ovals.cpp",
"$_gm/overdrawcanvas.cpp",
"$_gm/overdrawcolorfilter.cpp",
"$_gm/overstroke.cpp",
"$_gm/p3.cpp",
"$_gm/particles.cpp",
"$_gm/patch.cpp",
"$_gm/path_stroke_with_zero_length.cpp",
"$_gm/patharcto.cpp",
"$_gm/pathcontourstart.cpp",
"$_gm/patheffects.cpp",
"$_gm/pathfill.cpp",
"$_gm/pathinterior.cpp",
"$_gm/pathmaskcache.cpp",
"$_gm/pathmeasure.cpp",
"$_gm/pathopsinverse.cpp",
"$_gm/pathreverse.cpp",
"$_gm/pdf_never_embed.cpp",
"$_gm/perlinnoise.cpp",
"$_gm/perspimages.cpp",
"$_gm/perspshaders.cpp",
"$_gm/picture.cpp",
"$_gm/pictureimagefilter.cpp",
"$_gm/pictureimagegenerator.cpp",
"$_gm/pictureshader.cpp",
"$_gm/pictureshadercache.cpp",
"$_gm/pictureshadertile.cpp",
"$_gm/pixelsnap.cpp",
"$_gm/plus.cpp",
"$_gm/points.cpp",
"$_gm/poly2poly.cpp",
"$_gm/polygonoffset.cpp",
"$_gm/polygons.cpp",
"$_gm/postercircle.cpp",
"$_gm/preservefillrule.cpp",
"$_gm/quadpaths.cpp",
"$_gm/radial_gradient_precision.cpp",
"$_gm/rasterhandleallocator.cpp",
"$_gm/readpixels.cpp",
"$_gm/recordopts.cpp",
"$_gm/repeated_bitmap.cpp",
"$_gm/resizeimagefilter.cpp",
"$_gm/roundrects.cpp",
"$_gm/rrect.cpp",
"$_gm/rrectclipdrawpaint.cpp",
"$_gm/rrects.cpp",
"$_gm/rsxtext.cpp",
"$_gm/runtimecolorfilter.cpp",
"$_gm/runtimeeffectimage.cpp",
"$_gm/runtimefunctions.cpp",
"$_gm/runtimeintrinsics.cpp",
"$_gm/runtimeshader.cpp",
"$_gm/sample_matrix_constant.cpp",
"$_gm/sample_matrix_variable.cpp",
"$_gm/samplelocations.cpp",
"$_gm/samplerstress.cpp",
"$_gm/savelayer.cpp",
"$_gm/scaledemoji.cpp",
"$_gm/scaledemoji_rendering.cpp",
"$_gm/scaledstrokes.cpp",
"$_gm/shadermaskfilter.cpp",
"$_gm/shadertext3.cpp",
"$_gm/shadowutils.cpp",
"$_gm/shallowgradient.cpp",
"$_gm/shapes.cpp",
"$_gm/sharedcorners.cpp",
"$_gm/showmiplevels.cpp",
"$_gm/simple_magnification.cpp",
"$_gm/simpleaaclip.cpp",
"$_gm/simplerect.cpp",
"$_gm/skbug1719.cpp",
"$_gm/skbug_257.cpp",
"$_gm/skbug_4868.cpp",
"$_gm/skbug_5321.cpp",
"$_gm/skbug_8664.cpp",
"$_gm/skbug_8955.cpp",
"$_gm/skbug_9319.cpp",
"$_gm/skbug_9819.cpp",
"$_gm/smallarc.cpp",
"$_gm/smallpaths.cpp",
"$_gm/spritebitmap.cpp",
"$_gm/srcmode.cpp",
"$_gm/srgb.cpp",
"$_gm/stlouisarch.cpp",
"$_gm/stringart.cpp",
"$_gm/stroke_rect_shader.cpp",
"$_gm/strokedlines.cpp",
"$_gm/strokefill.cpp",
"$_gm/strokerect.cpp",
"$_gm/strokerect_anisotropic.cpp",
"$_gm/strokerects.cpp",
"$_gm/strokes.cpp",
"$_gm/stroketext.cpp",
"$_gm/subsetshader.cpp",
"$_gm/surface.cpp",
"$_gm/swizzle.cpp",
"$_gm/tablecolorfilter.cpp",
"$_gm/tallstretchedbitmaps.cpp",
"$_gm/tessellation.cpp",
"$_gm/testgradient.cpp",
"$_gm/texelsubset.cpp",
"$_gm/text_scale_skew.cpp",
"$_gm/textblob.cpp",
"$_gm/textblobblockreordering.cpp",
"$_gm/textblobcolortrans.cpp",
"$_gm/textblobgeometrychange.cpp",
"$_gm/textblobmixedsizes.cpp",
"$_gm/textblobrandomfont.cpp",
"$_gm/textblobshader.cpp",
"$_gm/textblobtransforms.cpp",
"$_gm/textblobuseaftergpufree.cpp",
"$_gm/texteffects.cpp",
"$_gm/thinconcavepaths.cpp",
"$_gm/thinrects.cpp",
"$_gm/thinstrokedrects.cpp",
"$_gm/tiledscaledbitmap.cpp",
"$_gm/tileimagefilter.cpp",
"$_gm/tilemodes.cpp",
"$_gm/tilemodes_alpha.cpp",
"$_gm/tilemodes_scaled.cpp",
"$_gm/tinybitmap.cpp",
"$_gm/transparency.cpp",
"$_gm/trickycubicstrokes.cpp",
"$_gm/typeface.cpp",
"$_gm/unpremul.cpp",
"$_gm/userfont.cpp",
"$_gm/variedtext.cpp",
"$_gm/verifiers/gmverifier.cpp",
"$_gm/vertices.cpp",
"$_gm/verylargebitmap.cpp",
"$_gm/wacky_yuv_formats.cpp",
"$_gm/widebuttcaps.cpp",
"$_gm/windowrectangles.cpp",
"$_gm/xfermodeimagefilter.cpp",
"$_gm/xfermodes.cpp",
"$_gm/xfermodes2.cpp",
"$_gm/xfermodes3.cpp",
"$_gm/ycbcrimage.cpp",
"$_gm/yuv420_odd_dim.cpp",
"$_gm/yuvtorgbsubset.cpp",
]
gl_gm_sources = [ "$_gm/rectangletexture.cpp" ]