OLD | NEW |
1 /* | 1 /* |
2 * ***** BEGIN GPL LICENSE BLOCK ***** | 2 * ***** BEGIN GPL LICENSE BLOCK ***** |
3 * | 3 * |
4 * This program is free software; you can redistribute it and/or | 4 * This program is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU General Public License | 5 * modify it under the terms of the GNU General Public License |
6 * as published by the Free Software Foundation; either version 2 | 6 * as published by the Free Software Foundation; either version 2 |
7 * of the License, or (at your option) any later version. | 7 * of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This program is distributed in the hope that it will be useful, | 9 * This program is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 } drawDMVerts_userData; | 120 } drawDMVerts_userData; |
121 | 121 |
122 typedef struct drawDMEdgesSel_userData { | 122 typedef struct drawDMEdgesSel_userData { |
123 BMEditMesh *em; | 123 BMEditMesh *em; |
124 | 124 |
125 unsigned char *baseCol, *selCol, *actCol; | 125 unsigned char *baseCol, *selCol, *actCol; |
126 BMEdge *eed_act; | 126 BMEdge *eed_act; |
127 } drawDMEdgesSel_userData; | 127 } drawDMEdgesSel_userData; |
128 | 128 |
129 typedef struct drawDMFacesSel_userData { | 129 typedef struct drawDMFacesSel_userData { |
| 130 #ifdef WITH_FREESTYLE |
| 131 unsigned char *cols[4]; |
| 132 #else |
130 unsigned char *cols[3]; | 133 unsigned char *cols[3]; |
| 134 #endif |
131 | 135 |
132 DerivedMesh *dm; | 136 DerivedMesh *dm; |
133 BMEditMesh *em; | 137 BMEditMesh *em; |
134 | 138 |
135 BMFace *efa_act; | 139 BMFace *efa_act; |
136 int *orig_index_mf_to_mpoly; | 140 int *orig_index_mf_to_mpoly; |
137 int *orig_index_mp_to_orig; | 141 int *orig_index_mp_to_orig; |
138 } drawDMFacesSel_userData; | 142 } drawDMFacesSel_userData; |
139 | 143 |
140 typedef struct drawDMNormal_userData { | 144 typedef struct drawDMNormal_userData { |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 | 616 |
613 /* Draw the Image on the screen */ | 617 /* Draw the Image on the screen */ |
614 glaDrawPixelsTex(ofs_x, ofs_y, ima_x, ima_y, GL_UNSIGNED_BYTE, i
buf->rect); | 618 glaDrawPixelsTex(ofs_x, ofs_y, ima_x, ima_y, GL_UNSIGNED_BYTE, i
buf->rect); |
615 glPixelTransferf(GL_ALPHA_SCALE, 1.0f); | 619 glPixelTransferf(GL_ALPHA_SCALE, 1.0f); |
616 | 620 |
617 glDisable(GL_BLEND); | 621 glDisable(GL_BLEND); |
618 } | 622 } |
619 | 623 |
620 if ((dflag & DRAW_CONSTCOLOR) == 0) { | 624 if ((dflag & DRAW_CONSTCOLOR) == 0) { |
621 glColor3ubv(ob_wire_col); | 625 glColor3ubv(ob_wire_col); |
622 } | |
623 | 626 |
624 /* Calculate the outline vertex positions */ | 627 /* Calculate the outline vertex positions */ |
625 glBegin(GL_LINE_LOOP); | 628 glBegin(GL_LINE_LOOP); |
626 glVertex2f(ofs_x, ofs_y); | 629 glVertex2f(ofs_x, ofs_y); |
627 glVertex2f(ofs_x + ima_x, ofs_y); | 630 glVertex2f(ofs_x + ima_x, ofs_y); |
628 glVertex2f(ofs_x + ima_x, ofs_y + ima_y); | 631 glVertex2f(ofs_x + ima_x, ofs_y + ima_y); |
629 glVertex2f(ofs_x, ofs_y + ima_y); | 632 glVertex2f(ofs_x, ofs_y + ima_y); |
630 glEnd(); | 633 glEnd(); |
631 | 634 » } |
632 | 635 |
633 /* Reset GL settings */ | 636 /* Reset GL settings */ |
634 glMatrixMode(GL_MODELVIEW); | 637 glMatrixMode(GL_MODELVIEW); |
635 glPopMatrix(); | 638 glPopMatrix(); |
636 | 639 |
637 BKE_image_release_ibuf(ima, ibuf, NULL); | 640 BKE_image_release_ibuf(ima, ibuf, NULL); |
638 } | 641 } |
639 | 642 |
640 static void circball_array_fill(float verts[CIRCLE_RESOL][3], const float cent[3
], float rad, float tmat[4][4]) | 643 static void circball_array_fill(float verts[CIRCLE_RESOL][3], const float cent[3
], float rad, float tmat[4][4]) |
641 { | 644 { |
(...skipping 1653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2295 return DM_DRAW_OPTION_NORMAL; | 2298 return DM_DRAW_OPTION_NORMAL; |
2296 else | 2299 else |
2297 return DM_DRAW_OPTION_SKIP; | 2300 return DM_DRAW_OPTION_SKIP; |
2298 } | 2301 } |
2299 | 2302 |
2300 static void draw_dm_edges_sharp(BMEditMesh *em, DerivedMesh *dm) | 2303 static void draw_dm_edges_sharp(BMEditMesh *em, DerivedMesh *dm) |
2301 { | 2304 { |
2302 dm->drawMappedEdges(dm, draw_dm_edges_sharp__setDrawOptions, em); | 2305 dm->drawMappedEdges(dm, draw_dm_edges_sharp__setDrawOptions, em); |
2303 } | 2306 } |
2304 | 2307 |
| 2308 #ifdef WITH_FREESTYLE |
| 2309 /* Draw only Freestyle feature edges */ |
| 2310 static DMDrawOption draw_dm_edges_freestyle__setDrawOptions(void *userData, int
index) |
| 2311 { |
| 2312 BMEdge *eed = EDBM_edge_at_index(userData, index); |
| 2313 |
| 2314 if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && BM_elem_flag_test(eed, BM
_ELEM_FREESTYLE)) |
| 2315 return DM_DRAW_OPTION_NORMAL; |
| 2316 else |
| 2317 return DM_DRAW_OPTION_SKIP; |
| 2318 } |
| 2319 |
| 2320 static void draw_dm_edges_freestyle(BMEditMesh *em, DerivedMesh *dm) |
| 2321 { |
| 2322 dm->drawMappedEdges(dm, draw_dm_edges_freestyle__setDrawOptions, em); |
| 2323 } |
| 2324 #endif |
2305 | 2325 |
2306 /* Draw faces with color set based on selection | 2326 /* Draw faces with color set based on selection |
2307 * return 2 for the active face so it renders with stipple enabled */ | 2327 * return 2 for the active face so it renders with stipple enabled */ |
2308 static DMDrawOption draw_dm_faces_sel__setDrawOptions(void *userData, int index) | 2328 static DMDrawOption draw_dm_faces_sel__setDrawOptions(void *userData, int index) |
2309 { | 2329 { |
2310 drawDMFacesSel_userData *data = userData; | 2330 drawDMFacesSel_userData *data = userData; |
2311 BMFace *efa = EDBM_face_at_index(data->em, index); | 2331 BMFace *efa = EDBM_face_at_index(data->em, index); |
2312 unsigned char *col; | 2332 unsigned char *col; |
2313 ········ | 2333 ········ |
2314 if (!efa) | 2334 if (!efa) |
2315 return DM_DRAW_OPTION_SKIP; | 2335 return DM_DRAW_OPTION_SKIP; |
2316 ········ | 2336 ········ |
2317 if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { | 2337 if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { |
2318 if (efa == data->efa_act) { | 2338 if (efa == data->efa_act) { |
2319 glColor4ubv(data->cols[2]); | 2339 glColor4ubv(data->cols[2]); |
2320 return DM_DRAW_OPTION_STIPPLE; | 2340 return DM_DRAW_OPTION_STIPPLE; |
2321 } | 2341 } |
2322 else { | 2342 else { |
| 2343 #ifdef WITH_FREESTYLE |
| 2344 col = data->cols[BM_elem_flag_test(efa, BM_ELEM_SELECT)
? 1 : BM_elem_flag_test(efa, BM_ELEM_FREESTYLE) ? 3 : 0]; |
| 2345 #else |
2323 col = data->cols[BM_elem_flag_test(efa, BM_ELEM_SELECT)
? 1 : 0]; | 2346 col = data->cols[BM_elem_flag_test(efa, BM_ELEM_SELECT)
? 1 : 0]; |
| 2347 #endif |
2324 if (col[3] == 0) | 2348 if (col[3] == 0) |
2325 return DM_DRAW_OPTION_SKIP; | 2349 return DM_DRAW_OPTION_SKIP; |
2326 glColor4ubv(col); | 2350 glColor4ubv(col); |
2327 return DM_DRAW_OPTION_NORMAL; | 2351 return DM_DRAW_OPTION_NORMAL; |
2328 } | 2352 } |
2329 } | 2353 } |
2330 return DM_DRAW_OPTION_SKIP; | 2354 return DM_DRAW_OPTION_SKIP; |
2331 } | 2355 } |
2332 | 2356 |
2333 static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int
next_index) | 2357 static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int
next_index) |
(...skipping 10 matching lines...) Expand all Loading... |
2344 | 2368 |
2345 efa = EDBM_face_at_index(data->em, DM_origindex_mface_mpoly(data->orig_i
ndex_mf_to_mpoly, data->orig_index_mp_to_orig, index)); | 2369 efa = EDBM_face_at_index(data->em, DM_origindex_mface_mpoly(data->orig_i
ndex_mf_to_mpoly, data->orig_index_mp_to_orig, index)); |
2346 next_efa = EDBM_face_at_index(data->em, DM_origindex_mface_mpoly(data->o
rig_index_mf_to_mpoly, data->orig_index_mp_to_orig, next_index)); | 2370 next_efa = EDBM_face_at_index(data->em, DM_origindex_mface_mpoly(data->o
rig_index_mf_to_mpoly, data->orig_index_mp_to_orig, next_index)); |
2347 | 2371 |
2348 if (efa == next_efa) | 2372 if (efa == next_efa) |
2349 return 1; | 2373 return 1; |
2350 | 2374 |
2351 if (efa == data->efa_act || next_efa == data->efa_act) | 2375 if (efa == data->efa_act || next_efa == data->efa_act) |
2352 return 0; | 2376 return 0; |
2353 | 2377 |
| 2378 #ifdef WITH_FREESTYLE |
| 2379 col = data->cols[BM_elem_flag_test(efa, BM_ELEM_SELECT) ? 1 : BM_elem_fl
ag_test(efa, BM_ELEM_FREESTYLE) ? 3 : 0]; |
| 2380 next_col = data->cols[BM_elem_flag_test(next_efa, BM_ELEM_SELECT) ? 1 :
BM_elem_flag_test(next_efa, BM_ELEM_FREESTYLE) ? 3 : 0]; |
| 2381 #else |
2354 col = data->cols[BM_elem_flag_test(efa, BM_ELEM_SELECT) ? 1 : 0]; | 2382 col = data->cols[BM_elem_flag_test(efa, BM_ELEM_SELECT) ? 1 : 0]; |
2355 next_col = data->cols[BM_elem_flag_test(next_efa, BM_ELEM_SELECT) ? 1 :
0]; | 2383 next_col = data->cols[BM_elem_flag_test(next_efa, BM_ELEM_SELECT) ? 1 :
0]; |
| 2384 #endif |
2356 | 2385 |
2357 if (col[3] == 0 || next_col[3] == 0) | 2386 if (col[3] == 0 || next_col[3] == 0) |
2358 return 0; | 2387 return 0; |
2359 | 2388 |
2360 return col == next_col; | 2389 return col == next_col; |
2361 } | 2390 } |
2362 | 2391 |
2363 /* also draws the active face */ | 2392 /* also draws the active face */ |
| 2393 #ifdef WITH_FREESTYLE |
| 2394 static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *ba
seCol, |
| 2395 unsigned char *selCol, unsigned char *actCol, unsi
gned char *markCol, BMFace *efa_act) |
| 2396 #else |
2364 static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *ba
seCol, | 2397 static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *ba
seCol, |
2365 unsigned char *selCol, unsigned char *actCol, BMFa
ce *efa_act) | 2398 unsigned char *selCol, unsigned char *actCol, BMFa
ce *efa_act) |
| 2399 #endif |
2366 { | 2400 { |
2367 drawDMFacesSel_userData data; | 2401 drawDMFacesSel_userData data; |
2368 data.dm = dm; | 2402 data.dm = dm; |
2369 data.cols[0] = baseCol; | 2403 data.cols[0] = baseCol; |
2370 data.em = em; | 2404 data.em = em; |
2371 data.cols[1] = selCol; | 2405 data.cols[1] = selCol; |
2372 data.cols[2] = actCol; | 2406 data.cols[2] = actCol; |
| 2407 #ifdef WITH_FREESTYLE |
| 2408 data.cols[3] = markCol; |
| 2409 #endif |
2373 data.efa_act = efa_act; | 2410 data.efa_act = efa_act; |
2374 /* double lookup */ | 2411 /* double lookup */ |
2375 data.orig_index_mf_to_mpoly = DM_get_tessface_data_layer(dm, CD_ORIGINDE
X); | 2412 data.orig_index_mf_to_mpoly = DM_get_tessface_data_layer(dm, CD_ORIGINDE
X); |
2376 data.orig_index_mp_to_orig = DM_get_poly_data_layer(dm, CD_ORIGINDEX); | 2413 data.orig_index_mp_to_orig = DM_get_poly_data_layer(dm, CD_ORIGINDEX); |
2377 if ((data.orig_index_mf_to_mpoly && data.orig_index_mp_to_orig) == FALSE
) { | 2414 if ((data.orig_index_mf_to_mpoly && data.orig_index_mp_to_orig) == FALSE
) { |
2378 data.orig_index_mf_to_mpoly = data.orig_index_mp_to_orig = NULL; | 2415 data.orig_index_mf_to_mpoly = data.orig_index_mp_to_orig = NULL; |
2379 } | 2416 } |
2380 | 2417 |
2381 dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, GPU_enable_ma
terial, draw_dm_faces_sel__compareDrawOptions, &data, 0); | 2418 dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, GPU_enable_ma
terial, draw_dm_faces_sel__compareDrawOptions, &data, 0); |
2382 } | 2419 } |
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2905 } | 2942 } |
2906 else { | 2943 else { |
2907 if (cageDM != finalDM) { | 2944 if (cageDM != finalDM) { |
2908 UI_ThemeColorBlend(TH_WIRE, TH_BACK, 0.7); | 2945 UI_ThemeColorBlend(TH_WIRE, TH_BACK, 0.7); |
2909 finalDM->drawEdges(finalDM, 1, 0); | 2946 finalDM->drawEdges(finalDM, 1, 0); |
2910 } | 2947 } |
2911 } | 2948 } |
2912 ········ | 2949 ········ |
2913 if (me->drawflag & ME_DRAWFACES) { /* transp faces */ | 2950 if (me->drawflag & ME_DRAWFACES) { /* transp faces */ |
2914 unsigned char col1[4], col2[4], col3[4]; | 2951 unsigned char col1[4], col2[4], col3[4]; |
| 2952 #ifdef WITH_FREESTYLE |
| 2953 unsigned char col4[4]; |
| 2954 #endif |
2915 | 2955 |
2916 UI_GetThemeColor4ubv(TH_FACE, col1); | 2956 UI_GetThemeColor4ubv(TH_FACE, col1); |
2917 UI_GetThemeColor4ubv(TH_FACE_SELECT, col2); | 2957 UI_GetThemeColor4ubv(TH_FACE_SELECT, col2); |
2918 UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3); | 2958 UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3); |
| 2959 #ifdef WITH_FREESTYLE |
| 2960 UI_GetThemeColor4ubv(TH_FREESTYLE_FACE_MARK, col4); |
| 2961 #endif |
2919 | 2962 |
2920 glEnable(GL_BLEND); | 2963 glEnable(GL_BLEND); |
2921 glDepthMask(0); /* disable write in zbuffer, needed for nice tr
ansp */ | 2964 glDepthMask(0); /* disable write in zbuffer, needed for nice tr
ansp */ |
2922 | 2965 |
2923 /* don't draw unselected faces, only selected, this is MUCH nice
r when texturing */ | 2966 /* don't draw unselected faces, only selected, this is MUCH nice
r when texturing */ |
2924 if (check_object_draw_texture(scene, v3d, dt)) | 2967 if (check_object_draw_texture(scene, v3d, dt)) |
2925 col1[3] = 0; | 2968 col1[3] = 0; |
2926 | 2969 |
| 2970 #ifdef WITH_FREESTYLE |
| 2971 if (!(me->drawflag & ME_DRAW_FREESTYLE_FACE)) |
| 2972 col4[3] = 0; |
| 2973 |
| 2974 draw_dm_faces_sel(em, cageDM, col1, col2, col3, col4, efa_act); |
| 2975 #else |
2927 draw_dm_faces_sel(em, cageDM, col1, col2, col3, efa_act); | 2976 draw_dm_faces_sel(em, cageDM, col1, col2, col3, efa_act); |
| 2977 #endif |
2928 | 2978 |
2929 glDisable(GL_BLEND); | 2979 glDisable(GL_BLEND); |
2930 glDepthMask(1); /* restore write in zbuffer */ | 2980 glDepthMask(1); /* restore write in zbuffer */ |
2931 } | 2981 } |
2932 else if (efa_act) { | 2982 else if (efa_act) { |
2933 /* even if draw faces is off it would be nice to draw the stippl
e face | 2983 /* even if draw faces is off it would be nice to draw the stippl
e face |
2934 * Make all other faces zero alpha except for the active | 2984 * Make all other faces zero alpha except for the active |
2935 * */ | 2985 * */ |
2936 » » unsigned char col1[4], col2[4], col3[4]; | 2986 » » /* col4 is only used by WITH_FREESTYLE, but keeping it here spar
es some #ifdef's... */ |
2937 » » col1[3] = col2[3] = 0; /* don't draw */ | 2987 » » unsigned char col1[4], col2[4], col3[4], col4[4]; |
| 2988 » » col1[3] = col2[3] = col4[3] = 0; /* don't draw */ |
2938 UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3); | 2989 UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3); |
2939 | 2990 |
2940 glEnable(GL_BLEND); | 2991 glEnable(GL_BLEND); |
2941 glDepthMask(0); /* disable write in zbuffer, needed for nice tr
ansp */ | 2992 glDepthMask(0); /* disable write in zbuffer, needed for nice tr
ansp */ |
2942 | 2993 |
| 2994 #ifdef WITH_FREESTYLE |
| 2995 draw_dm_faces_sel(em, cageDM, col1, col2, col3, col4, efa_act); |
| 2996 #else |
2943 draw_dm_faces_sel(em, cageDM, col1, col2, col3, efa_act); | 2997 draw_dm_faces_sel(em, cageDM, col1, col2, col3, efa_act); |
| 2998 #endif |
2944 | 2999 |
2945 glDisable(GL_BLEND); | 3000 glDisable(GL_BLEND); |
2946 glDepthMask(1); /* restore write in zbuffer */ | 3001 glDepthMask(1); /* restore write in zbuffer */ |
2947 | 3002 |
2948 } | 3003 } |
2949 | 3004 |
2950 /* here starts all fancy draw-extra over */ | 3005 /* here starts all fancy draw-extra over */ |
2951 if ((me->drawflag & ME_DRAWEDGES) == 0 && check_object_draw_texture(scen
e, v3d, dt)) { | 3006 if ((me->drawflag & ME_DRAWEDGES) == 0 && check_object_draw_texture(scen
e, v3d, dt)) { |
2952 /* we are drawing textures and 'ME_DRAWEDGES' is disabled, don't
draw any edges */ | 3007 /* we are drawing textures and 'ME_DRAWEDGES' is disabled, don't
draw any edges */ |
2953 ················ | 3008 ················ |
(...skipping 15 matching lines...) Expand all Loading... |
2969 if (me->drawflag & ME_DRAWSHARP) { | 3024 if (me->drawflag & ME_DRAWSHARP) { |
2970 UI_ThemeColor(TH_EDGE_SHARP); | 3025 UI_ThemeColor(TH_EDGE_SHARP); |
2971 glLineWidth(2); | 3026 glLineWidth(2); |
2972 | 3027 |
2973 draw_dm_edges_sharp(em, cageDM); | 3028 draw_dm_edges_sharp(em, cageDM); |
2974 | 3029 |
2975 glColor3ub(0, 0, 0); | 3030 glColor3ub(0, 0, 0); |
2976 glLineWidth(1); | 3031 glLineWidth(1); |
2977 } | 3032 } |
2978 | 3033 |
| 3034 #ifdef WITH_FREESTYLE |
| 3035 if(me->drawflag & ME_DRAW_FREESTYLE_EDGE) { |
| 3036 UI_ThemeColor(TH_FREESTYLE_EDGE_MARK); |
| 3037 glLineWidth(2); |
| 3038 ········ |
| 3039 draw_dm_edges_freestyle(em, cageDM); |
| 3040 ········ |
| 3041 glColor3ub(0,0,0); |
| 3042 glLineWidth(1); |
| 3043 } |
| 3044 #endif |
| 3045 ········ |
2979 if (me->drawflag & ME_DRAWCREASES && CustomData_has_layer(&em->b
m->edata, CD_CREASE)) { | 3046 if (me->drawflag & ME_DRAWCREASES && CustomData_has_layer(&em->b
m->edata, CD_CREASE)) { |
2980 draw_dm_creases(em, cageDM); | 3047 draw_dm_creases(em, cageDM); |
2981 } | 3048 } |
2982 if (me->drawflag & ME_DRAWBWEIGHTS) { | 3049 if (me->drawflag & ME_DRAWBWEIGHTS) { |
2983 draw_dm_bweights(em, scene, cageDM); | 3050 draw_dm_bweights(em, scene, cageDM); |
2984 } | 3051 } |
2985 | 3052 |
2986 draw_em_fancy_edges(em, scene, v3d, me, cageDM, 0, eed_act); | 3053 draw_em_fancy_edges(em, scene, v3d, me, cageDM, 0, eed_act); |
2987 } | 3054 } |
2988 | 3055 |
(...skipping 4299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7288 if (ob->empty_drawtype == OB_EMPTY_IMAGE) { | 7355 if (ob->empty_drawtype == OB_EMPTY_IMAGE) { |
7289 /* CONSTCOLOR == no wire outline */ | 7356 /* CONSTCOLOR == no wire outline */ |
7290 draw_empty_image(ob, DRAW_CONSTCOLOR, NULL); | 7357 draw_empty_image(ob, DRAW_CONSTCOLOR, NULL); |
7291 } | 7358 } |
7292 else { | 7359 else { |
7293 drawaxes(ob->empty_drawsize, ob->empty_drawtype)
; | 7360 drawaxes(ob->empty_drawsize, ob->empty_drawtype)
; |
7294 } | 7361 } |
7295 break; | 7362 break; |
7296 } | 7363 } |
7297 } | 7364 } |
OLD | NEW |