Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 28 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,35 @@ test-coverage: clean
cmake -S . -B build/coverage -G "Ninja" -DCMAKE_BUILD_TYPE=Debug -DENABLE_COVERAGE=ON $(CMAKE_OPTS)
cmake --build build/coverage
cd build/coverage && ctest --output-on-failure
@echo ""
@echo "Generating coverage report..."
@lcov --capture --directory build/coverage --output-file build/coverage/coverage.info --ignore-errors mismatch,inconsistent,unsupported,format 2>&1 | grep -E "^(Capturing|geninfo|Found|Using|Recording|Writing|Scanning|Finished|Summary coverage rate:| (source files|lines|functions)|Filter|Message summary:| [0-9]+ (warning|error|ignore) message)" | grep -v "WARNING:" || true
@lcov --remove build/coverage/coverage.info '/usr/*' '*/googletest/*' '*/json-src/*' '*/c2pa_prebuilt-src/*' '*/tests/*' --output-file build/coverage/coverage_filtered.info --ignore-errors unused,mismatch,inconsistent,format 2>&1 | grep -E "^(Removing|Deleted|Writing|Summary coverage rate:| (source files|lines|functions))" | grep -v "Excluding" || true
@genhtml build/coverage/coverage_filtered.info --output-directory build/coverage/html --ignore-errors inconsistent,corrupt,unsupported,format,category 2>&1 | grep -E "^(Reading|Found|Generating|Processing|Overall coverage rate:| (source files|lines|functions))" || true
@echo "HTML report: build/coverage/html/index.html"
@lcov --capture --directory build/coverage --output-file build/coverage/coverage.info \
--ignore-errors mismatch,inconsistent,unsupported,format 2>&1 \
| grep -v "WARNING:" || { echo "Error: lcov capture failed"; exit 1; }
@lcov --remove build/coverage/coverage.info \
'/usr/*' '*/googletest/*' '*/json-src/*' '*/c2pa_prebuilt-src/*' '*/tests/*' \
--output-file build/coverage/coverage_filtered.info \
--ignore-errors unused,mismatch,inconsistent,format 2>&1 \
| grep -v "WARNING:" || { echo "Error: lcov filter failed"; exit 1; }
@echo ""
@echo "=== Coverage Summary ==="
@lcov --summary build/coverage/coverage_filtered.info \
--ignore-errors inconsistent,format 2>&1 \
| grep -E "(lines|functions|branches)" || true
@echo "========================"
@echo ""
@if command -v genhtml > /dev/null 2>&1; then \
genhtml build/coverage/coverage_filtered.info --output-directory build/coverage/html \
--ignore-errors inconsistent,corrupt,unsupported,format,category 2>&1 \
| grep -v "WARNING:" || true; \
if [ -f build/coverage/html/index.html ]; then \
echo "HTML report: build/coverage/html/index.html"; \
else \
echo "Warning: HTML report was not generated (genhtml may have failed)"; \
fi; \
else \
echo "Note: genhtml not found, skipping HTML report (install lcov for HTML reports)"; \
fi

# Demo targets
demo: release
Expand Down
41 changes: 31 additions & 10 deletions docs/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,32 +78,53 @@ NOTE: If you don't specify a value for a property, then the SDK will use the def

### Creating a Context

The `Context` class provides several convenient factory methods for creating configured contexts:
The `Context` class manages C2PA SDK configuration. There are two ways to create a context: direct construction and the ContextBuilder.

#### Direct construction

```cpp
// Create with default settings
auto context = c2pa::Context::create();
// Default settings
c2pa::Context context;

// From a Settings object
c2pa::Settings settings;
settings.set("builder.thumbnail.enabled", "true");
c2pa::Context context(settings);

// Create from JSON configuration
auto context = c2pa::Context::from_json(R"({
// From a JSON configuration string
c2pa::Context context(R"({
"builder": {
"thumbnail": {
"enabled": true
}
}
})");
```

#### ContextBuilder

// Create from Settings object for programmatic configuration
The builder pattern is useful when you need to layer multiple configuration sources:

```cpp
c2pa::Settings settings;
settings.set("builder.thumbnail.enabled", "true");
auto context = c2pa::Context::from_settings(settings);

auto context = c2pa::Context::ContextBuilder()
.with_settings(settings)
.with_json(R"({"verify": {"verify_after_sign": true}})")
.create_context();
```

Once created, contexts can be passed to Builder and Reader constructors:
Note: the ContextBuilder is consumed after calling `create_context()`. For single-source configuration, prefer direct construction.

#### Using a Context

Contexts are passed by reference to Builder and Reader constructors. The context must remain valid for the lifetime of the Builder or Reader:

```cpp
auto builder = c2pa::Builder(context, manifest_json);
auto reader = c2pa::Reader(context, "image.jpg");
c2pa::Context context;
c2pa::Builder builder(context, manifest_json);
c2pa::Reader reader(context, "image.jpg");
```

## Creating a Builder
Expand Down
Loading