#Java 10, 405 398 394 391 386 380 375 341 338 336...didn't fit anymore; see edit history.. 325319 321317 bytes
P->{int n=P.length,l=0,i=0,p,q,t[],h[][]=P.clone(),s=0;for(;++i<n;)l=P[i][0]<P[l][0]?i:l;p=l;do{for(h[s++]=P[p],q=-~p%n,i=-1;++i<n;q=(t[1]-P[p][1])*(P[q][0]-t[0])<(t[0]-P[p][0])*(P[q][1]-t[1])?i:q)t=P[i];p=q;}while(p!=l);for(p=i=0;i<s;p-=(t[0]+h[++i%s][0])*(t[1]-h[i%s][1]))t=h[i];return- Math.round(p.5*p/~(p%2*2+2dp%=2))*~(p%2);*~p;}
-52 bytes thanks to @OlivierGrégoire
-3 bytes thanks to @PeterTaylor
-46 bytes thanks to @ceilingcat
Try it online.Try it online.
Or 300 bytes without rounding..Or 300 bytes without rounding...
P->{ // Method with 2D integer array as parameter & long return-type
int n=P.length, // Integer `n`, the amount of points in the input
l=0, // Integer `l`, to calculate the left-most point
i=0, // Index-integer `i`
p, // Integer `p`, which will be every next counterclockwise point
q, // Temp integer `q`
t[], // Temp integer-array/point
h[][]=P.clone(), // Initialize an array of points `h` for the Convex Hull
s=0; // And a size-integer for this Convex Hull array, starting at 0
for(;++i<n;) // Loop `i` in the range [1, `n`):
l= // Change `l` to:
P[i][0]<P[l][0]? // If i.x is smaller than l.x:
i // Replace `l` with the current `i`
:l; // Else: leave `l` unchanged
p=l; // Now set `p` to this left-most coordinate `l`
do{ // Do:
for(h[s++]=P[p], // Add the `p`'th point to the 2D-array `h`
q=-~p%n, // Set `q` to `(p+1)` modulo-`n`
i=-1;++i<n; // Loop `i` in the range [0, `n`):
;q= // After every iteration: change `q` to:
// We calculate: (i.y-p.y)*(q.x-i.x)-(i.x-p.x)*(q.y-i.y),
// which results in 0 if the three points are collinear;
// a positive value if they are clockwise;
// or a negative value if they are counterclockwise
(t[1]-P[p][1])*(P[q][0]-t[0])<(t[0]-P[p][0])*(P[q][1]-t[1])?
// So if the three points are counterclockwise:
i // Replace `q` with `i`
:q) // Else: leave `q` unchanged
t=P[i]; // Set `t` to the `i`'th Point (to save bytes)
p=q;} // And after the loop: replace `p` with `q`
while(p!=l); // Continue the do-while as long as `p` is not back at the
// left-most point `l` yet
// Now step 1 is complete, and we have our Convex Hull points in the List `h`
for(p=i=0; // Set `p` (the area) to 0
i<s // Loop `i` in the range [0, `s`):
;p-= // After every iteration: Decrease the area `p` by:
(t[0]+h[++i%s][0])// i.x+(i+1).x
*(t[1]-h[i%s][1]))// Multiplied by i.y-(i+1).y
t=h[i]; // Set `t` to the `i`'th point (to save bytes)
return- Math.round(p.5*p/~(p%2*2+2dp%=2))*~(p%2);*~p;}
// And return `p/2` rounded to integer with half-even