1
$\begingroup$

I am just trying to make a simple Skia program. A very simple program, but as I run this code, the output image file never writes anything. I am running this code on VS 2015 and included the skia.lib and OpenGL32.lib static libraries.

Can someone tell me why this simple example does not work?

#include "skiaIncludes.h"

void draw(SkCanvas* canvas) {
SkPaint paint;
paint.setColor(SK_ColorWHITE);
canvas->drawPaint(paint);
}

int main ()
{
try {
    FILE * pFile;
    char buffer[100];

    pFile = fopen("myfile.png", "wb");

sk_sp<SkSurface> rasterSurface(
        SkSurface::MakeRasterN32Premul(300, 300));
    SkCanvas* rasterCanvas = rasterSurface->getCanvas();

    //rasterCanvas->save();
    rasterCanvas->translate(SkIntToScalar(128), SkIntToScalar(128));
    rasterCanvas->rotate(SkIntToScalar(45));
    SkRect rect = SkRect::MakeXYWH(-90.5f, -90.5f, 181.0f, 181.0f);
    SkPaint paint;
    paint.setColor(SK_ColorBLUE);
    rasterCanvas->drawRect(rect, paint);
    //rasterCanvas->restore();

    sk_sp<SkImage> img = rasterSurface->makeImageSnapshot();
    sk_sp<SkData> png(img->encode(SkEncodedImageFormat::kPNG, 100));
    rasterCanvas->drawImage(img, 0, 0);
    png->MakeFromFILE(pFile);

    //sk_sp<SkImage> bmap = SkImage::MakeFromBitmap(bitmap);
    //SkData * encBmap = bmap->encode(SkEncodedImageFormat::kJPEG, 100);
    //encBmap->MakeFromFILE(pFile);

    fclose(pFile);
}
catch (std::exception ex){
    printf(ex.what());
}

return 0;
}

Header file :

#pragma once


#include "core/SkData.h"
#include "core/SkImage.h"
#include "core/SkStream.h"
#include "core/SkSurface.h"
#include "core/SkCanvas.h"
#include "core/SkGraphics.h"
#include "core/SkImageEncoder.h"
#include "gpu/gl/GrGLInterface.h"
#include "gpu/gl/GrGLExtensions.h"
#include <fstream>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <exception>
#include <iostream>
//#include "gpu/gl/GrGLUtil.h"
$\endgroup$
3
$\begingroup$

This never writes anything to the output file because you haven't included any code to write to the output file. The only time you touch the file after opening it is in the line

png->MakeFromFILE(pFile);

which reads from the file into the SkData instance. It won't even do that in this case, because the file handle has to be open for reading only.

I'm no expert on Skia, but you probably want to use SkFILEWStream to write the file. Or just call png.bytes() and write the bytes to the file using the standard library.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.