build method

Future<BitmapDescriptor> build()

Implementation

Future<BitmapDescriptor> build() async {
  String svgString;
  final mediaQueryData = MediaQuery.of(_context);
  if (_assetName != null) {
    svgString = await DefaultAssetBundle.of(_context).loadString(_assetName!);
  } else if (_svgString != null) {
    svgString = _svgString!;
  } else {
    svgString = _dummySvg;
  }
  if (_interpolateParams != null) {
    svgString = svgString.interpolate(_interpolateParams!);
  }
  //DrawableRoot drawableRoot = await svg.fromSvgString(svgString, "");

  final pictureInfo = await vg.loadPicture(SvgStringLoader(svgString), null);

  // double width = drawableRoot.viewport.width;
  // double height = drawableRoot.viewport.height;

  int originalWidth = pictureInfo.size.width.round();
  int originalHeight = pictureInfo.size.height.round();
  int targetWidth = originalWidth;
  int targetHeight = originalHeight;

  if (_originalSizeAsLp) {
    final ratio = mediaQueryData.devicePixelRatio;
    targetWidth = (originalWidth * ratio).round();
    targetHeight = (originalHeight * ratio).round();
  } else if (_originalSizeAsSp) {
    final ratio = mediaQueryData.devicePixelRatio * mediaQueryData.textScaleFactor;
    targetWidth = (originalWidth * ratio).round();
    targetHeight = (originalHeight * ratio).round();
  } else if (_targetLpWidth > 0) {
    final int pxWidth = (_targetLpWidth * mediaQueryData.devicePixelRatio).round();
    if (pxWidth != originalWidth) {
      targetWidth = pxWidth;
      targetHeight = (originalHeight * pxWidth / originalWidth).round();
    }
  } else if (_targetSpWidth > 0) {
    final int pxWidth = (_targetSpWidth * mediaQueryData.devicePixelRatio * mediaQueryData.textScaleFactor).round();
    if (pxWidth != originalWidth) {
      targetWidth = pxWidth;
      targetHeight = (originalHeight * pxWidth / originalWidth).round();
    }
  } else if (_targetPxWidth > 0) {
    if (_targetPxWidth != originalWidth) {
      targetWidth = _targetPxWidth;
      targetHeight = (originalHeight * _targetPxWidth / originalWidth).round();
    }
  }
  BitmapDescriptor? bitmapDescriptor;
  bool hit = false;
  if (_useCache) {
    bitmapDescriptor = bitmapDescriptorCache.get(svgString, targetWidth, targetHeight);
    if (bitmapDescriptor == null) {
      hit = false;
      //ui.Picture picture = drawableRoot.toPicture(size: Size(width, height));
      bitmapDescriptor = await _bitmapDescriptorFromPictureInfo(
        pictureInfo: pictureInfo,
        originalWidth: originalWidth,
        originalHeight: originalHeight,
        targetWidth: targetWidth,
      );
      bitmapDescriptorCache.set(svgString, targetWidth, targetHeight, bitmapDescriptor);
    } else {
      hit = true;
    }
  } else {
    // ui.Picture picture = drawableRoot.toPicture(size: Size(width, height));
    bitmapDescriptor = await _bitmapDescriptorFromPictureInfo(
      pictureInfo: pictureInfo,
      originalWidth: originalWidth,
      originalHeight: originalHeight,
      targetWidth: targetWidth,
    );
  }
  if (_debugLog) {
    debugPrint("BitmapDescriptorFromSvgAssetBuilder");
    debugPrint("devicePixelRatio ${mediaQueryData.devicePixelRatio}");
    debugPrint("textScaleFactor ${mediaQueryData.textScaleFactor}");
    debugPrint("assetName $_assetName");
    debugPrint("svgString $svgString");
    debugPrint("interpolateParams $_interpolateParams");
    debugPrint("original size ${pictureInfo.size}");
    debugPrint("originalSizeAsLp $_originalSizeAsLp");
    debugPrint("originalSizeAsSp $_originalSizeAsSp");
    debugPrint("targetLpWidth $_targetLpWidth");
    debugPrint("targetSpWidth $_targetSpWidth");
    debugPrint("targetPxWidth $_targetPxWidth");
    debugPrint("output width $targetWidth");
    debugPrint("output height $targetHeight");
    debugPrint("_useCache $_useCache hit $hit");
  }
  pictureInfo.picture.dispose();
  return bitmapDescriptor;
}