Spaces:
Running
Running
File size: 4,341 Bytes
5cee033 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
//========================================================================
//
// SplashClip.h
//
//========================================================================
//========================================================================
//
// Modified under the Poppler project - http://poppler.freedesktop.org
//
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
// Copyright (C) 2010, 2018, 2021 Albert Astals Cid <[email protected]>
// Copyright (C) 2013 Thomas Freitag <[email protected]>
// Copyright (C) 2019 Stefan Brüns <[email protected]>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
//
//========================================================================
#ifndef SPLASHCLIP_H
#define SPLASHCLIP_H
#include "SplashTypes.h"
#include <memory>
#include <vector>
class SplashPath;
class SplashXPath;
class SplashXPathScanner;
class SplashBitmap;
//------------------------------------------------------------------------
enum SplashClipResult
{
splashClipAllInside,
splashClipAllOutside,
splashClipPartial
};
//------------------------------------------------------------------------
// SplashClip
//------------------------------------------------------------------------
class SplashClip
{
public:
// Create a clip, for the given rectangle.
SplashClip(SplashCoord x0, SplashCoord y0, SplashCoord x1, SplashCoord y1, bool antialiasA);
// Copy a clip.
SplashClip *copy() const { return new SplashClip(this); }
~SplashClip();
SplashClip(const SplashClip &) = delete;
SplashClip &operator=(const SplashClip &) = delete;
// Reset the clip to a rectangle.
void resetToRect(SplashCoord x0, SplashCoord y0, SplashCoord x1, SplashCoord y1);
// Intersect the clip with a rectangle.
SplashError clipToRect(SplashCoord x0, SplashCoord y0, SplashCoord x1, SplashCoord y1);
// Intersect the clip with <path>.
SplashError clipToPath(SplashPath *path, SplashCoord *matrix, SplashCoord flatness, bool eo);
// Returns true if (<x>,<y>) is inside the clip.
bool test(int x, int y)
{
// check the rectangle
if (x < xMinI || x > xMaxI || y < yMinI || y > yMaxI) {
return false;
}
// check the paths
return testClipPaths(x, y);
}
// Tests a rectangle against the clipping region. Returns one of:
// - splashClipAllInside if the entire rectangle is inside the
// clipping region, i.e., all pixels in the rectangle are
// visible
// - splashClipAllOutside if the entire rectangle is outside the
// clipping region, i.e., all the pixels in the rectangle are
// clipped
// - splashClipPartial if the rectangle is part inside and part
// outside the clipping region
SplashClipResult testRect(int rectXMin, int rectYMin, int rectXMax, int rectYMax);
// Similar to testRect, but tests a horizontal span.
SplashClipResult testSpan(int spanXMin, int spanXMax, int spanY);
// Clips an anti-aliased line by setting pixels to zero. On entry,
// all non-zero pixels are between <x0> and <x1>. This function
// will update <x0> and <x1>.
void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y, bool adjustVertLine = false);
// Get the rectangle part of the clip region.
SplashCoord getXMin() { return xMin; }
SplashCoord getXMax() { return xMax; }
SplashCoord getYMin() { return yMin; }
SplashCoord getYMax() { return yMax; }
// Get the rectangle part of the clip region, in integer coordinates.
int getXMinI() { return xMinI; }
int getXMaxI() { return xMaxI; }
int getYMinI() { return yMinI; }
int getYMaxI() { return yMaxI; }
// Get the number of arbitrary paths used by the clip region.
int getNumPaths() { return length; }
protected:
explicit SplashClip(const SplashClip *clip);
void grow(int nPaths);
bool testClipPaths(int x, int y);
bool antialias;
SplashCoord xMin, yMin, xMax, yMax;
int xMinI, yMinI, xMaxI, yMaxI;
unsigned char *flags;
std::vector<std::shared_ptr<SplashXPathScanner>> scanners;
int length, size;
};
#endif
|