OSDN Git Service

* gcc.dg/lto/20091013-1_1.c: xfail for avr.
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / lto / 20091013-1_2.c
1 /* { dg-xfail-if "cast to pointer of different size" { "avr-*-*" } { "*" } { "" } } */
2 typedef struct HDC__ { int unused; } *HDC;
3 typedef struct HFONT__ { int unused; } *HFONT;
4
5 void* HeapAlloc(void*,unsigned int,unsigned long);
6
7 typedef struct tagLOGFONTW
8 {
9     int lfPitchAndFamily;
10     unsigned short lfFaceName[32];
11 } LOGFONTW, *PLOGFONTW, *LPLOGFONTW;
12
13 typedef struct tagGdiFont GdiFont;
14 typedef struct tagDC DC;
15
16 extern unsigned int WineEngGetFontData(GdiFont*, unsigned int, unsigned int, void*, unsigned int);
17
18 struct list
19 {
20     struct list *next;
21     struct list *prev;
22 };
23
24 typedef struct FT_FaceRec_
25 {
26   signed long face_flags;
27 } FT_FaceRec, *FT_Face;
28
29 typedef struct { } GM;
30
31 typedef struct { } FMAT2;
32
33 typedef struct {
34     unsigned int hash;
35     LOGFONTW lf;
36     int can_use_bitmap;
37 } FONT_DESC;
38
39
40
41 typedef struct tagHFONTLIST {
42     struct list entry;
43     HFONT hfont;
44 } HFONTLIST;
45
46 typedef struct {
47     struct list entry;
48     void *face;
49     GdiFont *font;
50 } CHILD_FONT;
51
52
53 struct tagGdiFont {
54     struct list entry;
55     GM **gm;
56     struct list hfontlist;
57     struct list child_fonts;
58
59     FT_Face ft_face;
60     FONT_DESC font_desc;
61     long ppem;
62 };
63
64
65
66 static struct list gdi_font_list = { &(gdi_font_list), &(gdi_font_list) };
67
68
69
70
71 static int get_glyph_index_linked(GdiFont *font, unsigned int c, GdiFont **linked_font, unsigned int *glyph);
72 static long load_VDMX(GdiFont*, long);
73
74 extern int f1(void*,int);
75
76 static FT_Face OpenFontFace(GdiFont *font, void *face, long width, long height)
77 {
78    FT_Face ft_face;
79
80    font->ppem = load_VDMX(font, height);
81    if(font->ppem == 0)
82        font->ppem = f1(ft_face, height);
83    return ft_face;
84 }
85
86
87 static GdiFont *alloc_font(void)
88 {
89     GdiFont *ret = HeapAlloc(0, 0x00000008, sizeof(*ret));
90     ret->gm = HeapAlloc(0, 0x00000008, sizeof(GM*));
91     return ret;
92 }
93
94
95 static long load_VDMX(GdiFont *font,long height)
96 {
97     unsigned short hdr[3];
98
99     WineEngGetFontData(font, 0x42424242, 0, hdr, 6);
100     return 0;
101 }
102
103 static int fontcmp(const GdiFont *font, FONT_DESC *fd)
104 {
105     if(font->font_desc.hash != fd->hash) return 1;
106     if(memcmp(&font->font_desc.lf, &fd->lf, __builtin_offsetof (LOGFONTW, lfFaceName))) return 1;
107     if(!font->font_desc.can_use_bitmap != !fd->can_use_bitmap) return 1;
108     return strcmpiW(font->font_desc.lf.lfFaceName, fd->lf.lfFaceName);
109 }
110
111 static GdiFont *find_in_cache(HFONT hfont, const LOGFONTW *plf, const FMAT2 *pmat, int can_use_bitmap)
112 {
113     GdiFont *ret;
114     FONT_DESC fd;
115     HFONTLIST *hflist;
116     struct list *font_elem_ptr, *hfontlist_elem_ptr;
117
118     fd.lf = *plf;
119     fd.can_use_bitmap = can_use_bitmap;
120
121
122     for ((font_elem_ptr) = (&gdi_font_list)->next; (font_elem_ptr) != (&gdi_font_list); (font_elem_ptr) = (font_elem_ptr)->next) {
123         ret = ((struct tagGdiFont *)((char *)(font_elem_ptr) - (unsigned long)(&((struct tagGdiFont *)0)->entry)));
124         if(!fontcmp(ret, &fd)) {
125             if(!can_use_bitmap && !( ret->ft_face->face_flags & ( 1L << 0 ) )) continue;
126             for ((hfontlist_elem_ptr) = (&ret->hfontlist)->next; (hfontlist_elem_ptr) != (&ret->hfontlist); (hfontlist_elem_ptr) = (hfontlist_elem_ptr)->next) {
127                 hflist = ((struct tagHFONTLIST *)((char *)(hfontlist_elem_ptr) - (unsigned long)(&((struct tagHFONTLIST *)0)->entry)));
128                 if(hflist->hfont == hfont)
129                     return ret;
130             }
131             hflist = HeapAlloc(0, 0, sizeof(*hflist));
132             hflist->hfont = hfont;
133             return ret;
134         }
135     }
136
137     while(font_elem_ptr) {
138         ret = ((struct tagGdiFont *)((char *)(font_elem_ptr) - (unsigned long)(&((struct tagGdiFont *)0)->entry)));
139         if(!fontcmp(ret, &fd)) {
140             if(!can_use_bitmap && !( ret->ft_face->face_flags & ( 1L << 0 ) )) continue;
141             hflist = HeapAlloc(0, 0, sizeof(*hflist));
142             hflist->hfont = hfont;
143             return ret;
144         }
145     }
146     return ((void *)0);
147 }
148
149
150
151
152 GdiFont *WineEngCreateFontInstance(DC *dc, HFONT hfont)
153 {
154     GdiFont *ret;
155     int can_use_bitmap;
156     LOGFONTW lf;
157     FMAT2 dcmat;
158
159     if((ret = find_in_cache(hfont, &lf, &dcmat, can_use_bitmap)) != ((void *)0))
160         return ret;
161     return alloc_font();
162 }
163
164 extern unsigned int f(void*,unsigned int g);
165
166 static unsigned int get_glyph_index(void*font, unsigned int glyph)
167 {
168     return f(font, glyph);
169 }
170
171 unsigned int WineEngGetGlyphOutline(GdiFont *incoming_font, unsigned int glyph, unsigned int format,
172         void* lpgm, unsigned int buflen, void* buf,
173         const void* lpmat)
174 {
175     unsigned int glyph_index;
176
177     get_glyph_index_linked(incoming_font, glyph, &incoming_font, &glyph_index);
178     return 0;
179 }
180
181 static int load_child_font(GdiFont *font, CHILD_FONT *child)
182 {
183     child->font = alloc_font();
184     child->font->ft_face = OpenFontFace(child->font, child->face, 0, -font->ppem);
185     if(!child->font->ft_face)
186         return 0;
187     return 1;
188 }
189
190 static int get_glyph_index_linked(GdiFont *font, unsigned int c, GdiFont **linked_font, unsigned int *glyph)
191 {
192     unsigned int g;
193     CHILD_FONT *child_font;
194
195     for ((child_font) = ((CHILD_FONT *)((char *)((&font->child_fonts)->next) - (unsigned long)(&((CHILD_FONT *)0)->entry))); &(child_font)->entry != (&font->child_fonts); (child_font) = ((CHILD_FONT *)((char *)((child_font)->entry.next) - (unsigned long)(&((CHILD_FONT *)0)->entry))))
196     {
197         if(!load_child_font(font, child_font))
198             continue;
199
200         g = get_glyph_index(child_font->font, c);
201         if(g) {
202             *glyph = g;
203             *linked_font = child_font->font;
204             return 1;
205         }
206     }
207     return 0;
208 }
209
210 unsigned int WineEngGetFontData(GdiFont *font, unsigned int table, unsigned int offset, void* buf,
211     unsigned int cbData)
212 {
213     unsigned long len;
214     load_sfnt_table(font->ft_face, table, offset, buf, &len);
215     return len;
216 }
217
218 int WineEngGetLinkedHFont(DC *dc, unsigned short c, HFONT *new_hfont, unsigned int *glyph) {
219     return get_glyph_index_linked(0, 0, 0, 0);
220 }
221