summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfm-x/dvi.c
diff options
context:
space:
mode:
authorAkira Kakuto <kakuto@fuk.kindai.ac.jp>2018-09-02 05:52:49 +0000
committerAkira Kakuto <kakuto@fuk.kindai.ac.jp>2018-09-02 05:52:49 +0000
commitfb6550fbe69fce7c2de2436cd935f89b7bab9c07 (patch)
tree2cb3c21866970ffc8f9731ee3dd88a1f42f3f3e9 /Build/source/texk/dvipdfm-x/dvi.c
parent454f3d71a60c411c0e2209264f400ac3adb0a751 (diff)
Experimental support for XeTeX transparency font feature (S. Hirata).
git-svn-id: svn://tug.org/texlive/trunk@48542 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/dvipdfm-x/dvi.c')
-rw-r--r--Build/source/texk/dvipdfm-x/dvi.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/Build/source/texk/dvipdfm-x/dvi.c b/Build/source/texk/dvipdfm-x/dvi.c
index c5607bce672..378582bdeec 100644
--- a/Build/source/texk/dvipdfm-x/dvi.c
+++ b/Build/source/texk/dvipdfm-x/dvi.c
@@ -46,6 +46,8 @@
#include "pdfdoc.h"
#include "pdfparse.h"
#include "pdfencrypt.h"
+#include "pdfresource.h"
+#include "pdfdraw.h"
#include "fontmap.h"
@@ -144,6 +146,7 @@ static struct loaded_font
spt_t size;
int source; /* Source is either DVI or VF */
uint32_t rgba_color;
+ int xgs_id; /* Transparency ExtGState */
struct tt_longMetrics *hvmt;
int ascent;
int descent;
@@ -1490,6 +1493,20 @@ do_fnt (int32_t tex_id)
def_fonts[i].point_size);
}
loaded_fonts[font_id].rgba_color = def_fonts[i].rgba_color;
+ /* Opacity: 0xff is fully opaque. */
+ if ((loaded_fonts[font_id].rgba_color & 0xff) == 0xff) {
+ loaded_fonts[font_id].xgs_id = -1;
+ } else {
+ pdf_obj *xgs_dict;
+ int a = loaded_fonts[font_id].rgba_color & 0xff;
+
+ /* Inefficient but don't care as transparency is not expected to be frequently used. */
+ xgs_dict = pdf_new_dict();
+ pdf_add_dict(xgs_dict, pdf_new_name("Type"), pdf_new_name("ExtGState"));
+ pdf_add_dict(xgs_dict, pdf_new_name("ca"), pdf_new_number(a/255.0));
+ pdf_add_dict(xgs_dict, pdf_new_name("CA"), pdf_new_number(a/255.0));
+ loaded_fonts[font_id].xgs_id = pdf_defineresource("ExtGState", NULL, xgs_dict, 0);
+ }
loaded_fonts[font_id].source = DVI;
def_fonts[i].used = 1;
def_fonts[i].font_id = font_id;
@@ -1707,6 +1724,23 @@ do_glyphs (int do_actual_text)
(double)((unsigned char)(font->rgba_color >> 16) & 0xff) / 255,
(double)((unsigned char)(font->rgba_color >> 8) & 0xff) / 255);
pdf_color_push(&color, &color);
+ /* Opacity:
+ * Enter graphics_mode and then enclose with save/resotre
+ * since pdf_color_pop() may not restore graphics state.
+ */
+ if (font->xgs_id >= 0) {
+ pdf_obj *ref;
+ char resname[16];
+ char content[22];
+
+ sprintf(resname, "Xtx_Gs_%08x", current_font);
+ ref = pdf_get_resource_reference(font->xgs_id);
+ pdf_doc_add_page_resource("ExtGState", resname, ref);
+ graphics_mode();
+ pdf_dev_gsave();
+ sprintf(content, " /%s gs ", resname);
+ pdf_doc_add_page_content(content, strlen(content));
+ }
}
for (i = 0; i < slen; i++) {
@@ -1755,6 +1789,10 @@ do_glyphs (int do_actual_text)
}
if (font->rgba_color != 0xffffffff) {
+ if (font->xgs_id >= 0) {
+ graphics_mode();
+ pdf_dev_grestore();
+ }
pdf_color_pop();
}
RELEASE(xloc);