Przeglądaj źródła

All methods replaced with source load

Viktor Sokolov 3 miesięcy temu
rodzic
commit
27e867141e
3 zmienionych plików z 85 dodań i 13 usunięć
  1. 68 1
      vips/source.c
  2. 9 2
      vips/source.h
  3. 8 10
      vips/vips.go

+ 68 - 1
vips/source.c

@@ -12,7 +12,7 @@ extern gint64 asyncReaderRead(uintptr_t handle, gpointer buffer, gint64 size);
 
 // loads jpeg from a source
 int
-vips_jpegloadsource_go(VipsAsyncSource *source, int shrink, VipsImage **out)
+vips_jpegload_source_go(VipsAsyncSource *source, int shrink, VipsImage **out)
 {
   if (shrink > 1)
     return vips_jpegload_source(VIPS_SOURCE(source), out, "shrink", shrink,
@@ -21,6 +21,73 @@ vips_jpegloadsource_go(VipsAsyncSource *source, int shrink, VipsImage **out)
   return vips_jpegload_source(VIPS_SOURCE(source), out, NULL);
 }
 
+// loads xjl from source
+int
+vips_jxlload_source_go(VipsAsyncSource *source, int pages, VipsImage **out)
+{
+  return vips_jxlload_source(VIPS_SOURCE(source), out, "n", pages, NULL);
+}
+
+int
+vips_pngload_source_go(VipsAsyncSource *source, VipsImage **out, int unlimited)
+{
+  return vips_pngload_source(
+      VIPS_SOURCE(source), out,
+      "unlimited", unlimited,
+      NULL);
+}
+
+int
+vips_webpload_source_go(VipsAsyncSource *source, double scale, int pages, VipsImage **out)
+{
+  return vips_webpload_source(
+      VIPS_SOURCE(source), out,
+      "scale", scale,
+      "n", pages,
+      NULL);
+}
+
+int
+vips_gifload_source_go(VipsAsyncSource *source, int pages, VipsImage **out)
+{
+  return vips_gifload_source(VIPS_SOURCE(source), out, "access", VIPS_ACCESS_SEQUENTIAL, "n", pages, NULL);
+}
+
+int
+vips_svgload_source_go(VipsAsyncSource *source, double scale, VipsImage **out, int unlimited)
+{
+  // libvips limits the minimal scale to 0.001, so we have to scale down dpi
+  // for lower scale values
+  double dpi = 72.0;
+  if (scale < 0.001) {
+    dpi *= VIPS_MAX(scale / 0.001, 0.001);
+    scale = 0.001;
+  }
+
+  return vips_svgload_source(
+      VIPS_SOURCE(source), out,
+      "scale", scale,
+      "dpi", dpi,
+      "unlimited", unlimited,
+      NULL);
+}
+
+int
+vips_heifload_source_go(VipsAsyncSource *source, VipsImage **out, int thumbnail)
+{
+  return vips_heifload_source(
+      VIPS_SOURCE(source), out,
+      "access", VIPS_ACCESS_SEQUENTIAL,
+      "thumbnail", thumbnail,
+      NULL);
+}
+
+int
+vips_tiffload_source_go(VipsAsyncSource *source, VipsImage **out)
+{
+  return vips_tiffload_source(VIPS_SOURCE(source), out, "access", VIPS_ACCESS_SEQUENTIAL, NULL);
+}
+
 // dereferences source
 void
 unref_source(VipsAsyncSource *source)

+ 9 - 2
vips/source.h

@@ -15,8 +15,15 @@ typedef struct _VipsAsyncSourceClass {
   VipsSourceClass parent_class;
 } VipsAsyncSourceClass;
 
-// vips async source read function
-int vips_jpegloadsource_go(VipsAsyncSource *source, int shrink, VipsImage **out);
+// vips async source read functions
+int vips_jpegload_source_go(VipsAsyncSource *source, int shrink, VipsImage **out);
+int vips_jxlload_source_go(VipsAsyncSource *source, int pages, VipsImage **out);
+int vips_pngload_source_go(VipsAsyncSource *source, VipsImage **out, int unlimited);
+int vips_webpload_source_go(VipsAsyncSource *source, double scale, int pages, VipsImage **out);
+int vips_gifload_source_go(VipsAsyncSource *source, int pages, VipsImage **out);
+int vips_svgload_source_go(VipsAsyncSource *source, double scale, VipsImage **out, int unlimited);
+int vips_heifload_source_go(VipsAsyncSource *source, VipsImage **out, int thumbnail);
+int vips_tiffload_source_go(VipsAsyncSource *source, VipsImage **out);
 
 // creates new vips async source from a reader handle
 VipsAsyncSource *vips_new_async_source(uintptr_t readerHandle);

+ 8 - 10
vips/vips.go

@@ -342,8 +342,6 @@ func (img *Image) Load(imgdata *imagedata.ImageData, shrink int, scale float64,
 
 	var tmp *C.VipsImage
 
-	data := unsafe.Pointer(&imgdata.Data[0])
-	dataSize := C.size_t(len(imgdata.Data))
 	err := C.int(0)
 
 	reader := bytes.NewReader(imgdata.Data)
@@ -351,21 +349,21 @@ func (img *Image) Load(imgdata *imagedata.ImageData, shrink int, scale float64,
 
 	switch imgdata.Type {
 	case imagetype.JPEG:
-		err = C.vips_jpegloadsource_go(source, C.int(shrink), &tmp)
+		err = C.vips_jpegload_source_go(source, C.int(shrink), &tmp)
 	case imagetype.JXL:
-		err = C.vips_jxlload_go(data, dataSize, C.int(pages), &tmp)
+		err = C.vips_jxlload_source_go(source, C.int(pages), &tmp)
 	case imagetype.PNG:
-		err = C.vips_pngload_go(data, dataSize, &tmp, vipsConf.PngUnlimited)
+		err = C.vips_pngload_source_go(source, &tmp, vipsConf.PngUnlimited)
 	case imagetype.WEBP:
-		err = C.vips_webpload_go(data, dataSize, C.double(scale), C.int(pages), &tmp)
+		err = C.vips_webpload_source_go(source, C.double(scale), C.int(pages), &tmp)
 	case imagetype.GIF:
-		err = C.vips_gifload_go(data, dataSize, C.int(pages), &tmp)
+		err = C.vips_gifload_source_go(source, C.int(pages), &tmp)
 	case imagetype.SVG:
-		err = C.vips_svgload_go(data, dataSize, C.double(scale), &tmp, vipsConf.SvgUnlimited)
+		err = C.vips_svgload_source_go(source, C.double(scale), &tmp, vipsConf.SvgUnlimited)
 	case imagetype.HEIC, imagetype.AVIF:
-		err = C.vips_heifload_go(data, dataSize, &tmp, C.int(0))
+		err = C.vips_heifload_source_go(source, &tmp, C.int(0))
 	case imagetype.TIFF:
-		err = C.vips_tiffload_go(data, dataSize, &tmp)
+		err = C.vips_tiffload_source_go(source, &tmp)
 	default:
 		C.unref_source(source)
 		return newVipsError("Usupported image type to load")