PSPx форум

PSPx форум (https://www.pspx.ru/forum/index.php)
-   Программирование для PSP (https://www.pspx.ru/forum/forumdisplay.php?f=101)
-   -   Проблемы с рисунками PNG (https://www.pspx.ru/forum/showthread.php?t=88226)

Romcik077 09.08.2010 23:30

Проблемы с рисунками PNG
 
Здравствуйте! Решил начать программировать на ЗЫЗе. Но вот уже на первой программе возникли трудность. Цель состоит в том чтоб показать на экране рисунок на полный экран. Поискав в нете решил использовать библиотеку для рисунков PNG. Привожу код ниже:
CODE
Код:

#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspgu.h>
#include <png.h>
#include <stdio.h>
#include "graphics.h"
#include "callback.h"

#define printf pspDebugScreenPrintf

PSP_MODULE_INFO("Cursor Example", 0, 1, 1);

int main() {
    sceCtrlSetSamplingCycle(0);
    sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
    SceCtrlData pad;

          pspDebugScreenInit();
          SetupCallbacks();
          initGraphics();

          char buffer[200];
          Image* image;
          image = loadImage("./picture/5.png");

          if (!image) {
              printf("Image load failed!\n");
          } else {
            blitAlphaImageToScreen(0, 0, 480, 272, image, 0, 0);
              flipScreen();
          }
          sceKernelSleepThread();
          return 0;
} // main


Но оказалось что рисуки с большим размером не грузятся(больше размера 32х32), пишет "Image load failed!". В чём может быть проблема? Если это особенность этой библиотеки то какую библиотеку можно использовать вместо этой, желательно с примером кода. Спасибо заранее!!!

Yoti 10.08.2010 19:15

Попробуй больше памяти под приложение выделить, например.
Ридми библиотеки уже изучено, полагаю.

Romcik077 11.08.2010 13:38

Спасибо Yoti!!! Заставил меня опять сесть за поиски библиотеки и мануала для рисунков PNG, и я нашёл вот это. Что-ж попробовал, скомпилил вроде всё получилось. Присмотревшись в этот код я увидел что-то знакомое и вспомнил что приблизительно такой код я видел и в graphics.c для функций "loadImagе". Сравнив я заметил что в graphics.c присуствует (выделено жирным):
[spoiler]
Код:

Image* loadImage(const char* filename)
{
    png_structp png_ptr;
    png_infop info_ptr;
    unsigned int sig_read = 0;
    png_uint_32 width, height;
    int bit_depth, color_type, interlace_type, x, y;
    u32* line;
    FILE *fp;
    Image* image = (Image*) malloc(sizeof(Image));
    if (!image) return NULL;


    if ((fp = fopen(filename, "rb")) == NULL) return NULL;
    png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    if (png_ptr == NULL) {
        free(image);
        fclose(fp);
        return NULL;;
    }
    png_set_error_fn(png_ptr, (png_voidp) NULL, (png_error_ptr) NULL, user_warning_fn);
    info_ptr = png_create_info_struct(png_ptr);
    if (info_ptr == NULL) {
        free(image);
        fclose(fp);
        png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
        return NULL;
    }
    png_init_io(png_ptr, fp);
    png_set_sig_bytes(png_ptr, sig_read);
    png_read_info(png_ptr, info_ptr);
    png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, int_p_NULL, int_p_NULL);
    if (width > 512 || height > 512) {
        free(image);
        fclose(fp);
        png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
        return NULL;
    }
    image->imageWidth = width;
    image->imageHeight = height;
    image->textureWidth = getNextPower2(width);
    image->textureHeight = getNextPower2(height);
    png_set_strip_16(png_ptr);
    png_set_packing(png_ptr);
    if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr);
    if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_gray_1_2_4_to_8(png_ptr);
    if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr);
    png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
    image->data = (Color*) memalign(16, image->textureWidth * image->textureHeight * sizeof(Color));
    if (!image->data) {
        free(image);
        fclose(fp);
        png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
        return NULL;
    }
    line = (u32*) malloc(width * 4);
    if (!line) {
        free(image->data);
        free(image);
        fclose(fp);
        png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL);
        return NULL;
    }
    for (y = 0; y < height; y++) {
        png_read_row(png_ptr, (u8*) line, png_bytep_NULL);
        for (x = 0; x < width; x++) {
            u32 color = line[x];
            image->data[x + y * image->textureWidth] =  color;
        }
    }
    free(line);
    png_read_end(png_ptr, info_ptr);
    png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
    fclose(fp);
    return image;
}

[/spoiler]
Я ещё новичок в С++ програмированиё, но как я нашел в интернете это выделение память для картинки. ну я взял да удалил: if (!image) return NULL;, и всё запустилось. Спасибо ещё раз за помощь.


Текущее время: 23:20. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.