zpl.tools
Graphics and images

^GS - Graphic Symbol

Prints one of the built-in legal symbols, selected by the following `^FD`.

^GS prints one of five marks the printer carries in firmware: registered trademark, copyright, trademark, and the UL and CSA approval monograms. A compliance label therefore needs no downloaded graphic for them. No argument of the command selects the mark. The field data that follows selects it, and only its first character.

Syntax

^GSo,h,w

Support

Partially supportedparsed: full · state: full · rendered: partial

The command renders, with the caveat below.

All five symbols render as glyphs of the symbol face, the way Labelary sets them, so each mark matches stroke for stroke. Under ^FR every symbol inverts once, crossings included. The one gap left is the default size: an omitted height or width takes the minimum here and the last ^CF on Labelary. — pinned by test_gs_full_set_at_12dpmm

Labelary renders this command.

Parameters

oOrientationoptional · one of a set

Rotation of the symbol.

Default
the orientation set by ^FW, or N
Invalid value
discarded, and the default applies. Any other value uses the current ^FW orientation.
Test coverage
Values exercised: N, R, I, B. The invalid-value rule is not pinned by a test.
N
Normal (default)
R
Rotated 90° clockwise
I
Inverted 180°
B
Read from bottom up, 270°
hCharacter heightoptional · dots

Height of the symbol in dots.

Default
the character height set by ^CF
Accepted range
1 to 32000 dots
Invalid value
discarded, and the default applies
Test coverage
Bounds pinned: maximum (32000), below the minimum (0), above the maximum (99999999999999999999, 32001). No test at the minimum. The invalid-value rule is not pinned by a test.
wCharacter widthoptional · dots

Width of the symbol in dots.

Default
the character width set by ^CF
Accepted range
1 to 32000 dots
Invalid value
discarded, and the default applies
Test coverage
Bounds pinned: below the minimum (0), above the maximum (32001). No test at the minimum or maximum. The invalid-value rule is not pinned by a test.

Behavior

The selector runs A to E:

^FDSymbol
A® registered trademark
B© copyright
C™ trademark
DUL approval monogram
ECSA approval monogram

The renderer reads the first character only, so ^FDAB and ^FDA render identical output. A character outside A to E, and the lower-case spellings too, draws nothing at all, and does so silently, with no diagnostic and no reserved space. Check this first when a mark is missing from a label.

The symbol is an ordinary field. It needs a preceding ^FO or ^FT, its own ^FD and a closing ^FS, and it reverses under ^FR like any other field.

Coarse size steps

The guide documents the height and width as dots, up to 32000, but the renderer draws the mark at one of ten sizes only. A value at or below 35 renders the smallest mark, and one at or above 228 grows no further. ^GSN,230 and ^GSN,4000 give the same output, and neither reports a warning. We measured this against Labelary on 2026-08-16, and the renderer reproduces it. Treat the arguments as a coarse dial, and where a symbol must match a body of text exactly, check the render and not the numbers.

The two axes quantize independently, so an unequal h and w stretch the mark and do not scale it.

Known issues

Tested behavior

Differences from the specification

Labelary against the ZPL II guide

Where Labelary — our compatibility target — behaves differently from the printed specification.

  • The guide accepts 0 for the height and width; Labelary's own reference documents a minimum of 1. — pinned by test_gs_height_below_min_clamps
  • Labelary rounds each axis to the nearest whole 24 dots, then clamps it to ten steps. The mark is set at an em of 24 to 240 dots. ^GSN,230 and ^GSN,4000 render identically, and anything at or below 35 renders the smallest mark. The guide implies a continuous 0 to 32000 range. We measured this on 2026-08-16. — pinned by test_gs_size_clamps, quantisation_matches_the_measured_table

zpl.tools against the ZPL II guide

Where our renderer behaves differently from the specification.

  • Under ^FR, a ^GS mark inverts once wherever it crosses itself, because the field's ink is composed into one mask and that mask is inverted as a single object. — pinned by test_fr_gs_symbol_inverts_once_where_the_mark_crosses_itself
  • An omitted height or width does not default to ^CF; it takes the 15-dot minimum instead. — not pinned by a test

zpl.tools against Labelary

Where our output differs from Labelary for the same input. These are the differences that break a migration.

  • A ^GS that omits its height and width takes its size from the last ^CF on Labelary; the renderer always draws the 15-dot minimum. We measured this on 2026-07-29: after ^CFD,100,100, a bare ^GS draws a 61-dot mark on Labelary and a 16-dot one here. — not pinned by a test

Example

All five symbols at the same nominal size:

^XA
^FO40,40^GSN,120,120^FDA^FS
^FO190,40^GSN,120,120^FDB^FS
^FO340,40^GSN,120,120^FDC^FS
^FO490,40^GSN,120,120^FDD^FS
^FO640,40^GSN,120,120^FDE^FS
^XZ

Open in viewer