Make GfxPattern::parse and friends return unique_ptr
diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc
index 539fa4d..3c3b3c0 100644
--- a/poppler/Gfx.cc
+++ b/poppler/Gfx.cc
@@ -384,7 +384,7 @@
     return Object(objNull);
 }
 
-GfxPattern *GfxResources::lookupPattern(const char *name, OutputDev *out, GfxState *state)
+std::unique_ptr<GfxPattern> GfxResources::lookupPattern(const char *name, OutputDev *out, GfxState *state)
 {
     GfxResources *resPtr;
 
@@ -398,7 +398,7 @@
         }
     }
     error(errSyntaxError, -1, "Unknown pattern '{0:s}'", name);
-    return nullptr;
+    return {};
 }
 
 GfxShading *GfxResources::lookupShading(const char *name, OutputDev *out, GfxState *state)
@@ -1514,7 +1514,6 @@
 void Gfx::opSetFillColorN(Object args[], int numArgs)
 {
     GfxColor color;
-    GfxPattern *pattern;
     int i;
 
     if (state->getFillColorSpace()->getMode() == csPattern) {
@@ -1534,8 +1533,9 @@
             out->updateFillColor(state);
         }
         if (numArgs > 0) {
+            std::unique_ptr<GfxPattern> pattern;
             if (args[numArgs - 1].isName() && (pattern = res->lookupPattern(args[numArgs - 1].getName(), out, state))) {
-                state->setFillPattern(pattern);
+                state->setFillPattern(std::move(pattern));
             }
         }
 
@@ -1560,7 +1560,6 @@
 void Gfx::opSetStrokeColorN(Object args[], int numArgs)
 {
     GfxColor color;
-    GfxPattern *pattern;
     int i;
 
     if (state->getStrokeColorSpace()->getMode() == csPattern) {
@@ -1583,8 +1582,9 @@
             error(errSyntaxError, getPos(), "Incorrect number of arguments in 'SCN' command");
             return;
         }
+        std::unique_ptr<GfxPattern> pattern;
         if (args[numArgs - 1].isName() && (pattern = res->lookupPattern(args[numArgs - 1].getName(), out, state))) {
-            state->setStrokePattern(pattern);
+            state->setStrokePattern(std::move(pattern));
         }
 
     } else {
diff --git a/poppler/Gfx.h b/poppler/Gfx.h
index fee97a7..77da7a6 100644
--- a/poppler/Gfx.h
+++ b/poppler/Gfx.h
@@ -123,7 +123,7 @@
     Object lookupXObjectNF(const char *name);
     Object lookupMarkedContentNF(const char *name);
     Object lookupColorSpace(const char *name);
-    GfxPattern *lookupPattern(const char *name, OutputDev *out, GfxState *state);
+    std::unique_ptr<GfxPattern> lookupPattern(const char *name, OutputDev *out, GfxState *state);
     GfxShading *lookupShading(const char *name, OutputDev *out, GfxState *state);
     Object lookupGState(const char *name);
     Object lookupGStateNF(const char *name);
diff --git a/poppler/GfxState.cc b/poppler/GfxState.cc
index 91544d9..ae5dcdd 100644
--- a/poppler/GfxState.cc
+++ b/poppler/GfxState.cc
@@ -3196,9 +3196,8 @@
 
 GfxPattern::~GfxPattern() { }
 
-GfxPattern *GfxPattern::parse(GfxResources *res, Object *obj, OutputDev *out, GfxState *state, int patternRefNum)
+std::unique_ptr<GfxPattern> GfxPattern::parse(GfxResources *res, Object *obj, OutputDev *out, GfxState *state, int patternRefNum)
 {
-    GfxPattern *pattern;
     Object obj1;
 
     if (obj->isDict()) {
@@ -3206,22 +3205,21 @@
     } else if (obj->isStream()) {
         obj1 = obj->streamGetDict()->lookup("PatternType");
     } else {
-        return nullptr;
+        return {};
     }
-    pattern = nullptr;
     if (obj1.isInt() && obj1.getInt() == 1) {
-        pattern = GfxTilingPattern::parse(obj, patternRefNum);
+        return GfxTilingPattern::parse(obj, patternRefNum);
     } else if (obj1.isInt() && obj1.getInt() == 2) {
-        pattern = GfxShadingPattern::parse(res, obj, out, state, patternRefNum);
+        return GfxShadingPattern::parse(res, obj, out, state, patternRefNum);
     }
-    return pattern;
+    return {};
 }
 
 //------------------------------------------------------------------------
 // GfxTilingPattern
 //------------------------------------------------------------------------
 
-GfxTilingPattern *GfxTilingPattern::parse(Object *patObj, int patternRefNum)
+std::unique_ptr<GfxTilingPattern> GfxTilingPattern::parse(Object *patObj, int patternRefNum)
 {
     Dict *dict;
     int paintTypeA, tilingTypeA;
@@ -3297,7 +3295,8 @@
         }
     }
 
-    return new GfxTilingPattern(paintTypeA, tilingTypeA, bboxA, xStepA, yStepA, &resDictA, matrixA, patObj, patternRefNum);
+    auto pattern = new GfxTilingPattern(paintTypeA, tilingTypeA, bboxA, xStepA, yStepA, &resDictA, matrixA, patObj, patternRefNum);
+    return std::unique_ptr<GfxTilingPattern>(pattern);
 }
 
 GfxTilingPattern::GfxTilingPattern(int paintTypeA, int tilingTypeA, const double *bboxA, double xStepA, double yStepA, const Object *resDictA, const double *matrixA, const Object *contentStreamA, int patternRefNumA)
