Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f6792eaae | ||
|
|
63605a1775 | ||
|
|
d45a14ecc5 | ||
|
|
2b85ae5540 | ||
|
|
3fac75f088 | ||
|
|
0f6e32c177 | ||
|
|
5344970a55 | ||
|
|
6a54e4d5e8 | ||
|
|
629d569667 | ||
|
|
7b71fdae99 | ||
|
|
97554ae16c | ||
|
|
e6e1dd33f0 | ||
|
|
e5ea20e51f | ||
|
|
cfaf016986 | ||
|
|
8155626dbb |
@@ -0,0 +1,43 @@
|
|||||||
|
on: [push, pull_request]
|
||||||
|
name: Build
|
||||||
|
jobs:
|
||||||
|
cli:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Install Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: stable
|
||||||
|
- name: Build
|
||||||
|
run: go build -v ./...
|
||||||
|
working-directory: cmd/cbconvert
|
||||||
|
env:
|
||||||
|
CGO_ENABLED: 1
|
||||||
|
|
||||||
|
gui:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Install Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: stable
|
||||||
|
- name: Install dependencies
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
run: sudo apt-get update -y && sudo apt-get install -y libgtk-3-dev
|
||||||
|
- name: Build
|
||||||
|
run: go build -v ./...
|
||||||
|
working-directory: cmd/cbconvert-gui
|
||||||
|
env:
|
||||||
|
CGO_ENABLED: 1
|
||||||
@@ -5,19 +5,16 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
go-version: [1.23.x]
|
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
|
||||||
CGO_ENABLED: 0
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: Install Go
|
- name: Install Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: ${{ matrix.go-version }}
|
go-version: stable
|
||||||
- name: Test
|
- name: Test
|
||||||
run: go test
|
run: go test -v ./...
|
||||||
env:
|
env:
|
||||||
CGO_ENABLED: 1
|
CGO_ENABLED: 1
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ For GUI app, check [IUP](https://github.com/gen2brain/iup-go) requirements, and
|
|||||||
|
|
||||||
### Build tags
|
### Build tags
|
||||||
|
|
||||||
* `extlib` - use external `libmupdf` and `libunarr` libraries
|
* `extlib` - use external `libmupdf` library
|
||||||
* `pkgconfig` - enable pkg-config (used with `extlib`)
|
* `pkgconfig` - enable pkg-config (used with `extlib`)
|
||||||
|
|
||||||
### Using cbconvert in file managers to generate FreeDesktop thumbnails
|
### Using cbconvert in file managers to generate FreeDesktop thumbnails
|
||||||
@@ -64,6 +64,8 @@ Commands:
|
|||||||
convert
|
convert
|
||||||
Convert archive or document
|
Convert archive or document
|
||||||
|
|
||||||
|
--profile
|
||||||
|
Load a saved GUI profile as defaults; explicit flags still override (default "")
|
||||||
--width
|
--width
|
||||||
Image width (default "0")
|
Image width (default "0")
|
||||||
--height
|
--height
|
||||||
@@ -91,7 +93,7 @@ Commands:
|
|||||||
--outfile
|
--outfile
|
||||||
Output file name for --combine (default: first input + -combined) (default "")
|
Output file name for --combine (default: first input + -combined) (default "")
|
||||||
--filter
|
--filter
|
||||||
0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 6=Gaussian, 7=Lanczos (default "2")
|
0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 5=Gaussian, 6=Lanczos (default "2")
|
||||||
--no-cover
|
--no-cover
|
||||||
Do not convert the cover image (default "false")
|
Do not convert the cover image (default "false")
|
||||||
--no-rgb
|
--no-rgb
|
||||||
@@ -122,6 +124,8 @@ Commands:
|
|||||||
cover
|
cover
|
||||||
Extract cover
|
Extract cover
|
||||||
|
|
||||||
|
--profile
|
||||||
|
Load a saved GUI profile as defaults; explicit flags still override (default "")
|
||||||
--width
|
--width
|
||||||
Image width (default "0")
|
Image width (default "0")
|
||||||
--height
|
--height
|
||||||
@@ -141,7 +145,7 @@ Commands:
|
|||||||
--lossless
|
--lossless
|
||||||
Lossless compression (webp, avif, jxl), ignores quality (default "false")
|
Lossless compression (webp, avif, jxl), ignores quality (default "false")
|
||||||
--filter
|
--filter
|
||||||
0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 6=Gaussian, 7=Lanczos (default "2")
|
0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 5=Gaussian, 6=Lanczos (default "2")
|
||||||
--outdir
|
--outdir
|
||||||
Output directory (default ".")
|
Output directory (default ".")
|
||||||
--size
|
--size
|
||||||
@@ -154,6 +158,8 @@ Commands:
|
|||||||
thumbnail
|
thumbnail
|
||||||
Extract cover thumbnail (freedesktop spec.)
|
Extract cover thumbnail (freedesktop spec.)
|
||||||
|
|
||||||
|
--profile
|
||||||
|
Load a saved GUI profile as defaults; explicit flags still override (default "")
|
||||||
--width
|
--width
|
||||||
Image width (default "0")
|
Image width (default "0")
|
||||||
--height
|
--height
|
||||||
@@ -165,7 +171,7 @@ Commands:
|
|||||||
--dpi
|
--dpi
|
||||||
Document rendering resolution in DPI (PDF, EPUB, etc.), 0 uses the default (300) (default "0")
|
Document rendering resolution in DPI (PDF, EPUB, etc.), 0 uses the default (300) (default "0")
|
||||||
--filter
|
--filter
|
||||||
0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 6=Gaussian, 7=Lanczos (default "2")
|
0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 5=Gaussian, 6=Lanczos (default "2")
|
||||||
--outdir
|
--outdir
|
||||||
Output directory (default ".")
|
Output directory (default ".")
|
||||||
--outfile
|
--outfile
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import (
|
|||||||
|
|
||||||
pngstructure "github.com/dsoprea/go-png-image-structure"
|
pngstructure "github.com/dsoprea/go-png-image-structure"
|
||||||
"github.com/dustin/go-humanize"
|
"github.com/dustin/go-humanize"
|
||||||
|
"github.com/gen2brain/go-fitz"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Options type.
|
// Options type.
|
||||||
@@ -41,7 +42,7 @@ type Options struct {
|
|||||||
Fit bool
|
Fit bool
|
||||||
// Do not upscale images already smaller than the requested width/height
|
// Do not upscale images already smaller than the requested width/height
|
||||||
NoUpscale bool
|
NoUpscale bool
|
||||||
// Document rendering resolution in DPI (PDF, EPUB, etc.); 0 uses the default
|
// Document rendering resolution in DPI (PDF, EPUB, etc.); 0 uses the page's native resolution
|
||||||
DPI int
|
DPI int
|
||||||
// 0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 5=Gaussian, 6=Lanczos
|
// 0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 5=Gaussian, 6=Lanczos
|
||||||
Filter int
|
Filter int
|
||||||
@@ -101,6 +102,8 @@ type Converter struct {
|
|||||||
prefix string
|
prefix string
|
||||||
// Input root for the current file, used to build recursive output paths
|
// Input root for the current file, used to build recursive output paths
|
||||||
root string
|
root string
|
||||||
|
// Target size for fast previews; when set, JPEG covers are IDCT-downscaled while decoding
|
||||||
|
previewWidth, previewHeight int
|
||||||
// Number of files
|
// Number of files
|
||||||
Nfiles int
|
Nfiles int
|
||||||
// Index of the current file
|
// Index of the current file
|
||||||
@@ -209,13 +212,14 @@ func (o Options) Args() []string {
|
|||||||
return args
|
return args
|
||||||
}
|
}
|
||||||
|
|
||||||
// renderDPI returns the document rendering resolution, falling back to 300 when unset.
|
// renderPage renders document page n at the configured DPI, or at the page's
|
||||||
func (c *Converter) renderDPI() float64 {
|
// native resolution when DPI is unset.
|
||||||
|
func (c *Converter) renderPage(doc *fitz.Document, n int) (*image.RGBA, error) {
|
||||||
if c.Opts.DPI > 0 {
|
if c.Opts.DPI > 0 {
|
||||||
return float64(c.Opts.DPI)
|
return doc.ImageDPI(n, float64(c.Opts.DPI))
|
||||||
}
|
}
|
||||||
|
|
||||||
return 300
|
return doc.Image(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cancel cancels the operation.
|
// Cancel cancels the operation.
|
||||||
@@ -552,6 +556,27 @@ func (c *Converter) Preview(fileName string, fileInfo os.FileInfo, width, height
|
|||||||
return c.previewImage(fileName, i, width, height)
|
return c.previewImage(fileName, i, width, height)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CoverPreview returns the cover fitted into width x height, skipping the output-codec round-trip.
|
||||||
|
func (c *Converter) CoverPreview(fileName string, fileInfo os.FileInfo, width, height int) (Image, error) {
|
||||||
|
c.previewWidth, c.previewHeight = width, height
|
||||||
|
|
||||||
|
i, err := c.coverImage(fileName, fileInfo)
|
||||||
|
if err != nil {
|
||||||
|
return Image{}, fmt.Errorf("%s: %w", fileName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if width != 0 && height != 0 {
|
||||||
|
i = fit(i, width, height, resampleFilter(c.Opts.Filter))
|
||||||
|
}
|
||||||
|
|
||||||
|
var img Image
|
||||||
|
img.Image = i
|
||||||
|
img.Width = i.Bounds().Dx()
|
||||||
|
img.Height = i.Bounds().Dy()
|
||||||
|
|
||||||
|
return img, nil
|
||||||
|
}
|
||||||
|
|
||||||
// PreviewPage returns the page-th image (0-based) as an image preview.
|
// PreviewPage returns the page-th image (0-based) as an image preview.
|
||||||
func (c *Converter) PreviewPage(fileName string, fileInfo os.FileInfo, page, width, height int) (Image, error) {
|
func (c *Converter) PreviewPage(fileName string, fileInfo os.FileInfo, page, width, height int) (Image, error) {
|
||||||
i, err := c.pageImage(fileName, fileInfo, page)
|
i, err := c.pageImage(fileName, fileInfo, page)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package cbconvert
|
package cbconvert
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -16,6 +17,7 @@ import (
|
|||||||
"github.com/gen2brain/avif"
|
"github.com/gen2brain/avif"
|
||||||
"github.com/gen2brain/go-fitz"
|
"github.com/gen2brain/go-fitz"
|
||||||
"github.com/gen2brain/jpegli"
|
"github.com/gen2brain/jpegli"
|
||||||
|
"github.com/gen2brain/jpegn"
|
||||||
"github.com/gen2brain/jpegxl"
|
"github.com/gen2brain/jpegxl"
|
||||||
"github.com/gen2brain/webp"
|
"github.com/gen2brain/webp"
|
||||||
"github.com/jsummers/gobmp"
|
"github.com/jsummers/gobmp"
|
||||||
@@ -48,7 +50,7 @@ func (c *Converter) convertDocument(ctx context.Context, fileName string) error
|
|||||||
return fmt.Errorf("convertDocument: %w", ctx.Err())
|
return fmt.Errorf("convertDocument: %w", ctx.Err())
|
||||||
}
|
}
|
||||||
|
|
||||||
img, err := doc.ImageDPI(n, c.renderDPI())
|
img, err := c.renderPage(doc, n)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("convertDocument: %w", err)
|
return fmt.Errorf("convertDocument: %w", err)
|
||||||
}
|
}
|
||||||
@@ -356,8 +358,42 @@ func (c *Converter) imageTransform(img image.Image) image.Image {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// imageDecode decodes image from reader.
|
// imageDecode decodes image from reader.
|
||||||
|
// jpegnOptions decodes straight to RGBA with high-quality chroma upsampling.
|
||||||
|
var jpegnOptions = jpegn.Options{ToRGBA: true, UpsampleMethod: jpegn.CatmullRom}
|
||||||
|
|
||||||
func (c *Converter) imageDecode(reader io.Reader) (image.Image, error) {
|
func (c *Converter) imageDecode(reader io.Reader) (image.Image, error) {
|
||||||
img, _, err := image.Decode(reader)
|
br := bufio.NewReader(reader)
|
||||||
|
|
||||||
|
if magic, err := br.Peek(2); err == nil && magic[0] == 0xff && magic[1] == 0xd8 {
|
||||||
|
opts := jpegnOptions
|
||||||
|
|
||||||
|
if c.previewWidth > 0 && c.previewHeight > 0 {
|
||||||
|
data, err := io.ReadAll(br)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("imageDecode: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg, err := jpegn.DecodeConfig(bytes.NewReader(data)); err == nil {
|
||||||
|
opts.ScaleDenom = scaleDenom(cfg.Width, cfg.Height, c.previewWidth, c.previewHeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
img, err := jpegn.Decode(bytes.NewReader(data), &opts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("imageDecode: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return img, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
img, err := jpegn.Decode(br, &opts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("imageDecode: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return img, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
img, _, err := image.Decode(br)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return img, fmt.Errorf("imageDecode: %w", err)
|
return img, fmt.Errorf("imageDecode: %w", err)
|
||||||
}
|
}
|
||||||
@@ -365,6 +401,17 @@ func (c *Converter) imageDecode(reader io.Reader) (image.Image, error) {
|
|||||||
return img, nil
|
return img, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// scaleDenom returns the largest JPEG IDCT denominator (1, 2, 4, 8) that keeps w x h at or above tw x th.
|
||||||
|
func scaleDenom(w, h, tw, th int) int {
|
||||||
|
for _, d := range []int{8, 4, 2} {
|
||||||
|
if w/d >= tw && h/d >= th {
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
// imageEncode encodes image to file.
|
// imageEncode encodes image to file.
|
||||||
func (c *Converter) imageEncode(img image.Image, w io.Writer) error {
|
func (c *Converter) imageEncode(img image.Image, w io.Writer) error {
|
||||||
var err error
|
var err error
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ func (c *Converter) coverDocument(fileName string) (image.Image, error) {
|
|||||||
}
|
}
|
||||||
defer doc.Close()
|
defer doc.Close()
|
||||||
|
|
||||||
img, err := doc.ImageDPI(0, c.renderDPI())
|
img, err := c.renderPage(doc, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("coverDocument: %w", err)
|
return nil, fmt.Errorf("coverDocument: %w", err)
|
||||||
}
|
}
|
||||||
@@ -124,7 +124,7 @@ func (c *Converter) pageDocument(fileName string, page int) (image.Image, error)
|
|||||||
return nil, fmt.Errorf("pageDocument: page %d out of range (%d pages)", page+1, doc.NumPage())
|
return nil, fmt.Errorf("pageDocument: page %d out of range (%d pages)", page+1, doc.NumPage())
|
||||||
}
|
}
|
||||||
|
|
||||||
img, err := doc.ImageDPI(page, c.renderDPI())
|
img, err := c.renderPage(doc, page)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("pageDocument: %w", err)
|
return nil, fmt.Errorf("pageDocument: %w", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,10 +70,37 @@ func fileDlg(title string, multiple, directory bool, dirKey string) ([]string, e
|
|||||||
|
|
||||||
const dlgPreviewName = "_FILEDLGPREVIEW_"
|
const dlgPreviewName = "_FILEDLGPREVIEW_"
|
||||||
|
|
||||||
|
// previewPad insets the cover from the preview pane edges, in pixels per side.
|
||||||
|
const previewPad = 8
|
||||||
|
|
||||||
// previewCover returns a FILE_CB handler that draws the highlighted comic's cover in the dialog preview pane.
|
// previewCover returns a FILE_CB handler that draws the highlighted comic's cover in the dialog preview pane.
|
||||||
|
// Extracted covers are cached by path so re-highlighting a file doesn't re-extract it.
|
||||||
func previewCover() iup.FileFunc {
|
func previewCover() iup.FileFunc {
|
||||||
var image iup.Ihandle
|
const maxCache = 32
|
||||||
var lastFile string
|
|
||||||
|
cache := make(map[string]iup.Ihandle)
|
||||||
|
order := make([]string, 0, maxCache)
|
||||||
|
|
||||||
|
cover := func(path string, w, h int) iup.Ihandle {
|
||||||
|
if img, ok := cache[path]; ok {
|
||||||
|
return img
|
||||||
|
}
|
||||||
|
|
||||||
|
img := loadCover(path, w, h)
|
||||||
|
cache[path] = img
|
||||||
|
order = append(order, path)
|
||||||
|
|
||||||
|
if len(order) > maxCache {
|
||||||
|
old := order[0]
|
||||||
|
order = order[1:]
|
||||||
|
if oi := cache[old]; oi != 0 {
|
||||||
|
oi.Destroy()
|
||||||
|
}
|
||||||
|
delete(cache, old)
|
||||||
|
}
|
||||||
|
|
||||||
|
return img
|
||||||
|
}
|
||||||
|
|
||||||
return func(ih iup.Ihandle, filename, status string) int {
|
return func(ih iup.Ihandle, filename, status string) int {
|
||||||
switch status {
|
switch status {
|
||||||
@@ -82,19 +109,8 @@ func previewCover() iup.FileFunc {
|
|||||||
cw, ch := iup.DrawGetSize(ih)
|
cw, ch := iup.DrawGetSize(ih)
|
||||||
iup.DrawParentBackground(ih)
|
iup.DrawParentBackground(ih)
|
||||||
|
|
||||||
if filename != lastFile {
|
if image := cover(filename, cw-2*previewPad, ch-2*previewPad); image != 0 {
|
||||||
lastFile = filename
|
|
||||||
if image != 0 {
|
|
||||||
image.Destroy()
|
|
||||||
image = 0
|
|
||||||
}
|
|
||||||
if img := loadCover(filename, cw, ch); img != 0 {
|
|
||||||
image = img
|
|
||||||
iup.SetHandle(dlgPreviewName, image)
|
iup.SetHandle(dlgPreviewName, image)
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if image != 0 {
|
|
||||||
iw, iih, _ := iup.DrawGetImageInfo(dlgPreviewName)
|
iw, iih, _ := iup.DrawGetImageInfo(dlgPreviewName)
|
||||||
iup.DrawImage(ih, dlgPreviewName, (cw-iw)/2, (ch-iih)/2, iw, iih)
|
iup.DrawImage(ih, dlgPreviewName, (cw-iw)/2, (ch-iih)/2, iw, iih)
|
||||||
} else {
|
} else {
|
||||||
@@ -106,11 +122,13 @@ func previewCover() iup.FileFunc {
|
|||||||
|
|
||||||
iup.DrawEnd(ih)
|
iup.DrawEnd(ih)
|
||||||
case "FINISH":
|
case "FINISH":
|
||||||
if image != 0 {
|
for _, img := range cache {
|
||||||
image.Destroy()
|
if img != 0 {
|
||||||
image = 0
|
img.Destroy()
|
||||||
}
|
}
|
||||||
lastFile = ""
|
}
|
||||||
|
cache = make(map[string]iup.Ihandle)
|
||||||
|
order = order[:0]
|
||||||
}
|
}
|
||||||
|
|
||||||
return iup.DEFAULT
|
return iup.DEFAULT
|
||||||
@@ -131,7 +149,7 @@ func loadCover(path string, w, h int) iup.Ihandle {
|
|||||||
opts := cbconvert.NewOptions()
|
opts := cbconvert.NewOptions()
|
||||||
opts.DPI = 96
|
opts.DPI = 96
|
||||||
|
|
||||||
img, err := cbconvert.New(opts).Preview(path, fi, w, h)
|
img, err := cbconvert.New(opts).CoverPreview(path, fi, w, h)
|
||||||
if err != nil || img.Image == nil {
|
if err != nil || img.Image == nil {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,23 @@
|
|||||||
<content_rating type="oars-1.1"/>
|
<content_rating type="oars-1.1"/>
|
||||||
|
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="1.2.0" date="2026-06-27" type="stable">
|
||||||
|
<description>
|
||||||
|
<ul>
|
||||||
|
<li>Support for RAR5</li>
|
||||||
|
<li>Lossless compression for WebP, AVIF, and JXL</li>
|
||||||
|
<li>Control over encoder effort and speed</li>
|
||||||
|
<li>Combine multiple comics into a single file</li>
|
||||||
|
<li>Save and switch between settings profiles</li>
|
||||||
|
<li>Multi-language interface</li>
|
||||||
|
<li>Choose the document rendering resolution (DPI)</li>
|
||||||
|
<li>Option to skip upscaling of smaller images</li>
|
||||||
|
<li>Refreshed interface with page-by-page preview and cover thumbnails in the file picker</li>
|
||||||
|
<li>Various fixes and smaller improvements</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
<url type="details">https://github.com/gen2brain/cbconvert/releases/tag/v1.2.0</url>
|
||||||
|
</release>
|
||||||
<release version="1.1.0" date="2024-11-06" type="stable">
|
<release version="1.1.0" date="2024-11-06" type="stable">
|
||||||
<description>
|
<description>
|
||||||
<ul>
|
<ul>
|
||||||
|
|||||||
@@ -1,11 +1,50 @@
|
|||||||
# github.com/anthonynsimon/bild v0.14.0
|
# github.com/STARRY-S/zip v0.2.3
|
||||||
## explicit; go 1.21
|
## explicit; go 1.23
|
||||||
|
github.com/STARRY-S/zip
|
||||||
|
# github.com/andybalholm/brotli v1.2.1
|
||||||
|
## explicit; go 1.22
|
||||||
|
github.com/andybalholm/brotli
|
||||||
|
github.com/andybalholm/brotli/flate
|
||||||
|
github.com/andybalholm/brotli/matchfinder
|
||||||
|
# github.com/anthonynsimon/bild v0.15.0
|
||||||
|
## explicit; go 1.26
|
||||||
github.com/anthonynsimon/bild/adjust
|
github.com/anthonynsimon/bild/adjust
|
||||||
github.com/anthonynsimon/bild/clone
|
github.com/anthonynsimon/bild/clone
|
||||||
github.com/anthonynsimon/bild/math/f64
|
github.com/anthonynsimon/bild/math/f64
|
||||||
github.com/anthonynsimon/bild/parallel
|
github.com/anthonynsimon/bild/parallel
|
||||||
github.com/anthonynsimon/bild/transform
|
github.com/anthonynsimon/bild/transform
|
||||||
github.com/anthonynsimon/bild/util
|
github.com/anthonynsimon/bild/util
|
||||||
|
# github.com/bodgit/plumbing v1.3.0
|
||||||
|
## explicit; go 1.13
|
||||||
|
github.com/bodgit/plumbing
|
||||||
|
# github.com/bodgit/sevenzip v1.6.4
|
||||||
|
## explicit; go 1.25.0
|
||||||
|
github.com/bodgit/sevenzip
|
||||||
|
github.com/bodgit/sevenzip/internal/aes7z
|
||||||
|
github.com/bodgit/sevenzip/internal/bcj2
|
||||||
|
github.com/bodgit/sevenzip/internal/bra
|
||||||
|
github.com/bodgit/sevenzip/internal/brotli
|
||||||
|
github.com/bodgit/sevenzip/internal/bzip2
|
||||||
|
github.com/bodgit/sevenzip/internal/deflate
|
||||||
|
github.com/bodgit/sevenzip/internal/delta
|
||||||
|
github.com/bodgit/sevenzip/internal/lz4
|
||||||
|
github.com/bodgit/sevenzip/internal/lzma
|
||||||
|
github.com/bodgit/sevenzip/internal/lzma2
|
||||||
|
github.com/bodgit/sevenzip/internal/pool
|
||||||
|
github.com/bodgit/sevenzip/internal/ppmd
|
||||||
|
github.com/bodgit/sevenzip/internal/util
|
||||||
|
github.com/bodgit/sevenzip/internal/zstd
|
||||||
|
# github.com/bodgit/windows v1.0.1
|
||||||
|
## explicit; go 1.13
|
||||||
|
github.com/bodgit/windows
|
||||||
|
# github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707
|
||||||
|
## explicit; go 1.9
|
||||||
|
github.com/dsnet/compress
|
||||||
|
github.com/dsnet/compress/bzip2
|
||||||
|
github.com/dsnet/compress/bzip2/internal/sais
|
||||||
|
github.com/dsnet/compress/internal
|
||||||
|
github.com/dsnet/compress/internal/errors
|
||||||
|
github.com/dsnet/compress/internal/prefix
|
||||||
# github.com/dsoprea/go-exif/v2 v2.0.0-20230826092837-6579e82b732d
|
# github.com/dsoprea/go-exif/v2 v2.0.0-20230826092837-6579e82b732d
|
||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
github.com/dsoprea/go-exif/v2
|
github.com/dsoprea/go-exif/v2
|
||||||
@@ -23,88 +62,140 @@ github.com/dsoprea/go-utility/image
|
|||||||
# github.com/dustin/go-humanize v1.0.1
|
# github.com/dustin/go-humanize v1.0.1
|
||||||
## explicit; go 1.16
|
## explicit; go 1.16
|
||||||
github.com/dustin/go-humanize
|
github.com/dustin/go-humanize
|
||||||
# github.com/ebitengine/purego v0.8.1
|
# github.com/ebitengine/purego v0.10.1
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
github.com/ebitengine/purego
|
github.com/ebitengine/purego
|
||||||
github.com/ebitengine/purego/internal/cgo
|
github.com/ebitengine/purego/internal/cgo
|
||||||
github.com/ebitengine/purego/internal/fakecgo
|
github.com/ebitengine/purego/internal/fakecgo
|
||||||
github.com/ebitengine/purego/internal/strings
|
github.com/ebitengine/purego/internal/strings
|
||||||
|
github.com/ebitengine/purego/internal/xreflect
|
||||||
# github.com/fvbommel/sortorder v1.1.0
|
# github.com/fvbommel/sortorder v1.1.0
|
||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
github.com/fvbommel/sortorder
|
github.com/fvbommel/sortorder
|
||||||
# github.com/gen2brain/avif v0.4.1
|
# github.com/gen2brain/avif v0.5.1
|
||||||
## explicit; go 1.21
|
## explicit; go 1.25.0
|
||||||
github.com/gen2brain/avif
|
github.com/gen2brain/avif
|
||||||
# github.com/gen2brain/cbconvert v1.0.5-0.20241106181414-0dee611bf1de
|
# github.com/gen2brain/cbconvert v1.2.0
|
||||||
## explicit; go 1.23
|
## explicit; go 1.26
|
||||||
github.com/gen2brain/cbconvert
|
github.com/gen2brain/cbconvert
|
||||||
# github.com/gen2brain/go-fitz v1.24.14
|
# github.com/gen2brain/go-fitz v1.28.1
|
||||||
## explicit; go 1.22
|
## explicit; go 1.24.0
|
||||||
github.com/gen2brain/go-fitz
|
github.com/gen2brain/go-fitz
|
||||||
github.com/gen2brain/go-fitz/include/mupdf
|
github.com/gen2brain/go-fitz/include/mupdf
|
||||||
github.com/gen2brain/go-fitz/include/mupdf/fitz
|
github.com/gen2brain/go-fitz/include/mupdf/fitz
|
||||||
github.com/gen2brain/go-fitz/libs
|
github.com/gen2brain/go-fitz/libs
|
||||||
# github.com/gen2brain/go-unarr v0.2.4
|
# github.com/gen2brain/iup-go/iup v0.32.1-0.20260627135200-7df674d35173
|
||||||
## explicit; go 1.21
|
## explicit; go 1.21
|
||||||
github.com/gen2brain/go-unarr
|
|
||||||
github.com/gen2brain/go-unarr/unarrc
|
|
||||||
github.com/gen2brain/go-unarr/unarrc/external
|
|
||||||
github.com/gen2brain/go-unarr/unarrc/external/bzip2
|
|
||||||
github.com/gen2brain/go-unarr/unarrc/external/unarr
|
|
||||||
github.com/gen2brain/go-unarr/unarrc/external/unarr/_7z
|
|
||||||
github.com/gen2brain/go-unarr/unarrc/external/unarr/common
|
|
||||||
github.com/gen2brain/go-unarr/unarrc/external/unarr/lzmasdk
|
|
||||||
github.com/gen2brain/go-unarr/unarrc/external/unarr/rar
|
|
||||||
github.com/gen2brain/go-unarr/unarrc/external/unarr/tar
|
|
||||||
github.com/gen2brain/go-unarr/unarrc/external/unarr/zip
|
|
||||||
github.com/gen2brain/go-unarr/unarrc/external/zlib
|
|
||||||
# github.com/gen2brain/iup-go/iup v0.0.0-20241106050025-0f971ac33ed4
|
|
||||||
## explicit; go 1.22
|
|
||||||
github.com/gen2brain/iup-go/iup
|
github.com/gen2brain/iup-go/iup
|
||||||
github.com/gen2brain/iup-go/iup/external
|
github.com/gen2brain/iup-go/iup/external
|
||||||
github.com/gen2brain/iup-go/iup/external/include
|
github.com/gen2brain/iup-go/iup/external/include
|
||||||
github.com/gen2brain/iup-go/iup/external/src
|
github.com/gen2brain/iup-go/iup/external/src
|
||||||
|
github.com/gen2brain/iup-go/iup/external/src/android
|
||||||
github.com/gen2brain/iup-go/iup/external/src/cocoa
|
github.com/gen2brain/iup-go/iup/external/src/cocoa
|
||||||
|
github.com/gen2brain/iup-go/iup/external/src/cocoatouch
|
||||||
|
github.com/gen2brain/iup-go/iup/external/src/efl
|
||||||
github.com/gen2brain/iup-go/iup/external/src/gtk
|
github.com/gen2brain/iup-go/iup/external/src/gtk
|
||||||
|
github.com/gen2brain/iup-go/iup/external/src/gtk4
|
||||||
|
github.com/gen2brain/iup-go/iup/external/src/haiku
|
||||||
github.com/gen2brain/iup-go/iup/external/src/mot
|
github.com/gen2brain/iup-go/iup/external/src/mot
|
||||||
|
github.com/gen2brain/iup-go/iup/external/src/qt
|
||||||
github.com/gen2brain/iup-go/iup/external/src/win
|
github.com/gen2brain/iup-go/iup/external/src/win
|
||||||
github.com/gen2brain/iup-go/iup/external/src/win/wdl
|
github.com/gen2brain/iup-go/iup/external/src/win/wdl
|
||||||
github.com/gen2brain/iup-go/iup/external/src/win/wdl/dummy
|
github.com/gen2brain/iup-go/iup/external/src/win/wdl/dummy
|
||||||
|
github.com/gen2brain/iup-go/iup/external/src/winui
|
||||||
|
github.com/gen2brain/iup-go/iup/external/src/winui/winrt
|
||||||
|
github.com/gen2brain/iup-go/iup/external/src/winui/winrt/impl
|
||||||
|
github.com/gen2brain/iup-go/iup/external/srcctrl
|
||||||
|
github.com/gen2brain/iup-go/iup/external/srcctrl/matrix
|
||||||
|
github.com/gen2brain/iup-go/iup/external/srcctrl/matrixex
|
||||||
github.com/gen2brain/iup-go/iup/external/srcgl
|
github.com/gen2brain/iup-go/iup/external/srcgl
|
||||||
|
github.com/gen2brain/iup-go/iup/external/srcplot
|
||||||
|
github.com/gen2brain/iup-go/iup/external/srcweb
|
||||||
github.com/gen2brain/iup-go/iup/manifest
|
github.com/gen2brain/iup-go/iup/manifest
|
||||||
# github.com/gen2brain/jpegli v0.3.3
|
# github.com/gen2brain/jpegli v0.4.1
|
||||||
## explicit; go 1.22
|
## explicit; go 1.25.0
|
||||||
github.com/gen2brain/jpegli
|
github.com/gen2brain/jpegli
|
||||||
# github.com/gen2brain/jpegxl v0.4.2
|
# github.com/gen2brain/jpegn v0.4.2
|
||||||
## explicit; go 1.22
|
## explicit; go 1.23.0
|
||||||
|
github.com/gen2brain/jpegn
|
||||||
|
# github.com/gen2brain/jpegxl v0.5.2
|
||||||
|
## explicit; go 1.25.0
|
||||||
github.com/gen2brain/jpegxl
|
github.com/gen2brain/jpegxl
|
||||||
# github.com/gen2brain/webp v0.5.1
|
# github.com/gen2brain/webp v0.6.1
|
||||||
## explicit; go 1.22
|
## explicit; go 1.23
|
||||||
github.com/gen2brain/webp
|
github.com/gen2brain/webp
|
||||||
# github.com/go-errors/errors v1.5.1
|
# github.com/go-errors/errors v1.5.1
|
||||||
## explicit; go 1.14
|
## explicit; go 1.14
|
||||||
github.com/go-errors/errors
|
github.com/go-errors/errors
|
||||||
# github.com/godbus/dbus/v5 v5.1.0
|
# github.com/golang/geo v0.0.0-20260625163123-7c0e84413537
|
||||||
## explicit; go 1.12
|
## explicit; go 1.23.0
|
||||||
github.com/godbus/dbus/v5
|
|
||||||
# github.com/golang/geo v0.0.0-20230421003525-6adc56603217
|
|
||||||
## explicit; go 1.18
|
|
||||||
github.com/golang/geo/r1
|
github.com/golang/geo/r1
|
||||||
github.com/golang/geo/r2
|
github.com/golang/geo/r2
|
||||||
github.com/golang/geo/r3
|
github.com/golang/geo/r3
|
||||||
github.com/golang/geo/s1
|
github.com/golang/geo/s1
|
||||||
github.com/golang/geo/s2
|
github.com/golang/geo/s2
|
||||||
# github.com/google/uuid v1.6.0
|
# github.com/hashicorp/golang-lru/v2 v2.0.7
|
||||||
## explicit
|
## explicit; go 1.18
|
||||||
github.com/google/uuid
|
github.com/hashicorp/golang-lru/v2
|
||||||
|
github.com/hashicorp/golang-lru/v2/internal
|
||||||
|
github.com/hashicorp/golang-lru/v2/simplelru
|
||||||
# github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25
|
# github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25
|
||||||
## explicit
|
## explicit
|
||||||
github.com/jsummers/gobmp
|
github.com/jsummers/gobmp
|
||||||
# github.com/jupiterrider/ffi v0.2.1
|
# github.com/klauspost/compress v1.18.6
|
||||||
## explicit; go 1.18
|
## explicit; go 1.24
|
||||||
github.com/jupiterrider/ffi
|
github.com/klauspost/compress
|
||||||
# github.com/tetratelabs/wazero v1.8.1
|
github.com/klauspost/compress/flate
|
||||||
|
github.com/klauspost/compress/fse
|
||||||
|
github.com/klauspost/compress/gzip
|
||||||
|
github.com/klauspost/compress/huff0
|
||||||
|
github.com/klauspost/compress/internal/cpuinfo
|
||||||
|
github.com/klauspost/compress/internal/godebug
|
||||||
|
github.com/klauspost/compress/internal/le
|
||||||
|
github.com/klauspost/compress/internal/race
|
||||||
|
github.com/klauspost/compress/internal/snapref
|
||||||
|
github.com/klauspost/compress/s2
|
||||||
|
github.com/klauspost/compress/zip
|
||||||
|
github.com/klauspost/compress/zlib
|
||||||
|
github.com/klauspost/compress/zstd
|
||||||
|
github.com/klauspost/compress/zstd/internal/xxhash
|
||||||
|
# github.com/klauspost/pgzip v1.2.6
|
||||||
|
## explicit
|
||||||
|
github.com/klauspost/pgzip
|
||||||
|
# github.com/mholt/archives v0.1.5
|
||||||
|
## explicit; go 1.24.0
|
||||||
|
github.com/mholt/archives
|
||||||
|
# github.com/mikelolasagasti/xz v1.0.1
|
||||||
|
## explicit; go 1.15
|
||||||
|
github.com/mikelolasagasti/xz
|
||||||
|
# github.com/minio/minlz v1.1.1
|
||||||
## explicit; go 1.21
|
## explicit; go 1.21
|
||||||
|
github.com/minio/minlz
|
||||||
|
github.com/minio/minlz/internal/race
|
||||||
|
# github.com/nwaples/rardecode/v2 v2.2.5
|
||||||
|
## explicit; go 1.21
|
||||||
|
github.com/nwaples/rardecode/v2
|
||||||
|
# github.com/pierrec/lz4/v4 v4.1.27
|
||||||
|
## explicit; go 1.17
|
||||||
|
github.com/pierrec/lz4/v4
|
||||||
|
github.com/pierrec/lz4/v4/internal/lz4block
|
||||||
|
github.com/pierrec/lz4/v4/internal/lz4errors
|
||||||
|
github.com/pierrec/lz4/v4/internal/lz4stream
|
||||||
|
github.com/pierrec/lz4/v4/internal/xxh32
|
||||||
|
# github.com/sorairolake/lzip-go v0.3.8
|
||||||
|
## explicit; go 1.22
|
||||||
|
github.com/sorairolake/lzip-go
|
||||||
|
# github.com/spf13/afero v1.15.0
|
||||||
|
## explicit; go 1.23.0
|
||||||
|
github.com/spf13/afero
|
||||||
|
github.com/spf13/afero/internal/common
|
||||||
|
github.com/spf13/afero/mem
|
||||||
|
# github.com/stangelandcl/ppmd v0.1.1
|
||||||
|
## explicit; go 1.17
|
||||||
|
github.com/stangelandcl/ppmd
|
||||||
|
github.com/stangelandcl/ppmd/internal/h7z
|
||||||
|
# github.com/tetratelabs/wazero v1.12.0
|
||||||
|
## explicit; go 1.25.0
|
||||||
github.com/tetratelabs/wazero
|
github.com/tetratelabs/wazero
|
||||||
github.com/tetratelabs/wazero/api
|
github.com/tetratelabs/wazero/api
|
||||||
github.com/tetratelabs/wazero/experimental
|
github.com/tetratelabs/wazero/experimental
|
||||||
@@ -122,7 +213,6 @@ github.com/tetratelabs/wazero/internal/engine/wazevo/ssa
|
|||||||
github.com/tetratelabs/wazero/internal/engine/wazevo/wazevoapi
|
github.com/tetratelabs/wazero/internal/engine/wazevo/wazevoapi
|
||||||
github.com/tetratelabs/wazero/internal/expctxkeys
|
github.com/tetratelabs/wazero/internal/expctxkeys
|
||||||
github.com/tetratelabs/wazero/internal/filecache
|
github.com/tetratelabs/wazero/internal/filecache
|
||||||
github.com/tetratelabs/wazero/internal/fsapi
|
|
||||||
github.com/tetratelabs/wazero/internal/ieee754
|
github.com/tetratelabs/wazero/internal/ieee754
|
||||||
github.com/tetratelabs/wazero/internal/internalapi
|
github.com/tetratelabs/wazero/internal/internalapi
|
||||||
github.com/tetratelabs/wazero/internal/leb128
|
github.com/tetratelabs/wazero/internal/leb128
|
||||||
@@ -140,17 +230,42 @@ github.com/tetratelabs/wazero/internal/wasm/binary
|
|||||||
github.com/tetratelabs/wazero/internal/wasmdebug
|
github.com/tetratelabs/wazero/internal/wasmdebug
|
||||||
github.com/tetratelabs/wazero/internal/wasmruntime
|
github.com/tetratelabs/wazero/internal/wasmruntime
|
||||||
github.com/tetratelabs/wazero/sys
|
github.com/tetratelabs/wazero/sys
|
||||||
# golang.org/x/image v0.21.0
|
# github.com/ulikunitz/xz v0.5.15
|
||||||
## explicit; go 1.18
|
## explicit; go 1.12
|
||||||
|
github.com/ulikunitz/xz
|
||||||
|
github.com/ulikunitz/xz/internal/hash
|
||||||
|
github.com/ulikunitz/xz/internal/xlog
|
||||||
|
github.com/ulikunitz/xz/lzma
|
||||||
|
# go4.org v0.0.0-20260112195520-a5071408f32f
|
||||||
|
## explicit; go 1.24.0
|
||||||
|
go4.org/readerutil
|
||||||
|
# golang.org/x/image v0.43.0
|
||||||
|
## explicit; go 1.25.0
|
||||||
golang.org/x/image/ccitt
|
golang.org/x/image/ccitt
|
||||||
|
golang.org/x/image/internal/safemath
|
||||||
golang.org/x/image/tiff
|
golang.org/x/image/tiff
|
||||||
golang.org/x/image/tiff/lzw
|
golang.org/x/image/tiff/lzw
|
||||||
# golang.org/x/net v0.30.0
|
# golang.org/x/net v0.56.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.25.0
|
||||||
golang.org/x/net/context
|
golang.org/x/net/context
|
||||||
# golang.org/x/sync v0.8.0
|
# golang.org/x/sync v0.21.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.25.0
|
||||||
golang.org/x/sync/errgroup
|
golang.org/x/sync/errgroup
|
||||||
|
# golang.org/x/sys v0.46.0
|
||||||
|
## explicit; go 1.25.0
|
||||||
|
golang.org/x/sys/cpu
|
||||||
|
golang.org/x/sys/unix
|
||||||
|
golang.org/x/sys/windows
|
||||||
|
# golang.org/x/text v0.38.0
|
||||||
|
## explicit; go 1.25.0
|
||||||
|
golang.org/x/text/encoding
|
||||||
|
golang.org/x/text/encoding/internal
|
||||||
|
golang.org/x/text/encoding/internal/identifier
|
||||||
|
golang.org/x/text/encoding/unicode
|
||||||
|
golang.org/x/text/internal/utf8internal
|
||||||
|
golang.org/x/text/runes
|
||||||
|
golang.org/x/text/transform
|
||||||
|
golang.org/x/text/unicode/norm
|
||||||
# gopkg.in/yaml.v2 v2.4.0
|
# gopkg.in/yaml.v2 v2.4.0
|
||||||
## explicit; go 1.15
|
## explicit; go 1.15
|
||||||
gopkg.in/yaml.v2
|
gopkg.in/yaml.v2
|
||||||
|
|||||||
@@ -3,8 +3,9 @@ module github.com/gen2brain/cbconvert/cmd/cbconvert-gui
|
|||||||
go 1.26
|
go 1.26
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/gen2brain/cbconvert v1.0.5-0.20260623161611-a5817c3ba5de
|
github.com/fvbommel/sortorder v1.1.0
|
||||||
github.com/gen2brain/iup-go/iup v0.32.1-0.20260604112206-a19da6654449
|
github.com/gen2brain/cbconvert v1.2.0
|
||||||
|
github.com/gen2brain/iup-go/iup v0.32.1-0.20260627135200-7df674d35173
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
@@ -21,17 +22,16 @@ require (
|
|||||||
github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349 // indirect
|
github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349 // indirect
|
||||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||||
github.com/ebitengine/purego v0.10.1 // indirect
|
github.com/ebitengine/purego v0.10.1 // indirect
|
||||||
github.com/fvbommel/sortorder v1.1.0 // indirect
|
|
||||||
github.com/gen2brain/avif v0.5.1 // indirect
|
github.com/gen2brain/avif v0.5.1 // indirect
|
||||||
github.com/gen2brain/go-fitz v1.24.15 // indirect
|
github.com/gen2brain/go-fitz v1.28.2 // indirect
|
||||||
github.com/gen2brain/jpegli v0.4.0 // indirect
|
github.com/gen2brain/jpegli v0.4.1 // indirect
|
||||||
github.com/gen2brain/jpegxl v0.5.1 // indirect
|
github.com/gen2brain/jpegn v0.4.2 // indirect
|
||||||
|
github.com/gen2brain/jpegxl v0.5.2 // indirect
|
||||||
github.com/gen2brain/webp v0.6.1 // indirect
|
github.com/gen2brain/webp v0.6.1 // indirect
|
||||||
github.com/go-errors/errors v1.5.1 // indirect
|
github.com/go-errors/errors v1.5.1 // indirect
|
||||||
github.com/golang/geo v0.0.0-20260622181633-f80708c60e82 // indirect
|
github.com/golang/geo v0.0.0-20260625163123-7c0e84413537 // indirect
|
||||||
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
||||||
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect
|
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect
|
||||||
github.com/jupiterrider/ffi v0.7.0 // indirect
|
|
||||||
github.com/klauspost/compress v1.18.6 // indirect
|
github.com/klauspost/compress v1.18.6 // indirect
|
||||||
github.com/klauspost/pgzip v1.2.6 // indirect
|
github.com/klauspost/pgzip v1.2.6 // indirect
|
||||||
github.com/mholt/archives v0.1.5 // indirect
|
github.com/mholt/archives v0.1.5 // indirect
|
||||||
@@ -52,5 +52,3 @@ require (
|
|||||||
golang.org/x/text v0.38.0 // indirect
|
golang.org/x/text v0.38.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
replace github.com/gen2brain/cbconvert => ../..
|
|
||||||
|
|||||||
@@ -40,14 +40,17 @@ github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQ
|
|||||||
github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
||||||
github.com/gen2brain/avif v0.5.1 h1:LQzLsJpWyGlsa4wuZ3D57qEbCiICIK7Yidz5ZPEwzTk=
|
github.com/gen2brain/avif v0.5.1 h1:LQzLsJpWyGlsa4wuZ3D57qEbCiICIK7Yidz5ZPEwzTk=
|
||||||
github.com/gen2brain/avif v0.5.1/go.mod h1:QgrYqdVE9y40PCfArK9VakcMIpYeDYpZmCSLkW6C1n8=
|
github.com/gen2brain/avif v0.5.1/go.mod h1:QgrYqdVE9y40PCfArK9VakcMIpYeDYpZmCSLkW6C1n8=
|
||||||
github.com/gen2brain/go-fitz v1.24.15 h1:sJNB1MOWkqnzzENPHggFpgxTwW0+S5WF/rM5wUBpJWo=
|
github.com/gen2brain/cbconvert v1.2.0 h1:eUs5MPzft+Lo9ADMYYQ5AzydO54Pv0YYUTm2lPo3XDo=
|
||||||
github.com/gen2brain/go-fitz v1.24.15/go.mod h1:SftkiVbTHqF141DuiLwBBM65zP7ig6AVDQpf2WlHamo=
|
github.com/gen2brain/cbconvert v1.2.0/go.mod h1:/6QtSgf47bDBmtkidNoYwNMHaebsDhPTKnDMmyNUd9E=
|
||||||
github.com/gen2brain/iup-go/iup v0.32.1-0.20260604112206-a19da6654449 h1:HPqLUcspf4aPnyQIgeFKlLmphFVpFP34fzr1ZdnNyfc=
|
github.com/gen2brain/go-fitz v1.28.2 h1:845G85N5TUgnq5oDqyYrW0JvehAkeo35UkkK2dJtW1M=
|
||||||
github.com/gen2brain/iup-go/iup v0.32.1-0.20260604112206-a19da6654449/go.mod h1:V4f7tHOJAeHtjQ+ju795QKv6DGdLEb4L5cmWB1sjSzU=
|
github.com/gen2brain/iup-go/iup v0.32.1-0.20260627135200-7df674d35173 h1:nBt0N1ixK8eg/7RXJIC4b0WDPxfENqyT+rH1/STZGj4=
|
||||||
github.com/gen2brain/jpegli v0.4.0 h1:TnmAO8EcekS/XCboyLPjP6cqz025tkhdaFkiYNd3wH8=
|
github.com/gen2brain/iup-go/iup v0.32.1-0.20260627135200-7df674d35173/go.mod h1:V4f7tHOJAeHtjQ+ju795QKv6DGdLEb4L5cmWB1sjSzU=
|
||||||
github.com/gen2brain/jpegli v0.4.0/go.mod h1:zJ++s4symmKCN1CLkrY0dGXTY3s0NWbd94Rz9KLdCzk=
|
github.com/gen2brain/jpegli v0.4.1 h1:qc11IQU0jTYFltroulT4MXmbu9YRftqHV0YBZ0Bqz5o=
|
||||||
github.com/gen2brain/jpegxl v0.5.1 h1:UuBUIkZ35DErImU3bTA6rltfV5zSgVNOA/K5a6JibfE=
|
github.com/gen2brain/jpegli v0.4.1/go.mod h1:zJ++s4symmKCN1CLkrY0dGXTY3s0NWbd94Rz9KLdCzk=
|
||||||
github.com/gen2brain/jpegxl v0.5.1/go.mod h1:Wlc6lqx03RJfhiQRyHa2e+8VQwT4/qv7zSRsNv9T+yE=
|
github.com/gen2brain/jpegn v0.4.2 h1:sxy2yolV1eNA02uYtnqBFm4EIC3ETnars98aG7Dc4LM=
|
||||||
|
github.com/gen2brain/jpegn v0.4.2/go.mod h1:YvcVOmVPSAsefH6yn9HBW3uY0EHlZwCMoiJXoAWfgL0=
|
||||||
|
github.com/gen2brain/jpegxl v0.5.2 h1:1ou9YRziU8PbpkfFJIyxrNjYM+WaMl2n9LloABxkKsU=
|
||||||
|
github.com/gen2brain/jpegxl v0.5.2/go.mod h1:Wlc6lqx03RJfhiQRyHa2e+8VQwT4/qv7zSRsNv9T+yE=
|
||||||
github.com/gen2brain/webp v0.6.1 h1:ei7Y1SWpQcdqz3YNDNyn4y2nQanxs9WLzwW5/2DKS64=
|
github.com/gen2brain/webp v0.6.1 h1:ei7Y1SWpQcdqz3YNDNyn4y2nQanxs9WLzwW5/2DKS64=
|
||||||
github.com/gen2brain/webp v0.6.1/go.mod h1:iGWMaCSw7t3I/Cv9llzEKmpnR36S8lS8VL/ZVjxU0JE=
|
github.com/gen2brain/webp v0.6.1/go.mod h1:iGWMaCSw7t3I/Cv9llzEKmpnR36S8lS8VL/ZVjxU0JE=
|
||||||
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
||||||
@@ -57,8 +60,8 @@ github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8b
|
|||||||
github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
||||||
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
||||||
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
||||||
github.com/golang/geo v0.0.0-20260622181633-f80708c60e82 h1:q100v18oYIaE4p5myLFqDyfXTOxivzwGyLjGCEfv8x4=
|
github.com/golang/geo v0.0.0-20260625163123-7c0e84413537 h1:KeIaDS/+VEy/bhDYjG3Z78dOyLAU4HXcVxmd0WYHJTE=
|
||||||
github.com/golang/geo v0.0.0-20260622181633-f80708c60e82/go.mod h1:Mymr9kRGDc64JPr03TSZmuIBODZ3KyswLzm1xL0HFA8=
|
github.com/golang/geo v0.0.0-20260625163123-7c0e84413537/go.mod h1:Mymr9kRGDc64JPr03TSZmuIBODZ3KyswLzm1xL0HFA8=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
@@ -67,8 +70,6 @@ github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyf
|
|||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
|
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
|
||||||
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
|
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
|
||||||
github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs=
|
|
||||||
github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c=
|
|
||||||
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||||
github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao=
|
github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao=
|
||||||
github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
|
github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func init() {
|
|||||||
LblMinSize: "Minimální velikost (MiB):",
|
LblMinSize: "Minimální velikost (MiB):",
|
||||||
TipSize: "Zpracovat pouze soubory větší než minimální velikost",
|
TipSize: "Zpracovat pouze soubory větší než minimální velikost",
|
||||||
LblDPI: "DPI dokumentu:",
|
LblDPI: "DPI dokumentu:",
|
||||||
TipDPI: "Rozlišení pro vykreslování dokumentů (PDF, EPUB atd.); výchozí je 300",
|
TipDPI: "Rozlišení pro vykreslování dokumentů (PDF, EPUB atd.); výchozí používá původní rozlišení",
|
||||||
|
|
||||||
LblOutDir: "Výstupní adresář:",
|
LblOutDir: "Výstupní adresář:",
|
||||||
TipOutDir: "Adresář, do kterého se zapisují převedené soubory (povinné)",
|
TipOutDir: "Adresář, do kterého se zapisují převedené soubory (povinné)",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func init() {
|
|||||||
LblMinSize: "Mindestgröße (MiB):",
|
LblMinSize: "Mindestgröße (MiB):",
|
||||||
TipSize: "Nur Dateien größer als die Mindestgröße verarbeiten",
|
TipSize: "Nur Dateien größer als die Mindestgröße verarbeiten",
|
||||||
LblDPI: "Dokument-DPI:",
|
LblDPI: "Dokument-DPI:",
|
||||||
TipDPI: "Auflösung zum Rendern von Dokumenten (PDF, EPUB usw.); Standard ist 300",
|
TipDPI: "Auflösung zum Rendern von Dokumenten (PDF, EPUB usw.); Standard verwendet die Originalauflösung",
|
||||||
|
|
||||||
LblOutDir: "Ausgabeverzeichnis:",
|
LblOutDir: "Ausgabeverzeichnis:",
|
||||||
TipOutDir: "Verzeichnis, in das konvertierte Dateien geschrieben werden (erforderlich)",
|
TipOutDir: "Verzeichnis, in das konvertierte Dateien geschrieben werden (erforderlich)",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func init() {
|
|||||||
LblMinSize: "Minimum Size (MiB):",
|
LblMinSize: "Minimum Size (MiB):",
|
||||||
TipSize: "Process only files larger than minimum size",
|
TipSize: "Process only files larger than minimum size",
|
||||||
LblDPI: "Document DPI:",
|
LblDPI: "Document DPI:",
|
||||||
TipDPI: "Resolution for rendering documents (PDF, EPUB, etc.); Default is 300",
|
TipDPI: "Resolution for rendering documents (PDF, EPUB, etc.); Default uses the original resolution",
|
||||||
|
|
||||||
LblOutDir: "Output Directory:",
|
LblOutDir: "Output Directory:",
|
||||||
TipOutDir: "Directory where converted files are written (required)",
|
TipOutDir: "Directory where converted files are written (required)",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func init() {
|
|||||||
LblMinSize: "Tamaño mínimo (MiB):",
|
LblMinSize: "Tamaño mínimo (MiB):",
|
||||||
TipSize: "Procesar solo archivos mayores que el tamaño mínimo",
|
TipSize: "Procesar solo archivos mayores que el tamaño mínimo",
|
||||||
LblDPI: "DPI del documento:",
|
LblDPI: "DPI del documento:",
|
||||||
TipDPI: "Resolución para renderizar documentos (PDF, EPUB, etc.); el valor predeterminado es 300",
|
TipDPI: "Resolución para renderizar documentos (PDF, EPUB, etc.); el valor predeterminado usa la resolución original",
|
||||||
|
|
||||||
LblOutDir: "Directorio de salida:",
|
LblOutDir: "Directorio de salida:",
|
||||||
TipOutDir: "Directorio donde se escriben los archivos convertidos (obligatorio)",
|
TipOutDir: "Directorio donde se escriben los archivos convertidos (obligatorio)",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func init() {
|
|||||||
LblMinSize: "Taille minimale (Mio) :",
|
LblMinSize: "Taille minimale (Mio) :",
|
||||||
TipSize: "Ne traiter que les fichiers plus grands que la taille minimale",
|
TipSize: "Ne traiter que les fichiers plus grands que la taille minimale",
|
||||||
LblDPI: "DPI du document :",
|
LblDPI: "DPI du document :",
|
||||||
TipDPI: "Résolution pour le rendu des documents (PDF, EPUB, etc.) ; la valeur par défaut est 300",
|
TipDPI: "Résolution pour le rendu des documents (PDF, EPUB, etc.) ; la valeur par défaut utilise la résolution d'origine",
|
||||||
|
|
||||||
LblOutDir: "Dossier de sortie :",
|
LblOutDir: "Dossier de sortie :",
|
||||||
TipOutDir: "Dossier où les fichiers convertis sont écrits (obligatoire)",
|
TipOutDir: "Dossier où les fichiers convertis sont écrits (obligatoire)",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func init() {
|
|||||||
LblMinSize: "Dimensione minima (MiB):",
|
LblMinSize: "Dimensione minima (MiB):",
|
||||||
TipSize: "Elabora solo i file più grandi della dimensione minima",
|
TipSize: "Elabora solo i file più grandi della dimensione minima",
|
||||||
LblDPI: "DPI del documento:",
|
LblDPI: "DPI del documento:",
|
||||||
TipDPI: "Risoluzione per il rendering dei documenti (PDF, EPUB, ecc.); il valore predefinito è 300",
|
TipDPI: "Risoluzione per il rendering dei documenti (PDF, EPUB, ecc.); il valore predefinito usa la risoluzione originale",
|
||||||
|
|
||||||
LblOutDir: "Cartella di uscita:",
|
LblOutDir: "Cartella di uscita:",
|
||||||
TipOutDir: "Cartella in cui vengono scritti i file convertiti (obbligatoria)",
|
TipOutDir: "Cartella in cui vengono scritti i file convertiti (obbligatoria)",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func init() {
|
|||||||
LblMinSize: "最小サイズ (MiB):",
|
LblMinSize: "最小サイズ (MiB):",
|
||||||
TipSize: "最小サイズより大きいファイルのみ処理する",
|
TipSize: "最小サイズより大きいファイルのみ処理する",
|
||||||
LblDPI: "ドキュメント DPI:",
|
LblDPI: "ドキュメント DPI:",
|
||||||
TipDPI: "ドキュメント(PDF、EPUB など)をレンダリングする解像度。既定値は 300",
|
TipDPI: "ドキュメント(PDF、EPUB など)をレンダリングする解像度。既定値は元の解像度を使用します",
|
||||||
|
|
||||||
LblOutDir: "出力ディレクトリ:",
|
LblOutDir: "出力ディレクトリ:",
|
||||||
TipOutDir: "変換されたファイルが書き込まれるディレクトリ(必須)",
|
TipOutDir: "変換されたファイルが書き込まれるディレクトリ(必須)",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func init() {
|
|||||||
LblMinSize: "Tamanho mínimo (MiB):",
|
LblMinSize: "Tamanho mínimo (MiB):",
|
||||||
TipSize: "Processar apenas arquivos maiores que o tamanho mínimo",
|
TipSize: "Processar apenas arquivos maiores que o tamanho mínimo",
|
||||||
LblDPI: "DPI do documento:",
|
LblDPI: "DPI do documento:",
|
||||||
TipDPI: "Resolução para renderizar documentos (PDF, EPUB, etc.); o padrão é 300",
|
TipDPI: "Resolução para renderizar documentos (PDF, EPUB, etc.); o padrão usa a resolução original",
|
||||||
|
|
||||||
LblOutDir: "Diretório de saída:",
|
LblOutDir: "Diretório de saída:",
|
||||||
TipOutDir: "Diretório onde os arquivos convertidos são gravados (obrigatório)",
|
TipOutDir: "Diretório onde os arquivos convertidos são gravados (obrigatório)",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func init() {
|
|||||||
LblMinSize: "Минимальный размер (МиБ):",
|
LblMinSize: "Минимальный размер (МиБ):",
|
||||||
TipSize: "Обрабатывать только файлы больше минимального размера",
|
TipSize: "Обрабатывать только файлы больше минимального размера",
|
||||||
LblDPI: "DPI документа:",
|
LblDPI: "DPI документа:",
|
||||||
TipDPI: "Разрешение для рендеринга документов (PDF, EPUB и т. д.); по умолчанию 300",
|
TipDPI: "Разрешение для рендеринга документов (PDF, EPUB и т. д.); по умолчанию используется исходное разрешение",
|
||||||
|
|
||||||
LblOutDir: "Каталог вывода:",
|
LblOutDir: "Каталог вывода:",
|
||||||
TipOutDir: "Каталог, в который записываются преобразованные файлы (обязательно)",
|
TipOutDir: "Каталог, в который записываются преобразованные файлы (обязательно)",
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func init() {
|
|||||||
LblMinSize: "最小大小 (MiB):",
|
LblMinSize: "最小大小 (MiB):",
|
||||||
TipSize: "仅处理大于最小大小的文件",
|
TipSize: "仅处理大于最小大小的文件",
|
||||||
LblDPI: "文档 DPI:",
|
LblDPI: "文档 DPI:",
|
||||||
TipDPI: "渲染文档的分辨率(PDF、EPUB 等);默认值为 300",
|
TipDPI: "渲染文档的分辨率(PDF、EPUB 等);默认使用原始分辨率",
|
||||||
|
|
||||||
LblOutDir: "输出目录:",
|
LblOutDir: "输出目录:",
|
||||||
TipOutDir: "写入转换后文件的目录(必填)",
|
TipOutDir: "写入转换后文件的目录(必填)",
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ func main() {
|
|||||||
t := iup.GetHandle("Table")
|
t := iup.GetHandle("Table")
|
||||||
tableRowColors(t, darkMode == 1)
|
tableRowColors(t, darkMode == 1)
|
||||||
t.SetAttribute("REDRAW", "YES")
|
t.SetAttribute("REDRAW", "YES")
|
||||||
|
iup.Update(iup.GetHandle("Preview"))
|
||||||
|
|
||||||
return iup.DEFAULT
|
return iup.DEFAULT
|
||||||
}))
|
}))
|
||||||
|
|||||||
@@ -8,3 +8,6 @@ Linux
|
|||||||
|
|
||||||
macOS
|
macOS
|
||||||
<img src="macos-01.jpg" width="700" title="macOS" alt="macOS" />
|
<img src="macos-01.jpg" width="700" title="macOS" alt="macOS" />
|
||||||
|
|
||||||
|
Haiku
|
||||||
|
<img src="haiku-01.png" width="700" title="Haiku" alt="Haiku" />
|
||||||
|
|||||||
|
After Width: | Height: | Size: 401 KiB |
|
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 251 KiB After Width: | Height: | Size: 209 KiB |
|
Before Width: | Height: | Size: 300 KiB After Width: | Height: | Size: 178 KiB |
|
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 185 KiB |
@@ -148,6 +148,8 @@ func settingsApply(group string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
userLossless = iup.GetHandle("Lossless").GetAttribute("VALUE") == "ON"
|
||||||
|
|
||||||
syncLabels()
|
syncLabels()
|
||||||
setActive()
|
setActive()
|
||||||
previewPost()
|
previewPost()
|
||||||
|
|||||||
@@ -1,10 +1,40 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"runtime/debug"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/gen2brain/cbconvert/cmd/cbconvert-gui/i18n"
|
"github.com/gen2brain/cbconvert/cmd/cbconvert-gui/i18n"
|
||||||
"github.com/gen2brain/iup-go/iup"
|
"github.com/gen2brain/iup-go/iup"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// jxlLosslessBuild reports whether wasm2go and nodynamic leave zune-jpegxl (lossless-only) as the only jxl encoder.
|
||||||
|
var jxlLosslessBuild = func() bool {
|
||||||
|
info, ok := debug.ReadBuildInfo()
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
var wasm2go, nodynamic bool
|
||||||
|
for _, kv := range info.Settings {
|
||||||
|
if kv.Key != "-tags" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, t := range strings.Split(kv.Value, ",") {
|
||||||
|
switch t {
|
||||||
|
case "wasm2go":
|
||||||
|
wasm2go = true
|
||||||
|
case "nodynamic":
|
||||||
|
nodynamic = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return wasm2go && nodynamic
|
||||||
|
}()
|
||||||
|
|
||||||
|
// userLossless is the user's Lossless preference, tracked separately because a jxl
|
||||||
|
// wasm2go build force-sets the widget on.
|
||||||
|
var userLossless bool
|
||||||
|
|
||||||
func setActive() {
|
func setActive() {
|
||||||
if busy {
|
if busy {
|
||||||
return
|
return
|
||||||
@@ -68,7 +98,15 @@ func setActive() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
canLossless := opts.Format == "webp" || opts.Format == "avif" || opts.Format == "jxl"
|
canLossless := opts.Format == "webp" || opts.Format == "avif" || opts.Format == "jxl"
|
||||||
losslessOn := canLossless && opts.Lossless
|
jxlLossless := jxlLosslessBuild && opts.Format == "jxl"
|
||||||
|
|
||||||
|
// jxl wasm2go forces lossless on; otherwise show the user's preference so it doesn't stay stuck on.
|
||||||
|
losslessVal := "OFF"
|
||||||
|
if jxlLossless || userLossless {
|
||||||
|
losslessVal = "ON"
|
||||||
|
}
|
||||||
|
iup.GetHandle("Lossless").SetAttribute("VALUE", losslessVal)
|
||||||
|
losslessOn := jxlLossless || (canLossless && userLossless)
|
||||||
|
|
||||||
if (opts.Format == "jpeg" || canLossless) && !opts.NoConvert && !losslessOn {
|
if (opts.Format == "jpeg" || canLossless) && !opts.NoConvert && !losslessOn {
|
||||||
iup.GetHandle("VboxQuality").SetAttribute("ACTIVE", "YES")
|
iup.GetHandle("VboxQuality").SetAttribute("ACTIVE", "YES")
|
||||||
@@ -84,6 +122,11 @@ func setActive() {
|
|||||||
iup.GetHandle("Lossless").SetAttribute("ACTIVE", "NO")
|
iup.GetHandle("Lossless").SetAttribute("ACTIVE", "NO")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if jxlLossless {
|
||||||
|
iup.GetHandle("Lossless").SetAttribute("ACTIVE", "NO")
|
||||||
|
iup.GetHandle("VboxEffort").SetAttribute("ACTIVE", "NO")
|
||||||
|
}
|
||||||
|
|
||||||
if opts.Width != 0 && opts.Height != 0 && !opts.NoConvert {
|
if opts.Width != 0 && opts.Height != 0 && !opts.NoConvert {
|
||||||
iup.GetHandle("Fit").SetAttribute("ACTIVE", "YES")
|
iup.GetHandle("Fit").SetAttribute("ACTIVE", "YES")
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ func list() iup.Ihandle {
|
|||||||
"TITLE1": i18n.Lng(i18n.ColTitle),
|
"TITLE1": i18n.Lng(i18n.ColTitle),
|
||||||
"TITLE2": i18n.Lng(i18n.ColType),
|
"TITLE2": i18n.Lng(i18n.ColType),
|
||||||
"TITLE3": i18n.Lng(i18n.ColSize),
|
"TITLE3": i18n.Lng(i18n.ColSize),
|
||||||
"WIDTH1": "300",
|
"WIDTH1": "250",
|
||||||
"WIDTH2": "50",
|
"WIDTH2": "50",
|
||||||
"WIDTH3": "100",
|
"WIDTH3": "100",
|
||||||
"ALIGNMENT2": "ACENTER",
|
"ALIGNMENT2": "ACENTER",
|
||||||
@@ -123,34 +123,116 @@ func preview() iup.Ihandle {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// drawPreview draws the cover scaled to fit, else the logo centered.
|
// previewTheme holds the preview canvas colors for light or dark mode.
|
||||||
|
type previewTheme struct {
|
||||||
|
gradTop, gradBottom string
|
||||||
|
card, cardBorder string
|
||||||
|
frame, shadow string
|
||||||
|
}
|
||||||
|
|
||||||
|
func previewThemeFor(dark bool) previewTheme {
|
||||||
|
if dark {
|
||||||
|
return previewTheme{
|
||||||
|
gradTop: "#3A3F45", gradBottom: "#202327",
|
||||||
|
card: "#FFFFFF", cardBorder: "#16181B",
|
||||||
|
frame: "#101214", shadow: "#141619",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return previewTheme{
|
||||||
|
gradTop: "#F7F9FC", gradBottom: "#DBE2EA",
|
||||||
|
card: "#FFFFFF", cardBorder: "#CDD5DE",
|
||||||
|
frame: "#BFC8D2", shadow: "#B7C0CB",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// drawPreview paints a gradient background, then the cover framed with a drop shadow, or an empty page card with the logo.
|
||||||
func drawPreview(ih iup.Ihandle) int {
|
func drawPreview(ih iup.Ihandle) int {
|
||||||
iup.DrawBegin(ih)
|
iup.DrawBegin(ih)
|
||||||
defer iup.DrawEnd(ih)
|
defer iup.DrawEnd(ih)
|
||||||
|
|
||||||
cw, ch := iup.DrawGetSize(ih)
|
cw, ch := iup.DrawGetSize(ih)
|
||||||
iup.DrawParentBackground(ih)
|
th := previewThemeFor(iup.GetGlobal("DARKMODE") == "YES" && iup.GetGlobal("AUTODARKMODE") == "YES")
|
||||||
|
|
||||||
name := "logo"
|
iup.DrawLinearGradient(ih, 0, 0, cw, ch, 90, th.gradTop, th.gradBottom)
|
||||||
if hasCover {
|
|
||||||
name = "cover"
|
margin := cw / 24
|
||||||
|
if m := ch / 24; m < margin {
|
||||||
|
margin = m
|
||||||
|
}
|
||||||
|
if margin < 12 {
|
||||||
|
margin = 12
|
||||||
}
|
}
|
||||||
|
|
||||||
iw, ihh, _ := iup.DrawGetImageInfo(name)
|
if hasCover {
|
||||||
|
drawCover(ih, th, cw, ch, margin)
|
||||||
|
} else {
|
||||||
|
drawPlaceholder(ih, th, cw, ch, margin)
|
||||||
|
}
|
||||||
|
|
||||||
|
return iup.DEFAULT
|
||||||
|
}
|
||||||
|
|
||||||
|
// drawCover draws the loaded cover scaled to fit, with a drop shadow and a thin frame.
|
||||||
|
func drawCover(ih iup.Ihandle, th previewTheme, cw, ch, margin int) {
|
||||||
|
iw, ihh, _ := iup.DrawGetImageInfo("cover")
|
||||||
if iw <= 0 || ihh <= 0 {
|
if iw <= 0 || ihh <= 0 {
|
||||||
return iup.DEFAULT
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
dw, dh := iw, ihh
|
s := math.Min(float64(cw-2*margin)/float64(iw), float64(ch-2*margin)/float64(ihh))
|
||||||
if hasCover {
|
dw, dh := int(float64(iw)*s), int(float64(ihh)*s)
|
||||||
s := math.Min(float64(cw)/float64(iw), float64(ch)/float64(ihh))
|
x, y := (cw-dw)/2, (ch-dh)/2
|
||||||
dw = int(float64(iw) * s)
|
|
||||||
dh = int(float64(ihh) * s)
|
const off = 6
|
||||||
|
ih.SetAttribute("DRAWSTYLE", "FILL")
|
||||||
|
ih.SetAttribute("DRAWCOLOR", th.shadow)
|
||||||
|
iup.DrawRectangle(ih, x+off, y+off, x+dw+off, y+dh+off)
|
||||||
|
|
||||||
|
iup.DrawImage(ih, "cover", x, y, dw, dh)
|
||||||
|
|
||||||
|
ih.SetAttribute("DRAWSTYLE", "STROKE")
|
||||||
|
ih.SetAttribute("DRAWLINEWIDTH", "1")
|
||||||
|
ih.SetAttribute("DRAWCOLOR", th.frame)
|
||||||
|
iup.DrawRectangle(ih, x, y, x+dw, y+dh)
|
||||||
|
}
|
||||||
|
|
||||||
|
// drawPlaceholder draws an empty comic-page card with the logo centered, shown until a cover is loaded.
|
||||||
|
func drawPlaceholder(ih iup.Ihandle, th previewTheme, cw, ch, margin int) {
|
||||||
|
cardH := ch - 2*margin
|
||||||
|
cardW := cardH * 2 / 3
|
||||||
|
if cardW > cw-2*margin {
|
||||||
|
cardW = cw - 2*margin
|
||||||
|
cardH = cardW * 3 / 2
|
||||||
|
}
|
||||||
|
x, y := (cw-cardW)/2, (ch-cardH)/2
|
||||||
|
|
||||||
|
r := cardW / 14
|
||||||
|
if r < 8 {
|
||||||
|
r = 8
|
||||||
}
|
}
|
||||||
|
|
||||||
iup.DrawImage(ih, name, (cw-dw)/2, (ch-dh)/2, dw, dh)
|
const off = 7
|
||||||
|
ih.SetAttribute("DRAWSTYLE", "FILL")
|
||||||
|
ih.SetAttribute("DRAWCOLOR", th.shadow)
|
||||||
|
iup.DrawRoundedRectangle(ih, x+off, y+off, x+cardW+off, y+cardH+off, r)
|
||||||
|
|
||||||
return iup.DEFAULT
|
ih.SetAttribute("DRAWCOLOR", th.card)
|
||||||
|
iup.DrawRoundedRectangle(ih, x, y, x+cardW, y+cardH, r)
|
||||||
|
|
||||||
|
ih.SetAttribute("DRAWSTYLE", "STROKE")
|
||||||
|
ih.SetAttribute("DRAWLINEWIDTH", "1")
|
||||||
|
ih.SetAttribute("DRAWCOLOR", th.cardBorder)
|
||||||
|
iup.DrawRoundedRectangle(ih, x, y, x+cardW, y+cardH, r)
|
||||||
|
|
||||||
|
lw, lh, _ := iup.DrawGetImageInfo("logo")
|
||||||
|
if lw <= 0 || lh <= 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s := float64(cardW*2/5) / float64(lw)
|
||||||
|
dw, dh := int(float64(lw)*s), int(float64(lh)*s)
|
||||||
|
iup.DrawImage(ih, "logo", x+(cardW-dw)/2, y+(cardH-dh)/2, dw, dh)
|
||||||
}
|
}
|
||||||
|
|
||||||
// previewMessage receives a rendered cover from previewRender and triggers a canvas redraw.
|
// previewMessage receives a rendered cover from previewRender and triggers a canvas redraw.
|
||||||
@@ -486,6 +568,7 @@ func tabImage() iup.Ihandle {
|
|||||||
iup.Toggle(i18n.Lng(i18n.TglLossless)).SetHandle("Lossless").
|
iup.Toggle(i18n.Lng(i18n.TglLossless)).SetHandle("Lossless").
|
||||||
SetAttribute("TIP", i18n.Lng(i18n.TipLossless)).
|
SetAttribute("TIP", i18n.Lng(i18n.TipLossless)).
|
||||||
SetCallback("VALUECHANGED_CB", iup.ValueChangedFunc(func(ih iup.Ihandle) int {
|
SetCallback("VALUECHANGED_CB", iup.ValueChangedFunc(func(ih iup.Ihandle) int {
|
||||||
|
userLossless = ih.GetAttribute("VALUE") == "ON"
|
||||||
setActive()
|
setActive()
|
||||||
previewPost()
|
previewPost()
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ module github.com/gen2brain/cbconvert/cmd/cbconvert
|
|||||||
go 1.26
|
go 1.26
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/gen2brain/cbconvert v1.0.5-0.20260623161611-a5817c3ba5de
|
github.com/gen2brain/cbconvert v1.2.0
|
||||||
github.com/schollz/progressbar/v3 v3.19.0
|
github.com/schollz/progressbar/v3 v3.19.0
|
||||||
golang.org/x/term v0.44.0
|
golang.org/x/term v0.44.0
|
||||||
)
|
)
|
||||||
@@ -24,15 +24,15 @@ require (
|
|||||||
github.com/ebitengine/purego v0.10.1 // indirect
|
github.com/ebitengine/purego v0.10.1 // indirect
|
||||||
github.com/fvbommel/sortorder v1.1.0 // indirect
|
github.com/fvbommel/sortorder v1.1.0 // indirect
|
||||||
github.com/gen2brain/avif v0.5.1 // indirect
|
github.com/gen2brain/avif v0.5.1 // indirect
|
||||||
github.com/gen2brain/go-fitz v1.24.15 // indirect
|
github.com/gen2brain/go-fitz v1.28.2 // indirect
|
||||||
github.com/gen2brain/jpegli v0.4.0 // indirect
|
github.com/gen2brain/jpegli v0.4.1 // indirect
|
||||||
github.com/gen2brain/jpegxl v0.5.1 // indirect
|
github.com/gen2brain/jpegn v0.4.2 // indirect
|
||||||
|
github.com/gen2brain/jpegxl v0.5.2 // indirect
|
||||||
github.com/gen2brain/webp v0.6.1 // indirect
|
github.com/gen2brain/webp v0.6.1 // indirect
|
||||||
github.com/go-errors/errors v1.5.1 // indirect
|
github.com/go-errors/errors v1.5.1 // indirect
|
||||||
github.com/golang/geo v0.0.0-20260622181633-f80708c60e82 // indirect
|
github.com/golang/geo v0.0.0-20260625163123-7c0e84413537 // indirect
|
||||||
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
||||||
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect
|
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect
|
||||||
github.com/jupiterrider/ffi v0.7.0 // indirect
|
|
||||||
github.com/klauspost/compress v1.18.6 // indirect
|
github.com/klauspost/compress v1.18.6 // indirect
|
||||||
github.com/klauspost/pgzip v1.2.6 // indirect
|
github.com/klauspost/pgzip v1.2.6 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.24 // indirect
|
github.com/mattn/go-runewidth v0.0.24 // indirect
|
||||||
@@ -56,5 +56,3 @@ require (
|
|||||||
golang.org/x/text v0.38.0 // indirect
|
golang.org/x/text v0.38.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
replace github.com/gen2brain/cbconvert => ../..
|
|
||||||
|
|||||||
@@ -44,12 +44,15 @@ github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQ
|
|||||||
github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
||||||
github.com/gen2brain/avif v0.5.1 h1:LQzLsJpWyGlsa4wuZ3D57qEbCiICIK7Yidz5ZPEwzTk=
|
github.com/gen2brain/avif v0.5.1 h1:LQzLsJpWyGlsa4wuZ3D57qEbCiICIK7Yidz5ZPEwzTk=
|
||||||
github.com/gen2brain/avif v0.5.1/go.mod h1:QgrYqdVE9y40PCfArK9VakcMIpYeDYpZmCSLkW6C1n8=
|
github.com/gen2brain/avif v0.5.1/go.mod h1:QgrYqdVE9y40PCfArK9VakcMIpYeDYpZmCSLkW6C1n8=
|
||||||
github.com/gen2brain/go-fitz v1.24.15 h1:sJNB1MOWkqnzzENPHggFpgxTwW0+S5WF/rM5wUBpJWo=
|
github.com/gen2brain/cbconvert v1.2.0 h1:eUs5MPzft+Lo9ADMYYQ5AzydO54Pv0YYUTm2lPo3XDo=
|
||||||
github.com/gen2brain/go-fitz v1.24.15/go.mod h1:SftkiVbTHqF141DuiLwBBM65zP7ig6AVDQpf2WlHamo=
|
github.com/gen2brain/cbconvert v1.2.0/go.mod h1:/6QtSgf47bDBmtkidNoYwNMHaebsDhPTKnDMmyNUd9E=
|
||||||
github.com/gen2brain/jpegli v0.4.0 h1:TnmAO8EcekS/XCboyLPjP6cqz025tkhdaFkiYNd3wH8=
|
github.com/gen2brain/go-fitz v1.28.2 h1:845G85N5TUgnq5oDqyYrW0JvehAkeo35UkkK2dJtW1M=
|
||||||
github.com/gen2brain/jpegli v0.4.0/go.mod h1:zJ++s4symmKCN1CLkrY0dGXTY3s0NWbd94Rz9KLdCzk=
|
github.com/gen2brain/jpegli v0.4.1 h1:qc11IQU0jTYFltroulT4MXmbu9YRftqHV0YBZ0Bqz5o=
|
||||||
github.com/gen2brain/jpegxl v0.5.1 h1:UuBUIkZ35DErImU3bTA6rltfV5zSgVNOA/K5a6JibfE=
|
github.com/gen2brain/jpegli v0.4.1/go.mod h1:zJ++s4symmKCN1CLkrY0dGXTY3s0NWbd94Rz9KLdCzk=
|
||||||
github.com/gen2brain/jpegxl v0.5.1/go.mod h1:Wlc6lqx03RJfhiQRyHa2e+8VQwT4/qv7zSRsNv9T+yE=
|
github.com/gen2brain/jpegn v0.4.2 h1:sxy2yolV1eNA02uYtnqBFm4EIC3ETnars98aG7Dc4LM=
|
||||||
|
github.com/gen2brain/jpegn v0.4.2/go.mod h1:YvcVOmVPSAsefH6yn9HBW3uY0EHlZwCMoiJXoAWfgL0=
|
||||||
|
github.com/gen2brain/jpegxl v0.5.2 h1:1ou9YRziU8PbpkfFJIyxrNjYM+WaMl2n9LloABxkKsU=
|
||||||
|
github.com/gen2brain/jpegxl v0.5.2/go.mod h1:Wlc6lqx03RJfhiQRyHa2e+8VQwT4/qv7zSRsNv9T+yE=
|
||||||
github.com/gen2brain/webp v0.6.1 h1:ei7Y1SWpQcdqz3YNDNyn4y2nQanxs9WLzwW5/2DKS64=
|
github.com/gen2brain/webp v0.6.1 h1:ei7Y1SWpQcdqz3YNDNyn4y2nQanxs9WLzwW5/2DKS64=
|
||||||
github.com/gen2brain/webp v0.6.1/go.mod h1:iGWMaCSw7t3I/Cv9llzEKmpnR36S8lS8VL/ZVjxU0JE=
|
github.com/gen2brain/webp v0.6.1/go.mod h1:iGWMaCSw7t3I/Cv9llzEKmpnR36S8lS8VL/ZVjxU0JE=
|
||||||
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
||||||
@@ -59,8 +62,8 @@ github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8b
|
|||||||
github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
||||||
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
||||||
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
||||||
github.com/golang/geo v0.0.0-20260622181633-f80708c60e82 h1:q100v18oYIaE4p5myLFqDyfXTOxivzwGyLjGCEfv8x4=
|
github.com/golang/geo v0.0.0-20260625163123-7c0e84413537 h1:KeIaDS/+VEy/bhDYjG3Z78dOyLAU4HXcVxmd0WYHJTE=
|
||||||
github.com/golang/geo v0.0.0-20260622181633-f80708c60e82/go.mod h1:Mymr9kRGDc64JPr03TSZmuIBODZ3KyswLzm1xL0HFA8=
|
github.com/golang/geo v0.0.0-20260625163123-7c0e84413537/go.mod h1:Mymr9kRGDc64JPr03TSZmuIBODZ3KyswLzm1xL0HFA8=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
@@ -69,8 +72,6 @@ github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyf
|
|||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
|
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
|
||||||
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
|
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
|
||||||
github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs=
|
|
||||||
github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c=
|
|
||||||
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||||
github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao=
|
github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao=
|
||||||
github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
|
github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ func parseFlags() (cbconvert.Options, []string) {
|
|||||||
convert.IntVar(&opts.Height, "height", base.Height, "Image height")
|
convert.IntVar(&opts.Height, "height", base.Height, "Image height")
|
||||||
convert.BoolVar(&opts.Fit, "fit", base.Fit, "Best fit for required width and height")
|
convert.BoolVar(&opts.Fit, "fit", base.Fit, "Best fit for required width and height")
|
||||||
convert.BoolVar(&opts.NoUpscale, "no-upscale", base.NoUpscale, "Do not upscale images already smaller than the requested width/height")
|
convert.BoolVar(&opts.NoUpscale, "no-upscale", base.NoUpscale, "Do not upscale images already smaller than the requested width/height")
|
||||||
convert.IntVar(&opts.DPI, "dpi", base.DPI, "Document rendering resolution in DPI (PDF, EPUB, etc.), 0 uses the default (300)")
|
convert.IntVar(&opts.DPI, "dpi", base.DPI, "Document rendering resolution in DPI (PDF, EPUB, etc.), 0 uses the original resolution")
|
||||||
convert.StringVar(&opts.Format, "format", base.Format, "Image format, valid values are jpeg, png, tiff, bmp, webp, avif, jxl")
|
convert.StringVar(&opts.Format, "format", base.Format, "Image format, valid values are jpeg, png, tiff, bmp, webp, avif, jxl")
|
||||||
convert.StringVar(&opts.Archive, "archive", base.Archive, "Archive format, valid values are zip, tar")
|
convert.StringVar(&opts.Archive, "archive", base.Archive, "Archive format, valid values are zip, tar")
|
||||||
convert.IntVar(&opts.ZipLevel, "zip-level", base.ZipLevel, "ZIP compression level, 0 disables compression, 1-9 sets deflate level (1 fastest, 9 smallest), -1 uses the default")
|
convert.IntVar(&opts.ZipLevel, "zip-level", base.ZipLevel, "ZIP compression level, 0 disables compression, 1-9 sets deflate level (1 fastest, 9 smallest), -1 uses the default")
|
||||||
@@ -246,7 +246,7 @@ func parseFlags() (cbconvert.Options, []string) {
|
|||||||
cover.IntVar(&opts.Height, "height", base.Height, "Image height")
|
cover.IntVar(&opts.Height, "height", base.Height, "Image height")
|
||||||
cover.BoolVar(&opts.Fit, "fit", base.Fit, "Best fit for required width and height")
|
cover.BoolVar(&opts.Fit, "fit", base.Fit, "Best fit for required width and height")
|
||||||
cover.BoolVar(&opts.NoUpscale, "no-upscale", base.NoUpscale, "Do not upscale images already smaller than the requested width/height")
|
cover.BoolVar(&opts.NoUpscale, "no-upscale", base.NoUpscale, "Do not upscale images already smaller than the requested width/height")
|
||||||
cover.IntVar(&opts.DPI, "dpi", base.DPI, "Document rendering resolution in DPI (PDF, EPUB, etc.), 0 uses the default (300)")
|
cover.IntVar(&opts.DPI, "dpi", base.DPI, "Document rendering resolution in DPI (PDF, EPUB, etc.), 0 uses the original resolution")
|
||||||
cover.StringVar(&opts.Format, "format", base.Format, "Image format, valid values are jpeg, png, tiff, bmp, webp, avif")
|
cover.StringVar(&opts.Format, "format", base.Format, "Image format, valid values are jpeg, png, tiff, bmp, webp, avif")
|
||||||
cover.IntVar(&opts.Quality, "quality", base.Quality, "Image quality")
|
cover.IntVar(&opts.Quality, "quality", base.Quality, "Image quality")
|
||||||
cover.IntVar(&opts.Effort, "effort", base.Effort, "Encoder speed/effort, format-specific (webp method 0-6, avif speed 0-10, jxl effort 1-10), -1 uses the format default")
|
cover.IntVar(&opts.Effort, "effort", base.Effort, "Encoder speed/effort, format-specific (webp method 0-6, avif speed 0-10, jxl effort 1-10), -1 uses the format default")
|
||||||
@@ -263,7 +263,7 @@ func parseFlags() (cbconvert.Options, []string) {
|
|||||||
thumbnail.IntVar(&opts.Height, "height", base.Height, "Image height")
|
thumbnail.IntVar(&opts.Height, "height", base.Height, "Image height")
|
||||||
thumbnail.BoolVar(&opts.Fit, "fit", base.Fit, "Best fit for required width and height")
|
thumbnail.BoolVar(&opts.Fit, "fit", base.Fit, "Best fit for required width and height")
|
||||||
thumbnail.BoolVar(&opts.NoUpscale, "no-upscale", base.NoUpscale, "Do not upscale images already smaller than the requested width/height")
|
thumbnail.BoolVar(&opts.NoUpscale, "no-upscale", base.NoUpscale, "Do not upscale images already smaller than the requested width/height")
|
||||||
thumbnail.IntVar(&opts.DPI, "dpi", base.DPI, "Document rendering resolution in DPI (PDF, EPUB, etc.), 0 uses the default (300)")
|
thumbnail.IntVar(&opts.DPI, "dpi", base.DPI, "Document rendering resolution in DPI (PDF, EPUB, etc.), 0 uses the original resolution")
|
||||||
thumbnail.IntVar(&opts.Filter, "filter", base.Filter, "0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 5=Gaussian, 6=Lanczos")
|
thumbnail.IntVar(&opts.Filter, "filter", base.Filter, "0=NearestNeighbor, 1=Box, 2=Linear, 3=MitchellNetravali, 4=CatmullRom, 5=Gaussian, 6=Lanczos")
|
||||||
thumbnail.StringVar(&opts.OutDir, "outdir", base.OutDir, "Output directory")
|
thumbnail.StringVar(&opts.OutDir, "outdir", base.OutDir, "Output directory")
|
||||||
thumbnail.StringVar(&opts.OutFile, "outfile", base.OutFile, "Output file")
|
thumbnail.StringVar(&opts.OutFile, "outfile", base.OutFile, "Output file")
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ require (
|
|||||||
github.com/dustin/go-humanize v1.0.1
|
github.com/dustin/go-humanize v1.0.1
|
||||||
github.com/fvbommel/sortorder v1.1.0
|
github.com/fvbommel/sortorder v1.1.0
|
||||||
github.com/gen2brain/avif v0.5.1
|
github.com/gen2brain/avif v0.5.1
|
||||||
github.com/gen2brain/go-fitz v1.24.15
|
github.com/gen2brain/go-fitz v1.28.2
|
||||||
github.com/gen2brain/jpegli v0.4.0
|
github.com/gen2brain/jpegli v0.4.1
|
||||||
github.com/gen2brain/jpegxl v0.5.1
|
github.com/gen2brain/jpegxl v0.5.2
|
||||||
github.com/gen2brain/webp v0.6.1
|
github.com/gen2brain/webp v0.6.1
|
||||||
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25
|
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25
|
||||||
github.com/mholt/archives v0.1.5
|
github.com/mholt/archives v0.1.5
|
||||||
@@ -29,10 +29,10 @@ require (
|
|||||||
github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect
|
github.com/dsoprea/go-logging v0.0.0-20200710184922-b02d349568dd // indirect
|
||||||
github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349 // indirect
|
github.com/dsoprea/go-utility v0.0.0-20221003172846-a3e1774ef349 // indirect
|
||||||
github.com/ebitengine/purego v0.10.1 // indirect
|
github.com/ebitengine/purego v0.10.1 // indirect
|
||||||
|
github.com/gen2brain/jpegn v0.4.2
|
||||||
github.com/go-errors/errors v1.5.1 // indirect
|
github.com/go-errors/errors v1.5.1 // indirect
|
||||||
github.com/golang/geo v0.0.0-20260622181633-f80708c60e82 // indirect
|
github.com/golang/geo v0.0.0-20260625163123-7c0e84413537 // indirect
|
||||||
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
|
||||||
github.com/jupiterrider/ffi v0.7.0 // indirect
|
|
||||||
github.com/klauspost/compress v1.18.6 // indirect
|
github.com/klauspost/compress v1.18.6 // indirect
|
||||||
github.com/klauspost/pgzip v1.2.6 // indirect
|
github.com/klauspost/pgzip v1.2.6 // indirect
|
||||||
github.com/mikelolasagasti/xz v1.0.1 // indirect
|
github.com/mikelolasagasti/xz v1.0.1 // indirect
|
||||||
|
|||||||
@@ -40,12 +40,14 @@ github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQ
|
|||||||
github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
||||||
github.com/gen2brain/avif v0.5.1 h1:LQzLsJpWyGlsa4wuZ3D57qEbCiICIK7Yidz5ZPEwzTk=
|
github.com/gen2brain/avif v0.5.1 h1:LQzLsJpWyGlsa4wuZ3D57qEbCiICIK7Yidz5ZPEwzTk=
|
||||||
github.com/gen2brain/avif v0.5.1/go.mod h1:QgrYqdVE9y40PCfArK9VakcMIpYeDYpZmCSLkW6C1n8=
|
github.com/gen2brain/avif v0.5.1/go.mod h1:QgrYqdVE9y40PCfArK9VakcMIpYeDYpZmCSLkW6C1n8=
|
||||||
github.com/gen2brain/go-fitz v1.24.15 h1:sJNB1MOWkqnzzENPHggFpgxTwW0+S5WF/rM5wUBpJWo=
|
github.com/gen2brain/go-fitz v1.28.2 h1:845G85N5TUgnq5oDqyYrW0JvehAkeo35UkkK2dJtW1M=
|
||||||
github.com/gen2brain/go-fitz v1.24.15/go.mod h1:SftkiVbTHqF141DuiLwBBM65zP7ig6AVDQpf2WlHamo=
|
github.com/gen2brain/go-fitz v1.28.2/go.mod h1:pY2hqAjp9Zy7qfPI2gwbJMHBFAdZpVXOLrRxD82l3Bs=
|
||||||
github.com/gen2brain/jpegli v0.4.0 h1:TnmAO8EcekS/XCboyLPjP6cqz025tkhdaFkiYNd3wH8=
|
github.com/gen2brain/jpegli v0.4.1 h1:qc11IQU0jTYFltroulT4MXmbu9YRftqHV0YBZ0Bqz5o=
|
||||||
github.com/gen2brain/jpegli v0.4.0/go.mod h1:zJ++s4symmKCN1CLkrY0dGXTY3s0NWbd94Rz9KLdCzk=
|
github.com/gen2brain/jpegli v0.4.1/go.mod h1:zJ++s4symmKCN1CLkrY0dGXTY3s0NWbd94Rz9KLdCzk=
|
||||||
github.com/gen2brain/jpegxl v0.5.1 h1:UuBUIkZ35DErImU3bTA6rltfV5zSgVNOA/K5a6JibfE=
|
github.com/gen2brain/jpegn v0.4.2 h1:sxy2yolV1eNA02uYtnqBFm4EIC3ETnars98aG7Dc4LM=
|
||||||
github.com/gen2brain/jpegxl v0.5.1/go.mod h1:Wlc6lqx03RJfhiQRyHa2e+8VQwT4/qv7zSRsNv9T+yE=
|
github.com/gen2brain/jpegn v0.4.2/go.mod h1:YvcVOmVPSAsefH6yn9HBW3uY0EHlZwCMoiJXoAWfgL0=
|
||||||
|
github.com/gen2brain/jpegxl v0.5.2 h1:1ou9YRziU8PbpkfFJIyxrNjYM+WaMl2n9LloABxkKsU=
|
||||||
|
github.com/gen2brain/jpegxl v0.5.2/go.mod h1:Wlc6lqx03RJfhiQRyHa2e+8VQwT4/qv7zSRsNv9T+yE=
|
||||||
github.com/gen2brain/webp v0.6.1 h1:ei7Y1SWpQcdqz3YNDNyn4y2nQanxs9WLzwW5/2DKS64=
|
github.com/gen2brain/webp v0.6.1 h1:ei7Y1SWpQcdqz3YNDNyn4y2nQanxs9WLzwW5/2DKS64=
|
||||||
github.com/gen2brain/webp v0.6.1/go.mod h1:iGWMaCSw7t3I/Cv9llzEKmpnR36S8lS8VL/ZVjxU0JE=
|
github.com/gen2brain/webp v0.6.1/go.mod h1:iGWMaCSw7t3I/Cv9llzEKmpnR36S8lS8VL/ZVjxU0JE=
|
||||||
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
|
||||||
@@ -55,8 +57,8 @@ github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8b
|
|||||||
github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
||||||
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
||||||
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
github.com/golang/geo v0.0.0-20200319012246-673a6f80352d/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
|
||||||
github.com/golang/geo v0.0.0-20260622181633-f80708c60e82 h1:q100v18oYIaE4p5myLFqDyfXTOxivzwGyLjGCEfv8x4=
|
github.com/golang/geo v0.0.0-20260625163123-7c0e84413537 h1:KeIaDS/+VEy/bhDYjG3Z78dOyLAU4HXcVxmd0WYHJTE=
|
||||||
github.com/golang/geo v0.0.0-20260622181633-f80708c60e82/go.mod h1:Mymr9kRGDc64JPr03TSZmuIBODZ3KyswLzm1xL0HFA8=
|
github.com/golang/geo v0.0.0-20260625163123-7c0e84413537/go.mod h1:Mymr9kRGDc64JPr03TSZmuIBODZ3KyswLzm1xL0HFA8=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
@@ -65,8 +67,6 @@ github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyf
|
|||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||||
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
|
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
|
||||||
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
|
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
|
||||||
github.com/jupiterrider/ffi v0.7.0 h1:RKsl6Ascal+3kyAqR5Qcbp83LceQMLc1VZbPfHWoNzs=
|
|
||||||
github.com/jupiterrider/ffi v0.7.0/go.mod h1:9dauhpOfNqrqk28fxuu0kkdeFtT9Qr4vbfigiuIXN7c=
|
|
||||||
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||||
github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao=
|
github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao=
|
||||||
github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
|
github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
|
||||||
|
|||||||
@@ -0,0 +1,115 @@
|
|||||||
|
cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
|
||||||
|
cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
|
||||||
|
cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c=
|
||||||
|
cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI=
|
||||||
|
cloud.google.com/go/auth v0.18.0 h1:wnqy5hrv7p3k7cShwAU/Br3nzod7fxoqG+k0VZ+/Pk0=
|
||||||
|
cloud.google.com/go/auth v0.18.0/go.mod h1:wwkPM1AgE1f2u6dG443MiWoD8C3BtOywNsUMcUTVDRo=
|
||||||
|
cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
|
||||||
|
cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
|
||||||
|
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
|
||||||
|
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
|
||||||
|
cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc=
|
||||||
|
cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU=
|
||||||
|
cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE=
|
||||||
|
cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI=
|
||||||
|
cloud.google.com/go/storage v1.56.0 h1:iixmq2Fse2tqxMbWhLWC9HfBj1qdxqAmiK8/eqtsLxI=
|
||||||
|
cloud.google.com/go/storage v1.56.0/go.mod h1:Tpuj6t4NweCLzlNbw9Z9iwxEkrSem20AetIeH/shgVU=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 h1:Ron4zCA/yk6U7WOBXhTJcDpsUBG9npumK6xw2auFltQ=
|
||||||
|
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0/go.mod h1:cSgYe11MCNYunTnRXrKiR/tHc0eoKjICUuWpNZoVCOo=
|
||||||
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0=
|
||||||
|
github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4=
|
||||||
|
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780 h1:tFh1tRc4CA31yP6qDcu+Trax5wW5GuMxvkIba07qVLY=
|
||||||
|
github.com/dsoprea/go-exif/v3 v3.0.0-20210512043655-120bcdb2a55e h1:E4XTSQZF/JtOQWcSaJBJho7t+RNWfdO92W/5skg10Jk=
|
||||||
|
github.com/dsoprea/go-utility/v2 v2.0.0-20200717064901-2fccff4aa15e h1:IxIbA7VbCNrwumIYjDoMOdf4KOSkMC6NJE4s8oRbE7E=
|
||||||
|
github.com/envoyproxy/go-control-plane/envoy v1.35.0 h1:ixjkELDE+ru6idPxcHLj8LBVc2bFP7iBytj353BoHUo=
|
||||||
|
github.com/envoyproxy/go-control-plane/envoy v1.35.0/go.mod h1:09qwbGVuSWWAyN5t/b3iyVfz5+z8QWGrzkoqm/8SbEs=
|
||||||
|
github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=
|
||||||
|
github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=
|
||||||
|
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
|
||||||
|
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||||
|
github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=
|
||||||
|
github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
|
||||||
|
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
|
||||||
|
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
|
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||||
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
|
github.com/google/go-cmdtest v0.4.0 h1:ToXh6W5spLp3npJV92tk6d5hIpUPYEzHLkD+rncbyhI=
|
||||||
|
github.com/google/go-cmdtest v0.4.0/go.mod h1:apVn/GCasLZUVpAJ6oWAuyP7Ne7CEsQbTnc0plM3m+o=
|
||||||
|
github.com/google/go-units v0.0.0-20250612230646-eddd77f68220 h1:hM8xVjUr4Iv/iQIx4Jq1xckZkKlXu51Gqku5HlEpQAE=
|
||||||
|
github.com/google/go-units v0.0.0-20250612230646-eddd77f68220/go.mod h1:wBcRMlRM/bVzYk9xtR2hOp3+iWOhEh1FiK8sAzeR9eA=
|
||||||
|
github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA=
|
||||||
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
|
github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
|
||||||
|
github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
|
||||||
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/googleapis/enterprise-certificate-proxy v0.3.7 h1:zrn2Ee/nWmHulBx5sAVrGgAa0f2/R35S4DJwfFaUPFQ=
|
||||||
|
github.com/googleapis/enterprise-certificate-proxy v0.3.7/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.16.0 h1:iHbQmKLLZrexmb0OSsNGTeSTS0HO4YvFOG8g5E4Zd0Y=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.16.0/go.mod h1:o1vfQjjNZn4+dPnRdl/4ZD7S9414Y4xA+a/6Icj6l14=
|
||||||
|
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||||
|
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||||
|
github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA=
|
||||||
|
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg=
|
||||||
|
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
|
||||||
|
github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE=
|
||||||
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
|
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
|
||||||
|
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
|
||||||
|
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd h1:CmH9+J6ZSsIjUK3dcGsnCnO41eRBOnY12zwkn5qVwgc=
|
||||||
|
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
|
||||||
|
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
|
||||||
|
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
|
||||||
|
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
|
||||||
|
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
|
github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo=
|
||||||
|
github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs=
|
||||||
|
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
|
||||||
|
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
|
||||||
|
go.opentelemetry.io/contrib/detectors/gcp v1.38.0 h1:ZoYbqX7OaA/TAikspPl3ozPI6iY6LiIY9I8cUfm+pJs=
|
||||||
|
go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts=
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ=
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo=
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
|
||||||
|
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
|
||||||
|
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
|
||||||
|
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
|
||||||
|
go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=
|
||||||
|
go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E=
|
||||||
|
go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg=
|
||||||
|
go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=
|
||||||
|
go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
|
||||||
|
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
|
||||||
|
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
|
||||||
|
golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto=
|
||||||
|
golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio=
|
||||||
|
golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
|
||||||
|
golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
|
||||||
|
golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
|
||||||
|
golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
|
||||||
|
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
|
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
|
||||||
|
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
|
||||||
|
golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8=
|
||||||
|
golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||||
|
google.golang.org/api v0.259.0 h1:90TaGVIxScrh1Vn/XI2426kRpBqHwWIzVBzJsVZ5XrQ=
|
||||||
|
google.golang.org/api v0.259.0/go.mod h1:LC2ISWGWbRoyQVpxGntWwLWN/vLNxxKBK9KuJRI8Te4=
|
||||||
|
google.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217 h1:GvESR9BIyHUahIb0NcTum6itIWtdoglGX+rnGxm2934=
|
||||||
|
google.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:yJ2HH4EHEDTd3JiLmhds6NkJ17ITVYOdV3m3VKOnws0=
|
||||||
|
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls=
|
||||||
|
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto=
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b h1:Mv8VFug0MP9e5vUxfBcE3vUkV6CImK3cMNMIDFjmzxU=
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ=
|
||||||
|
google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc=
|
||||||
|
google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U=
|
||||||
|
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
|
||||||
|
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
||||||