Example #1
0
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);
}
Example #2
0
	//-----------------------------------------------------------------//
	inline std::string sjis_to_utf8(const std::string& src) noexcept {
		std::string dst;
		sjis_to_utf8(src, dst);
		return dst;
	}
Example #3
0
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;
}
Example #4
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;
}