@@ -3321,16 +3320,17 @@
 
 GfxTilingPattern::~GfxTilingPattern() { }
 
-GfxPattern *GfxTilingPattern::copy() const
+std::unique_ptr<GfxPattern> GfxTilingPattern::copy() const
 {
-    return new GfxTilingPattern(paintType, tilingType, bbox, xStep, yStep, &resDict, matrix, &contentStream, getPatternRefNum());
+    auto pattern = new GfxTilingPattern(paintType, tilingType, bbox, xStep, yStep, &resDict, matrix, &contentStream, getPatternRefNum());
+    return std::unique_ptr<GfxTilingPattern>(pattern);
 }
 
 //------------------------------------------------------------------------
 // GfxShadingPattern
 //------------------------------------------------------------------------
 
-GfxShadingPattern *GfxShadingPattern::parse(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state, int patternRefNum)
+std::unique_ptr<GfxShadingPattern> GfxShadingPattern::parse(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state, int patternRefNum)
 {
     Dict *dict;
     GfxShading *shadingA;
@@ -3339,14 +3339,14 @@
     int i;
 
     if (!patObj->isDict()) {
-        return nullptr;
+        return {};
     }
     dict = patObj->getDict();
 
     obj1 = dict->lookup("Shading");
     shadingA = GfxShading::parse(res, &obj1, out, state);
     if (!shadingA) {
-        return nullptr;
+        return {};
     }
 
     matrixA[0] = 1;
@@ -3365,7 +3365,8 @@
         }
     }
 
-    return new GfxShadingPattern(shadingA, matrixA, patternRefNum);
+    auto pattern = new GfxShadingPattern(shadingA, matrixA, patternRefNum);
+    return std::unique_ptr<GfxShadingPattern>(pattern);
 }
 
 GfxShadingPattern::GfxShadingPattern(GfxShading *shadingA, const double *matrixA, int patternRefNumA) : GfxPattern(2, patternRefNumA)
@@ -3383,9 +3384,10 @@
     delete shading;
 }
 
-GfxPattern *GfxShadingPattern::copy() const
+std::unique_ptr<GfxPattern> GfxShadingPattern::copy() const
 {
-    return new GfxShadingPattern(shading->copy(), matrix, getPatternRefNum());
+    auto pattern = new GfxShadingPattern(shading->copy(), matrix, getPatternRefNum());
+    return std::unique_ptr<GfxShadingPattern>(pattern);
 }
 
 //------------------------------------------------------------------------
@@ -6562,12 +6564,10 @@
     fillColor = state->fillColor;
     strokeColor = state->strokeColor;
 
