mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-24 11:11:02 -07:00
Compare commits
237 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7cde8e3aa6 | ||
|
|
34fe6f0a5f | ||
|
|
76c9674f3f | ||
|
|
addbabd123 | ||
|
|
46b90d9c36 | ||
|
|
7ee67082aa | ||
|
|
e8042ed5f3 | ||
|
|
8828874c25 | ||
|
|
1bdb093319 | ||
|
|
a1e2191ad5 | ||
|
|
e61fcf1d9b | ||
|
|
610ef0dc4b | ||
|
|
273d38f237 | ||
|
|
8194a08382 | ||
|
|
6170b704b1 | ||
|
|
b05f5e7caa | ||
|
|
4b38fc6044 | ||
|
|
cee16a75ca | ||
|
|
9fd85a8289 | ||
|
|
2f1eff1474 | ||
|
|
8c582b8d72 | ||
|
|
e49673329d | ||
|
|
07ebed83bf | ||
|
|
1def87fdc3 | ||
|
|
d91fed7dd4 | ||
|
|
5f2f7e70ef | ||
|
|
83432beff6 | ||
|
|
979b550178 | ||
|
|
9062a531f3 | ||
|
|
e2a6fbcf3c | ||
|
|
ec16931f3a | ||
|
|
0ec0ca7495 | ||
|
|
51fa7c9371 | ||
|
|
6c69f10fe7 | ||
|
|
206e85a356 | ||
|
|
8d7dd4867b | ||
|
|
d1524f78fb | ||
|
|
b26735d520 | ||
|
|
603baee777 | ||
|
|
e105b7f498 | ||
|
|
bb3fbccb50 | ||
|
|
c8edcd963d | ||
|
|
3b60cdc707 | ||
|
|
ea061d65c9 | ||
|
|
da64c0237f | ||
|
|
d2b1602881 | ||
|
|
1afd45068c | ||
|
|
f01b30e112 | ||
|
|
b5f7fbe14e | ||
|
|
8b6073ccbb | ||
|
|
f902c759df | ||
|
|
996fdbc0f5 | ||
|
|
9ff3e3b42a | ||
|
|
0a5604521e | ||
|
|
786636ef5d | ||
|
|
18bdb27225 | ||
|
|
faca35dec0 | ||
|
|
f8813daae3 | ||
|
|
da5a20390f | ||
|
|
3ab3db92f5 | ||
|
|
a3cd3dd9dc | ||
|
|
918868e9e8 | ||
|
|
cf05a25445 | ||
|
|
5d5399a267 | ||
|
|
2de7af0ba5 | ||
|
|
0382c304ad | ||
|
|
182d9946fe | ||
|
|
f24e4029b4 | ||
|
|
4ebda29171 | ||
|
|
53026f3d02 | ||
|
|
99c0e95a2f | ||
|
|
dfa56c6b08 | ||
|
|
0419df4b2d | ||
|
|
70bdcd0978 | ||
|
|
022df995aa | ||
|
|
dcbe7ec41d | ||
|
|
df4d27eefe | ||
|
|
8f233f55e9 | ||
|
|
7db49aec21 | ||
|
|
b5eaec0778 | ||
|
|
06b126a2e7 | ||
|
|
ed96ebac79 | ||
|
|
c6e34d2d88 | ||
|
|
53ac8bad79 | ||
|
|
d2e163bc3b | ||
|
|
1404123281 | ||
|
|
01a7afd28a | ||
|
|
3a42911e6f | ||
|
|
8e5d52f2c7 | ||
|
|
dfff5d7230 | ||
|
|
19b63786c8 | ||
|
|
5293e1c18b | ||
|
|
f200bb8b00 | ||
|
|
ed11a5c412 | ||
|
|
cdcc63f519 | ||
|
|
7096e9fd9c | ||
|
|
c8fe56ea95 | ||
|
|
8a2a58b1a5 | ||
|
|
42aec98368 | ||
|
|
6d73371a79 | ||
|
|
4d60ff8e67 | ||
|
|
311ff4a89f | ||
|
|
5d57957a6e | ||
|
|
f89adce02d | ||
|
|
3e505f47bc | ||
|
|
06e29142e6 | ||
|
|
15a69f6dcb | ||
|
|
0f763fe06b | ||
|
|
f5adb89338 | ||
|
|
36b120bdbe | ||
|
|
cc169d414f | ||
|
|
0fcb2075e0 | ||
|
|
2bda78fb40 | ||
|
|
e878c6eef6 | ||
|
|
9ce405cec5 | ||
|
|
f064d413b3 | ||
|
|
e5a3331f24 | ||
|
|
6f99f88b29 | ||
|
|
8ff0153708 | ||
|
|
c7273c06da | ||
|
|
cd36caccc7 | ||
|
|
a022aab28a | ||
|
|
949e9c216d | ||
|
|
3fcf7d4e69 | ||
|
|
e335621558 | ||
|
|
9a0357c67b | ||
|
|
0953039369 | ||
|
|
d4a8eb5847 | ||
|
|
d48ab7c84e | ||
|
|
c43b88ac0b | ||
|
|
76ffbb96ba | ||
|
|
b6b28c8a02 | ||
|
|
a736e1da05 | ||
|
|
a8cc280574 | ||
|
|
da9d9385b9 | ||
|
|
149e5c6fba | ||
|
|
e14da81b48 | ||
|
|
49a0a6fdb3 | ||
|
|
da678dc52d | ||
|
|
6ff68f3f06 | ||
|
|
33feda7208 | ||
|
|
38af98ec9b | ||
|
|
d6a11d7164 | ||
|
|
33d241c33e | ||
|
|
944ac97ba4 | ||
|
|
bb6e8dc6b2 | ||
|
|
ed604f6284 | ||
|
|
3c67a67ae7 | ||
|
|
f3e7a4e439 | ||
|
|
fb5bb874dd | ||
|
|
d3ccb4b0d7 | ||
|
|
d096d7742f | ||
|
|
92b5accb90 | ||
|
|
1bcc8f45b5 | ||
|
|
5eef01377f | ||
|
|
4c140b1b90 | ||
|
|
4bcbf2b089 | ||
|
|
6d3969ab79 | ||
|
|
ea35551b9d | ||
|
|
0d4c747a05 | ||
|
|
6cc7d7b8fe | ||
|
|
3d0f82e4c6 | ||
|
|
26abcbaf81 | ||
|
|
f7efaa37f5 | ||
|
|
167bb0287e | ||
|
|
3020705012 | ||
|
|
ecd80775d8 | ||
|
|
c42e73f17a | ||
|
|
ec271a67ad | ||
|
|
ce4a9cfbd7 | ||
|
|
45f769893c | ||
|
|
8a23046187 | ||
|
|
ca8f2a886e | ||
|
|
9dc6bdb03b | ||
|
|
c9b3e5e7e5 | ||
|
|
f0ce9c1431 | ||
|
|
0b22593572 | ||
|
|
2fd1115ec9 | ||
|
|
38d4bbdba1 | ||
|
|
cb9325843e | ||
|
|
900ba11623 | ||
|
|
7da4e15b73 | ||
|
|
7983a4b883 | ||
|
|
ea4a147751 | ||
|
|
33495e812e | ||
|
|
c6e2958665 | ||
|
|
86ede224ac | ||
|
|
e07a906731 | ||
|
|
76d139c29e | ||
|
|
4b8487f164 | ||
|
|
a006e0bf6f | ||
|
|
c5373480ba | ||
|
|
e1f2494966 | ||
|
|
9ddfa5a56b | ||
|
|
6339cd6b31 | ||
|
|
7e80e255a4 | ||
|
|
c6cbae4bc4 | ||
|
|
68f239765c | ||
|
|
77c57d7344 | ||
|
|
259c5d67e6 | ||
|
|
4c2fa27717 | ||
|
|
f5b14cadf8 | ||
|
|
e154e41bc0 | ||
|
|
1f2ebe8c33 | ||
|
|
28444b7907 | ||
|
|
75f41fc630 | ||
|
|
d091479f29 | ||
|
|
665ceb9ea6 | ||
|
|
27ab1e3e5a | ||
|
|
a777470cda | ||
|
|
f48d1c5196 | ||
|
|
cee893b845 | ||
|
|
07ccb6319a | ||
|
|
a6981ff7ef | ||
|
|
fc8d0283b1 | ||
|
|
5e892e8fc3 | ||
|
|
8b124e5ced | ||
|
|
65dc707c29 | ||
|
|
65fb3e9e76 | ||
|
|
3a0c02459d | ||
|
|
33f3c97b03 | ||
|
|
c55032531c | ||
|
|
12f999e9e4 | ||
|
|
817cf03592 | ||
|
|
ca940d1599 | ||
|
|
d00fba02a0 | ||
|
|
045e5e7303 | ||
|
|
6fd98e3c67 | ||
|
|
98279e44ef | ||
|
|
22b78cee56 | ||
|
|
8f7203e38b | ||
|
|
38b8cd2574 | ||
|
|
6b28f36b97 | ||
|
|
d394b21920 | ||
|
|
14255a5076 | ||
|
|
8fa1a887ce | ||
|
|
2840831017 |
54
.github/workflows/ccpp.yml
vendored
54
.github/workflows/ccpp.yml
vendored
@@ -20,12 +20,38 @@ jobs:
|
||||
path: 'fluxengine-testdata'
|
||||
- name: apt
|
||||
run: |
|
||||
sudo apt install libudev-dev libsqlite3-dev protobuf-compiler libwxgtk3.0-gtk3-dev libfmt-dev libprotobuf-dev wx-common
|
||||
sudo apt install libudev-dev libsqlite3-dev protobuf-compiler libwxgtk3.0-gtk3-dev libfmt-dev libprotobuf-dev
|
||||
- name: make
|
||||
run: CXXFLAGS="-Wp,-D_GLIBCXX_ASSERTIONS" make -j`nproc` -C fluxengine
|
||||
|
||||
#build-linux-debian-11:
|
||||
# runs-on: ubuntu-22.04
|
||||
# container: debian:11
|
||||
# steps:
|
||||
# - uses: actions/checkout@v4
|
||||
# with:
|
||||
# repository: 'davidgiven/fluxengine'
|
||||
# path: 'fluxengine'
|
||||
# - uses: actions/checkout@v4
|
||||
# with:
|
||||
# repository: 'davidgiven/fluxengine-testdata'
|
||||
# path: 'fluxengine-testdata'
|
||||
# - name: apt update
|
||||
# run: apt update
|
||||
# - name: apt
|
||||
# run: >
|
||||
# apt install -y python3 make xz-utils python3 python3-hamcrest
|
||||
# protobuf-compiler libprotobuf-dev libsqlite3-dev
|
||||
# libfmt-dev libprotobuf-dev wx-common pkg-config
|
||||
# libudev-dev g++ libwxgtk3.0-gtk3-dev
|
||||
# - name: make
|
||||
# run: make -C fluxengine
|
||||
|
||||
build-macos-current:
|
||||
runs-on: macos-13
|
||||
strategy:
|
||||
matrix:
|
||||
runs-on: [macos-13, macos-latest]
|
||||
runs-on: ${{ matrix.runs-on }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@@ -36,15 +62,17 @@ jobs:
|
||||
repository: 'davidgiven/fluxengine-testdata'
|
||||
path: 'fluxengine-testdata'
|
||||
- name: brew
|
||||
run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
|
||||
run: |
|
||||
brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
|
||||
- name: make
|
||||
run: gmake -j`nproc` -C fluxengine
|
||||
|
||||
run: gmake -C fluxengine
|
||||
- name: Upload build artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ github.event.repository.name }}.${{ github.sha }}.fluxengine.pkg
|
||||
path: fluxengine/FluxEngine.pkg
|
||||
name: ${{ github.event.repository.name }}.${{ github.sha }}.fluxengine.${{ runner.arch }}.pkg
|
||||
path: |
|
||||
fluxengine/FluxEngine.pkg
|
||||
fluxengine/FluxEngine.app.zip
|
||||
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
@@ -52,15 +80,15 @@ jobs:
|
||||
steps:
|
||||
- name: setup WSL
|
||||
run: |
|
||||
curl -L https://github.com/WhitewaterFoundry/Fedora-Remix-for-WSL/releases/download/40.1.0/Fedora-Remix-for-WSL-SL_40.1.0.0_x64_arm64.msixbundle -o fedora.msixbundle
|
||||
unzip fedora.msixbundle Fedora-Remix-for-WSL-SL_40.1.0.0_x64.msix
|
||||
unzip Fedora-Remix-for-WSL-SL_40.1.0.0_x64.msix install.tar.gz
|
||||
curl -L https://github.com/WhitewaterFoundry/Fedora-Remix-for-WSL/releases/download/41.0.0/Fedora-Remix-for-WSL-SL_41.0.0.0_x64_arm64.msixbundle -o fedora.msixbundle
|
||||
unzip fedora.msixbundle Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix
|
||||
unzip Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix install.tar.gz
|
||||
wsl --update
|
||||
wsl --set-default-version 2
|
||||
wsl --set-default-version 1
|
||||
wsl --import fedora fedora install.tar.gz
|
||||
wsl --set-default fedora
|
||||
wsl sh -c 'dnf -y install https://github.com/rpmsphere/noarch/raw/master/r/rpmsphere-release-38-1.noarch.rpm'
|
||||
wsl sh -c 'dnf -y install --setop=install_weak_deps=False gcc gcc-c++ protobuf-c-compiler protobuf-devel fmt-devel systemd-devel sqlite-devel wxGTK-devel mingw32-gcc mingw32-gcc-c++ mingw32-zlib-static mingw32-protobuf-static mingw32-sqlite-static mingw32-wxWidgets3-static mingw32-libpng-static mingw32-libjpeg-static mingw32-libtiff-static mingw32-nsis png2ico'
|
||||
wsl sh -c 'dnf -y install https://github.com/rpmsphere/noarch/raw/master/r/rpmsphere-release-40-1.noarch.rpm'
|
||||
wsl sh -c 'dnf -y install gcc gcc-c++ protobuf-c-compiler protobuf-devel fmt-devel systemd-devel sqlite-devel wxGTK-devel mingw32-gcc mingw32-gcc-c++ mingw32-zlib-static mingw32-protobuf-static mingw32-sqlite-static mingw32-wxWidgets3-static mingw32-libpng-static mingw32-libjpeg-static mingw32-libtiff-static mingw32-nsis png2ico ninja-build'
|
||||
|
||||
- name: fix line endings
|
||||
run: |
|
||||
|
||||
28
.github/workflows/release.yml
vendored
28
.github/workflows/release.yml
vendored
@@ -16,15 +16,15 @@ jobs:
|
||||
steps:
|
||||
- name: setup WSL
|
||||
run: |
|
||||
curl -L https://github.com/WhitewaterFoundry/Fedora-Remix-for-WSL/releases/download/39.0.1/Fedora-Remix-for-WSL-SL_39.0.1.0_x64_arm64.msixbundle -o fedora.msixbundle
|
||||
unzip fedora.msixbundle Fedora-Remix-for-WSL-SL_39.0.1.0_x64.msix
|
||||
unzip Fedora-Remix-for-WSL-SL_39.0.1.0_x64.msix install.tar.gz
|
||||
curl -L https://github.com/WhitewaterFoundry/Fedora-Remix-for-WSL/releases/download/41.0.0/Fedora-Remix-for-WSL-SL_41.0.0.0_x64_arm64.msixbundle -o fedora.msixbundle
|
||||
unzip fedora.msixbundle Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix
|
||||
unzip Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix install.tar.gz
|
||||
wsl --update
|
||||
wsl --set-default-version 2
|
||||
wsl --set-default-version 1
|
||||
wsl --import fedora fedora install.tar.gz
|
||||
wsl --set-default fedora
|
||||
wsl sh -c 'dnf -y install https://github.com/rpmsphere/noarch/raw/master/r/rpmsphere-release-38-1.noarch.rpm'
|
||||
wsl sh -c 'dnf -y install --setop=install_weak_deps=False gcc gcc-c++ protobuf-c-compiler protobuf-devel fmt-devel systemd-devel sqlite-devel wxGTK-devel mingw32-gcc mingw32-gcc-c++ mingw32-zlib-static mingw32-protobuf-static mingw32-sqlite-static mingw32-wxWidgets3-static mingw32-libpng-static mingw32-libjpeg-static mingw32-libtiff-static mingw32-nsis png2ico'
|
||||
wsl sh -c 'dnf -y install https://github.com/rpmsphere/noarch/raw/master/r/rpmsphere-release-40-1.noarch.rpm'
|
||||
wsl sh -c 'dnf -y install gcc gcc-c++ protobuf-c-compiler protobuf-devel fmt-devel systemd-devel sqlite-devel wxGTK-devel mingw32-gcc mingw32-gcc-c++ mingw32-zlib-static mingw32-protobuf-static mingw32-sqlite-static mingw32-wxWidgets3-static mingw32-libpng-static mingw32-libjpeg-static mingw32-libtiff-static mingw32-nsis png2ico ninja-build'
|
||||
|
||||
- name: fix line endings
|
||||
run: |
|
||||
@@ -85,7 +85,10 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
build-macos:
|
||||
runs-on: macos-13
|
||||
strategy:
|
||||
matrix:
|
||||
runs-on: [macos-13, macos-latest]
|
||||
runs-on: ${{ matrix.runs-on }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
@@ -93,7 +96,10 @@ jobs:
|
||||
run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
|
||||
|
||||
- name: make
|
||||
run: gmake -j`nproc`
|
||||
run: |
|
||||
gmake
|
||||
mv FluxEngine.pkg FluxEngine-${{ runner.arch }}.pkg
|
||||
mv FluxEngine.app.zip FluxEngine-${{ runner.arch }}.app.zip
|
||||
|
||||
- name: tag
|
||||
uses: EndBug/latest-tag@latest
|
||||
@@ -109,7 +115,8 @@ jobs:
|
||||
token: ${{ github.token }}
|
||||
tag: dev
|
||||
assets: |
|
||||
FluxEngine.pkg
|
||||
FluxEngine-${{ runner.arch }}.pkg
|
||||
FluxEngine-${{ runner.arch }}.app.zip
|
||||
fail-if-no-assets: false
|
||||
|
||||
- name: release
|
||||
@@ -117,7 +124,8 @@ jobs:
|
||||
with:
|
||||
name: Development build ${{ env.RELEASE_DATE }}
|
||||
files: |
|
||||
FluxEngine.pkg
|
||||
FluxEngine-${{ runner.arch }}.pkg
|
||||
FluxEngine-${{ runner.arch }}.app.zip
|
||||
tag_name: dev
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
58
Makefile
58
Makefile
@@ -1,16 +1,26 @@
|
||||
ifeq ($(BUILDTYPE),)
|
||||
buildtype_Darwin = osx
|
||||
buildtype_Haiku = haiku
|
||||
BUILDTYPE := $(buildtype_$(shell uname -s ))
|
||||
ifeq ($(BUILDTYPE),)
|
||||
BUILDTYPE := unix
|
||||
endif
|
||||
endif
|
||||
export BUILDTYPE
|
||||
BUILDTYPE ?= host
|
||||
|
||||
ifeq ($(BUILDTYPE),windows)
|
||||
MINGW = i686-w64-mingw32-
|
||||
CC = $(MINGW)gcc
|
||||
CXX = $(MINGW)g++ -std=c++17
|
||||
CFLAGS += -g -O3
|
||||
CXX = $(MINGW)g++ -std=c++20
|
||||
CFLAGS += -g -O3 \
|
||||
-Wno-unknown-warning-option \
|
||||
-ffunction-sections \
|
||||
-fdata-sections
|
||||
CXXFLAGS += \
|
||||
-fext-numeric-literals \
|
||||
-Wno-deprecated-enum-float-conversion \
|
||||
-Wno-deprecated-enum-enum-conversion
|
||||
LDFLAGS += -static
|
||||
LDFLAGS += -static -Wl,--gc-sections
|
||||
AR = $(MINGW)ar
|
||||
PKG_CONFIG = $(MINGW)pkg-config -static
|
||||
WINDRES = $(MINGW)windres
|
||||
@@ -18,15 +28,23 @@ ifeq ($(BUILDTYPE),windows)
|
||||
EXT = .exe
|
||||
else
|
||||
CC = gcc
|
||||
CXX = g++ -std=c++17
|
||||
CFLAGS = -g -O3
|
||||
CXX = g++ -std=c++20
|
||||
CFLAGS = -g -O3 \
|
||||
-Wno-unknown-warning-option
|
||||
CXXFLAGS += \
|
||||
-Wno-deprecated-enum-float-conversion \
|
||||
-Wno-deprecated-enum-enum-conversion
|
||||
LDFLAGS =
|
||||
AR = ar
|
||||
PKG_CONFIG = pkg-config
|
||||
ifeq ($(BUILDTYPE),osx)
|
||||
else
|
||||
LDFLAGS += -pthread -Wl,--no-as-needed
|
||||
endif
|
||||
endif
|
||||
|
||||
HOSTCC = gcc
|
||||
HOSTCXX = g++ -std=c++17
|
||||
HOSTCXX = g++ -std=c++20
|
||||
HOSTCFLAGS = -g -O3
|
||||
HOSTLDFLAGS =
|
||||
|
||||
@@ -73,24 +91,26 @@ binaries: all
|
||||
tests: all
|
||||
|
||||
README.md: $(OBJ)/scripts/+mkdocindex/mkdocindex$(EXT)
|
||||
@echo MKDOC $@
|
||||
@echo $(PROGRESSINFO)MKDOC $@
|
||||
@csplit -s -f$(OBJ)/README. README.md '/<!-- FORMATSSTART -->/' '%<!-- FORMATSEND -->%'
|
||||
@(cat $(OBJ)/README.00 && $< && cat $(OBJ)/README.01) > README.md
|
||||
|
||||
.PHONY: tests
|
||||
|
||||
.PHONY: install install-bin
|
||||
install:: all install-bin
|
||||
|
||||
clean::
|
||||
$(hide) rm -rf $(REALOBJ)
|
||||
|
||||
install-bin:
|
||||
@echo "INSTALL"
|
||||
$(hide) install -D -v "$(OBJ)/src+fluxengine/src+fluxengine" "$(DESTDIR)$(BINDIR)/fluxengine"
|
||||
$(hide) install -D -v "$(OBJ)/src/gui+gui/gui+gui" "$(DESTDIR)$(BINDIR)/fluxengine-gui"
|
||||
$(hide) install -D -v "$(OBJ)/tools+brother120tool/tools+brother120tool" "$(DESTDIR)$(BINDIR)/brother120tool"
|
||||
$(hide) install -D -v "$(OBJ)/tools+brother240tool/tools+brother240tool" "$(DESTDIR)$(BINDIR)/brother240tool"
|
||||
$(hide) install -D -v "$(OBJ)/tools+upgrade-flux-file/tools+upgrade-flux-file" "$(DESTDIR)$(BINDIR)/upgrade-flux-file"
|
||||
|
||||
include build/ab.mk
|
||||
|
||||
DOCKERFILES = \
|
||||
debian11 \
|
||||
debian12 \
|
||||
fedora40 \
|
||||
fedora41 \
|
||||
manjaro
|
||||
|
||||
docker-%: tests/docker/Dockerfile.%
|
||||
docker build -t $* -f $< .
|
||||
|
||||
.PHONY: dockertests
|
||||
dockertests: $(foreach f,$(DOCKERFILES), docker-$(strip $f) .WAIT)
|
||||
|
||||
32
README.md
32
README.md
@@ -4,11 +4,8 @@ FluxEngine
|
||||
(If you're reading this on GitHub, the formatting's a bit messed up. [Try the
|
||||
version on cowlark.com instead.](http://cowlark.com/fluxengine/))
|
||||
|
||||
**Breaking news!** As of 2022-09-09, there's new [filesystem
|
||||
support](doc/filesystem.md). Read (and sometimes write) files directly from
|
||||
(and to) your disks, with eight different file systems! It works in the GUI,
|
||||
too, which is available for Linux (and other Unix clones), Windows and OSX. See
|
||||
the details below.
|
||||
**Breaking news!** As of 2024-10-01, the FluxEngine client software works
|
||||
(to a point) with [Applesauce](doc/applesauce.md) hardware.
|
||||
|
||||
<div style="text-align: center">
|
||||
<a href="doc/screenshot.jpg"><img src="doc/screenshot.jpg" style="width:60%" alt="screenshot of the GUI in action"></a>
|
||||
@@ -35,12 +32,14 @@ Don't believe me? Watch the demo reel!
|
||||
</div>
|
||||
|
||||
**New!** The FluxEngine client software now works with
|
||||
[Greaseweazle](https://github.com/keirf/Greaseweazle/wiki) hardware. So, if you
|
||||
can't find a PSoC5 development kit, or don't want to use the Cypress Windows
|
||||
tools for programming it, you can use one of these instead. Very nearly all
|
||||
FluxEngine features are available with the Greaseweazle and it works out-of-the
|
||||
box. See the [dedicated Greaseweazle documentation page](doc/greaseweazle.md)
|
||||
for more information.
|
||||
[Greaseweazle](https://github.com/keirf/Greaseweazle/wiki) and
|
||||
[Applesauce](https://applesaucefdc.com/) hardware. So, if you can't find a PSoC5
|
||||
development kit, or don't want to use the Cypress Windows tools for programming
|
||||
it, you can use one of these instead. Very nearly all FluxEngine features are
|
||||
available with the Greaseweazle and it works out-of-the box; the Applesauce is a
|
||||
bit less supported but still works. See the [dedicated Greaseweazle
|
||||
documentation page](doc/greaseweazle.md) or the [Applesauce
|
||||
page](doc/applesauce.md) for more information.
|
||||
|
||||
Where?
|
||||
------
|
||||
@@ -126,6 +125,7 @@ choices because they can store multiple types of file system.
|
||||
| [`hplif`](doc/disk-hplif.md) | Hewlett-Packard LIF: a variety of disk formats used by HP | 🦄 | 🦄 | LIF |
|
||||
| [`ibm`](doc/disk-ibm.md) | IBM PC: Generic PC 3.5"/5.25" disks | 🦄 | 🦄 | FATFS |
|
||||
| [`icl30`](doc/disk-icl30.md) | ICL Model 30: CP/M; 263kB 35-track DSSD | 🦖 | | CPMFS |
|
||||
| [`juku`](doc/disk-juku.md) | Juku E5104: CP/M | | | CPMFS |
|
||||
| [`mac`](doc/disk-mac.md) | Macintosh: 400kB/800kB 3.5" GCR | 🦄 | 🦄 | MACHFS |
|
||||
| [`micropolis`](doc/disk-micropolis.md) | Micropolis: 100tpi MetaFloppy disks | 🦄 | 🦄 | |
|
||||
| [`ms2000`](doc/disk-ms2000.md) | : MS2000 Microdisk Development System | | | MICRODOS |
|
||||
@@ -137,6 +137,7 @@ choices because they can store multiple types of file system.
|
||||
| [`rx50`](doc/disk-rx50.md) | Digital RX50: 400kB 5.25" 80-track 10-sector SSDD | 🦖 | 🦖 | |
|
||||
| [`smaky6`](doc/disk-smaky6.md) | Smaky 6: 308kB 5.25" 77-track 16-sector SSDD, hard sectored | 🦖 | | SMAKY6 |
|
||||
| [`tartu`](doc/disk-tartu.md) | Tartu: The Palivere and variations | 🦄 | 🦖 | CPMFS |
|
||||
| [`ti99`](doc/disk-ti99.md) | TI-99: 90kB 35-track SSSD | 🦖 | | |
|
||||
| [`tids990`](doc/disk-tids990.md) | Texas Instruments DS990: 1126kB 8" DSSD | 🦖 | 🦖 | |
|
||||
| [`tiki`](doc/disk-tiki.md) | Tiki 100: CP/M | | | CPMFS |
|
||||
| [`victor9k`](doc/disk-victor9k.md) | Victor 9000 / Sirius One: 1224kB 5.25" DSDD GCR | 🦖 | 🦖 | |
|
||||
@@ -258,6 +259,15 @@ package, written by Robert Leslie et al, taken from
|
||||
https://www.mars.org/home/rob/proj/hfs. It is GPL 2.0 licensed. Please see the
|
||||
contents of the directory for the full text.
|
||||
|
||||
As an exception, `dep/lexy` contains a partial copy of the lexy package, written
|
||||
by foonathen@github, taken from https://github.com/foonathan/lexy. It is BSL 1.0
|
||||
licensed. Please see the contents of the directory for the full text.
|
||||
|
||||
As an exception, `dep/alphanum` contains a copy of the alphanum package,
|
||||
written by Dave Koelle, taken from
|
||||
https://web.archive.org/web/20210207124255/davekoelle.com/alphanum.html. It is
|
||||
MIT licensed. Please see the source for the full text.
|
||||
|
||||
__Important:__ Because of all these exceptions, if you distribute the
|
||||
FluxEngine package as a whole, you must comply with the terms of _all_ of the
|
||||
licensing terms. This means that __effectively the FluxEngine package is
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "aeslanier.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "arch/aeslanier/aeslanier.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "agat.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "arch/agat/agat.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
|
||||
uint8_t agatChecksum(const Bytes& bytes)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message AgatDecoderProto {}
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "agat.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "arch/agat/agat.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "agat.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/layout.h"
|
||||
#include "arch/agat/agat.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "arch/agat/agat.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "amiga.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "arch/amiga/amiga.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
|
||||
uint32_t amigaChecksum(const Bytes& bytes)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message AmigaDecoderProto {}
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "amiga.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/amiga/amiga.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
#include <string.h>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "amiga.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/amiga/amiga.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/amiga/amiga.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message Apple2DecoderProto {
|
||||
optional uint32 side_one_track_offset = 1
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "apple2.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/apple2/apple2.h"
|
||||
#include "arch/apple2/apple2.pb.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "arch/apple2/apple2.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include <ctype.h>
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
static int encode_data_gcr(uint8_t data)
|
||||
{
|
||||
|
||||
97
arch/arch.cc
Normal file
97
arch/arch.cc
Normal file
@@ -0,0 +1,97 @@
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "arch/agat/agat.h"
|
||||
#include "arch/aeslanier/aeslanier.h"
|
||||
#include "arch/amiga/amiga.h"
|
||||
#include "arch/apple2/apple2.h"
|
||||
#include "arch/brother/brother.h"
|
||||
#include "arch/c64/c64.h"
|
||||
#include "arch/f85/f85.h"
|
||||
#include "arch/fb100/fb100.h"
|
||||
#include "arch/ibm/ibm.h"
|
||||
#include "arch/macintosh/macintosh.h"
|
||||
#include "arch/micropolis/micropolis.h"
|
||||
#include "arch/mx/mx.h"
|
||||
#include "arch/northstar/northstar.h"
|
||||
#include "arch/rolandd20/rolandd20.h"
|
||||
#include "arch/smaky6/smaky6.h"
|
||||
#include "arch/tartu/tartu.h"
|
||||
#include "arch/tids990/tids990.h"
|
||||
#include "arch/victor9k/victor9k.h"
|
||||
#include "arch/zilogmcz/zilogmcz.h"
|
||||
#include "arch/arch.h"
|
||||
|
||||
std::unique_ptr<Encoder> Arch::createEncoder(Config& config)
|
||||
{
|
||||
if (!config.hasEncoder())
|
||||
error("no encoder configured");
|
||||
return createEncoder(config->encoder());
|
||||
}
|
||||
|
||||
std::unique_ptr<Encoder> Arch::createEncoder(const EncoderProto& config)
|
||||
{
|
||||
static const std::map<int,
|
||||
std::function<std::unique_ptr<Encoder>(const EncoderProto&)>>
|
||||
encoders = {
|
||||
{EncoderProto::kAgat, createAgatEncoder },
|
||||
{EncoderProto::kAmiga, createAmigaEncoder },
|
||||
{EncoderProto::kApple2, createApple2Encoder },
|
||||
{EncoderProto::kBrother, createBrotherEncoder },
|
||||
{EncoderProto::kC64, createCommodore64Encoder},
|
||||
{EncoderProto::kIbm, createIbmEncoder },
|
||||
{EncoderProto::kMacintosh, createMacintoshEncoder },
|
||||
{EncoderProto::kMicropolis, createMicropolisEncoder },
|
||||
{EncoderProto::kNorthstar, createNorthstarEncoder },
|
||||
{EncoderProto::kTartu, createTartuEncoder },
|
||||
{EncoderProto::kTids990, createTids990Encoder },
|
||||
{EncoderProto::kVictor9K, createVictor9kEncoder },
|
||||
};
|
||||
|
||||
auto encoder = encoders.find(config.format_case());
|
||||
if (encoder == encoders.end())
|
||||
error("no encoder specified");
|
||||
|
||||
return (encoder->second)(config);
|
||||
}
|
||||
|
||||
std::unique_ptr<Decoder> Arch::createDecoder(Config& config)
|
||||
{
|
||||
if (!config.hasDecoder())
|
||||
error("no decoder configured");
|
||||
return createDecoder(config->decoder());
|
||||
}
|
||||
|
||||
std::unique_ptr<Decoder> Arch::createDecoder(const DecoderProto& config)
|
||||
{
|
||||
static const std::map<int,
|
||||
std::function<std::unique_ptr<Decoder>(const DecoderProto&)>>
|
||||
decoders = {
|
||||
{DecoderProto::kAgat, createAgatDecoder },
|
||||
{DecoderProto::kAeslanier, createAesLanierDecoder },
|
||||
{DecoderProto::kAmiga, createAmigaDecoder },
|
||||
{DecoderProto::kApple2, createApple2Decoder },
|
||||
{DecoderProto::kBrother, createBrotherDecoder },
|
||||
{DecoderProto::kC64, createCommodore64Decoder},
|
||||
{DecoderProto::kF85, createDurangoF85Decoder },
|
||||
{DecoderProto::kFb100, createFb100Decoder },
|
||||
{DecoderProto::kIbm, createIbmDecoder },
|
||||
{DecoderProto::kMacintosh, createMacintoshDecoder },
|
||||
{DecoderProto::kMicropolis, createMicropolisDecoder },
|
||||
{DecoderProto::kMx, createMxDecoder },
|
||||
{DecoderProto::kNorthstar, createNorthstarDecoder },
|
||||
{DecoderProto::kRolandd20, createRolandD20Decoder },
|
||||
{DecoderProto::kSmaky6, createSmaky6Decoder },
|
||||
{DecoderProto::kTartu, createTartuDecoder },
|
||||
{DecoderProto::kTids990, createTids990Decoder },
|
||||
{DecoderProto::kVictor9K, createVictor9kDecoder },
|
||||
{DecoderProto::kZilogmcz, createZilogMczDecoder },
|
||||
};
|
||||
|
||||
auto decoder = decoders.find(config.format_case());
|
||||
if (decoder == decoders.end())
|
||||
error("no decoder specified");
|
||||
|
||||
return (decoder->second)(config);
|
||||
}
|
||||
16
arch/arch.h
Normal file
16
arch/arch.h
Normal file
@@ -0,0 +1,16 @@
|
||||
#pragma once
|
||||
|
||||
class Encoder;
|
||||
class Decoder;
|
||||
class DecoderProto;
|
||||
class EncoderProto;
|
||||
class Config;
|
||||
|
||||
namespace Arch
|
||||
{
|
||||
std::unique_ptr<Decoder> createDecoder(Config& config);
|
||||
std::unique_ptr<Decoder> createDecoder(const DecoderProto& config);
|
||||
|
||||
std::unique_ptr<Encoder> createEncoder(Config& config);
|
||||
std::unique_ptr<Encoder> createEncoder(const EncoderProto& config);
|
||||
}
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "brother.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/crc.h"
|
||||
#include "arch/brother/brother.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include <ctype.h>
|
||||
|
||||
const FluxPattern SECTOR_RECORD_PATTERN(32, BROTHER_SECTOR_RECORD);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "brother.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/brother/brother.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/brother/brother.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
|
||||
@@ -1,27 +1,61 @@
|
||||
from build.c import cxxlibrary
|
||||
from build.protobuf import proto, protocc
|
||||
from build.protobuf import proto, protocc, protolib
|
||||
from os.path import *
|
||||
from glob import glob
|
||||
import sys
|
||||
|
||||
proto(
|
||||
name="arch_proto",
|
||||
srcs=[
|
||||
"./aeslanier/aeslanier.proto",
|
||||
"./agat/agat.proto",
|
||||
"./amiga/amiga.proto",
|
||||
"./apple2/apple2.proto",
|
||||
"./brother/brother.proto",
|
||||
"./c64/c64.proto",
|
||||
"./f85/f85.proto",
|
||||
"./fb100/fb100.proto",
|
||||
"./ibm/ibm.proto",
|
||||
"./macintosh/macintosh.proto",
|
||||
"./micropolis/micropolis.proto",
|
||||
"./mx/mx.proto",
|
||||
"./northstar/northstar.proto",
|
||||
"./rolandd20/rolandd20.proto",
|
||||
"./smaky6/smaky6.proto",
|
||||
"./tartu/tartu.proto",
|
||||
"./tids990/tids990.proto",
|
||||
"./victor9k/victor9k.proto",
|
||||
"./zilogmcz/zilogmcz.proto",
|
||||
],
|
||||
archs = [f for f in glob("*", root_dir="arch") if isfile(f"arch/{f}/{f}.proto")]
|
||||
|
||||
ps = []
|
||||
pls = []
|
||||
cls = []
|
||||
for a in archs:
|
||||
ps += [
|
||||
proto(
|
||||
name=f"proto_{a}",
|
||||
srcs=[f"arch/{a}/{a}.proto"],
|
||||
deps=["lib/config+common_proto"],
|
||||
)
|
||||
]
|
||||
|
||||
pls += [
|
||||
protocc(
|
||||
name=f"proto_lib_{a}",
|
||||
srcs=[f".+proto_{a}"],
|
||||
deps=["lib/config+common_proto_lib"],
|
||||
)
|
||||
]
|
||||
|
||||
cls += [
|
||||
cxxlibrary(
|
||||
name=f"arch_{a}",
|
||||
srcs=glob(f"arch/{a}/*.cc") + glob(f"arch/{a}/*.h"),
|
||||
hdrs={f"arch/{a}/{a}.h": f"arch/{a}/{a}.h"},
|
||||
deps=[
|
||||
"lib/core",
|
||||
"lib/data",
|
||||
"lib/config",
|
||||
"lib/encoders",
|
||||
"lib/decoders",
|
||||
],
|
||||
)
|
||||
]
|
||||
|
||||
protolib(
|
||||
name="proto",
|
||||
srcs=ps + ["lib/config+common_proto"],
|
||||
)
|
||||
|
||||
cxxlibrary(name="proto_lib", deps=pls)
|
||||
|
||||
cxxlibrary(
|
||||
name="arch",
|
||||
srcs=[
|
||||
"./arch.cc",
|
||||
],
|
||||
hdrs={
|
||||
"arch/arch.h": "./arch.h",
|
||||
},
|
||||
deps=cls
|
||||
+ ["lib/core", "lib/data", "lib/config", "lib/encoders", "lib/decoders"],
|
||||
)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "lib/globals.h"
|
||||
#include "c64.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "arch/c64/c64.h"
|
||||
|
||||
/*
|
||||
* Track Sectors/track # Sectors Storage in Bytes Clock rate
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message Commodore64DecoderProto {}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "c64.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/c64/c64.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "c64.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/c64/c64.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "arch/c64/c64.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <ctype.h>
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
static bool lastBit;
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "f85.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/f85/f85.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "fb100.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/fb100/fb100.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/decoders/rawbits.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "ibm.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "arch/ibm/ibm.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/ibm/ibm.pb.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <string.h>
|
||||
|
||||
static_assert(std::is_trivially_copyable<IbmIdam>::value,
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "ibm.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/ibm/ibm.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/ibm/ibm.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/proto.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/config/proto.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <ctype.h>
|
||||
|
||||
/* IAM record separator:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message IbmDecoderProto {
|
||||
// Next: 11
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "macintosh.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/macintosh/macintosh.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "macintosh.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/macintosh/macintosh.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include "arch/macintosh/macintosh.pb.h"
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message MacintoshDecoderProto {}
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "micropolis.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/micropolis/micropolis.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "lib/globals.h"
|
||||
#include "micropolis.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "arch/micropolis/micropolis.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
static void write_sector(std::vector<bool>& bits,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message MicropolisDecoderProto {
|
||||
enum ChecksumType {
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "arch/mx/mx.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include <string.h>
|
||||
|
||||
const int SECTOR_SIZE = 256;
|
||||
|
||||
@@ -11,13 +11,14 @@
|
||||
* sure that the hardSectorId is correct.
|
||||
*/
|
||||
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "northstar.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/northstar/northstar.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
#include "fmt/format.h"
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "lib/globals.h"
|
||||
#include "northstar.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "arch/northstar/northstar.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "lib/image.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
|
||||
#define GAP_FILL_SIZE_SD 30
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message NorthstarDecoderProto {}
|
||||
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "rolandd20.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "arch/rolandd20/rolandd20.h"
|
||||
#include <string.h>
|
||||
|
||||
/* Sector header record:
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "smaky6.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/smaky6/smaky6.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "fmt/format.h"
|
||||
#include "lib/decoders/decoders.pb.h"
|
||||
#include <string.h>
|
||||
|
||||
@@ -1,22 +1,21 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "arch/tartu/tartu.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include <string.h>
|
||||
|
||||
constexpr uint64_t HEADER_BITS = 0xaaaaaaaa44895554LL;
|
||||
constexpr uint64_t DATA_BITS = 0xaaaaaaaa44895545LL;
|
||||
constexpr uint64_t DATA_BITS = 0xaaaaaaaa44895545LL;
|
||||
|
||||
static const FluxPattern HEADER_PATTERN(64, HEADER_BITS);
|
||||
static const FluxPattern DATA_PATTERN(64, DATA_BITS);
|
||||
|
||||
const FluxMatchers ANY_RECORD_PATTERN {
|
||||
&HEADER_PATTERN,
|
||||
&DATA_PATTERN
|
||||
};
|
||||
const FluxMatchers ANY_RECORD_PATTERN{&HEADER_PATTERN, &DATA_PATTERN};
|
||||
|
||||
class TartuDecoder : public Decoder
|
||||
{
|
||||
@@ -27,9 +26,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
void beginTrack() override
|
||||
{
|
||||
}
|
||||
void beginTrack() override {}
|
||||
|
||||
nanoseconds_t advanceToNextRecord() override
|
||||
{
|
||||
@@ -43,7 +40,7 @@ public:
|
||||
|
||||
auto bits = readRawBits(16 * 4);
|
||||
auto bytes = decodeFmMfm(bits).slice(0, 4);
|
||||
|
||||
|
||||
ByteReader br(bytes);
|
||||
uint8_t track = br.read_8();
|
||||
_sector->logicalTrack = track >> 1;
|
||||
@@ -52,7 +49,7 @@ public:
|
||||
_sector->logicalSector = br.read_8();
|
||||
uint8_t wantChecksum = br.read_8();
|
||||
uint8_t gotChecksum = ~sumBytes(bytes.slice(0, 3));
|
||||
|
||||
|
||||
if (wantChecksum == gotChecksum)
|
||||
_sector->status = Sector::DATA_MISSING;
|
||||
|
||||
@@ -63,14 +60,15 @@ public:
|
||||
{
|
||||
if (readRaw64() != DATA_BITS)
|
||||
return;
|
||||
|
||||
|
||||
const auto& bits = readRawBits(129 * 16);
|
||||
const auto& bytes = decodeFmMfm(bits).slice(0, 129);
|
||||
_sector->data = bytes.slice(0, 128);
|
||||
|
||||
uint8_t wantChecksum = bytes.reader().seek(128).read_8();
|
||||
uint8_t gotChecksum = ~sumBytes(_sector->data);
|
||||
_sector->status = (wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
|
||||
_sector->status =
|
||||
(wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -81,4 +79,3 @@ std::unique_ptr<Decoder> createTartuDecoder(const DecoderProto& config)
|
||||
{
|
||||
return std::unique_ptr<Decoder>(new TartuDecoder(config));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/config/config.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "arch/tartu/tartu.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include <string.h>
|
||||
|
||||
class TartuEncoder : public Encoder
|
||||
|
||||
@@ -5,4 +5,3 @@ extern std::unique_ptr<Decoder> createTartuDecoder(const DecoderProto& config);
|
||||
extern std::unique_ptr<Encoder> createTartuEncoder(const EncoderProto& config);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message TartuDecoderProto {}
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "arch/tids990/tids990.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include <string.h>
|
||||
#include <fmt/format.h>
|
||||
#include "fmt/format.h"
|
||||
|
||||
/* The Texas Instruments DS990 uses MFM with a scheme similar to a simplified
|
||||
* version of the IBM record scheme (it's actually easier to parse than IBM).
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "tids990.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/tids990/tids990.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "arch/tids990/tids990.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include <fmt/format.h>
|
||||
#include "fmt/format.h"
|
||||
|
||||
static int charToInt(char c)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message Tids990DecoderProto {}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "victor9k.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/victor9k/victor9k.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/core/utils.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/encoders/encoders.h"
|
||||
#include "victor9k.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/sector.h"
|
||||
#include "lib/readerwriter.h"
|
||||
#include "lib/image.h"
|
||||
#include "arch/victor9k/victor9k.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "lib/data/image.h"
|
||||
#include "fmt/format.h"
|
||||
#include "arch/victor9k/victor9k.pb.h"
|
||||
#include "lib/encoders/encoders.pb.h"
|
||||
#include "lib/layout.h"
|
||||
#include "lib/data/layout.h"
|
||||
#include <ctype.h>
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/core/bytes.h"
|
||||
|
||||
static bool lastBit;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
syntax = "proto2";
|
||||
|
||||
import "lib/common.proto";
|
||||
import "lib/config/common.proto";
|
||||
|
||||
message Victor9kDecoderProto {}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/fluxmap.h"
|
||||
#include "lib/decoders/fluxmapreader.h"
|
||||
#include "lib/core/globals.h"
|
||||
#include "lib/data/fluxmap.h"
|
||||
#include "lib/data/fluxmapreader.h"
|
||||
#include "lib/data/fluxpattern.h"
|
||||
#include "protocol.h"
|
||||
#include "lib/decoders/decoders.h"
|
||||
#include "lib/sector.h"
|
||||
#include "zilogmcz.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/crc.h"
|
||||
#include "lib/data/sector.h"
|
||||
#include "arch/zilogmcz/zilogmcz.h"
|
||||
#include "lib/core/bytes.h"
|
||||
#include "lib/core/crc.h"
|
||||
#include "fmt/format.h"
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
|
||||
258
build.py
258
build.py
@@ -1,236 +1,25 @@
|
||||
from build.ab import export
|
||||
from build.c import clibrary, cxxlibrary
|
||||
from build.protobuf import proto, protocc
|
||||
from build.pkg import package, hostpackage
|
||||
from build.pkg import package
|
||||
from build.utils import test
|
||||
from glob import glob
|
||||
import config
|
||||
import re
|
||||
|
||||
# Hack for building on Fedora/WSL; executables get the .exe extension,
|
||||
# but the build system detects it as Linux.
|
||||
import build.toolchain
|
||||
|
||||
toolchain.Toolchain.EXE = "$(EXT)"
|
||||
|
||||
package(name="protobuf_lib", package="protobuf")
|
||||
package(name="z_lib", package="zlib")
|
||||
package(name="fmt_lib", package="fmt", fallback="dep/fmt")
|
||||
package(name="sqlite3_lib", package="sqlite3")
|
||||
|
||||
hostpackage(name="protobuf_host_lib", package="protobuf")
|
||||
hostpackage(name="z_host_lib", package="zlib")
|
||||
hostpackage(name="fmt_host_lib", package="fmt")
|
||||
hostpackage(name="sqlite3_host_lib", package="sqlite3")
|
||||
|
||||
clibrary(name="protocol", hdrs={"protocol.h": "./protocol.h"})
|
||||
|
||||
proto(name="fl2_proto", srcs=["lib/fl2.proto"])
|
||||
protocc(name="fl2_proto_lib", srcs=["+fl2_proto"])
|
||||
|
||||
cxxlibrary(
|
||||
name="lib",
|
||||
srcs=[
|
||||
"./lib/bitmap.cc",
|
||||
"./lib/bytes.cc",
|
||||
"./lib/config.cc",
|
||||
"./lib/crc.cc",
|
||||
"./lib/csvreader.cc",
|
||||
"./lib/decoders/decoders.cc",
|
||||
"./lib/decoders/fluxdecoder.cc",
|
||||
"./lib/decoders/fluxmapreader.cc",
|
||||
"./lib/decoders/fmmfm.cc",
|
||||
"./lib/encoders/encoders.cc",
|
||||
"./lib/fl2.cc",
|
||||
"./lib/flags.cc",
|
||||
"./lib/fluxmap.cc",
|
||||
"./lib/fluxsink/a2rfluxsink.cc",
|
||||
"./lib/fluxsink/aufluxsink.cc",
|
||||
"./lib/fluxsink/fl2fluxsink.cc",
|
||||
"./lib/fluxsink/fluxsink.cc",
|
||||
"./lib/fluxsink/hardwarefluxsink.cc",
|
||||
"./lib/fluxsink/scpfluxsink.cc",
|
||||
"./lib/fluxsink/vcdfluxsink.cc",
|
||||
"./lib/fluxsource/a2rfluxsource.cc",
|
||||
"./lib/fluxsource/catweasel.cc",
|
||||
"./lib/fluxsource/cwffluxsource.cc",
|
||||
"./lib/fluxsource/dmkfluxsource.cc",
|
||||
"./lib/fluxsource/erasefluxsource.cc",
|
||||
"./lib/fluxsource/fl2fluxsource.cc",
|
||||
"./lib/fluxsource/fluxsource.cc",
|
||||
"./lib/fluxsource/flx.cc",
|
||||
"./lib/fluxsource/flxfluxsource.cc",
|
||||
"./lib/fluxsource/hardwarefluxsource.cc",
|
||||
"./lib/fluxsource/kryoflux.cc",
|
||||
"./lib/fluxsource/kryofluxfluxsource.cc",
|
||||
"./lib/fluxsource/memoryfluxsource.cc",
|
||||
"./lib/fluxsource/scpfluxsource.cc",
|
||||
"./lib/fluxsource/testpatternfluxsource.cc",
|
||||
"./lib/globals.cc",
|
||||
"./lib/hexdump.cc",
|
||||
"./lib/image.cc",
|
||||
"./lib/imagereader/d64imagereader.cc",
|
||||
"./lib/imagereader/d88imagereader.cc",
|
||||
"./lib/imagereader/dimimagereader.cc",
|
||||
"./lib/imagereader/diskcopyimagereader.cc",
|
||||
"./lib/imagereader/fdiimagereader.cc",
|
||||
"./lib/imagereader/imagereader.cc",
|
||||
"./lib/imagereader/imdimagereader.cc",
|
||||
"./lib/imagereader/imgimagereader.cc",
|
||||
"./lib/imagereader/jv3imagereader.cc",
|
||||
"./lib/imagereader/nfdimagereader.cc",
|
||||
"./lib/imagereader/nsiimagereader.cc",
|
||||
"./lib/imagereader/td0imagereader.cc",
|
||||
"./lib/imagewriter/d64imagewriter.cc",
|
||||
"./lib/imagewriter/d88imagewriter.cc",
|
||||
"./lib/imagewriter/diskcopyimagewriter.cc",
|
||||
"./lib/imagewriter/imagewriter.cc",
|
||||
"./lib/imagewriter/imdimagewriter.cc",
|
||||
"./lib/imagewriter/imgimagewriter.cc",
|
||||
"./lib/imagewriter/ldbsimagewriter.cc",
|
||||
"./lib/imagewriter/nsiimagewriter.cc",
|
||||
"./lib/imagewriter/rawimagewriter.cc",
|
||||
"./lib/layout.cc",
|
||||
"./lib/ldbs.cc",
|
||||
"./lib/logger.cc",
|
||||
"./lib/proto.cc",
|
||||
"./lib/readerwriter.cc",
|
||||
"./lib/sector.cc",
|
||||
"./lib/usb/fluxengineusb.cc",
|
||||
"./lib/usb/greaseweazle.cc",
|
||||
"./lib/usb/greaseweazleusb.cc",
|
||||
"./lib/usb/serial.cc",
|
||||
"./lib/usb/usb.cc",
|
||||
"./lib/usb/usbfinder.cc",
|
||||
"./lib/utils.cc",
|
||||
"./lib/vfs/acorndfs.cc",
|
||||
"./lib/vfs/amigaffs.cc",
|
||||
"./lib/vfs/appledos.cc",
|
||||
"./lib/vfs/applesingle.cc",
|
||||
"./lib/vfs/brother120fs.cc",
|
||||
"./lib/vfs/cbmfs.cc",
|
||||
"./lib/vfs/cpmfs.cc",
|
||||
"./lib/vfs/fatfs.cc",
|
||||
"./lib/vfs/fluxsectorinterface.cc",
|
||||
"./lib/vfs/imagesectorinterface.cc",
|
||||
"./lib/vfs/lif.cc",
|
||||
"./lib/vfs/machfs.cc",
|
||||
"./lib/vfs/microdos.cc",
|
||||
"./lib/vfs/philefs.cc",
|
||||
"./lib/vfs/prodos.cc",
|
||||
"./lib/vfs/roland.cc",
|
||||
"./lib/vfs/smaky6fs.cc",
|
||||
"./lib/vfs/vfs.cc",
|
||||
"./lib/vfs/zdos.cc",
|
||||
"./arch/aeslanier/decoder.cc",
|
||||
"./arch/agat/agat.cc",
|
||||
"./arch/agat/decoder.cc",
|
||||
"./arch/agat/encoder.cc",
|
||||
"./arch/amiga/amiga.cc",
|
||||
"./arch/amiga/decoder.cc",
|
||||
"./arch/amiga/encoder.cc",
|
||||
"./arch/apple2/decoder.cc",
|
||||
"./arch/apple2/encoder.cc",
|
||||
"./arch/brother/decoder.cc",
|
||||
"./arch/brother/encoder.cc",
|
||||
"./arch/c64/c64.cc",
|
||||
"./arch/c64/decoder.cc",
|
||||
"./arch/c64/encoder.cc",
|
||||
"./arch/f85/decoder.cc",
|
||||
"./arch/fb100/decoder.cc",
|
||||
"./arch/ibm/decoder.cc",
|
||||
"./arch/ibm/encoder.cc",
|
||||
"./arch/macintosh/decoder.cc",
|
||||
"./arch/macintosh/encoder.cc",
|
||||
"./arch/micropolis/decoder.cc",
|
||||
"./arch/micropolis/encoder.cc",
|
||||
"./arch/mx/decoder.cc",
|
||||
"./arch/northstar/decoder.cc",
|
||||
"./arch/northstar/encoder.cc",
|
||||
"./arch/rolandd20/decoder.cc",
|
||||
"./arch/smaky6/decoder.cc",
|
||||
"./arch/tartu/decoder.cc",
|
||||
"./arch/tartu/encoder.cc",
|
||||
"./arch/tids990/decoder.cc",
|
||||
"./arch/tids990/encoder.cc",
|
||||
"./arch/victor9k/decoder.cc",
|
||||
"./arch/victor9k/encoder.cc",
|
||||
"./arch/zilogmcz/decoder.cc",
|
||||
],
|
||||
hdrs={
|
||||
"arch/ibm/ibm.h": "./arch/ibm/ibm.h",
|
||||
"arch/apple2/data_gcr.h": "./arch/apple2/data_gcr.h",
|
||||
"arch/apple2/apple2.h": "./arch/apple2/apple2.h",
|
||||
"arch/smaky6/smaky6.h": "./arch/smaky6/smaky6.h",
|
||||
"arch/tids990/tids990.h": "./arch/tids990/tids990.h",
|
||||
"arch/zilogmcz/zilogmcz.h": "./arch/zilogmcz/zilogmcz.h",
|
||||
"arch/amiga/amiga.h": "./arch/amiga/amiga.h",
|
||||
"arch/f85/data_gcr.h": "./arch/f85/data_gcr.h",
|
||||
"arch/f85/f85.h": "./arch/f85/f85.h",
|
||||
"arch/mx/mx.h": "./arch/mx/mx.h",
|
||||
"arch/aeslanier/aeslanier.h": "./arch/aeslanier/aeslanier.h",
|
||||
"arch/northstar/northstar.h": "./arch/northstar/northstar.h",
|
||||
"arch/brother/data_gcr.h": "./arch/brother/data_gcr.h",
|
||||
"arch/brother/brother.h": "./arch/brother/brother.h",
|
||||
"arch/brother/header_gcr.h": "./arch/brother/header_gcr.h",
|
||||
"arch/macintosh/data_gcr.h": "./arch/macintosh/data_gcr.h",
|
||||
"arch/macintosh/macintosh.h": "./arch/macintosh/macintosh.h",
|
||||
"arch/agat/agat.h": "./arch/agat/agat.h",
|
||||
"arch/fb100/fb100.h": "./arch/fb100/fb100.h",
|
||||
"arch/victor9k/data_gcr.h": "./arch/victor9k/data_gcr.h",
|
||||
"arch/victor9k/victor9k.h": "./arch/victor9k/victor9k.h",
|
||||
"arch/rolandd20/rolandd20.h": "./arch/rolandd20/rolandd20.h",
|
||||
"arch/micropolis/micropolis.h": "./arch/micropolis/micropolis.h",
|
||||
"arch/c64/data_gcr.h": "./arch/c64/data_gcr.h",
|
||||
"arch/c64/c64.h": "./arch/c64/c64.h",
|
||||
"arch/tartu/tartu.h": "./arch/tartu/tartu.h",
|
||||
"lib/a2r.h": "./lib/a2r.h",
|
||||
"lib/bitmap.h": "./lib/bitmap.h",
|
||||
"lib/bytes.h": "./lib/bytes.h",
|
||||
"lib/config.h": "./lib/config.h",
|
||||
"lib/crc.h": "./lib/crc.h",
|
||||
"lib/csvreader.h": "./lib/csvreader.h",
|
||||
"lib/decoders/decoders.h": "./lib/decoders/decoders.h",
|
||||
"lib/decoders/fluxdecoder.h": "./lib/decoders/fluxdecoder.h",
|
||||
"lib/decoders/fluxmapreader.h": "./lib/decoders/fluxmapreader.h",
|
||||
"lib/decoders/rawbits.h": "./lib/decoders/rawbits.h",
|
||||
"lib/encoders/encoders.h": "./lib/encoders/encoders.h",
|
||||
"lib/scp.h": "./lib/scp.h",
|
||||
"lib/fl2.h": "./lib/fl2.h",
|
||||
"lib/flags.h": "./lib/flags.h",
|
||||
"lib/flux.h": "./lib/flux.h",
|
||||
"lib/fluxmap.h": "./lib/fluxmap.h",
|
||||
"lib/fluxsink/fluxsink.h": "./lib/fluxsink/fluxsink.h",
|
||||
"lib/fluxsource/catweasel.h": "lib/fluxsource/catweasel.h",
|
||||
"lib/fluxsource/fluxsource.h": "lib/fluxsource/fluxsource.h",
|
||||
"lib/fluxsource/flx.h": "lib/fluxsource/flx.h",
|
||||
"lib/fluxsource/kryoflux.h": "lib/fluxsource/kryoflux.h",
|
||||
"lib/globals.h": "./lib/globals.h",
|
||||
"lib/image.h": "./lib/image.h",
|
||||
"lib/imagereader/imagereader.h": "./lib/imagereader/imagereader.h",
|
||||
"lib/imagewriter/imagewriter.h": "./lib/imagewriter/imagewriter.h",
|
||||
"lib/layout.h": "./lib/layout.h",
|
||||
"lib/ldbs.h": "./lib/ldbs.h",
|
||||
"lib/logger.h": "./lib/logger.h",
|
||||
"lib/proto.h": "./lib/proto.h",
|
||||
"lib/readerwriter.h": "./lib/readerwriter.h",
|
||||
"lib/sector.h": "./lib/sector.h",
|
||||
"lib/usb/greaseweazle.h": "./lib/usb/greaseweazle.h",
|
||||
"lib/usb/usb.h": "./lib/usb/usb.h",
|
||||
"lib/usb/usbfinder.h": "./lib/usb/usbfinder.h",
|
||||
"lib/utils.h": "./lib/utils.h",
|
||||
"lib/vfs/applesingle.h": "./lib/vfs/applesingle.h",
|
||||
"lib/vfs/sectorinterface.h": "./lib/vfs/sectorinterface.h",
|
||||
"lib/vfs/vfs.h": "./lib/vfs/vfs.h",
|
||||
},
|
||||
deps=[
|
||||
"+fl2_proto_lib",
|
||||
"+fmt_lib",
|
||||
"+protocol",
|
||||
"dep/adflib",
|
||||
"dep/agg",
|
||||
"dep/fatfs",
|
||||
"dep/hfsutils",
|
||||
"dep/libusbp",
|
||||
"dep/stb",
|
||||
"lib+config_proto_lib",
|
||||
],
|
||||
)
|
||||
|
||||
corpustests = []
|
||||
if not glob("../fluxengine-testdata/data"):
|
||||
print("fluxengine-testdata not found; skipping corpus tests")
|
||||
@@ -239,7 +28,7 @@ else:
|
||||
("acorndfs", "", "--200"),
|
||||
("agat", "", ""),
|
||||
("amiga", "", ""),
|
||||
("apple2", "", "--140 40track_drive"),
|
||||
("apple2", "", "--140 --drivetype=40"),
|
||||
("atarist", "", "--360"),
|
||||
("atarist", "", "--370"),
|
||||
("atarist", "", "--400"),
|
||||
@@ -249,17 +38,17 @@ else:
|
||||
("atarist", "", "--800"),
|
||||
("atarist", "", "--820"),
|
||||
("bk", "", ""),
|
||||
("brother", "", "--120 40track_drive"),
|
||||
("brother", "", "--120 --drivetype=40"),
|
||||
("brother", "", "--240"),
|
||||
(
|
||||
"commodore",
|
||||
"scripts/commodore1541_test.textpb",
|
||||
"--171 40track_drive",
|
||||
"--171 --drivetype=40",
|
||||
),
|
||||
(
|
||||
"commodore",
|
||||
"scripts/commodore1541_test.textpb",
|
||||
"--192 40track_drive",
|
||||
"--192 --drivetype=40",
|
||||
),
|
||||
("commodore", "", "--800"),
|
||||
("commodore", "", "--1620"),
|
||||
@@ -271,17 +60,17 @@ else:
|
||||
("ibm", "", "--1232"),
|
||||
("ibm", "", "--1440"),
|
||||
("ibm", "", "--1680"),
|
||||
("ibm", "", "--180 40track_drive"),
|
||||
("ibm", "", "--160 40track_drive"),
|
||||
("ibm", "", "--320 40track_drive"),
|
||||
("ibm", "", "--360 40track_drive"),
|
||||
("ibm", "", "--180 --drivetype=40"),
|
||||
("ibm", "", "--160 --drivetype=40"),
|
||||
("ibm", "", "--320 --drivetype=40"),
|
||||
("ibm", "", "--360 --drivetype=40"),
|
||||
("ibm", "", "--720_96"),
|
||||
("ibm", "", "--720_135"),
|
||||
("mac", "scripts/mac400_test.textpb", "--400"),
|
||||
("mac", "scripts/mac800_test.textpb", "--800"),
|
||||
("n88basic", "", ""),
|
||||
("rx50", "", ""),
|
||||
("tartu", "", "--390 40track_drive"),
|
||||
("tartu", "", "--390 --drivetype=40"),
|
||||
("tartu", "", "--780"),
|
||||
("tids990", "", ""),
|
||||
("victor9k", "", "--612"),
|
||||
@@ -296,15 +85,15 @@ else:
|
||||
ins=["src+fluxengine"],
|
||||
deps=["scripts/encodedecodetest.sh"],
|
||||
commands=[
|
||||
"{deps[0]} "
|
||||
"$[deps[0]] "
|
||||
+ c[0]
|
||||
+ " "
|
||||
+ format
|
||||
+ " {ins[0]} '"
|
||||
+ " $[ins[0]] '"
|
||||
+ c[1]
|
||||
+ "' '"
|
||||
+ c[2]
|
||||
+ "' $(dir {outs[0]}) > /dev/null"
|
||||
+ "' $[dirname(filenameof(outs[0]))] > /dev/null"
|
||||
],
|
||||
label="CORPUSTEST",
|
||||
)
|
||||
@@ -320,6 +109,13 @@ export(
|
||||
"brother240tool$(EXT)": "tools+brother240tool",
|
||||
"upgrade-flux-file$(EXT)": "tools+upgrade-flux-file",
|
||||
}
|
||||
| ({"FluxEngine.pkg": "src/gui+fluxengine_pkg"} if config.osx else {}),
|
||||
| (
|
||||
{
|
||||
"FluxEngine.pkg": "src/gui+fluxengine_pkg",
|
||||
"FluxEngine.app.zip": "src/gui+fluxengine_app_zip",
|
||||
}
|
||||
if config.osx
|
||||
else {}
|
||||
),
|
||||
deps=["tests", "src/formats+docs", "scripts+mkdocindex"] + corpustests,
|
||||
)
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
import sys
|
||||
|
||||
(_, current, max) = sys.argv
|
||||
percent = int(100 * float(current) / float(max))
|
||||
print(f"[{percent:>3}%]")
|
||||
49
build/_sandbox.py
Normal file
49
build/_sandbox.py
Normal file
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
from os.path import *
|
||||
import argparse
|
||||
import os
|
||||
import shutil
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("-s", "--sandbox")
|
||||
parser.add_argument("-v", "--verbose", action="store_true")
|
||||
parser.add_argument("-l", "--link", action="store_true")
|
||||
parser.add_argument("-e", "--export", action="store_true")
|
||||
parser.add_argument("files", nargs="*")
|
||||
args = parser.parse_args()
|
||||
|
||||
assert args.sandbox, "You must specify a sandbox directory"
|
||||
assert args.link ^ args.export, "You can't link and export at the same time"
|
||||
|
||||
if args.link:
|
||||
os.makedirs(args.sandbox, exist_ok=True)
|
||||
for f in args.files:
|
||||
sf = join(args.sandbox, f)
|
||||
if args.verbose:
|
||||
print("link", sf)
|
||||
os.makedirs(dirname(sf), exist_ok=True)
|
||||
try:
|
||||
os.symlink(abspath(f), sf)
|
||||
except PermissionError:
|
||||
shutil.copy(f, sf)
|
||||
|
||||
if args.export:
|
||||
for f in args.files:
|
||||
sf = join(args.sandbox, f)
|
||||
if args.verbose:
|
||||
print("export", sf)
|
||||
df = dirname(f)
|
||||
if df:
|
||||
os.makedirs(df, exist_ok=True)
|
||||
|
||||
try:
|
||||
os.remove(f)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
os.rename(sf, f)
|
||||
|
||||
|
||||
main()
|
||||
25
build/_zip.py
Executable file
25
build/_zip.py
Executable file
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
from os.path import *
|
||||
import argparse
|
||||
import os
|
||||
from zipfile import ZipFile
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("-z", "--zipfile")
|
||||
parser.add_argument("-v", "--verbose", action="store_true")
|
||||
parser.add_argument("-f", "--file", nargs=2, action="append")
|
||||
args = parser.parse_args()
|
||||
|
||||
assert args.zipfile, "You must specify a zipfile to create"
|
||||
|
||||
with ZipFile(args.zipfile, mode="w") as zf:
|
||||
for zipname, filename in args.file:
|
||||
if args.verbose:
|
||||
print(filename, "->", zipname)
|
||||
zf.write(filename, arcname=zipname)
|
||||
|
||||
|
||||
main()
|
||||
99
build/ab.mk
99
build/ab.mk
@@ -1,17 +1,31 @@
|
||||
ifeq ($(findstring 4.,$(MAKE_VERSION)),)
|
||||
MAKENOT4 := $(if $(findstring 3.9999, $(lastword $(sort 3.9999 $(MAKE_VERSION)))),yes,no)
|
||||
|
||||
ifeq ($(MAKENOT4),yes)
|
||||
$(error You need GNU Make 4.x for this (if you're on OSX, use gmake).)
|
||||
endif
|
||||
|
||||
OBJ ?= .obj
|
||||
PYTHON ?= python3
|
||||
CC ?= gcc
|
||||
CXX ?= g++
|
||||
AR ?= ar
|
||||
CFLAGS ?= -g -Og
|
||||
LDFLAGS ?= -g
|
||||
PKG_CONFIG ?= pkg-config
|
||||
HOST_PKG_CONFIG ?= $(PKG_CONFIG)
|
||||
ECHO ?= echo
|
||||
TARGETS ?= +all
|
||||
CP ?= cp
|
||||
|
||||
HOSTCC ?= gcc
|
||||
HOSTCXX ?= g++
|
||||
HOSTAR ?= ar
|
||||
HOSTCFLAGS ?= -g -Og
|
||||
HOSTCXXFLAGS ?= $(HOSTCFLAGS)
|
||||
HOSTLDFLAGS ?= -g
|
||||
|
||||
CC ?= $(HOSTCC)
|
||||
CXX ?= $(HOSTCXX)
|
||||
AR ?= $(HOSTAR)
|
||||
CFLAGS ?= $(HOSTCFLAGS)
|
||||
CXXFLAGS ?= $(CFLAGS)
|
||||
LDFLAGS ?= $(HOSTLDFLAGS)
|
||||
|
||||
NINJA ?= ninja
|
||||
|
||||
ifdef VERBOSE
|
||||
hide =
|
||||
@@ -23,21 +37,60 @@ else
|
||||
endif
|
||||
endif
|
||||
|
||||
# If enabled, shows a nice display of how far through the build you are. This
|
||||
# doubles Make startup time. Also, on Make 4.3 and above, rebuilds don't show
|
||||
# correct progress information.
|
||||
AB_ENABLE_PROGRESS_INFO ?= true
|
||||
|
||||
WINDOWS := no
|
||||
OSX := no
|
||||
LINUX := no
|
||||
ifeq ($(OS),Windows_NT)
|
||||
WINDOWS := yes
|
||||
else
|
||||
UNAME_S := $(shell uname -s)
|
||||
ifeq ($(UNAME_S),Linux)
|
||||
LINUX := yes
|
||||
endif
|
||||
ifeq ($(UNAME_S),Darwin)
|
||||
OSX := yes
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OS), Windows_NT)
|
||||
EXT ?= .exe
|
||||
endif
|
||||
EXT ?=
|
||||
|
||||
ifeq ($(PROGRESSINFO),)
|
||||
rulecount := $(shell $(MAKE) --no-print-directory -q $(OBJ)/build.mk PROGRESSINFO=1 && $(MAKE) -n $(MAKECMDGOALS) PROGRESSINFO=XXXPROGRESSINFOXXX | grep XXXPROGRESSINFOXXX | wc -l)
|
||||
ruleindex := 1
|
||||
PROGRESSINFO = "$(shell $(PYTHON) build/_progress.py $(ruleindex) $(rulecount))$(eval ruleindex := $(shell expr $(ruleindex) + 1))"
|
||||
endif
|
||||
CWD=$(shell pwd)
|
||||
|
||||
include $(OBJ)/build.mk
|
||||
define newline
|
||||
|
||||
MAKEFLAGS += -r -j$(shell nproc)
|
||||
.DELETE_ON_ERROR:
|
||||
|
||||
endef
|
||||
|
||||
define check_for_command
|
||||
$(shell command -v $1 >/dev/null || (echo "Required command '$1' missing" >/dev/stderr && kill $$PPID))
|
||||
endef
|
||||
|
||||
$(call check_for_command,ninja)
|
||||
$(call check_for_command,cmp)
|
||||
$(call check_for_command,$(PYTHON))
|
||||
|
||||
pkg-config-hash = $(shell ($(PKG_CONFIG) --list-all && $(HOST_PKG_CONFIG) --list-all) | md5sum)
|
||||
build-files = $(shell find . -name .obj -prune -o \( -name 'build.py' -a -type f \) -print) $(wildcard build/*.py) $(wildcard config.py)
|
||||
build-file-timestamps = $(shell ls -l $(build-files) | md5sum)
|
||||
|
||||
# Wipe the build file (forcing a regeneration) if the make environment is different.
|
||||
# (Conveniently, this includes the pkg-config hash calculated above.)
|
||||
|
||||
ignored-variables = MAKE_RESTARTS .VARIABLES MAKECMDGOALS MAKEFLAGS MFLAGS
|
||||
$(shell mkdir -p $(OBJ))
|
||||
$(file >$(OBJ)/newvars.txt,$(foreach v,$(filter-out $(ignored-variables),$(.VARIABLES)),$(v)=$($(v))$(newline)))
|
||||
$(shell touch $(OBJ)/vars.txt)
|
||||
#$(shell diff -u $(OBJ)/vars.txt $(OBJ)/newvars.txt > /dev/stderr)
|
||||
$(shell cmp -s $(OBJ)/newvars.txt $(OBJ)/vars.txt || (rm -f $(OBJ)/build.ninja && echo "Environment changed --- regenerating" > /dev/stderr))
|
||||
$(shell mv $(OBJ)/newvars.txt $(OBJ)/vars.txt)
|
||||
|
||||
.PHONY: update-ab
|
||||
update-ab:
|
||||
@@ -52,9 +105,15 @@ clean::
|
||||
$(hide) rm -rf $(OBJ)
|
||||
|
||||
export PYTHONHASHSEED = 1
|
||||
build-files = $(shell find . -name 'build.py') $(wildcard build/*.py) $(wildcard config.py)
|
||||
$(OBJ)/build.mk: Makefile $(build-files) build/ab.mk
|
||||
$(OBJ)/build.ninja $(OBJ)/build.targets &:
|
||||
@echo "AB"
|
||||
@mkdir -p $(OBJ)
|
||||
$(hide) $(PYTHON) -X pycache_prefix=$(OBJ)/__pycache__ build/ab.py -o $@ build.py \
|
||||
|| rm -f $@
|
||||
$(hide) $(PYTHON) -X pycache_prefix=$(OBJ)/__pycache__ build/ab.py \
|
||||
-o $(OBJ) build.py \
|
||||
-v $(OBJ)/vars.txt \
|
||||
|| (rm -f $@ && false)
|
||||
|
||||
include $(OBJ)/build.targets
|
||||
.PHONY: $(ninja-targets)
|
||||
.NOTPARALLEL:
|
||||
$(ninja-targets): $(OBJ)/build.ninja
|
||||
+$(hide) $(NINJA) -f $(OBJ)/build.ninja $@
|
||||
|
||||
2
build/ab.ninja
Normal file
2
build/ab.ninja
Normal file
@@ -0,0 +1,2 @@
|
||||
rule rule
|
||||
command = $command
|
||||
312
build/ab.py
312
build/ab.py
@@ -1,38 +1,66 @@
|
||||
from collections import namedtuple
|
||||
from copy import copy
|
||||
from importlib.machinery import SourceFileLoader, PathFinder, ModuleSpec
|
||||
from os.path import *
|
||||
from pathlib import Path
|
||||
from typing import Iterable
|
||||
import argparse
|
||||
import ast
|
||||
import builtins
|
||||
from copy import copy
|
||||
import functools
|
||||
import hashlib
|
||||
import importlib
|
||||
import importlib.abc
|
||||
import importlib.util
|
||||
from importlib.machinery import (
|
||||
SourceFileLoader,
|
||||
PathFinder,
|
||||
ModuleSpec,
|
||||
)
|
||||
import inspect
|
||||
import os
|
||||
import re
|
||||
import string
|
||||
import sys
|
||||
import hashlib
|
||||
import types
|
||||
|
||||
VERBOSE_NINJA_FILE = False
|
||||
|
||||
verbose = False
|
||||
quiet = False
|
||||
cwdStack = [""]
|
||||
targets = {}
|
||||
unmaterialisedTargets = {} # dict, not set, to get consistent ordering
|
||||
materialisingStack = []
|
||||
defaultGlobals = {}
|
||||
outputTargets = set()
|
||||
|
||||
RE_FORMAT_SPEC = re.compile(
|
||||
r"(?:(?P<fill>[\s\S])?(?P<align>[<>=^]))?"
|
||||
r"(?P<sign>[- +])?"
|
||||
r"(?P<pos_zero>z)?"
|
||||
r"(?P<alt>#)?"
|
||||
r"(?P<zero_padding>0)?"
|
||||
r"(?P<width_str>\d+)?"
|
||||
r"(?P<grouping>[_,])?"
|
||||
r"(?:(?P<decimal>\.)(?P<precision_str>\d+))?"
|
||||
r"(?P<type>[bcdeEfFgGnosxX%])?"
|
||||
)
|
||||
|
||||
CommandFormatSpec = namedtuple(
|
||||
"CommandFormatSpec", RE_FORMAT_SPEC.groupindex.keys()
|
||||
)
|
||||
|
||||
sys.path += ["."]
|
||||
old_import = builtins.__import__
|
||||
|
||||
|
||||
class Environment(types.SimpleNamespace):
|
||||
def setdefault(self, name, value):
|
||||
if not hasattr(self, name):
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
G = Environment()
|
||||
|
||||
|
||||
class PathFinderImpl(PathFinder):
|
||||
def find_spec(self, fullname, path, target=None):
|
||||
if not path:
|
||||
# The second test here is needed for Python 3.9.
|
||||
if not path or not path[0]:
|
||||
path = ["."]
|
||||
if len(path) != 1:
|
||||
return None
|
||||
@@ -79,6 +107,90 @@ def error(message):
|
||||
raise ABException(message)
|
||||
|
||||
|
||||
def _undo_escaped_dollar(s, op):
|
||||
return s.replace(f"$${op}", f"${op}")
|
||||
|
||||
|
||||
class BracketedFormatter(string.Formatter):
|
||||
def parse(self, format_string):
|
||||
while format_string:
|
||||
m = re.search(f"(?:[^$]|^)()\\$\\[()", format_string)
|
||||
if not m:
|
||||
yield (
|
||||
_undo_escaped_dollar(format_string, "["),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
)
|
||||
break
|
||||
left = format_string[: m.start(1)]
|
||||
right = format_string[m.end(2) :]
|
||||
|
||||
offset = len(right) + 1
|
||||
try:
|
||||
ast.parse(right)
|
||||
except SyntaxError as e:
|
||||
if not str(e).startswith(f"unmatched ']'"):
|
||||
raise e
|
||||
offset = e.offset
|
||||
|
||||
expr = right[0 : offset - 1]
|
||||
format_string = right[offset:]
|
||||
|
||||
yield (
|
||||
_undo_escaped_dollar(left, "[") if left else None,
|
||||
expr,
|
||||
None,
|
||||
None,
|
||||
)
|
||||
|
||||
|
||||
class GlobalFormatter(string.Formatter):
|
||||
def parse(self, format_string):
|
||||
while format_string:
|
||||
m = re.search(f"(?:[^$]|^)()\\$\\(([^)]*)\\)()", format_string)
|
||||
if not m:
|
||||
yield (
|
||||
format_string,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
)
|
||||
break
|
||||
left = format_string[: m.start(1)]
|
||||
var = m[2]
|
||||
format_string = format_string[m.end(3) :]
|
||||
|
||||
yield (
|
||||
left if left else None,
|
||||
var,
|
||||
None,
|
||||
None,
|
||||
)
|
||||
|
||||
def get_field(self, name, a1, a2):
|
||||
return (
|
||||
getattr(G, name),
|
||||
False,
|
||||
)
|
||||
|
||||
def format_field(self, value, format_spec):
|
||||
if not value:
|
||||
return ""
|
||||
return str(value)
|
||||
|
||||
|
||||
globalFormatter = GlobalFormatter()
|
||||
|
||||
|
||||
def substituteGlobalVariables(value):
|
||||
while True:
|
||||
oldValue = value
|
||||
value = globalFormatter.format(value)
|
||||
if value == oldValue:
|
||||
return _undo_escaped_dollar(value, "(")
|
||||
|
||||
|
||||
def Rule(func):
|
||||
sig = inspect.signature(func)
|
||||
|
||||
@@ -114,7 +226,8 @@ def Rule(func):
|
||||
t.callback = func
|
||||
t.traits.add(func.__name__)
|
||||
if "args" in kwargs:
|
||||
t.args |= kwargs["args"]
|
||||
t.explicit_args = kwargs["args"]
|
||||
t.args.update(t.explicit_args)
|
||||
del kwargs["args"]
|
||||
if "traits" in kwargs:
|
||||
t.traits |= kwargs["traits"]
|
||||
@@ -140,14 +253,13 @@ def _isiterable(xs):
|
||||
|
||||
class Target:
|
||||
def __init__(self, cwd, name):
|
||||
if verbose:
|
||||
print("rule('%s', cwd='%s'" % (name, cwd))
|
||||
self.name = name
|
||||
self.localname = self.name.rsplit("+")[-1]
|
||||
self.traits = set()
|
||||
self.dir = join("$(OBJ)", name)
|
||||
self.dir = join(G.OBJ, name)
|
||||
self.ins = []
|
||||
self.outs = []
|
||||
self.deps = []
|
||||
self.materialised = False
|
||||
self.args = {}
|
||||
|
||||
@@ -164,7 +276,7 @@ class Target:
|
||||
return f"Target('{self.name}')"
|
||||
|
||||
def templateexpand(selfi, s):
|
||||
class Formatter(string.Formatter):
|
||||
class Formatter(BracketedFormatter):
|
||||
def get_field(self, name, a1, a2):
|
||||
return (
|
||||
eval(name, selfi.callback.__globals__, selfi.args),
|
||||
@@ -184,7 +296,8 @@ class Target:
|
||||
[selfi.templateexpand(f) for f in filenamesof(value)]
|
||||
)
|
||||
|
||||
return Formatter().format(s)
|
||||
s = Formatter().format(s)
|
||||
return substituteGlobalVariables(s)
|
||||
|
||||
def materialise(self, replacing=False):
|
||||
if self not in unmaterialisedTargets:
|
||||
@@ -293,10 +406,10 @@ def targetof(value, cwd=None):
|
||||
elif value.startswith("./"):
|
||||
value = normpath(join(cwd, value))
|
||||
# Explicit directories are always raw files.
|
||||
elif value.endswith("/"):
|
||||
if value.endswith("/"):
|
||||
return _filetarget(value, cwd)
|
||||
# Anything starting with a variable expansion is always a raw file.
|
||||
elif value.startswith("$"):
|
||||
# Anything in .obj is a raw file.
|
||||
elif value.startswith(outputdir) or value.startswith(G.OBJ):
|
||||
return _filetarget(value, cwd)
|
||||
|
||||
# If this is not a rule lookup...
|
||||
@@ -353,9 +466,26 @@ class TargetsMap:
|
||||
return output
|
||||
|
||||
|
||||
def _removesuffix(self, suffix):
|
||||
# suffix='' should not call self[:-0].
|
||||
if suffix and self.endswith(suffix):
|
||||
return self[: -len(suffix)]
|
||||
else:
|
||||
return self[:]
|
||||
|
||||
|
||||
def loadbuildfile(filename):
|
||||
filename = filename.replace("/", ".").removesuffix(".py")
|
||||
builtins.__import__(filename)
|
||||
modulename = _removesuffix(filename.replace("/", "."), ".py")
|
||||
if modulename not in sys.modules:
|
||||
spec = importlib.util.spec_from_file_location(
|
||||
name=modulename,
|
||||
location=filename,
|
||||
loader=BuildFileLoaderImpl(fullname=modulename, path=filename),
|
||||
submodule_search_locations=[],
|
||||
)
|
||||
module = importlib.util.module_from_spec(spec)
|
||||
sys.modules[modulename] = module
|
||||
spec.loader.exec_module(module)
|
||||
|
||||
|
||||
def flatten(items):
|
||||
@@ -381,6 +511,7 @@ def filenamesof(items):
|
||||
def generate(xs):
|
||||
for x in xs:
|
||||
if isinstance(x, Target):
|
||||
x.materialise()
|
||||
yield from generate(x.outs)
|
||||
else:
|
||||
yield x
|
||||
@@ -401,44 +532,71 @@ def emit(*args, into=None):
|
||||
if into is not None:
|
||||
into += [s]
|
||||
else:
|
||||
outputFp.write(s)
|
||||
ninjaFp.write(s)
|
||||
|
||||
|
||||
def emit_rule(name, ins, outs, cmds=[], label=None):
|
||||
fins = filenamesof(ins)
|
||||
fouts = filenamesof(outs)
|
||||
nonobjs = [f for f in fouts if not f.startswith("$(OBJ)")]
|
||||
def shell(*args):
|
||||
s = "".join(args) + "\n"
|
||||
shellFp.write(s)
|
||||
|
||||
|
||||
def emit_rule(self, ins, outs, cmds=[], label=None):
|
||||
name = self.name
|
||||
fins = [self.templateexpand(f) for f in set(filenamesof(ins))]
|
||||
fouts = [self.templateexpand(f) for f in filenamesof(outs)]
|
||||
|
||||
global outputTargets
|
||||
outputTargets.update(fouts)
|
||||
outputTargets.add(name)
|
||||
|
||||
emit("")
|
||||
if VERBOSE_NINJA_FILE:
|
||||
for k, v in self.args.items():
|
||||
emit(f"# {k} = {v}")
|
||||
|
||||
lines = []
|
||||
if nonobjs:
|
||||
emit("clean::", into=lines)
|
||||
emit("\t$(hide) rm -f", *nonobjs, into=lines)
|
||||
|
||||
emit(".PHONY:", name, into=lines)
|
||||
if outs:
|
||||
emit(name, ":", *fouts, into=lines)
|
||||
emit(*fouts, "&:" if len(fouts) > 1 else ":", *fins, "\x01", into=lines)
|
||||
os.makedirs(self.dir, exist_ok=True)
|
||||
rule = []
|
||||
|
||||
if label:
|
||||
emit("\t$(hide)", "$(ECHO) $(PROGRESSINFO) ", label, into=lines)
|
||||
sandbox = join(self.dir, "sandbox")
|
||||
emit(f"rm -rf {sandbox}", into=rule)
|
||||
emit(
|
||||
f"{G.PYTHON} build/_sandbox.py --link -s", sandbox, *fins, into=rule
|
||||
)
|
||||
for c in cmds:
|
||||
emit("\t$(hide)", c, into=lines)
|
||||
emit(f"(cd {sandbox} &&", c, ")", into=rule)
|
||||
emit(
|
||||
f"{G.PYTHON} build/_sandbox.py --export -s",
|
||||
sandbox,
|
||||
*fouts,
|
||||
into=rule,
|
||||
)
|
||||
|
||||
ruletext = "".join(rule)
|
||||
if len(ruletext) > 7000:
|
||||
rulehash = hashlib.sha1(ruletext.encode()).hexdigest()
|
||||
|
||||
rulef = join(self.dir, f"rule-{rulehash}.sh")
|
||||
with open(rulef, "wt") as fp:
|
||||
fp.write("set -e\n")
|
||||
fp.write(ruletext)
|
||||
|
||||
emit("build", *fouts, ":rule", *fins, rulef)
|
||||
emit(" command=sh", rulef)
|
||||
else:
|
||||
emit("build", *fouts, ":rule", *fins)
|
||||
emit(
|
||||
" command=",
|
||||
"&&".join([s.strip() for s in rule]).replace("$", "$$"),
|
||||
)
|
||||
if label:
|
||||
emit(" description=", label)
|
||||
emit("build", name, ":phony", *fouts)
|
||||
|
||||
else:
|
||||
assert len(cmds) == 0, "rules with no outputs cannot have commands"
|
||||
emit(name, ":", *fins, into=lines)
|
||||
emit("build", name, ":phony", *fins)
|
||||
|
||||
cmd = "".join(lines)
|
||||
hash = hashlib.sha1(bytes(cmd, "utf-8")).hexdigest()
|
||||
|
||||
outputFp.write(cmd.replace("\x01", f"$(OBJ)/.hashes/{hash}"))
|
||||
|
||||
if outs:
|
||||
emit(f"$(OBJ)/.hashes/{hash}:")
|
||||
emit(
|
||||
f"\t$(hide) mkdir -p $(OBJ)/.hashes && touch $(OBJ)/.hashes/{hash}"
|
||||
)
|
||||
emit("")
|
||||
|
||||
|
||||
@@ -469,10 +627,10 @@ def simplerule(
|
||||
cs += [self.templateexpand(c)]
|
||||
|
||||
emit_rule(
|
||||
name=self.name,
|
||||
self=self,
|
||||
ins=ins + deps,
|
||||
outs=outs,
|
||||
label=self.templateexpand("{label} {name}"),
|
||||
label=self.templateexpand("$[label] $[name]") if label else None,
|
||||
cmds=cs,
|
||||
)
|
||||
|
||||
@@ -485,48 +643,65 @@ def export(self, name=None, items: TargetsMap = {}, deps: Targets = []):
|
||||
dest = self.targetof(dest)
|
||||
outs += [dest]
|
||||
|
||||
destf = filenameof(dest)
|
||||
destf = self.templateexpand(filenameof(dest))
|
||||
outputTargets.update([destf])
|
||||
|
||||
srcs = filenamesof([src])
|
||||
assert (
|
||||
len(srcs) == 1
|
||||
), "a dependency of an exported file must have exactly one output file"
|
||||
srcf = self.templateexpand(srcs[0])
|
||||
|
||||
subrule = simplerule(
|
||||
name=f"{self.localname}/{destf}",
|
||||
cwd=self.cwd,
|
||||
ins=[srcs[0]],
|
||||
outs=[destf],
|
||||
commands=["cp %s %s" % (srcs[0], destf)],
|
||||
label="CP",
|
||||
commands=["$(CP) -H %s %s" % (srcf, destf)],
|
||||
label="EXPORT",
|
||||
)
|
||||
subrule.materialise()
|
||||
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=outs + deps,
|
||||
outs=["=sentinel"],
|
||||
commands=["touch {outs[0]}"],
|
||||
label="EXPORT",
|
||||
self.ins = []
|
||||
self.outs = deps + outs
|
||||
outputTargets.add(name)
|
||||
|
||||
emit("")
|
||||
emit(
|
||||
"build",
|
||||
name,
|
||||
":phony",
|
||||
*[self.templateexpand(f) for f in filenamesof(outs + deps)],
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("-v", "--verbose", action="store_true")
|
||||
parser.add_argument("-q", "--quiet", action="store_true")
|
||||
parser.add_argument("-o", "--output")
|
||||
parser.add_argument("-v", "--varfile")
|
||||
parser.add_argument("-o", "--outputdir")
|
||||
parser.add_argument("-D", "--define", action="append", default=[])
|
||||
parser.add_argument("files", nargs="+")
|
||||
args = parser.parse_args()
|
||||
|
||||
global verbose
|
||||
verbose = args.verbose
|
||||
|
||||
global quiet
|
||||
quiet = args.quiet
|
||||
|
||||
global outputFp
|
||||
outputFp = open(args.output, "wt")
|
||||
vardefs = args.define
|
||||
if args.varfile:
|
||||
with open(args.varfile, "rt") as fp:
|
||||
vardefs = vardefs + list(fp)
|
||||
|
||||
for line in vardefs:
|
||||
if "=" in line:
|
||||
name, value = line.split("=", 1)
|
||||
G.setdefault(name.strip(), value.strip())
|
||||
|
||||
global ninjaFp, shellFp, outputdir
|
||||
outputdir = args.outputdir
|
||||
G.setdefault("OBJ", outputdir)
|
||||
ninjaFp = open(outputdir + "/build.ninja", "wt")
|
||||
ninjaFp.write(f"include build/ab.ninja\n")
|
||||
|
||||
for k in ["Rule"]:
|
||||
defaultGlobals[k] = globals()[k]
|
||||
@@ -541,7 +716,10 @@ def main():
|
||||
while unmaterialisedTargets:
|
||||
t = next(iter(unmaterialisedTargets))
|
||||
t.materialise()
|
||||
emit("AB_LOADED = 1\n")
|
||||
|
||||
with open(outputdir + "/build.targets", "wt") as fp:
|
||||
fp.write("ninja-targets =")
|
||||
fp.write(substituteGlobalVariables(" ".join(outputTargets)))
|
||||
|
||||
|
||||
main()
|
||||
|
||||
535
build/c.py
535
build/c.py
@@ -6,45 +6,113 @@ from build.ab import (
|
||||
filenamesof,
|
||||
flatten,
|
||||
simplerule,
|
||||
emit,
|
||||
G,
|
||||
)
|
||||
from build.utils import (
|
||||
filenamesmatchingof,
|
||||
stripext,
|
||||
targetswithtraitsof,
|
||||
collectattrs,
|
||||
)
|
||||
from build.utils import stripext, collectattrs
|
||||
from build.toolchain import Toolchain, HostToolchain
|
||||
from os.path import *
|
||||
|
||||
if G.OSX != "yes":
|
||||
G.STARTGROUP = "-Wl,--start-group"
|
||||
G.ENDGROUP = "-Wl,--end-group"
|
||||
else:
|
||||
G.STARTGROUP = ""
|
||||
G.ENDGROUP = ""
|
||||
|
||||
class Toolchain:
|
||||
label = ""
|
||||
cfile = ["$(CC) -c -o {outs[0]} {ins[0]} $(CFLAGS) {cflags}"]
|
||||
cxxfile = ["$(CXX) -c -o {outs[0]} {ins[0]} $(CFLAGS) {cflags}"]
|
||||
clibrary = ["$(AR) cqs {outs[0]} {ins}"]
|
||||
cxxlibrary = ["$(AR) cqs {outs[0]} {ins}"]
|
||||
cprogram = ["$(CC) -o {outs[0]} {ins} {ldflags} $(LDFLAGS)"]
|
||||
cxxprogram = ["$(CXX) -o {outs[0]} {ins} {ldflags} $(LDFLAGS)"]
|
||||
Toolchain.CC = ["$(CC) -c -o $[outs[0]] $[ins[0]] $(CFLAGS) $[cflags]"]
|
||||
Toolchain.CPP = ["$(CC) -E -P -o $[outs] $[cflags] -x c $[ins]"]
|
||||
Toolchain.CXX = ["$(CXX) -c -o $[outs[0]] $[ins[0]] $(CXXFLAGS) $[cflags]"]
|
||||
Toolchain.AR = ["$(AR) cqs $[outs[0]] $[ins]"]
|
||||
Toolchain.ARXX = ["$(AR) cqs $[outs[0]] $[ins]"]
|
||||
Toolchain.CLINK = [
|
||||
"$(CC) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(LDFLAGS) $(ENDGROUP)"
|
||||
]
|
||||
Toolchain.CXXLINK = [
|
||||
"$(CXX) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(LDFLAGS) $(ENDGROUP)"
|
||||
]
|
||||
|
||||
Toolchain.is_source_file = (
|
||||
lambda f: f.endswith(".c")
|
||||
or f.endswith(".cc")
|
||||
or f.endswith(".cpp")
|
||||
or f.endswith(".S")
|
||||
or f.endswith(".s")
|
||||
or f.endswith(".m")
|
||||
or f.endswith(".mm")
|
||||
)
|
||||
|
||||
|
||||
class HostToolchain:
|
||||
label = "HOST "
|
||||
cfile = ["$(HOSTCC) -c -o {outs[0]} {ins[0]} $(HOSTCFLAGS) {cflags}"]
|
||||
cxxfile = ["$(HOSTCXX) -c -o {outs[0]} {ins[0]} $(HOSTCFLAGS) {cflags}"]
|
||||
clibrary = ["$(HOSTAR) cqs {outs[0]} {ins}"]
|
||||
cxxlibrary = ["$(HOSTAR) cqs {outs[0]} {ins}"]
|
||||
cprogram = ["$(HOSTCC) -o {outs[0]} {ins} {ldflags} $(HOSTLDFLAGS)"]
|
||||
cxxprogram = ["$(HOSTCXX) -o {outs[0]} {ins} {ldflags} $(HOSTLDFLAGS)"]
|
||||
# Given a set of dependencies, finds the set of relevant library targets (i.e.
|
||||
# contributes *.a files) for compiling C programs. The actual list of libraries
|
||||
# is in dep.clibrary_files.
|
||||
def _toolchain_find_library_targets(deps):
|
||||
lib_deps = []
|
||||
for d in deps:
|
||||
lib_deps = _combine(lib_deps, d.args.get("clibrary_deps", []))
|
||||
return lib_deps
|
||||
|
||||
|
||||
def cfileimpl(self, name, srcs, deps, suffix, commands, label, kind, cflags):
|
||||
Toolchain.find_c_library_targets = _toolchain_find_library_targets
|
||||
|
||||
|
||||
# Given a set of dependencies, finds the set of relevant header targets (i.e.
|
||||
# contributes *.h files) for compiling C programs. The actual list of libraries
|
||||
# is in dep.cheader_files.
|
||||
def _toolchain_find_header_targets(deps, initial=[]):
|
||||
hdr_deps = initial
|
||||
for d in deps:
|
||||
hdr_deps = _combine(hdr_deps, d.args.get("cheader_deps", []))
|
||||
return hdr_deps
|
||||
|
||||
|
||||
Toolchain.find_c_header_targets = _toolchain_find_header_targets
|
||||
|
||||
|
||||
HostToolchain.CC = ["$(HOSTCC) -c -o $[outs[0]] $[ins[0]] $(HOSTCFLAGS) $[cflags]"]
|
||||
HostToolchain.CPP = ["$(HOSTCC) -E -P -o $[outs] $[cflags] -x c $[ins]"]
|
||||
HostToolchain.CXX = ["$(HOSTCXX) -c -o $[outs[0]] $[ins[0]] $(HOSTCFLAGS) $[cflags]"]
|
||||
HostToolchain.AR = ["$(HOSTAR) cqs $[outs[0]] $[ins]"]
|
||||
HostToolchain.ARXX = ["$(HOSTAR) cqs $[outs[0]] $[ins]"]
|
||||
HostToolchain.CLINK = [
|
||||
"$(HOSTCC) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(HOSTLDFLAGS) $(ENDGROUP)"
|
||||
]
|
||||
HostToolchain.CXXLINK = [
|
||||
"$(HOSTCXX) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(HOSTLDFLAGS) $(ENDGROUP)"
|
||||
]
|
||||
|
||||
|
||||
def _combine(list1, list2):
|
||||
r = list(list1)
|
||||
for i in list2:
|
||||
if i not in r:
|
||||
r.append(i)
|
||||
return r
|
||||
|
||||
|
||||
def _indirect(deps, name):
|
||||
r = []
|
||||
for d in deps:
|
||||
r = _combine(r, d.args.get(name, [d]))
|
||||
return r
|
||||
|
||||
|
||||
def cfileimpl(self, name, srcs, deps, suffix, commands, label, toolchain, cflags):
|
||||
outleaf = "=" + stripext(basename(filenameof(srcs[0]))) + suffix
|
||||
|
||||
cflags = collectattrs(targets=deps, name="caller_cflags", initial=cflags)
|
||||
hdr_deps = toolchain.find_c_header_targets(deps)
|
||||
other_deps = [
|
||||
d
|
||||
for d in deps
|
||||
if ("cheader_deps" not in d.args) and ("clibrary_deps" not in d.args)
|
||||
]
|
||||
hdr_files = collectattrs(targets=hdr_deps, name="cheader_files")
|
||||
cflags = collectattrs(targets=hdr_deps, name="caller_cflags", initial=cflags)
|
||||
|
||||
t = simplerule(
|
||||
replaces=self,
|
||||
ins=srcs,
|
||||
deps=deps,
|
||||
deps=other_deps + hdr_files,
|
||||
outs=[outleaf],
|
||||
label=label,
|
||||
commands=commands,
|
||||
@@ -61,14 +129,19 @@ def cfile(
|
||||
cflags=[],
|
||||
suffix=".o",
|
||||
toolchain=Toolchain,
|
||||
commands=None,
|
||||
label=None,
|
||||
label="CC",
|
||||
):
|
||||
if not label:
|
||||
label = toolchain.label + "CC"
|
||||
if not commands:
|
||||
commands = toolchain.cfile
|
||||
cfileimpl(self, name, srcs, deps, suffix, commands, label, "cfile", cflags)
|
||||
cfileimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
suffix,
|
||||
toolchain.CC,
|
||||
toolchain.PREFIX + label,
|
||||
toolchain,
|
||||
cflags,
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
@@ -80,40 +153,48 @@ def cxxfile(
|
||||
cflags=[],
|
||||
suffix=".o",
|
||||
toolchain=Toolchain,
|
||||
commands=None,
|
||||
label=None,
|
||||
label="CXX",
|
||||
):
|
||||
if not label:
|
||||
label = toolchain.label + "CXX"
|
||||
if not commands:
|
||||
commands = toolchain.cxxfile
|
||||
cfileimpl(
|
||||
self, name, srcs, deps, suffix, commands, label, "cxxfile", cflags
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
suffix,
|
||||
toolchain.CXX,
|
||||
toolchain.PREFIX + label,
|
||||
toolchain,
|
||||
cflags,
|
||||
)
|
||||
|
||||
|
||||
def findsources(name, srcs, deps, cflags, toolchain, filerule, cwd):
|
||||
headers = filenamesmatchingof(srcs, "*.h")
|
||||
cflags = cflags + ["-I" + dirname(h) for h in headers]
|
||||
deps = deps + headers
|
||||
def _removeprefix(self, prefix):
|
||||
if self.startswith(prefix):
|
||||
return self[len(prefix) :]
|
||||
else:
|
||||
return self[:]
|
||||
|
||||
|
||||
def findsources(self, srcs, deps, cflags, filerule, toolchain, cwd):
|
||||
for f in filenamesof(srcs):
|
||||
if not toolchain.is_source_file(f):
|
||||
cflags = cflags + [f"-I{dirname(f)}"]
|
||||
deps = deps + [f]
|
||||
|
||||
objs = []
|
||||
for s in flatten(srcs):
|
||||
objs += [
|
||||
filerule(
|
||||
name=join(name, f.removeprefix("$(OBJ)/")),
|
||||
name=join(self.localname, _removeprefix(f, G.OBJ + "/")),
|
||||
srcs=[f],
|
||||
deps=deps,
|
||||
cflags=cflags,
|
||||
cflags=sorted(set(cflags)),
|
||||
toolchain=toolchain,
|
||||
cwd=cwd,
|
||||
args=getattr(self, "explicit_args", {}),
|
||||
)
|
||||
for f in filenamesof([s])
|
||||
if f.endswith(".c")
|
||||
or f.endswith(".cc")
|
||||
or f.endswith(".cpp")
|
||||
or f.endswith(".S")
|
||||
or f.endswith(".s")
|
||||
if toolchain.is_source_file(f)
|
||||
]
|
||||
if any(f.endswith(".o") for f in filenamesof([s])):
|
||||
objs += [s]
|
||||
@@ -121,39 +202,6 @@ def findsources(name, srcs, deps, cflags, toolchain, filerule, cwd):
|
||||
return objs
|
||||
|
||||
|
||||
@Rule
|
||||
def cheaders(
|
||||
self,
|
||||
name,
|
||||
hdrs: TargetsMap = None,
|
||||
caller_cflags=[],
|
||||
deps: Targets = None,
|
||||
):
|
||||
cs = []
|
||||
ins = list(hdrs.values())
|
||||
outs = []
|
||||
i = 0
|
||||
for dest, src in hdrs.items():
|
||||
s = filenamesof([src])
|
||||
assert (
|
||||
len(s) == 1
|
||||
), "the target of a header must return exactly one file"
|
||||
|
||||
cs += ["cp {ins[" + str(i) + "]} {outs[" + str(i) + "]}"]
|
||||
outs += ["=" + dest]
|
||||
i = i + 1
|
||||
|
||||
r = simplerule(
|
||||
replaces=self,
|
||||
ins=ins,
|
||||
outs=outs,
|
||||
commands=cs,
|
||||
deps=deps,
|
||||
label="CHEADERS",
|
||||
args={"caller_cflags": caller_cflags + ["-I" + self.dir]},
|
||||
)
|
||||
|
||||
|
||||
def libraryimpl(
|
||||
self,
|
||||
name,
|
||||
@@ -167,54 +215,69 @@ def libraryimpl(
|
||||
toolchain,
|
||||
commands,
|
||||
label,
|
||||
kind,
|
||||
filerule,
|
||||
):
|
||||
hdr_deps = toolchain.find_c_header_targets(deps) + [self]
|
||||
lib_deps = toolchain.find_c_library_targets(deps) + [self]
|
||||
|
||||
hr = None
|
||||
if hdrs and not srcs:
|
||||
cheaders(
|
||||
replaces=self,
|
||||
hdrs=hdrs,
|
||||
deps=targetswithtraitsof(deps, "cheaders"),
|
||||
caller_cflags=caller_cflags,
|
||||
)
|
||||
return
|
||||
hf = []
|
||||
ar = None
|
||||
if hdrs:
|
||||
hr = cheaders(
|
||||
name=self.localname + "_hdrs",
|
||||
hdrs=hdrs,
|
||||
deps=targetswithtraitsof(deps, "cheaders"),
|
||||
caller_cflags=caller_cflags,
|
||||
cs = []
|
||||
ins = hdrs.values()
|
||||
outs = []
|
||||
i = 0
|
||||
for dest, src in hdrs.items():
|
||||
s = filenamesof([src])
|
||||
assert len(s) == 1, "the target of a header must return exactly one file"
|
||||
|
||||
cs += [f"$(CP) $[ins[{i}]] $[outs[{i}]]"]
|
||||
outs += ["=" + dest]
|
||||
i = i + 1
|
||||
|
||||
hr = simplerule(
|
||||
name=f"{self.localname}_hdr",
|
||||
ins=ins,
|
||||
outs=outs,
|
||||
commands=cs,
|
||||
label=toolchain.PREFIX + "CHEADERS",
|
||||
)
|
||||
hr.materialise()
|
||||
deps = deps + [hr]
|
||||
hr.args["cheader_deps"] = [hr]
|
||||
hr.args["cheader_files"] = [hr]
|
||||
hf = [f"-I{hr.dir}"]
|
||||
|
||||
objs = findsources(
|
||||
self.localname,
|
||||
srcs,
|
||||
targetswithtraitsof(deps, "cheaders"),
|
||||
cflags,
|
||||
toolchain,
|
||||
kind,
|
||||
self.cwd,
|
||||
)
|
||||
if srcs:
|
||||
# Can't depend on the current target to get the library headers, because
|
||||
# if we do it'll cause a dependency loop.
|
||||
objs = findsources(
|
||||
self,
|
||||
srcs,
|
||||
deps + ([hr] if hr else []),
|
||||
cflags + hf,
|
||||
filerule,
|
||||
toolchain,
|
||||
self.cwd,
|
||||
)
|
||||
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=objs,
|
||||
outs=[f"={self.localname}.a"],
|
||||
label=label,
|
||||
commands=commands,
|
||||
args={
|
||||
"caller_cflags": collectattrs(
|
||||
targets=deps + ([hr] if hr else []), name="caller_cflags"
|
||||
),
|
||||
"caller_ldflags": collectattrs(
|
||||
targets=deps, name="caller_ldflags", initial=caller_ldflags
|
||||
),
|
||||
},
|
||||
traits={"cheaders"},
|
||||
)
|
||||
self.outs = self.outs + (hr.outs if hr else [])
|
||||
ar = simplerule(
|
||||
name=f"{self.localname}_lib",
|
||||
ins=objs,
|
||||
outs=[f"={self.localname}.a"],
|
||||
deps=deps,
|
||||
label=label,
|
||||
commands=commands,
|
||||
)
|
||||
ar.materialise()
|
||||
|
||||
self.outs = ([hr] if hr else []) + ([ar] if ar else [])
|
||||
self.deps = self.outs
|
||||
self.args["cheader_deps"] = hdr_deps
|
||||
self.args["clibrary_deps"] = lib_deps
|
||||
self.args["cheader_files"] = [hr] if hr else []
|
||||
self.args["clibrary_files"] = [ar] if ar else []
|
||||
self.args["caller_cflags"] = caller_cflags + hf
|
||||
self.args["caller_ldflags"] = caller_ldflags
|
||||
|
||||
|
||||
@Rule
|
||||
@@ -229,14 +292,9 @@ def clibrary(
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=Toolchain,
|
||||
commands=None,
|
||||
label=None,
|
||||
label="LIB",
|
||||
cfilerule=cfile,
|
||||
):
|
||||
if not label:
|
||||
label = toolchain.label + "LIB"
|
||||
if not commands:
|
||||
commands = toolchain.clibrary
|
||||
libraryimpl(
|
||||
self,
|
||||
name,
|
||||
@@ -248,8 +306,40 @@ def clibrary(
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
commands,
|
||||
label,
|
||||
toolchain.AR,
|
||||
toolchain.PREFIX + label,
|
||||
cfilerule,
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def hostclibrary(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
hdrs: TargetsMap = None,
|
||||
caller_cflags=[],
|
||||
caller_ldflags=[],
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=HostToolchain,
|
||||
label="LIB",
|
||||
cfilerule=cfile,
|
||||
):
|
||||
libraryimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
hdrs,
|
||||
caller_cflags,
|
||||
caller_ldflags,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
toolchain.AR,
|
||||
toolchain.PREFIX + label,
|
||||
cfilerule,
|
||||
)
|
||||
|
||||
@@ -266,13 +356,9 @@ def cxxlibrary(
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=Toolchain,
|
||||
commands=None,
|
||||
label=None,
|
||||
label="CXXLIB",
|
||||
cxxfilerule=cxxfile,
|
||||
):
|
||||
if not label:
|
||||
label = toolchain.label + "LIB"
|
||||
if not commands:
|
||||
commands = toolchain.clibrary
|
||||
libraryimpl(
|
||||
self,
|
||||
name,
|
||||
@@ -284,9 +370,41 @@ def cxxlibrary(
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
commands,
|
||||
label,
|
||||
cxxfile,
|
||||
toolchain.ARXX,
|
||||
toolchain.PREFIX + label,
|
||||
cxxfilerule,
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def hostcxxlibrary(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
hdrs: TargetsMap = None,
|
||||
caller_cflags=[],
|
||||
caller_ldflags=[],
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=HostToolchain,
|
||||
label="CXXLIB",
|
||||
cxxfilerule=cxxfile,
|
||||
):
|
||||
libraryimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
hdrs,
|
||||
caller_cflags,
|
||||
caller_ldflags,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
toolchain.ARXX,
|
||||
toolchain.PREFIX + label,
|
||||
cxxfilerule,
|
||||
)
|
||||
|
||||
|
||||
@@ -301,25 +419,21 @@ def programimpl(
|
||||
commands,
|
||||
label,
|
||||
filerule,
|
||||
kind,
|
||||
):
|
||||
ars = filenamesmatchingof(deps, "*.a")
|
||||
cfiles = findsources(self, srcs, deps, cflags, filerule, toolchain, self.cwd)
|
||||
|
||||
lib_deps = toolchain.find_c_library_targets(deps)
|
||||
libs = collectattrs(targets=lib_deps, name="clibrary_files")
|
||||
ldflags = collectattrs(targets=lib_deps, name="caller_ldflags", initial=ldflags)
|
||||
|
||||
cfiles = findsources(
|
||||
self.localname, srcs, deps, cflags, toolchain, filerule, self.cwd
|
||||
)
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=cfiles + ars + ars,
|
||||
outs=[f"={self.localname}$(EXT)"],
|
||||
ins=cfiles + libs,
|
||||
outs=[f"={self.localname}{toolchain.EXE}"],
|
||||
deps=deps,
|
||||
label=toolchain.label + label,
|
||||
label=label,
|
||||
commands=commands,
|
||||
args={
|
||||
"ldflags": collectattrs(
|
||||
targets=deps, name="caller_ldflags", initial=ldflags
|
||||
)
|
||||
},
|
||||
args={"ldflags": ldflags},
|
||||
)
|
||||
|
||||
|
||||
@@ -332,13 +446,9 @@ def cprogram(
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=Toolchain,
|
||||
commands=None,
|
||||
label="CLINK",
|
||||
cfilerule=cfile,
|
||||
cfilekind="cprogram",
|
||||
):
|
||||
if not commands:
|
||||
commands = toolchain.cprogram
|
||||
programimpl(
|
||||
self,
|
||||
name,
|
||||
@@ -347,10 +457,35 @@ def cprogram(
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
commands,
|
||||
label,
|
||||
toolchain.CLINK,
|
||||
toolchain.PREFIX + label,
|
||||
cfilerule,
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def hostcprogram(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=HostToolchain,
|
||||
label="CLINK",
|
||||
cfilerule=cfile,
|
||||
):
|
||||
programimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
toolchain.CLINK,
|
||||
toolchain.PREFIX + label,
|
||||
cfilerule,
|
||||
cfilekind,
|
||||
)
|
||||
|
||||
|
||||
@@ -363,11 +498,9 @@ def cxxprogram(
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=Toolchain,
|
||||
commands=None,
|
||||
label="CXXLINK",
|
||||
cxxfilerule=cxxfile,
|
||||
):
|
||||
if not commands:
|
||||
commands = toolchain.cxxprogram
|
||||
programimpl(
|
||||
self,
|
||||
name,
|
||||
@@ -376,8 +509,72 @@ def cxxprogram(
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
commands,
|
||||
label,
|
||||
cxxfile,
|
||||
"cxxprogram",
|
||||
toolchain.CXXLINK,
|
||||
toolchain.PREFIX + label,
|
||||
cxxfilerule,
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def hostcxxprogram(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = None,
|
||||
deps: Targets = None,
|
||||
cflags=[],
|
||||
ldflags=[],
|
||||
toolchain=HostToolchain,
|
||||
label="CXXLINK",
|
||||
cxxfilerule=cxxfile,
|
||||
):
|
||||
programimpl(
|
||||
self,
|
||||
name,
|
||||
srcs,
|
||||
deps,
|
||||
cflags,
|
||||
ldflags,
|
||||
toolchain,
|
||||
toolchain.CXXLINK,
|
||||
toolchain.PREFIX + label,
|
||||
cxxfilerule,
|
||||
)
|
||||
|
||||
|
||||
def _cppfileimpl(self, name, srcs, deps, cflags, toolchain):
|
||||
hdr_deps = _indirect(deps, "cheader_deps")
|
||||
cflags = collectattrs(targets=hdr_deps, name="caller_cflags", initial=cflags)
|
||||
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=srcs,
|
||||
outs=[f"={self.localname}"],
|
||||
deps=deps,
|
||||
commands=toolchain.CPP,
|
||||
args={"cflags": cflags},
|
||||
label=toolchain.PREFIX + "CPPFILE",
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def cppfile(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = [],
|
||||
deps: Targets = [],
|
||||
cflags=[],
|
||||
toolchain=Toolchain,
|
||||
):
|
||||
_cppfileimpl(self, name, srcs, deps, cflags, toolchain)
|
||||
|
||||
|
||||
@Rule
|
||||
def hostcppfile(
|
||||
self,
|
||||
name,
|
||||
srcs: Targets = [],
|
||||
deps: Targets = [],
|
||||
cflags=[],
|
||||
toolchain=HostToolchain,
|
||||
):
|
||||
_cppfileimpl(self, name, srcs, deps, cflags, toolchain)
|
||||
|
||||
110
build/pkg.py
110
build/pkg.py
@@ -1,59 +1,83 @@
|
||||
from build.ab import Rule, emit, Target, filenamesof
|
||||
from types import SimpleNamespace
|
||||
from build.ab import Rule, Target, G
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
emit(
|
||||
"""
|
||||
PKG_CONFIG ?= pkg-config
|
||||
PACKAGES := $(shell $(PKG_CONFIG) --list-all | cut -d' ' -f1 | sort)
|
||||
|
||||
HOST_PKG_CONFIG ?= pkg-config
|
||||
HOST_PACKAGES := $(shell $(HOST_PKG_CONFIG) --list-all | cut -d' ' -f1 | sort)
|
||||
"""
|
||||
)
|
||||
class _PkgConfig:
|
||||
package_present = set()
|
||||
package_properties = {}
|
||||
pkgconfig = None
|
||||
|
||||
def __init__(self, cmd):
|
||||
assert cmd, "no pkg-config environment variable supplied"
|
||||
self.pkgconfig = cmd
|
||||
|
||||
r = subprocess.run(f"{cmd} --list-all", shell=True, capture_output=True)
|
||||
ps = r.stdout.decode("utf-8")
|
||||
self.package_present = {l.split(" ", 1)[0] for l in ps.splitlines()}
|
||||
|
||||
def has_package(self, name):
|
||||
return name in self.package_present
|
||||
|
||||
def get_property(self, name, flag):
|
||||
p = f"{name}.{flag}"
|
||||
if p not in self.package_properties:
|
||||
r = subprocess.run(
|
||||
f"{self.pkgconfig} {flag} {name}",
|
||||
shell=True,
|
||||
capture_output=True,
|
||||
)
|
||||
self.package_properties[p] = r.stdout.decode("utf-8").strip()
|
||||
return self.package_properties[p]
|
||||
|
||||
|
||||
def _package(self, name, package, fallback, prefix=""):
|
||||
emit(f"ifeq ($(filter {package}, $({prefix}PACKAGES)),)")
|
||||
if fallback:
|
||||
emit(f"{prefix}PACKAGE_DEPS_{package} := ", *filenamesof([fallback]))
|
||||
emit(
|
||||
f"{prefix}PACKAGE_CFLAGS_{package} :=",
|
||||
*fallback.args.get("caller_cflags", []),
|
||||
)
|
||||
emit(
|
||||
f"{prefix}PACKAGE_LDFLAGS_{package} := ",
|
||||
*fallback.args.get("caller_ldflags", []),
|
||||
f"$(filter %.a, $({prefix}PACKAGE_DEPS_{package}))",
|
||||
)
|
||||
else:
|
||||
emit(f"$(error Required package '{package}' not installed.)")
|
||||
emit("else")
|
||||
emit(
|
||||
f"{prefix}PACKAGE_CFLAGS_{package} := $(shell $({prefix}PKG_CONFIG) --cflags {package})"
|
||||
)
|
||||
emit(
|
||||
f"{prefix}PACKAGE_LDFLAGS_{package} := $(shell $({prefix}PKG_CONFIG) --libs {package})"
|
||||
)
|
||||
emit(f"{prefix}PACKAGE_DEPS_{package} :=")
|
||||
emit("endif")
|
||||
emit(f"{self.name}:")
|
||||
TargetPkgConfig = _PkgConfig(G.PKG_CONFIG)
|
||||
HostPkgConfig = _PkgConfig(G.HOST_PKG_CONFIG)
|
||||
|
||||
self.args["caller_cflags"] = [f"$({prefix}PACKAGE_CFLAGS_{package})"]
|
||||
self.args["caller_ldflags"] = [f"$({prefix}PACKAGE_LDFLAGS_{package})"]
|
||||
self.traits.add("clibrary")
|
||||
self.traits.add("cheaders")
|
||||
|
||||
self.ins = []
|
||||
self.outs = [f"$({prefix}PACKAGE_DEPS_{package})"]
|
||||
def _package(self, name, package, fallback, pkgconfig):
|
||||
if pkgconfig.has_package(package):
|
||||
cflags = pkgconfig.get_property(package, "--cflags")
|
||||
ldflags = pkgconfig.get_property(package, "--libs")
|
||||
|
||||
if cflags:
|
||||
self.args["caller_cflags"] = [cflags]
|
||||
if ldflags:
|
||||
self.args["caller_ldflags"] = [ldflags]
|
||||
self.args["clibrary_deps"] = [self]
|
||||
self.args["cheader_deps"] = [self]
|
||||
self.traits.update({"clibrary", "cxxlibrary"})
|
||||
return
|
||||
|
||||
assert fallback, f"Required package '{package}' not installed"
|
||||
|
||||
if "cheader_deps" in fallback.args:
|
||||
self.args["cheader_deps"] = fallback.args["cheader_deps"]
|
||||
if "clibrary_deps" in fallback.args:
|
||||
self.args["clibrary_deps"] = fallback.args["clibrary_deps"]
|
||||
if "cheader_files" in fallback.args:
|
||||
self.args["cheader_files"] = fallback.args["cheader_files"]
|
||||
if "clibrary_files" in fallback.args:
|
||||
self.args["clibrary_files"] = fallback.args["clibrary_files"]
|
||||
self.ins = fallback.ins
|
||||
self.outs = fallback.outs
|
||||
self.deps = fallback.deps
|
||||
self.traits = fallback.traits
|
||||
|
||||
|
||||
@Rule
|
||||
def package(self, name, package=None, fallback: Target = None):
|
||||
_package(self, name, package, fallback)
|
||||
_package(self, name, package, fallback, TargetPkgConfig)
|
||||
|
||||
|
||||
@Rule
|
||||
def hostpackage(self, name, package=None, fallback: Target = None):
|
||||
_package(self, name, package, fallback, "HOST_")
|
||||
_package(self, name, package, fallback, HostPkgConfig)
|
||||
|
||||
|
||||
def has_package(name):
|
||||
return TargetPkgConfig.has_package(name)
|
||||
|
||||
|
||||
def has_host_package(name):
|
||||
return HostPkgConfig.has_package(name)
|
||||
|
||||
@@ -1,31 +1,77 @@
|
||||
from build.ab import Rule, Targets, emit, simplerule, filenamesof
|
||||
from build.ab import Rule, Targets, emit, simplerule, filenamesof, G
|
||||
from build.utils import filenamesmatchingof, collectattrs
|
||||
from types import SimpleNamespace
|
||||
from os.path import join
|
||||
import build.pkg # to get the protobuf package check
|
||||
from os.path import join, abspath, dirname, relpath
|
||||
from build.pkg import has_package
|
||||
|
||||
emit(
|
||||
"""
|
||||
PROTOC ?= protoc
|
||||
ifeq ($(filter protobuf, $(PACKAGES)),)
|
||||
$(error Required package 'protobuf' not installed.)"
|
||||
endif
|
||||
"""
|
||||
)
|
||||
G.setdefault("PROTOC", "protoc")
|
||||
G.setdefault("HOSTPROTOC", "hostprotoc")
|
||||
|
||||
assert has_package("protobuf"), "required package 'protobuf' not installed"
|
||||
|
||||
|
||||
def _getprotodeps(deps):
|
||||
r = set()
|
||||
for d in deps:
|
||||
r.update(d.args.get("protodeps", {d}))
|
||||
return sorted(r)
|
||||
|
||||
|
||||
@Rule
|
||||
def proto(self, name, srcs: Targets = [], deps: Targets = []):
|
||||
protodeps = _getprotodeps(deps)
|
||||
descriptorlist = ":".join(
|
||||
[
|
||||
relpath(f, start=self.dir)
|
||||
for f in filenamesmatchingof(protodeps, "*.descriptor")
|
||||
]
|
||||
)
|
||||
|
||||
dirs = sorted({"$[dir]/" + dirname(f) for f in filenamesof(srcs)})
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=srcs,
|
||||
outs=[f"={name}.descriptor"],
|
||||
deps=deps,
|
||||
commands=[
|
||||
"$(PROTOC) --include_source_info --descriptor_set_out={outs[0]} {ins}"
|
||||
],
|
||||
outs=[f"={self.localname}.descriptor"],
|
||||
deps=protodeps,
|
||||
commands=(
|
||||
["mkdir -p " + (" ".join(dirs))]
|
||||
+ [f"$(CP) {f} $[dir]/{f}" for f in filenamesof(srcs)]
|
||||
+ [
|
||||
"cd $[dir] && "
|
||||
+ (
|
||||
" ".join(
|
||||
[
|
||||
"$(PROTOC)",
|
||||
"--proto_path=.",
|
||||
"--include_source_info",
|
||||
f"--descriptor_set_out={self.localname}.descriptor",
|
||||
]
|
||||
+ (
|
||||
[f"--descriptor_set_in={descriptorlist}"]
|
||||
if descriptorlist
|
||||
else []
|
||||
)
|
||||
+ ["$[ins]"]
|
||||
)
|
||||
)
|
||||
]
|
||||
),
|
||||
label="PROTO",
|
||||
args={"protosrcs": filenamesof(srcs)},
|
||||
args={
|
||||
"protosrcs": filenamesof(srcs),
|
||||
"protodeps": set(protodeps) | {self},
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def protolib(self, name, srcs: Targets = []):
|
||||
simplerule(
|
||||
replaces=self,
|
||||
label="PROTOLIB",
|
||||
args={
|
||||
"protosrcs": collectattrs(targets=srcs, name="protosrcs"),
|
||||
"protodeps": set(_getprotodeps(srcs)),
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -40,16 +86,36 @@ def protocc(self, name, srcs: Targets = [], deps: Targets = []):
|
||||
cc = f.replace(".proto", ".pb.cc")
|
||||
h = f.replace(".proto", ".pb.h")
|
||||
protos += [f]
|
||||
srcs += [f]
|
||||
outs += ["=" + cc, "=" + h]
|
||||
|
||||
protodeps = _getprotodeps(deps + srcs)
|
||||
descriptorlist = ":".join(
|
||||
[
|
||||
relpath(f, start=self.dir)
|
||||
for f in filenamesmatchingof(protodeps, "*.descriptor")
|
||||
]
|
||||
)
|
||||
|
||||
r = simplerule(
|
||||
name=f"{self.localname}_srcs",
|
||||
cwd=self.cwd,
|
||||
ins=protos,
|
||||
ins=srcs,
|
||||
outs=outs,
|
||||
deps=deps,
|
||||
commands=["$(PROTOC) --cpp_out={dir} {ins}"],
|
||||
deps=protodeps,
|
||||
commands=[
|
||||
"cd $[dir] && "
|
||||
+ (
|
||||
" ".join(
|
||||
[
|
||||
"$(PROTOC)",
|
||||
"--proto_path=.",
|
||||
"--cpp_out=.",
|
||||
f"--descriptor_set_in={descriptorlist}",
|
||||
]
|
||||
+ protos
|
||||
)
|
||||
)
|
||||
],
|
||||
label="PROTOCC",
|
||||
)
|
||||
|
||||
@@ -76,16 +142,31 @@ def protojava(self, name, srcs: Targets = [], deps: Targets = []):
|
||||
protos += [f]
|
||||
srcs += [f]
|
||||
|
||||
descriptorlist = ":".join(
|
||||
[abspath(f) for f in filenamesmatchingof(srcs + deps, "*.descriptor")]
|
||||
)
|
||||
|
||||
r = simplerule(
|
||||
name=f"{self.localname}_srcs",
|
||||
cwd=self.cwd,
|
||||
ins=protos,
|
||||
outs=[f"={self.localname}.srcjar"],
|
||||
deps=deps,
|
||||
deps=srcs + deps,
|
||||
commands=[
|
||||
"mkdir -p {dir}/srcs",
|
||||
"$(PROTOC) --java_out={dir}/srcs {ins}",
|
||||
"$(JAR) cf {outs[0]} -C {dir}/srcs .",
|
||||
"mkdir -p $[dir]/srcs",
|
||||
"cd $[dir]/srcs && "
|
||||
+ (
|
||||
" ".join(
|
||||
[
|
||||
"$(PROTOC)",
|
||||
"--proto_path=.",
|
||||
"--java_out=.",
|
||||
f"--descriptor_set_in={descriptorlist}",
|
||||
]
|
||||
+ protos
|
||||
)
|
||||
),
|
||||
"$(JAR) cf $[outs[0]] -C $[dir]/srcs .",
|
||||
],
|
||||
traits={"srcjar"},
|
||||
label="PROTOJAVA",
|
||||
|
||||
11
build/toolchain.py
Normal file
11
build/toolchain.py
Normal file
@@ -0,0 +1,11 @@
|
||||
import platform
|
||||
|
||||
_is_windows = (platform.system() == "Windows")
|
||||
|
||||
class Toolchain:
|
||||
PREFIX = ""
|
||||
EXE = ".exe" if _is_windows else ""
|
||||
|
||||
|
||||
class HostToolchain(Toolchain):
|
||||
PREFIX = "HOST"
|
||||
@@ -7,11 +7,13 @@ from build.ab import (
|
||||
cwdStack,
|
||||
error,
|
||||
simplerule,
|
||||
G
|
||||
)
|
||||
from os.path import relpath, splitext, join, basename, isfile
|
||||
from glob import iglob
|
||||
import fnmatch
|
||||
import itertools
|
||||
import subprocess
|
||||
import shutil
|
||||
|
||||
|
||||
def filenamesmatchingof(xs, pattern):
|
||||
@@ -30,7 +32,7 @@ def collectattrs(*, targets, name, initial=[]):
|
||||
s = set(initial)
|
||||
for a in [t.args.get(name, []) for t in targets]:
|
||||
s.update(a)
|
||||
return sorted(list(s))
|
||||
return sorted(s)
|
||||
|
||||
|
||||
def itemsof(pattern, root=None, cwd=None):
|
||||
@@ -52,13 +54,23 @@ def itemsof(pattern, root=None, cwd=None):
|
||||
return result
|
||||
|
||||
|
||||
def does_command_exist(cmd):
|
||||
basecmd = cmd.strip().split()[0]
|
||||
return shutil.which(basecmd)
|
||||
|
||||
|
||||
def shell(cmd):
|
||||
r = subprocess.check_output([G.SHELL, "-c", cmd])
|
||||
return r.decode("utf-8").strip()
|
||||
|
||||
|
||||
@Rule
|
||||
def objectify(self, name, src: Target, symbol):
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=["build/_objectify.py", src],
|
||||
outs=[f"={basename(filenameof(src))}.h"],
|
||||
commands=["$(PYTHON) {ins[0]} {ins[1]} " + symbol + " > {outs}"],
|
||||
commands=["$(PYTHON) $[ins[0]] $[ins[1]] " + symbol + " > $[outs]"],
|
||||
label="OBJECTIFY",
|
||||
)
|
||||
|
||||
@@ -78,7 +90,7 @@ def test(
|
||||
replaces=self,
|
||||
ins=[command],
|
||||
outs=["=sentinel"],
|
||||
commands=["{ins[0]}", "touch {outs}"],
|
||||
commands=["$[ins[0]]", "touch $[outs[0]]"],
|
||||
deps=deps,
|
||||
label=label,
|
||||
)
|
||||
@@ -87,7 +99,7 @@ def test(
|
||||
replaces=self,
|
||||
ins=ins,
|
||||
outs=["=sentinel"],
|
||||
commands=commands + ["touch {outs}"],
|
||||
commands=commands + ["touch $[outs[0]]"],
|
||||
deps=deps,
|
||||
label=label,
|
||||
)
|
||||
|
||||
22
build/zip.py
22
build/zip.py
@@ -3,35 +3,23 @@ from build.ab import (
|
||||
simplerule,
|
||||
TargetsMap,
|
||||
filenameof,
|
||||
emit,
|
||||
)
|
||||
|
||||
emit(
|
||||
"""
|
||||
ZIP ?= zip
|
||||
ZIPNOTE ?= zipnote
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
@Rule
|
||||
def zip(
|
||||
self, name, flags="", items: TargetsMap = {}, extension="zip", label="ZIP"
|
||||
):
|
||||
cs = ["rm -f {outs[0]}"]
|
||||
def zip(self, name, flags="", items: TargetsMap = {}, extension="zip", label="ZIP"):
|
||||
cs = ["$(PYTHON) build/_zip.py -z $[outs]"]
|
||||
|
||||
ins = []
|
||||
for k, v in items.items():
|
||||
cs += [
|
||||
"cat %s | $(ZIP) -q %s {outs[0]} -" % (filenameof(v), flags),
|
||||
"printf '@ -\\n@=%s\\n' | $(ZIPNOTE) -w {outs[0]}" % k,
|
||||
]
|
||||
cs += [f"-f {k} {filenameof(v)}"]
|
||||
ins += [v]
|
||||
|
||||
simplerule(
|
||||
replaces=self,
|
||||
ins=ins,
|
||||
deps=["build/_zip.py"],
|
||||
outs=[f"={self.localname}." + extension],
|
||||
commands=cs,
|
||||
commands=[" ".join(cs)],
|
||||
label=label,
|
||||
)
|
||||
|
||||
@@ -2,33 +2,34 @@
|
||||
#define ADF_NATIV_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include "adf_str.h"
|
||||
|
||||
#define NATIVE_FILE 8001
|
||||
|
||||
struct nativeDevice
|
||||
{
|
||||
FILE* fd;
|
||||
};
|
||||
struct nativeDevice
|
||||
{
|
||||
FILE* fd;
|
||||
};
|
||||
|
||||
struct nativeFunctions
|
||||
{
|
||||
/* called by adfMount() */
|
||||
RETCODE (*adfInitDevice)(struct Device*, char*, BOOL);
|
||||
/* called by adfReadBlock() */
|
||||
RETCODE (*adfNativeReadSector)(struct Device*, int32_t, int, uint8_t*);
|
||||
/* called by adfWriteBlock() */
|
||||
RETCODE (*adfNativeWriteSector)(struct Device*, int32_t, int, uint8_t*);
|
||||
/* called by adfMount() */
|
||||
BOOL (*adfIsDevNative)(char*);
|
||||
/* called by adfUnMount() */
|
||||
RETCODE (*adfReleaseDevice)(struct Device*);
|
||||
};
|
||||
struct nativeFunctions
|
||||
{
|
||||
/* called by adfMount() */
|
||||
RETCODE (*adfInitDevice)(struct Device*, char*, BOOL);
|
||||
/* called by adfReadBlock() */
|
||||
RETCODE (*adfNativeReadSector)(struct Device*, int32_t, int, uint8_t*);
|
||||
/* called by adfWriteBlock() */
|
||||
RETCODE (*adfNativeWriteSector)(struct Device*, int32_t, int, uint8_t*);
|
||||
/* called by adfMount() */
|
||||
BOOL (*adfIsDevNative)(char*);
|
||||
/* called by adfUnMount() */
|
||||
RETCODE (*adfReleaseDevice)(struct Device*);
|
||||
};
|
||||
|
||||
extern void adfInitNativeFct();
|
||||
extern void adfInitNativeFct();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ clibrary(
|
||||
"./config.h",
|
||||
"./src/adflib.h",
|
||||
],
|
||||
cflags=["-Idep/adflib", "-Idep/adflib/src"],
|
||||
cflags=["-Wno-stringop-overflow"],
|
||||
hdrs={
|
||||
"adf_blk.h": "./src/adf_blk.h",
|
||||
"adf_defs.h": "./src/adf_defs.h",
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
/* empty config.h to keep the source happy */
|
||||
|
||||
|
||||
@@ -27,25 +27,28 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"adf_str.h"
|
||||
#include"prefix.h"
|
||||
#include "adf_str.h"
|
||||
#include "prefix.h"
|
||||
|
||||
RETCODE adfReadBitmapBlock(struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
|
||||
RETCODE adfWriteBitmapBlock(struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
|
||||
RETCODE adfReadBitmapExtBlock(struct Volume*, SECTNUM nSect, struct bBitmapExtBlock*);
|
||||
RETCODE adfWriteBitmapExtBlock(struct Volume*, SECTNUM, struct bBitmapExtBlock* );
|
||||
RETCODE adfWriteBitmapBlock(
|
||||
struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
|
||||
RETCODE adfReadBitmapExtBlock(
|
||||
struct Volume*, SECTNUM nSect, struct bBitmapExtBlock*);
|
||||
RETCODE adfWriteBitmapExtBlock(
|
||||
struct Volume*, SECTNUM, struct bBitmapExtBlock*);
|
||||
|
||||
SECTNUM adfGet1FreeBlock(struct Volume *vol);
|
||||
RETCODE adfUpdateBitmap(struct Volume *vol);
|
||||
SECTNUM adfGet1FreeBlock(struct Volume* vol);
|
||||
RETCODE adfUpdateBitmap(struct Volume* vol);
|
||||
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
|
||||
RETCODE adfReadBitmap(struct Volume* , SECTNUM nBlock, struct bRootBlock* root);
|
||||
RETCODE adfReadBitmap(struct Volume*, SECTNUM nBlock, struct bRootBlock* root);
|
||||
BOOL adfIsBlockFree(struct Volume* vol, SECTNUM nSect);
|
||||
void adfSetBlockFree(struct Volume* vol, SECTNUM nSect);
|
||||
void adfSetBlockUsed(struct Volume* vol, SECTNUM nSect);
|
||||
BOOL adfGetFreeBlocks(struct Volume* vol, int nbSect, SECTNUM* sectList);
|
||||
RETCODE adfCreateBitmap(struct Volume *vol);
|
||||
RETCODE adfWriteNewBitmap(struct Volume *vol);
|
||||
void adfFreeBitmap(struct Volume *vol);
|
||||
RETCODE adfCreateBitmap(struct Volume* vol);
|
||||
RETCODE adfWriteNewBitmap(struct Volume* vol);
|
||||
void adfFreeBitmap(struct Volume* vol);
|
||||
|
||||
#endif /* ADF_BITM_H */
|
||||
|
||||
|
||||
@@ -25,264 +25,255 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ADF_BLK_H
|
||||
#define ADF_BLK_H 1
|
||||
|
||||
#define ULONG uint32_t
|
||||
#define USHORT uint16_t
|
||||
#define UCHAR uint8_t
|
||||
#define ULONG uint32_t
|
||||
#define USHORT uint16_t
|
||||
#define UCHAR uint8_t
|
||||
|
||||
#define LOGICAL_BLOCK_SIZE 512
|
||||
#define LOGICAL_BLOCK_SIZE 512
|
||||
|
||||
/* ----- FILE SYSTEM ----- */
|
||||
|
||||
#define FSMASK_FFS 1
|
||||
#define FSMASK_INTL 2
|
||||
#define FSMASK_DIRCACHE 4
|
||||
|
||||
#define isFFS(c) ((c)&FSMASK_FFS)
|
||||
#define isOFS(c) (!((c)&FSMASK_FFS))
|
||||
#define isINTL(c) ((c)&FSMASK_INTL)
|
||||
#define isDIRCACHE(c) ((c)&FSMASK_DIRCACHE)
|
||||
#define FSMASK_FFS 1
|
||||
#define FSMASK_INTL 2
|
||||
#define FSMASK_DIRCACHE 4
|
||||
|
||||
#define isFFS(c) ((c)&FSMASK_FFS)
|
||||
#define isOFS(c) (!((c)&FSMASK_FFS))
|
||||
#define isINTL(c) ((c)&FSMASK_INTL)
|
||||
#define isDIRCACHE(c) ((c)&FSMASK_DIRCACHE)
|
||||
|
||||
/* ----- ENTRIES ----- */
|
||||
|
||||
/* access constants */
|
||||
|
||||
#define ACCMASK_D (1<<0)
|
||||
#define ACCMASK_E (1<<1)
|
||||
#define ACCMASK_W (1<<2)
|
||||
#define ACCMASK_R (1<<3)
|
||||
#define ACCMASK_A (1<<4)
|
||||
#define ACCMASK_P (1<<5)
|
||||
#define ACCMASK_S (1<<6)
|
||||
#define ACCMASK_H (1<<7)
|
||||
|
||||
#define hasD(c) ((c)&ACCMASK_D)
|
||||
#define hasE(c) ((c)&ACCMASK_E)
|
||||
#define hasW(c) ((c)&ACCMASK_W)
|
||||
#define hasR(c) ((c)&ACCMASK_R)
|
||||
#define hasA(c) ((c)&ACCMASK_A)
|
||||
#define hasP(c) ((c)&ACCMASK_P)
|
||||
#define hasS(c) ((c)&ACCMASK_S)
|
||||
#define hasH(c) ((c)&ACCMASK_H)
|
||||
#define ACCMASK_D (1 << 0)
|
||||
#define ACCMASK_E (1 << 1)
|
||||
#define ACCMASK_W (1 << 2)
|
||||
#define ACCMASK_R (1 << 3)
|
||||
#define ACCMASK_A (1 << 4)
|
||||
#define ACCMASK_P (1 << 5)
|
||||
#define ACCMASK_S (1 << 6)
|
||||
#define ACCMASK_H (1 << 7)
|
||||
|
||||
#define hasD(c) ((c)&ACCMASK_D)
|
||||
#define hasE(c) ((c)&ACCMASK_E)
|
||||
#define hasW(c) ((c)&ACCMASK_W)
|
||||
#define hasR(c) ((c)&ACCMASK_R)
|
||||
#define hasA(c) ((c)&ACCMASK_A)
|
||||
#define hasP(c) ((c)&ACCMASK_P)
|
||||
#define hasS(c) ((c)&ACCMASK_S)
|
||||
#define hasH(c) ((c)&ACCMASK_H)
|
||||
|
||||
/* ----- BLOCKS ----- */
|
||||
|
||||
/* block constants */
|
||||
|
||||
#define BM_VALID -1
|
||||
#define BM_INVALID 0
|
||||
#define BM_VALID -1
|
||||
#define BM_INVALID 0
|
||||
|
||||
#define HT_SIZE 72
|
||||
#define BM_SIZE 25
|
||||
#define MAX_DATABLK 72
|
||||
|
||||
#define MAXNAMELEN 30
|
||||
#define MAXCMMTLEN 79
|
||||
#define HT_SIZE 72
|
||||
#define BM_SIZE 25
|
||||
#define MAX_DATABLK 72
|
||||
|
||||
#define MAXNAMELEN 30
|
||||
#define MAXCMMTLEN 79
|
||||
|
||||
/* block primary and secondary types */
|
||||
|
||||
#define T_HEADER 2
|
||||
#define ST_ROOT 1
|
||||
#define ST_DIR 2
|
||||
#define ST_FILE -3
|
||||
#define ST_LFILE -4
|
||||
#define ST_LDIR 4
|
||||
#define ST_LSOFT 3
|
||||
#define T_LIST 16
|
||||
#define T_DATA 8
|
||||
#define T_DIRC 33
|
||||
|
||||
#define T_HEADER 2
|
||||
#define ST_ROOT 1
|
||||
#define ST_DIR 2
|
||||
#define ST_FILE -3
|
||||
#define ST_LFILE -4
|
||||
#define ST_LDIR 4
|
||||
#define ST_LSOFT 3
|
||||
#define T_LIST 16
|
||||
#define T_DATA 8
|
||||
#define T_DIRC 33
|
||||
|
||||
/*--- blocks structures --- */
|
||||
|
||||
|
||||
struct bBootBlock {
|
||||
/*000*/ char dosType[4];
|
||||
/*004*/ ULONG checkSum;
|
||||
/*008*/ int32_t rootBlock;
|
||||
/*00c*/ UCHAR data[500+512];
|
||||
struct bBootBlock
|
||||
{
|
||||
/*000*/ char dosType[4];
|
||||
/*004*/ ULONG checkSum;
|
||||
/*008*/ int32_t rootBlock;
|
||||
/*00c*/ UCHAR data[500 + 512];
|
||||
};
|
||||
|
||||
|
||||
struct bRootBlock {
|
||||
/*000*/ int32_t type;
|
||||
int32_t headerKey;
|
||||
int32_t highSeq;
|
||||
/*00c*/ int32_t hashTableSize;
|
||||
int32_t firstData;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
|
||||
/*138*/ int32_t bmFlag; /* bitmap flag, -1 means VALID */
|
||||
/*13c*/ int32_t bmPages[BM_SIZE];
|
||||
/*1a0*/ int32_t bmExt;
|
||||
/*1a4*/ int32_t cDays; /* creation date FFS and OFS */
|
||||
/*1a8*/ int32_t cMins;
|
||||
/*1ac*/ int32_t cTicks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char diskName[MAXNAMELEN+1];
|
||||
char r2[8];
|
||||
/*1d8*/ int32_t days; /* last access : days after 1 jan 1978 */
|
||||
/*1dc*/ int32_t mins; /* hours and minutes in minutes */
|
||||
/*1e0*/ int32_t ticks; /* 1/50 seconds */
|
||||
/*1e4*/ int32_t coDays; /* creation date OFS */
|
||||
/*1e8*/ int32_t coMins;
|
||||
/*1ec*/ int32_t coTicks;
|
||||
int32_t nextSameHash; /* == 0 */
|
||||
int32_t parent; /* == 0 */
|
||||
/*1f8*/ int32_t extension; /* FFS: first directory cache block */
|
||||
/*1fc*/ int32_t secType; /* == 1 */
|
||||
struct bRootBlock
|
||||
{
|
||||
/*000*/ int32_t type;
|
||||
int32_t headerKey;
|
||||
int32_t highSeq;
|
||||
/*00c*/ int32_t hashTableSize;
|
||||
int32_t firstData;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
|
||||
/*138*/ int32_t bmFlag; /* bitmap flag, -1 means VALID */
|
||||
/*13c*/ int32_t bmPages[BM_SIZE];
|
||||
/*1a0*/ int32_t bmExt;
|
||||
/*1a4*/ int32_t cDays; /* creation date FFS and OFS */
|
||||
/*1a8*/ int32_t cMins;
|
||||
/*1ac*/ int32_t cTicks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char diskName[MAXNAMELEN + 1];
|
||||
char r2[8];
|
||||
/*1d8*/ int32_t days; /* last access : days after 1 jan 1978 */
|
||||
/*1dc*/ int32_t mins; /* hours and minutes in minutes */
|
||||
/*1e0*/ int32_t ticks; /* 1/50 seconds */
|
||||
/*1e4*/ int32_t coDays; /* creation date OFS */
|
||||
/*1e8*/ int32_t coMins;
|
||||
/*1ec*/ int32_t coTicks;
|
||||
int32_t nextSameHash; /* == 0 */
|
||||
int32_t parent; /* == 0 */
|
||||
/*1f8*/ int32_t extension; /* FFS: first directory cache block */
|
||||
/*1fc*/ int32_t secType; /* == 1 */
|
||||
};
|
||||
|
||||
|
||||
struct bFileHeaderBlock {
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey; /* current block number */
|
||||
/*008*/ int32_t highSeq; /* number of data block in this hdr block */
|
||||
/*00c*/ int32_t dataSize; /* == 0 */
|
||||
/*010*/ int32_t firstData;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t dataBlocks[MAX_DATABLK];
|
||||
/*138*/ int32_t r1;
|
||||
/*13c*/ int32_t r2;
|
||||
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
|
||||
/*144*/ uint32_t byteSize;
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN+1];
|
||||
char r3[91-(MAXCMMTLEN+1)];
|
||||
/*1a4*/ int32_t days;
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char fileName[MAXNAMELEN+1];
|
||||
int32_t r4;
|
||||
/*1d4*/ int32_t real; /* unused == 0 */
|
||||
/*1d8*/ int32_t nextLink; /* link chain */
|
||||
int32_t r5[5];
|
||||
/*1f0*/ int32_t nextSameHash; /* next entry with sane hash */
|
||||
/*1f4*/ int32_t parent; /* parent directory */
|
||||
/*1f8*/ int32_t extension; /* pointer to extension block */
|
||||
/*1fc*/ int32_t secType; /* == -3 */
|
||||
struct bFileHeaderBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey; /* current block number */
|
||||
/*008*/ int32_t highSeq; /* number of data block in this hdr block */
|
||||
/*00c*/ int32_t dataSize; /* == 0 */
|
||||
/*010*/ int32_t firstData;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t dataBlocks[MAX_DATABLK];
|
||||
/*138*/ int32_t r1;
|
||||
/*13c*/ int32_t r2;
|
||||
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
|
||||
/*144*/ uint32_t byteSize;
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN + 1];
|
||||
char r3[91 - (MAXCMMTLEN + 1)];
|
||||
/*1a4*/ int32_t days;
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char fileName[MAXNAMELEN + 1];
|
||||
int32_t r4;
|
||||
/*1d4*/ int32_t real; /* unused == 0 */
|
||||
/*1d8*/ int32_t nextLink; /* link chain */
|
||||
int32_t r5[5];
|
||||
/*1f0*/ int32_t nextSameHash; /* next entry with sane hash */
|
||||
/*1f4*/ int32_t parent; /* parent directory */
|
||||
/*1f8*/ int32_t extension; /* pointer to extension block */
|
||||
/*1fc*/ int32_t secType; /* == -3 */
|
||||
};
|
||||
|
||||
|
||||
/*--- file header extension block structure ---*/
|
||||
|
||||
struct bFileExtBlock {
|
||||
/*000*/ int32_t type; /* == 0x10 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t highSeq;
|
||||
/*00c*/ int32_t dataSize; /* == 0 */
|
||||
/*010*/ int32_t firstData; /* == 0 */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t dataBlocks[MAX_DATABLK];
|
||||
int32_t r[45];
|
||||
int32_t info; /* == 0 */
|
||||
int32_t nextSameHash; /* == 0 */
|
||||
/*1f4*/ int32_t parent; /* header block */
|
||||
/*1f8*/ int32_t extension; /* next header extension block */
|
||||
/*1fc*/ int32_t secType; /* -3 */
|
||||
struct bFileExtBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 0x10 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t highSeq;
|
||||
/*00c*/ int32_t dataSize; /* == 0 */
|
||||
/*010*/ int32_t firstData; /* == 0 */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t dataBlocks[MAX_DATABLK];
|
||||
int32_t r[45];
|
||||
int32_t info; /* == 0 */
|
||||
int32_t nextSameHash; /* == 0 */
|
||||
/*1f4*/ int32_t parent; /* header block */
|
||||
/*1f8*/ int32_t extension; /* next header extension block */
|
||||
/*1fc*/ int32_t secType; /* -3 */
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct bDirBlock {
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t highSeq; /* == 0 */
|
||||
/*00c*/ int32_t hashTableSize; /* == 0 */
|
||||
int32_t r1; /* == 0 */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
|
||||
int32_t r2[2];
|
||||
/*140*/ int32_t access;
|
||||
int32_t r4; /* == 0 */
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN+1];
|
||||
char r5[91-(MAXCMMTLEN+1)];
|
||||
/*1a4*/ int32_t days; /* last access */
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char dirName[MAXNAMELEN+1];
|
||||
int32_t r6;
|
||||
/*1d4*/ int32_t real; /* ==0 */
|
||||
/*1d8*/ int32_t nextLink; /* link list */
|
||||
int32_t r7[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
/*1f8*/ int32_t extension; /* FFS : first directory cache */
|
||||
/*1fc*/ int32_t secType; /* == 2 */
|
||||
struct bDirBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t highSeq; /* == 0 */
|
||||
/*00c*/ int32_t hashTableSize; /* == 0 */
|
||||
int32_t r1; /* == 0 */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
|
||||
int32_t r2[2];
|
||||
/*140*/ int32_t access;
|
||||
int32_t r4; /* == 0 */
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN + 1];
|
||||
char r5[91 - (MAXCMMTLEN + 1)];
|
||||
/*1a4*/ int32_t days; /* last access */
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char dirName[MAXNAMELEN + 1];
|
||||
int32_t r6;
|
||||
/*1d4*/ int32_t real; /* ==0 */
|
||||
/*1d8*/ int32_t nextLink; /* link list */
|
||||
int32_t r7[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
/*1f8*/ int32_t extension; /* FFS : first directory cache */
|
||||
/*1fc*/ int32_t secType; /* == 2 */
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct bOFSDataBlock{
|
||||
/*000*/ int32_t type; /* == 8 */
|
||||
/*004*/ int32_t headerKey; /* pointer to file_hdr block */
|
||||
/*008*/ int32_t seqNum; /* file data block number */
|
||||
/*00c*/ int32_t dataSize; /* <= 0x1e8 */
|
||||
/*010*/ int32_t nextData; /* next data block */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ UCHAR data[488];
|
||||
struct bOFSDataBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 8 */
|
||||
/*004*/ int32_t headerKey; /* pointer to file_hdr block */
|
||||
/*008*/ int32_t seqNum; /* file data block number */
|
||||
/*00c*/ int32_t dataSize; /* <= 0x1e8 */
|
||||
/*010*/ int32_t nextData; /* next data block */
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ UCHAR data[488];
|
||||
/*200*/ };
|
||||
|
||||
|
||||
/* --- bitmap --- */
|
||||
|
||||
struct bBitmapBlock {
|
||||
/*000*/ ULONG checkSum;
|
||||
/*004*/ ULONG map[127];
|
||||
};
|
||||
|
||||
|
||||
struct bBitmapExtBlock {
|
||||
/*000*/ int32_t bmPages[127];
|
||||
/*1fc*/ int32_t nextBlock;
|
||||
};
|
||||
|
||||
|
||||
struct bLinkBlock {
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey; /* self pointer */
|
||||
int32_t r1[3];
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ char realName[64];
|
||||
int32_t r2[83];
|
||||
/*1a4*/ int32_t days; /* last access */
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char name[MAXNAMELEN+1];
|
||||
int32_t r3;
|
||||
/*1d4*/ int32_t realEntry;
|
||||
/*1d8*/ int32_t nextLink;
|
||||
int32_t r4[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
int32_t r5;
|
||||
/*1fc*/ int32_t secType; /* == -4, 4, 3 */
|
||||
};
|
||||
struct bBitmapBlock
|
||||
{
|
||||
/*000*/ ULONG checkSum;
|
||||
/*004*/ ULONG map[127];
|
||||
};
|
||||
|
||||
struct bBitmapExtBlock
|
||||
{
|
||||
/*000*/ int32_t bmPages[127];
|
||||
/*1fc*/ int32_t nextBlock;
|
||||
};
|
||||
|
||||
struct bLinkBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 2 */
|
||||
/*004*/ int32_t headerKey; /* self pointer */
|
||||
int32_t r1[3];
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ char realName[64];
|
||||
int32_t r2[83];
|
||||
/*1a4*/ int32_t days; /* last access */
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char name[MAXNAMELEN + 1];
|
||||
int32_t r3;
|
||||
/*1d4*/ int32_t realEntry;
|
||||
/*1d8*/ int32_t nextLink;
|
||||
int32_t r4[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
int32_t r5;
|
||||
/*1fc*/ int32_t secType; /* == -4, 4, 3 */
|
||||
};
|
||||
|
||||
/*--- directory cache block structure ---*/
|
||||
|
||||
struct bDirCacheBlock {
|
||||
/*000*/ int32_t type; /* == 33 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t parent;
|
||||
/*00c*/ int32_t recordsNb;
|
||||
/*010*/ int32_t nextDirC;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ uint8_t records[488];
|
||||
};
|
||||
|
||||
struct bDirCacheBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* == 33 */
|
||||
/*004*/ int32_t headerKey;
|
||||
/*008*/ int32_t parent;
|
||||
/*00c*/ int32_t recordsNb;
|
||||
/*010*/ int32_t nextDirC;
|
||||
/*014*/ ULONG checkSum;
|
||||
/*018*/ uint8_t records[488];
|
||||
};
|
||||
|
||||
#endif /* ADF_BLK_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -27,20 +27,28 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "adf_str.h"
|
||||
|
||||
void adfGetCacheEntry(struct bDirCacheBlock *dirc, int *p, struct CacheEntry *cEntry);
|
||||
int adfPutCacheEntry( struct bDirCacheBlock *dirc, int *p, struct CacheEntry *cEntry);
|
||||
void adfGetCacheEntry(
|
||||
struct bDirCacheBlock* dirc, int* p, struct CacheEntry* cEntry);
|
||||
int adfPutCacheEntry(
|
||||
struct bDirCacheBlock* dirc, int* p, struct CacheEntry* cEntry);
|
||||
|
||||
struct List* adfGetDirEntCache(struct Volume *vol, SECTNUM dir, BOOL recurs);
|
||||
struct List* adfGetDirEntCache(struct Volume* vol, SECTNUM dir, BOOL recurs);
|
||||
|
||||
RETCODE adfCreateEmptyCache(struct Volume *vol, struct bEntryBlock *parent, SECTNUM nSect);
|
||||
RETCODE adfAddInCache(struct Volume *vol, struct bEntryBlock *parent, struct bEntryBlock *entry);
|
||||
RETCODE adfUpdateCache(struct Volume *vol, struct bEntryBlock *parent, struct bEntryBlock *entry, BOOL);
|
||||
RETCODE adfDelFromCache(struct Volume *vol, struct bEntryBlock *parent, SECTNUM);
|
||||
RETCODE adfCreateEmptyCache(
|
||||
struct Volume* vol, struct bEntryBlock* parent, SECTNUM nSect);
|
||||
RETCODE adfAddInCache(
|
||||
struct Volume* vol, struct bEntryBlock* parent, struct bEntryBlock* entry);
|
||||
RETCODE adfUpdateCache(struct Volume* vol,
|
||||
struct bEntryBlock* parent,
|
||||
struct bEntryBlock* entry,
|
||||
BOOL);
|
||||
RETCODE adfDelFromCache(
|
||||
struct Volume* vol, struct bEntryBlock* parent, SECTNUM);
|
||||
|
||||
RETCODE adfReadDirCBlock(struct Volume *vol, SECTNUM nSect, struct bDirCacheBlock *dirc);
|
||||
RETCODE adfReadDirCBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bDirCacheBlock* dirc);
|
||||
RETCODE adfWriteDirCBlock(struct Volume*, int32_t, struct bDirCacheBlock* dirc);
|
||||
|
||||
#endif /* _ADF_CACHE_H */
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _ADF_DEFS_H
|
||||
#define _ADF_DEFS_H 1
|
||||
|
||||
@@ -34,38 +33,33 @@
|
||||
#define SECTNUM int32_t
|
||||
#define RETCODE int32_t
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
|
||||
#include <stdint.h>
|
||||
#define ULONG uint32_t
|
||||
#define USHORT uint16_t
|
||||
#define UCHAR uint8_t
|
||||
#define BOOL int
|
||||
|
||||
#define ULONG uint32_t
|
||||
#define USHORT uint16_t
|
||||
#define UCHAR uint8_t
|
||||
#define BOOL int
|
||||
|
||||
/* defines max and min */
|
||||
|
||||
#ifndef max
|
||||
#define max(a,b) (a)>(b) ? (a) : (b)
|
||||
#define max(a, b) (a) > (b) ? (a) : (b)
|
||||
#endif
|
||||
#ifndef min
|
||||
#define min(a,b) (a)<(b) ? (a) : (b)
|
||||
#define min(a, b) (a) < (b) ? (a) : (b)
|
||||
#endif
|
||||
|
||||
|
||||
/* (*byte) to (*short) and (*byte) to (*long) conversion */
|
||||
|
||||
#define Short(p) ((p)[0]<<8 | (p)[1])
|
||||
#define Long(p) (Short(p)<<16 | Short(p+2))
|
||||
|
||||
#define Short(p) ((p)[0] << 8 | (p)[1])
|
||||
#define Long(p) (Short(p) << 16 | Short(p + 2))
|
||||
|
||||
/* swap short and swap long macros for little endian machines */
|
||||
|
||||
#define swapShort(p) ((p)[0]<<8 | (p)[1])
|
||||
#define swapLong(p) (swapShort(p)<<16 | swapShort(p+2))
|
||||
|
||||
|
||||
#define swapShort(p) ((p)[0] << 8 | (p)[1])
|
||||
#define swapLong(p) (swapShort(p) << 16 | swapShort(p + 2))
|
||||
|
||||
#endif /* _ADF_DEFS_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -26,45 +26,54 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"adf_str.h"
|
||||
#include"adf_err.h"
|
||||
#include"adf_defs.h"
|
||||
#include "adf_str.h"
|
||||
#include "adf_err.h"
|
||||
#include "adf_defs.h"
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
PREFIX RETCODE adfToRootDir(struct Volume *vol);
|
||||
BOOL isDirEmpty(struct bDirBlock *dir);
|
||||
PREFIX RETCODE adfRemoveEntry(struct Volume *vol, SECTNUM pSect, char *name);
|
||||
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect );
|
||||
PREFIX struct List* adfGetRDirEnt(struct Volume* vol, SECTNUM nSect, BOOL recurs );
|
||||
PREFIX RETCODE adfToRootDir(struct Volume* vol);
|
||||
BOOL isDirEmpty(struct bDirBlock* dir);
|
||||
PREFIX RETCODE adfRemoveEntry(struct Volume* vol, SECTNUM pSect, char* name);
|
||||
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect);
|
||||
PREFIX struct List* adfGetRDirEnt(
|
||||
struct Volume* vol, SECTNUM nSect, BOOL recurs);
|
||||
PREFIX void adfFreeDirList(struct List* list);
|
||||
|
||||
RETCODE adfEntBlock2Entry(struct bEntryBlock *entryBlk, struct Entry *entry);
|
||||
PREFIX void adfFreeEntry(struct Entry *entry);
|
||||
RETCODE adfCreateFile(struct Volume* vol, SECTNUM parent, char *name,
|
||||
struct bFileHeaderBlock *fhdr);
|
||||
RETCODE adfEntBlock2Entry(struct bEntryBlock* entryBlk, struct Entry* entry);
|
||||
PREFIX void adfFreeEntry(struct Entry* entry);
|
||||
RETCODE adfCreateFile(struct Volume* vol,
|
||||
SECTNUM parent,
|
||||
char* name,
|
||||
struct bFileHeaderBlock* fhdr);
|
||||
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
|
||||
SECTNUM adfCreateEntry(struct Volume *vol, struct bEntryBlock *dir, char *name, SECTNUM );
|
||||
PREFIX RETCODE adfRenameEntry(struct Volume *vol, SECTNUM, char *old,SECTNUM,char *new);
|
||||
SECTNUM adfCreateEntry(
|
||||
struct Volume* vol, struct bEntryBlock* dir, char* name, SECTNUM);
|
||||
PREFIX RETCODE adfRenameEntry(
|
||||
struct Volume* vol, SECTNUM, char* old, SECTNUM, char* new);
|
||||
|
||||
|
||||
RETCODE adfReadEntryBlock(struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
|
||||
RETCODE adfWriteDirBlock(struct Volume* vol, SECTNUM nSect, struct bDirBlock *dir);
|
||||
RETCODE adfWriteEntryBlock(struct Volume* vol, SECTNUM nSect, struct bEntryBlock *ent);
|
||||
RETCODE adfReadEntryBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
|
||||
RETCODE adfWriteDirBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bDirBlock* dir);
|
||||
RETCODE adfWriteEntryBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
|
||||
|
||||
char* adfAccess2String(int32_t acc);
|
||||
uint8_t adfIntlToUpper(uint8_t c);
|
||||
int adfGetHashValue(uint8_t *name, BOOL intl);
|
||||
void myToUpper( uint8_t *ostr, uint8_t *nstr, int,BOOL intl );
|
||||
PREFIX RETCODE adfChangeDir(struct Volume* vol, char *name);
|
||||
int adfGetHashValue(uint8_t* name, BOOL intl);
|
||||
void myToUpper(uint8_t* ostr, uint8_t* nstr, int, BOOL intl);
|
||||
PREFIX RETCODE adfChangeDir(struct Volume* vol, char* name);
|
||||
PREFIX RETCODE adfParentDir(struct Volume* vol);
|
||||
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
|
||||
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
|
||||
SECTNUM adfNameToEntryBlk(struct Volume *vol, int32_t ht[], char* name,
|
||||
struct bEntryBlock *entry, SECTNUM *);
|
||||
SECTNUM adfNameToEntryBlk(struct Volume* vol,
|
||||
int32_t ht[],
|
||||
char* name,
|
||||
struct bEntryBlock* entry,
|
||||
SECTNUM*);
|
||||
|
||||
PREFIX void printEntry(struct Entry* entry);
|
||||
void adfFreeDirList(struct List* list);
|
||||
|
||||
#endif /* ADF_DIR_H */
|
||||
|
||||
|
||||
@@ -31,21 +31,21 @@
|
||||
#include "adf_str.h"
|
||||
#include "adf_defs.h"
|
||||
|
||||
PREFIX RETCODE adfInstallBootBlock(struct Volume *vol,uint8_t*);
|
||||
PREFIX RETCODE adfInstallBootBlock(struct Volume* vol, uint8_t*);
|
||||
|
||||
PREFIX BOOL isSectNumValid(struct Volume *vol, SECTNUM nSect);
|
||||
PREFIX BOOL isSectNumValid(struct Volume* vol, SECTNUM nSect);
|
||||
|
||||
PREFIX struct Volume* adfMount( struct Device *dev, int nPart, BOOL readOnly );
|
||||
PREFIX void adfUnMount(struct Volume *vol);
|
||||
PREFIX void adfVolumeInfo(struct Volume *vol);
|
||||
struct Volume* adfCreateVol( struct Device* dev, int32_t start, int32_t len,
|
||||
char* volName, int volType );
|
||||
PREFIX struct Volume* adfMount(struct Device* dev, int nPart, BOOL readOnly);
|
||||
PREFIX void adfUnMount(struct Volume* vol);
|
||||
PREFIX void adfVolumeInfo(struct Volume* vol);
|
||||
struct Volume* adfCreateVol(
|
||||
struct Device* dev, int32_t start, int32_t len, char* volName, int volType);
|
||||
|
||||
/*void adfReadBitmap(struct Volume* , int32_t nBlock, struct bRootBlock* root);
|
||||
void adfUpdateBitmap(struct Volume*);
|
||||
*/
|
||||
PREFIX RETCODE adfReadBlock(struct Volume* , int32_t nSect, uint8_t* buf);
|
||||
PREFIX RETCODE adfWriteBlock(struct Volume* , int32_t nSect, uint8_t* buf);
|
||||
PREFIX RETCODE adfReadBlock(struct Volume*, int32_t nSect, uint8_t* buf);
|
||||
PREFIX RETCODE adfWriteBlock(struct Volume*, int32_t nSect, uint8_t* buf);
|
||||
|
||||
#endif /* _ADF_DISK_H */
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* adf_dump.h
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*
|
||||
* This file is part of ADFLib.
|
||||
*
|
||||
* ADFLib is free software; you can redistribute it and/or modify
|
||||
@@ -26,14 +26,13 @@
|
||||
*
|
||||
*/
|
||||
|
||||
PREFIX struct Device*
|
||||
adfCreateDumpDevice(char* filename, int32_t cyl, int32_t heads, int32_t sec);
|
||||
PREFIX struct Device* adfCreateDumpDevice(
|
||||
char* filename, int32_t cyl, int32_t heads, int32_t sec);
|
||||
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
|
||||
BOOL adfInitDumpDevice(struct Device* dev, char* name,BOOL);
|
||||
BOOL adfReadDumpSector(struct Device *dev, int32_t n, int size, uint8_t* buf);
|
||||
BOOL adfWriteDumpSector(struct Device *dev, int32_t n, int size, uint8_t* buf);
|
||||
RETCODE adfReleaseDumpDevice(struct Device *dev);
|
||||
|
||||
BOOL adfInitDumpDevice(struct Device* dev, char* name, BOOL);
|
||||
BOOL adfReadDumpSector(struct Device* dev, int32_t n, int size, uint8_t* buf);
|
||||
BOOL adfWriteDumpSector(struct Device* dev, int32_t n, int size, uint8_t* buf);
|
||||
RETCODE adfReleaseDumpDevice(struct Device* dev);
|
||||
|
||||
#endif /* ADF_DUMP_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* adf_env.h
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*
|
||||
* This file is part of ADFLib.
|
||||
*
|
||||
* ADFLib is free software; you can redistribute it and/or modify
|
||||
@@ -26,13 +26,15 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
PREFIX void adfEnvInitDefault();
|
||||
PREFIX void adfSetEnvFct( void(*e)(char*), void(*w)(char*), void(*v)(char*),
|
||||
void(*n)(SECTNUM,int) );
|
||||
PREFIX void adfSetEnvFct(void (*e)(char*),
|
||||
void (*w)(char*),
|
||||
void (*v)(char*),
|
||||
void (*n)(SECTNUM, int));
|
||||
PREFIX void adfEnvCleanUp();
|
||||
PREFIX void adfChgEnvProp(int prop, void *new);
|
||||
PREFIX void adfChgEnvProp(int prop, void* new);
|
||||
PREFIX char* adfGetVersionNumber();
|
||||
PREFIX char* adfGetVersionDate();
|
||||
|
||||
|
||||
@@ -26,39 +26,36 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#define hasRC(rc, c) ((rc) & (c))
|
||||
|
||||
#define hasRC(rc,c) ((rc)&(c))
|
||||
#define RC_OK 0
|
||||
#define RC_ERROR -1
|
||||
|
||||
#define RC_OK 0
|
||||
#define RC_ERROR -1
|
||||
#define RC_MALLOC 1
|
||||
#define RC_VOLFULL 2
|
||||
|
||||
#define RC_MALLOC 1
|
||||
#define RC_VOLFULL 2
|
||||
|
||||
|
||||
#define RC_FOPEN 1<<10
|
||||
#define RC_NULLPTR 1<<12
|
||||
#define RC_FOPEN 1 << 10
|
||||
#define RC_NULLPTR 1 << 12
|
||||
|
||||
/* adfRead*Block() */
|
||||
|
||||
#define RC_BLOCKTYPE 1
|
||||
#define RC_BLOCKSTYPE 1<<1
|
||||
#define RC_BLOCKSUM 1<<2
|
||||
#define RC_HEADERKEY 1<<3
|
||||
#define RC_BLOCKREAD 1<<4
|
||||
#define RC_BLOCKTYPE 1
|
||||
#define RC_BLOCKSTYPE 1 << 1
|
||||
#define RC_BLOCKSUM 1 << 2
|
||||
#define RC_HEADERKEY 1 << 3
|
||||
#define RC_BLOCKREAD 1 << 4
|
||||
|
||||
/* adfWrite*Block */
|
||||
#define RC_BLOCKWRITE 1<<4
|
||||
|
||||
#define RC_BLOCKWRITE 1 << 4
|
||||
|
||||
/* adfReadBlock() */
|
||||
#define RC_BLOCKOUTOFRANGE 1
|
||||
#define RC_BLOCKNATREAD 1<<1
|
||||
#define RC_BLOCKOUTOFRANGE 1
|
||||
#define RC_BLOCKNATREAD 1 << 1
|
||||
|
||||
/* adfWriteBlock() */
|
||||
/* RC_BLOCKOUTOFRANGE */
|
||||
#define RC_BLOCKNATWRITE 1<<1
|
||||
#define RC_BLOCKREADONLY 1<<2
|
||||
#define RC_BLOCKNATWRITE 1 << 1
|
||||
#define RC_BLOCKREADONLY 1 << 2
|
||||
|
||||
/* adfInitDumpDevice() */
|
||||
/* RC_FOPEN */
|
||||
@@ -66,17 +63,16 @@
|
||||
|
||||
/* adfNativeReadBlock(), adfReadDumpSector() */
|
||||
|
||||
#define RC_BLOCKSHORTREAD 1
|
||||
#define RC_BLOCKFSEEK 1<<1
|
||||
#define RC_BLOCKSHORTREAD 1
|
||||
#define RC_BLOCKFSEEK 1 << 1
|
||||
|
||||
/* adfNativeWriteBlock(), adfWriteDumpSector() */
|
||||
|
||||
#define RC_BLOCKSHORTWRITE 1
|
||||
#define RC_BLOCKSHORTWRITE 1
|
||||
/* RC_BLOCKFSEEK */
|
||||
|
||||
|
||||
/*-- adfReadRDSKblock --*/
|
||||
#define RC_BLOCKID 1<<5
|
||||
#define RC_BLOCKID 1 << 5
|
||||
|
||||
/*-- adfWriteRDSKblock() --*/
|
||||
/*RC_BLOCKREADONLY*/
|
||||
|
||||
@@ -26,35 +26,40 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
#include"adf_str.h"
|
||||
#include "adf_str.h"
|
||||
|
||||
RETCODE adfGetFileBlocks(struct Volume* vol, struct bFileHeaderBlock* entry,
|
||||
struct FileBlocks* );
|
||||
RETCODE adfFreeFileBlocks(struct Volume* vol, struct bFileHeaderBlock *entry);
|
||||
PREFIX int32_t adfFileRealSize(uint32_t size, int blockSize, int32_t *dataN, int32_t *extN);
|
||||
RETCODE adfGetFileBlocks(
|
||||
struct Volume* vol, struct bFileHeaderBlock* entry, struct FileBlocks*);
|
||||
RETCODE adfFreeFileBlocks(struct Volume* vol, struct bFileHeaderBlock* entry);
|
||||
PREFIX int32_t adfFileRealSize(
|
||||
uint32_t size, int blockSize, int32_t* dataN, int32_t* extN);
|
||||
|
||||
int32_t adfPos2DataBlock(int32_t pos, int blockSize, int *posInExtBlk, int *posInDataBlk, int32_t *curDataN );
|
||||
int32_t adfPos2DataBlock(int32_t pos,
|
||||
int blockSize,
|
||||
int* posInExtBlk,
|
||||
int* posInDataBlk,
|
||||
int32_t* curDataN);
|
||||
|
||||
RETCODE adfWriteFileHdrBlock(struct Volume *vol, SECTNUM nSect, struct bFileHeaderBlock* fhdr);
|
||||
RETCODE adfWriteFileHdrBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bFileHeaderBlock* fhdr);
|
||||
|
||||
RETCODE adfReadDataBlock(struct Volume *vol, SECTNUM nSect, void *data);
|
||||
RETCODE adfWriteDataBlock(struct Volume *vol, SECTNUM nSect, void *data);
|
||||
RETCODE adfReadFileExtBlock(struct Volume *vol, SECTNUM nSect, struct bFileExtBlock* fext);
|
||||
RETCODE adfWriteFileExtBlock(struct Volume *vol, SECTNUM nSect, struct bFileExtBlock* fext);
|
||||
RETCODE adfReadDataBlock(struct Volume* vol, SECTNUM nSect, void* data);
|
||||
RETCODE adfWriteDataBlock(struct Volume* vol, SECTNUM nSect, void* data);
|
||||
RETCODE adfReadFileExtBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bFileExtBlock* fext);
|
||||
RETCODE adfWriteFileExtBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct bFileExtBlock* fext);
|
||||
|
||||
PREFIX struct File* adfOpenFile(struct Volume *vol, char* name, char *mode);
|
||||
PREFIX void adfCloseFile(struct File *file);
|
||||
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t *buffer);
|
||||
PREFIX struct File* adfOpenFile(struct Volume* vol, char* name, char* mode);
|
||||
PREFIX void adfCloseFile(struct File* file);
|
||||
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t* buffer);
|
||||
PREFIX BOOL adfEndOfFile(struct File* file);
|
||||
PREFIX void adfFileSeek(struct File *file, uint32_t pos); /* BV */
|
||||
PREFIX void adfFileSeek(struct File* file, uint32_t pos); /* BV */
|
||||
RETCODE adfReadNextFileBlock(struct File* file);
|
||||
PREFIX int32_t adfWriteFile(struct File *file, int32_t n, uint8_t *buffer);
|
||||
PREFIX int32_t adfWriteFile(struct File* file, int32_t n, uint8_t* buffer);
|
||||
SECTNUM adfCreateNextFileBlock(struct File* file);
|
||||
PREFIX void adfFlushFile(struct File *file);
|
||||
|
||||
|
||||
PREFIX void adfFlushFile(struct File* file);
|
||||
|
||||
#endif /* ADF_FILE_H */
|
||||
|
||||
|
||||
@@ -28,38 +28,48 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
#include "adf_str.h"
|
||||
#include "hd_blk.h"
|
||||
#include "adf_err.h"
|
||||
|
||||
int adfDevType(struct Device *dev);
|
||||
PREFIX void adfDeviceInfo(struct Device *dev);
|
||||
int adfDevType(struct Device* dev);
|
||||
PREFIX void adfDeviceInfo(struct Device* dev);
|
||||
|
||||
RETCODE adfMountHd(struct Device *dev);
|
||||
RETCODE adfMountHd(struct Device* dev);
|
||||
RETCODE adfMountFlop(struct Device* dev);
|
||||
PREFIX struct Device* adfMountDev( char* filename,BOOL);
|
||||
PREFIX void adfUnMountDev( struct Device* dev);
|
||||
PREFIX struct Device* adfMountDev(char* filename, BOOL);
|
||||
PREFIX void adfUnMountDev(struct Device* dev);
|
||||
|
||||
RETCODE adfCreateHdHeader(struct Device* dev, int n, struct Partition** partList );
|
||||
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType );
|
||||
PREFIX RETCODE adfCreateHd(struct Device* dev, int n, struct Partition** partList );
|
||||
RETCODE adfCreateHdHeader(
|
||||
struct Device* dev, int n, struct Partition** partList);
|
||||
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType);
|
||||
PREFIX RETCODE adfCreateHd(
|
||||
struct Device* dev, int n, struct Partition** partList);
|
||||
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
|
||||
|
||||
struct Device* adfCreateDev(char* filename, int32_t cylinders, int32_t heads, int32_t sectors);
|
||||
|
||||
RETCODE adfReadBlockDev( struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf );
|
||||
RETCODE adfWriteBlockDev(struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf );
|
||||
RETCODE adfReadRDSKblock( struct Device* dev, struct bRDSKblock* blk );
|
||||
RETCODE adfWriteRDSKblock(struct Device *dev, struct bRDSKblock* rdsk);
|
||||
RETCODE adfReadPARTblock( struct Device* dev, int32_t nSect, struct bPARTblock* blk );
|
||||
RETCODE adfWritePARTblock(struct Device *dev, int32_t nSect, struct bPARTblock* part);
|
||||
RETCODE adfReadFSHDblock( struct Device* dev, int32_t nSect, struct bFSHDblock* blk);
|
||||
RETCODE adfWriteFSHDblock(struct Device *dev, int32_t nSect, struct bFSHDblock* fshd);
|
||||
RETCODE adfReadLSEGblock(struct Device* dev, int32_t nSect, struct bLSEGblock* blk);
|
||||
RETCODE adfWriteLSEGblock(struct Device *dev, int32_t nSect, struct bLSEGblock* lseg);
|
||||
struct Device* adfCreateDev(
|
||||
char* filename, int32_t cylinders, int32_t heads, int32_t sectors);
|
||||
|
||||
RETCODE adfReadBlockDev(
|
||||
struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf);
|
||||
RETCODE adfWriteBlockDev(
|
||||
struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf);
|
||||
RETCODE adfReadRDSKblock(struct Device* dev, struct bRDSKblock* blk);
|
||||
RETCODE adfWriteRDSKblock(struct Device* dev, struct bRDSKblock* rdsk);
|
||||
RETCODE adfReadPARTblock(
|
||||
struct Device* dev, int32_t nSect, struct bPARTblock* blk);
|
||||
RETCODE adfWritePARTblock(
|
||||
struct Device* dev, int32_t nSect, struct bPARTblock* part);
|
||||
RETCODE adfReadFSHDblock(
|
||||
struct Device* dev, int32_t nSect, struct bFSHDblock* blk);
|
||||
RETCODE adfWriteFSHDblock(
|
||||
struct Device* dev, int32_t nSect, struct bFSHDblock* fshd);
|
||||
RETCODE adfReadLSEGblock(
|
||||
struct Device* dev, int32_t nSect, struct bLSEGblock* blk);
|
||||
RETCODE adfWriteLSEGblock(
|
||||
struct Device* dev, int32_t nSect, struct bLSEGblock* lseg);
|
||||
|
||||
#endif /* _ADF_HD_H */
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
* adf_link.h
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*
|
||||
* This file is part of ADFLib.
|
||||
*
|
||||
* ADFLib is free software; you can redistribute it and/or modify
|
||||
@@ -26,11 +26,13 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
#include <stdint.h>
|
||||
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume *vol, SECTNUM nSect, SECTNUM lPar,
|
||||
char **name, int32_t *size);
|
||||
|
||||
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume* vol,
|
||||
SECTNUM nSect,
|
||||
SECTNUM lPar,
|
||||
char** name,
|
||||
int32_t* size);
|
||||
|
||||
#endif /* ADF_LINK_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -30,38 +30,40 @@
|
||||
|
||||
#include "adf_str.h"
|
||||
|
||||
#define SW_LONG 4
|
||||
#define SW_LONG 4
|
||||
#define SW_SHORT 2
|
||||
#define SW_CHAR 1
|
||||
#define SW_CHAR 1
|
||||
|
||||
#define MAX_SWTYPE 11
|
||||
|
||||
#define SWBL_BOOT 0
|
||||
#define SWBL_ROOT 1
|
||||
#define SWBL_DATA 2
|
||||
#define SWBL_FILE 3
|
||||
#define SWBL_ENTRY 3
|
||||
#define SWBL_DIR 3
|
||||
#define SWBL_CACHE 4
|
||||
#define SWBL_BITMAP 5
|
||||
#define SWBL_FEXT 5
|
||||
#define SWBL_LINK 6
|
||||
#define SWBL_BITMAPE 5
|
||||
#define SWBL_RDSK 7
|
||||
#define SWBL_BADB 8
|
||||
#define SWBL_PART 9
|
||||
#define SWBL_FSHD 10
|
||||
#define SWBL_LSEG 11
|
||||
#define SWBL_BOOT 0
|
||||
#define SWBL_ROOT 1
|
||||
#define SWBL_DATA 2
|
||||
#define SWBL_FILE 3
|
||||
#define SWBL_ENTRY 3
|
||||
#define SWBL_DIR 3
|
||||
#define SWBL_CACHE 4
|
||||
#define SWBL_BITMAP 5
|
||||
#define SWBL_FEXT 5
|
||||
#define SWBL_LINK 6
|
||||
#define SWBL_BITMAPE 5
|
||||
#define SWBL_RDSK 7
|
||||
#define SWBL_BADB 8
|
||||
#define SWBL_PART 9
|
||||
#define SWBL_FSHD 10
|
||||
#define SWBL_LSEG 11
|
||||
|
||||
RETCODE adfReadRootBlock(struct Volume*, int32_t nSect, struct bRootBlock* root);
|
||||
RETCODE adfWriteRootBlock(struct Volume* vol, int32_t nSect, struct bRootBlock* root);
|
||||
RETCODE adfReadRootBlock(
|
||||
struct Volume*, int32_t nSect, struct bRootBlock* root);
|
||||
RETCODE adfWriteRootBlock(
|
||||
struct Volume* vol, int32_t nSect, struct bRootBlock* root);
|
||||
RETCODE adfReadBootBlock(struct Volume*, struct bBootBlock* boot);
|
||||
RETCODE adfWriteBootBlock(struct Volume* vol, struct bBootBlock* boot);
|
||||
|
||||
uint32_t adfBootSum(uint8_t *buf);
|
||||
uint32_t adfNormalSum( uint8_t *buf, int offset, int bufLen );
|
||||
uint32_t adfBootSum(uint8_t* buf);
|
||||
uint32_t adfNormalSum(uint8_t* buf, int offset, int bufLen);
|
||||
|
||||
void swapEndian( uint8_t *buf, int type );
|
||||
void swapEndian(uint8_t* buf, int type);
|
||||
|
||||
#endif /* _ADF_RAW_H */
|
||||
|
||||
|
||||
@@ -26,17 +26,16 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
#include "adf_str.h"
|
||||
|
||||
RETCODE adfReadGenBlock(struct Volume *vol, SECTNUM nSect, struct GenBlock *block);
|
||||
RETCODE adfReadGenBlock(
|
||||
struct Volume* vol, SECTNUM nSect, struct GenBlock* block);
|
||||
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
|
||||
PREFIX RETCODE adfUndelEntry(struct Volume* vol, SECTNUM parent, SECTNUM nSect);
|
||||
PREFIX struct List* adfGetDelEnt(struct Volume *vol);
|
||||
PREFIX struct List* adfGetDelEnt(struct Volume* vol);
|
||||
PREFIX void adfFreeDelList(struct List* list);
|
||||
|
||||
|
||||
/*##########################################################################*/
|
||||
#endif /* _ADF_SALV_H */
|
||||
|
||||
|
||||
@@ -28,41 +28,43 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include<stdio.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include"adf_defs.h"
|
||||
#include"adf_blk.h"
|
||||
#include"adf_err.h"
|
||||
#include "adf_defs.h"
|
||||
#include "adf_blk.h"
|
||||
#include "adf_err.h"
|
||||
|
||||
/* ----- VOLUME ----- */
|
||||
|
||||
struct Volume {
|
||||
struct Volume
|
||||
{
|
||||
struct Device* dev;
|
||||
|
||||
SECTNUM firstBlock; /* first block of data area (from beginning of device) */
|
||||
SECTNUM lastBlock; /* last block of data area (from beginning of device) */
|
||||
SECTNUM rootBlock; /* root block (from firstBlock) */
|
||||
SECTNUM
|
||||
firstBlock; /* first block of data area (from beginning of device) */
|
||||
SECTNUM lastBlock; /* last block of data area (from beginning of device) */
|
||||
SECTNUM rootBlock; /* root block (from firstBlock) */
|
||||
|
||||
char dosType; /* FFS/OFS, DIRCACHE, INTERNATIONAL */
|
||||
char dosType; /* FFS/OFS, DIRCACHE, INTERNATIONAL */
|
||||
BOOL bootCode;
|
||||
BOOL readOnly;
|
||||
int datablockSize; /* 488 or 512 */
|
||||
int blockSize; /* 512 */
|
||||
int datablockSize; /* 488 or 512 */
|
||||
int blockSize; /* 512 */
|
||||
|
||||
char *volName;
|
||||
char* volName;
|
||||
|
||||
BOOL mounted;
|
||||
|
||||
int32_t bitmapSize; /* in blocks */
|
||||
SECTNUM *bitmapBlocks; /* bitmap blocks pointers */
|
||||
struct bBitmapBlock **bitmapTable;
|
||||
BOOL *bitmapBlocksChg;
|
||||
int32_t bitmapSize; /* in blocks */
|
||||
SECTNUM* bitmapBlocks; /* bitmap blocks pointers */
|
||||
struct bBitmapBlock** bitmapTable;
|
||||
BOOL* bitmapBlocksChg;
|
||||
|
||||
SECTNUM curDirPtr;
|
||||
};
|
||||
|
||||
|
||||
struct Partition {
|
||||
struct Partition
|
||||
{
|
||||
int32_t startCyl;
|
||||
int32_t lenCyl;
|
||||
char* volName;
|
||||
@@ -71,35 +73,36 @@ struct Partition {
|
||||
|
||||
/* ----- DEVICES ----- */
|
||||
|
||||
#define DEVTYPE_FLOPDD 1
|
||||
#define DEVTYPE_FLOPHD 2
|
||||
#define DEVTYPE_HARDDISK 3
|
||||
#define DEVTYPE_HARDFILE 4
|
||||
#define DEVTYPE_FLOPDD 1
|
||||
#define DEVTYPE_FLOPHD 2
|
||||
#define DEVTYPE_HARDDISK 3
|
||||
#define DEVTYPE_HARDFILE 4
|
||||
|
||||
struct Device {
|
||||
int devType; /* see below */
|
||||
struct Device
|
||||
{
|
||||
int devType; /* see below */
|
||||
BOOL readOnly;
|
||||
int32_t size; /* in bytes */
|
||||
int32_t size; /* in bytes */
|
||||
|
||||
int nVol; /* partitions */
|
||||
struct Volume** volList;
|
||||
|
||||
int32_t cylinders; /* geometry */
|
||||
int nVol; /* partitions */
|
||||
struct Volume** volList;
|
||||
|
||||
int32_t cylinders; /* geometry */
|
||||
int32_t heads;
|
||||
int32_t sectors;
|
||||
|
||||
BOOL isNativeDev;
|
||||
void *nativeDev;
|
||||
void* nativeDev;
|
||||
};
|
||||
|
||||
|
||||
/* ----- FILE ----- */
|
||||
|
||||
struct File {
|
||||
struct Volume *volume;
|
||||
struct File
|
||||
{
|
||||
struct Volume* volume;
|
||||
|
||||
struct bFileHeaderBlock* fileHdr;
|
||||
void *currentData;
|
||||
void* currentData;
|
||||
struct bFileExtBlock* currentExt;
|
||||
|
||||
int32_t nDataBlock;
|
||||
@@ -109,12 +112,12 @@ struct File {
|
||||
int posInDataBlk;
|
||||
int posInExtBlk;
|
||||
BOOL eof, writeMode;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
/* ----- ENTRY ---- */
|
||||
|
||||
struct Entry{
|
||||
struct Entry
|
||||
{
|
||||
int type;
|
||||
char* name;
|
||||
SECTNUM sector;
|
||||
@@ -127,72 +130,72 @@ struct Entry{
|
||||
int hour, mins, secs;
|
||||
};
|
||||
|
||||
struct CacheEntry{
|
||||
struct CacheEntry
|
||||
{
|
||||
int32_t header, size, protect;
|
||||
short days, mins, ticks;
|
||||
signed char type;
|
||||
char nLen, cLen;
|
||||
char name[MAXNAMELEN+1], comm[MAXCMMTLEN+1];
|
||||
/* char *name, *comm;*/
|
||||
|
||||
char name[MAXNAMELEN + 1], comm[MAXCMMTLEN + 1];
|
||||
/* char *name, *comm;*/
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
struct DateTime{
|
||||
int year,mon,day,hour,min,sec;
|
||||
struct DateTime
|
||||
{
|
||||
int year, mon, day, hour, min, sec;
|
||||
};
|
||||
|
||||
/* ----- ENVIRONMENT ----- */
|
||||
|
||||
#define PR_VFCT 1
|
||||
#define PR_WFCT 2
|
||||
#define PR_EFCT 3
|
||||
#define PR_NOTFCT 4
|
||||
#define PR_USEDIRC 5
|
||||
#define PR_USE_NOTFCT 6
|
||||
#define PR_PROGBAR 7
|
||||
#define PR_USE_PROGBAR 8
|
||||
#define PR_RWACCESS 9
|
||||
#define PR_VFCT 1
|
||||
#define PR_WFCT 2
|
||||
#define PR_EFCT 3
|
||||
#define PR_NOTFCT 4
|
||||
#define PR_USEDIRC 5
|
||||
#define PR_USE_NOTFCT 6
|
||||
#define PR_PROGBAR 7
|
||||
#define PR_USE_PROGBAR 8
|
||||
#define PR_RWACCESS 9
|
||||
#define PR_USE_RWACCESS 10
|
||||
|
||||
struct Env{
|
||||
void (*vFct)(char*); /* verbose callback function */
|
||||
void (*wFct)(char*); /* warning callback function */
|
||||
void (*eFct)(char*); /* error callback function */
|
||||
struct Env
|
||||
{
|
||||
void (*vFct)(char*); /* verbose callback function */
|
||||
void (*wFct)(char*); /* warning callback function */
|
||||
void (*eFct)(char*); /* error callback function */
|
||||
|
||||
void (*notifyFct)(SECTNUM, int);
|
||||
BOOL useNotify;
|
||||
|
||||
void (*rwhAccess)(SECTNUM,SECTNUM,BOOL);
|
||||
void (*rwhAccess)(SECTNUM, SECTNUM, BOOL);
|
||||
BOOL useRWAccess;
|
||||
|
||||
void (*progressBar)(int);
|
||||
BOOL useProgressBar;
|
||||
|
||||
BOOL useDirCache;
|
||||
|
||||
void *nativeFct;
|
||||
|
||||
void* nativeFct;
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct List{ /* generic linked tree */
|
||||
void *content;
|
||||
struct List
|
||||
{ /* generic linked tree */
|
||||
void* content;
|
||||
struct List* subdir;
|
||||
struct List* next;
|
||||
};
|
||||
|
||||
struct GenBlock{
|
||||
struct GenBlock
|
||||
{
|
||||
SECTNUM sect;
|
||||
SECTNUM parent;
|
||||
int type;
|
||||
int secType;
|
||||
char *name; /* if (type == 2 and (secType==2 or secType==-3)) */
|
||||
char* name; /* if (type == 2 and (secType==2 or secType==-3)) */
|
||||
};
|
||||
|
||||
struct FileBlocks{
|
||||
struct FileBlocks
|
||||
{
|
||||
SECTNUM header;
|
||||
int32_t nbExtens;
|
||||
SECTNUM* extens;
|
||||
@@ -200,36 +203,35 @@ struct FileBlocks{
|
||||
SECTNUM* data;
|
||||
};
|
||||
|
||||
struct bEntryBlock {
|
||||
/*000*/ int32_t type; /* T_HEADER == 2 */
|
||||
/*004*/ int32_t headerKey; /* current block number */
|
||||
int32_t r1[3];
|
||||
/*014*/ uint32_t checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE];
|
||||
int32_t r2[2];
|
||||
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
|
||||
/*144*/ int32_t byteSize;
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN+1];
|
||||
char r3[91-(MAXCMMTLEN+1)];
|
||||
/*1a4*/ int32_t days;
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char name[MAXNAMELEN+1];
|
||||
int32_t r4;
|
||||
/*1d4*/ int32_t realEntry;
|
||||
/*1d8*/ int32_t nextLink;
|
||||
int32_t r5[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
/*1f8*/ int32_t extension;
|
||||
/*1fc*/ int32_t secType;
|
||||
};
|
||||
|
||||
struct bEntryBlock
|
||||
{
|
||||
/*000*/ int32_t type; /* T_HEADER == 2 */
|
||||
/*004*/ int32_t headerKey; /* current block number */
|
||||
int32_t r1[3];
|
||||
/*014*/ uint32_t checkSum;
|
||||
/*018*/ int32_t hashTable[HT_SIZE];
|
||||
int32_t r2[2];
|
||||
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
|
||||
/*144*/ int32_t byteSize;
|
||||
/*148*/ char commLen;
|
||||
/*149*/ char comment[MAXCMMTLEN + 1];
|
||||
char r3[91 - (MAXCMMTLEN + 1)];
|
||||
/*1a4*/ int32_t days;
|
||||
/*1a8*/ int32_t mins;
|
||||
/*1ac*/ int32_t ticks;
|
||||
/*1b0*/ char nameLen;
|
||||
/*1b1*/ char name[MAXNAMELEN + 1];
|
||||
int32_t r4;
|
||||
/*1d4*/ int32_t realEntry;
|
||||
/*1d8*/ int32_t nextLink;
|
||||
int32_t r5[5];
|
||||
/*1f0*/ int32_t nextSameHash;
|
||||
/*1f4*/ int32_t parent;
|
||||
/*1f8*/ int32_t extension;
|
||||
/*1fc*/ int32_t secType;
|
||||
};
|
||||
|
||||
#define ENV_DECLARATION struct Env adfEnv
|
||||
|
||||
|
||||
#endif /* _ADF_STR_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -26,25 +26,22 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include"prefix.h"
|
||||
#include "prefix.h"
|
||||
|
||||
#include "adf_str.h"
|
||||
|
||||
|
||||
void swLong(uint8_t* buf, uint32_t val);
|
||||
void swShort(uint8_t* buf, uint16_t val);
|
||||
|
||||
PREFIX struct List* newCell(struct List* list, void* content);
|
||||
PREFIX void freeList(struct List* list);
|
||||
void adfDays2Date(int32_t days, int *yy, int *mm, int *dd);
|
||||
void adfDays2Date(int32_t days, int* yy, int* mm, int* dd);
|
||||
BOOL adfIsLeap(int y);
|
||||
void
|
||||
adfTime2AmigaTime(struct DateTime dt, int32_t *day, int32_t *min, int32_t *ticks );
|
||||
struct DateTime
|
||||
adfGiveCurrentTime( void );
|
||||
void adfTime2AmigaTime(
|
||||
struct DateTime dt, int32_t* day, int32_t* min, int32_t* ticks);
|
||||
struct DateTime adfGiveCurrentTime(void);
|
||||
|
||||
void dumpBlock(uint8_t *buf);
|
||||
void dumpBlock(uint8_t* buf);
|
||||
|
||||
/*##########################################################################*/
|
||||
#endif /* _ADF_UTIL_H */
|
||||
|
||||
|
||||
@@ -29,96 +29,107 @@
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
/* Visual C++ DLL specific, define WIN32DLL or not in the makefile */
|
||||
/* Visual C++ DLL specific, define WIN32DLL or not in the makefile */
|
||||
|
||||
#ifdef WIN32DLL
|
||||
#define PREFIX __declspec(dllimport)
|
||||
#else
|
||||
#define PREFIX
|
||||
#define PREFIX
|
||||
#endif /* WIN32DLL */
|
||||
|
||||
#include "adf_defs.h"
|
||||
#include "adf_str.h"
|
||||
|
||||
/* util */
|
||||
PREFIX struct List* newCell(struct List* list, void* content);
|
||||
PREFIX void freeList(struct List* list);
|
||||
/* util */
|
||||
PREFIX struct List* newCell(struct List* list, void* content);
|
||||
PREFIX void freeList(struct List* list);
|
||||
|
||||
/* dir */
|
||||
PREFIX struct Entry* adfFindEntry(struct Volume *vol, char* name);
|
||||
PREFIX RETCODE adfToRootDir(struct Volume *vol);
|
||||
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
|
||||
PREFIX RETCODE adfChangeDir(struct Volume* vol, char *name);
|
||||
PREFIX RETCODE adfParentDir(struct Volume* vol);
|
||||
PREFIX RETCODE adfRemoveEntry(struct Volume *vol, SECTNUM pSect, char *name);
|
||||
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect );
|
||||
PREFIX struct List* adfGetRDirEnt(struct Volume* vol, SECTNUM nSect, BOOL recurs );
|
||||
PREFIX void printEntry(struct Entry* entry);
|
||||
PREFIX void adfFreeDirList(struct List* list);
|
||||
PREFIX void adfFreeEntry(struct Entry *);
|
||||
PREFIX RETCODE adfRenameEntry(struct Volume *vol, SECTNUM, char *old,SECTNUM,char *pNew); /* BV */
|
||||
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
|
||||
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
|
||||
/* dir */
|
||||
PREFIX struct Entry* adfFindEntry(struct Volume* vol, char* name);
|
||||
PREFIX RETCODE adfToRootDir(struct Volume* vol);
|
||||
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
|
||||
PREFIX RETCODE adfChangeDir(struct Volume* vol, char* name);
|
||||
PREFIX RETCODE adfParentDir(struct Volume* vol);
|
||||
PREFIX RETCODE adfRemoveEntry(
|
||||
struct Volume* vol, SECTNUM pSect, char* name);
|
||||
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect);
|
||||
PREFIX struct List* adfGetRDirEnt(
|
||||
struct Volume* vol, SECTNUM nSect, BOOL recurs);
|
||||
PREFIX void printEntry(struct Entry* entry);
|
||||
PREFIX void adfFreeDirList(struct List* list);
|
||||
PREFIX void adfFreeEntry(struct Entry*);
|
||||
PREFIX RETCODE adfRenameEntry(
|
||||
struct Volume* vol, SECTNUM, char* old, SECTNUM, char* pNew); /* BV */
|
||||
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
|
||||
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
|
||||
|
||||
/* file */
|
||||
PREFIX int32_t adfFileRealSize(uint32_t size, int blockSize, int32_t *dataN, int32_t *extN);
|
||||
PREFIX struct File* adfOpenFile(struct Volume *vol, char* name, char *mode);
|
||||
PREFIX void adfCloseFile(struct File *file);
|
||||
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t *buffer);
|
||||
PREFIX BOOL adfEndOfFile(struct File* file);
|
||||
PREFIX int32_t adfWriteFile(struct File *file, int32_t n, uint8_t *buffer);
|
||||
PREFIX void adfFlushFile(struct File *file);
|
||||
PREFIX void adfFileSeek(struct File *file, uint32_t pos);
|
||||
/* file */
|
||||
PREFIX int32_t adfFileRealSize(
|
||||
uint32_t size, int blockSize, int32_t* dataN, int32_t* extN);
|
||||
PREFIX struct File* adfOpenFile(struct Volume* vol, char* name, char* mode);
|
||||
PREFIX void adfCloseFile(struct File* file);
|
||||
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t* buffer);
|
||||
PREFIX BOOL adfEndOfFile(struct File* file);
|
||||
PREFIX int32_t adfWriteFile(struct File* file, int32_t n, uint8_t* buffer);
|
||||
PREFIX void adfFlushFile(struct File* file);
|
||||
PREFIX void adfFileSeek(struct File* file, uint32_t pos);
|
||||
|
||||
/* volume */
|
||||
PREFIX RETCODE adfInstallBootBlock(struct Volume *vol,uint8_t*);
|
||||
PREFIX struct Volume* adfMount( struct Device *dev, int nPart, BOOL readOnly );
|
||||
PREFIX void adfUnMount(struct Volume *vol);
|
||||
PREFIX void adfVolumeInfo(struct Volume *vol);
|
||||
/* volume */
|
||||
PREFIX RETCODE adfInstallBootBlock(struct Volume* vol, uint8_t*);
|
||||
PREFIX struct Volume* adfMount(
|
||||
struct Device* dev, int nPart, BOOL readOnly);
|
||||
PREFIX void adfUnMount(struct Volume* vol);
|
||||
PREFIX void adfVolumeInfo(struct Volume* vol);
|
||||
|
||||
/* device */
|
||||
PREFIX void adfDeviceInfo(struct Device *dev);
|
||||
PREFIX struct Device* adfMountDev( char* filename,BOOL ro);
|
||||
PREFIX void adfUnMountDev( struct Device* dev);
|
||||
PREFIX RETCODE adfCreateHd(struct Device* dev, int n, struct Partition** partList );
|
||||
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType );
|
||||
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
|
||||
/* device */
|
||||
PREFIX void adfDeviceInfo(struct Device* dev);
|
||||
PREFIX struct Device* adfMountDev(char* filename, BOOL ro);
|
||||
PREFIX void adfUnMountDev(struct Device* dev);
|
||||
PREFIX RETCODE adfCreateHd(
|
||||
struct Device* dev, int n, struct Partition** partList);
|
||||
PREFIX RETCODE adfCreateFlop(
|
||||
struct Device* dev, char* volName, int volType);
|
||||
PREFIX RETCODE adfCreateHdFile(
|
||||
struct Device* dev, char* volName, int volType);
|
||||
|
||||
/* dump device */
|
||||
PREFIX struct Device* adfCreateDumpDevice(char* filename, int32_t cyl, int32_t heads, int32_t sec);
|
||||
/* dump device */
|
||||
PREFIX struct Device* adfCreateDumpDevice(
|
||||
char* filename, int32_t cyl, int32_t heads, int32_t sec);
|
||||
|
||||
/* env */
|
||||
PREFIX void adfEnvInitDefault();
|
||||
PREFIX void adfEnvCleanUp();
|
||||
PREFIX void adfChgEnvProp(int prop, void *pNew); /* BV */
|
||||
PREFIX char* adfGetVersionNumber();
|
||||
PREFIX char* adfGetVersionDate();
|
||||
/* obsolete */
|
||||
PREFIX void adfSetEnvFct( void(*e)(char*), void(*w)(char*), void(*v)(char*) );
|
||||
/* env */
|
||||
PREFIX void adfEnvInitDefault();
|
||||
PREFIX void adfEnvCleanUp();
|
||||
PREFIX void adfChgEnvProp(int prop, void* pNew); /* BV */
|
||||
PREFIX char* adfGetVersionNumber();
|
||||
PREFIX char* adfGetVersionDate();
|
||||
/* obsolete */
|
||||
PREFIX void adfSetEnvFct(
|
||||
void (*e)(char*), void (*w)(char*), void (*v)(char*));
|
||||
|
||||
/* link */
|
||||
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume *, SECTNUM, SECTNUM,char **, int32_t *);
|
||||
/* link */
|
||||
PREFIX RETCODE adfBlockPtr2EntryName(
|
||||
struct Volume*, SECTNUM, SECTNUM, char**, int32_t*);
|
||||
|
||||
/* salv */
|
||||
PREFIX struct List* adfGetDelEnt(struct Volume *vol);
|
||||
PREFIX RETCODE adfUndelEntry(struct Volume* vol, SECTNUM parent, SECTNUM nSect);
|
||||
PREFIX void adfFreeDelList(struct List* list);
|
||||
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
|
||||
/* salv */
|
||||
PREFIX struct List* adfGetDelEnt(struct Volume* vol);
|
||||
PREFIX RETCODE adfUndelEntry(
|
||||
struct Volume* vol, SECTNUM parent, SECTNUM nSect);
|
||||
PREFIX void adfFreeDelList(struct List* list);
|
||||
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
|
||||
|
||||
/* middle level API */
|
||||
/* middle level API */
|
||||
|
||||
PREFIX BOOL isSectNumValid(struct Volume *vol, SECTNUM nSect);
|
||||
PREFIX BOOL isSectNumValid(struct Volume* vol, SECTNUM nSect);
|
||||
|
||||
/* low level API */
|
||||
|
||||
PREFIX RETCODE adfReadBlock(struct Volume* , int32_t nSect, uint8_t* buf);
|
||||
PREFIX RETCODE adfWriteBlock(struct Volume* , int32_t nSect, uint8_t* buf);
|
||||
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
|
||||
/* low level API */
|
||||
|
||||
PREFIX RETCODE adfReadBlock(struct Volume*, int32_t nSect, uint8_t* buf);
|
||||
PREFIX RETCODE adfWriteBlock(struct Volume*, int32_t nSect, uint8_t* buf);
|
||||
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
#include "config.h"
|
||||
|
||||
#ifndef LITT_ENDIAN
|
||||
#if defined(__hppa__) || \
|
||||
defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
|
||||
(defined(__MIPS__) && defined(__MISPEB__)) || \
|
||||
defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
|
||||
defined(__sparc__)
|
||||
#else
|
||||
#define LITT_ENDIAN 1
|
||||
#endif
|
||||
#if defined(__hppa__) || defined(__m68k__) || defined(mc68000) || \
|
||||
defined(_M_M68K) || (defined(__MIPS__) && defined(__MISPEB__)) || \
|
||||
defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
|
||||
defined(__sparc__)
|
||||
#else
|
||||
#define LITT_ENDIAN 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _HD_BLK_H
|
||||
#define _HD_BLK_H 1
|
||||
|
||||
@@ -33,135 +32,134 @@
|
||||
|
||||
/* ------- RDSK ---------*/
|
||||
|
||||
struct bRDSKblock {
|
||||
/*000*/ char id[4]; /* RDSK */
|
||||
/*004*/ int32_t size; /* 64 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t blockSize; /* 512 bytes */
|
||||
/*014*/ int32_t flags; /* 0x17 */
|
||||
/*018*/ int32_t badBlockList;
|
||||
/*01c*/ int32_t partitionList;
|
||||
/*020*/ int32_t fileSysHdrList;
|
||||
/*024*/ int32_t driveInit;
|
||||
/*028*/ int32_t r1[6]; /* -1 */
|
||||
/*040*/ int32_t cylinders;
|
||||
/*044*/ int32_t sectors;
|
||||
/*048*/ int32_t heads;
|
||||
/*04c*/ int32_t interleave;
|
||||
/*050*/ int32_t parkingZone;
|
||||
/*054*/ int32_t r2[3]; /* 0 */
|
||||
/*060*/ int32_t writePreComp;
|
||||
/*064*/ int32_t reducedWrite;
|
||||
/*068*/ int32_t stepRate;
|
||||
/*06c*/ int32_t r3[5]; /* 0 */
|
||||
/*080*/ int32_t rdbBlockLo;
|
||||
/*084*/ int32_t rdbBlockHi;
|
||||
/*088*/ int32_t loCylinder;
|
||||
/*08c*/ int32_t hiCylinder;
|
||||
/*090*/ int32_t cylBlocks;
|
||||
/*094*/ int32_t autoParkSeconds;
|
||||
/*098*/ int32_t highRDSKBlock;
|
||||
/*09c*/ int32_t r4; /* 0 */
|
||||
/*0a0*/ char diskVendor[8];
|
||||
/*0a8*/ char diskProduct[16];
|
||||
/*0b8*/ char diskRevision[4];
|
||||
/*0bc*/ char controllerVendor[8];
|
||||
/*0c4*/ char controllerProduct[16];
|
||||
/*0d4*/ char controllerRevision[4];
|
||||
/*0d8*/ int32_t r5[10]; /* 0 */
|
||||
/*100*/
|
||||
struct bRDSKblock
|
||||
{
|
||||
/*000*/ char id[4]; /* RDSK */
|
||||
/*004*/ int32_t size; /* 64 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t blockSize; /* 512 bytes */
|
||||
/*014*/ int32_t flags; /* 0x17 */
|
||||
/*018*/ int32_t badBlockList;
|
||||
/*01c*/ int32_t partitionList;
|
||||
/*020*/ int32_t fileSysHdrList;
|
||||
/*024*/ int32_t driveInit;
|
||||
/*028*/ int32_t r1[6]; /* -1 */
|
||||
/*040*/ int32_t cylinders;
|
||||
/*044*/ int32_t sectors;
|
||||
/*048*/ int32_t heads;
|
||||
/*04c*/ int32_t interleave;
|
||||
/*050*/ int32_t parkingZone;
|
||||
/*054*/ int32_t r2[3]; /* 0 */
|
||||
/*060*/ int32_t writePreComp;
|
||||
/*064*/ int32_t reducedWrite;
|
||||
/*068*/ int32_t stepRate;
|
||||
/*06c*/ int32_t r3[5]; /* 0 */
|
||||
/*080*/ int32_t rdbBlockLo;
|
||||
/*084*/ int32_t rdbBlockHi;
|
||||
/*088*/ int32_t loCylinder;
|
||||
/*08c*/ int32_t hiCylinder;
|
||||
/*090*/ int32_t cylBlocks;
|
||||
/*094*/ int32_t autoParkSeconds;
|
||||
/*098*/ int32_t highRDSKBlock;
|
||||
/*09c*/ int32_t r4; /* 0 */
|
||||
/*0a0*/ char diskVendor[8];
|
||||
/*0a8*/ char diskProduct[16];
|
||||
/*0b8*/ char diskRevision[4];
|
||||
/*0bc*/ char controllerVendor[8];
|
||||
/*0c4*/ char controllerProduct[16];
|
||||
/*0d4*/ char controllerRevision[4];
|
||||
/*0d8*/ int32_t r5[10]; /* 0 */
|
||||
/*100*/
|
||||
};
|
||||
|
||||
|
||||
struct bBADBentry {
|
||||
/*000*/ int32_t badBlock;
|
||||
/*004*/ int32_t goodBlock;
|
||||
struct bBADBentry
|
||||
{
|
||||
/*000*/ int32_t badBlock;
|
||||
/*004*/ int32_t goodBlock;
|
||||
};
|
||||
|
||||
|
||||
struct bBADBblock {
|
||||
/*000*/ char id[4]; /* BADB */
|
||||
/*004*/ int32_t size; /* 128 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t r1;
|
||||
/*018*/ struct bBADBentry blockPairs[61];
|
||||
struct bBADBblock
|
||||
{
|
||||
/*000*/ char id[4]; /* BADB */
|
||||
/*004*/ int32_t size; /* 128 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t r1;
|
||||
/*018*/ struct bBADBentry blockPairs[61];
|
||||
};
|
||||
|
||||
struct bPARTblock
|
||||
{
|
||||
/*000*/ char id[4]; /* PART */
|
||||
/*004*/ int32_t size; /* 64 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t flags;
|
||||
/*018*/ int32_t r1[2];
|
||||
/*020*/ int32_t devFlags;
|
||||
/*024*/ char nameLen;
|
||||
/*025*/ char name[31];
|
||||
/*044*/ int32_t r2[15];
|
||||
|
||||
|
||||
struct bPARTblock {
|
||||
/*000*/ char id[4]; /* PART */
|
||||
/*004*/ int32_t size; /* 64 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t flags;
|
||||
/*018*/ int32_t r1[2];
|
||||
/*020*/ int32_t devFlags;
|
||||
/*024*/ char nameLen;
|
||||
/*025*/ char name[31];
|
||||
/*044*/ int32_t r2[15];
|
||||
|
||||
/*080*/ int32_t vectorSize; /* often 16 int32_ts */
|
||||
/*084*/ int32_t blockSize; /* 128 int32_ts */
|
||||
/*088*/ int32_t secOrg;
|
||||
/*08c*/ int32_t surfaces;
|
||||
/*090*/ int32_t sectorsPerBlock; /* == 1 */
|
||||
/*094*/ int32_t blocksPerTrack;
|
||||
/*098*/ int32_t dosReserved;
|
||||
/*09c*/ int32_t dosPreAlloc;
|
||||
/*0a0*/ int32_t interleave;
|
||||
/*0a4*/ int32_t lowCyl;
|
||||
/*0a8*/ int32_t highCyl;
|
||||
/*0ac*/ int32_t numBuffer;
|
||||
/*0b0*/ int32_t bufMemType;
|
||||
/*0b4*/ int32_t maxTransfer;
|
||||
/*0b8*/ int32_t mask;
|
||||
/*0bc*/ int32_t bootPri;
|
||||
/*0c0*/ char dosType[4];
|
||||
/*0c4*/ int32_t r3[15];
|
||||
/*080*/ int32_t vectorSize; /* often 16 int32_ts */
|
||||
/*084*/ int32_t blockSize; /* 128 int32_ts */
|
||||
/*088*/ int32_t secOrg;
|
||||
/*08c*/ int32_t surfaces;
|
||||
/*090*/ int32_t sectorsPerBlock; /* == 1 */
|
||||
/*094*/ int32_t blocksPerTrack;
|
||||
/*098*/ int32_t dosReserved;
|
||||
/*09c*/ int32_t dosPreAlloc;
|
||||
/*0a0*/ int32_t interleave;
|
||||
/*0a4*/ int32_t lowCyl;
|
||||
/*0a8*/ int32_t highCyl;
|
||||
/*0ac*/ int32_t numBuffer;
|
||||
/*0b0*/ int32_t bufMemType;
|
||||
/*0b4*/ int32_t maxTransfer;
|
||||
/*0b8*/ int32_t mask;
|
||||
/*0bc*/ int32_t bootPri;
|
||||
/*0c0*/ char dosType[4];
|
||||
/*0c4*/ int32_t r3[15];
|
||||
};
|
||||
|
||||
|
||||
struct bLSEGblock {
|
||||
/*000*/ char id[4]; /* LSEG */
|
||||
/*004*/ int32_t size; /* 128 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ char loadData[123*4];
|
||||
struct bLSEGblock
|
||||
{
|
||||
/*000*/ char id[4]; /* LSEG */
|
||||
/*004*/ int32_t size; /* 128 int32_ts */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ char loadData[123 * 4];
|
||||
};
|
||||
|
||||
struct bFSHDblock
|
||||
{
|
||||
/*000*/ char id[4]; /* FSHD */
|
||||
/*004*/ int32_t size; /* 64 */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t flags;
|
||||
/*018*/ int32_t r1[2];
|
||||
/*020*/ char dosType[4];
|
||||
/*024*/ short majVersion;
|
||||
/*026*/ short minVersion;
|
||||
/*028*/ int32_t patchFlags;
|
||||
|
||||
struct bFSHDblock {
|
||||
/*000*/ char id[4]; /* FSHD */
|
||||
/*004*/ int32_t size; /* 64 */
|
||||
/*008*/ ULONG checksum;
|
||||
/*00c*/ int32_t hostID; /* 7 */
|
||||
/*010*/ int32_t next;
|
||||
/*014*/ int32_t flags;
|
||||
/*018*/ int32_t r1[2];
|
||||
/*020*/ char dosType[4];
|
||||
/*024*/ short majVersion;
|
||||
/*026*/ short minVersion;
|
||||
/*028*/ int32_t patchFlags;
|
||||
|
||||
/*02c*/ int32_t type;
|
||||
/*030*/ int32_t task;
|
||||
/*034*/ int32_t lock;
|
||||
/*038*/ int32_t handler;
|
||||
/*03c*/ int32_t stackSize;
|
||||
/*040*/ int32_t priority;
|
||||
/*044*/ int32_t startup;
|
||||
/*048*/ int32_t segListBlock;
|
||||
/*04c*/ int32_t globalVec;
|
||||
/*050*/ int32_t r2[23];
|
||||
/*0ac*/ int32_t r3[21];
|
||||
/*02c*/ int32_t type;
|
||||
/*030*/ int32_t task;
|
||||
/*034*/ int32_t lock;
|
||||
/*038*/ int32_t handler;
|
||||
/*03c*/ int32_t stackSize;
|
||||
/*040*/ int32_t priority;
|
||||
/*044*/ int32_t startup;
|
||||
/*048*/ int32_t segListBlock;
|
||||
/*04c*/ int32_t globalVec;
|
||||
/*050*/ int32_t r2[23];
|
||||
/*0ac*/ int32_t r3[21];
|
||||
};
|
||||
|
||||
|
||||
#endif /* _HD_BLK_H */
|
||||
/*##########################################################################*/
|
||||
|
||||
@@ -25,12 +25,12 @@
|
||||
* along with Foobar; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
*/
|
||||
|
||||
#ifdef WIN32DLL
|
||||
#define PREFIX __declspec(dllexport)
|
||||
#else
|
||||
#define PREFIX
|
||||
#define PREFIX
|
||||
#endif /* WIN32DLL */
|
||||
|
||||
#endif /* _PREFIX_H */
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#define AGG2D_INCLUDED
|
||||
|
||||
// With this define uncommented you can use floating-point pixel format
|
||||
//#define AGG2D_USE_FLOAT_FORMAT
|
||||
// #define AGG2D_USE_FLOAT_FORMAT
|
||||
|
||||
#include "agg_basics.h"
|
||||
#include "agg_trans_affine.h"
|
||||
@@ -56,37 +56,50 @@ class Agg2D
|
||||
#ifdef AGG2D_USE_FLOAT_FORMAT
|
||||
typedef agg::rgba32 ColorType;
|
||||
#else
|
||||
typedef agg::rgba8 ColorType;
|
||||
typedef agg::rgba8 ColorType;
|
||||
#endif
|
||||
typedef agg::order_bgra ComponentOrder; // Platform dependent!
|
||||
typedef agg::blender_rgba<ColorType, ComponentOrder> Blender;
|
||||
typedef agg::comp_op_adaptor_rgba<ColorType, ComponentOrder> BlenderComp;
|
||||
typedef agg::blender_rgba_pre<ColorType, ComponentOrder> BlenderPre;
|
||||
typedef agg::comp_op_adaptor_rgba_pre<ColorType, ComponentOrder> BlenderCompPre;
|
||||
typedef agg::blender_rgba<ColorType, ComponentOrder> Blender;
|
||||
typedef agg::comp_op_adaptor_rgba<ColorType, ComponentOrder> BlenderComp;
|
||||
typedef agg::blender_rgba_pre<ColorType, ComponentOrder> BlenderPre;
|
||||
typedef agg::comp_op_adaptor_rgba_pre<ColorType, ComponentOrder>
|
||||
BlenderCompPre;
|
||||
|
||||
typedef agg::pixfmt_alpha_blend_rgba<Blender, agg::rendering_buffer> PixFormat;
|
||||
typedef agg::pixfmt_custom_blend_rgba<BlenderComp, agg::rendering_buffer> PixFormatComp;
|
||||
typedef agg::pixfmt_alpha_blend_rgba<BlenderPre, agg::rendering_buffer> PixFormatPre;
|
||||
typedef agg::pixfmt_custom_blend_rgba<BlenderCompPre, agg::rendering_buffer> PixFormatCompPre;
|
||||
typedef agg::pixfmt_alpha_blend_rgba<Blender, agg::rendering_buffer>
|
||||
PixFormat;
|
||||
typedef agg::pixfmt_custom_blend_rgba<BlenderComp, agg::rendering_buffer>
|
||||
PixFormatComp;
|
||||
typedef agg::pixfmt_alpha_blend_rgba<BlenderPre, agg::rendering_buffer>
|
||||
PixFormatPre;
|
||||
typedef agg::pixfmt_custom_blend_rgba<BlenderCompPre, agg::rendering_buffer>
|
||||
PixFormatCompPre;
|
||||
|
||||
typedef agg::renderer_base<PixFormat> RendererBase;
|
||||
typedef agg::renderer_base<PixFormatComp> RendererBaseComp;
|
||||
typedef agg::renderer_base<PixFormatPre> RendererBasePre;
|
||||
typedef agg::renderer_base<PixFormat> RendererBase;
|
||||
typedef agg::renderer_base<PixFormatComp> RendererBaseComp;
|
||||
typedef agg::renderer_base<PixFormatPre> RendererBasePre;
|
||||
typedef agg::renderer_base<PixFormatCompPre> RendererBaseCompPre;
|
||||
|
||||
typedef agg::renderer_scanline_aa_solid<RendererBase> RendererSolid;
|
||||
typedef agg::renderer_scanline_aa_solid<RendererBase> RendererSolid;
|
||||
typedef agg::renderer_scanline_aa_solid<RendererBaseComp> RendererSolidComp;
|
||||
|
||||
typedef agg::span_allocator<ColorType> SpanAllocator;
|
||||
typedef agg::pod_auto_array<ColorType, 256> GradientArray;
|
||||
|
||||
typedef agg::span_gradient<ColorType, agg::span_interpolator_linear<>, agg::gradient_x, GradientArray> LinearGradientSpan;
|
||||
typedef agg::span_gradient<ColorType, agg::span_interpolator_linear<>, agg::gradient_circle, GradientArray> RadialGradientSpan;
|
||||
typedef agg::span_gradient<ColorType,
|
||||
agg::span_interpolator_linear<>,
|
||||
agg::gradient_x,
|
||||
GradientArray>
|
||||
LinearGradientSpan;
|
||||
typedef agg::span_gradient<ColorType,
|
||||
agg::span_interpolator_linear<>,
|
||||
agg::gradient_circle,
|
||||
GradientArray>
|
||||
RadialGradientSpan;
|
||||
|
||||
typedef agg::conv_curve<agg::path_storage> ConvCurve;
|
||||
typedef agg::conv_stroke<ConvCurve> ConvStroke;
|
||||
typedef agg::conv_transform<ConvCurve> PathTransform;
|
||||
typedef agg::conv_transform<ConvStroke> StrokeTransform;
|
||||
typedef agg::conv_curve<agg::path_storage> ConvCurve;
|
||||
typedef agg::conv_stroke<ConvCurve> ConvStroke;
|
||||
typedef agg::conv_transform<ConvCurve> PathTransform;
|
||||
typedef agg::conv_transform<ConvStroke> StrokeTransform;
|
||||
|
||||
enum Gradient
|
||||
{
|
||||
@@ -98,12 +111,12 @@ class Agg2D
|
||||
public:
|
||||
friend class Agg2DRenderer;
|
||||
|
||||
// Use srgba8 as the "user" color type, even though the underlying color type
|
||||
// might be something else, such as rgba32. This allows code based on
|
||||
// Use srgba8 as the "user" color type, even though the underlying color
|
||||
// type might be something else, such as rgba32. This allows code based on
|
||||
// 8-bit sRGB values to carry on working as before.
|
||||
typedef agg::srgba8 Color;
|
||||
typedef agg::rect_i Rect;
|
||||
typedef agg::rect_d RectD;
|
||||
typedef agg::srgba8 Color;
|
||||
typedef agg::rect_i Rect;
|
||||
typedef agg::rect_d RectD;
|
||||
typedef agg::trans_affine Affine;
|
||||
|
||||
enum LineJoin
|
||||
@@ -115,9 +128,9 @@ public:
|
||||
|
||||
enum LineCap
|
||||
{
|
||||
CapButt = agg::butt_cap,
|
||||
CapButt = agg::butt_cap,
|
||||
CapSquare = agg::square_cap,
|
||||
CapRound = agg::round_cap
|
||||
CapRound = agg::round_cap
|
||||
};
|
||||
|
||||
enum TextAlignment
|
||||
@@ -127,7 +140,6 @@ public:
|
||||
AlignCenter,
|
||||
};
|
||||
|
||||
|
||||
enum DrawPathFlag
|
||||
{
|
||||
FillOnly,
|
||||
@@ -155,20 +167,28 @@ public:
|
||||
double affineMatrix[6];
|
||||
};
|
||||
|
||||
|
||||
struct Image
|
||||
{
|
||||
agg::rendering_buffer renBuf;
|
||||
|
||||
Image() {}
|
||||
Image(unsigned char* buf, unsigned width, unsigned height, int stride) :
|
||||
renBuf(buf, width, height, stride) {}
|
||||
void attach(unsigned char* buf, unsigned width, unsigned height, int stride)
|
||||
Image(unsigned char* buf, unsigned width, unsigned height, int stride):
|
||||
renBuf(buf, width, height, stride)
|
||||
{
|
||||
}
|
||||
void attach(
|
||||
unsigned char* buf, unsigned width, unsigned height, int stride)
|
||||
{
|
||||
renBuf.attach(buf, width, height, stride);
|
||||
}
|
||||
int width() const { return renBuf.width(); }
|
||||
int height() const { return renBuf.height(); }
|
||||
int width() const
|
||||
{
|
||||
return renBuf.width();
|
||||
}
|
||||
int height() const
|
||||
{
|
||||
return renBuf.height();
|
||||
}
|
||||
void premultiply();
|
||||
void demultiply();
|
||||
};
|
||||
@@ -202,36 +222,37 @@ public:
|
||||
|
||||
enum BlendMode
|
||||
{
|
||||
BlendAlpha = agg::end_of_comp_op_e,
|
||||
BlendClear = agg::comp_op_clear,
|
||||
BlendSrc = agg::comp_op_src,
|
||||
BlendDst = agg::comp_op_dst,
|
||||
BlendSrcOver = agg::comp_op_src_over,
|
||||
BlendDstOver = agg::comp_op_dst_over,
|
||||
BlendSrcIn = agg::comp_op_src_in,
|
||||
BlendDstIn = agg::comp_op_dst_in,
|
||||
BlendSrcOut = agg::comp_op_src_out,
|
||||
BlendDstOut = agg::comp_op_dst_out,
|
||||
BlendSrcAtop = agg::comp_op_src_atop,
|
||||
BlendDstAtop = agg::comp_op_dst_atop,
|
||||
BlendXor = agg::comp_op_xor,
|
||||
BlendAdd = agg::comp_op_plus,
|
||||
BlendMultiply = agg::comp_op_multiply,
|
||||
BlendScreen = agg::comp_op_screen,
|
||||
BlendOverlay = agg::comp_op_overlay,
|
||||
BlendDarken = agg::comp_op_darken,
|
||||
BlendLighten = agg::comp_op_lighten,
|
||||
BlendAlpha = agg::end_of_comp_op_e,
|
||||
BlendClear = agg::comp_op_clear,
|
||||
BlendSrc = agg::comp_op_src,
|
||||
BlendDst = agg::comp_op_dst,
|
||||
BlendSrcOver = agg::comp_op_src_over,
|
||||
BlendDstOver = agg::comp_op_dst_over,
|
||||
BlendSrcIn = agg::comp_op_src_in,
|
||||
BlendDstIn = agg::comp_op_dst_in,
|
||||
BlendSrcOut = agg::comp_op_src_out,
|
||||
BlendDstOut = agg::comp_op_dst_out,
|
||||
BlendSrcAtop = agg::comp_op_src_atop,
|
||||
BlendDstAtop = agg::comp_op_dst_atop,
|
||||
BlendXor = agg::comp_op_xor,
|
||||
BlendAdd = agg::comp_op_plus,
|
||||
BlendMultiply = agg::comp_op_multiply,
|
||||
BlendScreen = agg::comp_op_screen,
|
||||
BlendOverlay = agg::comp_op_overlay,
|
||||
BlendDarken = agg::comp_op_darken,
|
||||
BlendLighten = agg::comp_op_lighten,
|
||||
BlendColorDodge = agg::comp_op_color_dodge,
|
||||
BlendColorBurn = agg::comp_op_color_burn,
|
||||
BlendHardLight = agg::comp_op_hard_light,
|
||||
BlendSoftLight = agg::comp_op_soft_light,
|
||||
BlendColorBurn = agg::comp_op_color_burn,
|
||||
BlendHardLight = agg::comp_op_hard_light,
|
||||
BlendSoftLight = agg::comp_op_soft_light,
|
||||
BlendDifference = agg::comp_op_difference,
|
||||
BlendExclusion = agg::comp_op_exclusion,
|
||||
BlendExclusion = agg::comp_op_exclusion,
|
||||
};
|
||||
|
||||
enum Direction
|
||||
{
|
||||
CW, CCW
|
||||
CW,
|
||||
CCW
|
||||
};
|
||||
|
||||
~Agg2D();
|
||||
@@ -239,26 +260,27 @@ public:
|
||||
|
||||
// Setup
|
||||
//-----------------------
|
||||
void attach(unsigned char* buf, unsigned width, unsigned height, int stride);
|
||||
void attach(Image& img);
|
||||
void attach(
|
||||
unsigned char* buf, unsigned width, unsigned height, int stride);
|
||||
void attach(Image& img);
|
||||
|
||||
void clipBox(double x1, double y1, double x2, double y2);
|
||||
void clipBox(double x1, double y1, double x2, double y2);
|
||||
RectD clipBox() const;
|
||||
|
||||
void clearAll(Color c);
|
||||
void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255);
|
||||
void clearAll(Color c);
|
||||
void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255);
|
||||
|
||||
void clearClipBox(Color c);
|
||||
void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255);
|
||||
void clearClipBox(Color c);
|
||||
void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255);
|
||||
|
||||
// Conversions
|
||||
//-----------------------
|
||||
void worldToScreen(double& x, double& y) const;
|
||||
void screenToWorld(double& x, double& y) const;
|
||||
void worldToScreen(double& x, double& y) const;
|
||||
void screenToWorld(double& x, double& y) const;
|
||||
double worldToScreen(double scalar) const;
|
||||
double screenToWorld(double scalar) const;
|
||||
void alignPoint(double& x, double& y) const;
|
||||
bool inBox(double worldX, double worldY) const;
|
||||
void alignPoint(double& x, double& y) const;
|
||||
bool inBox(double worldX, double worldY) const;
|
||||
|
||||
// General Attributes
|
||||
//-----------------------
|
||||
@@ -289,14 +311,30 @@ public:
|
||||
Color fillColor() const;
|
||||
Color lineColor() const;
|
||||
|
||||
void fillLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0);
|
||||
void lineLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0);
|
||||
void fillLinearGradient(double x1,
|
||||
double y1,
|
||||
double x2,
|
||||
double y2,
|
||||
Color c1,
|
||||
Color c2,
|
||||
double profile = 1.0);
|
||||
void lineLinearGradient(double x1,
|
||||
double y1,
|
||||
double x2,
|
||||
double y2,
|
||||
Color c1,
|
||||
Color c2,
|
||||
double profile = 1.0);
|
||||
|
||||
void fillRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0);
|
||||
void lineRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0);
|
||||
void fillRadialGradient(
|
||||
double x, double y, double r, Color c1, Color c2, double profile = 1.0);
|
||||
void lineRadialGradient(
|
||||
double x, double y, double r, Color c1, Color c2, double profile = 1.0);
|
||||
|
||||
void fillRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3);
|
||||
void lineRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3);
|
||||
void fillRadialGradient(
|
||||
double x, double y, double r, Color c1, Color c2, Color c3);
|
||||
void lineRadialGradient(
|
||||
double x, double y, double r, Color c1, Color c2, Color c3);
|
||||
|
||||
void fillRadialGradient(double x, double y, double r);
|
||||
void lineRadialGradient(double x, double y, double r);
|
||||
@@ -313,9 +351,12 @@ public:
|
||||
void fillEvenOdd(bool evenOddFlag);
|
||||
bool fillEvenOdd() const;
|
||||
|
||||
void textAlignment(TextAlignment alignment);
|
||||
void textSize(double sizeX, double sizeY);
|
||||
inline void textSize(double size) { textSize(size, size); }
|
||||
void textAlignment(TextAlignment alignment);
|
||||
void textSize(double sizeX, double sizeY);
|
||||
inline void textSize(double size)
|
||||
{
|
||||
textSize(size, size);
|
||||
}
|
||||
|
||||
// Transformations
|
||||
//-----------------------
|
||||
@@ -328,26 +369,54 @@ public:
|
||||
void scale(double sx, double sy);
|
||||
void skew(double sx, double sy);
|
||||
void translate(double x, double y);
|
||||
void parallelogram(double x1, double y1, double x2, double y2, const double* para);
|
||||
void viewport(double worldX1, double worldY1, double worldX2, double worldY2,
|
||||
double screenX1, double screenY1, double screenX2, double screenY2,
|
||||
ViewportOption opt=XMidYMid);
|
||||
void parallelogram(
|
||||
double x1, double y1, double x2, double y2, const double* para);
|
||||
void viewport(double worldX1,
|
||||
double worldY1,
|
||||
double worldX2,
|
||||
double worldY2,
|
||||
double screenX1,
|
||||
double screenY1,
|
||||
double screenX2,
|
||||
double screenY2,
|
||||
ViewportOption opt = XMidYMid);
|
||||
|
||||
// Basic Shapes
|
||||
//-----------------------
|
||||
void line(double x1, double y1, double x2, double y2);
|
||||
void triangle(double x1, double y1, double x2, double y2, double x3, double y3);
|
||||
void triangle(
|
||||
double x1, double y1, double x2, double y2, double x3, double y3);
|
||||
void rectangle(double x1, double y1, double x2, double y2);
|
||||
void roundedRect(double x1, double y1, double x2, double y2, double r);
|
||||
void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry);
|
||||
void roundedRect(double x1, double y1, double x2, double y2,
|
||||
double rxBottom, double ryBottom,
|
||||
double rxTop, double ryTop);
|
||||
void roundedRect(
|
||||
double x1, double y1, double x2, double y2, double rx, double ry);
|
||||
void roundedRect(double x1,
|
||||
double y1,
|
||||
double x2,
|
||||
double y2,
|
||||
double rxBottom,
|
||||
double ryBottom,
|
||||
double rxTop,
|
||||
double ryTop);
|
||||
void ellipse(double cx, double cy, double rx, double ry);
|
||||
void arc(double cx, double cy, double rx, double ry, double start, double sweep);
|
||||
void star(double cx, double cy, double r1, double r2, double startAngle, int numRays);
|
||||
void curve(double x1, double y1, double x2, double y2, double x3, double y3);
|
||||
void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4);
|
||||
void arc(
|
||||
double cx, double cy, double rx, double ry, double start, double sweep);
|
||||
void star(double cx,
|
||||
double cy,
|
||||
double r1,
|
||||
double r2,
|
||||
double startAngle,
|
||||
int numRays);
|
||||
void curve(
|
||||
double x1, double y1, double x2, double y2, double x3, double y3);
|
||||
void curve(double x1,
|
||||
double y1,
|
||||
double x2,
|
||||
double y2,
|
||||
double x3,
|
||||
double y3,
|
||||
double x4,
|
||||
double y4);
|
||||
void polygon(double* xy, int numPoints);
|
||||
void polyline(double* xy, int numPoints);
|
||||
|
||||
@@ -367,47 +436,53 @@ public:
|
||||
void verLineTo(double y);
|
||||
void verLineRel(double dy);
|
||||
|
||||
void arcTo(double rx, double ry,
|
||||
double angle,
|
||||
bool largeArcFlag,
|
||||
bool sweepFlag,
|
||||
double x, double y);
|
||||
void arcTo(double rx,
|
||||
double ry,
|
||||
double angle,
|
||||
bool largeArcFlag,
|
||||
bool sweepFlag,
|
||||
double x,
|
||||
double y);
|
||||
|
||||
void arcRel(double rx, double ry,
|
||||
double angle,
|
||||
bool largeArcFlag,
|
||||
bool sweepFlag,
|
||||
double dx, double dy);
|
||||
void arcRel(double rx,
|
||||
double ry,
|
||||
double angle,
|
||||
bool largeArcFlag,
|
||||
bool sweepFlag,
|
||||
double dx,
|
||||
double dy);
|
||||
|
||||
void quadricCurveTo(double xCtrl, double yCtrl,
|
||||
double xTo, double yTo);
|
||||
void quadricCurveRel(double dxCtrl, double dyCtrl,
|
||||
double dxTo, double dyTo);
|
||||
void quadricCurveTo(double xCtrl, double yCtrl, double xTo, double yTo);
|
||||
void quadricCurveRel(
|
||||
double dxCtrl, double dyCtrl, double dxTo, double dyTo);
|
||||
void quadricCurveTo(double xTo, double yTo);
|
||||
void quadricCurveRel(double dxTo, double dyTo);
|
||||
|
||||
void cubicCurveTo(double xCtrl1, double yCtrl1,
|
||||
double xCtrl2, double yCtrl2,
|
||||
double xTo, double yTo);
|
||||
void cubicCurveTo(double xCtrl1,
|
||||
double yCtrl1,
|
||||
double xCtrl2,
|
||||
double yCtrl2,
|
||||
double xTo,
|
||||
double yTo);
|
||||
|
||||
void cubicCurveRel(double dxCtrl1, double dyCtrl1,
|
||||
double dxCtrl2, double dyCtrl2,
|
||||
double dxTo, double dyTo);
|
||||
void cubicCurveRel(double dxCtrl1,
|
||||
double dyCtrl1,
|
||||
double dxCtrl2,
|
||||
double dyCtrl2,
|
||||
double dxTo,
|
||||
double dyTo);
|
||||
|
||||
void cubicCurveTo(double xCtrl2, double yCtrl2,
|
||||
double xTo, double yTo);
|
||||
void cubicCurveTo(double xCtrl2, double yCtrl2, double xTo, double yTo);
|
||||
|
||||
void cubicCurveRel(double xCtrl2, double yCtrl2,
|
||||
double xTo, double yTo);
|
||||
void cubicCurveRel(double xCtrl2, double yCtrl2, double xTo, double yTo);
|
||||
|
||||
void addEllipse(double cx, double cy, double rx, double ry, Direction dir);
|
||||
void text(double x, double y, const std::string& text);
|
||||
void text(double x, double y, const std::string& text);
|
||||
void closePolygon();
|
||||
|
||||
void drawPath(DrawPathFlag flag = FillAndStroke);
|
||||
void drawPathNoTransform(DrawPathFlag flag = FillAndStroke);
|
||||
|
||||
|
||||
// Image Transformations
|
||||
//-----------------------
|
||||
void imageFilter(ImageFilter f);
|
||||
@@ -417,52 +492,90 @@ public:
|
||||
ImageResample imageResample() const;
|
||||
|
||||
void transformImage(const Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
double dstX1, double dstY1, double dstX2, double dstY2);
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
double dstX1,
|
||||
double dstY1,
|
||||
double dstX2,
|
||||
double dstY2);
|
||||
|
||||
void transformImage(const Image& img,
|
||||
double dstX1, double dstY1, double dstX2, double dstY2);
|
||||
double dstX1,
|
||||
double dstY1,
|
||||
double dstX2,
|
||||
double dstY2);
|
||||
|
||||
void transformImage(const Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
const double* parallelogram);
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
const double* parallelogram);
|
||||
|
||||
void transformImage(const Image& img, const double* parallelogram);
|
||||
|
||||
void transformImagePath(const Image& img,
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
double dstX1,
|
||||
double dstY1,
|
||||
double dstX2,
|
||||
double dstY2);
|
||||
|
||||
void transformImagePath(const Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
double dstX1, double dstY1, double dstX2, double dstY2);
|
||||
double dstX1,
|
||||
double dstY1,
|
||||
double dstX2,
|
||||
double dstY2);
|
||||
|
||||
void transformImagePath(const Image& img,
|
||||
double dstX1, double dstY1, double dstX2, double dstY2);
|
||||
|
||||
void transformImagePath(const Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
const double* parallelogram);
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
const double* parallelogram);
|
||||
|
||||
void transformImagePath(const Image& img, const double* parallelogram);
|
||||
|
||||
|
||||
// Image Blending (no transformations available)
|
||||
void blendImage(Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
double dstX, double dstY, unsigned alpha=255);
|
||||
void blendImage(Image& img, double dstX, double dstY, unsigned alpha=255);
|
||||
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
double dstX,
|
||||
double dstY,
|
||||
unsigned alpha = 255);
|
||||
void blendImage(Image& img, double dstX, double dstY, unsigned alpha = 255);
|
||||
|
||||
// Copy image directly, together with alpha-channel
|
||||
void copyImage(Image& img,
|
||||
int imgX1, int imgY1, int imgX2, int imgY2,
|
||||
double dstX, double dstY);
|
||||
int imgX1,
|
||||
int imgY1,
|
||||
int imgX2,
|
||||
int imgY2,
|
||||
double dstX,
|
||||
double dstY);
|
||||
void copyImage(Image& img, double dstX, double dstY);
|
||||
|
||||
|
||||
// Auxiliary
|
||||
//-----------------------
|
||||
static double pi() { return agg::pi; }
|
||||
static double deg2Rad(double v) { return v * agg::pi / 180.0; }
|
||||
static double rad2Deg(double v) { return v * 180.0 / agg::pi; }
|
||||
static double pi()
|
||||
{
|
||||
return agg::pi;
|
||||
}
|
||||
static double deg2Rad(double v)
|
||||
{
|
||||
return v * agg::pi / 180.0;
|
||||
}
|
||||
static double rad2Deg(double v)
|
||||
{
|
||||
return v * 180.0 / agg::pi;
|
||||
}
|
||||
|
||||
private:
|
||||
void render(bool fillColor);
|
||||
@@ -472,97 +585,94 @@ private:
|
||||
|
||||
void addLine(double x1, double y1, double x2, double y2);
|
||||
void updateRasterizerGamma();
|
||||
void renderImage(const Image& img, int x1, int y1, int x2, int y2, const double* parl);
|
||||
void renderImage(
|
||||
const Image& img, int x1, int y1, int x2, int y2, const double* parl);
|
||||
|
||||
agg::rendering_buffer m_rbuf;
|
||||
PixFormat m_pixFormat;
|
||||
PixFormatComp m_pixFormatComp;
|
||||
PixFormatPre m_pixFormatPre;
|
||||
PixFormatCompPre m_pixFormatCompPre;
|
||||
RendererBase m_renBase;
|
||||
RendererBaseComp m_renBaseComp;
|
||||
RendererBasePre m_renBasePre;
|
||||
RendererBaseCompPre m_renBaseCompPre;
|
||||
RendererSolid m_renSolid;
|
||||
RendererSolidComp m_renSolidComp;
|
||||
agg::rendering_buffer m_rbuf;
|
||||
PixFormat m_pixFormat;
|
||||
PixFormatComp m_pixFormatComp;
|
||||
PixFormatPre m_pixFormatPre;
|
||||
PixFormatCompPre m_pixFormatCompPre;
|
||||
RendererBase m_renBase;
|
||||
RendererBaseComp m_renBaseComp;
|
||||
RendererBasePre m_renBasePre;
|
||||
RendererBaseCompPre m_renBaseCompPre;
|
||||
RendererSolid m_renSolid;
|
||||
RendererSolidComp m_renSolidComp;
|
||||
|
||||
SpanAllocator m_allocator;
|
||||
RectD m_clipBox;
|
||||
SpanAllocator m_allocator;
|
||||
RectD m_clipBox;
|
||||
|
||||
BlendMode m_blendMode;
|
||||
BlendMode m_imageBlendMode;
|
||||
Color m_imageBlendColor;
|
||||
BlendMode m_blendMode;
|
||||
BlendMode m_imageBlendMode;
|
||||
Color m_imageBlendColor;
|
||||
|
||||
agg::scanline_u8 m_scanline;
|
||||
agg::rasterizer_scanline_aa<> m_rasterizer;
|
||||
agg::scanline_u8 m_scanline;
|
||||
agg::rasterizer_scanline_aa<> m_rasterizer;
|
||||
|
||||
double m_masterAlpha;
|
||||
double m_antiAliasGamma;
|
||||
double m_masterAlpha;
|
||||
double m_antiAliasGamma;
|
||||
|
||||
Color m_fillColor;
|
||||
Color m_lineColor;
|
||||
GradientArray m_fillGradient;
|
||||
GradientArray m_lineGradient;
|
||||
Color m_fillColor;
|
||||
Color m_lineColor;
|
||||
GradientArray m_fillGradient;
|
||||
GradientArray m_lineGradient;
|
||||
|
||||
LineCap m_lineCap;
|
||||
LineJoin m_lineJoin;
|
||||
LineCap m_lineCap;
|
||||
LineJoin m_lineJoin;
|
||||
|
||||
Gradient m_fillGradientFlag;
|
||||
Gradient m_lineGradientFlag;
|
||||
agg::trans_affine m_fillGradientMatrix;
|
||||
agg::trans_affine m_lineGradientMatrix;
|
||||
double m_fillGradientD1;
|
||||
double m_lineGradientD1;
|
||||
double m_fillGradientD2;
|
||||
double m_lineGradientD2;
|
||||
Gradient m_fillGradientFlag;
|
||||
Gradient m_lineGradientFlag;
|
||||
agg::trans_affine m_fillGradientMatrix;
|
||||
agg::trans_affine m_lineGradientMatrix;
|
||||
double m_fillGradientD1;
|
||||
double m_lineGradientD1;
|
||||
double m_fillGradientD2;
|
||||
double m_lineGradientD2;
|
||||
|
||||
TextAlignment m_textAlignment;
|
||||
double m_textSizeX;
|
||||
double m_textSizeY;
|
||||
TextAlignment m_textAlignment;
|
||||
double m_textSizeX;
|
||||
double m_textSizeY;
|
||||
|
||||
ImageFilter m_imageFilter;
|
||||
ImageResample m_imageResample;
|
||||
agg::image_filter_lut m_imageFilterLut;
|
||||
ImageFilter m_imageFilter;
|
||||
ImageResample m_imageResample;
|
||||
agg::image_filter_lut m_imageFilterLut;
|
||||
|
||||
agg::span_interpolator_linear<> m_fillGradientInterpolator;
|
||||
agg::span_interpolator_linear<> m_lineGradientInterpolator;
|
||||
|
||||
agg::gradient_x m_linearGradientFunction;
|
||||
agg::gradient_circle m_radialGradientFunction;
|
||||
agg::gradient_x m_linearGradientFunction;
|
||||
agg::gradient_circle m_radialGradientFunction;
|
||||
|
||||
double m_lineWidth;
|
||||
bool m_evenOddFlag;
|
||||
double m_lineWidth;
|
||||
bool m_evenOddFlag;
|
||||
|
||||
agg::path_storage m_path;
|
||||
agg::trans_affine m_transform;
|
||||
agg::path_storage m_path;
|
||||
agg::trans_affine m_transform;
|
||||
|
||||
ConvCurve m_convCurve;
|
||||
ConvStroke m_convStroke;
|
||||
ConvCurve m_convCurve;
|
||||
ConvStroke m_convStroke;
|
||||
|
||||
PathTransform m_pathTransform;
|
||||
StrokeTransform m_strokeTransform;
|
||||
PathTransform m_pathTransform;
|
||||
StrokeTransform m_strokeTransform;
|
||||
|
||||
#ifdef AGG_USE_FONTS
|
||||
#ifndef AGG2D_USE_FREETYPE
|
||||
HDC m_fontDC;
|
||||
HDC m_fontDC;
|
||||
#endif
|
||||
FontEngine m_fontEngine;
|
||||
FontCacheManager m_fontCacheManager;
|
||||
FontEngine m_fontEngine;
|
||||
FontCacheManager m_fontCacheManager;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
inline bool operator == (const Agg2D::Color& c1, const Agg2D::Color& c2)
|
||||
inline bool operator==(const Agg2D::Color& c1, const Agg2D::Color& c2)
|
||||
{
|
||||
return c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a;
|
||||
return c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a;
|
||||
}
|
||||
|
||||
inline bool operator != (const Agg2D::Color& c1, const Agg2D::Color& c2)
|
||||
inline bool operator!=(const Agg2D::Color& c1, const Agg2D::Color& c2)
|
||||
{
|
||||
return !(c1 == c2);
|
||||
return !(c1 == c2);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -28,52 +28,63 @@ namespace agg
|
||||
//===================================================one_component_mask_u8
|
||||
struct one_component_mask_u8
|
||||
{
|
||||
static unsigned calculate(const int8u* p) { return *p; }
|
||||
static unsigned calculate(const int8u* p)
|
||||
{
|
||||
return *p;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//=====================================================rgb_to_gray_mask_u8
|
||||
template<unsigned R, unsigned G, unsigned B>
|
||||
template <unsigned R, unsigned G, unsigned B>
|
||||
struct rgb_to_gray_mask_u8
|
||||
{
|
||||
static unsigned calculate(const int8u* p)
|
||||
{
|
||||
return (p[R]*77 + p[G]*150 + p[B]*29) >> 8;
|
||||
static unsigned calculate(const int8u* p)
|
||||
{
|
||||
return (p[R] * 77 + p[G] * 150 + p[B] * 29) >> 8;
|
||||
}
|
||||
};
|
||||
|
||||
//==========================================================alpha_mask_u8
|
||||
template<unsigned Step=1, unsigned Offset=0, class MaskF=one_component_mask_u8>
|
||||
template <unsigned Step = 1,
|
||||
unsigned Offset = 0,
|
||||
class MaskF = one_component_mask_u8>
|
||||
class alpha_mask_u8
|
||||
{
|
||||
public:
|
||||
typedef int8u cover_type;
|
||||
typedef alpha_mask_u8<Step, Offset, MaskF> self_type;
|
||||
enum cover_scale_e
|
||||
{
|
||||
{
|
||||
cover_shift = 8,
|
||||
cover_none = 0,
|
||||
cover_full = 255
|
||||
cover_none = 0,
|
||||
cover_full = 255
|
||||
};
|
||||
|
||||
alpha_mask_u8() : m_rbuf(0) {}
|
||||
explicit alpha_mask_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {}
|
||||
alpha_mask_u8(): m_rbuf(0) {}
|
||||
explicit alpha_mask_u8(rendering_buffer& rbuf): m_rbuf(&rbuf) {}
|
||||
|
||||
void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; }
|
||||
void attach(rendering_buffer& rbuf)
|
||||
{
|
||||
m_rbuf = &rbuf;
|
||||
}
|
||||
|
||||
MaskF& mask_function() { return m_mask_function; }
|
||||
const MaskF& mask_function() const { return m_mask_function; }
|
||||
MaskF& mask_function()
|
||||
{
|
||||
return m_mask_function;
|
||||
}
|
||||
const MaskF& mask_function() const
|
||||
{
|
||||
return m_mask_function;
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
cover_type pixel(int x, int y) const
|
||||
{
|
||||
if(x >= 0 && y >= 0 &&
|
||||
x < (int)m_rbuf->width() &&
|
||||
y < (int)m_rbuf->height())
|
||||
if (x >= 0 && y >= 0 && x < (int)m_rbuf->width() &&
|
||||
y < (int)m_rbuf->height())
|
||||
{
|
||||
return (cover_type)m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset);
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -81,19 +92,18 @@ namespace agg
|
||||
//--------------------------------------------------------------------
|
||||
cover_type combine_pixel(int x, int y, cover_type val) const
|
||||
{
|
||||
if(x >= 0 && y >= 0 &&
|
||||
x < (int)m_rbuf->width() &&
|
||||
y < (int)m_rbuf->height())
|
||||
if (x >= 0 && y >= 0 && x < (int)m_rbuf->width() &&
|
||||
y < (int)m_rbuf->height())
|
||||
{
|
||||
return (cover_type)((cover_full + val *
|
||||
m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset)) >>
|
||||
cover_shift);
|
||||
return (
|
||||
cover_type)((cover_full + val * m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) +
|
||||
x * Step + Offset)) >>
|
||||
cover_shift);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void fill_hspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
@@ -103,16 +113,16 @@ namespace agg
|
||||
int count = num_pix;
|
||||
cover_type* covers = dst;
|
||||
|
||||
if(y < 0 || y > ymax)
|
||||
if (y < 0 || y > ymax)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
}
|
||||
|
||||
if(x < 0)
|
||||
if (x < 0)
|
||||
{
|
||||
count += x;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -122,11 +132,11 @@ namespace agg
|
||||
x = 0;
|
||||
}
|
||||
|
||||
if(x + count > xmax)
|
||||
if (x + count > xmax)
|
||||
{
|
||||
int rest = x + count - xmax - 1;
|
||||
count -= rest;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -139,11 +149,9 @@ namespace agg
|
||||
{
|
||||
*covers++ = (cover_type)m_mask_function.calculate(mask);
|
||||
mask += Step;
|
||||
}
|
||||
while(--count);
|
||||
} while (--count);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void combine_hspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
@@ -153,16 +161,16 @@ namespace agg
|
||||
int count = num_pix;
|
||||
cover_type* covers = dst;
|
||||
|
||||
if(y < 0 || y > ymax)
|
||||
if (y < 0 || y > ymax)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
}
|
||||
|
||||
if(x < 0)
|
||||
if (x < 0)
|
||||
{
|
||||
count += x;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -172,11 +180,11 @@ namespace agg
|
||||
x = 0;
|
||||
}
|
||||
|
||||
if(x + count > xmax)
|
||||
if (x + count > xmax)
|
||||
{
|
||||
int rest = x + count - xmax - 1;
|
||||
count -= rest;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -187,13 +195,14 @@ namespace agg
|
||||
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
|
||||
do
|
||||
{
|
||||
*covers = (cover_type)((cover_full + (*covers) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
*covers =
|
||||
(cover_type)((cover_full +
|
||||
(*covers) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
++covers;
|
||||
mask += Step;
|
||||
}
|
||||
while(--count);
|
||||
} while (--count);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
@@ -205,16 +214,16 @@ namespace agg
|
||||
int count = num_pix;
|
||||
cover_type* covers = dst;
|
||||
|
||||
if(x < 0 || x > xmax)
|
||||
if (x < 0 || x > xmax)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
}
|
||||
|
||||
if(y < 0)
|
||||
if (y < 0)
|
||||
{
|
||||
count += y;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -224,11 +233,11 @@ namespace agg
|
||||
y = 0;
|
||||
}
|
||||
|
||||
if(y + count > ymax)
|
||||
if (y + count > ymax)
|
||||
{
|
||||
int rest = y + count - ymax - 1;
|
||||
count -= rest;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -241,8 +250,7 @@ namespace agg
|
||||
{
|
||||
*covers++ = (cover_type)m_mask_function.calculate(mask);
|
||||
mask += m_rbuf->stride();
|
||||
}
|
||||
while(--count);
|
||||
} while (--count);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
@@ -254,16 +262,16 @@ namespace agg
|
||||
int count = num_pix;
|
||||
cover_type* covers = dst;
|
||||
|
||||
if(x < 0 || x > xmax)
|
||||
if (x < 0 || x > xmax)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
}
|
||||
|
||||
if(y < 0)
|
||||
if (y < 0)
|
||||
{
|
||||
count += y;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -273,11 +281,11 @@ namespace agg
|
||||
y = 0;
|
||||
}
|
||||
|
||||
if(y + count > ymax)
|
||||
if (y + count > ymax)
|
||||
{
|
||||
int rest = y + count - ymax - 1;
|
||||
count -= rest;
|
||||
if(count <= 0)
|
||||
if (count <= 0)
|
||||
{
|
||||
std::memset(dst, 0, num_pix * sizeof(cover_type));
|
||||
return;
|
||||
@@ -288,34 +296,33 @@ namespace agg
|
||||
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
|
||||
do
|
||||
{
|
||||
*covers = (cover_type)((cover_full + (*covers) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
*covers =
|
||||
(cover_type)((cover_full +
|
||||
(*covers) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
++covers;
|
||||
mask += m_rbuf->stride();
|
||||
}
|
||||
while(--count);
|
||||
} while (--count);
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
alpha_mask_u8(const self_type&);
|
||||
const self_type& operator = (const self_type&);
|
||||
const self_type& operator=(const self_type&);
|
||||
|
||||
rendering_buffer* m_rbuf;
|
||||
MaskF m_mask_function;
|
||||
MaskF m_mask_function;
|
||||
};
|
||||
|
||||
|
||||
typedef alpha_mask_u8<1, 0> alpha_mask_gray8; //----alpha_mask_gray8
|
||||
typedef alpha_mask_u8<1, 0> alpha_mask_gray8; //----alpha_mask_gray8
|
||||
|
||||
typedef alpha_mask_u8<3, 0> alpha_mask_rgb24r; //----alpha_mask_rgb24r
|
||||
typedef alpha_mask_u8<3, 1> alpha_mask_rgb24g; //----alpha_mask_rgb24g
|
||||
typedef alpha_mask_u8<3, 2> alpha_mask_rgb24b; //----alpha_mask_rgb24b
|
||||
typedef alpha_mask_u8<3, 0> alpha_mask_rgb24r; //----alpha_mask_rgb24r
|
||||
typedef alpha_mask_u8<3, 1> alpha_mask_rgb24g; //----alpha_mask_rgb24g
|
||||
typedef alpha_mask_u8<3, 2> alpha_mask_rgb24b; //----alpha_mask_rgb24b
|
||||
|
||||
typedef alpha_mask_u8<3, 2> alpha_mask_bgr24r; //----alpha_mask_bgr24r
|
||||
typedef alpha_mask_u8<3, 1> alpha_mask_bgr24g; //----alpha_mask_bgr24g
|
||||
typedef alpha_mask_u8<3, 0> alpha_mask_bgr24b; //----alpha_mask_bgr24b
|
||||
typedef alpha_mask_u8<3, 2> alpha_mask_bgr24r; //----alpha_mask_bgr24r
|
||||
typedef alpha_mask_u8<3, 1> alpha_mask_bgr24g; //----alpha_mask_bgr24g
|
||||
typedef alpha_mask_u8<3, 0> alpha_mask_bgr24b; //----alpha_mask_bgr24b
|
||||
|
||||
typedef alpha_mask_u8<4, 0> alpha_mask_rgba32r; //----alpha_mask_rgba32r
|
||||
typedef alpha_mask_u8<4, 1> alpha_mask_rgba32g; //----alpha_mask_rgba32g
|
||||
@@ -337,56 +344,68 @@ namespace agg
|
||||
typedef alpha_mask_u8<4, 1> alpha_mask_abgr32b; //----alpha_mask_abgr32b
|
||||
typedef alpha_mask_u8<4, 0> alpha_mask_abgr32a; //----alpha_mask_abgr32a
|
||||
|
||||
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgb24gray; //----alpha_mask_rgb24gray
|
||||
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgr24gray; //----alpha_mask_bgr24gray
|
||||
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgba32gray; //----alpha_mask_rgba32gray
|
||||
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_argb32gray; //----alpha_mask_argb32gray
|
||||
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgra32gray; //----alpha_mask_bgra32gray
|
||||
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_abgr32gray; //----alpha_mask_abgr32gray
|
||||
|
||||
|
||||
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
alpha_mask_rgb24gray; //----alpha_mask_rgb24gray
|
||||
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
alpha_mask_bgr24gray; //----alpha_mask_bgr24gray
|
||||
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
alpha_mask_rgba32gray; //----alpha_mask_rgba32gray
|
||||
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
alpha_mask_argb32gray; //----alpha_mask_argb32gray
|
||||
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
alpha_mask_bgra32gray; //----alpha_mask_bgra32gray
|
||||
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
alpha_mask_abgr32gray; //----alpha_mask_abgr32gray
|
||||
|
||||
//==========================================================amask_no_clip_u8
|
||||
template<unsigned Step=1, unsigned Offset=0, class MaskF=one_component_mask_u8>
|
||||
template <unsigned Step = 1,
|
||||
unsigned Offset = 0,
|
||||
class MaskF = one_component_mask_u8>
|
||||
class amask_no_clip_u8
|
||||
{
|
||||
public:
|
||||
typedef int8u cover_type;
|
||||
typedef amask_no_clip_u8<Step, Offset, MaskF> self_type;
|
||||
enum cover_scale_e
|
||||
{
|
||||
{
|
||||
cover_shift = 8,
|
||||
cover_none = 0,
|
||||
cover_full = 255
|
||||
cover_none = 0,
|
||||
cover_full = 255
|
||||
};
|
||||
|
||||
amask_no_clip_u8() : m_rbuf(0) {}
|
||||
explicit amask_no_clip_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {}
|
||||
amask_no_clip_u8(): m_rbuf(0) {}
|
||||
explicit amask_no_clip_u8(rendering_buffer& rbuf): m_rbuf(&rbuf) {}
|
||||
|
||||
void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; }
|
||||
|
||||
MaskF& mask_function() { return m_mask_function; }
|
||||
const MaskF& mask_function() const { return m_mask_function; }
|
||||
void attach(rendering_buffer& rbuf)
|
||||
{
|
||||
m_rbuf = &rbuf;
|
||||
}
|
||||
|
||||
MaskF& mask_function()
|
||||
{
|
||||
return m_mask_function;
|
||||
}
|
||||
const MaskF& mask_function() const
|
||||
{
|
||||
return m_mask_function;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
cover_type pixel(int x, int y) const
|
||||
{
|
||||
return (cover_type)m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset);
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
cover_type combine_pixel(int x, int y, cover_type val) const
|
||||
{
|
||||
return (cover_type)((cover_full + val *
|
||||
m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) + x * Step + Offset)) >>
|
||||
cover_shift);
|
||||
return (cover_type)((cover_full + val * m_mask_function.calculate(
|
||||
m_rbuf->row_ptr(y) +
|
||||
x * Step + Offset)) >>
|
||||
cover_shift);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void fill_hspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
@@ -395,28 +414,24 @@ namespace agg
|
||||
{
|
||||
*dst++ = (cover_type)m_mask_function.calculate(mask);
|
||||
mask += Step;
|
||||
}
|
||||
while(--num_pix);
|
||||
} while (--num_pix);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void combine_hspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
|
||||
do
|
||||
{
|
||||
*dst = (cover_type)((cover_full + (*dst) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
*dst = (cover_type)((cover_full +
|
||||
(*dst) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
++dst;
|
||||
mask += Step;
|
||||
}
|
||||
while(--num_pix);
|
||||
} while (--num_pix);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void fill_vspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
@@ -425,75 +440,98 @@ namespace agg
|
||||
{
|
||||
*dst++ = (cover_type)m_mask_function.calculate(mask);
|
||||
mask += m_rbuf->stride();
|
||||
}
|
||||
while(--num_pix);
|
||||
} while (--num_pix);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void combine_vspan(int x, int y, cover_type* dst, int num_pix) const
|
||||
{
|
||||
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
|
||||
do
|
||||
{
|
||||
*dst = (cover_type)((cover_full + (*dst) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
*dst = (cover_type)((cover_full +
|
||||
(*dst) *
|
||||
m_mask_function.calculate(mask)) >>
|
||||
cover_shift);
|
||||
++dst;
|
||||
mask += m_rbuf->stride();
|
||||
}
|
||||
while(--num_pix);
|
||||
} while (--num_pix);
|
||||
}
|
||||
|
||||
private:
|
||||
amask_no_clip_u8(const self_type&);
|
||||
const self_type& operator = (const self_type&);
|
||||
const self_type& operator=(const self_type&);
|
||||
|
||||
rendering_buffer* m_rbuf;
|
||||
MaskF m_mask_function;
|
||||
MaskF m_mask_function;
|
||||
};
|
||||
|
||||
|
||||
typedef amask_no_clip_u8<1, 0> amask_no_clip_gray8; //----amask_no_clip_gray8
|
||||
typedef amask_no_clip_u8<1, 0>
|
||||
amask_no_clip_gray8; //----amask_no_clip_gray8
|
||||
|
||||
typedef amask_no_clip_u8<3, 0> amask_no_clip_rgb24r; //----amask_no_clip_rgb24r
|
||||
typedef amask_no_clip_u8<3, 1> amask_no_clip_rgb24g; //----amask_no_clip_rgb24g
|
||||
typedef amask_no_clip_u8<3, 2> amask_no_clip_rgb24b; //----amask_no_clip_rgb24b
|
||||
typedef amask_no_clip_u8<3, 0>
|
||||
amask_no_clip_rgb24r; //----amask_no_clip_rgb24r
|
||||
typedef amask_no_clip_u8<3, 1>
|
||||
amask_no_clip_rgb24g; //----amask_no_clip_rgb24g
|
||||
typedef amask_no_clip_u8<3, 2>
|
||||
amask_no_clip_rgb24b; //----amask_no_clip_rgb24b
|
||||
|
||||
typedef amask_no_clip_u8<3, 2> amask_no_clip_bgr24r; //----amask_no_clip_bgr24r
|
||||
typedef amask_no_clip_u8<3, 1> amask_no_clip_bgr24g; //----amask_no_clip_bgr24g
|
||||
typedef amask_no_clip_u8<3, 0> amask_no_clip_bgr24b; //----amask_no_clip_bgr24b
|
||||
typedef amask_no_clip_u8<3, 2>
|
||||
amask_no_clip_bgr24r; //----amask_no_clip_bgr24r
|
||||
typedef amask_no_clip_u8<3, 1>
|
||||
amask_no_clip_bgr24g; //----amask_no_clip_bgr24g
|
||||
typedef amask_no_clip_u8<3, 0>
|
||||
amask_no_clip_bgr24b; //----amask_no_clip_bgr24b
|
||||
|
||||
typedef amask_no_clip_u8<4, 0> amask_no_clip_rgba32r; //----amask_no_clip_rgba32r
|
||||
typedef amask_no_clip_u8<4, 1> amask_no_clip_rgba32g; //----amask_no_clip_rgba32g
|
||||
typedef amask_no_clip_u8<4, 2> amask_no_clip_rgba32b; //----amask_no_clip_rgba32b
|
||||
typedef amask_no_clip_u8<4, 3> amask_no_clip_rgba32a; //----amask_no_clip_rgba32a
|
||||
typedef amask_no_clip_u8<4, 0>
|
||||
amask_no_clip_rgba32r; //----amask_no_clip_rgba32r
|
||||
typedef amask_no_clip_u8<4, 1>
|
||||
amask_no_clip_rgba32g; //----amask_no_clip_rgba32g
|
||||
typedef amask_no_clip_u8<4, 2>
|
||||
amask_no_clip_rgba32b; //----amask_no_clip_rgba32b
|
||||
typedef amask_no_clip_u8<4, 3>
|
||||
amask_no_clip_rgba32a; //----amask_no_clip_rgba32a
|
||||
|
||||
typedef amask_no_clip_u8<4, 1> amask_no_clip_argb32r; //----amask_no_clip_argb32r
|
||||
typedef amask_no_clip_u8<4, 2> amask_no_clip_argb32g; //----amask_no_clip_argb32g
|
||||
typedef amask_no_clip_u8<4, 3> amask_no_clip_argb32b; //----amask_no_clip_argb32b
|
||||
typedef amask_no_clip_u8<4, 0> amask_no_clip_argb32a; //----amask_no_clip_argb32a
|
||||
typedef amask_no_clip_u8<4, 1>
|
||||
amask_no_clip_argb32r; //----amask_no_clip_argb32r
|
||||
typedef amask_no_clip_u8<4, 2>
|
||||
amask_no_clip_argb32g; //----amask_no_clip_argb32g
|
||||
typedef amask_no_clip_u8<4, 3>
|
||||
amask_no_clip_argb32b; //----amask_no_clip_argb32b
|
||||
typedef amask_no_clip_u8<4, 0>
|
||||
amask_no_clip_argb32a; //----amask_no_clip_argb32a
|
||||
|
||||
typedef amask_no_clip_u8<4, 2> amask_no_clip_bgra32r; //----amask_no_clip_bgra32r
|
||||
typedef amask_no_clip_u8<4, 1> amask_no_clip_bgra32g; //----amask_no_clip_bgra32g
|
||||
typedef amask_no_clip_u8<4, 0> amask_no_clip_bgra32b; //----amask_no_clip_bgra32b
|
||||
typedef amask_no_clip_u8<4, 3> amask_no_clip_bgra32a; //----amask_no_clip_bgra32a
|
||||
typedef amask_no_clip_u8<4, 2>
|
||||
amask_no_clip_bgra32r; //----amask_no_clip_bgra32r
|
||||
typedef amask_no_clip_u8<4, 1>
|
||||
amask_no_clip_bgra32g; //----amask_no_clip_bgra32g
|
||||
typedef amask_no_clip_u8<4, 0>
|
||||
amask_no_clip_bgra32b; //----amask_no_clip_bgra32b
|
||||
typedef amask_no_clip_u8<4, 3>
|
||||
amask_no_clip_bgra32a; //----amask_no_clip_bgra32a
|
||||
|
||||
typedef amask_no_clip_u8<4, 3> amask_no_clip_abgr32r; //----amask_no_clip_abgr32r
|
||||
typedef amask_no_clip_u8<4, 2> amask_no_clip_abgr32g; //----amask_no_clip_abgr32g
|
||||
typedef amask_no_clip_u8<4, 1> amask_no_clip_abgr32b; //----amask_no_clip_abgr32b
|
||||
typedef amask_no_clip_u8<4, 0> amask_no_clip_abgr32a; //----amask_no_clip_abgr32a
|
||||
|
||||
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgb24gray; //----amask_no_clip_rgb24gray
|
||||
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgr24gray; //----amask_no_clip_bgr24gray
|
||||
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgba32gray; //----amask_no_clip_rgba32gray
|
||||
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_argb32gray; //----amask_no_clip_argb32gray
|
||||
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgra32gray; //----amask_no_clip_bgra32gray
|
||||
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_abgr32gray; //----amask_no_clip_abgr32gray
|
||||
typedef amask_no_clip_u8<4, 3>
|
||||
amask_no_clip_abgr32r; //----amask_no_clip_abgr32r
|
||||
typedef amask_no_clip_u8<4, 2>
|
||||
amask_no_clip_abgr32g; //----amask_no_clip_abgr32g
|
||||
typedef amask_no_clip_u8<4, 1>
|
||||
amask_no_clip_abgr32b; //----amask_no_clip_abgr32b
|
||||
typedef amask_no_clip_u8<4, 0>
|
||||
amask_no_clip_abgr32a; //----amask_no_clip_abgr32a
|
||||
|
||||
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
amask_no_clip_rgb24gray; //----amask_no_clip_rgb24gray
|
||||
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
amask_no_clip_bgr24gray; //----amask_no_clip_bgr24gray
|
||||
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
amask_no_clip_rgba32gray; //----amask_no_clip_rgba32gray
|
||||
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2>>
|
||||
amask_no_clip_argb32gray; //----amask_no_clip_argb32gray
|
||||
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
amask_no_clip_bgra32gray; //----amask_no_clip_bgra32gray
|
||||
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0>>
|
||||
amask_no_clip_abgr32gray; //----amask_no_clip_abgr32gray
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -27,24 +27,33 @@ namespace agg
|
||||
|
||||
//=====================================================================arc
|
||||
//
|
||||
// See Implementation agg_arc.cpp
|
||||
// See Implementation agg_arc.cpp
|
||||
//
|
||||
class arc
|
||||
{
|
||||
public:
|
||||
arc() : m_scale(1.0), m_initialized(false) {}
|
||||
arc(double x, double y,
|
||||
double rx, double ry,
|
||||
double a1, double a2,
|
||||
bool ccw=true);
|
||||
arc(): m_scale(1.0), m_initialized(false) {}
|
||||
arc(double x,
|
||||
double y,
|
||||
double rx,
|
||||
double ry,
|
||||
double a1,
|
||||
double a2,
|
||||
bool ccw = true);
|
||||
|
||||
void init(double x, double y,
|
||||
double rx, double ry,
|
||||
double a1, double a2,
|
||||
bool ccw=true);
|
||||
void init(double x,
|
||||
double y,
|
||||
double rx,
|
||||
double ry,
|
||||
double a1,
|
||||
double a2,
|
||||
bool ccw = true);
|
||||
|
||||
void approximation_scale(double s);
|
||||
double approximation_scale() const { return m_scale; }
|
||||
double approximation_scale() const
|
||||
{
|
||||
return m_scale;
|
||||
}
|
||||
|
||||
void rewind(unsigned);
|
||||
unsigned vertex(double* x, double* y);
|
||||
@@ -52,22 +61,20 @@ namespace agg
|
||||
private:
|
||||
void normalize(double a1, double a2, bool ccw);
|
||||
|
||||
double m_x;
|
||||
double m_y;
|
||||
double m_rx;
|
||||
double m_ry;
|
||||
double m_angle;
|
||||
double m_start;
|
||||
double m_end;
|
||||
double m_scale;
|
||||
double m_da;
|
||||
bool m_ccw;
|
||||
bool m_initialized;
|
||||
double m_x;
|
||||
double m_y;
|
||||
double m_rx;
|
||||
double m_ry;
|
||||
double m_angle;
|
||||
double m_start;
|
||||
double m_end;
|
||||
double m_scale;
|
||||
double m_da;
|
||||
bool m_ccw;
|
||||
bool m_initialized;
|
||||
unsigned m_path_cmd;
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -13,7 +13,7 @@
|
||||
// http://www.antigrain.com
|
||||
//----------------------------------------------------------------------------
|
||||
//
|
||||
// Simple arrowhead/arrowtail generator
|
||||
// Simple arrowhead/arrowtail generator
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
#ifndef AGG_ARROWHEAD_INCLUDED
|
||||
@@ -26,7 +26,7 @@ namespace agg
|
||||
|
||||
//===============================================================arrowhead
|
||||
//
|
||||
// See implementation agg_arrowhead.cpp
|
||||
// See implementation agg_arrowhead.cpp
|
||||
//
|
||||
class arrowhead
|
||||
{
|
||||
@@ -42,8 +42,14 @@ namespace agg
|
||||
m_head_flag = true;
|
||||
}
|
||||
|
||||
void head() { m_head_flag = true; }
|
||||
void no_head() { m_head_flag = false; }
|
||||
void head()
|
||||
{
|
||||
m_head_flag = true;
|
||||
}
|
||||
void no_head()
|
||||
{
|
||||
m_head_flag = false;
|
||||
}
|
||||
|
||||
void tail(double d1, double d2, double d3, double d4)
|
||||
{
|
||||
@@ -54,24 +60,30 @@ namespace agg
|
||||
m_tail_flag = true;
|
||||
}
|
||||
|
||||
void tail() { m_tail_flag = true; }
|
||||
void no_tail() { m_tail_flag = false; }
|
||||
void tail()
|
||||
{
|
||||
m_tail_flag = true;
|
||||
}
|
||||
void no_tail()
|
||||
{
|
||||
m_tail_flag = false;
|
||||
}
|
||||
|
||||
void rewind(unsigned path_id);
|
||||
unsigned vertex(double* x, double* y);
|
||||
|
||||
private:
|
||||
double m_head_d1;
|
||||
double m_head_d2;
|
||||
double m_head_d3;
|
||||
double m_head_d4;
|
||||
double m_tail_d1;
|
||||
double m_tail_d2;
|
||||
double m_tail_d3;
|
||||
double m_tail_d4;
|
||||
bool m_head_flag;
|
||||
bool m_tail_flag;
|
||||
double m_coord[16];
|
||||
double m_head_d1;
|
||||
double m_head_d2;
|
||||
double m_head_d3;
|
||||
double m_head_d4;
|
||||
double m_tail_d1;
|
||||
double m_tail_d2;
|
||||
double m_tail_d3;
|
||||
double m_tail_d4;
|
||||
bool m_head_flag;
|
||||
bool m_tail_flag;
|
||||
double m_coord[16];
|
||||
unsigned m_cmd[8];
|
||||
unsigned m_curr_id;
|
||||
unsigned m_curr_coord;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -25,37 +25,50 @@
|
||||
#else
|
||||
namespace agg
|
||||
{
|
||||
// The policy of all AGG containers and memory allocation strategy
|
||||
// The policy of all AGG containers and memory allocation strategy
|
||||
// in general is that no allocated data requires explicit construction.
|
||||
// It means that the allocator can be really simple; you can even
|
||||
// replace new/delete to malloc/free. The constructors and destructors
|
||||
// won't be called in this case, however everything will remain working.
|
||||
// The second argument of deallocate() is the size of the allocated
|
||||
// replace new/delete to malloc/free. The constructors and destructors
|
||||
// won't be called in this case, however everything will remain working.
|
||||
// The second argument of deallocate() is the size of the allocated
|
||||
// block. You can use this information if you wish.
|
||||
//------------------------------------------------------------pod_allocator
|
||||
template<class T> struct pod_allocator
|
||||
template <class T>
|
||||
struct pod_allocator
|
||||
{
|
||||
static T* allocate(unsigned num) { return new T [num]; }
|
||||
static void deallocate(T* ptr, unsigned) { delete [] ptr; }
|
||||
static T* allocate(unsigned num)
|
||||
{
|
||||
return new T[num];
|
||||
}
|
||||
static void deallocate(T* ptr, unsigned)
|
||||
{
|
||||
delete[] ptr;
|
||||
}
|
||||
};
|
||||
|
||||
// Single object allocator. It's also can be replaced with your custom
|
||||
// allocator. The difference is that it can only allocate a single
|
||||
// object and the constructor and destructor must be called.
|
||||
// allocator. The difference is that it can only allocate a single
|
||||
// object and the constructor and destructor must be called.
|
||||
// In AGG there is no need to allocate an array of objects with
|
||||
// calling their constructors (only single ones). So that, if you
|
||||
// replace these new/delete to malloc/free make sure that the in-place
|
||||
// new is called and take care of calling the destructor too.
|
||||
//------------------------------------------------------------obj_allocator
|
||||
template<class T> struct obj_allocator
|
||||
template <class T>
|
||||
struct obj_allocator
|
||||
{
|
||||
static T* allocate() { return new T; }
|
||||
static void deallocate(T* ptr) { delete ptr; }
|
||||
static T* allocate()
|
||||
{
|
||||
return new T;
|
||||
}
|
||||
static void deallocate(T* ptr)
|
||||
{
|
||||
delete ptr;
|
||||
}
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
//-------------------------------------------------------- Default basic types
|
||||
//
|
||||
// If the compiler has different capacity of the basic types you can redefine
|
||||
@@ -104,7 +117,7 @@ namespace agg
|
||||
|
||||
//------------------------------------------------ Some fixes for MS Visual C++
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning(disable:4786) // Identifier was truncated...
|
||||
#pragma warning(disable : 4786) // Identifier was truncated...
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
@@ -116,38 +129,36 @@ namespace agg
|
||||
namespace agg
|
||||
{
|
||||
//-------------------------------------------------------------------------
|
||||
typedef AGG_INT8 int8; //----int8
|
||||
typedef AGG_INT8U int8u; //----int8u
|
||||
typedef AGG_INT16 int16; //----int16
|
||||
typedef AGG_INT16U int16u; //----int16u
|
||||
typedef AGG_INT32 int32; //----int32
|
||||
typedef AGG_INT32U int32u; //----int32u
|
||||
typedef AGG_INT64 int64; //----int64
|
||||
typedef AGG_INT64U int64u; //----int64u
|
||||
typedef AGG_INT8 int8; //----int8
|
||||
typedef AGG_INT8U int8u; //----int8u
|
||||
typedef AGG_INT16 int16; //----int16
|
||||
typedef AGG_INT16U int16u; //----int16u
|
||||
typedef AGG_INT32 int32; //----int32
|
||||
typedef AGG_INT32U int32u; //----int32u
|
||||
typedef AGG_INT64 int64; //----int64
|
||||
typedef AGG_INT64U int64u; //----int64u
|
||||
|
||||
#if defined(AGG_FISTP)
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4035) //Disable warning "no return value"
|
||||
AGG_INLINE int iround(double v) //-------iround
|
||||
#pragma warning(disable : 4035) // Disable warning "no return value"
|
||||
AGG_INLINE int iround(double v) //-------iround
|
||||
{
|
||||
int t;
|
||||
__asm fld qword ptr [v]
|
||||
__asm fistp dword ptr [t]
|
||||
__asm mov eax, dword ptr [t]
|
||||
__asm fld qword ptr[v] __asm fistp dword ptr[t] __asm mov eax,
|
||||
dword ptr[t]
|
||||
}
|
||||
AGG_INLINE unsigned uround(double v) //-------uround
|
||||
AGG_INLINE unsigned uround(double v) //-------uround
|
||||
{
|
||||
unsigned t;
|
||||
__asm fld qword ptr [v]
|
||||
__asm fistp dword ptr [t]
|
||||
__asm mov eax, dword ptr [t]
|
||||
__asm fld qword ptr[v] __asm fistp dword ptr[t] __asm mov eax,
|
||||
dword ptr[t]
|
||||
}
|
||||
#pragma warning(pop)
|
||||
AGG_INLINE int ifloor(double v)
|
||||
{
|
||||
return int(floor(v));
|
||||
}
|
||||
AGG_INLINE unsigned ufloor(double v) //-------ufloor
|
||||
AGG_INLINE unsigned ufloor(double v) //-------ufloor
|
||||
{
|
||||
return unsigned(floor(v));
|
||||
}
|
||||
@@ -155,7 +166,7 @@ namespace agg
|
||||
{
|
||||
return int(ceil(v));
|
||||
}
|
||||
AGG_INLINE unsigned uceil(double v) //--------uceil
|
||||
AGG_INLINE unsigned uceil(double v) //--------uceil
|
||||
{
|
||||
return unsigned(ceil(v));
|
||||
}
|
||||
@@ -213,48 +224,53 @@ namespace agg
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------saturation
|
||||
template<int Limit> struct saturation
|
||||
template <int Limit>
|
||||
struct saturation
|
||||
{
|
||||
AGG_INLINE static int iround(double v)
|
||||
{
|
||||
if(v < double(-Limit)) return -Limit;
|
||||
if(v > double( Limit)) return Limit;
|
||||
if (v < double(-Limit))
|
||||
return -Limit;
|
||||
if (v > double(Limit))
|
||||
return Limit;
|
||||
return agg::iround(v);
|
||||
}
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------mul_one
|
||||
template<unsigned Shift> struct mul_one
|
||||
template <unsigned Shift>
|
||||
struct mul_one
|
||||
{
|
||||
AGG_INLINE static unsigned mul(unsigned a, unsigned b)
|
||||
{
|
||||
unsigned q = a * b + (1 << (Shift-1));
|
||||
unsigned q = a * b + (1 << (Shift - 1));
|
||||
return (q + (q >> Shift)) >> Shift;
|
||||
}
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
typedef unsigned char cover_type; //----cover_type
|
||||
typedef unsigned char cover_type; //----cover_type
|
||||
enum cover_scale_e
|
||||
{
|
||||
cover_shift = 8, //----cover_shift
|
||||
cover_size = 1 << cover_shift, //----cover_size
|
||||
cover_mask = cover_size - 1, //----cover_mask
|
||||
cover_none = 0, //----cover_none
|
||||
cover_full = cover_mask //----cover_full
|
||||
cover_shift = 8, //----cover_shift
|
||||
cover_size = 1 << cover_shift, //----cover_size
|
||||
cover_mask = cover_size - 1, //----cover_mask
|
||||
cover_none = 0, //----cover_none
|
||||
cover_full = cover_mask //----cover_full
|
||||
};
|
||||
|
||||
//----------------------------------------------------poly_subpixel_scale_e
|
||||
// These constants determine the subpixel accuracy, to be more precise,
|
||||
// the number of bits of the fractional part of the coordinates.
|
||||
// These constants determine the subpixel accuracy, to be more precise,
|
||||
// the number of bits of the fractional part of the coordinates.
|
||||
// The possible coordinate capacity in bits can be calculated by formula:
|
||||
// sizeof(int) * 8 - poly_subpixel_shift, i.e, for 32-bit integers and
|
||||
// 8-bits fractional part the capacity is 24 bits.
|
||||
enum poly_subpixel_scale_e
|
||||
{
|
||||
poly_subpixel_shift = 8, //----poly_subpixel_shift
|
||||
poly_subpixel_scale = 1<<poly_subpixel_shift, //----poly_subpixel_scale
|
||||
poly_subpixel_mask = poly_subpixel_scale-1 //----poly_subpixel_mask
|
||||
poly_subpixel_shift = 8, //----poly_subpixel_shift
|
||||
poly_subpixel_scale = 1
|
||||
<< poly_subpixel_shift, //----poly_subpixel_scale
|
||||
poly_subpixel_mask = poly_subpixel_scale - 1 //----poly_subpixel_mask
|
||||
};
|
||||
|
||||
//----------------------------------------------------------filling_rule_e
|
||||
@@ -278,37 +294,60 @@ namespace agg
|
||||
{
|
||||
return rad * 180.0 / pi;
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------rect_base
|
||||
template<class T> struct rect_base
|
||||
template <class T>
|
||||
struct rect_base
|
||||
{
|
||||
typedef T value_type;
|
||||
typedef T value_type;
|
||||
typedef rect_base<T> self_type;
|
||||
T x1, y1, x2, y2;
|
||||
|
||||
rect_base() {}
|
||||
rect_base(T x1_, T y1_, T x2_, T y2_) :
|
||||
x1(x1_), y1(y1_), x2(x2_), y2(y2_) {}
|
||||
|
||||
void init(T x1_, T y1_, T x2_, T y2_)
|
||||
rect_base(T x1_, T y1_, T x2_, T y2_):
|
||||
x1(x1_),
|
||||
y1(y1_),
|
||||
x2(x2_),
|
||||
y2(y2_)
|
||||
{
|
||||
x1 = x1_; y1 = y1_; x2 = x2_; y2 = y2_;
|
||||
}
|
||||
|
||||
void init(T x1_, T y1_, T x2_, T y2_)
|
||||
{
|
||||
x1 = x1_;
|
||||
y1 = y1_;
|
||||
x2 = x2_;
|
||||
y2 = y2_;
|
||||
}
|
||||
|
||||
const self_type& normalize()
|
||||
{
|
||||
T t;
|
||||
if(x1 > x2) { t = x1; x1 = x2; x2 = t; }
|
||||
if(y1 > y2) { t = y1; y1 = y2; y2 = t; }
|
||||
if (x1 > x2)
|
||||
{
|
||||
t = x1;
|
||||
x1 = x2;
|
||||
x2 = t;
|
||||
}
|
||||
if (y1 > y2)
|
||||
{
|
||||
t = y1;
|
||||
y1 = y2;
|
||||
y2 = t;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool clip(const self_type& r)
|
||||
{
|
||||
if(x2 > r.x2) x2 = r.x2;
|
||||
if(y2 > r.y2) y2 = r.y2;
|
||||
if(x1 < r.x1) x1 = r.x1;
|
||||
if(y1 < r.y1) y1 = r.y1;
|
||||
if (x2 > r.x2)
|
||||
x2 = r.x2;
|
||||
if (y2 > r.y2)
|
||||
y2 = r.y2;
|
||||
if (x1 < r.x1)
|
||||
x1 = r.x1;
|
||||
if (y1 < r.y1)
|
||||
y1 = r.y1;
|
||||
return x1 <= x2 && y1 <= y2;
|
||||
}
|
||||
|
||||
@@ -321,72 +360,78 @@ namespace agg
|
||||
{
|
||||
return (x >= x1 && x <= x2 && y >= y1 && y <= y2);
|
||||
}
|
||||
|
||||
|
||||
bool overlaps(const self_type& r) const
|
||||
{
|
||||
return !(r.x1 > x2 || r.x2 < x1
|
||||
|| r.y1 > y2 || r.y2 < y1);
|
||||
return !(r.x1 > x2 || r.x2 < x1 || r.y1 > y2 || r.y2 < y1);
|
||||
}
|
||||
};
|
||||
|
||||
//-----------------------------------------------------intersect_rectangles
|
||||
template<class Rect>
|
||||
template <class Rect>
|
||||
inline Rect intersect_rectangles(const Rect& r1, const Rect& r2)
|
||||
{
|
||||
Rect r = r1;
|
||||
|
||||
// First process x2,y2 because the other order
|
||||
// results in Internal Compiler Error under
|
||||
// Microsoft Visual C++ .NET 2003 69462-335-0000007-18038 in
|
||||
// First process x2,y2 because the other order
|
||||
// results in Internal Compiler Error under
|
||||
// Microsoft Visual C++ .NET 2003 69462-335-0000007-18038 in
|
||||
// case of "Maximize Speed" optimization option.
|
||||
//-----------------
|
||||
if(r.x2 > r2.x2) r.x2 = r2.x2;
|
||||
if(r.y2 > r2.y2) r.y2 = r2.y2;
|
||||
if(r.x1 < r2.x1) r.x1 = r2.x1;
|
||||
if(r.y1 < r2.y1) r.y1 = r2.y1;
|
||||
if (r.x2 > r2.x2)
|
||||
r.x2 = r2.x2;
|
||||
if (r.y2 > r2.y2)
|
||||
r.y2 = r2.y2;
|
||||
if (r.x1 < r2.x1)
|
||||
r.x1 = r2.x1;
|
||||
if (r.y1 < r2.y1)
|
||||
r.y1 = r2.y1;
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------unite_rectangles
|
||||
template<class Rect>
|
||||
template <class Rect>
|
||||
inline Rect unite_rectangles(const Rect& r1, const Rect& r2)
|
||||
{
|
||||
Rect r = r1;
|
||||
if(r.x2 < r2.x2) r.x2 = r2.x2;
|
||||
if(r.y2 < r2.y2) r.y2 = r2.y2;
|
||||
if(r.x1 > r2.x1) r.x1 = r2.x1;
|
||||
if(r.y1 > r2.y1) r.y1 = r2.y1;
|
||||
if (r.x2 < r2.x2)
|
||||
r.x2 = r2.x2;
|
||||
if (r.y2 < r2.y2)
|
||||
r.y2 = r2.y2;
|
||||
if (r.x1 > r2.x1)
|
||||
r.x1 = r2.x1;
|
||||
if (r.y1 > r2.y1)
|
||||
r.y1 = r2.y1;
|
||||
return r;
|
||||
}
|
||||
|
||||
typedef rect_base<int> rect_i; //----rect_i
|
||||
typedef rect_base<float> rect_f; //----rect_f
|
||||
typedef rect_base<int> rect_i; //----rect_i
|
||||
typedef rect_base<float> rect_f; //----rect_f
|
||||
typedef rect_base<double> rect_d; //----rect_d
|
||||
|
||||
//---------------------------------------------------------path_commands_e
|
||||
enum path_commands_e
|
||||
{
|
||||
path_cmd_stop = 0, //----path_cmd_stop
|
||||
path_cmd_move_to = 1, //----path_cmd_move_to
|
||||
path_cmd_line_to = 2, //----path_cmd_line_to
|
||||
path_cmd_curve3 = 3, //----path_cmd_curve3
|
||||
path_cmd_curve4 = 4, //----path_cmd_curve4
|
||||
path_cmd_curveN = 5, //----path_cmd_curveN
|
||||
path_cmd_catrom = 6, //----path_cmd_catrom
|
||||
path_cmd_ubspline = 7, //----path_cmd_ubspline
|
||||
path_cmd_end_poly = 0x0F, //----path_cmd_end_poly
|
||||
path_cmd_mask = 0x0F //----path_cmd_mask
|
||||
path_cmd_stop = 0, //----path_cmd_stop
|
||||
path_cmd_move_to = 1, //----path_cmd_move_to
|
||||
path_cmd_line_to = 2, //----path_cmd_line_to
|
||||
path_cmd_curve3 = 3, //----path_cmd_curve3
|
||||
path_cmd_curve4 = 4, //----path_cmd_curve4
|
||||
path_cmd_curveN = 5, //----path_cmd_curveN
|
||||
path_cmd_catrom = 6, //----path_cmd_catrom
|
||||
path_cmd_ubspline = 7, //----path_cmd_ubspline
|
||||
path_cmd_end_poly = 0x0F, //----path_cmd_end_poly
|
||||
path_cmd_mask = 0x0F //----path_cmd_mask
|
||||
};
|
||||
|
||||
//------------------------------------------------------------path_flags_e
|
||||
enum path_flags_e
|
||||
{
|
||||
path_flags_none = 0, //----path_flags_none
|
||||
path_flags_ccw = 0x10, //----path_flags_ccw
|
||||
path_flags_cw = 0x20, //----path_flags_cw
|
||||
path_flags_close = 0x40, //----path_flags_close
|
||||
path_flags_mask = 0xF0 //----path_flags_mask
|
||||
path_flags_none = 0, //----path_flags_none
|
||||
path_flags_ccw = 0x10, //----path_flags_ccw
|
||||
path_flags_cw = 0x20, //----path_flags_cw
|
||||
path_flags_close = 0x40, //----path_flags_close
|
||||
path_flags_mask = 0xF0 //----path_flags_mask
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------is_vertex
|
||||
@@ -403,7 +448,7 @@ namespace agg
|
||||
|
||||
//-----------------------------------------------------------------is_stop
|
||||
inline bool is_stop(unsigned c)
|
||||
{
|
||||
{
|
||||
return c == path_cmd_stop;
|
||||
}
|
||||
|
||||
@@ -447,7 +492,7 @@ namespace agg
|
||||
inline bool is_close(unsigned c)
|
||||
{
|
||||
return (c & ~(path_flags_cw | path_flags_ccw)) ==
|
||||
(path_cmd_end_poly | path_flags_close);
|
||||
(path_cmd_end_poly | path_flags_close);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------is_next_poly
|
||||
@@ -471,19 +516,19 @@ namespace agg
|
||||
//-------------------------------------------------------------is_oriented
|
||||
inline bool is_oriented(unsigned c)
|
||||
{
|
||||
return (c & (path_flags_cw | path_flags_ccw)) != 0;
|
||||
return (c & (path_flags_cw | path_flags_ccw)) != 0;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------is_closed
|
||||
inline bool is_closed(unsigned c)
|
||||
{
|
||||
return (c & path_flags_close) != 0;
|
||||
return (c & path_flags_close) != 0;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------get_close_flag
|
||||
inline unsigned get_close_flag(unsigned c)
|
||||
{
|
||||
return c & path_flags_close;
|
||||
return c & path_flags_close;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------clear_orientation
|
||||
@@ -505,70 +550,77 @@ namespace agg
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------point_base
|
||||
template<class T> struct point_base
|
||||
template <class T>
|
||||
struct point_base
|
||||
{
|
||||
typedef T value_type;
|
||||
T x,y;
|
||||
T x, y;
|
||||
point_base() {}
|
||||
point_base(T x_, T y_) : x(x_), y(y_) {}
|
||||
point_base(T x_, T y_): x(x_), y(y_) {}
|
||||
};
|
||||
typedef point_base<int> point_i; //-----point_i
|
||||
typedef point_base<float> point_f; //-----point_f
|
||||
typedef point_base<int> point_i; //-----point_i
|
||||
typedef point_base<float> point_f; //-----point_f
|
||||
typedef point_base<double> point_d; //-----point_d
|
||||
|
||||
//-------------------------------------------------------------vertex_base
|
||||
template<class T> struct vertex_base
|
||||
template <class T>
|
||||
struct vertex_base
|
||||
{
|
||||
typedef T value_type;
|
||||
T x,y;
|
||||
T x, y;
|
||||
unsigned cmd;
|
||||
vertex_base() {}
|
||||
vertex_base(T x_, T y_, unsigned cmd_) : x(x_), y(y_), cmd(cmd_) {}
|
||||
vertex_base(T x_, T y_, unsigned cmd_): x(x_), y(y_), cmd(cmd_) {}
|
||||
};
|
||||
typedef vertex_base<int> vertex_i; //-----vertex_i
|
||||
typedef vertex_base<float> vertex_f; //-----vertex_f
|
||||
typedef vertex_base<int> vertex_i; //-----vertex_i
|
||||
typedef vertex_base<float> vertex_f; //-----vertex_f
|
||||
typedef vertex_base<double> vertex_d; //-----vertex_d
|
||||
|
||||
//----------------------------------------------------------------row_info
|
||||
template<class T> struct row_info
|
||||
template <class T>
|
||||
struct row_info
|
||||
{
|
||||
int x1, x2;
|
||||
T* ptr;
|
||||
row_info() {}
|
||||
row_info(int x1_, int x2_, T* ptr_) : x1(x1_), x2(x2_), ptr(ptr_) {}
|
||||
row_info(int x1_, int x2_, T* ptr_): x1(x1_), x2(x2_), ptr(ptr_) {}
|
||||
};
|
||||
|
||||
//----------------------------------------------------------const_row_info
|
||||
template<class T> struct const_row_info
|
||||
template <class T>
|
||||
struct const_row_info
|
||||
{
|
||||
int x1, x2;
|
||||
const T* ptr;
|
||||
const_row_info() {}
|
||||
const_row_info(int x1_, int x2_, const T* ptr_) :
|
||||
x1(x1_), x2(x2_), ptr(ptr_) {}
|
||||
const_row_info(int x1_, int x2_, const T* ptr_):
|
||||
x1(x1_),
|
||||
x2(x2_),
|
||||
ptr(ptr_)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
//------------------------------------------------------------is_equal_eps
|
||||
template<class T> inline bool is_equal_eps(T v1, T v2, T epsilon)
|
||||
template <class T>
|
||||
inline bool is_equal_eps(T v1, T v2, T epsilon)
|
||||
{
|
||||
bool neg1 = v1 < 0.0;
|
||||
bool neg2 = v2 < 0.0;
|
||||
bool neg1 = v1 < 0.0;
|
||||
bool neg2 = v2 < 0.0;
|
||||
|
||||
if (neg1 != neg2)
|
||||
return std::fabs(v1) < epsilon && std::fabs(v2) < epsilon;
|
||||
if (neg1 != neg2)
|
||||
return std::fabs(v1) < epsilon && std::fabs(v2) < epsilon;
|
||||
|
||||
int int1, int2;
|
||||
std::frexp(v1, &int1);
|
||||
std::frexp(v2, &int2);
|
||||
int min12 = int1 < int2 ? int1 : int2;
|
||||
std::frexp(v1, &int1);
|
||||
std::frexp(v2, &int2);
|
||||
int min12 = int1 < int2 ? int1 : int2;
|
||||
|
||||
v1 = std::ldexp(v1, -min12);
|
||||
v2 = std::ldexp(v2, -min12);
|
||||
v1 = std::ldexp(v1, -min12);
|
||||
v2 = std::ldexp(v2, -min12);
|
||||
|
||||
return std::fabs(v1 - v2) < epsilon;
|
||||
return std::fabs(v1 - v2) < epsilon;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -13,7 +13,7 @@
|
||||
// http://www.antigrain.com
|
||||
//----------------------------------------------------------------------------
|
||||
//
|
||||
// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e.,
|
||||
// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e.,
|
||||
// 4, 7, 10, or 13 vertices.
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -27,33 +27,42 @@ namespace agg
|
||||
{
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
void arc_to_bezier(double cx, double cy, double rx, double ry,
|
||||
double start_angle, double sweep_angle,
|
||||
double* curve);
|
||||
|
||||
void arc_to_bezier(double cx,
|
||||
double cy,
|
||||
double rx,
|
||||
double ry,
|
||||
double start_angle,
|
||||
double sweep_angle,
|
||||
double* curve);
|
||||
|
||||
//==============================================================bezier_arc
|
||||
//
|
||||
//
|
||||
// See implemantaion agg_bezier_arc.cpp
|
||||
//
|
||||
class bezier_arc
|
||||
{
|
||||
public:
|
||||
//--------------------------------------------------------------------
|
||||
bezier_arc() : m_vertex(26), m_num_vertices(0), m_cmd(path_cmd_line_to) {}
|
||||
bezier_arc(double x, double y,
|
||||
double rx, double ry,
|
||||
double start_angle,
|
||||
double sweep_angle)
|
||||
bezier_arc(): m_vertex(26), m_num_vertices(0), m_cmd(path_cmd_line_to)
|
||||
{
|
||||
}
|
||||
bezier_arc(double x,
|
||||
double y,
|
||||
double rx,
|
||||
double ry,
|
||||
double start_angle,
|
||||
double sweep_angle)
|
||||
{
|
||||
init(x, y, rx, ry, start_angle, sweep_angle);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void init(double x, double y,
|
||||
double rx, double ry,
|
||||
double start_angle,
|
||||
double sweep_angle);
|
||||
void init(double x,
|
||||
double y,
|
||||
double rx,
|
||||
double ry,
|
||||
double start_angle,
|
||||
double sweep_angle);
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void rewind(unsigned)
|
||||
@@ -64,67 +73,85 @@ namespace agg
|
||||
//--------------------------------------------------------------------
|
||||
unsigned vertex(double* x, double* y)
|
||||
{
|
||||
if(m_vertex >= m_num_vertices) return path_cmd_stop;
|
||||
if (m_vertex >= m_num_vertices)
|
||||
return path_cmd_stop;
|
||||
*x = m_vertices[m_vertex];
|
||||
*y = m_vertices[m_vertex + 1];
|
||||
m_vertex += 2;
|
||||
return (m_vertex == 2) ? unsigned(path_cmd_move_to) : m_cmd;
|
||||
}
|
||||
|
||||
// Supplemantary functions. num_vertices() actually returns doubled
|
||||
// Supplemantary functions. num_vertices() actually returns doubled
|
||||
// number of vertices. That is, for 1 vertex it returns 2.
|
||||
//--------------------------------------------------------------------
|
||||
unsigned num_vertices() const { return m_num_vertices; }
|
||||
const double* vertices() const { return m_vertices; }
|
||||
double* vertices() { return m_vertices; }
|
||||
|
||||
unsigned num_vertices() const
|
||||
{
|
||||
return m_num_vertices;
|
||||
}
|
||||
const double* vertices() const
|
||||
{
|
||||
return m_vertices;
|
||||
}
|
||||
double* vertices()
|
||||
{
|
||||
return m_vertices;
|
||||
}
|
||||
|
||||
private:
|
||||
unsigned m_vertex;
|
||||
unsigned m_num_vertices;
|
||||
double m_vertices[26];
|
||||
double m_vertices[26];
|
||||
unsigned m_cmd;
|
||||
};
|
||||
|
||||
|
||||
|
||||
//==========================================================bezier_arc_svg
|
||||
// Compute an SVG-style bezier arc.
|
||||
// Compute an SVG-style bezier arc.
|
||||
//
|
||||
// Computes an elliptical arc from (x1, y1) to (x2, y2). The size and
|
||||
// orientation of the ellipse are defined by two radii (rx, ry)
|
||||
// and an x-axis-rotation, which indicates how the ellipse as a whole
|
||||
// is rotated relative to the current coordinate system. The center
|
||||
// (cx, cy) of the ellipse is calculated automatically to satisfy the
|
||||
// constraints imposed by the other parameters.
|
||||
// large-arc-flag and sweep-flag contribute to the automatic calculations
|
||||
// Computes an elliptical arc from (x1, y1) to (x2, y2). The size and
|
||||
// orientation of the ellipse are defined by two radii (rx, ry)
|
||||
// and an x-axis-rotation, which indicates how the ellipse as a whole
|
||||
// is rotated relative to the current coordinate system. The center
|
||||
// (cx, cy) of the ellipse is calculated automatically to satisfy the
|
||||
// constraints imposed by the other parameters.
|
||||
// large-arc-flag and sweep-flag contribute to the automatic calculations
|
||||
// and help determine how the arc is drawn.
|
||||
class bezier_arc_svg
|
||||
{
|
||||
public:
|
||||
//--------------------------------------------------------------------
|
||||
bezier_arc_svg() : m_arc(), m_radii_ok(false) {}
|
||||
bezier_arc_svg(): m_arc(), m_radii_ok(false) {}
|
||||
|
||||
bezier_arc_svg(double x1, double y1,
|
||||
double rx, double ry,
|
||||
double angle,
|
||||
bool large_arc_flag,
|
||||
bool sweep_flag,
|
||||
double x2, double y2) :
|
||||
m_arc(), m_radii_ok(false)
|
||||
bezier_arc_svg(double x1,
|
||||
double y1,
|
||||
double rx,
|
||||
double ry,
|
||||
double angle,
|
||||
bool large_arc_flag,
|
||||
bool sweep_flag,
|
||||
double x2,
|
||||
double y2):
|
||||
m_arc(),
|
||||
m_radii_ok(false)
|
||||
{
|
||||
init(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void init(double x1, double y1,
|
||||
double rx, double ry,
|
||||
double angle,
|
||||
bool large_arc_flag,
|
||||
bool sweep_flag,
|
||||
double x2, double y2);
|
||||
void init(double x1,
|
||||
double y1,
|
||||
double rx,
|
||||
double ry,
|
||||
double angle,
|
||||
bool large_arc_flag,
|
||||
bool sweep_flag,
|
||||
double x2,
|
||||
double y2);
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
bool radii_ok() const { return m_radii_ok; }
|
||||
bool radii_ok() const
|
||||
{
|
||||
return m_radii_ok;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
void rewind(unsigned)
|
||||
@@ -138,22 +165,27 @@ namespace agg
|
||||
return m_arc.vertex(x, y);
|
||||
}
|
||||
|
||||
// Supplemantary functions. num_vertices() actually returns doubled
|
||||
// Supplemantary functions. num_vertices() actually returns doubled
|
||||
// number of vertices. That is, for 1 vertex it returns 2.
|
||||
//--------------------------------------------------------------------
|
||||
unsigned num_vertices() const { return m_arc.num_vertices(); }
|
||||
const double* vertices() const { return m_arc.vertices(); }
|
||||
double* vertices() { return m_arc.vertices(); }
|
||||
unsigned num_vertices() const
|
||||
{
|
||||
return m_arc.num_vertices();
|
||||
}
|
||||
const double* vertices() const
|
||||
{
|
||||
return m_arc.vertices();
|
||||
}
|
||||
double* vertices()
|
||||
{
|
||||
return m_arc.vertices();
|
||||
}
|
||||
|
||||
private:
|
||||
bezier_arc m_arc;
|
||||
bool m_radii_ok;
|
||||
bool m_radii_ok;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -20,19 +20,20 @@
|
||||
|
||||
namespace agg
|
||||
{
|
||||
|
||||
|
||||
class bitset_iterator
|
||||
{
|
||||
public:
|
||||
bitset_iterator(const int8u* bits, unsigned offset = 0) :
|
||||
bitset_iterator(const int8u* bits, unsigned offset = 0):
|
||||
m_bits(bits + (offset >> 3)),
|
||||
m_mask(0x80 >> (offset & 7))
|
||||
{}
|
||||
{
|
||||
}
|
||||
|
||||
void operator ++ ()
|
||||
void operator++()
|
||||
{
|
||||
m_mask >>= 1;
|
||||
if(m_mask == 0)
|
||||
if (m_mask == 0)
|
||||
{
|
||||
++m_bits;
|
||||
m_mask = 0x80;
|
||||
@@ -46,7 +47,7 @@ namespace agg
|
||||
|
||||
private:
|
||||
const int8u* m_bits;
|
||||
int8u m_mask;
|
||||
int8u m_mask;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -25,10 +25,15 @@ namespace agg
|
||||
{
|
||||
|
||||
//-----------------------------------------------------------bounding_rect
|
||||
template<class VertexSource, class GetId, class CoordT>
|
||||
bool bounding_rect(VertexSource& vs, GetId& gi,
|
||||
unsigned start, unsigned num,
|
||||
CoordT* x1, CoordT* y1, CoordT* x2, CoordT* y2)
|
||||
template <class VertexSource, class GetId, class CoordT>
|
||||
bool bounding_rect(VertexSource& vs,
|
||||
GetId& gi,
|
||||
unsigned start,
|
||||
unsigned num,
|
||||
CoordT* x1,
|
||||
CoordT* y1,
|
||||
CoordT* x2,
|
||||
CoordT* y2)
|
||||
{
|
||||
unsigned i;
|
||||
double x;
|
||||
@@ -40,15 +45,15 @@ namespace agg
|
||||
*x2 = CoordT(0);
|
||||
*y2 = CoordT(0);
|
||||
|
||||
for(i = 0; i < num; i++)
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
vs.rewind(gi[start + i]);
|
||||
unsigned cmd;
|
||||
while(!is_stop(cmd = vs.vertex(&x, &y)))
|
||||
while (!is_stop(cmd = vs.vertex(&x, &y)))
|
||||
{
|
||||
if(is_vertex(cmd))
|
||||
if (is_vertex(cmd))
|
||||
{
|
||||
if(first)
|
||||
if (first)
|
||||
{
|
||||
*x1 = CoordT(x);
|
||||
*y1 = CoordT(y);
|
||||
@@ -58,10 +63,14 @@ namespace agg
|
||||
}
|
||||
else
|
||||
{
|
||||
if(CoordT(x) < *x1) *x1 = CoordT(x);
|
||||
if(CoordT(y) < *y1) *y1 = CoordT(y);
|
||||
if(CoordT(x) > *x2) *x2 = CoordT(x);
|
||||
if(CoordT(y) > *y2) *y2 = CoordT(y);
|
||||
if (CoordT(x) < *x1)
|
||||
*x1 = CoordT(x);
|
||||
if (CoordT(y) < *y1)
|
||||
*y1 = CoordT(y);
|
||||
if (CoordT(x) > *x2)
|
||||
*x2 = CoordT(x);
|
||||
if (CoordT(y) > *y2)
|
||||
*y2 = CoordT(y);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -69,11 +78,14 @@ namespace agg
|
||||
return *x1 <= *x2 && *y1 <= *y2;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------bounding_rect_single
|
||||
template<class VertexSource, class CoordT>
|
||||
bool bounding_rect_single(VertexSource& vs, unsigned path_id,
|
||||
CoordT* x1, CoordT* y1, CoordT* x2, CoordT* y2)
|
||||
template <class VertexSource, class CoordT>
|
||||
bool bounding_rect_single(VertexSource& vs,
|
||||
unsigned path_id,
|
||||
CoordT* x1,
|
||||
CoordT* y1,
|
||||
CoordT* x2,
|
||||
CoordT* y2)
|
||||
{
|
||||
double x;
|
||||
double y;
|
||||
@@ -86,11 +98,11 @@ namespace agg
|
||||
|
||||
vs.rewind(path_id);
|
||||
unsigned cmd;
|
||||
while(!is_stop(cmd = vs.vertex(&x, &y)))
|
||||
while (!is_stop(cmd = vs.vertex(&x, &y)))
|
||||
{
|
||||
if(is_vertex(cmd))
|
||||
if (is_vertex(cmd))
|
||||
{
|
||||
if(first)
|
||||
if (first)
|
||||
{
|
||||
*x1 = CoordT(x);
|
||||
*y1 = CoordT(y);
|
||||
@@ -100,17 +112,20 @@ namespace agg
|
||||
}
|
||||
else
|
||||
{
|
||||
if(CoordT(x) < *x1) *x1 = CoordT(x);
|
||||
if(CoordT(y) < *y1) *y1 = CoordT(y);
|
||||
if(CoordT(x) > *x2) *x2 = CoordT(x);
|
||||
if(CoordT(y) > *y2) *y2 = CoordT(y);
|
||||
if (CoordT(x) < *x1)
|
||||
*x1 = CoordT(x);
|
||||
if (CoordT(y) < *y1)
|
||||
*y1 = CoordT(y);
|
||||
if (CoordT(x) > *x2)
|
||||
*x2 = CoordT(x);
|
||||
if (CoordT(y) > *y2)
|
||||
*y2 = CoordT(y);
|
||||
}
|
||||
}
|
||||
}
|
||||
return *x1 <= *x2 && *y1 <= *y2;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
// Anti-Grain Geometry - Version 2.4
|
||||
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
||||
//
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// Permission to copy, use, modify, sell and distribute this software
|
||||
// is granted provided this copyright notice appears in all copies.
|
||||
// This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
//
|
||||
@@ -26,51 +26,49 @@ namespace agg
|
||||
{
|
||||
//----------------------------------------------------------------bspline
|
||||
// A very simple class of Bi-cubic Spline interpolation.
|
||||
// First call init(num, x[], y[]) where num - number of source points,
|
||||
// x, y - arrays of X and Y values respectively. Here Y must be a function
|
||||
// of X. It means that all the X-coordinates must be arranged in the ascending
|
||||
// order.
|
||||
// Then call get(x) that calculates a value Y for the respective X.
|
||||
// The class supports extrapolation, i.e. you can call get(x) where x is
|
||||
// outside the given with init() X-range. Extrapolation is a simple linear
|
||||
// function.
|
||||
// First call init(num, x[], y[]) where num - number of source points,
|
||||
// x, y - arrays of X and Y values respectively. Here Y must be a function
|
||||
// of X. It means that all the X-coordinates must be arranged in the
|
||||
// ascending order. Then call get(x) that calculates a value Y for the
|
||||
// respective X. The class supports extrapolation, i.e. you can call get(x)
|
||||
// where x is outside the given with init() X-range. Extrapolation is a
|
||||
// simple linear function.
|
||||
//
|
||||
// See Implementation agg_bspline.cpp
|
||||
//------------------------------------------------------------------------
|
||||
class bspline
|
||||
class bspline
|
||||
{
|
||||
public:
|
||||
bspline();
|
||||
bspline(int num);
|
||||
bspline(int num, const double* x, const double* y);
|
||||
|
||||
void init(int num);
|
||||
void add_point(double x, double y);
|
||||
void prepare();
|
||||
void init(int num);
|
||||
void add_point(double x, double y);
|
||||
void prepare();
|
||||
|
||||
void init(int num, const double* x, const double* y);
|
||||
void init(int num, const double* x, const double* y);
|
||||
|
||||
double get(double x) const;
|
||||
double get_stateful(double x) const;
|
||||
|
||||
|
||||
private:
|
||||
bspline(const bspline&);
|
||||
const bspline& operator = (const bspline&);
|
||||
const bspline& operator=(const bspline&);
|
||||
|
||||
static void bsearch(int n, const double *x, double x0, int *i);
|
||||
static void bsearch(int n, const double* x, double x0, int* i);
|
||||
double extrapolation_left(double x) const;
|
||||
double extrapolation_right(double x) const;
|
||||
double interpolation(double x, int i) const;
|
||||
|
||||
int m_max;
|
||||
int m_num;
|
||||
double* m_x;
|
||||
double* m_y;
|
||||
int m_max;
|
||||
int m_num;
|
||||
double* m_x;
|
||||
double* m_y;
|
||||
pod_array<double> m_am;
|
||||
mutable int m_last_idx;
|
||||
mutable int m_last_idx;
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user