@@ -39,16 +39,13 @@ import {
3939 SymbolLayer ,
4040} from "./esri/types/symbols" ;
4141import { fieldToFProperty } from "./expressions.ts" ;
42- // import { writeFileSync, existsSync, mkdirSync } from 'fs';
43- // import uuid from 'uuid';
44- // import { tmpdir } from 'os';
45- // import path from 'path';
42+ import { resizeBase64Image } from "./base64Utils.ts" ;
4643
47- export const processSymbolLayer = (
44+ export const processSymbolLayer = async (
4845 layer : SymbolLayer ,
4946 symbol : CIMSymbol ,
5047 options : Options ,
51- ) : Symbolizer [ ] | undefined => {
48+ ) : Promise < Symbolizer [ ] | undefined > => {
5249 let layerType : string = layer . type ;
5350
5451 switch ( layerType ) {
@@ -63,9 +60,8 @@ export const processSymbolLayer = (
6360 case "CIMHatchFill" :
6461 return processSymbolHatchFill ( layer ) ;
6562 case "CIMPictureFill" :
66- return processSymbolPicture ( layer , symbol , options ) ;
6763 case "CIMPictureMarker" :
68- return processSymbolMarker ( layer ) ;
64+ return await processSymbolPicture ( layer , symbol , options ) ;
6965 default :
7066 return ;
7167 }
@@ -333,14 +329,16 @@ const processOrientedMarkerAtEndOfLine = (
333329const processMarkerPlacementInsidePolygon = (
334330 symbolizer : MarkSymbolizer ,
335331 markerPlacement : CIMMarkerPlacement ,
336- respectFrame : boolean = true
332+ respectFrame : boolean = true ,
337333) : [
338334 Expression < number > ,
339335 Expression < number > ,
340336 Expression < number > ,
341337 Expression < number > ,
342338] => {
343- const isSpecialFont = ESRI_SPECIAL_FONT . some ( font => symbolizer ?. wellKnownName ?. startsWith ( font ) ) ;
339+ const isSpecialFont = ESRI_SPECIAL_FONT . some ( ( font ) =>
340+ symbolizer ?. wellKnownName ?. startsWith ( font ) ,
341+ ) ;
344342 // In case of markers in a polygon fill, it seems ArcGIS does some undocumented resizing of the marker.
345343 // We use an empirical factor to account for this, which works in most cases. For special Fonts we need to
346344 // use another empirical factor when respectFrame is set to false.
@@ -528,11 +526,11 @@ const processSymbolCharacterMarker = (
528526 return [ symbolCharacterMaker ] ;
529527} ;
530528
531- const processSymbolVectorMarker = (
529+ const processSymbolVectorMarker = async (
532530 layer : SymbolLayer ,
533531 cimSymbol : CIMSymbol ,
534532 options : Options ,
535- ) : Symbolizer [ ] => {
533+ ) : Promise < Symbolizer [ ] > => {
536534 if ( layer . size ) {
537535 layer . size = ptToPxProp ( layer , "size" , 3 ) ;
538536 }
@@ -553,7 +551,8 @@ const processSymbolVectorMarker = (
553551 // TODO: support multiple marker graphics
554552 const markerGraphic = markerGraphics [ 0 ] ;
555553 if ( markerGraphic . symbol && markerGraphic . symbol . symbolLayers ) {
556- symbol = processSymbolReference ( markerGraphic , { } ) [ 0 ] as MarkSymbolizer ;
554+ const symbolReferences = await processSymbolReference ( markerGraphic , { } ) ;
555+ symbol = symbolReferences [ 0 ] as MarkSymbolizer ;
557556 const subLayers = markerGraphic . symbol . symbolLayers . filter (
558557 ( sublayer : SymbolLayer ) => sublayer . enable ,
559558 ) ;
@@ -695,67 +694,31 @@ const processSymbolHatchFill = (layer: SymbolLayer): Symbolizer[] => {
695694 return [ fillSymbolizer ] ;
696695} ;
697696
698- const processSymbolPicture = (
697+ const processSymbolPicture = async (
699698 layer : SymbolLayer ,
700699 cimSymbol : CIMSymbol ,
701700 options : Options ,
702- ) : Symbolizer [ ] => {
703- // let url = layer.url;
704- // if (!existsSync(url)) {
705- // let tokens = url.split(';');
706- // if (tokens.length === 2) {
707- // let ext = tokens[0].split('/').pop();
708- // let data = tokens[1].substring('base64,'.length);
709- // let tempPath = path.join(
710- // tmpdir(),
711- // 'bridgestyle',
712- // uuid.v4().replace('-', ''),
713- // );
714- // let iconName = `${uuid.v4()}.${ext}`;
715- // let iconFile = path.join(tempPath, iconName);
716- // mkdirSync(tempPath, { recursive: true });
717- // writeFileSync(iconFile, Buffer.from(data, 'base64'));
718- // usedIcons.push(iconFile);
719- // url = iconFile;
720- // }
721- // }
722-
723- let size = ptToPxProp ( layer , "height" , ptToPxProp ( layer , "size" , 0 ) ) ;
724- const picureFillSymbolizer : Symbolizer = {
701+ ) : Promise < Symbolizer [ ] > => {
702+ const size = ptToPxProp ( layer , "height" , ptToPxProp ( layer , "size" , 0 ) ) ;
703+ const resizedImage = ( await resizeBase64Image ( layer . url , size ) ) ?? "" ;
704+ const pictureFillSymbolizer : Symbolizer = {
725705 opacity : 1.0 ,
726- rotate : 0.0 ,
706+ rotate : 0 ,
727707 kind : "Icon" ,
728- color : undefined ,
729- // image: url,
730- image : "http://FIXME" ,
708+ image : resizedImage ,
731709 size : size ,
732710 } ;
733711
734712 const symbolizerWithSubSymbolizer = processSymbolLayerWithSubSymbol (
735713 cimSymbol ,
736714 layer ,
737- picureFillSymbolizer ,
715+ pictureFillSymbolizer ,
738716 options ,
739717 ) ;
740718 if ( symbolizerWithSubSymbolizer . length ) {
741719 return symbolizerWithSubSymbolizer ;
742720 }
743- return [ picureFillSymbolizer ] ;
744- } ;
745-
746- const processSymbolMarker = ( layer : SymbolLayer ) : Symbolizer [ ] => {
747- let size = ptToPxProp ( layer , "height" , ptToPxProp ( layer , "size" , 0 ) ) ;
748- return [
749- {
750- opacity : 1.0 ,
751- rotate : 0.0 ,
752- kind : "Icon" ,
753- color : undefined ,
754- // image: url,
755- image : "http://FIXME" ,
756- size : size ,
757- } as Symbolizer ,
758- ] ;
721+ return [ pictureFillSymbolizer ] ;
759722} ;
760723
761724const extractEffect = ( layer : SymbolLayer ) : Effect => {
0 commit comments