Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 02 May 2026 12:33:11 +0000
From:      Gleb Popov <arrowd@FreeBSD.org>
To:        ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org
Subject:   git: 157bebc46a38 - main - graphics/inkscape: Fix build against newest Poppler
Message-ID:  <69f5ef07.39f8d.603b302c@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by arrowd:

URL: https://cgit.FreeBSD.org/ports/commit/?id=157bebc46a3861cf60d6b9949857e9bf3e85d327

commit 157bebc46a3861cf60d6b9949857e9bf3e85d327
Author:     Gleb Popov <arrowd@FreeBSD.org>
AuthorDate: 2026-04-17 13:27:51 +0000
Commit:     Gleb Popov <arrowd@FreeBSD.org>
CommitDate: 2026-05-02 12:32:43 +0000

    graphics/inkscape: Fix build against newest Poppler
    
    Differential Revision:  https://reviews.freebsd.org/D56472
---
 ...h-src_extension_internal_pdfinput_pdf-input.cpp |  10 ++
 ...-src_extension_internal_pdfinput_pdf-parser.cpp | 170 +++++++++++++++++++++
 ...ch-src_extension_internal_pdfinput_pdf-parser.h |  16 ++
 ...sion_internal_pdfinput_poppler-transition-api.h |  35 +++++
 ...c_extension_internal_pdfinput_poppler-utils.cpp | 121 +++++++++++++++
 ...src_extension_internal_pdfinput_poppler-utils.h |  10 ++
 ...src_extension_internal_pdfinput_svg-builder.cpp |  72 +++++++++
 7 files changed, 434 insertions(+)

diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-input.cpp b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-input.cpp
new file mode 100644
index 000000000000..abd25bfe474c
--- /dev/null
+++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-input.cpp
@@ -0,0 +1,10 @@
+--- src/extension/internal/pdfinput/pdf-input.cpp.orig	2025-12-26 00:35:50 UTC
++++ src/extension/internal/pdfinput/pdf-input.cpp
+@@ -33,6 +33,7 @@
+ #include <poppler/glib/poppler.h>
+ #include <poppler/glib/poppler-document.h>
+ #include <poppler/glib/poppler-page.h>
++#include <poppler/goo/gmem.h>
+ #endif
+ 
+ #include <gdkmm/general.h>
diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.cpp b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.cpp
new file mode 100644
index 000000000000..9ca254e2e456
--- /dev/null
+++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.cpp
@@ -0,0 +1,170 @@
+--- src/extension/internal/pdfinput/pdf-parser.cpp.orig	2025-12-26 00:35:50 UTC
++++ src/extension/internal/pdfinput/pdf-parser.cpp
+@@ -653,7 +653,11 @@ void PdfParser::opSetLineJoin(Object args[], int /*num
+ void PdfParser::opSetLineJoin(Object args[], int /*numArgs*/)
+ {
+   builder->beforeStateChange(state);
++#if POPPLER_CHECK_VERSION(26,2,0)
++  state->setLineJoin((GfxState::LineJoinStyle) args[0].getInt());
++#else
+   state->setLineJoin(args[0].getInt());
++#endif
+   builder->updateStyle(state);
+ }
+ 
+@@ -661,7 +665,11 @@ void PdfParser::opSetLineCap(Object args[], int /*numA
+ void PdfParser::opSetLineCap(Object args[], int /*numArgs*/)
+ {
+   builder->beforeStateChange(state);
++#if POPPLER_CHECK_VERSION(26,2,0)
++  state->setLineCap((GfxState::LineCapStyle) args[0].getInt());
++#else
+   state->setLineCap(args[0].getInt());
++#endif
+   builder->updateStyle(state);
+ }
+ 
+@@ -1565,7 +1573,13 @@ void PdfParser::doShadingPatternFillFallback(GfxShadin
+ 
+   // restore graphics state
+   restoreState();
++#if POPPLER_CHECK_VERSION(26, 2, 0)
++  state->clearPath();
++  GfxPath *currPath = const_cast<GfxPath*>(state->getPath());
++  currPath->append(savedPath);
++#else
+   state->setPath(savedPath);
++#endif
+ }
+ 
+ // TODO not good that numArgs is ignored but args[] is used:
+@@ -1626,7 +1640,13 @@ void PdfParser::opShFill(Object args[], int /*numArgs*
+   // restore graphics state
+   if (savedState) {
+     restoreState();
++#if POPPLER_CHECK_VERSION(26, 2, 0)
++    state->clearPath();
++    GfxPath *currPath = const_cast<GfxPath*>(state->getPath());
++    currPath->append(savedPath);
++#else
+     state->setPath(savedPath);
++#endif
+   }
+ }
+ 
+@@ -2213,7 +2233,7 @@ void PdfParser::opShowSpaceText(Object args[], int /*n
+ {
+   Array *a = nullptr;
+   Object obj;
+-  int wMode = 0; // Writing mode (horizontal/vertical).
++  _POPPLER_WMODE wMode = _POPPLER_WMODE_HORIZONTAL; // Writing mode (horizontal/vertical).
+ 
+   if (!state->getFont()) {
+     error(errSyntaxError, getPos(), "No font in show/space");
+@@ -2227,7 +2247,7 @@ void PdfParser::opShowSpaceText(Object args[], int /*n
+     if (obj.isNum()) {
+       // this uses the absolute value of the font size to match
+       // Acrobat's behavior
+-      if (wMode) {
++      if (wMode != _POPPLER_WMODE_HORIZONTAL) {
+ 	state->textShift(0, -obj.getNum() * 0.001 *
+ 			    fabs(state->getFontSize()));
+       } else {
+@@ -2248,15 +2268,11 @@ void PdfParser::opShowSpaceText(Object args[], int /*n
+  * This adds a string from a PDF file that is contained in one command ('Tj', ''', '"')
+  * or is one string in ShowSpacetext ('TJ').
+  */
+-#if POPPLER_CHECK_VERSION(0,64,0)
+-void PdfParser::doShowText(const GooString *s) {
+-#else
+-void PdfParser::doShowText(GooString *s) {
+-#endif
++void PdfParser::doShowText(const std::string &s) {
+     auto font = state->getFont();
+-    int wMode = font->getWMode(); // Vertical/Horizontal/Invalid
++    _POPPLER_WMODE wMode = font->getWMode(); // Vertical/Horizontal/Invalid
+ 
+-    builder->beginString(state, get_goostring_length(*s));
++    builder->beginString(state, s.size());
+ 
+     // handle a Type 3 char
+     if (font->getType() == fontType3) {
+@@ -2266,8 +2282,8 @@ void PdfParser::doShowText(GooString *s) {
+     double riseX, riseY;
+     state->textTransformDelta(0, state->getRise(), &riseX, &riseY);
+ 
+-    auto p = s->getCString(); // char* or const char*
+-    int len = get_goostring_length(*s);
++    auto p = s.c_str(); // char* or const char*
++    int len = s.size();
+ 
+     while (len > 0) {
+ 
+@@ -2289,7 +2305,7 @@ void PdfParser::doShowText(GooString *s) {
+         auto ax = dx;
+         auto ay = dy;
+ 
+-        if (wMode != 0) {
++        if (wMode != _POPPLER_WMODE_HORIZONTAL) {
+             // Vertical text (or invalid value).
+             dy += state->getCharSpace();
+             if (n == 1 && *p == ' ') {
+@@ -2324,7 +2340,16 @@ void PdfParser::doShowText(GooString *s) {
+     builder->endString(state);
+ }
+ 
++#if POPPLER_CHECK_VERSION(0,64,0)
++void PdfParser::doShowText(const GooString *s) {
++#else
++void PdfParser::doShowText(GooString *s) {
++#endif
++    const std::string str = s->toStr();
++    doShowText(str);
++}
+ 
++
+ //------------------------------------------------------------------------
+ // XObject operators
+ //------------------------------------------------------------------------
+@@ -2931,7 +2956,11 @@ Stream *PdfParser::buildImageStream() {
+ 
+   // build dictionary
+ #if defined(POPPLER_NEW_OBJECT_API)
++#if POPPLER_CHECK_VERSION(26, 3, 0)
++  dict = Object(std::make_unique<Dict>(xref));
++#else
+   dict = Object(new Dict(xref));
++#endif
+ #else
+   dict.initDict(xref);
+ #endif
+@@ -2964,7 +2993,11 @@ Stream *PdfParser::buildImageStream() {
+   // make stream
+ #if defined(POPPLER_NEW_OBJECT_API)
+   str = new EmbedStream(parser->getStream(), dict.copy(), gFalse, 0);
++#if POPPLER_CHECK_VERSION(26, 2, 0)
++  str = str->addFilters(std::unique_ptr<Stream>(str), dict.getDict()).release();
++#else
+   str = str->addFilters(dict.getDict());
++#endif
+ #else
+   str = new EmbedStream(parser->getStream(), &dict, gFalse, 0);
+   str = str->addFilters(&dict);
+@@ -3137,10 +3170,17 @@ void PdfParser::loadOptionalContentLayers(Dict *resour
+             auto visible = true;
+             // Normally we'd use poppler optContentIsVisible, but these dict
+             // objects don't retain their references so can't be used directly.
++#if POPPLER_CHECK_VERSION(26, 2, 0)
++                for (auto &[ref, ocg] : ocgs->getOCGs()) {
++                    if (ocg->getName()->toStr() == label)
++                        visible = ocg->getState() == OptionalContentGroup::On;
++                }
++#else
+             for (auto &[ref, ocg] : ocgs->getOCGs()) {
+                 if (ocg->getName()->cmp(label) == 0)
+                     visible = ocg->getState() == OptionalContentGroup::On;
+             }
++#endif
+             builder->addOptionalGroup(dict->getKey(j), label, visible);
+         }
+     }
diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.h b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.h
new file mode 100644
index 000000000000..ac804328a447
--- /dev/null
+++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_pdf-parser.h
@@ -0,0 +1,16 @@
+--- src/extension/internal/pdfinput/pdf-parser.h.orig	2025-12-26 00:35:50 UTC
++++ src/extension/internal/pdfinput/pdf-parser.h
+@@ -283,10 +283,11 @@ class PdfParser { (private)
+     void opMoveShowText(Object args[], int numArgs);
+     void opMoveSetShowText(Object args[], int numArgs);
+     void opShowSpaceText(Object args[], int numArgs);
++    void doShowText(const std::string &s);
+ #if POPPLER_CHECK_VERSION(0,64,0)
+-  void doShowText(const GooString *s);
++    void doShowText(const GooString *s);
+ #else
+-  void doShowText(GooString *s);
++    void doShowText(GooString *s);
+ #endif
+   
+ 
diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-transition-api.h b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-transition-api.h
new file mode 100644
index 000000000000..3fa68e14a4de
--- /dev/null
+++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-transition-api.h
@@ -0,0 +1,35 @@
+--- src/extension/internal/pdfinput/poppler-transition-api.h.orig	2025-07-25 10:14:52 UTC
++++ src/extension/internal/pdfinput/poppler-transition-api.h
+@@ -15,6 +15,16 @@
+ #include <glib/poppler-features.h>
+ #include <poppler/UTF.h>
+ 
++#if POPPLER_CHECK_VERSION(26, 2, 0)
++#define _POPPLER_WMODE GfxFont::WritingMode
++#define _POPPLER_WMODE_HORIZONTAL GfxFont::WritingMode::Horizontal
++#define _POPPLER_WMODE_VERTICAL GfxFont::WritingMode::Vertical
++#else
++#define _POPPLER_WMODE int
++#define _POPPLER_WMODE_HORIZONTAL 0
++#define _POPPLER_WMODE_VERTICAL 1
++#endif
++
+ #if POPPLER_CHECK_VERSION(25, 7, 0)
+ #define _POPPLER_TEXT_SHIFT_WITH_USER_COORDS(dx, dy) textShiftWithUserCoords(dx, dy)
+ #define _POPPLER_FOFI_TRUETYPE_MAKE(font_data, faceIndex) FoFiTrueType::make(std::span(font_data), faceIndex)
+@@ -62,11 +72,11 @@
+ #endif
+ 
+ #if POPPLER_CHECK_VERSION(24, 5, 0)
+-#define _POPPLER_HAS_UNICODE_BOM(value) (hasUnicodeByteOrderMark(value->toStr()))
+-#define _POPPLER_HAS_UNICODE_BOMLE(value) (hasUnicodeByteOrderMarkLE(value->toStr()))
++#define _POPPLER_HAS_UNICODE_BOM(value) (hasUnicodeByteOrderMark(value))
++#define _POPPLER_HAS_UNICODE_BOMLE(value) (hasUnicodeByteOrderMarkLE(value))
+ #else
+-#define _POPPLER_HAS_UNICODE_BOM(value) (value->hasUnicodeMarker())
+-#define _POPPLER_HAS_UNICODE_BOMLE(value) (value->hasUnicodeMarkerLE())
++#define _POPPLER_HAS_UNICODE_BOM(value) (GooString(value).hasUnicodeMarker())
++#define _POPPLER_HAS_UNICODE_BOMLE(value) (GooString(value).hasUnicodeMarkerLE())
+ #endif
+ 
+ #if POPPLER_CHECK_VERSION(24, 3, 0)
diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.cpp b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.cpp
new file mode 100644
index 000000000000..c977dd750b4b
--- /dev/null
+++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.cpp
@@ -0,0 +1,121 @@
+--- src/extension/internal/pdfinput/poppler-utils.cpp.orig	2025-12-26 00:35:50 UTC
++++ src/extension/internal/pdfinput/poppler-utils.cpp
+@@ -16,6 +16,7 @@
+ #include <poppler/GfxFont.h>
+ #include <poppler/GfxState.h>
+ #include <poppler/PDFDoc.h>
++#include <poppler/PDFDocEncoding.h>
+ #include <poppler/UTF.h>
+ 
+ #include "libnrtype/font-factory.h"
+@@ -88,7 +89,11 @@ InkFontDict::InkFontDict(XRef *xref, Ref *fontDictRef,
+                 r.num = hashFontObject(&obj2);
+             }
+             // Newer poppler will require some reworking as it gives a shared ptr.
++#if POPPLER_CHECK_VERSION(26,3,0)
++            fonts[i] = GfxFont::makeFont(xref, fontDict->getKey(i), r, *obj2.getDict());
++#else
+             fonts[i] = GfxFont::makeFont(xref, fontDict->getKey(i), r, obj2.getDict());
++#endif
+             if (fonts[i] && !fonts[i]->isOk()) {
+                 fonts[i] = nullptr;
+             }
+@@ -145,7 +150,6 @@ void InkFontDict::hashFontObject1(const Object *obj, F
+ 
+ void InkFontDict::hashFontObject1(const Object *obj, FNVHash *h)
+ {
+-    const GooString *s;
+     const char *p;
+     double r;
+     int n, i;
+@@ -165,11 +169,16 @@ void InkFontDict::hashFontObject1(const Object *obj, F
+             r = obj->getReal();
+             h->hash((char *)&r, sizeof(double));
+             break;
+-        case objString:
++        case objString: {
+             h->hash('s');
+-            s = obj->getString();
++#if POPPLER_CHECK_VERSION(26, 4, 0)
++            const auto &s = obj->getString();
++            h->hash(s.c_str(), s.size());
++#else
++            const GooString* s = obj->getString();
+             h->hash(s->c_str(), get_goostring_length(*s));
+-            break;
++#endif
++            } break;
+         case objName:
+             h->hash('n');
+             p = obj->getName();
+@@ -586,20 +595,52 @@ std::string getDictString(Dict *dict, const char *key)
+     return getString(obj.getString());
+ }
+ 
++std::string getString(const std::unique_ptr<GooString> &value)
++{
++    return getString(value.get());
++}
++
++std::string getString(const GooString *value)
++{
++    if (value) {
++        return getString(value->toStr());
++    }
++    return "";
++}
++
+ /**
+  * Convert PDF strings, which can be formatted as UTF8, UTF16BE or UTF16LE into
+  * a predictable UTF8 string consistant with svg requirements.
+  */
+-std::string getString(const GooString *value)
++std::string getString(const std::string &value)
+ {
++    char *str = nullptr;
++    int stringLength;
++
+     if (_POPPLER_HAS_UNICODE_BOM(value)) {
+-        return g_convert(value->getCString () + 2, get_goostring_length(*value) - 2,
+-                         "UTF-8", "UTF-16BE", NULL, NULL, NULL);
++        str = g_convert(value.c_str() + 2, value.size() - 2,
++                        "UTF-8", "UTF-16BE", NULL, NULL, NULL);
+     } else if (_POPPLER_HAS_UNICODE_BOMLE(value)) {
+-        return g_convert(value->getCString () + 2, get_goostring_length(*value) - 2,
+-                         "UTF-8", "UTF-16LE", NULL, NULL, NULL);
++        str = g_convert(value.c_str() + 2, value.size() - 2,
++                        "UTF-8", "UTF-16LE", NULL, NULL, NULL);
+     }
+-    return value->toStr();
++#if POPPLER_CHECK_VERSION(25,02,0)
++    else if (auto utf16 = pdfDocEncodingToUTF16(value); !utf16.empty())  {
++        str = g_convert(utf16.c_str(), utf16.length(), "UTF-8", "UTF-16", NULL, NULL, NULL);
++    }
++#else
++    else if (auto utf16 = pdfDocEncodingToUTF16(value, &stringLength))  {
++        str = g_convert(utf16, stringLength, "UTF-8", "UTF-16", NULL, NULL, NULL);
++        delete[] utf16;
++    }
++#endif
++    if (str) {
++        std::string copy = str;
++        g_free(str);
++        return copy;
++    }
++    g_warning("Couldn't parse text in PDF from UTF16.");
++    return "";
+ }
+ 
+ void pdf_debug_array(const Array *array, int depth, XRef *xref)
+@@ -656,7 +697,11 @@ void pdf_debug_object(const Object *obj, int depth, XR
+     } else if (obj->isArray()) {
+         pdf_debug_array(obj->getArray(), depth, xref);
+     } else if (obj->isString()) {
++#if POPPLER_CHECK_VERSION(26, 4, 0)
++        std::cout << " STR '" << obj->getString().c_str() << "'";
++#else
+         std::cout << " STR '" << obj->getString()->getCString() << "'";
++#endif
+     } else if (obj->isName()) {
+         std::cout << " NAME '" << obj->getName() << "'";
+     } else if (obj->isBool()) {
diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.h b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.h
new file mode 100644
index 000000000000..4891598339b7
--- /dev/null
+++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_poppler-utils.h
@@ -0,0 +1,10 @@
+--- src/extension/internal/pdfinput/poppler-utils.h.orig	2025-12-26 00:35:50 UTC
++++ src/extension/internal/pdfinput/poppler-utils.h
+@@ -83,6 +83,7 @@ std::string getDictString(Dict *dict, const char *key)
+ FontList getPdfFonts(std::shared_ptr<PDFDoc> pdf_doc);
+ std::string getNameWithoutSubsetTag(std::string name);
+ std::string getDictString(Dict *dict, const char *key);
++std::string getString(const std::string &value);
+ std::string getString(const GooString *value);
+ std::string validateString(std::string const &in);
+ 
diff --git a/graphics/inkscape/files/patch-src_extension_internal_pdfinput_svg-builder.cpp b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_svg-builder.cpp
new file mode 100644
index 000000000000..424efbc134d9
--- /dev/null
+++ b/graphics/inkscape/files/patch-src_extension_internal_pdfinput_svg-builder.cpp
@@ -0,0 +1,72 @@
+--- src/extension/internal/pdfinput/svg-builder.cpp.orig	2025-12-26 00:35:50 UTC
++++ src/extension/internal/pdfinput/svg-builder.cpp
+@@ -32,6 +32,7 @@
+ #include <poppler/GfxState.h>
+ #include <poppler/Page.h>
+ #include <poppler/Stream.h>
++#include <poppler/goo/gmem.h>
+ 
+ #include "color.h"
+ #include "color/cms-util.h"
+@@ -1385,7 +1386,7 @@ void SvgBuilder::updateFont(GfxState *state, std::shar
+     sp_repr_css_set_property(_css_font, "font-variant", "normal");
+ 
+     // Writing mode
+-    if ( font->getWMode() == 0 ) {
++    if ( font->getWMode() == _POPPLER_WMODE_HORIZONTAL ) {
+         sp_repr_css_set_property(_css_font, "writing-mode", "lr");
+     } else {
+         sp_repr_css_set_property(_css_font, "writing-mode", "tb");
+@@ -1397,7 +1398,7 @@ void SvgBuilder::updateTextShift(GfxState *state, doub
+  */
+ void SvgBuilder::updateTextShift(GfxState *state, double shift) {
+     double shift_value = -shift * 0.001 * fabs(state->getFontSize());
+-    if (state->getFont()->getWMode()) {
++    if (state->getFont()->getWMode() != _POPPLER_WMODE_HORIZONTAL) {
+         _text_position[1] += shift_value;
+     } else {
+         _text_position[0] += shift_value;
+@@ -1451,7 +1452,7 @@ Inkscape::XML::Node* SvgBuilder::_flushTextText(GfxSta
+ 
+     // Text direction is a property of the <text> element.
+     auto font = state->getFont();
+-    if (font->getWMode() == 1) {
++    if (font->getWMode() == _POPPLER_WMODE_VERTICAL) {
+         // Only set if vertical.
+         auto css_text = sp_repr_css_attr_new();
+         sp_repr_css_set_property(css_text, "writing-mode", "tb");
+@@ -1545,8 +1546,8 @@ Inkscape::XML::Node* SvgBuilder::_flushTextText(GfxSta
+         bool output_tspan =
+             next_it == _glyphs.end() ||
+             next_it->style_changed   ||
+-            (writing_mode == 0 && std::abs(glyph.text_position[1] - next_it->text_position[1]) > 0.1) ||
+-            (writing_mode == 1 && std::abs(glyph.text_position[0] - next_it->text_position[0]) > 0.1);
++            (writing_mode == _POPPLER_WMODE_HORIZONTAL && std::abs(glyph.text_position[1] - next_it->text_position[1]) > 0.1) ||
++            (writing_mode == _POPPLER_WMODE_VERTICAL   && std::abs(glyph.text_position[0] - next_it->text_position[0]) > 0.1);
+ 
+         if (output_tspan) {
+ 
+@@ -2093,7 +2094,11 @@ Inkscape::XML::Node *SvgBuilder::_createImage(Stream *
+         } else {
+             image_stream = new ImageStream(str, width, 1, 1);
+         }
++#if POPPLER_CHECK_VERSION(26, 0, 0)
++        image_stream->rewind();
++#else
+         image_stream->reset();
++#endif
+ 
+         // Convert grayscale values
+         unsigned char *buffer = new unsigned char[width];
+@@ -2119,7 +2124,11 @@ Inkscape::XML::Node *SvgBuilder::_createImage(Stream *
+         image_stream = new ImageStream(str, width,
+                                        color_map->getNumPixelComps(),
+                                        color_map->getBits());
++#if POPPLER_CHECK_VERSION(26, 0, 0)
++        image_stream->rewind();
++#else
+         image_stream->reset();
++#endif
+ 
+         // Convert RGB values
+         unsigned int *buffer = new unsigned int[width];


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69f5ef07.39f8d.603b302c>