forums.ps2dev.org Forum Index forums.ps2dev.org
Homebrew PS2, PSP & PS3 Development Discussions
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Background image when showing the psp OSK

 
Post new topic   Reply to topic    forums.ps2dev.org Forum Index -> PSP Development
View previous topic :: View next topic  
Author Message
cr_17



Joined: 19 Nov 2008
Posts: 2
Location: i donīt know

PostPosted: Wed Nov 19, 2008 7:17 am    Post subject: Background image when showing the psp OSK Reply with quote

Hi!

Does anybody knows how to show the psp OSK with a background image?

I have found some examples with custom libraries, but i need the source code to do it by myself.

Thanks.
Back to top
View user's profile Send private message
psPea



Joined: 01 Sep 2007
Posts: 64

PostPosted: Wed Nov 19, 2008 8:42 am    Post subject: Reply with quote

In the sdk samples you'll find the osk sample where a rotating cube is drawn in the background, so instead of drawing the cube just change it so an image image is drawn.
Back to top
View user's profile Send private message Yahoo Messenger MSN Messenger
cr_17



Joined: 19 Nov 2008
Posts: 2
Location: i donīt know

PostPosted: Wed Nov 19, 2008 10:00 am    Post subject: Reply with quote

Hi psPea, can you please show me an example?.

I use lib graphics.h to show images but when I tried to use it with the sdk example it always crashed.

Thanks.
Back to top
View user's profile Send private message
Kreationz



Joined: 18 May 2008
Posts: 53

PostPosted: Wed Nov 19, 2008 11:33 am    Post subject: Reply with quote

If you can show how your using it in your code that will go a long way toward helping or any answer is a blind guess.
Back to top
View user's profile Send private message
psPea



Joined: 01 Sep 2007
Posts: 64

PostPosted: Thu Nov 20, 2008 11:05 am    Post subject: Reply with quote

My bad, the osk sample doesn't have the cube its the save data sample
Quote:
I use lib graphics.h to show images but when I tried to use it with the sdk example it always crashed.
Yeah so much for the easy way, try this quick mod of the osk sample, check out the DrawStuff function.An image img.png(png format width <= 512 height <= 512) in the same folder as the eboot is needed.



Code:
#include <pspkernel.h>
#include <pspdisplay.h>
#include <pspdebug.h>
#include <pspgu.h>
#include <string.h>
#include <psputility.h>
#include <psptypes.h>
#include "graphics.h"

PSP_MODULE_INFO("OSK Sample", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
PSP_HEAP_SIZE_KB(15*1024);

static int done = 0;

int exit_callback(int arg1, int arg2, void *common)
{
   done = 1;
   
   return 0;
}

int CallbackThread(SceSize args, void *argp)
{
   int cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
   sceKernelRegisterExitCallback(cbid);
   sceKernelSleepThreadCB();
   
   return 0;
}

int SetupCallbacks(void)
{
   int thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, PSP_THREAD_ATTR_USER, 0);
   
   if(thid >= 0)
      sceKernelStartThread(thid, 0, 0);

   return thid;
}
Image *img;
static unsigned int __attribute__((aligned(16))) list[262144];

#define BUF_WIDTH   (512)
#define SCR_WIDTH   (480)
#define SCR_HEIGHT   (272)
#define PIXEL_SIZE   (4)
#define FRAME_SIZE   (BUF_WIDTH * SCR_HEIGHT * PIXEL_SIZE)
#define ZBUF_SIZE   (BUF_WIDTH SCR_HEIGHT * 2)

#define NUM_INPUT_FIELDS   (3)
#define TEXT_LENGTH         (128)

typedef struct{

   ScePspSVector2 texture;

   ScePspSVector3 position;

} TPSVertex;


