21{
25
26 for( ; *pszContentType; pszContentType++) {
27 if (*pszContentType == '/')
28 {
29 pszContentType++;
30 break;
31 }
32 }
33
34#define IMAGE_UNKNOWN 0
35#define IMAGE_JPEG 1
36#define IMAGE_GIF 2
37#define IMAGE_PNG 3
38
40 if (String::compareNoCase(pszContentType, L"jpeg") == 0
41 || String::compareNoCase(pszContentType, L"pjpeg") == 0)
43 else if (String::compareNoCase(pszContentType, L"gif") == 0)
45 else if (String::compareNoCase(pszContentType, L"png") == 0)
47
49 return false;
50
51 gdImagePtr inImage =
NULL;
52 FILE* inFile = fopen(pszSrcFile, L"rb");
53 if (!inFile)
54 return false;
55
56 switch(nSrcType) {
58 inImage = gdImageCreateFromJpeg(inFile);
59 break;
61 inImage = gdImageCreateFromGif(inFile);
62 break;
64 inImage = gdImageCreateFromPng(inFile);
65 break;
66 default :
68 }
69 fclose(inFile);
70
71 if (!inImage)
72 return false;
73
74 int nWidth;
75 int nHeight;
76 if (gdImageSX(inImage) > nSize || gdImageSY(inImage) > nSize) {
77 double fRate = 1.0;
78 if (gdImageSX(inImage) >= gdImageSY(inImage))
79 fRate = (double)nSize / (double)gdImageSX(inImage);
80 else
81 fRate = (double)nSize / (double)gdImageSY(inImage);
82
83 nWidth = (int)(((double)gdImageSX(inImage)) * fRate);
84 nHeight = (int)(((double)gdImageSY(inImage)) * fRate);
85 }
86 else {
87 nWidth = gdImageSX(inImage);
88 nHeight = gdImageSY(inImage);
89 }
90
91 gdImagePtr outImage = gdImageCreateTrueColor(nWidth, nHeight);
92 if (!outImage) {
93 gdImageDestroy(inImage);
94 return false;
95 }
96
97
98 gdImageCopyResampled(
99 outImage,
100 inImage,
101 0,
102 0,
103 0,
104 0,
105 nWidth,
106 nHeight,
107 gdImageSX(inImage),
108 gdImageSY(inImage)
109 );
110
111 FILE* outFile = fopen(pszThumbnailFile, L"wb");
112 if (!outFile) {
113 gdImageDestroy(inImage);
114 gdImageDestroy(outImage);
115 return false;
116 }
117 gdImageJpeg(outImage, outFile, -1);
118 fclose(outFile);
119
120 gdImageDestroy(inImage);
121 gdImageDestroy(outImage);
122
123 return true;
124}
#define __DCL_ASSERT(expr)