/** * display_begin_frame: Begin processing for a frame. * * [Parameters] * None * [Return value] * None */ void display_begin_frame(void) { sceKernelDelayThread(0); // Seems to be needed for the buffer swap to work while (swap_pending) { sceKernelDelayThread(100); // 0.1ms } vram_next_alloc = vram_spare_ptr; guStart(GU_DIRECT, display_list); /* We don't use a depth buffer, so disable depth buffer writing */ guDepthMask(GU_TRUE); /* Clear the work surface--make sure to use the base pointer here, not * the effective pointer, lest we stomp on spare VRAM while using the * second buffer */ guDrawBuffer(GU_PSM_8888, surfaces[work_surface], DISPLAY_STRIDE); guDisable(GU_SCISSOR_TEST); guClear(GU_COLOR_BUFFER_BIT); guCommit(); /* Register the effective work surface pointer */ guDrawBuffer(GU_PSM_8888, display_work_buffer(), DISPLAY_STRIDE); /* Set up drawing area parameters (we set the depth parameters too, * just in case a custom drawing routine wants to use 3D coordinates) */ guViewport(2048, 2048, display_width, display_height); guOffset(2048 - display_width/2, 2048 - display_height/2); guScissor(0, 0, display_width, display_height); guEnable(GU_SCISSOR_TEST); guDepthRange(65535, 0); guDisable(GU_DEPTH_TEST); }
int netDialog() { int done = 0; pspUtilityNetconfData data; memset(&data, 0, sizeof(data)); data.base.size = sizeof(data); data.base.language = PSP_SYSTEMPARAM_LANGUAGE_ENGLISH; data.base.buttonSwap = PSP_UTILITY_ACCEPT_CROSS; data.base.graphicsThread = 17; data.base.accessThread = 19; data.base.fontThread = 18; data.base.soundThread = 16; data.action = PSP_NETCONF_ACTION_CONNECTAP; struct pspUtilityNetconfAdhoc adhocparam; memset(&adhocparam, 0, sizeof(adhocparam)); data.adhocparam = &adhocparam; sceUtilityNetconfInitStart(&data); while(running) { guStart(); clearScreen(0xff554433); guEnd(); switch(sceUtilityNetconfGetStatus()) { case PSP_UTILITY_DIALOG_NONE: break; case PSP_UTILITY_DIALOG_VISIBLE: sceUtilityNetconfUpdate(1); break; case PSP_UTILITY_DIALOG_QUIT: sceUtilityNetconfShutdownStart(); break; case PSP_UTILITY_DIALOG_FINISHED: done = 1; break; default: break; } sceDisplayWaitVblankStart(); flipScreen(); if(done) break; } return 1; }
/** * display_init: Initialize the PSP display. * * [Parameters] * None * [Return value] * Nonzero on success, zero on error */ int display_init(void) { /* Have we already initialized? */ static int initted = 0; if (initted) { return 1; } /* Clear out VRAM */ memset(sceGeEdramGetAddr(), 0, sceGeEdramGetSize()); sceKernelDcacheWritebackInvalidateAll(); /* Set display mode */ int32_t res = sceDisplaySetMode(0, DISPLAY_WIDTH, DISPLAY_HEIGHT); if (res < 0) { DMSG("sceDisplaySetMode() failed: %s", psp_strerror(res)); return 0; } display_width = DISPLAY_WIDTH; display_height = DISPLAY_HEIGHT; display_mode = PSP_DISPLAY_PIXEL_FORMAT_8888; display_bpp = 32; /* Initialize VRAM pointers */ uint8_t *vram_addr = sceGeEdramGetAddr(); uint32_t vram_size = sceGeEdramGetSize(); const uint32_t frame_size = DISPLAY_STRIDE * DISPLAY_HEIGHT * (display_bpp/8); int i; for (i = 0; i < lenof(surfaces); i++) { surfaces[i] = vram_addr + i*frame_size; } vram_spare_ptr = (uint8_t *)(vram_addr + lenof(surfaces)*frame_size); vram_next_alloc = vram_spare_ptr; vram_top = vram_addr + vram_size; displayed_surface = 0; work_surface = 1; swap_pending = 0; /* Set the currently-displayed buffer */ sceDisplaySetFrameBuf(surfaces[displayed_surface], DISPLAY_STRIDE, display_mode, PSP_DISPLAY_SETBUF_IMMEDIATE); /* Set up the GU library */ guInit(); guStart(GU_DIRECT, display_list); guDispBuffer(DISPLAY_WIDTH, DISPLAY_HEIGHT, surfaces[displayed_surface], DISPLAY_STRIDE); guFinish(); guSync(0, 0); /* Success */ initted = 1; return 1; }
void SkinDialog::paint() { clearImage(drawImage, 0); //fillImageRect(drawImage, (alpha << 24) | bgColor, SKIN_DIALOG_X, SKIN_DIALOG_Y, SKIN_DIALOG_W, SKIN_DIALOG_H); fillImageEllipse(drawImage, (alpha << 24) | bgColor, SKIN_DIALOG_X, SKIN_DIALOG_Y, SKIN_DIALOG_W, SKIN_DIALOG_H, SKIN_DIALOG_R); int titleX = SKIN_DIALOG_X + (SKIN_DIALOG_W - strlen(title)*fontSize/2)/2; mainFont->printStringToImage(drawImage, titleX, SKIN_DIALOG_Y+2+fontSize-1, SKIN_DIALOG_W-titleX+SKIN_DIALOG_X, fontSize+2, labelColor, title); int helpX = SKIN_DIALOG_X + (SKIN_DIALOG_W - strlen(help)*fontSize/2)/2; mainFont->printStringToImage(drawImage, helpX, SKIN_DIALOG_Y+SKIN_DIALOG_H-4-fontSize+fontSize-1, SKIN_DIALOG_W-helpX+SKIN_DIALOG_X, fontSize+2, labelColor, help); if ( itemCurrent < itemTop ) { itemTop = itemCurrent; } else if (itemCurrent - itemTop >= itemBottom ){ itemTop = itemCurrent - itemBottom + 1; } int i; for(i=0;i<itemBottom;i++) { if( itemTop + i < itemCount) { if ( itemTop + i == itemCurrent) mainFont->printStringToImage(drawImage, SKIN_DIALOG_ITEM_X+1, SKIN_DIALOG_ITEM_Y + i*(fontSize+2)+fontSize-1, SKIN_DIALOG_ITEM_W-2, fontSize , PPA_SKINDLG_VALUE_HLCOLOR, skinItems[itemTop + i].longname); else mainFont->printStringToImage(drawImage, SKIN_DIALOG_ITEM_X+1, SKIN_DIALOG_ITEM_Y + i*(fontSize+2)+fontSize-1, SKIN_DIALOG_ITEM_W-2, fontSize , PPA_SKINDLG_VALUE_COLOR, skinItems[itemTop + i].longname); //items[i]->paint(SKIN_DIALOG_ITEM_X, SKIN_DIALOG_ITEM_Y + i*(fontSize+2), SKIN_DIALOG_ITEM_W, fontSize + 2 ); } } guStart(); clearScreen(); // blitImageToScreen(0, 0, screenSnapshot->imageWidth, screenSnapshot->imageHeight, screenSnapshot, 0, 0); blitImageToScreen(0, 0, mainWindow->imageWidth, mainWindow->imageHeight, mainWindow, 0, 0); blitAlphaImageToScreen(0, 0, mainDrawImage->imageWidth, mainDrawImage->imageHeight, mainDrawImage, 0, 0); blitAlphaImageToScreen(0, 0, drawImage->imageWidth, drawImage->imageHeight, drawImage, 0, 0); flipScreen(); };
void initGraphics() { dispBufferNumber = 0; sceGuInit(); guStart(); sceGuDrawBuffer(GU_PSM_8888, (void*)FRAMEBUFFER_SIZE, PSP_LINE_SIZE); sceGuDispBuffer(SCREEN_WIDTH, SCREEN_HEIGHT, (void*)0, PSP_LINE_SIZE); sceGuClear(GU_COLOR_BUFFER_BIT | GU_DEPTH_BUFFER_BIT); sceGuDepthBuffer((void*) (FRAMEBUFFER_SIZE*2), PSP_LINE_SIZE); sceGuOffset(2048 - (SCREEN_WIDTH / 2), 2048 - (SCREEN_HEIGHT / 2)); sceGuViewport(2048, 2048, SCREEN_WIDTH, SCREEN_HEIGHT); sceGuDepthRange(0xc350, 0x2710); sceGuScissor(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); sceGuEnable(GU_SCISSOR_TEST); sceGuAlphaFunc(GU_GREATER, 0, 0xff); sceGuEnable(GU_ALPHA_TEST); sceGuDepthFunc(GU_GEQUAL); sceGuEnable(GU_DEPTH_TEST); sceGuFrontFace(GU_CW); sceGuShadeModel(GU_SMOOTH); sceGuEnable(GU_CULL_FACE); sceGuEnable(GU_TEXTURE_2D); sceGuEnable(GU_CLIP_PLANES); sceGuTexMode(GU_PSM_8888, 0, 0, 0); sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA); sceGuTexFilter(GU_NEAREST, GU_NEAREST); sceGuAmbient(0xffffffff); sceGuEnable(GU_BLEND); sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0); sceGuFinish(); sceGuSync(0, 0); sceDisplayWaitVblankStart(); sceGuDisplay(GU_TRUE); initialized = 1; }
int main() { pspDebugScreenInit(); SetupCallbacks(); // Colors enum colors { RED = 0xFF0000FF, GREEN = 0xFF00FF00, BLUE = 0xFFFF0000, WHITE = 0xFFFFFFFF, LITEGRAY = 0xFFBFBFBF, GRAY = 0xFF7F7F7F, DARKGRAY = 0xFF3F3F3F, BLACK = 0xFF000000, }; pspDebugScreenPrintf("intraFont 0.31 - 2009 by BenHur\n\nLoading fonts: 0%%"); // Init intraFont library intraFontInit(); // Load fonts intraFont* ltn[16]; //latin fonts (large/small, with/without serif, regular/italic/bold/italic&bold) char file[40]; int i; for (i = 0; i < 16; i++) { sprintf(file, "flash0:/font/ltn%d.pgf", i); ltn[i] = intraFontLoad(file,0); //<- this is where the actual loading happens intraFontSetStyle(ltn[i], 1.0f, WHITE, DARKGRAY, 0); pspDebugScreenSetXY(15,2); pspDebugScreenPrintf("%d%%",(i+1)*100/20); } intraFont* jpn0 = intraFontLoad("flash0:/font/jpn0.pgf",INTRAFONT_STRING_SJIS); //japanese font with SJIS text string encoding intraFontSetStyle(jpn0, 0.8f, WHITE, DARKGRAY, 0); //scale to 80% pspDebugScreenSetXY(15,2); pspDebugScreenPrintf("%d%%",17*100/20); intraFont* kr0 = intraFontLoad("flash0:/font/kr0.pgf", INTRAFONT_STRING_UTF8); //Korean font (not available on all systems) with UTF-8 encoding intraFontSetStyle(kr0, 0.8f, WHITE, DARKGRAY, 0); //scale to 80% pspDebugScreenSetXY(15,2); pspDebugScreenPrintf("%d%%",18*100/20); intraFont* arib = intraFontLoad("flash0:/font/arib.pgf",0); //Symbols (not available on all systems) intraFontSetStyle(arib, 0.8f, WHITE, DARKGRAY, 0); //scale to 80% pspDebugScreenSetXY(15,2); pspDebugScreenPrintf("%d%%",19*100/20); intraFont* chn = intraFontLoad("flash0:/font/gb3s1518.bwfon", 0); //chinese font intraFontSetStyle(chn, 0.8f, WHITE, DARKGRAY, 0); //scale to 80% pspDebugScreenSetXY(15,2); pspDebugScreenPrintf("done\n"); // Make sure the important fonts for this application are loaded if(!ltn[0] || !ltn[4] || !ltn[8]) sceKernelExitGame(); // Set alternative fonts that are used in case a certain char does not exist in the main font intraFontSetAltFont(ltn[8], jpn0); //japanese font is used for chars that don't exist in latin intraFontSetAltFont(jpn0, chn); //chinese font (bwfon) is used for chars that don't exist in japanese (and latin) intraFontSetAltFont(chn, kr0); //korean font is used for chars that don't exist in chinese (and jap and ltn) intraFontSetAltFont(kr0, arib); //symbol font is used for chars that don't exist in korean (and chn, jap & ltn) // NB: This is an extreme case - usually you need only one alternative font (e.g. japanese & chinese) // Also: if one of the fonts failed to load (e.g. chn) the chain breaks and all subequent fonts are not used (e.g. kr0 and arib) initGraphics(); float x_scroll1 = 80, x_scroll2 = 225, x_scroll3 = 370, x_scroll4 = 385; while(running) { clearScreen(GRAY); // Must be called before any of the intraFont functions guStart(); // Draw various text float x,y = 20; intraFontSetStyle(ltn[4], 1.0f,BLACK,WHITE,INTRAFONT_ALIGN_CENTER); intraFontPrint(ltn[4], 240, y, "intraFont 0.31 - 2009 by BenHur"); intraFontSetStyle(ltn[4], 1.0f,WHITE,DARKGRAY,0); y += 21; intraFontPrint(ltn[8], 10, y, "Latin Sans-Serif:"); intraFontPrint(ltn[0], 180, y, "regular,"); intraFontPrint(ltn[2], 270, y, "italic,"); intraFontPrint(ltn[4], 330, y, "bold,"); intraFontPrint(ltn[6], 390, y, "both"); y += 17; intraFontPrint(ltn[8], 10, y, "Latin Sans-Serif small:"); intraFontPrint(ltn[8], 180, y, "regular,"); intraFontPrint(ltn[10], 270, y, "italic,"); intraFontPrint(ltn[12], 330, y, "bold,"); intraFontPrint(ltn[14], 390, y, "both"); y += 17; intraFontPrint(ltn[8], 10, y, "Latin with Serif:"); intraFontPrint(ltn[1], 180, y, "regular,"); intraFontPrint(ltn[3], 270, y, "italic,"); intraFontPrint(ltn[5], 330, y, "bold,"); intraFontPrint(ltn[7], 390, y, "both"); y += 17; intraFontPrint(ltn[8], 10, y, "Latin with Serif small:"); intraFontPrint(ltn[9], 180, y, "regular,"); intraFontPrint(ltn[11], 270, y, "italic,"); intraFontPrint(ltn[13], 330, y, "bold,"); intraFontPrint(ltn[15], 390, y, "both"); y += 17; intraFontSetEncoding(ltn[8], INTRAFONT_STRING_UTF8); //set text string encoding to UTF-8 intraFontPrint(ltn[8], 10, y, "LTN (UTF8):"); //(has no effect on std ascii) intraFontPrint(ltn[8], 110, y, "\xC3\xA5 \xC3\xA8 \xC3\xAD \xC3\xB4 \xC3\xBC \xC3\xB1"); //UTF-8 encoded chars with accents on top of them intraFontPrint(ltn[8], 250, y, "Symbols: "); unsigned short ucs2_arib[] = { 57786, 57787, 57788, 57789, 57790, 0 }; x = intraFontPrintUCS2(arib, 350, y, ucs2_arib); if (x == 350) intraFontPrint(ltn[8], 350, y, "[n/a]"); y += 17; intraFontPrint(ltn[8], 10, y, "JPN (UTF8):"); char utf8_jpn[] = {0xE3, 0x81, 0x93, 0xE3, 0x82, 0x93, 0xE3, 0x81, 0xAB, 0xE3, 0x81, 0xA1, 0xE3, 0x81, 0xAF, 0x20, 0xE4, 0xB8, 0x96, 0xE7, 0x95, 0x8C, 0}; intraFontSetEncoding(jpn0, INTRAFONT_STRING_UTF8); //temporarely switch to UTF-8 (INTRAFONT_STRING_SJIS was set in intraFontLoad call) x = intraFontPrint(jpn0, 110, y, utf8_jpn); //print UTF-8 encoded string if (x == 110) intraFontPrint(ltn[8], 110, y, "[n/a]"); intraFontSetEncoding(jpn0, INTRAFONT_STRING_SJIS); //switch back to S-JIS intraFontPrint(ltn[8], 250, y, "JPN (S-JIS):"); x = intraFontPrint(jpn0, 350, y, "イントラフォント"); //S-JIS encoded text string (flag INTRAFONT_STRING_SJIS set in intraFontLoad call) if (x == 350) intraFontPrint(ltn[8], 350, y, "[n/a]"); y += 17; intraFontPrint(ltn[8], 10, y, "CHN (GBK):"); char gbk_chn[] = { 0xbc,0xf2, 0xcc,0xe5, 0xd6,0xd0, 0xce,0xc4, 0}; intraFontSetEncoding(chn, INTRAFONT_STRING_GBK); x = intraFontPrint(chn, 110, y, gbk_chn); //print GBK-encoded string (simplified chinese) if (x == 110) intraFontPrint(ltn[8], 110, y, "[n/a]"); intraFontPrint(ltn[8], 250, y, "CHN (BIG5):"); char big5_chn[] = { 0xc1,0x63, 0xc5,0xe9, 0xa4,0xa4, 0xa4,0xe5, 0}; intraFontSetEncoding(chn, INTRAFONT_STRING_BIG5); x = intraFontPrint(chn, 350, y, big5_chn); //print BIG5-encoded string (trad. chinese) if (x == 350) intraFontPrint(ltn[8], 350, y, "[n/a]"); y += 17; intraFontPrint(ltn[8], 10, y, "KOR (UTF8):"); char utf8_kr[] = {0xed, 0x99, 0x98, 0xec, 0x98, 0x81, 0x20, 0xeb, 0x8c, 0x80, 0xed, 0x95, 0x9c, 0xeb, 0xaf, 0xbc, 0xea, 0xb5, 0xad, 0}; x = intraFontPrint(kr0, 110, y, utf8_kr); //print UTF-8 string (flag INTRAFONT_STRING_UTF8 set in intraFontLoad call) if (x == 110) intraFontPrint(ltn[8], 110, y, "[n/a]"); intraFontPrint(ltn[8], 250, y, "MIX (UCS2):"); unsigned short ucs2_all[] = { 0x0041, 0x0192, 0x3401, 0x3402, 0x4E01, 0x4E02, 0xAC01, 0xAC02, 0xE1BE, 0}; x = intraFontPrintUCS2(ltn[8], 350, y, ucs2_all); //print chars from all fonts (using alternative fonts, which were set after font loading) y += 17; intraFontPrint(ltn[8], 10, y, "Colors: "); intraFontSetStyle(ltn[8], 1.0f,RED,BLUE,0); x = intraFontPrint(ltn[8], 80, y, "colorful, "); intraFontSetStyle(ltn[8], 1.0f,WHITE,0,0); x = intraFontPrint(ltn[8], x, y, "no shadow, "); intraFontSetStyle(ltn[8], 1.0f,0,DARKGRAY,0); x = intraFontPrint(ltn[8], x, y, "no text, "); intraFontSetStyle(ltn[8], 1.0f,0x7FFFFFFF,DARKGRAY,0); x = intraFontPrint(ltn[8], x, y, "transparent, "); intraFontSetStyle(ltn[8], 1.0f,GRAY,WHITE,0); x = intraFontPrint(ltn[8], x, y, "glowing, "); float t = ((float)(clock() % CLOCKS_PER_SEC)) / ((float)CLOCKS_PER_SEC); int val = (t < 0.5f) ? t*511 : (1.0f-t)*511; intraFontSetStyle(ltn[8], 1.0f,LITEGRAY,(0xFF<<24)+(val<<16)+(val<<8)+(val),0); x = intraFontPrint(ltn[8], x, y, "flashing"); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,0); y += 17; intraFontPrint(ltn[8], 10, y, "Spacing: "); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,INTRAFONT_WIDTH_FIX); x = intraFontPrint(ltn[8], 80, y, "fixed (default), "); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,INTRAFONT_WIDTH_FIX | 12); x = intraFontPrint(ltn[8], x, y, "fixed (12), "); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,0); x = intraFontPrint(ltn[8], x, y, "variable width"); y += 22; intraFontPrint(ltn[8], 10, y, "Scaling: "); intraFontSetStyle(ltn[0], 0.5f,WHITE,DARKGRAY,0); x = intraFontPrint(ltn[0], 80, y, "tiny, "); intraFontSetStyle(ltn[0], 0.75f,WHITE,DARKGRAY,0); x = intraFontPrint(ltn[0], x, y, "small, "); intraFontSetStyle(ltn[0], 1.0f,WHITE,DARKGRAY,0); x = intraFontPrint(ltn[0], x, y, "regular, "); intraFontSetStyle(ltn[0], 1.25f,WHITE,DARKGRAY,0); x = intraFontPrint(ltn[0], x, y, "large, "); intraFontSetStyle(ltn[0], 1.5f,WHITE,DARKGRAY,0); x = intraFontPrint(ltn[0], x, y, "huge"); intraFontSetStyle(ltn[0], 1.0f,WHITE,DARKGRAY,0); y += 17; intraFontPrint(ltn[8], 10, y, "Align: "); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,INTRAFONT_ALIGN_LEFT); t = ((float)(clock() % (CLOCKS_PER_SEC*10))) / ((float)CLOCKS_PER_SEC); int length = (t < 5.0f) ? t*5.8f : (10.0f-t)*5.8f; intraFontPrintColumnEx(ltn[8], 80, y, 90, "left aligned w. linebreaks ", length); //NB: intraFontPrintColumnEx() is used to print a sub-string of a given length (last parameter) // if you want to print the whole string, simply use intraFontPrintColumn() and omit the length parameter intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,INTRAFONT_ALIGN_CENTER); intraFontPrintColumnEx(ltn[8], 225, y, 110, "center aligned w. linebreaks", length); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,INTRAFONT_ALIGN_RIGHT); intraFontPrintColumnEx(ltn[8], 370, y, 90, "right aligned w. linebreaks ", length); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,INTRAFONT_ALIGN_FULL); intraFontPrintColumnEx(ltn[8], 380, y, 90, "full justified w. linebreaks", length); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,0); y += 28; intraFontPrint(ltn[8], 10, y, "Scrolling: "); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,INTRAFONT_SCROLL_LEFT); x_scroll1 = intraFontPrintColumn(ltn[8], x_scroll1, y, 80, "This text is scrolled to the left."); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,INTRAFONT_SCROLL_SEESAW); x_scroll2 = intraFontPrintColumn(ltn[8], x_scroll2, y, 90, "Back & forth like a seesaw."); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,INTRAFONT_SCROLL_RIGHT); x_scroll3 = intraFontPrintColumn(ltn[8], x_scroll3, y, 80, "Scrolling to the right..."); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,INTRAFONT_SCROLL_THROUGH); x_scroll4 = intraFontPrintColumn(ltn[8], x_scroll4, y, 80, "This text is scrolled through."); intraFontSetStyle(ltn[8], 1.0f,WHITE,DARKGRAY,0); // End drawing sceGuFinish(); sceGuSync(0,0); // Swap buffers (waiting for vsync) sceDisplayWaitVblankStart(); flipScreen(); } //create screenshot (optional) //saveImage("scrshot.png", getVramDisplayBuffer(), SCREEN_WIDTH, SCREEN_HEIGHT, PSP_LINE_SIZE, 0); // Unload our fonts for (i = 0; i < 16; i++) { intraFontUnload(ltn[i]); } intraFontUnload(jpn0); intraFontUnload(kr0); intraFontUnload(arib); intraFontUnload(chn); // Shutdown font library intraFontShutdown(); sceKernelExitGame(); return 0; }