void DrawImage(Image *img, int xPos, int yPos){if (!img) return;

     sceGuTexImage(0, img->textureWidth, img->textureHeight, img->textureWidth, (void*) img->data);

 

     TPSVertex *vertices = (TPSVertex*) sceGuGetMemory(2 * sizeof(TPSVertex));

     vertices[0].texture.x = 0;

     vertices[0].texture.y = 0;

     vertices[0].position.x = xPos;

     vertices[0].position.y = yPos;

     vertices[0].position.z = 0;

 

     vertices[1].texture.x = img->imageWidth;

     vertices[1].texture.y = img->imageHeight;

     vertices[1].position.x = xPos+img->imageWidth;

     vertices[1].position.y = yPos+img->imageHeight;

     vertices[1].position.z = 0;

 

     sceGuTexMode(GU_PSM_8888, 0, 0, 0);

     sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);

     sceGuTexFilter(GU_NEAREST, GU_NEAREST);

 

//     sceKernelDcacheWritebackAll();

     sceGuDrawArray(GU_SPRITES, GU_TEXTURE_16BIT|GU_VERTEX_16BIT|GU_TRANSFORM_2D, 2, 0, vertices);

}

static void DrawStuff(void)
{

    sceGuStart(GU_DIRECT,list);

    // Clear screen   
    sceGuClearColor(0xff554433);
    sceGuClearDepth(0);
    sceGuClear(GU_COLOR_BUFFER_BIT|GU_DEPTH_BUFFER_BIT);

    DrawImage(img, 0, 0);

    sceGuFinish();
    sceGuSync(0,0);


}



