blob: 44d5a3648a667e6e857fd2efb86c646ffe34fa4d [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_GRAPHICS_LIB_COMPUTE_TESTS_COMMON_SVG_SVG_UTILS_H_
#define SRC_GRAPHICS_LIB_COMPUTE_TESTS_COMMON_SVG_SVG_UTILS_H_
#include <functional>
#include <vector>
#include "svg/svg.h"
#include "tests/common/affine_transform.h"
#include "tests/common/path_sink.h"
// Helper functions to parse the content of a given svg document.
// Parse a specific path in an |svg| document, identified by its |path_id|,
// and send the resulting path items to |target|. Return true on success, or
// false on failure.
extern bool
svg_decode_path(const struct svg * svg,
uint32_t path_id,
const affine_transform_t * transform,
PathSink * target);
// A struct describing a decoded raster entry from an svg instance.
// |svg| is the input svg document.
// |raster_id| is the raster's index in the document.
// |path_id| is the matching path index in the document.
// |transform| is the affine transform applied to the path to create the raster.
struct SvgDecodedRaster
{
const svg * svg;
uint32_t raster_id;
uint32_t path_id;
affine_transform_t transform;
// A callable type that takes a const reference to an SvgDecodedRaster
// and returns true on success, or false on failure.
// Used in svg_decode_rasters() below. If this returns false, decoding will
// stop and force the latter function to return false as well.
using Callback = std::function<bool(const SvgDecodedRaster &)>;
};
// Parse all rasters in an input document, and invoke |callback| for each one
// of them in succession. |transform| is an optional initial transform to be
// applied to all rasters. Return true on success, or false on failure
// (which is defined as one of the callback invocation returning false).
//
// NOTE: Due to the way transforms are encoded in a struct svg instance,
// decoding individual rasters is not efficient, so no API is provided to do
// that.
extern bool
svg_decode_rasters(const struct svg * svg,
const affine_transform_t * transform,
SvgDecodedRaster::Callback callback);
// A struct describing a decoded layer entry from an svg instance.
// |svg| is the input svg document.
// |layer_id| is the layer's index in the document.
// |fill_color| is the fill color to be applied to all rasters in the layer.
// |fill_opacity| is the fill opacity to be applied to all rasters in the
// layer.
// |opacity| is another opacity parameter to be applied to |fill_opacity|.
// |fill_even_odd| will be true if rasters must be filled using the even-odd
// rule in this layer. Otherwise, the default non-zero winding rule will be
// used instead.
// |prints| is an array of placed raster references in the layer.
struct SvgDecodedLayer
{
const svg * svg = nullptr;
uint32_t layer_id = 0;
svg_color_t fill_color = 0;
float fill_opacity = 1.;
float opacity = 1.;
bool fill_even_odd = false;
struct Print
{
uint32_t raster_id;
int32_t tx, ty;
};
std::vector<Print> prints;
// A callable type that takes a const reference to a SvgDecodedLayer and
// returns true on success, or false on failure.
// Used by svg_decode_layers() below. If this returns false, decoding
// will stop and force the latter function will return false.
using Callback = std::function<bool(const SvgDecodedLayer &)>;
};
// Parse all layers in an input document, and invoke |callback| for each one
// of them in succession. Return true on success, or false on failure, (which
// is defined as one of the callback invocation returning false).
//
// Note that layer id are decoded in increasing order, as they appear in the
// input document. When rendering with Spinel, one may prefer to reverse the
// order, i.e. by using (svg_layer_count(l.svg) - 1 - l.layer_id) as the ID
// encoded in an spn_styling_t.
//
// NOTE: Due to the way layers are encoded in a struct svg instance,
// decoding individual layers is not efficient, so not API is provided
// to do that.
extern bool
svg_decode_layers(const struct svg * svg, SvgDecodedLayer::Callback callback);
#endif // SRC_GRAPHICS_LIB_COMPUTE_TESTS_COMMON_SVG_SVG_UTILS_H_