You are on page 1of 9

10/17/2017 same.rar SAMPLE.

www.pudn.com > same.rar > SAMPLE.C, change:1998-04-02,size:17430b

Search codes

01. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//
02. //FILENAME:SAMPLE.C(4A)//
03. //DESCRIPTION:Asampleprogramusedtoillustratehow//
04. //towritecodeforlinkingwithUNISCAN//
05. //scannerdriverinDOS.//
06. //COMPILER:MicrosoftC/C++(VC++1.5)//
07. //AUTHOR:DaohongKan,TsinghuaUnisplendourGroup//
08. //DATE:Jan231996//
09. //VERSION:1.0//
10. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//
11. #include<string.h>
12. #include<stdio.h>
13. #include<stdlib.h>
14. #include<conio.h>
15. #include<bios.h>
16. #include<dos.h>
17. #include<graph.h>
18. #include<malloc.h>
19. #include"sample.h"
20.
21. #defineVGACtlPort0x3ce//VGAGraphControllerPort
22. #defineVGADataPort0x3cf
23. #defineSequenCtlPort0x3c4
24. #defineSequenDataPort0x3c5
25. #defineVGASEG0xA000
26.
27. #defineIT_BIN0//ColorCode
28. #defineIT_GRAY1
29. #defineIT_COLOR2
30. #defineGETDEVINFO1//FunctionCode
31. #defineSETPARAMETERS2
32. #defineSTARTSCAN3
33. #defineSTOPSCAN4
34. #defineGETIMAGESTATUS5
35. #defineBUF_LEN(1024*20)
36.
37. structDev_Infodev_info;
38. structSetDevParamset_dev;
39. structScanParamsScan;
40. structGetImageStatussImage;
41. structCommonParamsAbort;
42.
43. PB_buffer_listbuffer_list;
44. unsignedcharimg_buf[BUF_LEN],mem_buf[BUF_LEN];
45. unsignedchardither[4][4]=//Ditherpattern
46. {{0,8,2,10},{12,4,14,6},
47. {3,11,1,9},{15,7,13,5}};
48. charmodel_name[10];
49. chartmp_file[]=".\\uniscan.4a$";
50. floatfrm[6]={0,0,0,0,0,0};
51. intimage_type,scanner_type;
52.
53. ///////////////////////////////////////////////////////////
54. //Mainprogram,givenfilenameandaportaddress,//
55. //istocontrolthewholescanningprocess.//
56. ///////////////////////////////////////////////////////////

