Subversion Repositories eduke32

Rev

Rev 4332 | Rev 4337 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4332 Rev 4336
Line 16... Line 16...
16
16
17
decl[[
17
decl[[
18
int32_t getclosestcol_lim(int32_t r, int32_t g, int32_t b, int32_t lastokcol);
18
int32_t getclosestcol_lim(int32_t r, int32_t g, int32_t b, int32_t lastokcol);
19
char *palookup[256];  // MAXPALOOKUPS
19
char *palookup[256];  // MAXPALOOKUPS
20
uint8_t palette[768];
20
uint8_t palette[768];
-
 
21
uint8_t *basepaltable[];
21
22
22
const char *getblendtab(int32_t blend);
23
const char *getblendtab(int32_t blend);
23
void setblendtab(int32_t blend, const char *tab);
24
void setblendtab(int32_t blend, const char *tab);
24
25
25
int32_t setpalookup(int32_t palnum, const uint8_t *shtab);
26
int32_t setpalookup(int32_t palnum, const uint8_t *shtab);
Line 235... Line 236...
235
    local math = require("math")
236
    local math = require("math")
236
    local string = require("string")
237
    local string = require("string")
237
238
238
    ffi.cdef[[size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, void * restrict stream);]]
239
    ffi.cdef[[size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb, void * restrict stream);]]
239
240
240
    local function validate_more_blendtabs(moreblends)
241
    local function validate_more_blendtabs(moreblends, kindname, gettabfunc)
241
        if (moreblends == nil) then
242
        if (moreblends == nil) then
242
            return nil, nil
243
            return nil, nil
243
        end
244
        end
244
245
245
        -- Additional blending tables: validate <moreblends> table.
246
        -- Additional blending tables: validate <moreblends> table.
Line 260... Line 261...
260
261
261
            local blend1, blend2 = math.floor(blendspec[1]), math.floor(blendspec[2])
262
            local blend1, blend2 = math.floor(blendspec[1]), math.floor(blendspec[2])
262
263
263
            if (not (type(blend1)=="number" and blend1 >= 1 and blend1 <= 255 and
264
            if (not (type(blend1)=="number" and blend1 >= 1 and blend1 <= 255 and
264
                     type(blend2)=="number" and blend2 >= 1 and blend2 <= 255)) then
265
                     type(blend2)=="number" and blend2 >= 1 and blend2 <= 255)) then
265
                error("invalid argument #4: blending table numbers must be in [1 .. 255]", 3)
266
                error("invalid argument #4: "..kindname.." table numbers must be in [1 .. 255]", 3)
266
            end
267
            end
267
268
268
            for bi=blend1,blend2 do
269
            for bi=blend1,blend2 do
269
                if (haveblend[bi]) then
270
                if (haveblend[bi]) then
270
                    error("invalid argument #4: duplicate blending table number "..bi, 3)
271
                    error("invalid argument #4: duplicate "..kindname.." table number "..bi, 3)
271
                end
272
                end
272
                haveblend[bi] = true
273
                haveblend[bi] = true
273
274
274
                local ptr = C.getblendtab(bi)
275
                local ptr = gettabfunc(bi)
275
                if (ptr == nil) then
276
                if (ptr == nil) then
276
                    error("invalid argument #4: blending table for number "..bi.." is void", 3)
277
                    error("invalid argument #4: "..kindname.." table for number "..bi.." is void", 3)
277
                end
278
                end
278
279
279
                blendnumtab[#blendnumtab+1] = bi
280
                blendnumtab[#blendnumtab+1] = bi
280
                blendptrtab[#blendptrtab+1] = ptr
281
                blendptrtab[#blendptrtab+1] = ptr
281
            end
282
            end
Line 283... Line 284...
283
284
284
        assert(#blendnumtab <= 255)
285
        assert(#blendnumtab <= 255)
285
        return blendnumtab, blendptrtab
286
        return blendnumtab, blendptrtab
286
    end
287
    end
287
288
288
    -- [ok, errmsg] = engine.savePaletteDat(filename [, palnum [, blendnum [, moreblends]]])
289
    -- ok, errmsg = engine.savePaletteDat(filename [, palnum [, blendnum [, moreblends]]])
289
    function engine.savePaletteDat(filename, palnum, blendnum, moreblends)
290
    function engine.savePaletteDat(filename, palnum, blendnum, moreblends)
290
        local sht = engine.getshadetab(palnum or 0)
291
        local sht = engine.getshadetab(palnum or 0)
291
        local tab = engine.getblendtab(blendnum or 0)
292
        local tab = engine.getblendtab(blendnum or 0)
292
293
293
        if (sht == nil) then
294
        if (sht == nil) then
294
            return nil, "no shade table with number "..palnum
295
            return nil, "no shade table with number "..palnum
295
        elseif (tab == nil) then
296
        elseif (tab == nil) then
296
            return nil, "no blending table with number "..blendnum
297
            return nil, "no blending table with number "..blendnum
297
        end
298
        end
298
299
299
        local blendnumtab, blendptrtab = validate_more_blendtabs(moreblends)
300
        local blendnumtab, blendptrtab = validate_more_blendtabs(
-
 
301
            moreblends, "blending", C.getblendtab)
300
302
301
        local f, errmsg = io.open(filename, "wb+")
303
        local f, errmsg = io.open(filename, "wb+")
302
        if (f == nil) then
304
        if (f == nil) then
303
            return nil, errmsg
305
            return nil, errmsg
304
        end
306
        end
Line 326... Line 328...
326
328
327
        f:close()
329
        f:close()
328
330
329
        return true
331
        return true
330
    end
332
    end
-
 
333
-
 
334
    -- ok, errmsg = engine.saveLookupDat(filename, lookups)
-
 
335
    function engine.saveLookupDat(filename, lookups)
-
 
336
        if (lookups == nil) then
-
 
337
            -- set to an invalid value, validate_more_blendtabs will error
-
 
338
            lookups = 0
-
 
339
        end
-
 
340
-
 
341
        local lookupnumtab, lookupptrtab = validate_more_blendtabs(
-
 
342
            lookups, "lookup", engine.getshadetab)
-
 
343
-
 
344
        local f, errmsg = io.open(filename, "wb+")
-
 
345
        if (f == nil) then
-
 
346
            return nil, errmsg
-
 
347
        end
-
 
348
-
 
349
        f:write(string.char(#lookupnumtab))
-
 
350
-
 
351
        for i=1,#lookupnumtab do
-
 
352
            f:write(string.char(lookupnumtab[i]))
-
 
353
            if (C.fwrite(lookupptrtab[i], 1, 256, f) ~= 256) then
-
 
354
                return nil, "failed writing lookup table"
-
 
355
            end
-
 
356
        end
-
 
357
-
 
358
        -- Write five base palettes
-
 
359
        for i=1,5 do
-
 
360
            local bpi = (i==3 or i==4) and 4+3-i or i
-
 
361
-
 
362
            if (C.fwrite(C.basepaltable[bpi], 1, 768, f) ~= 768) then
-
 
363
                return nil, "failed writing base palette"
-
 
364
            end
-
 
365
        end
-
 
366
-
 
367
        f:close()
-
 
368
-
 
369
        return true
-
 
370
    end
-
 
371
-
 
372
    function engine.setupDebugBasePal()
-
 
373
        for i=0,14 do
-
 
374
            local ptr = C.basepaltable[1] + 3*(16*i)
-
 
375
            local src = ptr + 3*i
-
 
376
            local r, g, b = src[0], src[1], src[2]
-
 
377
-
 
378
            for j=0,15 do
-
 
379
                local dst = ptr + 3*j
-
 
380
                dst[0], dst[1], dst[2] = r, g, b
-
 
381
            end
-
 
382
        end
-
 
383
    end
331
end
384
end
332
385
333
386
334
-- Done!
387
-- Done!
335
return engine
388
return engine