-    fillPattern = state->fillPattern;
-    if (fillPattern) {
+    if (state->fillPattern) {
         fillPattern = state->fillPattern->copy();
     }
-    strokePattern = state->strokePattern;
-    if (strokePattern) {
+    if (state->strokePattern) {
         strokePattern = state->strokePattern->copy();
     }
     blendMode = state->blendMode;
@@ -6865,20 +6865,14 @@
     strokeColorSpace = std::move(colorSpace);
 }
 
-void GfxState::setFillPattern(GfxPattern *pattern)
+void GfxState::setFillPattern(std::unique_ptr<GfxPattern> &&pattern)
 {
-    if (fillPattern) {
-        delete fillPattern;
-    }
-    fillPattern = pattern;
+    fillPattern = std::move(pattern);
 }
 
-void GfxState::setStrokePattern(GfxPattern *pattern)
+void GfxState::setStrokePattern(std::unique_ptr<GfxPattern> &&pattern)
 {
-    if (strokePattern) {
-        delete strokePattern;
-    }
-    strokePattern = pattern;
+    strokePattern = std::move(pattern);
 }
 
 void GfxState::setFont(std::shared_ptr<GfxFont> fontA, double fontSizeA)
diff --git a/poppler/GfxState.h b/poppler/GfxState.h
index 4bf2b8f..797ad4d 100644
--- a/poppler/GfxState.h
+++ b/poppler/GfxState.h
@@ -787,9 +787,9 @@
     GfxPattern(const GfxPattern &) = delete;
     GfxPattern &operator=(const GfxPattern &other) = delete;
 
-    static GfxPattern *parse(GfxResources *res, Object *obj, OutputDev *out, GfxState *state, int patternRefNum);
+    static std::unique_ptr<GfxPattern> parse(GfxResources *res, Object *obj, OutputDev *out, GfxState *state, int patternRefNum);
 
-    virtual GfxPattern *copy() const = 0;
+    virtual std::unique_ptr<GfxPattern> copy() const = 0;
 
     int getType() const { return type; }
 
@@ -807,10 +807,10 @@
 class GfxTilingPattern : public GfxPattern
 {
 public:
-    static GfxTilingPattern *parse(Object *patObj, int patternRefNum);
+    static std::unique_ptr<GfxTilingPattern> parse(Object *patObj, int patternRefNum);
     ~GfxTilingPattern() override;
 
-    GfxPattern *copy() const override;
+    std::unique_ptr<GfxPattern> copy() const override;
 
     int getPaintType() const { return paintType; }
     int getTilingType() const { return tilingType; }
@@ -840,10 +840,10 @@
 class GfxShadingPattern : public GfxPattern
 {
 public:
-    static GfxShadingPattern *parse(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state, int patternRefNum);
+    static std::unique_ptr<GfxShadingPattern> parse(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state, int patternRefNum);
     ~GfxShadingPattern() override;
 
-    GfxPattern *copy() const override;
+    std::unique_ptr<GfxPattern> copy() const override;
 
     GfxShading *getShading() { return shading; }
     const double *getMatrix() const { return matrix; }
@@ -1506,8 +1506,8 @@
     void getStrokeDeviceN(GfxColor *deviceN) { strokeColorSpace->getDeviceN(&strokeColor, deviceN); }
     GfxColorSpace *getFillColorSpace() { return fillColorSpace.get(); }
     GfxColorSpace *getStrokeColorSpace() { return strokeColorSpace.get(); }
-    GfxPattern *getFillPattern() { return fillPattern; }
-    GfxPattern *getStrokePattern() { return strokePattern; }
+    GfxPattern *getFillPattern() { return fillPattern.get(); }
+    GfxPattern *getStrokePattern() { return strokePattern.get(); }
     GfxBlendMode getBlendMode() const { return blendMode; }
     double getFillOpacity() const { return fillOpacity; }
     double getStrokeOpacity() const { return strokeOpacity; }
@@ -1591,8 +1591,8 @@
     void setStrokeColorSpace(std::unique_ptr<GfxColorSpace> &&colorSpace);
     void setFillColor(const GfxColor *color) { fillColor = *color; }
     void setStrokeColor(const GfxColor *color) { strokeColor = *color; }
-    void setFillPattern(GfxPattern *pattern);
-    void setStrokePattern(GfxPattern *pattern);
+    void setFillPattern(std::unique_ptr<GfxPattern> &&pattern);
+    void setStrokePattern(std::unique_ptr<GfxPattern> &&pattern);
     void setBlendMode(GfxBlendMode mode) { blendMode = mode; }
     void setFillOpacity(double opac) { fillOpacity = opac; }
     void setStrokeOpacity(double opac) { strokeOpacity = opac; }
@@ -1719,8 +1719,8 @@
     std::unique_ptr<GfxColorSpace> strokeColorSpace; // stroke color space
     GfxColor fillColor; // fill color
     GfxColor strokeColor; // stroke color
-    GfxPattern *fillPattern; // fill pattern
-    GfxPattern *strokePattern; // stroke pattern
+    std::unique_ptr<GfxPattern> fillPattern; // fill pattern
+    std::unique_ptr<GfxPattern> strokePattern; // stroke pattern
     GfxBlendMode blendMode; // transparency blend mode
     double fillOpacity; // fill opacity
     double strokeOpacity; // stroke opacity