Ejemplo n.º 1
0
static void PPTX_Text(double x, double y, const char *str, double rot,
		double hadj, const pGEcontext gc, pDevDesc dev) {

	DOCDesc *pd = (DOCDesc *) dev->deviceSpecific;
	int idx = get_and_increment_idx(dev);

	double pi = 3.141592653589793115997963468544185161590576171875;
	double w = PPTX_StrWidth(str, gc, dev);
	if( strlen(str) < 3 ) w+= 1 * w / strlen(str);
	else w += 3 * w / strlen(str);
	double h = getFontSize(gc->cex, gc->ps, gc->lineheight);
	if( h < 1.0 ) return;

	double fontsize = h * 100;

	/* translate and rotate ops */
	//http://www.win.tue.nl/~vanwijk/2IV60/2IV60_3_2D_transformations.pdf
	//http://www.youtube.com/watch?v=otCpCn0l4Wo
	double alpha = -rot * pi / 180;
	double height = h ;
	double Qx = x;
	double Qy = y ;
	double Px = x + (0.5-hadj) * w;
	double Py = y - 0.5 * height;
	double _cos = cos( alpha );
	double _sin = sin( alpha );

	double Ppx = Qx + (Px-Qx) * _cos - (Py-Qy) * _sin ;
	double Ppy = Qy + (Px-Qx) * _sin + (Py-Qy) * _cos;

	double corrected_offx = Ppx - 0.5 * w;
	double corrected_offy = Ppy - 0.5 * h;
	//////////////

	fputs(pptx_elt_tag_start, pd->dmlFilePointer );

	if( pd->editable < 1 )
		fprintf(pd->dmlFilePointer,
			"<p:nvSpPr><p:cNvPr id=\"%d\" name=\"Text %d\" />%s</p:nvSpPr>", idx, idx, pptx_lock_properties);
	else fprintf(pd->dmlFilePointer,
				"<p:nvSpPr><p:cNvPr id=\"%d\" name=\"Text %d\" />%s</p:nvSpPr>", idx, idx, pptx_unlock_properties);
	fputs("<p:spPr>", pd->dmlFilePointer );
	fprintf(pd->dmlFilePointer, "<a:xfrm rot=\"%.0f\">", (-rot) * 60000);
	fprintf(pd->dmlFilePointer, "<a:off x=\"%.0f\" y=\"%.0f\"/>",
			p2e_(pd->offx + corrected_offx), p2e_(pd->offy + corrected_offy));
	fprintf(pd->dmlFilePointer, "<a:ext cx=\"%.0f\" cy=\"%.0f\"/>",
			p2e_(w), p2e_(h));
	fputs("</a:xfrm>", pd->dmlFilePointer );
	fputs("<a:prstGeom prst=\"rect\"><a:avLst /></a:prstGeom>", pd->dmlFilePointer );
	fputs("<a:noFill />", pd->dmlFilePointer );
	fputs("</p:spPr>", pd->dmlFilePointer );

	fputs("<p:txBody>", pd->dmlFilePointer );
	fputs("<a:bodyPr lIns=\"0\" tIns=\"0\" rIns=\"0\" bIns=\"0\" anchor=\"b\">", pd->dmlFilePointer );
	fputs("<a:spAutoFit />", pd->dmlFilePointer );
	fputs("</a:bodyPr><a:lstStyle /><a:p>", pd->dmlFilePointer );
	fputs("<a:pPr", pd->dmlFilePointer );

	if (hadj < 0.25)
		fputs(" algn=\"l\"", pd->dmlFilePointer );
	else if (hadj < 0.75)
		fputs(" algn=\"ctr\"", pd->dmlFilePointer );
	else
		fputs(" algn=\"r\"", pd->dmlFilePointer );
	fputs(" marL=\"0\" marR=\"0\" indent=\"0\" >", pd->dmlFilePointer );
	fprintf(pd->dmlFilePointer, "<a:lnSpc><a:spcPts val=\"%.0f\"/></a:lnSpc>",fontsize);
	fputs("<a:spcBef><a:spcPts val=\"0\"/></a:spcBef>", pd->dmlFilePointer );
	fputs("<a:spcAft><a:spcPts val=\"0\"/></a:spcAft>", pd->dmlFilePointer );

	fputs("</a:pPr>", pd->dmlFilePointer );
	fputs("<a:r>", pd->dmlFilePointer );
	fprintf(pd->dmlFilePointer, "<a:rPr sz=\"%.0f\"", fontsize);
	if (gc->fontface == 2) {
		fputs(" b=\"1\"", pd->dmlFilePointer );
	} else if (gc->fontface == 3) {
		fputs(" i=\"1\"", pd->dmlFilePointer );
	} else if (gc->fontface == 4) {
		fputs(" b=\"1\" i=\"1\"", pd->dmlFilePointer );
	}

	fputs(">", pd->dmlFilePointer );
	DML_SetFontColor(dev, gc);

	fprintf(pd->dmlFilePointer,
				"<a:latin typeface=\"%s\"/><a:cs typeface=\"%s\"/>",
				pd->fi->fontname, pd->fi->fontname);

	fputs("</a:rPr>", pd->dmlFilePointer );

	fprintf(pd->dmlFilePointer, "<a:t>%s</a:t></a:r></a:p></p:txBody>", str);
	fputs(pptx_elt_tag_end, pd->dmlFilePointer );
	//fprintf(pd->dmlFilePointer, "\n");

	fflush(pd->dmlFilePointer);
}
Ejemplo n.º 2
0
static void PPTX_Text(double x, double y, const char *str, double rot,
		double hadj, const pGEcontext gc, pDevDesc dev) {

	DOCDesc *pd = (DOCDesc *) dev->deviceSpecific;
	int idx = get_and_increment_idx(dev);

	double w = PPTX_StrWidth(str, gc, dev);
	w = getStrWidth( str, w);
	double h = pd->fi->height[getFontface(gc->fontface)];
	double fs = getFontSize(gc->cex, gc->ps );
	if( h < 1.0 ) return;

	double corrected_offx = translate_rotate_x(x, y, rot, h, w, hadj) ;
	double corrected_offy = translate_rotate_y(x, y, rot, h, w, hadj) ;

	fputs(pptx_elt_tag_start, pd->dmlFilePointer );

	if( pd->editable < 1 )
		fprintf(pd->dmlFilePointer, "<p:nvSpPr><p:cNvPr id=\"%d\" name=\"Text %d\" />%s</p:nvSpPr>", idx, idx, pptx_lock_properties);
	else fprintf(pd->dmlFilePointer, "<p:nvSpPr><p:cNvPr id=\"%d\" name=\"Text %d\" />%s</p:nvSpPr>", idx, idx, pptx_unlock_properties);

	fputs("<p:spPr>", pd->dmlFilePointer );
	if( fabs( rot ) < 1 )
		fputs("<a:xfrm>", pd->dmlFilePointer);
	else fprintf(pd->dmlFilePointer, "<a:xfrm rot=\"%.0f\">", (-rot) * 60000);
	fprintf(pd->dmlFilePointer, "<a:off x=\"%.0f\" y=\"%.0f\"/>", p2e_(pd->offx + corrected_offx), p2e_(pd->offy + corrected_offy));
	fprintf(pd->dmlFilePointer, "<a:ext cx=\"%.0f\" cy=\"%.0f\"/>", p2e_(w), p2e_(h));
	fputs("</a:xfrm>", pd->dmlFilePointer );
	fputs("<a:prstGeom prst=\"rect\"><a:avLst /></a:prstGeom>", pd->dmlFilePointer );
	fputs("<a:noFill />", pd->dmlFilePointer );
	fputs("</p:spPr>", pd->dmlFilePointer );

	fputs("<p:txBody>", pd->dmlFilePointer );
	fputs("<a:bodyPr lIns=\"0\" tIns=\"0\" rIns=\"0\" bIns=\"0\" anchor=\"b\">", pd->dmlFilePointer );
	//fputs("<a:spAutoFit />", pd->dmlFilePointer );
	fputs("</a:bodyPr><a:lstStyle /><a:p>", pd->dmlFilePointer );
	fputs("<a:pPr", pd->dmlFilePointer );

	if (hadj < 0.25)
		fputs(" algn=\"l\"", pd->dmlFilePointer );
	else if (hadj < 0.75)
		fputs(" algn=\"ctr\"", pd->dmlFilePointer );
	else
		fputs(" algn=\"r\"", pd->dmlFilePointer );
	fputs(" marL=\"0\" marR=\"0\" indent=\"0\" >", pd->dmlFilePointer );
	fprintf(pd->dmlFilePointer, "<a:lnSpc><a:spcPts val=\"%.0f\"/></a:lnSpc>", fs*100);
	fputs("<a:spcBef><a:spcPts val=\"0\"/></a:spcBef>", pd->dmlFilePointer );
	fputs("<a:spcAft><a:spcPts val=\"0\"/></a:spcAft>", pd->dmlFilePointer );

	fputs("</a:pPr>", pd->dmlFilePointer );
	fputs("<a:r>", pd->dmlFilePointer );
	fprintf(pd->dmlFilePointer, "<a:rPr sz=\"%.0f\"", fs*100);
	if (gc->fontface == 2) {
		fputs(" b=\"1\"", pd->dmlFilePointer );
	} else if (gc->fontface == 3) {
		fputs(" i=\"1\"", pd->dmlFilePointer );
	} else if (gc->fontface == 4) {
		fputs(" b=\"1\" i=\"1\"", pd->dmlFilePointer );
	}

	fputs(">", pd->dmlFilePointer );
	DML_SetFontColor(dev, gc);

	fprintf(pd->dmlFilePointer,
				"<a:latin typeface=\"%s\"/><a:cs typeface=\"%s\"/>",
				pd->fi->fontname, pd->fi->fontname);

	fputs("</a:rPr>", pd->dmlFilePointer );
	fputs("<a:t>", pd->dmlFilePointer );
	dml_text_native(str, pd);
	fputs("</a:t></a:r></a:p></p:txBody>", pd->dmlFilePointer );
	fputs(pptx_elt_tag_end, pd->dmlFilePointer );

	fflush(pd->dmlFilePointer);
}