http://read.pudn.com/downloads84/sourcecode/windows/vxd/323798/same_%E6%89%AB%E6%8F%8F%E4%BB%AA%E9%A9%B1%E5%8A%A8%E5%BC%80 1/9
10/17/2017 same.rar SAMPLE.C
57. voidmain(void)
58. {
59. intresolution;
60. _clearscreen(_GCLEARSCREEN);
61. _setbkcolor(1);
62. _settextposition(1,26);
63. _settextcolor(7);
64. _outtext("uniscancontroller\n");
65. _settextposition(3,1);
66. _outtext("scanertype:\n");
67.
68. if(SCN_INIT()!=0)
69. {
70. printf("[Test]:initializationfails!");
71. exit(0);
72. }
73. printf("[Test]:initializationOK!\n");
74. _settextposition(8,1);
75. _outtext("Pleaseenterparameters:\n");
76. printf("resoulution=");
77. scanf("%d",&resolution);
78.
79. if(SCN_SETPARAM(resolution)!=0)
80. {
81. printf("[Test]:Setspidriverparametersfails!");
82. SCN_ABORT();
83. exit(0);
84. }
85. printf("\n[Test]:SetscanningparametersOK!\n");
86. if(SCN_START()!=0)
87. {
88. printf("[Test]:Startscanfails!\n");
89. SCN_ABORT();
90. exit(0);
91. }
92. _settextposition(20,1);
93. _outtext("Scanninglines:");
94. printf("100%%");
95. _settextposition(21,1);
96. printf("[Test]:StartscanningOK!\n");
97. show_image();
98. SCN_ABORT();
99. exit(0);
100. }
101.
102. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
103. //Givingtheportaddressofscannerinterfacecard>>
104. //inordertodotheinitializationofscanner.>>
105. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
106. SCN_INIT()
107. {
108. inti,j;
109. if(SCNOpen()<0)
110. {
111. printf("Opendriverfail!!\n");
112. return(1);
113. }
114. memset(dev_info.attention,0,96);
115. dev_info.Comm.func_code=GETDEVINFO;
116. SCNCall((charfar*)&dev_info);
117. SCNClose();
118. printf("card_id=[%s]IO_port=%x\n",dev_info.card_id,dev_info.BUF_SEG);
119.
120. dev_info.attention[15]='\0';
121. dev_info.attention[32]='\0';
122. if(strcmp(&dev_info.attention[36],"UNISCAN")==0)
123. {
124. printf("name1=[%s]model=[%s]type=%xsource=%x\n",
125. &dev_info.attention[36],&dev_info.attention[44],
126. (unsignedchar)dev_info.attention[57],
http://read.pudn.com/downloads84/sourcecode/windows/vxd/323798/same_%E6%89%AB%E6%8F%8F%E4%BB%AA%E9%A9%B1%E5%8A%A8%E5%BC%80 2/9
10/17/2017 same.rar SAMPLE.C
127. (unsignedchar)dev_info.attention[63]);
128. strcpy(model_name,&dev_info.attention[44]);
129. }
130. else
131. {
132. printf("name1=[%s]model=[%s]type=%xsource=%x\n",
133. &dev_info.attention[8],&dev_info.attention[16],
134. (unsignedchar)dev_info.attention[57],
135. (unsignedchar)dev_info.attention[63]);
136. strcpy(model_name,&dev_info.attention[16]);
137. }
138. return(0);
139. }
140.
141. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
142. //Setscanningparameters>>
143. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
144. SCN_SETPARAM(intresolution)
145. {
146. inti,j,color,type;
147. if(SCNOpen()<0)return(1);
148. set_dev.length_unit=0;//0:inch(unit:papar_length)
149. set_dev.paper_length=14;//Max.length14inches
150. set_dev.frame_unit=1;//1:pixel;0:(inch*3/4)
151. set_dev.background_unit=0;
152. set_dev.background_win_no=0;
153. set_dev.contrast=1;
154. set_dev.brightness=1;
155. set_dev.velocity=4;//0>4,fast>slow
156. set_dev.resolution=resolution;
157. set_dev.grain_built_in=0;
158. set_dev.grain=0;
159. set_dev.gamma=0;
160. set_dev.gammasize=0;
161. set_dev.Comm.func_code=SETPARAMETERS;
162. set_dev.LD_DPI=0x00;
163.
164. printf("color(1:B/W2:gray3:color):");
165. scanf("%f",&frm[4]);
166. switch((int)frm[4])
167. {
168. case1:set_dev.background_f_code='T';//'T':B/W
169. set_dev.filter=0;//0:grayorB/W
170. break;
171. case2:set_dev.background_f_code=0;//'T':B/W
172. set_dev.filter=0;//0:grayorB/W
173. break;
174. case3:set_dev.background_f_code=0;//0:grayorcolor
175. set_dev.filter=1;//1:color
176. break;
177. }
178.
179. printf("scansource(1:flatbed2:ADF):");
180. scanf("%f",&frm[5]);
181. if((int)frm[5])
182. {
183. set_dev.scansource=0x00;//0x00=Flatbed
184. printf("enterlefttopandrightbottom(inch):");//unit:inch
185. scanf("%f%f%f%f",&frm[0],&frm[1],&frm[2],&frm[3]);
186. }
187. else
188. {
189. if(dev_info.attention[63]!=12)
190. {
191. printf("ADForpaperisnotready!!\n\n");
192. return(1);
193. }
194. set_dev.scansource=0x02;//0x02=ADF
195. frm[0]=frm[1]=0;
196. frm[2]=8.25;frm[3]=11.2;
http://read.pudn.com/downloads84/sourcecode/windows/vxd/323798/same_%E6%89%AB%E6%8F%8F%E4%BB%AA%E9%A9%B1%E5%8A%A8%E5%BC%80 3/9
10/17/2017 same.rar SAMPLE.C
197. }
198.
199. printf("\nPleasewaitting.......");
200. _settextposition(15,1);
201. if(frm[2]>8.26)frm[2]=8.26;//rightbottomx,y<8.26,11.3
202. if(frm[3]>11.3)frm[3]=11.3;
203.
204. if(strcmp(model_name,"4A")==0)set_dev.model=600;
205. elseif(strcmp(model_name,"4B")==0)set_dev.model=800;
206. elseif(strcmp(model_name,"4C")==0)set_dev.model=1200;
207. elseif(strcmp(model_name,"4X")==0)set_dev.model=600;
208. for(i=0;i<4;i++)
209. set_dev.frame[i]=(int)(frm[i]*set_dev.model);
210. memset(set_dev.background,0,16);
211. memset(set_dev.grain_code,0,256);
212. memset(set_dev.gammacode,0,256);
213. SCNCall((charfar*)&set_dev);
214. SCNClose();
215.
216. printf("Setparametersreturn:%d\n",set_dev.Comm.error_code);
217. return(set_dev.Comm.error_code);
218. }
219.
220. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
221. //WhenselectingOK,thususercanstartscannerand>>
222. //getthedigitiziedimageback.>>
223. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
224. SCN_START()
225. {
226. intlines,i,j,get_lines,MaxValue,Pk_res,IsAZ_LD;
227. intr_index,g_index,b_index,rLD,gLD,bLD,Qk_R,Qk_G,Qk_B;
228. FILE*fp;
229.
230. if(SCNOpen()<0)return1;
231. sImage.Comm.func_code=GETIMAGESTATUS;
232. SCNCall((charfar*)&sImage);
233. printf("totallines=%dwidth=%d\n",sImage.line_no,sImage.line_width);
234.
235. buffer_list.buf_size=BUF_LEN;
236. buffer_list.buf_line=(int)(BUF_LEN/sImage.line_width);
237. buffer_list.buf_address=(long)img_buf;
238. printf("linesperbuffer=%d\n",buffer_list.buf_line);
239.
240. fp=fopen(tmp_file,"wb");
241. switch((int)frm[4])
242. {
243. case1:image_type=IT_BIN;
244. i=sImage.line_width;
245. break;
246. case2:image_type=IT_GRAY;
247. i=sImage.line_width;
248. break;
249. default:image_type=IT_COLOR;
250. i=sImage.line_width/3;
251. }
252. fwrite(&image_type,2,1,fp);
253. fwrite(&i,2,1,fp);
254. fwrite(&sImage.line_no,2,1,fp);
255. IsAZ_LD=0;
256. if(image_type==IT_COLOR&&set_dev.LD_DPI!=0xffff)
257. {
258. IsAZ_LD=1;
259. Pk_res=set_dev.resolution;
260. if(set_dev.LD_DPI==0x0000)
261. {
262. MaxValue=set_dev.model;
263. Qk_R=Qk_G=Qk_B=set_dev.model;
264. Pk_res=(Pk_res<=(set_dev.model/2)?Pk_res*2:Pk_res);
265. }
266. else
http://read.pudn.com/downloads84/sourcecode/windows/vxd/323798/same_%E6%89%AB%E6%8F%8F%E4%BB%AA%E9%A9%B1%E5%8A%A8%E5%BC%80 4/9
10/17/2017 same.rar SAMPLE.C
267. {
268. MaxValue=set_dev.model;
269. Qk_R=Qk_G=Qk_B=set_dev.model;
270. Pk_res=Pk_res*set_dev.LD_DPI;
271. }}
272.
273. get_lines=0;
274. while((sImage.line_noget_lines)>0)
275. {
276. lines=sImage.line_noget_lines;
277. if(lines>buffer_list.buf_line)lines=buffer_list.buf_line;
278. _settextposition(20,1);
279. _outtext("Scanninglines:");
280. printf("%d%%\n",((long)get_lines)*100/sImage.line_no);
281.
282. sScan.Comm.func_code=STARTSCAN;
283. sScan.scan_control=0;
284. sScan.scan_bytes=sImage.line_width;
285. sScan.scan_lines=lines;
286. sScan.processed_lines=0;
287. sScan.number_of_buf=1;
288. sScan.buf_list_ptr=(long)(&buffer_list);
289. SCNCall((charfar*)&sScan);
290. if(sScan.Comm.error_code!=0)break;
291. switch(set_dev.filter)
292. {
293. case0:if(fwrite(img_buf,sImage.line_width,lines,fp)<=0)
294. {
295. SCN_ABORT();
296. fclose(fp);
297. return(1);
298. }
299. break;
300. case1://changeimagedataformatintoRGBRGBRGB...
RGBRGBRGB
301. if(IsAZ_LD==0)
302. {//changedataformat:RRRGGGBBB>RGBRGBRGB...
RGBRGBRGB
303. for(i=0;i<lines;i++)
304. for(j=0;j<sImage.line_width/3;j++)
305. {
306. mem_buf[i*sImage.line_width+3*j]=
307. img_buf[i*sImage.line_width+j];
308. mem_buf[i*sImage.line_width+3*j+1]=
309. img_buf[i*sImage.line_width+sImage.line_width/3+j];
310. mem_buf[i*sImage.line_width+3*j+2]=
311. img_buf[i*sImage.line_width+2*sImage.line_width/3+j];
312. }}
313. else
314. {
315. rLD=gLD=bLD=0;
316. r_index=g_index=b_index=0;
317. i=0;
318. //changedataformat:???...???...???...>RGBRGBRGB...
RGBRGBRGB
319. //Inthiscase,thesequenceofR,G,Blinesisunknown
320. while(1)
321. {//checkifGREENline
322. if(g_index<lines)
323. {
324. if(gLD<set_dev.G_LD)gLD++;
325. else
326. {
327. Qk_G+=Pk_res;
328. if(Qk_G>MaxValue)
329. {
330. Qk_G=MaxValue;
331. for(j=0;j<sImage.line_width/3;j++)
332. mem_buf[g_index*sImage.line_width+3*j+1]
333. =img_buf[i*sImage.line_width/3+j];
334. g_index++;
335. i++;
336. if(i>=lines*3)break;
http://read.pudn.com/downloads84/sourcecode/windows/vxd/323798/same_%E6%89%AB%E6%8F%8F%E4%BB%AA%E9%A9%B1%E5%8A%A8%E5%BC%80 5/9
10/17/2017 same.rar SAMPLE.C
337. }}}//endofcheckGREENline
338. //checkifBLUEline
339. if(b_index<lines)
340. {
341. if(bLD<set_dev.B_LD)bLD++;
342. else
343. {
344. Qk_B+=Pk_res;
345. if(Qk_B>MaxValue)
346. {
347. Qk_B=MaxValue;
348. for(j=0;j<sImage.line_width/3;j++)
349. mem_buf[b_index*sImage.line_width+3*j+2]
350. =img_buf[i*sImage.line_width/3+j];
351. b_index++;
352. i++;
353. if(i>=lines*3)break;
354. }}}//endofcheckBLUEline
355. //checkifREDline
356. if(r_index<lines)
357. {
358. if(rLD<set_dev.R_LD)rLD++;
359. else
360. {
361. Qk_R+=Pk_res;
362. if(Qk_R>MaxValue)
363. {
364. Qk_R=MaxValue;
365. for(j=0;j<sImage.line_width/3;j++)
366. mem_buf[r_index*sImage.line_width+3*j]
367. =img_buf[i*sImage.line_width/3+j];
368. r_index++;
369. i++;
370. if(i>=lines*3)break;
371. }}}//endofcheckREDline
372. }}//endofdataformatchange
373. fwrite(mem_buf,sImage.line_width,lines,fp);
374. }
375. get_lines+=lines;
376. }
377. fclose(fp);
378. SCNClose();
379. return(sScan.Comm.error_code);
380. }
381.
382. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
383. //Tostopscanningandletscannerreturntothe//
384. //startingposition.//
385. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
386. SCN_ABORT()
387. {
388. if(SCNOpen()<0)return1;
389. sAbort.func_code=STOPSCAN;
390. SCNCall((charfar*)&sAbort);
391. SCNClose();
392. return(sAbort.error_code);
393. }
394.
395. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
396. //ShowtemparayfileinVGAmode//
397. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
398. show_image()
399. {
400. FILE*img_fp;
401. inti,j,k,j4;
402. unsignedchardi;
403. unsignedintwidth,height,type;
404. unsignedcharfar*VideoPtr,x;
405. unsignedcharMaskTable[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
406. unsignedcharVGAGrayTable[12]={0,1,2,3,4,5,6,7,8,9,10,11};
http://read.pudn.com/downloads84/sourcecode/windows/vxd/323798/same_%E6%89%AB%E6%8F%8F%E4%BB%AA%E9%A9%B1%E5%8A%A8%E5%BC%80 6/9
10/17/2017 same.rar SAMPLE.C
407. charVGA_Lut[16][3]=
408. {
409. 0x00,0x00,0x00,/*RGBofgray0*/
RGB
410. 0x06,0x06,0x06,/*RGBofgray1*/
RGB
411. 0x0c,0x0c,0x0c,/*RGBofgray2*/
RGB
412. 0x12,0x12,0x12,/*RGBofgray3*/
RGB
413. 0x18,0x18,0x18,/*RGBofgray4*/
RGB
414. 0x1e,0x1e,0x1e,/*RGBofgray5*/
RGB
415. 0x24,0x24,0x24,/*RGBofgray6*/
RGB
416. 0x2a,0x2a,0x2a,/*RGBofgray7*/
RGB
417. 0x30,0x30,0x30,/*RGBofgray8*/
RGB
418. 0x35,0x35,0x35,/*RGBofgray9*/
RGB
419. 0x3a,0x3a,0x3a,/*RGBofgray10*/
RGB
420. 0x3f,0x3f,0x3f,/*RGBofgray11*/
RGB
421. 0x15,0x15,0x3f,/*RGBofredcolor*/
RGB
422. 0x15,0x3f,0x15,/*RGBofgreencolor*/
RGB
423. 0x3f,0x15,0x15,/*RGBofbluecolor*/
RGB
424. 0x3f,0x3f,0x15,/*RGBofyellowcolor*/
RGB
425. };
426. img_fp=fopen(tmp_file,"rb");
427. if(img_fp==NULL)
428. {
429. printf("Errorimagefile!\n");
430. return0;
431. }
432. fread(&type,2,1,img_fp);
433. fread(&width,2,1,img_fp);
434. fread(&height,2,1,img_fp);
435. _setvideomode(_VRES16COLOR);
436. if(type==IT_GRAY)//ifgray,setVGAgraypalette
437. {
438. inp(0x3da);//WriteVGApalette
439. for(i=0;i<16;i++)
440. {
441. outp(0x3c0,i);
442. outp(0x3c0,i);
443. }
444. outp(0x3c0,0x12);
445. outp(0x3c0,0xff);
446. inp(0x3da);
447. outp(0x3c0,0x20);
448. outp(0x3c4,2);//EnableallfourPlane
449. outp(0x3c5,0x0f);
450. outp(0x3c8,0);//setlookuptable
451. for(i=0;i<16;i++)
452. {
453. outp(0x3c9,VGA_Lut[i][0]);
454. outp(0x3c9,VGA_Lut[i][1]);
455. outp(0x3c9,VGA_Lut[i][2]);
456. }
457. }
458. for(j=0;j<height;j++)
459. {
460. if(type==IT_COLOR)//ifcolor,usingdithermethod
461. {
462. fread(img_buf,sizeof(char)*width*3,1,img_fp);
463. j4=j%4;
464. for(i=0;i<width*3;i++)
465. {
466. img_buf[i]>>=4;
467. if(img_buf[i]>dither[j4][i/3%4])img_buf[i]=1;
468. elseimg_buf[i]=0;
469. }
470. for(i=0;i<width;i++)
471. {
472. _setcolor(img_buf[i*3]*4+img_buf[i*3+1]*2+img_buf[i*3+2]+8);
473. _setpixel(i,j);
474. }}
475. elseif(type==IT_GRAY)//ifgray,showitingrayscale
476. {
http://read.pudn.com/downloads84/sourcecode/windows/vxd/323798/same_%E6%89%AB%E6%8F%8F%E4%BB%AA%E9%A9%B1%E5%8A%A8%E5%BC%80 7/9
10/17/2017 same.rar SAMPLE.C
477. _disable();
478. FP_SEG(VideoPtr)=VGASEG;
479. FP_OFF(VideoPtr)=j*80;
480. outp(SequenCtlPort,2);//EnableAllFourColorPlanes
481. outp(SequenDataPort,0x0f);
482. outp(VGACtlPort,0);//WriteSetResetregister
483. outp(VGADataPort,0);
484. outp(VGACtlPort,1);
485. outp(VGADataPort,0);
486. outp(VGACtlPort,5);//SetwriteMode2
487. outp(VGADataPort,2);
488. outp(VGACtlPort,8);//Setbitmaskregister
489. fread(img_buf,width,1,img_fp);
490. k=0;
491. for(i=0;i<width;i++)
492. {
493. outp(VGADataPort,MaskTable[k]);//SetMaskRegister
494. x=*VideoPtr;
495. if(img_buf[i]>200)
496. *VideoPtr=VGAGrayTable[11];
497. elseif(img_buf[i]<50)
498. *VideoPtr=VGAGrayTable[0];
499. elseif(img_buf[i]<65)
500. *VideoPtr=VGAGrayTable[1];
501. elseif(img_buf[i]<80)
502. *VideoPtr=VGAGrayTable[2];
503. elseif(img_buf[i]<95)
504. *VideoPtr=VGAGrayTable[3];
505. elseif(img_buf[i]<110)
506. *VideoPtr=VGAGrayTable[4];
507. elseif(img_buf[i]<125)
508. *VideoPtr=VGAGrayTable[5];
509. elseif(img_buf[i]<140)
510. *VideoPtr=VGAGrayTable[6];
511. elseif(img_buf[i]<155)
512. *VideoPtr=VGAGrayTable[7];
513. elseif(img_buf[i]<170)
514. *VideoPtr=VGAGrayTable[8];
515. elseif(img_buf[i]<185)
516. *VideoPtr=VGAGrayTable[9];
517. else
518. *VideoPtr=VGAGrayTable[10];
519. k++;
520. if(k==8){k=0;VideoPtr++;}
521. }
522. outp(VGACtlPort,5);//SetwriteMODE0
523. outp(VGADataPort,00);
524. outp(VGACtlPort,8);//Setbitmaskregister
525. outp(VGADataPort,0xFF);
526. _enable();
527. }
528. else//ifbinary,showitinbinarymode
529. {
530. _setcolor(15);
531. fread(img_buf,width,1,img_fp);
532. for(i=0;i<width*8;i++)
533. if((img_buf[i/8]&(1<<(7i%8)))!=0)_setpixel(i,j);
534. }}
535. fclose(img_fp);
536. getch();
537. _setvideomode(_DEFAULTMODE);
538. unlink(tmp_file);
539. return0;
540. }
541.
542.

http://read.pudn.com/downloads84/sourcecode/windows/vxd/323798/same_%E6%89%AB%E6%8F%8F%E4%BB%AA%E9%A9%B1%E5%8A%A8%E5%BC%80 8/9
10/17/2017 same.rar SAMPLE.C

http://read.pudn.com/downloads84/sourcecode/windows/vxd/323798/same_%E6%89%AB%E6%8F%8F%E4%BB%AA%E9%A9%B1%E5%8A%A8%E5%BC%80 9/9

You might also like