summaryrefslogtreecommitdiff
path: root/filter/pdftoopvp/oprs/OPVPSplashClip.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'filter/pdftoopvp/oprs/OPVPSplashClip.cxx')
-rw-r--r--filter/pdftoopvp/oprs/OPVPSplashClip.cxx91
1 files changed, 91 insertions, 0 deletions
diff --git a/filter/pdftoopvp/oprs/OPVPSplashClip.cxx b/filter/pdftoopvp/oprs/OPVPSplashClip.cxx
new file mode 100644
index 000000000..c9d2e834c
--- /dev/null
+++ b/filter/pdftoopvp/oprs/OPVPSplashClip.cxx
@@ -0,0 +1,91 @@
+#include <config.h>
+#include "splash/SplashXPathScanner.h"
+#include "OPVPSplashClip.h"
+
+void OPVPSplashClip::getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA)
+{
+ int i;
+ int cxMin = splashRound(xMin), cyMin = splashRound(yMin);
+ int cxMax = splashRound(xMax), cyMax = splashRound(yMax);
+ int txMin, tyMin, txMax, tyMax;
+
+ for (i = 0; i < length; ++i) {
+ scanners[i]->getBBox(&txMin,&tyMin,&txMax,&tyMax);
+ if (txMin > cxMin) cxMin = txMin;
+ if (tyMin > cyMin) cyMin = tyMin;
+ if (txMax < cxMax) cxMax = txMax;
+ if (tyMax < cyMax) cyMax = tyMax;
+ }
+ *xMinA = cxMin;
+ *yMinA = cyMin;
+ *xMaxA = cxMax;
+ *yMaxA = cyMax;
+}
+
+OPVPSplashPath *OPVPSplashClip::makePath()
+{
+ int i,j;
+ int y, x0, x1;
+ int txMin, tyMin, txMax, tyMax;
+ int tsxMin, tsyMin, tsxMax, tsyMax;
+ Guchar *cbuf,*tbuf;
+ int blen;
+ OPVPSplashPath *p = new OPVPSplashPath();
+
+ getBBox(&txMin,&tyMin,&txMax,&tyMax);
+ if (txMin > txMax || tyMin > tyMax) return p;
+ blen = txMax-txMin+1;
+ cbuf = new Guchar[blen];
+ tbuf = new Guchar[blen];
+
+ /* dummy call to clear state */
+ scanners[0]->getBBox(&tsxMin,&tsyMin,&tsxMax,&tsyMax);
+ scanners[0]->getNextSpan(tsyMin-2,&x0,&x1);
+
+ for (y = tyMin;y <= tyMax;y++) {
+ /* clear buffer */
+ for (i = 0;i < blen;i++) {
+ cbuf[i] = 0;
+ }
+ while (scanners[0]->getNextSpan(y,&x0,&x1)) {
+ if (x0 < txMin) x0 = txMin;
+ if (x1 > txMax) x1 = txMax;
+ for (i = x0;i < x1;i++) {
+ cbuf[i-txMin] = 1;
+ }
+ }
+ for (j = 1; j < length; ++j) {
+ /* clear buffer */
+ for (i = 0;i < blen;i++) {
+ tbuf[i] = 0;
+ }
+ while (scanners[j]->getNextSpan(y,&x0,&x1)) {
+ if (x0 < txMin) x0 = txMin;
+ if (x1 > txMax) x1 = txMax;
+ for (i = x0;i < x1;i++) {
+ tbuf[i-txMin] = 1;
+ }
+ }
+ /* and buffer */
+ for (i = 0;i < blen;i++) {
+ cbuf[i] &= tbuf[i];
+ }
+ }
+ /* scan buffer and add path */
+ for (i = 0;i < blen;i = j) {
+ if (cbuf[i] != 0) {
+ p->moveTo(i+txMin,y);
+ for (j = i+1;j < blen && cbuf[j] != 0;j++);
+ p->lineTo(j-1+txMin,y);
+ p->lineTo(j-1+txMin,y+1);
+ p->lineTo(i+txMin,y+1);
+ p->close();
+ } else {
+ j = i+1;
+ }
+ }
+ }
+ delete[] cbuf;
+ delete[] tbuf;
+ return p;
+}