This chapter contains sample applications that demonstrate how to use the digital media converters.
Example 2-1 contains a listing of lator.c, a “color calculator” application that demonstrates how to use the Color Space Library.
/* * lator.h */ void lator_red(char *); void lator_green(char *); void lator_blue(char *); void lator_gofigure(char **, char **, char **, char **, char **, char **, char **, char **, char **, char **, char **, char **, char **, char **); /* * lator.c */ #include <stdio.h> #include <stdlib.h> #include <bstring.h> #include "lator.h" static void rgb_rgbprime(char *rgbx, char *rgbx_prime); static void rgb_ycrcb(char *rgbx, char *ycrcb); /* static void ycc601toyccjfif(char *ycc601, char *yccjfif); */ void matmul(float a[3], float m[3][3], float b[3]); static void rgb_xyz(char *rgbx, float xyz[3]); static void xyz_xy(float xyz[3], float xy[2]); #define CLAMP0(v) (v < 0 ? 0 : (v > 255 ? 255 : v)) /* byte offset of each component in DM_IMAGE_PACKING_RGBX */ #define RED 0 #define GREEN 1 #define BLUE 2 static char rgbx[4]; /* byte offset of each component in DM_IMAGE_PACKING_CbYCr */ #define Cb 0 #define Y 1 #define Cr 2 /* normalized primary matrix for XYZ = NPM * RGB, SMPTE RP 176-1993 */ #define NPM_X_R 0.4123907993 #define NPM_X_G 0.3575843394 #define NPM_X_B 0.1804807884 #define NPM_Y_R 0.2126390059 #define NPM_Y_G 0.7151686788 #define NPM_Y_B 0.0721923154 #define NPM_Z_R 0.0193308187 #define NPM_Z_G 0.1191947798 #define NPM_Z_B 0.9505321522 float npm[3][3] = { { NPM_X_R, NPM_X_G, NPM_X_B }, { NPM_Y_R, NPM_Y_G, NPM_Y_B }, { NPM_Z_R, NPM_Z_G, NPM_Z_B }, }; static void fill(char color[4], char *picture, int npixels) { int *p = (int *)picture; while (npixels--) { *p++ = *(int *)color; } } void lator_red(char *r) { int v = atoi(r); rgbx[RED] = CLAMP0(v); } void lator_green(char *g) { int v = atoi(g); rgbx[GREEN] = CLAMP0(v); } void lator_blue(char *b) { int v = atoi(b); rgbx[BLUE] = CLAMP0(v); } static char redstr[8]; static char greenstr[8]; static char bluestr[8]; static char rpstr[8]; static char gpstr[8]; static char bpstr[8]; static char ystr[8]; static char crstr[8]; static char cbstr[8]; static char bigx_str[8]; static char bigy_str[8]; static char bigz_str[8]; static char litx_str[8]; static char lity_str[8]; void lator_gofigure( char **r, char **g, char **b, char **rp, char **gp, char **bp, char **y, char **cr, char **cb, char **bigx, char **bigy, char **bigz, char **litx, char **lity) { char rgbxp[4], ycrcb[4]; float xyz[3], xy[2]; bzero(rgbxp, 4); bzero(ycrcb, 4); bzero(xyz, 3); rgb_rgbprime(rgbx, rgbxp); rgb_ycrcb(rgbxp, ycrcb); rgb_xyz(rgbx, xyz); xyz_xy(xyz, xy); sprintf(redstr, "%3d", rgbx[RED]); *r = redstr; sprintf(greenstr, "%3d", rgbx[GREEN]); *g = greenstr; sprintf(bluestr, "%3d", rgbx[BLUE]); *b = bluestr; sprintf(rpstr, "%3d", rgbxp[RED]); *rp = rpstr; sprintf(gpstr, "%3d", rgbxp[GREEN]); *gp = gpstr; sprintf(bpstr, "%3d", rgbxp[BLUE]); *bp = bpstr; sprintf(ystr, "%3d", ycrcb[Y]); *y = ystr; sprintf(crstr, "%3d", ycrcb[Cr]); *cr = crstr; sprintf(cbstr, "%3d", ycrcb[Cb]); *cb = cbstr; sprintf(bigx_str, "%.3f", xyz[0]); *bigx = bigx_str; sprintf(bigy_str, "%.3f", xyz[1]); *bigy = bigy_str; sprintf(bigz_str, "%.3f", xyz[2]); *bigz = bigz_str; sprintf(litx_str, "%.3f", xy[0]); *litx = litx_str; sprintf(lity_str, "%.3f", xy[1]); *lity = lity_str; } #include <dmedia/dm_params.h> #include <dmedia/dm_image.h> #include <dmedia/dm_color.h> static void rgb_rgbprime(char *rgbx, char *rgbx_prime) { DMcolorconverter cvt; DMparams *p, *pc; dmColorCreate(&cvt); dmParamsCreate(&p); dmSetImageDefaults(p, 1, 1, DM_IMAGE_PACKING_RGBX); dmColorSetSrcParams(cvt, p); dmParamsCreate(&pc); dmParamsSetFloat(pc, DM_IMAGE_GAMMA, .45); dmParamsSetParams(p, DM_IMAGE_COMPONENT_ALL, pc); dmColorSetDstParams(cvt, p); dmParamsDestroy(p); dmParamsDestroy(pc); if (dmColorConvert(cvt, rgbx, rgbx_prime)) { printf("dmcolor error, rgb -> r'g'b'\n"); } dmColorDestroy(cvt); } static void rgb_ycrcb(char *rgbx, char *ycrcb) { DMcolorconverter cvt; DMparams *p; dmColorCreate(&cvt); dmParamsCreate(&p); dmSetImageDefaults(p, 1, 1, DM_IMAGE_PACKING_RGBX); dmColorSetSrcParams(cvt, p); dmParamsDestroy(p); dmParamsCreate(&p); dmSetImageDefaults(p, 1, 1, DM_IMAGE_PACKING_CbYCr); dmColorSetDstParams(cvt, p); dmParamsDestroy(p); if (dmColorConvert(cvt, rgbx, ycrcb)) { printf("dmcolor error, rgb -> ycrcb\n"); } dmColorDestroy(cvt); } static void rgb_xyz(char *rgbx, float *xyz) { float f_rgbx[3]; f_rgbx[0] = rgbx[RED]/255.; f_rgbx[1] = rgbx[GREEN]/255.; f_rgbx[2] = rgbx[BLUE]/255.; matmul(xyz, npm, f_rgbx); } static void xyz_xy(float xyz[3], float xy[2]) { float sum = xyz[0] + xyz[1] + xyz[2]; xy[0] = xyz[0]/sum; xy[1] = xyz[1]/sum; } static void matmul(float a[3], float m[3][3], float b[3]) { a[0] = m[0][0] * b[0] + m[0][1] * b[1] + m[0][2] * b[2]; a[1] = m[1][0] * b[0] + m[1][1] * b[1] + m[1][2] * b[2]; a[2] = m[2][0] * b[0] + m[2][1] * b[1] + m[2][2] * b[2]; } |