Overview
Comment: | Support for storing OFColors in tagged pointers |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
51c8047121d158e3131d05267e3d561a |
User & Date: | js on 2023-02-13 20:32:28 |
Other Links: | manifest | tags |
Context
2023-02-13
| ||
22:14 | OFColor: Allow some imprecision for tagged pointer check-in: 061e16d166 user: js tags: trunk | |
20:32 | Support for storing OFColors in tagged pointers check-in: 51c8047121 user: js tags: trunk | |
2023-02-12
| ||
22:20 | Add OFMatrix4x4 and OFVector3D check-in: 44eb35b212 user: js tags: trunk | |
Changes
Modified src/OFColor.m from [b38ed992e4] to [668849c2be].
︙ | ︙ | |||
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | * file. */ #include "config.h" #import "OFColor.h" #import "OFOnce.h" #import "OFInvalidArgumentException.h" @implementation OFColor #define PREDEFINED_COLOR(name, redValue, greenValue, blueValue) \ static OFColor *name##Color = nil; \ \ static void \ initPredefinedColor_##name(void) \ { \ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | * file. */ #include "config.h" #import "OFColor.h" #import "OFOnce.h" #import "OFString.h" #import "OFInvalidArgumentException.h" @interface OFColor () + (instancetype)of_alloc; @end @interface OFColorSingleton: OFColor @end @interface OFColorPlaceholder: OFColorSingleton @end #ifdef OF_OBJFW_RUNTIME @interface OFTaggedPointerColor: OFColorSingleton @end #endif static struct { Class isa; } placeholder; #ifdef OF_OBJFW_RUNTIME static int colorTag; #endif @implementation OFColorSingleton - (instancetype)autorelease { return self; } - (instancetype)retain { return self; } - (void)release { } - (unsigned int)retainCount { return OFMaxRetainCount; } @end @implementation OFColorPlaceholder - (instancetype)initWithRed: (float)red green: (float)green blue: (float)blue alpha: (float)alpha { #ifdef OF_OBJFW_RUNTIME uint8_t redInt = red * 255; uint8_t greenInt = green * 255; uint8_t blueInt = blue * 255; if (red * 255 == redInt && green * 255 == greenInt && blue * 255 == blueInt && alpha == 1) { id ret = objc_createTaggedPointer(colorTag, (uintptr_t)redInt << 16 | (uintptr_t)greenInt << 8 | (uintptr_t)blueInt); if (ret != nil) return ret; } #endif return (id)[[OFColor of_alloc] initWithRed: red green: green blue: blue alpha: alpha]; } @end #ifdef OF_OBJFW_RUNTIME @implementation OFTaggedPointerColor - (void)getRed: (float *)red green: (float *)green blue: (float *)blue alpha: (float *)alpha { uintptr_t value = object_getTaggedPointerValue(self); *red = (float)(value >> 16) / 255; *green = (float)((value >> 8) & 0xFF) / 255; *blue = (float)(value & 0xFF) / 255; if (alpha != NULL) *alpha = 1; } @end #endif @implementation OFColor + (void)initialize { if (self != [OFColor class]) return; placeholder.isa = [OFColorPlaceholder class]; #ifdef OF_OBJFW_RUNTIME colorTag = objc_registerTaggedPointerClass([OFTaggedPointerColor class]); #endif } + (instancetype)of_alloc { return [super alloc]; } + (instancetype)alloc { if (self == [OFColor class]) return (id)&placeholder; return [super alloc]; } #define PREDEFINED_COLOR(name, redValue, greenValue, blueValue) \ static OFColor *name##Color = nil; \ \ static void \ initPredefinedColor_##name(void) \ { \ name##Color = [[OFColorSingleton alloc] \ initWithRed: redValue \ green: greenValue \ blue: blueValue \ alpha: 1]; \ } \ \ + (OFColor *)name \ { \ static OFOnceControl onceControl = OFOnceControlInitValue; \ OFOnce(&onceControl, initPredefinedColor_##name); \ \ |
︙ | ︙ | |||
155 156 157 158 159 160 161 162 | *red = _red; *green = _green; *blue = _blue; if (alpha != NULL) *alpha = _alpha; } @end | > > > > > > > > > > > | 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 | *red = _red; *green = _green; *blue = _blue; if (alpha != NULL) *alpha = _alpha; } - (OFString *)description { float red, green, blue, alpha; [self getRed: &red green: &green blue: &blue alpha: &alpha]; return [OFString stringWithFormat: @"<OFColor red=%f green=%f blue=%f alpha=%f>", red, green, blue, alpha]; } @end |
Modified src/OFMatrix4x4.m from [8c09d10573] to [61d81a3bf6].
︙ | ︙ | |||
12 13 14 15 16 17 18 | * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #import "OFMatrix4x4.h" | | < | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #import "OFMatrix4x4.h" #import "OFOnce.h" #import "OFString.h" static const float identityValues[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; |
︙ | ︙ |
Modified tests/Makefile from [950b9c643e] to [331c812adc].
︙ | ︙ | |||
17 18 19 20 21 22 23 24 25 26 27 28 29 30 | PROG_NOINST = tests${PROG_SUFFIX} STATIC_LIB_NOINST = ${TESTS_STATIC_LIB} SRCS = ForwardingTests.m \ OFArrayTests.m \ ${OF_BLOCK_TESTS_M} \ OFCharacterSetTests.m \ OFDataTests.m \ OFDateTests.m \ OFDictionaryTests.m \ OFHMACTests.m \ OFINIFileTests.m \ OFIRITests.m \ OFInvocationTests.m \ | > | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | PROG_NOINST = tests${PROG_SUFFIX} STATIC_LIB_NOINST = ${TESTS_STATIC_LIB} SRCS = ForwardingTests.m \ OFArrayTests.m \ ${OF_BLOCK_TESTS_M} \ OFCharacterSetTests.m \ OFColorTests.m \ OFDataTests.m \ OFDateTests.m \ OFDictionaryTests.m \ OFHMACTests.m \ OFINIFileTests.m \ OFIRITests.m \ OFInvocationTests.m \ |
︙ | ︙ |
Added tests/OFColorTests.m version [c0f67501f7].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | /* * Copyright (c) 2008-2023 Jonathan Schleifer <js@nil.im> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #import "TestsAppDelegate.h" static OFString *const module = @"OFColor"; @implementation TestsAppDelegate (OFColorTests) - (void)colorTests { void *pool = objc_autoreleasePoolPush(); OFColor *color; float red, green, blue, alpha; TEST(@"+[colorWithRed:green:blue:alpha:]", (color = [OFColor colorWithRed: 63.f / 255 green: 127.f / 255 blue: 1 alpha: 1])) #ifdef OF_OBJFW_RUNTIME TEST(@"+[colorWithRed:green:blue:alpha:] returns tagged pointer", object_isTaggedPointer(color)) #endif TEST(@"-[getRed:green:blue:alpha:]", R([color getRed: &red green: &green blue: &blue alpha: &alpha]) && red == 63.f / 255 && green == 127.f / 255 && blue == 1 && alpha == 1) objc_autoreleasePoolPop(pool); } @end |
Modified tests/TestsAppDelegate.h from [6965bfbc0f] to [2856569726].
︙ | ︙ | |||
66 67 68 69 70 71 72 73 74 75 76 77 78 79 | @interface TestsAppDelegate (OFBlockTests) - (void)blockTests; @end @interface TestsAppDelegate (OFCharacterSetTests) - (void)characterSetTests; @end @interface TestsAppDelegate (OFDDPSocketTests) - (void)DDPSocketTests; @end @interface TestsAppDelegate (OFDNSResolverTests) - (void)DNSResolverTests; | > > > > | 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | @interface TestsAppDelegate (OFBlockTests) - (void)blockTests; @end @interface TestsAppDelegate (OFCharacterSetTests) - (void)characterSetTests; @end @interface TestsAppDelegate (OFColorTests) - (void)colorTests; @end @interface TestsAppDelegate (OFDDPSocketTests) - (void)DDPSocketTests; @end @interface TestsAppDelegate (OFDNSResolverTests) - (void)DNSResolverTests; |
︙ | ︙ |
Modified tests/TestsAppDelegate.m from [7b3ff2f71c] to [188b6037b1].
︙ | ︙ | |||
387 388 389 390 391 392 393 394 395 396 397 398 399 400 | [self arrayTests]; [self dictionaryTests]; [self listTests]; [self setTests]; [self dateTests]; [self valueTests]; [self numberTests]; [self streamTests]; [self memoryStreamTests]; [self notificationCenterTests]; [self MD5HashTests]; [self RIPEMD160HashTests]; [self SHA1HashTests]; [self SHA224HashTests]; | > | 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 | [self arrayTests]; [self dictionaryTests]; [self listTests]; [self setTests]; [self dateTests]; [self valueTests]; [self numberTests]; [self colorTests]; [self streamTests]; [self memoryStreamTests]; [self notificationCenterTests]; [self MD5HashTests]; [self RIPEMD160HashTests]; [self SHA1HashTests]; [self SHA224HashTests]; |
︙ | ︙ |