int main(int argc, char* argv[])
{
   SetupCallbacks();

//   initGraphics();
   img = loadImage("./img.png");
   if (img == NULL) sceKernelExitGame();
   
   sceGuInit();
   sceGuStart(GU_DIRECT,list);
   sceGuDrawBuffer(GU_PSM_8888,(void*)0,BUF_WIDTH);
   sceGuDispBuffer(SCR_WIDTH,SCR_HEIGHT,(void*)0x88000,BUF_WIDTH);
   sceGuDepthBuffer((void*)0x110000,BUF_WIDTH);
   sceGuOffset(2048 - (SCR_WIDTH/2),2048 - (SCR_HEIGHT/2));
   sceGuViewport(2048,2048,SCR_WIDTH,SCR_HEIGHT);
   sceGuDepthRange(0xc350,0x2710);
   sceGuScissor(0,0,SCR_WIDTH,SCR_HEIGHT);
   sceGuEnable(GU_SCISSOR_TEST);
   sceGuDepthFunc(GU_GEQUAL);
   sceGuEnable(GU_DEPTH_TEST);
   sceGuFrontFace(GU_CW);
   sceGuShadeModel(GU_FLAT);
   sceGuEnable(GU_CULL_FACE);
   sceGuEnable(GU_TEXTURE_2D);
   sceGuEnable(GU_CLIP_PLANES);
   sceGuFinish();
   sceGuSync(0,0);
   sceDisplayWaitVblankStart();
   sceGuDisplay(GU_TRUE);
   
   
   unsigned short intext[NUM_INPUT_FIELDS][TEXT_LENGTH];
   unsigned short outtext[NUM_INPUT_FIELDS][TEXT_LENGTH];
   unsigned short desc[NUM_INPUT_FIELDS][TEXT_LENGTH];
   
   memset(&intext, 0, NUM_INPUT_FIELDS * TEXT_LENGTH * sizeof(unsigned short));
   memset(&outtext, 0, NUM_INPUT_FIELDS * TEXT_LENGTH * sizeof(unsigned short));
   memset(&desc, 0, NUM_INPUT_FIELDS * TEXT_LENGTH * sizeof(unsigned short));
   
   int i;
   
   for(i = 0;i < NUM_INPUT_FIELDS;i++)
   {
      desc[i][0] = 'F';
      desc[i][1] = 'i';
      desc[i][2] = 'e';
      desc[i][3] = 'l';
      desc[i][4] = 'd';
      desc[i][5] = ' ';
      desc[i][6] = i + 48 + 1; // Convert i to ASCII value.
      desc[i][7] = 0;
      
      intext[i][0] = 'T';
      intext[i][1] = 'e';
      intext[i][2] = 'x';
      intext[i][3] = 't';
      intext[i][4] = ' ';
      intext[i][5] = i + 48 + 1; // Convert i to ASCII value.
      intext[i][6] = 0;
      
   }

   SceUtilityOskData data[NUM_INPUT_FIELDS];
   
   for(i = 0; i < NUM_INPUT_FIELDS;i++)
   {
      memset(&data[i], 0, sizeof(SceUtilityOskData));
      data[i].language = PSP_UTILITY_OSK_LANGUAGE_DEFAULT; // Use system default for text input
      data[i].lines = 1;
      data[i].unk_24 = 1;
      data[i].inputtype = PSP_UTILITY_OSK_INPUTTYPE_ALL; // Allow all input types
      data[i].desc = desc[i];
      data[i].intext = intext[i];
      data[i].outtextlength = TEXT_LENGTH;
      data[i].outtextlimit = 32; // Limit input to 32 characters
      data[i].outtext = outtext[i];
   }
   
   SceUtilityOskParams params;
   memset(&params, 0, sizeof(params));
   params.base.size = sizeof(params);
   sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_LANGUAGE, &params.base.language);
   sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_UNKNOWN, &params.base.buttonSwap);
   params.base.graphicsThread = 17;
   params.base.accessThread = 19;
   params.base.fontThread = 18;
   params.base.soundThread = 16;
   params.datacount = NUM_INPUT_FIELDS;
   params.data = data;

   sceUtilityOskInitStart(&params);

   while(!done)
   {
      DrawStuff();

      switch(sceUtilityOskGetStatus())
      {
         case PSP_UTILITY_DIALOG_INIT:
            break;
         
         case PSP_UTILITY_DIALOG_VISIBLE:
            sceUtilityOskUpdate(1);
            break;
         
         case PSP_UTILITY_DIALOG_QUIT:
            sceUtilityOskShutdownStart();
            break;
         
         case PSP_UTILITY_DIALOG_FINISHED:
            break;
            
         case PSP_UTILITY_DIALOG_NONE:
            done = 1;
            
         default :
            break;
      }

      sceDisplayWaitVblankStart();
      sceGuSwapBuffers();
   }

   pspDebugScreenInit();
   pspDebugScreenSetXY(0, 0);
   
   int j;
   
   for(i = 0; i < NUM_INPUT_FIELDS;i++)
   {
      pspDebugScreenPrintf("Field %d: ", i+1);
      
      switch(data[i].result)
      {
         case PSP_UTILITY_OSK_RESULT_UNCHANGED:
            pspDebugScreenPrintf("UNCHANGED: ");
            break;
         
         case PSP_UTILITY_OSK_RESULT_CANCELLED:
            pspDebugScreenPrintf("CANCELLED: ");
            break;
            
         case PSP_UTILITY_OSK_RESULT_CHANGED:
            pspDebugScreenPrintf("CHANGED: ");
            break;
            
         default:
            break;
      }
      
      for(j = 0; data[i].outtext[j]; j++)
      {
         unsigned c = data[i].outtext[j];
         
         if(32 <= c && c <= 127) // print ascii only
            pspDebugScreenPrintf("%c", data[i].outtext[j]);
      }
      
      pspDebugScreenPrintf("\n");
   }

   done = 0;

   while(!done)
      sceKernelDelayThread(1000);   

   sceGuTerm();
   
   sceKernelExitGame();

   return 0;
}

Back to top
View user's profile Send private message Yahoo Messenger MSN Messenger
Display posts from previous:   
Post new topic   Reply to topic    forums.ps2dev.org Forum Index -> PSP Development All times are GMT + 10 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group