L'opacité, le mélange, et ce que demande une presse

Déclarer un réglage de peinture — opacité, mode de mélange, surimpression, trame — et l'appliquer ensuite aux formes par son nom.

Résumé

Un surligneur laisse voir le texte en dessous : la couleur ne cache pas, elle se mélange. Seize façons de mélanger existent ici, celles qu'utilisent les logiciels de dessin — multiplier, éclaircir, différencier — et chacune peut être baissée à moitié, ou au dixième, pour qu'une forme se pose sur la page au lieu de la recouvrir. Le même réglage donne ce que demande un imprimeur et qu'aucun écran ne montre : si une encre se met par-dessus celle qui est déjà sur la feuille ou l'efface, la finesse de la grille de points et le sens dans lequel elle est tournée, la façon dont les couleurs que la presse ne peut pas tenir sont ramenées dans celles qu'elle tient, et la courbe par laquelle passe la teinte en route vers la machine.

Techniquement

Écrit au premier niveau d'une requête, sous "graphics_states"

graphics_states déclare chaque /ExtGState que le document définit pour lui-même, sous le nom par lequel une forme dessinée l'applique : l'opacité de remplissage, celle de trait, le mode de fusion, le masque à travers lequel on voit ce qu'il peint, ce que disent ces opacités et ce masque, ce que les lettres d'un même bloc de texte se font là où elles se recouvrent, la surimpression et ce qu'y signifie une composante à zéro, l'intention de rendu et le point noir, l'ajustement des traits, la finesse avec laquelle une courbe et un dégradé sont déposés, la courbe de transfert, la trame et l'endroit où elle est ancrée. Le dictionnaire est écrit une seule fois quel que soit le nombre de formes qui l'appliquent, et il dure le temps de la forme qui l'a nommé, pas plus. Seul ce qu'il nomme est écrit : un état qui nomme une opacité et rien d'autre laisse tout le reste en l'état.

