| # core/ | |
| This directory contains the internal C++ implementation of the PDF | |
| specification. These modules are for internal use and may change without | |
| notice. | |
| ## Subdirectories | |
| PDFium's core is divided into several subdirectories, each with a specific | |
| responsibility: | |
| * **[fdrm/](fdrm/) (Rights Management)**: Provides cryptography primitives | |
| used for PDF security and encryption handling. | |
| * **[fpdfapi/](fpdfapi/README.md) (PDF spec implementation)**: The central | |
| module that understands the PDF format, covering parsing, logical page | |
| representation, rendering coordination, and document editing. | |
| * **[fpdfdoc/](fpdfdoc/) (Document Logic)**: Implements higher-level document | |
| features such as Bookmarks, Annotations, Interactive Forms (AcroForms), and | |
| Links. | |
| * **[fpdftext/](fpdftext/) (Text Extraction)**: Specialized logic for | |
| extracting text, identifying reading order, and performing text searches | |
| within a page. | |
| * **[fxcodec/](fxcodec/) (Codecs)**: Responsible for decoding various PDF | |
| stream formats. It depends on `fxge` for managing target bitmaps. | |
| * **[fxcrt/](fxcrt/) (Common Runtime)**: The foundational layer providing base | |
| types, string handling, custom containers, and memory management utilities. | |
| It has no dependencies on other core modules. | |
| * **[fxge/](fxge/) (Graphics Engine)**: Handles rendering primitives (paths, | |
| glyphs, bitmaps), font management abstractions (FreeType, Skia, AGG), and | |
| device drivers for different platforms. | |
| ## Architectural Flow: Life of a Page | |
| Building a rendered page involves several layers working in concert: | |
| 1. **Parsing**: `fpdfapi/parser` reads raw bytes and builds the PDF object | |
| graph (Dictionaries, Streams, etc.). | |
| 2. **Decoding**: As content is accessed, `fxcodec` decodes compressed data | |
| streams. | |
| 3. **Logical Representation**: `fpdfapi/page` interprets the objects into | |
| higher-level constructs like paths, text objects, and images. | |
| 4. **Rendering**: `fpdfapi/render` traverses the page objects and issues | |
| drawing commands to `fxge`. | |
| 5. **Rasterization**: `fxge` uses its rendering backend (e.g., AGG or Skia) to | |
| convert these primitives into final pixels in a device buffer. | |
| ## Coordinate Systems | |
| PDF documents use **User Space**, a coordinate system where the origin (0,0) is | |
| typically at the bottom-left of the page. Rendering devices (managed by `fxge`) | |
| usually use **Device Space**, where the origin is at the top-left. | |
| `core/` handles the complex affine transformations needed to map between these | |
| spaces, taking into account page rotation, scaling, and the specific | |
| transformation matrices (CTM) defined within content streams. |