Ignore:
Timestamp:
Mar 16, 2008, 10:51:54 PM (11 years ago)
Author:
Sam Hocevar
Message:
  • Add lock() and unlock() methods to jimage objects. They're no-ops, but the Win32/DirectX version uses them all over the place because it uses DirectDraw? surfaces. One day we may wish to merge Abuse Win32's video output, or to use the SDL blending functions. You never know.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • abuse/trunk/src/imlib/image.hpp

    r112 r115  
    88 */
    99
    10 #ifndef _IMGAE_HPP_
    11 #define _IMGAE_HPP_
     10#ifndef _IMAGE_HPP_
     11#define _IMAGE_HPP_
     12
    1213#include <stdlib.h>
    1314#include "linked.hpp"
     
    1920
    2021extern char const *imerr_messages[];  // correspond to imERRORS
    21 #define imREAD_ERROR           1
     22#define imREAD_ERROR            1
    2223#define imINCORRECT_FILETYPE   2
    2324#define imFILE_CORRUPTED       3
     
    2627#define imNOT_SUPPORTED        6
    2728#define imWRITE_ERROR          7
    28 #define imMAX_ERROR            7
     29#define imMAX_ERROR            7
    2930
    3031int16_t current_error();
     
    3940typedef struct image_color_t
    4041{
    41         uint16_t r;
    42         uint16_t g;
    43         uint16_t b;
     42    uint16_t r;
     43    uint16_t g;
     44    uint16_t b;
    4445} image_color;
    4546
     
    5253  int16_t dx1,dy1,dx2,dy2;
    5354  dirty_rect(int16_t x1, int16_t y1, int16_t x2, int16_t y2)
    54   { dx1=x1; dy1=y1; dx2=x2; dy2=y2; 
    55     if (x2<x1 || y2<y1)
     55  { dx1=x1; dy1=y1; dx2=x2; dy2=y2;
     56    if(x2<x1 || y2<y1)
    5657      printf("add inccorect dirty\n");
    5758  }
    5859  virtual int16_t compare(void *n1, int16_t field)
    59   { return ((dirty_rect *)n1)->dy1>dy1; }
     60  { return((dirty_rect *)n1)->dy1>dy1; }
    6061} ;
    6162
    6263class image_descriptor
    6364{
    64   int16_t l,h;
    65   int16_t clipx1, clipy1, clipx2, clipy2;
    66 public : 
    67   uint8_t keep_dirt,
    68           static_mem;      // if this flag is set then don't free memory on exit
    69  
    70   linked_list dirties;
    71   void *extended_descriptor;              // type depends on current system
    72 
    73   image_descriptor(int16_t length, int16_t height,
    74                   int keep_dirties=1, int static_memory=0);
    75   int16_t bound_x1(int16_t x1)  { return x1<clipx1 ? clipx1 : x1; }
    76   int16_t bound_y1(int16_t y1)  { return y1<clipy1 ? clipy1 : y1; }
    77   int16_t bound_x2(int16_t x2)  { return x2>clipx2 ? clipx2 : x2; }
    78   int16_t bound_y2(int16_t y2)  { return y2>clipy2 ? clipy2 : y2; }
    79   int16_t x1_clip() { return clipx1; }
    80   int16_t y1_clip() { return clipy1; }
    81   int16_t x2_clip() { return clipx2; }
    82   int16_t y2_clip() { return clipy2; }
    83   void dirty_area(int16_t x1, int16_t y1, int16_t x2, int16_t y2) { ;}
    84   void clean_area(int16_t x1, int16_t y1, int16_t x2, int16_t y2) { ; }
    85   void clear_dirties();
    86   int16_t get_dirty_area(int16_t &x1, int16_t &y1, int16_t &x2, int16_t &y2) { return 0; }
    87   void get_clip(int16_t &x1, int16_t &y1, int16_t &x2, int16_t &y2)
    88     { x1=clipx1; y1=clipy1; x2=clipx2; y2=clipy2; }
    89   void set_clip(int16_t x1, int16_t y1, int16_t x2, int16_t y2)
    90     { if (x2<x1) x2=x1;
    91       if (y2<y1) y2=y1;
    92       if (x1<0) clipx1=0; else clipx1=x1;
    93       if (y1<0) clipy1=0; else clipy1=y1;
    94       if (x2>=l) clipx2=l-1; else clipx2=x2;
    95       if (y2>=h) clipy2=h-1; else clipy2=y2;
    96     }
    97   void reduce_dirties();
    98   void add_dirty(int x1, int y1, int x2, int y2);
    99   void delete_dirty(int x1, int y1, int x2, int y2);
    100   void resize(int16_t length, int16_t height)
    101    { l=length; h=height; clipx1=0; clipy1=0; clipx2=l-1; clipy2=h-1; }
    102 } ;
     65private:
     66    int16_t l, h;
     67    int16_t clipx1, clipy1, clipx2, clipy2;
     68
     69public:
     70    uint8_t keep_dirt,
     71            static_mem; // if set, don't free memory on exit
     72
     73    linked_list dirties;
     74    void *extended_descriptor;
     75
     76    image_descriptor(int16_t length, int16_t height,
     77                     int keep_dirties = 1, int static_memory = 0);
     78    int16_t bound_x1(int16_t x1)  { return x1 < clipx1 ? clipx1 : x1; }
     79    int16_t bound_y1(int16_t y1)  { return y1 < clipy1 ? clipy1 : y1; }
     80    int16_t bound_x2(int16_t x2)  { return x2 > clipx2 ? clipx2 : x2; }
     81    int16_t bound_y2(int16_t y2)  { return y2 > clipy2 ? clipy2 : y2; }
     82    int16_t x1_clip() { return clipx1; }
     83    int16_t y1_clip() { return clipy1; }
     84    int16_t x2_clip() { return clipx2; }
     85    int16_t y2_clip() { return clipy2; }
     86    void dirty_area(int16_t x1, int16_t y1, int16_t x2, int16_t y2) { ; }
     87    void clean_area(int16_t x1, int16_t y1, int16_t x2, int16_t y2) { ; }
     88    void clear_dirties();
     89    int16_t get_dirty_area(int16_t &x1, int16_t &y1, int16_t &x2, int16_t &y2)
     90    {
     91        return 0;
     92    }
     93    void get_clip(int16_t &x1, int16_t &y1, int16_t &x2, int16_t &y2)
     94    {
     95        x1 = clipx1; y1 = clipy1; x2 = clipx2; y2 = clipy2;
     96    }
     97    void set_clip(int16_t x1, int16_t y1, int16_t x2, int16_t y2)
     98    {
     99        if(x2 < x1) x2 = x1;
     100        if(y2 < y1) y2 = y1;
     101        if(x1 < 0) clipx1 = 0; else clipx1 = x1;
     102        if(y1 < 0) clipy1 = 0; else clipy1 = y1;
     103        if(x2 >= l) clipx2 = l - 1; else clipx2 = x2;
     104        if(y2 >= h) clipy2 = h - 1; else clipy2 = y2;
     105    }
     106    void reduce_dirties();
     107    void add_dirty(int x1, int y1, int x2, int y2);
     108    void delete_dirty(int x1, int y1, int x2, int y2);
     109    void resize(int16_t length, int16_t height)
     110    {
     111        l = length; h = height;
     112        clipx1 = 0; clipy1 = 0; clipx2 = l - 1; clipy2 = h - 1;
     113    }
     114};
    103115
    104116class image : public linked_node
    105 {
    106   uint8_t *data;
    107   int16_t w,h;
    108   void make_page(int16_t width, int16_t height, uint8_t *page_buffer);
    109   void delete_page();
    110 public :
    111   image_descriptor *special;
    112   image(spec_entry *e, bFILE *fp);
    113   image(bFILE *fp);
    114   image(int16_t width, int16_t height,                 // required
    115         uint8_t *page_buffer=NULL,
    116         int16_t create_descriptor=0);        // 0=no, 1=yes, 2=yes & keep dirties
    117   uint8_t  pixel              (int16_t x, int16_t y);
    118   void     putpixel           (int16_t x, int16_t y, char color);
    119   uint8_t *scan_line          (int16_t y) { return data+y*w; }
    120   uint8_t *next_line          (int16_t lasty, uint8_t *last_scan)
    121                                     { return last_scan+w; }         
    122   int32_t  total_pixels       (uint8_t background=0);
    123   image    *copy               ();    // makes a copy of an image
    124   void     clear              (int16_t color=-1);  // -1 is background color
    125   void     to_24bit           (palette &pal);
    126   int16_t  width              () { return (int16_t)w; }
    127   int16_t  height             () { return (int16_t)h; }
    128   void     scroll             (int16_t x1, int16_t y1, int16_t x2, int16_t y2, int16_t xd, int16_t yd);
    129   void     fill_image         (image *screen, int16_t x1, int16_t y1, int16_t x2, int16_t y2,
    130                               int16_t align=1);
    131   void     put_image          (image *screen, int16_t x, int16_t y, char transparent=0);
    132   void     put_part           (image *screen, int16_t x, int16_t y, int16_t x1, int16_t y1,
    133                                      int16_t x2, int16_t y2, char transparent=0);
    134   void     put_part_xrev      (image *screen, int16_t x, int16_t y, int16_t x1, int16_t y1,
    135                                      int16_t x2, int16_t y2, char transparent=0);
    136   void     put_part_masked    (image *screen, image *mask, int16_t x, int16_t y,
    137                                      int16_t maskx, int16_t masky, int16_t x1, int16_t y1, int16_t x2, int16_t y2);
    138   image    *copy_part_dithered (int16_t x1, int16_t y1, int16_t x2, int16_t y2);
    139   void     bar                (int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t color);
    140   void     xor_bar            (int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t color);
    141   void     widget_bar          (int16_t x1, int16_t y1, int16_t x2, int16_t y2,
    142                                      uint8_t light, uint8_t med, uint8_t dark);
    143   void     line               (int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t color);
    144   void     rectangle          (int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t color);
    145   void     burn_led           (int16_t x, int16_t y, int32_t num, int16_t color, int16_t scale=1);
    146   void     set_clip           (int16_t x1, int16_t y1, int16_t x2, int16_t y2);
    147   void     get_clip           (int16_t &x1,int16_t &y1,int16_t &x2,int16_t &y2);
    148   void     in_clip            (int16_t x1, int16_t y1, int16_t x2, int16_t y2);
    149 
    150   void     dirt_off           () { if (special && special->keep_dirt) special->keep_dirt=0; }
    151   void     dirt_on            () { if (special) special->keep_dirt=1; }
    152 
    153   void     add_dirty          (int x1, int y1, int x2, int y2)
    154                                     { if (special) special->add_dirty(x1,y1,x2,y2); }
    155   void     delete_dirty       (int x1, int y1, int x2, int y2)
    156                                     { if (special) special->delete_dirty(x1,y1,x2,y2); }
    157   void     clear_dirties      () { if (special) special->clear_dirties(); }
    158   void     dither             (palette *pal); // use a b&w palette!
    159   void     resize             (int16_t new_width, int16_t new_height);
    160   void     change_size        (int16_t new_width, int16_t new_height, uint8_t *page=NULL);
    161   void     flood_fill         (int16_t x, int16_t y, uint8_t color);
    162   image    *create_smooth     (int16_t smoothness=1); // 0 no smoothness
    163   void     unpack_scanline    (int16_t line, char bitsperpixel=1);
    164   uint8_t  brightest_color    (palette *pal);
    165   void     flip_x             ();
    166   void     flip_y             ();
    167   void     make_color         (uint8_t color);
    168   uint8_t  darkest_color      (palette *pal, int16_t noblack=0);
    169 
    170   ~image();
    171 } ;
    172 
     117{
     118private:
     119    uint8_t *data;
     120    int16_t w, h;
     121    void make_page(int16_t width, int16_t height, uint8_t *page_buffer);
     122    void delete_page();
     123    bool _locked;
     124
     125public:
     126    image_descriptor *special;
     127
     128    image(spec_entry *e, bFILE *fp);
     129    image(bFILE *fp);
     130    image(int16_t width, int16_t height,
     131          uint8_t *page_buffer = NULL, int16_t create_descriptor = 0);
     132    ~image();
     133
     134    void lock();
     135    void unlock();
     136
     137    uint8_t pixel(int16_t x, int16_t y);
     138    void putpixel(int16_t x, int16_t y, char color);
     139    uint8_t *scan_line(int16_t y)
     140    {
     141        return data + y * w;
     142    }
     143    uint8_t *next_line(int16_t lasty, uint8_t *last_scan)
     144    {
     145        return last_scan + w;
     146    }
     147    int32_t total_pixels(uint8_t background=0);
     148    image *copy(); // makes a copy of an image
     149    void clear(int16_t color = -1); // -1 is background color
     150    void to_24bit(palette &pal);
     151    int16_t width()
     152    {
     153        return (int16_t)w;
     154    }
     155    int16_t height()
     156    {
     157        return (int16_t)h;
     158    }
     159    void scroll(int16_t x1, int16_t y1, int16_t x2, int16_t y2,
     160                int16_t xd, int16_t yd);
     161    void fill_image(image *screen, int16_t x1, int16_t y1,
     162                    int16_t x2, int16_t y2, int16_t align = 1);
     163    void put_image(image *screen, int16_t x, int16_t y, char transparent = 0);
     164    void put_part(image *screen, int16_t x, int16_t y, int16_t x1, int16_t y1,
     165                  int16_t x2, int16_t y2, char transparent = 0);
     166    void put_part_xrev(image *screen, int16_t x, int16_t y,
     167                       int16_t x1, int16_t y1, int16_t x2, int16_t y2,
     168                       char transparent = 0);
     169    void put_part_masked(image *screen, image *mask, int16_t x, int16_t y,
     170                         int16_t maskx, int16_t masky, int16_t x1, int16_t y1,
     171                         int16_t x2, int16_t y2);
     172    image *copy_part_dithered(int16_t x1, int16_t y1, int16_t x2, int16_t y2);
     173    void bar(int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t color);
     174    void xor_bar(int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t color);
     175    void widget_bar(int16_t x1, int16_t y1, int16_t x2, int16_t y2,
     176                    uint8_t light, uint8_t med, uint8_t dark);
     177    void line(int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t color);
     178    void rectangle(int16_t x1, int16_t y1, int16_t x2, int16_t y2,
     179                   uint8_t color);
     180    void burn_led(int16_t x, int16_t y, int32_t num, int16_t color,
     181                  int16_t scale = 1);
     182    void set_clip(int16_t x1, int16_t y1, int16_t x2, int16_t y2);
     183    void get_clip(int16_t &x1,int16_t &y1,int16_t &x2,int16_t &y2);
     184    void in_clip(int16_t x1, int16_t y1, int16_t x2, int16_t y2);
     185
     186    void dirt_off()
     187    {
     188        if(special && special->keep_dirt) special->keep_dirt = 0;
     189    }
     190    void dirt_on()
     191    {
     192        if(special) special->keep_dirt = 1;
     193    }
     194
     195    void add_dirty(int x1, int y1, int x2, int y2)
     196    {
     197        if(special) special->add_dirty(x1, y1, x2, y2);
     198    }
     199    void delete_dirty(int x1, int y1, int x2, int y2)
     200    {
     201        if(special) special->delete_dirty(x1, y1, x2, y2);
     202    }
     203    void clear_dirties()
     204    {
     205        if(special) special->clear_dirties();
     206    }
     207    void dither(palette *pal); // use a b&w palette!
     208    void resize(int16_t new_width, int16_t new_height);
     209    void change_size(int16_t new_width, int16_t new_height,
     210                     uint8_t *page = NULL);
     211    void flood_fill(int16_t x, int16_t y, uint8_t color);
     212    image *create_smooth(int16_t smoothness = 1); // 0 no smoothness
     213    void unpack_scanline(int16_t line, char bitsperpixel = 1);
     214    uint8_t brightest_color(palette *pal);
     215    void flip_x();
     216    void flip_y();
     217    void make_color(uint8_t color);
     218    uint8_t darkest_color(palette *pal, int16_t noblack = 0);
     219};
    173220
    174221class image_controller
    175222{
    176 public :
    177   image_controller() { image_init(); }
    178   ~image_controller()
    179   {
    180      image_uninit();
    181   }
    182 } ;
    183 
    184 
    185 
    186 #endif
    187 
    188 
    189 
    190 
    191 
    192 
    193 
    194 
     223public:
     224    image_controller()
     225    {
     226        image_init();
     227    }
     228    ~image_controller()
     229    {
     230        image_uninit();
     231    }
     232};
     233
     234#endif /* _IMAGE_HPP_ */
     235
Note: See TracChangeset for help on using the changeset viewer.