Schéma de la requête

  • graphics_states — tableau, facultatif, vide par défaut.
  • graphics_states[].name — chaîne, obligatoire. Le nom par lequel les éléments appliquent cet état.
  • graphics_states[].state — objet, obligatoire.
  • state.fill_alpha — nombre de 0 à 1, facultatif. L'opacité de chaque remplissage : 0 laisse tout passer, 1 couvre.
  • state.stroke_alpha — nombre de 0 à 1, facultatif. L'opacité de chaque trait. Le remplissage et le trait se disent séparément : une forme à moitié transparente dehors et pleine dedans nomme les deux.
  • state.blend_mode — chaîne, facultative. Seize valeurs : normal, multiply, screen, overlay, darken, lighten, color_dodge, color_burn, hard_light, soft_light, difference, exclusion, hue, saturation, color, luminosity. Les douze premiers mélangent chaque composante à part, les quatre derniers prennent une couleur entière à la fois.
  • state.alpha_is_shape — booléen, facultatif. Dit si les deux opacités et le masque disent quelle part d'un point est couverte plutôt que l'opacité de la peinture qui s'y dépose. Une forme peinte directement sur la page sort de la même façon dans les deux cas. Les deux lectures se séparent dans un groupe en défonce : à faux, une opacité de 0,4 efface ce qu'une marque précédente a déposé et peint quatre dixièmes de sa couleur à la place ; à vrai, une couverture de 0,4 garde six dixièmes de la marque précédente.
  • state.text_knockout — booléen, facultatif. Dit si les lettres d'un même objet texte sont composées comme un seul objet : à vrai, une lettre posée sur une lettre précédente du même objet texte l'efface et le recouvrement est peint une seule fois ; à faux, chaque lettre est composée pour elle-même et le recouvrement garde les deux. Un bloc text écrit ses lettres dans un seul objet texte, son ombre dans un autre et, s'il est balisé, un objet texte par paragraphe ; un text_path écrit chaque lettre dans un objet texte à part.
  • state.overprint — booléen, facultatif. Dit si un trait et un remplissage laissent tous deux en place les encres déjà présentes sur la feuille, au lieu de les effacer. Le nommer à côté de state.stroke_overprint ou de state.fill_overprint est refusé : les deux disent une seule chose deux fois.
  • state.stroke_overprint — booléen, facultatif. Dit si un trait laisse en place les encres déjà présentes sur la feuille.
  • state.fill_overprint — booléen, facultatif. Dit si un remplissage le fait. Nommez ces deux clés quand une forme surimprime d'un côté et pas de l'autre, et state.overprint quand elle le fait des deux.
  • state.overprint_mode — chaîne, facultatif. Ce que signifie une composante à zéro pendant une surimpression. Deux valeurs : erase_zero, chaque composante est déposée telle qu'elle est donnée, si bien qu'un zéro efface cette encre de la feuille ; keep_zero, un zéro laisse cette encre telle qu'elle a été trouvée et seules les autres composantes sont déposées. keep_zero est ce qui permet à un texte noir sans cyan, ni magenta, ni jaune de se surimprimer sur un fond coloré au lieu d'y creuser un trou.
  • state.rendering_intent — chaîne, facultatif. Comment les couleurs que la destination ne peut pas tenir sont ramenées dans celles qu'elle tient. Quatre valeurs : absolute_colorimetric, chaque couleur est gardée exactement, le blanc compris, et ce qui ne rentre pas est coupé ; relative_colorimetric, chaque couleur est gardée exactement mais toutes sont déplacées pour que le blanc de l'image devienne celui du papier ; saturation, les couleurs sont gardées vives plutôt qu'exactes, ce que veut un graphique ; perceptual, chaque couleur est déplacée, y compris celles qui rentraient, pour que les rapports entre elles survivent, ce que veut une photo.
  • state.black_point_compensation — chaîne, facultatif. Si une conversion tient compte du ton le plus sombre de la source. Trois valeurs : reader, le logiciel de lecture décide, ce que fait aussi le fait de ne rien dire ; on, le ton le plus sombre est pris en compte ; off, il est laissé de côté.
  • state.stroke_adjustment — booléen, facultatif. Dit si un trait trop fin pour couvrir un pixel entier de la machine est élargi à un pixel au lieu d'être laissé pâlir. C'est ce qui garde un filet d'épaisseur égale d'un bout à l'autre d'une page.
  • state.flatness — nombre de 0 à 100, facultatif. L'écart le plus grand, en pixels de la machine, entre une courbe et les segments droits qui la déposent. 0 laisse la machine prendre le sien ; un nombre plus petit donne une courbe plus lisse et plus de segments à déposer. Un nombre hors de cette plage est refusé, 400.
  • state.smoothness — nombre de 0 à 1, facultatif. L'erreur la plus grande avec laquelle un dégradé peut être déposé, en fraction de l'étendue d'une composante de couleur. Un nombre plus petit donne un dégradé plus fin et plus de temps passé par la machine à le déposer. Un nombre hors de cette plage est refusé, 400.
  • state.mask — objet, facultatif. Un dessin déclaré, composé à part de la page et lu comme une couverture au lieu d'être montré : là où il laisse tout passer, ce que l'état peint se met entier ; là où il arrête tout, rien ne se met. Quatre clés :
    • state.mask.drawing — chaîne, obligatoire. Le nom du dessin déclaré dont le masque est fait.
    • state.mask.read — chaîne, facultatif, luminosity par défaut. Ce qui est lu sur ce dessin : luminosity, la clarté avec laquelle il est sorti, le blanc laissant tout passer et le noir arrêtant tout ; ou alpha, l'opacité avec laquelle il est sorti, quelle que soit la couleur dont il a été peint. Une forme peinte en noir à moitié opaque est sombre et à moitié transparente : les deux réponses diffèrent donc.
    • state.mask.space — chaîne, facultatif, valant gray, rgb ou cmyk. L'espace machine dans lequel le dessin est composé, pour un masque lu en lumière. Absent, il est composé dans les trois lumières.
    • state.mask.backdrop — tableau de nombres, facultatif, un par composante de state.mask.space. La couleur que vaut tout ce qui est hors de la boîte du dessin. Absent, elle reste noire, ce qui, pour un masque lu en lumière, arrête tout ce qui est hors de cette boîte. Un masque lu en opacité n'en tient pas compte.
  • state.transfer — facultatif. La courbe par laquelle passe la teinte que demande une couleur, en route vers la machine qui la dépose. La courbe envoie l'intervalle de 0 à 1 sur lui-même et n'est lue que par la machine : rien n'en paraît à l'écran. Chaque courbe est le même objet de fonction sur lequel se construit un dégradé. Trois formes :
    • "page" — la courbe avec laquelle la page a commencé, gardée telle quelle.
    • {"every": {…}} — une seule courbe, lue pour chaque encre d'impression.
    • {"per_ink": [{…}, {…}, {…}, {…}]} — quatre courbes, dans l'ordre cyan, magenta, jaune, noir.
  • state.halftone — facultatif. La trame à travers laquelle une teinte est déposée. Rien de tout cela ne se voit à l'écran. Deux formes :
    • {"every": {…}} — une seule trame, à travers laquelle chaque encre est déposée.
    • {"per_ink": {"inks": […], "default": {…}}}inks, un tableau avec une entrée par encre nommée, chacune contenant un colorant, le nom de l'encre tel que la presse le connaît et tel qu'un espace separation l'énonce, et un screen ; et default, la trame à travers laquelle est déposée chaque encre que la liste ne nomme pas. Les deux sont obligatoires dans per_ink.
  • Une trame contient quatre clés :
    • screen.frequency — nombre, obligatoire. Combien de cellules au pouce compte la grille de points.
    • screen.angle — nombre, obligatoire. De combien de degrés la grille est tournée dans le sens inverse des aiguilles d'une montre. Des plaques tramées au même angle s'impriment l'une sur l'autre, aussi une presse tourne-t-elle chaque encre à son propre angle.
    • screen.spot — chaîne, obligatoire. La forme que prend un point en grossissant à mesure que la teinte s'assombrit.
    • screen.accurate — booléen, facultatif, false par défaut. Dit si l'on demande à la machine son algorithme de tramage précis plutôt que l'ordinaire.
  • screen.spot prend une valeur parmi vingt et une. Points ronds : simple_dot, inverted_simple_dot, double_dot, inverted_double_dot, cosine_dot, double, inverted_double, round. Lignes : line, line_x, line_y. Ovales : ellipse, ellipse_a, inverted_ellipse_a, ellipse_b, ellipse_c, inverted_ellipse_c. Formes anguleuses : square, cross, rhomboid, diamond. Un nom qui finit par une lettre est une deuxième, une troisième ou une quatrième forme ovale ; un nom qui commence par inverted_ grossit depuis les coins de la cellule vers l'intérieur au lieu de grossir depuis son milieu.
  • state.halftone_origin — tableau de deux nombres, facultatif. Le point où la trame est ancrée, dans les coordonnées en vigueur là où l'état est appliqué : la grille de points est posée à partir de là sur la machine, et un changement de coordonnées ultérieur ne la déplace pas. L'entrée est arrivée avec PDF 2.0 : un état qui la nomme exige "version": "2.0", et un document qui en déclare une plus ancienne est refusé, 400.
  • Un élément path, rect, text ou text_path applique un état par sa clé graphics_state.

