Class: RWin::Bitmap

Inherits:
Data
  • Object
show all
Defined in:
ext/rwin/rw_resources.c

Direct Known Subclasses

WR::Bitmap

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'ext/rwin/rw_resources.c', line 117

static VALUE
rwbitmap_initialize(int argc, VALUE *argv, VALUE self){
    VALUE v_w, v_h, v_color;
    int w, h;
    RwBitmap *rb = DATA_PTR(self);
    rb_scan_args(argc, argv, "21", &v_w, &v_h, &v_color);
    w = FIX2INT(v_w); h = FIX2INT(v_h);
    rw_bitmap_set_dc(rb, w, h);
    if(!NIL_P(v_color)){
	RECT rect;
	COLORREF prevcolor = SetDCBrushColor(rb->hdc, FIX2INT(v_color));
	rect.left = -1; rect.top = -1; rect.right = w + 1; rect.bottom = h + 1;
	FillRect(rb->hdc, &rect, GetStockObject(DC_BRUSH));
	SetDCBrushColor(rb->hdc, prevcolor);
    }
    Register_rsc(rb->hbitmap, self);
    return self;
}

Class Method Details

._load(str) ⇒ Object



322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
# File 'ext/rwin/rw_resources.c', line 322

static VALUE
rwbitmap1__load(VALUE klass, VALUE str){
    RwBitmap* rb;
    VALUE robj;
    BITMAPINFO *bi;
    int biw, bih;
    char *ptr = RSTRING_PTR(str);
    char *bits;
    BITMAPFILEHEADER *bf = (BITMAPFILEHEADER*)ptr;
    if(bf->bfType!=0x4d42) rb_raise(rb_eArgError, "Not a bitmap file");
    bi = (BITMAPINFO*)(ptr + sizeof(BITMAPFILEHEADER));
    bits = ptr + bf->bfOffBits;
    biw = bi->bmiHeader.biWidth;
    bih = bi->bmiHeader.biHeight;
    
    robj = RwBitmap_Data_Make_Struct(klass, rb);
    rb->type = RcBitmap;
    rw_bitmap_set_dc(rb, biw, bih);
    SetDIBitsToDevice(rb->hdc, 0, 0, biw, bih, 0, 0, 0, bih, bits, bi, DIB_RGB_COLORS);
    Register_rsc(rb->hbitmap, robj);
    return robj;
}

.fromfile(fname) ⇒ Object



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'ext/rwin/rw_resources.c', line 136

