github.com/gotranspile/cxgo@v0.3.7/examples/potrace/cxgo.yml (about)

     1  vcs: https://github.com/skyrpex/potrace.git
     2  branch: '1.15'
     3  root: ./src
     4  out: ../../.examples/potrace-go
     5  package: gotrace
     6  int_size: 8
     7  ptr_size: 8
     8  use_go_int: true
     9  define:
    10    - name: VERSION
    11      value: '"dev"'
    12    - name: POTRACE
    13      value: '"potrace"'
    14    - name: MKBITMAP
    15      value: '"potrace"'
    16  idents:
    17    # rename functions and types to be more Go-like
    18    - name: bm_new
    19      rename: NewBitmap
    20    - name: bm_read
    21      rename: BitmapRead
    22    - name: potrace_trace
    23      rename: Trace
    24    - name: potrace_param_default
    25      rename: ParamDefault
    26    - name: potrace_word
    27      rename: Word
    28    - name: potrace_dpoint_s
    29      rename: DPoint
    30    - name: point_s
    31      rename: Point
    32    - name: potrace_param_s
    33      rename: Param
    34      fields:
    35        - name: opticurve
    36          type: bool
    37    - name: potrace_curve_s
    38      rename: Curve
    39      fields:
    40        - name: tag
    41          type: slice
    42        - name: c
    43          type: slice
    44    - name: privcurve_s
    45      rename: privCurve
    46      fields:
    47        - name: tag
    48          type: slice
    49        - name: c
    50          type: slice
    51        - name: vertex
    52          type: slice
    53        - name: alpha
    54          type: slice
    55        - name: alpha0
    56          type: slice
    57        - name: beta
    58          type: slice
    59    - name: potrace_path_s
    60      rename: Path
    61    - name: potrace_state_s
    62      rename: State
    63    - name: potrace_bitmap_s
    64      rename: Bitmap
    65      fields:
    66        - name: map
    67          type: slice
    68    # looks like a way to introduce private types or something
    69    # alias those types directly
    70    - name: potrace_dpoint_t
    71      alias: true
    72    - name: dpoint_t
    73      alias: true
    74    - name: point_t
    75      alias: true
    76    - name: potrace_state_t
    77      alias: true
    78    - name: potrace_path_t
    79      alias: true
    80    - name: potrace_privpath_t
    81      alias: true
    82    - name: potrace_privpath_s
    83      fields:
    84        - name: pt
    85          type: slice
    86        - name: sums
    87          type: slice
    88        - name: lon
    89          type: slice
    90        - name: po
    91          type: slice
    92    - name: potrace_curve_t
    93      alias: true
    94    - name: potrace_bitmap_t
    95      alias: true
    96    - name: potrace_param_t
    97      alias: true
    98    - name: greymap_s
    99      rename: Greymap
   100      fields:
   101        - name: base
   102          type: slice
   103        - name: map
   104          type: slice
   105    - name: greymap_t
   106      alias: true
   107    - name: gm_new
   108      rename: NewGreymap
   109    - name: gm_read
   110      rename: GreymapRead
   111    - name: imginfo_s
   112      rename: ImgInfo
   113    - name: imginfo_t
   114      alias: true
   115    - name: dim_t
   116      alias: true
   117    - name: dim_s
   118      rename: Dim
   119    - name: trans_t
   120      alias: true
   121    - name: trans_s
   122      rename: Trans
   123    - name: path_t
   124      alias: true
   125    - name: privpath_t
   126      alias: true
   127    - name: privcurve_t
   128      alias: true
   129    - name: sums_t
   130      alias: true
   131    - name: dpoint3_t
   132      alias: true
   133  files:
   134    - name: auxiliary.h
   135      skip:
   136        - potrace_dpoint_s
   137      idents:
   138        - name: interval
   139          rename: aux_interval
   140    - name: backend_svg.c
   141      idents:
   142        - name: info_s
   143          rename: BackendInfo
   144          fields:
   145            - name: debug
   146              type: bool
   147            - name: opaque
   148              type: bool
   149      replace:
   150        - old: 'func unit('
   151          new: 'func unit(info *BackendInfo, '
   152        - old: 'func svg_moveto('
   153          new: 'func svg_moveto(info *BackendInfo, '
   154        - old: 'func svg_rmoveto('
   155          new: 'func svg_rmoveto(info *BackendInfo, '
   156        - old: 'func svg_lineto('
   157          new: 'func svg_lineto(info *BackendInfo, '
   158        - old: 'func svg_curveto('
   159          new: 'func svg_curveto(info *BackendInfo, '
   160        - old: 'func svg_path('
   161          new: 'func svg_path(info *BackendInfo, '
   162        - old: 'func svg_jaggy_path('
   163          new: 'func svg_jaggy_path(info *BackendInfo, '
   164        - old: 'func write_paths_opaque('
   165          new: 'func write_paths_opaque(info *BackendInfo, '
   166        - old: 'func write_paths_transparent_rec('
   167          new: 'func write_paths_transparent_rec(info *BackendInfo, '
   168        - old: 'func write_paths_transparent('
   169          new: 'func write_paths_transparent(info *BackendInfo, '
   170        - old: 'func page_svg('
   171          new: 'func page_svg(info *BackendInfo, '
   172        - old: 'func page_gimp('
   173          new: 'func page_gimp(info *BackendInfo, '
   174        - old: 'unit(p)'
   175          new: 'unit(info, p)'
   176        - old: 'unit(p1)'
   177          new: 'unit(info, p1)'
   178        - old: 'unit(p2)'
   179          new: 'unit(info, p2)'
   180        - old: 'unit(p3)'
   181          new: 'unit(info, p3)'
   182        - old: 'svg_moveto(fout'
   183          new: 'svg_moveto(info, fout'
   184        - old: 'svg_rmoveto(fout'
   185          new: 'svg_rmoveto(info, fout'
   186        - old: 'svg_lineto(fout'
   187          new: 'svg_lineto(info, fout'
   188        - old: 'svg_curveto(fout'
   189          new: 'svg_curveto(info, fout'
   190        - old: 'svg_jaggy_path(fout'
   191          new: 'svg_jaggy_path(info, fout'
   192        - old: 'svg_path(fout'
   193          new: 'svg_path(info, fout'
   194        - old: 'write_paths_opaque(fout'
   195          new: 'write_paths_opaque(info, fout'
   196        - old: 'write_paths_transparent_rec(fout'
   197          new: 'write_paths_transparent_rec(info, fout'
   198        - old: 'write_paths_transparent(fout'
   199          new: 'write_paths_transparent(info, fout'
   200        - old: 'page_svg(fout'
   201          new: 'page_svg(info, fout'
   202    - name: backend_pdf.c
   203      idents:
   204        - name: ship
   205          rename: pdf_ship
   206        - name: unit
   207          rename: pdf_unit
   208        - name: info_s
   209          rename: BackendInfo
   210          fields:
   211            - name: debug
   212              type: bool
   213            - name: opaque
   214              type: bool
   215      replace:
   216        - old: 'func render0('
   217          new: 'func render0(info *BackendInfo, '
   218        - old: 'func render0_opaque('
   219          new: 'func render0_opaque(info *BackendInfo, '
   220        - old: 'func pdf_render('
   221          new: 'func pdf_render(info *BackendInfo, '
   222        - old: 'func pdf_callbacks('
   223          new: 'func pdf_callbacks(info *BackendInfo, '
   224        - old: 'func pdf_unit('
   225          new: 'func pdf_unit(info *BackendInfo, '
   226        - old: 'func pdf_coords('
   227          new: 'func pdf_coords(info *BackendInfo, '
   228        - old: 'func pdf_moveto('
   229          new: 'func pdf_moveto(info *BackendInfo, '
   230        - old: 'func pdf_lineto('
   231          new: 'func pdf_lineto(info *BackendInfo, '
   232        - old: 'func pdf_curveto('
   233          new: 'func pdf_curveto(info *BackendInfo, '
   234        - old: 'func pdf_path('
   235          new: 'func pdf_path(info *BackendInfo, '
   236        - old: 'func pdf_pageinit('
   237          new: 'func pdf_pageinit(info *BackendInfo, '
   238        - old: 'func page_pdfpage('
   239          new: 'func page_pdfpage(info *BackendInfo, '
   240        - old: 'func page_pdf('
   241          new: 'func page_pdf(info *BackendInfo, '
   242        - old: 'func init_pdf('
   243          new: 'func init_pdf(info *BackendInfo, '
   244        - old: 'func term_pdf('
   245          new: 'func term_pdf(info *BackendInfo, '
   246        - old: 'render0_opaque(plist)'
   247          new: 'render0_opaque(info, plist)'
   248        - old: 'render0(plist)'
   249          new: 'render0(info, plist)'
   250        - old: 'pdf_unit(p'
   251          new: 'pdf_unit(info, p'
   252        - old: 'pdf_coords(p'
   253          new: 'pdf_coords(info, p'
   254        - old: 'pdf_moveto(*'
   255          new: 'pdf_moveto(info, *'
   256        - old: 'pdf_lineto(*'
   257          new: 'pdf_lineto(info, *'
   258        - old: 'pdf_curveto(*'
   259          new: 'pdf_curveto(info, *'
   260        - old: 'pdf_callbacks(fout'
   261          new: 'pdf_callbacks(info, fout'
   262        - old: 'pdf_pageinit(imginfo'
   263          new: 'pdf_pageinit(info, imginfo'
   264        - old: 'pdf_render(plist'
   265          new: 'pdf_render(info, plist'
   266        - old: 'pdf_path(&'
   267          new: 'pdf_path(info, &'
   268    - name: bbox.c
   269      skip:
   270        - potrace_dpoint_s
   271    - name: bitmap.h
   272      skip:
   273        # it "flips" the bitmap by allowing to index a pointer with negative offsets
   274        # this conflicts with override of that field type to a Go slice
   275        # in any case, we can implement that tiny function on our own
   276        - bm_flip
   277      replace:
   278        # we cannot replace this pattern automatically because it doesn't refer to
   279        # a slice element inside the calloc
   280        - old: 'bm.Map = ([]Word)((*Word)(libc.Calloc(1, int(size))))'
   281          new: 'bm.Map = make([]Word, uintptr(size)/unsafe.Sizeof(Word(0)))'
   282        # TODO: allow changing type of local variables
   283        - old: 'newmap  *Word'
   284          new: 'newmap []Word'
   285        - old: 'newmap = (*Word)(libc.Realloc(unsafe.Pointer(&bm.Map[0]), int(newsize)))'
   286          new: 'newmap = make([]Word, uintptr(newsize)/unsafe.Sizeof(Word(0))); copy(newmap, bm.Map)'
   287        - old: 'bm.Map = ([]Word)(newmap)'
   288          new: 'bm.Map = newmap'
   289        - old: 'bm_base(bm) = nil'
   290          new: 'bm.Map = nil'
   291    - name: bitmap_io.c
   292    - name: bitops.h
   293    - name: curve.c
   294      skip:
   295        - potrace_path_s
   296      replace:
   297        - old: 'import "unsafe"'
   298        - old: '}())[0] == nil {'
   299          new: '}()) == nil {'
   300        - old: 'curve.C = ([][3]DPoint)((*[3]DPoint)(unsafe.Pointer(&make([][3]DPoint, n)[0][0])))'
   301          new: 'curve.C = make([][3]DPoint, n)'
   302    - name: decompose.c
   303      replace:
   304        - old: 'pt1 = (*Point)(libc.Realloc(unsafe.Pointer(pt), size*int(unsafe.Sizeof(Point{}))))'
   305          new: 'pt1 = make([]Point, size); copy(pt1, pt)'
   306        - old: |
   307            pt   *Point
   308            		pt1  *Point
   309          new: |
   310            pt, pt1   []Point
   311        - old: 'p.Priv.Pt = ([]Point)(pt)'
   312          new: 'p.Priv.Pt = pt'
   313        - old: '(*(*Point)(unsafe.Pointer(uintptr(unsafe.Pointer(pt)) + unsafe.Sizeof(Point{})*uintptr(len_)))).X = x'
   314          new: 'pt[len_].X = x'
   315        - old: '(*(*Point)(unsafe.Pointer(uintptr(unsafe.Pointer(pt)) + unsafe.Sizeof(Point{})*uintptr(len_)))).Y = y'
   316          new: 'pt[len_].Y = y'
   317    - name: flate.c
   318      skip:
   319        - lzw_xship
   320    - name: greymap.c
   321      skip:
   322        - fgetc_ws
   323        - readnum
   324        - readbit
   325        - bmp_info_s
   326        - bmp_info_t
   327        - bmp_count
   328        - bmp_pos
   329        - bmp_readint
   330        - bmp_pad_reset
   331        - bmp_pad
   332        - bmp_forward
   333        - gm_flip
   334      idents:
   335        - name: getsize
   336          rename: gm_getsize
   337      replace:
   338        - old: 'gm.Base = ([]gm_sample_t)((*gm_sample_t)(libc.Calloc(1, int(size))))'
   339          new: 'gm.Base = make([]gm_sample_t, uintptr(size)/unsafe.Sizeof(gm_sample_t(0)))'
   340        - old: 'newbase *gm_sample_t'
   341          new: 'newbase []gm_sample_t'
   342        - old: 'newbase = (*gm_sample_t)(libc.Realloc(unsafe.Pointer(&gm.Base[0]), int(newsize)))'
   343          new: 'newbase = make([]gm_sample_t, uintptr(newsize)/unsafe.Sizeof(gm_sample_t(0))); copy(newbase, gm.Base)'
   344        - old: '([]gm_sample_t)(newbase)'
   345          new: 'newbase'
   346    - name: trace.c
   347      idents:
   348        # collisions with functions defined in other files
   349        # and yes, those functions do different things
   350        - name: iprod
   351          rename: trace_iprod
   352        - name: interval
   353          rename: aux_interval
   354        - name: bezier
   355          rename: trace_bezier
   356    - name: trans.c
   357    - name: progress.h
   358    - name: progress_bar.c
   359    - name: potracelib.c
   360    - name: main.h
   361      skip:
   362        - info_t
   363      idents:
   364        - name: info_s
   365          rename: BackendInfo
   366          fields:
   367            - name: debug
   368              type: bool
   369            - name: opaque
   370              type: bool
   371    - name: mkbitmap.c
   372      idents:
   373        - name: process_file
   374          rename: ProcessFile
   375        - name: info_s
   376          rename: Config
   377          fields:
   378            - name: invert
   379              type: bool
   380            - name: lowpass
   381              type: bool
   382            - name: highpass
   383              type: bool
   384            - name: linear
   385              type: bool
   386            - name: bilevel
   387              type: bool
   388      skip:
   389        # we don't need the cli itself
   390        - longopts
   391        - shortopts
   392        - dopts
   393        - main
   394        - make_outfilename
   395        - license
   396        - usage
   397        - my_fopen_read
   398        - my_fopen_write
   399        - my_fclose
   400        # we use replace directive to pass it as an arg
   401        - info
   402        - info_t
   403      replace:
   404        - old: 'func ProcessFile('
   405          new: 'func ProcessFile(info *Config, '
   406    - name: hacks.go
   407      content: |
   408        package gotrace
   409  
   410        // C flips bitmaps by using negative bitmap strides, which we cannot represent in Go with slices
   411  
   412        func bm_flip(bm *Bitmap) {
   413        	// TODO: implement
   414        }
   415  
   416        func gm_flip(gm *Greymap) {
   417        	// TODO: implement
   418        }
   419  
   420        // unused in the code
   421  
   422        type backend_s struct {}
   423        type potrace_privstate_s struct {}
   424    - name: potrace_test.go
   425      content: |
   426        package gotrace
   427  
   428        import (
   429        	"io"
   430        	"io/ioutil"
   431        	"net/http"
   432        	"os"
   433        	"testing"
   434  
   435        	"github.com/gotranspile/cxgo/runtime/stdio"
   436        )
   437  
   438        func checkErr(t testing.TB, err error) {
   439        	t.Helper()
   440        	if err != nil {
   441        		t.Fatal(err)
   442        	}
   443        }
   444  
   445        func TestPotrace(t *testing.T) {
   446        	resp, err := http.Get("http://potrace.sourceforge.net/img/stanford.pbm")
   447        	checkErr(t, err)
   448        	defer resp.Body.Close()
   449  
   450        	if resp.StatusCode != 200 {
   451        		t.Fatal(resp.Status)
   452        	}
   453  
   454        	tfile, err := ioutil.TempFile("", "potrace_")
   455        	checkErr(t, err)
   456        	defer func() {
   457        		_ = tfile.Close()
   458        		_ = os.Remove(tfile.Name())
   459        	}()
   460  
   461        	_, err = io.Copy(tfile, resp.Body)
   462        	checkErr(t, err)
   463        	tfile.Seek(0, io.SeekStart)
   464  
   465        	var bm *Bitmap
   466        	e := BitmapRead(stdio.OpenFrom(tfile), 0.5, &bm)
   467        	if e != 0 {
   468        		t.Fatal(e)
   469        	}
   470  
   471        	p := ParamDefault()
   472        	st := Trace(p, bm)
   473        	if st.Status != 0 {
   474        		t.Fatal(st.Status)
   475        	}
   476        	var tr Trans
   477        	trans_from_rect(&tr, float64(bm.W), float64(bm.H))
   478        	bi := &BackendInfo{
   479        		Unit: 1,
   480        	}
   481        	iinfo := &ImgInfo{
   482        		Pixwidth: bm.W, Pixheight: bm.H,
   483        		Width: float64(bm.W), Height: float64(bm.H),
   484        		Trans: tr,
   485        	}
   486  
   487        	svgOut, err := os.Create("stanford.svg")
   488        	checkErr(t, err)
   489        	defer svgOut.Close()
   490        	page_svg(bi, stdio.OpenFrom(svgOut), st.Plist, iinfo)
   491  
   492        	pdfOut, err := os.Create("stanford.pdf")
   493        	checkErr(t, err)
   494        	defer pdfOut.Close()
   495        	init_pdf(bi, stdio.OpenFrom(pdfOut))
   496        	page_pdf(bi, stdio.OpenFrom(pdfOut), st.Plist, iinfo)
   497        	term_pdf(bi, stdio.OpenFrom(pdfOut))
   498        }