Une requête entière qui crée un PDF

{
  "version": "2.0",
  "drawings": [
    {
      "name": "window",
      "box": { "llx": 140, "lly": 660, "urx": 280, "ury": 750 },
      "items": [
        {
          "type": "rect",
          "rect": { "llx": 140, "lly": 660, "urx": 210, "ury": 750 },
          "fill": [1, 1, 1]
        }
      ]
    }
  ],
  "graphics_states": [
    {
      "name": "half",
      "state": {
        "mask": { "drawing": "window", "read": "alpha" },
        "fill_alpha": 0.5,
        "blend_mode": "multiply",
        "alpha_is_shape": false,
        "text_knockout": true,
        "rendering_intent": "relative_colorimetric",
        "black_point_compensation": "on",
        "overprint_mode": "erase_zero",
        "flatness": 1,
        "smoothness": 0.02,
        "transfer": "page",
        "halftone": {
          "every": { "frequency": 60, "angle": 45, "spot": "round" }
        },
        "halftone_origin": [12, 24]
      }
    }
  ],
  "items": [
    {
      "type": "rect",
      "rect": { "llx": 60, "lly": 700, "urx": 200, "ury": 790 },
      "fill": [0.85, 0.15, 0.15]
    },
    {
      "type": "rect",
      "rect": { "llx": 140, "lly": 660, "urx": 280, "ury": 750 },
      "fill": [0.15, 0.3, 0.85],
      "graphics_state": "half"
    }
  ]
}

La ligne qui l'envoie, en trois langages

La couleur et la façon dont elle est rendue

L'appareil pour lequel les couleurs sont dites De quelle plaque d'une feuille séparée une page est L'appareil pour lequel les couleurs d'une page sont dites Déclarer une couleur au-delà du rouge-vert-bleu Ce que veulent dire les nombres bruts d'une page Une couleur qui glisse vers une autre Une case répétée pour remplir une forme L'espace dans lequel la page mélange ses couleurs

Où aller ensuite

Toutes les clés JSON d'une requête, en une page Les quarante et un autres réglages d'une requête

Voir les prix Voir les exemples