|
|
import { isNodePattern, throwError } from "@jimp/utils"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export default () => ({ |
|
|
contain(w, h, alignBits, mode, cb) { |
|
|
if (typeof w !== "number" || typeof h !== "number") { |
|
|
return throwError.call(this, "w and h must be numbers", cb); |
|
|
} |
|
|
|
|
|
|
|
|
if (typeof alignBits === "string") { |
|
|
if (typeof mode === "function" && typeof cb === "undefined") cb = mode; |
|
|
mode = alignBits; |
|
|
alignBits = null; |
|
|
} |
|
|
|
|
|
if (typeof alignBits === "function") { |
|
|
if (typeof cb === "undefined") cb = alignBits; |
|
|
mode = null; |
|
|
alignBits = null; |
|
|
} |
|
|
|
|
|
if (typeof mode === "function" && typeof cb === "undefined") { |
|
|
cb = mode; |
|
|
mode = null; |
|
|
} |
|
|
|
|
|
alignBits = |
|
|
alignBits || |
|
|
this.constructor.HORIZONTAL_ALIGN_CENTER | |
|
|
this.constructor.VERTICAL_ALIGN_MIDDLE; |
|
|
const hbits = alignBits & ((1 << 3) - 1); |
|
|
const vbits = alignBits >> 3; |
|
|
|
|
|
|
|
|
if ( |
|
|
!( |
|
|
(hbits !== 0 && !(hbits & (hbits - 1))) || |
|
|
(vbits !== 0 && !(vbits & (vbits - 1))) |
|
|
) |
|
|
) { |
|
|
return throwError.call( |
|
|
this, |
|
|
"only use one flag per alignment direction", |
|
|
cb |
|
|
); |
|
|
} |
|
|
|
|
|
const alignH = hbits >> 1; |
|
|
const alignV = vbits >> 1; |
|
|
|
|
|
const f = |
|
|
w / h > this.bitmap.width / this.bitmap.height |
|
|
? h / this.bitmap.height |
|
|
: w / this.bitmap.width; |
|
|
const c = this.cloneQuiet().scale(f, mode); |
|
|
|
|
|
this.resize(w, h, mode); |
|
|
this.scanQuiet( |
|
|
0, |
|
|
0, |
|
|
this.bitmap.width, |
|
|
this.bitmap.height, |
|
|
function (x, y, idx) { |
|
|
this.bitmap.data.writeUInt32BE(this._background, idx); |
|
|
} |
|
|
); |
|
|
this.blit( |
|
|
c, |
|
|
((this.bitmap.width - c.bitmap.width) / 2) * alignH, |
|
|
((this.bitmap.height - c.bitmap.height) / 2) * alignV |
|
|
); |
|
|
|
|
|
if (isNodePattern(cb)) { |
|
|
cb.call(this, null, this); |
|
|
} |
|
|
|
|
|
return this; |
|
|
}, |
|
|
}); |
|
|
|