kis_vectorbrush_parasite.cpp 3.19 KB
Newer Older
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
/*
 *  Copyright (c) 2019 Alberto Eleuterio Flores Guerrero <barbanegra+bugs@posteo.mx>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
#include "kis_vectorbrush_parasite.h"

#include <KoShapeManager.h>


#include <SvgParser.h>
#include <KoDocumentResourceManager.h>
#include <KoXmlReader.h>
#include <KoShapePainter.h>

#include <QDebug>

KisVectorBrushParasite::KisVectorBrushParasite()
{    
}

void KisVectorBrushParasite::parseSvg(QByteArray svg)
{
    m_shapes= svgToKoShapes(svg);
    m_maxIndex = m_shapes.size();
}


QList<KoShape*> KisVectorBrushParasite::svgToKoShapes(QByteArray svg)
{
    KoXmlDocument document = SvgParser::createDocumentFromSvg(svg);
    // qDebug() << "document" << documento.toString();

    KoXmlElement elements = document.documentElement();
    // qDebug() << element.text();


    // Necessary to parse the elemnts
    KoDocumentResourceManager manager;
    SvgParser parser(&manager);
    parser.setResolution(QRectF(0,0,100,100), 72); // initialize with default values
    QSizeF fragmentSize;

    QList<KoShape*> shapes = parser.parseSvg(elements, &fragmentSize);

    return shapes;
}


// Blackbeard TODO!!
// KoCanvasControllerWidgetViewport_p.cpp
// KoSvgSymbolCollectionResource.cpp
// KoShapePainter.cpp --> boud told me to check this library
// SvgWriter.cpp line 256
// KoMarker.cpp line 99
// setBrushTipImage(theImage);
// > couldn't you just set a single shape with void setShapes(const
// QList<KoShape*> &shapes); ?
// this is too expensive, should be done with KoShapeManager
QImage KisVectorBrushParasite::shapeToQImage(QList<KoShape *> shapes, int index)
{
    QList<KoShape*> single_list;
    single_list.append(shapes.at(index));

    KoShapePainter painter;
    painter.setShapes(single_list);

    QImage theImage(1000, 1000, QImage::Format_ARGB32);  //fix size
    {
        QPainter p(&theImage);
        p.fillRect(0, 0, theImage.width(), theImage.height(), Qt::white);

    }
    painter.paint(theImage);

    QVector<QRgb> table;
    for (int i = 0; i < 256; ++i) table.push_back(qRgb(i, i, i));
    theImage = theImage.convertToFormat(QImage::Format_Indexed8, table);

    return theImage;
}


QImage KisVectorBrushParasite::nextBrushTip()
{
    return shapeToQImage(m_shapes, m_index);
}


int KisVectorBrushParasite::maxIndex()
{
    return m_maxIndex;
}


void KisVectorBrushParasite::nextIndex()
{
    qDebug() << "index" << m_index;
    if (m_index == m_maxIndex){
        m_index = 0;
    } else {
        m_index++;
    }
}


void KisVectorBrushParasite::setIndex(int index)
{
    m_index = index;
}