1 // Written in the D programming language.
2
3 /**
4 This module contains image loading functions.
5
6 Currently uses FreeImage.
7
8 Usage of libpng is not feasible under linux due to conflicts of library and binding versions.
9
10 Synopsis:
11
12 ----
13 import dlangui.graphics.images;
14
15 ----
16
17 Copyright: Vadim Lopatin, 2014
18 License: Boost License 1.0
19 Authors: Vadim Lopatin, coolreader.org@gmail.com
20 */
21 module dlangui.graphics.images;
22
23 public import dlangui.core.config;
24 static if (BACKEND_GUI):
25
26 import arsd.image;
27
28 import dlangui.core.logger;
29 import dlangui.core.types;
30 import dlangui.graphics.colors;
31 import dlangui.graphics.drawbuf;
32 import dlangui.core.streams;
33 import std.path;
34 import std.conv : to;
35
36
37 /// load and decode image from file to ColorDrawBuf, returns null if loading or decoding is failed
38 ColorDrawBuf loadImage(string filename) {
39 static import std.file;
40 try {
41 immutable ubyte[] data = cast(immutable ubyte[])std.file.read(filename);
42 return loadImage(data, filename);
43 } catch (Exception e) {
44 Log.e("exception while loading image from file ", filename);
45 Log.e(to!string(e));
46 return null;
47 }
48 }
49
50 /// load and decode image from input stream to ColorDrawBuf, returns null if loading or decoding is failed
51 ColorDrawBuf loadImage(immutable ubyte[] data, string filename) {
52 Log.d("Loading image from file " ~ filename);
53
54 import std.algorithm : endsWith;
55 if (filename.endsWith(".xpm")) {
56 import dlangui.graphics.xpm.reader : parseXPM;
57 try {
58 return parseXPM(data);
59 }
60 catch(Exception e) {
61 Log.e("Failed to load image from file ", filename);
62 Log.e(to!string(e));
63 return null;
64 }
65 }
66
67 auto image = loadImageFromMemory(data);
68 ColorDrawBuf buf = new ColorDrawBuf(image.width, image.height);
69 for(int j = 0; j < buf.height; j++)
70 {
71 auto scanLine = buf.scanLine(j);
72 for(int i = 0; i < buf.width; i++)
73 {
74 auto color = image.getPixel(i, j);
75 scanLine[i] = makeRGBA(color.r, color.g, color.b, 255 - color.a);
76 }
77 }
78 return buf;
79 }