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 }