Index: src/OGKBitmap.h ================================================================== --- src/OGKBitmap.h +++ src/OGKBitmap.h @@ -39,12 +39,34 @@ @interface OGKBitmap: OFObject { ALLEGRO_BITMAP *bitmap; } +@property (readonly) of_dimension_t size; + + (void)setTarget: (id)target; + (void)clearToColor: (ogk_color_t)color; - initWithSize: (of_dimension_t)size; - initWithFile: (OFString*)file; +- (instancetype)subBitmapWithRegion: (of_rectangle_t)region; - (void)drawAtPosition: (of_point_t)position; +- (void)drawAtPosition: (of_point_t)position + region: (of_rectangle_t)region; +- (void)drawAtPosition: (of_point_t)position + scale: (of_dimension_t)scale; +- (void)drawAtPosition: (of_point_t)position + region: (of_rectangle_t)region + scale: (of_dimension_t)scale; +- (void)drawAtPosition: (of_point_t)position + tint: (ogk_color_t)tint; +- (void)drawAtPosition: (of_point_t)position + scale: (of_dimension_t)scale + tint: (ogk_color_t)tint; +- (void)drawAtPosition: (of_point_t)position + region: (of_rectangle_t)region + tint: (ogk_color_t)tint; +- (void)drawAtPosition: (of_point_t)position + region: (of_rectangle_t)region + scale: (of_dimension_t)scale + tint: (ogk_color_t)tint; - (ALLEGRO_BITMAP*)OGK_allegroBitmap; @end Index: src/OGKBitmap.m ================================================================== --- src/OGKBitmap.m +++ src/OGKBitmap.m @@ -23,10 +23,16 @@ #import "OGKBitmap.h" #import "OGKDisplay.h" ogk_color_t OGK_COLOR_BLACK = { 0, 0, 0, 1 }; + +static ALLEGRO_COLOR +ogk_color_to_allegro(ogk_color_t color) +{ + return al_map_rgba_f(color.red, color.green, color.blue, color.alpha); +} @implementation OGKBitmap + (void)initialize { if (self != [OGKBitmap class]) @@ -45,12 +51,11 @@ al_set_target_bitmap([target OGK_allegroBitmap]); } + (void)clearToColor: (ogk_color_t)color { - al_clear_to_color( - al_map_rgb(color.red * 256, color.green * 256, color.blue * 256)); + al_clear_to_color(ogk_color_to_allegro(color)); } - initWithSize: (of_dimension_t)size { self = [super init]; @@ -81,16 +86,109 @@ - (void)dealloc { if (bitmap != NULL && al_is_system_installed()) al_destroy_bitmap(bitmap); } + +- copy +{ + OGKBitmap *copy = [[[self class] alloc] init]; + + copy->bitmap = al_clone_bitmap(bitmap); + + if (copy->bitmap == NULL) + @throw [OFInitializationFailedException + exceptionWithClass: [self class]]; + + return copy; +} + +- (instancetype)subBitmapWithRegion: (of_rectangle_t)region +{ + OGKBitmap *subBitmap = [[[self class] alloc] init]; + + subBitmap->bitmap = al_create_sub_bitmap(bitmap, region.origin.x, + region.origin.y, region.size.width, region.size.height); + + if (subBitmap->bitmap == NULL) + @throw [OFInitializationFailedException + exceptionWithClass: [self class]]; + + return subBitmap; +} + +- (of_dimension_t)size +{ + return of_dimension(al_get_bitmap_width(bitmap), + al_get_bitmap_height(bitmap)); +} - (void)drawAtPosition: (of_point_t)position { al_draw_bitmap(bitmap, position.x, position.y, 0); } + +- (void)drawAtPosition: (of_point_t)position + scale: (of_dimension_t)scale +{ + al_draw_scaled_bitmap(bitmap, 0, 0, al_get_bitmap_width(bitmap), + al_get_bitmap_height(bitmap), position.x, position.y, + scale.width, scale.height, 0); +} + +- (void)drawAtPosition: (of_point_t)position + region: (of_rectangle_t)region +{ + al_draw_bitmap_region(bitmap, region.origin.x, region.origin.y, + region.size.width, region.size.height, position.x, position.y, 0); +} + +- (void)drawAtPosition: (of_point_t)position + region: (of_rectangle_t)region + scale: (of_dimension_t)scale +{ + al_draw_scaled_bitmap(bitmap, region.origin.x, region.origin.y, + region.size.width, region.size.height, position.x, position.y, + scale.width, scale.height, 0); +} + +- (void)drawAtPosition: (of_point_t)position + tint: (ogk_color_t)tint +{ + al_draw_tinted_bitmap(bitmap, ogk_color_to_allegro(tint), + position.x, position.y, 0); +} + +- (void)drawAtPosition: (of_point_t)position + scale: (of_dimension_t)scale + tint: (ogk_color_t)tint +{ + al_draw_tinted_scaled_bitmap(bitmap, ogk_color_to_allegro(tint), + 0, 0, al_get_bitmap_width(bitmap), al_get_bitmap_height(bitmap), + position.x, position.y, scale.width, scale.height, 0); +} + +- (void)drawAtPosition: (of_point_t)position + region: (of_rectangle_t)region + tint: (ogk_color_t)tint +{ + al_draw_tinted_bitmap_region(bitmap, ogk_color_to_allegro(tint), + region.origin.x, region.origin.y, region.size.width, + region.size.height, position.x, position.y, 0); +} + +- (void)drawAtPosition: (of_point_t)position + region: (of_rectangle_t)region + scale: (of_dimension_t)scale + tint: (ogk_color_t)tint +{ + al_draw_tinted_scaled_bitmap(bitmap, ogk_color_to_allegro(tint), + region.origin.x, region.origin.y, region.size.width, + region.size.height, position.x, position.y, scale.width, + scale.height, 0); +} - (ALLEGRO_BITMAP*)OGK_allegroBitmap { return bitmap; } @end Index: src/OGKEvent.h ================================================================== --- src/OGKEvent.h +++ src/OGKEvent.h @@ -19,10 +19,12 @@ */ #include #import + +#import "keycodes.h" @interface OGKEvent: OFObject { ALLEGRO_EVENT event; } Index: tests/TestMain.h ================================================================== --- tests/TestMain.h +++ tests/TestMain.h @@ -28,8 +28,10 @@ { OGKDisplay *display; OGKEventQueue *eventQueue; OGKBitmap *bitmap; of_point_t position; + of_dimension_t scale; BOOL running; + ogk_color_t tint; } @end Index: tests/TestMain.m ================================================================== --- tests/TestMain.m +++ tests/TestMain.m @@ -35,10 +35,28 @@ - (void)keyWasPressed: (OGKKeyPressEvent*)event display: (OGKDisplay*)display { of_log(@"Pressed: %d", event.keycode); + + switch (event.keycode) { + case OGK_KEY_R: + tint = ogk_color(1, 0.5, 0.5, 0); + break; + case OGK_KEY_G: + tint = ogk_color(0.5, 1, 0.5, 0); + break; + case OGK_KEY_B: + tint = ogk_color(0.5, 0.5, 1, 0); + break; + case OGK_KEY_N: + tint = ogk_color(1, 1, 1, 0); + break; + case OGK_KEY_Q: + running = NO; + break; + } } - (void)keyWasReleased: (OGKKeyReleaseEvent*)event display: (OGKDisplay*)display { @@ -53,10 +71,12 @@ event.cursor.y, event.deltaCursor.y, event.wheel.x, event.deltaWheel.x, event.wheel.y, event.deltaWheel.y); position = event.cursor; + scale = of_dimension(bitmap.size.width + event.wheel.x, + bitmap.size.height + event.wheel.y); } - (void)mouseButtonWasPressed: (OGKMouseButtonPressedEvent*)event display: (OGKDisplay*)display { @@ -79,11 +99,13 @@ } - (void)draw { [OGKBitmap clearToColor: OGK_COLOR_BLACK]; - [bitmap drawAtPosition: position]; + [bitmap drawAtPosition: position + scale: scale + tint: tint]; [display update]; } - (void)applicationDidFinishLaunching { @@ -108,14 +130,17 @@ [eventQueue registerDisplay: display]; [eventQueue registerKeyboard]; [eventQueue registerMouse]; bitmap = [[OGKBitmap alloc] initWithFile: @"test.bmp"]; + position = of_point(display.size.width / 2, display.size.height / 2); + scale = bitmap.size; + tint = ogk_color(1, 1, 1, 0); for (running = YES; running;) { @autoreleasepool { [self handleEvents]; [self draw]; } } } @end