# prsyahmi/wic_heic architecture

> Architecture diagram of the GitHub repository prsyahmi/wic_heic, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/prsyahmi/wic_heic
- Repository: https://github.com/prsyahmi/wic_heic

## Overview

This is a Windows Imaging Component (WIC) codec that lets Windows imaging clients open HEIC files, with encoder support also implemented. The main workflow is WIC class activation, decoder initialization from an IStream, frame selection, then pixel and metadata access; encoding follows the corresponding WIC encoder and frame interfaces. The graph includes COM registration and the libheif boundary. Unsampled encoder internals are shown as components, but their specific call relationships are left unverified.

Main entry points: [`wic_heic/HeicBitmapDecoder.cpp`](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicBitmapDecoder.cpp) (WIC Decoder), [`wic_heic/ComFactory.cpp`](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/ComFactory.cpp) (COM Class Factory), [`wic_heic/HeicBitmapEncoder.cpp`](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicBitmapEncoder.cpp) (WIC Encoder), [`wic_heic/dllmain.cpp`](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/dllmain.cpp) (Codec DLL)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_activation["COM Activation"]
  node_dll["Codec DLL<br/>[dllmain.cpp]"]
  node_factory["COM Class Factory<br/>[ComFactory.cpp]"]
  node_counter["COM Lifetime Counter<br/>[ComCounter.cpp]"]
  node_registration["Codec Registration<br/>[UtlReg.cpp]"]
end

subgraph group_decode["HEIC Decoding"]
  node_decoder["WIC Decoder"]
  node_reader["HEIF Stream Reader"]
  node_libheif["libheif Context"]
  node_frame["Decoded Frame"]
  node_metadata["Metadata Reader"]
end

subgraph group_encode["HEIC Encoding"]
  node_encoder["WIC Encoder"]
  node_encodeframe["Encode Frame"]
  node_writer["HEIF Stream Writer"]
end

subgraph group_support["Codec Support"]
  node_exception["Codec Exceptions<br/>[HeicException.cpp]"]
end

node_client(("WIC Client"))
node_registry[("Windows Registry")]

node_client -->|"activates codec"| node_dll
node_dll -->|"requests class factory"| node_factory
node_dll -->|"registers codec"| node_registration
node_registration -->|"writes registrations"| node_registry
node_factory -->|"creates decoder"| node_decoder
node_factory -->|"creates encoder"| node_encoder
node_factory -->|"tracks lifetime"| node_counter
node_client -->|"opens HEIC"| node_decoder
node_decoder -->|"reads stream"| node_reader
node_decoder -.->|"loads context"| node_libheif
node_decoder -->|"creates frame"| node_frame
node_frame -->|"decodes pixels"| node_libheif
node_frame -->|"creates query reader"| node_metadata
node_client -.->|"requests encoding"| node_encoder
node_encoder -.->|"creates frame"| node_encodeframe
node_encoder -.->|"writes output"| node_writer

click node_dll "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/dllmain.cpp"
click node_factory "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/ComFactory.cpp"
click node_counter "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/ComCounter.cpp"
click node_registration "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/UtlReg.cpp"
click node_decoder "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicBitmapDecoder.cpp"
click node_reader "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeifStreamReader.cpp"
click node_frame "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicBitmapFrameDecode.cpp"
click node_metadata "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicMetadataBlockReader.cpp"
click node_encoder "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicBitmapEncoder.cpp"
click node_encodeframe "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicBitmapFrameEncode.cpp"
click node_writer "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeifStreamWriter.cpp"
click node_exception "https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicException.cpp"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_dll,node_factory,node_counter,node_registration,node_client toneBlue
class node_decoder,node_reader,node_libheif,node_frame,node_metadata,node_registry toneAmber
class node_encoder,node_encodeframe,node_writer toneMint
class node_exception toneRose
```

## Components

### COM Activation

- [Codec DLL](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/dllmain.cpp): `wic_heic/dllmain.cpp`
- [COM Class Factory](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/ComFactory.cpp): `wic_heic/ComFactory.cpp`
- [COM Lifetime Counter](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/ComCounter.cpp): `wic_heic/ComCounter.cpp`
- [Codec Registration](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/UtlReg.cpp): `wic_heic/UtlReg.cpp`

### HEIC Decoding

- [WIC Decoder](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicBitmapDecoder.cpp): `wic_heic/HeicBitmapDecoder.cpp`
- [HEIF Stream Reader](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeifStreamReader.cpp): `wic_heic/HeifStreamReader.cpp`
- **libheif Context**
- [Decoded Frame](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicBitmapFrameDecode.cpp): `wic_heic/HeicBitmapFrameDecode.cpp`
- [Metadata Reader](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicMetadataBlockReader.cpp): `wic_heic/HeicMetadataBlockReader.cpp`

### HEIC Encoding

- [WIC Encoder](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicBitmapEncoder.cpp): `wic_heic/HeicBitmapEncoder.cpp`
- [Encode Frame](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicBitmapFrameEncode.cpp): `wic_heic/HeicBitmapFrameEncode.cpp`
- [HEIF Stream Writer](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeifStreamWriter.cpp): `wic_heic/HeifStreamWriter.cpp`

### Codec Support

- [Codec Exceptions](https://github.com/prsyahmi/wic_heic/blob/master/wic_heic/HeicException.cpp): `wic_heic/HeicException.cpp`

### Other components

- **WIC Client**
- **Windows Registry**

## Connections

- WIC Client → Codec DLL: activates codec (evidence: `README.md`)
- Codec DLL → COM Class Factory: requests class factory (evidence: `wic_heic/dllmain.cpp`)
- Codec DLL → Codec Registration: registers codec (evidence: `wic_heic/dllmain.cpp`)
- Codec Registration → Windows Registry: writes registrations
- COM Class Factory → WIC Decoder: creates decoder (evidence: `wic_heic/ComFactory.cpp`)
- COM Class Factory → WIC Encoder: creates encoder (evidence: `wic_heic/ComFactory.cpp`)
- COM Class Factory → COM Lifetime Counter: tracks lifetime (evidence: `wic_heic/ComFactory.cpp`)
- WIC Client → WIC Decoder: opens HEIC (evidence: `README.md`)
- WIC Decoder → HEIF Stream Reader: reads stream (evidence: `wic_heic/HeicBitmapDecoder.cpp`)
- WIC Decoder → libheif Context: loads context
- WIC Decoder → Decoded Frame: creates frame (evidence: `wic_heic/HeicBitmapDecoder.cpp`)
- Decoded Frame → libheif Context: decodes pixels (evidence: `wic_heic/HeicBitmapFrameDecode.cpp`)
- Decoded Frame → Metadata Reader: creates query reader (evidence: `wic_heic/HeicBitmapFrameDecode.cpp`)
- WIC Client → WIC Encoder: requests encoding
- WIC Encoder → Encode Frame: creates frame
- WIC Encoder → HEIF Stream Writer: writes output
