https://github.com/micycle1/ptext
Precise text metrics & manipulation in Processing
https://github.com/micycle1/ptext
geometry processing processing-library
Last synced: 4 months ago
JSON representation
Precise text metrics & manipulation in Processing
- Host: GitHub
- URL: https://github.com/micycle1/ptext
- Owner: micycle1
- Created: 2020-12-07T22:19:17.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2023-03-12T22:40:38.000Z (almost 3 years ago)
- Last Synced: 2024-11-17T08:37:41.859Z (about 1 year ago)
- Topics: geometry, processing, processing-library
- Language: Java
- Homepage:
- Size: 8.37 MB
- Stars: 4
- Watchers: 2
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
🚧 This README (and library) is under construction 🚧
# PText
**PText** bridges the gap between Processing's PFont and PShape classes, providing some much needed functionality when working with text in Processing.
PText extends `PShape`, meaning that is stores text in a vector format. With this, it offers methods to:
* Easily manipulate text dimensions
* Get a text's exact bounds (dimensions)
* Accurately get text's ascent and descent (unlike Processing's existing methods — see [appendix](#Appendix))
* Manipulate text characteristics (such as shear and per-character rotation)
* Visualise per-character bounds, whitespace, and vertices
# API
The PText API is catalogued below.
## Text
* **`setText(text)`**
* **`setFont(fontNameString, fontSize)`**
* **`setFont(PFont)`**
## Dimensions
* **`scale(both)`**
* **`scale(x, y)`**
* **`setScale(both)`**
* **`setScale(x, y)`**
### Width
* **`setTextWidth(n)`**
* **`scaleWidth(n)`**
* **`getTextWidth()`**
### Height
* **`setTextHeight(n)`**
* **`scaleHeight(n)`**
* **`getTextHeight()`**
## Other Text Metrics
* **`getTextAscent()`**
* **`getTextDescent()`**
* **`getFontAscent()`**
* **`getFontDescent()`**
* **`getWhiteSpaceLeft()`**
* **`getWhiteSpaceRight()`**
* **`getCharWidth(character)`**
* **`getCharHeight(character)`**
* **`getCharWhitespace(character)`**
## Text Manipulation
* **`setCharacterSpacing(n)`**
* **`setCharacterRotation(charIndex, angle)`**
> TODO image
* **`setShearX(maxShear)`**
> TODO image
## Rendering
* **`shape(myPText, x, y)`**
Use Processing's `shape()` method to draw the PText like a `PShape` (alignment will be `LEFT`, `BASELINE`).
* **`draw(x, y, alignX, alignY)`**
Or call `draw()` on the PText object to specify a specific X and Y alignment (similar to `textAlign()`).
## Debug
* **`debug()`**
# Example
Resizing a PText shape using setTextWidth() and setTextHeight(), using debug() to show
```
import pText.PText;
PText text;
void setup() {
size(1280, 720);
smooth(4);
text = new PText(this, "Bauhaus 93", 192);
text.setText("hello");
text.setFill(color(55, 255, 90));
text.setStrokeWeight(1);
text.setScale(1, 1);
//shapeMode(CENTER);
text.setTextWidth(width);
text.setTextHeight(height);
noFill(); // you must call global noFill() after any setText(), otherwise text can't be filled
}
void draw() {
background(255);
shape(text, mouseX, mouseY);
//text.debug(mouseX, mouseY);
}
```
# Appendix
Using the inbuilt functions `textWidth()`, `textAscent()`, and `textDescent()` are an easy way to get a *good* approximate result for the height and width of a string (of a given font), but they are not *exact*.
Why?
- `textAscent()` returns text height above the baseline **based on the letter 'd'**
- `textDescent()` returns text height below the baseline **based on the letter 'p'**.
- `textWidth()` includes glyph whitespace (aka padding; ideally we want to ignore this for the first and last characters)
`textAscent() + textDescent()` therefore measures the **maximum height** of a string in a given font and font size, and not the height of a specific string. In other words, if your text doesn't include both 'd' and 'p' characters, then using these methods to determine text height will overestimate the result.
# TODO
- [x] Scale whitespace (to increase/decrease spacing between letters, independent of font size)
- [x] Display dimension labels (such as ascent & descent) in debug mode
- [x] String ascent: return the max ascent of the string's **current** characters
- [x] String descent: return the max descent of the string's **current** characters
- [ ] Allow multiple fonts within one PText at once?
- [ ] Support multiple lines / blocks of text



