Subversion Repositories Filer-Free

Rev

Rev 24 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
24 gdshaw@RISCPKG.ORG 1
// This file is part of the free Filer module for RISC OS.
2
// Copyright  2007 Graham Shaw.
3
// Redistribution and modification are permitted under the terms of the
4
// GNU General Public License (version 2 or any later version).
5
 
6
#include <string.h>
7
#include <stdio.h>
8
 
9
#include "oslib/os.h"
10
#include "oslib/wimpspriteop.h"
11
 
12
#include "filer_sprite.h"
13
 
14
filer_sprite::filer_sprite(const osgbpb_info& info,sprite_size display_size):
15
        _xsize(0),
16
        _ysize(0),
17
        _half_size(false)
18
{
19
        // If a small icon was requested then attempt to find one.
20
        if ((display_size==sprite_small)&&
21
                find(info,0,sprite_small,display_size)) return;
22
 
23
        // Attempt to find a large icon (whether or not that was
24
        // the size requested).
25
        if (find(info,0,sprite_large,display_size)) return;
26
 
27
        // If a small icon was requested then attempt to find a
28
        // generic small icon.
29
        if ((display_size==sprite_small)&&
30
                find(info,1,sprite_small,display_size)) return;
31
 
32
        // Attempt to find a generic large icon (whether or not that
33
        // was the size requested).
34
        if (find(info,1,sprite_large,display_size)) return;
35
}
36
 
37
bool filer_sprite::find(const osgbpb_info& info,int priority,
38
        sprite_size original_size,sprite_size display_size)
39
{
40
        if ((info.obj_type&fileswitch_IS_DIR)&&(info.name[0]=='!'))
41
        {
42
                // If the object is a directory or an image file, and its name
43
                // begins with a bang, then show it as an application.
44
                if (priority==0)
45
                {
46
                        // If a sprite for that application is available then
47
                        // show that sprite.
48
                        if (original_size==sprite_small)
49
                        {
27 gdshaw@RISCPKG.ORG 50
                                sprintf(_name,"sm%.10s",info.name);
24 gdshaw@RISCPKG.ORG 51
                        }
52
                        else
53
                        {
27 gdshaw@RISCPKG.ORG 54
                                sprintf(_name,"%.12s",info.name);
24 gdshaw@RISCPKG.ORG 55
                        }
56
                }
57
                else
58
                {
59
                        // If there is no sprite for that application then show
60
                        // the generic sprite for an application.
61
                        if (original_size==sprite_small)
62
                        {
63
                                strcpy(_name,"small_app");
64
                        }
65
                        else
66
                        {
67
                                strcpy(_name,"application");
68
                        }
69
                }
70
        }
71
        else if ((info.obj_type&fileswitch_IS_DIR)&&
72
                !(info.obj_type&fileswitch_IS_FILE))
73
        {
74
                // Otherwise, if the object is a directory (not an image file)
75
                // then show it as a directory.
76
                if (original_size==sprite_small)
77
                {
78
                        strcpy(_name,"small_dir");
79
                }
80
                else
81
                {
82
                        strcpy(_name,"directory");
83
                }
84
        }
85
        else
86
        {
87
                // Otherwise, show the object as a file.
88
                if (((info.load_addr&0xfff00000)==0xfff00000)&&(priority==0))
89
                {
90
                        // If the file has a filetype, and if a sprite for that
91
                        // filetype is available, then show that sprite.
92
                        int filetype=(info.load_addr>>8)&0xfff;
93
                        if (original_size==sprite_small)
94
                        {
95
                                sprintf(_name,"small_%3x",filetype);
96
                        }
97
                        else
98
                        {
99
                                sprintf(_name,"file_%3x",filetype);
100
                        }
101
                }
102
                else
103
                {
104
                        // If the file is untyped, or if there is no sprite for that
105
                        // filetype, then show the generic sprite for a file.
106
                        if (original_size==sprite_small)
107
                        {
108
                                strcpy(_name,"small_xxx");
109
                        }
110
                        else
111
                        {
112
                                strcpy(_name,"file_xxx");
113
                        }
114
                }
115
        }
116
 
117
        // Attempt to read the dimensions of the chosen sprite.
118
        int xpixels=0;
119
        int ypixels=0;
120
        os_error* err=xwimpspriteop_read_sprite_info(_name,&xpixels,&ypixels,0,0);
121
 
122
        if (!err)
123
        {
124
                // The sprite should be plotted at half size if a small sprite
125
                // was requested but a large sprite was chosen.
126
                _half_size=
127
                        (original_size==sprite_large)&&(display_size==sprite_small);
128
 
129
                // If plotting at half size then halve the reported dimensions
130
                // (rounding up).
131
                if (_half_size)
132
                {
133
                        xpixels=(xpixels+1)/2;
134
                        ypixels=(ypixels+1)/2;
135
                }
136
 
137
                // Convert from pixels to OS units.
138
                int xeig=0;
139
                int yeig=0;
140
                xos_read_mode_variable(os_CURRENT_MODE,os_MODEVAR_XEIG_FACTOR,&xeig,0);
141
                xos_read_mode_variable(os_CURRENT_MODE,os_MODEVAR_YEIG_FACTOR,&yeig,0);
142
                _xsize=xpixels<<xeig;
143
                _ysize=ypixels<<yeig;
144
        }
145
 
146
        return err==0;
147
}