static VALUE
rwbitmap1_fromfile(VALUE klass, VALUE fname){
    char abspath[RW_MAXPATH];
    RwBitmap* rb;
    VALUE robj = RwBitmap_Data_Make_Struct(klass, rb);
    rwconv2absolute_path(abspath, RSTRING_PTR(fname));
    rb->hbitmap = LoadImageA(NULL, abspath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
    if(!rb->hbitmap){
	char pwd[256];
	getcwd(pwd, sizeof(pwd));
	rb_raise(rb_eRuntimeError, "Bitmap load failed(%s), err=%d, pwd=%s.",
		 abspath, (int)GetLastError(), pwd);
    }
    rb->shared = FALSE;
    rb->type = RcBitmap;
    rb->hdc = CreateCompatibleDC(NULL);
    SelectObject(rb->hdc, rb->hbitmap);
    
    Register_rsc(rb->hbitmap, robj);
    return robj;
}

.fromhandle(v_hbitmap) ⇒ Object



171
172
173
174
175
176
# File 'ext/rwin/rw_resources.c', line 171

static VALUE
rwbitmap1_fromhandle(VALUE klass, VALUE v_hbitmap){
    VALUE robj = Get_rsc(NUM2INT(v_hbitmap));
    if (robj) return robj;
    return rwbitmap1_fromhandle_core(klass, (HANDLE)NUM2ULONG_PTR(v_hbitmap));
}

.monochrome(v_w, v_h) ⇒ Object



178
179
180
181
182
183
184
185
186
187
# File 'ext/rwin/rw_resources.c', line 178

static VALUE
rwbitmap1_monochrome(VALUE klass, VALUE v_w, VALUE v_h){
    RwBitmap* rb;
    VALUE robj = RwBitmap_Data_Make_Struct(klass, rb);
    rb->hbitmap = CreateBitmap(FIX2INT(v_w), FIX2INT(v_h), 1, 1, NULL);
    rb->hdc = CreateCompatibleDC(NULL);
    SelectObject(rb->hdc, rb->hbitmap);
    Register_rsc(rb->hbitmap, robj);
    return robj;
}

Instance Method Details

#_dump(*args) ⇒ Object



386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
# File 'ext/rwin/rw_resources.c', line 386

static VALUE
rwbitmap__dump(int argc, VALUE* argv, VALUE self){
    LPVOID lpbmpdata = NULL;
    int offsetbits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    int cdpth = argc>0 ? FIX2INT(argv[0]) : 32;
    int cctbl = rw_get_colortable_len(cdpth);
    size_t szimage = rwbitmap__dump_core(self, NULL, cdpth, 0, cctbl);
    RW_MALLOC(lpbmpdata, szimage + offsetbits + cctbl);
    if(rwbitmap__dump_core(self, lpbmpdata, cdpth, szimage, cctbl)){
	VALUE str = rb_str_new((char*)lpbmpdata, szimage + offsetbits + cctbl);
	if(lpbmpdata) free(lpbmpdata);
	return str;
    } else {
	if(lpbmpdata) free(lpbmpdata);
	return  Qnil;
    }
}

#_hbitmapObject



189
190
191
192
193
# File 'ext/rwin/rw_resources.c', line 189

static VALUE
rwbitmap_hbitmap(VALUE self){
    RwBitmap *rb = DATA_PTR(self);
    return ULONG_PTR2NUM((ULONG_PTR)rb->hbitmap);
}

#_hdcObject



203
204
205
206
207
# File 'ext/rwin/rw_resources.c', line 203

static VALUE
rwbitmap_hdc(VALUE self){
    RwBitmap *rb = DATA_PTR(self);
    return ULONG_PTR2NUM((ULONG_PTR)rb->hdc);
}

#_hddbitmapObject



195
196
197
198
199
200
# File 'ext/rwin/rw_resources.c', line 195

static VALUE
rwbitmap_hddbitmap(VALUE self){
    RwBitmap *rb = DATA_PTR(self);
    if(!rb->hddbitmap) rw_dib2ddb(rb);
    return ULONG_PTR2NUM((ULONG_PTR)rb->hddbitmap);
}

#depthObject



314
315
316
317
318
319
320
# File 'ext/rwin/rw_resources.c', line 314

static VALUE
rwbitmap_getdepth(VALUE self){
    BITMAP bmp;
    RwBitmap *rb = DATA_PTR(self);
    GetObject(rb->hbitmap,sizeof(BITMAP), &bmp);
    return INT2FIX(bmp.bmBitsPixel);
}

#disposeObject



239
240
241
242
243
244
245
246
247
248
249
# File 'ext/rwin/rw_resources.c', line 239

static VALUE
rwbitmap_dispose(VALUE self){
    RwBitmap *rb = DATA_PTR(self);
    DeleteDC(rb->hdc);
    if (rb->hbitmap) {
	if(!rb->shared) DeleteObject(rb->hbitmap);
	rb->hbitmap = NULL;
	return Qtrue;
    }
    return Qnil;
}

#draw(*args) ⇒ Object



225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'ext/rwin/rw_resources.c', line 225

static VALUE
rwbitmap_draw(int argc, VALUE *argv, VALUE self){
    VALUE klass, obj;
    RwCanvas *cv;
    RwBitmap *rb = DATA_PTR(self);
    rb_scan_args(argc, argv, "01", &klass);
    if(!rb_block_given_p()) rb_raise(rb_eArgError, "Need block");
    if (NIL_P(klass)) klass = cRwCanvas;
    obj = RwCanvas_Data_Make_Struct(klass, cv);
    cv->hdc = rb->hdc;
    rb_yield(obj);
    return self;
}

#GetPixel(v_x, v_y) ⇒ Object

moved to wrb/components/Bitmap.rb static VALUE rwbitmap_create_mask(VALUE self, VALUE v_mskclr)

COLORREF oldbkclr;
int w, h;
VALUE robj;
BITMAP bmp;
RwBitmap *rmsk;
RwBitmap *rb = DATA_PTR(self);
GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
w = bmp.bmWidth; h = bmp.bmHeight;
robj = RwBitmap_Data_Make_Struct(CLASS_OF(self), rmsk);
oldbkclr = SetBkColor(rb->hdc, NUM2INT(v_mskclr));
rmsk->hdc = CreateCompatibleDC(NULL);
rmsk->hbitmap = CreateBitmap(w, h, 1, 1, NULL);
SelectObject(rmsk->hdc, rmsk->hbitmap);
BitBlt(rmsk->hdc, 0, 0, w, h, rb->hdc, 0, 0, NOTSRCCOPY);
SetBkColor(rb->hdc, oldbkclr);
Register_rsc(rmsk->hbitmap, robj);
return robj;

static VALUE rwbitmap_create_maskimage(VALUE self, VALUE v_mskclr)

COLORREF oldbkclr;
int w, h;
VALUE robj;
BITMAP bmp;
HBITMAP hbmptmp;
HDC hdctmp;
RwBitmap *rmsk;
RwBitmap *rb = DATA_PTR(self);
GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
w = bmp.bmWidth; h = bmp.bmHeight;
robj = RwBitmap_Data_Make_Struct(CLASS_OF(self), rmsk);
oldbkclr = SetBkColor(rb->hdc, NUM2INT(v_mskclr));
hdctmp = CreateCompatibleDC(NULL);
hbmptmp = CreateBitmap(w, h, 1, 1, NULL);
SelectObject(hdctmp, hbmptmp);
BitBlt(hdctmp, 0, 0, w, h, rb->hdc, 0, 0, SRCCOPY);
SetBkColor(rb->hdc, oldbkclr);

rw_bitmap_set_dc(rmsk, w, h);
SelectObject(rmsk->hdc, rmsk->hbitmap);
BitBlt(rmsk->hdc, 0, 0, w, h, hdctmp, 0, 0, SRCCOPY);
DeleteObject(hbmptmp);
ReleaseDC(NULL, hdctmp);
Register_rsc(rmsk->hbitmap, robj);
return robj;



302
303
304
305
306
# File 'ext/rwin/rw_resources.c', line 302

static VALUE
rwbitmap_getpixel(VALUE self, VALUE v_x, VALUE v_y){
    RwBitmap *rb = DATA_PTR(self);
    return UINT2NUM(GetPixel(rb->hdc, FIX2INT(v_x), FIX2INT(v_y)));
}

#heightObject



217
218
219
220
221
222
223
# File 'ext/rwin/rw_resources.c', line 217

static VALUE
rwbitmap_height(VALUE self){
    BITMAP bmp;
    RwBitmap *rb = DATA_PTR(self);
    GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
    return INT2FIX(bmp.bmHeight);
}

#SetPixel(v_x, v_y, v_clr) ⇒ Object



308
309
310
311
312
# File 'ext/rwin/rw_resources.c', line 308

static VALUE
rwbitmap_setpixel(VALUE self, VALUE v_x, VALUE v_y, VALUE v_clr){
    RwBitmap *rb = DATA_PTR(self);
    return UINT2NUM(SetPixel(rb->hdc, FIX2INT(v_x), FIX2INT(v_y), (COLORREF)FIX2INT(v_clr)));
}

#widthObject



209
210
211
212
213
214
215
# File 'ext/rwin/rw_resources.c', line 209

static VALUE
rwbitmap_width(VALUE self){
    BITMAP bmp;
    RwBitmap *rb = DATA_PTR(self);
    GetObject(rb->hbitmap, sizeof(BITMAP), &bmp);
    return INT2FIX(bmp.bmWidth);
}