static const gchar * take_sjis_to_utf8(const gchar *sjis) { gchar *utf8; GError *error = NULL; utf8 = sjis_to_utf8(sjis, &error); cut_assert_g_error(error); return cut_take_string(utf8); }
//-----------------------------------------------------------------// inline std::string sjis_to_utf8(const std::string& src) noexcept { std::string dst; sjis_to_utf8(src, dst); return dst; }
static int gra2cairo_output(struct objlist *obj, N_VALUE *inst, N_VALUE *rval, int argc, char **argv) { char code, *cstr, *tmp; int *cpar, i, r, font_style; double x, y, w, h, fontsize, fontspace, fontdir, fontsin, fontcos, a1, a2; cairo_line_join_t join; cairo_line_cap_t cap; double *dashlist = NULL; struct gra2cairo_local *local; local = (struct gra2cairo_local *)argv[2]; code = *(char *)(argv[3]); cpar = (int *)argv[4]; cstr = argv[5]; if (local->cairo == NULL) return -1; if (code != 'T') { gra2cairo_draw_path(local); } switch (code) { case 'I': gra2cairo_set_antialias(local, local->antialias); local->linetonum = 0; r = check_cairo_status(local->cairo); if (r) { error(obj, r); return 1; } case '%': case 'X': break; case 'E': r = check_cairo_status(local->cairo); if (r) { error(obj, r); return 1; } break; case 'V': local->offsetx = mxd2pw(local, cpar[1]); local->offsety = mxd2ph(local, cpar[2]); cairo_new_path(local->cairo); if (cpar[5]) { x = mxd2pw(local, cpar[1]); y = mxd2ph(local, cpar[2]); w = mxd2pw(local, cpar[3]) - x; h = mxd2ph(local, cpar[4]) - y; cairo_reset_clip(local->cairo); cairo_rectangle(local->cairo, x, y, w, h); cairo_clip(local->cairo); } else { cairo_reset_clip(local->cairo); } if (local->region) { gra2cairo_clip_region(local, local->region); } break; case 'A': if (cpar[1] == 0) { cairo_set_dash(local->cairo, NULL, 0, 0); } else { dashlist = g_malloc(sizeof(* dashlist) * cpar[1]); if (dashlist == NULL) break; for (i = 0; i < cpar[1]; i++) { dashlist[i] = mxd2pw(local, cpar[6 + i]); if (dashlist[i] <= 0) { dashlist[i] = 1; } } cairo_set_dash(local->cairo, dashlist, cpar[1], 0); g_free(dashlist); } cairo_set_line_width(local->cairo, mxd2pw(local, cpar[2])); if (cpar[3] == 2) { cap = CAIRO_LINE_CAP_SQUARE; } else if (cpar[3] == 1) { cap = CAIRO_LINE_CAP_ROUND; } else { cap = CAIRO_LINE_CAP_BUTT; } cairo_set_line_cap(local->cairo, cap); if (cpar[4] == 2) { join = CAIRO_LINE_JOIN_BEVEL; } else if (cpar[4] == 1) { join = CAIRO_LINE_JOIN_ROUND; } else { join = CAIRO_LINE_JOIN_MITER; } cairo_set_line_join(local->cairo, join); break; case 'G': if (local->use_opacity && cpar[0] > 3 && cpar[4] < 255) { cairo_set_source_rgba(local->cairo, cpar[1] / 255.0, cpar[2] / 255.0, cpar[3] / 255.0, cpar[4] / 255.0); } else { cairo_set_source_rgb(local->cairo, cpar[1] / 255.0, cpar[2] / 255.0, cpar[3] / 255.0); } break; case 'M': cairo_move_to(local->cairo, mxd2px(local, cpar[1]), mxd2py(local, cpar[2])); break; case 'N': relative_move(local->cairo, mxd2pw(local, cpar[1]), mxd2ph(local, cpar[2])); break; case 'L': cairo_new_path(local->cairo); cairo_move_to(local->cairo, mxd2px(local, cpar[1]), mxd2py(local, cpar[2])); cairo_line_to(local->cairo, mxd2px(local, cpar[3]), mxd2py(local, cpar[4])); cairo_stroke(local->cairo); break; case 'T': cairo_line_to(local->cairo, mxd2px(local, cpar[1]), mxd2py(local, cpar[2])); local->linetonum++; break; case 'C': x = mxd2px(local, cpar[1] - cpar[3]); y = mxd2py(local, cpar[2] - cpar[4]); w = mxd2pw(local, cpar[3]); h = mxd2ph(local, cpar[4]); a1 = cpar[5] * (M_PI / 18000.0); a2 = cpar[6] * (M_PI / 18000.0) + a1; if (w == 0 || h == 0 || a1 == a2) break; cairo_new_path(local->cairo); cairo_save(local->cairo); cairo_translate(local->cairo, x + w, y + h); cairo_scale(local->cairo, w, h); cairo_arc_negative(local->cairo, 0., 0., 1., -a1, -a2); cairo_restore (local->cairo); switch (cpar[7]) { case 1: cairo_line_to(local->cairo, x + w, y + h); /* fall through */ case 2: cairo_close_path(local->cairo); cairo_fill(local->cairo); break; case 3: cairo_line_to(local->cairo, x + w, y + h); /* fall through */ case 4: cairo_close_path(local->cairo); cairo_stroke(local->cairo); break; default: cairo_stroke(local->cairo); } break; case 'B': cairo_new_path(local->cairo); if (cpar[1] <= cpar[3]) { x = mxd2px(local, cpar[1]); w = mxd2pw(local, cpar[3] - cpar[1]); } else { x = mxd2px(local, cpar[3]); w = mxd2pw(local, cpar[1] - cpar[3]); } if (cpar[2] <= cpar[4]) { y = mxd2py(local, cpar[2]); h = mxd2ph(local, cpar[4] - cpar[2]); } else { y = mxd2py(local, cpar[4]); h = mxd2ph(local, cpar[2] - cpar[4]); } cairo_rectangle(local->cairo, x, y, w, h); if (cpar[5] == 0) { cairo_stroke(local->cairo); } else { cairo_fill(local->cairo); } break; case 'P': cairo_new_path(local->cairo); cairo_arc(local->cairo, mxd2px(local, cpar[1]), mxd2py(local, cpar[2]), mxd2pw(local, 1), 0, 2 * M_PI); cairo_fill(local->cairo); break; case 'R': cairo_new_path(local->cairo); if (cpar[1] == 0) break; for (i = 0; i < cpar[1]; i++) { cairo_line_to(local->cairo, mxd2px(local, cpar[i * 2 + 2]), mxd2py(local, cpar[i * 2 + 3])); } cairo_stroke(local->cairo); break; case 'D': cairo_new_path(local->cairo); if (cpar[1] == 0) break; for (i = 0; i < cpar[1]; i++) { cairo_line_to(local->cairo, mxd2px(local, cpar[i * 2 + 3]), mxd2py(local, cpar[i * 2 + 4])); } cairo_close_path(local->cairo); switch (cpar[2]) { case 0: cairo_stroke(local->cairo); break; case 1: cairo_set_fill_rule(local->cairo, CAIRO_FILL_RULE_EVEN_ODD); cairo_fill(local->cairo); break; case 2: cairo_set_fill_rule(local->cairo, CAIRO_FILL_RULE_WINDING); cairo_fill(local->cairo); break; } break; case 'F': g_free(local->fontalias); local->fontalias = g_strdup(cstr); break; case 'H': fontspace = cpar[2] / 72.0 * 25.4; local->fontspace = fontspace; fontsize = cpar[1] / 72.0 * 25.4; local->fontsize = fontsize; fontdir = cpar[3] * MPI / 18000.0; fontsin = sin(fontdir); fontcos = cos(fontdir); local->fontdir = (cpar[3] % 36000) / 100.0; if (local->fontdir < 0) { local->fontdir += 360; } local->fontsin = fontsin; local->fontcos = fontcos; font_style = (cpar[0] > 3) ? cpar[4] : -1; local->loadfont = loadfont(local->fontalias, font_style, &local->symbol); break; case 'S': if (local->loadfont == NULL) break; tmp = gra2cairo_get_utf8_str(cstr, local->symbol); if (tmp) { draw_str(local, TRUE, tmp, local->loadfont, local->fontsize, local->fontspace, NULL, NULL, NULL); g_free(tmp); } break; case 'K': if (local->loadfont == NULL) break; tmp = sjis_to_utf8(cstr); if (tmp) { draw_str(local, TRUE, tmp, local->loadfont, local->fontsize, local->fontspace, NULL, NULL, NULL); g_free(tmp); } break; default: break; } return 0; }
static int dxpSaveDialogInit( /* 格納する構造体 */ SceUtilitySavedataParam * savedata, /* セーブモード */ int mode, /* セーブするデータのバッファアドレス */ void * buf, /* セーブするデータのバッファサイズ */ unsigned int size, /* ms0:/PSP/SAVEDATA/GameName/って感じ */ const char * GameName, /* AUTO SAVE時にセーブする場所 */ const char * SaveName, /* セーブリスト */ char (*nameMultiple)[20], /* ゲームのタイトル */ const char * GameTitle, /* セーブデータのタイトル */ const char * SaveTitle, /* セーブデータの詳細 */ const char * SaveDetail ) { memset(savedata, 0, sizeof(SceUtilitySavedataParam)); savedata->base.size = sizeof(SceUtilitySavedataParam); sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_LANGUAGE, &savedata->base.language); sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_UNKNOWN, &savedata->base.buttonSwap); savedata->base.graphicsThread = 0x11; savedata->base.accessThread = 0x13; savedata->base.fontThread = 0x12; savedata->base.soundThread = 0x10; savedata->mode = (PspUtilitySavedataMode)mode; savedata->overwrite = 1; //最近セーブしたファイルにフォーカス savedata->focus = PSP_UTILITY_SAVEDATA_FOCUS_LATEST; #if _PSP_FW_VERSION >= 200 const char key[] = "ThisIsASampleKey"; strncpy(savedata->key, key, 16); #endif strncpy(savedata->gameName, GameName, 13); savedata->gameName[12] = 0; strncpy(savedata->saveName, SaveName, 20); savedata->saveName[19] = 0; savedata->saveNameList = nameMultiple; strncpy(savedata->fileName, DXP_SAVE_DATANAME, 13); savedata->fileName[12] = 0; if ( size != 0 ) { savedata->dataBuf = malloc(size); if (savedata->dataBuf == NULL) return -1; } else { savedata->dataBuf = NULL; } savedata->dataBufSize = size; savedata->dataSize = size; if ( mode == PSP_UTILITY_SAVEDATA_LISTSAVE || mode == PSP_UTILITY_SAVEDATA_AUTOSAVE || mode == PSP_UTILITY_SAVEDATA_SAVE ) { //データのコピー memset(savedata->dataBuf, 0x0, size); memcpy(savedata->dataBuf, buf, size); if ( dxpGeneralData.charset == DXP_CP_UTF8 ) { strncpy(savedata->sfoParam.title, GameTitle, 128); strncpy(savedata->sfoParam.savedataTitle, SaveTitle, 128); strncpy(savedata->sfoParam.detail, SaveDetail, 1024); savedata->sfoParam.title[127] = 0; savedata->sfoParam.savedataTitle[127] = 0; savedata->sfoParam.detail[1023] = 0; savedata->sfoParam.parentalLevel = 1; } else if ( dxpGeneralData.charset == DXP_CP_SJIS ) { //128byte char utf8[1024]; sjis_to_utf8((void*)utf8, (void*)GameTitle); utf8[127] = '\0'; strncpy(savedata->sfoParam.title, utf8, 128); sjis_to_utf8((void*)utf8, (void*)SaveTitle); utf8[127] = '\0'; strncpy(savedata->sfoParam.savedataTitle, utf8, 128); //1024byte sjis_to_utf8((void*)utf8, (void*)SaveDetail); utf8[1023] = '\0'; strncpy(savedata->sfoParam.detail, utf8, 1024); savedata->sfoParam.parentalLevel = 1; } //背景 savedata->pic1FileData.buf = dxp_save_resource[DXP_SAVE_RESOURCE_PIC1].buf; savedata->pic1FileData.bufSize = dxp_save_resource[DXP_SAVE_RESOURCE_PIC1].size; savedata->pic1FileData.size = dxp_save_resource[DXP_SAVE_RESOURCE_PIC1].size; //アイコン savedata->icon0FileData.buf = dxp_save_resource[DXP_SAVE_RESOURCE_ICON0].buf; savedata->icon0FileData.bufSize = dxp_save_resource[DXP_SAVE_RESOURCE_ICON0].size; savedata->icon0FileData.size = dxp_save_resource[DXP_SAVE_RESOURCE_ICON0].size; //説明 savedata->icon1FileData.buf = dxp_save_resource[DXP_SAVE_RESOURCE_ICON1].buf; savedata->icon1FileData.bufSize = dxp_save_resource[DXP_SAVE_RESOURCE_ICON1].size; savedata->icon1FileData.size = dxp_save_resource[DXP_SAVE_RESOURCE_ICON1].size; //音楽 savedata->snd0FileData.buf = dxp_save_resource[DXP_SAVE_RESOURCE_SND0].buf; savedata->snd0FileData.bufSize = dxp_save_resource[DXP_SAVE_RESOURCE_SND0].size; savedata->snd0FileData.size = dxp_save_resource[DXP_SAVE_RESOURCE_SND0].size; const char* new_title = "新規作成"; char new_title_utf8[20]; sjis_to_utf8((void*)new_title_utf8, (const void*)new_title); new_title_utf8[19] = '\0'; newData.title = new_title_utf8; savedata->newData = &newData; //空のファイルが最初 savedata->focus = PSP_UTILITY_SAVEDATA_FOCUS_FIRSTEMPTY; } return 0; }