diff options
Diffstat (limited to 'filter/pdftopdf/qpdf_pdftopdf.cc')
-rw-r--r-- | filter/pdftopdf/qpdf_pdftopdf.cc | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/filter/pdftopdf/qpdf_pdftopdf.cc b/filter/pdftopdf/qpdf_pdftopdf.cc new file mode 100644 index 000000000..68cd8ef41 --- /dev/null +++ b/filter/pdftopdf/qpdf_pdftopdf.cc @@ -0,0 +1,225 @@ +#include "qpdf_pdftopdf.h" +#include <assert.h> +#include <stdexcept> +#include <qpdf/QUtil.hh> + +PageRect getBoxAsRect(QPDFObjectHandle box) // {{{ +{ + PageRect ret; + + ret.left=box.getArrayItem(0).getNumericValue(); + ret.bottom=box.getArrayItem(1).getNumericValue(); + ret.right=box.getArrayItem(2).getNumericValue(); + ret.top=box.getArrayItem(3).getNumericValue(); + + ret.width=ret.right-ret.left; + ret.height=ret.top-ret.bottom; + + return ret; +} +// }}} + +Rotation getRotate(QPDFObjectHandle page) // {{{ +{ + if (!page.hasKey("/Rotate")) { + return ROT_0; + } + double rot=page.getKey("/Rotate").getNumericValue(); + rot=fmod(rot,360.0); + if (rot<0) { + rot+=360.0; + } + if (rot==90.0) { // CW + return ROT_270; // CCW + } else if (rot==180.0) { + return ROT_180; + } else if (rot==270.0) { + return ROT_90; + } else if (rot!=0.0) { + throw std::runtime_error("Unexpected /Rotation value: "+QUtil::double_to_string(rot)); + } + return ROT_0; +} +// }}} + +double getUserUnit(QPDFObjectHandle page) // {{{ +{ + if (!page.hasKey("/UserUnit")) { + return 1.0; + } + return page.getKey("/UserUnit").getNumericValue(); +} +// }}} + +QPDFObjectHandle makeRotate(Rotation rot) // {{{ +{ + switch (rot) { + case ROT_0: + return QPDFObjectHandle::newNull(); + case ROT_90: // CCW + return QPDFObjectHandle::newInteger(270); // CW + case ROT_180: + return QPDFObjectHandle::newInteger(180); + case ROT_270: + return QPDFObjectHandle::newInteger(90); + default: + throw std::invalid_argument("Bad rotation"); + } +} +// }}} + +#include "qpdf_tools.h" + +QPDFObjectHandle getRectAsBox(const PageRect &rect) // {{{ +{ + return makeBox(rect.left,rect.bottom,rect.right,rect.top); +} +// }}} + +#include <qpdf/QUtil.hh> + +Matrix::Matrix() // {{{ + : ctm{1,0,0,1,0,0} +{ +} +// }}} + +Matrix::Matrix(QPDFObjectHandle ar) // {{{ +{ + if (ar.getArrayNItems()!=6) { + throw std::runtime_error("Not a ctm matrix"); + } + for (int iA=0;iA<6;iA++) { + ctm[iA]=ar.getArrayItem(iA).getNumericValue(); + } +} +// }}} + +Matrix &Matrix::rotate(Rotation rot) // {{{ +{ + switch (rot) { + case ROT_0: + break; + case ROT_90: + std::swap(ctm[0],ctm[2]); + std::swap(ctm[1],ctm[3]); + ctm[2]=-ctm[2]; + ctm[3]=-ctm[3]; + break; + case ROT_180: + ctm[0]=-ctm[0]; + ctm[3]=-ctm[3]; + break; + case ROT_270: + std::swap(ctm[0],ctm[2]); + std::swap(ctm[1],ctm[3]); + ctm[0]=-ctm[0]; + ctm[1]=-ctm[1]; + break; + default: + assert(0); + } + return *this; +} +// }}} + +// TODO: test +Matrix &Matrix::rotate_move(Rotation rot,double width,double height) // {{{ +{ + rotate(rot); + switch (rot) { + case ROT_0: + break; + case ROT_90: + translate(width,0); + break; + case ROT_180: + translate(width,height); + break; + case ROT_270: + translate(0,height); + break; + } + return *this; +} +// }}} + +Matrix &Matrix::rotate(double rad) // {{{ +{ + Matrix tmp; + + tmp.ctm[0]=cos(rad); + tmp.ctm[1]=sin(rad); + tmp.ctm[2]=-sin(rad); + tmp.ctm[3]=cos(rad); + + return (*this*=tmp); +} +// }}} + +Matrix &Matrix::translate(double tx,double ty) // {{{ +{ + ctm[4]+=ctm[0]*tx+ctm[2]*ty; + ctm[5]+=ctm[1]*tx+ctm[3]*ty; + return *this; +} +// }}} + +Matrix &Matrix::scale(double sx,double sy) // {{{ +{ + ctm[0]*=sx; + ctm[1]*=sx; + ctm[2]*=sy; + ctm[3]*=sy; + return *this; +} +// }}} + +Matrix &Matrix::operator*=(const Matrix &rhs) // {{{ +{ + double tmp[6]; + std::copy(ctm,ctm+6,tmp); + + ctm[0] = tmp[0]*rhs.ctm[0] + tmp[2]*rhs.ctm[1]; + ctm[1] = tmp[1]*rhs.ctm[0] + tmp[3]*rhs.ctm[1]; + + ctm[2] = tmp[0]*rhs.ctm[2] + tmp[2]*rhs.ctm[3]; + ctm[3] = tmp[1]*rhs.ctm[2] + tmp[3]*rhs.ctm[3]; + + ctm[4] = tmp[0]*rhs.ctm[4] + tmp[2]*rhs.ctm[5] + tmp[4]; + ctm[5] = tmp[1]*rhs.ctm[4] + tmp[3]*rhs.ctm[5] + tmp[5]; + + return *this; +} +// }}} + +QPDFObjectHandle Matrix::get() const // {{{ +{ + QPDFObjectHandle ret=QPDFObjectHandle::newArray(); + ret.appendItem(QPDFObjectHandle::newReal(ctm[0])); + ret.appendItem(QPDFObjectHandle::newReal(ctm[1])); + ret.appendItem(QPDFObjectHandle::newReal(ctm[2])); + ret.appendItem(QPDFObjectHandle::newReal(ctm[3])); + ret.appendItem(QPDFObjectHandle::newReal(ctm[4])); + ret.appendItem(QPDFObjectHandle::newReal(ctm[5])); + return ret; +} +// }}} + +std::string Matrix::get_string() const // {{{ +{ + std::string ret; + ret.append(QUtil::double_to_string(ctm[0])); + ret.append(" "); + ret.append(QUtil::double_to_string(ctm[1])); + ret.append(" "); + ret.append(QUtil::double_to_string(ctm[2])); + ret.append(" "); + ret.append(QUtil::double_to_string(ctm[3])); + ret.append(" "); + ret.append(QUtil::double_to_string(ctm[4])); + ret.append(" "); + ret.append(QUtil::double_to_string(ctm[5])); + return ret; +} +// }}} |