mimeimage.b 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. implement Mimeimage;
  2. include "sys.m";
  3. sys: Sys;
  4. include "draw.m";
  5. draw: Draw;
  6. Point, Rect, Image: import draw;
  7. include "bufio.m";
  8. bufio: Bufio;
  9. Iobuf: import bufio;
  10. include "string.m";
  11. str: String;
  12. include "imagefile.m";
  13. imageremap: Imageremap;
  14. include "mimeimage.m";
  15. display: ref Draw->Display;
  16. imagemodules := array[] of {
  17. ("gif", RImagefile->READGIFPATH),
  18. ("jpeg", RImagefile->READJPGPATH),
  19. ("jpg", RImagefile->READJPGPATH),
  20. ("xbm", RImagefile->READXBMPATH), # not actually a mime type.
  21. ("pic", RImagefile->READPICPATH),
  22. ("png", RImagefile->READPNGPATH),
  23. };
  24. badmodule(p: string)
  25. {
  26. sys->fprint(sys->fildes(2), "mimeimage: cannot load %s: %r\n", p);
  27. raise "fail:bad module";
  28. }
  29. init(displ: ref Draw->Display)
  30. {
  31. sys = load Sys Sys->PATH;
  32. draw = load Draw Draw->PATH;
  33. if (draw == nil)
  34. badmodule(Draw->PATH);
  35. bufio = load Bufio Bufio->PATH;
  36. if (bufio == nil)
  37. badmodule(Bufio->PATH);
  38. imageremap = load Imageremap Imageremap->PATH;
  39. if (imageremap == nil)
  40. badmodule(Imageremap->PATH);
  41. str = load String String->PATH;
  42. if (str == nil)
  43. badmodule(String->PATH);
  44. display = displ;
  45. }
  46. imagesize(mediatype, file: string): (Draw->Point, string)
  47. {
  48. (img, e) := image(mediatype, file);
  49. if (img == nil)
  50. return ((0, 0), e);
  51. return ((img.r.dx(), img.r.dy()), nil);
  52. }
  53. image(mediatype, file: string): (ref Draw->Image, string)
  54. {
  55. if (mediatype == nil) {
  56. for (i := len file - 1; i >= 0; i--)
  57. if (file[i] == '.')
  58. break;
  59. if (i >= 0)
  60. mediatype = str->tolower(file[i + 1:]);
  61. }
  62. # special case for native image type
  63. if (mediatype == "bit") {
  64. img := draw->display.open(file);
  65. err: string;
  66. if (img == nil)
  67. err = sys->sprint("%r");
  68. return (img, err);
  69. }
  70. iob := bufio->open(file, Sys->OREAD);
  71. if (iob == nil)
  72. return (nil, sys->sprint("%r"));
  73. for (i := 0; i < len imagemodules; i++)
  74. if (imagemodules[i].t0 == mediatype)
  75. break;
  76. if (i == len imagemodules)
  77. return (nil, "unrecognised image type");
  78. # XXX should probably cache the image modules, but do we really want to
  79. # pay the price?
  80. mod := load RImagefile imagemodules[i].t1;
  81. if (mod == nil)
  82. return (nil, sys->sprint("cannot load %s: %r", imagemodules[i].t1));
  83. mod->init(bufio);
  84. (raw, e) := mod->read(iob);
  85. if (raw == nil)
  86. return (nil, e);
  87. return imageremap->remap(raw, display, 1);
  88. }